MSFD Ограничение на телепортацию
[no fix] DisableTeleporting
[no fix] EnableTeleporting
Название говорит само за себя.
Эти функции используются для включения и выключения возможности магии телепортации.
Прекрасно подходит, чтобы не дать игроку возможности сбежать из подземелья.
В оригинальной игре это используется только при встрече игрока с Дагот Уром.
Я не буду показывать весь скрипт, так как он содержит в себе спойлер, но вот его часть, использующая эти функции:
short teleportDisabled
if ( teleportDisabled == 0 )
DisableTeleporting
Set teleportDisabled to 1
endif
Позже эта установка сбрасывается в скрипте EndGame.
Примечание.
Стоит заметить, что подобное легко обходится "кольцами телепортации".
Т.к. опция DisableTeleporting влияет только на магические эффекты Возврата и Вмешательств.
Но скриптовая "телепортация" будет работать в полной мере.
Другое дело, что запрет на левитацию можно всегда "обойти" посредством мега прыжка и замедления падения.
Хотя улетать "в астрал" из Морнхолда, такое себе.
Пример: когда установлен Трибунал, эта функция сломана: Один из стартовых скриптов в Трибунале прерывает все другие команды телепорта и включает телепортацию везде, кроме одной особой области в Морнхолде (спасибо Slink и Riiak за информацию). Я уверен, что это можно легко поправить, отредактировав скрипт.
Begin TribunalMain
; проверка на телепортацию
if ( GetPCCell "Sotha Sil," == 1 )
DisableTeleporting
else
EnableTeleporting
endif
; проверка на левитацию
if ( GetPCCell "Sotha Sil," == 1 )
DisableLevitation
elseif ( GetPCCell "Mournhold" == 1 )
DisableLevitation
else
EnableLevitation
endif
end
Вот не тестировавшееся предложение для исправления. Последняя версия выглядит так:
Begin TribunalMain
short disablestate
short newstate ;по умолчанию, включить телепортацию и левитацию
set newstate to 0 ;проверять только интерьеры
if ( GetInterior )
if ( GetPCCell "Sotha Sil," == 1 ) ;отключить здесь телепортацию и левитацию
set newstate to 1
elseif ( GetPCCell "Mournhold" == 1 ) ;отключить здесь левитацию
set newstate to 2 endif
endif ;если состояние изменилось
if ( disablestate != newstate )
if ( newstate == 1 )
DisableTeleporting
DisableLevitation
elseif ( newstate == 2 )
DisableLevitation
elseif ( newstate == 0 )
EnableTeleporting
EnableLevitation
endif
set disablestate to newstateendifend
Примечание: DinkumThinkum предложил следующий способ запрета телепортации.
Проверяется, находится ли игрок в определенной ячейке.
Если нет, то его скриптом телепортируют, допустим, в начало мода.
Т.е. подобный метод блокирует использование "колец телепортации".
Begin DT_Test_BalmoraTrap
If ( GetPCCell, "Balmora" == 1 )
Return
Endif
MessageBox "Давай назад в Балмору!"
Player->PositionCell, -21278, -17613, 534, 0, "Balmora (-3, -3)"
End
Еще вариант, в целом аналогичен приведенному, но позволяет более гибко решать некоторые задачи.
Begin DT_Othertrap
Short Once
If ( Once == 1 )
If ( GetPCCell, "Balmora" == 1 )
Set Once to 0
return
endif
endif
If ( Once == 0 )
If ( GetPCCell, "Balmora" == 0 )
MessageBox "Давай назад в Балмору!"
Player->PositionCell, -21278, -17613, 534, 0, "Balmora (-3, -3)"
Set Once to 1
Endif
Endif
End
И еще вариант!
Begin DT_Othertrap2
if ( GetPCCell "Balmora" == 1 )
return
else
MessageBox "Давай назад в Балмору!"
Player->PositionCell, -21278, -17613, 534, 0, "Balmora (-3, -3)"
endif
End