mirror of
https://github.com/Milxnor/Project-Reboot-3.0.git
synced 2026-01-13 19:02:21 +01:00
a lot
fix looting s5, fix mcp skins on <S9, add team map markers to s8+, add nomcp to s5, add something that should fix some issues on a lot of versions
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
#include "AthenaMarkerComponent.h"
|
||||
#include "FortPlayerControllerAthena.h"
|
||||
#include "Text.h"
|
||||
#include "KismetTextLibrary.h"
|
||||
|
||||
void UAthenaMarkerComponent::ServerAddMapMarkerHook(UAthenaMarkerComponent* MarkerComponent, FFortClientMarkerRequest MarkerRequest)
|
||||
{
|
||||
@@ -23,6 +25,7 @@ void UAthenaMarkerComponent::ServerAddMapMarkerHook(UAthenaMarkerComponent* Mark
|
||||
auto MarkerData = Alloc<FFortWorldMarkerData>(FortWorldMarkerDataSize);
|
||||
|
||||
static auto IconOffset = FindOffsetStruct("/Script/FortniteGame.MarkedActorDisplayInfo", "Icon");
|
||||
static auto DisplayNameOffset = FindOffsetStruct("/Script/FortniteGame.MarkedActorDisplayInfo", "DisplayName");
|
||||
static auto WorldPositionOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "WorldPosition", false);
|
||||
static auto WorldPositionOffsetOffset = FindOffsetStruct("/Script/FortniteGame.FortWorldMarkerData", "WorldPositionOffset", false);
|
||||
|
||||
@@ -39,14 +42,15 @@ void UAthenaMarkerComponent::ServerAddMapMarkerHook(UAthenaMarkerComponent* Mark
|
||||
MarkerData->GetWorldPositionOffset() = MarkerRequestPtr->GetWorldPositionOffset();
|
||||
MarkerData->GetMarkerID() = MarkerID;
|
||||
MarkerData->GetMarkedActorClass().SoftObjectPtr.WeakPtr.ObjectIndex = -1;
|
||||
MarkerData->GetMarkedActorClass().SoftObjectPtr.TagAtLastTest = -1;
|
||||
MarkerData->GetMarkedActorClass().SoftObjectPtr.TagAtLastTest = 0;
|
||||
MarkerData->GetMarkedActorClass().SoftObjectPtr.WeakPtr.ObjectSerialNumber = 0;
|
||||
MarkerData->GetMarkedActor().SoftObjectPtr.WeakPtr.ObjectIndex = -1;
|
||||
MarkerData->GetMarkedActor().SoftObjectPtr.TagAtLastTest = -1;
|
||||
MarkerData->GetMarkedActor().SoftObjectPtr.TagAtLastTest = 0;
|
||||
MarkerData->GetMarkedActor().SoftObjectPtr.WeakPtr.ObjectSerialNumber = 0;
|
||||
((TSoftObjectPtr<UObject>*)(__int64(MarkerData->GetCustomDisplayInfo()) + IconOffset))->SoftObjectPtr.WeakPtr.ObjectIndex = -1;
|
||||
((TSoftObjectPtr<UObject>*)(__int64(MarkerData->GetCustomDisplayInfo()) + IconOffset))->SoftObjectPtr.TagAtLastTest = -1;
|
||||
((TSoftObjectPtr<UObject>*)(__int64(MarkerData->GetCustomDisplayInfo()) + IconOffset))->SoftObjectPtr.TagAtLastTest = 0;
|
||||
((TSoftObjectPtr<UObject>*)(__int64(MarkerData->GetCustomDisplayInfo()) + IconOffset))->SoftObjectPtr.WeakPtr.ObjectSerialNumber = 0;
|
||||
*(FText*)(__int64(MarkerData->GetCustomDisplayInfo()) + DisplayNameOffset) = UKismetTextLibrary::Conv_StringToText(L"");
|
||||
|
||||
/* if (MarkerRequest.MarkedActor)
|
||||
{
|
||||
|
||||
@@ -9,6 +9,8 @@ struct FMarkerID { int PlayerID; int InstanceID; };
|
||||
|
||||
struct FFortClientMarkerRequest
|
||||
{
|
||||
char pad[0x20]; // real
|
||||
|
||||
int& GetInstanceID()
|
||||
{
|
||||
static auto InstanceIDOffset = FindOffsetStruct("/Script/FortniteGame.FortClientMarkerRequest", "InstanceID");
|
||||
|
||||
@@ -42,12 +42,14 @@ enum class EDynamicFoundationType : uint8_t
|
||||
EDynamicFoundationType_MAX = 4
|
||||
};
|
||||
|
||||
std::string PlaylistName =
|
||||
std::string PlaylistName =
|
||||
"/Game/Athena/Playlists/Playlist_DefaultSolo.Playlist_DefaultSolo";
|
||||
// "/Game/Athena/Playlists/Playlist_DefaultDuo.Playlist_DefaultDuo";
|
||||
// "/Game/Athena/Playlists/Playground/Playlist_Playground.Playlist_Playground";
|
||||
// "/Game/Athena/Playlists/Carmine/Playlist_Carmine.Playlist_Carmine";
|
||||
// "/Game/Athena/Playlists/Fill/Playlist_Fill_Solo.Playlist_Fill_Solo";
|
||||
// "/Game/Athena/Playlists/Low/Playlist_Low_Solo.Playlist_Low_Solo";
|
||||
// "/Game/Athena/Playlists/Bling/Playlist_Bling_Solo.Playlist_Bling_Solo";
|
||||
|
||||
static UFortPlaylist* GetPlaylistToUse()
|
||||
{
|
||||
|
||||
@@ -415,6 +415,12 @@ std::vector<LootDrop> PickLootDrops(FName TierGroupName, bool bPrint, int recurs
|
||||
}
|
||||
}
|
||||
|
||||
if (LTDTables.size() <= 0 || LPTables.size() <= 0)
|
||||
{
|
||||
LOG_WARN(LogLoot, "Empty tables! ({} {})", LTDTables.size(), LPTables.size());
|
||||
return LootDrops;
|
||||
}
|
||||
|
||||
std::vector<FFortLootTierData*> TierGroupLTDs;
|
||||
|
||||
for (int p = 0; p < LTDTables.size(); p++)
|
||||
@@ -426,7 +432,7 @@ std::vector<LootDrop> PickLootDrops(FName TierGroupName, bool bPrint, int recurs
|
||||
|
||||
if (!LTD->IsValidLowLevel())
|
||||
{
|
||||
if (bPrint)
|
||||
// if (bPrint)
|
||||
LOG_INFO(LogLoot, "BadRead!");
|
||||
|
||||
continue;
|
||||
|
||||
@@ -100,7 +100,7 @@ void AFortPlayerControllerAthena::ServerAcknowledgePossessionHook(APlayerControl
|
||||
CopyStruct(PawnAsFort->GetPtr<__int64>(Pawn_CosmeticLoadoutOffset), CosmeticLoadout, FFortAthenaLoadout::GetStructSize());
|
||||
} */
|
||||
|
||||
ApplyCID(PawnAsFort, CosmeticLoadout->GetCharacter(), true);
|
||||
ApplyCID(PawnAsFort, CosmeticLoadout->GetCharacter(), false);
|
||||
|
||||
auto Backpack = CosmeticLoadout->GetBackpack();
|
||||
|
||||
|
||||
25
Project Reboot 3.0/KismetTextLibrary.cpp
Normal file
25
Project Reboot 3.0/KismetTextLibrary.cpp
Normal file
@@ -0,0 +1,25 @@
|
||||
#include "KismetTextLibrary.h"
|
||||
|
||||
#include "reboot.h"
|
||||
|
||||
FText UKismetTextLibrary::Conv_StringToText(const FString& inString)
|
||||
{
|
||||
static auto Conv_StringToTextFn = FindObject<UFunction>("/Script/Engine.KismetTextLibrary.Conv_StringToText");
|
||||
|
||||
struct
|
||||
{
|
||||
FString inString; // (Parm, ZeroConstructor, HasGetValueTypeHash, NativeAccessSpecifierPublic)
|
||||
FText ReturnValue; // (Parm, OutParm, ReturnParm, NativeAccessSpecifierPublic)
|
||||
}UKismetTextLibrary_Conv_StringToText_Params{inString};
|
||||
|
||||
static auto Default__KismetTextLibrary = FindObject<UKismetTextLibrary>("/Script/Engine.Default__KismetTextLibrary");
|
||||
Default__KismetTextLibrary->ProcessEvent(Conv_StringToTextFn, &UKismetTextLibrary_Conv_StringToText_Params);
|
||||
|
||||
return UKismetTextLibrary_Conv_StringToText_Params.ReturnValue;
|
||||
}
|
||||
|
||||
UClass* UKismetTextLibrary::StaticClass()
|
||||
{
|
||||
static auto Class = FindObject<UClass>("/Script/Engine.KismetTextLibrary");
|
||||
return Class;
|
||||
}
|
||||
13
Project Reboot 3.0/KismetTextLibrary.h
Normal file
13
Project Reboot 3.0/KismetTextLibrary.h
Normal file
@@ -0,0 +1,13 @@
|
||||
#pragma once
|
||||
|
||||
#include "Object.h"
|
||||
#include "UnrealString.h"
|
||||
#include "Text.h"
|
||||
|
||||
class UKismetTextLibrary : public UObject
|
||||
{
|
||||
public:
|
||||
static FText Conv_StringToText(const FString& inString);
|
||||
|
||||
static UClass* StaticClass();
|
||||
};
|
||||
@@ -165,6 +165,9 @@ void UObject::AddToRoot()
|
||||
|
||||
bool UObject::IsValidLowLevel()
|
||||
{
|
||||
if (std::floor(Fortnite_Version) == 5) // real 1:1
|
||||
return true;
|
||||
|
||||
if (this == nullptr)
|
||||
{
|
||||
// UE_LOG(LogUObjectBase, Warning, TEXT("NULL object"));
|
||||
|
||||
@@ -213,6 +213,7 @@
|
||||
<ClCompile Include="InventoryManagementLibrary.cpp" />
|
||||
<ClCompile Include="KismetMathLibrary.cpp" />
|
||||
<ClCompile Include="KismetStringLibrary.cpp" />
|
||||
<ClCompile Include="KismetTextLibrary.cpp" />
|
||||
<ClCompile Include="Level.cpp" />
|
||||
<ClCompile Include="LevelActor.cpp" />
|
||||
<ClCompile Include="NameTypes.cpp" />
|
||||
@@ -313,6 +314,7 @@
|
||||
<ClInclude Include="KismetMathLibrary.h" />
|
||||
<ClInclude Include="KismetStringLibrary.h" />
|
||||
<ClInclude Include="KismetSystemLibrary.h" />
|
||||
<ClInclude Include="KismetTextLibrary.h" />
|
||||
<ClInclude Include="Level.h" />
|
||||
<ClInclude Include="log.h" />
|
||||
<ClInclude Include="Map.h" />
|
||||
@@ -337,11 +339,13 @@
|
||||
<ClInclude Include="ScriptInterface.h" />
|
||||
<ClInclude Include="Set.h" />
|
||||
<ClInclude Include="SharedPointer.h" />
|
||||
<ClInclude Include="SharedPointerInternals.h" />
|
||||
<ClInclude Include="SoftObjectPath.h" />
|
||||
<ClInclude Include="SoftObjectPtr.h" />
|
||||
<ClInclude Include="SparseArray.h" />
|
||||
<ClInclude Include="Stack.h" />
|
||||
<ClInclude Include="StringAssetReference.h" />
|
||||
<ClInclude Include="Text.h" />
|
||||
<ClInclude Include="Transform.h" />
|
||||
<ClInclude Include="Tuple.h" />
|
||||
<ClInclude Include="UnrealMathUtility.h" />
|
||||
|
||||
@@ -185,6 +185,9 @@
|
||||
<ClCompile Include="FortGameplayAbilityAthena_PeriodicItemGrant.cpp">
|
||||
<Filter>FortniteGame\Source\FortniteGame\Private\Abilities</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="KismetTextLibrary.cpp">
|
||||
<Filter>Engine\Source\Runtime\Engine\Private</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="log.h" />
|
||||
@@ -557,6 +560,15 @@
|
||||
<ClInclude Include="DelegateBase.h">
|
||||
<Filter>Engine\Source\Runtime\Core\Public\Delegates</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Text.h">
|
||||
<Filter>Engine\Source\Runtime\Core\Public\Internationalization</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="SharedPointerInternals.h">
|
||||
<Filter>Engine\Source\Runtime\Core\Public\Templates</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="KismetTextLibrary.h">
|
||||
<Filter>Engine\Source\Runtime\Engine\Classes\Kismet</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Filter Include="Engine">
|
||||
@@ -754,6 +766,9 @@
|
||||
<Filter Include="Engine\Source\Runtime\Core\Public\Delegates">
|
||||
<UniqueIdentifier>{d01c7b5d-ef89-43ec-b94f-882c419aa74b}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Engine\Source\Runtime\Core\Public\Internationalization">
|
||||
<UniqueIdentifier>{b00f4455-11e7-4fd9-aa6d-2d814788b544}</UniqueIdentifier>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="UnrealEngine.cpp">
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "SharedPointerInternals.h"
|
||||
|
||||
template< class ObjectType>
|
||||
class TSharedPtr
|
||||
{
|
||||
@@ -33,4 +35,12 @@ public:
|
||||
{
|
||||
return Object;
|
||||
}
|
||||
};
|
||||
|
||||
template< class ObjectType, ESPMode Mode >
|
||||
class TSharedRef
|
||||
{
|
||||
public:
|
||||
ObjectType* Object;
|
||||
FSharedReferencer<Mode> SharedReferenceCount;
|
||||
};
|
||||
47
Project Reboot 3.0/SharedPointerInternals.h
Normal file
47
Project Reboot 3.0/SharedPointerInternals.h
Normal file
@@ -0,0 +1,47 @@
|
||||
#pragma once
|
||||
|
||||
#ifndef PLATFORM_CPU_ARM_FAMILY
|
||||
#if (defined(__arm__) || defined(_M_ARM) || defined(__aarch64__) || defined(_M_ARM64))
|
||||
#define PLATFORM_CPU_ARM_FAMILY 1
|
||||
#else
|
||||
#define PLATFORM_CPU_ARM_FAMILY 0
|
||||
#endif
|
||||
#endif
|
||||
#define PLATFORM_WEAKLY_CONSISTENT_MEMORY PLATFORM_CPU_ARM_FAMILY
|
||||
#define FORCE_THREADSAFE_SHAREDPTRS PLATFORM_WEAKLY_CONSISTENT_MEMORY
|
||||
|
||||
enum class ESPMode
|
||||
{
|
||||
/** Forced to be not thread-safe. */
|
||||
NotThreadSafe = 0,
|
||||
|
||||
/**
|
||||
* Fast, doesn't ever use atomic interlocks.
|
||||
* Some code requires that all shared pointers are thread-safe.
|
||||
* It's better to change it here, instead of replacing ESPMode::Fast to ESPMode::ThreadSafe throughout the code.
|
||||
*/
|
||||
Fast = FORCE_THREADSAFE_SHAREDPTRS ? 1 : 0,
|
||||
|
||||
/** Conditionally thread-safe, never spin locks, but slower */
|
||||
ThreadSafe = 1
|
||||
};
|
||||
|
||||
class FReferenceControllerBase
|
||||
{
|
||||
public:
|
||||
FORCEINLINE explicit FReferenceControllerBase()
|
||||
: SharedReferenceCount(1)
|
||||
, WeakReferenceCount(1)
|
||||
{
|
||||
}
|
||||
|
||||
int32 SharedReferenceCount;
|
||||
int32 WeakReferenceCount;
|
||||
};
|
||||
|
||||
template< ESPMode Mode >
|
||||
class FSharedReferencer
|
||||
{
|
||||
public:
|
||||
FReferenceControllerBase* ReferenceController;
|
||||
};
|
||||
16
Project Reboot 3.0/Text.h
Normal file
16
Project Reboot 3.0/Text.h
Normal file
@@ -0,0 +1,16 @@
|
||||
#pragma once
|
||||
|
||||
#include "SharedPointer.h"
|
||||
#include "inc.h"
|
||||
|
||||
struct ITextData
|
||||
{
|
||||
|
||||
};
|
||||
|
||||
class FText
|
||||
{
|
||||
public:
|
||||
TSharedRef<ITextData, ESPMode::ThreadSafe> TextData;
|
||||
uint32 Flags;
|
||||
};
|
||||
@@ -163,7 +163,7 @@ extern inline FFixedUObjectArray* UnchunkedObjects = 0;
|
||||
|
||||
FORCEINLINE UObject* GetObjectByIndex(int32 Index)
|
||||
{
|
||||
return ChunkedObjects ? ChunkedObjects->GetObjectByIndex(Index) : UnchunkedObjects->GetObjectByIndex(Index);
|
||||
return ChunkedObjects ? ChunkedObjects->GetObjectByIndex(Index) : UnchunkedObjects ? UnchunkedObjects->GetObjectByIndex(Index) : nullptr;
|
||||
}
|
||||
|
||||
FORCEINLINE FUObjectItem* GetItemByIndex(int32 Index)
|
||||
|
||||
@@ -32,7 +32,7 @@ public:
|
||||
|
||||
void Set(const wchar_t* NewStr) // by fischsalat
|
||||
{
|
||||
if (!NewStr || std::wcslen(NewStr) == 0) return;
|
||||
if (!NewStr/* || std::wcslen(NewStr) == 0 */) return;
|
||||
|
||||
Data.ArrayMax = Data.ArrayNum = *NewStr ? (int)std::wcslen(NewStr) + 1 : 0;
|
||||
|
||||
|
||||
@@ -59,6 +59,8 @@ static __int64 DispatchRequestHook(__int64 a1, __int64* a2, int a3)
|
||||
if (Engine_Version >= 423)
|
||||
return DispatchRequestOriginal(a1, a2, 3);
|
||||
|
||||
// LOG_INFO(LogDev, "Dispatch Request!");
|
||||
|
||||
static auto Offset = FindMcpIsDedicatedServerOffset();
|
||||
|
||||
*(int*)(__int64(a2) + Offset) = 3;
|
||||
@@ -523,7 +525,7 @@ DWORD WINAPI Main(LPVOID)
|
||||
AFortPlayerController::ServerAttemptAircraftJumpHook, nullptr, false);
|
||||
}
|
||||
|
||||
if (false)
|
||||
// if (false)
|
||||
{
|
||||
if (Fortnite_Version >= 8.3) // I can't remember, so ServerAddMapMarker existed on like 8.0 or 8.1 or 8.2 but it didn't have the same params.
|
||||
{
|
||||
|
||||
@@ -581,6 +581,9 @@ static inline uint64 FindNoMCP()
|
||||
if (std::floor(Fortnite_Version) == 4)
|
||||
return Memcury::Scanner::FindPattern("E8 ? ? ? ? 83 A7 ? ? ? ? ? 83 E0 01").RelativeOffset(1).Get();
|
||||
|
||||
if (std::floor(Fortnite_Version) == 5)
|
||||
return Memcury::Scanner::FindPattern("E8 ? ? ? ? 84 C0 75 CE").RelativeOffset(1).Get();
|
||||
|
||||
auto fn = FindObject<UFunction>("/Script/FortniteGame.FortKismetLibrary.IsRunningNoMCP");
|
||||
LOG_INFO(LogDev, "fn: {}", __int64(fn));
|
||||
|
||||
@@ -979,7 +982,7 @@ static inline uint64 FindGIsClient()
|
||||
{
|
||||
// if (Fortnite_Version == 2.5)
|
||||
// return __int64(GetModuleHandleW(0)) + 0x46AD734;
|
||||
if (Fortnite_Version == 1.72)
|
||||
/* if (Fortnite_Version == 1.72)
|
||||
return __int64(GetModuleHandleW(0)) + 0x6536B65;
|
||||
if (Fortnite_Version == 1.8)
|
||||
return __int64(GetModuleHandleW(0)) + 0x66637E5;
|
||||
@@ -998,15 +1001,15 @@ static inline uint64 FindGIsClient()
|
||||
if (Fortnite_Version == 14.60)
|
||||
return __int64(GetModuleHandleW(0)) + 0x939930D;
|
||||
if (Fortnite_Version == 17.30)
|
||||
return __int64(GetModuleHandleW(0)) + 0x973E49B;
|
||||
return __int64(GetModuleHandleW(0)) + 0x973E49B; */
|
||||
|
||||
return 0;
|
||||
// return 0;
|
||||
|
||||
auto Addr = Memcury::Scanner::FindStringRef(L"AllowCommandletRendering");
|
||||
|
||||
std::vector<std::vector<uint8_t>> BytesArray = { { 0xC6, 0x05 }, { 0x88, 0x1D } };
|
||||
std::vector<std::vector<uint8_t>> BytesArray = {{0xC6, 0x05}, {0x88, 0x1D}, { 0x44, 0x88 } };
|
||||
|
||||
int Skip = 2;
|
||||
int Skip = Engine_Version <= 420 ? 1 : 2;
|
||||
|
||||
uint64 Addy;
|
||||
|
||||
@@ -1019,6 +1022,8 @@ static inline uint64 FindGIsClient()
|
||||
|
||||
bool ShouldBreak = false;
|
||||
|
||||
LOG_INFO(LogDev, "[{}] Byte: 0x{:x}", i, (int)CurrentByte);
|
||||
|
||||
for (auto& Bytes : BytesArray)
|
||||
{
|
||||
if (CurrentByte == Bytes[0])
|
||||
@@ -1034,7 +1039,8 @@ static inline uint64 FindGIsClient()
|
||||
}
|
||||
if (Found)
|
||||
{
|
||||
LOG_INFO(LogDev, "[{}] Skip: 0x{:x}", Skip, Memcury::Scanner(Addr.Get() - i).RelativeOffset(2).Get() - __int64(GetModuleHandleW(0)));
|
||||
int Relative = Bytes[0] == 0x44 ? 3 : 2;
|
||||
LOG_INFO(LogDev, "[{}] No Rel 0x{:x} Rel: 0x{:x}", Skip, Memcury::Scanner(Addr.Get() - i).Get() - __int64(GetModuleHandleW(0)), Memcury::Scanner(Addr.Get() - i).RelativeOffset(Relative).Get() - __int64(GetModuleHandleW(0)));
|
||||
|
||||
if (Skip > 0)
|
||||
{
|
||||
@@ -1042,7 +1048,7 @@ static inline uint64 FindGIsClient()
|
||||
continue;
|
||||
}
|
||||
|
||||
Addy = Addr.Get() - i;
|
||||
Addy = Memcury::Scanner(Addr.Get() - i).RelativeOffset(Relative).Get();
|
||||
ShouldBreak = true;
|
||||
break;
|
||||
}
|
||||
@@ -1055,14 +1061,9 @@ static inline uint64 FindGIsClient()
|
||||
// std::cout << std::format("CurrentByte: 0x{:x}\n", (uint8_t)CurrentByte);
|
||||
}
|
||||
|
||||
/* int Skip = 2;
|
||||
auto Addy = FindBytes(Addr, { 0xC6, 0x05 }, 50, 0, true, Skip);
|
||||
Addy = Addy ? Addy : FindBytes(Addr, { 0x44, 0x88 }, 50, 0, true, Skip);
|
||||
Addy = Addy ? Addy : FindBytes(Addr, { 0x88, 0x1D }, 50, 0, true, Skip); */
|
||||
|
||||
LOG_INFO(LogDev, "Addy: 0x{:x}", Addy - __int64(GetModuleHandleW(0)));
|
||||
|
||||
return Memcury::Scanner(Addy).RelativeOffset(2).Get();
|
||||
return Addy; // 0; // Memcury::Scanner(Addy3).RelativeOffset(2).Get();
|
||||
|
||||
/*
|
||||
auto Addr = Memcury::Scanner::FindStringRef(L"AllowCommandletRendering");
|
||||
|
||||
@@ -35,7 +35,14 @@ static inline T* LoadObject(const TCHAR* Name, UClass* Class = T::StaticClass(),
|
||||
return FindObject<T>(Name, Class, Outer);
|
||||
}
|
||||
|
||||
return (T*)StaticLoadObjectOriginal(Class, Outer, Name, nullptr, 0, nullptr, false);
|
||||
auto Object = (T*)StaticLoadObjectOriginal(Class, Outer, Name, nullptr, 0, nullptr, false);
|
||||
|
||||
if (!Object)
|
||||
{
|
||||
LOG_WARN(LogDev, "Failed to load object!");
|
||||
}
|
||||
|
||||
return Object;
|
||||
}
|
||||
|
||||
template <typename T = UObject>
|
||||
|
||||
Reference in New Issue
Block a user