Вопрос порт плагина

  • 31
  • 0
Контакты для связи отсутствуют.
Как портировать нижеупомянутые фрагменты кода с ClockWork на Helix?
sv_hooks.lua:
function PLUGIN:OnePlayerSecond(player, curTime, infoTable)
    if player:GetCharacter() and player:Alive() then
        local jailtime = player:GetCharacterData("CP_JTime", 0)
        local jailreason = player:GetCharacterData("CP_JReason", "#N")

        if jailreason != "#N" then
            if jailtime > 0 then   
                player:SetCharacterData("CP_JTime", jailtime - 1)
            elseif jailtime <= 0 then
                if !player.isolationRemind or CurTime() >= player.isolationRemind then
                    local mark = (player:GetFaction() == FACTION_MPF or player:GetFaction() == FACTION_OTA) and " юнита " or " объекта "
                    self:SayCPRadio(nil, "Изоляция"..mark.."#"..Schema:GetDigits(player).." завершена.")
                    player.isolationRemind = CurTime() + 60
                end
            end
        end
    end
end

sh_plugin.lua:
local PLUGIN = PLUGIN

util.Include("sv_hooks.lua")

sh_jailrequest.lua:
local PLUGIN = PLUGIN
local COMMAND = cw.command:New("JailRequest");
COMMAND.tip = "Request an isolation for citizen.";
COMMAND.text = "<string CID> <string REASON> <number TIME(min)>";
COMMAND.flags = bit.bor(CMD_DEFAULT, CMD_DEATHCODE, CMD_FALLENOVER);
COMMAND.arguments = 3;

-- Called when the command has been run.
function COMMAND:OnRun(combine, arguments)
    if combine:GetFaction() == FACTION_MPF then
        local stringCID = arguments[1]
        local stringREASON = arguments[2]
        local numberTIME = tonumber(arguments[3])

        for k,v in pairs(player.GetAll()) do
            if Schema:GetDigits(v) == stringCID then
                if v:GetCharacterData("CP_JReason") == "#N" then
                    cw.player:SayRadio(combine, "Центр, запрашиваю изоляцию гражданина #"..stringCID..", причина: "..stringREASON..", время изоляции: "..numberTIME.." минут.", true)

                    v:SetCharacterData("CP_JReason", stringREASON)                       
                    v:SetCharacterData("CP_JTime", numberTIME * 60)                   
                    
                    timer.Simple(2, function()
                        chatbox.AddText(combine, center.."Запрос изоляции гражданина #"..stringCID.." был подтвержден."..centerend, {filter = "default", textColor = Color(10, 200, 10, 255), icon = false, radius = 0})
                    end)
                end
                return
            end
        end
    end
end;

COMMAND:Register();

sh_jailinforequest.lua:
local PLUGIN = PLUGIN
local COMMAND = cw.command:New("JailInfoRequest");
COMMAND.tip = "Request information about isolated citizens.";
COMMAND.text = "";
COMMAND.flags = bit.bor(CMD_DEFAULT, CMD_DEATHCODE, CMD_FALLENOVER);
COMMAND.arguments = 0;

-- Called when the command has been run.
function COMMAND:OnRun(combine, arguments)
    local center = "Центр говорит по рации <:: "
    local centerend = " ::>"
    if Schema:PlayerIsCombine(combine) then
        cw.player:SayRadio(combine, "Запрашиваю информацию о заключённых.", true)

        timer.Simple(2, function()                   
            combine:EmitSound("npc/combine_soldier/vo/off"..math.random(1, 2)..".wav")
            chatbox.AddText(combine, center.."Запрос информации о заключённых был подтвержден."..centerend, {filter = "default", textColor = Color(10, 200, 10, 255), icon = false, radius = 0})
            local i = 0
            for k, v in pairs(player.GetAll()) do
                if v:GetCharacterData("CP_JReason", "#N") != "#N" then
                    local citizenID = Schema:GetDigits(v)   
                    i = i + 1
                    chatbox.AddText(combine, center..i..". "..v:Name().." #"..citizenID.."."..centerend, {filter = "default", textColor = Color(10, 200, 10, 255), icon = false, radius = 0})
                    chatbox.AddText(combine, center.."Причина задержания: "..v:GetCharacterData("CP_JReason").."."..centerend, {filter = "default", textColor = Color(10, 200, 10, 255), icon = false, radius = 0})
                    chatbox.AddText(combine, center.."Осталось: "..math.Round((tonumber(v:GetCharacterData("CP_JTime", 0))/60)).." минут(ы/а)."..centerend, {filter = "default", textColor = Color(10, 200, 10, 255), icon = false, radius = 0})
                end
            end
        end)
    end
end

COMMAND:Register();
 
  • 47
  • 1
  • 7
Контакты для связи отсутствуют.
Для портирования этих фрагментов кода с ClockWork на Helix вам необходимо выполнить следующие шаги:

1. Создайте новый плагин в Helix. Вы можете создать папку с именем вашего плагина в папке addons/helix/plugins.

2. Создайте файлы sh_plugin.lua и sv_hooks.lua в папке вашего плагина.

3. Скопируйте код из файла sh_plugin.lua и вставьте его в файл sh_plugin.lua вашего нового плагина в Helix.

4. Скопируйте код из файла sv_hooks.lua и вставьте его в файл sv_hooks.lua вашего нового плагина в Helix.

5. Внесите необходимые изменения в код, чтобы он соответствовал Helix API. Например, функция OnePlayerSecond() должна быть изменена на функцию Tick() с использованием хука TickInterval.
Приведенный ниже код может помочь вам начать портирование кода:
sv_hooks.lua::
function PLUGIN:Tick()
    -- здесь код для функции Tick()
end

sh_plugin.lua:
local PLUGIN = PLUGIN

function PLUGIN:InitPostEntity()
    timer.Create("MyPluginTimer", 1, 0, function()
        self:Tick()
    end)
end
sv_hooks.lua::
sv_hooks.lua:
function PLUGIN:Tick()
    for _, player in ipairs(player.GetAll()) do
        if player:GetCharacter() and player:Alive() then
            local jailtime = player:GetCharacter():GetData("CP_JTime", 0)
            local jailreason = player:GetCharacter():GetData("CP_JReason", "#N")

            if jailreason != "#N" then
                if jailtime > 0 then   
                    player:GetCharacter():SetData("CP_JTime", jailtime - 1)
                elseif jailtime <= 0 then
                    if !player.isolationRemind or CurTime() >= player.isolationRemind then
                        local mark = (player:GetFaction() == FACTION_MPF or player:GetFaction() == FACTION_OTA) and " юнита " or " объекта "
                        self:SayCPRadio(nil, "Изоляция"..mark.."#"..Schema:GetDigits(player).." завершена.")
                        player.isolationRemind = CurTime() + 60
                    end
                end
            end
        end
    end
end

sh_plugin.lua:
local PLUGIN = PLUGIN

function PLUGIN:InitPostEntity()
    timer.Create("JailTimer", 1, 0, function()
        self:Tick()
    end)
end

function PLUGIN:SayCPRadio(speaker, text)
    -- здесь код для отправки сообщения на радио
end

function PLUGIN:Tick()
    -- здесь код для функции Tick()
end

sh_jailrequest.lua:
Создайте новую команду в Helix, которая будет использоваться вместо "JailRequest".
Замените "cw.command:New" на "ix.command.Register".
Измените аргументы команды на соответствующие аргументы команды Helix.
Замените "cw.player:SayRadio" на "ix.chat.Send" с аргументом "nil" в качестве отправителя.
Измените "Schema:GetDigits" на "ix.util.GetCharactersByInfo".
Измените "v:GetCharacterData" на "v:GetCharacter():GetData".
Измените "v:SetCharacterData" на "v:GetCharacter():SetData".
Замените "chatbox.AddText" на "ix.chat.Send" с аргументом "combine" в качестве отправителя.

sh_jailrequest.lua::
local PLUGIN = PLUGIN
local COMMAND = ix.command.Register({
    name = "JailRequest",
    description = "Request an isolation for citizen.",
    arguments = {
        ix.type.character,
        ix.type.string,
        ix.type.number
    }
})

-- Called when the command has been run.
function COMMAND:OnRun(client, target, reason, time)
    if client:GetFaction() == "MPF" then
        local stringCID = target:GetCharacter():GetInfo("cid")
        local stringREASON = reason
        local numberTIME = tonumber(time)

        for k,v in pairs(player.GetAll()) do
            if ix.util.GetCharactersByInfo(v, "cid") == stringCID then
                if v:GetCharacter():GetData("CP_JReason") == "#N" then
                    ix.chat.Send(nil, "cp", "Центр, запрашиваю изоляцию гражданина #"..stringCID..", причина: "..stringREASON..", время изоляции: "..numberTIME.." минут.", true)

                    v:GetCharacter():SetData("CP_JReason", stringREASON)
                    v:GetCharacter():SetData("CP_JTime", numberTIME * 60)

                    timer.Simple(2, function()
                        ix.chat.Send(client, "cp", "Запрос изоляции гражданина #"..stringCID.." был подтвержден.", true)
                    end)
                end
                return
            end
        end
    end
end

COMMAND:Register()
sh_jailinforequest.lua:
Замените "cw.command:New" на "ix.command.Register".
Измените аргументы команды на соответствующие аргументы команды Helix.
Замените "Schema:PlayerIsCombine" на "client:GetFaction() == "MPF"".
Измените "cw.player:SayRadio" на "ix.chat.Send" с аргументом "nil" в качестве отправителя.
Измените "Schema:GetDigits" на "ix.util.GetCharactersByInfo".
Измените "v:GetCharacterData" на "v:GetCharacter():GetData".
Замените "chatbox.AddText" на "ix.chat.Send" с аргументом "combine" в качестве отправителя.
Lua:
local PLUGIN = PLUGIN
local COMMAND = ix.command.Register({
    name = "JailInfoRequest",
    description = "Request information about isolated citizens.",
    arguments = {}
})

-- Called when the command has been run.
function COMMAND:OnRun(client)
    local center = "Центр говорит по рации <:: "
    local centerend = " ::>"
    if client:GetFaction() == "MPF" then
        ix.chat.Send(nil, "cp", "Запрашиваю информацию о заключённых.", true)

        timer.Simple(2, function()                   
            client:EmitSound("npc/combine_soldier/vo/off"..math.random(1, 2)..".wav")
            ix.chat.Send(client, "cp", "Запрос информации о заключённых был подтвержден.", true)
            local i = 0
            for k, v in pairs(player.GetAll()) do
                if v:GetCharacter():GetData("CP_JReason", "#N") != "#N" then
                    local citizenID = ix.util.GetCharactersByInfo(v, "cid")
                    i = i + 1
                    ix.chat.Send(client, "cp", i..". "..v:Name().." #"..citizenID..".", true)
                    ix.chat.Send(client, "cp", "Причина задержания: "..v:GetCharacter():GetData("CP_JReason")..".", true)
                    ix.chat.Send(client, "cp", "Осталось: "..math.Round((
 
Сверху Снизу