aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0688-Fix-falling-block-spawn-methods.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0688-Fix-falling-block-spawn-methods.patch')
-rw-r--r--patches/server/0688-Fix-falling-block-spawn-methods.patch57
1 files changed, 57 insertions, 0 deletions
diff --git a/patches/server/0688-Fix-falling-block-spawn-methods.patch b/patches/server/0688-Fix-falling-block-spawn-methods.patch
new file mode 100644
index 0000000000..1f5d0c19cc
--- /dev/null
+++ b/patches/server/0688-Fix-falling-block-spawn-methods.patch
@@ -0,0 +1,57 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Nassim Jahnke <[email protected]>
+Date: Fri, 4 Mar 2022 20:35:19 +0100
+Subject: [PATCH] Fix falling block spawn methods
+
+Restores the API behavior from previous versions of the server
+- Do not call API events
+- Do not replace the existing block in the world
+
+== AT ==
+public net.minecraft.world.entity.item.FallingBlockEntity <init>(Lnet/minecraft/world/level/Level;DDDLnet/minecraft/world/level/block/state/BlockState;)V
+
+diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
+index e31794510cb204fa1360803050d25d0e226785e2..193b544d1fea692d9948e00c72aa566836c2a4d2 100644
+--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
++++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
+@@ -1425,7 +1425,12 @@ public class CraftWorld extends CraftRegionAccessor implements World {
+ Preconditions.checkArgument(material != null, "Material cannot be null");
+ Preconditions.checkArgument(material.isBlock(), "Material.%s must be a block", material);
+
+- FallingBlockEntity entity = FallingBlockEntity.fall(this.world, BlockPos.containing(location.getX(), location.getY(), location.getZ()), CraftBlockType.bukkitToMinecraft(material).defaultBlockState(), SpawnReason.CUSTOM);
++ // Paper start - restore API behavior for spawning falling blocks
++ FallingBlockEntity entity = new FallingBlockEntity(this.world, location.getX(), location.getY(), location.getZ(), CraftBlockType.bukkitToMinecraft(material).defaultBlockState()); // Paper
++ entity.time = 1;
++
++ this.world.addFreshEntity(entity, SpawnReason.CUSTOM);
++ // Paper end - restore API behavior for spawning falling blocks
+ return (FallingBlock) entity.getBukkitEntity();
+ }
+
+@@ -1434,7 +1439,12 @@ public class CraftWorld extends CraftRegionAccessor implements World {
+ Preconditions.checkArgument(location != null, "Location cannot be null");
+ Preconditions.checkArgument(data != null, "BlockData cannot be null");
+
+- FallingBlockEntity entity = FallingBlockEntity.fall(this.world, BlockPos.containing(location.getX(), location.getY(), location.getZ()), ((CraftBlockData) data).getState(), SpawnReason.CUSTOM);
++ // Paper start - restore API behavior for spawning falling blocks
++ FallingBlockEntity entity = new FallingBlockEntity(this.world, location.getX(), location.getY(), location.getZ(), ((CraftBlockData) data).getState());
++ entity.time = 1;
++
++ this.world.addFreshEntity(entity, SpawnReason.CUSTOM);
++ // Paper end - restore API behavior for spawning falling blocks
+ return (FallingBlock) entity.getBukkitEntity();
+ }
+
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java
+index abcfb3accb715a5a041de4b798cf3582d1fde325..7ba6302ecb72fa6e523054e7e3223d79eedf6589 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntityTypes.java
+@@ -386,7 +386,7 @@ public final class CraftEntityTypes {
+ register(new EntityTypeData<>(EntityType.TNT, TNTPrimed.class, CraftTNTPrimed::new, spawnData -> new PrimedTnt(spawnData.minecraftWorld(), spawnData.x(), spawnData.y(), spawnData.z(), null)));
+ register(new EntityTypeData<>(EntityType.FALLING_BLOCK, FallingBlock.class, CraftFallingBlock::new, spawnData -> {
+ BlockPos pos = BlockPos.containing(spawnData.x(), spawnData.y(), spawnData.z());
+- return FallingBlockEntity.fall(spawnData.minecraftWorld(), pos, spawnData.world().getBlockState(pos));
++ return new FallingBlockEntity(spawnData.minecraftWorld(), spawnData.x(), spawnData.y(), spawnData.z(), spawnData.world().getBlockState(pos)); // Paper - create falling block entities correctly
+ }));
+ register(new EntityTypeData<>(EntityType.FIREWORK_ROCKET, Firework.class, CraftFirework::new, spawnData -> new FireworkRocketEntity(spawnData.minecraftWorld(), spawnData.x(), spawnData.y(), spawnData.z(), net.minecraft.world.item.ItemStack.EMPTY)));
+ register(new EntityTypeData<>(EntityType.EVOKER_FANGS, EvokerFangs.class, CraftEvokerFangs::new, spawnData -> new net.minecraft.world.entity.projectile.EvokerFangs(spawnData.minecraftWorld(), spawnData.x(), spawnData.y(), spawnData.z(), (float) Math.toRadians(spawnData.yaw()), 0, null)));