Página 1 de 1

Load scripts from modloader

Enviado: 15 Ago 2018, 10:36
por Andriel9
Olá pessoal, eu sou novo nessa área e estou precisando de ajuda no meu mod... Na verdade eu peguei a base do Um_Geek e estou tentando adicionar algumas coisinhas como desativar/ativar mods in-game, até agora só funciona a de ignorar mods pelo .ini mas se me ajudarem em breve poderá funcionar tudo...

Código:

Código: Selecionar tudo

function imgui.OnDrawFrame()
    imgui.Begin(Texts[0], nil, imgui.WindowFlags.AlwaysAutoResize)
    
    imgui.Text(Texts[1])
    for i,v in ipairs(List_Mods) do  -- Disable mod
        imgui.Text(split(v, ".lua")[1])
        imgui.SameLine()
        print(Ignore_Mods)
        if imgui.Button(Texts[2]) then
            table.remove(List_Mods, v)
            table.insert(Ignore_Mods, split(v, getGameDirectory())[1])
            table.insert(Ignore_Mods_Directory, v)
            Read_And_Write_Settings("Settings", "Ignore_Mods", Ignore_Mods)
            Read_And_Write_Settings("Settings", "Ignore_Mods_Directory", Ignore_Mods_Directory)
            reloadScripts()
            Open_And_Close_Menu()
            Open_And_Close_Menu()
        end
    end
    for i,v in ipairs(Ignore_Mods) do -- Enable mod
        imgui.Text(split(v, ".lua")[1])
        imgui.SameLine()
        if imgui.Button(Texts[3]) then
            script.load(Ignore_Mods_Directory[i])
            table.insert(List_Mods,Ignore_Mods_Directory[i])
            Ignore_Mods[i] = nil
            Ignore_Mods_Directory[i] = nil
            Read_And_Write_Settings("Settings", "Ignore_Mods", Ignore_Mods)
            Read_And_Write_Settings("Settings", "Ignore_Mods_Directory", Ignore_Mods_Directory)
            Open_And_Close_Menu()
            Open_And_Close_Menu()
        end
    end
    imgui.End()
end

Estou tentando fazer para que quando aperte no botão "Disable" ou no botão "Enable" ele desative/ative o mod e adicione/remova a linha dele do .ini na parte Ignore_Mods porém ele me retorna isso...

Código: Selecionar tudo

[Settings]
Ignore_Mods_Directory=table: 0x093748f8
Ignore_Mods=table: 0x093748f8

E eu não consigo arrumar e também preciso de ajuda na parte de desativar o mod, o moonloader suporta desativar mods in-game? Se suportar pode me mandar o código pfv que irei arrumar isso...

Obrigado a quem me ajudar.

Re: Load scripts from modloader

Enviado: 15 Ago 2018, 10:46
por Um_Geek
E eu não consigo arrumar e também preciso de ajuda na parte de desativar o mod, o moonloader suporta desativar mods in-game? Se suportar pode me mandar o código pfv que irei arrumar isso...

Não vejo muitas formas de fazer isto, uma seria voce conseguir o identificador de cada mod iniciado para poder ter acesso na hora de querer terminar um definido ou usar reloadScripts() e na hora de reiniciar não reiniciar os configurados para desligarem. uma coisa que sei é que dependendo de como o mod é feito reloadScripts pode causar uns bugs.

Re: Load scripts from modloader

Enviado: 15 Ago 2018, 11:23
por Andriel9
Um_Geek escreveu:
15 Ago 2018, 10:46
E eu não consigo arrumar e também preciso de ajuda na parte de desativar o mod, o moonloader suporta desativar mods in-game? Se suportar pode me mandar o código pfv que irei arrumar isso...

Não vejo muitas formas de fazer isto, uma seria voce conseguir o identificador de cada mod iniciado para poder ter acesso na hora de querer terminar um definido ou usar reloadScripts() e na hora de reiniciar não reiniciar os configurados para desligarem. uma coisa que sei é que dependendo de como o mod é feito reloadScripts pode causar uns bugs. 
Eu já tentei com

Código: Selecionar tudo

reloadScripts()
 
mas não deu certo, tem alguma outra forma?

Re: Load scripts from modloader

Enviado: 15 Ago 2018, 12:29
por Um_Geek
pode tentar pegar o identificador de cada script. para entender como funcionaria pode fazer este teste.

Faça um script com o nome teste.lua com o codigo.

Código: Selecionar tudo

function main()
    while true do 
        wait(80);        
        printStringNow('script ~y~teste.lua ~w~rodando',100);
    end
end

Faça outro com qualquer nome com este codigo. vou chamar de teste_2 :v kk

Código: Selecionar tudo

local terminate_this = 'teste.lua';

function main()
    repeat 
        if testCheat('T65') then
            local lua_list = script.list();
            for i,s in ipairs(lua_list) do
                if terminate_this == s.name then 
                    s:unload();
                end
            end
            printHelpString(terminate_this..' terminado!')
        end
        wait(40);
    until false
end

quando digitar o cheat T65 o teste2 ira terminar o script teste.lua.

Re: Load scripts from modloader

Enviado: 16 Ago 2018, 14:12
por Andriel9
Eu deixei assim:

Código: Selecionar tudo

script_name("Load scripts from modloader")
script_author("Andriel9, Um_Geek")
script_version_number(0.1)

local imgui = require("imgui")
local vkey = require("vkeys")
local inicfg = require("inicfg")
local crc32 = require("lib.crc32ffi")

-- Boolean
local Load_Mods = imgui.ImBool(false)
local Open_Menu = imgui.ImBool(false)
local Disable_Mods = imgui.ImBool(false)

-- Buffer
local Json = imgui.ImBuffer(256)

-- Dict
local Ignore_Mods = {}
local Ignore_Mods_Directory = {}
local List_Mods = {}
local Files = {}
local Settings = {}

-- Nil/Null
local PrevJsonName = nil

-- String
local Texts = {
    [ 0] = "Mod Manager LUA (Andriel9)",
    [ 1] = "List of mods installed.",
    [ 2] = "Disable",
    [ 3] = "Enable",
    [ 4] = "Disabled",
    [ 5] = "Enabled",
    [ 6] = "Mod disabled successfully!",
    [ 7] = "Mod enabled successfully!",
    [ 8] = "Exit"
}

function imgui.OnDrawFrame()
    imgui.SetNextWindowSize(imgui.ImVec2(360, 540), imgui.Cond.FirstUseEver);
    imgui.Begin(Texts[0], nil, imgui.WindowFlags.AlwaysAutoResize) -- Title
    
    imgui.Text(Texts[1])
    
    for i,v in ipairs(List_Mods) do -- Disable mod
        if v ~= nil then
            imgui.Text(v)
            imgui.SameLine()
            if imgui.Button(Texts[2]) then
                table.remove(List_Mods, i)
                table.insert(Ignore_Mods, split(v, ".lua")[1])
                table.insert(Ignore_Mods_Directory, v)
                --Read_And_Write_Settings("Settings", "Ignore_Mods", Ignore_Mods)
                --Read_And_Write_Settings("Settings", "Ignore_Mods_Directory", Ignore_Mods_Directory)
                --reloadScripts()
                for i,s in ipairs(script.list()) do
                    if string.find(split(v, ".lua")[1], s.name) then
                        wait(0)
                        s:unload() -- Unload mod
                        printHelpString(s.name.." "..Texts[4].."!")
                    end
                end
                Open_And_Close_Menu()
                Open_And_Close_Menu()
            end
        end
    end
    
    for i,v in ipairs(Ignore_Mods) do -- Enable mod
        if v ~= nil then
            imgui.Text(v)
            imgui.SameLine()
            if imgui.Button(Texts[3]) then
                for k,s in ipairs(script.list()) do
                    if string.find(split(v, ".lua")[1], s.name) then
                        wait(0)
                        script.load(Ignore_Mods_Directory[i]) -- Load mod
                        printHelpString(s.name.." "..Texts[5].."!")
                    end
                end
                table.insert(List_Mods, Ignore_Mods_Directory[i])
                table.remove(Ignore_Mods, i)
                table.remove(Ignore_Mods_Directory, i)
                --Read_And_Write_Settings("Settings", "Ignore_Mods", Ignore_Mods)
                --Read_And_Write_Settings("Settings", "Ignore_Mods_Directory", Ignore_Mods_Directory)
                Open_And_Close_Menu()
                Open_And_Close_Menu()
            end
        end
    end
    
    if imgui.Button(Texts[8]) then
        Open_And_Close_Menu()
    end
    imgui.End()
end

function main()
    List_Mods = {}
    Ignore_Mods = {}
    Ignore_Mods_Directory = {}
    Load_Settings()
    if not Load_Mods.v then
        local handle = io.popen('dir "'..getGameDirectory()..'\\modloader\\*.lua" /b /s /A-D')
        while true do
            local mod = handle:read()
            if mod == nil then break end
            for i,v in ipairs(Ignore_Mods_Directory) do
                if not string.find(v, mod) then
                    table.insert(List_Mods, mod)
                end
            end
        end
        handle:close()
        for i,v in ipairs(List_Mods) do
            wait(0)
            script.load(v)
        end
        Load_Mods.v = true
    end
    repeat
        if isPlayerControlOn(PLAYER_HANDLE) then
            if isKeyJustPressed(vkey.VK_ADD) then
                Open_And_Close_Menu()
            end
        end
        wait(4)
    until false
end

function Open_And_Close_Menu()
    if Open_Menu.v then
        Open_Menu.v = false
    else
        Open_Menu.v = true
    end
    imgui.Process = Open_Menu.v
end

function Load_Settings()
    -- Load .ini --
    local file = getGameDirectory().."\\moonloader\\config\\Load_scripts_from_modloader.ini"
    local hFile, err = io.open(file,"r") -- Open file
    local i=0
    if hFile and not err then
        while true do
            local line = hFile:read() -- Read file content
            if line==nil then break end
            Settings[i] = line
            i = i + 1
        end
        io.close(hFile) -- Close file
    else
        print(err)
    end
    
    -- Get settings --
    local Value = nil
    
    -- Mods to ignore
    Value = Read_And_Write_Settings("Settings", "Ignore_Mods", nil)
    for i,v in ipairs(split(Value, ";")) do
        if v == nil then break end
        if v ~= nil then
            table.insert(Ignore_Mods, v..".lua")
        end    
    end
    
    -- Directory of mods to ignore
    Value = Read_And_Write_Settings("Settings", "Ignore_Mods_Directory", nil)
    for i,v in ipairs(split(Value, ";")) do
        if v == nil then break end
        if v ~= nil then
            table.insert(Ignore_Mods_Directory, v)
        end    
    end
end

function Read_And_Write_Settings(Main, Key, Val)
    local file = getGameDirectory().."\\moonloader\\config\\Load_scripts_from_modloader.ini"
    if doesFileExist(file) then
        if Val == nil then
            local Table = inicfg.load(nil,file)
            if Table[Main]~=nil then
                local str = Table[Main][Key]
                if str ~= nil then return str end
            end
        else
            local Table = inicfg.load(nil,file)
            Table[Main][Key] = Val
            if inicfg.save(Table, file) then return Val end    
        end
    end
    return nil
end

--- Functions
function split(text, delimiter)
    result = {};
    for match in (text..delimiter):gmatch("(.-)"..delimiter) do
        table.insert(result, match);
    end
    return result;
end
Porém os mods nem desativam/ativam, apenas no menu, e como faço para tipo: desse jeito que eu fiz, se tiver 2 ou + mods ativados/desativados, o botão do 2º+ não funciona, apenas do primeiro, o que eu posso fazer para arrumar isso?

Re: Load scripts from modloader

Enviado: 20 Ago 2018, 21:15
por Um_Geek

botão do 2º+ não funciona, apenas do primeiro, o que eu posso fazer para arrumar isso?


Isto é porque no imgui cada botão tem que ter um label individual.