Перейти к содержанию

Тонкости скриптов


Рекомендуемые сообщения

Джентльмеры, подскажите. Реально ли заблокировать действие на игрока одного конкретного магического эффекта? Например, восстановления магии. Пьёт игрок зелье пополнения маны - ничего не происходит. Пьёт другое - снова ничего. Кастует амулетом - тоже ничего. Остальные эффекты действуют как положено.

Если ещё не видел, то в MSFD_8.1+ см. раздел "Управление и тестирование эффектов заклинаний".

 

Там примерно так выглядит:

if ( Player -> GetEffect, sEffectRestoreHealth )

    Player -> RemoveEffects, 75

endif

 

...при этом для функции GetEffect нужно использовать ID эффекта (например, GetEffect sEffectWaterBreathing). Для функции RemoveEffects используется номер эффекта (например, RemoveEffects, 0). Список эффектов в конце учебника.

 

Если это то, что нужно. Я таким кунг-фу ещё не занимался, что в результате получится, не знаю. Успеет ли эффект сработать ДО удаления или удалится корректно? - не могу сказать.

Возможно, в луа это действительно будет проще и надёжнее.

 

 

Да. 1 строчка в луа.

О, эту фразу давно в мемы занести пора.

Изменено пользователем РЕДМЕНЪ
Ссылка на комментарий
Поделиться на другие сайты

  • Ответов 339
  • Создана
  • Последний ответ

Топ авторов темы

Топ авторов темы

Изображения в теме

В ванили это:

if ( Player->GetEffect sEffectRestoreSpellPoints == 1 )
Player->RemoveEffects 76
endif

Список всех эффектов.
 
Возможно, что часть магии игра все равно успеет восстановить, потому, наверно, тут нужно будет через ModCurrentMagicka вернуть прежнее значение магии. Что-то вроде:

float CurrentMagicka
float NewMagicka
if ( Player->GetEffect sEffectRestoreSpellPoints == 0 )
Set CurrentMagicka to ( Player->GetMagicka )
else
Player->RemoveEffects sEffectRestoreSpellPoints
set NewMagicka to ( Player->GetMagicka )
set NewMagicka to ( CurrentMagicka - NewMagicka )
Player->ModCurrentMagicka NewMagicka
endif

А, РЕДМЕНЪ опередил. Но список эффектов лишним не будет.

Изменено пользователем Муурн Шепард
Ссылка на комментарий
Поделиться на другие сайты

кстати, GetEffect на оригинальном движке не работает с магией увеличения характеристик и навыков. Вот такая вот бага движка.

То есть на ГГ может висеть данный эффект, а гетэффект скажет, что нифига на нем нет этого эффекта.

Ссылка на комментарий
Поделиться на другие сайты

В ванили это:

if ( Player->GetEffect sEffectRestoreSpellPoints == 1 )
Player->RemoveEffects 76
endif

Список всех эффектов.

 

Возможно, что часть магии игра все равно успеет восстановить, потому, наверно, тут нужно будет через ModCurrentMagicka вернуть прежнее значение магии. Что-то вроде:

float CurrentMagicka
float NewMagicka
if ( Player->GetEffect sEffectRestoreSpellPoints == 0 )
Set CurrentMagicka to ( Player->GetMagicka )
else
Player->RemoveEffects sEffectRestoreSpellPoints
set NewMagicka to ( Player->GetMagicka )
set NewMagicka to ( CurrentMagicka - NewMagicka )
Player->ModCurrentMagicka NewMagicka
endif

А, РЕДМЕНЪ опередил. Но список эффектов лишним не будет.

 

Редмен, спасибо. Шепард, можно тебя загрузить просьбой? Я по определённым религиозным причинам сейчас не могу в КС. Тебя не затруднит сделать два мода:

1) В первом - скрипт без ModCurrentMagicka. Мод добавляет кольцо. Если его надеть, то игрок лишается возможности восполнять ману через бутылки и предметы с рестором магии.

2) Во втором то же самое, но с ModCurrentMagicka. На случай, если первая версия будет работать некорректно.

Нужно протестировать, как это будет в игре выглядеть.

Ссылка на комментарий
Поделиться на другие сайты

Восстановление магии на постоянный эффект или по активации предметов?

Изменено пользователем Муурн Шепард
Ссылка на комментарий
Поделиться на другие сайты

Восстановление магии на постоянный эффект или по активации предметов?

И то, и другое. Этот эффект в принципе не должен действовать на игрока ни под каким видом.

Ссылка на комментарий
Поделиться на другие сайты

Мда. В общем, такой скрипт работает с восстановлением здоровья (и, наверно, с другими эффектами), но почему-то совершенно не ловит восстановление магии. Сложный скрипт, как выяснилось, не нужен -- игра перехватывает и удаляет эффекты до того, как они повлияют на персонажа. Два кольца с двумя вариантами скрипта лежат у Дорисы Давел на прилавке, если кто-нибудь захочет разобраться.

Begin AntimagicRing
short OnPCEquip
short RestoringMagicka

if ( MenuMode == 1 )
return
endif

if ( OnPCEquip == 0 )
return
endif

set RestoringMagicka to ( Player->GetEffect sEffectRestoreSpellPoints )
MessageBox "RestoringMagicka: %.0f" RestoringMagicka ;Отладка. Должно показывать 1, если поймал эффект.

if ( RestoringMagicka == 1 )
Player->RemoveEffects 76
endif

end

Antimagic.ESP

Изменено пользователем Муурн Шепард
Ссылка на комментарий
Поделиться на другие сайты

Мда. В общем, такой скрипт работает с восстановлением здоровья (и, наверно, с другими эффектами), но почему-то совершенно не ловит восстановление магии. Сложный скрипт, как выяснилось, не нужен -- игра перехватывает и удаляет эффекты до того, как они повлияют на персонажа. Два кольца с двумя вариантами скрипта лежат у Дорисы Давел на прилавке, если кто-нибудь захочет разобраться.

 

Begin AntimagicRing
short OnPCEquip
short RestoringMagicka

if ( MenuMode == 1 )
return
endif

if ( OnPCEquip == 0 )
return
endif

set RestoringMagicka to ( Player->GetEffect sEffectRestoreSpellPoints )
MessageBox "RestoringMagicka: %.0f" RestoringMagicka ;Отладка. Должно показывать 1, если поймал эффект.

if ( RestoringMagicka == 1 )
Player->RemoveEffects 76
endif

end
А что если там два эффекта, помимо восстановления другой? И зачем тут переменная?
Ссылка на комментарий
Поделиться на другие сайты

Расскажешь потом, что вышло.

Рассказываю.

Заспамил пару-тройку локаций одинаковыми существами, в каждой локации свои. Сделал для каждого типа существ свои скрипты/оружие. Пошёл их истреблять.

Э-э-э, нетушки. Быстро выяснилось, что команды HitOnMe и GetTarget работают не так, как я ожидал: они работают только на одном актёре, а соседним на повешенные скрипты начхать, на них скрипт не срабатывает.

Почему так, я не понял, скрипт указывает ID существа, условных Rat/scamp, но "видит" только одного из них. Как я понял, "видит" последнего добавленного в CS актёра.

 

Т.е. с одной стороны я как бы не прав, потому что с этими двумя командами истребить всех крыс действительно не получится;

с другой стороны, обе команды всё же позволяют обратиться к существу из скрипта на оружии - но только к одному-единственному.

 

==========

Ладно, придётся добавлять скрипты существам. На оружие вешаю скрипт OnPCEquip и "пустую" запись в дневнике. На существо вешаю скрипт, который при (приближении игрока+дневниковой записи) временно повышает силу/атаку игрока. Иду в игру.

На одном существе скрипт срабатывает корректно; в консоли по цифиркам видно, что урон возрос. На соседних существах скрипт не срабатывает. Упс. 

 

По тому же принципу попробовал сделать существа неагрессивными, через SetFigh. Результат тот же: одно существо стоит спокойно, другие нападают.

Почему так, ведь скрипт повешен на существо и по идее все копии существа должны реагировать?

Что именно я делаю не так? Как должна выглядеть правильная связка двух скриптов?

 

Ссылка на комментарий
Поделиться на другие сайты

А что если там два эффекта, помимо восстановления другой? И зачем тут переменная?

В смысле два? Переменная для отладки.

 

Ссылка на комментарий
Поделиться на другие сайты

  • 2 года спустя...
2 часа назад, UhkbuzutopMuxaul сказал:

Здорово! Заходишь в Конструктор, там открываешь локацию в которой видел модель с наложенной на ней текстурой, когда загрузится эта локация и можно будет её посмотреть в игровом мире, в одном из окон будет полный список всех предметов, неписей, кричеров что находятся в локации которую ты сейчас смотришь и можешь там выбрать модель которая тебя интересует или напрямую найти в игровом окне модель и выделив пару раз мышкой откроется окно с описанием что есть твоя модель. Контейнер, статик, активатор и т.д. и номер id элемента мира Морроувинд. В списке всего что есть в мире Морроувинд вы по id можете найти что вам нужно. Например вы открыли модель в игровом окне(там будет показан Морроувинд как в самой игре) и выделив объект откроется окно и в нём обязательно будет показано название меши что использует конструктор при подключении этой модели к игре. Далее в Data Files в Meshes ищите название этой меши, потом открыв nifskope в окнах найдёте какие текстуры наложены на эту мешу(там очень просто, потеряться не удастся).;-) Прежде чем задавать такие простые вопросы для моддеров на Фуллрест вам нужно было прошерстить базу ресурсов Фуллреста, там есть обучающие видеоуроки именно для новичков и записки по скриптам и вообще много интересного. Вот https://www.fullrest.ru/files/Lacmus_Tutorials

У меня тоже есть один вопрос, мне говорили что где то вроде на Нексусе решили эту задачу но я не нашёл. Можно ли при начале новой игры обнулять все 27 навыков одной командой или по скрипту? Их можно понизить по отдельности через консоль но можно ли упростить эту задачу в одну команду и если можно то как? :dontknow:

По скрипту можно. Посмотрите код этого мода:
https://www.nexusmods.com/morrowind/mods/44266/

Ссылка на комментарий
Поделиться на другие сайты

  • 1 год спустя...

Здравствуйте, мудрые люди. Помогите начинающему и малопонимающему. Суть вопроса: в помещении героя встречает сильно запертая дверь. Запирается простым скриптом:

Begin Door_b

Short controlfirst

   if (controlfirst == 0 )

   in_c_door_arched_b->lock, 200

   Set controlfirst to 1

   Endif

       end

(Запер на 200 потому, что не знаю как запереть "насмерть") Открывается дверь неписем после уплаты денег, из результатов диалога. Но при повторном посещении помещения дверь остаётся незапертой (видимо переменная не забывает своего значения после того, как герой покидает помещение, и в следующий раз "Short" уже не хочет быть свежеобъявленной).

Подскажите пожалуйста, как изменить скрипт чтоб а) дверь запиралась "насмерть", б) при каждом следующем посещении дверь была заперта пока не заплатишь?

Ссылка на комментарий
Поделиться на другие сайты

8 часов назад, Vasik сказал:

Здравствуйте, мудрые люди. Помогите начинающему и малопонимающему. Суть вопроса: в помещении героя встречает сильно запертая дверь. Запирается простым скриптом:

Begin Door_b

 

Short controlfirst

 

   if (controlfirst == 0 )

 

   in_c_door_arched_b->lock, 200

 

   Set controlfirst to 1

 

   Endif

 

       end

(Запер на 200 потому, что не знаю как запереть "насмерть") Открывается дверь неписем после уплаты денег, из результатов диалога. Но при повторном посещении помещения дверь остаётся незапертой (видимо переменная не забывает своего значения после того, как герой покидает помещение, и в следующий раз "Short" уже не хочет быть свежеобъявленной).

Подскажите пожалуйста, как изменить скрипт чтоб а) дверь запиралась "насмерть", б) при каждом следующем посещении дверь была заперта пока не заплатишь?

If ( cellchanged )

in_c_door_arched_b->lock, 200

endif

 

Невзламываемая дверь - очень плохое решение для этой игры. Максимально не одобряю

Ссылка на комментарий
Поделиться на другие сайты

31 минуту назад, Larkin сказал:

If ( cellchanged )

in_c_door_arched_b->lock, 200

endif

 

Невзламываемая дверь - очень плохое решение для этой игры. Максимально не одобряю

Большое спасибо, сработало лучше, чем ожидал - закрывает даже в том случае, если дверь уходя оставалась открытой настежь. Почитал про эту команду (не могу сказать, что понял прочитанное 😕). Про невзламываемую дверь не очень понял - лор вроде не портит. Но, думаю, к мнению опытного человека стоит прислушаться. Ещё раз спасибо.

Ссылка на комментарий
Поделиться на другие сайты

begin DoorOpen

If ( MenuMode == 1 )
    return
endif

If ( OnActivate == 1 )
    If ( player->GetItemCount "Key"  >= 1 )
        Activate
    else
        If ( player->GetItemCount "Key" < 1 )
            MessageBox "Без ключа дверь не откроется."
            return
        endif
    endif
endif

end DoorOpen

 

 

Пользуюсь обычно этим скриптом. Дверь открывается только ключом

Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...