From 32e9b8ed8a1bfed1d62581d640d079b3efbe533b Mon Sep 17 00:00:00 2001 From: ApfelTeeSaft <91074565+ApfelTeeSaft@users.noreply.github.com> Date: Tue, 5 May 2026 07:55:12 +0200 Subject: [PATCH] *.inc files to define primitive UE structs and some Fortnite proprietary stuff --- build.bat | 96 ++++++++++ include/enums.inc | 122 +++++++++++++ include/externs.inc | 269 +++++++++++++++++++++++++++++ include/macros.inc | 213 +++++++++++++++++++++++ include/master.inc | 4 + include/structs.inc | 413 ++++++++++++++++++++++++++++++++++++++++++++ raider.def | 3 + 7 files changed, 1120 insertions(+) create mode 100644 build.bat create mode 100644 include/enums.inc create mode 100644 include/externs.inc create mode 100644 include/macros.inc create mode 100644 include/master.inc create mode 100644 include/structs.inc create mode 100644 raider.def diff --git a/build.bat b/build.bat new file mode 100644 index 0000000..ea90559 --- /dev/null +++ b/build.bat @@ -0,0 +1,96 @@ +@echo off +setlocal EnableDelayedExpansion + +set CONFIG=%1 +if "%CONFIG%"=="" set CONFIG=Release + +set OUTDIR=..\bin\%CONFIG% +set OBJDIR=..\obj\%CONFIG% + +if not exist "%OUTDIR%" mkdir "%OUTDIR%" +if not exist "%OBJDIR%" mkdir "%OBJDIR%" + +set ML_FLAGS=/nologo /W3 /WX /c /Cx /Zi /Fo"%OBJDIR%\\" +if /I "%CONFIG%"=="Debug" ( + set ML_FLAGS=%ML_FLAGS% /DDEBUG +) else ( + set ML_FLAGS=%ML_FLAGS% /DNDEBUG +) + +set LINK_FLAGS=/nologo /DLL /SUBSYSTEM:WINDOWS /MACHINE:X64 /DEBUG +set LINK_FLAGS=%LINK_FLAGS% /DEF:raider.def +set LINK_FLAGS=%LINK_FLAGS% /OUT:"%OUTDIR%\raider.dll" +set LINK_FLAGS=%LINK_FLAGS% /PDB:"%OUTDIR%\raider.pdb" +set LINK_FLAGS=%LINK_FLAGS% /IMPLIB:"%OUTDIR%\raider.lib" + +set LIBS=kernel32.lib user32.lib detours.lib + +set ASM_FILES=^ + raider.asm ^ + sdk_globals.asm ^ + patterns.asm ^ + native.asm ^ + util.asm ^ + logger.asm ^ + hooks.asm ^ + ufunctionhooks.asm ^ + gui.asm ^ + zerogui.asm ^ + zeroinput.asm ^ + logic\game.asm ^ + logic\inventory.asm ^ + logic\abilities.asm ^ + logic\spawners.asm ^ + logic\teams.asm ^ + gamemodes\gamemode_base.asm ^ + gamemodes\gamemode_solos.asm ^ + gamemodes\gamemode_duos.asm ^ + gamemodes\gamemode_50v50.asm ^ + gamemodes\gamemode_playground.asm ^ + gamemodes\gamemode_lategame.asm ^ + sdk\sdk_structs.asm ^ + sdk\sdk_classes.asm ^ + sdk\sdk_fort.asm + +set OBJ_LIST= +set ERRORS=0 + +for %%F in (%ASM_FILES%) do ( + set SRC=%%F + set FNAME=%%~nF + set FDIR=%%~dpF + + set OBJNAME=!FDIR:logic\=logic_! + set OBJNAME=!OBJNAME:gamemodes\=gm_! + set OBJNAME=!OBJNAME:sdk\=sdk_! + set OBJNAME=!OBJNAME:\=_! + + set OBJ=%OBJDIR%\!OBJNAME!!FNAME!.obj + + echo [ML64] %%F + ml64.exe %ML_FLAGS% /Fo"!OBJ!" "%%F" + if errorlevel 1 ( + echo ERROR: failed to assemble %%F + set /A ERRORS=!ERRORS!+1 + ) else ( + set OBJ_LIST=!OBJ_LIST! "!OBJ!" + ) +) + +if !ERRORS! GTR 0 ( + echo. + echo BUILD FAILED: !ERRORS! file(s) failed to assemble. + exit /b 1 +) + +echo. +echo [LINK] raider.dll +link.exe %LINK_FLAGS% %OBJ_LIST% %LIBS% +if errorlevel 1 ( + echo ERROR: link failed. + exit /b 1 +) + +echo. +echo BUILD SUCCEEDED: %OUTDIR%\raider.dll +exit /b 0 diff --git a/include/enums.inc b/include/enums.inc new file mode 100644 index 0000000..ba60f88 --- /dev/null +++ b/include/enums.inc @@ -0,0 +1,122 @@ +; EFortCustomPartType +EFortCustomPartType_Head EQU 0 +EFortCustomPartType_Body EQU 1 +EFortCustomPartType_Hat EQU 2 +EFortCustomPartType_Backpack EQU 3 +EFortCustomPartType_Charm EQU 4 +EFortCustomPartType_Face EQU 5 +EFortCustomPartType_NumTypes EQU 6 + +; EFortTeam +EFortTeam_HumanCampaign EQU 0 +EFortTeam_Monster EQU 1 +EFortTeam_HumanPvP_Team1 EQU 2 +EFortTeam_HumanPvP_Team2 EQU 3 +EFortTeam_Spectator EQU 103 +EFortTeam_MAX EQU 104 + +; EAthenaGamePhase +EAthenaGamePhase_None EQU 0 +EAthenaGamePhase_Setup EQU 1 +EAthenaGamePhase_Warmup EQU 2 +EAthenaGamePhase_Aircraft EQU 3 +EAthenaGamePhase_SafeZones EQU 4 +EAthenaGamePhase_EndGame EQU 5 +EAthenaGamePhase_Count EQU 6 + +; EClassRepNodeMapping +EClassRepNodeMapping_NotRouted EQU 0 +EClassRepNodeMapping_RelevantAllConnections EQU 1 +EClassRepNodeMapping_Spatialize_Static EQU 2 +EClassRepNodeMapping_Spatialize_Dynamic EQU 3 +EClassRepNodeMapping_Spatialize_Dormancy EQU 4 + +; ESpawnActorCollisionHandlingMethod +ESpawnCollision_Undefined EQU 0 +ESpawnCollision_AlwaysSpawn EQU 1 +ESpawnCollision_AdjustIfPossibleButAlwaysSpawn EQU 2 +ESpawnCollision_AdjustIfPossibleButDontSpawnIfColliding EQU 3 +ESpawnCollision_DontSpawnIfColliding EQU 4 + +; EDynamicBuildingPlacementType +EDynBuildPlace_CountsTowardsBounds EQU 0 +EDynBuildPlace_DestroyIfColliding EQU 1 +EDynBuildPlace_DestroyAnythingThatCollides EQU 2 + +; EFortBuildingType +EFortBuildingType_Wall EQU 0 +EFortBuildingType_Floor EQU 1 +EFortBuildingType_Corner EQU 2 +EFortBuildingType_Deco EQU 3 +EFortBuildingType_Prop EQU 4 +EFortBuildingType_Stairs EQU 5 +EFortBuildingType_Roof EQU 6 +EFortBuildingType_Pillar EQU 7 +EFortBuildingType_SpawnedItem EQU 8 +EFortBuildingType_Container EQU 9 +EFortBuildingType_Trap EQU 10 +EFortBuildingType_None EQU 12 + +; ETravelType +ETravelType_Absolute EQU 0 +ETravelType_Partial EQU 1 +ETravelType_Relative EQU 2 + +; EMontagePlayReturnType +EMontagePlayReturnType_MontageLength EQU 0 +EMontagePlayReturnType_Duration EQU 1 + +; EMovementMode +EMovementMode_None EQU 0 +EMovementMode_Walking EQU 1 +EMovementMode_NavWalking EQU 2 +EMovementMode_Falling EQU 3 +EMovementMode_Swimming EQU 4 +EMovementMode_Flying EQU 5 +EMovementMode_Custom EQU 6 +EMovementMode_MAX EQU 7 + +MOVE_CUSTOM_SKYDIVE EQU 4 + +; ENetRole +ENetRole_None EQU 0 +ENetRole_SimulatedProxy EQU 1 +ENetRole_AutonomousProxy EQU 2 +ENetRole_Authority EQU 3 + +; ENetMode +ENetMode_Standalone EQU 0 +ENetMode_DedicatedServer EQU 1 +ENetMode_ListenServer EQU 2 +ENetMode_Client EQU 3 + +; DLL reason codes +DLL_PROCESS_DETACH EQU 0 +DLL_PROCESS_ATTACH EQU 1 +DLL_THREAD_ATTACH EQU 2 +DLL_THREAD_DETACH EQU 3 + +; Vtable slot indices +VTABLE_SLOT_ProcessEvent EQU 40h ; = 64 decimal +VTABLE_SLOT_ServerReplicateActors EQU 53h ; = 83 decimal — on UReplicationDriver + +; Network message type codes (NMT_ values) +NMT_Netspeed EQU 4 +NMT_Login EQU 5 +NMT_PCSwap EQU 15 + +; EFortQuickBars +EFortQuickBars_Primary EQU 0 +EFortQuickBars_Secondary EQU 1 +EFortQuickBars_Count EQU 2 + +; Misc numeric constants from source +MAXPLAYERS EQU 100 +LISTEN_BEACON_PORT EQU 7776 +LISTEN_GAME_PORT EQU 7777 +REPAIR_AMOUNT EQU 50 +BACKPACK_SIZE EQU 100 +DEFAULT_NETSPEED EQU 30000 +MAX_HEALTH EQU 100 +MAX_SHIELD EQU 100 +RESPAWN_EXTRA_Z EQU 3000 diff --git a/include/externs.inc b/include/externs.inc new file mode 100644 index 0000000..21e25ec --- /dev/null +++ b/include/externs.inc @@ -0,0 +1,269 @@ +; sdk_globals.asm — Global UE4 runtime pointers and GObjects +EXTERNDEF Imagebase :QWORD ; base address of FortniteClient-Win64-Shipping.exe +EXTERNDEF ProcessEvent :QWORD ; void (*)(UObject*, UFunction*, void*) +EXTERNDEF FMemory_Malloc :QWORD ; void* (*)(int32 size, int32 alignment) +EXTERNDEF FMemory_Realloc :QWORD ; void* (*)(void* original, int64 count, uint32 alignment) +EXTERNDEF FMemory_Free :QWORD ; void (*)(void* original) +EXTERNDEF FNameToString :QWORD ; void (*)(FName* name, FString& out) +EXTERNDEF GObjects :QWORD ; TUObjectArray* (the global UObject array) + +; sdk_globals.asm — Global mutable state +EXTERNDEF bTraveled :BYTE ; bool — has the server traveled yet? +EXTERNDEF bPlayButton :BYTE ; bool — play button clicked? +EXTERNDEF bListening :BYTE ; bool — server is listening? +EXTERNDEF bStartedBus :BYTE ; bool — battle bus launched? +EXTERNDEF bSpawnedFloorLoot :BYTE ; bool — floor loot spawned? +EXTERNDEF HostBeacon :QWORD ; AFortOnlineBeaconHost* +EXTERNDEF ExistingBuildings :QWORD ; pointer to TArray head (Data ptr) +EXTERNDEF ExistingBuildingsNum :DWORD ; current Num of ExistingBuildings array +EXTERNDEF ExistingBuildingsMax :DWORD ; current Max of ExistingBuildings array + +; native.asm — Native:: function-pointer table +; Native::Actor +EXTERNDEF Native_Actor_GetNetMode :QWORD +; Native::PlayerController +EXTERNDEF Native_PlayerController_GetPlayerViewPoint :QWORD +EXTERNDEF Native_PlayerController_GetPlayerName :QWORD +; Native::LocalPlayer +EXTERNDEF Native_LocalPlayer_SpawnPlayActor :QWORD +; Native::GC +EXTERNDEF Native_GC_CollectGarbage :QWORD +; Native::AbilitySystemComponent +EXTERNDEF Native_AbilitySystemComponent_GiveAbility :QWORD +EXTERNDEF Native_AbilitySystemComponent_FindAbilitySpecFromHandle :QWORD +EXTERNDEF Native_AbilitySystemComponent_InternalTryActivateAbility :QWORD +; Native::NetDriver +EXTERNDEF Native_NetDriver_TickFlush :QWORD +; Native::ReplicationDriver +EXTERNDEF Native_ReplicationDriver_ServerReplicateActors :QWORD +; Native::NetConnection +EXTERNDEF Native_NetConnection_ReceiveNetGUIDBunch :QWORD +; Native::OnlineSession +EXTERNDEF Native_OnlineSession_KickPlayer :QWORD +; Native::OnlineBeacon +EXTERNDEF Native_OnlineBeacon_NotifyAcceptingConnection :QWORD +; Native::OnlineBeaconHost +EXTERNDEF Native_OnlineBeaconHost_NotifyAcceptingConnection :QWORD +EXTERNDEF Native_OnlineBeaconHost_InitHost :QWORD +EXTERNDEF Native_OnlineBeaconHost_PauseBeaconRequests :QWORD +; Native::World +EXTERNDEF Native_World_NotifyControlMessage :QWORD +EXTERNDEF Native_World_WelcomePlayer :QWORD +EXTERNDEF Native_World_SpawnActor :QWORD +EXTERNDEF Native_World_SpawnPlayActor :QWORD +EXTERNDEF Native_World_NotifyAcceptingConnection :QWORD +EXTERNDEF Native_World_RemoveNetworkActor :QWORD +; Native::Engine +EXTERNDEF Native_Engine_SeamlessTravelHandlerForWorld :QWORD +; Native::GameViewportClient +EXTERNDEF Native_GameViewportClient_PostRender :QWORD + +; native.asm — InitializeAll entry point +EXTERNDEF Native_InitializeAll :PROC + +; patterns.asm — Pattern byte arrays and mask strings (.const) +EXTERNDEF Pat_ProcessEvent :BYTE +EXTERNDEF Pat_ProcessEvent_Mask :BYTE +EXTERNDEF Pat_FMemory_Malloc :BYTE +EXTERNDEF Pat_FMemory_Malloc_Mask :BYTE +EXTERNDEF Pat_FMemory_Realloc :BYTE +EXTERNDEF Pat_FMemory_Realloc_Mask:BYTE +EXTERNDEF Pat_FMemory_Free :BYTE +EXTERNDEF Pat_FMemory_Free_Mask :BYTE +EXTERNDEF Pat_FNameToString :BYTE +EXTERNDEF Pat_FNameToString_Mask :BYTE +EXTERNDEF Pat_GObjects :BYTE +EXTERNDEF Pat_GObjects_Mask :BYTE +EXTERNDEF Pat_NetDebug :BYTE +EXTERNDEF Pat_NetDebug_Mask :BYTE +EXTERNDEF Pat_TickFlush :BYTE +EXTERNDEF Pat_TickFlush_Mask :BYTE +EXTERNDEF Pat_GetPlayerViewPoint :BYTE +EXTERNDEF Pat_GetPlayerViewPoint_Mask :BYTE +EXTERNDEF Pat_SpawnPlayActor :BYTE +EXTERNDEF Pat_SpawnPlayActor_Mask :BYTE +EXTERNDEF Pat_CollectGarbage :BYTE +EXTERNDEF Pat_CollectGarbage_Mask :BYTE +EXTERNDEF Pat_GiveAbility :BYTE +EXTERNDEF Pat_GiveAbility_Mask :BYTE +EXTERNDEF Pat_FindAbilitySpec :BYTE +EXTERNDEF Pat_FindAbilitySpec_Mask:BYTE +EXTERNDEF Pat_InternalTryActivate :BYTE +EXTERNDEF Pat_InternalTryActivate_Mask :BYTE +EXTERNDEF Pat_ServerReplicateActors :BYTE +EXTERNDEF Pat_ServerReplicateActors_Mask :BYTE +EXTERNDEF Pat_ReceiveNetGUIDBunch :BYTE +EXTERNDEF Pat_ReceiveNetGUIDBunch_Mask :BYTE +EXTERNDEF Pat_KickPlayer :BYTE +EXTERNDEF Pat_KickPlayer_Mask :BYTE +EXTERNDEF Pat_WelcomePlayer :BYTE +EXTERNDEF Pat_WelcomePlayer_Mask :BYTE +EXTERNDEF Pat_SpawnActor :BYTE +EXTERNDEF Pat_SpawnActor_Mask :BYTE +EXTERNDEF Pat_BeaconNotifyAccept :BYTE +EXTERNDEF Pat_BeaconNotifyAccept_Mask :BYTE +EXTERNDEF Pat_NotifyControlMessage :BYTE +EXTERNDEF Pat_NotifyControlMessage_Mask :BYTE +EXTERNDEF Pat_PostRender :BYTE +EXTERNDEF Pat_PostRender_Mask :BYTE +EXTERNDEF Pat_GetPlayerName :BYTE +EXTERNDEF Pat_GetPlayerName_Mask :BYTE +EXTERNDEF Pat_SeamlessTravel :BYTE +EXTERNDEF Pat_SeamlessTravel_Mask :BYTE +EXTERNDEF Pat_CreateTemporaryItem :BYTE +EXTERNDEF Pat_CreateTemporaryItem_Mask :BYTE + +; util.asm — Utility functions +EXTERNDEF Utils_FindPattern :PROC ; (Imagebase:QWORD, pattern:PTR BYTE, mask:PTR BYTE, len:DWORD) -> QWORD +EXTERNDEF Utils_Sin :PROC ; (angle:REAL4) -> REAL4 (result in XMM0) +EXTERNDEF Utils_Cos :PROC ; (angle:REAL4) -> REAL4 (result in XMM0) +EXTERNDEF Utils_RotToQuat :PROC ; (rot:PTR FRotator, out_quat:PTR FQuat) +EXTERNDEF Utils_VecToRot :PROC ; (vec:PTR FVector, out_rot:PTR FRotator) +EXTERNDEF Utils_RandomIntInRange :PROC ; (min:DWORD, max:DWORD) -> DWORD + +; logger.asm — spdlog bridge +EXTERNDEF Logger_Initialize :PROC ; () +EXTERNDEF Logger_LogInfo :PROC ; (fmt:PTR BYTE, ...) +EXTERNDEF Logger_LogWarn :PROC ; (fmt:PTR BYTE, ...) +EXTERNDEF Logger_LogError :PROC ; (fmt:PTR BYTE, ...) + +; hooks.asm — All hook implementations +EXTERNDEF Hooks_TickFlush :PROC +EXTERNDEF Hooks_ProcessEventHook :PROC +EXTERNDEF Hooks_LocalPlayerSpawnPlayActor :PROC +EXTERNDEF Hooks_SpawnPlayActor :PROC +EXTERNDEF Hooks_NetDebug :PROC +EXTERNDEF Hooks_GetPlayerViewPoint :PROC +EXTERNDEF Hooks_CollectGarbage :PROC +EXTERNDEF Hooks_GetNetMode :PROC +EXTERNDEF Hooks_SeamlessTravelHandlerForWorld :PROC +EXTERNDEF Hooks_WelcomePlayer :PROC +EXTERNDEF Hooks_KickPlayer :PROC +EXTERNDEF Hooks_World_NotifyControlMessage :PROC +EXTERNDEF Hooks_Beacon_NotifyAcceptingConnection :PROC +EXTERNDEF Hooks_Beacon_NotifyControlMessage :PROC +EXTERNDEF Hooks_PostRender :PROC +EXTERNDEF Hooks_InitNetworkHooks :PROC + +; ufunctionhooks.asm — UFunction dispatch hooks +EXTERNDEF UFunctionHooks_Initialize :PROC +EXTERNDEF UFunctionHooks_ToHook_Data :QWORD ; base of the hook-registration array +EXTERNDEF UFunctionHooks_ToHook_Num :DWORD ; count of registered hooks + +; sdk/sdk_classes.asm — UObject / GObjects accessors +EXTERNDEF SDK_GetObjectByIndex :PROC ; (index:DWORD) -> QWORD (UObject*) +EXTERNDEF SDK_FindObject :PROC ; (name:PTR BYTE) -> QWORD (UObject*) +EXTERNDEF SDK_FindClass :PROC ; (name:PTR BYTE) -> QWORD (UClass*) +EXTERNDEF SDK_GetWorld :PROC ; () -> QWORD (UWorld*) +EXTERNDEF SDK_GetEngine :PROC ; () -> QWORD (UFortEngine*) + +; sdk/sdk_classes.asm — TArray helpers (element-size-agnostic) +EXTERNDEF TArray_Num :PROC ; (arr:PTR TArrayHeader) -> DWORD +EXTERNDEF TArray_GetByIndex :PROC ; (arr:PTR TArrayHeader, idx:DWORD, elem_size:DWORD) -> QWORD +EXTERNDEF TArray_Add :PROC ; (arr:PTR TArrayHeader, elem:PTR BYTE, elem_size:DWORD) -> DWORD +EXTERNDEF TArray_RemoveAt :PROC ; (arr:PTR TArrayHeader, idx:DWORD, elem_size:DWORD) +EXTERNDEF TArray_RemoveSingle :PROC ; (arr:PTR TArrayHeader, elem:PTR BYTE, elem_size:DWORD) -> BYTE +EXTERNDEF TArray_FreeArray :PROC ; (arr:PTR TArrayHeader) + +; sdk/sdk_classes.asm — FString helpers +EXTERNDEF FString_FromWideChar :PROC ; (out:PTR TArrayHeader, wstr:PTR WORD) +EXTERNDEF FString_Free :PROC ; (str:PTR TArrayHeader) + +; sdk/sdk_fort.asm — Fortnite-specific helpers +EXTERNDEF FortHelper_GetAbilitySystemComponent :PROC ; (pawn:QWORD) -> QWORD +EXTERNDEF FortHelper_GetWorldInventory :PROC ; (pc:QWORD) -> QWORD +EXTERNDEF FortHelper_GetQuickBars :PROC ; (pc:QWORD) -> QWORD + +; logic/game.asm +EXTERNDEF Game_Start :PROC +EXTERNDEF Game_OnReadyToStartMatch :PROC +EXTERNDEF Game_GetDeathCause :PROC ; (report:PTR FFortPlayerDeathReport) -> DWORD (EDeathCause) + +; logic/inventory.asm +EXTERNDEF Inventory_Update :PROC ; (pc:QWORD, dirty:DWORD, bRemovedItem:BYTE) +EXTERNDEF Inventory_IsValidGuid :PROC ; (pc:QWORD, guid:PTR FGuid) -> BYTE +EXTERNDEF Inventory_GetEntryInSlot :PROC ; (pc:QWORD, slot:DWORD, item:DWORD, bars:DWORD) -> PTR FFortItemEntry +EXTERNDEF Inventory_AddItemToSlot :PROC ; (pc:QWORD, def:QWORD, slot:DWORD, bars:DWORD, count:DWORD) -> PTR FFortItemEntry +EXTERNDEF Inventory_RemoveItemFromSlot :PROC ; (pc:QWORD, slot:DWORD, bars:DWORD, amount:DWORD) +EXTERNDEF Inventory_IsGuidInInventory :PROC ; (pc:QWORD, guid:PTR FGuid) -> BYTE +EXTERNDEF Inventory_EquipWeaponDefinition :PROC ; (pawn:QWORD, def:QWORD, guid:PTR FGuid) + +; logic/abilities.asm +EXTERNDEF Abilities_TryActivateAbility :PROC +EXTERNDEF Abilities_GrantGameplayAbility :PROC ; (pawn:QWORD, abilityClass:QWORD) +EXTERNDEF Abilities_ApplyAbilities :PROC ; (pawn:QWORD) +EXTERNDEF Abilities_ConsumeAllReplicatedData :PROC + +; logic/spawners.asm +EXTERNDEF Spawners_SpawnActor :PROC ; (actorClass:QWORD, location:PTR FVector, owner:QWORD) -> QWORD +EXTERNDEF Spawners_SummonPickup :PROC ; (pawn:QWORD, itemDef:QWORD, count:DWORD, loc:PTR FVector) -> QWORD +EXTERNDEF Spawners_SummonPickupFromChest :PROC ; (itemDef:QWORD, count:DWORD, loc:PTR FVector) +EXTERNDEF Spawners_SpawnPickupFromFloor :PROC ; (itemDef:QWORD, count:DWORD, loc:PTR FVector) +EXTERNDEF Spawners_SpawnDeco :PROC ; (tool:QWORD, params:QWORD) +EXTERNDEF Spawners_SpawnBuilding :PROC ; (buildClass:QWORD, transform:PTR FTransform, owner:QWORD) -> QWORD + +; logic/teams.asm +EXTERNDEF Team_New :PROC ; (teamPos:DWORD, maxSize:DWORD) -> QWORD (Team*) +EXTERNDEF Team_AddPlayer :PROC ; (team:QWORD, pc:QWORD) +EXTERNDEF Team_Kick :PROC ; (team:QWORD) +EXTERNDEF Team_Num :PROC ; (team:QWORD) -> DWORD +EXTERNDEF Team_InitializePlayer :PROC ; (team:QWORD, pc:QWORD) +EXTERNDEF PlayerTeams_New :PROC ; (maxTeamSize:DWORD) -> QWORD +EXTERNDEF PlayerTeams_GetNextSlot :PROC ; (pt:QWORD) -> DWORD +EXTERNDEF PlayerTeams_FindAvailableSpot :PROC ; (pt:QWORD) -> QWORD (Team*) +EXTERNDEF PlayerTeams_AddPlayerToTeam :PROC ; (pt:QWORD, pc:QWORD) +EXTERNDEF PlayerTeams_AddPlayerToRandomTeam :PROC + +; gamemodes/gamemode_base.asm +EXTERNDEF GameModeBase_InitPawn :PROC +EXTERNDEF GameModeBase_LoadPlayer :PROC +EXTERNDEF GameModeBase_Respawn :PROC +EXTERNDEF GameModeBase_OnPlayerDeath :PROC +EXTERNDEF GameModeBase_StartMatch :PROC + +; gamemodes/gamemode_solos.asm +EXTERNDEF GameModeSolos_Initialize :PROC + +; gamemodes/gamemode_duos.asm +EXTERNDEF GameModeDuos_Initialize :PROC + +; gamemodes/gamemode_50v50.asm +EXTERNDEF GameMode50v50_Initialize :PROC + +; gamemodes/gamemode_playground.asm +EXTERNDEF GameModePlayground_Initialize :PROC + +; gamemodes/gamemode_lategame.asm +EXTERNDEF GameModeLateGame_Initialize :PROC + +; gui.asm / zerogui.asm / zeroinput.asm +EXTERNDEF GUI_Tick :PROC +EXTERNDEF ZeroGUI_SetupCanvas :PROC +EXTERNDEF ZeroGUI_Begin :PROC +EXTERNDEF ZeroGUI_End :PROC +EXTERNDEF ZeroInput_Update :PROC + +; Windows API +EXTRN AllocConsole :PROC +EXTRN CreateThread :PROC +EXTRN GetModuleHandleA :PROC +EXTRN GetCurrentThread :PROC +EXTRN IsBadReadPtr :PROC +EXTRN GetAsyncKeyState :PROC +EXTRN Sleep :PROC +EXTRN ExitThread :PROC +EXTRN RtlZeroMemory :PROC + +; Microsoft Detours +EXTRN DetourTransactionBegin :PROC +EXTRN DetourTransactionCommit :PROC +EXTRN DetourTransactionAbort :PROC +EXTRN DetourUpdateThread :PROC +EXTRN DetourAttach :PROC +EXTRN DetourDetach :PROC + +; C runtime helpers +EXTRN memcpy :PROC +EXTRN memmove :PROC +EXTRN memset :PROC +EXTRN memcmp :PROC diff --git a/include/macros.inc b/include/macros.inc new file mode 100644 index 0000000..c7c157f --- /dev/null +++ b/include/macros.inc @@ -0,0 +1,213 @@ +SHADOW_SPACE EQU 32 ; 4 * 8 bytes + +STACK_ALIGN_SIZE EQU 16 + +PROC_ENTER MACRO local_bytes:=<0> + push rbp + mov rbp, rsp + ; Compute sub rsp amount: round_up(local_bytes + SHADOW_SPACE, 16) + ; If (local_bytes + SHADOW_SPACE) mod 16 == 0, already aligned + ; (push rbp above biased by 8; a further sub rsp of a multiple of 16 + ; keeps alignment correct because entry RSP was already 8-mod-16). + LOCAL _lsz + _lsz = local_bytes + SHADOW_SPACE + IF (_lsz MOD 16) NE 0 + _lsz = _lsz + (16 - (_lsz MOD 16)) + ENDIF + sub rsp, _lsz +ENDM + +; Restores RSP from RBP, pops RBP, returns. +; Caller must pop any callee-saved registers BEFORE invoking this. +PROC_LEAVE MACRO + mov rsp, rbp + pop rbp + ret +ENDM + +PROC_ENTER_REGS MACRO regs:VARARG + FOR reg, + push reg + ENDM +ENDM + +PROC_LEAVE_REGS MACRO regs:VARARG + FOR reg, + pop reg + ENDM +ENDM + +CALL_SETUP MACRO extra_stack_qwords:=<0> + LOCAL _extra + _extra = extra_stack_qwords * 8 + IF (_extra MOD 16) NE 0 + _extra = _extra + 8 ; pad to 16-byte alignment + ENDIF + sub rsp, SHADOW_SPACE + _extra +ENDM + +; Restore RSP after a call that used CALL_SETUP. +CALL_TEARDOWN MACRO extra_stack_qwords:=<0> + LOCAL _extra + _extra = extra_stack_qwords * 8 + IF (_extra MOD 16) NE 0 + _extra = _extra + 8 + ENDIF + add rsp, SHADOW_SPACE + _extra +ENDM + +NULL_CHECK MACRO reg, label + test reg, reg + jz label +ENDM + +CheckNullFatal_M MACRO reg, msg_reg, fatal_label + test reg, reg + jnz @F + lea msg_reg, [fatal_label&_str] ; caller defines label&_str in .const + jmp fatal_label + @@: +ENDM + +CheckNullFatalStr_M MACRO reg, str_sym, fatal_label + test reg, reg + jnz @F + lea rcx, str_sym + jmp fatal_label + @@: +ENDM + +DETOUR_START_M MACRO + sub rsp, SHADOW_SPACE + call DetourTransactionBegin + ; ignore return value (always S_OK in normal use) + mov rcx, DETOUR_ALL_THREADS ; -1 = all threads + call DetourUpdateThread + add rsp, SHADOW_SPACE +ENDM + +; sentinel for "all threads" passed to DetourUpdateThread +DETOUR_ALL_THREADS EQU -1 + +DETOUR_END_M MACRO + sub rsp, SHADOW_SPACE + call DetourTransactionCommit + add rsp, SHADOW_SPACE +ENDM + +DetourAttachM MACRO ppOriginal, pHook + sub rsp, SHADOW_SPACE + lea rcx, ppOriginal + lea rdx, pHook + call DetourAttach + add rsp, SHADOW_SPACE +ENDM + +DetourDetachM MACRO ppOriginal, pHook + sub rsp, SHADOW_SPACE + lea rcx, ppOriginal + lea rdx, pHook + call DetourDetach + add rsp, SHADOW_SPACE +ENDM + +AddressToFunction_M MACRO result_reg, base_reg, offset + mov result_reg, base_reg + add result_reg, offset +ENDM + +VtableCall_M MACRO obj_reg, slot, scratch_reg + mov scratch_reg, [obj_reg] ; vtable ptr + call QWORD PTR [scratch_reg + (slot)*8] +ENDM + +LOG_INFO_M MACRO fmt_sym + sub rsp, SHADOW_SPACE + lea rcx, fmt_sym + call Logger_LogInfo + add rsp, SHADOW_SPACE +ENDM + +LOG_WARN_M MACRO fmt_sym + sub rsp, SHADOW_SPACE + lea rcx, fmt_sym + call Logger_LogWarn + add rsp, SHADOW_SPACE +ENDM + +LOG_ERROR_M MACRO fmt_sym + sub rsp, SHADOW_SPACE + lea rcx, fmt_sym + call Logger_LogError + add rsp, SHADOW_SPACE +ENDM + +FIND_PATTERN_M MACRO result_reg, pattern_sym, mask_sym, pattern_len + sub rsp, SHADOW_SPACE + mov rcx, [Imagebase] + lea rdx, pattern_sym + lea r8, mask_sym + mov r9d, pattern_len + call Utils_FindPattern + mov result_reg, rax + add rsp, SHADOW_SPACE +ENDM + +RESOLVE_RIP_M MACRO result_reg, addr_reg + movsxd result_reg, DWORD PTR [addr_reg + 1] ; sign-extend rel32 + add result_reg, addr_reg + add result_reg, 5 ; + size of call instruction +ENDM + +SAVE_NONVOL_4 MACRO r0, r1, r2, r3 + push r0 + push r1 + push r2 + push r3 +ENDM + +RESTORE_NONVOL_4 MACRO r3, r2, r1, r0 + pop r3 + pop r2 + pop r1 + pop r0 +ENDM + +STORE_ARG_RCX MACRO + mov [rsp + 8], rcx +ENDM +STORE_ARG_RDX MACRO + mov [rsp + 16], rdx +ENDM +STORE_ARG_R8 MACRO + mov [rsp + 24], r8 +ENDM +STORE_ARG_R9 MACRO + mov [rsp + 32], r9 +ENDM + +BOOL_TRUE MACRO + mov eax, 1 +ENDM +BOOL_FALSE MACRO + xor eax, eax +ENDM + +ZERO_REG MACRO reg + xor reg, reg +ENDM + +LOAD_QWORD_PTR MACRO dst, sym + mov dst, QWORD PTR [sym] +ENDM + +STORE_QWORD_PTR MACRO sym, src + mov QWORD PTR [sym], src +ENDM + +DEFINE_PEHOOK_M MACRO hook_name, ufunction_sym + hook_name LABEL NEAR + ; RCX = UObject* (caller object) + ; RDX = UFunction* + ; R8 = void* (params struct) +ENDM diff --git a/include/master.inc b/include/master.inc new file mode 100644 index 0000000..4e3c4cf --- /dev/null +++ b/include/master.inc @@ -0,0 +1,4 @@ +INCLUDE include\enums.inc +INCLUDE include\macros.inc +INCLUDE include\structs.inc +INCLUDE include\externs.inc \ No newline at end of file diff --git a/include/structs.inc b/include/structs.inc new file mode 100644 index 0000000..2f2769f --- /dev/null +++ b/include/structs.inc @@ -0,0 +1,413 @@ +; Primitive Math Structs + +FVector STRUCT + X REAL4 ? + Y REAL4 ? + Z REAL4 ? +FVector ENDS ; 0x0C bytes + +FVector2D STRUCT + X REAL4 ? + Y REAL4 ? +FVector2D ENDS ; 0x08 bytes + +FRotator STRUCT + Pitch REAL4 ? + Yaw REAL4 ? + Roll REAL4 ? +FRotator ENDS ; 0x0C bytes + +; FQuat is 16-byte aligned in UE4 (alignas(16)) +FQuat STRUCT 16 + X REAL4 ? + Y REAL4 ? + Z REAL4 ? + W REAL4 ? +FQuat ENDS ; 0x10 bytes + +; FTransform: FQuat(0x10) + FVector(0x0C) + pad4 + FVector(0x0C) + pad4 = 0x30 +FTransform STRUCT 16 + Rotation FQuat <> + Translation FVector <> + _pad0 DWORD ? + Scale3D FVector <> + _pad1 DWORD ? +FTransform ENDS ; 0x30 bytes + +; Core UE4 Structs + +FName STRUCT + ComparisonIndex DWORD ? + Number DWORD ? +FName ENDS ; 0x08 bytes + +FGuid STRUCT + A DWORD ? + B DWORD ? + C DWORD ? + D DWORD ? +FGuid ENDS ; 0x10 bytes + +; Generic TArray header +TArrayHeader STRUCT + Data QWORD ? ; T* pointer + Num DWORD ? ; element count + Max DWORD ? ; allocated capacity +TArrayHeader ENDS ; 0x10 bytes + +; FString = TArray +FString STRUCT + Data QWORD ? ; wchar_t* pointer + Num DWORD ? ; character count (includes null) + Max DWORD ? ; allocated capacity +FString ENDS ; 0x10 bytes + +; FText: opaque 0x18 bytes (shared data pointer internally) +FText STRUCT + _opaque BYTE 24 DUP (?) +FText ENDS ; 0x18 bytes + +FWeakObjectPtr STRUCT + ObjectIndex DWORD ? + ObjectSerialNumber DWORD ? +FWeakObjectPtr ENDS ; 0x08 bytes + +; FObjectKey has identical layout to FWeakObjectPtr +FObjectKey STRUCT + ObjectIndex DWORD ? + ObjectSerialNumber DWORD ? +FObjectKey ENDS ; 0x08 bytes + +; Gameplay Tags + +FGameplayTag STRUCT + TagName FName <> +FGameplayTag ENDS ; 0x08 bytes + +FGameplayTagContainer STRUCT + GameplayTags TArrayHeader <> ; TArray +0x00 + ParentTags TArrayHeader <> ; TArray +0x10 +FGameplayTagContainer ENDS ; 0x20 bytes + +; Network Structs + +; FURL: total 0x70 +FURL STRUCT + Protocol FString <> ; +0x00 + Host FString <> ; +0x10 + Port DWORD ? ; +0x20 + _pad0 DWORD ? ; +0x24 + Map FString <> ; +0x28 + RedirectUrl FString <> ; +0x38 + Op TArrayHeader <> ; +0x48 TArray + Portal FString <> ; +0x58 + Valid DWORD ? ; +0x68 + _pad1 DWORD ? ; +0x6C +FURL ENDS ; 0x70 bytes + +; FUniqueNetIdRepl: total 0x28 +FUniqueNetIdRepl STRUCT + _wrapper_opaque BYTE 24 DUP (?) ; +0x00 (base+unknown 0x18 bytes) + ReplicationBytes TArrayHeader <> ; +0x18 TArray +FUniqueNetIdRepl ENDS ; 0x28 bytes + +; Gameplay Ability System Structs + +FGameplayAbilitySpecHandle STRUCT + Handle DWORD ? +FGameplayAbilitySpecHandle ENDS ; 0x04 bytes + +; FPredictionKey: total 0x18 +FPredictionKey STRUCT + Current WORD ? ; +0x00 + Base WORD ? ; +0x02 + _pad0 DWORD ? ; +0x04 + PackageMap QWORD ? ; +0x08 UPackageMap* + bIsStale BYTE ? ; +0x10 + bIsServerInitiated BYTE ? ; +0x11 + _pad1 BYTE 6 DUP (?) ; +0x12 +FPredictionKey ENDS ; 0x18 bytes + +; FGameplayAbilityActivationInfo: total 0x20 +FGameplayAbilityActivationInfo STRUCT + ActivationMode BYTE ? ; +0x00 + _bitfield BYTE ? ; +0x01 + _pad BYTE 6 DUP (?) ; +0x02 + PredKey FPredictionKey <> ; +0x08 +FGameplayAbilityActivationInfo ENDS ; 0x20 bytes + +; FGameplayAbilitySpec: total 0xC8 (base FFastArraySerializerItem=0x0C) +FGameplayAbilitySpec STRUCT + _base BYTE 12 DUP (?) ; +0x00 FFastArraySerializerItem + Handle FGameplayAbilitySpecHandle <> ; +0x0C + Ability QWORD ? ; +0x10 UGameplayAbility* + Level DWORD ? ; +0x18 + InputID DWORD ? ; +0x1C + SourceObject QWORD ? ; +0x20 UObject* + ActiveCount BYTE ? ; +0x28 + _bitfield BYTE ? ; +0x29 (InputPressed etc.) + _pad0 BYTE 6 DUP (?) ; +0x2A + ActivationInfo FGameplayAbilityActivationInfo <> ; +0x30 + NonReplInstances TArrayHeader <> ; +0x50 + ReplInstances TArrayHeader <> ; +0x60 + GEHandle QWORD ? ; +0x70 (FActiveGameplayEffectHandle partial) + _tail BYTE 80 DUP (?) ; +0x78 +FGameplayAbilitySpec ENDS ; 0xC8 bytes + +; FGameplayAbilityRepAnimMontage: total 0x30 +FGameplayAbilityRepAnimMontage STRUCT + AnimMontage QWORD ? ; +0x00 UAnimMontage* + PlayRate REAL4 ? ; +0x08 + Position REAL4 ? ; +0x0C + BlendTime REAL4 ? ; +0x10 + NextSectionID BYTE ? ; +0x14 + _bitfield BYTE ? ; +0x15 IsStopped/ForcePlayBit/SkipPos + _pad WORD ? ; +0x16 + PredictionKey FPredictionKey <> ; +0x18 +FGameplayAbilityRepAnimMontage ENDS ; 0x30 bytes + +; FGameplayAbilityLocalAnimMontage: total 0x30 +FGameplayAbilityLocalAnimMontage STRUCT + AnimMontage QWORD ? ; +0x00 UAnimMontage* + PlayBit BYTE ? ; +0x08 + _pad BYTE 7 DUP (?) ; +0x09 + PredictionKey FPredictionKey <> ; +0x10 + AnimatingAbility QWORD ? ; +0x28 UGameplayAbility* +FGameplayAbilityLocalAnimMontage ENDS ; 0x30 bytes + +; FGameplayEventData: total 0xA8 +FGameplayEventData STRUCT + EventTag FGameplayTag <> ; +0x00 + Instigator QWORD ? ; +0x08 AActor* + Target QWORD ? ; +0x10 AActor* + OptionalObject QWORD ? ; +0x18 UObject* + OptionalObject2 QWORD ? ; +0x20 UObject* + ContextHandle BYTE 24 DUP (?) ; +0x28 FGameplayEffectContextHandle (opaque) + InstigatorTags FGameplayTagContainer <> ; +0x40 + TargetTags FGameplayTagContainer <> ; +0x60 + EventMagnitude REAL4 ? ; +0x80 + _pad DWORD ? ; +0x84 + TargetData BYTE 32 DUP (?) ; +0x88 FGameplayAbilityTargetDataHandle (opaque) +FGameplayEventData ENDS ; 0xA8 bytes + +; Fortnite-Specific Structs + +; FDeathInfo: total 0x20 +FDeathInfo STRUCT + FinisherOrDowner QWORD ? ; +0x00 AFortPlayerStateAthena* + bDBNO BYTE ? ; +0x08 + DeathCause BYTE ? ; +0x09 EDeathCause + _pad0 WORD ? ; +0x0A + Distance REAL4 ? ; +0x0C + DeathLocation FVector <> ; +0x10 + _pad1 DWORD ? ; +0x1C +FDeathInfo ENDS ; 0x20 bytes + +; FFortPlayerDeathReport: total 0x50 +FFortPlayerDeathReport STRUCT + ServerTimeForRespawn REAL4 ? ; +0x00 + ServerTimeForResurrect REAL4 ? ; +0x04 + LethalDamage REAL4 ? ; +0x08 + _pad DWORD ? ; +0x0C + KillerPlayerState QWORD ? ; +0x10 AFortPlayerState* + KillerPawn QWORD ? ; +0x18 AFortPawn* + DamageCauser QWORD ? ; +0x20 AActor* + _bitfield BYTE ? ; +0x28 bDropped/bNotifyUI + _pad2 BYTE 7 DUP (?) ; +0x29 + Tags FGameplayTagContainer <> ; +0x30 +FFortPlayerDeathReport ENDS ; 0x50 bytes + +; FAircraftFlightInfo / FFlightInfo: total 0x28 +FAircraftFlightInfo STRUCT + FlightStartLocation BYTE 12 DUP (?) ; +0x00 FVector_NetQuantize100 (same as FVector layout) + FlightStartRotation FRotator <> ; +0x0C + FlightSpeed REAL4 ? ; +0x18 + TimeTillFlightEnd REAL4 ? ; +0x1C + TimeTillDropStart REAL4 ? ; +0x20 + TimeTillDropEnd REAL4 ? ; +0x24 +FAircraftFlightInfo ENDS ; 0x28 bytes + +; FQuickBarSlot: total 0x18 +FQuickBarSlot STRUCT + Items TArrayHeader <> ; +0x00 TArray + bEnabled BYTE ? ; +0x10 + _pad BYTE 7 DUP (?) ; +0x11 +FQuickBarSlot ENDS ; 0x18 bytes + +; FQuickBar: total 0x90 +FQuickBar STRUCT + CurrentFocusedSlot DWORD ? ; +0x00 + PreviousFocusedSlot DWORD ? ; +0x04 + SecondaryFocusedSlot DWORD ? ; +0x08 + _pad DWORD ? ; +0x0C + Slots TArrayHeader <> ; +0x10 TArray + DataDefinition BYTE 16 DUP (?) ; +0x20 FQuickBarData (opaque 0x10) + _unknown BYTE 80 DUP (?) ; +0x30 EquippedItemDefinitions set + SharedVisibleSlotIdx TArrayHeader <> ; +0x80 TArray +FQuickBar ENDS ; 0x90 bytes + +; FFortItemEntry: total 0xC8 (base FFastArraySerializerItem=0x0C) +FFortItemEntry STRUCT + _base BYTE 12 DUP (?) ; +0x00 FFastArraySerializerItem + Count DWORD ? ; +0x0C + PreviousCount DWORD ? ; +0x10 + _pad0 DWORD ? ; +0x14 + ItemDefinition QWORD ? ; +0x18 UFortItemDefinition* + Durability REAL4 ? ; +0x20 + Level DWORD ? ; +0x24 + LoadedAmmo DWORD ? ; +0x28 + _pad1 DWORD ? ; +0x2C + AlterationDefinitions TArrayHeader <> ; +0x30 + ItemSource FString <> ; +0x40 + ItemGuid FGuid <> ; +0x50 + _bool0 BYTE ? ; +0x60 inventory_overflow_date + bIsReplicatedCopy BYTE ? ; +0x61 + bIsDirty BYTE ? ; +0x62 + _pad2 BYTE 5 DUP (?) ; +0x63 + GiftingInfo BYTE 40 DUP (?) ; +0x68 FFortGiftingInfo (opaque 0x28) + StateValues TArrayHeader <> ; +0x90 + ParentInventory FWeakObjectPtr <> ; +0xA0 + GASpecHandle DWORD ? ; +0xA8 FGameplayAbilitySpecHandle + _pad3 DWORD ? ; +0xAC + AlterationInstances TArrayHeader <> ; +0xB0 + GenericAttrValue REAL4 ? ; +0xC0 + _pad4 DWORD ? ; +0xC4 +FFortItemEntry ENDS ; 0xC8 bytes + +; FFortItemList: total 0x170 (base FFastArraySerializer=0xB0) +FFortItemList STRUCT + _base BYTE 176 DUP (?) ; +0x00 FFastArraySerializer (0xB0) + ReplicatedEntries TArrayHeader <> ; +0xB0 TArray + _unknown0 BYTE 80 DUP (?) ; +0xC0 + ItemInstances TArrayHeader <> ; +0x110 TArray + _unknown1 BYTE 80 DUP (?) ; +0x120 +FFortItemList ENDS ; 0x170 bytes + +; Field Offset Constants + +; UObject field offsets (base 0x0028 already past vtable) +UOBJECT_Flags EQU 00Ch ; int32 (from UObject base +0x0C, but struct starts at 0 here) +UOBJECT_InternalIndex EQU 010h +UOBJECT_Class EQU 018h +UOBJECT_Name EQU 020h ; FName +UOBJECT_Outer EQU 028h + +; UFunction field offsets (UObject base = 0x28 → UField 0x30 → UStruct 0x80 → UFunction 0x70 more) +UFUNC_FunctionFlags EQU 0D0h +UFUNC_NumParms EQU 0D6h +UFUNC_ParmsSize EQU 0D8h +UFUNC_Func EQU 0B0h ; native func ptr at UFunction+0xB0 (0x28 obj + 0x88 struct header) + +; TUObjectArray offsets +TUOBJECTARRAY_Objects EQU 000h ; uint8* flat array +TUOBJECTARRAY_MaxElem EQU 008h ; uint32 +TUOBJECTARRAY_NumElem EQU 00Ch ; uint32 +TUOBJECTARRAY_STRIDE EQU 024 ; 24 bytes per slot + +; UNetDriver offsets +UNETDRIVER_ServerConn EQU 078h +UNETDRIVER_ClientConns EQU 080h ; TArray +UNETDRIVER_World EQU 0B8h +UNETDRIVER_ReplDriver EQU 500h + +; UNetConnection offsets +UNETCONN_Driver EQU 058h +UNETCONN_ViewTarget EQU 090h +UNETCONN_OwningActor EQU 098h + +; AActor offsets +AACTOR_RemoteRole EQU 085h +AACTOR_RepMovement EQU 088h +AACTOR_Owner EQU 108h +AACTOR_Role EQU 118h +AACTOR_Instigator EQU 140h +AACTOR_Children EQU 148h ; TArray +AACTOR_RootComponent EQU 158h + +; AFortPlayerControllerAthena offsets (in parent chain) +AFPC_QuickBars EQU 1C38h +AFPC_WorldInventory EQU 1ED8h +AFPC_OutpostInventory EQU 1EE0h +AFPCA_bClientNotifiedOfWin EQU 2BE4h +AFPCA_WarmupPlayerStart EQU 3198h + +; AFortPlayerState offsets +AFPS_bHasFinishedLoading EQU 4E0h ; bit2 in uint8 +AFPS_bHasStartedPlaying EQU 4E0h ; bit3 in uint8 +AFPS_HeroType EQU 528h +AFPS_CharacterGender EQU 7F0h +AFPS_CharacterBodyType EQU 7F1h +AFPS_CharacterParts EQU 7F8h ; UCustomCharacterPart*[6] = 0x30 bytes +AFPS_PlayerTeam EQU 8F0h +AFPS_AbilitySysComp EQU 0B88h + +; AFortPlayerStateAthena offsets +AFPSA_DeathInfo EQU 0F40h +AFPSA_TeamIndex EQU 0F60h +AFPSA_KillScore EQU 0F68h +AFPSA_TeamKillScore EQU 0F6Ch +AFPSA_SquadId EQU 10F0h +AFPSA_bIsDisconnected EQU 1674h + +; AFortGameModeAthena offsets +AFGMA_bAlwaysDBNO EQU 8E0h +AFGMA_bSafeZoneActive EQU 0B04h +AFGMA_bSafeZonePaused EQU 0B05h +AFGMA_SafeZonePhase EQU 0B20h +AFGMA_SafeZoneIndicator EQU 0B28h +AFGMA_SafeZoneLocations EQU 0B30h ; TArray +AFGMA_bAllowSpectate EQU 0B68h +AFGMA_AlivePlayers EQU 950h ; TArray + +; AFortGameStateAthena offsets +AFGSA_WarmupCDStart EQU 14F0h +AFGSA_WarmupCDEnd EQU 14F4h +AFGSA_AircraftStartTime EQU 14F8h +AFGSA_SafeZoneStartTime EQU 14FCh +AFGSA_TotalPlayers EQU 1508h +AFGSA_PlayersLeft EQU 150Ch +AFGSA_WinningPlayerName EQU 1588h +AFGSA_SafeZoneIndicator EQU 15F0h +AFGSA_GamePhase EQU 1B98h +AFGSA_CurrentPlaylist EQU 1BA0h +AFGSA_bSkipAircraft EQU 1BA8h +AFGSA_SafeZonePhase EQU 1BA9h +AFGSA_Aircrafts EQU 1BB8h ; TArray + +; AFortInventory offsets +AFINV_InventoryType EQU 320h +AFINV_Inventory EQU 328h ; FFortItemList +AFINV_bRequiresLocalUpdate EQU 498h +AFINV_PendingInstances EQU 4B0h + +; AFortQuickBars offsets +AFQB_PrimaryQuickBar EQU 318h ; FQuickBar (0x90) +AFQB_SecondaryQuickBar EQU 438h ; FQuickBar (0x90) + +; UFortWorldItem offsets +UFWI_bIsTemporaryItem EQU 1D0h +UFWI_OwnerInventory EQU 1D8h +UFWI_ItemEntry EQU 1E0h ; FFortItemEntry (0xC8) + +; AFortPickup offsets +AFPU_bRandomRotation EQU 348h +AFPU_PrimaryPickupItemEntry EQU 350h ; FFortItemEntry +AFPU_bPickedUp EQU 4C0h +AFPU_PawnWhoDroppedPickup EQU 4C8h + +; AFortAthenaAircraft offsets +AFAA_ExitLocation EQU 384h ; FVector +AFAA_FlightInfo EQU 390h ; FAircraftFlightInfo (0x28) +AFAA_FlightStartTime EQU 3B8h + +; UAbilitySystemComponent offsets +UASC_ActivatableAbilities EQU 470h ; FGameplayAbilitySpecContainer +UASC_AllReplInstAbils EQU 588h ; TArray +UASC_RepAnimMontageInfo EQU 0AF0h ; FGameplayAbilityRepAnimMontage +UASC_LocalAnimMontageInfo EQU 0B28h ; FGameplayAbilityLocalAnimMontage + +; FGameplayAbilitySpecContainer: Items TArray at +0xB0 (base FFastArraySerializer=0xB0) +GASC_Items EQU 0B0h + +; ClassRepNodePolicies raw offset on UReplicationDriver +REPDRIVER_ClassRepPolicies EQU 3B8h ; TMap diff --git a/raider.def b/raider.def new file mode 100644 index 0000000..2441759 --- /dev/null +++ b/raider.def @@ -0,0 +1,3 @@ +LIBRARY raider +EXPORTS + DllMain