Space.Marine 466 Опубликовано 11 Ноября 2021 Поделиться Опубликовано 11 Ноября 2021 14 часов назад, Firestarter сказал: что это означает процент шанса В оригинале вероятность появления новых артов в аномалиях после выброса 17%. 10.11.2021 в 09:44, Space.Marine сказал: if math.random(1,100) > 17 then 1 1 Ссылка на комментарий
Labadal 68 Опубликовано 11 Ноября 2021 Поделиться Опубликовано 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! Ссылка на комментарий
AndreySol 215 Опубликовано 11 Ноября 2021 Поделиться Опубликовано 11 Ноября 2021 4 часа назад, Labadal сказал: вызов идёт в самом конце функции function actor_binder:load(reader) в бинде сталкера Лучше, на мой взгляд, загружать сохраненное в net_spawn в том же биндере, после строки db.add_actor(self.object). Не знаю, что за load_variable у тебя, но если использовать штатные ф-ции(которых примеры тебе выше уже привели), то все должно работать. Цитата присвоить ей значение 10 в начале игры Это делай в скрипте, ранее загрузки сохраненного значения. 1 1 Ссылка на комментарий
Labadal 68 Опубликовано 11 Ноября 2021 Поделиться Опубликовано 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! Ссылка на комментарий
Zander_driver 10 333 Опубликовано 11 Ноября 2021 Поделиться Опубликовано 11 Ноября 2021 4 часа назад, Labadal сказал: Варианты? Вообще-то. Варианты зависят от того, какова цель всего этого действа. Если а) Сделать комбез с энергопитанием. То можно брать давно сделанные (Более 10 лет назад!!!), готовые, отработанные и надежные решения. Ну или поискать другие готовые аналоги, если этот чем-то не нравится. аналогов за 10 с лишним лет, сделано было предостаточно. Если б) Разобраться в скриптах, освоить луа, "сделать самому". (На самом деле единственная внятная причина, объясняющая почему не взять готовое) - то можно было бы, свои вопросы на форуме адресовать не телепатам, а обычным форумчанам. Так скорее помогут, правда. Пока в твоих постах нет ни твоего кода, ни логов вылетов, они адресованы скорее телепатам и гадалкам. Некоторые конечно пытаются угадывать, что там у тебя происходит. Правильно ли они угадывают? Это никому не известно. Если ты хочешь разобраться, то множить неизвестные - не лучшее решение. 1 3 Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
Labadal 68 Опубликовано 11 Ноября 2021 Поделиться Опубликовано 11 Ноября 2021 @Zander_driver Опустим все подробности, на данный момент мне нужно просто: 1. Научится сохранять переменную в Pstor 2. Научится при загрузке сохранения её считывать оттуда Как минимум, хочу именно в этом разобраться. God save Hatsune Miku! Ссылка на комментарий
Zander_driver 10 333 Опубликовано 11 Ноября 2021 Поделиться Опубликовано 11 Ноября 2021 3 минуты назад, Labadal сказал: 1. Научится сохранять переменную в Pstor local x = 10 -- твоя переменная xr_logic.pstor_store(db.actor, "my_unique_x", x) -- Сохранена. 5 минут назад, Labadal сказал: при загрузке сохранения её считывать оттуда local def_val = 0 -- Значение по умолчанию. Если окажется, что переменная не сохранялась local x = xr_logic.pstor_retrieve(db.actor, "my_unique_x", def_val) -- Загружено. 1 Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
Labadal 68 Опубликовано 11 Ноября 2021 Поделиться Опубликовано 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! Ссылка на комментарий
AndreySol 215 Опубликовано 11 Ноября 2021 Поделиться Опубликовано 11 Ноября 2021 46 минут назад, Labadal сказал: load_variable это как раз и есть та функция, что мне выше привели Не нужная совсем обертка. Попробуй сохранять значение в net_destroy биндера, в самом начале ф-ции. Ссылка на комментарий
Firestarter 3 Опубликовано 11 Ноября 2021 Поделиться Опубликовано 11 Ноября 2021 7 часов назад, Space.Marine сказал: В оригинале вероятность появления новых артов в аномалиях после выброса 17%. Что интересно, в скинутом вами файле этого куска кода просто нет. И, если верить описанию мода, это даёт 100% вероятность спавна. Опять же, нихрена бы этого не понял без разъяснений - спасибо. Ссылка на комментарий
WinCap 316 Опубликовано 11 Ноября 2021 Поделиться Опубликовано 11 Ноября 2021 (изменено) @Labadal, а зачем в функциях actor_binder:save/load использовать pstor? У них же есть свой net_paket? В функции function actor_binder:save(packet): packet:w_float(en.energy) В функции function actor_binder:load(reader): en.energy = reader:r_float() Разместить в конце функций, начать новую игру. Изменено 11 Ноября 2021 пользователем WinCap 1 1 2 S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Ссылка на комментарий
Zander_driver 10 333 Опубликовано 11 Ноября 2021 Поделиться Опубликовано 11 Ноября 2021 4 часа назад, Labadal сказал: При загрузке происходит вылет, с таким вот логом: При загрузке actor еще не зарегистрирован в db. Поэтому db.actor == nil, о чем лог и сообщает. Запись в пстор вообще говоря, удобнее делать где-нибудь до сейва. А если именно в save и в load, то лучше через net_packet, как выше уже сказали. P.S. Добавлю только. Для разобраться и для маленьких правок оно конечно нормально, но если захочется сохранять такими методами много всякого разного - следует помнить о том что размер нетпакета ограничен. И, пстор тоже пишется в тот же нетпакет. 1 2 1 Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
Labadal 68 Опубликовано 12 Ноября 2021 Поделиться Опубликовано 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! Ссылка на комментарий
WinCap 316 Опубликовано 12 Ноября 2021 Поделиться Опубликовано 12 Ноября 2021 @Labadal, замени sim на alife(). 1 S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Ссылка на комментарий
Labadal 68 Опубликовано 12 Ноября 2021 Поделиться Опубликовано 12 Ноября 2021 (изменено) Как можно отследить выстрел из оружия? Точнее, вопрос даже в том, можно ли? Изменено 12 Ноября 2021 пользователем Labadal God save Hatsune Miku! Ссылка на комментарий
topdog 49 Опубликовано 12 Ноября 2021 Поделиться Опубликовано 12 Ноября 2021 @Labadal https://www.amk-team.ru/forum/topic/13216-sborochnyy-ceh/?do=findComment&comment=959170 1 Ссылка на комментарий
Labadal 68 Опубликовано 12 Ноября 2021 Поделиться Опубликовано 12 Ноября 2021 @topdog файла нет уже на я.диске( God save Hatsune Miku! Ссылка на комментарий
Zander_driver 10 333 Опубликовано 12 Ноября 2021 Поделиться Опубликовано 12 Ноября 2021 1 час назад, Labadal сказал: Как можно отследить выстрел из оружия? 1. Поставить движок OGSR. 2. Использовать в бинд_сталкере колбек on_actor_weapon_fire. А скриптовый метод отлова выстрела делал много лет назад @*Shoker* (в сборочном цехе это его скрипт был) - только это по нынешним временам, люто древний костыль, который существенно грузит апдейт. Не рекомендую таким пользоваться. И полагаю, автор тоже давно не пользуется. @aromatizer по теме есть что сказать? Или ты просто посты набиваешь. 1 1 Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
Labadal 68 Опубликовано 12 Ноября 2021 Поделиться Опубликовано 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 Поделиться Опубликовано 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! Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти