Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added base package reader and converted GlobalNodeRef #121

Merged
merged 4 commits into from
May 9, 2024
Merged
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
4 changes: 4 additions & 0 deletions include/RED4ext/Detail/AddressHashes.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,10 @@ constexpr std::uint32_t ObjectPackageReader_OnReadHeader = 1632836642;
constexpr std::uint32_t ObjectPackageReader_ReadHeader = 1285757088;
#pragma endregion

#pragma region BasePackageReader
constexpr std::uint32_t BasePackageReader_ReadHeader = 3410956665;
#pragma endregion

#pragma region ResourceDepot
constexpr std::uint32_t ResourceDepot = 0x659A0FC7;
#pragma endregion
Expand Down
3 changes: 2 additions & 1 deletion include/RED4ext/Dump/Reflection-inl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,8 @@ RED4EXT_INLINE void Dump(std::filesystem::path aOutPath, std::filesystem::path a
{"CBaseEngine", "GameEngine"},
{"BaseGameEngine", "GameEngine"},
{"CGameEngine", "GameEngine"},
{"UpdateBucketEnum", "SystemUpdate"}};
{"UpdateBucketEnum", "SystemUpdate"},
{"worldGlobalNodeRef", "NativeTypes"}};

std::regex invalidChars(INVALID_CHARACTERS);
std::regex invalidKeywords(INVALID_KEYWORDS);
Expand Down
12 changes: 12 additions & 0 deletions include/RED4ext/NodeRef.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,18 @@ struct NodeRef
};
RED4EXT_ASSERT_SIZE(NodeRef, 0x8);

namespace world
{
struct GlobalNodeRef : NodeRef
{
using NodeRef::NodeRef;
};
RED4EXT_ASSERT_SIZE(GlobalNodeRef, 0x8);
} // namespace world

using GlobalNodeRef = world::GlobalNodeRef;
using worldGlobalNodeRef = world::GlobalNodeRef;

template<typename T>
struct HashMapHash<T, std::enable_if_t<std::is_same_v<T, NodeRef>>>
{
Expand Down
65 changes: 27 additions & 38 deletions include/RED4ext/Package-inl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,58 +5,52 @@
#include <RED4ext/Detail/AddressHashes.hpp>
#include <RED4ext/Relocation.hpp>

RED4EXT_INLINE RED4ext::ObjectPackageHeader::ObjectPackageHeader()
: rootIndex(-1)

RED4EXT_INLINE RED4ext::PackageReader::PackageReader(void* aBuffer, uint32_t aSize)
: buffer(aBuffer)
, size(aSize)
{
}

RED4EXT_INLINE bool RED4ext::ObjectPackageHeader::IsEmpty() const
RED4EXT_INLINE RED4ext::PackageReader::PackageReader(const DeferredDataBuffer& aBuffer)
: buffer(aBuffer.raw->data)
, size(aBuffer.raw->size)
{
return cruids.IsEmpty();
}

RED4EXT_INLINE RED4ext::ObjectPackageReader::ObjectPackageReader(void* aBuffer, uint32_t aSize)
RED4EXT_INLINE RED4ext::PackageReader::PackageReader(const DataBuffer& aBuffer)
: buffer(aBuffer.buffer.data)
, size(aBuffer.buffer.size)
{
using func_t = void (*)(ObjectPackageReader*);
static UniversalRelocFunc<func_t> func(Detail::AddressHashes::ObjectPackageReader_ctor);

func(this);

buffer = aBuffer;
size = aSize;
}

RED4EXT_INLINE RED4ext::ObjectPackageReader::ObjectPackageReader(const DeferredDataBuffer& aBuffer)
RED4EXT_INLINE RED4ext::PackageReader::PackageReader(const RawBuffer& aBuffer)
: buffer(aBuffer.data)
, size(aBuffer.size)
{
using func_t = void (*)(ObjectPackageReader*);
static UniversalRelocFunc<func_t> func(Detail::AddressHashes::ObjectPackageReader_ctor);

func(this);

buffer = aBuffer.raw->data;
size = aBuffer.raw->size;
}

RED4EXT_INLINE RED4ext::ObjectPackageReader::ObjectPackageReader(const DataBuffer& aBuffer)
RED4EXT_INLINE bool RED4ext::PackageReader::IsEmpty() const
{
using func_t = void (*)(ObjectPackageReader*);
static UniversalRelocFunc<func_t> func(Detail::AddressHashes::ObjectPackageReader_ctor);
return !buffer;
}

func(this);
RED4EXT_INLINE void RED4ext::PackageReader::ReadHeader(RED4ext::PackageHeader& aOut)
{
using func_t = void (*)(PackageReader*, PackageHeader&);
static UniversalRelocFunc<func_t> func(Detail::AddressHashes::BasePackageReader_ReadHeader);

buffer = aBuffer.buffer.data;
size = aBuffer.buffer.size;
func(this, aOut);
}

RED4EXT_INLINE RED4ext::ObjectPackageReader::ObjectPackageReader(const RawBuffer& aBuffer)
RED4EXT_INLINE RED4ext::ObjectPackageHeader::ObjectPackageHeader()
: rootIndex(-1)
{
using func_t = void (*)(ObjectPackageReader*);
static UniversalRelocFunc<func_t> func(Detail::AddressHashes::ObjectPackageReader_ctor);

func(this);
}

buffer = aBuffer.data;
size = aBuffer.size;
RED4EXT_INLINE bool RED4ext::ObjectPackageHeader::IsEmpty() const
{
return cruids.IsEmpty();
}

RED4EXT_INLINE void RED4ext::ObjectPackageReader::OnReadHeader(uint64_t a1, uint64_t a2)
Expand All @@ -83,11 +77,6 @@ RED4EXT_INLINE void RED4ext::ObjectPackageReader::ReadHeader(RED4ext::ObjectPack
func(this, aOut);
}

RED4EXT_INLINE bool RED4ext::ObjectPackageReader::IsEmpty() const
{
return !buffer;
}

RED4EXT_INLINE RED4ext::ObjectPackageExtractorParams::ObjectPackageExtractorParams(const RED4ext::PackageHeader& aHeader)
: header(aHeader)
, loader(ResourceLoader::Get())
Expand Down
38 changes: 25 additions & 13 deletions include/RED4ext/Package.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,27 @@ RED4EXT_ASSERT_OFFSET(PackageHeader, unk02, 0x02);
RED4EXT_ASSERT_OFFSET(PackageHeader, root, 0x08);
RED4EXT_ASSERT_OFFSET(PackageHeader, buffer, 0x48);

struct PackageReader
{
PackageReader(void* aBuffer, uint32_t aSize);
PackageReader(const DeferredDataBuffer& aBuffer);
PackageReader(const DataBuffer& aBuffer);
PackageReader(const RawBuffer& aBuffer);

virtual ~PackageReader() = default; // 00
virtual void OnReadHeader(uint64_t a1, uint64_t a2) = 0; // 08

void ReadHeader(PackageHeader& aOut);

[[nodiscard]] bool IsEmpty() const;

void* buffer; // 08
uint32_t size; // 10
};
RED4EXT_ASSERT_SIZE(PackageReader, 0x18);
RED4EXT_ASSERT_OFFSET(PackageReader, buffer, 0x08);
RED4EXT_ASSERT_OFFSET(PackageReader, size, 0x10);

struct ObjectPackageHeader
{
ObjectPackageHeader();
Expand All @@ -63,28 +84,19 @@ RED4EXT_ASSERT_OFFSET(ObjectPackageHeader, rootIndex, 0x0);
RED4EXT_ASSERT_OFFSET(ObjectPackageHeader, cruids, 0x08);
RED4EXT_ASSERT_OFFSET(ObjectPackageHeader, package, 0x18);

struct ObjectPackageReader
struct ObjectPackageReader : PackageReader
{
ObjectPackageReader(void* aBuffer, uint32_t aSize);
ObjectPackageReader(const DeferredDataBuffer& aBuffer);
ObjectPackageReader(const DataBuffer& aBuffer);
ObjectPackageReader(const RawBuffer& aBuffer);
using PackageReader::PackageReader;

virtual ~ObjectPackageReader() = default; // 00
virtual void OnReadHeader(uint64_t a1, uint64_t a2); // 08
~ObjectPackageReader() override = default; // 00
void OnReadHeader(uint64_t a1, uint64_t a2) override; // 08

void ReadHeader();
void ReadHeader(ObjectPackageHeader& aOut);

[[nodiscard]] bool IsEmpty() const;

void* buffer; // 08
uint32_t size; // 10
ObjectPackageHeader header; // 18
};
RED4EXT_ASSERT_SIZE(ObjectPackageReader, 0x88);
RED4EXT_ASSERT_OFFSET(ObjectPackageReader, buffer, 0x08);
RED4EXT_ASSERT_OFFSET(ObjectPackageReader, size, 0x10);
RED4EXT_ASSERT_OFFSET(ObjectPackageReader, header, 0x18);

struct ObjectPackageExtractorParams
Expand Down
2 changes: 1 addition & 1 deletion include/RED4ext/ResourceLoader.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ struct ResourceToken
using AllocatorType = Memory::EngineAllocator;
using LoadedCallback = FlexCallback<void (*)(RED4ext::Handle<T>&)>;

ResourceToken() = delete;
ResourceToken() = default;
ResourceToken(const ResourceToken&) = delete;
ResourceToken(ResourceToken&&) = delete;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

#include <cstdint>
#include <RED4ext/Common.hpp>
#include <RED4ext/Scripting/Natives/Generated/world/GlobalNodeRef.hpp>
#include <RED4ext/NativeTypes.hpp>

namespace RED4ext
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
#include <cstdint>
#include <RED4ext/Common.hpp>
#include <RED4ext/DynArray.hpp>
#include <RED4ext/NativeTypes.hpp>
#include <RED4ext/Scripting/Natives/Generated/quest/PrefabVariantReplicatedInfo.hpp>
#include <RED4ext/Scripting/Natives/Generated/world/GlobalNodeRef.hpp>

namespace RED4ext
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

#include <cstdint>
#include <RED4ext/Common.hpp>
#include <RED4ext/Scripting/Natives/Generated/world/GlobalNodeRef.hpp>
#include <RED4ext/NativeTypes.hpp>
#include <RED4ext/Scripting/Natives/Generated/world/QuestPrefabLoadingMode.hpp>

namespace RED4ext
Expand Down

This file was deleted.

1 change: 0 additions & 1 deletion src/Scripting/Natives.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2957,7 +2957,6 @@
#include <RED4ext/Scripting/Natives/Generated/world/GeometryShapeNode.hpp>
#include <RED4ext/Scripting/Natives/Generated/world/GeometryShapeNodeInstance.hpp>
#include <RED4ext/Scripting/Natives/Generated/world/GlobalNodeID.hpp>
#include <RED4ext/Scripting/Natives/Generated/world/GlobalNodeRef.hpp>
#include <RED4ext/Scripting/Natives/Generated/world/GroupProxyMeshBuildParams.hpp>
#include <RED4ext/Scripting/Natives/Generated/world/HeatmapSetup.hpp>
#include <RED4ext/Scripting/Natives/Generated/world/IDestructibleSpotsSystem.hpp>
Expand Down
Loading