Николай1 1 Опубликовано 11 Апреля 2015 Здравствуйте! Сегодня решил попробовать свои силы в создании модов для Сталкера, так как это моя любимая игра. Когда-то раньше пробовал, но почему-то забросил...Я в основном занимаюсь Web-программированием, а сегодня попробовал скрипты, минут за 20 сделал такую штуку, как механизм событий и их обработчиков, это что-то вроде биндинга, но по-другому работает.Принцип сейчас покажу в коде: function handler() -- Тут всякий код end function handler2() -- Тут всякий код end setHander("test_action", handler) setHander("test_action", handler2) setAction("test_acton") -- Будет выполнен код из функций handler() и hander2() Такая штука будет очень полезна, когда нужно обработать какое-то событие в моде и вся эта система должна содержаться в порядке.Вызывать события можно вообще любые:setAction("bla-bla-bla"). Если нет обработчиков, то ничего не произойдёт, но ошибок не будетРегистрировать обработчики можно в любом месте любого скрипта, будет работать.Например при заходе на локацию вызывать событие on_location_zaton, тогда можно будет событие обрабатывать.В общем система очень простая и полезная, можно много применений найти. Её можно использовать в любой версии Сталкера, так как она использует только возможности языка LuaТакже в приведённом коде есть ещё некоторые функции, они может и не самые полезные, но их тоже можно использовать.Я хочу заделать что-то вроде прослойки между теми скриптовыми функциями, что сейчас есть и модами, чтобы облегчить использование некоторых возможностей. Мог объяснить не очень понятно, просто спать уже хочу... Критикуйте) буду только рад Как вам моя идея? Есть ли у неё перспективы?Если есть предложения, чего бы ещё сделать, предлагайте) --[[ MOD TOOLS 0.0.1 Инструменты для облегчения модификаций Разработчик: Николай1 ]] -- Массив с обработчиками hooks = {} --[[ Вызов события. Вызов происходит корректно и не вызывает ошибок, даже если не было зарегистрировано обработчиков для этого события. В таком случае функция возвращает false action_name [String] - название события Пример: setAction("test_action") ]] function setAction(action_name) if hooks[action_name] == nil then return false end for action,hook in pairs(hooks[action_name]) do hook() end end --[[ Добавление обработчика к событию. Можно добавлять много обработчиков для одного события action_name [String] - название события handler [Callback] - функция-обаботчик Пример: function handler() -- Тут всякий код end function handler2() -- Тут всякий код end setHander("test_action", handler) setHander("test_action", handler2) ]] function setHandler(action_name, handler) if hooks[action_name] == nil then hooks[action_name] = {} end table.insert(hooks[action_name], handler) end --[[ Эта функция лишняя, её использовал для теста механизма событий ]] function route() setAction("test") end -- Создать предмет под ногами игрока -- [String] item - код предмета, например medkit -- [Int] count - количиство предметов function spawnNearActor(item, count) if count == nil then alife():create(item, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id()) else for i = 1, count do alife():create(item, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id()) end end end -- Создать предмет в инвентаре игрока -- [String] item - код предмета, например medkit function addToActorInventory(item, count) addToInventory(item, db.actor:id(), db.actor:position(), db.actor:game_vertex_id(), count); end -- Создать предмет в инвентаре -- [String] item - код предмета, например medkit -- [Int] character_id - ID персонажа, которому нужно создать предмет -- [Vector] position - координаты добавления объекта -- [Int] game_vertex_id - game_vertex_id для создания предмета -- [Int] count - количиство предметов function addToInventory(item, character_id, position, game_vertex_id, count) if count == nil or count == 1 then alife():create(item, position, 1, game_vertex_id, character_id) else for i = 1, count do alife():create(item, position, 1, game_vertex_id, character_id) end end end -- Сохранить значение переменной -- [String] variable_name - название переменной -- [Mixed] value - значение переменной function setVar(variable_name, value) xr_logic.pstor_store(db.actor, variable_name, value) end -- Получить значение переменной -- [String] variable_name - название переменной -- [Mixed] default_value - значение по-умолчанию, значение переменной, которое будет возвращено, -- если переменной не существует function getVar(variable_name, default_value) return xr_logic.pstor_retrieve(db.actor, variable_name, default_value) end --[[ Действия с переменной с помощью одной функции variable_name [String] - название переменной value [Mixed] - значение переменной (или значение по-умолчанию) is_set [Bool] - флаг создания переменной. Если стоит 1 - будет использовано действие "Сохранить значение переменной" Примеры использования: Получение значения переменной: var("test_var", false) -- Второй аргумент - значение по-умолчанию var("test_var", false, false) -- Третив аргумент - отключение флага установки переменной Установка значения переменной var("test_var", "test_value", true) ]] function var(variable_name, value, is_set) -- Если is_set не задан, ставим false if (is_set == nil) then is_set = false end if (is_set == false) then -- Если is_set равен 0 или false, то получаем значение переменной return _getVar(variable_name, value) else -- Если стоит флаг создания, то устанавливаем значение переменной return _setVar(variable_name, value) end end --[[ Выполнить какую-либо функцию заданное число раз ]] --[[ function runFunction(func, count, ...) if count == nil or count = 1 then func(arg) else for i = 1, count do func(arg) end end end ]] 1 Поделиться этим сообщением Ссылка на сообщение