diff --git a/Project Reboot 3.0/Actor.cpp b/Project Reboot 3.0/Actor.cpp index 5af071f..f415ef8 100644 --- a/Project Reboot 3.0/Actor.cpp +++ b/Project Reboot 3.0/Actor.cpp @@ -234,14 +234,14 @@ bool AActor::IsOnlyRelevantToOwner() bool AActor::CanBeDamaged() { static auto bCanBeDamagedOffset = GetOffset("bCanBeDamaged"); - static auto bCanBeDamagedFieldMask = GetFieldMask(GetProperty("bOnlyRelevantToOwner")); + static auto bCanBeDamagedFieldMask = GetFieldMask(GetProperty("bCanBeDamaged")); return ReadBitfieldValue(bCanBeDamagedOffset, bCanBeDamagedFieldMask); } void AActor::SetCanBeDamaged(bool NewValue) { static auto bCanBeDamagedOffset = GetOffset("bCanBeDamaged"); - static auto bCanBeDamagedFieldMask = GetFieldMask(GetProperty("bOnlyRelevantToOwner")); + static auto bCanBeDamagedFieldMask = GetFieldMask(GetProperty("bCanBeDamaged")); SetBitfieldValue(bCanBeDamagedOffset, bCanBeDamagedFieldMask, NewValue); } diff --git a/Project Reboot 3.0/AssertionMacros.h b/Project Reboot 3.0/AssertionMacros.h index 4e6bc6c..8cc728c 100644 --- a/Project Reboot 3.0/AssertionMacros.h +++ b/Project Reboot 3.0/AssertionMacros.h @@ -53,9 +53,9 @@ namespace FDebug TCHAR ErrorString[MAX_SPRINTF]; FCString::Sprintf(ErrorString, TEXT("%s"), ANSI_TO_TCHAR(Expr)); GError->Logf(TEXT("Assertion failed: %s") FILE_LINE_DESC TEXT("\n%s\n"), ErrorString, ANSI_TO_TCHAR(File), Line, DescriptionString); - */ + } } +*/ -#define check(expr) { if(UNLIKELY(!(expr))) { FDebug::LogAssertFailedMessage( #expr, __FILE__, __LINE__, TEXT("") ); _DebugBreakAndPromptForRemote(); FDebug::AssertFailed( #expr, __FILE__, __LINE__ ); CA_ASSUME(false); } } -*/ \ No newline at end of file +// #define check(expr) { if(UNLIKELY(!(expr))) { FDebug::LogAssertFailedMessage( #expr, __FILE__, __LINE__, TEXT("") ); _DebugBreakAndPromptForRemote(); FDebug::AssertFailed( #expr, __FILE__, __LINE__ ); CA_ASSUME(false); } } diff --git a/Project Reboot 3.0/FortGameModeAthena.cpp b/Project Reboot 3.0/FortGameModeAthena.cpp index be40847..56467be 100644 --- a/Project Reboot 3.0/FortGameModeAthena.cpp +++ b/Project Reboot 3.0/FortGameModeAthena.cpp @@ -910,7 +910,7 @@ void AFortGameModeAthena::Athena_HandleStartingNewPlayerHook(AFortGameModeAthena if (!PlayerStateAthena) return Athena_HandleStartingNewPlayerOriginal(GameMode, NewPlayerActor); - if (Globals::bNoMCP) + if (Globals::bNoMCP || Engine_Version == 416) { static auto CharacterPartsOffset = PlayerStateAthena->GetOffset("CharacterParts", false); static auto CustomCharacterPartsStruct = FindObject("/Script/FortniteGame.CustomCharacterParts"); @@ -931,9 +931,6 @@ void AFortGameModeAthena::Athena_HandleStartingNewPlayerHook(AFortGameModeAthena Parts[(int)EFortCustomPartType::Head] = headPart; Parts[(int)EFortCustomPartType::Body] = bodyPart; - // if (Fortnite_Version > 2.5) - Parts[(int)EFortCustomPartType::Backpack] = backpackPart; - static auto OnRep_CharacterPartsFn = FindObject("/Script/FortniteGame.FortPlayerState.OnRep_CharacterParts"); PlayerStateAthena->ProcessEvent(OnRep_CharacterPartsFn); } diff --git a/Project Reboot 3.0/FortPlayerController.cpp b/Project Reboot 3.0/FortPlayerController.cpp index 1e7de0d..4e2e1b9 100644 --- a/Project Reboot 3.0/FortPlayerController.cpp +++ b/Project Reboot 3.0/FortPlayerController.cpp @@ -897,7 +897,9 @@ void AFortPlayerController::ServerAttemptInventoryDropHook(AFortPlayerController if (!ItemDefinition || !ItemDefinition->CanBeDropped()) return; - if (!ItemDefinition->ShouldIgnoreRespawningOnDrop() && ItemDefinition->GetDropBehavior() != EWorldItemDropBehavior::DestroyOnDrop) + static auto DropBehaviorOffset = ItemDefinition->GetOffset("DropBehavior", false); + + if (!ItemDefinition->ShouldIgnoreRespawningOnDrop() && (DropBehaviorOffset != -1 ? ItemDefinition->GetDropBehavior() != EWorldItemDropBehavior::DestroyOnDrop : true)) { auto Pickup = AFortPickup::SpawnPickup(ReplicatedEntry, Pawn->GetActorLocation(), EFortPickupSourceTypeFlag::Player, EFortPickupSpawnSource::Unset, Pawn); @@ -923,6 +925,11 @@ void AFortPlayerController::ServerPlayEmoteItemHook(AFortPlayerController* Playe if (!EmoteAsset || !PlayerState || !Pawn) return; + auto AbilitySystemComponent = PlayerState->GetAbilitySystemComponent(); + + if (!AbilitySystemComponent) + return; + UObject* AbilityToUse = nullptr; static auto AthenaSprayItemDefinitionClass = FindObject("/Script/FortniteGame.AthenaSprayItemDefinition"); @@ -995,10 +1002,15 @@ void AFortPlayerController::ServerPlayEmoteItemHook(AFortPlayerController* Playe FGameplayAbilitySpec* Spec = MakeNewSpec((UClass*)AbilityToUse, EmoteAsset, true); + if (!Spec) + return; + static unsigned int* (*GiveAbilityAndActivateOnce)(UAbilitySystemComponent* ASC, int* outHandle, __int64 Spec, FGameplayEventData* TriggerEventData) = decltype(GiveAbilityAndActivateOnce)(Addresses::GiveAbilityAndActivateOnce); // EventData is only on ue500? if (GiveAbilityAndActivateOnce) - GiveAbilityAndActivateOnce(PlayerState->GetAbilitySystemComponent(), &outHandle, __int64(Spec), nullptr); + { + GiveAbilityAndActivateOnce(AbilitySystemComponent, &outHandle, __int64(Spec), nullptr); + } } uint8 ToDeathCause(const FGameplayTagContainer& TagContainer, bool bWasDBNO = false, AFortPawn* Pawn = nullptr) diff --git a/Project Reboot 3.0/FortPlayerControllerAthena.h b/Project Reboot 3.0/FortPlayerControllerAthena.h index 1d1282a..afd593d 100644 --- a/Project Reboot 3.0/FortPlayerControllerAthena.h +++ b/Project Reboot 3.0/FortPlayerControllerAthena.h @@ -8,13 +8,40 @@ #include "AthenaMarkerComponent.h" #include "FortVolume.h" -static void ApplyCID(AFortPlayerPawn* Pawn, UObject* CID, bool bUseServerChoosePart = false) +static bool ApplyCID(AFortPlayerPawn* Pawn, UObject* CID, bool bUseServerChoosePart = false) { if (!CID) - return; + return false; - if (!Pawn && bUseServerChoosePart) - return; + auto PlayerController = Cast(Pawn->GetController()); + + if (!PlayerController) + return false; + + /* auto PCCosmeticLoadout = PlayerController->GetCosmeticLoadout(); + + if (!PCCosmeticLoadout) + { + LOG_INFO(LogCosmetics, "PCCosmeticLoadout is not set! Will not be able to apply skin."); + return false; + } + + auto PawnCosmeticLoadout = PlayerController->GetCosmeticLoadout(); + + if (!PawnCosmeticLoadout) + { + LOG_INFO(LogCosmetics, "PawnCosmeticLoadout is not set! Will not be able to apply skin."); + return false; + } + + PCCosmeticLoadout->GetCharacter() = CID; + PawnCosmeticLoadout->GetCharacter() = CID; + PlayerController->ApplyCosmeticLoadout(); // would cause recursive + + return true; */ + + if (Engine_Version == 416) + return false; static auto HeroDefinitionOffset = CID->GetOffset("HeroDefinition"); auto HeroDefinition = CID->Get(HeroDefinitionOffset); diff --git a/Project Reboot 3.0/FortPlayerPawn.cpp b/Project Reboot 3.0/FortPlayerPawn.cpp index d9cdc65..78e3d85 100644 --- a/Project Reboot 3.0/FortPlayerPawn.cpp +++ b/Project Reboot 3.0/FortPlayerPawn.cpp @@ -3,6 +3,16 @@ #include "FortPlayerController.h" #include "FortGadgetItemDefinition.h" +FFortAthenaLoadout* AFortPlayerPawn::GetCosmeticLoadout() +{ + static auto CosmeticLoadoutOffset = GetOffset("CosmeticLoadout"); + + if (CosmeticLoadoutOffset == -1) + return nullptr; + + return GetPtr(CosmeticLoadoutOffset); +} + void AFortPlayerPawn::ServerChoosePart(EFortCustomPartType Part, UObject* ChosenCharacterPart) { static auto fn = FindObject("/Script/FortniteGame.FortPlayerPawn.ServerChoosePart"); diff --git a/Project Reboot 3.0/FortPlayerPawn.h b/Project Reboot 3.0/FortPlayerPawn.h index 8b5dc43..567be0b 100644 --- a/Project Reboot 3.0/FortPlayerPawn.h +++ b/Project Reboot 3.0/FortPlayerPawn.h @@ -34,6 +34,7 @@ public: static inline AActor* (*ServerOnExitVehicleOriginal)(AFortPlayerPawn* Pawn, ETryExitVehicleBehavior ExitForceBehavior); // actually returns AFortAthenaVehicle static inline void (*StartGhostModeExitOriginal)(UObject* Context, FFrame* Stack, void* Ret); + struct FFortAthenaLoadout* GetCosmeticLoadout(); void ServerChoosePart(EFortCustomPartType Part, class UObject* ChosenCharacterPart); void ForceLaunchPlayerZipline(); // Thanks android AActor* ServerOnExitVehicle(ETryExitVehicleBehavior ExitForceBehavior); // actually returns AFortAthenaVehicle diff --git a/Project Reboot 3.0/NetConnection.cpp b/Project Reboot 3.0/NetConnection.cpp new file mode 100644 index 0000000..a633b5d --- /dev/null +++ b/Project Reboot 3.0/NetConnection.cpp @@ -0,0 +1,15 @@ +#include "NetConnection.h" + +bool UNetConnection::ClientHasInitializedLevelFor(const AActor* TestActor) const { + // return true; + static auto ClientHasInitializedLevelForAddr = Memcury::Scanner::FindPattern("48 89 5C 24 ? 48 89 74 24 ? 57 48 83 EC 20 48 8B 5A 20 48 8B F1 4C 8B C3").Get(); + + if (!ClientHasInitializedLevelForAddr) + return true; + + static bool (*ClientHasInitializedLevelForOriginal)(const UNetConnection * Connection, const AActor * TestActor) + = decltype(ClientHasInitializedLevelForOriginal)(ClientHasInitializedLevelForAddr); + // ^ This is virtual but it doesn't really matter + + return ClientHasInitializedLevelForOriginal(this, TestActor); +} \ No newline at end of file diff --git a/Project Reboot 3.0/NetConnection.h b/Project Reboot 3.0/NetConnection.h index 09c2719..774b7ec 100644 --- a/Project Reboot 3.0/NetConnection.h +++ b/Project Reboot 3.0/NetConnection.h @@ -5,6 +5,7 @@ #include "Map.h" #include "WeakObjectPtrTemplates.h" #include "ActorChannel.h" +#include class UNetConnection : public UPlayer { @@ -17,7 +18,7 @@ public: FName& GetClientWorldPackageName() const { - static auto ClientWorldPackageNameOffset = 0x337B8; + static auto ClientWorldPackageNameOffset = Offsets::ClientWorldPackageName; return *(FName*)(__int64(this) + ClientWorldPackageNameOffset); } @@ -40,11 +41,11 @@ public: return Get(LastReceiveTimeOffset); } - TSet& GetClientVisibleLevelNames() + /* TSet& GetClientVisibleLevelNames() { static auto ClientVisibleLevelNamesOffset = 0x336C8; return *(TSet*)(__int64(this) + ClientVisibleLevelNamesOffset); - } + } */ class UNetDriver*& GetDriver() { @@ -70,9 +71,5 @@ public: return Get>(SentTemporariesOffset); } - bool ClientHasInitializedLevelFor(const AActor* TestActor) const - { - bool (*ClientHasInitializedLevelForOriginal)(const UNetConnection* Connection, const AActor* TestActor) = decltype(ClientHasInitializedLevelForOriginal)(this->VFTable[0x300 / 8]); - return ClientHasInitializedLevelForOriginal(this, TestActor); - } + bool ClientHasInitializedLevelFor(const AActor* TestActor) const; }; \ No newline at end of file diff --git a/Project Reboot 3.0/NetDriver.cpp b/Project Reboot 3.0/NetDriver.cpp index 292838d..f7798a2 100644 --- a/Project Reboot 3.0/NetDriver.cpp +++ b/Project Reboot 3.0/NetDriver.cpp @@ -7,6 +7,7 @@ #include "GameplayStatics.h" #include "KismetMathLibrary.h" #include +#include "AssertionMacros.h" FNetworkObjectList& UNetDriver::GetNetworkObjectList() { @@ -322,11 +323,11 @@ static FNetViewer ConstructNetViewer(UNetConnection* NetConnection) static auto ControlRotationOffset = ViewingController->GetOffset("ControlRotation"); FRotator ViewRotation = ViewingController->Get(ControlRotationOffset); // hmmmm // ViewingController->GetControlRotation(); // AFortPlayerControllerAthena::GetPlayerViewPointHook(Cast(ViewingController, false), newViewer.ViewLocation, ViewRotation); - // ViewingController->GetActorEyesViewPoint(&newViewer.ViewLocation, &ViewRotation); // HMMM + ViewingController->GetActorEyesViewPoint(&newViewer.ViewLocation, &ViewRotation); // HMMM - static auto GetActorEyesViewPointOffset = 0x5B0; - void (*GetActorEyesViewPointOriginal)(AController*, FVector * a2, FRotator * a3) = decltype(GetActorEyesViewPointOriginal)(ViewingController->VFTable[GetActorEyesViewPointOffset / 8]); - GetActorEyesViewPointOriginal(ViewingController, &newViewer.ViewLocation, &ViewRotation); + // static auto GetActorEyesViewPointOffset = 0x5B0; + // void (*GetActorEyesViewPointOriginal)(AController*, FVector * a2, FRotator * a3) = decltype(GetActorEyesViewPointOriginal)(ViewingController->VFTable[GetActorEyesViewPointOffset / 8]); + // GetActorEyesViewPointOriginal(ViewingController, &newViewer.ViewLocation, &ViewRotation); // AFortPlayerControllerAthena::GetPlayerViewPointHook((AFortPlayerControllerAthena*)ViewingController, newViewer.ViewLocation, ViewRotation); newViewer.ViewDir = ViewRotation.Vector(); } @@ -342,6 +343,15 @@ static FORCEINLINE bool IsActorDormant(FNetworkObjectInfo* ActorInfo, const TWea bool UNetDriver::IsLevelInitializedForActor(const AActor* InActor, const UNetConnection* InConnection) const { + if (Fortnite_Version >= 2.42) // idk + return true; + + if (!InActor || !InConnection) + return false; + + // check(World == InActor->GetWorld()); + + // return true; // damn const bool bCorrectWorld = (InConnection->GetClientWorldPackageName() == GetWorldPackage()->NamePrivate && InConnection->ClientHasInitializedLevelFor(InActor)); const bool bIsConnectionPC = (InActor == InConnection->GetPlayerController()); return bCorrectWorld || bIsConnectionPC; @@ -376,7 +386,6 @@ int32 UNetDriver::ServerReplicateActors() } std::vector ConsiderList; - ConsiderList.reserve(GetNetworkObjectList().ActiveNetworkObjects.Num()); // std::cout << "ConsiderList.size(): " << GetNetworkObjectList(NetDriver).ActiveNetworkObjects.Num() << '\n'; @@ -385,6 +394,8 @@ int32 UNetDriver::ServerReplicateActors() ServerReplicateActors_BuildConsiderList(ConsiderList, ServerTickTime); + // LOG_INFO(LogReplication, "Considering {} actors.", ConsiderList.size()); + for (int32 i = 0; i < this->GetClientConnections().Num(); i++) { UNetConnection* Connection = this->GetClientConnections().at(i); @@ -434,9 +445,12 @@ int32 UNetDriver::ServerReplicateActors() std::vector ConnectionViewers; ConnectionViewers.push_back(ConstructNetViewer(Connection)); + const bool bLevelInitializedForActor = IsLevelInitializedForActor(Actor, Connection); + if (!Channel) { - if (!IsLevelInitializedForActor(Actor, Connection)) + // if (!IsLevelInitializedForActor(Actor, Connection)) + if (!bLevelInitializedForActor) { // If the level this actor belongs to isn't loaded on client, don't bother sending continue; @@ -473,6 +487,8 @@ int32 UNetDriver::ServerReplicateActors() if (!IsActorRelevantToConnection(Actor, ConnectionViewers)) { + // LOG_INFO(LogReplication, "Actor is not relevant!"); + if (Channel) ActorChannelClose(Channel); @@ -486,8 +502,6 @@ int32 UNetDriver::ServerReplicateActors() static __int64 (*ReplicateActor)(UActorChannel*) = decltype(ReplicateActor)(Addresses::ReplicateActor); static __int64 (*SetChannelActor)(UActorChannel*, AActor*) = decltype(SetChannelActor)(Addresses::SetChannelActor); - const bool bLevelInitializedForActor = IsLevelInitializedForActor(Actor, Connection); - if (!Channel) { if (Actor->IsA(APlayerController::StaticClass()) && Actor != Connection->GetPlayerController()) // isnetrelevantfor should handle this iirc @@ -513,6 +527,7 @@ int32 UNetDriver::ServerReplicateActors() { if (ReplicateActor(Channel)) { + // LOG_INFO(LogReplication, "Replicated Actor!"); auto TimeSeconds = UGameplayStatics::GetTimeSeconds(World); const float MinOptimalDelta = 1.0f / Actor->GetNetUpdateFrequency(); const float MaxOptimalDelta = max(1.0f / Actor->GetMinNetUpdateFrequency(), MinOptimalDelta); diff --git a/Project Reboot 3.0/Project Reboot 3.0.vcxproj b/Project Reboot 3.0/Project Reboot 3.0.vcxproj index 2e57785..83344f3 100644 --- a/Project Reboot 3.0/Project Reboot 3.0.vcxproj +++ b/Project Reboot 3.0/Project Reboot 3.0.vcxproj @@ -238,6 +238,7 @@ + diff --git a/Project Reboot 3.0/Project Reboot 3.0.vcxproj.filters b/Project Reboot 3.0/Project Reboot 3.0.vcxproj.filters index 44f6e4f..9366272 100644 --- a/Project Reboot 3.0/Project Reboot 3.0.vcxproj.filters +++ b/Project Reboot 3.0/Project Reboot 3.0.vcxproj.filters @@ -251,6 +251,9 @@ Reboot\Public + + Engine\Source\Runtime\Engine\Private + diff --git a/Project Reboot 3.0/addresses.cpp b/Project Reboot 3.0/addresses.cpp index 39bc2f6..2ffde1f 100644 --- a/Project Reboot 3.0/addresses.cpp +++ b/Project Reboot 3.0/addresses.cpp @@ -96,6 +96,8 @@ void Addresses::SetupVersion() Fortnite_Version = 1.72; if (Fortnite_CL == 3724489) Fortnite_Version = 1.8; + if (Fortnite_CL == 3757339) + Fortnite_Version = 1.9; if (Fortnite_CL == 3870737) Fortnite_Version = 2.42; @@ -277,6 +279,9 @@ void Addresses::FindAll() LOG_INFO(LogDev, "Finding FreeArrayOfEntries"); Addresses::FreeArrayOfEntries = FindFreeArrayOfEntries(); + LOG_INFO(LogDev, "Finding ApplyHomebaseEffectsOnPlayerSetup"); + Addresses::FreeArrayOfEntries = FindApplyHomebaseEffectsOnPlayerSetup(); + LOG_INFO(LogDev, "Finished finding!"); } @@ -339,6 +344,7 @@ void Addresses::Print() LOG_INFO(LogDev, "EnterAircraft: 0x{:x}", EnterAircraft - Base); LOG_INFO(LogDev, "SetTimer: 0x{:x}", SetTimer - Base); LOG_INFO(LogDev, "PickupInitialize: 0x{:x}", PickupInitialize - Base); + LOG_INFO(LogDev, "ApplyHomebaseEffectsOnPlayerSetup: 0x{:x}", ApplyHomebaseEffectsOnPlayerSetup - Base); } void Offsets::FindAll() @@ -379,14 +385,26 @@ void Offsets::FindAll() else if (std::floor(Fortnite_Version) >= 21) Offsets::ServerReplicateActors = 0x67; // checked onb 22.30 - if (Engine_Version == 416) // checked on 1.7.2 & 1.8 + if (Engine_Version == 416) // checked on 1.7.2 & 1.8 & 1.9 { Offsets::NetworkObjectList = 0x3F8; Offsets::ReplicationFrame = 0x288; } - if (Fortnite_Version == 2.42) + if (Fortnite_Version == 1.72) { - Offsets::ReplicationFrame = 0x2C8; + Offsets::ClientWorldPackageName = 0x336A8; + } + if (Fortnite_Version == 1.8 || Fortnite_Version == 1.9) + { + Offsets::ClientWorldPackageName = 0x33788; + } + if (Fortnite_Version == 1.11) + { + Offsets::ClientWorldPackageName = 0x337B8; + } + if (Fortnite_Version == 2.42 || Fortnite_Version == 2.5) + { + Offsets::ClientWorldPackageName = 0x17F8; } if (Fortnite_Version == 2.5) { diff --git a/Project Reboot 3.0/addresses.h b/Project Reboot 3.0/addresses.h index 2e2c6ea..6036b11 100644 --- a/Project Reboot 3.0/addresses.h +++ b/Project Reboot 3.0/addresses.h @@ -65,6 +65,7 @@ namespace Addresses extern inline uint64 PickupInitialize = 0; extern inline uint64 FreeEntry = 0; extern inline uint64 FreeArrayOfEntries = 0; + extern inline uint64 ApplyHomebaseEffectsOnPlayerSetup = 0; void SetupVersion(); // Finds Engine Version void FindAll(); @@ -85,6 +86,7 @@ namespace Offsets extern inline uint64 ReplicationFrame = 0; extern inline uint64 IsNetRelevantFor = 0; extern inline uint64 NetworkObjectList = 0; + extern inline uint64 ClientWorldPackageName = 0; void FindAll(); void Print(); diff --git a/Project Reboot 3.0/commands.h b/Project Reboot 3.0/commands.h index 5afb338..3e220c0 100644 --- a/Project Reboot 3.0/commands.h +++ b/Project Reboot 3.0/commands.h @@ -318,7 +318,7 @@ void ServerCheatHook(AFortPlayerControllerAthena* PlayerController, FString Msg) Pawn->SetShield(Shield); SendMessageToConsole(PlayerController, L"Set shield!\n"); } - /* else if (Command == "god") + else if (Command == "god") { auto Pawn = ReceivingController->GetMyFortPawn(); @@ -330,7 +330,7 @@ void ServerCheatHook(AFortPlayerControllerAthena* PlayerController, FString Msg) Pawn->SetCanBeDamaged(!Pawn->CanBeDamaged()); SendMessageToConsole(PlayerController, std::wstring(L"God set to " + std::to_wstring(!(bool)Pawn->CanBeDamaged())).c_str()); - } */ + } else if (Command == "applycid") { auto PlayerState = Cast(ReceivingController->GetPlayerState()); @@ -353,9 +353,16 @@ void ServerCheatHook(AFortPlayerControllerAthena* PlayerController, FString Msg) return; } - ApplyCID(Pawn, CIDDef); + LOG_INFO(LogDev, "Applying {}", CIDDef->GetFullName()); + + if (!ApplyCID(Pawn, CIDDef)) + { + SendMessageToConsole(PlayerController, L"Failed while applying skin! Please check the server log."); + return; + } + SendMessageToConsole(PlayerController, L"Applied CID!"); - } + } else if (Command == "summon") { if (Arguments.size() <= 1) diff --git a/Project Reboot 3.0/dllmain.cpp b/Project Reboot 3.0/dllmain.cpp index 64a618b..cd018a0 100644 --- a/Project Reboot 3.0/dllmain.cpp +++ b/Project Reboot 3.0/dllmain.cpp @@ -357,7 +357,7 @@ DWORD WINAPI Main(LPVOID) // Globals::bAbilitiesEnabled = Engine_Version < 500; - if (Fortnite_Version == 1.11) + if (Engine_Version < 420) { auto ApplyHomebaseEffectsOnPlayerSetupAddr = Memcury::Scanner::FindPattern("40 55 53 57 41 54 41 56 41 57 48 8D 6C 24 ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 33 C4 48 89 45 00 4C 8B BD ? ? ? ? 49").Get(); diff --git a/Project Reboot 3.0/events.h b/Project Reboot 3.0/events.h index 6d9a7bd..18fdf8e 100644 --- a/Project Reboot 3.0/events.h +++ b/Project Reboot 3.0/events.h @@ -23,6 +23,32 @@ struct Event static inline std::vector Events = { + Event + ( + "Rocket", + "", + "", + 0, + { + + }, + { + { + { + false, + // "/Buffet/Gameplay/Blueprints/BP_Buffet_Master_Scripting.BP_Buffet_Master_Scripting_C.startevent" + "/Game/Athena/Maps/Test/Events/BP_GeodeScripting.BP_GeodeScripting_C.LaunchSequence" + }, + + 0 + } + }, + + "/Game/Athena/Maps/Test/Events/BP_GeodeScripting.BP_GeodeScripting_C", + "/Game/Athena/Playlists/Playlist_DefaultSolo.Playlist_DefaultSolo", + 4.5, + false + ), Event ( "Butterfly", diff --git a/Project Reboot 3.0/finder.h b/Project Reboot 3.0/finder.h index 9e37159..5d4713b 100644 --- a/Project Reboot 3.0/finder.h +++ b/Project Reboot 3.0/finder.h @@ -404,6 +404,11 @@ static inline uint64 FindIsNetRelevantForOffset() return 0; } +static inline uint64 FindApplyHomebaseEffectsOnPlayerSetup() +{ + return 0; +} + static inline uint64 FindActorChannelClose() { auto StringRef = Memcury::Scanner::FindStringRef(L"UActorChannel::Close: ChIndex: %d, Actor: %s"); @@ -1283,7 +1288,10 @@ static inline uint64 FindGetNetMode() static inline uint64 FindApplyCharacterCustomization() { - auto Addrr = Memcury::Scanner::FindStringRef(L"AFortPlayerState::ApplyCharacterCustomization - Failed initialization, using default parts. Player Controller: %s PlayerState: %s, HeroId: %s").Get(); + auto Addrr = Memcury::Scanner::FindStringRef(L"AFortPlayerState::ApplyCharacterCustomization - Failed initialization, using default parts. Player Controller: %s PlayerState: %s, HeroId: %s", false).Get(); + + if (!Addrr) + return 0; for (int i = 0; i < 7000; i++) { diff --git a/Project Reboot 3.0/log.h b/Project Reboot 3.0/log.h index 1805dcf..ffad628 100644 --- a/Project Reboot 3.0/log.h +++ b/Project Reboot 3.0/log.h @@ -81,6 +81,7 @@ inline void InitLogger() MakeLogger("LogReplication"); MakeLogger("LogMutator"); MakeLogger("LogVehicles"); + MakeLogger("LogCosmetics"); } #define LOG_DEBUG(loggerName, ...) \