Labadal 68 Опубликовано 10 Ноября 2021 @Norman Eisenherz Проблема в том, что используемый предмет расходует "энергию" бронекостюма, который надет на гг. Тут уж кондишн не отнимешь. (не в том смысле, что нельзя, а в том, что задумка) God save Hatsune Miku! Поделиться этим сообщением Ссылка на сообщение
Labadal 68 Опубликовано 11 Ноября 2021 @Norman Eisenherz Вариант. Все же попробую первый способ. Не получится - сделаю так God save Hatsune Miku! Поделиться этим сообщением Ссылка на сообщение
Labadal 68 Опубликовано 11 Ноября 2021 @AndreySol это понятно, но как сохранять? Где сохранять? God save Hatsune Miku! Поделиться этим сообщением Ссылка на сообщение
Labadal 68 Опубликовано 11 Ноября 2021 @mole venomous Допустим, где вызывать эти функцию? God save Hatsune Miku! Поделиться этим сообщением Ссылка на сообщение
Labadal 68 Опубликовано 11 Ноября 2021 (изменено) @AndreySol Есть некий предмет ,который: 1. возможно использовать только когда надет костюм 2. при каждом использовании отнимает одну энергию этого костюма В целом, нужно: записывать переменную при сохранении/читать при загрузке/присвоить ей значение 10 в начале игры Изменено 11 Ноября 2021 пользователем Labadal God save Hatsune Miku! Поделиться этим сообщением Ссылка на сообщение
Labadal 68 Опубликовано 11 Ноября 2021 Сохранить, вроде как, получилось. При сохранении такой вылет: Скрытый текст Expression : fatal error Function : CScriptEngine::lua_error File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp Line : 73 Description : <no expression> Arguments : LUA error: ...shadow of chernobyl\gamedata\scripts\xr_logic.script:1181: attempt to index local 'obj' (a nil value) как только не загружал: load_variable("energy") load_variable(energy) load_variable("energy",nil) load_variable("energy",0) Варианты? upd: ошибся, данный вылет при загрузке сейва. При сохранении всё работает. Есть, конечно, вариант, что я вызываю функцию не там, хотя не знаю, вызов идёт в самом конце функции function actor_binder:load(reader) в бинде сталкера God save Hatsune Miku! Поделиться этим сообщением Ссылка на сообщение
Labadal 68 Опубликовано 11 Ноября 2021 (изменено) @AndreySol load_variable это как раз и есть та функция, что мне выше привели -- Загружаем переменную function load_variable(variable_name, value_if_not_found) return xr_logic.pstor_retrieve(db.actor, variable_name, value_if_not_found) end Энивей спасибо за совет, буду разбираться - к тому же, оказалось, что и сохранения не сохраняют, а проверяя, что сохранилось - я записывал в лог не то, что сохранилось, а то, что имею на данный момент. Такие дела. Изменено 11 Ноября 2021 пользователем Labadal God save Hatsune Miku! Поделиться этим сообщением Ссылка на сообщение
Labadal 68 Опубликовано 11 Ноября 2021 @Zander_driver Опустим все подробности, на данный момент мне нужно просто: 1. Научится сохранять переменную в Pstor 2. Научится при загрузке сохранения её считывать оттуда Как минимум, хочу именно в этом разобраться. God save Hatsune Miku! Поделиться этим сообщением Ссылка на сообщение
Labadal 68 Опубликовано 11 Ноября 2021 @Zander_driver вот результаты: Скрытый текст В файле en.script обьявляю переменную: energy = 10 В файле bind_stalker.script: Сохраняю: В функции function actor_binder:save(packet) таким образом: xr_logic.pstor_store(db.actor, "nrg", en.energy) Загружаю: В функции function actor_binder:net_spawn(data) после строчки: db.add_actor(self.object) таким образом: local test = 5 en.energy = xr_logic.pstor_retrieve(db.actor, "nrg", test) что в итоге: При начале новой игры в переменной energy присваивается не 10, как указано в файле en.sctipt, а значение локальной переменной test - из кода загрузки. В последующие сейвлоады, при каждой загрузке, ей присваивается значение 5, а не то, которое было сохранено. Скрытый текст В файле en.script обьявляю переменную: energy = 10 В файле bind_stalker.script: Сохраняю: В функции function actor_binder:save(packet) таким образом: xr_logic.pstor_store(db.actor, "nrg", en.energy) Загружаю: В функции function actor_binder:load(reader) таким образом: local test = 5 en.energy = xr_logic.pstor_retrieve(db.actor, "nrg", test) что в итоге: При загрузке происходит вылет, с таким вот логом: Expression : fatal error Function : CScriptEngine::lua_error File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp Line : 73 Description : <no expression> Arguments : LUA error: ...shadow of chernobyl\gamedata\scripts\xr_logic.script:1181: attempt to index local 'obj' (a nil value) Помимо прочего: Я выводил в лог значение сохраненной переменной - сохраняет оно правильно. God save Hatsune Miku! Поделиться этим сообщением Ссылка на сообщение
Labadal 68 Опубликовано 12 Ноября 2021 Доброго дня, нашёл такую функцию: --/ определяем название секции патронов в активном стволе NPC function Get_ActiveAmmoSection(oNPC) --/< (npc or nil) if not oNPC then oNPC = db.actor end local oItem = oNPC and oNPC:active_item() if oItem and isWeapon(oItem) then --/ проверка: оружие ли в руках? local soWeapon = sim:object(oItem:id()) if soWeapon then local iAmmoType = Get_AmmoType(soWeapon) --/< получаем тип патронов в стволе if iAmmoType then return Get_AmmoSection(oItem:section(),iAmmoType) --/> "ammo_section" (or nil) end end end return nil --/> end Но при использовании ругается на sim Кто нибудь знает, что это и где его объявить? В lua helper есть похожая функция, там переменная sim объявлена как: local sim = nil --/ переменная, кеширующая функцию alife() Или, может кто знает другой способ узнать секцию патронов в активном слоте God save Hatsune Miku! Поделиться этим сообщением Ссылка на сообщение
Labadal 68 Опубликовано 12 Ноября 2021 (изменено) Как можно отследить выстрел из оружия? Точнее, вопрос даже в том, можно ли? Изменено 12 Ноября 2021 пользователем Labadal God save Hatsune Miku! Поделиться этим сообщением Ссылка на сообщение
Labadal 68 Опубликовано 12 Ноября 2021 @topdog файла нет уже на я.диске( God save Hatsune Miku! Поделиться этим сообщением Ссылка на сообщение
Labadal 68 Опубликовано 12 Ноября 2021 А можно ли "отследить" изменение переменной? Вот, к примеру, выполнить код, если переменная X уменьшилась, скажем, на 5. upd: Есть такой вот скрипт: Скрытый текст local old_ai_id = 0 local check_ammo = false function gun() local ai = db.actor:active_item() if ai then if ai:id()~=old_ai_id then old_ai_id = ai:id() if ai:section() == "оружие" then check_ammo = true on_change_wpn(ai) end end else if old_ai_id~=0 then old_ai_id=0 check_ammo=false end end if check_ammo then local curr_ammo = ai:get_ammo_in_magazine() if curr_ammo < ammo_old then ammo_old = curr_ammo if not level.main_input_receiver() then on_actor_shoot() end end end end function on_change_wpn( obj ) ammo_old = obj:get_ammo_in_magazine() end function on_actor_shoot() --тут что делать после выстрела end Он, в целом, работает - но проблема в том, что работает одноразово. Выстрелил - сработало. Чтобы сработало ещё раз, нужно снять с себя оружие и повесить его обратно в слот. Намекните как править God save Hatsune Miku! Поделиться этим сообщением Ссылка на сообщение
Labadal 68 Опубликовано 13 Ноября 2021 upd: работать перестает после перезарядки оружия Перезарядил, нужно вытащить из слота и поставить обратно. печально. upd: нет, дело не в перезарядке, "ломается", когда истратил все патроны, т.е. когда колво-патронов становится равно 0 Или ,всё таки, в перезарядке upd: разобрался Если вдруг кому-то понадобится в будущем данный костыль, вот: *Отследить выстрел из оружия/отследить выстрел при стрельбе* Скрытый текст 1. Основная функция, вешаем на апдейт: local check_ammo = false local old_ai_id = 0 function gun() local ai = db.actor:active_item() if ai then if ai:id()~=old_ai_id then old_ai_id = ai:id() if ai:section() == "имя секции оружия" then check_ammo = true ammo_old = ai:get_ammo_in_magazine() end end else if old_ai_id~=0 then old_ai_id=0 check_ammo=false end end if check_ammo then local curr_ammo = ai:get_ammo_in_magazine() if curr_ammo < ammo_old then ammo_old = curr_ammo if not level.main_input_receiver() then on_actor_pay() end end end end 2. Функция on_actor_pay(): function on_actor_pay() -- тут код того, что вы хотите сделать при выстреле this.start_timer() - запуск таймера end 3. таймер: function action_timer() old_ai_id = 0 end function start_timer() local iTimer = time_global() + 1000 local function check_timer() return time_global() > iTimer end level.add_call(check_timer, action_timer) end Таймер нужен, чтобы присвоить переменной old_ai_id значение 0 через секунду. (этого времени хватает для "перезарядки" оружия) если присвоить переменной old_ai_id значение 0 до того, как оружие перезарядится - функция on_actor_pay() будет срабатывать много раз, пока оружие не перезарядится. Находясь в апдейте - это действительно много раз. 4. функция preload(), тоже на апдейт: function preload() local ai = db.actor:active_item() if ai and ai:section() == "имя секции оружия" then local curr_ammo_preload = ai:get_ammo_in_magazine() if curr_ammo_preload == 0 then check_ammo = false old_ai_id = 0 end end end Нужна для решения бага, который возникал в случае самовольной разрядки оружия, после которого функция "gun" переставала работать. upd: Да, костыль. Да, корявый. Да, нагружает апдейт. Но это лучшее решение для тех, кто не хочет/не может качать, к примеру, ОГСР двиг, в котором, как сказал ранее товарищ @Zander_driver, есть для этого каллбек. 1 God save Hatsune Miku! Поделиться этим сообщением Ссылка на сообщение
Labadal 68 Опубликовано 14 Ноября 2021 (изменено) upd: 2. Функция on_actor_pay(). (та, что выше, рассчитана для оружия, в котором всего один патрон, эта - подойдет для любого) function on_actor_pay() local curr_ammo_yes = db.actor:active_item():get_ammo_in_magazine() =============================================--свой код писать только ниже этой полоски -- тут код того, что вы хотите сделать при выстреле =============================================--свой код писать только выше этой полоски if curr_ammo_yes== 0 then start_timer() end end Изменено 14 Ноября 2021 пользователем Labadal God save Hatsune Miku! Поделиться этим сообщением Ссылка на сообщение
Labadal 68 Опубликовано 7 Апреля 2022 Возможно в чистом ТЧ получить координаты точки, на которую нацелен/смотрит ГГ? @Кекс в логику рестриктора функцию: =set_squad_enemy_to_actor(id_сквада) God save Hatsune Miku! Поделиться этим сообщением Ссылка на сообщение
Labadal 68 Опубликовано 4 Июля 2022 Вопрос по ТЧ! Доброго времени суток, товарищи. Я тут понемногу самостоятельно обучаюсь, решил вот сделать смарт-террейн (гулаг). Делал по аналогии уже имеющихся. 1. В СДК поставил смарт, прицепил к нему шейп, прописал в логике имя, всё как положено: [smart_terrain] type = pseudo_monolit capacity = 3 groups = 0, 3 2. Поставил трех нпсов, в их кастом дату прописал принадлежность к этому гулагу: [smart_terrains] pseudo_monolit = true 3. Создал для них три точки walk и три точки look. (их назвал правильно - имя_смарта_имя_точки в файле gulag_escape.script прописал для них логику и все, что нужно: Скрытый текст if type == "pseudo_monolit" then t = { section = "logic@pseudo_monolit_guard1", idle = 0, prior = 8, state = {0,2}, position_threshold = 100, online = true, in_rest = "", out_rest = "", predicate = function(obj_info) return obj_info.name == "esc_pseudo_monolit1" end } table.insert(sj, t) t = { section = "logic@pseudo_monolit_guard2", idle = 0, prior = 8, state = {0,2}, position_threshold = 100, online = true, in_rest = "", out_rest = "", predicate = function(obj_info) return obj_info.name == "esc_pseudo_monolit2" end } table.insert(sj, t) t = { section = "logic@pseudo_monolit_loner", idle = 0, prior = 8, state = {0,2}, position_threshold = 100, online = true, in_rest = "", out_rest = "", predicate = function(obj_info) return obj_info.name == "esc_pseudo_loner" end } table.insert(sj, t) end ========= if type == "pseudo_monolit" then return function(gulag) return 0 end end ======= if gulag_type == "pseudo_monolit" then return npc_community == "stalker" end В файле gulag_escape.ltx прописал им их логику. Скрытый текст [logic@pseudo_monolit_guard1] active = walker@pseudo_monolit_guard1 [walker@pseudo_monolit_guard1] path_walk = guard1_walk path_look = guard1_look def_state_standing = guard [logic@pseudo_monolit_guard2] active = walker@pseudo_monolit_guard2 [walker@pseudo_monolit_guard2] path_walk = guard2_walk path_look = guard2_look def_state_standing = guard [logic@pseudo_monolit_loner] active = walker@pseudo_monolit_loner [walker@pseudo_monolit_loner] path_walk = loner_walk path_look = loner_look def_state_standing = guard Так вот, сама проблема в том, что эти нпс - стоят на тех местах, где были заспавнены. Их логика почему-то к ним не "цепляется". Если на них нападут (мутант, или сталкер какой) то как всё успокоится, они встанут на том месте, где остановились. Как "заставить" их "увидеть" их логику и действовать, согласно ней? Спасибо! God save Hatsune Miku! Поделиться этим сообщением Ссылка на сообщение
Labadal 68 Опубликовано 5 Июля 2022 @h0N0r да, флаги везде стоят God save Hatsune Miku! Поделиться этим сообщением Ссылка на сообщение
Labadal 68 Опубликовано 7 Июля 2022 доброго вечера, в общем такая проблема: получаю цель: local target = level.get_target_obj() (это XRE, но не суть) получаю имя секции этой цели (в моём случае сталкера): local sect = target:profile_name() далее, я хочу удалить именно этого нпс: for a=10,65634,1 do local obj=alife():object(a) if obj and target and string.find(obj:name(),sect) then alife():release(obj,true) end end но дело в том, что есть нпс, типа: south_digger_default1 south_digger_default2 south_digger_default3 south_digger_default4 и при "удалении" одного - у меня удаляются все. (то есть если я удалю одного нпс из деревни новичков, например, то там останется только Волк). Как мне удалить именно того, кого я выбрал? God save Hatsune Miku! Поделиться этим сообщением Ссылка на сообщение
Labadal 68 Опубликовано 7 Июля 2022 (изменено) @Manool Хорошо, я вот удалил этого нпс. Допустим, через некоторое время я хочу его вновь заспавнить (именно его (с таким же именем и тд)). Как это сделать? причем так, чтоб он вновь стал "работать" под своей логикой, и присоединился к своему гулагу, если был в нем. Ещё раз спасибо. Изменено 7 Июля 2022 пользователем Labadal God save Hatsune Miku! Поделиться этим сообщением Ссылка на сообщение