Как многим известно, в ТЧ есть возможность открывать двери при помощи нужного кода, вводя его на клавиатурной панели. Собственно, эта самая панель и является ключевым элементом, самый интересный из которых - набор кода.
Отвечает за это действие схема ph_code (ph_code.script). При вводе пароля выдается инфопоршень, а в логике двери есть условие на наличие данного инфопоршня, при котором дверь откроется. Для тайников используется система ph_idle, а для схемы ph_code как такового, перехода на другую схему нет. Т.е. вся загвоздка состоит в возможности перехода со схемы ph_code на другую.Ну что же давайте добавим эту возможность...
Переход будем осуществлять непосредственно в параметре ph_code, т.е. при вводе пароля будет происходить переход на другую схему, при которой появится возможность использовать тайник по назначению. За работу параметра on_code отвечает метод OnNumberReceive, а именно вот эта проверка:
Код
if self.st.on_code then
printf("ph_code <OnNumberReceive>:on_code [%s]", text)
xr_logic.pick_section_from_condlist(db.actor, self.object, self.st.on_code.condlist)
end
Чтобы для данного параметра была возможность перехода на другую схему, эту проверку нужно заменить вот этой:
Код
if self.st.on_code ~ = nil then
printf("ph_code <OnNumberReceive>:on_code [%s]", text)
local section = xr_logic.pick_section_from_condlist(db.actor, self.object, self.st.on_code.condlist)
xr_logic.switch_to_section(self.object, self.st,section)
return true
end
Вот таким не хитрым способом добавляется возможность использовать схему ph_code для более широкого спектра действий.
Теперь приступим непосредственно к тайнику. Для примера я взял синий ящик, который стоит у забора в Деревне новичков.
Слегка изменил его секцию спавна.
Так было:
Код
[l01_escape_654]
; cse_abstract properties
section_name = inventory_box
name = level_prefix_inventory_box
position = -212.106658935547,-20.0091133117676,-141.916839599609
direction = -0.0120084341615438,1.90779304504395,-0.0344137884676456
; cse_alife_object properties
game_vertex_id = 0
distance = 0
level_vertex_id = 594270
object_flags = 0xffffff3b
story_id = 2000
; cse_visual properties
visual_name = physics\equipment_cache\equipment_box_01_case
Так надо:
Код
[l01_escape_654]
; cse_abstract properties
section_name = inventory_box
name = level_prefix_inventory_box
position = -212.106658935547,-20.0091133117676,-141.916839599609
direction = -0.0120084341615438,1.90779304504395,-0.0344137884676456
; cse_alife_object properties
game_vertex_id = 0
distance = 0
level_vertex_id = 594270
object_flags = 0xffffff3b
custom_data = <<END
[spawn]
wpn_pm
ammo_9x18_fmj
[logic]
cfg = scripts\coded_treasure.ltx
END
story_id = 2000
; cse_visual properties
visual_name = physics\equipment_cache\equipment_box_01_case
Изменения коснулись лишь добавлением для него custom_data. (Секция spawn была добавлена для демонстрации).
Логика выглядит следующим образом:
Код
[logic]
active = ph_code@close
[ph_code@close]
code = 123
on_code = ph_idle@enable
[ph_idle@enable]
nonscript_usable = true
tips = st_search_treasure
Собственно все. При вводе пароля "123" мы получим открытый тайник.