n6260 136 Опубликовано 12 Февраля 2010 Поделиться Опубликовано 12 Февраля 2010 Пособие >смотреть< по "добавлению в игру нового оружия". Вдруг кому пригодится. 256 символов Ссылка на комментарий
pathfinder 1 Опубликовано 7 Марта 2010 Поделиться Опубликовано 7 Марта 2010 (изменено) Автор: RezaniyУровень сложности: средне Материал из S.T.A.L.K.E.R. Inside Wiki.В игре наверняка вы встречали такое - При получении какого то задания, или диалога появляются новые НПС или прочие ФПС. В этой статье мы будем рассматривать на Ростке. Итак нам понадобятся такие файлы:info_l07rostok.xmlall.spawnНачнём! Распакуем all.spawn и откроем файл alife_l06_rostok.ltx. В нём найдём такие строчки: [3851] ; cse_abstract properties section_name = stalker name = bar_freedom_attacker_1 position = -214.942504882813,-2.09808349609375e-005,164.513900756836 direction = 0,0,0 ; cse_alife_trader_abstract properties money = 5000 character_profile = bar_Killer_regular ; cse_alife_object properties game_vertex_id = 1335 distance = 6.29999971389771 level_vertex_id = 23441 object_flags = 0xffffffff custom_data = <<END [spawner] cond = {+bar_heli_scene_stay_online} [smart_terrains] bar_freedom_attack = true END ; cse_visual properties visual_name = actors\killer\stalker_ki_mask ; cse_alife_creature_abstract properties g_team = 0 g_squad = 5 g_group = 7 health = 1 dynamic_out_restrictions = dynamic_in_restrictions = upd:health = 1 upd:timestamp = 0 upd:creature_flags = 0 upd:position = -214.942504882813,-2.09808349609375e-005,164.513900756836 upd:o_model = 0 upd:o_torso = 0,0,0 upd:g_team = 0 upd:g_squad = 5 upd:g_group = 7 ; cse_alife_monster_abstract properties upd:next_game_vertex_id = 65535 upd:prev_game_vertex_id = 65535 upd:distance_from_point = 0 upd:distance_to_point = 0 ; cse_alife_human_abstract properties predicate5 = 0,1,2,0,2 predicate4 = 0,1,1,0 ; cse_ph_skeleton properties upd:start_dialog = ; se_stalker properties В этой писанине нам нужно только это: [spawner] cond = {+bar_heli_scene_stay_online} Это переход НПС в онлайн при выдаче инфопоршня. Чтобы убедится в этом найдём его в info_l07rostok.xml Убедились? Отлично! Двигаемся дальше. Вместо знака + вы можете поставить знак -. Значит при этом инфопоршне НПС уйдет в оффлайн.Можно менять эти инфопоршны на любые другие, в том числе свои. Теперь поменяем его к примеру на... bar_kruglov_follow_tunnel. В итоге: [spawner] cond = {+bar_kruglov_follow_tunnel} Этот НПС (или нпсы несколько неписей) буду рождаться когда вы пройдете через тунель где наёмники снайепры. Все инфопоршны брать из файлы, соответствующему локации. Вы можете сделать свой квест и применить инфопоршы к этому делу.P.S. Теперь сделаем чтобы всё до конца работала. Найдём смарт_терраин в котором прописан +bar_heli_scene_stay_online. И допишем туда свой. [3857] ; cse_abstract properties section_name = smart_terrain name = bar_ecolog_crush position = -294.061706542969,7.43865966796875e-005,140.005218505859 direction = 1.01860559880151e-005,-7.54995954643789e-010,7.41205367376097e-005 ; cse_alife_object properties game_vertex_id = 1350 distance = 2.79999995231628 level_vertex_id = 100 object_flags = 0xffffffbe custom_data = <<END [smart_terrain] type = bar_ecolog_crush capacity = 5 squad = 5 groups = 1,2 cond = {+bar_heli_scene_stay_online},{+bar_kruglov_follow_tunnel} END ; cse_shape properties shapes = shape0 shape0:type = sphere shape0:offset = 0,0,0 shape0:radius = 2.66736793518066 ; cse_alife_space_restrictor properties restrictor_type = 0 ; se_smart_terrain properties Вот он. Вот и всё! Изменено 20 Сентября 2014 пользователем World_Stalker забыто и уничтожено. Ссылка на комментарий
Гость max_max_08 Опубликовано 16 Марта 2010 Поделиться Опубликовано 16 Марта 2010 (изменено) Я вот решил поделиться способом переключения модов. В качестве примера возьму 2 мода под 1.0004 патч amk1.4.1 и арсенал мод, предполагается что папка bin у модов одна и тажеСоздаем в корне игры текстовый документ с именем amk.bat и вписываем ren amk_gamedata gamedata cd bin XR_3DA.exe -nointro cd.. ren gamedata amk_gamedata Создаем текстовый документ с именем ars.bat и вписываем: ren ars_gamedata gamedata cd bin XR_3DA.exe -nointro cd.. ren gamedata ars_gamedata Создаем папку amk_gamedata и помещаем туда мод amk 1.4.1, а в ars_gamedata помещаем арсенал мод.Игру запускаем BAT файломпри этом сохранения в игре будут пересекаться, то-есть сохранился в арсенале, а в amk это сохранение вылетит. Тогда делаем так, берем файл fsgame.ltx и переименовываем в amk_fsgame.ltx, открываем блокнотом и изменяем путь до папки с сохранением $app_data_root$=true|false|C:|Documents and Settings\All Users\Документы\STALKER-SHOC меняем на это: $app_data_root$=true|false|C:|Documents and Settings\All Users\Документы\STALKER-amk делаем копию этого файла с именем ars_fsgame.ltx и меняем путь на это: $app_data_root$=true|false|C:|Documents and Settings\All Users\Документы\STALKER-ars Правим оба батника, добавляем 2 строки в каждый, должно получиться так: ren ars_gamedata gamedata ren ars_fsgame.ltx fsgame.ltx cd bin XR_3DA.exe -nointro cd.. ren gamedata ars_gamedata ren fsgame.ltx ars_fsgame.ltx и так же во втором, amk.bat ren amk_gamedata gamedata ren amk_fsgame.ltx fsgame.ltx cd bin XR_3DA.exe -nointro cd.. ren gamedata amk_gamedata ren fsgame.ltx amk_fsgame.ltx Все, сохранения будут храниться в разных папках и не будут пересекаться.Если патчи для модов разные, например 1.0003 и 1.0004, то можно сделать так, например у нас мод "скрытая аномалия" он под 1.0003 патч и "арсенал мод" он под 1.0004 патч. Нам нужны папки bin с обоих патчей и файлы gamedata.dbb. В 1.0003 патче он занимает 23.5 мегабайта, а в 1.0004 52.6 мегабайта, папку bin 3 патча переименовываем в sa_bin, а 4го в ars_bin.Файл gamedata.dbb 3его патча (23.5mb) переименовываем в sa_gamedata.dbb, а файл gamedata.dbb 4го патча (52.6mb) переименовываем в ars_gamedata.dbb.Теперь изменяем батники, в ars.bat вгоняем: ren ars_bin bin ren ars_gamedata gamedata ren ars_gamedata.dbb gamedata.dbb ren ars_fsgame.ltx fsgame.ltx cd bin XR_3DA.exe -nointro cd.. ren bin ars_bin ren gamedata ars_gamedata ren fsgame.ltx ars_fsgame.ltx ren gamedata.dbb ars_gamedata.dbb А в sa.bat пишем ren sa_bin bin ren sa_gamedata gamedata ren sa_fsgame.ltx fsgame.ltx ren sa_gamedata.dbb gamedata.dbb cd bin XR_3DA.exe -nointro cd.. ren bin sa_bin ren gamedata sa_gamedata ren fsgame.ltx sa_fsgame.ltx ren gamedata.dbb sa_gamedata.dbb При этом нужно создать этот sa_fsgame.ltx и изменить путь до папки с сохранениями на: $app_data_root$=true|false|C:|Documents and Settings\All Users\Документы\STALKER-sa В процессе игры заметил если свернуть игру и "случайно" закрыть окнобатника то запуск другого мода не произойдет, будет запущен первый мод. Что-бы такого не произошло я доработал батник, вписав в начало каждого бат файла эти строки:if exist %SystemDrive%\WINDOWS\system32\cmdow.exe goto cool copy cmdow.exe %SystemDrive%WINDOWS\system32 :cool cmdow @ /hid получилось так: if exist %SystemDrive%\WINDOWS\system32\cmdow.exe goto cool copy cmdow.exe %SystemDrive%WINDOWS\system32 :cool cmdow @ /hid ren ars_bin bin ren ars_gamedata gamedata ren ars_fsgame.ltx fsgame.ltx ren ars_gamedata.dbb gamedata.dbb cd bin XR_3DA.exe -nointro cd.. ren bin ars_bin ren gamedata ars_gamedata ren fsgame.ltx ars_fsgame.ltx ren gamedata.dbb ars_gamedata.dbb Для этого нужно скачать программу cmdow.exe (15kb) и поместить в корень игры. Добавленная команда просто скрывает окно работы бат файла от посторонних глаз. Внимание!!! некоторые антивирусы видят cmdow.exe как вирус.Наверное у некоторых возникнет вопрос, что делает та или иная строка. На против каждой строчки я напишу действие которое она выполняет:if exist %SystemDrive%\WINDOWS\system32\cmdow.exe goto cool - проверяет существует ли файл cmdow.exe, если да то переход к метке :coolcopy cmdow.exe %SystemDrive%WINDOWS\system32 - копирует файл cmdow.exe в систему:cool -меткаcmdow @ /hid - команда "скрыть окно" для cmdow.exeren ars_bin bin - переименовывает папку из ars_bin в binren ars_gamedata gamedata - переименовывает папку из ars_gamedata в gamedataren ars_fsgame.ltx fsgame.ltx - переименовывает файл из ars_fsgame.ltx в fsgame.ltxren ars_gamedata.dbb gamedata.dbb - переименовывает файл из ars_gamedata.dbb в gamedata.dbbcd bin - переход в папку binXR_3DA.exe -nointro - запуск файла XR_3DA.exe с параметром -nointrocd.. - переход назад в папку gamedataren bin ars_bin - переименовывает папку обратно в ars_binren gamedata ars_gamedata - переименовывает папку обратно в ars_gamedataren fsgame.ltx ars_fsgame.ltx - переименовывает файл обратно в ars_fsgame.ltxren gamedata.dbb ars_gamedata.dbb - переименовывает файл обратно в ars_gamedata.dbbЕсли у вас что-то не получается то можно в самом конце батника вписать команду "Pause" предварительно удалив команду "cmdow @ /hid" в окне можно увидеть лог работы и возможные ошибкиP.S. Первоисточник, найдете некоторые ответы перейти Изменено 20 Сентября 2014 пользователем World_Stalker оформил Ссылка на комментарий
PrototypeGameZ 1 Опубликовано 17 Марта 2010 Поделиться Опубликовано 17 Марта 2010 (изменено) Автор: PrototypeGameZСложность: СреднеФайлы:config\localization (rus).ltxscripts\ui_main_menu.scriptconfig\ui\ui_cheat.xmlscripts\ui_cheat.scriptconfig\text\rus\ui_cheat.xmlscripts\prototype.scriptДля начала, в файле config\localization.ltx допишите в конец строки files = ... вот это - ", ui_cheat" (без кавычек)Далее, откроем файл scripts\ui_main_menu.script, и найдем такую строчку: if keyboard_action == ui_events.WINDOW_KEY_PRESSED then И после неё пишем: if dik == DIK_keys.DIK_HOME then if level.present() and (db.actor ~= nil) and db.actor:alive() then self:cheat_menu_show() end end В конец этого файла дописываем: function main_menu:cheat_menu_show() if self.cheat_dlg == nil then self.cheat_dlg = ui_cheat.cheat() self.cheat_dlg.owner = self end self:GetHolder():start_stop_menu(self.cheat_dlg, true) self:GetHolder():start_stop_menu(self, true) self:Show(true) end Создаём файл scripts\ui_cheat.script.Вот его содержимое: class "cheat" (CUIScriptWnd) function cheat:__init(owner,objid) super() self.owner = owner self:InitControls() self:InitCallBacks() end function cheat:__finalize() end function cheat:check_btn(id) local number = 8 if id <= number then return true else return false end end function cheat:InitControls() self:Init(300,200,550,450) local xml=CScriptXmlInit() xml:ParseFile("ui_cheat.xml") xml:InitStatic("background", self) if self:check_btn(1) then self:Register(xml:Init3tButton("btn_1",self),"btn_1") end if self:check_btn(2) then self:Register(xml:Init3tButton("btn_2",self),"btn_2") end if self:check_btn(3) then self:Register(xml:Init3tButton("btn_3",self),"btn_3") end if self:check_btn(4) then self:Register(xml:Init3tButton("btn_4",self),"btn_4") end if self:check_btn(5) then self:Register(xml:Init3tButton("btn_5",self),"btn_5") end if self:check_btn(6) then self:Register(xml:Init3tButton("btn_6",self),"btn_6") end if self:check_btn(7) then self:Register(xml:Init3tButton("btn_7",self),"btn_7") end if self:check_btn(8) then self:Register(xml:Init3tButton("btn_8",self),"btn_8") end if self:check_btn(9) then self:Register(xml:Init3tButton("btn_9",self),"btn_9") end if self:check_btn(10) then self:Register(xml:Init3tButton("btn_10",self),"btn_10") end if self:check_btn(11) then self:Register(xml:Init3tButton("btn_11",self),"btn_11") end if self:check_btn(12) then self:Register(xml:Init3tButton("btn_12",self),"btn_12") end if self:check_btn(13) then self:Register(xml:Init3tButton("btn_13",self),"btn_13") end if self:check_btn(14) then self:Register(xml:Init3tButton("btn_14",self),"btn_14") end if self:check_btn(15) then self:Register(xml:Init3tButton("btn_15",self),"btn_15") end if self:check_btn(16) then self:Register(xml:Init3tButton("btn_16",self),"btn_16") end self:Register(xml:Init3tButton("btn_quit",self),"btn_quit") end function cheat:InitCallBacks() if self:check_btn(1) then self:AddCallback("btn_1", ui_events.BUTTON_CLICKED, self.cheat_1, self) end if self:check_btn(2) then self:AddCallback("btn_2", ui_events.BUTTON_CLICKED, self.cheat_2, self) end if self:check_btn(3) then self:AddCallback("btn_3", ui_events.BUTTON_CLICKED, self.cheat_3, self) end if self:check_btn(4) then self:AddCallback("btn_4", ui_events.BUTTON_CLICKED, self.cheat_4, self) end if self:check_btn(5) then self:AddCallback("btn_5", ui_events.BUTTON_CLICKED, self.cheat_5, self) end if self:check_btn(6) then self:AddCallback("btn_6", ui_events.BUTTON_CLICKED, self.cheat_6, self) end if self:check_btn(7) then self:AddCallback("btn_7", ui_events.BUTTON_CLICKED, self.cheat_7, self) end if self:check_btn(8) then self:AddCallback("btn_8", ui_events.BUTTON_CLICKED, self.cheat_8, self) end if self:check_btn(9) then self:AddCallback("btn_a", ui_events.BUTTON_CLICKED, self.cheat_a, self) end if self:check_btn(10) then self:AddCallback("btn_10", ui_events.BUTTON_CLICKED, self.cheat_10, self) end if self:check_btn(11) then self:AddCallback("btn_11", ui_events.BUTTON_CLICKED, self.cheat_11, self) end if self:check_btn(12) then self:AddCallback("btn_12", ui_events.BUTTON_CLICKED, self.cheat_12, self) end if self:check_btn(13) then self:AddCallback("btn_13", ui_events.BUTTON_CLICKED, self.cheat_13, self) end if self:check_btn(14) then self:AddCallback("btn_14", ui_events.BUTTON_CLICKED, self.cheat_14, self) end if self:check_btn(15) then self:AddCallback("btn_15", ui_events.BUTTON_CLICKED, self.cheat_15, self) end if self:check_btn(16) then self:AddCallback("btn_16", ui_events.BUTTON_CLICKED, self.cheat_16, self) end self:AddCallback("btn_quit", ui_events.BUTTON_CLICKED, self.on_quit, self) end function cheat:OnKeyboard(dik, keyboard_action) CUIScriptWnd.OnKeyboard(self,dik,keyboard_action) if keyboard_action == ui_events.WINDOW_KEY_PRESSED then if dik == DIK_keys.DIK_ESCAPE then self:on_quit() end end return true end function cheat:on_quit() local console = get_console() self:GetHolder():start_stop_menu (self.owner, true) self:GetHolder():start_stop_menu (self,true) self.owner:Show(true) console:execute("main_menu off") end function cheat:cheat_1() prototype.spawn_actor("wpn_fn2000","1") self:on_quit() end function cheat:cheat_2() prototype.spawn_actor("ammo_5.56x45_ap","5") prototype.spawn_actor("ammo_5.56x45_ap","5") prototype.spawn_actor("ammo_5.56x45_ap","5") prototype.spawn_actor("ammo_5.56x45_ap","5") prototype.spawn_actor("ammo_5.56x45_ap","5") prototype.spawn_actor("ammo_m209","5") prototype.spawn_actor("ammo_m209","5") prototype.spawn_actor("ammo_m209","5") prototype.spawn_actor("ammo_m209","5") prototype.spawn_actor("ammo_m209","5") prototype.spawn_actor("ammo_m209","5") prototype.spawn_actor("ammo_m209","5") prototype.spawn_actor("ammo_m209","5") prototype.spawn_actor("ammo_m209","5") prototype.spawn_actor("ammo_m209","5") self:on_quit() end function cheat:cheat_3() prototype.spawn_actor("outfit_exo_m1","1") self:on_quit() end function cheat:cheat_4() prototype.spawn_actor("af_medusa","5") prototype.spawn_actor("af_night_star","5") prototype.spawn_actor("af_vyvert","5") prototype.spawn_actor("af_gravi","5") self:on_quit() end function cheat:cheat_5() local section = "bar_dolg_respawn_1" local pos = db.actor:position() local lvid = db.actor:level_vertex_id() local gvid = db.actor:game_vertex_id() local number = "10" local tip = "Ну, блин! Догадался нажать HOME! Тоже мне хакер... Ну чё!? Где враги?" local time = "15000" prototype.prototype_spawn(section,pos,lvid,gvid,number,tip,time) self:on_quit() end function cheat:cheat_6() local section = "mil_freedom_respawn_1" local pos = db.actor:position() local lvid = db.actor:level_vertex_id() local gvid = db.actor:game_vertex_id() local number = "10" local tip = "Ну, блин! Догадался нажать HOME! Тоже мне хакер... Ну чё!? Где враги?" local time = "15000" prototype.prototype_spawn(section,pos,lvid,gvid,number,tip,time) self:on_quit() end function cheat:cheat_7() db.actor:give_money(100000) game_stats.money_quest_update (100000) self:on_quit() end function cheat:cheat_8() db.actor:restore_weapon() self:on_quit() end function cheat:cheat_a() self:on_quit() end function cheat:cheat_10() self:on_quit() end function cheat:cheat_11() self:on_quit() end function cheat:cheat_12() self:on_quit() end function cheat:cheat_13() self:on_quit() end function cheat:cheat_14() self:on_quit() end function cheat:cheat_15() self:on_quit() end function cheat:cheat_16() self:on_quit() end Создаём config\text\rus\ui_cheat.xml. Пишем: <?xml version="1.0" encoding="windows-1251" standalone="yes"?> <string_table> <string id="ui_cheat_1"> <text>FN2000</text> </string> <string id="ui_cheat_2"> <text>Патроны к FN2000</text> </string> <string id="ui_cheat_3"> <text>Броня</text> </string> <string id="ui_cheat_4"> <text>Артефакты</text> </string> <string id="ui_cheat_5"> <text>Вызвать Долг</text> </string> <string id="ui_cheat_6"> <text>Вызвать Свободу</text> </string> <string id="ui_cheat_7"> <text>100000 денег</text> </string> <string id="ui_cheat_8"> <text>Достать оружие</text> </string> <string id="ui_cheat_9"> <text>Чит</text> </string> <string id="ui_cheat_10"> <text>Чит</text> </string> <string id="ui_cheat_11"> <text>Чит</text> </string> <string id="ui_cheat_12"> <text>Чит</text> </string> <string id="ui_cheat_13"> <text>Чит</text> </string> <string id="ui_cheat_14"> <text>Чит</text> </string> <string id="ui_cheat_15"> <text>Чит</text> </string> <string id="ui_cheat_16"> <text>Чит</text> </string> </string_table> Создаём config\ui\ui_cheat.xml. Пишем: <?xml version="1.0" encoding="windows-1251" ?> <cheat> <background x="-70" y="100" width="574" height="232" stretch="0"> <texture x="450" y="792" width="574" height="232">ui\ui_hud</texture> </background> <btn_1 x="-52" y="172" width="117" height="29"> <texture_e>ui_button_ordinary_e</texture_e> <texture_t>ui_button_ordinary_t</texture_t> <texture_h>ui_button_ordinary_h</texture_h> <text>ui_cheat_1</text> </btn_1> <btn_2 x="78" y="172" width="117" height="29"> <texture_e>ui_button_ordinary_e</texture_e> <texture_t>ui_button_ordinary_t</texture_t> <texture_h>ui_button_ordinary_h</texture_h> <text>ui_cheat_2</text> </btn_2> <btn_3 x="-52" y="204" width="117" height="29"> <texture_e>ui_button_ordinary_e</texture_e> <texture_t>ui_button_ordinary_t</texture_t> <texture_h>ui_button_ordinary_h</texture_h> <text>ui_cheat_3</text> </btn_3> <btn_4 x="78" y="204" width="117" height="29"> <texture_e>ui_button_ordinary_e</texture_e> <texture_t>ui_button_ordinary_t</texture_t> <texture_h>ui_button_ordinary_h</texture_h> <text>ui_cheat_4</text> </btn_4> <btn_5 x="-52" y="236" width="117" height="29"> <texture_e>ui_button_ordinary_e</texture_e> <texture_t>ui_button_ordinary_t</texture_t> <texture_h>ui_button_ordinary_h</texture_h> <text>ui_cheat_5</text> </btn_5> <btn_6 x="78" y="236" width="117" height="29"> <texture_e>ui_button_ordinary_e</texture_e> <texture_t>ui_button_ordinary_t</texture_t> <texture_h>ui_button_ordinary_h</texture_h> <text>ui_cheat_6</text> </btn_6> <btn_7 x="-52" y="268" width="117" height="29"> <texture_e>ui_button_ordinary_e</texture_e> <texture_t>ui_button_ordinary_t</texture_t> <texture_h>ui_button_ordinary_h</texture_h> <text>ui_cheat_7</text> </btn_7> <btn_8 x="78" y="268" width="117" height="29"> <texture_e>ui_button_ordinary_e</texture_e> <texture_t>ui_button_ordinary_t</texture_t> <texture_h>ui_button_ordinary_h</texture_h> <text>ui_cheat_8</text> </btn_8> <btn_9 x="215" y="172" width="117" height="29"> <texture_e>ui_button_ordinary_e</texture_e> <texture_t>ui_button_ordinary_t</texture_t> <texture_h>ui_button_ordinary_h</texture_h> <text>ui_cheat_9</text> </btn_9> <btn_10 x="345" y="172" width="117" height="29"> <texture_e>ui_button_ordinary_e</texture_e> <texture_t>ui_button_ordinary_t</texture_t> <texture_h>ui_button_ordinary_h</texture_h> <text>ui_cheat_10</text> </btn_10> <btn_11 x="215" y="204" width="117" height="29"> <texture_e>ui_button_ordinary_e</texture_e> <texture_t>ui_button_ordinary_t</texture_t> <texture_h>ui_button_ordinary_h</texture_h> <text>ui_cheat_11</text> </btn_11> <btn_12 x="345" y="204" width="117" height="29"> <texture_e>ui_button_ordinary_e</texture_e> <texture_t>ui_button_ordinary_t</texture_t> <texture_h>ui_button_ordinary_h</texture_h> <text>ui_cheat_12</text> </btn_12> <btn_13 x="215" y="236" width="117" height="29"> <texture_e>ui_button_ordinary_e</texture_e> <texture_t>ui_button_ordinary_t</texture_t> <texture_h>ui_button_ordinary_h</texture_h> <text>ui_cheat_13</text> </btn_13> <btn_14 x="345" y="236" width="117" height="29"> <texture_e>ui_button_ordinary_e</texture_e> <texture_t>ui_button_ordinary_t</texture_t> <texture_h>ui_button_ordinary_h</texture_h> <text>ui_cheat_14</text> </btn_14> <btn_15 x="215" y="268" width="117" height="29"> <texture_e>ui_button_ordinary_e</texture_e> <texture_t>ui_button_ordinary_t</texture_t> <texture_h>ui_button_ordinary_h</texture_h> <text>ui_cheat_15</text> </btn_15> <btn_16 x="345" y="268" width="117" height="29"> <texture_e>ui_button_ordinary_e</texture_e> <texture_t>ui_button_ordinary_t</texture_t> <texture_h>ui_button_ordinary_h</texture_h> <text>ui_cheat_16</text> </btn_16> <btn_quit x="368" y="114" width="117" height="29"> <texture_e>ui_button_ordinary_e</texture_e> <texture_t>ui_button_ordinary_t</texture_t> <texture_h>ui_button_ordinary_h</texture_h> <text>Выход</text> </btn_quit> </cheat> Создаём scripts\prototype.script. Пишем: function prototype_spawn(section,pos,lvid,gvid,number,tip,time) local i = "0" local temp = "1" local step = "1" if not number then number = "1" end for i = temp, number, step do alife():create(section,pos,lvid,gvid) end if (tip ~= nil and time ~= nil) then news_manager.send_tip(db.actor, tip, nil, nil, time) end end function spawn_actor(section,number,tip,time) local i = "0" local temp = "1" local step = "1" if not number then number = "1" end for i = temp, number, step do alife():create(section,db.actor():position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) end if (tip ~= nil and time ~= nil) then news_manager.send_tip(db.actor, tip, nil, nil, time) end end Всё. Заходим в игру, нажимаем HOME, пользуемся. В меню еще предусмотрено 8 кнопок, кому надо, сам поймёт как их настроить.Если чё-то не работает, обращайтесь.(Тестировалось на Исполнителе Желаний) Изменено 20 Сентября 2014 пользователем World_Stalker 1 Ссылка на комментарий
перегар 94 Опубликовано 26 Марта 2010 Поделиться Опубликовано 26 Марта 2010 (изменено) Если кому то надоели стандартные звуки в игре, то всё возможно исправить. Туториал от Мюллера и Монгола - как заменить звуки в игре (статья неполная, я когда то давно её урезал и чуть упростил, но смысл прежний), полный вариант можно найти в readme в Саунд Римейк моде.Сложность: легко (при установленном SDK) Подразумевается что Вы знаете какие какие ogg файлы собираетесь заменять, иначе Вам сначала надо изучить что где находится.Во первых требуется звуковой редактор, можно любой ( я использую TotalAudioConverter).Нужно перевести ваши mp3 файлы в WAV формат 44100Гц, Моно, 16 бит, желательно сохранить в отдельную папку,(для последующих экспериментов).Почему сразу нельзя сохранить звук в формате ogg 44100Гц, Моно, 16 бит, в принципеможно, вот только в комментах Ogg файла должны прописываться параметры распространения звука по игровому миру. Именно по этой причине собственные звуки в игре практически не слышно на определенных расстояниях.Теперь нам понадобится X-Ray SDK – официальный пакет разработчика для игры S.T.A.L.K.E.R.Открываем меню Пуск/программы/X-Ray SDK жмём Map X-Drave для создания диска X.Заходим на диск Х и в папку rawdata/sounds копируем наши файлы в формате Wav( советую сразу переименовать файлы на те которые хотите заменить, геммороя будет меньше, если что-то не получится)Потом запускаем Level Editor, справа вверху находим меню Звуки (или Sounds, у кого английская версия) жмём и выбираем Звуковой редакторТам увидим наши файлы, выбираем файл и изменяем следующие параметры:Quality - 0,00 изменяет битрейт файла,игра поддерживает до 80 Kбит/c (ставьте не больше 0,4)MinDist = 1.00 - расстояние, с которого звук начнет затухать (практически это и есть громкость звука)MaxDist = 300.0 - максимальное расстояние, на котором звук будет слышен ГГMaxAIDist = 300.0 - максимальное расстояние, на котором звук будут слышать NPCBaseVolume = 1.0 - громкостьДальше надо выбрать к какому типу отнести звук: приведу только нужныеGame Type:- undefined – неопределенный, на них NPC не реагируют- Weapon shooting – выстрел оружия- NPC dying - смерть NPC (Здесь значение MaxAIDist надо поставить поменьше,в игрестоит 40м, из-за этого нельзя втихую перебить тех-же бандитов не поднимая шума)- NPC injuring - ранение NPC- NPC talking - разговор NPC- Anomaly idle – звуки аномалий- World ambient - звуки окружающего мираТеперь жмём ОК и ждём пока закончится синхронизация. Если всё получилось правильноидём на диск Х в папку gamedata\sounds там забираем готовые ogg файлы и вставляем ихв игру.Удачного моддинга!ЗЫ. Советую удалять файлы из Х\gamedata\sounds после синхронизации, иначе (при повторной конвертации) словите вылет на то что файл уже существует. Папка sounds должна быть изначально чиста ( всё что в ней есть изначально после установки SDK можно смело удалить - это просто пример конвертации файла). Изменено 20 Сентября 2014 пользователем World_Stalker оформил Все мы могли бы быть разными, если не были бы так одинаковы.Нам что водка, что пулемёт - лишь бы с ног валило. Ссылка на комментарий
nuklia 0 Опубликовано 26 Апреля 2010 Поделиться Опубликовано 26 Апреля 2010 (изменено) Пропишем нужному нам смарт-террейну укрытие gamedata\configs\misc\simulation_objects_props.ltx [esc_sim_13]:default surge = 1 ; прописали возможность укрытия territory = 1 sim_avail = true Регистрируем наше укрытие в файле gamedata\configs\misc\surge_manager.ltx ;escape esc_surge_hide_sim_13 Зарегистрируем нашу локацию в скриптах gamedata\scripts\sim_board.script --'****************************************************** --'* Реестр смарт-террейнов. Игровое поле симуляции. --'****************************************************** --' В этом ltx хранятся дескрипторы сквадов. squad_ltx = system_ini() setting_ini = ini_file("misc\\simulation.ltx") local group_id_by_levels = {zaton = 1, pripyat = 2, jupiter = 3, labx8 = 4, jupiter_underground = 5, escape = 6} Также в этом скрипте gamedata\scripts\smart_terrain.script -- строка 1196 function surge_stats() local sim_obj_registry = simulation_objects.get_sim_obj_registry().objects local sim_squads = { ["zaton"] = {}, ["jupiter"] = {}, ["pripyat"] = {}, ["escape"] = {} } local sim_smarts = { ["zaton"] = {}, ["jupiter"] = {}, ["pripyat"] = {}, ["escape"] = {} } -- строка 1241 print_smarts_and_squads_by_level("zaton") print_smarts_and_squads_by_level("jupiter") print_smarts_and_squads_by_level("pripyat") print_smarts_and_squads_by_level("escape") И в этом скрипте gamedata\scripts\surge_manager.script -- строка 38 self.levels_respawn = {zaton = false, jupiter = false, pripyat = false, escape = false} -- строка 194 xr_sound.set_sound_play(db.actor:id(), "zat_a2_stalker_barmen_after_surge") elseif(level.name()=="jupiter") then xr_sound.set_sound_play(db.actor:id(), "jup_a6_stalker_medik_after_surge") elseif not has_alife_info("pri_b305_fifth_cam_end") then xr_sound.set_sound_play(db.actor:id(), "pri_a17_kovalsky_after_surge") elseif(level.name()=="escape") then xr_sound.set_sound_play(db.actor:id(), "zat_a2_stalker_barmen_after_surge") -- строка 249 if(level.name()=="zaton") then xr_sound.set_sound_play(db.actor:id(), "zat_a2_stalker_barmen_surge_phase_2") elseif(level.name()=="jupiter") then xr_sound.set_sound_play(db.actor:id(), "jup_a6_stalker_medik_phase_2") elseif not has_alife_info("pri_b305_fifth_cam_end") then xr_sound.set_sound_play(db.actor:id(), "pri_a17_kovalsky_surge_phase_2") elseif(level.name()=="escape") then xr_sound.set_sound_play(db.actor:id(), "zat_a2_stalker_barmen_surge_phase_2") -- строка 273 if(level.name()=="zaton") then xr_sound.set_sound_play(db.actor:id(), "zat_a2_stalker_barmen_surge_phase_1") elseif(level.name()=="jupiter") then xr_sound.set_sound_play(db.actor:id(), "jup_a6_stalker_medik_phase_1") elseif not has_alife_info("pri_b305_fifth_cam_end") then xr_sound.set_sound_play(db.actor:id(), "pri_a17_kovalsky_surge_phase_1") elseif(level.name()=="escape") then xr_sound.set_sound_play(db.actor:id(), "zat_a2_stalker_barmen_surge_phase_1") -- строка 329 self.levels_respawn = {zaton = true, jupiter = true, pripyat = true, escape = true} -- строка 352 self.levels_respawn = {zaton = true, jupiter = true, pripyat = true, escape = true} -- строка 638 packet:w_bool(self.levels_respawn.zaton) packet:w_bool(self.levels_respawn.jupiter) packet:w_bool(self.levels_respawn.pripyat) packet:w_bool(self.levels_respawn.escape) -- строка 665 self.levels_respawn.zaton = packet:r_bool() self.levels_respawn.jupiter = packet:r_bool() self.levels_respawn.pripyat = packet:r_bool() self.levels_respawn.escape = packet:r_bool() Переходим к all.spawn - создаем секцию укрытия в файле alife_escape.ltx [xxxx] ; номер секции ; cse_abstract properties section_name = space_restrictor name = esc_surge_hide_sim_13 position = -11.2279901504517,2.46390247344971,57.3380393981934 direction = 0,0,0 version = 0x7c script_version = 8 ; cse_alife_object properties game_vertex_id = 934 distance = 0 level_vertex_id = 3366 object_flags = 0xffffff3e ; cse_shape properties shapes = shape0 shape0:type = box shape0:axis_x = 3.27519989013672,0,0 shape0:axis_y = 0,5.44060039520264,0 shape0:axis_z = 0,0,7.41159915924072 shape0:offset = 0,0,0 ; cse_alife_space_restrictor properties restrictor_type = 0 Создаем точки пути по количеству мест в укрытии в файле way_escape.ltx [esc_sim_13_surge_1_look] points = p0 p0:name = name00 p0:position = -11.0934257507324,2.45600557327271,56.0012626647949 p0:game_vertex_id = 1051 p0:level_vertex_id = 286804 [esc_sim_13_surge_1_walk] points = p0 p0:name = name00 p0:position = -12.587254524231,2.45982217788696,54.6062545776367 p0:game_vertex_id = 1051 p0:level_vertex_id = 284937 [esc_sim_13_surge_2_look] points = p0 p0:name = name00 p0:position = -11.7026491165161,2.45731353759766,55.4043731689453 p0:game_vertex_id = 1051 p0:level_vertex_id = 285862 [esc_sim_13_surge_2_walk] points = p0 p0:name = name00 p0:position = -11.7085494995117,2.45401954650879,54.6906051635742 p0:game_vertex_id = 1051 p0:level_vertex_id = 285861 [esc_sim_13_surge_3_look] points = p0 p0:name = name00 p0:position = -11.700403213501,2.46191310882568,55.9261016845703 p0:game_vertex_id = 1051 p0:level_vertex_id = 285863 [esc_sim_13_surge_3_walk] points = p0 p0:name = name00 p0:position = -10.5211238861084,2.45401906967163,54.5706977844238 p0:game_vertex_id = 1051 p0:level_vertex_id = 287736 [esc_sim_13_surge_4_look] points = p0 p0:name = name00 p0:position = -12.1378507614136,2.46710777282715,55.9775772094727 p0:game_vertex_id = 1051 p0:level_vertex_id = 285863 [esc_sim_13_surge_4_walk] points = p0 p0:name = name00 p0:position = -12.5659475326538,2.4704270362854,55.9364585876465 p0:game_vertex_id = 1051 p0:level_vertex_id = 284939 [esc_sim_13_surge_5_look] points = p0 p0:name = name00 p0:position = -11.3268537521362,2.45915699005127,56.0716171264648 p0:game_vertex_id = 1051 p0:level_vertex_id = 286804 [esc_sim_13_surge_5_walk] points = p0 p0:name = name00 p0:position = -11.4233283996582,2.45504951477051,55.4901466369629 p0:game_vertex_id = 1051 p0:level_vertex_id = 286803 [esc_sim_13_surge_6_look] points = p0 p0:name = name00 p0:position = -11.951548576355,2.46743059158325,56.5034790039063 p0:game_vertex_id = 1051 p0:level_vertex_id = 285864 [esc_sim_13_surge_6_walk] points = p0 p0:name = name00 p0:position = -10.5399560928345,2.45401906967163,55.9832763671875 p0:game_vertex_id = 1051 p0:level_vertex_id = 287738 [esc_sim_13_surge_7_look] points = p0 p0:name = name00 p0:position = -11.060601234436,2.46146583557129,56.6575355529785 p0:game_vertex_id = 1051 p0:level_vertex_id = 286805 [esc_sim_13_surge_7_walk] points = p0 p0:name = name00 p0:position = -12.5727767944336,2.47284889221191,57.334114074707 p0:game_vertex_id = 1051 p0:level_vertex_id = 284941 [esc_sim_13_surge_8_look] points = p0 p0:name = name00 p0:position = -11.7709636688232,2.46654939651489,57.2202682495117 p0:game_vertex_id = 1051 p0:level_vertex_id = 285865 [esc_sim_13_surge_8_walk] points = p0 p0:name = name00 p0:position = -11.6660528182983,2.4660382270813,56.7951736450195 p0:game_vertex_id = 1051 p0:level_vertex_id = 285864 [esc_sim_13_surge_9_look] points = p0 p0:name = name00 p0:position = -11.4014568328857,2.4647479057312,57.3022918701172 p0:game_vertex_id = 1051 p0:level_vertex_id = 286806 [esc_sim_13_surge_9_walk] points = p0 p0:name = name00 p0:position = -10.5875377655029,2.46077871322632,57.3240737915039 p0:game_vertex_id = 1051 p0:level_vertex_id = 287740 [esc_sim_13_surge_10_look] points = p0 p0:name = name00 p0:position = -12.009449005127,2.47024631500244,58.7685432434082 p0:game_vertex_id = 1051 p0:level_vertex_id = 285867 [esc_sim_13_surge_10_walk] points = p0 p0:name = name00 p0:position = -12.5359506607056,2.47053003311157,58.6904754638672 p0:game_vertex_id = 1051 p0:level_vertex_id = 284943 [esc_sim_13_surge_11_look] points = p0 p0:name = name00 p0:position = -11.6696643829346,2.47010707855225,58.7928047180176 p0:game_vertex_id = 1051 p0:level_vertex_id = 285867 [esc_sim_13_surge_11_walk] points = p0 p0:name = name00 p0:position = -11.7617807388306,2.47143888473511,58.0255508422852 p0:game_vertex_id = 1051 p0:level_vertex_id = 285866 [esc_sim_13_surge_12_look] points = p0 p0:name = name00 p0:position = -11.1556959152222,2.46973323822021,58.9260101318359 p0:game_vertex_id = 1051 p0:level_vertex_id = 286808 [esc_sim_13_surge_12_walk] points = p0 p0:name = name00 p0:position = -10.5822420120239,2.46985769271851,58.7564964294434 p0:game_vertex_id = 1051 p0:level_vertex_id = 287742 На этом всё. Перенес сюда. Там потеряется.[Halford] Изменено 20 Сентября 2014 пользователем World_Stalker Ссылка на комментарий
PRYZRAK 0 Опубликовано 26 Апреля 2010 Поделиться Опубликовано 26 Апреля 2010 (изменено) Доброго вам времени суток. Мне поведали о том, как создать непися в зп и я решил, что вопрос создание нпса мучает не только меня и решил написать об этом. Нам нужны следующие файлы:- configs\creatures\spawn_sections_zaton.ltx- configs\gameplay\npc_profile.xml- сonfigs\gameplay\charecter_desc_zaton.xml- scripts\db.script И создадим сами файлы:- scripts\npc.script- configs\scripts\snaiper_lg.ltxДля начала создадим нашему неписю логику(( после мы её сможем часто пользоваться)Для этого заходим в configs\scripts\snaiper_lg.ltxИ там вбиваем следующие строки: [logic] active = remark1 danger = danger_ignore anim = desk_idle [danger_ignore] ignore_distance = 5 [remark1] invulnerable = true no_move = true meet = meet_guide [meet_guide] close_anim = nil close_victim = nil far_anim = nil far_victim = nil close_distance = 0 far_distance = 0 close_snd_distance = 3 abuse = false use = {=actor_enemy} false, true allow_break = false meet_on_talking = false meet_on_talking = false Теперь всё по порядку поясняю:[logic] – обозначает, что это функция логиactive = remark1 - функция его действийdanger = danger_ignore – можно ли рядом достать оружиеanim = desk_idle - анимка, но вроде не влияет[danger_ignore]ignore_distance = 5 – на сколько близко можно махать стволом[remark1]invulnerable = true - бессмертие. True-бессмертный, false- смертныйno_move = true (будет стоять на месте) или false что б ходил -- не работает.meet = meet_guide название схемы[meet_guide] - сама схемаclose_anim = nil - анимка при прощанииclose_victim = nil - вроде анимка при встречиfar_anim = nilfar_victim = nilclose_distance = 0far_distance = 0close_snd_distance = 3 - на каком расстоянии будет слышен звук приветствияabuse = false - вроде разрешение говоритьuse = {=actor_enemy} false, true - ?allow_break = false - можно ли закрыть диалог escmeet_on_talking = false – говорить можно(диалог)meet_on_talking = false - говорить можно(диалог)Теперь заходим в configs\creatures\spawn_sections_zaton.ltxПосле: [test_body_5]:stalker $spawn = "respawn\test_body_5" ;character_profile = zat_a2_stalker_mechanic community = stalker ;story_id = test_body_5 custom_data = scripts\test_cfg5.ltx прописываем это: [snaiper]:stalker $spawn = "respawn\snaiper" character_profile = snaiper spec_rank = master community = stalker custom_data = scripts\snaiper_lg.ltx story_id = stalker_snaiper где[snaiper]:stalker - секция нпс$spawn = "respawn\snaiper" - респавн для sdkcharacter_profile = snaiper - ссылка на профильspec_rank = master - рангcommunity = stalker - группировка( здесь роли не играетcustom_data = scripts\snaiper_lg.ltx - логика, которую мы создалиstory_id = stalker_snaiper - уникальный ID , не знаю но вроде что-то про квестыТеперь заходим в configs\gameplay\npc_profile.xmlИ в самый конец (перед </xml>) пишем: <character id="snaiper"> <class>snaiper</class> <specific_character>snaiper</specific_character> </character> Должно получиться примерно так: <character id="conrack_selo_stalker"> <class>jup_b6_freedom_stalker_1</class> </character> <character id="snaiper"> <class>snaiper</class> <specific_character>snaiper</specific_character> </character> </xml> Пояснения:<character id="snaiper"> - ID<class>snaiper</class> - класс , это типа метки<specific_character>snaiper</specific_character> - ID</character> - массив закрытТеперь создадим профиль для нашего непися. Заходим в configs\gameplay\charecter_desc_zaton.xmlИ в самый конец (перед <xml>) прописываем: <specific_character id="snaiper" team_default="1"> <name>Дрюня</name> <icon>ui_inGame2_merc_4</icon> <map_icon x="1" y="0"> </map_icon> <bio>Опытный сталкер. Детальная информация отсутствует.</bio> <class>snaiper</class> <community>stalker</community> <terrain_sect>stalker_terrain</terrain_sect> <snd_config>characters_voice\human_01\bandit\</snd_config> <rank>40</rank> <money min="1500" max="3500" infinitive="1"/> <reputation>0</reputation> <visual>actors\stalker_soldier\stalker_soldier_1</visual> <supplies> [spawn] \n wpn_svd \n ammo_9x39_ap = 1 \n wpn_beretta \n ammo_9x19_fmj = 1 \n grenade_rgd5 = 2 \n #include "gameplay\character_items.xml" #include "gameplay\character_food.xml" #include "gameplay\character_drugs.xml" </supplies> #include "gameplay\character_criticals_4.xml" <start_dialog>zat_b215_stalker_guide_start</start_dialog> <actor_dialog>zat_b215_stalker_guide_leave_zone</actor_dialog> <actor_dialog>zat_b215_stalker_guide_maps</actor_dialog> <actor_dialog>zat_b215_stalker_guide_to_pripyat_no_way</actor_dialog> <actor_dialog>zat_b215_stalker_guide_to_pripyat</actor_dialog> <actor_dialog>zat_b215_stalker_guide_to_jupiter</actor_dialog> <actor_dialog>zat_b215_stalker_guide_to_zaton</actor_dialog> <actor_dialog>zat_b215_stalker_guide_where_to</actor_dialog> <actor_dialog>zat_b215_stalker_guide_about_himself</actor_dialog> <actor_dialog>zat_b215_stalker_guide_about_anomalies</actor_dialog> <actor_dialog>zat_b215_stalker_guide_about_surge</actor_dialog> <actor_dialog>actor_break_dialog</actor_dialog> </specific_character> Где:<specific_character id="snaiper" team_default="1"> - ID<name>Дрюня</name> -имя<icon>ui_inGame2_merc_4</icon> - иконка<map_icon x="1" y="0"> - иконка на карте</map_icon> - закрывающий тэг<bio>Опытный сталкер. Детальная информация отсутствует.</bio> в игре не используется<class>snaiper</class> - класс<community>stalker</community> - группировка<terrain_sect>stalker_terrain</terrain_sect> - ?<snd_config>characters_voice\human_01\bandit\</snd_config> - голос<rank>40</rank> - ранг( не используется в игре)<money min="1500" max="3500" infinitive="1"/> - количество денег. infinitive="1"- бесконечные, infinitive="0" - заканчивающиеся<reputation>0</reputation> - репутация<visual>actors\stalker_soldier\stalker_soldier_1</visual> - модель непися<supplies>[spawn] \n - вещи в рюкзакеwpn_svd \nammo_9x39_ap = 1 \nwpn_beretta \nammo_9x19_fmj = 1 \ngrenade_rgd5 = 2 \n#include "gameplay\character_items.xml" - случайный спавн вещей в рюкзаке#include "gameplay\character_food.xml"#include "gameplay\character_drugs.xml"</supplies>#include "gameplay\character_criticals_4.xml"<start_dialog>zat_b215_stalker_guide_start</start_dialog>- диалоги. В нашем случае диалоги лоцмана<actor_dialog>zat_b215_stalker_guide_leave_zone</actor_dialog> - диалог актора.....<actor_dialog>actor_break_dialog</actor_dialog> - диалог выхода</specific_character> - закрывающий тэгТеперь создаём скрипт спавна scripts\npc.scriptВбиваем в него: function snaiper() if not db.actor:has_info("spawn_snaiper") then alife():create("snaiper",vector():set(116.238,2.250,183.199),1165999,316) db.actor:give_info_portion("spawn_snaiper") end end Строчка alife():create("snaiper",vector():set(116.238,2.250,183.199),1165999,316) отвечает за координаты, на которых спавнится объект. В нашем случае - непись. Подробнее о них:Pos - 116.238,2.250,183.199Ivid - 1165999Gvid - 316Чтобы их получить качаем позишн информер Отсюда И последнее - регистрация скрипта в scripts\db.scriptОткрываем db.script. Находим строки: function add_actor(obj) actor = obj actor_proxy:net_spawn(obj) add_obj(obj) end И меняем на такие: function add_actor(obj) actor = obj actor_proxy:net_spawn(obj) add_obj(obj) npc.snaiper() end Заходим в игру и всё - глядим на непися Изменено 21 Сентября 2014 пользователем PRYZRAK оформил и исправил ошибки Ссылка на комментарий
alexwew 0 Опубликовано 13 Мая 2010 Поделиться Опубликовано 13 Мая 2010 (изменено) Итак, приступим! Мы подключили локацию к ЗП, расположили карту в пда, начали обустройство. И тут возникает вопрос - как добавить отметки в пда(в ЗП например Аномалия Битум, Коготь и т.д.)? Вот об этом я и расскажу. Например: я сделал аномалию Свалка на подключенной Припяти(на стадионе) В файле alife_l11_pripyat.ltx пишем: [137] ; cse_abstract properties section_name = space_restrictor name = zero_b1_spot ----любое уникальное имя position = 5.76249980926514,2.64950323104858,341.929992675781 ---центр окружности, при наведении на которую появиться надпись direction = 0,0,0 ; cse_alife_object properties game_vertex_id = 934 -------гейм вертекс уровня distance = 0 level_vertex_id = 214948 -----левел вертекс уровня object_flags = 0xffffff3e custom_data = <<END [story_object] story_id = zero_b1_spot END ; cse_shape properties shapes = shape0 shape0:type = sphere shape0:offset = 0,0,0 shape0:radius = 1 ; cse_alife_space_restrictor properties restrictor_type = 3 Далее собираем all.spawn ( Его еще на место надо положить будет) и идем в папку скрипт, а именно открываем файл pda.script Находим строку: {target="jup_a9_spot", hint="st_jup_a9_name"}, И после неё вставляем: {target="zero_b1_spot", hint="st_zero_b1_name"}, Закрываем и сохраняем изменения. Далее в папку text/rus/любой файл и там добавляем перед </string_table> вот это: <string id="st_zero_b1_name"> <text>Пишем то что хотим видеть при наведении</text> </string> Изменено 20 Сентября 2014 пользователем World_Stalker оформил я изменился. пью, курю, употребляя наркотические средства. Жизнь-говно. Бабы -консервы. Забьюсь под стол, чтоб никто не трогал. Ссылка на комментарий
iDreD 5 Опубликовано 7 Июня 2010 Поделиться Опубликовано 7 Июня 2010 (изменено) Таблицы. Что это такое и с чем его едят. Изменено 17 Июля 2016 пользователем HellRatz 1 Работа в Sculptris 3D [туториал] Страничка на Проза.ру Ссылка на комментарий
Это популярное сообщение. RayTwitty 492 Опубликовано 18 Июня 2010 Это популярное сообщение. Поделиться Опубликовано 18 Июня 2010 (изменено) Эта мини-статейка пригодятся тем, кто например прописывает оружие в торговлю, а оно появляется в руках у торговца. Соответственно оружие нельзя купить. Тоже самое с другими предметами: детекторами и т.д. Автор: ShadowsСложность: ЛегкоИтак: Проследуем в файл: gamedata\config\creatures\m_stalker.ltx В этом файле найдем секцию: [stalker_trader]:stalker Ниже находим строчки: use_single_item_rule = off can_select_items = on и меняем на use_single_item_rule = off can_select_items = off Если же can_select_items = off прописать в самой секции сталкеров, тогда все НПС отказываются менять оружие и предметы на лучшее. Автор: Shadows Все мы знаем, что Сталкер ТЧ понимает только одноканальные звуки. И кто например вытягивает звуки из ЗП\ЧН сталкиваются с тем, что там они двухканальные, т.е. стерео. И при переносе игра ругается на стереозвуки. И вот я полазив по интернету нашел программу, которая переводит звуки из стерео в моно. На самом деле там огромное количество функций. Самое замечательное, что эта программа читает OGG формат - формат звуковых файлов в сталкере. Ничего предварительно конвертировать не надо. Программа называется Adobe Audition 3.0. К делу. 1. Скачиваем программу. 2. Запускаем прогу. Нажимаем "Мультитрек". На самой верней "полоске" нажимаем ПКМ "Вставить\Аудио". В открывшемся окне, внизу выбираем OGG и выбираем свой файл. 3. Он появляется в нашей "полоске". Нажимаем на нем ПКМ внизу выбираем "Микшировать в новый файл\Главный выход в сессии (Моно)". Ждем. 4. После окончания "Микширования" жмем "Файл\Сохранить как". Выбираем внизу OGG формат и сохраняем. Все! Очень много кто интересовался как же это сделать, однажды заинтересовался и я. И нашел как. Автор: ShadowsСложность: Легко Итак: Проследуем в файл: gamedata\config\ui\map_spots_relations.xml В этом файле найдем строчку: <enemy_mini_spot width="4" height="4" stretch="1" alignment="c" xform_anim="map_spot_rel_xform" xform_anim_cyclic="0"> И заменим на: <enemy_mini_spot width="0" height="0" stretch="1" alignment="c" xform_anim="map_spot_rel_xform" xform_anim_cyclic="0"> Здесь мы сузили точку врагов по ширине и длине до нуля, использую параметры width= и height=. Авторы: Shadows и XMK Сложность: Средне Как сфотографировать карту локации Эта часть тутора посвящена тем кто хочет сделать текстуры карт новых локаций Итак: 0. Скачиваем программу Adobe Photoshop (Тестировалось на версии CS4) 1. Переводим в настройках, игру на Статическое освещение (DirectX 8) и перезапускаем игру 2. Загружаем сейв на локации 3. В консоле вводим команду: sv_setweather map 4. В консоле вводим команду: demo_record 1 5. После появления мигающих надписей жмем клавишу F11 6. В папке со скриншотами появляется новый файл с разрешением TGA (Файл Фотошопа). Так же в названии файла появляются цифры - это координаты параметра bound_rect (Положения игрока на карте локации) 7. Переводим этот файл из разрешения TGA в DDS Как прикрепить карту локации на глобальную карту в ПДА Часть 1. Теория Попробуем вначале разобраться, что такое глобальная карта и как она работает. Откуда на ней все карты локаций, и каким образом открывая ПДА в разделе карты мы видим метки Кордона на участке обозначающем Кордон, а метки например, Складов – там где они и должны быть. Итак… Папка gamedata\config, файл game_maps_single.ltx. Откроем его. Поясню, что там внутри за что отвечает. [level_maps_single] L01_escape L02_garbage L03_agroprom L03u_agr_underground l04_darkvalley l04u_LabX18 L05_bar L06_rostok l07_military l08_yantar l10_radar l11_pripyat l12_stancia l12_stancia_2 l12u_control_monolith l12u_sarcofag l08u_brainlab Эта секция перечисляет все уровни, что есть в игре. Как видно – от Кордона до ЧАЭС-2, включая все подземные уровни. Это список из ТЧ, оригинальная игра. [level_music_tracks] music\amb01 = 0, 12, 0.5, 10,20 music\amb03 = 0, 12, 0.5, 10,15 music\amb07 = 12,24, 1.0, 5, 25 Понятия не имею что это, но наверно что-то про музыку… Нам не понадобится. [global_map] texture = ui\ui_global_map bound_rect = 0.0,0.0, 1024, 2634.0 max_zoom = 6.0 А вот это самое главное. Здесь определена текстура – она лежит по адресу gamedata\textures\ui, называется ui_global_map – обратите внимание, текстура без расширения указана. bound_rect – это игровые координаты текстуры, нечто вроде сетки координат на глобальной карте. Четыре числа означают крайние точки координат – верхний левый угол глобальной карты имеет координаты 0,0 а нижний правый угол глобальной карты имеет координаты 1024,2634. ОБРАТИТЕ ВНИМАНИЕ, это не пиксели! Сама текстура имеет размер 1024*2048, а может быть и любого другого – но для игры высота карты берётся равной 2634 пункта, при том что ширина сохраняется 1024. Это очень важное замечание – его важность поясним дальше. Max_zoom – тут я думаю ясно, это максимально разрешённое увеличение. То есть самое большее насколько можно «приблизить» изображение в ПДА открыв глобальную карту это в 6 раз. Попробуйте поставить другие значения – иногда получается интересно. Дальше файл заполнен однотипными секциями, описывающими уровни и расположение их карт на глобальной карте. Возьмём несколько для разбора, скажем, Кордон, Агропром, ну и пожалуй, Припять. [l01_escape] texture = map\map_escape bound_rect = -317.164, -633.718, 404.880, 811.627 global_rect = 355.0,2011.0, 576.0,2453.000000 weathers = default music_tracks = l01_escape_musics [l03_agroprom] texture = map\map_agroprom bound_rect = -266.505, -355.611, 331.388, 213.838 global_rect = 161.0, 1834.0, 344.0,2008.293945 weathers = default ;music_tracks = l03_agroprom_musics music_tracks = l01_escape_musics [l11_pripyat] texture = map\map_pripyat bound_rect = -529.399, -457.516, 574.854, 769.050 global_rect = 457.0, 586.0, 798.0, 964.770996 weathers = pripyat music_tracks = l11_pripyat_musics Теперь подробно о каждом параметре. Texture – это текстура карты локации. Именно она показывается на мини-карте в игре, именно она же НАКЛАДЫВАЕТСЯ (да-да, сама накладывается) на глобальную карту в том месте, где мы захотим. bound_rect – это описание крайних координат локации ВНУТРИ самой локации. Тут наверно нужно пояснить. Любой кто имел дело с координатами на уровнях, замечал что икс и игрек (высоту сейчас не будем принимать в расчет) бывают не только положительными, но и отрицательными. Точка на уровне имеющая координаты (0,0) это не угол карты, как можно было бы предположить, а где-то около её середины. Например, на Кордоне точка с координатами 0,0 расположена недалеко от поста Кузнецова под мостом. А вот возле бункера Сидоровича координата икс у игрока (или чего угодно другого, любого объекта в игре) будет отрицательная. А возле блокпоста военных (тот, что на юге, вниз по дороге от деревни новичков) координата игрек будет отрицательной. Так вот, в строке bound_rect последовательно указаны самые минимальные координаты локации и самые максимальные. То есть самый меньший икс, потом самый меньший игрек, потом самый большой икс, и четвёртое число – самый большой игрек. Обратите внимание, эти координаты – вовсе не там, где можно побегать. Нет. Речь идёт об УГЛАХ локации, там где заканчивается земля и начинается пустота. На кордоне юго-западный угол имеет координаты -317.164, -633.718, а северо-восточный 404.880, 811.627. Точность указана до сотых. Вот составил пояснения чисел, для редактирования bound_rect: Например: bound_rect = -256.776, -745.382, 1398.440, 850.482 (ххх.х - число) ххх.х - коорд. в ПДА по х, ххх.х - коорд. минимапы по у, ххх.х - коорд. минимапы по х, ххх.х - коорд. в ПДА по у. Увеличиваем значение - метки на карте ползут вниз, уменьшаем - вверх. global_rect – вот это именно то, что нам надо. Это – координаты прямоугольника на глобальной карте, тот кусочек куда будет вписана (наложена) карта локации, и где будут с учётом масштаба отображаться все метки локации. Метод указания координат аналогичен, берутся два угла, первый северо-ЗАПАДНЫЙ, второй юго-ВОСТОЧНЫЙ. Обратите внимание, при определении координат на локации отсчёт игрека идёт снизу вверх, а тут наоборот, сверху вниз. То есть точка с координатами 50, 100 будет ВЫШЕ чем точка 50, 200. А точка с координатами 50, 0 – вообще на самом верху. В то время как точка с координатами 50, 2634 – на самом низу глобальной карты. Вообще правило отсчёта координат от верхнего левого угла текстуры характерно для СТАЛКЕРа, не знаю как для других игр использующих dds формат, может так же. Посмотрим на глобальные координаты карты Кордона на большой, глобальной карте. global_rect=355.0,2011.0,576.0,2453.000000 Получается, прямоугольник куда будет вписана карта Кордона определён двумя точками. Первая с координатами (на глобальной карте!) 355.0,2011.0, а вторая с координатами 576.0,2453.000000. Зачем столько нулей – не спрашивайте. Не знаю. Но по этим координатам видно, что карта Кордона будет вписана в прямоугольник, который начинается от 355 по икс и 2011 по игрек и заканчивается на 576 по икс и 2453 по игрек. Итого на глобальной карте размер карты Кордона составит 221*442 пункта. Повторюсь – это не пиксели, а пункты, количество которых определено во второй секции конфигурационного файла, который мы сейчас разбираем. Интересно, что подземелья Агропрома, например, на глобальной карте тоже есть – но для них отведено всего лишь 2*3 пункта, и находятся они почти посередине карты Агропрома! Именно поэтому когда игрок находится в подземке, его метка всегда светится в районе завода, где прятался Крот при первом заходе на локацию, и практически неподвижна. Похожим образом сделано и с лабораторией Х18 – она на глобальной карте расположена справа от Радара, но размер её прямоугольника всего 2*2 пункта. Часть 2 Практика Итак, у нас имеется локация, у которой имеется карты – textures\map\map_lost_villiage.dds например.bound_rect уже известен, если нет перечитайте предыдущую часть. Открываем файл ui_global_map.dds через программу Stalker Icon Viewer и снимаем координаты верхнего левого угла будущего места расположения локации. Снимаем как? Просто наводим курсор на понравившееся место, и смотрим внизу координаты (Pixel:) Х и У Итак допустим у нас получились координаты: x=180, y=370 Из предыдущей статьи вы возможно узнали что в конфиге глобальная карта имеет координаты 1024,2634, в то время когда текстура всего 1024x2048. Что мы делаем? Запускаем калькулятор и делим 2634 на 2048, у нас получается 1.2861328125 Далее умножаем координату y(370) на получившееся значение (1.2861328125), у нас получаться 475.86... (округлим) Далее все просто, скажем наша карта локации 100на100, задаем в global_rect нашей локации 180.0, 475.86, 280.0, 575.86 180.0 - координата x левого края текстуры локации475.86 – число, которое мы получили, координата верхнего края текстуры локации280.0 – координата x правого края текстуры локации. Прибавляем к координате левого края локации ширину карты575.86 - координата y нижнего края текстуры локации. Прибавляем к координате верхнего края локации высоту карты Вот собственно и всё. Внимание! Для работы метода необходимы функции АМК мода!Автор: Shadows & CoСложность: Легко ID будем задавать прямо в функции спавна. Пишем в своем скрипте: function npc_spawn() -- имя функции local obj = alife():create("профильное_имя_нпс",vector():set(x,y,z),level_vertex,game_vertex) -- координаты local tbl = amk.read_stalker_params(obj) tbl.sid = 97120 -- ID - любое число, но оно не должно повторятся с уже существующими (см. файл: game_story_ids в конфигах) amk.write_stalker_params(tbl, obj) end Благодаря этому способу, можно например поставить метку на заспавненного скриптом НПС... Внимание: после спавна НПС нужно сделать сейв\лоад, чтобы ID заработал. Изменено 15 Декабря 2017 пользователем Murarius 1 7 Ссылка на комментарий
_Призрак_ 11 Опубликовано 25 Июня 2010 Поделиться Опубликовано 25 Июня 2010 (изменено) local idMyNPC = nil --/ тут будем хранить ID заспавненного непися! function spawnych() local soObj = alife():create("esc_kvest_killer1",vector():set(-232,-19,-115),22645,8) if soObj then --/ перепроверка для безопасности idMyNPC = soObj.id --/ запоминаем!!! end end function Delete_ak74u_from_Actor() local oItem = db.actor:object("предмет") --/ определяем предмет у ГГ if oItem then --/ у ГГ есть предмет db.actor:drop_item(oItem) --/ выбрасываем предмет (опционально) alife():release(alife():object(oItem:id()), true) --/ удаляем из игры end end function Release_3_Kalash() local cnt = db.actor:object_count() local ch=0 for i=0, cnt-1 do local item = db.actor:object(i) if item:section() == "предмет" then --/ секция предмета local sobj = alife():object(item:id()) if sobj then alife():release(sobj,true) ch = ch+1 if ch ==кол-во_предметов then break end end end end end Изменено 15 Декабря 2017 пользователем Murarius Freedom Ссылка на комментарий
devils 0 Опубликовано 1 Августа 2010 Поделиться Опубликовано 1 Августа 2010 (изменено) Создание новой сетки прицела (Например вдруг создали оружие с прицелом а старые сетки не охота использовать) Для начала открываем gamedata\configs\ui\scopes.xmlИ пишем структуру прицела: <название прицела x="0" y="0" width="1024" height="768"> <auto_static x="0" y="0" width="1024" height="768" stretch="1"> <texture>название прицела</texture> </auto_static> </название прицела> После того как написали сохраняем файл. Теперь надо нарисовать саму текстуру прицела!После того как нарисовали называем её название прицела.ddsИ сохраняем в gamedata\texturesТеперь добавляем прицел оружию.Открываем конфиг оружия и находим строчку scope_textureПосле того как нашли вставляем туда ваше название прицела.Вот и всё! Изменено 20 Сентября 2014 пользователем World_Stalker оформил Ссылка на комментарий
Это популярное сообщение. Vano_Santuri 33 Опубликовано 11 Августа 2010 Это популярное сообщение. Поделиться Опубликовано 11 Августа 2010 (изменено) Я не профессионал, я не программист, я не изучал официальную справку по Lua, я не считаю себя гением и еще кем-либо.В данном топе вы найдете готовые, самые используемые скриптовые функции, начальные сведения по скриптованию, научитесь писать примитивные скрипты(хотя их такими не назовешь), но я не смогу передать вам мой образ мышления и способность находить ответы на многие вопросы самому методом общего анализа...(Данный материал я считаю своей интеллектуальной собственностью, если вы хотите опубликовать его еще где-то, то обязательно указывайте автора(да и пора бы уже научиться всегда указывать авторов,даже без требования) и не так: "ой забыл", "где-то видел", "какой-то чувак", а ник. Если вам понравился материал, можете и ссылку на данный форум скинуть(замаскировав под гиперссылку с текстом), я буду только благодарен.) Урок первый. Что такое скрипт?1. Все файлы скрипты находятся в папке gamedata\scripts.2. Файл скрипта - это текстовый файл имеющий расширение .script.3. В С.Т.А.Л.К.Е.Р используется немного изменённый скриптовый язык Lua 5.1.4. Для редактирования скриптов я советую NotePad c++, данная программа имеет подсветку синтаксиса для многих языков, в том числе и для Lua. Чтобы активировать подсветку нажмите клините Стиль - Lua .5. Чтобы закомментировать строку (код игры не будет ёё читать), необходимо перед строкой поставить -- .Если вы хотите закомментировать кусок (много строк) то --[[ .... ]] , ваш текст будет закоментирован.Начнём уроки.1) Создадим свой my.scripts и поместим его в папку scripts. Откроем с помощью Нотепада и настроим подсветку.2) Внутри файла-скрипта должны содержаться только КОД скрипта и ваши Закомментированные пометки. Если будет лишний текст, т.е какие-то знаки и слова, то будет вылет на этот скрипт. Так как код игры полностью собирает весь скрипт в стек и выбирает только то, что вы задали, но если будет мусор, то игра не воспримет код.3) Архитектур. Для создания функций нужны лишь знания синтаксиса и игровые методы и глобальные функции(которые записаны в движке) можете почитать lua_help.script , но я советую посетить тему на АМК . Там собраны все методы, классы и полное их описание.4) Функция. Это то, что будет делать игра.Любая функция начинается со слов function my_function() ... end И заканчивается тегом end. Этот тег означает конец функции, сравнения, он закрывающий и обязателен. Я советую при составлении функций, чтобы не забыть чего-нибудь, писать скелет извне, т.е сначала функция, потом закрывающий тег, и по нарастающей во внутрь.() - Обязательный элемент. Позже расскажу как передавать переменные через этот тег. Между окончание функции и этим тегом ПРОБЕЛА НЕТ.Обращаю внимание, что все функции вызываются из других скриптов. Допустим нам из одного скрипта, нужно вызвать(запустить функцию в другом) для этого мы пишемназвание скрипта. название функции в скрипте(параметр если есть) my.my_function() Объявляем переменные и глобальные.Чтобы объявить какой-либо элемент для функции локальным используется тег local local helth = db.actor.helth Т.е мы расшифровали helth, и показали , что это значение db.actor.helth.Если вы хотите вставить слово или свой текст нужно заключить слово в кавычки: local helth = "Уровень здоровья" Если вы хотите вставить слово с кавычками или свой текст нужно сделать так: local helth = "\"Уровень здоровья"\" Чтобы объявить глобальную нужно всего лишь сделать так helth = db.actor.helth Глобальные можно объявлять вначале скрипта и она будет сохранятся в коде, в памяти процесса (если я правильно понял)Переменная объявляется только перед функцией и логическими выражениями, где используется переменная и её использует только та функция, перед которой она объявляется (На пальцах перед строкой с вашей функцией). Т.е елси функция простая без логических решений(if, elseif, for и.т.д) То ставим перед функцией, если же есть переменная, которая находится в теле такого логического решения, то она ставится строго перед этим логическим решением! local helth = db.actor.helth function my_function() ... end Чтобы сосчитать значение переменной из другого скрипта достаточно в другом скрипте сделать так: text="Я иду гулять по бродвею" Теперь в нашем скрипте вызываем этот параметр local pisanina = название скрипта.text () - При таком обращении этот тег Не ставиться! Смысловые значения функций. if..... then .... end Перевожу:Если что-то токонец тега.Пример: if db.actor.psy==0.5 then db.actor:kill(db.actor) end Если пси-здоровье ГГ - половина, то мы его убиваем. Полная функция: function my_function() if db.actor.psy==0.5 then db.actor:kill(db.actor) end end Переделал с переменными(Для чего нужны объявления?): local acter = db.actor function my_function() local psy_zdorovie = acter.psy if psy_zdorovie==0.5 then acter:kill(acter) end end Что я сделал?Обозначил кусок db.actor локальной acter.А acter.psy (db.actor)+.psy равносильно db.actor.psy Вы поняли? Я поразбивал куски на локальные и код получился короче, функция имеет куда меньше знаков и удобнее к пониманию. Внимание!!!! Переменные должны объявляться так, чтобы самое то, к чему обращаются было известно. Допустим... local psy_zdorovie = acter.psy Нам нужна эта acter переменная, и мы ДОЛЖНЫ ОБЪЯВИТЬ её перед переменной local psy_zdorovie = acter.psy Мы ее и объявили local acter = db.actorДумаю смысл понятен? Комбинации логических выражений. if...... then 1 действие. else 2 действие. end Перевод: Если подходит условие то1 действиеиначе(т.е условие не выполняется)2 действиеконец тега Пример: function my_function() if db.actor.psy==0.5 then db.actor:kill(db.actor) else db.actor.give_info_portion("info") end end Если пси-здоровье актора равно половине, то мы его убиваем, если же значение другое(любое), то даем ему инфопоршень. Проверка нескольких условий. Допустим нам нужно проверить несколько условий:Чтобы они все выполнялись! if (db.actor) and (db.actor.helth == 1) and (db.actor.psy == 0.5) then действие end Функция сработает если есть актор и здоровье актора полное и псиздоровье половина .Тег and - означает И. Если один из элементов не выполняется, то функция не срабатывает. Кстати - это ленивый метод, как писал Kamikaze, если не выполняется первый элемент, то другие - уже не просчитываются. Т.е. не загружается процесс....Если подходит хоть один элемент. if (db.actor) or(db.actor.helth == 1) or(db.actor.psy == 0.5) then действие end Тег or обозначает ИЛИ. Или один, или другой. Функция сработает при условии соответствия хоть одного элемента. Так же ленивый метод. Проверяет до получения утвердительного решения, потом проверка не идет. Цепочка elseifДанный метод заменяет перебор через таблицу. Отличается простотой и потерей производительности. if...... then самое основное действие elseif...... then действие 1 elseif...... then действие 2 elseif...... then действие 3 elseif...... then действие 4 elseif...... then действие 5 end Здесь представлен перебор elseif иначе если, т.е не подходит первый вариант, мы проверяем второй и так по цепочке , до первого подходящего(где выполняется заданное условие), если же ни одно не подойдет, то ничего не произойдет. Если бы мы просто в функции написали кучу: function perebor() if ..... then действие end if ..... then действие end if ..... then действие end if ..... then действие end if ..... then действие end if ..... then действие end end То ничего хорошего не вышло бы. Так как проверялись бы все функции. А в первом варианте до первого попавшегося... Переменная nilПеременная nil указывает, что объекта , условия, да чего угодно НЕТ, его не существует.ВСЕГДА проверяйте некоторые объекты на nilВо первых это актор .Можно написать: if (db.actor ~= nil) then .... end Но правильнее и эстетичнее, сразу писать так. if (db.actor) then .... end Проверкой советую проверять многие элементы, так как в игре они зачастую не существуют в определенные моменты...При обращении к функция из сторонних скриптов(других скрипт-файлов) я советую проверять на наличие этих скриптов: if имя скрипта then ...... end if my then ...... end И делайте всегда, потому как, просто удалите этот скрипт из каталога и не надо будет мучаться с переписыванием других скриптов. Рандом.Числовой. math.random(1,100) Данная функция рандомно выберет число от 1 до 100.Сначала ставится наименьшее, потом наибольшее.Если ставить десятичные , допустим (0.0005, 1), то перебуеруться ВСЕ значения, т.е числа с несколькими знаками, ТАК ДЕЛАТЬ НЕ НУЖНО. вы перегрузите некоторые элементы кода. Использование: if math.random(0,1) < 1 then действие end Если выбранное число меньше 1, то срабатывает функция.Или так. if math.random(0,1) < 1 then действие else ...... end Добавляется другое действие.Советую брать целые числа от 1 до 10 для создания процентного срабатывания, но лучше 0 и 1.Текстовый.Допустим вы отправляете сообщение и хотите выбрать рандомный текст.1) Создается таблица с вашими переменными (Это может быть и секция для спавна, и слово, и любая другая переменная) local my frazi = {"ага","да","нет!","конечно","несомненно"} Так создается примитивная таблица, каждый элмент записывается в кавычках и отделяется отдельно.Далее, обозначаем за переменную которая нам нужна. Допустим в функции вам нужна пременная text.Мы и пишем: local text = my frazi[#(my frazi)] И пр и срабатывании функции, обращении к переменной text, выбирается рандомная переменная из таблицыmy frazi.Перебор, повтор действия. for i=1, 5000 do действие end Это цикл, который прокрутнет ваше действие 5000 раз. Переменная iлюбая буква, число 5000 обозначает количество циклов(сколько раз пройдет ваше действие). Передача параметра.Допустим мы сделали такую функцию: -- удаляем объект из игры(Взято из АМК ) function remove(remove_item) if remove_item~=nil then alife():release(alife():object(remove_item:id()), true) return true end return false end remove_item - это наш параметр, в данном случае это секция объекта, которую нужно удалить.(немного по секция , если это уникальный объект, то это то,ч то в его конфиге, если нет, то нужно искать другим методом)Нам нужно удалить уникального НПС vasekЕсли функция находится в скрипте, где мы хотим удалить объект, то пишем remove(vasek) Если в другом скрипте, то: имя скрипта.remove(vasek) Вот такой пример передачи параметра, передавать можно что угодно и как угодно. Было бы воображение.Возвращение значений.Допустим, идет проверка и если она оканчивается удачно, то функция должна вернуть одну переменную, если нет, то другую. function my() if proverka() == truethen ..... end end function proverka() if db.actor then return true else return false end Т.е мы хотим проверить наличие актора(можно что угодно). Создаем функцию proverka, она работает так, если актор есть - возвращает( return ) одну переменную, в данном случае true (Может быть любая другая) , если проверка не проходит, то возвращается false, а нашей первой my() стоит условие на то, что проверка вернет true if proverka() == true then Вот так, если вернет, то сработает первая функция. Как их вызывать? Функции.Функции вызываются из других скриптов, нужно лишь найти место. Если она вызывается постоянно. То нужно пихать в коллбэк на апдейт в bind_stalker.script [color=#404000]function actor_binder:update(delta) object_binder.update(self, delta) if string.find(command_line(), "-designer") then return end if self.already_jumped==false and jump_level.need_jump==true and (device().frame > self.spawn_frame+2000) then jump_level.try_to_jump() self.already_jumped = true return end -- Вызов апдейта переноса игрока проводником if travel_func ~= nil then travel_func() end -- DEBUG slowdown --slowdown.update() local time = time_global() game_stats.update (delta, self.object) -- апдейт погоды self.weather_manager:update() self:check_detective_achievement() self:check_mutant_hunter_achievement() --' Апдейт саундменеджера xr_sound.update(self.object:id()) -- Обновление отключения ввода с клавиатуры. if self.st.disable_input_time ~= nil and game.get_game_time():diffSec(self.st.disable_input_time) >= self.st.disable_input_idle then level.enable_input() self.st.disable_input_time = nil end -- Апдейт прятание оружия игрока во время диалога if self.object:is_talking() then if self.weapon_hide_in_dialog == false then self.object:hide_weapon() printf("hiding weapon!!!") self.weapon_hide_in_dialog = true end else if self.weapon_hide_in_dialog == true then printf("restoring weapon!!!") self.object:restore_weapon() self.weapon_hide_in_dialog = false end end -- Апдейт прятание оружия игрока в зоне sr_no_weapon if check_for_weapon_hide_by_zones() == true then if self.weapon_hide == false then printf("hiding weapon!!!") self.object:hide_weapon() self.weapon_hide = true end else if self.weapon_hide == true then printf("restoring weapon!!!") self.object:restore_weapon() self.weapon_hide = false end end -- обновление пси-антенны if sr_psy_antenna.psy_antenna then sr_psy_antenna.psy_antenna:update(delta) end --[[ --' Вывод сообщения о большой радиации if self.object.radiation >= 0.7 then local hud = get_hud() local custom_static = hud:GetCustomStatic("cs_radiation_danger") if custom_static == nil then hud:AddCustomStatic("cs_radiation_danger", true) hud:GetCustomStatic("cs_radiation_danger"):wnd():TextControl():SetTextST("st_radiation_danger") end else local hud = get_hud() local custom_static = hud:GetCustomStatic("cs_radiation_danger") if custom_static ~= nil then hud:RemoveCustomStatic("cs_radiation_danger") end end ]]-- if self.bCheckStart then printf("SET DEFAULT INFOS") if not has_alife_info("global_dialogs") then self.object:give_info_portion("global_dialogs") end if not has_alife_info("level_changer_icons") then self.object:give_info_portion("level_changer_icons") end self.bCheckStart = false -- if self.actor_weapon_on_start == true then -- db.actor:activate_slot(3) -- self.actor_weapon_on_start = false -- end end -- device().precache_frame == 0 and if not self.loaded_slot_applied then self.object:activate_slot(self.loaded_active_slot) self.loaded_slot_applied = true end xr_s.on_actor_update(delta) if(self.surge_manager) then if(self.f_surge_manager_loaded ~= true) then self.surge_manager:initialize() self.f_surge_manager_loaded = true end if(self.surge_manager.levels_respawn[level.name()]) then self.surge_manager:respawn_artefacts_and_replace_anomaly_zone() end self.surge_manager:update() end -- Апдейт доступности для симуляции. simulation_objects.get_sim_obj_registry():update_avaliability(alife():actor()) if not self.loaded then get_console():execute("dump_infos") self.loaded = true end treasure_manager.get_treasure_manager():update() if not(primary_objects_filled) then pda.fill_primary_objects() primary_objects_filled = true end pda.fill_sleep_zones() --СЮДА в САМЫЙ КОНЕЦ end В том же скрипте есть коллбэки на взятие, потерю, использование предметов. Нужно лишь искать.....Этим вы займетесь сами, или спросите у меня...В диалогах можно вызывать через тег (без () ) <action>имя скрипта.функция</action> Есть еще способы через логику, но они вам сейчас не нужны, а как понадобятся, вы сами их найдете.В этом деле главное терпение , находчивость и желание. Коды за вас никто писать не будет. В лучшем случае дадут пару советов и пошлют http://www.lua.ru. А в обычном скажут, руки не оттуда растут....Возможны неточности. Изменено 20 Сентября 2014 пользователем World_Stalker 3 8 2 Что-то кончается, что-то начинается... Ссылка на комментарий
Dietrich2009 1 Опубликовано 21 Августа 2010 Поделиться Опубликовано 21 Августа 2010 (изменено) Перенос модели с готовой анимацией из другой игры в Сталкер http://narod.ru/disk/22821537000/%D0%9F%D0%B5%D1%80%D0%B5%D0%BD%D0%BE%D1%81%20%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D0%B8%20%D1%81%20%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BE%D0%B9%20%D0%B0%D0%BD%D0%B8%D0%BC%D0%B0%D1%86%D0%B8%D0%B5%D0%B9%20%D0%B8%D0%B7%20%D0%B4%D1%80%D1%83%D0%B3%D0%BE%D0%B9%20%D0%B8%D0%B3%D1%80%D1%8B%20%D0%B2%20%D0%A1%D1%82%D0%B0%D0%BB%D0%BA%D0%B5%D1%80.doc.html Автомат для урокаhttp://narod.ru/disk/22723902000/sakom95_3.zip.html Создание террейна в 3d max 8 (видео урок)http://narod.ru/disk/22909250000/%D0%A3%D1%80%D0%BE%D0%BA%20%D0%BF%D0%BE%20%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F%20%D1%82%D0%B5%D1%80%D1%80%D0%B0%D0%B9%D0%BD%D0%B0.7z.html Изменено 19 Сентября 2014 пользователем World_Stalker Ссылка на комментарий
Гость Greh921 Опубликовано 24 Августа 2010 Поделиться Опубликовано 24 Августа 2010 (изменено) Мне для мода потребовалась функция логики space_restrictor-а - sr_soundЯ создал сам space_restrictor в файле alife_l01_escape.ltx написал вот это: [20506] ; cse_abstract properties section_name = space_restrictor name = esc_tips_fox position = 287.200012207031,16.6319103240967,275.321502685547 direction = -0.104504659771919,0.517827808856964,-0.0501847825944424 ; cse_alife_object properties game_vertex_id = 934 distance = 0 level_vertex_id = 594270 object_flags = 0xffffff3e custom_data = <<END [logic] active = sr_sound [sr_sound] snd = characters_voice\human_02\stalker\alife\defence\request_help_vs_mutant_1_pda END ; cse_shape properties shapes = shape0,shape1,shape2,shape3,shape4,shape5 shape0:type = box shape0:axis_x = 71.6746063232422,0,0 shape0:axis_y = 0,18.0631980895996,0 shape0:axis_z = 0,0,7.15800046920776 shape0:offset = 0,0,0 shape1:type = box shape1:axis_x = 71.6746063232422,2.67008715582051e-007,-2.13606972465641e-006 shape1:axis_y = 0,18.063196182251,1.34581313204762e-007 shape1:axis_z = 0,2.66656297043255e-008,7.15800046920776 shape1:offset = -70.810791015625,3.28049087524414,0.246719360351563 shape2:type = box shape2:axis_x = 70.5857162475586,-5.34017431164102e-007,-12.4460964202881 shape2:axis_y = 6.72906566023812e-008,18.063196182251,-6.72906566023812e-008 shape2:axis_z = 1.24296712875366,1.06662518817302e-007,7.04925537109375 shape2:offset = -139.549942016602,6.66907978057861,6.34806823730469 shape3:type = box shape3:axis_x = 64.9593124389648,-1.00128272606526e-006,-30.2908554077148 shape3:axis_y = 3.81672322191662e-007,25.6135959625244,1.90836161095831e-007 shape3:axis_z = 3.0250871181488,0,6.48735809326172 shape3:offset = -203.898208618164,6.86461544036865,27.2836456298828 shape4:type = box shape4:axis_x = 64.9593124389648,-1.00128272606526e-006,-30.2908554077148 shape4:axis_y = 3.81672322191662e-007,25.6135959625244,1.90836161095831e-007 shape4:axis_z = 3.0250871181488,0,6.48735809326172 shape4:offset = -260.097442626953,7.74838256835938,53.8768310546875 shape5:type = box shape5:axis_x = 65.4553070068359,4.65114135295153e-006,-45.8319931030273 shape5:axis_y = -1.67716643773019e-006,26.4829940795898,9.86568466032622e-007 shape5:axis_z = 6.40486860275269,3.32790563106755e-007,9.14716148376465 shape5:offset = -318.800598144531,12.4033985137939,88.3407592773438 ; cse_alife_space_restrictor properties restrictor_type = 3 Результат - вылет с ссылкой на ошибку в логике. Поковыряв, я обнаружил отсутствие файла sr_sound.script. Я добавил его, запустил игру и получил тот же самый вылет с тем же контекстом. Значит надо этот файл зарегистрировать.Лезем в modules.script. Внутри скрипта ищем: ---------------------------------------------------------------------- -- Загрузка модулей рестрикторов: ---------------------------------------------------------------------- Он в конце. И поле 85 строки с тексом: load_scheme("sr_deimos", "sr_deimos", stype_restrictor) вставляем наш: load_scheme("sr_sound", "sr_sound", stype_restrictor) Всё зарегистрировали.Теперь снова загружаем нашу игру и, добежав до нашего space_restrictor-а, ловим вылет: Expression : !m_error_code Function : raii_guard::~raii_guard File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp Line : 748 Description : ....e.r. - Зов Припяти\gamedata\scripts\sr_sound.script:201: attempt to call field 'get_safe_sound_object' (a nil value) Залез в sr_sound.script на 201 строку я обнаружил, что get_safe_sound_object - это функция xr_sound.scriptВ xr_sound.script я наткнулся на отсутствие get_safe_sound_object, а sr_sound.script я брал из ТЧ, куда и лезем за помощью в xr_sound.script, где данная функция есть. После нехитрых рассуждения я скомуниздил из тч-льского файла xr_sound.script следующий код: --' Соунд обжект --' Таблица для хранения созданных саунд обжектов. sound_object_by_theme = {} --' type = [random|seq|looped] function get_sound_object(theme, t_type) if sound_theme.ph_snd_themes[theme] == nil then abort("ph_snd_themes for theme %s", tostring(theme)) return end if sound_object_by_theme[theme] == nil then sound_object_by_theme[theme] = {} end if t_type == nil then t_type = "random" end --' Выбор следующего айдишника local play_id = -1 local table_size = table.getn(sound_theme.ph_snd_themes[theme]) if sound_object_by_theme[theme].last_id == nil then if t_type == "random" then if table_size >= 2 then play_id = math.random(1, table_size) else play_id = 1 end else play_id = 1 end else if t_type == "random" then if table_size >= 2 then play_id = math.random(1, table_size - 1) if play_id >= sound_object_by_theme[theme].last_id then play_id = play_id + 1 end else play_id = 1 end else if sound_object_by_theme[theme].last_id < table_size then play_id = sound_object_by_theme[theme].last_id + 1 else if type == "looped" then play_id = 1 end end end end printf("SOUND_OBJECT: selected id [%s] for theme [%s], type [%s], size [%s]", tostring(play_id), tostring(theme), tostring(type), table_size) if play_id == -1 then return end --' Проверяем создан ли у нас соответствующий саунд обжект или его надо создать if sound_object_by_theme[theme][play_id] == nil then if type(sound_theme.ph_snd_themes[theme][play_id]) == "table" then sound_object_by_theme[theme][play_id.."_r"] = get_safe_sound_object(sound_theme.ph_snd_themes[theme][play_id][1].."_r") sound_object_by_theme[theme][play_id.."_l"] = get_safe_sound_object(sound_theme.ph_snd_themes[theme][play_id][1].."_l") else sound_object_by_theme[theme][play_id] = get_safe_sound_object(sound_theme.ph_snd_themes[theme][play_id]) end end sound_object_by_theme[theme].last_id = play_id --' Возвращаем саунд обжект if type(sound_theme.ph_snd_themes[theme][play_id]) == "table" then return sound_object_by_theme[theme][play_id.."_r"], sound_object_by_theme[theme][play_id.."_l"] else return sound_object_by_theme[theme][play_id] end end local sound_object_by_path = {} --' Обертка вокруг функции, возвращающий звуковой объект. function get_safe_sound_object(path) if sound_object_by_path[path] == nil then sound_object_by_path[path] = sound_object(path) end return sound_object_by_path[path] end function stop_all_sound_object() for k,v in pairs(sound_object_by_path) do if v:playing() then v:stop() end end end function clear_all_sound_object() sound_object_by_theme = {} end Добавив его в файл xr_sound.script уже ЗП и запустив игру я обнаружил, что моя логика заработала!!!P.S. Делал данную рокировку я на ЗП на добавленном мною кордоне из ТЧ, откуда я и брал дополнительные скрипты. Изменено 20 Сентября 2014 пользователем World_Stalker оформил Ссылка на комментарий
amik 253 Опубликовано 10 Ноября 2010 Поделиться Опубликовано 10 Ноября 2010 (изменено) Полезная информация по работе с картами локаций в ПДА Авторы: Shadows и XMK Мини дополнение: http://xfiles.xianionline.com/tools/map_dragger/Там залита чужая карта но принцип тот-же. Спасибо XiaNi за ссылку. Изменено 19 Сентября 2014 пользователем World_Stalker Мой архив Сталкером не занимаюсь. Ссылка на комментарий
Makaveli 1 Опубликовано 2 Декабря 2010 Поделиться Опубликовано 2 Декабря 2010 (изменено) Создаете скрипт: имя_файла.script туда пишете: function use_snd(obj) local obj_sect = obj:section() local snd if obj_sect == 'ваш предмет' then snd = [[Путь_до_звука_относительно_папки_sounds]] elseif obj_sect == 'ваш предмет' then snd = [[Путь_до_звука_относительно_папки_sounds]] elseif obj_sect == 'ваш предмет' then snd = [[Путь_до_звука_относительно_папки_sounds]] elseif obj_sect == 'ваш предмет' then snd = [[Путь_до_звука_относительно_папки_sounds]] end if snd then local snd_obj = xr_sound.get_safe_sound_object(snd) snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0) end end Сохраняем. Открываем bind_stalker.script и в функцию function actor_binder:net_destroy() пишем: self.object:set_callback(callback.use_object, nil) и в функцию actor_binder:reinit() пишем: self.object:set_callback(callback.use_object, self.use_object, self) и в этом же файле создаем функцию: function actor_binder:use_object(obj) имя_вашего_скрипта.use_snd(obj) end Все теперь при использовании предмета будет проигрываться звук.Автор скрипта: Gun12 Для создания текста в главном меню нам понадобится два файла ui_main_menu.script (gamedata\scripts) и ui_mm_main.xml (gamedata\config\ui).Заходим в ui_main_menu.script и находим там это: function main_menu:InitControls() self:Init(0,0,1024,768) local xml = CScriptXmlInit() xml:ParseFile("ui_mm_main.xml") xml:InitStatic("back_movie", self) xml:InitStatic("background", self) xml:InitStatic("fire_movie", self) self.shniaga = xml:InitMMShniaga("shniaga_wnd",self); self.message_box = CUIMessageBoxEx() self:Register(self.message_box, "msg_box") local _ver = xml:InitStatic ("static_version",self) local mm = _G.main_menu.get_main_menu() _ver:SetText ("S.T.A.L.K.E.R. v" .. mm:GetGSVer()) end После self:Register(self.message_box, "msg_box") в следующей строке пишем: local add_ver = xml:InitStatic ("add_version",self) add_ver:SetText ("Ваш текст") Должно получится так: function main_menu:InitControls() self:Init(0,0,1024,768) local xml = CScriptXmlInit() xml:ParseFile("ui_mm_main.xml") xml:InitStatic("back_movie", self) xml:InitStatic("background", self) xml:InitStatic("fire_movie", self) self.shniaga = xml:InitMMShniaga("shniaga_wnd",self); self.message_box = CUIMessageBoxEx() self:Register(self.message_box, "msg_box") local add_ver = xml:InitStatic ("add_version",self) add_ver:SetText ("Ваш текст") local _ver = xml:InitStatic ("static_version",self) local mm = _G.main_menu.get_main_menu() _ver:SetText ("S.T.A.L.K.E.R. v" .. mm:GetGSVer()) end Далее заходим в ui_mm_main.xml и в самый конец вписываем: <add_version x="5" y="720" width="100" height="30"> <text align="l" font="letterica16" r="255" g="80" b="80" complex_mode="0"/> </add_version> Там где r="237, g="28, b="36 это цвета их можно поменять на любой другой, достаточно просто открыть палитру цветов в paint и выбрать такой какой надо r=" это красный g=" это зеленый b=" синий.Автор статьи: vavilov8 Изменено 21 Сентября 2014 пользователем World_Stalker оформил Ссылка на комментарий
AVAlancheXFirezilA 0 Опубликовано 8 Января 2011 Поделиться Опубликовано 8 Января 2011 (изменено) Разбор секцийОткрываем файл outfit.ltx находится он gamedata/configs/miscИ так для начала разберемся что и как, возьмем кпримеру стандартный шлем [helm_respirator] его код выглядит так: ; Противогаз [helm_respirator]:helmet ;название секции шлема,именно к нему игра будет обращаться.helmet базовая (наследуемая) секция (изменять строго не рекомендуется). $spawn = "outfit\helm_respirator" ;тут у нас спавн менять его не будем,оставим стандартный visual = dynamics\outfit\helm_respirator ;тут у нас модель шлема control_inertion_factor = 1.0 ;управление инертион фактором inv_name = st_helm_respirator ;название шлема в инвентаре. inv_name_short = st_helm_respirator ;название шлема в инвентаре. description = st_helm_respirator_descr ;ссылка на описание шлема inv_weight = 4.0 ;Вес шлема inv_grid_width = 2 ;Ширина иконки в ui_icon_equipment.dds inv_grid_height = 2 ;Высота иконки в ui_icon_equipment.dds inv_grid_x = 4 ;Положение по Х в ui_icon_equipment.dds inv_grid_y = 18 ;Положение по У в ui_icon_equipment.dds upgr_icon_x = 20 ;Тут всё тоже самое но только для иконки Апгрейда - ui_actor_armor.dds upgr_icon_y = 619 ;Тут всё тоже самое но только для иконки Апгрейда - ui_actor_armor.dds upgr_icon_width = 106 ;Тут всё тоже самое но только для иконки Апгрейда - ui_actor_armor.dds upgr_icon_height = 149 ;Тут всё тоже самое но только для иконки Апгрейда - ui_actor_armor.dds cost = 1000 ;Цена immunities_sect = sect_helm_respirator_immunities ;секции иммунитета bones_koeff_protection = actor_helm_respirator ;это по моему защита головы ГГ telepatic_protection = 0.0200 ;защита от телепатии radiation_protection = 0.0015 ;защита от радиации chemical_burn_protection = 0.0500 ;защита от химических ожогов upgrades = up_gr_firstab_helm_respirator ;это код на Апгрейд installed_upgrades = upgrade_scheme = upgrade_scheme_helm_respirator ;это код на схему Апгрейд [sect_helm_respirator_immunities] ;коэффициенты иммунитета самого шлема, то есть - то, насколько сильно он сам подвержен повреждениям от различных типов воздействий. по значениям каждого типа burn_immunity = 0.04 ;защита от воздействия огня (костры,аномалия "Жарка" и т.д.) strike_immunity = 0.0 ;защита от ударов (наносятся мутантами, например, псевдогигантом) shock_immunity = 0.04 ;защита от поражения электричеством. wound_immunity = 0.0 ;защита от ранений (наносятся мутантами, например, собаками, кровососами и т.д.) wound_2_immunity = 0.0 ;защита от ранений (наносятся мутантами, например, собаками, кровососами и т.д.) radiation_immunity = 0.0 ;защита от радиации. telepatic_immunity = 0.0 ;защита от пси-воздействия (например, присутствие контроллера серьезно влияет на psy_health) chemical_burn_immunity = 0.04 ;защита от химического воздействия. explosion_immunity = 0.04 ;защита от взрывов/осколков. fire_wound_immunity = 0.04 ;защита от огнестрельного оружия. P.s. При создании нового шлема не забудьте добавить инклуд. Они находятся на самом верху файла outfit.ltx #include "outfit_upgrades\helm_respirator_up.ltx" Далее создадим свой шлем в файле outfit.ltx в самом низу пишем: ; Шлем "Сфера Долга" [helm_battle_dolg]:helmet $spawn = "outfit\helm_battle" visual = dynamics\helm\helm_battle_dolg control_inertion_factor = 1.0 inv_name = st_helm_battle_dolg inv_name_short = st_helm_battle_dolg description = st_helm_battle_dolg_descr inv_weight = 3.0 inv_grid_width = 2 inv_grid_height = 2 inv_grid_x = 26 inv_grid_y = 0 upgr_icon_x = 900 upgr_icon_y = 450 upgr_icon_width = 100 upgr_icon_height = 100 cost = 8000 nightvision_sect = effector_nightvision_1 immunities_sect = sect_helm_battle_immunities bones_koeff_protection = actor_helm_battle telepatic_protection = 0.0600 radiation_protection = 0.0050 chemical_burn_protection = 0.0300 strike_protection = 0.0 explosion_protection = 0.0 wound_protection = 0.0 [sect_helm_battle_dolg_immunities] burn_immunity = 0.02 strike_immunity = 0.0 shock_immunity = 0.02 wound_immunity = 0.0 wound_2_immunity = 0.0 radiation_immunity = 0.0 telepatic_immunity = 0.0 chemical_burn_immunity = 0.02 explosion_immunity = 0.01 fire_wound_immunity = 0.01 Далее добавим к мену апгрейд,в файле outfit.ltx в верху пишем: #include "outfit_upgrades\helm_battle_dolg_up.ltx" Так теперь создадим ветку Апгрейда. Для этого создадим текстовый документ helm_battle_dolg_up.ltx в папке gamedata/configs/misc/outfit_upgrades. Далее в нашем файле helm_battle_dolg_up.ltx пишем: [up_sect_firsta_helm_battle_dolg] cost = 500 value = +10 chemical_burn_protection = 0.005 radiation_protection = 0.0004 [up_sect_firstc_helm_battle_dolg] cost = 1000 value = +20 telepatic_protection = 0.010 [up_sect_firstd_helm_battle_dolg] cost = 1000 value = +20 chemical_burn_protection = 0.010 [up_sect_firste_helm_battle_dolg] cost = 1500 value = +20 chemical_burn_protection = 0.015 radiation_protection = 0.0006 [up_sect_secona_helm_battle_dolg] cost = 500 value = +1 power_restore_speed = 0.001 [up_sect_seconc_helm_battle_dolg] cost = 1000 value = +20 telepatic_protection = 0.010 [up_sect_second_helm_battle_dolg] cost = 2500 value = +2 nightvision_sect = effector_nightvision_2 [up_sect_secone_helm_battle_dolg] cost = 3500 value = +3 nightvision_sect = effector_nightvision_3 [up_firsta_helm_battle_dolg] scheme_index = 0, 0 known = 1 effects = up_gr_firstcd_helm_battle_dolg section = up_sect_firsta_helm_battle_dolg property = prop_radio, prop_chem precondition_functor = inventory_upgrades.precondition_functor_a precondition_parameter = a & b effect_functor = inventory_upgrades.effect_functor_a effect_parameter = something_here prereq_functor = inventory_upgrades.prereq_functor_a prereq_tooltip_functor = inventory_upgrades.prereq_tooltip_functor_a prereq_params = name = st_up_res_a1_name description = st_up_res_a1_descr icon = ui_inGame2_upgrade_helm_battle_dolg_1 [up_firstc_helm_battle_dolg] scheme_index = 1, 0 known = 1 effects = up_gr_firstef_helm_battle_dolg section = up_sect_firstc_helm_battle_dolg property = prop_psy precondition_functor = inventory_upgrades.precondition_functor_a precondition_parameter = a & b effect_functor = inventory_upgrades.effect_functor_a effect_parameter = something_here prereq_functor = inventory_upgrades.prereq_functor_a prereq_tooltip_functor = inventory_upgrades.prereq_tooltip_functor_a prereq_params = name = st_up_res_b1_name description = st_up_res_b1_descr icon = ui_inGame2_upgrade_helm_battle_dolg_2 [up_firstd_helm_battle_dolg] scheme_index = 1, 1 known = 1 effects = up_gr_firstef_helm_battle_dolg section = up_sect_firstd_helm_battle_dolg property = prop_chem precondition_functor = inventory_upgrades.precondition_functor_a precondition_parameter = a & b effect_functor = inventory_upgrades.effect_functor_a effect_parameter = something_here prereq_functor = inventory_upgrades.prereq_functor_a prereq_tooltip_functor = inventory_upgrades.prereq_tooltip_functor_a prereq_params = name = st_up_res_b5_name description = st_up_res_b5_descr icon = ui_inGame2_upgrade_helm_battle_dolg_4 [up_firste_helm_battle_dolg] scheme_index = 2, 0 known = 1 effects = section = up_sect_firste_helm_battle_dolg property = prop_radio, prop_chem precondition_functor = inventory_upgrades.precondition_functor_a precondition_parameter = a & b effect_functor = inventory_upgrades.effect_functor_a effect_parameter = something_here prereq_functor = inventory_upgrades.prereq_functor_a prereq_tooltip_functor = inventory_upgrades.prereq_tooltip_functor_a prereq_params = name = st_up_res_c7_name description = st_up_res_c7_descr icon = ui_inGame2_upgrade_helm_battle_dolg_3 [up_secona_helm_battle_dolg] scheme_index = 0, 1 known = 1 effects = up_gr_seconcd_helm_battle_dolg section = up_sect_secona_helm_battle_dolg property = prop_power precondition_functor = inventory_upgrades.precondition_functor_a precondition_parameter = a & b effect_functor = inventory_upgrades.effect_functor_a effect_parameter = something_here prereq_functor = inventory_upgrades.prereq_functor_a prereq_tooltip_functor = inventory_upgrades.prereq_tooltip_functor_a prereq_params = name = st_up_resp_a3_name description = st_up_res_a3_descr icon = ui_inGame2_upgrade_helm_battle_dolg_5 [up_seconc_helm_battle_dolg] scheme_index = 1, 2 known = 1 effects = up_gr_seconef_helm_battle_dolg section = up_sect_seconc_helm_battle_dolg property = prop_psy precondition_functor = inventory_upgrades.precondition_functor_a precondition_parameter = a & b effect_functor = inventory_upgrades.effect_functor_a effect_parameter = something_here prereq_functor = inventory_upgrades.prereq_functor_a prereq_tooltip_functor = inventory_upgrades.prereq_tooltip_functor_a prereq_params = name = st_up_resp_c4_name description = st_up_resp_c4_descr icon = ui_inGame2_upgrade_helm_battle_dolg_6 [up_second_helm_battle_dolg] scheme_index = 1, 3 known = 1 effects = up_gr_seconef_helm_battle_dolg section = up_sect_second_helm_battle_dolg property = prop_night_vision precondition_functor = inventory_upgrades.precondition_functor_a precondition_parameter = a & b effect_functor = inventory_upgrades.effect_functor_a effect_parameter = something_here prereq_functor = inventory_upgrades.prereq_functor_a prereq_tooltip_functor = inventory_upgrades.prereq_tooltip_functor_a prereq_params = name = st_up_resp_b1_name description = st_up_resp_b1_descr icon = ui_inGame2_upgrade_helm_battle_dolg_8 [up_secone_helm_battle_dolg] scheme_index = 2, 1 known = 1 effects = section = up_sect_secone_helm_battle_dolg property = prop_night_vision precondition_functor = inventory_upgrades.precondition_functor_a precondition_parameter = a & b effect_functor = inventory_upgrades.effect_functor_a effect_parameter = something_here prereq_functor = inventory_upgrades.prereq_functor_a prereq_tooltip_functor = inventory_upgrades.prereq_tooltip_functor_a prereq_params = name = st_up_resp_c1_name description = st_up_resp_c1_descr icon = ui_inGame2_upgrade_helm_battle_dolg_9 [up_gr_firstab_helm_battle_dolg] elements = up_firsta_helm_battle_dolg [up_gr_firstcd_helm_battle_dolg] elements = up_firstc_helm_battle_dolg, up_firstd_helm_battle_dolg [up_gr_firstef_helm_battle_dolg] elements = up_firste_helm_battle_dolg [up_gr_seconab_helm_battle_dolg] elements = up_secona_helm_battle_dolg [up_gr_seconcd_helm_battle_dolg] elements = up_seconc_helm_battle_dolg, up_second_helm_battle_dolg [up_gr_seconef_helm_battle_dolg] elements = up_secone_helm_battle_dolg Теперь добавим наш апгрейд Кардану,в файле stalkers_upgrade_info.ltx пропишем название нашего шлемаПосле строк ........ helm_respirator helm_tactic helm_battle_dolg ;наш шлем Затем всё в этом же файле stalkers_upgrade_info.ltx после строк: ................. up_sect_secona_helm_battle = {!upgrade_hint_kardan(1)} false, true up_sect_seconc_helm_battle = {!upgrade_hint_kardan(2)} false, true up_sect_second_helm_battle = {!upgrade_hint_kardan(2)} false, true up_sect_secone_helm_battle = {!upgrade_hint_kardan(3)} false, true up_sect_seconf_helm_battle = {!upgrade_hint_kardan(3)} false, true Пишем: up_sect_firsta_helm_battle_dolg= {!upgrade_hint_kardan(1)} false, true up_sect_firstc_helm_battle_dolg = {!upgrade_hint_kardan(2)} false, true up_sect_firstd_helm_battle_dolg = {!upgrade_hint_kardan(2)} false, true up_sect_firste_helm_battle_dolg = false ;{!upgrade_hint_kardan(3)} false, true up_sect_secona_helm_battle_dolg = {!upgrade_hint_kardan(1)} false, true up_sect_seconc_helm_battle_dolg = {!upgrade_hint_kardan(2)} false, true up_sect_second_helm_battle_dolg = {!upgrade_hint_kardan(2)} false, true up_sect_secone_helm_battle_dolg = {!upgrade_hint_kardan(3)} false, true up_sect_seconf_helm_battle_dolg = {!upgrade_hint_kardan(3)} false, true Выглядеть будет так: ................. up_sect_secona_helm_battle = {!upgrade_hint_kardan(1)} false, true up_sect_seconc_helm_battle = {!upgrade_hint_kardan(2)} false, true up_sect_second_helm_battle = {!upgrade_hint_kardan(2)} false, true up_sect_secone_helm_battle = {!upgrade_hint_kardan(3)} false, true up_sect_seconf_helm_battle = {!upgrade_hint_kardan(3)} false, true up_sect_firsta_helm_battle_dolg= {!upgrade_hint_kardan(1)} false, true up_sect_firstc_helm_battle_dolg = {!upgrade_hint_kardan(2)} false, true up_sect_firstd_helm_battle_dolg = {!upgrade_hint_kardan(2)} false, true up_sect_firste_helm_battle_dolg = false ;{!upgrade_hint_kardan(3)} false, true up_sect_secona_helm_battle_dolg = {!upgrade_hint_kardan(1)} false, true up_sect_seconc_helm_battle_dolg = {!upgrade_hint_kardan(2)} false, true up_sect_second_helm_battle_dolg = {!upgrade_hint_kardan(2)} false, true up_sect_secone_helm_battle_dolg = {!upgrade_hint_kardan(3)} false, true up_sect_seconf_helm_battle_dolg = {!upgrade_hint_kardan(3)} false, true Так же можно добавим описание нашему шлему , для этого откроем файл st_items_outfit.xml находится он в gamedata/configs/text/rus и в самом низу пишем: <string id="st_helm_battle_dolg"> <text>Стальной Сталкера</text> </string> <string id="st_helm_battle_dolg_descr"> <text>Описание шлема</text> </string> Всё сохраняем , далее добавляем наш шлем либо в торговлю либо сразу спавним в стартовом капитале ГГЯ предпочитаю спавнить, для этого в файле character_desc_general.xml находится он gamedata/configs/gameplayПишем после строки: ................. conserva = 2 \n helm_battle_dolg = \n Всё, можно проверять. Автор: DOC_VENOM Изменено 20 Сентября 2014 пользователем World_Stalker оформил Ссылка на комментарий
Гость max_max_08 Опубликовано 4 Июня 2011 Поделиться Опубликовано 4 Июня 2011 (изменено) By max_max_08, iDreD © --что делают функции из бинд сталкер function actor_binder:net_spawn(data) --функция запускается при переходе на новую локацию, при загрузке сохранения. end function actor_binder:update(delta) --функция запускается постоянно, т.е. если вписать какую либо проверку, то проверяться будет постоянно. end --Общее local npc --создается локальная переменная с именем npc (при обращении к ней, она существует, но равна nil) --пример local active_item = db.actor:item_in_slot(db.actor:active_slot()) -- local active_item (локальная переменная с именем active_item) = db.actor:(у кого проверяем,)item_in_slot(предмет в слоте(в скобках номер слота или условие))(db.actor:active_slot()(активный слот, т.е. если ДЕРЖИМ в руках пистолет то db.actor:active_slot равно 1 если автомат то 2) в итоге локальная active_item равняется обьекту который держим в руках --active_item это обьект, который в онлайне, если нам нужно проверить его секцию то делаем так local active_item = db.actor:item_in_slot(db.actor:active_slot()) if active_item:section() == "wpn_ak74" then --if(если) active_item:section() (секция обьекта active_item) == (равна) "wpn_ak74" (секция калаша) then(то) --действие end --у обьекта можно многое проверить, например группировку, имя, цену, состояние и пр. math.random(120,140) -- принимает рандомное число в даном пределе. -- т.е amk.start_timer("taimer",math.random(120,140)) будет выглядить примерно так amk.start_timer("taimer",120) где число 120 будет выбано рандомно local obj=alife():create("секция_обьекта",vector():set(-81.4560,-0.2423,157.2334),186914,163) --спавнит обьект и приравнивает его к локальной obj --тоесть после спавна с обьектом можно проделать какие либо действия(нанести хит, изменить группировку, заспавнить ему оружие\предмет, изменить состояние(кондицию) --функция спавна с чтением\записью нэт пакета(требуется АМК) function spawn_burer() local obj = alife():create("burer_normal",vector():set(73.2404251098633,-0.0141735374927521,28.42),10537,2430) --спавним бюррера, и назначаем ему локальную obj local params=amk.read_monster_params(obj) --читаем параметры (обьекта) obj params.custom="[logic]\ncfg = scripts\\new\\burer1.ltx" --указываем путь до логики params.sid=9800 --назначаем сид, что-то типа айди(индивидуальный номер) params.health = 0 --назначаем значение здоровья, 0-мертв, 1-как новенький. amk.write_monster_params(params,obj) --записываем новые параметры (обьекту) obj end --даем предмет, вызывается из диалога function give_scope(first_speaker, second_speaker) --в скобках два обьекта которые ведут диалог, один из них актор другой нпс if db.actor and db.actor:id() == first_speaker:id() then --если айди актора и first_speaker РАВНЫ то. actor = first_speaker --локальная actor принимает значение first_speaker npc = second_speaker --а локальная npc принимает значение second_speaker else --иначе (если айди актора и first_speaker НЕ РАВНЫ) actor = second_speaker --наоборот локальная actor принимает значение second_speaker npc = first_speaker --а локальная npc принимает значение first_speaker end dialogs.relocate_item_section(actor, "wpn_addon_scope", "in") --даем оптику на калаш актору,(если указать npc до дадим тому с кем говорим) "in" даем, "out" забираем dialogs.relocate_item_section(actor, "wpn_addon_grenade_launcher", "in") dialogs.relocate_item_section(actor, "wpn_ak74", "in") end -- удаляем непися по сиду function del_oleg_1() local sim = alife() local se_obj = sim:story_object(5004) --сид обьекта которого удаляем if se_obj then --если se_obj равно true т.е. существует т.е. не равно nil sim:release(se_obj, true) -- собственно удаление end end function daem_patroni(first_speaker, second_speaker) if sak.have_item_namber("wpn_abakan", 1) or --если в рюкзаке есть абакан или (sak. это файл, have_item_namber это функция ("wpn_abakan") это строка которая передается в функцию have_item_namber, а функция возвращает true или false ) sak.have_item_namber("wpn_groza_m1", 1) or --гроза или sak.have_item_namber("wpn_ak74", 1) or --ак 74 или sak.have_item_namber("wpn_ak74u", 1) then --ак 74у то... dialogs.relocate_item_section(second_speaker, "ammo_5.45x39_ap", "in") --даем патроны ammo_5.45x39_ap second_speaker-у (тоесть гг) dialogs.relocate_item_section(second_speaker, "ammo_5.45x39_ap", "in") dialogs.relocate_item_section(second_speaker, "ammo_5.45x39_ap", "in") dialogs.relocate_item_section(second_speaker, "ammo_5.45x39_ap", "in") else -- иначе (если перечисленных стволов в юкзаке нет) dialogs.relocate_item_section(second_speaker, "ammo_5.56x45_ss190", "in")--даем патроны ammo_5.56x45_ss190 second_speaker-у (тоесть гг) dialogs.relocate_item_section(second_speaker, "ammo_5.56x45_ss190", "in") dialogs.relocate_item_section(second_speaker, "ammo_5.56x45_ss190", "in") dialogs.relocate_item_section(second_speaker, "ammo_5.56x45_ss190", "in") end -- закрывающий тэг для if (для else end не нужен) end -- закрывающий тэг для function if has_alife_info("инфо1") and has_alife_info("инфо2") and has_alife_info("инфо3") then --если выданы ВСЕ инфопоршны то... end if has_alife_info("инфо1") or has_alife_info("инфо2") or has_alife_info("инфо3") then --если выдан хоть один инфопоршнен то... end if (has_alife_info("инфо1") or has_alife_info("инфо2")) and not has_alife_info("инфо3") then --если выданы инфо 1 или 2, а инфо 3 отсутствует (в скобках проверяется первым, как в алгебре)... end --проверка для квеста function xabar_in_actor() return db.actor:object("pda_wolf_drug") ~= nil --return(вернуть) true(правда) если pda_wolf_drug не равен nil т.е. находится в рюкзаке end --различные проверки if level.name()=="l07_military" then --если актор находится на локации l07_military (военные склады) то... --деиствие end db.actor:give_info_portion("имя инфо") --выдать гг инфоноршен if has_alife_info("имя инфо") then --проверить выдан ли поршен --действие end obj:cost() --цена обьекта --Как использовать? if obj:cost() > 1000 then -- если цена обьекта больше 1000 то.. --действие end --или local cost = obj:cost() --переменная cost принимает значение цены у обьекта(obj) obj:condition() --состояние обьекта 1.0-новый obj:active_slot() --активный предмет, тот который сейчас держит obj, obj-ом может быть db.actor local rank = ranks.get_obj_rank_name(db.actor) --проверим ранг local dist = obj:position():distance_to(db.actor:position()) -- dist это растояние в метрах между obj и db.actor db.actor:eat(medkit) --использовать(схавать) предмет, medkit это ни секция, а обьект т.е. кастомдата обьекта npc:see(db.actor) --нпс видит актора obj:get_ammo_in_magazine() --кол-во патронов в магазине alife():release(alife():object(obj:id()),true) -- удаляем obj obj:add_animation("анимация") --проиграть анимацию у нпс "udar_0" = Удар кулаком "prisluh_1_idle_1" = одной рукой пушку вверх "prisluh_0_idle_1" = одной рукой на земле "prisluh_3_idle_1" = сидя, двумя руками пушка накрест "wounded_idle_0" = сидя, тошнит "waunded_1_idle_0" = калачик "wounded_2_idle_0" = лежит, раненый "wounded_3_idle_0" = лежит, двумя руками держась за живот local number = tonumber(number_1) --конвертируем number_1 в число number local string = tostring(string) --конвертируем string в строку string --способы получения объектов local obj = level_object_by_sid(6) -- по сиду из алл спавна. Это сид волка. local obj = alife():create("секция",vector():set(x,y,z)game_vertex,level_vertex) --при спавне скриптом. local obj = db.actor:item_in_slot(number) --по предмету в слоте,number - это номер слота local sobj = alife():object(npc:id()) --получение серверного обьекта по айди --[[ [Слот_1]=[пистолеты] [Слот_2]=[автоматы] [Слот_3]=[гранаты] [Слот_4]=[бинокль] [Слот_5]=[болт] [Слот_6]=[бронекостюм] [Слот_7]=[пда] [Слот_8]=[детектор] [Слот_9]=[фонарик] ]] npc:relation(obj) == game_object.neutral --отношение npc к obj запишем нейтральное или game_object.friend дружеское obj:name() -- имя obj npc:object("medkit") --проверим наличие аптечки у npc npc:character_community() -- групировка npc npc:character_name() npc:character_reputation() npc:character_rank() npc:profile_name() db.actor:set_character_rank(650) --запишем ранг актору -- нанесение хита обьекту local h = hit() h.power = 10000 --сила удара h.impulse = 1 --импульс h.draftsman = obj h.type = hit.fire_wound --тип урона h.direction = db.actor:position():sub(obj:position()) --откуда пришел удар(имеется в виду направление) h:bone("pelvis") -- по какой кости даем пинка obj:hit(h) --собственно сам удар по obj --фиксация обьекта function name() local obj=alife():create("wpn_ak74",vector():set(268.300,12.157,23.788),543524,138) --спавним калаш и присваеваем ему переменную obj if obj then --если obj существует то... local pshell = obj:get_physics_shell() --получаем оболочку обьекта if pshell then --если получили то... local element = pshell:get_element_by_order(0) --получаем елемент оболочки if element then --если получили то... element:fix() --фиксируем елемент оболочки end end end end --спавн рюкзака и спав в него предмета local obj = alife():create("section_treasure", vector():set(-347.58, -22.4, 194.8), 8132, 1839) --спавним тайник if obj then alife():create("имя секции", vector():set(-347.58, -22.4, 194.8), 8132, 1839, obj.id) -- спавним (В ОФФЛАЙНЕ) в тайник предмет, ловим по айди end --если в секции есть такая строка то истина if string.find(obj:section(), "boar") then --деиствие end --перебор обьектов for a=1,65534 do --крутим цикл local obj = alife():object(a) --каждый обьект (a) принимает значение obj if obj and IsMonster(obj) then --если обьект монстр(или IsStalker(obj) - сталкер) --действие end end --если пушка в руках - прячем, а то тащить неудобно if npc:weapon_unstrapped() then npc:set_item(object.idle,nil) end -- получим активную схему local actsch=db.storage[npc:id()].active_scheme --если зашли в эти координаты то кирдык local pos = db.actor:position() if pos.z>65 and pos.x>350 and pos.x<410 then db.actor:kill(db.actor) end --взято из OGSE -- Отметка укрытий на карте function mark_hideouts() for k,v in pairs(ogsm_respawn.restrictor_list) do local obj = level.object_by_id(v.id) level.map_add_object_spot(obj:id(), "red_location", obj:name()) end end -- Удаление укрытий function del_hideouts() for k,v in pairs(ogsm_respawn.restrictor_list) do alife():release(v, true) end end Когда-то писалось для камрада стартер, но и другим пригодится. http://rghost.ru/9364471 Изменено 19 Сентября 2014 пользователем World_Stalker Ссылка на комментарий
Это популярное сообщение. amik 253 Опубликовано 12 Июля 2011 Это популярное сообщение. Поделиться Опубликовано 12 Июля 2011 (изменено) Вот кое что от Stalk15. Авторы функций не указаны (Для ТЧ). function spawn_x14 () alife():create("Секция",vector():set(-7.32,-34.48,13.18),1542,2799) end Функции типа "Проверка на взятие предмета..." я лично использую в квестах тегами <function_complete>файл.функция</function_complete> function search_weapon_complete1(actor, npc) if db.actor ~= nil then if db.actor:object("ПРЕДМЕТ") then db.actor:give_info_portion("ПОРШЕНЬ") return true end end return false end local t_wpn = {"ПРЕДМЕТ1", "ПРЕДМЕТ1", "ПРЕДМЕТ1"} function search_ALL_weapons_complete() local gg = db.actor if gg then for i=1,#t_wpn do if not gg:object(t_wpn[i]) then return false end end gg:give_info_portion("ПОРШЕНЬ") return true end return false end Основная функция: function Actor_Has_ListItems(sSection,iNum) if not iNum then iNum = 1 end local oActor = db.actor local iCnt = 0 if oActor and sSection then oActor:iterate_inventory( function (dummy, oItem) if oItem:section() == sSection then iCnt = iCnt + 1 if iCnt >= iNum then return true --/> актор имеет N предметов end end end ,nil) end return iCnt >= iNum --/> имеет ли актор N предметов end Вызов: function search_2_bumazhki_sidr_complete() return this.Actor_Has_ListItems("medkit", 10) end function search_weapon_complete(actor, npc) if db.actor ~= nil then return db.actor:object("wpn_vintorez")~=nil end return false end function have_docs_from_x14(first_speaker, second_speaker) return first_speaker:object("ПРЕДМЕТ") ~= nil end function give_sidor_docs(first_speaker, second_speaker) dialogs.relocate_item_section(second_speaker, "ПРЕДМЕТ", "out") end function give_nagrada_x14 (trader, actor) dialogs.relocate_item_section(trader, "ПРЕДМЕТ", "in") end function have_n_m1() return ИМЯ_СКРИПТА.have_n_m("bread",2,"kolbasa",2,"conserva") end function have_n_m(section,number) local actor = db.actor if actor then local cnt = 0 actor:iterate_inventory( function (dummy, item) if item:section() == section then cnt = cnt + 1 end end ,nil) return cnt >= number end return false end function punch() -- set_inactivate_input_time(30) local snd_obj = xr_sound.get_safe_sound_object([[affects\hit_fist]]) snd_obj:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 1.0) level.add_cam_effector("camera_effects\fusker.anm", 999, false, "") end Отнимаем: function reputation_down_10(stalker, player) db.actor:change_character_reputation(db.actor:character_reputation() - 10) end Плюсуем: function reputation_up_10(stalker, player) db.actor:change_character_reputation(db.actor:character_reputation() + 10) end function malo_hp() db.actor.health = -0.3 --Минус 30% дезек end function Delete_ak74u_from_Actor() local oItem = db.actor:object("medkit") --/ определяем предмет у ГГ if oItem then --/ у ГГ есть предмет db.actor:drop_item(oItem) --/ выбрасываем предмет (опционально) alife():release(alife():object(oItem:id()), true) --/ удаляем из игры end end function dell() for a = 1,65534 do local se_obj = alife():object(a) if se_obj and se_obj:section_name() == "СЕКЦИЯ ПРЕДМЕТА" then alife():release(se_obj, true) end end end function Delete_2_bumazhki_sidora_from_Actor() local cnt = db.actor:object_count() local ch=0 for i=0, cnt-1 do local item = db.actor:object(i) if item:section() == "medkit" then local sobj = alife():object(item:id()) if sobj then alife():release(sobj,true) ch = ch+1 if ch == 7 then --7 - кол-во удаляемых аптечек break end end end end end function teleportate_to_() local a = vector() a.x = -241.71509460448 a.y = -26.742816052856 a.z = -304.54711914063 db.actor:set_actor_position(a) end function ReleaseRandomItem(num) local actor = db.actor local cnt = actor:object_count() if cnt<num then return end for i=1,num do local item = actor:object(math.random(0, cnt-1)) local sobj = alife():object(item:id()) if sobj then alife():release(sobj,true) cnt = actor:object_count() end end end вызывать так: ReleaseRandomItem(5) -- 5 - число удаляемых предметов Вызов через диалог: function RRI() имя_файла.ReleaseRandomItem(5) end Пример: <action>имя_файла.RRI</action> function join_monolith (actor, npc) -- ставить на дельта апдейт printf ("ACTOR NOW IN имя группировки COMMUNITY") if db.actor and level_id.имя уровня then -- пример l01_escape и т.п db.actor:set_character_community ("имя группировки", 0, 0) end end function habar_davay(actor, npc) treasure_manager.get_treasure_manager():give_treasure("имя тайника") end function test_index() local cnt = db.actor:object_count() for i=0, cnt-1 do local item = db.actor:object(i) local sobj = alife():object(item:id()) if sobj then alife():release(sobj,true) end end end local iTimer function Start_Timer_5_minutes() --/ (пере)запуск таймера (из диалога) iTimer = time_global() + 5*1000 --/ взводим таймер на 5cek end function Timer_N_minutes() --/ вызывается из ':update' сталкер-биндера if iTimer and iTimer < time_global() then --/ проверка текущего значения iTimer = nil --/ выключаем таймер скрипт.функция() --/ выполняем действие end end local iTimer local last function start_timer_minutes_test(seconds) if last~= nil then iTimer = time_global()+last --/ взводим таймер на остаток времени last else iTimer = time_global() + 7*1000 --/ взводим таймер например 7 сек. end end function timer_n_minutes_test() --/ вызывается из ':update' сталкер-биндера if iTimer then last=iTimer-time_global() -- присваиваем переменной остаток времени до конца работы таймера if iTimer < time_global() then iTimer = nil --/ выключаем таймер last=nil СКРИПТ.ФУНКЦИЯ--/ выполняем действие end end end -- выводим значение таймера в обратном отсчете на худ function hud_static() --/ вызывается из ':update' сталкер-биндера local hud = get_hud() local st if iTimer then st = hud:GetCustomStatic("hud_timer") if st==nil then hud:AddCustomStatic("hud_timer", true) st = hud:GetCustomStatic("hud_timer") end if last~=nil then local hours = math.floor(last/3600000) local minutes = math.floor(last/60000 - hours*60) local seconds = math.floor(last/1000 - hours*3600 - minutes*60) local text = string.format("%02d:%02d:%02d",hours,minutes,seconds) -- выводим время в формате 00:00:00 --local text=string.format("%.f",last/1000) st:wnd():SetTextST(text) end else if hud:GetCustomStatic("hud_timer")~=nil then hud:RemoveCustomStatic("hud_timer") end end end Автор:Николай ФеНиКс(ФеНиКс) if bone_index > 0 and who then if who:id() == db.actor:id() then --/ для актора local oActiveItem = db.actor:object("wpn_svd") if oActiveItem then --/ у актера проверяемое оружие local kuda = "" if bone_index == 14 or bone_index == 15 then kuda = "Ранен в глаз" elseif bone_index == 13 then kuda = "Ранен в голову" elseif bone_index == 16 then kuda = "Ранен в челюсть" elseif bone_index == 17 then kuda = "Ранен в шею" elseif bone_index == 9 or bone_index == 10 or bone_index == 11 or bone_index == 18 then kuda = "Ранен в грудь" elseif bone_index >= 1 and bone_index <= 8 then kuda = "Ранен в ногу" elseif bone_index >= 19 and bone_index <= 42 then kuda = "Ранен в руку" end news_manager.send_tip(db.actor, kuda, nil, nil, 2000) end end end Вставлять функцию в мотиватор в функцию hit_callbak. Например, после этого: if self.st.hit then xr_logic.issue_event(self.object, self.st.hit, "hit_callback", obj, amount, local_direction, who, bone_index) end function mochim_five_nps() if has_alife_info("первый_грохнут") and has_alife_info("второй_грохнут") and has_alife_info("третий_грохнут") and has_alife_info("четвертый_грохнут") and has_alife_info("и_пятый_наконец") then return true else return false end end Использование: В теле квеста пишем complete'ы: <infoportion_complete>esc_kvest_secret_merc_kill_poslannick</infoportion_complete> <function_complete>имя_файла.mochim_five_nps</function_complete> После выполнения условий функции mochim_five_nps выдается поршень esc_kvest_secret_merc_kill_poslannick и задание обновляется. local ObjId=0 function pda_killer_spawn() local obj= alife():create("pda_merc_killer_glav",vector():set(-223.700,-7.678,-129.688),17000,281) local text = "Текст метки" level.map_add_object_spot_ser(obj.id, "blue_location", text) --/blue_location - тип метки ObjId=obj.id end Эту метку можно удалить так: function delete_spot() for a=1,65534 do --Перебор айди local obj = alife():object(a) if obj and obj:section_name() == "pda_merc_killer_glav" then --/pda_merc_killer_glav -- Секция предмета или НПС level.map_remove_object_spot(obj.id,"blue_location") break end end end local obj = alife():story_object( 6 ) -- 6 - сид Волка local obj_id = obj.id function add_spot_on_map(obj_id,type,text) if obj_id then if not text then text = "no_text" end level.map_add_object_spot_ser(obj_id, type, text) end end Вызываем: function add_spot_on_map2(obj_id,type,text) имя_файла.add_spot_on_map(obj.id,"green_location","Текст") end Метку можно убрать вот так: local obj = alife():story_object( 6 ) local obj_id = obj.id function remove_spot_from_map(obj_id,type) if obj_id and level.map_has_object_spot(obj_id, type) ~= 0 then level.map_remove_object_spot(obj_id, type) end end эту вызывать: function remove_spot() this.remove_spot_from_map(obj.id,"green_location") end function kvest_search_2_bumazhki_sidr_complete() news_manager.send_tip(db.actor, "%c[255,255,128,128]Автор сообщения\n%c[default]Текст сообщения", 0, "wolf", 17000) end local text = "Здесь текст" function test() news_manager.send_tip(db.actor, text, 0, "trader", 20000) end Спавним рестриктор на координатах Волка с радиусом метра 2.Делаем логику рестриктору: [logic] active = sr_idle [sr_idle] on_actor_inside = %+esc_on_talk% ;Выдача поршня ;Или так(Выбрать одно): on_actor_inside = %=on_talk%" ;Функция Если выбрали поршень, то создаем его: <info_portion id="esc_on_talk"> <action>СКРИПТ.on_talk</action> </info_portion> Вызываем функцию и видим диалог: function on_talk() local npc = level_object_by_sid(006) db.actor:run_talk_dialog(npc) end function immotral() local npc1 = level_object_by_sid(006) --волк local npc2 = level_object_by_sid(092) --проводник local npc3 = level_object_by_sid(032)-- кузнецов local npc4= level_object_by_sid(100) --Серый if npc1 then npc1.health = 1 end if npc2 then npc2.health = 1 end if npc3 then npc3.health = 1 end if npc4 then npc4.health = 1 end end В голову дохнут. function name() local npc = level_object_by_sid(006) npc:set_character_community("имя группировки", 0, 0) end Если разговариваем с самим Волком, то вызываем эту функцию: function name(actor, npc) npc:set_character_community("имя группировки", 0, 0) end function dell_kluk_final() local se_obj = alife():object("esc_wolf") if se_obj then alife():release(se_obj, true) end end function do_something() local item = db.actor:object("antirad") if antirad then db.actor:eat(item) end end Должно быть так: function do_something() local item = db.actor:object("antirad") if item then db.actor:eat(item) end end Надет ли костюм function check_outfit() local outfit = db.actor:item_in_slot(6) if outfit:section() == "exo_outfit" then --/Если в 6 слоте присутствует "exo_outfit" тогда return true --/"exo_outfit" одет else return false --/"exo_outfit" не одет end end Не надет ли костюм function check_outfit() local outfit = db.actor:item_in_slot(6) if outfit:section() == "exo_outfit" then --/Если в 6 слоте присутствует "exo_outfit" тогда return true --/"exo_outfit" не одет else return false --/"exo_outfit" одет end end function hit_nanesti() for a=1,65635,1 do local obj=level.object_by_id(a) if obj and string.find(obj:name(),"ПРЕДМЕТ") then local h = hit (); h.power = 10000; h.direction = vector():set (0, 0, 0); h.impulse = 0; h.draftsman = obj; h.type = hit.explosion; obj:hit (h); end end end function rest() local npc = level_object_by_sid(006) --волк if npc and level.name() == "l01_escape" then return true else return false end end function go_to_marsh_complete() if level_name == "l01escape" then return true else return false end end Изменено 15 Декабря 2017 пользователем Murarius 6 6 Мой архив Сталкером не занимаюсь. Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти