--- a/net/minecraft/world/damagesource/DamageSources.java
+++ b/net/minecraft/world/damagesource/DamageSources.java
@@ -16,6 +16,7 @@
 import net.minecraft.world.phys.Vec3;
 
 public class DamageSources {
+
     private final Registry<DamageType> damageTypes;
     private final DamageSource inFire;
     private final DamageSource campfire;
@@ -41,9 +42,15 @@
     private final DamageSource stalagmite;
     private final DamageSource outsideBorder;
     private final DamageSource genericKill;
+    // CraftBukkit start
+    private final DamageSource melting;
+    private final DamageSource poison;
 
     public DamageSources(RegistryAccess registryManager) {
         this.damageTypes = registryManager.registryOrThrow(Registries.DAMAGE_TYPE);
+        this.melting = this.source(DamageTypes.ON_FIRE).melting();
+        this.poison = this.source(DamageTypes.MAGIC).poison();
+        // CraftBukkit end
         this.inFire = this.source(DamageTypes.IN_FIRE);
         this.campfire = this.source(DamageTypes.CAMPFIRE);
         this.lightningBolt = this.source(DamageTypes.LIGHTNING_BOLT);
@@ -82,6 +89,16 @@
         return new DamageSource(this.damageTypes.getHolderOrThrow(key), source, attacker);
     }
 
+    // CraftBukkit start
+    public DamageSource melting() {
+        return this.melting;
+    }
+
+    public DamageSource poison() {
+        return this.poison;
+    }
+    // CraftBukkit end
+
     public DamageSource inFire() {
         return this.inFire;
     }
@@ -243,11 +260,11 @@
     }
 
     public DamageSource explosion(@Nullable Explosion explosion) {
-        return explosion != null ? this.explosion(explosion.getDirectSourceEntity(), explosion.getIndirectSourceEntity()) : this.explosion(null, null);
+        return explosion != null ? this.explosion(explosion.getDirectSourceEntity(), explosion.getIndirectSourceEntity()) : this.explosion((Entity) null, (Entity) null);
     }
 
     public DamageSource explosion(@Nullable Entity source, @Nullable Entity attacker) {
-        return this.source(attacker != null && source != null ? DamageTypes.PLAYER_EXPLOSION : DamageTypes.EXPLOSION, source, attacker);
+        return this.source(attacker != null && source != null ? DamageTypes.PLAYER_EXPLOSION : DamageTypes.EXPLOSION, source, attacker); // Paper - revert to vanilla
     }
 
     public DamageSource sonicBoom(Entity attacker) {
@@ -255,7 +272,13 @@
     }
 
     public DamageSource badRespawnPointExplosion(Vec3 position) {
-        return new DamageSource(this.damageTypes.getHolderOrThrow(DamageTypes.BAD_RESPAWN_POINT), position);
+        // CraftBukkit start
+        return this.badRespawnPointExplosion(position, null);
+    }
+
+    public DamageSource badRespawnPointExplosion(Vec3 vec3d, org.bukkit.block.BlockState blockState) {
+        return new DamageSource(this.damageTypes.getHolderOrThrow(DamageTypes.BAD_RESPAWN_POINT), vec3d).directBlockState(blockState);
+        // CraftBukkit end
     }
 
     public DamageSource outOfBorder() {
