mirror of
https://github.com/Milxnor/Project-Reboot-3.0.git
synced 2026-01-13 02:42:22 +01:00
tassetptr impl, harvesting stuff, relevancy?
This commit is contained in:
@@ -127,6 +127,20 @@ bool AActor::IsAlwaysRelevant()
|
|||||||
return ReadBitfieldValue(bAlwaysRelevantOffset, bAlwaysRelevantFieldMask);
|
return ReadBitfieldValue(bAlwaysRelevantOffset, bAlwaysRelevantFieldMask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool AActor::UsesOwnerRelevancy()
|
||||||
|
{
|
||||||
|
static auto bNetUseOwnerRelevancyOffset = GetOffset("bNetUseOwnerRelevancy");
|
||||||
|
static auto bNetUseOwnerRelevancyFieldMask = GetFieldMask(GetProperty("bNetUseOwnerRelevancy"));
|
||||||
|
return ReadBitfieldValue(bNetUseOwnerRelevancyOffset, bNetUseOwnerRelevancyFieldMask);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AActor::IsOnlyRelevantToOwner()
|
||||||
|
{
|
||||||
|
static auto bOnlyRelevantToOwnerOffset = GetOffset("bOnlyRelevantToOwner");
|
||||||
|
static auto bOnlyRelevantToOwnerFieldMask = GetFieldMask(GetProperty("bOnlyRelevantToOwner"));
|
||||||
|
return ReadBitfieldValue(bOnlyRelevantToOwnerOffset, bOnlyRelevantToOwnerFieldMask);
|
||||||
|
}
|
||||||
|
|
||||||
UClass* AActor::StaticClass()
|
UClass* AActor::StaticClass()
|
||||||
{
|
{
|
||||||
static auto Class = FindObject<UClass>(L"/Script/Engine.Actor");
|
static auto Class = FindObject<UClass>(L"/Script/Engine.Actor");
|
||||||
|
|||||||
@@ -19,6 +19,8 @@ public:
|
|||||||
bool IsActorBeingDestroyed();
|
bool IsActorBeingDestroyed();
|
||||||
bool IsNetStartup();
|
bool IsNetStartup();
|
||||||
bool IsAlwaysRelevant();
|
bool IsAlwaysRelevant();
|
||||||
|
bool UsesOwnerRelevancy();
|
||||||
|
bool IsOnlyRelevantToOwner();
|
||||||
void SetOwner(AActor* Owner);
|
void SetOwner(AActor* Owner);
|
||||||
|
|
||||||
static class UClass* StaticClass();
|
static class UClass* StaticClass();
|
||||||
|
|||||||
26
Project Reboot 3.0/AssetPtr.h
Normal file
26
Project Reboot 3.0/AssetPtr.h
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "PersistentObjectPtr.h"
|
||||||
|
#include "StringAssetReference.h"
|
||||||
|
|
||||||
|
#include "reboot.h"
|
||||||
|
|
||||||
|
class FAssetPtr : public TPersistentObjectPtr<FStringAssetReference>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
};
|
||||||
|
|
||||||
|
template<class T = UObject>
|
||||||
|
class TAssetPtr
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
FAssetPtr AssetPtr;
|
||||||
|
|
||||||
|
T* Get()
|
||||||
|
{
|
||||||
|
if (!AssetPtr.ObjectID.AssetLongPathname.IsValid())
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
return FindObject<T>(AssetPtr.ObjectID.AssetLongPathname.ToString());
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -39,7 +39,7 @@ void ABuildingActor::OnDamageServerHook(ABuildingActor* BuildingActor, float Dam
|
|||||||
if (BuildingResourceAmountOverride.RowName.IsValid())
|
if (BuildingResourceAmountOverride.RowName.IsValid())
|
||||||
{
|
{
|
||||||
// auto AssetManager = Cast<UFortAssetManager>(GEngine->AssetManager);
|
// auto AssetManager = Cast<UFortAssetManager>(GEngine->AssetManager);
|
||||||
// auto GameState = Cast<AFortGameStateAthena>(GetWorld()->GetGGetGameStateAthena);
|
// auto GameState = Cast<AFortGameStateAthena>(GetWorld()->GetGameStateAthena);
|
||||||
UCurveTable* CurveTable = nullptr; // GameState->CurrentPlaylistInfo.BasePlaylist ? GameState->CurrentPlaylistInfo.BasePlaylist->ResourceRates.Get() : nullptr;
|
UCurveTable* CurveTable = nullptr; // GameState->CurrentPlaylistInfo.BasePlaylist ? GameState->CurrentPlaylistInfo.BasePlaylist->ResourceRates.Get() : nullptr;
|
||||||
|
|
||||||
// LOG_INFO(LogDev, "Before1");
|
// LOG_INFO(LogDev, "Before1");
|
||||||
|
|||||||
@@ -14,6 +14,12 @@ public:
|
|||||||
|
|
||||||
return *(TMap<FName, RowDataType*>*)(__int64(this) + (RowStructOffset + sizeof(UObject*))); // because after rowstruct is rowmap
|
return *(TMap<FName, RowDataType*>*)(__int64(this) + (RowStructOffset + sizeof(UObject*))); // because after rowstruct is rowmap
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static UClass* StaticClass()
|
||||||
|
{
|
||||||
|
static auto Class = FindObject<UClass>("/Script/Engine.DataTable");
|
||||||
|
return Class;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct FDataTableRowHandle
|
struct FDataTableRowHandle
|
||||||
|
|||||||
@@ -643,6 +643,8 @@ void AFortGameModeAthena::Athena_HandleStartingNewPlayerHook(AFortGameModeAthena
|
|||||||
for (auto& LootDrop : LootDrops)
|
for (auto& LootDrop : LootDrops)
|
||||||
AFortPickup::SpawnPickup(LootDrop.ItemDefinition, Location, LootDrop.Count, SpawnFlag, EFortPickupSpawnSource::Unset, LootDrop.LoadedAmmo);
|
AFortPickup::SpawnPickup(LootDrop.ItemDefinition, Location, LootDrop.Count, SpawnFlag, EFortPickupSpawnSource::Unset, LootDrop.LoadedAmmo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CurrentActor->K2_DestroyActor();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool bPrint = false;
|
bool bPrint = false;
|
||||||
@@ -670,6 +672,8 @@ void AFortGameModeAthena::Athena_HandleStartingNewPlayerHook(AFortGameModeAthena
|
|||||||
for (auto& LootDrop : LootDrops)
|
for (auto& LootDrop : LootDrops)
|
||||||
AFortPickup::SpawnPickup(LootDrop.ItemDefinition, Location, LootDrop.Count, SpawnFlag, EFortPickupSpawnSource::Unset, LootDrop.LoadedAmmo);
|
AFortPickup::SpawnPickup(LootDrop.ItemDefinition, Location, LootDrop.Count, SpawnFlag, EFortPickupSpawnSource::Unset, LootDrop.LoadedAmmo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CurrentActor->K2_DestroyActor();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -717,9 +721,11 @@ void AFortGameModeAthena::Athena_HandleStartingNewPlayerHook(AFortGameModeAthena
|
|||||||
static auto PartsOffset = FindOffsetStruct("/Script/FortniteGame.CustomCharacterParts", "Parts", false);
|
static auto PartsOffset = FindOffsetStruct("/Script/FortniteGame.CustomCharacterParts", "Parts", false);
|
||||||
auto Parts = (UObject**)(__int64(CharacterParts) + PartsOffset); // UCustomCharacterPart* Parts[0x6]
|
auto Parts = (UObject**)(__int64(CharacterParts) + PartsOffset); // UCustomCharacterPart* Parts[0x6]
|
||||||
|
|
||||||
static auto headPart = LoadObject("/Game/Characters/CharacterParts/Female/Medium/Heads/F_Med_Head1.F_Med_Head1");
|
static auto CustomCharacterPartClass = FindObject<UClass>("/Script/FortniteGame.CustomCharacterPart");
|
||||||
static auto bodyPart = LoadObject("/Game/Characters/CharacterParts/Female/Medium/Bodies/F_Med_Soldier_01.F_Med_Soldier_01");
|
|
||||||
static auto backpackPart = LoadObject("/Game/Characters/CharacterParts/Backpacks/NoBackpack.NoBackpack");
|
static auto headPart = LoadObject("/Game/Characters/CharacterParts/Female/Medium/Heads/F_Med_Head1.F_Med_Head1", CustomCharacterPartClass);
|
||||||
|
static auto bodyPart = LoadObject("/Game/Characters/CharacterParts/Female/Medium/Bodies/F_Med_Soldier_01.F_Med_Soldier_01", CustomCharacterPartClass);
|
||||||
|
static auto backpackPart = LoadObject("/Game/Characters/CharacterParts/Backpacks/NoBackpack.NoBackpack", CustomCharacterPartClass);
|
||||||
|
|
||||||
Parts[(int)EFortCustomPartType::Head] = headPart;
|
Parts[(int)EFortCustomPartType::Head] = headPart;
|
||||||
Parts[(int)EFortCustomPartType::Body] = bodyPart;
|
Parts[(int)EFortCustomPartType::Body] = bodyPart;
|
||||||
@@ -762,9 +768,11 @@ void AFortGameModeAthena::Athena_HandleStartingNewPlayerHook(AFortGameModeAthena
|
|||||||
|
|
||||||
if (Globals::bAbilitiesEnabled)
|
if (Globals::bAbilitiesEnabled)
|
||||||
{
|
{
|
||||||
|
static auto FortAbilitySetClass = FindObject<UClass>("/Script/FortniteGame.FortAbilitySet");
|
||||||
|
|
||||||
static auto GameplayAbilitySet = Fortnite_Version >= 8.30 ? // LoadObject<UObject>(L"/Game/Abilities/Player/Generic/Traits/DefaultPlayer/GAS_AthenaPlayer.GAS_AthenaPlayer") ?
|
static auto GameplayAbilitySet = Fortnite_Version >= 8.30 ? // LoadObject<UObject>(L"/Game/Abilities/Player/Generic/Traits/DefaultPlayer/GAS_AthenaPlayer.GAS_AthenaPlayer") ?
|
||||||
LoadObject<UObject>(L"/Game/Abilities/Player/Generic/Traits/DefaultPlayer/GAS_AthenaPlayer.GAS_AthenaPlayer") :
|
LoadObject(L"/Game/Abilities/Player/Generic/Traits/DefaultPlayer/GAS_AthenaPlayer.GAS_AthenaPlayer", FortAbilitySetClass) :
|
||||||
LoadObject<UObject>(L"/Game/Abilities/Player/Generic/Traits/DefaultPlayer/GAS_DefaultPlayer.GAS_DefaultPlayer");
|
LoadObject(L"/Game/Abilities/Player/Generic/Traits/DefaultPlayer/GAS_DefaultPlayer.GAS_DefaultPlayer", FortAbilitySetClass);
|
||||||
|
|
||||||
LOG_INFO(LogDev, "GameplayAbilitySet {}", __int64(GameplayAbilitySet));
|
LOG_INFO(LogDev, "GameplayAbilitySet {}", __int64(GameplayAbilitySet));
|
||||||
|
|
||||||
@@ -984,6 +992,12 @@ void AFortGameModeAthena::Athena_HandleStartingNewPlayerHook(AFortGameModeAthena
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Engine_Version <= 420) // not sure if needed on s3-s4
|
||||||
|
{
|
||||||
|
static auto OverriddenBackpackSizeOffset = NewPlayer->GetOffset("OverriddenBackpackSize");
|
||||||
|
NewPlayer->Get<int>(OverriddenBackpackSizeOffset) = 5;
|
||||||
|
}
|
||||||
|
|
||||||
return Athena_HandleStartingNewPlayerOriginal(GameMode, NewPlayerActor);
|
return Athena_HandleStartingNewPlayerOriginal(GameMode, NewPlayerActor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,26 @@
|
|||||||
|
|
||||||
UFortResourceItemDefinition* UFortKismetLibrary::K2_GetResourceItemDefinition(EFortResourceType ResourceType)
|
UFortResourceItemDefinition* UFortKismetLibrary::K2_GetResourceItemDefinition(EFortResourceType ResourceType)
|
||||||
{
|
{
|
||||||
|
if (ResourceType == EFortResourceType::Wood)
|
||||||
|
{
|
||||||
|
static auto WoodItemData = FindObject<UFortResourceItemDefinition>("/Game/Items/ResourcePickups/WoodItemData.WoodItemData");
|
||||||
|
return WoodItemData;
|
||||||
|
}
|
||||||
|
else if (ResourceType == EFortResourceType::Stone)
|
||||||
|
{
|
||||||
|
static auto StoneItemData = FindObject<UFortResourceItemDefinition>("/Game/Items/ResourcePickups/StoneItemData.StoneItemData");
|
||||||
|
return StoneItemData;
|
||||||
|
}
|
||||||
|
else if (ResourceType == EFortResourceType::Metal)
|
||||||
|
{
|
||||||
|
static auto MetalItemData = FindObject<UFortResourceItemDefinition>("/Game/Items/ResourcePickups/MetalItemData.MetalItemData");
|
||||||
|
return MetalItemData;
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
// The function below doesn't exist on some very old builds.
|
||||||
|
|
||||||
static auto fn = FindObject<UFunction>(L"/Script/FortniteGame.FortKismetLibrary.K2_GetResourceItemDefinition");
|
static auto fn = FindObject<UFunction>(L"/Script/FortniteGame.FortKismetLibrary.K2_GetResourceItemDefinition");
|
||||||
|
|
||||||
struct { EFortResourceType type; UFortResourceItemDefinition* ret; } params{ResourceType};
|
struct { EFortResourceType type; UFortResourceItemDefinition* ret; } params{ResourceType};
|
||||||
|
|||||||
@@ -156,10 +156,10 @@ std::vector<LootDrop> PickLootDrops(FName TierGroupName, bool bPrint, int recurs
|
|||||||
if (recursive > 10)
|
if (recursive > 10)
|
||||||
return LootDrops;
|
return LootDrops;
|
||||||
|
|
||||||
static std::vector<UDataTable*> LTDTables;
|
/* static */ std::vector<UDataTable*> LTDTables;
|
||||||
static std::vector<UDataTable*> LPTables;
|
/* static */ std::vector<UDataTable*> LPTables;
|
||||||
|
|
||||||
static bool bHasFoundTables = false;
|
/* static */ bool bHasFoundTables = false;
|
||||||
|
|
||||||
if (!bHasFoundTables)
|
if (!bHasFoundTables)
|
||||||
{
|
{
|
||||||
@@ -168,7 +168,7 @@ std::vector<LootDrop> PickLootDrops(FName TierGroupName, bool bPrint, int recurs
|
|||||||
LTDTables.push_back(LoadObject<UDataTable>(L"/Game/Items/Datatables/AthenaLootTierData_Client.AthenaLootTierData_Client"));
|
LTDTables.push_back(LoadObject<UDataTable>(L"/Game/Items/Datatables/AthenaLootTierData_Client.AthenaLootTierData_Client"));
|
||||||
LPTables.push_back(LoadObject<UDataTable>(L"/Game/Items/Datatables/AthenaLootPackages_Client.AthenaLootPackages_Client"));
|
LPTables.push_back(LoadObject<UDataTable>(L"/Game/Items/Datatables/AthenaLootPackages_Client.AthenaLootPackages_Client"));
|
||||||
|
|
||||||
for (int i = 0; i < LTDTables.size(); i++)
|
/* for (int i = 0; i < LTDTables.size(); i++)
|
||||||
{
|
{
|
||||||
LOG_INFO(LogDev, "[{}] LTD {}", i, LTDTables.at(i)->GetFullName());
|
LOG_INFO(LogDev, "[{}] LTD {}", i, LTDTables.at(i)->GetFullName());
|
||||||
}
|
}
|
||||||
@@ -176,7 +176,7 @@ std::vector<LootDrop> PickLootDrops(FName TierGroupName, bool bPrint, int recurs
|
|||||||
for (int i = 0; i < LPTables.size(); i++)
|
for (int i = 0; i < LPTables.size(); i++)
|
||||||
{
|
{
|
||||||
LOG_INFO(LogDev, "[{}] LP {}", i, LPTables.at(i)->GetFullName());
|
LOG_INFO(LogDev, "[{}] LP {}", i, LPTables.at(i)->GetFullName());
|
||||||
}
|
} */
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<FFortLootTierData*> TierGroupLTDs;
|
std::vector<FFortLootTierData*> TierGroupLTDs;
|
||||||
@@ -193,14 +193,15 @@ std::vector<LootDrop> PickLootDrops(FName TierGroupName, bool bPrint, int recurs
|
|||||||
|
|
||||||
// auto TierGroupNameStr = TierGroupName.ToString();
|
// auto TierGroupNameStr = TierGroupName.ToString();
|
||||||
|
|
||||||
// LOG_INFO(LogLoot, "LTDRowMapNum: {}", LTDRowMapNum);
|
// if (bPrint)
|
||||||
|
// LOG_INFO(LogLoot, "LTDRowMapNum: {} LTD: {}", LTDRowMapNum, IsBadReadPtr(LTD, 8) ? "BadRead" : LTD->GetFullName());
|
||||||
|
|
||||||
for (int i = 0; i < LTDRowMapNum; i++)
|
for (int i = 0; i < LTDRowMapNum; i++)
|
||||||
{
|
{
|
||||||
auto& CurrentLTD = LTDRowMap.Pairs.Elements[i].ElementData.Value;
|
auto& CurrentLTD = LTDRowMap.Pairs.Elements[i].ElementData.Value;
|
||||||
auto TierData = (FFortLootTierData*)CurrentLTD.Value();
|
auto TierData = (FFortLootTierData*)CurrentLTD.Value();
|
||||||
|
|
||||||
if (IsBadReadPtr(TierData, 8))
|
if (IsBadReadPtr(TierData, 8)) // this shouldn't be needed
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (TierGroupName == TierData->GetTierGroup() && TierData->GetWeight() != 0)
|
if (TierGroupName == TierData->GetTierGroup() && TierData->GetWeight() != 0)
|
||||||
|
|||||||
@@ -61,6 +61,8 @@ AFortPickup* AFortPickup::SpawnPickup(UFortItemDefinition* ItemDef, FVector Loca
|
|||||||
|
|
||||||
char AFortPickup::CompletePickupAnimationHook(AFortPickup* Pickup)
|
char AFortPickup::CompletePickupAnimationHook(AFortPickup* Pickup)
|
||||||
{
|
{
|
||||||
|
// LOG_INFO(LogDev, "Woah!");
|
||||||
|
|
||||||
auto Pawn = Cast<AFortPlayerPawn>(Pickup->GetPickupLocationData()->GetPickupTarget());
|
auto Pawn = Cast<AFortPlayerPawn>(Pickup->GetPickupLocationData()->GetPickupTarget());
|
||||||
|
|
||||||
if (!Pawn)
|
if (!Pawn)
|
||||||
|
|||||||
@@ -768,7 +768,7 @@ void AFortPlayerController::ServerBeginEditingBuildingActorHook(AFortPlayerContr
|
|||||||
if (!BuildingActorToEdit || !BuildingActorToEdit->IsPlayerPlaced())
|
if (!BuildingActorToEdit || !BuildingActorToEdit->IsPlayerPlaced())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
auto Pawn = Cast<AFortPawn>(PlayerController->GetPawn(), false);
|
auto Pawn = PlayerController->GetMyFortPawn();
|
||||||
|
|
||||||
if (!Pawn)
|
if (!Pawn)
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -75,4 +75,10 @@ public:
|
|||||||
static void ServerAcknowledgePossessionHook(APlayerController* Controller, APawn* Pawn);
|
static void ServerAcknowledgePossessionHook(APlayerController* Controller, APawn* Pawn);
|
||||||
static void ServerPlaySquadQuickChatMessage(AFortPlayerControllerAthena* PlayerController, __int64 ChatEntry, __int64 SenderID);
|
static void ServerPlaySquadQuickChatMessage(AFortPlayerControllerAthena* PlayerController, __int64 ChatEntry, __int64 SenderID);
|
||||||
static void GetPlayerViewPointHook(AFortPlayerControllerAthena* PlayerController, FVector& Location, FRotator& Rotation);
|
static void GetPlayerViewPointHook(AFortPlayerControllerAthena* PlayerController, FVector& Location, FRotator& Rotation);
|
||||||
|
|
||||||
|
static UClass* StaticClass()
|
||||||
|
{
|
||||||
|
static auto Class = FindObject<UClass>("/Script/FortniteGame.FortPlayerControllerAthena");
|
||||||
|
return Class;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
@@ -3,6 +3,7 @@
|
|||||||
#include "reboot.h"
|
#include "reboot.h"
|
||||||
#include "Actor.h"
|
#include "Actor.h"
|
||||||
#include "NetConnection.h"
|
#include "NetConnection.h"
|
||||||
|
#include "FortPlayerControllerAthena.h"
|
||||||
#include "GameplayStatics.h"
|
#include "GameplayStatics.h"
|
||||||
|
|
||||||
void UNetDriver::TickFlushHook(UNetDriver* NetDriver)
|
void UNetDriver::TickFlushHook(UNetDriver* NetDriver)
|
||||||
@@ -178,6 +179,62 @@ static UActorChannel* FindChannel(AActor* Actor, UNetConnection* Connection)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct FNetViewer
|
||||||
|
{
|
||||||
|
UNetConnection* Connection; // 0x0000(0x0008) (ZeroConstructor, IsPlainOldData)
|
||||||
|
AActor* InViewer; // 0x0008(0x0008) (ZeroConstructor, IsPlainOldData)
|
||||||
|
AActor* ViewTarget; // 0x0010(0x0008) (ZeroConstructor, IsPlainOldData)
|
||||||
|
FVector ViewLocation; // 0x0018(0x000C) (IsPlainOldData)
|
||||||
|
FVector ViewDir;
|
||||||
|
};
|
||||||
|
|
||||||
|
static bool IsActorRelevantToConnection(AActor* Actor, std::vector<FNetViewer>& ConnectionViewers)
|
||||||
|
{
|
||||||
|
for (int32 viewerIdx = 0; viewerIdx < ConnectionViewers.size(); viewerIdx++)
|
||||||
|
{
|
||||||
|
if (!ConnectionViewers[viewerIdx].ViewTarget)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// static bool (*IsNetRelevantFor)(AActor*, AActor*, AActor*, FVector&) = decltype(IsNetRelevantFor)(__int64(GetModuleHandleW(0)) + 0x1ECC700);
|
||||||
|
|
||||||
|
static auto index = Offsets::IsNetRelevantFor;
|
||||||
|
|
||||||
|
// if (Actor->IsNetRelevantFor(ConnectionViewers[viewerIdx].InViewer, ConnectionViewers[viewerIdx].ViewTarget, ConnectionViewers[viewerIdx].ViewLocation))
|
||||||
|
// if (IsNetRelevantFor(Actor, ConnectionViewers[viewerIdx].InViewer, ConnectionViewers[viewerIdx].ViewTarget, ConnectionViewers[viewerIdx].ViewLocation))
|
||||||
|
if (reinterpret_cast<bool(*)(AActor*, AActor*, AActor*, FVector&)>(Actor->VFTable[index])(
|
||||||
|
Actor, ConnectionViewers[viewerIdx].InViewer, ConnectionViewers[viewerIdx].ViewTarget, ConnectionViewers[viewerIdx].ViewLocation))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static FNetViewer ConstructNetViewer(UNetConnection* NetConnection)
|
||||||
|
{
|
||||||
|
FNetViewer newViewer{};
|
||||||
|
newViewer.Connection = NetConnection;
|
||||||
|
newViewer.InViewer = NetConnection->GetPlayerController() ? NetConnection->GetPlayerController() : NetConnection->GetOwningActor();
|
||||||
|
newViewer.ViewTarget = NetConnection->GetViewTarget();
|
||||||
|
|
||||||
|
if (!NetConnection->GetOwningActor() || !(!NetConnection->GetPlayerController() || (NetConnection->GetPlayerController() == NetConnection->GetOwningActor())))
|
||||||
|
return newViewer;
|
||||||
|
|
||||||
|
APlayerController* ViewingController = NetConnection->GetPlayerController();
|
||||||
|
|
||||||
|
newViewer.ViewLocation = newViewer.ViewTarget->GetActorLocation();
|
||||||
|
|
||||||
|
if (ViewingController)
|
||||||
|
{
|
||||||
|
FRotator ViewRotation = ViewingController->GetControlRotation();
|
||||||
|
AFortPlayerControllerAthena::GetPlayerViewPointHook(Cast<AFortPlayerControllerAthena>(ViewingController, false), newViewer.ViewLocation, ViewRotation);
|
||||||
|
newViewer.ViewDir = ViewRotation.Vector();
|
||||||
|
}
|
||||||
|
|
||||||
|
return newViewer;
|
||||||
|
}
|
||||||
|
|
||||||
int32 UNetDriver::ServerReplicateActors()
|
int32 UNetDriver::ServerReplicateActors()
|
||||||
{
|
{
|
||||||
int32 Updated = 0;
|
int32 Updated = 0;
|
||||||
@@ -202,7 +259,7 @@ int32 UNetDriver::ServerReplicateActors()
|
|||||||
}
|
}
|
||||||
else */
|
else */
|
||||||
{
|
{
|
||||||
ServerTickTime = 1.f / ServerTickTime;
|
ServerTickTime = 1.f / ServerTickTime; // 0
|
||||||
// bCPUSaturated = DeltaSeconds > 1.2f * ServerTickTime;
|
// bCPUSaturated = DeltaSeconds > 1.2f * ServerTickTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -241,25 +298,27 @@ int32 UNetDriver::ServerReplicateActors()
|
|||||||
|
|
||||||
auto Channel = FindChannel(Actor, Connection);
|
auto Channel = FindChannel(Actor, Connection);
|
||||||
|
|
||||||
/* std::vector<FNetViewer> ConnectionViewers;
|
static void (*ActorChannelClose)(UActorChannel*) = decltype(ActorChannelClose)(Addresses::ActorChannelClose);
|
||||||
|
|
||||||
|
std::vector<FNetViewer> ConnectionViewers;
|
||||||
ConnectionViewers.push_back(ConstructNetViewer(Connection));
|
ConnectionViewers.push_back(ConstructNetViewer(Connection));
|
||||||
|
|
||||||
if (!Actor->bAlwaysRelevant && !Actor->bNetUseOwnerRelevancy && !Actor->bOnlyRelevantToOwner)
|
if (!Actor->IsAlwaysRelevant() && !Actor->UsesOwnerRelevancy() && !Actor->IsOnlyRelevantToOwner())
|
||||||
{
|
{
|
||||||
if (Connection && Connection->ViewTarget)
|
if (Connection && Connection->GetViewTarget())
|
||||||
{
|
{
|
||||||
auto Viewer = Connection->ViewTarget;
|
auto Viewer = Connection->GetViewTarget();
|
||||||
auto Loc = Viewer->K2_GetActorLocation();
|
auto Loc = Viewer->GetActorLocation();
|
||||||
|
|
||||||
if (!IsActorRelevantToConnection(Actor, ConnectionViewers))
|
if (!IsActorRelevantToConnection(Actor, ConnectionViewers))
|
||||||
{
|
{
|
||||||
if (Channel)
|
if (Channel)
|
||||||
CloseChannel(Channel);
|
ActorChannelClose(Channel);
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} */
|
}
|
||||||
|
|
||||||
static UChannel* (*CreateChannel)(UNetConnection*, int, bool, int32_t) = decltype(CreateChannel)(Addresses::CreateChannel);
|
static UChannel* (*CreateChannel)(UNetConnection*, int, bool, int32_t) = decltype(CreateChannel)(Addresses::CreateChannel);
|
||||||
static __int64 (*ReplicateActor)(UActorChannel*) = decltype(ReplicateActor)(Addresses::ReplicateActor);
|
static __int64 (*ReplicateActor)(UActorChannel*) = decltype(ReplicateActor)(Addresses::ReplicateActor);
|
||||||
|
|||||||
@@ -226,6 +226,7 @@
|
|||||||
<ClInclude Include="addresses.h" />
|
<ClInclude Include="addresses.h" />
|
||||||
<ClInclude Include="ai.h" />
|
<ClInclude Include="ai.h" />
|
||||||
<ClInclude Include="Array.h" />
|
<ClInclude Include="Array.h" />
|
||||||
|
<ClInclude Include="AssetPtr.h" />
|
||||||
<ClInclude Include="AthenaMarkerComponent.h" />
|
<ClInclude Include="AthenaMarkerComponent.h" />
|
||||||
<ClInclude Include="BitArray.h" />
|
<ClInclude Include="BitArray.h" />
|
||||||
<ClInclude Include="BuildingActor.h" />
|
<ClInclude Include="BuildingActor.h" />
|
||||||
@@ -313,6 +314,7 @@
|
|||||||
<ClInclude Include="SoftObjectPtr.h" />
|
<ClInclude Include="SoftObjectPtr.h" />
|
||||||
<ClInclude Include="SparseArray.h" />
|
<ClInclude Include="SparseArray.h" />
|
||||||
<ClInclude Include="Stack.h" />
|
<ClInclude Include="Stack.h" />
|
||||||
|
<ClInclude Include="StringAssetReference.h" />
|
||||||
<ClInclude Include="Transform.h" />
|
<ClInclude Include="Transform.h" />
|
||||||
<ClInclude Include="Tuple.h" />
|
<ClInclude Include="Tuple.h" />
|
||||||
<ClInclude Include="UnrealString.h" />
|
<ClInclude Include="UnrealString.h" />
|
||||||
|
|||||||
@@ -461,6 +461,12 @@
|
|||||||
<ClInclude Include="OnlineReplStructs.h">
|
<ClInclude Include="OnlineReplStructs.h">
|
||||||
<Filter>Engine\Source\Runtime\Engine\Classes\GameFramework</Filter>
|
<Filter>Engine\Source\Runtime\Engine\Classes\GameFramework</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="AssetPtr.h">
|
||||||
|
<Filter>Engine\Source\Runtime\CoreUObject\Public\UObject</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="StringAssetReference.h">
|
||||||
|
<Filter>Engine\Source\Runtime\CoreUObject\Public\Misc</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Filter Include="Engine">
|
<Filter Include="Engine">
|
||||||
@@ -643,6 +649,9 @@
|
|||||||
<Filter Include="FortniteGame\Source\FortniteGame\Private\Creative\Minigame">
|
<Filter Include="FortniteGame\Source\FortniteGame\Private\Creative\Minigame">
|
||||||
<UniqueIdentifier>{7905895d-5ebf-4313-a9de-06f507c35113}</UniqueIdentifier>
|
<UniqueIdentifier>{7905895d-5ebf-4313-a9de-06f507c35113}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
|
<Filter Include="Engine\Source\Runtime\CoreUObject\Public\Misc">
|
||||||
|
<UniqueIdentifier>{915f7622-6003-445e-a43f-04d5c7e13b49}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="UnrealEngine.cpp">
|
<None Include="UnrealEngine.cpp">
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "Quat.h"
|
#include "Quat.h"
|
||||||
|
#include "Vector.h"
|
||||||
|
|
||||||
struct FRotator
|
struct FRotator
|
||||||
{
|
{
|
||||||
@@ -9,4 +10,6 @@ struct FRotator
|
|||||||
float Roll;
|
float Roll;
|
||||||
|
|
||||||
FQuat Quaternion();
|
FQuat Quaternion();
|
||||||
|
|
||||||
|
FVector Vector() const;
|
||||||
};
|
};
|
||||||
@@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
#include "PersistentObjectPtr.h"
|
#include "PersistentObjectPtr.h"
|
||||||
#include "SoftObjectPath.h"
|
#include "SoftObjectPath.h"
|
||||||
|
#include "AssetPtr.h"
|
||||||
|
|
||||||
#include "reboot.h"
|
#include "reboot.h"
|
||||||
|
|
||||||
@@ -20,9 +21,17 @@ public:
|
|||||||
|
|
||||||
T* Get()
|
T* Get()
|
||||||
{
|
{
|
||||||
if (SoftObjectPtr.ObjectID.AssetPathName.ComparisonIndex.Value <= 0)
|
if (Engine_Version <= 416)
|
||||||
return nullptr;
|
{
|
||||||
|
auto& AssetPtr = *(TAssetPtr<T>*)this;
|
||||||
|
return AssetPtr.Get();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (SoftObjectPtr.ObjectID.AssetPathName.ComparisonIndex.Value <= 0)
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
return FindObject<T>(SoftObjectPtr.ObjectID.AssetPathName.ToString());
|
return FindObject<T>(SoftObjectPtr.ObjectID.AssetPathName.ToString());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
8
Project Reboot 3.0/StringAssetReference.h
Normal file
8
Project Reboot 3.0/StringAssetReference.h
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "UnrealString.h"
|
||||||
|
|
||||||
|
struct FStringAssetReference
|
||||||
|
{
|
||||||
|
FString AssetLongPathname;
|
||||||
|
};
|
||||||
@@ -101,4 +101,14 @@ struct FQuat FRotator::Quaternion()
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
return RotationQuat;
|
return RotationQuat;
|
||||||
|
}
|
||||||
|
|
||||||
|
FVector FRotator::Vector() const
|
||||||
|
{
|
||||||
|
float CP, SP, CY, SY;
|
||||||
|
SinCos(&SP, &CP, Pitch * (PI / 180.0f));
|
||||||
|
SinCos(&SY, &CY, Yaw * (PI / 180.0f));
|
||||||
|
FVector V = FVector(CP * CY, CP * SY, SP);
|
||||||
|
|
||||||
|
return V;
|
||||||
}
|
}
|
||||||
@@ -246,6 +246,9 @@ void Addresses::FindAll()
|
|||||||
LOG_INFO(LogDev, "Finding RemoveFromAlivePlayers");
|
LOG_INFO(LogDev, "Finding RemoveFromAlivePlayers");
|
||||||
Addresses::RemoveFromAlivePlayers = FindRemoveFromAlivePlayers();
|
Addresses::RemoveFromAlivePlayers = FindRemoveFromAlivePlayers();
|
||||||
|
|
||||||
|
LOG_INFO(LogDev, "Finding ActorChannelClose");
|
||||||
|
Addresses::ActorChannelClose = FindActorChannelClose();
|
||||||
|
|
||||||
LOG_INFO(LogDev, "Finished finding!");
|
LOG_INFO(LogDev, "Finished finding!");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -297,6 +300,7 @@ void Addresses::Print()
|
|||||||
LOG_INFO(LogDev, "OnRep_ZiplineState: 0x{:x}", OnRep_ZiplineState - Base);
|
LOG_INFO(LogDev, "OnRep_ZiplineState: 0x{:x}", OnRep_ZiplineState - Base);
|
||||||
LOG_INFO(LogDev, "GetMaxTickRate: 0x{:x}", GetMaxTickRate - Base);
|
LOG_INFO(LogDev, "GetMaxTickRate: 0x{:x}", GetMaxTickRate - Base);
|
||||||
LOG_INFO(LogDev, "RemoveFromAlivePlayers: 0x{:x}", RemoveFromAlivePlayers - Base);
|
LOG_INFO(LogDev, "RemoveFromAlivePlayers: 0x{:x}", RemoveFromAlivePlayers - Base);
|
||||||
|
LOG_INFO(LogDev, "ActorChannelClose: 0x{:x}", ActorChannelClose - Base);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Offsets::FindAll()
|
void Offsets::FindAll()
|
||||||
@@ -343,6 +347,8 @@ void Offsets::FindAll()
|
|||||||
Offsets::ReplicationFrame = 0xB2;
|
Offsets::ReplicationFrame = 0xB2;
|
||||||
else if (Fortnite_Version == 2.5)
|
else if (Fortnite_Version == 2.5)
|
||||||
Offsets::ReplicationFrame = 0xCA;
|
Offsets::ReplicationFrame = 0xCA;
|
||||||
|
|
||||||
|
Offsets::IsNetRelevantFor = FindIsNetRelevantForOffset();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Offsets::Print()
|
void Offsets::Print()
|
||||||
@@ -354,6 +360,7 @@ void Offsets::Print()
|
|||||||
LOG_INFO(LogDev, "Func: 0x{:x}", Func);
|
LOG_INFO(LogDev, "Func: 0x{:x}", Func);
|
||||||
LOG_INFO(LogDev, "ServerReplicateActors: 0x{:x}", ServerReplicateActors);
|
LOG_INFO(LogDev, "ServerReplicateActors: 0x{:x}", ServerReplicateActors);
|
||||||
LOG_INFO(LogDev, "ReplicationFrame: 0x{:x}", ReplicationFrame);
|
LOG_INFO(LogDev, "ReplicationFrame: 0x{:x}", ReplicationFrame);
|
||||||
|
LOG_INFO(LogDev, "IsNetRelevantFor: 0x{:x}", IsNetRelevantFor);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Addresses::Init()
|
void Addresses::Init()
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ namespace Addresses
|
|||||||
extern inline uint64 FrameStep = 0;
|
extern inline uint64 FrameStep = 0;
|
||||||
extern inline uint64 OnRep_ZiplineState = 0;
|
extern inline uint64 OnRep_ZiplineState = 0;
|
||||||
extern inline uint64 RemoveFromAlivePlayers = 0;
|
extern inline uint64 RemoveFromAlivePlayers = 0;
|
||||||
|
extern inline uint64 ActorChannelClose = 0;
|
||||||
|
|
||||||
void SetupVersion(); // Finds Engine Version
|
void SetupVersion(); // Finds Engine Version
|
||||||
void FindAll();
|
void FindAll();
|
||||||
@@ -70,7 +71,8 @@ namespace Offsets
|
|||||||
extern inline uint64 Offset_Internal = 0;
|
extern inline uint64 Offset_Internal = 0;
|
||||||
extern inline uint64 ServerReplicateActors = 0;
|
extern inline uint64 ServerReplicateActors = 0;
|
||||||
extern inline uint64 ReplicationFrame = 0;
|
extern inline uint64 ReplicationFrame = 0;
|
||||||
|
extern inline uint64 IsNetRelevantFor = 0;
|
||||||
|
|
||||||
void FindAll();
|
void FindAll();
|
||||||
void Print();
|
void Print();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -362,18 +362,23 @@ DWORD WINAPI Main(LPVOID)
|
|||||||
|
|
||||||
if (false)
|
if (false)
|
||||||
{
|
{
|
||||||
Hooking::MinHook::Hook(AthenaMarkerComponentDefault, FindObject<UFunction>(L"/Script/FortniteGame.AthenaMarkerComponent.ServerAddMapMarker"),
|
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.
|
||||||
UAthenaMarkerComponent::ServerAddMapMarkerHook, nullptr, false);
|
{
|
||||||
Hooking::MinHook::Hook(AthenaMarkerComponentDefault, FindObject<UFunction>(L"/Script/FortniteGame.AthenaMarkerComponent.ServerRemoveMapMarker"),
|
Hooking::MinHook::Hook(AthenaMarkerComponentDefault, FindObject<UFunction>(L"/Script/FortniteGame.AthenaMarkerComponent.ServerAddMapMarker"),
|
||||||
UAthenaMarkerComponent::ServerRemoveMapMarkerHook, nullptr, false);
|
UAthenaMarkerComponent::ServerAddMapMarkerHook, nullptr, false);
|
||||||
|
Hooking::MinHook::Hook(AthenaMarkerComponentDefault, FindObject<UFunction>(L"/Script/FortniteGame.AthenaMarkerComponent.ServerRemoveMapMarker"),
|
||||||
|
UAthenaMarkerComponent::ServerRemoveMapMarkerHook, nullptr, false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Hooking::MinHook::Hook((PVOID)Addresses::GetPlayerViewpoint, (PVOID)AFortPlayerControllerAthena::GetPlayerViewPointHook, (PVOID*)&AFortPlayerControllerAthena::GetPlayerViewPointOriginal);
|
Hooking::MinHook::Hook((PVOID)Addresses::GetPlayerViewpoint, (PVOID)AFortPlayerControllerAthena::GetPlayerViewPointHook, (PVOID*)&AFortPlayerControllerAthena::GetPlayerViewPointOriginal);
|
||||||
Hooking::MinHook::Hook((PVOID)Addresses::TickFlush, (PVOID)UNetDriver::TickFlushHook, (PVOID*)&UNetDriver::TickFlushOriginal);
|
Hooking::MinHook::Hook((PVOID)Addresses::TickFlush, (PVOID)UNetDriver::TickFlushHook, (PVOID*)&UNetDriver::TickFlushOriginal);
|
||||||
// Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x1A001D0), GetServerDeltaTimeFromObjectHook);
|
// Hooking::MinHook::Hook((PVOID)(__int64(GetModuleHandleW(0)) + 0x1A001D0), GetServerDeltaTimeFromObjectHook);
|
||||||
|
|
||||||
if (Engine_Version < 427)
|
// if (/* Engine_Version >= 420 && */ Engine_Version < 427)
|
||||||
|
{
|
||||||
Hooking::MinHook::Hook((PVOID)Addresses::OnDamageServer, (PVOID)ABuildingActor::OnDamageServerHook, (PVOID*)&ABuildingActor::OnDamageServerOriginal);
|
Hooking::MinHook::Hook((PVOID)Addresses::OnDamageServer, (PVOID)ABuildingActor::OnDamageServerHook, (PVOID*)&ABuildingActor::OnDamageServerOriginal);
|
||||||
|
}
|
||||||
|
|
||||||
Hooking::MinHook::Hook((PVOID)Addresses::GetMaxTickRate, GetMaxTickRateHook);
|
Hooking::MinHook::Hook((PVOID)Addresses::GetMaxTickRate, GetMaxTickRateHook);
|
||||||
// Hooking::MinHook::Hook((PVOID)Addresses::CollectGarbage, (PVOID)CollectGarbageHook, nullptr);
|
// Hooking::MinHook::Hook((PVOID)Addresses::CollectGarbage, (PVOID)CollectGarbageHook, nullptr);
|
||||||
@@ -390,8 +395,11 @@ DWORD WINAPI Main(LPVOID)
|
|||||||
|
|
||||||
AddVehicleHook();
|
AddVehicleHook();
|
||||||
|
|
||||||
LOG_INFO(LogDev, "Test: 0x{:x}", FindFunctionCall(L"ClientOnPawnDied") - __int64(GetModuleHandleW(0)));
|
if (Fortnite_Version > 1.8)
|
||||||
Hooking::MinHook::Hook((PVOID)FindFunctionCall(L"ClientOnPawnDied"), AFortPlayerController::ClientOnPawnDiedHook, (PVOID*)&AFortPlayerController::ClientOnPawnDiedOriginal);
|
{
|
||||||
|
LOG_INFO(LogDev, "Test: 0x{:x}", FindFunctionCall(L"ClientOnPawnDied") - __int64(GetModuleHandleW(0)));
|
||||||
|
Hooking::MinHook::Hook((PVOID)FindFunctionCall(L"ClientOnPawnDied"), AFortPlayerController::ClientOnPawnDiedHook, (PVOID*)&AFortPlayerController::ClientOnPawnDiedOriginal);
|
||||||
|
}
|
||||||
|
|
||||||
LOG_INFO(LogDev, "PredictionKeySize: 0x{:x} {}", PredictionKeySize, PredictionKeySize);
|
LOG_INFO(LogDev, "PredictionKeySize: 0x{:x} {}", PredictionKeySize, PredictionKeySize);
|
||||||
|
|
||||||
|
|||||||
@@ -308,9 +308,23 @@ static inline uint64 FindGetPlayerViewpoint()
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline uint64 FindIsNetRelevantForOffset()
|
||||||
|
{
|
||||||
|
if (Engine_Version == 416)
|
||||||
|
return 648 / 8;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint64 FindActorChannelClose()
|
||||||
|
{
|
||||||
|
auto StringRef = Memcury::Scanner::FindStringRef(L"UActorChannel::Close: ChIndex: %d, Actor: %s");
|
||||||
|
|
||||||
|
return FindBytes(StringRef, { 0x48, 0x89, 0x5C }, 1000, 0, true);
|
||||||
|
}
|
||||||
|
|
||||||
static inline uint64 FindSpawnActor()
|
static inline uint64 FindSpawnActor()
|
||||||
{
|
{
|
||||||
|
|
||||||
if (Engine_Version >= 427)
|
if (Engine_Version >= 427)
|
||||||
{
|
{
|
||||||
auto stat = Memcury::Scanner::FindStringRef(L"STAT_SpawnActorTime");
|
auto stat = Memcury::Scanner::FindStringRef(L"STAT_SpawnActorTime");
|
||||||
@@ -366,7 +380,11 @@ static inline uint64 FindInitListen()
|
|||||||
|
|
||||||
static inline uint64 FindOnDamageServer()
|
static inline uint64 FindOnDamageServer()
|
||||||
{
|
{
|
||||||
auto Addr = FindFunctionCall(L"OnDamageServer", { 0x40, 0x55 });
|
auto Addr = FindFunctionCall(L"OnDamageServer",
|
||||||
|
Engine_Version == 416 ? std::vector<uint8_t>{ 0x4C, 0x89, 0x4C} :
|
||||||
|
Engine_Version == 419 || Engine_Version >= 427 ? std::vector<uint8_t>{ 0x48, 0x8B, 0xC4 } : std::vector<uint8_t>{ 0x40, 0x55 }
|
||||||
|
);
|
||||||
|
|
||||||
return Addr;
|
return Addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -437,6 +455,9 @@ static inline uint64 FindSpecConstructor()
|
|||||||
|
|
||||||
static inline uint64 FindCompletePickupAnimation()
|
static inline uint64 FindCompletePickupAnimation()
|
||||||
{
|
{
|
||||||
|
if (Engine_Version == 416 || Engine_Version == 419)
|
||||||
|
return Memcury::Scanner::FindPattern("4C 8B DC 53 55 56 48 83 EC 60 48 8B F1 48 8B 89 ? ? ? ? 48 85 C9").Get();
|
||||||
|
|
||||||
if (Engine_Version == 420)
|
if (Engine_Version == 420)
|
||||||
return Memcury::Scanner::FindPattern("48 89 5C 24 ? 57 48 83 EC 20 48 8B D9 48 8B 89 ? ? ? ? 48 85 C9 74 20 48 8D 44 24").Get();
|
return Memcury::Scanner::FindPattern("48 89 5C 24 ? 57 48 83 EC 20 48 8B D9 48 8B 89 ? ? ? ? 48 85 C9 74 20 48 8D 44 24").Get();
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ static inline T* FindObject(const TCHAR* Name, UClass* Class = nullptr, UObject*
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename T = UObject>
|
template <typename T = UObject>
|
||||||
static inline T* LoadObject(const TCHAR* Name, UClass* Class = nullptr, UObject* Outer = nullptr)
|
static inline T* LoadObject(const TCHAR* Name, UClass* Class = T::StaticClass(), UObject* Outer = nullptr)
|
||||||
{
|
{
|
||||||
if (!StaticLoadObjectOriginal)
|
if (!StaticLoadObjectOriginal)
|
||||||
{
|
{
|
||||||
@@ -46,7 +46,8 @@ static inline T* LoadObject(const std::string& NameStr, UClass* Class = nullptr,
|
|||||||
template <typename T = UObject>
|
template <typename T = UObject>
|
||||||
static inline T* FindObject(const std::string& NameStr, UClass* Class = nullptr, UObject* Outer = nullptr)
|
static inline T* FindObject(const std::string& NameStr, UClass* Class = nullptr, UObject* Outer = nullptr)
|
||||||
{
|
{
|
||||||
auto NameCWSTR = std::wstring(NameStr.begin(), NameStr.end()).c_str();
|
std::string name = NameStr;
|
||||||
|
auto NameCWSTR = std::wstring(name.begin(), name.end()).c_str();
|
||||||
return StaticFindObject<T>(Class, Outer, NameCWSTR);
|
return StaticFindObject<T>(Class, Outer, NameCWSTR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user