CheatMenuSA/moonloader/lib/cheat-menu/modules/memory.lua
2020-12-03 03:18:34 +06:00

266 lines
12 KiB
Lua

-- Cheat Menu - Cheat menu for Grand Theft Auto SanAndreas
-- Copyright (C) 2019-2020 Grinch_
-- This program is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
-- You should have received a copy of the GNU General Public License
-- along with this program. If not, see <http://www.gnu.org/licenses/>.
local module = {}
module.tmemory =
{
address = imgui.new.char[10](""),
filter = imgui.ImGuiTextFilter(),
offset = imgui.new.char[10]("0"),
is_float = imgui.new.bool(fconfig.Get('tmemory.is_float',false)),
list = fcommon.LoadJson("memory"),
name = imgui.new.char[20](""),
radio_button = imgui.new.int(fconfig.Get('tmemory.radio_button',0)),
size = imgui.new.int(fconfig.Get('tmemory.size',1)),
value = imgui.new.int(fconfig.Get('tmemory.value',0)),
vp = imgui.new.bool(fconfig.Get('tmemory.vp',false)),
}
-- Main function
function module.MemoryMain()
if fcommon.BeginTabBar("MemoryBar") then
if fcommon.BeginTabItem("Read") then
imgui.Text("Pointer")
imgui.SameLine()
imgui.RadioButtonIntPtr("None", module.tmemory.radio_button, 0)
imgui.SameLine()
imgui.RadioButtonIntPtr("Car", module.tmemory.radio_button, 1)
fcommon.InformationTooltip("Get pointer of the nearest car")
imgui.SameLine()
imgui.RadioButtonIntPtr("Char", module.tmemory.radio_button, 2)
fcommon.InformationTooltip("Get pointer of the nearest char")
imgui.Dummy(imgui.ImVec2(0,10))
imgui.Columns(2,nil,false)
imgui.Text("Memory value : " .. module.tmemory.value[0])
imgui.NextColumn()
local car,ped = storeClosestEntities(PLAYER_PED)
if module.tmemory.radio_button[0] == fconst.MEMORY_RB.CAR then
if car ~= -1 then
local pCar = getCarPointer(car)
imgui.StrCopy(module.tmemory.address,string.format("0x%8.8X",pCar))
end
end
if module.tmemory.radio_button[0] == fconst.MEMORY_RB.CHAR then
if ped ~= -1 then
local pChar = getCharPointer(ped)
imgui.StrCopy(module.tmemory.address,string.format("0x%8.8X",pChar))
end
end
imgui.Columns(1)
imgui.Spacing()
imgui.InputTextWithHint("Address","0x000000",module.tmemory.address,ffi.sizeof(module.tmemory.address))
imgui.InputText("Offset", module.tmemory.offset,ffi.sizeof(module.tmemory.offset))
imgui.SliderInt("Size", module.tmemory.size,1,4)
if module.tmemory.size[0] == 4 then
imgui.Columns(2,nil,false)
imgui.Checkbox("Float",module.tmemory.is_float)
imgui.NextColumn()
else
imgui.Columns(1,nil,false)
end
imgui.Checkbox("Virtual protect", module.tmemory.vp)
imgui.Columns(1)
imgui.Dummy(imgui.ImVec2(0,10))
if imgui.Button("Read",imgui.ImVec2(fcommon.GetSize(2))) then
if ffi.string(module.tmemory.offset) == "" then
imgui.StrCopy(module.tmemory.offset,"0")
end
if ffi.string(module.tmemory.address) ~= "" then
module.tmemory.value[0] = fcommon.RwMemory((tonumber(ffi.string(module.tmemory.address))+tonumber(ffi.string(module.tmemory.offset))),module.tmemory.size[0],nil,module.tmemory.vp[0],module.tmemory.is_float[0])
else
printHelpString("No address found")
end
end
imgui.SameLine()
if imgui.Button("Clear",imgui.ImVec2(fcommon.GetSize(2))) then
module.tmemory.value[0] = 0
imgui.StrCopy(module.tmemory.address,"")
imgui.StrCopy(module.tmemory.offset,"0")
module.tmemory.size[0] = 0
module.tmemory.vp[0] = false
module.tmemory.is_float[0] = false
module.tmemory.radio_button[0] = 0
printHelpString("Entries cleared")
end
end
if fcommon.BeginTabItem("Write") then
imgui.Text("Pointer")
imgui.SameLine()
imgui.RadioButtonIntPtr("None", module.tmemory.radio_button, 0)
imgui.SameLine()
imgui.RadioButtonIntPtr("Car", module.tmemory.radio_button, 1)
fcommon.InformationTooltip("Get pointer of the nearest car")
imgui.SameLine()
imgui.RadioButtonIntPtr("Char", module.tmemory.radio_button, 2)
fcommon.InformationTooltip("Get pointer of the nearest char")
imgui.Dummy(imgui.ImVec2(0,10))
local car,ped = storeClosestEntities(PLAYER_PED)
if module.tmemory.radio_button[0] == fconst.MEMORY_RB.CAR then
if car ~= -1 then
local pCar = getCarPointer(car)
imgui.StrCopy(module.tmemory.address,string.format("0x%8.8X",pCar))
end
end
if module.tmemory.radio_button[0] == fconst.MEMORY_RB.CHAR then
if ped ~= -1 then
local pChar = getCharPointer(ped)
imgui.StrCopy(module.tmemory.address,string.format("0x%8.8X",pChar))
end
end
imgui.InputInt("Value", module.tmemory.value)
imgui.InputTextWithHint("Address","0x000000",module.tmemory.address,ffi.sizeof(module.tmemory.address))
imgui.InputText("Offset", module.tmemory.offset,ffi.sizeof(module.tmemory.offset))
imgui.SliderInt("Size", module.tmemory.size,1,4)
if module.tmemory.size[0] == 4 then
imgui.Columns(2,nil,false)
imgui.Checkbox("Float",module.tmemory.is_float)
imgui.NextColumn()
else
imgui.Columns(1,nil,false)
end
imgui.Checkbox("Virtual protect", module.tmemory.vp)
imgui.Columns(1)
imgui.Dummy(imgui.ImVec2(0,10))
if imgui.Button("Write",imgui.ImVec2(fcommon.GetSize(2))) then
if ffi.string(module.tmemory.offset) == "" then
imgui.StrCopy(module.tmemory.offset,"0")
end
if ffi.string(module.tmemory.address) ~= "" then
fcommon.RwMemory(tonumber(ffi.string(module.tmemory.address))+tonumber(ffi.string(module.tmemory.offset)),module.tmemory.size[0],module.tmemory.value[0],module.tmemory.vp[0],module.tmemory.is_float[0])
printHelpString("Value Updated")
else
printHelpString("No address found")
end
end
imgui.SameLine()
if imgui.Button("Clear",imgui.ImVec2(fcommon.GetSize(2))) then
module.tmemory.value[0] = 0
imgui.StrCopy(module.tmemory.address,"")
imgui.StrCopy(module.tmemory.offset,"0")
module.tmemory.size[0] = 0
module.tmemory.vp[0] = false
module.tmemory.is_float[0] = false
module.tmemory.radio_button[0] = 0
printHelpString("Entries cleared")
end
end
if fcommon.BeginTabItem("Search") then
fcommon.DrawEntries(fconst.IDENTIFIER.MEMORY,fconst.DRAW_TYPE.TEXT,
function(address,size)
imgui.StrCopy(module.tmemory.address,address)
imgui.StrCopy(module.tmemory.offset,"0")
if size == "byte" then
module.tmemory.size[0] = 1
module.tmemory.is_float[0] = false
end
if size == "word" then
module.tmemory.size[0] = 2
module.tmemory.is_float[0] = false
end
if size == "dword" then
module.tmemory.size[0] = 4
module.tmemory.is_float[0] = false
end
if size == "float" then
module.tmemory.size[0] = 4
module.tmemory.is_float[0] = true
end
printHelpString("Address set")
end,
function(text)
if imgui.MenuItemBool("Remove memory") then
for category,table in pairs(module.tmemory.list) do
for key,val in pairs(table) do
if key == text then
module.tmemory.list[category][key] = nil
goto end_loop
end
end
end
::end_loop::
printHelpString("Address removed")
end
end,
function(a) return a end,module.tmemory.list)
end
if fcommon.BeginTabItem("Custom") then
imgui.InputTextWithHint("Name","New address",module.tmemory.name,ffi.sizeof(module.tmemory.name))
imgui.InputTextWithHint("Address","0x000000",module.tmemory.address,ffi.sizeof(module.tmemory.address))
imgui.SliderInt("Size", module.tmemory.size,1,4)
imgui.Checkbox("Float",module.tmemory.is_float)
imgui.Spacing()
if imgui.Button("Add address",imgui.ImVec2(fcommon.GetSize(1))) then
if ffi.string(module.tmemory.name) == "" then
printHelpString("No name found")
else
if ffi.string(module.tmemory.address) == "" or tonumber(ffi.string(module.tmemory.address)) == nil then
printHelpString("No address found")
else
local mem_type = ""
if module.tmemory.size[0] == 1 then
mem_type = "byte"
end
if module.tmemory.size[0] == 2 then
mem_type = "word"
end
if module.tmemory.size[0] == 4 then
if module.tmemory.is_float[0] == true then
mem_type = "float"
else
mem_type = "dword"
end
end
module.tmemory.list[mem_type][ffi.string(module.tmemory.name)] = ffi.string(module.tmemory.address)
fcommon.SaveJson("memory",module.tmemory.list)
module.tmemory.list = fcommon.LoadJson("memory")
printHelpString("Address added")
end
end
end
end
fcommon.EndTabBar()
end
end
return module