31699ae9a8
* Updated Upstream (Bukkit/CraftBukkit) Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: a6a9d2a4 Remove some old ApiStatus.Experimental annotations be72314c SPIGOT-7300, PR-829: Add new DamageSource API providing enhanced information about entity damage b252cf05 SPIGOT-7576, PR-970: Add methods in MushroomCow to change stew effects b1c689bd PR-902: Add Server#isLoggingIPs to get log-ips configuration 08f86d1c PR-971: Add Player methods for client-side potion effects 2e3024a9 PR-963: Add API for in-world structures a23292a7 SPIGOT-7530, PR-948: Improve Resource Pack API with new 1.20.3 functionality 1851857b SPIGOT-3071, PR-969: Add entity spawn method with spawn reason cde4c52a SPIGOT-5553, PR-964: Add EntityKnockbackEvent CraftBukkit Changes: 38fd4bd50 Fix accidentally renamed internal damage method 80f0ce4be SPIGOT-7300, PR-1180: Add new DamageSource API providing enhanced information about entity damage 7e43f3b16 SPIGOT-7581: Fix typo in BlockMushroom ea14b7d90 SPIGOT-7576, PR-1347: Add methods in MushroomCow to change stew effects 4c687f243 PR-1259: Add Server#isLoggingIPs to get log-ips configuration 22a541a29 Improve support for per-world game rules cb7dccce2 PR-1348: Add Player methods for client-side potion effects b8d6109f0 PR-1335: Add API for in-world structures 4398a1b5b SPIGOT-7577: Make CraftWindCharge#explode discard the entity e74107678 Fix Crafter maximum stack size 0bb0f4f6a SPIGOT-7530, PR-1314: Improve Resource Pack API with new 1.20.3 functionality 4949f556d SPIGOT-3071, PR-1345: Add entity spawn method with spawn reason 20ac73ca2 PR-1353: Fix Structure#place not working as documented with 0 palette 3c1b77871 SPIGOT-6911, PR-1349: Change max book length in CraftMetaBook 333701839 SPIGOT-7572: Bee nests generated without bees f48f4174c SPIGOT-5553, PR-1336: Add EntityKnockbackEvent
209 Zeilen
12 KiB
Diff
209 Zeilen
12 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Jake Potrebic <jake.m.potrebic@gmail.com>
|
|
Date: Thu, 23 Nov 2023 10:33:25 -0800
|
|
Subject: [PATCH] Don't fire sync events during worldgen
|
|
|
|
Fixes EntityPotionEffectEvent
|
|
Fixes EntityPoseChangeEvent
|
|
|
|
Asynchronous chunk generation provides an opportunity for things
|
|
to happen async that previously fired synchronous-only events. This
|
|
patch is for mitigating those issues by various methods.
|
|
|
|
Also fixes correctly marking/clearing the entity generation flag.
|
|
This patch sets the generation flag anytime an entity is created
|
|
via StructureTemplate before loading from NBT to catch uses of
|
|
the flag during the loading logic. This patch clears the generation
|
|
flag from an entity when added to a ServerLevel for the situation
|
|
where generation happened directly to a ServerLevel and the
|
|
entity still has the flag set.
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
|
index 0e7811ae2a8731ae7475aabd2322e56ab364bc32..b5d6a7eaa24d9968e159d77a4295be00332a5457 100644
|
|
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
|
|
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
|
@@ -1220,6 +1220,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
|
|
// CraftBukkit start
|
|
private boolean addEntity(Entity entity, CreatureSpawnEvent.SpawnReason spawnReason) {
|
|
org.spigotmc.AsyncCatcher.catchOp("entity add"); // Spigot
|
|
+ entity.generation = false; // Paper - Don't fire sync event during generation; Reset flag if it was added during a ServerLevel generation process
|
|
// Paper start - extra debug info
|
|
if (entity.valid) {
|
|
MinecraftServer.LOGGER.error("Attempted Double World add on {}", entity, new Throwable());
|
|
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
|
|
index effd39457989f34823e4fa7bc038c47d04714317..c153912929e7b505ffebb91ccda2f9175347b089 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/Entity.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
|
|
@@ -624,7 +624,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
|
|
if (pose == this.getPose()) {
|
|
return;
|
|
}
|
|
- this.level.getCraftServer().getPluginManager().callEvent(new EntityPoseChangeEvent(this.getBukkitEntity(), Pose.values()[pose.ordinal()]));
|
|
+ // Paper start - Don't fire sync event during generation
|
|
+ if (!this.generation) {
|
|
+ this.level.getCraftServer().getPluginManager().callEvent(new EntityPoseChangeEvent(this.getBukkitEntity(), Pose.values()[pose.ordinal()]));
|
|
+ }
|
|
+ // Paper end - Don't fire sync event during generation
|
|
// CraftBukkit end
|
|
this.entityData.set(Entity.DATA_POSE, pose);
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java
|
|
index 656c68b37bc25d6b77f295f9efe0a81dd20b69c1..8ba573bb4099ee5b27b61f333e72d794c48d5f29 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/EntityType.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/EntityType.java
|
|
@@ -584,9 +584,15 @@ public class EntityType<T extends Entity> implements FeatureElement, EntityTypeT
|
|
}
|
|
|
|
public static Optional<Entity> create(CompoundTag nbt, Level world) {
|
|
+ // Paper start - Don't fire sync event during generation
|
|
+ return create(nbt, world, false);
|
|
+ }
|
|
+ public static Optional<Entity> create(CompoundTag nbt, Level world, boolean generation) {
|
|
+ // Paper end - Don't fire sync event during generation
|
|
return Util.ifElse(EntityType.by(nbt).map((entitytypes) -> {
|
|
return entitytypes.create(world);
|
|
}), (entity) -> {
|
|
+ if (generation) entity.generation = true; // Paper - Don't fire sync event during generation
|
|
entity.load(nbt);
|
|
}, () -> {
|
|
EntityType.LOGGER.warn("Skipping Entity with id {}", nbt.getString("id"));
|
|
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
index 294c4950ebe63a5d0f74907692010c9c99cf82da..fe95119a8d26887f4e9cd1b9cd1299515835e958 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
|
@@ -1134,6 +1134,11 @@ public abstract class LivingEntity extends Entity implements Attackable {
|
|
}
|
|
|
|
public boolean addEffect(MobEffectInstance mobeffect, @Nullable Entity entity, EntityPotionEffectEvent.Cause cause) {
|
|
+ // Paper start - Don't fire sync event during generation
|
|
+ return this.addEffect(mobeffect, entity, cause, true);
|
|
+ }
|
|
+ public boolean addEffect(MobEffectInstance mobeffect, @Nullable Entity entity, EntityPotionEffectEvent.Cause cause, boolean fireEvent) {
|
|
+ // Paper end - Don't fire sync event during generation
|
|
// org.spigotmc.AsyncCatcher.catchOp("effect add"); // Spigot // Paper - move to API
|
|
if (this.isTickingEffects) {
|
|
this.effectsToProcess.add(new ProcessableEffect(mobeffect, cause));
|
|
@@ -1153,10 +1158,13 @@ public abstract class LivingEntity extends Entity implements Attackable {
|
|
override = new MobEffectInstance(mobeffect1).update(mobeffect);
|
|
}
|
|
|
|
+ if (fireEvent) { // Paper - Don't fire sync event during generation
|
|
EntityPotionEffectEvent event = CraftEventFactory.callEntityPotionEffectChangeEvent(this, mobeffect1, mobeffect, cause, override);
|
|
+ override = event.isOverride(); // Paper - Don't fire sync event during generation
|
|
if (event.isCancelled()) {
|
|
return false;
|
|
}
|
|
+ } // Paper - Don't fire sync event during generation
|
|
// CraftBukkit end
|
|
|
|
if (mobeffect1 == null) {
|
|
@@ -1164,7 +1172,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
|
|
this.onEffectAdded(mobeffect, entity);
|
|
flag = true;
|
|
// CraftBukkit start
|
|
- } else if (event.isOverride()) {
|
|
+ } else if (override) { // Paper - Don't fire sync event during generation
|
|
mobeffect1.update(mobeffect);
|
|
this.onEffectUpdated(mobeffect1, true, entity);
|
|
// CraftBukkit end
|
|
diff --git a/src/main/java/net/minecraft/world/entity/monster/Spider.java b/src/main/java/net/minecraft/world/entity/monster/Spider.java
|
|
index d90da2f9e4d6214577bc81bd6c70ba8593788898..ffa4f34d964fbcc53e2dfe11677832db21a6eb93 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/monster/Spider.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/monster/Spider.java
|
|
@@ -182,7 +182,7 @@ public class Spider extends Monster {
|
|
MobEffect mobeffectlist = entityspider_groupdataspider.effect;
|
|
|
|
if (mobeffectlist != null) {
|
|
- this.addEffect(new MobEffectInstance(mobeffectlist, -1), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.SPIDER_SPAWN); // CraftBukkit
|
|
+ this.addEffect(new MobEffectInstance(mobeffectlist, -1), null, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.SPIDER_SPAWN, world instanceof net.minecraft.server.level.ServerLevel); // CraftBukkit // Paper - Don't fire sync event during generation; only if this is happening in a ServerLevel
|
|
}
|
|
}
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplate.java b/src/main/java/net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplate.java
|
|
index ae8a42261337bf736d0cc1bbe18da2b773417ca4..471e8493622c89d44a82f42f135cb308c9e0fbfe 100644
|
|
--- a/src/main/java/net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplate.java
|
|
+++ b/src/main/java/net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplate.java
|
|
@@ -518,7 +518,7 @@ public class StructureTemplate {
|
|
private static Optional<Entity> createEntityIgnoreException(ServerLevelAccessor world, CompoundTag nbt) {
|
|
// CraftBukkit start
|
|
// try {
|
|
- return EntityType.create(nbt, world.getLevel());
|
|
+ return EntityType.create(nbt, world.getLevel(), true); // Paper - Don't fire sync event during generation
|
|
// } catch (Exception exception) {
|
|
// return Optional.empty();
|
|
// }
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/util/DelegatedGeneratorAccess.java b/src/main/java/org/bukkit/craftbukkit/util/DelegatedGeneratorAccess.java
|
|
index e37c2d82ed606cbfe00c152b08c3ab99ac751f69..7ed861cd67889e525ab4987c0afed245aca08833 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/util/DelegatedGeneratorAccess.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/util/DelegatedGeneratorAccess.java
|
|
@@ -93,15 +93,17 @@ public abstract class DelegatedGeneratorAccess implements WorldGenLevel {
|
|
return this.handle.getLevel();
|
|
}
|
|
|
|
- @Override
|
|
- public void addFreshEntityWithPassengers(Entity arg0, CreatureSpawnEvent.SpawnReason arg1) {
|
|
- this.handle.addFreshEntityWithPassengers(arg0, arg1);
|
|
- }
|
|
-
|
|
- @Override
|
|
- public void addFreshEntityWithPassengers(Entity entity) {
|
|
- this.handle.addFreshEntityWithPassengers(entity);
|
|
- }
|
|
+ // Paper start - Don't fire sync event during generation; don't override these methods so all entities are run through addFreshEntity
|
|
+ // @Override
|
|
+ // public void addFreshEntityWithPassengers(Entity arg0, CreatureSpawnEvent.SpawnReason arg1) {
|
|
+ // this.handle.addFreshEntityWithPassengers(arg0, arg1);
|
|
+ // }
|
|
+ //
|
|
+ // @Override
|
|
+ // public void addFreshEntityWithPassengers(Entity entity) {
|
|
+ // this.handle.addFreshEntityWithPassengers(entity);
|
|
+ // }
|
|
+ // Paper end - Don't fire sync event during generation; don't override these methods
|
|
|
|
@Override
|
|
public ServerLevel getMinecraftWorld() {
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/util/TransformerGeneratorAccess.java b/src/main/java/org/bukkit/craftbukkit/util/TransformerGeneratorAccess.java
|
|
index b4b297945fb601701aac845d09e88fb74b09c3fa..7482dfe64458320d44089c0778591694202e9f70 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/util/TransformerGeneratorAccess.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/util/TransformerGeneratorAccess.java
|
|
@@ -39,21 +39,23 @@ public class TransformerGeneratorAccess extends DelegatedGeneratorAccess {
|
|
return super.addFreshEntity(arg0, arg1);
|
|
}
|
|
|
|
- @Override
|
|
- public void addFreshEntityWithPassengers(Entity entity) {
|
|
- if (this.structureTransformer != null && !this.structureTransformer.transformEntity(entity)) {
|
|
- return;
|
|
- }
|
|
- super.addFreshEntityWithPassengers(entity);
|
|
- }
|
|
-
|
|
- @Override
|
|
- public void addFreshEntityWithPassengers(Entity arg0, SpawnReason arg1) {
|
|
- if (this.structureTransformer != null && !this.structureTransformer.transformEntity(arg0)) {
|
|
- return;
|
|
- }
|
|
- super.addFreshEntityWithPassengers(arg0, arg1);
|
|
- }
|
|
+ // Paper start - Don't fire sync event during generation; don't override these methods so all entities are run through addFreshEntity
|
|
+ // @Override
|
|
+ // public void addFreshEntityWithPassengers(Entity entity) {
|
|
+ // if (this.structureTransformer != null && !this.structureTransformer.transformEntity(entity)) {
|
|
+ // return;
|
|
+ // }
|
|
+ // super.addFreshEntityWithPassengers(entity);
|
|
+ // }
|
|
+ //
|
|
+ // @Override
|
|
+ // public void addFreshEntityWithPassengers(Entity arg0, SpawnReason arg1) {
|
|
+ // if (this.structureTransformer != null && !this.structureTransformer.transformEntity(arg0)) {
|
|
+ // return;
|
|
+ // }
|
|
+ // super.addFreshEntityWithPassengers(arg0, arg1);
|
|
+ // }
|
|
+ // Paper end - Don't fire sync event during generation; don't override these methods
|
|
|
|
public boolean setCraftBlock(BlockPos position, CraftBlockState craftBlockState, int i, int j) {
|
|
if (this.structureTransformer != null) {
|