×
Меню
Индекс

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