#include "FortPlayerController.h" #include "Rotator.h" #include "BuildingSMActor.h" #include "FortGameModeAthena.h" #include "FortPlayerState.h" #include "BuildingWeapons.h" #include "ActorComponent.h" void AFortPlayerController::ServerAttemptAircraftJumpHook(AFortPlayerController* PC, FRotator ClientRotation) { auto PlayerController = Cast(Engine_Version < 424 ? PC : ((UActorComponent*)PC)->GetOwner()); LOG_INFO(LogDev, "PlayerController: {}", __int64(PlayerController)); if (!PlayerController) return; // if (!PlayerController->bInAircraft) // return; auto GameMode = (AFortGameModeAthena*)GetWorld()->GetGameMode(); auto GameState = GameMode->GetGameStateAthena(); static auto AircraftsOffset = GameState->GetOffset("Aircrafts"); auto Aircrafts = GameState->GetPtr>(AircraftsOffset); if (Aircrafts->Num() <= 0) return; auto NewPawn = GameMode->SpawnDefaultPawnForHook(GameMode, (AController*)PlayerController, Aircrafts->at(0)); PlayerController->Possess(NewPawn); // PC->ServerRestartPlayer(); } void AFortPlayerController::ServerCreateBuildingActorHook(AFortPlayerController* PlayerController, FCreateBuildingActorData CreateBuildingData) { UClass* BuildingClass = nullptr; FVector BuildLocation; FRotator BuildRotator; bool bMirrored; if (Fortnite_Version >= 8.30) { BuildLocation = CreateBuildingData.BuildLoc; BuildRotator = CreateBuildingData.BuildRot; bMirrored = CreateBuildingData.bMirrored; static auto BroadcastRemoteClientInfoOffset = PlayerController->GetOffset("BroadcastRemoteClientInfo"); auto BroadcastRemoteClientInfo = PlayerController->Get(BroadcastRemoteClientInfoOffset); static auto RemoteBuildableClassOffset = BroadcastRemoteClientInfo->GetOffset("RemoteBuildableClass"); BuildingClass = BroadcastRemoteClientInfo->Get(RemoteBuildableClassOffset); } else { } // LOG_INFO(LogDev, "BuildingClass {}", __int64(BuildingClass)); if (!BuildingClass) return; TArray ExistingBuildings; char idk; static __int64 (*CantBuild)(UObject*, UObject*, FVector, FRotator, char, TArray*, char*) = decltype(CantBuild)(Addresses::CantBuild); bool bCanBuild = !CantBuild(GetWorld(), BuildingClass, BuildLocation, BuildRotator, bMirrored, &ExistingBuildings, &idk); if (!bCanBuild) { // LOG_INFO(LogDev, "cant build"); return; } for (int i = 0; i < ExistingBuildings.Num(); i++) { auto ExistingBuilding = ExistingBuildings.At(i); ExistingBuilding->K2_DestroyActor(); } FTransform Transform{}; Transform.Translation = BuildLocation; Transform.Rotation = BuildRotator.Quaternion(); Transform.Scale3D = { 1, 1, 1 }; auto BuildingActor = GetWorld()->SpawnActor(BuildingClass, Transform); if (!BuildingActor) return; BuildingActor->InitializeBuildingActor(PlayerController, BuildingActor, true); } void AFortPlayerController::ServerBeginEditingBuildingActorHook(AFortPlayerController* PlayerController, ABuildingSMActor* BuildingActorToEdit) { if (!BuildingActorToEdit || !BuildingActorToEdit->IsPlayerPlaced()) return; auto Pawn = Cast(PlayerController->GetPawn(), false); if (!Pawn) return; static auto EditToolDef = FindObject("/Game/Items/Weapons/BuildingTools/EditTool.EditTool"); if (auto EditTool = Cast(Pawn->EquipWeaponDefinition(EditToolDef, FGuid{}))) { BuildingActorToEdit->GetEditingPlayer() = PlayerController->GetPlayerState(); // Onrep? EditTool->GetEditActor() = BuildingActorToEdit; // Onrep? } } void AFortPlayerController::ServerEditBuildingActorHook(AFortPlayerController* PlayerController, ABuildingSMActor* BuildingActorToEdit, UClass* NewBuildingClass, int RotationIterations, char bMirrored) { auto PlayerState = (AFortPlayerState*)PlayerController->GetPlayerState(); if (!BuildingActorToEdit || !NewBuildingClass || BuildingActorToEdit->IsDestroyed() || BuildingActorToEdit->GetEditingPlayer() != PlayerState) return; // if (!PlayerState || PlayerState->GetTeamIndex() != BuildingActorToEdit->GetTeamIndex()) // return; BuildingActorToEdit->GetEditingPlayer() = nullptr; static ABuildingSMActor* (*BuildingSMActorReplaceBuildingActor)(ABuildingSMActor*, __int64, UClass*, int, int, uint8_t, AFortPlayerController*) = decltype(BuildingSMActorReplaceBuildingActor)(Addresses::ReplaceBuildingActor); if (auto BuildingActor = BuildingSMActorReplaceBuildingActor(BuildingActorToEdit, 1, NewBuildingClass, BuildingActorToEdit->GetCurrentBuildingLevel(), RotationIterations, bMirrored, PlayerController)) { BuildingActor->SetPlayerPlaced(true); // if (auto PlayerState = Cast(PlayerController->PlayerState)) // BuildingActor->SetTeam(PlayerState->TeamIndex); // BuildingActor->OnRep_Team(); } } void AFortPlayerController::ServerEndEditingBuildingActorHook(AFortPlayerController* PlayerController, ABuildingSMActor* BuildingActorToStopEditing) { auto Pawn = PlayerController->GetMyFortPawn(); if (!BuildingActorToStopEditing || !Pawn // || BuildingActorToStopEditing->EditingPlayer != PlayerController->PlayerState || BuildingActorToStopEditing->IsDestroyed()) return; auto EditTool = Cast(Pawn->GetCurrentWeapon()); BuildingActorToStopEditing->GetEditingPlayer() = nullptr; // BuildingActorToStopEditing->OnRep_EditingPlayer(); if (EditTool) { // EditTool->bEditConfirmed = true; EditTool->GetEditActor() = nullptr; // EditTool->OnRep_EditActor(); } }