From c61fd77d3ce6484849ab2d4990ebcd8d4ae56f85 Mon Sep 17 00:00:00 2001 From: Stubbjax Date: Tue, 10 Feb 2026 00:21:36 +1100 Subject: [PATCH] bugfix: Prevent crates from being collected multiple times in a single frame --- .../GameLogic/Object/Collide/CrateCollide/CrateCollide.cpp | 6 ++++++ .../GameLogic/Object/Collide/CrateCollide/CrateCollide.cpp | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Collide/CrateCollide/CrateCollide.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Collide/CrateCollide/CrateCollide.cpp index 8e2b5504616..5b3b3eb3900 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Collide/CrateCollide/CrateCollide.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Collide/CrateCollide/CrateCollide.cpp @@ -162,6 +162,12 @@ Bool CrateCollide::isValidToExecute( const Object *other ) const if( getObject()->isAboveTerrain() && !validBuildingAttempt ) return FALSE; + // TheSuperHackers @bugfix Stubbjax 09/02/2026 Prevent the crate from being collected multiple times in a single frame. +#if !RETAIL_COMPATIBLE_CRC + if (getObject()->isDestroyed()) + return FALSE; +#endif + if( md->m_isForbidOwnerPlayer && (getObject()->getControllingPlayer() == other->getControllingPlayer()) ) return FALSE; // Design has decreed this to not be picked up by the dead guy's team. diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Collide/CrateCollide/CrateCollide.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Collide/CrateCollide/CrateCollide.cpp index e81c884b836..0dbabc28777 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Collide/CrateCollide/CrateCollide.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Collide/CrateCollide/CrateCollide.cpp @@ -165,6 +165,12 @@ Bool CrateCollide::isValidToExecute( const Object *other ) const if( getObject()->isAboveTerrain() && !validBuildingAttempt ) return FALSE; + // TheSuperHackers @bugfix Stubbjax 09/02/2026 Prevent the crate from being collected multiple times in a single frame. +#if !RETAIL_COMPATIBLE_CRC + if (getObject()->isDestroyed()) + return FALSE; +#endif + if( md->m_isForbidOwnerPlayer && (getObject()->getControllingPlayer() == other->getControllingPlayer()) ) return FALSE; // Design has decreed this to not be picked up by the dead guy's team.