Как многим известно, в ТЧ есть возможность открывать двери при помощи нужного кода, вводя его на клавиатурной панели. Собственно, эта самая панель и является ключевым элементом, самый интересный из которых - набор кода. 
 Отвечает за это действие схема 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" мы получим открытый тайник.