# jupiter.Memory

# Creating an instance for accessing memory:

local mem = jupiter.Memory.new()

# Reading memory:

local mem = jupiter.Memory.new()

local value = mem:readu8( address )
local value = mem:readu16( address )
local value = mem:readu32( address )
local value = mem:readu64( address )

local value = mem:readi8( address )
local value = mem:readi16( address )
local value = mem:readi32( address )
local value = mem:readi64( address )

# Writing memory:

local mem = jupiter.Memory.new()

local value = 1337

mem:writeu8( address, value )
mem:writeu16( address, value )
mem:writeu32( address, value )
mem:writeu64( address, value )

mem:writei8( address, value )
mem:writei16( address, value )
mem:writei32( address, value )
mem:writei64( address, value )

# Example (togglable invisibility):

local ped_factory_pattern = "48 8B 05 ? ? ? ? 48 8B 48 08 48 85 C9 74 52 8B 81"
local visible_state_offset = 0x2C

local mem = jupiter.Memory.new()
local mod = jupiter.Module.find("GTA5.exe", true)
local scanner = jupiter.Scanner.new(mod, ped_factory_pattern)

scanner:scan()
scanner:add(3)
scanner:rip()
local pp_ped_factory = scanner:get()

print("Found g_PedFactory at GTA5.exe+0x" .. string.format("%x", pp_ped_factory - mod:base()))

local ped_factory = mem:readu64(pp_ped_factory)
local local_ped = mem:readu64(ped_factory + 8)

print("Ped factory: 0x" .. string.format("%x", ped_factory))
print("Local ped: 0x" .. string.format("%x", local_ped))

local enabled = true

function invisible()
    if jupiter.utility.is_key_pressed("g", false) then
        enabled = not enabled

        local notif = jupiter.Notification.new()

        if enabled then
            notif:set_title("enabled invisibility")
        else
            notif:set_title("disabled invisibility")
        end

        notif:set_content("author: index\ndescription: lua memory example")
        notif:push()
    end

    local_ped = mem:readu64(ped_factory + 8)

    if local_ped then
        if (enabled) then
            mem:writeu8(local_ped + visible_state_offset, 0x1)
        else
            mem:writeu8(local_ped + visible_state_offset, 0x27)
        end
    end
end

function on_render()
    invisible()
end

jupiter.register_callback("render", on_render)