Перейти к контенту

Black_Raven_03

Проверенные
  • Число публикаций

    71
  • Регистрация

  • Последнее посещение

  • AMKoin

    3,762 [Подарить AMKoin]

Баланс оценок

30

О Black_Raven_03

  • День рождения 18.11.1996

Недавние посетители профиля

1 429 просмотров профиля

Закладки

  1. Проверка на мтоды класса
    Скриптование
    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

    Такими проверками легко можно избавиться от любых вылетов по вызовам несуществующих методов у чего-нибудь. Будь то клиентские, серверные, или еще какие-нибудь объекты. Да хоть вектора.

    И да, такой метод проверки применим к любому движку, на любой платформе сталкера.


  2. Перебор инвенаря в ОГСР
    Скриптование

    Доброго времени суток, прошу помощи!

    Делаю правку к Новому Арсеналу 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 - больше не вылетает...


  3. Перебор инвенаря в ОГСР (другой)
    Скриптование

    Снова нужна помошь, опять Новый Арсенал 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)"
    Что я натворил не так?!


×
×
  • Создать...