From 5f1c2616a880cbb2df721221e4314010cfc4f1b7 Mon Sep 17 00:00:00 2001 From: Matt-Hurd Date: Sun, 7 Apr 2019 03:47:20 -0500 Subject: [PATCH] Custom Object Construction --- Python/test.py | 23 +++++++++++++++-------- bl2-sdk/BL2-SDK.cpp | 12 +++++++++++- bl2-sdk/BL2-SDK.h | 4 +++- bl2-sdk/CPythonInterface.cpp | 1 + bl2-sdk/Core_classes.h | 9 ++++++++- bl2-sdk/Logging.cpp | 7 +++++++ bl2-sdk/Logging.h | 1 + bl2-sdk/TypeMap.h | 2 ++ bl2-sdk/gamedefines.h | 5 ++++- bl2-sdk/pydefs/Core_classes.cpp | 2 ++ 10 files changed, 54 insertions(+), 12 deletions(-) diff --git a/Python/test.py b/Python/test.py index c5ac4eaa..87fca3f3 100644 --- a/Python/test.py +++ b/Python/test.py @@ -1,12 +1,19 @@ import bl2sdk -def process_hook(caller, stack, result, function): - code = stack.Code - OfferingId = stack.popFString() - print("{} {}".format(OfferingId.Count, OfferingId.Max)) - stack.Code = code - return True +# def process_hook(caller, stack, result, function): +# code = stack.Code +# OfferingId = stack.popFString() +# print("{} {}".format(OfferingId.Count, OfferingId.Max)) +# stack.Code = code +# return True -bl2sdk.RemoveScriptHook("Function WillowGame.MarketplaceGFxMovie.CreateContentItem", "Cheeky") -bl2sdk.RegisterScriptHook("Function WillowGame.MarketplaceGFxMovie.CreateContentItem", "Cheeky", process_hook) \ No newline at end of file +# bl2sdk.RemoveScriptHook("Function WillowGame.MarketplaceGFxMovie.CreateContentItem", "Cheeky") +# bl2sdk.RegisterScriptHook("Function WillowGame.MarketplaceGFxMovie.CreateContentItem", "Cheeky", process_hook) + +for x in bl2sdk.UObject.FindObjectsContaining("Class "): + if not (x.bCooked): + print(x.GetFullName()) + +# x = bl2sdk.ConstructObject(bl2sdk.UObject.StaticClass()) +# print(x) \ No newline at end of file diff --git a/bl2-sdk/BL2-SDK.cpp b/bl2-sdk/BL2-SDK.cpp index f3feeafd..7cebacab 100644 --- a/bl2-sdk/BL2-SDK.cpp +++ b/bl2-sdk/BL2-SDK.cpp @@ -371,7 +371,7 @@ namespace BL2SDK void initialize(wchar_t * exeBaseFolder) { - //HookAntiDebug(); + HookAntiDebug(); GameHooks::Initialize(); hookGame(); //InitializePackageFix(); @@ -408,6 +408,16 @@ namespace BL2SDK SetIsLoadingUDKPackage(false); }; + UObject *ConstructObject(UClass* Class, UObject* InOuter, FName Name, unsigned int SetFlags, unsigned int InternalSetFlags, UObject* inTemplate, FOutputDevice *Error, void* InstanceGraph, int bAssumeTemplateIsArchetype) + { + if (!Error) { + Error = new FOutputDevice(); + Error->VfTable = (void *)calloc(2, sizeof(void *)); + ((void **)Error->VfTable)[1] = (void *)&Logging::LogW; + } + return BL2SDK::pStaticConstructObject(Class, InOuter, Name, SetFlags, InternalSetFlags, inTemplate, Error, InstanceGraph, bAssumeTemplateIsArchetype); + }; + UObject *GetEngine() { if (!engine) diff --git a/bl2-sdk/BL2-SDK.h b/bl2-sdk/BL2-SDK.h index 4deeceac..9b2b613e 100644 --- a/bl2-sdk/BL2-SDK.h +++ b/bl2-sdk/BL2-SDK.h @@ -24,7 +24,8 @@ namespace BL2SDK typedef int (tUnrealEH)(unsigned int, struct _EXCEPTION_POINTERS*); typedef void(__thiscall *tCallFunction) (UObject*, FFrame&, void* const, UFunction*); typedef void(__thiscall *tFrameStep) (FFrame*, UObject*, void* const); - typedef UObject* (*tStaticConstructObject) (UClass* inClass, UObject* outer, FName name, unsigned int flags, UObject* inTemplate, FOutputDevice* error, UObject* root, void* unk); + // http://api.unrealengine.com/INT/API/Runtime/CoreUObject/UObject/StaticConstructObject_Internal/index.html + typedef UObject* (*tStaticConstructObject) (UClass* Class, UObject* InOuter, FName name, unsigned int SetFlags, unsigned int InternalSetFlags, UObject* InTemplate, FOutputDevice* Error, void* InstanceGraph, int bAssumeTemplateIsArchetype); typedef UPackage* (*tLoadPackage) (UPackage* outer, const wchar_t* filename, DWORD flags); typedef FArchive& (__thiscall *tByteOrderSerialize) (FArchive* Ar, void* V, int Length); @@ -49,6 +50,7 @@ namespace BL2SDK void initialize(wchar_t * exeBaseFolder/*LauncherStruct* args*/); void cleanup(); void LoadPackage(const char* filename, DWORD flags = 0, bool force = false); + UObject *ConstructObject(UClass* Class, UObject* InOuter, FName Name, unsigned int SetFlags, unsigned int InternalSetFlags, UObject* inTemplate, FOutputDevice *Error, void* InstanceGraph, int bAssumeTemplateIsArchetype); UObject *GetEngine(); } diff --git a/bl2-sdk/CPythonInterface.cpp b/bl2-sdk/CPythonInterface.cpp index 6473d0c3..19cbc466 100644 --- a/bl2-sdk/CPythonInterface.cpp +++ b/bl2-sdk/CPythonInterface.cpp @@ -82,6 +82,7 @@ PYBIND11_EMBEDDED_MODULE(bl2sdk, m) Export_pystes_TArray(m); m.def("Log", [](std::string in) { Logging::Log(in.c_str(), in.length()); }); m.def("LoadPackage", &BL2SDK::LoadPackage); + m.def("ConstructObject", &BL2SDK::ConstructObject, "Construct Objects", py::arg("Class"), py::arg("InOuter") = BL2SDK::GetEngine()->Outer, py::arg("Name") = FName(), py::arg("SetFlags") = 0x201, py::arg("InternalSetFlags") = 0x00, py::arg("Template") = (UObject*)nullptr, py::arg("Error") = (FOutputDevice *)nullptr, py::arg("InstanceGraph") = (void*)nullptr, py::arg("bAssumeTemplateIsArchetype") = (int)0, py::return_value_policy::reference); m.def("RegisterEngineHook", &RegisterEngineHook); m.def("GetEngine", &BL2SDK::GetEngine, py::return_value_policy::reference); m.def("RegisterScriptHook", &RegisterScriptHook); diff --git a/bl2-sdk/Core_classes.h b/bl2-sdk/Core_classes.h index d5a15c9b..998f1bb9 100644 --- a/bl2-sdk/Core_classes.h +++ b/bl2-sdk/Core_classes.h @@ -1981,7 +1981,14 @@ class UPackage : public UObject class UClass : public UState { public: - unsigned char UnknownData00[0x100]; // 0x00D0 (0x0100) MISSED OFFSET + unsigned long bCooked : 1; + FPointer ClassAddReferencedObjects; + unsigned long ClassCastFlags; + FName ClassConfigName; + FPointer ClassConstructor; + UObject *ClassDefaultObject; + unsigned int ClassFlags; + unsigned char UnknownData00[0xD8]; // 0x00D0 (0x0100) MISSED OFFSET private: static UClass* pClassPointer; diff --git a/bl2-sdk/Logging.cpp b/bl2-sdk/Logging.cpp index a484c6c1..bd5ee53f 100644 --- a/bl2-sdk/Logging.cpp +++ b/bl2-sdk/Logging.cpp @@ -60,6 +60,13 @@ namespace Logging } } + void LogW(wchar_t *formatted, signed int length) + { + char *output = (char *)calloc(length + 1, sizeof(char)); + wcstombs(output, formatted, length); + Log(output, 0); + } + void LogPy(const char* formatted) { Log(formatted, 0); diff --git a/bl2-sdk/Logging.h b/bl2-sdk/Logging.h index 7df77638..3562320e 100644 --- a/bl2-sdk/Logging.h +++ b/bl2-sdk/Logging.h @@ -7,6 +7,7 @@ namespace Logging { void Log(const char* formatted, int length = 0); + void LogW(wchar_t *, int); void LogPy(const char* formatted); void LogF(const char *szFmt, ...); void InitializeExtern(); diff --git a/bl2-sdk/TypeMap.h b/bl2-sdk/TypeMap.h index 224078e4..a2875748 100644 --- a/bl2-sdk/TypeMap.h +++ b/bl2-sdk/TypeMap.h @@ -873,7 +873,9 @@ static std::map uobject_type_map{ {"ChunkedList_Mirror", &typeid(FChunkedList_Mirror)}, {"ClanMaterialData", &typeid(FClanMaterialData)}, {"ClanSwitchData", &typeid(FClanSwitchData)}, +#endif {"Class", &typeid(UClass)}, +#ifndef _DEBUG {"ClassDropWeightValueResolver", &typeid(UClassDropWeightValueResolver)}, {"ClassModBalanceDefinition", &typeid(UClassModBalanceDefinition)}, {"ClassModDefinition", &typeid(UClassModDefinition)}, diff --git a/bl2-sdk/gamedefines.h b/bl2-sdk/gamedefines.h index dde7b5fe..62bba21b 100644 --- a/bl2-sdk/gamedefines.h +++ b/bl2-sdk/gamedefines.h @@ -69,7 +69,10 @@ struct FName int Number; public: - FName() {}; + FName() { + Index = 0; + Number = 0; + }; public: FName(const std::string& FindName) diff --git a/bl2-sdk/pydefs/Core_classes.cpp b/bl2-sdk/pydefs/Core_classes.cpp index cd8bd64e..03d4998a 100644 --- a/bl2-sdk/pydefs/Core_classes.cpp +++ b/bl2-sdk/pydefs/Core_classes.cpp @@ -562,7 +562,9 @@ void Export_pystes_Core_classes(py::module &m) .def_static("StaticClass", &UPackage::StaticClass, py::return_value_policy::reference) ; py::class_< UClass, UState >(m, "UClass") + .def_property("bCooked", [](UClass &self) {return self.bCooked; }, [](UClass &self, bool value) {self.bCooked = value ? 1 : 0; }) .def_static("StaticClass", &UClass::StaticClass, py::return_value_policy::reference) + .def_readwrite("ClassFlags", &UClass::ClassFlags) ; } \ No newline at end of file