Город Мастеров
IPB

Здравствуйте, гость ( Вход | Регистрация )

 Правила этого форума ПРАВИЛА РАЗДЕЛА
> Проблема с полиморфом друида
DM Dwarf
сообщение Oct 12 2006, 09:19
Сообщение #1


Level 2
*

Класс: Воин
Характер: True Neutral
Раса: Дварф



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

Сталкивался ли кто с такой проблемой, и если да, то как помочь бедным зверушкам?

Сообщение отредактировал DM Dwarf - Oct 12 2006, 09:21
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
 
Открыть новую тему
Ответов
Zirrex
сообщение Oct 14 2006, 19:06
Сообщение #2


Level 9
Иконки Групп

Класс: Друид
Характер: True Neutral
Раса: Эльф
NWN: Скриптинг [PW]
Амен



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);
            }
        }
    }
}
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

Сообщений в этой теме


Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 18th June 2025 - 02:05