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:
Milxnor
2023-04-09 01:16:08 -04:00
parent 0d7b45cbbc
commit 80b4b20d73
18 changed files with 180 additions and 23 deletions

View File

@@ -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)
{

View File

@@ -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");

View File

@@ -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()
{

View File

@@ -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;

View File

@@ -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();

View 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;
}

View 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();
};

View File

@@ -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"));

View File

@@ -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" />

View File

@@ -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">

View File

@@ -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;
};

View 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
View 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;
};

View File

@@ -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)

View File

@@ -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;

View File

@@ -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.
{

View File

@@ -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");

View File

@@ -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>