Kirgudu 1 216 Опубликовано 11 Ноября Поделиться Опубликовано 11 Ноября @Stalkersof вылет может быть и не связан с приведённым кодом, по крайней мере я в нём ошибки не вижу. А пример уже давали ранее, целый набор функций для работы с этим хранилищем: 1 Инструмент Ссылка на комментарий
Stalkersof 177 Опубликовано 11 Ноября Поделиться Опубликовано 11 Ноября Не знаю у меня не получается работать с хранилищем как с переменными. У меня эти функции в отдельном файле ogsr_vars. Вот так сделал вылет. Скрытый текст local xvars = get_stored_vars() xvars.items_podobral = {} --items_podobral = {} function item_take(obj) local sect = obj:section() local reputation local rang for i=1,#list_items do if sect == list_items[i].section then --if items_podobral[ sect ] then log1( ogsr_vars.get_value_safe("items_podobral")) if not ogsr_vars.get_value_safe( "items_podobral" ) then reputation = list_items[i].reputation rang = list_items[i].rang db.actor:change_character_reputation(reputation) db.actor:set_character_rank(db.actor:character_rank() + rang) local text = "%c[255,160,160,160]".."Уникальный предмет".."\\n".."%c[default]".."Ранг+ "..rang.." ".."Репутация+ "..reputation local hud = get_hud() hud:AddCustomStatic("main_task", true) hud:GetCustomStatic("main_task"):wnd():SetTextST(text) hud:GetCustomStatic("main_task").m_endTime = time_global()/300 + 5 --items_podobral[sect] = list_items[i].section ogsr_vars.set_value( "items_podobral", list_items[i].section) log1(list_items[i].section.."-"..rang.."-"..reputation) break end end end end Ну блин подскажите как работать с таблицами в хранилище. Freeplay Graphic Mod(FGM) Ссылка на комментарий
Kirgudu 1 216 Опубликовано 11 Ноября Поделиться Опубликовано 11 Ноября 17 минут назад, Stalkersof сказал: Вот так сделал вылет ...Ну блин подскажите как работать с таблицами в хранилище. Поделиться текстом ошибки в голову, видимо, не приходит? Какая ещё, в таком случае, требуется подсказка, если она уже дана? Инструмент Ссылка на комментарий
UriZzz 1 004 Опубликовано 11 Ноября Поделиться Опубликовано 11 Ноября @Kirgudu ещё бы таймеры на SCRIPT_VARS_STORAGE, было бы замечательно. А пока пользуюсь модулями от Артоса и прочих причастных. Моя нычка, Нычка в арендованном у Опричника холодильнике Мы хорошие ребята, жаль патронов маловато:) Ссылка на комментарий
Stalkersof 177 Опубликовано 11 Ноября Поделиться Опубликовано 11 Ноября 44 минуты назад, Kirgudu сказал: Поделиться текстом ошибки в голову, видимо, не приходит? Какая ещё, в таком случае, требуется подсказка, если она уже дана? Вылет был по строке log1 по первой строке в коде. Скрытый текст local xvars = get_stored_vars() xvars.items_podobral = {} --items_podobral = {} function item_take(obj) local sect = obj:section() local reputation local rang for i=1,#list_items do if sect == list_items[i].section then --if not items_podobral[ sect ] then if not ogsr_vars.get_value_safe( "items_podobral" ) then reputation = list_items[i].reputation rang = list_items[i].rang db.actor:change_character_reputation(reputation) db.actor:set_character_rank(db.actor:character_rank() + rang) local text = "%c[255,160,160,160]".."Уникальный предмет".."\\n".."%c[default]".."Ранг+ "..rang.." ".."Репутация+ "..reputation local hud = get_hud() hud:AddCustomStatic("main_task", true) hud:GetCustomStatic("main_task"):wnd():SetTextST(text) hud:GetCustomStatic("main_task").m_endTime = time_global()/300 + 5 --items_podobral[sect] = list_items[i].section ogsr_vars.set_value( "items_podobral", list_items[i].section) log1(list_items[i].section.."-"..rang.."-"..reputation) break end end end end Такой код и не вылетает и не работает. Freeplay Graphic Mod(FGM) Ссылка на комментарий
Balavnik 118 Опубликовано 11 Ноября Поделиться Опубликовано 11 Ноября @Stalkersof Так а ошибка-то какая? Осенний каламбур. Сентябрь - лето. Ссылка на комментарий
Stalkersof 177 Опубликовано 11 Ноября Поделиться Опубликовано 11 Ноября (изменено) 1 час назад, Balavnik сказал: @Stalkersof Так а ошибка-то какая? Скрытый текст [C]: in function 'log1' d:\Мод fgm\fgm_v_1_7_4\gamedata\scripts\nagrada.script:101: in function 'fun' d:\Мод fgm\fgm_v_1_7_4\gamedata\scripts\ogse_signals.script:382: in function 'process_call' d:\Мод fgm\fgm_v_1_7_4\gamedata\scripts\ogse_signals.script:320: in function 'call' d:\Мод fgm\fgm_v_1_7_4\gamedata\scripts\bind_stalker.script:210: in function <d:\Мод fgm\fgm_v_1_7_4\gamedata\scripts\bind_stalker.script:207> [11.11.24 18:15:12.169] ********************************************************************************* [11.11.24 18:15:12.169] FATAL ERROR [error]Expression : FATAL ERROR [error]Function : CScriptEngine::lua_pcall_failed [error]File : D:\a\OGSR-Engine\OGSR-Engine\ogsr_engine\COMMON_AI\script_engine.cpp [error]Line : 52 [error]Description : [CScriptEngine::lua_pcall_failed]: [luabind::detail::free_functions::function_dispatcher] Caught unhandled exception! [11.11.24 18:15:12.169] ***************************[ScriptCrashHandler]********************************** [11.11.24 18:15:12.169] stack traceback: [C]: at 0x7ff804e87af4 [C]: in function 'log1' d:\Мод fgm\fgm_v_1_7_4\gamedata\scripts\nagrada.script:101: in function 'fun' d:\Мод fgm\fgm_v_1_7_4\gamedata\scripts\ogse_signals.script:382: in function 'process_call' d:\Мод fgm\fgm_v_1_7_4\gamedata\scripts\ogse_signals.script:320: in function 'call' d:\Мод fgm\fgm_v_1_7_4\gamedata\scripts\bind_stalker.script:210: in function <d:\Мод fgm\fgm_v_1_7_4\gamedata\scripts\bind_stalker.script:207> ПС Вроде сделал на поршнях как Хикс советовал. 78 поршней. С таблицей конечно проще но как? Изменено 11 Ноября пользователем Stalkersof 1 Freeplay Graphic Mod(FGM) Ссылка на комментарий
Это популярное сообщение. Kirgudu 1 216 Опубликовано 11 Ноября Это популярное сообщение. Поделиться Опубликовано 11 Ноября 6 часов назад, UriZzz сказал: ещё бы таймеры на SCRIPT_VARS_STORAGE, было бы замечательно. А пока пользуюсь модулями от Артоса и прочих причастных. Если только m_timers от того же Артоса на OGSR переделать... Вот только зачем? 5 лет назад уже был предложен простой и действенный способ подменить хранилище se_stor Артоса на вариант из OGSR, при этом не меняя ни строчки кода в использующих хранилище скриптах. Внутри модуля таймеров вызываются глобальные GetVar и SetVar, которые можно подменить ровно таким же способом. @Stalkersof ничего сложного в работе с таблицами в OGSR нет, информации достаточно даже той, что представлена в официальном Wiki. Вот такой код выполнится без ошибок (проверил только что за 5 минут): local xvars = get_stored_vars() xvars.items_podobral = {} xvars.items_podobral[1] = { section = "111", rang = 1 } xvars.items_podobral[2] = { section = "222", rang = 2 } xvars.items_podobral[3] = { section = "333", rang = 3 } Но далее надо помнить, что любые таблицы в хранилище размещаются не как таблицы, а как значения с типом "userdata", даже сразу после первичного присвоения. То есть по сформированной выше таблице, например, не получится итерироваться: for k,v in pairs(xvars.items_podobral) do -- do something end такой код вызовет ошибку вида «"userdata" не является таблицей». Не получится использовать table.insert и table.remove, не выйдет посчитать кол-во элементов #xvars.items_podobral и так далее, то есть совершить любое действие, которое доступно для стандартных таблиц. Чтобы работать с таблицей, записанной в хранилище, необходимо её сначала конвертировать в понятный для lua вид: local t = xvars.items_podobral() -- выполнить одноименный метод -- после выполнения переменная t содержит в себе стандартную таблицу Но вот если требуется переприсвоить какой-то элемент таблицы, это можно сделать посредством прямого доступа, без конвертирования: xvars.items_podobral[2] = "новое строковое значение" В общем, всё необходимое описано на оф. ресурсе. Сверх этого рассказать что-то сложно. Пробуй, экспериментируй. 2 1 2 Инструмент Ссылка на комментарий
rost2000 0 Опубликовано 13 Ноября Поделиться Опубликовано 13 Ноября 05.11.2024 в 12:35, rost2000 сказал: Написал скрипт на проверку нахождения в спейс рестрикторе НПС, чтобы ГГ зачистил указанную зону, кроме НПС с группировкой "stalker". Вылетает с таким логом. Как я понимаю, методы применяются ко всем объектам, а нужно, чтобы только к НПС. Искал проверку, что объект является НПС, но не нашел. function storyline_complex_clear() local sim = alife() if sim then local zone = sim:story_object(904) for id = 1, 65534 do sobj = sim:object(id) return sobj and zone and zone:inside(sobj:position()) and not sobj:community() == "stalker" end end end Показать FATAL ERROR [error]Expression : fatal error [error]Function : CScriptEngine::lua_error [error]File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp [error]Line : 73 [error]Description : <no expression> [error]Arguments : LUA error: No such operator defined stack trace: Продолжение по этому скрипту, который отказывается работать (проверка всегда возвращает false). Решил проверить, работает ли проверка на присутствие объекта в рестрикторе. Вызвал такую функцию: function sander_test() local sim = alife() local obj if sim then local zone = sim:story_object(904) for id = 1, 65534 do obj = sim:object(id) if zone and zone:inside(obj:position()) then news_manager.send_tip(db.actor, "NEW_INFO = " .. tostring(obj:name()), nil, "trader", 5000, 92) end end end end Что привело к вылету: Скрытый текст [13.11.24 12:14:13.051] [2912] [print_output([CScriptEngine::lua_pcall_failed])] SCRIPT RUNTIME ERROR: ! No such operator [__call] defined in class [___VECTOR] stack traceback: [C]: at 0x7ff6a879ff50 [C]: in function 'position' d:\games\s.t.a.l.k.e.r\gamedata\scripts\ui_main_menu.script:222: in function 'sander_test' d:\games\s.t.a.l.k.e.r\gamedata\scripts\ui_main_menu.script:189: in function <d:\games\s.t.a.l.k.e.r\gamedata\scripts\ui_main_menu.script:164> [13.11.24 12:14:13.051] [2912] ********************************************************************************* [13.11.24 12:14:13.051] [2912] FATAL ERROR [error]Expression : FATAL ERROR [error]Function : CScriptEngine::lua_pcall_failed [error]File : F:\Repos\OGSR-Engine\ogsr_engine\COMMON_AI\script_engine.cpp [error]Line : 60 [error]Description : [CScriptEngine::lua_pcall_failed]: ! No such operator [__call] defined in class [___VECTOR] Ссылка на комментарий
Капрал Хикс 531 Опубликовано 13 Ноября Поделиться Опубликовано 13 Ноября Подскажите простенький скрипт для того, чтобы оружие можно было использовать только в надетой экзе, а то не найду... Ссылка на комментарий
Pir@t@s 36 Опубликовано 13 Ноября Поделиться Опубликовано 13 Ноября @Капрал Хикс Это то? Скрытый текст function check_armor() local armor = db.actor:item_in_slot(6) local weapon = db.actor:item_in_slot(2) if db.actor:active_slot()==2 and weapon then local tmp = armor and armor:section() or "" if not string.find(tmp, "exo") and (weapon:section()=="wpn_pkm") then db.actor:drop_item(weapon) local tmpw = alife():create(weapon:section(), db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) db.actor:transfer_item(weapon,db.actor) alife():release(tmpw) news_manager.send_tip(db.actor,"Невозможно взять пулемёт в руки без экзы",nil,nil,10000) end end end function actor_binder:update(delta) my_script.check_armor() 1 1 Ссылка на комментарий
Купер 2 869 Опубликовано 13 Ноября Поделиться Опубликовано 13 Ноября В принципе, под "местные условия" (X-Ray Extensions) можно несколько проще сделать: тынц (в качестве ориентира). Вообще, много где было: Cолянки, ОП-ы, OGSE/OGSR. И вот это: function actor_binder:update(delta) my_script.check_armor() страшно, конечно. Там, по идее, по дельте времени ~ 1раза в секунду более, чем достаточно. 1 1 Ссылка на комментарий
Kirgudu 1 216 Опубликовано 13 Ноября Поделиться Опубликовано 13 Ноября 10 часов назад, rost2000 сказал: obj = sim:object(id) if zone and zone:inside(obj:position()) then У серверного объекта position является свойством, а не методом (функцией). Выполнение будет приводить к ошибке, как у тебя, тогда как правильное написание будет таким: if zone and zone:inside(obj.position) then 1 1 Инструмент Ссылка на комментарий
WinCap 316 Опубликовано 13 Ноября Поделиться Опубликовано 13 Ноября @rost2000, а ещё, в добавлении к предыдущему посту: Наличие "зоны" лучше проверить перед циклом, один раз. А внутри цикла нужно убедиться в наличии объекта: if obj and zone:inside(obj.position) then 2 S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Ссылка на комментарий
Капрал Хикс 531 Опубликовано 14 Ноября Поделиться Опубликовано 14 Ноября 21 час назад, Купер сказал: страшно, конечно. Там, по идее, по дельте времени ~ 1раза в секунду более, чем достаточно. В x-ray extensions вроде есть коллбэк на перемещение в слот. Хм, как бы его правильно использовать, пример нужен. Ссылка на комментарий
Купер 2 869 Опубликовано 15 Ноября Поделиться Опубликовано 15 Ноября @Капрал Хикс ну вот это вот всё c пробросом "костыльным" для оригинала: Скрытый текст function check_armor() -- предмет в 6 в слоте (БЗК) local armor = db.actor:item_in_slot(6) -- предмет в слоте (оружейка) local weapon = db.actor:item_in_slot(2) -- если предмет в слоте активен (оружейка) и он там есть if db.actor:active_slot()==2 and weapon then -- проверяем наличие и наименовнаие и наличие БЗК local tmp = armor and armor:section() or "" -- если с названии брони есть "exo" (outfit_exo, например) и ствол это 'wpn_pkm', которому экза нужна if not string.find(tmp, "exo") and (weapon:section()=="wpn_pkm") then -- то начали костылить для оригинала -- выбросили оружие db.actor:drop_item(weapon) -- создали фейк-оружие по позиции ГГ local tmpw = alife():create(weapon:section(), db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) -- передали оружие ГГ db.actor:transfer_item(weapon,db.actor) -- удалили фейк-оружие alife():release(tmpw) -- выдали ньюс по этому поводу news_manager.send_tip(db.actor,"Невозможно взять пулемёт в руки без экзы",nil,nil,10000) end end end function actor_binder:update(delta) my_script.check_armor() Заменить на использование move_to_ruck. Пример из OGSR: Скрытый текст -- колбеки, на которые вешаем вызовы: on_item_to_slot, on_item_to_ruck, etc function attach(sm) sm:subscribe({ signal = "on_item_to_slot", fun = this.remove_m134 }) --Перенос М134 в слот. sm:subscribe({ signal = "on_item_to_ruck", fun = this.remove_m134 }) --Ситуация, когда снимаем надетый костюм в инвентарь, при находящемся м134 во втором слоте. sm:subscribe({ signal = "on_drop", fun = this.remove_m134 }) --Ситуация, когда выбрасываем надетый костюм прямо из слота, при находящемся м134 во втором слоте. end Сама наша "молотилка" local counter = 0 function remove_m134() --Чтобы М134 можно было использовать только при надетом экзоскелете. if device().precache_frame > 1 then return end for slot = 1, 2 do -- для OGSR слоты равнозначны, поэтому циклом local m134 = db.actor:item_in_slot(slot) -- предмет в слоте if m134 and ( m134:section() == "wpn_m_134" or m134:section() == "wpn_dshkm" ) then -- проверяем секцию оружия local outfit = db.actor:get_current_outfit() if not outfit or not string.find( outfit:section(), "_exo" ) then -- проверяем секцию БЗК db.actor:move_to_ruck(m134) -- кидаем оружие в инвентарь ГГ update_inventory_window() if counter == 0 then news_text = game.translate_string("dinhud_gatling_text") -- выдаем ньюс по поводу этого db.actor:give_game_news(news_text, "ui\\ui_iconsTotal", Frect():set(0,188,83,47), 0, 3000) counter = counter + 1 end end end end end 1 1 Ссылка на комментарий
Screamand 3 Опубликовано 15 Ноября Поделиться Опубликовано 15 Ноября Приветствую, подскажите ковыряю напарников, имеет ли смысл вообще данные строки: Скрытый текст ... local real_enemy = db.storage[npc:id()].enemy ... if not real_enemy or (real_enemy and not real_enemy:alive()) then db.storage[npc:id()].enemy = who end Потому что иногда ловлю вылет по методу alive, я так понимаю у переменной real_enemy вообще нельзя проверить жив он или нет? 1 Ссылка на комментарий
Norman Eisenherz 312 Опубликовано 15 Ноября Поделиться Опубликовано 15 Ноября Не вижу такого метода в оригинале… Может быть, он возвращает серверный объект вместо клиентского, из-за чего и вылетает проверка alive? Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Screamand 3 Опубликовано 15 Ноября Поделиться Опубликовано 15 Ноября Тоже думал насчет серверного объекта, я просто не особо понимаю для чего вообще нужна эта проверка, типа если врага нет или враг не живой то db.storage[npc:id()].enemy = who, но вот для чего это нужно? (все это в функции we_are_hit в xr_companion) 1 Ссылка на комментарий
Капрал Хикс 531 Опубликовано 15 Ноября Поделиться Опубликовано 15 Ноября @Купер , короче проще сразу переехать на OGSR... 1 1 Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти