From 36450cba39ff93c42e719e4960e97f5a4883c31d Mon Sep 17 00:00:00 2001 From: SnailPerson <97041048+SnailPerson@users.noreply.github.com> Date: Mon, 16 Mar 2026 20:52:19 +0100 Subject: [PATCH 01/11] Update BuilderEntityExisting.java --- .../main/java/mcinterface1201/BuilderEntityExisting.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mcinterfaceforge1201/src/main/java/mcinterface1201/BuilderEntityExisting.java b/mcinterfaceforge1201/src/main/java/mcinterface1201/BuilderEntityExisting.java index 6ec54dfb2..ac17578a4 100644 --- a/mcinterfaceforge1201/src/main/java/mcinterface1201/BuilderEntityExisting.java +++ b/mcinterfaceforge1201/src/main/java/mcinterface1201/BuilderEntityExisting.java @@ -178,11 +178,13 @@ public boolean hurt(DamageSource source, float amount) { if (lastExplosionPosition != null && source.is(DamageTypeTags.IS_EXPLOSION)) { //We encountered an explosion. These may or may not have have entities linked to them. Depends on if //it's a player firing a gun that had a bullet, or a random TNT lighting in the world. - //Explosions, unlike other damage sources, can hit multiple collision boxes on an entity at once. + //Explosions can hit multiple boxes at once. Apply damage once to the core entity to prevent + //parts from forwarding duplicate explosive damage back into the same vehicle. BoundingBox explosiveBounds = new BoundingBox(lastExplosionPosition, amount, amount, amount); for (BoundingBox box : interactAttackBoxes.getBoxes()) { if (box.intersects(explosiveBounds)) { - multipart.attack(new Damage(amount, box, null, playerSource, null).setExplosive()); + multipart.attack(new Damage(amount, null, null, playerSource, null).setExplosive()); + break; } } lastExplosionPosition = null; From b2c136d257d0906839651fd03df42fd5d4338f4d Mon Sep 17 00:00:00 2001 From: SnailPerson <97041048+SnailPerson@users.noreply.github.com> Date: Mon, 16 Mar 2026 20:54:40 +0100 Subject: [PATCH 02/11] Update BuilderEntityExisting.java --- .../main/java/mcinterface1192/BuilderEntityExisting.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mcinterfaceforge1192/src/main/java/mcinterface1192/BuilderEntityExisting.java b/mcinterfaceforge1192/src/main/java/mcinterface1192/BuilderEntityExisting.java index 3e75364a8..843f03fc2 100644 --- a/mcinterfaceforge1192/src/main/java/mcinterface1192/BuilderEntityExisting.java +++ b/mcinterfaceforge1192/src/main/java/mcinterface1192/BuilderEntityExisting.java @@ -177,11 +177,13 @@ public boolean hurt(DamageSource source, float amount) { if (lastExplosionPosition != null && source.isExplosion()) { //We encountered an explosion. These may or may not have have entities linked to them. Depends on if //it's a player firing a gun that had a bullet, or a random TNT lighting in the world. - //Explosions, unlike other damage sources, can hit multiple collision boxes on an entity at once. + //Explosions can hit multiple boxes at once. Apply damage once to the core entity to prevent + //parts from forwarding duplicate explosive damage back into the same vehicle. BoundingBox explosiveBounds = new BoundingBox(lastExplosionPosition, amount, amount, amount); for (BoundingBox box : interactAttackBoxes.getBoxes()) { if (box.intersects(explosiveBounds)) { - multipart.attack(new Damage(amount, box, null, playerSource, null).setExplosive()); + multipart.attack(new Damage(amount, null, null, playerSource, null).setExplosive()); + break; } } lastExplosionPosition = null; From d733a3e3c70bf7075a2f46a6e889870c3d5c1f6c Mon Sep 17 00:00:00 2001 From: SnailPerson <97041048+SnailPerson@users.noreply.github.com> Date: Mon, 16 Mar 2026 20:55:32 +0100 Subject: [PATCH 03/11] Update BuilderEntityExisting.java --- .../main/java/mcinterface1182/BuilderEntityExisting.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mcinterfaceforge1182/src/main/java/mcinterface1182/BuilderEntityExisting.java b/mcinterfaceforge1182/src/main/java/mcinterface1182/BuilderEntityExisting.java index 992018856..995249f65 100644 --- a/mcinterfaceforge1182/src/main/java/mcinterface1182/BuilderEntityExisting.java +++ b/mcinterfaceforge1182/src/main/java/mcinterface1182/BuilderEntityExisting.java @@ -177,11 +177,13 @@ public boolean hurt(DamageSource source, float amount) { if (lastExplosionPosition != null && source.isExplosion()) { //We encountered an explosion. These may or may not have have entities linked to them. Depends on if //it's a player firing a gun that had a bullet, or a random TNT lighting in the world. - //Explosions, unlike other damage sources, can hit multiple collision boxes on an entity at once. + //Explosions can hit multiple boxes at once. Apply damage once to the core entity to prevent + //parts from forwarding duplicate explosive damage back into the same vehicle. BoundingBox explosiveBounds = new BoundingBox(lastExplosionPosition, amount, amount, amount); for (BoundingBox box : interactAttackBoxes.getBoxes()) { if (box.intersects(explosiveBounds)) { - multipart.attack(new Damage(amount, box, null, playerSource, null).setExplosive()); + multipart.attack(new Damage(amount, null, null, playerSource, null).setExplosive()); + break; } } lastExplosionPosition = null; From cd0d07521959c1fd2630bc864f2cebe3f0fc2927 Mon Sep 17 00:00:00 2001 From: SnailPerson <97041048+SnailPerson@users.noreply.github.com> Date: Mon, 16 Mar 2026 20:56:37 +0100 Subject: [PATCH 04/11] Update BuilderEntityExisting.java --- .../main/java/mcinterface1165/BuilderEntityExisting.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mcinterfaceforge1165/src/main/java/mcinterface1165/BuilderEntityExisting.java b/mcinterfaceforge1165/src/main/java/mcinterface1165/BuilderEntityExisting.java index 6897175f5..7f5921ab1 100644 --- a/mcinterfaceforge1165/src/main/java/mcinterface1165/BuilderEntityExisting.java +++ b/mcinterfaceforge1165/src/main/java/mcinterface1165/BuilderEntityExisting.java @@ -174,11 +174,13 @@ public boolean hurt(DamageSource source, float amount) { if (lastExplosionPosition != null && source.isExplosion()) { //We encountered an explosion. These may or may not have have entities linked to them. Depends on if //it's a player firing a gun that had a bullet, or a random TNT lighting in the world. - //Explosions, unlike other damage sources, can hit multiple collision boxes on an entity at once. + //Explosions can hit multiple boxes at once. Apply damage once to the core entity to prevent + //parts from forwarding duplicate explosive damage back into the same vehicle. BoundingBox explosiveBounds = new BoundingBox(lastExplosionPosition, amount, amount, amount); for (BoundingBox box : interactAttackBoxes.getBoxes()) { if (box.intersects(explosiveBounds)) { - multipart.attack(new Damage(amount, box, null, playerSource, null).setExplosive()); + multipart.attack(new Damage(amount, null, null, playerSource, null).setExplosive()); + break; } } lastExplosionPosition = null; From ceb907d7d77ab292cc7ea829cd832e23f8131602 Mon Sep 17 00:00:00 2001 From: SnailPerson <97041048+SnailPerson@users.noreply.github.com> Date: Mon, 16 Mar 2026 20:57:35 +0100 Subject: [PATCH 05/11] Update BuilderEntityExisting.java --- .../main/java/mcinterface1122/BuilderEntityExisting.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mcinterfaceforge1122/src/main/java/mcinterface1122/BuilderEntityExisting.java b/mcinterfaceforge1122/src/main/java/mcinterface1122/BuilderEntityExisting.java index 1dcef4274..f856094cc 100644 --- a/mcinterfaceforge1122/src/main/java/mcinterface1122/BuilderEntityExisting.java +++ b/mcinterfaceforge1122/src/main/java/mcinterface1122/BuilderEntityExisting.java @@ -174,11 +174,13 @@ public boolean attackEntityFrom(DamageSource source, float amount) { if (lastExplosionPosition != null && source.isExplosion()) { //We encountered an explosion. These may or may not have have entities linked to them. Depends on if //it's a player firing a gun that had a bullet, or a random TNT lighting in the world. - //Explosions, unlike other damage sources, can hit multiple collision boxes on an entity at once. + //Explosions can hit multiple boxes at once. Apply damage once to the core entity to prevent + //parts from forwarding duplicate explosive damage back into the same vehicle. BoundingBox explosiveBounds = new BoundingBox(lastExplosionPosition, amount, amount, amount); for (BoundingBox box : interactAttackBoxes.getBoxes()) { if (box.intersects(explosiveBounds)) { - multipart.attack(new Damage(amount, box, null, playerSource, null).setExplosive()); + multipart.attack(new Damage(amount, null, null, playerSource, null).setExplosive()); + break; } } lastExplosionPosition = null; From ce8ee3bdaf442f0642fde5ea69dfe7c241b16252 Mon Sep 17 00:00:00 2001 From: SnailPerson <97041048+SnailPerson@users.noreply.github.com> Date: Mon, 16 Mar 2026 21:30:36 +0100 Subject: [PATCH 06/11] Update JSONConfigSettings.java --- .../jsondefs/JSONConfigSettings.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mccore/src/main/java/minecrafttransportsimulator/jsondefs/JSONConfigSettings.java b/mccore/src/main/java/minecrafttransportsimulator/jsondefs/JSONConfigSettings.java index 507eb65f0..139c2cafd 100644 --- a/mccore/src/main/java/minecrafttransportsimulator/jsondefs/JSONConfigSettings.java +++ b/mccore/src/main/java/minecrafttransportsimulator/jsondefs/JSONConfigSettings.java @@ -93,7 +93,8 @@ public static class ConfigDamage { public JSONConfigEntry wheelBreakage = new JSONConfigEntry<>(true, "Whether or not wheels can be broken (go flat)."); public JSONConfigEntry wheelDamageIgnoreVelocity = new JSONConfigEntry<>(false, "Whether or not velocity is ignored when calculating wheel damage."); public JSONConfigEntry allowExternalDamage = new JSONConfigEntry<>(true, "Whether or not non-IV things can damage vehicles. This is normally false, as external damage is a hassle for most people, but can be true if you want other mod's guns to be able to attack vehicles in addition to IV's."); - public JSONConfigEntry propellerDamageFactor = new JSONConfigEntry<>(1.0D, "Factor for damage caused by a propeller."); + public JSONConfigEntry externalExplosionDamageFactor = new JSONConfigEntry<>(1.0D, "Factor for damage from external explosions when allowExternalDamage is enabled."); + public JSONConfigEntry propellerDamageFactor = new JSONConfigEntry<>(3.0D, "Factor for damage caused by a propeller."); public JSONConfigEntry jetDamageFactor = new JSONConfigEntry<>(1.0D, "Factor for damage caused by a jet engine."); public JSONConfigEntry wheelDamageFactor = new JSONConfigEntry<>(1.0D, "Factor for damage caused by wheels on vehicles."); public JSONConfigEntry crashDamageFactor = new JSONConfigEntry<>(1.0D, "Factor for damage caused by crashes."); From 5235423a3f3904e53dd83df4e87852d6bdac61de Mon Sep 17 00:00:00 2001 From: SnailPerson <97041048+SnailPerson@users.noreply.github.com> Date: Mon, 16 Mar 2026 21:32:44 +0100 Subject: [PATCH 07/11] Update BuilderEntityExisting.java --- .../src/main/java/mcinterface1122/BuilderEntityExisting.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcinterfaceforge1122/src/main/java/mcinterface1122/BuilderEntityExisting.java b/mcinterfaceforge1122/src/main/java/mcinterface1122/BuilderEntityExisting.java index f856094cc..3104de937 100644 --- a/mcinterfaceforge1122/src/main/java/mcinterface1122/BuilderEntityExisting.java +++ b/mcinterfaceforge1122/src/main/java/mcinterface1122/BuilderEntityExisting.java @@ -179,7 +179,7 @@ public boolean attackEntityFrom(DamageSource source, float amount) { BoundingBox explosiveBounds = new BoundingBox(lastExplosionPosition, amount, amount, amount); for (BoundingBox box : interactAttackBoxes.getBoxes()) { if (box.intersects(explosiveBounds)) { - multipart.attack(new Damage(amount, null, null, playerSource, null).setExplosive()); + multipart.attack(new Damage(amount * ConfigSystem.settings.damage.externalExplosionDamageFactor.value, null, null, playerSource, null).setExplosive()); break; } } From e4089757e3b6b30520d254e76ea437b255a13293 Mon Sep 17 00:00:00 2001 From: SnailPerson <97041048+SnailPerson@users.noreply.github.com> Date: Mon, 16 Mar 2026 21:33:30 +0100 Subject: [PATCH 08/11] Update BuilderEntityExisting.java --- .../src/main/java/mcinterface1165/BuilderEntityExisting.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcinterfaceforge1165/src/main/java/mcinterface1165/BuilderEntityExisting.java b/mcinterfaceforge1165/src/main/java/mcinterface1165/BuilderEntityExisting.java index 7f5921ab1..583f3171d 100644 --- a/mcinterfaceforge1165/src/main/java/mcinterface1165/BuilderEntityExisting.java +++ b/mcinterfaceforge1165/src/main/java/mcinterface1165/BuilderEntityExisting.java @@ -179,7 +179,7 @@ public boolean hurt(DamageSource source, float amount) { BoundingBox explosiveBounds = new BoundingBox(lastExplosionPosition, amount, amount, amount); for (BoundingBox box : interactAttackBoxes.getBoxes()) { if (box.intersects(explosiveBounds)) { - multipart.attack(new Damage(amount, null, null, playerSource, null).setExplosive()); + multipart.attack(new Damage(amount * ConfigSystem.settings.damage.externalExplosionDamageFactor.value, null, null, playerSource, null).setExplosive()); break; } } From 25b47ba903dd3416d77012a01cd059b096296327 Mon Sep 17 00:00:00 2001 From: SnailPerson <97041048+SnailPerson@users.noreply.github.com> Date: Mon, 16 Mar 2026 21:34:14 +0100 Subject: [PATCH 09/11] Update BuilderEntityExisting.java --- .../src/main/java/mcinterface1182/BuilderEntityExisting.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcinterfaceforge1182/src/main/java/mcinterface1182/BuilderEntityExisting.java b/mcinterfaceforge1182/src/main/java/mcinterface1182/BuilderEntityExisting.java index 995249f65..5c9decb98 100644 --- a/mcinterfaceforge1182/src/main/java/mcinterface1182/BuilderEntityExisting.java +++ b/mcinterfaceforge1182/src/main/java/mcinterface1182/BuilderEntityExisting.java @@ -182,7 +182,7 @@ public boolean hurt(DamageSource source, float amount) { BoundingBox explosiveBounds = new BoundingBox(lastExplosionPosition, amount, amount, amount); for (BoundingBox box : interactAttackBoxes.getBoxes()) { if (box.intersects(explosiveBounds)) { - multipart.attack(new Damage(amount, null, null, playerSource, null).setExplosive()); + multipart.attack(new Damage(amount * ConfigSystem.settings.damage.externalExplosionDamageFactor.value, null, null, playerSource, null).setExplosive()); break; } } From fbbdeef93dde587feb1585376250a8b3825a7e75 Mon Sep 17 00:00:00 2001 From: SnailPerson <97041048+SnailPerson@users.noreply.github.com> Date: Mon, 16 Mar 2026 21:34:59 +0100 Subject: [PATCH 10/11] Update BuilderEntityExisting.java --- .../src/main/java/mcinterface1192/BuilderEntityExisting.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcinterfaceforge1192/src/main/java/mcinterface1192/BuilderEntityExisting.java b/mcinterfaceforge1192/src/main/java/mcinterface1192/BuilderEntityExisting.java index 843f03fc2..6260e740f 100644 --- a/mcinterfaceforge1192/src/main/java/mcinterface1192/BuilderEntityExisting.java +++ b/mcinterfaceforge1192/src/main/java/mcinterface1192/BuilderEntityExisting.java @@ -182,7 +182,7 @@ public boolean hurt(DamageSource source, float amount) { BoundingBox explosiveBounds = new BoundingBox(lastExplosionPosition, amount, amount, amount); for (BoundingBox box : interactAttackBoxes.getBoxes()) { if (box.intersects(explosiveBounds)) { - multipart.attack(new Damage(amount, null, null, playerSource, null).setExplosive()); + multipart.attack(new Damage(amount * ConfigSystem.settings.damage.externalExplosionDamageFactor.value, null, null, playerSource, null).setExplosive()); break; } } From ea64519485fe976bb9c478cdcbc5bf046b5dfe77 Mon Sep 17 00:00:00 2001 From: SnailPerson <97041048+SnailPerson@users.noreply.github.com> Date: Mon, 16 Mar 2026 21:35:28 +0100 Subject: [PATCH 11/11] Update BuilderEntityExisting.java --- .../src/main/java/mcinterface1201/BuilderEntityExisting.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcinterfaceforge1201/src/main/java/mcinterface1201/BuilderEntityExisting.java b/mcinterfaceforge1201/src/main/java/mcinterface1201/BuilderEntityExisting.java index ac17578a4..7b2d285e0 100644 --- a/mcinterfaceforge1201/src/main/java/mcinterface1201/BuilderEntityExisting.java +++ b/mcinterfaceforge1201/src/main/java/mcinterface1201/BuilderEntityExisting.java @@ -183,7 +183,7 @@ public boolean hurt(DamageSource source, float amount) { BoundingBox explosiveBounds = new BoundingBox(lastExplosionPosition, amount, amount, amount); for (BoundingBox box : interactAttackBoxes.getBoxes()) { if (box.intersects(explosiveBounds)) { - multipart.attack(new Damage(amount, null, null, playerSource, null).setExplosive()); + multipart.attack(new Damage(amount * ConfigSystem.settings.damage.externalExplosionDamageFactor.value, null, null, playerSource, null).setExplosive()); break; } }