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
on:
workflow_call:
inputs:
branch:
required: true
type: string
push:
branches: ["master"]
pull_request:
branches: ["master"]
env:
# Path to the solution file relative to the root of the project.
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
permissions:
@@ -24,27 +18,35 @@ jobs:
runs-on: windows-latest
steps:
- uses: actions/checkout@v3
with:
ref: ${{ inputs.branch }}
- uses: actions/checkout@v3
- name: Add MSBuild to PATH
uses: microsoft/setup-msbuild@v1.0.2
- name: Add MSBuild to PATH
uses: microsoft/setup-msbuild@v1.0.2
- name: Restore NuGet packages
working-directory: ${{env.GITHUB_WORKSPACE}}
run: nuget restore ${{env.SOLUTION_FILE_PATH}}
- name: Restore NuGet packages
working-directory: ${{env.GITHUB_WORKSPACE}}
run: nuget restore ${{env.SOLUTION_FILE_PATH}}
- name: Build
working-directory: ${{env.GITHUB_WORKSPACE}}
# Add additional options to the MSBuild command line here (like platform or verbosity level).
# See https://docs.microsoft.com/visualstudio/msbuild/msbuild-command-line-reference
run: msbuild /m /p:Configuration=${{env.BUILD_CONFIGURATION}} ${{env.SOLUTION_FILE_PATH}}
- name: Build Reboot
working-directory: ${{env.GITHUB_WORKSPACE}}
run: msbuild ${{env.SOLUTION_FILE_PATH}} /t:Clean,Build /p:Configuration=Release
- name: Upload Release Artifact
uses: actions/upload-artifact@v3
with:
name: Release
path: ${{env.SOLUTION_FILE_PATH}}/x64/Release
if-no-files-found: warn
retention-days: 60
- name: Upload Artifact without ABOVE_S20
uses: actions/upload-artifact@v4
with:
name: Reboot
path: ${{env.SOLUTION_FILE_PATH}}/x64/Release
if-no-files-found: warn
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)));
this->ForceNetUpdate();
// they do something here
GetEditingPlayer() = NewEditingPlayer;
}
}

View File

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

View File

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

View File

@@ -94,6 +94,14 @@ void AFortPawn::SetShield(float 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)
{
auto Pawn = (AFortPawn*)Context;

View File

@@ -49,6 +49,7 @@ public:
void SetHealth(float NewHealth);
void SetMaxHealth(float NewHealthVal);
void SetShield(float NewShield);
void SetMaxShield(float NewShieldVal);
static void NetMulticast_Athena_BatchedDamageCuesHook(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);
}
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)
{
if (!BuildingActorToEdit || !BuildingActorToEdit->IsPlayerPlaced()) // We need more checks.
@@ -1715,9 +1682,6 @@ void AFortPlayerController::ServerBeginEditingBuildingActorHook(AFortPlayerContr
if (!Pawn)
return;
if (!IsOkForEditing(BuildingActorToEdit, PlayerController))
return;
auto PlayerState = PlayerController->GetPlayerState();
if (!PlayerState)
@@ -1737,14 +1701,15 @@ void AFortPlayerController::ServerBeginEditingBuildingActorHook(AFortPlayerContr
if (!EditToolInstance)
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)
return;
EditTool->SetEditActor(BuildingActorToEdit);
EditTool->GetEditActor() = BuildingActorToEdit;
EditTool->OnRep_EditActor();
}
void AFortPlayerController::ServerEditBuildingActorHook(UObject* Context, FFrame& Stack, void* Ret)
@@ -1767,7 +1732,7 @@ void AFortPlayerController::ServerEditBuildingActorHook(UObject* Context, FFrame
// 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, "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())
//return ServerEditBuildingActorOriginal(Context, Frame, Ret);
// BuildingActorToEdit->SetEditingPlayer(nullptr); // uh?
BuildingActorToEdit->SetEditingPlayer(nullptr);
static ABuildingSMActor* (*BuildingSMActorReplaceBuildingActor)(ABuildingSMActor*, __int64, UClass*, int, int, uint8_t, AFortPlayerController*) =
decltype(BuildingSMActorReplaceBuildingActor)(Addresses::ReplaceBuildingActor);
@@ -1816,13 +1781,16 @@ void AFortPlayerController::ServerEndEditingBuildingActorHook(AFortPlayerControl
if (!EditToolInstance)
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);
// PlayerController->ClientForceCancelBuildingTool();
EditTool->GetEditActor() = nullptr;
EditTool->OnRep_EditActor();
}
// PlayerController->ClientForceCancelBuildingTool();
}

View File

@@ -647,3 +647,59 @@ void AFortPlayerControllerAthena::UpdateTrackedAttributesHook(AFortPlayerControl
if (ItemInstancesToRemove.size() > 0)
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 ServerReadyToStartMatchHook(AFortPlayerControllerAthena* PlayerController);
static void UpdateTrackedAttributesHook(AFortPlayerControllerAthena* PlayerController);
static void ServerClientIsReadyToRespawnHook(AFortPlayerControllerAthena* PlayerControllerAthena); // 1:1
static UClass* StaticClass()
{

View File

@@ -30,6 +30,18 @@ struct FFortRespawnData
static auto bServerIsReadyOffset = FindOffsetStruct("/Script/FortniteGame.FortRespawnData", "bServerIsReady");
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

View File

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

View File

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

View File

@@ -323,8 +323,11 @@ public:
PickRandomLoadout();
ApplyCosmeticLoadout();
GameState->GetPlayersLeft()++;
GameState->OnRep_PlayersLeft();
if (Fortnite_Version <= 10)
{
GameState->GetPlayersLeft()++;
GameState->OnRep_PlayersLeft();
}
if (auto FortPlayerControllerAthena = Cast<AFortPlayerControllerAthena>(Controller))
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"),
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");
if (ServerRequestSeatChangeFn)

View File

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

View File

@@ -2,7 +2,7 @@
![image](https://github.com/user-attachments/assets/5704e635-31d9-417a-856f-91728f2be7f2)
# 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.
![Banner](https://i.imgur.com/p0P4tcI.png)