From 3aab2efb9facca88077a7be0563eccc046fec1a9 Mon Sep 17 00:00:00 2001 From: Gray <84999745+Milxnor@users.noreply.github.com> Date: Fri, 6 Jun 2025 17:08:16 -0400 Subject: [PATCH] Edit Bug fix + cheat ckd thingf --- Project Reboot 3.0/BuildingSMActor.h | 2 + Project Reboot 3.0/FortPlayerController.cpp | 42 ++++++++++++++++++++- Project Reboot 3.0/commands.cpp | 12 ++++-- Project Reboot 3.0/gui.h | 2 + 4 files changed, 52 insertions(+), 6 deletions(-) diff --git a/Project Reboot 3.0/BuildingSMActor.h b/Project Reboot 3.0/BuildingSMActor.h index dfb2a74..11a6ee4 100644 --- a/Project Reboot 3.0/BuildingSMActor.h +++ b/Project Reboot 3.0/BuildingSMActor.h @@ -50,9 +50,11 @@ public: void SetEditingPlayer(APlayerState* NewEditingPlayer) // actually AFortPlayerStateZone { + /* if (// AActor::HasAuthority() && (!GetEditingPlayer() || !NewEditingPlayer) ) + */ { SetNetDormancy((ENetDormancy)(2 - (NewEditingPlayer != 0))); ForceNetUpdate(); diff --git a/Project Reboot 3.0/FortPlayerController.cpp b/Project Reboot 3.0/FortPlayerController.cpp index d5e5d1e..293e7f8 100644 --- a/Project Reboot 3.0/FortPlayerController.cpp +++ b/Project Reboot 3.0/FortPlayerController.cpp @@ -1681,6 +1681,8 @@ void AFortPlayerController::ClientOnPawnDiedHook(AFortPlayerController* PlayerCo void AFortPlayerController::ServerBeginEditingBuildingActorHook(AFortPlayerController* PlayerController, ABuildingSMActor* BuildingActorToEdit) { + // LOG_INFO(LogDev, "ServerBeginEditingBuildingActorHook!"); + if (!BuildingActorToEdit || !BuildingActorToEdit->IsPlayerPlaced()) // We need more checks. return; @@ -1709,18 +1711,23 @@ void AFortPlayerController::ServerBeginEditingBuildingActorHook(AFortPlayerContr Pawn->EquipWeaponDefinition(EditToolDef, EditToolInstance->GetItemEntry()->GetItemGuid()); auto EditTool = Cast(Pawn->GetCurrentWeapon()); + // LOG_INFO(LogDev, "[Begin {}] EditTool: {}!", BuildingActorToEdit->GetFullName(), __int64(EditTool)); if (!EditTool) return; EditTool->GetEditActor() = BuildingActorToEdit; - // EditTool->OnRep_EditActor(); + EditTool->OnRep_EditActor(); BuildingActorToEdit->SetEditingPlayer(PlayerState); + + // LOG_INFO(LogDev, "[Begin] Updating Editing player to: {}!", __int64(PlayerState)); } void AFortPlayerController::ServerEditBuildingActorHook(UObject* Context, FFrame& Stack, void* Ret) { + // LOG_INFO(LogDev, "ServerEditBuildingActorHook!"); + auto PlayerController = (AFortPlayerController*)Context; auto PlayerState = (AFortPlayerState*)PlayerController->GetPlayerState(); @@ -1762,11 +1769,41 @@ void AFortPlayerController::ServerEditBuildingActorHook(UObject* Context, FFrame // we should do more things here + // we need to set editactor and stuff because on newer builds ServerEndEditingBuildingActor doesnt get callered + BuildingActorToEdit->SetEditingPlayer(nullptr); + auto Pawn = PlayerController->GetMyFortPawn(); + + if (!Pawn) + return ServerEditBuildingActorOriginal(Context, Stack, Ret); + + static auto EditToolDef = FindObject(L"/Game/Items/Weapons/BuildingTools/EditTool.EditTool"); + + auto WorldInventory = PlayerController->GetWorldInventory(); + + if (!WorldInventory) + return ServerEditBuildingActorOriginal(Context, Stack, Ret); + + auto EditToolInstance = WorldInventory->FindItemInstance(EditToolDef); + + if (!EditToolInstance) + return ServerEditBuildingActorOriginal(Context, Stack, Ret); + + Pawn->EquipWeaponDefinition(EditToolDef, EditToolInstance->GetItemEntry()->GetItemGuid()); + + auto EditTool = Cast(Pawn->GetCurrentWeapon()); + // LOG_INFO(LogDev, "EditTool: {}", __int64(EditTool)); + + if (EditTool) + { + EditTool->GetEditActor() = nullptr; + } + return ServerEditBuildingActorOriginal(Context, Stack, Ret); } void AFortPlayerController::ServerEndEditingBuildingActorHook(AFortPlayerController* PlayerController, ABuildingSMActor* BuildingActorToStopEditing) { + // LOG_INFO(LogDev, "[{}] ServerEndEditingBuildingActorHook EditiNgplAyer: {}!", BuildingActorToStopEditing ? BuildingActorToStopEditing->GetFullName() : "NULL", BuildingActorToStopEditing ? __int64(BuildingActorToStopEditing->GetEditingPlayer()) : -1); auto Pawn = PlayerController->GetMyFortPawn(); if (!BuildingActorToStopEditing || !Pawn @@ -1788,7 +1825,8 @@ void AFortPlayerController::ServerEndEditingBuildingActorHook(AFortPlayerControl if (!EditToolInstance) return; - // Pawn->EquipWeaponDefinition(EditToolDef, EditToolInstance->GetItemEntry()->GetItemGuid()); + // LOG_INFO(LogDev, "EditTool BEFORE: {}", __int64(Cast(Pawn->GetCurrentWeapon()))); + Pawn->EquipWeaponDefinition(EditToolDef, EditToolInstance->GetItemEntry()->GetItemGuid()); auto EditTool = Cast(Pawn->GetCurrentWeapon()); diff --git a/Project Reboot 3.0/commands.cpp b/Project Reboot 3.0/commands.cpp index 64bc20b..f71cd7a 100644 --- a/Project Reboot 3.0/commands.cpp +++ b/Project Reboot 3.0/commands.cpp @@ -4,8 +4,9 @@ void ServerCheatHook(AFortPlayerControllerAthena* PlayerController, FString Msg) { - if (!Msg.Data.Data || Msg.Data.Num() <= 0) - return; + bool isMsgEmpty = !Msg.Data.Data || Msg.Data.Num() <= 0; + // if (isMsgEmpty) + // return; auto PlayerState = Cast(PlayerController->GetPlayerState()); @@ -15,7 +16,9 @@ void ServerCheatHook(AFortPlayerControllerAthena* PlayerController, FString Msg) return; std::vector Arguments; - auto OldMsg = Msg.ToString(); + std::string OldMsg = ""; + if (!isMsgEmpty) + OldMsg = Msg.ToString(); auto ReceivingController = PlayerController; // for now auto ReceivingPlayerState = PlayerState; // for now @@ -73,6 +76,7 @@ void ServerCheatHook(AFortPlayerControllerAthena* PlayerController, FString Msg) return; } + if (!isMsgEmpty) { auto Message = Msg.ToString(); @@ -118,7 +122,7 @@ void ServerCheatHook(AFortPlayerControllerAthena* PlayerController, FString Msg) // return; - bool bSendHelpMessage = false; + bool bSendHelpMessage = isMsgEmpty; auto GameState = Cast(GetWorld()->GetGameState()); auto GameMode = Cast(GetWorld()->GetGameMode()); diff --git a/Project Reboot 3.0/gui.h b/Project Reboot 3.0/gui.h index 977899c..e095582 100644 --- a/Project Reboot 3.0/gui.h +++ b/Project Reboot 3.0/gui.h @@ -337,6 +337,8 @@ static inline void StaticUI() if (ImGui::Checkbox("Log ProcessEvent", &Globals::bLogProcessEvent)) { // todo toggle hook + // this is lowkey highkey a race.. so i hope this below will fix ? idk im confused + UObject::ProcessEventOriginal = decltype(UObject::ProcessEventOriginal)(Addresses::ProcessEvent); Hooking::MinHook::Hook((PVOID)Addresses::ProcessEvent, ProcessEventHook, (PVOID*)&UObject::ProcessEventOriginal); } }