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

Скриптовое моделирование Сердца Лорхана


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

Привожу полный текст проблемного скрипта, который, по идее, должен имитировать на созданном creature "Кагренак" (модель пепельного вампира, голоса – от лича) процессы, идентичные процессам с Сердцем Лорхана:

 

begin KagrenakField

 

short sunderHit

short keeningHit

short doOnce

short Release

 

if ( MenuMode == 1 )

return

endif

 

if ( GetDistance Player < 1000 )

if ( GetDetected, Player == 1 )

if ( doOnce == 0 )

ForceGreeting

set doOnce to 1

endif

endif

endif

 

if ( CellChanged == 0 )

if ( Release < 5 )

if ( GetSoundPlaying "Jarktlom" == 0 )

PlayLoopSound3DVP "Jarktlom", 1.0, 1.0

endif

elseif ( Release == 5 )

if ( GetSoundPlaying "Jarktlom" == 1 )

StopSound "Jarktlom"

endif

endif

endif

 

if ( Release < 5 )

if ( GetHealth < 65535 )

SetHealth 65535

endif

endif

;Сердце Лорхана изолирует Кагренака от Плеромона.

 

set sunderHit to HitOnMe Sunder

 

if ( sunderHit == 1 )

if ( Release == 0 )

set Release to 1

set sunderHit to 0

elseif ( Release > 0 )

set sunderHit to 0

endif

endif

 

if ( Release > 0 )

set keeningHit to HitOnMe Keening

endif

;Разделитель позволяет освободить Кагренака.

 

if ( keeningHit == 0 )

if ( GetSpell "dagoth_ur_shield_01" == 0 )

AddSpell "dagoth_ur_shield_01"

endif

endif

;Физическое проявление действия Сердца.

 

if ( keeningHit == 1 )

if ( Release == 1 )

if ( GetSpell "dagoth_ur_shield_01" == 1 )

PlaySound3DVP "hearthit1" 1.0, 1.0

RemoveSpell "dagoth_ur_shield_01"

AddSpell "dagoth_ur_shield_02"

set Release to 2

endif

endif

endif

 

if ( keeningHit == 2 )

if ( Release == 2 )

if ( GetSpell "dagoth_ur_shield_02" == 1 )

PlaySound3DVP "hearthit2" 1.0, 1.0

RemoveSpell "dagoth_ur_shield_02"

AddSpell "dagoth_ur_shield_03"

set Release to 3

endif

endif

endif

 

if ( keeningHit == 3 )

if ( Release == 3 )

if ( GetSpell "dagoth_ur_shield_03" == 1 )

PlaySound3DVP "hearthit3" 1.0, 1.0

RemoveSpell "dagoth_ur_shield_03"

AddSpell "dagoth_ur_shield_04"

set Release to 4

endif

endif

endif

 

if ( keeningHit == 4 )

if ( Release == 4 )

if ( GetSpell "dagoth_ur_shield_04" == 1 )

PlaySound3DVP "hearthit4" 1.0, 1.0

RemoveSpell "dagoth_ur_shield_04"

set Release to 5

endif

endif

endif

;Возможность освобождения - после полной компактификации Щита Сердца.

 

if ( keeningHit > 4 )

if ( Release == 5 )

set keeningHit to 4

endif

endif

 

if ( OnDeath == 1 )

PlaySoundVP "endboom2" 1.0, 0.5

StreamMusic "Special\MW_Triumph.mp3"

endif

 

end KagrenakField

 

Исследование реализации в игре этого скрипта (TGM и последовательные удары Разделителем и Разрубателем с проверкой переменных через sv) дало следующие результаты:

В исходном состоянии Кагренака: sunderHit == 0, keeningHit == 0, doOnce == 0, Release == 0. Звук "Jarktlom" проигрывается, огненный щит имеется, здоровье действительно принудительно равно 65535. Однако, команда ForceGreeting не выполняется; даже если игрок заговорит с Кагренаком сам, переменная doOnce по-прежнему == 0.

После первого удара Разделителем: sunderHit == 0, keeningHit == 0, doOnce == 0, Release == 1. То есть здесь все в порядке.

После второго удара Разделителем: sunderHit == 0, keeningHit == 0, doOnce == 0, Release == 1. То есть здесь все в порядке.

После первого удара Разрубателем: sunderHit == 0, keeningHit == 0, doOnce == 0, Release == 2. ПРОБЛЕМЫ С ИМИТАЦИЕЙ ПРОЦЕССА СЕРДЦА ЛОРХАНА НАЧИНАЮТСЯ ЗДЕСЬ. Ледяной щит все-таки появляется, но и огненный не исчезает, и звук "hearthit1" не проигрывается.

После второго удара Разрубателем: sunderHit == 0, keeningHit == 0, doOnce == 0, Release == 2. У Кагренака по-прежнему остаются огненный и ледяной щиты, т.е. на дальнейшие удары Разрубателем он вообще никак не реагирует.

(Примечание: если через консоль ввести Кагренаку SetHealth 0, то условия на OnDeath == 1 все же выполняются).

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

Первая проблема - думаю, с GetDetected. Попробуйте начала без нее.

Такое ощущение, что дальнейшая проблема - с "set keeningHit to HitOnMe Keening" - возможно, стоит сделать проверку отдельной переменной, увеличивающейся по количеству ударов Разрубателем.

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

Удаление GetDetected действительно помогло, хотя, к сожалению, несколько нарушило план моего квеста (теперь Кагренак обращается к игроку, хотя тот еще не наткнулся на него в лабиринте). Вторая же проблема оказалась связана всего лишь с тем, что функция OnPCHitMe принимает только два значения (1 \ 0); установив поэтапную модификацию countHits на + 1 всякий раз, когда OnPCHitMe принимала значение 1, скрипт моделирования процессов Сердца Лорхана все-таки удалось привести в работоспособное состояние, и теперь он работает как часы!!

 

begin KagrenakField

 

short Compression

short countHits

short doOnce

short keeningHit

short Release

short sunderHit

 

if ( MenuMode == 1 )

return

endif

 

if ( GetDistance Player < 1000 )

if ( doOnce == 0 )

ForceGreeting

set doOnce to 1

endif

endif

 

if ( CellChanged == 0 )

if ( Release < 5 )

if ( GetSoundPlaying "Jarktlom" == 0 )

PlayLoopSound3DVP "Jarktlom", 1.0, 1.0

endif

elseif ( Release == 5 )

if ( GetSoundPlaying "Jarktlom" == 1 )

StopSound "Jarktlom"

endif

endif

endif

 

if ( Release < 5 )

if ( GetHealth < 65535 )

SetHealth 65535

endif

endif

;Сердце Лорхана изолирует Кагренака от Плеромона.

 

set sunderHit to HitOnMe "Sunder"

set keeningHit to HitOnMe "Keening"

 

if ( sunderHit == 1 )

if ( Release == 0 )

set Release to 1

set sunderHit to 0

elseif ( Release > 0 )

set sunderHit to 0

endif

endif

;Разделитель фокусирует Щит Сердца.

 

if ( keeningHit == 1 )

set countHits to ( countHits + 1 )

set keeningHit to 0

endif

;Разрубатель сжимает Щит Сердца.

 

if ( Compression == 1 )

set Compression to 0

set Release to ( Release + 1 )

return

endif

 

if ( countHits == 0 )

if ( GetSpell "dagoth_ur_shield_01" == 0 )

AddSpell "dagoth_ur_shield_01"

endif

endif

;Физическое проявление действия Сердца.

 

if ( countHits == 1 )

if ( Release == 1 )

if ( GetSpell "dagoth_ur_shield_01" == 1 )

PlaySound3DVP "hearthit1" 1.0, 1.0

RemoveSpell "dagoth_ur_shield_01"

AddSpell "dagoth_ur_shield_02"

set Compression to 1

endif

endif

endif

 

if ( countHits == 2 )

if ( Release == 2 )

if ( GetSpell "dagoth_ur_shield_02" == 1 )

PlaySound3DVP "hearthit2" 1.0, 1.0

RemoveSpell "dagoth_ur_shield_02"

AddSpell "dagoth_ur_shield_03"

set Compression to 1

endif

endif

endif

 

if ( countHits == 3 )

if ( Release == 3 )

if ( GetSpell "dagoth_ur_shield_03" == 1 )

PlaySound3DVP "hearthit3" 1.0, 1.0

RemoveSpell "dagoth_ur_shield_03"

AddSpell "dagoth_ur_shield_04"

set Compression to 1

endif

endif

endif

 

if ( countHits == 4 )

if ( Release == 4 )

if ( GetSpell "dagoth_ur_shield_04" == 1 )

PlaySound3DVP "hearthit4" 1.0, 1.0

RemoveSpell "dagoth_ur_shield_04"

set Compression to 1

endif

endif

endif

;Возможность освобождения - после полной компактификации Щита Сердца.

 

if ( OnDeath == 1 )

PlaySoundVP "endboom2" 1.0, 0.5

StreamMusic "Special\MW_Triumph.mp3"

endif

 

end KagrenakField

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

Удаление GetDetected действительно помогло, хотя, к сожалению, несколько нарушило план моего квеста (теперь Кагренак обращается к игроку, хотя тот еще не наткнулся на него в лабиринте). Вторая же проблема оказалась связана всего лишь с тем, что функция OnPCHitMe принимает только два значения (1 \ 0); установив поэтапную модификацию countHits на + 1 всякий раз, когда OnPCHitMe принимала значение 1, скрипт моделирования процессов Сердца Лорхана все-таки удалось привести в работоспособное состояние, и теперь он работает как часы!!

Рад, что все работает.

Касательно гетдетектед - возможно, стоит сделать невидимый активатор, что б плейсил Кагренака к игроку на определенном расстоянии от него, со спецэффектами, естественно. Желательно, в тупик крепости.

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

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

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

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

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

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

Войти

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

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

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