mirror of
https://github.com/Milxnor/Project-Reboot-3.0.git
synced 2026-01-13 02:42:22 +01:00
PLEASE DONT BREAK EEVYERHTJING IDK HOW THIS WORKS
Update S20+ with master branch
This commit is contained in:
2
.github/workflows/aboveS20.yml
vendored
2
.github/workflows/aboveS20.yml
vendored
@@ -8,7 +8,7 @@ on:
|
|||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
update-branches:
|
update-branches:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
|
|||||||
62
.github/workflows/msbuild.yml
vendored
62
.github/workflows/msbuild.yml
vendored
@@ -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:
|
||||||
@@ -24,27 +18,35 @@ jobs:
|
|||||||
runs-on: windows-latest
|
runs-on: windows-latest
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
- name: Restore NuGet packages
|
- name: Restore NuGet packages
|
||||||
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
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
};
|
};
|
||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
@@ -1793,7 +1758,7 @@ void AFortPlayerController::ServerEditBuildingActorHook(UObject* Context, FFrame
|
|||||||
return ServerEditBuildingActorOriginal(Context, Stack, Ret);
|
return ServerEditBuildingActorOriginal(Context, Stack, Ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AFortPlayerController::ServerEndEditingBuildingActorHook(AFortPlayerController* PlayerController, ABuildingSMActor* BuildingActorToStopEditing)
|
void AFortPlayerController::ServerEndEditingBuildingActorHook(AFortPlayerController* PlayerController, ABuildingSMActor* BuildingActorToStopEditing)
|
||||||
{
|
{
|
||||||
auto Pawn = PlayerController->GetMyFortPawn();
|
auto Pawn = PlayerController->GetMyFortPawn();
|
||||||
|
|
||||||
@@ -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();
|
|
||||||
}
|
|
||||||
@@ -646,4 +646,60 @@ 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");
|
||||||
}
|
}
|
||||||
@@ -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()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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>
|
||||||
@@ -513,4 +517,4 @@
|
|||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
<ImportGroup Label="ExtensionTargets">
|
<ImportGroup Label="ExtensionTargets">
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -323,8 +323,11 @@ public:
|
|||||||
PickRandomLoadout();
|
PickRandomLoadout();
|
||||||
ApplyCosmeticLoadout();
|
ApplyCosmeticLoadout();
|
||||||
|
|
||||||
GameState->GetPlayersLeft()++;
|
if (Fortnite_Version <= 10)
|
||||||
GameState->OnRep_PlayersLeft();
|
{
|
||||||
|
GameState->GetPlayersLeft()++;
|
||||||
|
GameState->OnRep_PlayersLeft();
|
||||||
|
}
|
||||||
|
|
||||||
if (auto FortPlayerControllerAthena = Cast<AFortPlayerControllerAthena>(Controller))
|
if (auto FortPlayerControllerAthena = Cast<AFortPlayerControllerAthena>(Controller))
|
||||||
GameMode->GetAlivePlayers().Add(FortPlayerControllerAthena);
|
GameMode->GetAlivePlayers().Add(FortPlayerControllerAthena);
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||

|

|
||||||
|
|
||||||
# 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.
|
||||||
|
|
||||||

|

|
||||||
|
|||||||
Reference in New Issue
Block a user