From 99fd6068694c2595d198f339ae801cd2e6a72a65 Mon Sep 17 00:00:00 2001 From: Stubbjax Date: Sun, 17 May 2026 20:46:27 +1000 Subject: [PATCH 1/3] bugfix: Prevent building crash damage from dealing damage to other objects --- .../GameLogic/Object/Update/PhysicsUpdate.cpp | 16 ++++++++++++++++ .../GameLogic/Object/Update/PhysicsUpdate.cpp | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/PhysicsUpdate.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/PhysicsUpdate.cpp index a56790b941f..dc637651b99 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/PhysicsUpdate.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/PhysicsUpdate.cpp @@ -34,6 +34,7 @@ #include "Common/PerfTimer.h" #include "Common/ThingTemplate.h" #include "Common/Xfer.h" +#include "GameClient/FXList.h" #include "GameLogic/GameLogic.h" #include "GameLogic/Module/AIUpdate.h" #include "GameLogic/Module/BodyModule.h" @@ -1252,7 +1253,22 @@ void PhysicsBehavior::onCollide( Object *other, const Coord3D *loc, const Coord3 // fall into a building. if a vehicle, blow up. then destroy ourself (not die), regardless. if (obj->isKindOf(KINDOF_VEHICLE)) { +#if RETAIL_COMPATIBLE_CRC TheWeaponStore->createAndFireTempWeapon(getPhysicsBehaviorModuleData()->m_vehicleCrashesIntoBuildingWeaponTemplate, obj, obj->getPosition()); +#else + // TheSuperHackers @bugfix Stubbjax 17/05/2026 Prevent building collisions from dealing collateral damage to other objects. + const WeaponTemplate* weaponTemplate = getPhysicsBehaviorModuleData()->m_vehicleCrashesIntoBuildingWeaponTemplate; + WeaponBonus nullBonus; + + DamageInfo damageInfo; + damageInfo.in.m_damageType = weaponTemplate->getDamageType(); + damageInfo.in.m_deathType = weaponTemplate->getDeathType(); + damageInfo.in.m_sourceID = obj->getID(); + damageInfo.in.m_amount = weaponTemplate->getPrimaryDamage(nullBonus); + + other->attemptDamage(&damageInfo); + FXList::doFXObj(weaponTemplate->getFireFX(obj->getVeterancyLevel()), obj); +#endif } TheGameLogic->destroyObject(obj); return; diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/PhysicsUpdate.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/PhysicsUpdate.cpp index ccc57226348..a21dc1c85aa 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/PhysicsUpdate.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/PhysicsUpdate.cpp @@ -34,6 +34,7 @@ #include "Common/PerfTimer.h" #include "Common/ThingTemplate.h" #include "Common/Xfer.h" +#include "GameClient/FXList.h" #include "GameLogic/GameLogic.h" #include "GameLogic/Module/AIUpdate.h" #include "GameLogic/Module/BodyModule.h" @@ -1377,7 +1378,22 @@ void PhysicsBehavior::onCollide( Object *other, const Coord3D *loc, const Coord3 // fall into a building. if a vehicle, blow up. then destroy ourself (not die), regardless. if (obj->isKindOf(KINDOF_VEHICLE)) { +#if RETAIL_COMPATIBLE_CRC TheWeaponStore->createAndFireTempWeapon(getPhysicsBehaviorModuleData()->m_vehicleCrashesIntoBuildingWeaponTemplate, obj, obj->getPosition()); +#else + // TheSuperHackers @bugfix Stubbjax 17/05/2026 Prevent building collisions from dealing collateral damage to other objects. + const WeaponTemplate* weaponTemplate = getPhysicsBehaviorModuleData()->m_vehicleCrashesIntoBuildingWeaponTemplate; + WeaponBonus nullBonus; + + DamageInfo damageInfo; + damageInfo.in.m_damageType = weaponTemplate->getDamageType(); + damageInfo.in.m_deathType = weaponTemplate->getDeathType(); + damageInfo.in.m_sourceID = obj->getID(); + damageInfo.in.m_amount = weaponTemplate->getPrimaryDamage(nullBonus); + + other->attemptDamage(&damageInfo); + FXList::doFXObj(weaponTemplate->getFireFX(obj->getVeterancyLevel()), obj); +#endif } TheGameLogic->destroyObject(obj); return; From a6ffb523c21c8a075ddacf65032694510c0c88a3 Mon Sep 17 00:00:00 2001 From: Stubbjax Date: Sun, 17 May 2026 21:10:14 +1000 Subject: [PATCH 2/3] tweak: Add null checks --- .../GameLogic/Object/Update/PhysicsUpdate.cpp | 23 +++++++++++-------- .../GameLogic/Object/Update/PhysicsUpdate.cpp | 23 +++++++++++-------- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/PhysicsUpdate.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/PhysicsUpdate.cpp index dc637651b99..d2700e09c9b 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/PhysicsUpdate.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/PhysicsUpdate.cpp @@ -1258,16 +1258,19 @@ void PhysicsBehavior::onCollide( Object *other, const Coord3D *loc, const Coord3 #else // TheSuperHackers @bugfix Stubbjax 17/05/2026 Prevent building collisions from dealing collateral damage to other objects. const WeaponTemplate* weaponTemplate = getPhysicsBehaviorModuleData()->m_vehicleCrashesIntoBuildingWeaponTemplate; - WeaponBonus nullBonus; - - DamageInfo damageInfo; - damageInfo.in.m_damageType = weaponTemplate->getDamageType(); - damageInfo.in.m_deathType = weaponTemplate->getDeathType(); - damageInfo.in.m_sourceID = obj->getID(); - damageInfo.in.m_amount = weaponTemplate->getPrimaryDamage(nullBonus); - - other->attemptDamage(&damageInfo); - FXList::doFXObj(weaponTemplate->getFireFX(obj->getVeterancyLevel()), obj); + if (weaponTemplate != nullptr) + { + WeaponBonus nullBonus; + + DamageInfo damageInfo; + damageInfo.in.m_damageType = weaponTemplate->getDamageType(); + damageInfo.in.m_deathType = weaponTemplate->getDeathType(); + damageInfo.in.m_sourceID = obj->getID(); + damageInfo.in.m_amount = weaponTemplate->getPrimaryDamage(nullBonus); + + other->attemptDamage(&damageInfo); + FXList::doFXObj(weaponTemplate->getFireFX(obj->getVeterancyLevel()), obj); + } #endif } TheGameLogic->destroyObject(obj); diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/PhysicsUpdate.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/PhysicsUpdate.cpp index a21dc1c85aa..726b81dfc23 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/PhysicsUpdate.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/PhysicsUpdate.cpp @@ -1383,16 +1383,19 @@ void PhysicsBehavior::onCollide( Object *other, const Coord3D *loc, const Coord3 #else // TheSuperHackers @bugfix Stubbjax 17/05/2026 Prevent building collisions from dealing collateral damage to other objects. const WeaponTemplate* weaponTemplate = getPhysicsBehaviorModuleData()->m_vehicleCrashesIntoBuildingWeaponTemplate; - WeaponBonus nullBonus; - - DamageInfo damageInfo; - damageInfo.in.m_damageType = weaponTemplate->getDamageType(); - damageInfo.in.m_deathType = weaponTemplate->getDeathType(); - damageInfo.in.m_sourceID = obj->getID(); - damageInfo.in.m_amount = weaponTemplate->getPrimaryDamage(nullBonus); - - other->attemptDamage(&damageInfo); - FXList::doFXObj(weaponTemplate->getFireFX(obj->getVeterancyLevel()), obj); + if (weaponTemplate != nullptr) + { + WeaponBonus nullBonus; + + DamageInfo damageInfo; + damageInfo.in.m_damageType = weaponTemplate->getDamageType(); + damageInfo.in.m_deathType = weaponTemplate->getDeathType(); + damageInfo.in.m_sourceID = obj->getID(); + damageInfo.in.m_amount = weaponTemplate->getPrimaryDamage(nullBonus); + + other->attemptDamage(&damageInfo); + FXList::doFXObj(weaponTemplate->getFireFX(obj->getVeterancyLevel()), obj); + } #endif } TheGameLogic->destroyObject(obj); From 439ebf384d4bc878e0b8435c409fbd0a782c5064 Mon Sep 17 00:00:00 2001 From: Stubbjax Date: Sun, 17 May 2026 21:51:48 +1000 Subject: [PATCH 3/3] tweak: Assign source player mask --- .../GameEngine/Source/GameLogic/Object/Update/PhysicsUpdate.cpp | 2 ++ .../GameEngine/Source/GameLogic/Object/Update/PhysicsUpdate.cpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/PhysicsUpdate.cpp b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/PhysicsUpdate.cpp index d2700e09c9b..569b4f96f57 100644 --- a/Generals/Code/GameEngine/Source/GameLogic/Object/Update/PhysicsUpdate.cpp +++ b/Generals/Code/GameEngine/Source/GameLogic/Object/Update/PhysicsUpdate.cpp @@ -32,6 +32,7 @@ #define NO_DEBUG_CRC #include "Common/PerfTimer.h" +#include "Common/Player.h" #include "Common/ThingTemplate.h" #include "Common/Xfer.h" #include "GameClient/FXList.h" @@ -1266,6 +1267,7 @@ void PhysicsBehavior::onCollide( Object *other, const Coord3D *loc, const Coord3 damageInfo.in.m_damageType = weaponTemplate->getDamageType(); damageInfo.in.m_deathType = weaponTemplate->getDeathType(); damageInfo.in.m_sourceID = obj->getID(); + damageInfo.in.m_sourcePlayerMask = obj->getControllingPlayer() ? obj->getControllingPlayer()->getPlayerMask() : 0; damageInfo.in.m_amount = weaponTemplate->getPrimaryDamage(nullBonus); other->attemptDamage(&damageInfo); diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/PhysicsUpdate.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/PhysicsUpdate.cpp index 726b81dfc23..1dd6adfd57c 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/PhysicsUpdate.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/PhysicsUpdate.cpp @@ -32,6 +32,7 @@ #define NO_DEBUG_CRC #include "Common/PerfTimer.h" +#include "Common/Player.h" #include "Common/ThingTemplate.h" #include "Common/Xfer.h" #include "GameClient/FXList.h" @@ -1391,6 +1392,7 @@ void PhysicsBehavior::onCollide( Object *other, const Coord3D *loc, const Coord3 damageInfo.in.m_damageType = weaponTemplate->getDamageType(); damageInfo.in.m_deathType = weaponTemplate->getDeathType(); damageInfo.in.m_sourceID = obj->getID(); + damageInfo.in.m_sourcePlayerMask = obj->getControllingPlayer() ? obj->getControllingPlayer()->getPlayerMask() : 0; damageInfo.in.m_amount = weaponTemplate->getPrimaryDamage(nullBonus); other->attemptDamage(&damageInfo);