AndreySol 215 Опубликовано 10 Февраля 2019 Поделиться Опубликовано 10 Февраля 2019 3 часа назад, F.Constantine сказал: хошь сохранить нейтралитет - ползай на пузе ночью и пытайся по тихому стибрить чемоданчик, не хошь - выноси всех, но потом не обижайся. Так у тебя гулаг вояк на блок-посту изначально будет враждебен к ГГ. Какой же тут нейтралитет ? Еще раз предлагаю: не трогай изначальное отношение вояк к остальным, а изучи возможности combat_ignore + combat_ignore_cond в логике. Ссылка на комментарий
F.Constantine 0 Опубликовано 10 Февраля 2019 Поделиться Опубликовано 10 Февраля 2019 @AndreySol, 2 часа назад, AndreySol сказал: Какой же тут нейтралитет ? Нейтралитет всей группировки в целом. За исключением нескольких гулагов, занятых охраной секретных объектов или военных баз/блокпостов. Таких гулагов в игре всего 4 - пара на Кордоне (солдаты на блокпосту и спецназ) и пара на Агропроме (гарнизон НИИ и вояки в коллекторах). Ну, еще нужно сделать враждебными вояк, атакующих группу Крота на том же Агропроме, и спецназ у лаборатории №18. Всё, остальные меня устраивают как нейтралы - причем не только к актору, а к большинству фракций, кроме бандюков и наймов, к примеру. Ты не встречал в игре отряды солдат, просто ходящих по локациям - с одной на другую? При некоторых моих настройках респавна у меня их на Свалке получалось очень густо . Вот они тоже, к примеру, могут себе идти и никого не трогать, вместо того, чтобы атаковать все, что шевелится. Ну, так как проще: сделать враждебными полдюжины вполне определенных гулагов к ГГ и двух - к "одиночкам", или просчитывать и править все остальные возможные встречи вояк, причем со всеми группировками ? А combat_ignore + combat_ignore_cond - да, тоже полезно может быть. Ссылка на комментарий
hack.pavlov 0 Опубликовано 11 Февраля 2019 Поделиться Опубликовано 11 Февраля 2019 Можно ли скриптами определить объект на который смотрит актер? Ссылка на комментарий
naxac 2 447 Опубликовано 11 Февраля 2019 Поделиться Опубликовано 11 Февраля 2019 (изменено) @hack.pavlov, в x-ray extensions для этого есть функция level.get_target_obj() А без XE - проверять, совпадает ли вектор направления на объект с направлением камеры - для всех онлайновых объектов. Как это сделать - можно подсмотреть, например, в скрипте фотоаппарата из "фотографа" Изменено 11 Февраля 2019 пользователем naxac 2 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
Дмитрий Зверев 0 Опубликовано 12 Февраля 2019 Поделиться Опубликовано 12 Февраля 2019 Всем привет. При разборе логики у меня неоднократно возникал вопрос. Можно ли логически заставить сталкера стрелять по другому сталкеру? В схеме я перевожу его на remark и отыгрываю анимацию ***_fire. Всё работает отлично, пока в качестве цели (по story_id) указан мутант, бандит или зомбированный (короче, недружественное существо). Однако, если приказать одному сталкеру стрелять по другому нейтральному сталкеру, то он просто наведёт на него ствол и замрёт. Я не очень силён в xr_***-скриптах, поэтому буду очень благодарен тому, кто подскажет, как реализовать это без костылей и красиво (под костылями я имею в виду проигрывание звука выстрела и одновременно вызов хита по цели. Выглядит это максимально картонно, а посему хочу насильно "приказать" одному сталкеру стрелять по другому, невзирая на группировку). Пока писал назрел ещё один вопрос. В оригинальной ТЧ есть момент, когда ГГ подходит к Кузнецову, и у того (несмотря на то, что он во вражьей группировке) появляется диалог. Однако мне в попытках исправить по аналогии секцию meet создать что-то подобное не получилось. Пытался даже играться с game_relations.ltx (выставлять отношения к группировке killer на 0), но диалоги не появлялись. Подозреваю, что где-то прописаны группировки (в dialog_manager.ltx?), в котором явно задано, с кем эктор может говорить, а с кем - нет. Но вот что-то совсем не получилось разобраться, как конкретно этот dialog_manager работает. Опять же, буду благодарен за любые подсказки по данному вопросу. Спасибо. Ссылка на комментарий
naxac 2 447 Опубликовано 12 Февраля 2019 Поделиться Опубликовано 12 Февраля 2019 @Дмитрий Зверев, перед тем, как нпсу стрелять, поссорь его с целью, например, вызвав функцию из логики. Дефолты для meet выставляются в xr_meet.script, там и проверка по группировкам стоит. 2 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
Дмитрий Зверев 0 Опубликовано 12 Февраля 2019 Поделиться Опубликовано 12 Февраля 2019 @naxac, "поссорил", сменив жертве группировку. И убийце, на всякий, тоже сменил, настроив ему отношение конкретно к жертве в -5000. В итоге, при вызове скрипта из диалога и жертва, и убийца срываются в бой (хотя у обоих стоит danger_ignore по всем пунктам = 1 и combat_ignore_cond = always). Поэтому сцена, в которой убийца должен красиво решать стоящего на коленях сталкера попросту сыплется. Даже не знаю, как теперь это можно пофиксить. В любом случае, спасибо. Ссылка на комментарий
AndrewMor 527 Опубликовано 12 Февраля 2019 Поделиться Опубликовано 12 Февраля 2019 1 час назад, Дмитрий Зверев сказал: В оригинальной ТЧ есть момент, когда ГГ подходит к Кузнецову Я в своем моде делал бандитов и легко с ними мог говорить, даже если они враги (а так и было). Вроде в логике все прописывается. Сталкер - наше всё! Ссылка на комментарий
Змея 240 Опубликовано 12 Февраля 2019 Поделиться Опубликовано 12 Февраля 2019 6 часов назад, Дмитрий Зверев сказал: сцена, в которой убийца должен красиво решать стоящего на коленях сталкера попросту сыплется Фотограф - сцена расстрела дезертиров. Сделано в 12-ом году... 1 Ссылка на комментарий
F.Constantine 0 Опубликовано 12 Февраля 2019 Поделиться Опубликовано 12 Февраля 2019 Добрый вечер. Я снова с бубном танцую вокруг relation гулагов военных. К актору разобрались, теперь бы еще к группировкам разобраться. Кому не лень, гляньте под спойлер : Скрытый текст Для военных по дефолту установлен нейтралитет к "одиночкам" и актору. Задача - сделать гулаг атакующих группу Крота на Агропроме вояк враждебным - и группировке "одиночек", и актору. Это - из gulag_agroprom.script. Выделенное жирным - мои вставки: function load_states( gname, type ) ... if type == "agr_factory_assault" then return function( gulag ) local community = self.object:character_community() if community == "stalker" then xr_gulag.setGulagRelation ("agr_factory_assault", game_object.enemy, self.object) end local actor = db.actor xr_gulag.setGulagRelation ("agr_factory_assault", game_object.enemy, db.actor) if not actor then return gulag.state end … Такое может быть? С актором для других гулагов работает - меня интересует по части группировки. Или - бред мой снова? Ссылка на комментарий
DimanZ 1 Опубликовано 21 Февраля 2019 Поделиться Опубликовано 21 Февраля 2019 Всем привет... В ковырялке ОП 2.1 просто удалили сообщение,может тут кто поможет? Взял записку картографа до получения кода от прайма,теперь завис скрипт... Что и где в скрипте можно изменить,чтоб квест дальше пошёл? Ссылка на комментарий
Jekyll 92 Опубликовано 27 Февраля 2019 Поделиться Опубликовано 27 Февраля 2019 Здравствуйте! Кто подскажет, как еще используется функция who_hit_name() кроме случая self.object:who_hit_name()=="single_player"? И как отследить хит/убийство одного моба другим мобом? New Anomalies 1.1 ☢☢☢ "Смерть-лампа" ☢☢☢ Дисраптор Русификатор для игры Vendetta: Curse of Raven's Cry Ссылка на комментарий
naxac 2 447 Опубликовано 28 Февраля 2019 Поделиться Опубликовано 28 Февраля 2019 @Jekyll, who_hit_name() возвращает имя объекта, который последним нанёс хит "пострадавшему" объекту. Отследить можно в каллбэке на хит. 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
Jekyll 92 Опубликовано 28 Февраля 2019 Поделиться Опубликовано 28 Февраля 2019 16 часов назад, naxac сказал: Отследить можно в каллбэке на хит Это понятно. Мне хотелось бы увидеть пример использования who_hit_name() помимо "single_player". В добром десятке модов искал пример, но ничего другого не нашел. Отсюда напрашивается вывод, что либо ничего больше разрабы не придумали для этой функции, либо так уж очень она "нужна" в целом... New Anomalies 1.1 ☢☢☢ "Смерть-лампа" ☢☢☢ Дисраптор Русификатор для игры Vendetta: Curse of Raven's Cry Ссылка на комментарий
naxac 2 447 Опубликовано 28 Февраля 2019 Поделиться Опубликовано 28 Февраля 2019 @Jekyll, да, не так уж она и нужна. В каллбэк на хит же передается тот, кто хит нанес. Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
Pug-Lover 2 Опубликовано 1 Марта 2019 Поделиться Опубликовано 1 Марта 2019 (изменено) Здравствуйте, написал вырвал из sgm мода простейший скрипт на починку пистолета, ружья и брони, засунул его в ui_main_menu.script туда, куда надо, а он совсем отказывается работать. Буду рад любой помощи. elseif db.actor~=nil and dik==DIK_keys.DIK_R then local pistol_in_slot=db.actor:item_in_slot(1) local rifle_in_slot=db.actor:item_in_slot(2) local outfit_in_slot=db.actor:item_in_slot(6) if outfit_in_slot~=nil then outfit_in_slot:set_condition(1.0) end if pistol_in_slot~=nil then pistol_in_slot:set_condition(1.0) end if rifle_in_slot~=nil then rifle_in_slot:set_condition(1.0) end P.S. При нажатии на кнопку не происходит не вылета, не зависаний, просто ничего Изменено 1 Марта 2019 пользователем Pug-Lover Добавлено Murarius, 1 Марта 2019 Перемещено. Ссылка на комментарий
Jekyll 92 Опубликовано 1 Марта 2019 Поделиться Опубликовано 1 Марта 2019 @Pug-Lover, это где это то самое "туда, куда надо"?:) Тут кусок кода от одной из моих аномалий - чинятся оружейные слоты и броник - применительно к твоему случаю - вклеить в ui_main_menu.script: Скрытый текст if dik==DIK_keys.DIK_R then local slot = {1,2,6} for n = 1,table.getn(slot) do local item = db.actor:item_in_slot(slot[n]) if item ~= nil then item:set_condition(1) end end end после строчки if keyboard_action == ui_events.WINDOW_KEY_PRESSED then Проще по-моему уже некуда. New Anomalies 1.1 ☢☢☢ "Смерть-лампа" ☢☢☢ Дисраптор Русификатор для игры Vendetta: Curse of Raven's Cry Ссылка на комментарий
Pug-Lover 2 Опубликовано 1 Марта 2019 Поделиться Опубликовано 1 Марта 2019 @Jekyll Спасибо, конечно, за код, работает, но не чинит броню. У меня одного так или у кого то тоже? Ссылка на комментарий
Jekyll 92 Опубликовано 1 Марта 2019 Поделиться Опубликовано 1 Марта 2019 (изменено) @Pug-Lover, у меня чинятся все три слота. Было бы неплохо глянуть на твой ui_main_menu.script. Изменено 1 Марта 2019 пользователем Jekyll New Anomalies 1.1 ☢☢☢ "Смерть-лампа" ☢☢☢ Дисраптор Русификатор для игры Vendetta: Curse of Raven's Cry Ссылка на комментарий
Pug-Lover 2 Опубликовано 1 Марта 2019 Поделиться Опубликовано 1 Марта 2019 @Jekyll, вот полный ui_main_menu.script: Скрытый текст --/amk_rel_1/ -- File: UI_MAIN_MENU.SCRIPT -- Description: Load Dialog for STALKER -- Created: 28.10.2004 -- Lasd edit: 18.01.2006 -- Copyright: 2004 GSC Game World -- Author: Serhiy Vynnychenko (narrator@gsc-game.kiev.ua) -- Version: 0.9 class "main_menu" (CUIScriptWnd) function main_menu:__init() super() self.mbox_mode = 0 self:InitControls() self:InitCallBacks() end function main_menu:__finalize() end 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) xml:InitStatic("fire_movie2", 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 ("ver. " .. mm:GetGSVer()) local amk_title = amk_ver.amk_title local amk_version = amk_ver.amk_version local amk_revision = amk_ver.amk_revision local debug_mode = "" _ver:SetText("Версия игры - " .. mm:GetGSVer() .. " " .. amk_title .. " " .. amk_version .. " " .. amk_revision) end function main_menu:Show(f) self.shniaga:SetVisibleMagnifier(f) end function main_menu:InitCallBacks() -- new game self:AddCallback("btn_novice", ui_events.BUTTON_CLICKED, self.OnButton_new_novice_game, self) self:AddCallback("btn_stalker", ui_events.BUTTON_CLICKED, self.OnButton_new_stalker_game, self) self:AddCallback("btn_veteran", ui_events.BUTTON_CLICKED, self.OnButton_new_veteran_game, self) self:AddCallback("btn_master", ui_events.BUTTON_CLICKED, self.OnButton_new_master_game, self) self:AddCallback("btn_spawn", ui_events.BUTTON_CLICKED, self.OnButton_load_spawn, self) -- options self:AddCallback("btn_options", ui_events.BUTTON_CLICKED, self.OnButton_options_clicked, self) -- load self:AddCallback("btn_load", ui_events.BUTTON_CLICKED, self.OnButton_load_clicked, self) -- save self:AddCallback("btn_save", ui_events.BUTTON_CLICKED, self.OnButton_save_clicked, self) -- multiplayer self:AddCallback("btn_multiplayer", ui_events.BUTTON_CLICKED, self.OnButton_multiplayer_clicked, self) -- quit self:AddCallback("btn_quit", ui_events.BUTTON_CLICKED, self.OnButton_quit_clicked, self) self:AddCallback("btn_quit_to_mm", ui_events.BUTTON_CLICKED, self.OnButton_disconnect_clicked, self) self:AddCallback("btn_ret", ui_events.BUTTON_CLICKED, self.OnButton_return_game, self) self:AddCallback("btn_lastsave", ui_events.BUTTON_CLICKED, self.OnButton_last_save, self) self:AddCallback("btn_credits", ui_events.BUTTON_CLICKED, self.OnButton_credits_clicked, self) -- message box self:AddCallback("msg_box", ui_events.MESSAGE_BOX_OK_CLICKED, self.OnMsgOk, self) self:AddCallback("msg_box", ui_events.MESSAGE_BOX_CANCEL_CLICKED, self.OnMsgCancel, self) self:AddCallback("msg_box", ui_events.MESSAGE_BOX_YES_CLICKED, self.OnMsgYes, self) self:AddCallback("msg_box", ui_events.MESSAGE_BOX_NO_CLICKED, self.OnMsgNo, self) self:AddCallback("msg_box", ui_events.MESSAGE_BOX_QUIT_GAME_CLICKED,self.OnMessageQuitGame, self) self:AddCallback("msg_box", ui_events.MESSAGE_BOX_QUIT_WIN_CLICKED, self.OnMessageQuitWin, self) --amk self:AddCallback("btn_amk", ui_events.BUTTON_CLICKED, self.amk_options, self) end function main_menu:OnMsgOk() self.mbox_mode = 0 end function main_menu:OnMsgCancel() self.mbox_mode = 0 end function main_menu:OnMsgYes() if self.mbox_mode == 1 then self:LoadLastSave() end self.mbox_mode = 0 end function main_menu:OnMsgNo() self.mbox_mode = 0 end function main_menu:LoadLastSave() local console = get_console() console:execute ("main_menu off") console:execute ("load_last_save") end function main_menu:OnButton_last_save() if (alife() == nil) then self:LoadLastSave (); return end self.mbox_mode = 1 self.message_box:Init ("message_box_confirm_load_save") self:GetHolder():start_stop_menu(self.message_box, true) end function main_menu:OnButton_credits_clicked() -- local console = get_console() -- console:execute("main_menu off") game.start_tutorial("credits_seq") end function main_menu:OnButton_quit_clicked() self.message_box:Init("message_box_quit_windows") self:GetHolder():start_stop_menu(self.message_box, true) end function main_menu:OnButton_disconnect_clicked() self.message_box:Init("message_box_quit_game") if (level.game_id() ~= 1) then self.message_box:SetText("ui_mm_disconnect_message") -- MultiPlayer else self.message_box:SetText("ui_mm_quit_game_message") -- SinglePlayer end self:GetHolder():start_stop_menu(self.message_box, true) end function main_menu:OnMessageQuitGame() local console = get_console() console:execute("disconnect") end function main_menu:OnMessageQuitWin() local console = get_console() console:execute("quit") end function main_menu:OnButton_return_game() local console = get_console() console:execute("main_menu off") end function main_menu:OnButton_new_novice_game() local console = get_console() console:execute("g_game_difficulty gd_novice") self:StartGame() end function main_menu:OnButton_new_stalker_game() local console = get_console() console:execute("g_game_difficulty gd_stalker") self:StartGame() end function main_menu:OnButton_new_veteran_game() local console = get_console() console:execute("g_game_difficulty gd_veteran") self:StartGame() end function main_menu:OnButton_new_master_game() local console = get_console() console:execute("g_game_difficulty gd_master") self:StartGame() end function main_menu:StartGame() local console = get_console() if (alife() ~= nil) then console:execute ("disconnect") end console:execute("start server(all/single/alife/new) client(localhost)") console:execute("main_menu off") end function main_menu:OnButton_load_spawn() if self.spawn_dlg == nil then self.spawn_dlg = ui_spawn_dialog.spawn_dialog() self.spawn_dlg.owner = self end self:GetHolder():start_stop_menu(self.spawn_dlg, true) self:GetHolder():start_stop_menu(self, true) --new self:Show(false) end function main_menu:OnButton_save_clicked() if self.save_dlg == nil then self.save_dlg = ui_save_dialog.save_dialog() self.save_dlg.owner = self end self:GetHolder():start_stop_menu(self.save_dlg, true) self:GetHolder():start_stop_menu(self, true) --new self:Show(false) end function main_menu:OnButton_options_clicked() if self.opt_dlg == nil then self.opt_dlg = ui_mm_opt_main.options_dialog() self.opt_dlg.owner = self end self.opt_dlg:UpdateControls() self:GetHolder():start_stop_menu(self.opt_dlg, true) self:GetHolder():start_stop_menu(self, true) --new self:Show(false) amk_mod.hud_update=true end function main_menu:OnButton_load_clicked() if self.load_dlg ==nil then self.load_dlg = ui_load_dialog.load_dialog() self.load_dlg.owner = self end self:GetHolder():start_stop_menu(self.load_dlg, true) self:GetHolder():start_stop_menu(self, true) --new self:Show(false) end function main_menu:OnButton_multiplayer_clicked() if self.mp_dlg ==nil then self.mp_dlg = ui_mp_main.mp_main() self.mp_dlg.owner = self end self.mp_dlg:UpdateControls() self:GetHolder():start_stop_menu(self.mp_dlg, true) self:GetHolder():start_stop_menu(self, true) --new self:Show(false) -- self.mp_dlg:OnBtn_Refresh() local console = get_console() console:execute ("check_for_updates 0") self.mp_dlg:OnRadio_NetChanged() end function main_menu:Dispatch(cmd, param) --virtual function if cmd == 2 then self:OnButton_multiplayer_clicked() end return true end function main_menu:OnKeyboard(dik, keyboard_action) --virtual function CUIScriptWnd.OnKeyboard(self,dik,keyboard_action) local bind = dik_to_bind(dik) local console = get_console() if keyboard_action == ui_events.WINDOW_KEY_PRESSED then if dik==DIK_keys.DIK_R then local slot = {1,2,6} for n = 1,table.getn(slot) do local item = db.actor:item_in_slot(slot[n]) if item ~= nil then item:set_condition(1) end end end if dik == DIK_keys.DIK_ESCAPE then if level.present() and (db.actor ~= nil) and db.actor:alive() then console:execute("main_menu off") end end elseif db.actor~=nil and dik==DIK_keys.DIK_F then dialogs.relocate_money(db.actor,math.random(10000,10000),"in") console:execute("main_menu off") elseif db.actor~=nil and dik==DIK_keys.DIK_C then local dir = db.actor:direction() local pos = db.actor:position() pos = pos:add(dir:mul(5)) db.actor:set_actor_position(pos) console:execute("main_menu off") elseif db.actor~=nil and dik==DIK_keys.DIK_E then db.actor.health = 1.0 db.actor.radiation = -1.0 db.actor.power = 1.0 db.actor.psy_health = 1.0 db.actor.bleeding = 1.0 console:execute("main_menu off") console:execute("Здоров_как_кровосос!") function bndgcheck() return first_speaker:object("bandage") ~= nil end alife():create("bandage",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) local alc = db.actor:object("bandage") if alc then db.actor:eat(alc) db.actor:eat(alc) db.actor:eat(alc) db.actor:eat(alc) db.actor:eat(alc) db.actor:eat(alc) db.actor:eat(alc) db.actor:eat(alc) db.actor:eat(alc) db.actor:eat(alc) function bndgdlt() local oItem = db.actor:object("bandage") if oItem then db.actor:drop_item(oItem) db.actor:drop_item(oItem) alife():release(alife():object(oItem:id()), true) end end end function foodcheck() return first_speaker:object("conserva") ~= nil end alife():create("conserva",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) local alc = db.actor:object("conserva") if alc then db.actor:eat(alc) db.actor:eat(alc) db.actor:eat(alc) db.actor:eat(alc) db.actor:eat(alc) db.actor:eat(alc) db.actor:eat(alc) db.actor:eat(alc) db.actor:eat(alc) db.actor:eat(alc) function fooddlt() local oItem = db.actor:object("conserva") if oItem then db.actor:drop_item(oItem) db.actor:drop_item(oItem) alife():release(alife():object(oItem:id()), true) end end end elseif db.actor~=nil and dik==DIK_keys.DIK_B then local a = vector() a.x = 0 a.y = 20 a.z = 0 db.actor:set_actor_position(a) console:execute("main_menu off") elseif db.actor~=nil and dik==DIK_keys.DIK_V then local dir = db.actor:direction() local pos = db.actor:position() pos = pos:add(dir:mul(0)) pos.y = pos.y + 5 db.actor:set_actor_position(pos) console:execute("main_menu off") -- раскоментируем и заоодно включим убранное спавн меню if dik == DIK_keys.DIK_S then -- self:OnButton_load_spawn() elseif dik == DIK_keys.DIK_Q then self:OnMessageQuitWin() elseif dik == DIK_keys.DIK_A then if amk.check_game() then self:amk_options() end end end return true end function main_menu:amk_options() -- если еще ни разу не вызывали, то обозначим наш новый скрипт if self.amk_options_dlg == nil then self.amk_options_dlg = ui_amk_options.amk_options() self.amk_options_dlg.owner = self end -- останавливаем родительский элемент, запускаем свой, но родителя показываем. self:GetHolder():start_stop_menu(self.amk_options_dlg, true) self:GetHolder():start_stop_menu(self, true) self:Show(false) end Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти