Помощь - Поиск - Пользователи - Календарь
Полная версия: Проблема с полиморфом друида
Город Мастеров > РЕДАКТОРЫ > Neverwinter Nights Aurora Toolset
DM Dwarf
Сразу извинюсь, если эта тема уже была, но..
У нас небольшая проблема с полиморфом друида.
Ситуация такая:
Преа:
В локациях идет постоянное сохранение игровых персов. 1 раз в 1 раунд для каждого перса в локе. Т.е если в локе 5 персов, то первый раунд сохраняется 1-й перс, во второй раунд - 2-й и т.д., таким образом каждый перс сохраняется 1раз в 5 раундов. Если перс один в локе, то он сохраняется каждый раунд.
Амбула:
Друид в мультиклассе с воинскими классами, в полиморфе дракона обновляет полиморф каждое сохранение. Естественно, атака и прочие показатели падают. Если он один в локе, то обновление полиморфа идут один за одним и сражаться он практически не может.
У друида-шифтера такой проблемы нет, полиморф не обновляется.

Сталкивался ли кто с такой проблемой, и если да, то как помочь бедным зверушкам?
virusman
Никак. Сохранять реже.
mamuc
QUOTE
Сразу извинюсь, если эта тема уже была, но..
У нас небольшая проблема с полиморфом друида.
Ситуация такая:
Преа:
В локациях идет постоянное сохранение игровых персов. 1 раз в 1 раунд для каждого перса в локе. Т.е если в локе 5 персов, то первый раунд сохраняется 1-й перс, во второй раунд - 2-й и т.д., таким образом каждый перс сохраняется 1раз в 5 раундов. Если перс один в локе, то он сохраняется каждый раунд.
Амбула:
Друид в мультиклассе с воинскими классами, в полиморфе дракона обновляет полиморф каждое сохранение. Естественно, атака и прочие показатели падают. Если он один в локе, то обновление полиморфа идут один за одним и сражаться он практически не может.
У друида-шифтера такой проблемы нет, полиморф не обновляется.

а чем вызвана такое частое сохранение?
...это же жутко жрет ресурсы( очевидно этот скритп на Хертбите висит)..причем, если, я правильно понял, идет не только сохранение, но и взятие сохраненного и "обновление" чара каждый раунд по сохраненному( где и нечетко работает обновление полиморфа друида), так?
denis0k
У нас вообще чары в полиморфе не сейвятся.
2_advanced
а если сервак копыта отдает, а чел 5 часов качалсо? smile.gif ph34r.gif
kreon
Вот то самое сохранение...
onHeart модуля
NSS
void main() {
  // сохряняем время
  object oMod = GetModule();
  int nCurTimeUpdateNum = GetLocalInt(oMod, "CurTimeUpdateNum");
  if(!nCurTimeUpdateNum) {
    SaveModuleTime();
    SetLocalInt(oMod, "CurTimeUpdateNum", 50); // время сохраняется раз в 50 хеартбитов
  }
  else SetLocalInt(oMod, "CurTimeUpdateNum", nCurTimeUpdateNum-1);
  int nNumPlayers = PlayerCount();
  object oPC = GetFirstPC();
  while(GetIsObjectValid(oPC)) {
    object oToken = GetLocalObject(oPC, "TokenofPersistence");
    int nUpdate = GetLocalInt(oPC, "NumUpdate");
    if(nUpdate < 5) { // по 5 штук за раунд (если попали в число пяти, тоsmile.gif
        // сохранение локации
        if(!GetIsObjectValid(GetArea(oPC))) { // если в переходе локаций - не сохраняем
            SetLocalInt(oPC, "NumUpdate", nUpdate-1);
        } else {
            if(!GetLocalInt(GetArea(oPC), "fuga")) { // если _не_ на фуге - сохраняем
                SaveLoc(oPC);
                SetLocalInt(oToken, "HP", GetCurrentHitPoints(oPC));
            } else {
                SetLocalInt(oToken, "HP", 0); // иначе ставим
            }
            nUpdate = nNumPlayers;
            SetLocalInt(oPC, "NumUpdate", nUpdate); // ставим номер в число плееров
            ExportSingleCharacterFix(oPC); // сохраняем
      }
    } else {
        nUpdate -= 1; // уменьшаем счетчик
        SetLocalInt(oPC, "NumUpdate", nUpdate);
    }
  // далее специфичные вещи Мистленда
}


ExportSingleCharacterFix(oPC) - стандартная либа сохранения с проверкой на шифтера
Как исправить - добавить проверку на эффект полиморфа.
Например так:
NSS
int GetIsPolyMorfedFix(object oPC) {
  effect eEff = GetFirstEffect(oPC);
  while(GetIsEffectValid(eEff)) {
    if(GetEffectType(eEff) == EFFECT_TYPE_POLYMORFED) return 1;
    eEff = GetNextEffect(oPC);
  }
  return 0;
}
(в полиморфе сохраняться не будет)
DM Dwarf
Исключить из сохранения это самый очевидный вариант, но хотелось бы понять, почему такой глюк только у друидов, ведь друиды/шифтеры нормально проходят автосохранение, не переполиморфясь.
Что шитер менят в билде, и чего не хватает чистому друиду...
Ибо:
QUOTE
а если сервак копыта отдает, а чел 5 часов качалсо?

Такие ситуации могут возникать часто, и каждого не проверишь, провда ли он набил свои честные 10к и рарную шапку или нагло врет в глаза ДМу.
kreon
Шифтеры не сохраняются в форме. (см. описание ExportSingleCharacterFix(oPC))
denis0k
5 часов подряд в форме качаться никто не будет smile.gif Иногда приходится спать, вот там и сейв smile.gif
Zirrex
DM Dwarf, не совсем понятно, зачем так часто сохранять? В моем модуле сохранение происходит через каждые 30 секунд, и это более чем достаточно. Потом, в момент сохранения происходит сохранение всех персонажей сразу, а не по отдельности индивидуально для каждого.

Сам скрипт (а также сохранение жизни полиморфа, чтобы он не был богом).

В конец скрипта "nw_s0_shapechg" добавляется строчка:
NSS
DelayCommand(1.1, SetLocalInt(OBJECT_SELF, "PolyHP", GetCurrentHitPoints(OBJECT_SELF)));

Сохранение персонажей через 30 секунд и восстановление жизни у полиморфа:
NSS
void RestoreHP(object oPC)
{
    if (oPC != OBJECT_INVALID)
    {
        int nPolyHP = GetLocalInt(oPC, "PolyHP");
        int nCurrentHP = GetCurrentHitPoints(oPC);

        if (nPolyHP > 0)
        {
            if (nCurrentHP > nPolyHP)
            {
                ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(nCurrentHP - nPolyHP), oPC);
            }
        }
    }
}

void main()
{
    object oMod = GetModule();

    object oPC = OBJECT_INVALID;
    int nAutosave, nPolyHP;

    object oPlayer = GetFirstPC();

    while (GetIsObjectValid(oPlayer))
    {
        nPolyHP = GetLocalInt(oPlayer, "PolyHP");

        if (nPolyHP > 0)
        {
            oPC = oPlayer;
            SetLocalInt(oPC, "PolyHP", GetCurrentHitPoints(oPC));
        }
        oPlayer = GetNextPC();
    }

    // Автосохранение всех персонажей каждые 30 секунд
    if (oMod != OBJECT_INVALID)
    {
        nAutosave = GetLocalInt(oMod, "autosave");

        // Если переменной нет, то присвоить ей 1
        if (nAutosave == 0)
        {
            SetLocalInt(oMod, "autosave", 1);
        }
        else
        {
            // Если переменная равна 5, то сохранить всех персонажей
            if (nAutosave == 5)
            {
                ExportAllCharacters();
                DelayCommand(0.1, RestoreHP(oPC));

                // Переменную сбросить в 0
                SetLocalInt(oMod, "autosave", FALSE);
            }
            else
            {
                // Через 6 секунд изменить переменную, прибавив к ней 1
                SetLocalInt(oMod, "autosave", ++nAutosave);
            }
        }
    }
}
2_advanced
QUOTE
onHeart модуля

дайте креону мастера синглмода =)
kreon
QUOTE(2_advanced @ Oct 15 2006, 00:21) [snapback]94810[/snapback]

дайте креону мастера синглмода =)

Нет уж, извините biggrin.gif лучше адванцеду smile.gif

P.S. Данная система ресурсов как ни странно не жрет, т.к. не приходится сохранять сразу 30-40 человек.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Invision Power Board © 2001-2019 Invision Power Services, Inc.