PLEASE DONT BREAK EEVYERHTJING IDK HOW THIS WORKS

Update S20+ with master branch
This commit is contained in:
Gray
2025-03-20 19:07:04 -04:00
committed by GitHub
20 changed files with 210 additions and 98 deletions

View File

@@ -1,19 +1,13 @@
name: MSBuild name: MSBuild
on: on:
workflow_call: push:
inputs: branches: ["master"]
branch: pull_request:
required: true branches: ["master"]
type: string
env: env:
# Path to the solution file relative to the root of the project.
SOLUTION_FILE_PATH: . SOLUTION_FILE_PATH: .
# Configuration type to build.
# You can convert this to a build matrix if you need coverage of multiple configuration types.
# https://docs.github.com/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix
BUILD_CONFIGURATION: Release BUILD_CONFIGURATION: Release
permissions: permissions:
@@ -25,8 +19,6 @@ jobs:
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
with:
ref: ${{ inputs.branch }}
- name: Add MSBuild to PATH - name: Add MSBuild to PATH
uses: microsoft/setup-msbuild@v1.0.2 uses: microsoft/setup-msbuild@v1.0.2
@@ -35,16 +27,26 @@ jobs:
working-directory: ${{env.GITHUB_WORKSPACE}} working-directory: ${{env.GITHUB_WORKSPACE}}
run: nuget restore ${{env.SOLUTION_FILE_PATH}} run: nuget restore ${{env.SOLUTION_FILE_PATH}}
- name: Build - name: Build Reboot
working-directory: ${{env.GITHUB_WORKSPACE}} working-directory: ${{env.GITHUB_WORKSPACE}}
# Add additional options to the MSBuild command line here (like platform or verbosity level). run: msbuild ${{env.SOLUTION_FILE_PATH}} /t:Clean,Build /p:Configuration=Release
# See https://docs.microsoft.com/visualstudio/msbuild/msbuild-command-line-reference
run: msbuild /m /p:Configuration=${{env.BUILD_CONFIGURATION}} ${{env.SOLUTION_FILE_PATH}}
- name: Upload Release Artifact - name: Upload Artifact without ABOVE_S20
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v4
with: with:
name: Release name: Reboot
path: ${{env.SOLUTION_FILE_PATH}}/x64/Release path: ${{env.SOLUTION_FILE_PATH}}/x64/Release
if-no-files-found: warn if-no-files-found: warn
retention-days: 60 retention-days: 90
- name: Build RebootS20
working-directory: ${{env.GITHUB_WORKSPACE}}
run: msbuild ${{env.SOLUTION_FILE_PATH}} /p:AboveS20=TRUE /t:Clean,Build /p:Configuration=Release
- name: Upload Artifact with ABOVE_S20
uses: actions/upload-artifact@v4
with:
name: RebootS20
path: ${{env.SOLUTION_FILE_PATH}}/x64/Release
if-no-files-found: warn
retention-days: 90

View File

@@ -55,7 +55,7 @@ public:
) )
{ {
SetNetDormancy((ENetDormancy)(2 - (NewEditingPlayer != 0))); SetNetDormancy((ENetDormancy)(2 - (NewEditingPlayer != 0)));
this->ForceNetUpdate(); // they do something here
GetEditingPlayer() = NewEditingPlayer; GetEditingPlayer() = NewEditingPlayer;
} }
} }

View File

@@ -24,14 +24,5 @@ public:
void OnRep_EditActor(); void OnRep_EditActor();
void SetEditActor(ABuildingSMActor* EditActor)
{
// if (HasAuthority())
{
GetEditActor() = EditActor;
originalOnRep_EditActor(this);
}
}
static UClass* StaticClass(); static UClass* StaticClass();
}; };

View File

@@ -61,7 +61,7 @@ public:
if (!TeamLoadouts) if (!TeamLoadouts)
return FItemLoadoutTeamMap(); return FItemLoadoutTeamMap();
for (int i = 0; i < TeamLoadouts->Num(); i++) for (int i = 0; i < TeamLoadouts->Num(); ++i)
{ {
auto& TeamLoadout = TeamLoadouts->at(i); auto& TeamLoadout = TeamLoadouts->at(i);
@@ -106,7 +106,7 @@ public:
return Get<EAthenaInventorySpawnOverride>(InventoryUpdateOverrideOffset); return Get<EAthenaInventorySpawnOverride>(InventoryUpdateOverrideOffset);
} }
EAthenaLootDropOverride& GetDropAllItemsOverride(uint8_t TeamIndex = 255) EAthenaLootDropOverride GetDropAllItemsOverride(uint8_t TeamIndex = 255)
{ {
if (TeamIndex != 255) if (TeamIndex != 255)
{ {

View File

@@ -1314,6 +1314,18 @@ void AFortGameModeAthena::Athena_HandleStartingNewPlayerHook(AFortGameModeAthena
{ {
OverrideBattleBusSkin = FindObject(L"/Game/Athena/Items/Cosmetics/BattleBuses/BBID_WorldCupBus.BBID_WorldCupBus"); // World Cup OverrideBattleBusSkin = FindObject(L"/Game/Athena/Items/Cosmetics/BattleBuses/BBID_WorldCupBus.BBID_WorldCupBus"); // World Cup
} }
else if (Fortnite_Version == 14.30)
{
OverrideBattleBusSkin = FindObject(L"/Game/Athena/Items/Cosmetics/BattleBuses/BBID_BusUpgrade1.BBID_BusUpgrade1");
}
else if (Fortnite_Version == 14.50)
{
OverrideBattleBusSkin = FindObject(L"/Game/Athena/Items/Cosmetics/BattleBuses/BBID_BusUpgrade2.BBID_BusUpgrade2");
}
else if (Fortnite_Version == 14.60)
{
OverrideBattleBusSkin = FindObject(L"/Game/Athena/Items/Cosmetics/BattleBuses/BBID_BusUpgrade3.BBID_BusUpgrade3");
}
if (OverrideBattleBusSkin) if (OverrideBattleBusSkin)
OverrideBattleBus(GameState, OverrideBattleBusSkin); OverrideBattleBus(GameState, OverrideBattleBusSkin);

View File

@@ -382,6 +382,32 @@ bool AFortInventory::RemoveItem(const FGuid& ItemGuid, bool* bShouldUpdate, int
} }
} }
/*
if (FortPlayerController)
{
if (auto Pawn = FortPlayerController->GetMyFortPawn())
{
static auto CurrentWeaponListOffset = Pawn->GetOffset("CurrentWeaponList");
if (CurrentWeaponListOffset != -1) // shouldnt be possible but better safe than sorry!
{
auto& CurrentWeaponList = Pawn->Get<TArray<AFortWeapon*>>(CurrentWeaponListOffset);
for (int i = 0; i < CurrentWeaponList.Num(); ++i)
{
auto Weapon = CurrentWeaponList.At(i);
if (Weapon->GetItemEntryGuid() == ItemGuid)
{
Weapon->K2_DestroyActor();
break;
}
}
}
}
}
*/
// todo remove from weaponlist // todo remove from weaponlist
if (bShouldUpdate) if (bShouldUpdate)

View File

@@ -94,6 +94,14 @@ void AFortPawn::SetShield(float NewShield)
this->ProcessEvent(SetShieldFn, &NewShield); this->ProcessEvent(SetShieldFn, &NewShield);
} }
void AFortPawn::SetMaxShield(float NewShieldVal)
{
static auto SetMaxShieldFn = FindObject<UFunction>("/Script/FortniteGame.FortPawn.SetMaxShield");
if (SetMaxShieldFn)
this->ProcessEvent(SetMaxShieldFn, &NewShieldVal);
}
void AFortPawn::NetMulticast_Athena_BatchedDamageCuesHook(UObject* Context, FFrame* Stack, void* Ret) void AFortPawn::NetMulticast_Athena_BatchedDamageCuesHook(UObject* Context, FFrame* Stack, void* Ret)
{ {
auto Pawn = (AFortPawn*)Context; auto Pawn = (AFortPawn*)Context;

View File

@@ -49,6 +49,7 @@ public:
void SetHealth(float NewHealth); void SetHealth(float NewHealth);
void SetMaxHealth(float NewHealthVal); void SetMaxHealth(float NewHealthVal);
void SetShield(float NewShield); void SetShield(float NewShield);
void SetMaxShield(float NewShieldVal);
static void NetMulticast_Athena_BatchedDamageCuesHook(UObject* Context, FFrame* Stack, void* Ret); static void NetMulticast_Athena_BatchedDamageCuesHook(UObject* Context, FFrame* Stack, void* Ret);
static void MovingEmoteStoppedHook(UObject* Context, FFrame* Stack, void* Ret); static void MovingEmoteStoppedHook(UObject* Context, FFrame* Stack, void* Ret);

View File

@@ -1672,39 +1672,6 @@ void AFortPlayerController::ClientOnPawnDiedHook(AFortPlayerController* PlayerCo
return ClientOnPawnDiedOriginal(PlayerController, DeathReport); return ClientOnPawnDiedOriginal(PlayerController, DeathReport);
} }
bool Idk(ABuildingSMActor* BuildingActor)
{
return true; // bIsPlayerBuildable && EditModeSupport && EditModePatternData && GameState->StructuralSupportSystem && ?? && ??
}
bool IsOkForEditing(ABuildingSMActor* BuildingActor, AFortPlayerController* Controller)
{
if (BuildingActor->GetEditingPlayer() &&
BuildingActor->GetEditingPlayer() != Controller->GetPlayerState())
return false;
return !BuildingActor->IsDestroyed() &&
// BuildingActor->GetWorld() &&
Idk(BuildingActor);
}
/*
The editing dilemma:
15.10:
Valid edit pattern:
ServerBeginEditingActorblahblah
ServerEdit
ClientForceStop
WHERE IS END EDITING?!?!??!
Invalid EDitPattern:
ServerBeginEditingActorblahblah
ServerEnd
*/
void AFortPlayerController::ServerBeginEditingBuildingActorHook(AFortPlayerController* PlayerController, ABuildingSMActor* BuildingActorToEdit) void AFortPlayerController::ServerBeginEditingBuildingActorHook(AFortPlayerController* PlayerController, ABuildingSMActor* BuildingActorToEdit)
{ {
if (!BuildingActorToEdit || !BuildingActorToEdit->IsPlayerPlaced()) // We need more checks. if (!BuildingActorToEdit || !BuildingActorToEdit->IsPlayerPlaced()) // We need more checks.
@@ -1715,9 +1682,6 @@ void AFortPlayerController::ServerBeginEditingBuildingActorHook(AFortPlayerContr
if (!Pawn) if (!Pawn)
return; return;
if (!IsOkForEditing(BuildingActorToEdit, PlayerController))
return;
auto PlayerState = PlayerController->GetPlayerState(); auto PlayerState = PlayerController->GetPlayerState();
if (!PlayerState) if (!PlayerState)
@@ -1737,14 +1701,15 @@ void AFortPlayerController::ServerBeginEditingBuildingActorHook(AFortPlayerContr
if (!EditToolInstance) if (!EditToolInstance)
return; return;
AFortWeap_EditingTool* EditTool = nullptr; Pawn->EquipWeaponDefinition(EditToolDef, EditToolInstance->GetItemEntry()->GetItemGuid());
EditTool = Cast<AFortWeap_EditingTool>(Pawn->EquipWeaponDefinition(EditToolDef, EditToolInstance->GetItemEntry()->GetItemGuid())); auto EditTool = Cast<AFortWeap_EditingTool>(Pawn->GetCurrentWeapon());
if (!EditTool) if (!EditTool)
return; return;
EditTool->SetEditActor(BuildingActorToEdit); EditTool->GetEditActor() = BuildingActorToEdit;
EditTool->OnRep_EditActor();
} }
void AFortPlayerController::ServerEditBuildingActorHook(UObject* Context, FFrame& Stack, void* Ret) void AFortPlayerController::ServerEditBuildingActorHook(UObject* Context, FFrame& Stack, void* Ret)
@@ -1767,7 +1732,7 @@ void AFortPlayerController::ServerEditBuildingActorHook(UObject* Context, FFrame
// LOG_INFO(LogDev, "RotationIterations: {}", RotationIterations); // LOG_INFO(LogDev, "RotationIterations: {}", RotationIterations);
if (!BuildingActorToEdit || !NewBuildingClass || BuildingActorToEdit->GetEditingPlayer() != PlayerState || BuildingActorToEdit->IsDestroyed()) if (!BuildingActorToEdit || !NewBuildingClass || BuildingActorToEdit->IsDestroyed() || BuildingActorToEdit->GetEditingPlayer() != PlayerState)
{ {
// LOG_INFO(LogDev, "Cheater?"); // LOG_INFO(LogDev, "Cheater?");
// LOG_INFO(LogDev, "BuildingActorToEdit->GetEditingPlayer(): {} PlayerState: {} NewBuildingClass: {} BuildingActorToEdit: {}", BuildingActorToEdit ? __int64(BuildingActorToEdit->GetEditingPlayer()) : -1, __int64(PlayerState), __int64(NewBuildingClass), __int64(BuildingActorToEdit)); // LOG_INFO(LogDev, "BuildingActorToEdit->GetEditingPlayer(): {} PlayerState: {} NewBuildingClass: {} BuildingActorToEdit: {}", BuildingActorToEdit ? __int64(BuildingActorToEdit->GetEditingPlayer()) : -1, __int64(PlayerState), __int64(NewBuildingClass), __int64(BuildingActorToEdit));
@@ -1777,7 +1742,7 @@ void AFortPlayerController::ServerEditBuildingActorHook(UObject* Context, FFrame
// if (!PlayerState || PlayerState->GetTeamIndex() != BuildingActorToEdit->GetTeamIndex()) // if (!PlayerState || PlayerState->GetTeamIndex() != BuildingActorToEdit->GetTeamIndex())
//return ServerEditBuildingActorOriginal(Context, Frame, Ret); //return ServerEditBuildingActorOriginal(Context, Frame, Ret);
// BuildingActorToEdit->SetEditingPlayer(nullptr); // uh? BuildingActorToEdit->SetEditingPlayer(nullptr);
static ABuildingSMActor* (*BuildingSMActorReplaceBuildingActor)(ABuildingSMActor*, __int64, UClass*, int, int, uint8_t, AFortPlayerController*) = static ABuildingSMActor* (*BuildingSMActorReplaceBuildingActor)(ABuildingSMActor*, __int64, UClass*, int, int, uint8_t, AFortPlayerController*) =
decltype(BuildingSMActorReplaceBuildingActor)(Addresses::ReplaceBuildingActor); decltype(BuildingSMActorReplaceBuildingActor)(Addresses::ReplaceBuildingActor);
@@ -1816,13 +1781,16 @@ void AFortPlayerController::ServerEndEditingBuildingActorHook(AFortPlayerControl
if (!EditToolInstance) if (!EditToolInstance)
return; return;
// Pawn->EquipWeaponDefinition(EditToolDef, EditToolInstance->GetItemEntry()->GetItemGuid()); // why do they do this on older builds bru Pawn->EquipWeaponDefinition(EditToolDef, EditToolInstance->GetItemEntry()->GetItemGuid());
if (auto EditTool = Cast<AFortWeap_EditingTool>(Pawn->GetCurrentWeapon())) auto EditTool = Cast<AFortWeap_EditingTool>(Pawn->GetCurrentWeapon());
BuildingActorToStopEditing->GetEditingPlayer() = nullptr;
// BuildingActorToStopEditing->OnRep_EditingPlayer();
if (EditTool)
{ {
EditTool->SetEditActor(nullptr); EditTool->GetEditActor() = nullptr;
// PlayerController->ClientForceCancelBuildingTool(); EditTool->OnRep_EditActor();
} }
// PlayerController->ClientForceCancelBuildingTool();
} }

View File

@@ -647,3 +647,59 @@ void AFortPlayerControllerAthena::UpdateTrackedAttributesHook(AFortPlayerControl
if (ItemInstancesToRemove.size() > 0) if (ItemInstancesToRemove.size() > 0)
WorldInventory->Update(); WorldInventory->Update();
} }
void AFortPlayerControllerAthena::ServerClientIsReadyToRespawnHook(AFortPlayerControllerAthena* PlayerControllerAthena)
{
AFortPlayerStateAthena* PlayerStateAthena = Cast<AFortPlayerStateAthena>(PlayerControllerAthena->GetPlayerState());
AFortGameModeAthena* GameModeAthena = Cast<AFortGameModeAthena>(GetWorld()->GetGameMode());
if (!PlayerStateAthena || !GameModeAthena)
return;
AFortGameStateAthena* GameStateAthena = Cast<AFortGameStateAthena>(GameModeAthena->GetGameState());
if (!GameStateAthena) return;
if (GameStateAthena->IsRespawningAllowed(PlayerStateAthena))
{
FFortRespawnData* RespawnData = PlayerStateAthena->GetRespawnData();
if (RespawnData->IsServerReady() && RespawnData->IsRespawnDataAvailable())
{
const FVector& RespawnLocation = RespawnData->GetRespawnLocation();
const FRotator& RespawnRotation = RespawnData->GetRespawnRotation();
// RestartPlayer doesn't work, idk why
static auto SpawnDefaultPawnAtTransformFn = FindObject<UFunction>(L"/Script/Engine.GameModeBase.SpawnDefaultPawnAtTransform");
FTransform SpawnTransform{};
SpawnTransform.Translation = RespawnLocation;
SpawnTransform.Rotation = RespawnRotation.Quaternion();
SpawnTransform.Scale3D = FVector(1, 1, 1);
struct { AController* NewPlayer; FTransform SpawnTransform; APawn* ReturnValue; }
AGameModeBase_SpawnDefaultPawnAtTransform_Params{ PlayerControllerAthena, SpawnTransform };
GameModeAthena->ProcessEvent(SpawnDefaultPawnAtTransformFn, &AGameModeBase_SpawnDefaultPawnAtTransform_Params);
AFortPlayerPawn* PlayerPawn = Cast<AFortPlayerPawn>(AGameModeBase_SpawnDefaultPawnAtTransform_Params.ReturnValue);
if (!PlayerPawn)
return;
PlayerPawn->SetOwner(PlayerControllerAthena);
PlayerControllerAthena->Possess(PlayerPawn);
PlayerPawn->SetMaxHealth(100);
PlayerPawn->SetHealth(100);
PlayerPawn->SetMaxShield(100);
PlayerPawn->SetShield(100);
PlayerControllerAthena->RespawnPlayerAfterDeath(true);
RespawnData->IsClientReady() = true;
}
}
printf_s(__FUNCTION__"\n");
}

View File

@@ -264,6 +264,7 @@ public:
static void GetPlayerViewPointHook(AFortPlayerControllerAthena* PlayerController, FVector& Location, FRotator& Rotation); static void GetPlayerViewPointHook(AFortPlayerControllerAthena* PlayerController, FVector& Location, FRotator& Rotation);
static void ServerReadyToStartMatchHook(AFortPlayerControllerAthena* PlayerController); static void ServerReadyToStartMatchHook(AFortPlayerControllerAthena* PlayerController);
static void UpdateTrackedAttributesHook(AFortPlayerControllerAthena* PlayerController); static void UpdateTrackedAttributesHook(AFortPlayerControllerAthena* PlayerController);
static void ServerClientIsReadyToRespawnHook(AFortPlayerControllerAthena* PlayerControllerAthena); // 1:1
static UClass* StaticClass() static UClass* StaticClass()
{ {

View File

@@ -30,6 +30,18 @@ struct FFortRespawnData
static auto bServerIsReadyOffset = FindOffsetStruct("/Script/FortniteGame.FortRespawnData", "bServerIsReady"); static auto bServerIsReadyOffset = FindOffsetStruct("/Script/FortniteGame.FortRespawnData", "bServerIsReady");
return *(bool*)(__int64(this) + bServerIsReadyOffset); return *(bool*)(__int64(this) + bServerIsReadyOffset);
} }
FVector& GetRespawnLocation()
{
static auto RespawnLocationOffset = FindOffsetStruct("/Script/FortniteGame.FortRespawnData", "RespawnLocation");
return *(FVector*)(__int64(this) + RespawnLocationOffset);
}
FRotator& GetRespawnRotation()
{
static auto RespawnRotationOffset = FindOffsetStruct("/Script/FortniteGame.FortRespawnData", "RespawnRotation");
return *(FRotator*)(__int64(this) + RespawnRotationOffset);
}
}; };
struct FDeathInfo struct FDeathInfo

View File

@@ -78,6 +78,7 @@
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;PROJECTREBOOT30_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;_DEBUG;PROJECTREBOOT30_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(AboveS20)'!=''">ABOVE_S20;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>NotUsing</PrecompiledHeader> <PrecompiledHeader>NotUsing</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile> <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
@@ -100,6 +101,7 @@
<IntrinsicFunctions>true</IntrinsicFunctions> <IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;PROJECTREBOOT30_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;NDEBUG;PROJECTREBOOT30_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(AboveS20)'!=''">ABOVE_S20;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>NotUsing</PrecompiledHeader> <PrecompiledHeader>NotUsing</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile> <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
@@ -124,6 +126,7 @@
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;PROJECTREBOOT30_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_DEBUG;PROJECTREBOOT30_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(AboveS20)'!=''">ABOVE_S20;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>NotUsing</PrecompiledHeader> <PrecompiledHeader>NotUsing</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile> <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
@@ -146,6 +149,7 @@
<IntrinsicFunctions>true</IntrinsicFunctions> <IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck> <SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;PROJECTREBOOT30_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>NDEBUG;PROJECTREBOOT30_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions Condition="'$(AboveS20)'!=''">ABOVE_S20=$(AboveS20);%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode> <ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>NotUsing</PrecompiledHeader> <PrecompiledHeader>NotUsing</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile> <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>

View File

@@ -4,6 +4,6 @@
UClass* UPackage::StaticClass() UClass* UPackage::StaticClass()
{ {
static auto Class = FindObject<UClass>("/Script/CoreUObject.Package"); static auto Class = FindObject<UClass>(L"/Script/CoreUObject.Package");
return Class; return Class;
} }

View File

@@ -678,6 +678,25 @@ std::vector<uint64> Addresses::GetFunctionsToNull()
} }
} }
#if 0 // untested
auto BeginPlayPedestalStrRef = Memcury::Scanner::FindStringRef("AFortTeamMemberPedestal::BeginPlay - Begun play on pedestal %s");
if (BeginPlayPedestalStrRef.Get())
{
auto Start = BeginPlayPedestalStrRef.ScanFor({ 0x40, 0x53, 0x41, 0x56 }, false);
LOG_INFO(LogDev, "BeginPlayPedestal Start: 0x{:x}", Start);
toNull.push_back(Start.Get());
}
#else
auto BeginPlayPedestalScanner = Memcury::Scanner::FindPattern("40 53 41 56 48 83 EC 48 48 89 6C 24 ? 48 8B D9 48 89 74 24 ? 48 89 7C 24");
if (auto BeginPlayPedestal = BeginPlayPedestalScanner.Get())
{
LOG_INFO(LogDev, "BeginPlayPedestal Start: 0x{:x}", BeginPlayPedestal - __int64(GetModuleHandleW(0)));
toNull.push_back(BeginPlayPedestal);
}
#endif
toNull.push_back(Addresses::ChangeGameSessionId); toNull.push_back(Addresses::ChangeGameSessionId);
return toNull; return toNull;

View File

@@ -323,8 +323,11 @@ public:
PickRandomLoadout(); PickRandomLoadout();
ApplyCosmeticLoadout(); ApplyCosmeticLoadout();
if (Fortnite_Version <= 10)
{
GameState->GetPlayersLeft()++; GameState->GetPlayersLeft()++;
GameState->OnRep_PlayersLeft(); GameState->OnRep_PlayersLeft();
}
if (auto FortPlayerControllerAthena = Cast<AFortPlayerControllerAthena>(Controller)) if (auto FortPlayerControllerAthena = Cast<AFortPlayerControllerAthena>(Controller))
GameMode->GetAlivePlayers().Add(FortPlayerControllerAthena); GameMode->GetAlivePlayers().Add(FortPlayerControllerAthena);

View File

@@ -1285,6 +1285,13 @@ DWORD WINAPI Main(LPVOID)
Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerController.ServerReadyToStartMatch"), Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerController.ServerReadyToStartMatch"),
AFortPlayerControllerAthena::ServerReadyToStartMatchHook, (PVOID*)&AFortPlayerControllerAthena::ServerReadyToStartMatchOriginal, false); AFortPlayerControllerAthena::ServerReadyToStartMatchHook, (PVOID*)&AFortPlayerControllerAthena::ServerReadyToStartMatchOriginal, false);
if (Fortnite_Version >= 14)
{
Hooking::MinHook::Hook(FortPlayerControllerAthenaDefault, FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerControllerAthena.ServerClientIsReadyToRespawn"),
AFortPlayerControllerAthena::ServerClientIsReadyToRespawnHook, nullptr, false);
}
auto ServerRequestSeatChangeFn = FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerControllerZone.ServerRequestSeatChange"); auto ServerRequestSeatChangeFn = FindObject<UFunction>(L"/Script/FortniteGame.FortPlayerControllerZone.ServerRequestSeatChange");
if (ServerRequestSeatChangeFn) if (ServerRequestSeatChangeFn)

View File

@@ -86,6 +86,8 @@ static inline class UWorld* GetWorld()
static auto GameViewportOffset = Engine->GetOffset("GameViewport"); static auto GameViewportOffset = Engine->GetOffset("GameViewport");
auto GameViewport = Engine->Get<UObject*>(GameViewportOffset); auto GameViewport = Engine->Get<UObject*>(GameViewportOffset);
if (!GameViewport) return nullptr;
static auto WorldOffset = GameViewport->GetOffset("World"); static auto WorldOffset = GameViewport->GetOffset("World");
return GameViewport->Get<class UWorld*>(WorldOffset); return GameViewport->Get<class UWorld*>(WorldOffset);

View File

@@ -2,7 +2,7 @@
![image](https://github.com/user-attachments/assets/5704e635-31d9-417a-856f-91728f2be7f2) ![image](https://github.com/user-attachments/assets/5704e635-31d9-417a-856f-91728f2be7f2)
# The reboot discord and my discord account has been terminated # The reboot discord and my discord account has been terminated
# What does this mean for the future of reboot? This means V4 is definitely not coming. # New discord at discord.gg/rebootmp
# Thanks for all the support over the past years. # Thanks for all the support over the past years.
![Banner](https://i.imgur.com/p0P4tcI.png) ![Banner](https://i.imgur.com/p0P4tcI.png)