Svoboда 3 Опубликовано 23 Апреля 2009 Поделиться Опубликовано 23 Апреля 2009 Тема для обсуждения скриптов всего и всех в серии игр STALKER. Задавая вопрос (!): 1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего; 2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме); 3. Изучите информацию которая может вам помочь: Stalkerin. Там есть много хороших статей касательно данной темы.Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения. Справочное руководство по языку Lua 5.1https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ruСправочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены. Логика со вступлением и четырьмя частями: ВступлениеЧасть перваяЧасть втораяЧасть третьяЧасть четвертая. Smart_terrain (в простонароде - гулаг)Интересный способ настроики логики для гулаговСкриптовая часть игровой логики 4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос; 5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе; 6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода; 7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины. 8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ. 9. И помните: «Правильно заданный вопрос – половина ответа». Какие вопросы следует задавать, а какие нет... Задавайте вопросы, которые касаются непосредственно скриптов и их работы, т.е. Вы что-то делаете, а у Вас что-то не получается, при этом у Вас на руках должен быть хотя бы какой-то код, свидетельствующий о Вашей причастности к вопросу. Вопросы которые будут удалятся, следовательно их задавать не нужно:-- Где находится та или иная функция? Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;-- Как сделать что-то/то-то? С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов? В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос. И последнее: очень рекомендовано к прочтению Правила форума 1 2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/
Mad_Vad 176 Опубликовано 22 Февраля 2016 Поделиться Опубликовано 22 Февраля 2016 из amk.script (1.4.1) связанная пара name/id для универсальности... пробуй... --удаляем предмет из инвентаря по имени function remove_item_from_inventory_by_name(remove_item_name,npc) return remove_item_from_inventory(npc:object(remove_item_name),npc) end --удаляем предмет из инвентаря по id function remove_item_from_inventory(remove_item,npc) if npc==nil then npc=db.actor end -- если npc не указан, будет работать с инвентарем ГГ if remove_item~=nil then alife():release(alife():object(remove_item:id()), true) return true end return false end 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/352/#findComment-995176
Kondr48 314 Опубликовано 24 Февраля 2016 Поделиться Опубликовано 24 Февраля 2016 Есть ли возможность при спавне предмета в инвентарь НПС сразу получить game_object предмета? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/352/#findComment-995535
Dennis_Chikin 3 665 Опубликовано 24 Февраля 2016 Поделиться Опубликовано 24 Февраля 2016 (изменено) Что значит - "сразу" ? В онлайн любой объект входит тогда, когда до него "дойдут руки". Делайте отложенную проверку, типа local t_outfit_cnd function set_item_condition( t ) local t, n = {}, 0 local item for i, v in pairs( t_outfit_cnd ) do item = lobj_by_id( v[1] ) if item then item:set_condition( v[2] / 100 ) else n = n + 1; t[n] = v end end if n ~= 0 then t_outfit_cnd = t else t_outfit_cnd = false bind_stalker.task_del( "death_manager.set_item_condition", 1000 ) end end ... if t_outfit_cnd then t_outfit_cnd[#t_outfit_cnd + 1] = { obj.id, math_random( cnd_min, cnd_max ) } else t_outfit_cnd = { { obj.id, math_random( cnd_min, cnd_max ) } } bind_stalker.task_add( "death_manager.set_item_condition", 1000, set_item_condition ) end где task_add()/task_del() - добавление/удаление функции в апдейт Изменено 24 Февраля 2016 пользователем Dennis_Chikin Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/352/#findComment-995545
Kondr48 314 Опубликовано 24 Февраля 2016 Поделиться Опубликовано 24 Февраля 2016 Сразу - не имеется ввиду в тот же момент на апдейте, просто, допустим, при спавне в таблицу вносится запись вида "секция_предмета_ид_предмета" = game_object, вот такой спавн меня интересует, как это можно сделать?) Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/352/#findComment-995562
kmsk 2 Опубликовано 24 Февраля 2016 Поделиться Опубликовано 24 Февраля 2016 Возможно ли отловить разряжание оружия в рюкзаке ? спасибо. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/352/#findComment-995580
dsh 3 824 Опубликовано 24 Февраля 2016 Поделиться Опубликовано 24 Февраля 2016 @kmsk, на вскидку, в качестве идеи. Отлавливаем появление патронов в инвентаре в on_take. Пробегаемся по инвентарю и ищем стволы, у которых с прошлого раза не стало патронов. Не самое оптимальное решение, но это всего лишь идея. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/352/#findComment-995635
Stalker_Anom 0 Опубликовано 25 Февраля 2016 Поделиться Опубликовано 25 Февраля 2016 Скажите почему когда я добавил динамические аномалии, то при старте игры сильно виснет? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/352/#findComment-995790
losiara 13 Опубликовано 25 Февраля 2016 Поделиться Опубликовано 25 Февраля 2016 (изменено) Добрый день всем!!! Прошу помощи по вопросу оказания помощи раненым сталкерам чужеродной группировки например бандитам, военным и т. д. тем, кто в оригинале игры являются врагами ГГ. Сделал следующее: файл xr_wounded. script Функция:function action_wounded:execute ()action_base.execute (self)wound_manager = self.a.wound_managerwound_manager_victim = xr_logic.pstor_retrieve(self.object, "wounded_victim")local victim = nilif wound_manager_victim == "actor" thenvictim = db.actorelseif tostring(wound_manager_victim) == "nil" thenvictim = nilelselocal sim = alife()if sim thenvictim = sim:story_object(victim)endend--if self.object:relation(db.actor) == game_object.enemy then--self.object:disable_talk()--elseself.object:enable_talk()end.....закоментил эти строки!!! Файл dialogs.scripts: Функция:function transfer_medkit(first_speaker, second_speaker)if first_speaker:object("medkit") ~= nil thendialogs.relocate_item_section(second_speaker, "medkit", "out")elseif first_speaker:object("medkit_army") ~= nil thendialogs.relocate_item_section(second_speaker, "medkit_army", "out")elsedialogs.relocate_item_section(second_speaker, "medkit_scientic", "out")end--' Тут надо анлочить аптечку для использования.xr_wounded.unlock_medkit(second_speaker)if second_speaker:relation(first_speaker) ~= game_object.enemy thensecond_speaker:set_relation(game_object.friend, first_speaker)endfirst_speaker:change_character_reputation(10);endИзменил часть кода на:if second_speaker:relation(first_speaker) == game_object.enemy thensecond_speaker:set_relation(game_object.friend, first_speaker)first_speaker:set_relation(game_object.friend, second_speaker)endfirst_speaker:change_character_reputation(10);end Кроме этого, добавил всем НПС в character_desc_simulation и другие файлы этого типа в их профиль диалоги по типу:dm_help_wounded_medkit_dialoghello_dialogdm_hello_dialog Однако, не смотря на то, что надпись на юзание появляется, при попытке этого действа следует вылет с аргументом: не может найти диалог "dm_hello_dialog". Как можно поправить сие??? Игра версии 1.0004, оригинал мод с использованием файлов АМК (amk.scripts и amk_mod.scripts). Заранее СПАСИБО!!! Изменено 25 Февраля 2016 пользователем losiara Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/352/#findComment-995791
FonSwong 33 Опубликовано 25 Февраля 2016 Поделиться Опубликовано 25 Февраля 2016 Как узнать/установить позицию курсора? В оригинале есть в начале действо- когда ГГ показывают ПДА, посмотрел в коде- вроде как в движке всё мутится Так и не понял как с курсором работать, мне хотя бы получение координат его нужно, и ещё желательно сделать в какой-то момент прозрачным, а потом снова вернуть ему картинку, это возможно? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/352/#findComment-995811
Space.Marine 466 Опубликовано 25 Февраля 2016 Поделиться Опубликовано 25 Февраля 2016 не может найти диалог "dm_hello_dialog" Автор: Моддер Как лечить раненных НПС-враговСложность: оч. легкоСовместимость с модами: легко совместимоМногие люди в своих модификациях хотят добавить возможность лечить раненных врагов, как, например, в Солянке. Я тоже однажды заинтересовался этим вопросом и, не найдя на него ответа в интернете, занялся решением проблемы сам. В итоге мне это удалось и теперь выкладываю плоды своих стараний на просторы интернета .Скрыть ИнструкцииЗапрет диалога с раненными противниками находится в файле xr_wounded.script, и выглядит так (я снабдил его комментариями, если вы не сильно шарите в скриптах):if self.object:relation(db.actor) == game_object.enemy then --если отношение НПС к ГГ = отношению к врагумself.object:disable_talk() --блокировать диалогиelse --иначеself.object:enable_talk() --разрешить диалогend --конец условия (if)Дабы позволить ГГ говорить с врагами (только раненными) достаточно удалить лишнее и оставить всего одну строку:self.object:enable_talk()Но! Если ГГ попробует обратиться к раненным представителям бандитов, монолитовцев, наёмников, зомби (возможно), военных или противников на Арене - скорее всего произойдёт Фатал Еррор с логом на отсутствие подходящей фразы для диалога (в оригинальной игре с вероятностью 99%). Так вот, лично для себя я нашёл простое решение, которое подходило и по концепции моего мода - запретить диалог с данными группировками. Вот таким макаром:local comm = self.object:character_community() --переменной обозначил "понятие" группировки обьекта (НПС)if comm == "zombied" or --если НПС - зомби, илиcomm == "bandit" or --НПС - бандит, илиcomm == "monolith" or --НПС - монолитовец, илиcomm == "arena_enemy" or --НПС - боец арены, илиcomm == "killer" or --НПС - наёмник, илиcomm == "military" then --НПС - вояка, тогдаself.object:disable_talk() --запретить диалогelse -- иначеself.object:enable_talk() --разрешить диалогend -- The End!просто заменить изначальные строки этими и теперь ГГ сможет лечить врагов одиночек, долговцев, свободовцев и учёных.Но есть ещё один момент. При лечении врагов, если всё сделать как было написано будет ещё одна проблемка - они так и останутся врагами после лечения и будут дальше атаковать ГГ.Разумно было бы сделать НПС если не другом, то по крайней мере нейтралом. Для этого необходимо в файле dialogs.script кусок скриптаif second_speaker:relation(first_speaker) ~= game_object.enemy thensecond_speaker:set_relation(game_object.friend, first_speaker)endfirst_speaker:change_character_reputation(10);endзаменить наif second_speaker:relation(first_speaker) == game_object.enemy thensecond_speaker:set_relation(game_object.friend, first_speaker)first_speaker:set_relation(game_object.friend, second_speaker)endfirst_speaker:change_character_reputation(10);endВсё! Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/352/#findComment-995817
losiara 13 Опубликовано 25 Февраля 2016 Поделиться Опубликовано 25 Февраля 2016 (изменено) Space.Marine Я этот тутор видел, он не соот. запросу, там нельзя лечить врагов таких как бандит или военный... только раненых дружелюбных НПС (из оригинала). Я уже решил проблему внимательнее покопавшись в инете, вот готовые скрипты: ---------------------------------------------------------------------------------------------------------------------- -- Схема раненного-- автор: Диденко Руслан (Stohe)-- TODO:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Evaluators----------------------------------------------------------------------------------------------------------------------class "evaluator_wound" (property_evaluator)function evaluator_wound:__init(name, storage) super(nil, name)self.a = storageendfunction evaluator_wound:evaluate ()if self.a.wounded_set ~= true then return false end--' self.a.wound_manager:update()if self.mgr == nil thenself.mgr = self.object:motivation_action_manager()endif self.object:critically_wounded() == true thenreturn falseendif self.mgr:evaluator(stalker_ids.property_enemy):evaluate() andxr_logic.pstor_retrieve(self.object, "wounded_fight") == "true"thenreturn falseendreturn tostring(xr_logic.pstor_retrieve(self.object, "wounded_state")) ~= "nil"endclass "evaluator_can_fight" (property_evaluator)function evaluator_can_fight:__init(name, storage) super(nil, name)self.a = storageendfunction evaluator_can_fight:evaluate ()if self.object:critically_wounded() == true thenreturn trueendreturn xr_logic.pstor_retrieve(self.object, "wounded_fight") ~= "false"end------------------------------------------------------------------------------------------------------------------------Actions----------------------------------------------------------------------------------------------------------------------class "action_wounded" (action_base)function action_wounded:__init(name, storage) super(nil, name)self.a = storageendfunction action_wounded:initialize ()action_base.initialize (self)self.object:set_desired_position()self.object:set_desired_direction()self.sound = "nil"if self.a.help_start_dialog thenself.object:set_start_dialog(self.a.help_start_dialog)endself.object:wounded(true)endfunction action_wounded:execute ()action_base.execute (self)wound_manager = self.a.wound_managerwound_manager_victim = xr_logic.pstor_retrieve(self.object, "wounded_victim")local victim = nilif wound_manager_victim == "actor" thenvictim = db.actorelseif tostring(wound_manager_victim) == "nil" thenvictim = nilelselocal sim = alife()if sim thenvictim = sim:story_object(victim)endendif self.object:character_community()~="monolith" and -- кроме монолитаself.object:character_community()~="zombied" then -- кроме зомбированных, они не лечатся и друзьями не становятся!!!self.object:enable_talk()elseself.object:disable_talk()end--[[ if self.object:relation(db.actor) == game_object.enemy then -- автор скрипта закоментил эту секцию.self.object:disable_talk()elseself.object:enable_talk()end]]wound_manager_state = xr_logic.pstor_retrieve(self.object, "wounded_state")wound_manager_sound = xr_logic.pstor_retrieve(self.object, "wounded_sound")local synsound = nilif wound_manager_state == "true" thenlocal h = hit()h.power = 0h.direction = self.object:direction()h.bone = "bip01_spine"h.draftsman = db.actorh.impulse = 0h.type = hit.woundself.object:hit(h)else-- является ли текущий звук синхронным для текущего стейтаfor k,v in pairs(self.a.syndata) doif v.state == wound_manager_state andv.sound == wound_manager_soundthensynsound = wound_manager_soundendend--' жрание аптечек и прочей срани.--' Использовать можно только если нам можно сейчас есть аптечку.if self.a.use_medkit == true thenwound_manager:eat_medkit()endlocal emerg = nilif wound_manager_state == "psy_shoot" thenemerg = {animation_nout = true}endstate_mgr.set_state(self.object, wound_manager_state, nil, nil, {look_object = victim}, emerg, synsound)endif synsound == nil then-- нужно отыграть фоновыйif self.sound ~= wound_manager_sound thenself.sound = wound_manager_soundif self.sound == "nil" thenxr_sound.set_sound(self.object, nil)elsexr_sound.set_sound(self.object, wound_manager_sound)endendelse-- нужно зарубить фоновыйif self.sound ~= nil thenself.sound = "nil"xr_sound.set_sound(self.object, nil)endendlocal tt = db.storage[self.object:id()]if tt.active_scheme and not self.object:is_talking() thenif db.actor thenif xr_logic.try_switch_to_another_section(self.object, tt[tt.active_scheme], db.actor) thenreturnendendendendfunction action_wounded:finalize ()action_base.finalize (self)self.object:disable_talk()xr_sound.set_sound(self.object, nil)self.object:wounded(false)end------------------------------------------------------------------------------------------------------------------------ Class wound_manager----------------------------------------------------------------------------------------------------------------------class "Cwound_manager"function Cwound_manager:__init(npc, storage)self.npc = npcself.a = storageself.can_use_medkit = falseendfunction Cwound_manager:update()hp = 100*self.npc.healthpsy = 100*self.npc.psy_health-- printf("PSY [%s] HP [%s]", psy, hp)self.state, self.sound = self:process_psy_wound(psy)if self.state == "nil" andself.sound == "nil"then-- проверяем на обычную раненостьself.fight = self:process_fight(hp)self.victim = self:process_victim(hp)self.state, self.sound = self:process_hp_wound(hp)else-- устанавливаем пси раненостьself.fight = "false"self.cover = "false"self.victim = "nil"end-- printf("f[%s]c[%s]v[%s]", utils.to_str(self.fight), utils.to_str(self.cover), utils.to_str(self.victim))-- printf("st[%s]so[%s]", utils.to_str(self.state), utils.to_str(self.sound))xr_logic.pstor_store(self.npc, "wounded_state", self.state)xr_logic.pstor_store(self.npc, "wounded_sound", self.sound)xr_logic.pstor_store(self.npc, "wounded_fight", self.fight)xr_logic.pstor_store(self.npc, "wounded_victim", self.victim)endfunction Cwound_manager:unlock_medkit()self.can_use_medkit = trueendfunction Cwound_manager:eat_medkit()if self.can_use_medkit == true thenif self.npc:object("medkit") ~= nil thenself.npc:eat(self.npc:object("medkit"))elseif self.npc:object("medkit_army") ~= nil thenself.npc:eat(self.npc:object("medkit_army"))elseif self.npc:object("medkit_scientic") ~= nil thenself.npc:eat(self.npc:object("medkit_scientic"))endendself.can_use_medkit = falseself:hit_callback()endfunction Cwound_manager:process_fight(hp)local keykey = self:get_key_from_distance(self.a.hp_fight, hp)if key ~= nil thenif self.a.hp_fight[key].state thenreturn tostring(xr_logic.pick_section_from_condlist(db.actor, self.npc, self.a.hp_fight[key].state))endendreturn "true"endfunction Cwound_manager:process_victim(hp)local keykey = self:get_key_from_distance(self.a.hp_victim, hp)if key ~= nil thenif self.a.hp_victim[key].state thenreturn tostring(xr_logic.pick_section_from_condlist(db.actor, self.npc, self.a.hp_victim[key].state))endendreturn "nil"endfunction Cwound_manager:process_hp_wound(hp)local keykey = self:get_key_from_distance(self.a.hp_state, hp)if key ~= nil thenlocal r1,r2if self.npc:see(db.actor) thenif self.a.hp_state_see[key].state thenr1 = xr_logic.pick_section_from_condlist(db.actor, self.npc, self.a.hp_state_see[key].state)endif self.a.hp_state_see[key].sound thenr2 = xr_logic.pick_section_from_condlist(db.actor, self.npc, self.a.hp_state_see[key].sound)endelseif self.a.hp_state[key].state thenr1 = xr_logic.pick_section_from_condlist(db.actor, self.npc, self.a.hp_state[key].state)endif self.a.hp_state[key].sound thenr2 = xr_logic.pick_section_from_condlist(db.actor, self.npc, self.a.hp_state[key].sound)endendreturn tostring(r1),tostring(r2)endreturn "nil","nil"endfunction Cwound_manager:process_psy_wound(hp)local keykey = self:get_key_from_distance(self.a.psy_state, hp)if key ~= nil thenlocal r1,r2if self.a.psy_state[key].state thenr1 = xr_logic.pick_section_from_condlist(db.actor, self.npc, self.a.psy_state[key].state)endif self.a.psy_state[key].sound thenr2 = xr_logic.pick_section_from_condlist(db.actor, self.npc, self.a.psy_state[key].sound)endreturn tostring(r1),tostring(r2)endreturn "nil","nil"endfunction Cwound_manager:get_key_from_distance(t, hp)local keyfor k,v in pairs(t) doif v.dist >= hp thenkey = kelsereturn keyendendreturn keyendfunction Cwound_manager:hit_callback()if self.npc:alive() == false thenreturnendif self.npc:critically_wounded() == true thenreturnendself:update()end------------------------------------------------------------------------------------------------------------------------ binder----------------------------------------------------------------------------------------------------------------------function add_to_binder (object, ini, scheme, section, st)local operators = {}local properties = {}properties["wounded"] = xr_evaluators_id.sidor_wounded_baseproperties["can_fight"] = xr_evaluators_id.sidor_wounded_base + 1operators["wounded"] = xr_actions_id.sidor_act_wounded_base + 0local manager = object:motivation_action_manager ()manager:add_evaluator (properties["wounded"], this.evaluator_wound("wounded", st))manager:add_evaluator (properties["can_fight"], this.evaluator_can_fight("can_fight", st))local action = this.action_wounded("wounded_action", st)action:add_precondition (world_property(stalker_ids.property_alive, true))action:add_precondition (world_property(properties["wounded"], true))action:add_effect (world_property(properties["wounded"], false))action:add_effect (world_property(stalker_ids.property_enemy, false))action:add_effect (world_property(properties["can_fight"], true))manager:add_action (operators["wounded"], action)action = manager:action (xr_actions_id.alife)action:add_precondition (world_property(properties["wounded"], false))action = manager:action (stalker_ids.action_gather_items)action:add_precondition (world_property(properties["wounded"], false))action = manager:action (stalker_ids.action_combat_planner)action:add_precondition (world_property(properties["can_fight"], true))action = manager:action (stalker_ids.action_danger_planner)action:add_precondition (world_property(properties["can_fight"], true))action = manager:action (stalker_ids.action_anomaly_planner)action:add_precondition (world_property(properties["can_fight"], true))end-------------- Вызывается только в начале на чтении логики, создает экшены, эвалуаторы и производит-- первичную настройку.function set_wounded(npc, ini, scheme, section)local st = xr_logic.assign_storage_and_bind(npc, ini, scheme, section)st.wound_manager = Cwound_manager(npc, st)end-- Вызывается на переключении на новую секцию. Производит вычитывание настроек из текущей секции.function reset_wounded(npc, scheme, st, section)local wounded_sectionif scheme == nil or scheme == "nil" thenwounded_section = utils.cfg_get_string(st.ini, st.section_logic, "wounded", npc, false, "")elsewounded_section = utils.cfg_get_string(st.ini, section, "wounded", npc, false, "")endinit_wounded(npc, st.ini, wounded_section, st.wounded, scheme)st.wounded.wound_manager:hit_callback()end-- Функция чтения настроек. В нее передается секция, откуда их нужно читать.local wounded_by_state = {[0] = "wounded_heavy",[1] = "wounded_heavy_2",[2] = "wounded_heavy_3"}function init_wounded(npc, ini, section, st, scheme)printf("WOUNDED SECTION [%s][%s]", tostring(section), tostring(scheme))if tostring(section) == st.wounded_section andtostring(section) ~= "nil"thenreturnendst.wounded_section = utils.to_str(section)local def = {}local npc_community = npc:character_community()if npc_community == "monolith" thenlocal state = wounded_by_state[math.mod(npc:id(), 3)]def.hp_state = "10|"..state.."@nil"def.hp_state_see = "10|"..state.."@nil"def.psy_state = ""def.hp_victim = "10|nil"def.hp_cover = "10|false"def.hp_fight = "10|false"def.syndata = ""def.help_dialog = nildef.help_start_dialog = nildef.use_medkit = falseelseif npc_community == "zombied" thendef.hp_state = "40|wounded_zombie@nil"def.hp_state_see = "40|wounded_zombie@nil"def.psy_state = ""def.hp_victim = "40|nil"def.hp_cover = "40|false"def.hp_fight = "40|false"def.syndata = ""def.help_dialog = nildef.help_start_dialog = nildef.use_medkit = falseelselocal state = wounded_by_state[math.mod(npc:id(), 3)]def.hp_state = "10|"..state.."@help_heavy"def.hp_state_see = "10|"..state.."@help_heavy"def.psy_state = "50|{=best_pistol}psy_armed,psy_pain@wounded_psy|20|{=best_pistol}psy_shoot,psy_pain@{=best_pistol}wounded_psy_shoot,wounded_psy"def.hp_victim = "10|nil"def.hp_cover = "10|false"def.hp_fight = "10|false"def.syndata = ""def.help_dialog = "dm_help_wounded_medkit_dialog"def.help_start_dialog = nildef.use_medkit = trueendif tostring(section) == "nil" then-- Загружаем дефолты!st.hp_state = xr_meet.parse_data(npc, def.hp_state)st.hp_state_see = xr_meet.parse_data(npc, def.hp_state_see)st.psy_state = xr_meet.parse_data(npc, def.psy_state)st.hp_victim = xr_meet.parse_data(npc, def.hp_victim)st.hp_cover = xr_meet.parse_data(npc, def.hp_cover)st.hp_fight = xr_meet.parse_data(npc, def.hp_fight)st.syndata = xr_meet.parse_syn_data(npc, def.syndata)st.help_dialog = def.help_dialogst.help_start_dialog = nilst.use_medkit = def.use_medkitelsest.hp_state = xr_meet.parse_data(npc, utils.cfg_get_string(ini, section, "hp_state", npc, false, "", def.hp_state))st.hp_state_see = xr_meet.parse_data(npc, utils.cfg_get_string(ini, section, "hp_state_see", npc, false, "", def.hp_state_see))st.psy_state = xr_meet.parse_data(npc, utils.cfg_get_string(ini, section, "psy_state", npc, false, "", def.psy_state))st.hp_victim = xr_meet.parse_data(npc, utils.cfg_get_string(ini, section, "hp_victim", npc, false, "", def.hp_victim))st.hp_cover = xr_meet.parse_data(npc, utils.cfg_get_string(ini, section, "hp_cover", npc, false, "", def.hp_cover))st.hp_fight = xr_meet.parse_data(npc, utils.cfg_get_string(ini, section, "hp_fight", npc, false, "", def.hp_fight))st.syndata = xr_meet.parse_syn_data(npc, utils.cfg_get_string(ini, section, "syndata", npc, false, "", def.syndata))st.help_dialog = utils.cfg_get_string(ini, section, "help_dialog", npc, false, "", def.help_dialog)st.help_start_dialog = utils.cfg_get_string(ini, section, "help_start_dialog", npc, false, "", nil)st.use_medkit = utils.cfg_get_bool(ini, section, "use_medkit", npc, false, def.use_medkit)end-- флажок, что функция хотя бы раз вызываласьst.wounded_set = trueendfunction unlock_medkit(npc)if db.storage[npc:id()].wounded ~= nil thendb.storage[npc:id()].wounded.wound_manager:unlock_medkit()endendfunction is_wounded(npc)if db.storage[npc:id()].wounded ~= nil then--' if npc:object("medkit") ~= nil and--' db.storage[npc:id()].wounded.wound_manager.can_use_medkit == true--' then--' return false--' endreturn tostring(db.storage[npc:id()].wounded.wound_manager.state) ~= "nil"endreturn falseendfunction hit_callback(npc_id)if db.storage[npc_id].wounded ~= nil thendb.storage[npc_id].wounded.wound_manager:hit_callback()endendfunction is_heavy_wounded_by_id(npc_id)if db.storage[npc_id].wounded ~= nil thenreturn tostring(db.storage[npc_id].wounded.wound_manager.state) ~= "nil"endreturn falseendfunction is_psy_wounded_by_id(npc_id)if db.storage[npc_id].wounded ~= nil thenreturn db.storage[npc_id].wounded.wound_manager.state == "psy_pain" ordb.storage[npc_id].wounded.wound_manager.state == "psy_armed" ordb.storage[npc_id].wounded.wound_manager.state == "psy_shoot" ordb.storage[npc_id].wounded.wound_manager.state == "psycho_pain" ordb.storage[npc_id].wounded.wound_manager.state == "psycho_shoot"endreturn falseend-- Помощь раненомуfunction help_wounded(npc) -- скрипт добавлен автором!!!local sndif npc:name()=="esc_vagon_wounded" or npc:name()=="val_escort_bandit_halfdead" then return endsnd = xr_sound.get_safe_sound_object("characters_voice\\human_01\\newbie\\help\\wounded_thanx\\thanx_"..math.random(1,3))snd:play_no_feedback(npc, sound_object.s3d, 0, npc:position(), 1.0)--amk.start_timer("healing_enemies",math_random(20,30),amk.pack_array_to_string( {npc:id(), npc:character_community()} ))--amk.start_timer("healing_enemies",math_random(20,30), {npc:id(), npc:character_community()} )npc:set_character_community("stalker", 0, 0)npc:set_relation(game_object.friend, db.actor)end function allow_break_dialog(first_speaker, second_speaker, id)if second_speaker:profile_name() == "osoznanie" thenreturn falseendreturn trueendfunction break_dialog(first_speaker, second_speaker, id)first_speaker:stop_talk()second_speaker:stop_talk()endfunction disable_talk_self(first_speaker, second_speaker)first_speaker:disable_talk()endfunction disable_talk_victim(first_speaker, second_speaker)second_speaker:disable_talk()endfunction punch(first_speaker, second_speaker)--abort("KICK ASS !!!!")--xr_punch.punch[first_speaker:id()] = second_speakerdb.storage[second_speaker:id()].punch.enabled = trueendfunction get_money_then_leave(first_speaker, second_speaker)db.storage[first_speaker:id()].meet.enabled = falsedb.storage[first_speaker:id()].robber.enabled = trueendfunction is_wounded(first_speaker, second_speaker)if db.storage[first_speaker:id()].wounded ~= nil anddb.storage[first_speaker:id()].wounded.wound_manager.can_use_medkit == truethenreturn falseendreturn xr_wounded.is_wounded(first_speaker)endfunction is_opp_wounded(first_speaker, second_speaker, dialog_id)if db.storage[second_speaker:id()].wounded ~= nil anddb.storage[second_speaker:id()].wounded.wound_manager.can_use_medkit == truethenreturn falseendreturn xr_wounded.is_wounded(second_speaker)endfunction is_not_wounded(first_speaker, second_speaker)return not this.is_wounded(first_speaker, second_speaker)endfunction actor_have_medkit(first_speaker, second_speaker)return first_speaker:object("medkit") ~= nil orfirst_speaker:object("medkit_army") ~= nil orfirst_speaker:object("medkit_scientic") ~= nilendfunction actor_have_bandage(first_speaker, second_speaker)return first_speaker:object("bandage") ~= nilendfunction transfer_medkit(first_speaker, second_speaker)if first_speaker:object("medkit") ~= nil thendialogs.relocate_item_section(second_speaker, "medkit", "out")elseif first_speaker:object("medkit_army") ~= nil thendialogs.relocate_item_section(second_speaker, "medkit_army", "out")elsedialogs.relocate_item_section(second_speaker, "medkit_scientic", "out")end--' Тут надо анлочить аптечку для использования.xr_wounded.unlock_medkit(second_speaker)if second_speaker:relation(first_speaker) ~= game_object.enemy thensecond_speaker:set_relation(game_object.friend, first_speaker)first_speaker:change_character_reputation(10)elsefirst_speaker:change_character_reputation(-10)xr_wounded.help_wounded(second_speaker)endendfunction transfer_bandage(first_speaker, second_speaker)dialogs.relocate_item_section(second_speaker, "bandage", "out")second_speaker:set_relation(game_object.friend, first_speaker)endfunction kill_yourself(npc, actor)npc:kill(actor)end--' Obsolete, do not use!!!function relocate_item(victim, obj, type)if db.actor and victim thenif type == "in" thenvictim:transfer_item(obj, db.actor)elseif type == "out" thendb.actor:transfer_item(obj, victim)end--'news_manager.relocate_item(db.actor, type, obj)endend--' Use this function instead.function relocate_item_section(victim, section, type)if db.actor and victim thenif type == "in" then--' Трансферить нужно только квестовые предметы.if quest_section[section] == true andvictim:object(section) ~= nilthenvictim:transfer_item(victim:object(section), db.actor)elsealife():create(section,db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())endelseif type == "out" thendb.actor:transfer_item(db.actor:object(section), victim)endnews_manager.relocate_item(db.actor, type, section)endendfunction relocate_money(victim, num, type)if db.actor and victim thenif type == "in" thendb.actor:give_money(num)game_stats.money_quest_update (num)elseif type == "out" thendb.actor:transfer_money(num, victim)game_stats.money_quest_update (-num)endnews_manager.relocate_money(db.actor, type, num)endend--'-----------------------------------------------------------------------------------' DIALOG ALLOWED--'---------------------------------------------------------------------------------function dialog_allowed(object, victim, id)if id ~= nil then-- printf("*DIALOGS*: dialog_allowed: %s", id)else-- printf("*DIALOGS*: dialog_allowed: nil")endif db.storage[victim:id()].actor_dialogs ~= nil thenfor k,v in pairs(db.storage[victim:id()].actor_dialogs) doif v == id then return true endendendreturn falseendfunction dialog_not_disable(object, victim, id)if id ~= nil then-- printf("*DIALOGS*: dialog_disable:%s", id)else-- printf("*DIALOGS*: dialog_disable:nil")endif db.storage[victim:id()].actor_disable ~= nil thenfor k,v in pairs(db.storage[victim:id()].actor_disable) doif v == id then return false endendendreturn trueendfunction allow_wounded_dialog(object, victim, id)if db.storage[victim:id()].wounded == nil thenreturn falseendif db.storage[victim:id()].wounded.help_dialog == id thenreturn trueendreturn falseend------------------------------------------------------------------------------------- LEVELS-----------------------------------------------------------------------------------function level_escape(first_speaker, second_speaker)return level.name() == "l01_escape"endfunction level_garbage(first_speaker, second_speaker)return level.name() == "l02_garbage"endfunction level_agroprom(first_speaker, second_speaker)return level.name() == "l03_agroprom_ai2" or level.name() == "l03_agroprom"end------------------------------------------------------------------------------------- Relation functions-----------------------------------------------------------------------------------function is_friend(first_speaker, second_speaker)return first_speaker:relation(second_speaker) == game_object.friendendfunction is_not_friend(first_speaker, second_speaker)return not is_friend(first_speaker, second_speaker)endfunction become_friend(first_speaker, second_speaker)first_speaker:set_relation(game_object.friend, second_speaker)end------------------------------------------------------------------------------------- Community-----------------------------------------------------------------------------------function actor_in_dolg(actor, npc)if db.actor thenreturn db.actor:character_community() == "actor_dolg"endreturn falseendfunction actor_not_in_dolg(actor, npc)return not actor_in_dolg(actor, npc)endfunction actor_set_dolg(actor, npc)printf("ACTOR NOW IN [DOLG] COMMUNITY")if db.actor thendb.actor:set_character_community("actor_dolg", 0, 0)endreturn trueendfunction actor_clear_community(actor, npc)printf("ACTOR NOW IN [NEUTRAL] COMMUNITY")if db.actor thendb.actor:set_character_community("actor", 0, 0)endreturn trueend------------------------------------------------------------------------------------- Money functions-----------------------------------------------------------------------------------function has_2000_money(first_speaker, second_speaker)return first_speaker:money() >= 2000end------------------------------------------------------------------------------------- TRADE-------------------------------------------------------------------------------------' Инициализация торговлиfunction trade_init(seller, buyer)db.storage[seller:id()].meet.begin_wait_to_see.begin = time_global()/1000xr_position.setPosition(db.storage[seller:id()].meet.Seller,db.storage[seller:id()].meet.Seller:level_vertex_id())db.storage[seller:id()].meet.Buyer = buyerendfunction want_trade(seller, buyer)if seller:relation(buyer) == game_object.friend orseller:relation(buyer) == game_object.neutralthenreturn trueelsereturn falseendendfunction dont_want_trade(seller, buyer)return not want_trade(seller,buyer)end Возможно кому пригодится!!! Изменено 25 Февраля 2016 пользователем losiara Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/352/#findComment-995819
Stalker_Anom 0 Опубликовано 25 Февраля 2016 Поделиться Опубликовано 25 Февраля 2016 Как через скрипт привязать к актёру партиклы. Но так что-бы они например включались через час, а потом отключались. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/352/#findComment-995821
naxac 2 578 Опубликовано 25 Февраля 2016 Поделиться Опубликовано 25 Февраля 2016 @Stalker_Anom, local p = particles_object("партикл") p:play_at_pos... Читай "справочник по функциям и классам". включались через час, а потом отключалисьМожно сделать через таймеры, например. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/352/#findComment-995856
CRAZY_STALKER666 36 Опубликовано 26 Февраля 2016 Поделиться Опубликовано 26 Февраля 2016 (изменено) Добрый день. Такая проблема. Есть описанный класс дешифратора( на GUI-элементах) class "Deshifrator" (CUIScriptWnd)function Deshifrator:__init() super()self:InitControls()self:InitCallBacks()endfunction Deshifrator:__finalize()endfunction Deshifrator:InitControls()local xml = CScriptXmlInit()self:Init(0,0,1024,768)xml:ParseFile("Deshifrator.xml")self.frame1 = xml:InitFrame("frame1", self)self.edit1 = xml:InitEditBox("frame1:edit1", self.frame1)self:Register(xml:Init3tButton("frame1:button1", self.frame1), "button1")self:Register(xml:Init3tButton("frame1:button2", self.frame1), "button2")self.Static3 = xml:InitStatic("frame1:Static3", self.frame1)self.Static4 = xml:InitStatic("frame1:Static4", self.frame1)self.edit2 = xml:InitEditBox("frame1:edit2", self.frame1)self.checkbox1 = xml:InitCheck("frame1:checkbox1", self.frame1)self:Register(self.checkbox1, "checkbox1")self.checkbox2 = xml:InitCheck("frame1:checkbox2", self.frame1)self:Register(self.checkbox2, "checkbox2")endfunction Deshifrator:InitCallBacks()self:AddCallback("edit1", ui_events.EDIT_TEXT_CHANGED, self.edit1_edit_text_changed, self)self:AddCallback("button1", ui_events.BUTTON_CLICKED, self.button1_button_clicked, self)self:AddCallback("button2", ui_events.BUTTON_CLICKED, self.button2_button_clicked, self)self:AddCallback("checkbox1", ui_events.BUTTON_CLICKED, self.checkbox1_button_clicked, self)self:AddCallback("checkbox2", ui_events.BUTTON_CLICKED, self.checkbox2_button_clicked, self)endfunction Deshifrator:edit1_GetText() --/получить введенный текст в edit1return self.edit1:GetText()endfunction Deshifrator:edit1_edit_text_changed()endfunction Deshifrator:button1_button_clicked()endfunction Deshifrator:button2_button_clicked()endfunction Deshifrator:edit2_GetText() --/получить введенный текст в edit2return self.edit2:GetText()endfunction Deshifrator:checkbox1_GetCheck() --/true/false - включен/отключен checkbox1return self.checkbox1:GetCheck()endfunction Deshifrator:checkbox1_button_clicked()endfunction Deshifrator:checkbox2_GetCheck() --/true/false - включен/отключен checkbox2return self.checkbox2:GetCheck()endfunction Deshifrator:checkbox2_button_clicked()endfunction Deshifrator:Hide()self:GetHolder():start_stop_menu(self, true)end Но я не знаю, как правильно его активировать. Я пытаюсь через проверку на активация предмета сделать, сама проверка то работает, а интерфейс не вызываеться. Делаю вот так, но как видно, не работает. function actor_binder:repair_outfit_start(obj, who)if obj thenif obj:section() == "deshifrator" then --здесь указываем предмет, при использовании которого будет срабатывать функция ниже--episode_system.def_func() --здесь указываем ссылку на функцию. Сначала скрипт, в котором она написана, потом название самой функцииself.Deshifrator:Hide()endendend Класс зарегестрирован в class_registrator. Вызываеться ф-я repair_outfit_start(obj, who) через bind_stalker. И вот лог ошибки: [error]Arguments : LUA error: ...ow of chernobyl\gamedata\scripts\bind_stalker.script:455: attempt to index field 'Deshifrator' (a nil value) Изменено 26 Февраля 2016 пользователем CRAZY_STALKER666 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/352/#findComment-995943
Sla-Sla 43 Опубликовано 26 Февраля 2016 Поделиться Опубликовано 26 Февраля 2016 @CRAZY_STALKER666, создай в своем скрипте функцию main() с таким кодом function main()local hud = Deshifrator(get_hud()) level.start_stop_menu(hud, true) end и вызывай её. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/352/#findComment-996025
losiara 13 Опубликовано 26 Февраля 2016 Поделиться Опубликовано 26 Февраля 2016 Добрый день всем!!! Нубский вопрос. Как телепортировать НПС в пределах локации, не ГГ, а именно НПС. Вызов будет происходить из логики НПС при получении хита по типу: [hit] on_info = %=функция телепортации...% Вот прошерстил и не нашел ничего подобного в инете!!! СПАСИБО!!! Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/352/#findComment-996040
Painter 3 576 Опубликовано 26 Февраля 2016 Поделиться Опубликовано 26 Февраля 2016 (изменено) На платформе ЗП: xr_effects.script. Функция teleport_npc. Изменено 26 Февраля 2016 пользователем Jurok Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/352/#findComment-996042
CRAZY_STALKER666 36 Опубликовано 26 Февраля 2016 Поделиться Опубликовано 26 Февраля 2016 @Sla-Sla, вызывал в точности, как у вас. Вылет: [error]Arguments : LUA error: ...ow of chernobyl\gamedata\scripts\bind_stalker.script:455: attempt to index global 'Deshifrator' (a nil value) Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/352/#findComment-996102
Sla-Sla 43 Опубликовано 26 Февраля 2016 Поделиться Опубликовано 26 Февраля 2016 @CRAZY_STALKER666, функцию куда вписал? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/352/#findComment-996108
CRAZY_STALKER666 36 Опубликовано 26 Февраля 2016 Поделиться Опубликовано 26 Февраля 2016 (изменено) @Sla-Sla, функцию вписал в deshifrator.script(там где и описание этого класса идет). Вызывал как обычно, из bind_stalker Вот вызов - Deshifrator.main() Изменено 26 Февраля 2016 пользователем CRAZY_STALKER666 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/352/#findComment-996123
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти