Skip to content

Commit f8476f0

Browse files
authored
bugfix(physics): Prevent building crash damage from dealing damage to other objects (TheSuperHackers#2723)
1 parent 1594474 commit f8476f0

2 files changed

Lines changed: 38 additions & 0 deletions

File tree

Generals/Code/GameEngine/Source/GameLogic/Object/Update/PhysicsUpdate.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1254,7 +1254,26 @@ void PhysicsBehavior::onCollide( Object *other, const Coord3D *loc, const Coord3
12541254
// fall into a building. if a vehicle, blow up. then destroy ourself (not die), regardless.
12551255
if (obj->isKindOf(KINDOF_VEHICLE))
12561256
{
1257+
#if RETAIL_COMPATIBLE_CRC
12571258
TheWeaponStore->createAndFireTempWeapon(getPhysicsBehaviorModuleData()->m_vehicleCrashesIntoBuildingWeaponTemplate, obj, obj->getPosition());
1259+
#else
1260+
// TheSuperHackers @bugfix Stubbjax 17/05/2026 Prevent building collisions from dealing collateral damage to other objects.
1261+
const WeaponTemplate* weaponTemplate = getPhysicsBehaviorModuleData()->m_vehicleCrashesIntoBuildingWeaponTemplate;
1262+
if (weaponTemplate != nullptr)
1263+
{
1264+
WeaponBonus nullBonus;
1265+
1266+
DamageInfo damageInfo;
1267+
damageInfo.in.m_damageType = weaponTemplate->getDamageType();
1268+
damageInfo.in.m_deathType = weaponTemplate->getDeathType();
1269+
damageInfo.in.m_sourceID = obj->getID();
1270+
damageInfo.in.m_sourcePlayerMask = obj->getControllingPlayer() ? obj->getControllingPlayer()->getPlayerMask() : 0;
1271+
damageInfo.in.m_amount = weaponTemplate->getPrimaryDamage(nullBonus);
1272+
1273+
other->attemptDamage(&damageInfo);
1274+
FXList::doFXObj(weaponTemplate->getFireFX(obj->getVeterancyLevel()), obj);
1275+
}
1276+
#endif
12581277
}
12591278
TheGameLogic->destroyObject(obj);
12601279
return;

GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/PhysicsUpdate.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1379,7 +1379,26 @@ void PhysicsBehavior::onCollide( Object *other, const Coord3D *loc, const Coord3
13791379
// fall into a building. if a vehicle, blow up. then destroy ourself (not die), regardless.
13801380
if (obj->isKindOf(KINDOF_VEHICLE))
13811381
{
1382+
#if RETAIL_COMPATIBLE_CRC
13821383
TheWeaponStore->createAndFireTempWeapon(getPhysicsBehaviorModuleData()->m_vehicleCrashesIntoBuildingWeaponTemplate, obj, obj->getPosition());
1384+
#else
1385+
// TheSuperHackers @bugfix Stubbjax 17/05/2026 Prevent building collisions from dealing collateral damage to other objects.
1386+
const WeaponTemplate* weaponTemplate = getPhysicsBehaviorModuleData()->m_vehicleCrashesIntoBuildingWeaponTemplate;
1387+
if (weaponTemplate != nullptr)
1388+
{
1389+
WeaponBonus nullBonus;
1390+
1391+
DamageInfo damageInfo;
1392+
damageInfo.in.m_damageType = weaponTemplate->getDamageType();
1393+
damageInfo.in.m_deathType = weaponTemplate->getDeathType();
1394+
damageInfo.in.m_sourceID = obj->getID();
1395+
damageInfo.in.m_sourcePlayerMask = obj->getControllingPlayer() ? obj->getControllingPlayer()->getPlayerMask() : 0;
1396+
damageInfo.in.m_amount = weaponTemplate->getPrimaryDamage(nullBonus);
1397+
1398+
other->attemptDamage(&damageInfo);
1399+
FXList::doFXObj(weaponTemplate->getFireFX(obj->getVeterancyLevel()), obj);
1400+
}
1401+
#endif
13831402
}
13841403
TheGameLogic->destroyObject(obj);
13851404
return;

0 commit comments

Comments
 (0)