--------------------------------------------------------------------------- -- GameBase --------------------------------------------------------------------------- local _GAME_BASE = 0 -- 1.16: 0x7FF78AEB0000 local UNSIGNED_BYTE = 0 local SIGNED_BYTE = 1 local UNSIGNED_SHORT = 2 local SIGNED_SHORT = 3 local UNSIGNED_INT = 4 local SIGNED_INT = 5 local FLOAT = 6 local BIT = 7 local BIG_SIGNED_INT = 100 -- returns a string that contains the 32 bit signed integer value local ARRAY_OF_BYTES = 101 -- returns 4 elements: byte1, byte2, byte3, byte4 local COORDINATES = 102 -- returns 3 elements: x, y, z local QUATERNION = 103 -- returns 4 elements: x, y, z, w local CHARACTERMODEL = 104 -- returns a 4 digit ID local MAPID = 105 -- returns 4 elements: areaId, blockId, regionId, indexId local CHRINS = 106 -- returns a CHR_INS_BASE that can be used with the Get-/SetAltChrInsPointerValue functions local BIG_UNSIGNED_INT = 107 --------------------------------------------------------------------------- -- Reserved for pointers that tend to change with updates --------------------------------------------------------------------------- local _GAME_DATA_MAN = 0x3D5DF38 -- 1.16 local _CS_NOW_LOADING_HELPER = 0x3D60EC8 -- 1.16 local _CS_BULLET_MANAGER = 0x3D62748 -- 1.16 local _WORLD_CHR_MAN = 0x3D65F88 -- 1.16 local _DMG_MAN = 0x3D66378 -- 1.16 local _CS_GA_ITEM = 0x3D69890 -- 1.16 local _GAME_MAN = 0x3D69918 -- 1.16 local _LOCK_TGT_MAN = 0x3D6A208 -- 1.16 local _WORLD_MAP_MAN = 0x3D6A320 -- 1.16 local _CS_FE_MAN = 0x3D6B880 -- 1.16 local _CS_SESSION_MANAGER = 0x3D7A4D0 -- 1.16 local _CS_WINDOW = 0x458B890 -- 1.16 -- In WORLD_CHR_MAN local _BUDDY_CHR_SET = 0x10FA8 -- 1.16 local _LOCAL_PLAYER_OFFSET = 0x1E508 -- 1.16 local _DEBUG_CHR_CREATOR = 0x1E648 -- 1.16 local _CHR_CAM = 0x1ECE0 -- 1.16 local _CHR_INS_LIST_BY_DISTANCE = 0x1F1D0 -- 1.16 --------------------------------------------------------------------------- -- Pointer Tables --------------------------------------------------------------------------- GAME_BASE = { GAME_DATA_MAN = { PLAYER_GAME_INFO = { -- 0x8 MULTIPLAYER_SLOT = { _GAME_BASE, SIGNED_INT, _GAME_DATA_MAN, 0x8, 0x8 }, CLASS_INDEX = { _GAME_BASE, UNSIGNED_BYTE, _GAME_DATA_MAN, 0x8, 0xBF }, STORAGE_INVENTORY = { -- 0x5D0 GA_ITEM_HANDLE = function(itemIndex, isKey) return { _GAME_BASE, BIG_UNSIGNED_INT, _GAME_DATA_MAN, 0x8, 0x5D0, isKey or FALSE * 0x10 + 0x10, (itemIndex * 0x18) } end, FULL_ITEM_ID = function(itemIndex, isKey) return { _GAME_BASE, BIG_SIGNED_INT, _GAME_DATA_MAN, 0x8, 0x5D0, isKey or FALSE * 0x10 + 0x10, (itemIndex * 0x18 + 4) } end, QUANTITY = function(itemIndex, isKey) return { _GAME_BASE, SIGNED_INT, _GAME_DATA_MAN, 0x8, 0x5D0, isKey or FALSE * 0x10 + 0x10, (itemIndex * 0x18 + 8) } end, MAX_SIZE = function(isKey) if isKey == TRUE then return 384 else return 2688 end end, }, STORAGE_CHEST = { -- 0x8D0 GA_ITEM_HANDLE = function(itemIndex, isKey) return { _GAME_BASE, BIG_UNSIGNED_INT, _GAME_DATA_MAN, 0x8, 0x8D0, isKey or FALSE * 0x10 + 0x10, (itemIndex * 0x18) } end, FULL_ITEM_ID = function(itemIndex, isKey) return { _GAME_BASE, BIG_SIGNED_INT, _GAME_DATA_MAN, 0x8, 0x8D0, isKey or FALSE * 0x10 + 0x10, (itemIndex * 0x18 + 4) } end, QUANTITY = function(itemIndex, isKey) return { _GAME_BASE, SIGNED_INT, _GAME_DATA_MAN, 0x8, 0x8D0, isKey or FALSE * 0x10 + 0x10, (itemIndex * 0x18 + 8) } end, MAX_SIZE = function(isKey) if isKey == TRUE then return 128 else return 1920 end end, }, }, SOUND_DISPLAY_SETTINGS = { -- 0x58 SETTING_SHOW_TUTORIALS = { _GAME_BASE, SIGNED_BYTE, _GAME_DATA_MAN, 0x58, 0x2E }, }, }, CS_NOW_LOADING_HELPER = { -- 0x3D60EC8 MENU_LOAD_ENTRIES = function(index) return { _GAME_BASE, UNSIGNED_INT, _CS_NOW_LOADING_HELPER, 0x48 + (index * 0x4)} end, CURRENT_MENU_LOAD_INDEX = { _GAME_BASE, UNSIGNED_INT, _CS_NOW_LOADING_HELPER, 0xD0 }, }, CS_BULLET_MANAGER = { BULLET_LIST = { -- 0x8 == head EXISTS = function(index) return { _GAME_BASE, UNSIGNED_INT, _CS_BULLET_MANAGER, 0x8, LinkedListItem(index, 0xE18, { }) } end, HANDLE = function(index) return { _GAME_BASE, ARRAY_OF_BYTES, _CS_BULLET_MANAGER, 0x8, LinkedListItem(index, 0xE18, { 0x8 }) } end, POSITION = function(index) return { _GAME_BASE, COORDINATES, _CS_BULLET_MANAGER, 0x8, LinkedListItem(index, 0xE18, { 0x10 }) } end, ORIENTATION = function(index) return { _GAME_BASE, QUATERNION, _CS_BULLET_MANAGER, 0x8, LinkedListItem(index, 0xE18, { 0x10 + 0x10 }) } end, VELOCITY = function(index) return { _GAME_BASE, COORDINATES, _CS_BULLET_MANAGER, 0x8, LinkedListItem(index, 0xE18, { 0x10 + 0x20 }) } end, TIME_ALIVE = function(index) return { _GAME_BASE, FLOAT, _CS_BULLET_MANAGER, 0x8, LinkedListItem(index, 0xE18, { 0xB10 }) } end, LIFE = function(index) return { _GAME_BASE, FLOAT, _CS_BULLET_MANAGER, 0x8, LinkedListItem(index, 0xE18, { 0xB14 }) } end, LIFE_MAX = function(index) return { _GAME_BASE, FLOAT, _CS_BULLET_MANAGER, 0x8, LinkedListItem(index, 0xE18, { 0xB18 }) } end, OWNER_CHR_HANDLE = function(index) return { _GAME_BASE, ARRAY_OF_BYTES, _CS_BULLET_MANAGER, 0x8, LinkedListItem(index, 0xE18, { 0xB40 }) } end, PARAM_ROW_WAIT = function(index) return { _GAME_BASE, BIG_SIGNED_INT, _CS_BULLET_MANAGER, 0x8, LinkedListItem(index, 0xE18, { 0xD90 + 0x0 + 0x8 + 0x8 }) } end, PARAM_ROW_FLY = function(index) return { _GAME_BASE, BIG_SIGNED_INT, _CS_BULLET_MANAGER, 0x8, LinkedListItem(index, 0xE18, { 0xDC0 + 0x0 + 0x8 + 0x8 }) } end, PARAM_ROW_EXPLOSION = function(index) return { _GAME_BASE, BIG_SIGNED_INT, _CS_BULLET_MANAGER, 0x8, LinkedListItem(index, 0xE18, { 0xDF0 + 0x0 + 0x8 + 0x8 }) } end } }, WORLD_CHR_MAN = { BUDDY_CHR_SET = { -- 0x10FA8 TORRENT_CHR_INS = { _GAME_BASE, CHRINS, _WORLD_CHR_MAN, _BUDDY_CHR_SET, 0x0 }, SPIRIT_SUMMON_CHR_INS = function(index) return { _GAME_BASE, CHRINS, _WORLD_CHR_MAN, _BUDDY_CHR_SET, 0x140 + (index * 0x10) } end }, LOCAL_PLAYER_CHR_INS = { _GAME_BASE, CHRINS, _WORLD_CHR_MAN, _LOCAL_PLAYER_OFFSET }, DEBUG_CHR_CREATOR = { -- 0x1E648 IS_SPAWN = { _GAME_BASE, SIGNED_BYTE, _WORLD_CHR_MAN, _DEBUG_CHR_CREATOR, 0x44 }, CHR_POS = { _GAME_BASE, COORDINATES, _WORLD_CHR_MAN, _DEBUG_CHR_CREATOR, 0xB0 }, CHR_NPC_PARAM = { _GAME_BASE, SIGNED_INT, _WORLD_CHR_MAN, _DEBUG_CHR_CREATOR, 0xF0 }, CHR_NPC_THINK_PARAM = { _GAME_BASE, SIGNED_INT, _WORLD_CHR_MAN, _DEBUG_CHR_CREATOR, 0xF4 }, CHR_EVENT_ENTITY_ID = { _GAME_BASE, SIGNED_INT, _WORLD_CHR_MAN, _DEBUG_CHR_CREATOR, 0xF8 }, CHR_TALK_ID = { _GAME_BASE, SIGNED_INT, _WORLD_CHR_MAN, _DEBUG_CHR_CREATOR, 0xFC }, MODEL = function(index) return { _GAME_BASE, UNSIGNED_SHORT, _WORLD_CHR_MAN, _DEBUG_CHR_CREATOR, 0x100 + index * 2 } end, IS_PLAYER = { _GAME_BASE, SIGNED_BYTE, _WORLD_CHR_MAN, _DEBUG_CHR_CREATOR, 0x178 }, CHR_CHARA_INIT_PARAM = { _GAME_BASE, SIGNED_INT, _WORLD_CHR_MAN, _DEBUG_CHR_CREATOR, 0x17C }, }, CHR_CAM = { -- 0x1ECE0 REQUEST_CAMERA_RESET = { _GAME_BASE, SIGNED_BYTE, _WORLD_CHR_MAN, _CHR_CAM, 0x78 }, CAMERA_TYPE = { _GAME_BASE, UNSIGNED_INT, _WORLD_CHR_MAN, _CHR_CAM, 0x7C }, }, CHR_INS_LIST_BY_DISTANCE = { -- 0x1F1D0 START_PTR = { _GAME_BASE, UNSIGNED_INT, _WORLD_CHR_MAN, _CHR_INS_LIST_BY_DISTANCE + 0x8 }, END_PTR = { _GAME_BASE, UNSIGNED_INT, _WORLD_CHR_MAN, _CHR_INS_LIST_BY_DISTANCE + 0x10 }, CHR_INS = function(index) return { _GAME_BASE, CHRINS, _WORLD_CHR_MAN, _CHR_INS_LIST_BY_DISTANCE + 0x8, (index * 0x10) } end } }, DMG_MAN = { HITBOX_VISUALIZER = { _GAME_BASE, SIGNED_BYTE, _DMG_MAN, 0xA0 }, }, CS_GA_ITEM = { GA_ITEMS = { -- 0x8 GA_ITEM_HANDLE = function(index) return { _GAME_BASE, BIG_UNSIGNED_INT, _CS_GA_ITEM, 0x8 + (index * 0x8), 0x8 } end, ITEM_ID = function(index) return { _GAME_BASE, BIG_SIGNED_INT, _CS_GA_ITEM, 0x8 + (index * 0x8), 0xC } end, GEM_GA_ITEM_HANDLE = function(index) return { _GAME_BASE, BIG_UNSIGNED_INT, _CS_GA_ITEM, 0x8 + (index * 0x8), 0x18 + 0x8 + 0x8 } end, }, }, GAME_MAN = { CHR_SAVE_INDEX = { _GAME_BASE, UNSIGNED_BYTE, _GAME_MAN, 0xAC0 }, }, LOCK_TGT_MAN = { LOCK_ON_DISTANCE_BOOST = { _GAME_BASE, FLOAT, _LOCK_TGT_MAN, 0x2924 }, }, WORLD_MAP_MAN = { WORLD_INFO = { -- 0x10 WORLD_BLOCK_INFO = { -- 0xA20 MAP_ID = function(index) return { _GAME_BASE, MAPID, _WORLD_MAP_MAN, 0x10, 0xA20 + (index * 0xE0) + 0x8} end, IS_LOADED = function(index) return { _GAME_BASE, SIGNED_BYTE, _WORLD_MAP_MAN, 0x10, 0xA20 + (index * 0xE0) + 0xB8} end }, WORLD_GRID_AREA_INFO = { -- 0xB220 TREE = { IS_NIL = function(worldIndex, nodePtrTable) local _table = {unpack(nodePtrTable)} table.insert(_table, 0x19) return { _GAME_BASE, SIGNED_BYTE, _WORLD_MAP_MAN, 0x10, 0xB220 + 0x90 + (worldIndex * 0xE0), unpack(_table) } end, VALUE = { -- 0x20 MAP_ID = function(worldIndex, nodePtrTable) -- +0 local _table = {unpack(nodePtrTable)} table.insert(_table, 0x20) return { _GAME_BASE, MAPID, _WORLD_MAP_MAN, 0x10, 0xB220 + 0x90 + (worldIndex * 0xE0), unpack(_table) } end } } } } }, CS_FE_MAN = { CS_FE_SPIRIT_ASH_DISPLAY = { -- 0x4DE0 SPIRIT_SUMMON_DISPLAY_COUNT = { _GAME_BASE, UNSIGNED_INT, _CS_FE_MAN, 0x4DD8 }, SPIRIT_FIELD_INS_HANDLE = function(index) -- Index Range = 0-4 return { _GAME_BASE, ARRAY_OF_BYTES, _CS_FE_MAN, 0x4DE0 + (index * 0x18) } end, SPIRIT_HP = function(index) -- Read Only return { _GAME_BASE, UNSIGNED_INT, _CS_FE_MAN, 0x4DE0 + (index * 0x18) + 0x4 } end, SPIRIT_UNK_C = function(index) return { _GAME_BASE, UNSIGNED_INT, _CS_FE_MAN, 0x4DE0 + (index * 0x18) + 0x8 } end, SPIRIT_HP_MAX_UNCAPPED_DIFFERENCE = function(index) return { _GAME_BASE, UNSIGNED_INT, _CS_FE_MAN, 0x4DE0 + (index * 0x18) + 0xC } end, SPIRIT_HP_MAX = function(index) -- Read Only return { _GAME_BASE, UNSIGNED_INT, _CS_FE_MAN, 0x4DE0 + (index * 0x18) + 0x10 } end } }, CS_SESSION_MANAGER = { SESSION_STATE = { _GAME_BASE, SIGNED_INT, _CS_SESSION_MANAGER, 0x0C }, SESSION_STATES = { SESSION_OFFLINE = 0, SESSION_CREATION_ATTEMPT = 1, SESSION_CREATION_FAILED = 2, SESSION_HOST = 3, SESSION_JOIN_ATTEMPT = 4, SESSION_JOIN_FAILED = 5, SESSION_CLIENT = 6, SESSION_LEAVING_ATTEMPT = 7, SESSION_LEAVING_FAILED = 8, } }, CS_WINDOW = { RTX_QUALITY = { _GAME_BASE, SIGNED_INT, _CS_WINDOW, 0x128 }, }, DEBUG_FLAGS = { -- TODO Move to ChrIns with propper offsets NO_DEATH_PLAYER = { _GAME_BASE, SIGNED_BYTE, "0x3D661A0" }, NO_DEATH_TORRENT = { _GAME_BASE, SIGNED_BYTE, "0x3D661A1" }, ONE_SHOT_EVERYTHING = { _GAME_BASE, SIGNED_BYTE, "0x3D661A2" }, ALL_NO_CONSUMABLES_CONSUME = { _GAME_BASE, SIGNED_BYTE, "0x3D661A3" }, UNLIMITED_SP = { _GAME_BASE, SIGNED_BYTE, "0x3D661A4" }, UNLIMITED_FP = { _GAME_BASE, SIGNED_BYTE, "0x3D661A5" }, ALL_NO_ARROW_CONSUME = { _GAME_BASE, SIGNED_BYTE, "0x3D661A6" }, HIDE_PLAYER = { _GAME_BASE, SIGNED_BYTE, "0x3D661A8" }, SILENCE_PLAYER = { _GAME_BASE, SIGNED_BYTE, "0x3D661A9" }, FORCED_PARRY = { _GAME_BASE, SIGNED_BYTE, "0x3D661AD" }, } }