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

Скриптование


Svoboда

Рекомендуемые сообщения

Здравствуйте! Сегодня решил попробовать свои силы в создании модов для Сталкера, так как это моя любимая игра. Когда-то раньше пробовал, но почему-то забросил...

Я в основном занимаюсь 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

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...