--- a/net/minecraft/world/entity/vehicle/MinecartTNT.java
+++ b/net/minecraft/world/entity/vehicle/MinecartTNT.java
@@ -30,9 +_,10 @@
     private static final String TAG_FUSE = "fuse";
     private static final float DEFAULT_EXPLOSION_POWER_BASE = 4.0F;
     private static final float DEFAULT_EXPLOSION_SPEED_FACTOR = 1.0F;
-    private int fuse = -1;
-    private float explosionPowerBase = 4.0F;
-    private float explosionSpeedFactor = 1.0F;
+    public int fuse = -1;
+    public float explosionPowerBase = 4.0F;
+    public float explosionSpeedFactor = 1.0F;
+    public boolean isIncendiary = false; // CraftBukkit - add field
 
     public MinecartTNT(EntityType<? extends MinecartTNT> entityType, Level level) {
         super(entityType, level);
@@ -47,6 +_,12 @@
     public void tick() {
         super.tick();
         if (this.fuse > 0) {
+            // Paper start - Configurable TNT height nerf
+            if (this.level().paperConfig().fixes.tntEntityHeightNerf.test(v -> this.getY() > v)) {
+                this.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.OUT_OF_WORLD);
+                return;
+            }
+            // Paper end - Configurable TNT height nerf
             this.fuse--;
             this.level().addParticle(ParticleTypes.SMOKE, this.getX(), this.getY() + 0.5, this.getZ(), 0.0, 0.0, 0.0);
         } else if (this.fuse == 0) {
@@ -94,13 +_,24 @@
         return new ItemStack(Items.TNT_MINECART);
     }
 
-    protected void explode(double radiusModifier) {
+    public void explode(double radiusModifier) {
         this.explode(null, radiusModifier);
     }
 
     protected void explode(@Nullable DamageSource damageSource, double radiusModifier) {
         if (this.level() instanceof ServerLevel serverLevel) {
             double min = Math.min(Math.sqrt(radiusModifier), 5.0);
+            // CraftBukkit start
+            org.bukkit.event.entity.ExplosionPrimeEvent event = new org.bukkit.event.entity.ExplosionPrimeEvent(
+                this.getBukkitEntity(),
+                (float) (this.explosionPowerBase + this.explosionSpeedFactor * this.random.nextDouble() * 1.5 * min),
+                this.isIncendiary
+            );
+            if (!event.callEvent()) {
+                this.fuse = -1;
+                return;
+            }
+            // CraftBukkit end
             serverLevel.explode(
                 this,
                 damageSource,
@@ -108,11 +_,11 @@
                 this.getX(),
                 this.getY(),
                 this.getZ(),
-                (float)(this.explosionPowerBase + this.explosionSpeedFactor * this.random.nextDouble() * 1.5 * min),
-                false,
+                event.getRadius(), // CraftBukkit - explosion prime event
+                event.getFire(), // CraftBukkit - explosion prime event
                 Level.ExplosionInteraction.TNT
             );
-            this.discard();
+            this.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.EXPLODE); // CraftBukkit - add Bukkit remove cause
         }
     }
 
