diff --git a/Generals/Code/GameEngine/Include/GameLogic/Module/CrateCollide.h b/Generals/Code/GameEngine/Include/GameLogic/Module/CrateCollide.h index d560519cd02..2903a7953e0 100644 --- a/Generals/Code/GameEngine/Include/GameLogic/Module/CrateCollide.h +++ b/Generals/Code/GameEngine/Include/GameLogic/Module/CrateCollide.h @@ -47,6 +47,7 @@ class CrateCollideModuleData : public CollideModuleData Bool m_isForbidOwnerPlayer; ///< This crate cannot be picked up by the player of the dead thing that made it. Bool m_isBuildingPickup; ///< This crate can be picked up by a Building (bypassing AI requirement) Bool m_isHumanOnlyPickup; ///< Can this crate only be picked up by a human player? (Mission thing) + Bool m_allowMultiPickup; ///< Can this crate be picked up by multiple objects on the same frame? ScienceType m_pickupScience; ///< Can only be picked up by a unit whose player has this science FXList *m_executeFX; ///< FXList to play when activated 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 5b3b3eb3900..b1e0285751e 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Collide/CrateCollide/CrateCollide.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Collide/CrateCollide/CrateCollide.cpp @@ -50,6 +50,7 @@ CrateCollideModuleData::CrateCollideModuleData() m_executeAnimationFades = TRUE; m_isBuildingPickup = FALSE; m_isHumanOnlyPickup = FALSE; + m_allowMultiPickup = FALSE; m_executeFX = nullptr; m_pickupScience = SCIENCE_INVALID; m_executionAnimationTemplate = AsciiString::TheEmptyString; @@ -68,6 +69,7 @@ void CrateCollideModuleData::buildFieldParse(MultiIniFieldParse& p) { "ForbidOwnerPlayer", INI::parseBool, nullptr, offsetof( CrateCollideModuleData, m_isForbidOwnerPlayer ) }, { "BuildingPickup", INI::parseBool, nullptr, offsetof( CrateCollideModuleData, m_isBuildingPickup ) }, { "HumanOnly", INI::parseBool, nullptr, offsetof( CrateCollideModuleData, m_isHumanOnlyPickup ) }, + { "AllowMultiPickup", INI::parseBool, nullptr, offsetof( CrateCollideModuleData, m_allowMultiPickup ) }, { "PickupScience", INI::parseScience, nullptr, offsetof( CrateCollideModuleData, m_pickupScience ) }, { "ExecuteFX", INI::parseFXList, nullptr, offsetof( CrateCollideModuleData, m_executeFX ) }, { "ExecuteAnimation", INI::parseAsciiString, nullptr, offsetof( CrateCollideModuleData, m_executionAnimationTemplate ) }, @@ -164,7 +166,7 @@ Bool CrateCollide::isValidToExecute( const Object *other ) const // 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()) + if (getObject()->isDestroyed() && !md->m_allowMultiPickup) return FALSE; #endif diff --git a/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/CrateCollide.h b/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/CrateCollide.h index 8cf17d8f14b..4156cfb6222 100644 --- a/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/CrateCollide.h +++ b/GeneralsMD/Code/GameEngine/Include/GameLogic/Module/CrateCollide.h @@ -47,6 +47,7 @@ class CrateCollideModuleData : public CollideModuleData Bool m_isForbidOwnerPlayer; ///< This crate cannot be picked up by the player of the dead thing that made it. Bool m_isBuildingPickup; ///< This crate can be picked up by a Building (bypassing AI requirement) Bool m_isHumanOnlyPickup; ///< Can this crate only be picked up by a human player? (Mission thing) + Bool m_allowMultiPickup; ///< Can this crate be picked up by multiple objects on the same frame? ScienceType m_pickupScience; ///< Can only be picked up by a unit whose player has this science FXList *m_executeFX; ///< FXList to play when activated 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 0dbabc28777..0c024d9cdec 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Collide/CrateCollide/CrateCollide.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Collide/CrateCollide/CrateCollide.cpp @@ -53,6 +53,7 @@ CrateCollideModuleData::CrateCollideModuleData() m_executeAnimationFades = TRUE; m_isBuildingPickup = FALSE; m_isHumanOnlyPickup = FALSE; + m_allowMultiPickup = FALSE; m_executeFX = nullptr; m_pickupScience = SCIENCE_INVALID; m_executionAnimationTemplate = AsciiString::TheEmptyString; @@ -71,6 +72,7 @@ void CrateCollideModuleData::buildFieldParse(MultiIniFieldParse& p) { "ForbidOwnerPlayer", INI::parseBool, nullptr, offsetof( CrateCollideModuleData, m_isForbidOwnerPlayer ) }, { "BuildingPickup", INI::parseBool, nullptr, offsetof( CrateCollideModuleData, m_isBuildingPickup ) }, { "HumanOnly", INI::parseBool, nullptr, offsetof( CrateCollideModuleData, m_isHumanOnlyPickup ) }, + { "AllowMultiPickup", INI::parseBool, nullptr, offsetof( CrateCollideModuleData, m_allowMultiPickup ) }, { "PickupScience", INI::parseScience, nullptr, offsetof( CrateCollideModuleData, m_pickupScience ) }, { "ExecuteFX", INI::parseFXList, nullptr, offsetof( CrateCollideModuleData, m_executeFX ) }, { "ExecuteAnimation", INI::parseAsciiString, nullptr, offsetof( CrateCollideModuleData, m_executionAnimationTemplate ) }, @@ -167,7 +169,7 @@ Bool CrateCollide::isValidToExecute( const Object *other ) const // 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()) + if (getObject()->isDestroyed() && !md->m_allowMultiPickup) return FALSE; #endif