--- a/net/minecraft/world/entity/vehicle/MinecartTNT.java
+++ b/net/minecraft/world/entity/vehicle/MinecartTNT.java
@@ -35,9 +_,10 @@
     private static final int NO_FUSE = -1;
     @Nullable
     private DamageSource ignitionSource;
-    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
 
     public MinecartTNT(EntityType<? extends MinecartTNT> entityType, Level level) {
         super(entityType, level);
@@ -52,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) {
@@ -90,7 +_,7 @@
     }
 
     @Override
-    protected Item getDropItem() {
+    public Item getDropItem() {
         return Items.TNT_MINECART;
     }
 
@@ -99,7 +_,7 @@
         return new ItemStack(Items.TNT_MINECART);
     }
 
-    protected void explode(double radiusModifier) {
+    public void explode(double radiusModifier) {
         this.explode(null, radiusModifier);
     }
 
@@ -107,6 +_,17 @@
         if (this.level() instanceof ServerLevel serverLevel) {
             if (serverLevel.getGameRules().getBoolean(GameRules.RULE_TNT_EXPLODES)) {
                 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,
@@ -114,13 +_,13 @@
                     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
             } else if (this.isPrimed()) {
-                this.discard();
+                this.discard(null); // CraftBukkit
             }
         }
     }
