From 4952c04610c12362ddc9088adf0b2fc882b0e85f Mon Sep 17 00:00:00 2001 From: Jake Potrebic Date: Fri, 22 Jul 2022 16:42:13 -0700 Subject: [PATCH] Don't use level random in entity constructors (#8122) --- ... => 0388-Add-EntityPortalReadyEvent.patch} | 0 ... => 0927-Add-EntityPortalReadyEvent.patch} | 0 ...-level-random-in-entity-constructors.patch | 63 +++++++++++++++++++ 3 files changed, 63 insertions(+) rename patches/api/{0387-Add-EntityPortalReadyEvent.patch => 0388-Add-EntityPortalReadyEvent.patch} (100%) rename patches/server/{0926-Add-EntityPortalReadyEvent.patch => 0927-Add-EntityPortalReadyEvent.patch} (100%) create mode 100644 patches/server/0928-Don-t-use-level-random-in-entity-constructors.patch diff --git a/patches/api/0387-Add-EntityPortalReadyEvent.patch b/patches/api/0388-Add-EntityPortalReadyEvent.patch similarity index 100% rename from patches/api/0387-Add-EntityPortalReadyEvent.patch rename to patches/api/0388-Add-EntityPortalReadyEvent.patch diff --git a/patches/server/0926-Add-EntityPortalReadyEvent.patch b/patches/server/0927-Add-EntityPortalReadyEvent.patch similarity index 100% rename from patches/server/0926-Add-EntityPortalReadyEvent.patch rename to patches/server/0927-Add-EntityPortalReadyEvent.patch diff --git a/patches/server/0928-Don-t-use-level-random-in-entity-constructors.patch b/patches/server/0928-Don-t-use-level-random-in-entity-constructors.patch new file mode 100644 index 000000000..18739a1c8 --- /dev/null +++ b/patches/server/0928-Don-t-use-level-random-in-entity-constructors.patch @@ -0,0 +1,63 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Jake Potrebic +Date: Sun, 10 Jul 2022 14:13:22 -0700 +Subject: [PATCH] Don't use level random in entity constructors + +Paper makes the entity random thread-safe +and constructing an entity off the main thread +should be supported. Some entities (for whatever +reason) use the level's random in some places. + +diff --git a/src/main/java/net/minecraft/world/entity/animal/Bee.java b/src/main/java/net/minecraft/world/entity/animal/Bee.java +index e5de2c1d11e5de88420caba35bf75c8bbd799db5..a9cdf9034ad269f7a71358443acc053288cfbe6d 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/Bee.java ++++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java +@@ -1028,7 +1028,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { + + BeeGoToHiveGoal() { + super(); +- this.travellingTicks = Bee.this.level.random.nextInt(10); ++ this.travellingTicks = Bee.this./* level. */random.nextInt(10); // Paper - use entity random + this.blacklistedTargets = Lists.newArrayList(); + this.setFlags(EnumSet.of(Goal.Flag.MOVE)); + } +@@ -1145,7 +1145,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { + + BeeGoToKnownFlowerGoal() { + super(); +- this.travellingTicks = Bee.this.level.random.nextInt(10); ++ this.travellingTicks = Bee.this./* level. */random.nextInt(10); // Paper - use entity random + this.setFlags(EnumSet.of(Goal.Flag.MOVE)); + } + +diff --git a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java +index 08f15739dd7e2ab80718ab8d983b483a46309deb..c58c296bbb0fbd1930dba38bcab7ec3103917ba5 100644 +--- a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java ++++ b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java +@@ -64,7 +64,12 @@ public class ItemEntity extends Entity { + } + + public ItemEntity(Level world, double x, double y, double z, ItemStack stack) { +- this(world, x, y, z, stack, world.random.nextDouble() * 0.2D - 0.1D, 0.2D, world.random.nextDouble() * 0.2D - 0.1D); ++ // Paper start - don't use world random in entity constructor ++ this(EntityType.ITEM, world); ++ this.setPos(x, y, z); ++ this.setDeltaMovement(this.random.nextDouble() * 0.2D - 0.1D, 0.2D, this.random.nextDouble() * 0.2D - 0.1D); ++ this.setItem(stack); ++ // Paper end + } + + public ItemEntity(Level world, double x, double y, double z, ItemStack stack, double velocityX, double velocityY, double velocityZ) { +diff --git a/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java b/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java +index 8101f358975b35b5a2dafbade3d14a910e408fa2..e09271450cae84f6206a20d6622918fe37380d59 100644 +--- a/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java ++++ b/src/main/java/net/minecraft/world/entity/item/PrimedTnt.java +@@ -35,7 +35,7 @@ public class PrimedTnt extends Entity { + public PrimedTnt(Level world, double x, double y, double z, @Nullable LivingEntity igniter) { + this(EntityType.TNT, world); + this.setPos(x, y, z); +- double d3 = world.random.nextDouble() * 6.2831854820251465D; ++ double d3 = this.random.nextDouble() * 6.2831854820251465D; // Paper - don't use world random in entity constructor + + this.setDeltaMovement(-Math.sin(d3) * 0.02D, 0.20000000298023224D, -Math.cos(d3) * 0.02D); + this.setFuse(80);