-
Число публикаций
71 -
Регистрация
-
Последнее посещение
-
AMKoin
3,762 [Подарить AMKoin]
Закладки
-
Проверка на мтоды класса
Скриптование06.05.2024 в 14:38, Balavnik сказал:А где-то можно список получить этих методов?
lua_help.script, или форумы, или исходники движка на котором работаешь, (Последнее - самое надежное. Остальные могут врать).
Но кроме этого..
Есть надежный метод проверить наличие определенного метода у определенного объекта.
function check_obj_has_method(obj, method_name) if not obj then return false end if obj and obj[method_name] and type(obj[method_name]) == 'function' then return true end return false end -- Пример использования: local actor = db.actor check_obj_has_method(actor, 'section') -- вернет true check_obj_has_method(actor, 'id') -- вернет true check_obj_has_method(actor, 'section_name') -- вернет false check_obj_has_method(obj, 'section') -- Вернет false, т.к. obj не определен в данной области видимости.
Ну или просто
if obj and obj.какой_то_метод and type(obj.какой_то_метод) == 'function' then obj:какой_то_метод(аргументы) -- Вызываем наш метод. else -- Тут можно сообщить в лог, что у этого объекта нет такого метода, и как-то иначе эту ситуацию обработать. end
Такими проверками легко можно избавиться от любых вылетов по вызовам несуществующих методов у чего-нибудь. Будь то клиентские, серверные, или еще какие-нибудь объекты. Да хоть вектора.
И да, такой метод проверки применим к любому движку, на любой платформе сталкера.
-
Перебор инвенаря в ОГСР
СкриптованиеДоброго времени суток, прошу помощи!
Делаю правку к Новому Арсеналу 7 (движок ОГСР от сен 2020, без возможности смены версии) с таким кодом:
local sect = wpn:section() local sil_sect = get_string( sect, "silencer_name" ) if not sil_sect then return end local sil_obj = level.object_by_id(0) db.actor:inventory_for_each( function( temp_sil, db.actor) if temp_sil and db.actor:is_in_ruck(temp_sil) and temp_sil:is_silencer() and temp_sil:section() == sil_sect then sil_obj = temp_sil end end )
, на что получаю ошибку "invalid key to next"
Вопрос: а куда копать-то?
Правка: сделал через iterate_inventory - больше не вылетает...
-
Перебор инвенаря в ОГСР (другой)
СкриптованиеСнова нужна помошь, опять Новый Арсенал 7, соотв. ОГСР 2020г.
Мне нужно найти и удалить один предмет в инвентаре из нескольких одинаковых, когда делаю так:
local item, sil_items db.actor:iterate_ruck( function(dummy, item) if item.section == sil_sect then table.insert(sil_items, item:id()) end end ) if sil_items[1] ~= nil then db.actor:mark_item_dropped(level.object_by_id(sil_items[1])) alife():release(alife():object(sil_items[1])) else return end
получаю ошибку вида "attempt to index a local sil_items (a nil value)"
Что я натворил не так?!