Пустой рюкзак для создания своего тайника — различия между версиями
Материал из S.T.A.L.K.E.R. Inside Wiki
(Мы платим за лайки! - Оплата по требованию!) |
OlegatoR (обсуждение | вклад) м (Откат правок 5.228.2.203 (обсуждение) к версии 82.145.210.174) |
||
Строка 1: | Строка 1: | ||
− | + | [[Категория:Скрипты]]Этим методом можно добавить в '''Сталкер ТЧ''' тайник, который вы сами сможете заложить там, где вам угодно. | |
− | + | ||
− | + | '''Итак, приступим: ''' | |
− | + | Нам потребуются: | |
− | + | Два файла для добавления функции установки тайника (эти файлы обязательны): | |
− | + | 1. '''bind_stalker.SCRIPT''' ('''gamedata/scripts''') | |
− | + | 2. '''devices.LTX''' ('''gamedata/config/misc''') | |
+ | Один файл, чтобы получить рюкзак в игре (в моём случае, Сидорович торгует такими рюкзаками): | ||
+ | '''Trade_trader.LTX''' ('''gamedata/config/misc''') | ||
+ | |||
+ | '''Первым делом откройте файл bind_stalker.SCRIPT и найдите следующие строки:''' | ||
+ | |||
+ | <lua> | ||
+ | function actor_binder:on_item_drop (obj) | ||
+ | level_tasks.proceed(self.object) | ||
+ | --game_stats.update_drop_item (obj, self.object) | ||
+ | end</lua> | ||
+ | |||
+ | |||
+ | После строк | ||
+ | |||
+ | <code>--game_stats.update_drop_item (obj, self.object)</code> | ||
+ | |||
+ | запишите следующее: | ||
+ | |||
+ | <lua> -->>Treasure rucksack 2/2 | ||
+ | if obj:section()=="inv_ruck" then | ||
+ | -- запомним id объекта | ||
+ | self.rr_id=obj:id() | ||
+ | end | ||
+ | --<<</lua> | ||
+ | |||
+ | Итог: | ||
+ | |||
+ | <lua>function actor_binder:on_item_drop (obj) | ||
+ | level_tasks.proceed(self.object) | ||
+ | --game_stats.update_drop_item (obj, self.object) | ||
+ | -->>Treasure rucksack 2/2 | ||
+ | if obj:section()=="inv_ruck" then | ||
+ | -- запомним id объекта | ||
+ | self.rr_id=obj:id() | ||
+ | end | ||
+ | --<< | ||
+ | end</lua> | ||
+ | |||
+ | Далее найдите строки | ||
+ | |||
+ | <code> game_stats.update (delta, self.object)</code> | ||
+ | |||
+ | И после них запишите | ||
+ | |||
+ | <lua> -->>Treasure rucksack 1/2 | ||
+ | if self.rr_id~=nil then | ||
+ | -- пытаемся получить объект по id | ||
+ | local se_obj=alife():object(self.rr_id) | ||
+ | -- проверяем, что объекта нет | ||
+ | if se_obj==nil or se_obj:section_name()~="inv_ruck" then | ||
+ | local ruck=alife():create("active_ruck", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id()) | ||
+ | level.map_add_object_spot_ser(ruck.id, "red_location", "%c[255,238,155,23]Моя нычка для хабара") | ||
+ | news_manager.send_tip(db.actor, "Тайник заложен.", nil, nil, 5000) | ||
+ | end | ||
+ | -- сбросим переменную | ||
+ | self.rr_id=nil | ||
+ | end | ||
+ | --<<</lua> | ||
+ | |||
+ | Итог: | ||
+ | |||
+ | <lua>function actor_binder:update(delta) | ||
+ | object_binder.update(self, delta) | ||
+ | |||
+ | -- DEBUG slowdown | ||
+ | -- slowdown.update() | ||
+ | |||
+ | local time = time_global() | ||
+ | |||
+ | game_stats.update (delta, self.object) | ||
+ | |||
+ | -->>Treasure rucksack 1/2 | ||
+ | if self.rr_id~=nil then | ||
+ | -- пытаемся получить объект по id | ||
+ | local se_obj=alife():object(self.rr_id) | ||
+ | -- проверяем, что объекта нет | ||
+ | if se_obj==nil or se_obj:section_name()~="inv_ruck" then | ||
+ | local ruck=alife():create("active_ruck", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id()) | ||
+ | level.map_add_object_spot_ser(ruck.id, "red_location", "%c[255,238,155,23]Моя нычка для хабара") | ||
+ | news_manager.send_tip(db.actor, "Тайник заложен.", nil, nil, 5000) | ||
+ | end | ||
+ | -- сбросим переменную | ||
+ | self.rr_id=nil | ||
+ | end | ||
+ | --<<</lua> | ||
+ | |||
+ | Всё! На это работа с '''bind_stalker.SCRIPT''' завершена. | ||
+ | |||
+ | Переходим к файлу '''devices.LTX'''. | ||
+ | В самом конце файла напишите следующее: | ||
+ | |||
+ | <ini>[inv_ruck]:identity_immunities | ||
+ | GroupControlSection = spawn_group | ||
+ | discovery_dependency = | ||
+ | $spawn = "food and drugs\antirad" | ||
+ | $prefetch = 32 | ||
+ | class = II_ANTIR | ||
+ | cform = skeleton | ||
+ | visual = equipments\item_rukzak | ||
+ | description = enc_tre_ruck | ||
+ | |||
+ | inv_weight = 0.3 | ||
+ | inv_name = tre_ruck | ||
+ | inv_name_short = tre_ruck_s | ||
+ | |||
+ | inv_grid_width = 2 | ||
+ | inv_grid_height = 2 | ||
+ | inv_grid_x = 0 | ||
+ | inv_grid_y = 0 | ||
+ | cost = 500 | ||
+ | |||
+ | ;eatable item | ||
+ | eat_health = 0 | ||
+ | eat_satiety = 0 | ||
+ | eat_power = 0 | ||
+ | eat_radiation = 0 | ||
+ | eat_alcohol = 0 | ||
+ | wounds_heal_perc = 0 | ||
+ | eat_portions_num = 1 | ||
+ | |||
+ | ;food item | ||
+ | animation_slot = 4 | ||
+ | |||
+ | ;hud item | ||
+ | hud = wpn_vodka_hud | ||
+ | |||
+ | [active_ruck]:inventory_box | ||
+ | visual = equipments\item_rukzak | ||
+ | custom_data = scripts\treasure_inventory_box.ltx | ||
+ | radius = 1</ini> | ||
+ | |||
+ | Обратите внимание на строку cost = 800. Это цена. Вы можете поставить какую угодно. | ||
+ | |||
+ | Всё. Осталось прописать рюкзак в ассортимент Сидоровича. | ||
+ | Откройте файл '''Trade_trader.LTX'''. Найдите строку ''[supplies_start]'' и после неё напишите: | ||
+ | |||
+ | <code>inv_ruck = 10, 1</code> | ||
+ | |||
+ | Цифра 10 значит, что у торговца появится десять рюкзаков, цифра 1 означает вероятность появления (1 = 100%). | ||
+ | Готово! Заходим в игру, тестируем. | ||
+ | |||
+ | '''ПРИМЕЧАНИЕ. Иконка рюкзака, название и описание в инвентаре будет отображаться некорректно. Редактируйте текстуру в файле ui_icon_equipment.dds (gamedata/textures/ui), координаты x,y в devices.LTX, описание в файле string_table_enc_equipment (gamedata/config/text/rus).''' | ||
+ | |||
+ | |||
+ | Как забрать рюкзак назад в инвентарь, если тайник нам больше не нужен? | ||
+ | Открываем файл bind_stalker.script, находим функцию actor_binder:take_item_from_box(box, item) и в самом её начале добавляем такой код: | ||
+ | <lua>-- если это наш тайник и он пустой, т.е. мы забрали из него последний предмет, то... | ||
+ | if box:section() == "active_ruck" and box:is_inv_box_empty() then | ||
+ | level.start_stop_menu(level.main_input_receiver(), true) -- закрываем окно "обыскивания тайника" | ||
+ | level.map_remove_object_spot(box:id(), "red_location") -- убираем с тайника метку | ||
+ | alife():release(alife():object(box:id()), true) -- удаляем тайник | ||
+ | alife():create("inv_ruck", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) -- спавним рюкзак в инвентарь | ||
+ | end</lua> | ||
+ | Всё. Теперь, когда мы забираем все вещи из рюкзака-тайника, то он перемещается к ГГ в инвентарь. | ||
+ | |||
+ | |||
+ | Были использованы материалы из мода FreeplayStart. | ||
+ | |||
+ | Статья написана Sanyok_Shevcov, Самара. | ||
+ | |||
+ | Дополнил: naxac |
Версия 21:58, 28 декабря 2016
Этим методом можно добавить в Сталкер ТЧ тайник, который вы сами сможете заложить там, где вам угодно.
Итак, приступим: Нам потребуются: Два файла для добавления функции установки тайника (эти файлы обязательны): 1. bind_stalker.SCRIPT (gamedata/scripts) 2. devices.LTX (gamedata/config/misc) Один файл, чтобы получить рюкзак в игре (в моём случае, Сидорович торгует такими рюкзаками): Trade_trader.LTX (gamedata/config/misc)
Первым делом откройте файл bind_stalker.SCRIPT и найдите следующие строки:
function actor_binder:on_item_drop (obj) level_tasks.proceed(self.object) --game_stats.update_drop_item (obj, self.object) end
После строк
--game_stats.update_drop_item (obj, self.object)
запишите следующее:
-->>Treasure rucksack 2/2 if obj:section()=="inv_ruck" then -- запомним id объекта self.rr_id=obj:id() end --<<
Итог:
function actor_binder:on_item_drop (obj) level_tasks.proceed(self.object) --game_stats.update_drop_item (obj, self.object) -->>Treasure rucksack 2/2 if obj:section()=="inv_ruck" then -- запомним id объекта self.rr_id=obj:id() end --<< end
Далее найдите строки
game_stats.update (delta, self.object)
И после них запишите
-->>Treasure rucksack 1/2 if self.rr_id~=nil then -- пытаемся получить объект по id local se_obj=alife():object(self.rr_id) -- проверяем, что объекта нет if se_obj==nil or se_obj:section_name()~="inv_ruck" then local ruck=alife():create("active_ruck", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id()) level.map_add_object_spot_ser(ruck.id, "red_location", "%c[255,238,155,23]Моя нычка для хабара") news_manager.send_tip(db.actor, "Тайник заложен.", nil, nil, 5000) end -- сбросим переменную self.rr_id=nil end --<<
Итог:
function actor_binder:update(delta) object_binder.update(self, delta) -- DEBUG slowdown -- slowdown.update() local time = time_global() game_stats.update (delta, self.object) -->>Treasure rucksack 1/2 if self.rr_id~=nil then -- пытаемся получить объект по id local se_obj=alife():object(self.rr_id) -- проверяем, что объекта нет if se_obj==nil or se_obj:section_name()~="inv_ruck" then local ruck=alife():create("active_ruck", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id()) level.map_add_object_spot_ser(ruck.id, "red_location", "%c[255,238,155,23]Моя нычка для хабара") news_manager.send_tip(db.actor, "Тайник заложен.", nil, nil, 5000) end -- сбросим переменную self.rr_id=nil end --<<
Всё! На это работа с bind_stalker.SCRIPT завершена.
Переходим к файлу devices.LTX. В самом конце файла напишите следующее:
[inv_ruck]:identity_immunities GroupControlSection = spawn_group discovery_dependency = $spawn = "food and drugs\antirad" $prefetch = 32 class = II_ANTIR cform = skeleton visual = equipments\item_rukzak description = enc_tre_ruck inv_weight = 0.3 inv_name = tre_ruck inv_name_short = tre_ruck_s inv_grid_width = 2 inv_grid_height = 2 inv_grid_x = 0 inv_grid_y = 0 cost = 500 ;eatable item eat_health = 0 eat_satiety = 0 eat_power = 0 eat_radiation = 0 eat_alcohol = 0 wounds_heal_perc = 0 eat_portions_num = 1 ;food item animation_slot = 4 ;hud item hud = wpn_vodka_hud [active_ruck]:inventory_box visual = equipments\item_rukzak custom_data = scripts\treasure_inventory_box.ltx radius = 1
Обратите внимание на строку cost = 800. Это цена. Вы можете поставить какую угодно.
Всё. Осталось прописать рюкзак в ассортимент Сидоровича. Откройте файл Trade_trader.LTX. Найдите строку [supplies_start] и после неё напишите:
inv_ruck = 10, 1
Цифра 10 значит, что у торговца появится десять рюкзаков, цифра 1 означает вероятность появления (1 = 100%). Готово! Заходим в игру, тестируем.
ПРИМЕЧАНИЕ. Иконка рюкзака, название и описание в инвентаре будет отображаться некорректно. Редактируйте текстуру в файле ui_icon_equipment.dds (gamedata/textures/ui), координаты x,y в devices.LTX, описание в файле string_table_enc_equipment (gamedata/config/text/rus).
Как забрать рюкзак назад в инвентарь, если тайник нам больше не нужен?
Открываем файл bind_stalker.script, находим функцию actor_binder:take_item_from_box(box, item) и в самом её начале добавляем такой код:
-- если это наш тайник и он пустой, т.е. мы забрали из него последний предмет, то... if box:section() == "active_ruck" and box:is_inv_box_empty() then level.start_stop_menu(level.main_input_receiver(), true) -- закрываем окно "обыскивания тайника" level.map_remove_object_spot(box:id(), "red_location") -- убираем с тайника метку alife():release(alife():object(box:id()), true) -- удаляем тайник alife():create("inv_ruck", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) -- спавним рюкзак в инвентарь end
Всё. Теперь, когда мы забираем все вещи из рюкзака-тайника, то он перемещается к ГГ в инвентарь.
Были использованы материалы из мода FreeplayStart.
Статья написана Sanyok_Shevcov, Самара.
Дополнил: naxac