13
0
geforkt von Mirrors/Paper

SPIGOT-6138, SPIGOT-6415: Don't call CreatureSpawnEvent after cross-dimensional travel

By: DerFrZocker <derrieple@gmail.com>
Dieser Commit ist enthalten in:
CraftBukkit/Spigot 2022-03-13 07:48:22 +11:00
Ursprung 4703f2b200
Commit 85cc664060

Datei anzeigen

@ -282,7 +282,7 @@
} }
this.getChunkSource().getDataStorage().save(); this.getChunkSource().getDataStorage().save();
@@ -814,15 +908,34 @@ @@ -814,15 +908,37 @@
@Override @Override
public boolean addFreshEntity(Entity entity) { public boolean addFreshEntity(Entity entity) {
@ -311,7 +311,10 @@
public void addDuringTeleport(Entity entity) { public void addDuringTeleport(Entity entity) {
- this.addEntity(entity); - this.addEntity(entity);
+ // CraftBukkit start + // CraftBukkit start
+ this.addDuringTeleport(entity, CreatureSpawnEvent.SpawnReason.DEFAULT); + // SPIGOT-6415: Don't call spawn event for entities which travel trough worlds,
+ // since it is only an implementation detail, that a new entity is created when
+ // they are traveling between worlds.
+ this.addDuringTeleport(entity, null);
+ } + }
+ +
+ public void addDuringTeleport(Entity entity, CreatureSpawnEvent.SpawnReason reason) { + public void addDuringTeleport(Entity entity, CreatureSpawnEvent.SpawnReason reason) {
@ -320,7 +323,7 @@
} }
public void addDuringCommandTeleport(EntityPlayer entityplayer) { public void addDuringCommandTeleport(EntityPlayer entityplayer) {
@@ -853,24 +966,36 @@ @@ -853,24 +969,37 @@
this.entityManager.addNewEntity(entityplayer); this.entityManager.addNewEntity(entityplayer);
} }
@ -332,7 +335,8 @@
+ // WorldServer.LOGGER.warn("Tried to add entity {} but it was marked as removed already", EntityTypes.getKey(entity.getType())); // CraftBukkit + // WorldServer.LOGGER.warn("Tried to add entity {} but it was marked as removed already", EntityTypes.getKey(entity.getType())); // CraftBukkit
return false; return false;
} else { } else {
+ if (!CraftEventFactory.doEntityAddEventCalling(this, entity, spawnReason)) { + // SPIGOT-6415: Don't call spawn event when reason is null. For example when an entity teleports to a new world.
+ if (spawnReason != null && !CraftEventFactory.doEntityAddEventCalling(this, entity, spawnReason)) {
+ return false; + return false;
+ } + }
+ // CraftBukkit end + // CraftBukkit end
@ -361,7 +365,7 @@
return true; return true;
} }
} }
@@ -884,10 +1009,32 @@ @@ -884,10 +1013,32 @@
entityplayer.remove(entity_removalreason); entityplayer.remove(entity_removalreason);
} }
@ -394,7 +398,7 @@
while (iterator.hasNext()) { while (iterator.hasNext()) {
EntityPlayer entityplayer = (EntityPlayer) iterator.next(); EntityPlayer entityplayer = (EntityPlayer) iterator.next();
@@ -896,6 +1043,12 @@ @@ -896,6 +1047,12 @@
double d1 = (double) blockposition.getY() - entityplayer.getY(); double d1 = (double) blockposition.getY() - entityplayer.getY();
double d2 = (double) blockposition.getZ() - entityplayer.getZ(); double d2 = (double) blockposition.getZ() - entityplayer.getZ();
@ -407,7 +411,7 @@
if (d0 * d0 + d1 * d1 + d2 * d2 < 1024.0D) { if (d0 * d0 + d1 * d1 + d2 * d2 < 1024.0D) {
entityplayer.connection.send(new PacketPlayOutBlockBreakAnimation(i, blockposition, j)); entityplayer.connection.send(new PacketPlayOutBlockBreakAnimation(i, blockposition, j));
} }
@@ -950,7 +1103,18 @@ @@ -950,7 +1107,18 @@
Iterator iterator = this.navigatingMobs.iterator(); Iterator iterator = this.navigatingMobs.iterator();
while (iterator.hasNext()) { while (iterator.hasNext()) {
@ -427,7 +431,7 @@
NavigationAbstract navigationabstract = entityinsentient.getNavigation(); NavigationAbstract navigationabstract = entityinsentient.getNavigation();
if (navigationabstract.shouldRecomputePath(blockposition)) { if (navigationabstract.shouldRecomputePath(blockposition)) {
@@ -986,10 +1150,20 @@ @@ -986,10 +1154,20 @@
@Override @Override
public Explosion explode(@Nullable Entity entity, @Nullable DamageSource damagesource, @Nullable ExplosionDamageCalculator explosiondamagecalculator, double d0, double d1, double d2, float f, boolean flag, Explosion.Effect explosion_effect) { public Explosion explode(@Nullable Entity entity, @Nullable DamageSource damagesource, @Nullable ExplosionDamageCalculator explosiondamagecalculator, double d0, double d1, double d2, float f, boolean flag, Explosion.Effect explosion_effect) {
@ -448,7 +452,7 @@
if (explosion_effect == Explosion.Effect.NONE) { if (explosion_effect == Explosion.Effect.NONE) {
explosion.clearToBlow(); explosion.clearToBlow();
} }
@@ -1070,13 +1244,20 @@ @@ -1070,13 +1248,20 @@
} }
public <T extends ParticleParam> int sendParticles(T t0, double d0, double d1, double d2, int i, double d3, double d4, double d5, double d6) { public <T extends ParticleParam> int sendParticles(T t0, double d0, double d1, double d2, int i, double d3, double d4, double d5, double d6) {
@ -471,7 +475,7 @@
++j; ++j;
} }
} }
@@ -1127,7 +1308,7 @@ @@ -1127,7 +1312,7 @@
@Nullable @Nullable
public BlockPosition findNearestMapFeature(TagKey<StructureFeature<?, ?>> tagkey, BlockPosition blockposition, int i, boolean flag) { public BlockPosition findNearestMapFeature(TagKey<StructureFeature<?, ?>> tagkey, BlockPosition blockposition, int i, boolean flag) {
@ -480,7 +484,7 @@
return null; return null;
} else { } else {
Optional<HolderSet.Named<StructureFeature<?, ?>>> optional = this.registryAccess().registryOrThrow(IRegistry.CONFIGURED_STRUCTURE_FEATURE_REGISTRY).getTag(tagkey); Optional<HolderSet.Named<StructureFeature<?, ?>>> optional = this.registryAccess().registryOrThrow(IRegistry.CONFIGURED_STRUCTURE_FEATURE_REGISTRY).getTag(tagkey);
@@ -1169,11 +1350,21 @@ @@ -1169,11 +1354,21 @@
@Nullable @Nullable
@Override @Override
public WorldMap getMapData(String s) { public WorldMap getMapData(String s) {
@ -503,7 +507,7 @@
this.getServer().overworld().getDataStorage().set(s, worldmap); this.getServer().overworld().getDataStorage().set(s, worldmap);
} }
@@ -1485,6 +1676,11 @@ @@ -1485,6 +1680,11 @@
@Override @Override
public void blockUpdated(BlockPosition blockposition, Block block) { public void blockUpdated(BlockPosition blockposition, Block block) {
if (!this.isDebug()) { if (!this.isDebug()) {
@ -515,7 +519,7 @@
this.updateNeighborsAt(blockposition, block); this.updateNeighborsAt(blockposition, block);
} }
@@ -1504,12 +1700,12 @@ @@ -1504,12 +1704,12 @@
} }
public boolean isFlat() { public boolean isFlat() {
@ -530,7 +534,7 @@
} }
@Nullable @Nullable
@@ -1532,7 +1728,7 @@ @@ -1532,7 +1732,7 @@
private static <T> String getTypeCount(Iterable<T> iterable, Function<T, String> function) { private static <T> String getTypeCount(Iterable<T> iterable, Function<T, String> function) {
try { try {
Object2IntOpenHashMap<String> object2intopenhashmap = new Object2IntOpenHashMap(); Object2IntOpenHashMap<String> object2intopenhashmap = new Object2IntOpenHashMap();
@ -539,7 +543,7 @@
while (iterator.hasNext()) { while (iterator.hasNext()) {
T t0 = iterator.next(); T t0 = iterator.next();
@@ -1541,7 +1737,7 @@ @@ -1541,7 +1741,7 @@
object2intopenhashmap.addTo(s, 1); object2intopenhashmap.addTo(s, 1);
} }
@ -548,7 +552,7 @@
String s1 = (String) entry.getKey(); String s1 = (String) entry.getKey();
return s1 + ":" + entry.getIntValue(); return s1 + ":" + entry.getIntValue();
@@ -1552,17 +1748,33 @@ @@ -1552,17 +1752,33 @@
} }
public static void makeObsidianPlatform(WorldServer worldserver) { public static void makeObsidianPlatform(WorldServer worldserver) {
@ -584,7 +588,7 @@
} }
@Override @Override
@@ -1672,6 +1884,7 @@ @@ -1672,6 +1888,7 @@
} }
} }
@ -592,7 +596,7 @@
} }
public void onTrackingEnd(Entity entity) { public void onTrackingEnd(Entity entity) {
@@ -1713,6 +1926,14 @@ @@ -1713,6 +1930,14 @@
gameeventlistenerregistrar.onListenerRemoved(entity.level); gameeventlistenerregistrar.onListenerRemoved(entity.level);
} }