From bfd03f8403321a2a91ffda9f3a976751b519f775 Mon Sep 17 00:00:00 2001 From: Kex Date: Sun, 28 Dec 2025 05:58:34 +0100 Subject: [PATCH 1/2] Limit requests to distance and loadtime entities --- .../ACE_Core/Player/SCR_PlayerController.c | 31 +++++++++++++++++++ .../Systems/ACE_LoadtimeEntityManager.c | 5 +-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/addons/core/scripts/Game/ACE_Core/Player/SCR_PlayerController.c b/addons/core/scripts/Game/ACE_Core/Player/SCR_PlayerController.c index 9983a06c3..9d2d3bc53 100644 --- a/addons/core/scripts/Game/ACE_Core/Player/SCR_PlayerController.c +++ b/addons/core/scripts/Game/ACE_Core/Player/SCR_PlayerController.c @@ -1,6 +1,8 @@ //------------------------------------------------------------------------------------------------ modded class SCR_PlayerController : PlayerController { + protected static const float ACE_MAX_DELETED_DISTANCE_M = 5; // Maximum distance for deletion requests to be granted + //------------------------------------------------------------------------------------------------ //! Request deletion of unreplicated entity from all machines //! Called from local player @@ -16,6 +18,13 @@ modded class SCR_PlayerController : PlayerController [RplRpc(RplChannel.Reliable, RplRcver.Server)] protected void RpcAsk_ACE_DeleteEntityByID(EntityID entityID) { + IEntity entity = GetGame().GetWorld().FindEntityByID(entityID); + if (!entity) + return; + + if (!ACE_IsDeletionGrantedByServer(entity)) + return; + ACE_LoadtimeEntityManager manager = ACE_LoadtimeEntityManager.GetInstance(); if (!manager) return; @@ -28,6 +37,8 @@ modded class SCR_PlayerController : PlayerController //! Called from local player void ACE_RequestDestroyEntity(SCR_DestructibleEntity entity, vector hitPosDirNorm[3], int deletionDelayMS = -1) { + + Rpc(RpcAsk_ACE_DestroyEntity, entity.GetID(), hitPosDirNorm, deletionDelayMS); } @@ -39,6 +50,9 @@ modded class SCR_PlayerController : PlayerController if (!entity) return; + if (!ACE_IsDeletionGrantedByServer(entity)) + return; + float health = entity.GetCurrentHealth(); if (health > 0) entity.HandleDamage(EDamageType.TRUE, health, hitPosDirNorm); @@ -57,6 +71,22 @@ modded class SCR_PlayerController : PlayerController GetGame().GetCallqueue().CallLater(manager.DeleteEntitiesByIdGlobal, deletionDelayMS, false, {entity.GetID()}); } + //------------------------------------------------------------------------------------------------ + //! Check whether player is allowed deleting the entity + protected bool ACE_IsDeletionGrantedByServer(IEntity entityToDelete) + { + // Only physical loadtime entities can be deleted + if (!entityToDelete || !entityToDelete.IsLoaded() || !entityToDelete.GetVObject()) + return false; + + SCR_ChimeraCharacter playerChar = SCR_ChimeraCharacter.Cast(GetControlledEntity()); + if (!playerChar) + return false; + + // Can only delete nearby entities + return (vector.Distance(playerChar.GetOrigin(), entityToDelete.GetOrigin()) <= ACE_MAX_DELETED_DISTANCE_M); + } + //------------------------------------------------------------------------------------------------ void ACE_RequestAnimateWithHelperCompartment(ACE_EAnimationHelperID helperID) { @@ -74,4 +104,5 @@ modded class SCR_PlayerController : PlayerController ACE_AnimationTools.AnimateWithHelperCompartment(helperID, char); } + } diff --git a/addons/core/scripts/Game/ACE_Core/Systems/ACE_LoadtimeEntityManager.c b/addons/core/scripts/Game/ACE_Core/Systems/ACE_LoadtimeEntityManager.c index 4e87ce1cd..5a5b6e327 100644 --- a/addons/core/scripts/Game/ACE_Core/Systems/ACE_LoadtimeEntityManager.c +++ b/addons/core/scripts/Game/ACE_Core/Systems/ACE_LoadtimeEntityManager.c @@ -25,7 +25,7 @@ class ACE_LoadtimeEntityManager : GameSystem //------------------------------------------------------------------------------------------------ //! Ensures that already deleted unreplicated entities are deleted for JIPs - void DeleteInitialEntities() + protected void DeleteInitialEntities() { foreach (ACE_EntityIdWrapper idWrapper : m_aDeletedEntityIDs) { @@ -68,8 +68,9 @@ class ACE_LoadtimeEntityManager : GameSystem //! Deletes unreplicated entity by ID on a local machine void DeleteEntityByIdLocal(EntityID entityID) { + // Only physical loadtime entities can be deleted IEntity entity = GetGame().GetWorld().FindEntityByID(entityID); - if (entity) + if (entity && entity.IsLoaded() && entity.GetVObject()) delete entity; } From 0566b53fc06ad35996b8d2b26128b8e15ccddb79 Mon Sep 17 00:00:00 2001 From: Kex Date: Sun, 28 Dec 2025 06:11:33 +0100 Subject: [PATCH 2/2] Remove extra newlines --- addons/core/scripts/Game/ACE_Core/Player/SCR_PlayerController.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/addons/core/scripts/Game/ACE_Core/Player/SCR_PlayerController.c b/addons/core/scripts/Game/ACE_Core/Player/SCR_PlayerController.c index 9d2d3bc53..b24198b98 100644 --- a/addons/core/scripts/Game/ACE_Core/Player/SCR_PlayerController.c +++ b/addons/core/scripts/Game/ACE_Core/Player/SCR_PlayerController.c @@ -37,8 +37,6 @@ modded class SCR_PlayerController : PlayerController //! Called from local player void ACE_RequestDestroyEntity(SCR_DestructibleEntity entity, vector hitPosDirNorm[3], int deletionDelayMS = -1) { - - Rpc(RpcAsk_ACE_DestroyEntity, entity.GetID(), hitPosDirNorm, deletionDelayMS); }