Вопрос Можно ли сделать маск ченжер в пандоре?

Начинающий
Статус
Оффлайн
Регистрация
18 Апр 2023
Сообщения
69
Реакции[?]
6
Поинты[?]
6K
Вроде как да потому, что там есть ffi. Но никогда не видел подобного. Только модел ченжер. Скорее всего никому не интересно всерьез написание на нее луашек.
 
Начинающий
Статус
Оффлайн
Регистрация
28 Ноя 2022
Сообщения
29
Реакции[?]
0
Поинты[?]
0
Да можно, например в tornado lua есть маск ченджер, но там под обфой
 
Участник
Статус
Оффлайн
Регистрация
4 Мар 2021
Сообщения
882
Реакции[?]
176
Поинты[?]
90K
Да можно, например в tornado lua есть маск ченджер, но там под обфой
я пытался вынести нахуй, 3 раза реализовал, в итоге нихуя не меняло просто. хз ща попробую щераз
 
Начинающий
Статус
Оффлайн
Регистрация
28 Ноя 2022
Сообщения
29
Реакции[?]
0
Поинты[?]
0
я пытался вынести нахуй, 3 раза реализовал, в итоге нихуя не меняло просто. хз ща попробую щераз
По моему все же нельзя, ибо градиент можно только рендерить
 
Участник
Статус
Оффлайн
Регистрация
4 Мар 2021
Сообщения
882
Реакции[?]
176
Поинты[?]
90K
Участник
Статус
Оффлайн
Регистрация
4 Мар 2021
Сообщения
882
Реакции[?]
176
Поинты[?]
90K
Начинающий
Статус
Оффлайн
Регистрация
12 Май 2022
Сообщения
224
Реакции[?]
27
Поинты[?]
29K
сделал? маскченджер
краши фиксанул, сурсов уже нету, как и всех луашек, но там xor хуево работает
Ждём слив сурса :roflanEbalo:
Код:
local ffi = require "ffi"
local bit = require "bit"

local __thiscall = function(func, this)
    return function(...) return func(this, ...) end
end

local interface_ptr = ffi.typeof("void***")

local vtable_bind = function(_module, interface, index, typedef)
    local addr = ffi.cast("void***", client.create_interface(_module, interface)) or error(interface .. " was not found")
    return __thiscall(ffi.cast(typedef, addr[0][index]), addr)
end
local vtable_entry = function(instance, i, ct)
    return ffi.cast(ct, ffi.cast(interface_ptr, instance)[0][i])
end
local vtable_thunk = function(i, ct)
    local t = ffi.typeof(ct)

    return function(instance, ...)
        return vtable_entry(instance, i, t)(instance, ...)
    end
end

local get_class_name = vtable_thunk(143, "const char*(__thiscall*)(void*)")
local set_model_index = vtable_thunk(75, "void(__thiscall*)(void*,int)")

local get_client_entity_from_handle = vtable_bind("client.dll", "VClientEntityList003", 4, "void*(__thiscall*)(void*,void*)")
local get_model_index = vtable_bind("engine.dll", "VModelInfoClient004", 2, "int(__thiscall*)(void*, const char*)")

local rawientitylist = client.create_interface("client.dll", "VClientEntityList003") or error("VClientEntityList003 was not found", 2)

local ientitylist = ffi.cast(interface_ptr, rawientitylist) or error("rawientitylist is nil", 2)
local get_client_entity = ffi.cast("void*(__thiscall*)(void*, int)", ientitylist[0][3]) or error("get_client_entity was not found", 2)

local client_string_table_container = ffi.cast(interface_ptr, client.create_interface("engine.dll", "VEngineClientStringTable001")) or error("VEngineClientStringTable001 was not found", 2)
local find_table = vtable_thunk(3, "void*(__thiscall*)(void*, const char*)")

local model_info = ffi.cast(interface_ptr, client.create_interface("engine.dll", "VModelInfoClient004")) or error("VModelInfoClient004 wasnt found", 2)

ffi.cdef [[
    typedef void(__thiscall* find_or_load_model_t)(void*, const char*);
]]

local add_string = vtable_thunk(8, "int*(__thiscall*)(void*, bool, const char*, int length, const void* userdata)")
--local find_or_load_model = ffi.cast("find_or_load_model_t", model_info[0][43]) -- vtable_thunk crashes (?)
local find_or_load_model = vtable_thunk(43, "find_or_load_model_t")

local function get_player_address(lp)
    return get_client_entity(ientitylist, lp:index())
end

local function _precache(szModelName)
    if szModelName == "" then return end -- don't precache empty strings (crash)
    if szModelName == nil then return end

    szModelName = string.gsub(szModelName, [[\]], [[/]])
    local m_pModelPrecacheTable = find_table(client_string_table_container, "modelprecache")

    if m_pModelPrecacheTable ~= nil then
        find_or_load_model(model_info, szModelName)
        add_string(m_pModelPrecacheTable, false, szModelName, -1, nil)
    end
end
local function precache(modelPath)
    if modelPath == "" then return -1 end -- don't crash.

    local local_model_index = get_model_index(modelPath)

    if local_model_index == -1 then
        _precache(modelPath)
    end

    return get_model_index(modelPath)
end

local masks = {
    "None",
    "Dallas",
    "Battle Mask",
    "Evil Clown",
    "Anaglyph",
    "Boar",
    "Bunny",
    "Bunny Gold",
    "Chains",
    "Chicken",
    "Devil Plastic",
    "Hoxton",
    "Pumpkin",
    "Samurai",
    "Sheep Bloody",
    "Sheep Gold",
    "Sheep Model",
    "Skull",
    "Template",
    "Wolf",
    "Doll",
}
local models = {
    "",
    "models/player/holiday/facemasks/facemask_dallas.mdl",
    "models/player/holiday/facemasks/facemask_battlemask.mdl",
    "models/player/holiday/facemasks/evil_clown.mdl",
    "models/player/holiday/facemasks/facemask_anaglyph.mdl",
    "models/player/holiday/facemasks/facemask_boar.mdl",
    "models/player/holiday/facemasks/facemask_bunny.mdl",
    "models/player/holiday/facemasks/facemask_bunny_gold.mdl",
    "models/player/holiday/facemasks/facemask_chains.mdl",
    "models/player/holiday/facemasks/facemask_chicken.mdl",
    "models/player/holiday/facemasks/facemask_devil_plastic.mdl",
    "models/player/holiday/facemasks/facemask_hoxton.mdl",
    "models/player/holiday/facemasks/facemask_pumpkin.mdl",
    "models/player/holiday/facemasks/facemask_samurai.mdl",
    "models/player/holiday/facemasks/facemask_sheep_bloody.mdl",
    "models/player/holiday/facemasks/facemask_sheep_gold.mdl",
    "models/player/holiday/facemasks/facemask_sheep_model.mdl",
    "models/player/holiday/facemasks/facemask_skull.mdl",
    "models/player/holiday/facemasks/facemask_template.mdl",
    "models/player/holiday/facemasks/facemask_wolf.mdl",
    "models/player/holiday/facemasks/porcelain_doll.mdl",
}

local list = ui.add_dropdown("Mask Changer", masks)

local last_model = 0
local model_index = -1
local enabled = false

callbacks.register("paint", function()
    if not engine.in_game() then
        last_model = 0
        return
    end
    if last_model ~= list:get() then
        last_model = list:get()
        if last_model == 0 then
            enabled = false
        else
            enabled = true
            model_index = precache(models[last_model + 1])
        end
    end
end)

callbacks.register("predicted_move", function(_) -- what the fuck is "pre_prediction"???
    if model_index == -1 then return precache(models[last_model + 1]) end

    local local_player = entity_list.get_client_entity(engine.get_local_player())

    if enabled then
        local lp_addr = ffi.cast("intptr_t*", get_player_address(local_player))
        local m_AddonModelsHead = ffi.cast("intptr_t*", lp_addr + 0x462F) -- E8 ? ? ? ? A1 ? ? ? ? 8B CE 8B 40 10
        local i, next_model = m_AddonModelsHead[0], -1

        while i ~= -1 do
            next_model = ffi.cast("intptr_t*", lp_addr + 0x462C)[0] + 0x18 * i -- this is the pModel (CAddonModel) afaik
            i = ffi.cast("intptr_t*", next_model + 0x14)[0]

            local m_pEnt = ffi.cast("intptr_t**", next_model)[0] -- CHandle<C_BaseAnimating> m_hEnt -> Get()
            local m_iAddon = ffi.cast("intptr_t*", next_model + 0x4)[0]

            if tonumber(m_iAddon) == 16 then -- face mask addon bits knife = 10
                local entity = get_client_entity_from_handle(m_pEnt)
                set_model_index(entity, model_index)
            end
        end
    end
end)

callbacks.register("pre_frame_stage", function(stage)
    if stage ~= 5 then return end

    local local_player = entity_list.get_client_entity(engine.get_local_player())

    if local_player == nil then return end

    if enabled then
        if bit.band(local_player:get_prop("DT_CSPlayer", "m_iAddonBits"):get_int(), 0x10000) ~= 0x10000 then
            local_player:get_prop("DT_CSPlayer", "m_iAddonBits"):set_int(0x10000 + local_player:get_prop("DT_CSPlayer", "m_iAddonBits"):get_int())
        end
    else
        if bit.band(local_player:get_prop("DT_CSPlayer", "m_iAddonBits"):get_int(), 0x10000) == 0x10000 then
            local_player:get_prop("DT_CSPlayer", "m_iAddonBits"):set_int(local_player:get_prop("DT_CSPlayer", "m_iAddonBits"):get_int() - 0x10000)
        end
    end
end)
 
Участник
Статус
Оффлайн
Регистрация
4 Мар 2021
Сообщения
882
Реакции[?]
176
Поинты[?]
90K
Код:
local ffi = require "ffi"
local bit = require "bit"

local __thiscall = function(func, this)
    return function(...) return func(this, ...) end
end

local interface_ptr = ffi.typeof("void***")

local vtable_bind = function(_module, interface, index, typedef)
    local addr = ffi.cast("void***", client.create_interface(_module, interface)) or error(interface .. " was not found")
    return __thiscall(ffi.cast(typedef, addr[0][index]), addr)
end
local vtable_entry = function(instance, i, ct)
    return ffi.cast(ct, ffi.cast(interface_ptr, instance)[0][i])
end
local vtable_thunk = function(i, ct)
    local t = ffi.typeof(ct)

    return function(instance, ...)
        return vtable_entry(instance, i, t)(instance, ...)
    end
end

local get_class_name = vtable_thunk(143, "const char*(__thiscall*)(void*)")
local set_model_index = vtable_thunk(75, "void(__thiscall*)(void*,int)")

local get_client_entity_from_handle = vtable_bind("client.dll", "VClientEntityList003", 4, "void*(__thiscall*)(void*,void*)")
local get_model_index = vtable_bind("engine.dll", "VModelInfoClient004", 2, "int(__thiscall*)(void*, const char*)")

local rawientitylist = client.create_interface("client.dll", "VClientEntityList003") or error("VClientEntityList003 was not found", 2)

local ientitylist = ffi.cast(interface_ptr, rawientitylist) or error("rawientitylist is nil", 2)
local get_client_entity = ffi.cast("void*(__thiscall*)(void*, int)", ientitylist[0][3]) or error("get_client_entity was not found", 2)

local client_string_table_container = ffi.cast(interface_ptr, client.create_interface("engine.dll", "VEngineClientStringTable001")) or error("VEngineClientStringTable001 was not found", 2)
local find_table = vtable_thunk(3, "void*(__thiscall*)(void*, const char*)")

local model_info = ffi.cast(interface_ptr, client.create_interface("engine.dll", "VModelInfoClient004")) or error("VModelInfoClient004 wasnt found", 2)

ffi.cdef [[
    typedef void(__thiscall* find_or_load_model_t)(void*, const char*);
]]

local add_string = vtable_thunk(8, "int*(__thiscall*)(void*, bool, const char*, int length, const void* userdata)")
--local find_or_load_model = ffi.cast("find_or_load_model_t", model_info[0][43]) -- vtable_thunk crashes (?)
local find_or_load_model = vtable_thunk(43, "find_or_load_model_t")

local function get_player_address(lp)
    return get_client_entity(ientitylist, lp:index())
end

local function _precache(szModelName)
    if szModelName == "" then return end -- don't precache empty strings (crash)
    if szModelName == nil then return end

    szModelName = string.gsub(szModelName, [[\]], [[/]])
    local m_pModelPrecacheTable = find_table(client_string_table_container, "modelprecache")

    if m_pModelPrecacheTable ~= nil then
        find_or_load_model(model_info, szModelName)
        add_string(m_pModelPrecacheTable, false, szModelName, -1, nil)
    end
end
local function precache(modelPath)
    if modelPath == "" then return -1 end -- don't crash.

    local local_model_index = get_model_index(modelPath)

    if local_model_index == -1 then
        _precache(modelPath)
    end

    return get_model_index(modelPath)
end

local masks = {
    "None",
    "Dallas",
    "Battle Mask",
    "Evil Clown",
    "Anaglyph",
    "Boar",
    "Bunny",
    "Bunny Gold",
    "Chains",
    "Chicken",
    "Devil Plastic",
    "Hoxton",
    "Pumpkin",
    "Samurai",
    "Sheep Bloody",
    "Sheep Gold",
    "Sheep Model",
    "Skull",
    "Template",
    "Wolf",
    "Doll",
}
local models = {
    "",
    "models/player/holiday/facemasks/facemask_dallas.mdl",
    "models/player/holiday/facemasks/facemask_battlemask.mdl",
    "models/player/holiday/facemasks/evil_clown.mdl",
    "models/player/holiday/facemasks/facemask_anaglyph.mdl",
    "models/player/holiday/facemasks/facemask_boar.mdl",
    "models/player/holiday/facemasks/facemask_bunny.mdl",
    "models/player/holiday/facemasks/facemask_bunny_gold.mdl",
    "models/player/holiday/facemasks/facemask_chains.mdl",
    "models/player/holiday/facemasks/facemask_chicken.mdl",
    "models/player/holiday/facemasks/facemask_devil_plastic.mdl",
    "models/player/holiday/facemasks/facemask_hoxton.mdl",
    "models/player/holiday/facemasks/facemask_pumpkin.mdl",
    "models/player/holiday/facemasks/facemask_samurai.mdl",
    "models/player/holiday/facemasks/facemask_sheep_bloody.mdl",
    "models/player/holiday/facemasks/facemask_sheep_gold.mdl",
    "models/player/holiday/facemasks/facemask_sheep_model.mdl",
    "models/player/holiday/facemasks/facemask_skull.mdl",
    "models/player/holiday/facemasks/facemask_template.mdl",
    "models/player/holiday/facemasks/facemask_wolf.mdl",
    "models/player/holiday/facemasks/porcelain_doll.mdl",
}

local list = ui.add_dropdown("Mask Changer", masks)

local last_model = 0
local model_index = -1
local enabled = false

callbacks.register("paint", function()
    if not engine.in_game() then
        last_model = 0
        return
    end
    if last_model ~= list:get() then
        last_model = list:get()
        if last_model == 0 then
            enabled = false
        else
            enabled = true
            model_index = precache(models[last_model + 1])
        end
    end
end)

callbacks.register("predicted_move", function(_) -- what the fuck is "pre_prediction"???
    if model_index == -1 then return precache(models[last_model + 1]) end

    local local_player = entity_list.get_client_entity(engine.get_local_player())

    if enabled then
        local lp_addr = ffi.cast("intptr_t*", get_player_address(local_player))
        local m_AddonModelsHead = ffi.cast("intptr_t*", lp_addr + 0x462F) -- E8 ? ? ? ? A1 ? ? ? ? 8B CE 8B 40 10
        local i, next_model = m_AddonModelsHead[0], -1

        while i ~= -1 do
            next_model = ffi.cast("intptr_t*", lp_addr + 0x462C)[0] + 0x18 * i -- this is the pModel (CAddonModel) afaik
            i = ffi.cast("intptr_t*", next_model + 0x14)[0]

            local m_pEnt = ffi.cast("intptr_t**", next_model)[0] -- CHandle<C_BaseAnimating> m_hEnt -> Get()
            local m_iAddon = ffi.cast("intptr_t*", next_model + 0x4)[0]

            if tonumber(m_iAddon) == 16 then -- face mask addon bits knife = 10
                local entity = get_client_entity_from_handle(m_pEnt)
                set_model_index(entity, model_index)
            end
        end
    end
end)

callbacks.register("pre_frame_stage", function(stage)
    if stage ~= 5 then return end

    local local_player = entity_list.get_client_entity(engine.get_local_player())

    if local_player == nil then return end

    if enabled then
        if bit.band(local_player:get_prop("DT_CSPlayer", "m_iAddonBits"):get_int(), 0x10000) ~= 0x10000 then
            local_player:get_prop("DT_CSPlayer", "m_iAddonBits"):set_int(0x10000 + local_player:get_prop("DT_CSPlayer", "m_iAddonBits"):get_int())
        end
    else
        if bit.band(local_player:get_prop("DT_CSPlayer", "m_iAddonBits"):get_int(), 0x10000) == 0x10000 then
            local_player:get_prop("DT_CSPlayer", "m_iAddonBits"):set_int(local_player:get_prop("DT_CSPlayer", "m_iAddonBits"):get_int() - 0x10000)
        end
    end
end)
уверено при свапе оружия атачментсы меняются и сетается другая маска))))
на секунду если что, а не навсегда
 
Начинающий
Статус
Оффлайн
Регистрация
12 Май 2022
Сообщения
224
Реакции[?]
27
Поинты[?]
29K
🌏 Southwest
Пользователь
Статус
Оффлайн
Регистрация
5 Янв 2021
Сообщения
181
Реакции[?]
31
Поинты[?]
17K
так не в этом дело, я просто знаю как оно работает
Короче там все нормально, НО когда перезаходишь на карту выскакивает message box cmodelloader::findmodel null name cs go , как это пофиксить?
 
Начинающий
Статус
Оффлайн
Регистрация
12 Май 2022
Сообщения
224
Реакции[?]
27
Поинты[?]
29K
Короче там все нормально, НО когда перезаходишь на карту выскакивает message box cmodelloader::findmodel null name cs go , как это пофиксить?
ты вроде кодер луа, чем там на фаталити делал. чо сам не подумаешь
 
Забаненный
Статус
Оффлайн
Регистрация
4 Апр 2023
Сообщения
107
Реакции[?]
8
Поинты[?]
6K
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
1
 
Сверху Снизу