Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
91 changes: 91 additions & 0 deletions AndUEDumper/src/UE/UEGameProfiles/SFG3.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
#pragma once

#include "../UEGameProfile.hpp"
#include <cstdio>

using namespace UEMemory;

class SFG3Profile : public IGameProfile
{
public:
SFG3Profile() = default;

bool ArchSupprted() const override
{
auto e_machine = GetUnrealELF().header().e_machine;
return e_machine == EM_AARCH64;
}

std::string GetAppName() const override
{
return "SFG3";
}

std::vector<std::string> GetAppIDs() const override
{
return {"com.ForgeGames.sfg3"};
}

bool isUsingCasePreservingName() const override
{
return false;
}

bool IsUsingFNamePool() const override
{
return true;
}

bool isUsingOutlineNumberName() const override
{
return false;
}

uintptr_t GetGUObjectArrayPtr() const override
{
return vm_rpm_ptr<uintptr_t>((void*)Arm64::DecodeADRL(findIdaPattern(PATTERN_MAP_TYPE::ANY_X, "? ? ? F9 ? ? ? 94 ? ? ? D1 ? ? ? 94 ? ? ? D1", -4)));
}

uintptr_t GetNamesPtr() const override
{
return Arm64::DecodeADRL(GetUnrealELF().findSymbol("_Zeq12FNameEntryId5EName"));
}

UE_Offsets* GetOffsets() const override
{
static UE_Offsets offsets = UE_DefaultOffsets::UE4_25_27(isUsingCasePreservingName());

static bool once = false;
if (!once)
{
once = true;
offsets.FUObjectArray.ObjObjects = 0;
offsets.TUObjectArray.Objects = 0x10;
offsets.TUObjectArray.NumElements = 0x24;

// Custom SFG3 Property Layout
offsets.FProperty.ArrayInner = 0x58;
}

return &offsets;
}

uint8_t* GetNameEntry(int32_t id) const override
{
uintptr_t namePool = _UEVars.GetNamesPtr();
if (!namePool) return nullptr;

auto get = [&](uint32_t idx)
{
auto& f = GetOffsets()->FNamePool;
uintptr_t chunk = vm_rpm_ptr<uintptr_t>((void*)(namePool + f.BlocksOff + ((idx >> 16) * 8)));
return chunk ? (uint8_t*)(chunk + (idx & 0xFFFF) * f.Stride) : nullptr;
};
uint8_t* entry = get(id);
if (entry && (vm_rpm_ptr<uint16_t>(entry) >> 6) > 0)
return entry;

uint32_t sIdx = vm_rpm_ptr<uint32_t>((void*)(namePool + 0x18040 + (id * 4)));
return (sIdx == 0 && id != 0) ? nullptr : get(sIdx);
}
};
8 changes: 5 additions & 3 deletions AndUEDumper/src/UE/UEOffsets.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ struct UE_Offsets
uintptr_t PropertyFlags = 0;
uintptr_t Offset_Internal = 0;
uintptr_t Size = 0;
uintptr_t ArrayInner = 0;
} UProperty;
struct
{
Expand All @@ -111,6 +112,7 @@ struct UE_Offsets
uintptr_t PropertyFlags = 0;
uintptr_t Offset_Internal = 0;
uintptr_t Size = 0;
uintptr_t ArrayInner = 0;
} FProperty;

std::string ToString() const;
Expand Down Expand Up @@ -201,7 +203,7 @@ struct UEVars
uintptr_t ObjObjectsPtr;
uintptr_t ObjObjects_Objects;

UE_Offsets *Offsets;
UE_Offsets* Offsets;

std::function<std::string(int32_t)> pGetNameByID;

Expand All @@ -210,7 +212,7 @@ struct UEVars
{
}

UEVars(uintptr_t base, uintptr_t names, uintptr_t objectArray, uintptr_t objObjects, uintptr_t objects, UE_Offsets *offsets, const std::function<std::string(int32_t)> &pGetNameByID) : BaseAddress(base), NamesPtr(names), GUObjectsArrayPtr(objectArray), ObjObjectsPtr(objObjects), ObjObjects_Objects(objects), Offsets(offsets), pGetNameByID(pGetNameByID)
UEVars(uintptr_t base, uintptr_t names, uintptr_t objectArray, uintptr_t objObjects, uintptr_t objects, UE_Offsets* offsets, const std::function<std::string(int32_t)>& pGetNameByID) : BaseAddress(base), NamesPtr(names), GUObjectsArrayPtr(objectArray), ObjObjectsPtr(objObjects), ObjObjects_Objects(objects), Offsets(offsets), pGetNameByID(pGetNameByID)
{
}

Expand All @@ -220,7 +222,7 @@ struct UEVars
uintptr_t GetObjObjectsPtr() const { return ObjObjectsPtr; };
uintptr_t GetObjObjects_Objects() const { return ObjObjects_Objects; };

UE_Offsets *GetOffsets() const { return Offsets; };
UE_Offsets* GetOffsets() const { return Offsets; };

std::string GetNameByID(int32_t id) const;

Expand Down
Loading