Updated Upstream (Paper & Tuinity)

Upstream has released updates that appears to apply and compile correctly

Paper Changes:
7f23e2ca [CI-SKIP] Make travis use 'build' instead of 'patch' (#4592)
a7861cbb Updated Upstream (CraftBukkit)
6c512a08 Expose the Entity Counter to allow plugins to use valid and non-conflicting Entity Ids

Tuinity Changes:
08581cf More validation
88a2c88 Revert usage of region manager
This commit is contained in:
William Blake Galbreath
2020-09-30 17:27:55 -05:00
parent bb5c8a7fc1
commit 8dfb30b7e4
7 changed files with 189 additions and 408 deletions

2
Paper

Submodule Paper updated: 654b792caf...7f23e2cab1

View File

@@ -1 +1 @@
1.16.3--7e19ac7c8b13b5d0982f38643247de1a7535deff
1.16.3--db6101f7db49d148b1a296a8e6de4f9ff93de134

View File

@@ -242,12 +242,6 @@ Name craft scheduler threads according to the plugin using them
Provides quick access to culprits running far more threads than
they should be
Optimise WorldServer#notify
Iterating over all of the navigators in the world is pretty expensive.
Instead, only iterate over navigators in the current region that are
eligible for repathing.
Retain block place order when capturing blockstates
Fixes twisted vines not connecting properly when grown via
@@ -294,6 +288,10 @@ method was not inlined.
Paper recently reverted this optimisation, so it's been reintroduced
here.
Temporarily Revert usage of Region Manager
Has some stability issues.
diff --git a/pom.xml b/pom.xml
index add3a9c1a9..5e25ae55e4 100644
--- a/pom.xml
@@ -580,10 +578,10 @@ index 7720578796..e5db29d4ca 100644
return Suggestions.empty();
diff --git a/src/main/java/com/tuinity/tuinity/chunk/SingleThreadChunkRegionManager.java b/src/main/java/com/tuinity/tuinity/chunk/SingleThreadChunkRegionManager.java
new file mode 100644
index 0000000000..335185168c
index 0000000000..4cb10fe69c
--- /dev/null
+++ b/src/main/java/com/tuinity/tuinity/chunk/SingleThreadChunkRegionManager.java
@@ -0,0 +1,406 @@
@@ -0,0 +1,408 @@
+package com.tuinity.tuinity.chunk;
+
+import co.aikar.timings.MinecraftTimings;
@@ -723,7 +721,7 @@ index 0000000000..335185168c
+ }
+
+ public void addChunk(final int chunkX, final int chunkZ) {
+ com.tuinity.tuinity.util.TickThread.softEnsureTickThread("async region manager add chunk"); // Tuinity
+ com.tuinity.tuinity.util.TickThread.ensureTickThread("async region manager add chunk"); // Tuinity
+ this.addChunkTimings.startTiming();
+ try {
+ this.getOrCreateAndMergeSection(chunkX >> REGION_CHUNK_SIZE_SHIFT, chunkZ >> REGION_CHUNK_SIZE_SHIFT, null).addChunk(chunkX, chunkZ);
@@ -733,13 +731,15 @@ index 0000000000..335185168c
+ }
+
+ public void removeChunk(final int chunkX, final int chunkZ) {
+ com.tuinity.tuinity.util.TickThread.softEnsureTickThread("async region manager remove chunk"); // Tuinity
+ com.tuinity.tuinity.util.TickThread.ensureTickThread("async region manager remove chunk"); // Tuinity
+ this.removeChunkTimings.startTiming();
+ try {
+ final RegionSection<T> section = this.regionsBySection.get(
+ MCUtil.getCoordinateKey(chunkX >> REGION_CHUNK_SIZE_SHIFT, chunkZ >> REGION_CHUNK_SIZE_SHIFT));
+ if (section != null) {
+ section.removeChunk(chunkX, chunkZ);
+ } else {
+ throw new IllegalStateException("Cannot remove chunk at (" + chunkX + "," + chunkZ + ") from region state, section does not exist");
+ }
+ } finally {
+ this.removeChunkTimings.stopTiming();
@@ -747,7 +747,7 @@ index 0000000000..335185168c
+ }
+
+ public void recalculateRegions() {
+ com.tuinity.tuinity.util.TickThread.softEnsureTickThread("async region recalculation"); // Tuinity
+ com.tuinity.tuinity.util.TickThread.ensureTickThread("async region recalculation"); // Tuinity
+ for (int i = 0, len = this.needsRecalculation.size(); i < len; ++i) {
+ final Region<T> region = this.needsRecalculation.removeFirst();
+
@@ -1380,10 +1380,10 @@ index 0000000000..08ed243259
\ No newline at end of file
diff --git a/src/main/java/com/tuinity/tuinity/util/maplist/IteratorSafeOrderedReferenceSet.java b/src/main/java/com/tuinity/tuinity/util/maplist/IteratorSafeOrderedReferenceSet.java
new file mode 100644
index 0000000000..b0dc0ab473
index 0000000000..6d2851ffa3
--- /dev/null
+++ b/src/main/java/com/tuinity/tuinity/util/maplist/IteratorSafeOrderedReferenceSet.java
@@ -0,0 +1,285 @@
@@ -0,0 +1,288 @@
+package com.tuinity.tuinity.util.maplist;
+
+import it.unimi.dsi.fastutil.objects.Reference2IntLinkedOpenHashMap;
@@ -1475,6 +1475,9 @@ index 0000000000..b0dc0ab473
+ if (this.firstInvalidIndex < 0 || index < this.firstInvalidIndex) {
+ this.firstInvalidIndex = index;
+ }
+ if (this.listElements[index] != element) {
+ throw new IllegalStateException();
+ }
+ this.listElements[index] = null;
+ if (this.allowSafeIteration() && this.iteratorCount == 0 && this.getFragFactor() >= this.maxFragFactor) {
+ this.defrag();
@@ -2603,7 +2606,7 @@ index 3c7b225edb..1b750da9e0 100644
for (java.util.Iterator<Entry<ArraySetSorted<Ticket<?>>>> iterator = this.tickets.long2ObjectEntrySet().fastIterator(); iterator.hasNext();) {
diff --git a/src/main/java/net/minecraft/server/ChunkProviderServer.java b/src/main/java/net/minecraft/server/ChunkProviderServer.java
index 45c142c227..193af8b512 100644
index 45c142c227..b74ff6b9f3 100644
--- a/src/main/java/net/minecraft/server/ChunkProviderServer.java
+++ b/src/main/java/net/minecraft/server/ChunkProviderServer.java
@@ -22,6 +22,12 @@ import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; // Paper
@@ -2917,7 +2920,7 @@ index 45c142c227..193af8b512 100644
this.world.getMethodProfiler().enter("broadcast");
this.world.timings.broadcastChunkUpdates.startTiming(); // Paper - timings
- playerchunk.a((Chunk) optional.get());
+ playerchunk.a(chunk); // Tuinity
+ playerchunk.a(chunk); // Tuinity
this.world.timings.broadcastChunkUpdates.stopTiming(); // Paper - timings
this.world.getMethodProfiler().exit();
- Optional<Chunk> optional1 = ((Either) playerchunk.b().getNow(PlayerChunk.UNLOADED_CHUNK)).left();
@@ -3153,7 +3156,7 @@ index 550232cb38..229c3b0f0c 100644
throwable = throwable1;
throw throwable1;
diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
index 5e1978d1c9..0881a17d20 100644
index ebdbbeb1b5..6bc0299d15 100644
--- a/src/main/java/net/minecraft/server/Entity.java
+++ b/src/main/java/net/minecraft/server/Entity.java
@@ -136,7 +136,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
@@ -3771,7 +3774,7 @@ index ff74be1451..653ba0f1d8 100644
0, 2, 60L, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(),
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
index 883c17f00b..64f7e448ca 100644
index 883c17f00b..93c4f29e1e 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -985,7 +985,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
@@ -3947,7 +3950,7 @@ index 883c17f00b..64f7e448ca 100644
+ // Tuinity - replace logic
worldserver.timings.doTick.startTiming(); // Spigot
worldserver.doTick(booleansupplier);
+ worldserver.getChunkProvider().playerChunkMap.dataRegionManager.recalculateRegions(); // Tuinity
+ //worldserver.getChunkProvider().playerChunkMap.dataRegionManager.recalculateRegions(); // Tuinity
worldserver.timings.doTick.stopTiming(); // Spigot
- midTickLoadChunks(); // Paper
+ // Tuinity - replace logic
@@ -3963,42 +3966,6 @@ index 883c17f00b..64f7e448ca 100644
}
public CrashReport b(CrashReport crashreport) {
diff --git a/src/main/java/net/minecraft/server/NavigationAbstract.java b/src/main/java/net/minecraft/server/NavigationAbstract.java
index 921b60469d..b494d9c4ce 100644
--- a/src/main/java/net/minecraft/server/NavigationAbstract.java
+++ b/src/main/java/net/minecraft/server/NavigationAbstract.java
@@ -21,7 +21,7 @@ public abstract class NavigationAbstract {
protected long j;
protected double k;
protected float l;
- protected boolean m;
+ protected boolean m; protected final boolean needsPathRecalculation() { return this.m; } // Tuinity - OBFHELPER
protected long n;
protected PathfinderAbstract o;
private BlockPosition p;
@@ -30,6 +30,13 @@ public abstract class NavigationAbstract {
private final Pathfinder s; public Pathfinder getPathfinder() { return this.s; } // Paper - OBFHELPER
private boolean t;
+ // Tuinity start
+ public boolean isViableForPathRecalculationChecking() {
+ return !this.needsPathRecalculation() &&
+ (this.c != null && !this.c.c() && this.c.e() != 0);
+ }
+ // Tuinity end
+
public NavigationAbstract(EntityInsentient entityinsentient, World world) {
this.g = Vec3D.ORIGIN;
this.h = BaseBlockPosition.ZERO;
@@ -393,7 +400,7 @@ public abstract class NavigationAbstract {
}
public void b(BlockPosition blockposition) {
- if (this.c != null && !this.c.c() && this.c.e() != 0) {
+ if (this.c != null && !this.c.c() && this.c.e() != 0) { // Tuinity - diff on change - needed for isViableForPathRecalculationChecking()
PathPoint pathpoint = this.c.d();
Vec3D vec3d = new Vec3D(((double) pathpoint.a + this.a.locX()) / 2.0D, ((double) pathpoint.b + this.a.locY()) / 2.0D, ((double) pathpoint.c + this.a.locZ()) / 2.0D);
diff --git a/src/main/java/net/minecraft/server/NetworkManager.java b/src/main/java/net/minecraft/server/NetworkManager.java
index c9b36e6040..aa1597c772 100644
--- a/src/main/java/net/minecraft/server/NetworkManager.java
@@ -4420,7 +4387,7 @@ index 6ef71230ef..83179ef379 100644
if (chunk != null) {
playerchunkmap.callbackExecutor.execute(() -> {
diff --git a/src/main/java/net/minecraft/server/PlayerChunkMap.java b/src/main/java/net/minecraft/server/PlayerChunkMap.java
index fcd3388d88..20f59df866 100644
index fcd3388d88..a345699f49 100644
--- a/src/main/java/net/minecraft/server/PlayerChunkMap.java
+++ b/src/main/java/net/minecraft/server/PlayerChunkMap.java
@@ -121,31 +121,28 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
@@ -4490,21 +4457,13 @@ index fcd3388d88..20f59df866 100644
int chunkX = MCUtil.getChunkCoordinate(player.locX());
int chunkZ = MCUtil.getChunkCoordinate(player.locZ());
// Note: players need to be explicitly added to distance maps before they can be updated
@@ -277,6 +277,29 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
@@ -277,6 +277,21 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
}
// Paper end
+ // Tuinity start
+ public static enum RegionData implements com.tuinity.tuinity.chunk.SingleThreadChunkRegionManager.RegionDataCreator<RegionData> {
+ // Tuinity start - optimise notify()
+ PATHING_NAVIGATORS() {
+ @Override
+ public Object createData(com.tuinity.tuinity.chunk.SingleThreadChunkRegionManager.RegionSection<RegionData> section,
+ com.tuinity.tuinity.chunk.SingleThreadChunkRegionManager<RegionData> regionManager) {
+ return new com.tuinity.tuinity.util.maplist.IteratorSafeOrderedReferenceSet<>(true);
+ }
+ }
+ // Tuinity end - optimise notify()
+
+ ;
+
+ @Override
@@ -4520,17 +4479,17 @@ index fcd3388d88..20f59df866 100644
private final java.util.concurrent.ExecutorService lightThread;
public PlayerChunkMap(WorldServer worldserver, Convertable.ConversionSession convertable_conversionsession, DataFixer datafixer, DefinedStructureManager definedstructuremanager, Executor executor, IAsyncTaskHandler<Runnable> iasynctaskhandler, ILightAccess ilightaccess, ChunkGenerator chunkgenerator, WorldLoadListener worldloadlistener, Supplier<WorldPersistentData> supplier, int i, boolean flag) {
super(new File(convertable_conversionsession.a(worldserver.getDimensionKey()), "region"), datafixer, flag);
@@ -444,6 +467,9 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
@@ -444,6 +459,9 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
PlayerChunkMap.this.sendChunk(player, new ChunkCoordIntPair(rangeX, rangeZ), null, true, false); // unloaded, loaded
});
// Paper end - no-tick view distance
+ // Tuinity start
+ this.dataRegionManager = new com.tuinity.tuinity.chunk.SingleThreadChunkRegionManager<>(this.world, RegionData.class, 2, (1.0 / 3.0), "Data");
+ this.dataRegionManager = null;//new com.tuinity.tuinity.chunk.SingleThreadChunkRegionManager<>(this.world, RegionData.class, 2, (1.0 / 3.0), "Data");
+ // Tuinity end
}
// Paper start - Chunk Prioritization
public void queueHolderUpdate(PlayerChunk playerchunk) {
@@ -756,6 +782,8 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
@@ -756,6 +774,8 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
@Nullable
private PlayerChunk a(long i, int j, @Nullable PlayerChunk playerchunk, int k) {
@@ -4539,15 +4498,15 @@ index fcd3388d88..20f59df866 100644
if (k > PlayerChunkMap.GOLDEN_TICKET && j > PlayerChunkMap.GOLDEN_TICKET) {
return playerchunk;
} else {
@@ -778,6 +806,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
@@ -778,6 +798,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
playerchunk.a(j);
} else {
playerchunk = new PlayerChunk(new ChunkCoordIntPair(i), j, this.lightEngine, this.p, this);
+ this.dataRegionManager.addChunk(playerchunk.location.x, playerchunk.location.z); // Tuinity
+ //this.dataRegionManager.addChunk(playerchunk.location.x, playerchunk.location.z); // Tuinity
}
this.updatingChunks.put(i, playerchunk);
@@ -970,7 +999,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
@@ -970,7 +991,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
}
com.destroystokyo.paper.io.PaperFileIOThread.Holder.INSTANCE.scheduleSave(this.world, chunkPos.x, chunkPos.z,
@@ -4556,7 +4515,7 @@ index fcd3388d88..20f59df866 100644
if (!chunk.isNeedsSaving()) {
return;
@@ -1004,7 +1033,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
@@ -1004,7 +1025,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
asyncSaveData = ChunkRegionLoader.getAsyncSaveData(this.world, chunk);
}
@@ -4565,7 +4524,7 @@ index fcd3388d88..20f59df866 100644
asyncSaveData, chunk);
chunk.setLastSaved(this.world.getTime());
@@ -1012,6 +1041,8 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
@@ -1012,6 +1033,8 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
}
// Paper end
@@ -4574,7 +4533,7 @@ index fcd3388d88..20f59df866 100644
private void a(long i, PlayerChunk playerchunk) {
CompletableFuture<IChunkAccess> completablefuture = playerchunk.getChunkSave();
Consumer<IChunkAccess> consumer = (ichunkaccess) -> { // CraftBukkit - decompile error
@@ -1020,7 +1051,16 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
@@ -1020,7 +1043,16 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
if (completablefuture1 != completablefuture) {
this.a(i, playerchunk);
} else {
@@ -4592,16 +4551,16 @@ index fcd3388d88..20f59df866 100644
if (ichunkaccess instanceof Chunk) {
((Chunk) ichunkaccess).setLoaded(false);
}
@@ -1044,6 +1084,8 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
@@ -1044,6 +1076,8 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
this.lightEngine.queueUpdate();
this.worldLoadListener.a(ichunkaccess.getPos(), (ChunkStatus) null);
}
+ if (removed) this.dataRegionManager.removeChunk(playerchunk.location.x, playerchunk.location.z); // Tuinity
+ //if (removed) this.dataRegionManager.removeChunk(playerchunk.location.x, playerchunk.location.z); // Tuinity
+ } finally { this.unloadingPlayerChunk = unloadingBefore; } // Tuinity - do not allow ticket level changes while unloading chunks
}
};
@@ -1059,6 +1101,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
@@ -1059,6 +1093,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
}
protected boolean b() {
@@ -4609,7 +4568,7 @@ index fcd3388d88..20f59df866 100644
if (!this.updatingChunksModified) {
return false;
} else {
@@ -1246,7 +1289,10 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
@@ -1246,7 +1281,10 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
}
// Paper end
this.mailboxWorldGen.a(ChunkTaskQueueSorter.a(playerchunk, runnable));
@@ -4621,7 +4580,7 @@ index fcd3388d88..20f59df866 100644
}
protected void c(ChunkCoordIntPair chunkcoordintpair) {
@@ -1498,6 +1544,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
@@ -1498,6 +1536,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
}
public void setViewDistance(int i) { // Paper - public
@@ -4629,7 +4588,7 @@ index fcd3388d88..20f59df866 100644
int j = MathHelper.clamp(i + 1, 3, 33); // Paper - diff on change, these make the lower view distance limit 2 and the upper 32
if (j != this.viewDistance) {
@@ -1511,6 +1558,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
@@ -1511,6 +1550,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
// Paper start - no-tick view distance
public final void setNoTickViewDistance(int viewDistance) {
@@ -4637,7 +4596,7 @@ index fcd3388d88..20f59df866 100644
viewDistance = viewDistance == -1 ? -1 : MathHelper.clamp(viewDistance, 2, 32);
this.noTickViewDistance = viewDistance;
@@ -2037,22 +2085,25 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
@@ -2037,22 +2077,25 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
private final void processTrackQueue() {
this.world.timings.tracker1.startTiming();
try {
@@ -6507,7 +6466,7 @@ index f011869880..26a8c4ffe2 100644
return this.j.d();
}
diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
index 95da2a5602..11b4d62c46 100644
index 95da2a5602..215789b762 100644
--- a/src/main/java/net/minecraft/server/WorldServer.java
+++ b/src/main/java/net/minecraft/server/WorldServer.java
@@ -51,12 +51,13 @@ import org.bukkit.event.server.MapInitializeEvent;
@@ -6998,35 +6957,16 @@ index 95da2a5602..11b4d62c46 100644
Entity entity1 = entity.getVehicle();
/* CraftBukkit start - We prevent spawning in general, so this butchering is not needed
@@ -510,6 +926,13 @@ public class WorldServer extends World implements GeneratorAccessSeed {
gameprofilerfiller.enter("checkDespawn");
if (!entity.dead) {
entity.checkDespawn();
+ // Tuinity start - optimise notify()
+ if (entity.inChunk && entity.valid) {
+ this.updateNavigatorsInRegion(entity);
+ } else {
+ this.removeNavigatorsFromData(entity);
+ }
+ // Tuinity end - optimise notify()
}
gameprofilerfiller.exit();
@@ -530,14 +953,20 @@ public class WorldServer extends World implements GeneratorAccessSeed {
@@ -530,7 +946,7 @@ public class WorldServer extends World implements GeneratorAccessSeed {
gameprofilerfiller.enter("remove");
if (entity.dead) {
this.removeEntityFromChunk(entity);
- objectiterator.remove();
+ this.entitiesById.remove(entity.getId()); // Tuinity
this.unregisterEntity(entity);
+ } else if (entity.inChunk && entity.valid) { // Tuinity start - optimise notify()
+ this.updateNavigatorsInRegion(entity);
+ } else {
+ this.removeNavigatorsFromData(entity);
}
+ // Tuinity end - optimise notify()
gameprofilerfiller.exit();
@@ -538,6 +954,7 @@ public class WorldServer extends World implements GeneratorAccessSeed {
}
timings.entityTick.stopTiming(); // Spigot
@@ -7034,7 +6974,7 @@ index 95da2a5602..11b4d62c46 100644
this.tickingEntities = false;
// Paper start
for (java.lang.Runnable run : this.afterEntityTickingTasks) {
@@ -549,7 +978,7 @@ public class WorldServer extends World implements GeneratorAccessSeed {
@@ -549,7 +966,7 @@ public class WorldServer extends World implements GeneratorAccessSeed {
}
this.afterEntityTickingTasks.clear();
// Paper end
@@ -7043,7 +6983,7 @@ index 95da2a5602..11b4d62c46 100644
Entity entity2;
@@ -559,7 +988,7 @@ public class WorldServer extends World implements GeneratorAccessSeed {
@@ -559,7 +976,7 @@ public class WorldServer extends World implements GeneratorAccessSeed {
}
timings.tickEntities.stopTiming(); // Spigot
@@ -7052,7 +6992,7 @@ index 95da2a5602..11b4d62c46 100644
this.tickBlockEntities();
}
@@ -805,7 +1234,26 @@ public class WorldServer extends World implements GeneratorAccessSeed {
@@ -805,7 +1222,26 @@ public class WorldServer extends World implements GeneratorAccessSeed {
}
@@ -7079,7 +7019,7 @@ index 95da2a5602..11b4d62c46 100644
if (!(entity instanceof EntityHuman) && !this.getChunkProvider().a(entity)) {
this.chunkCheck(entity);
} else {
@@ -858,6 +1306,11 @@ public class WorldServer extends World implements GeneratorAccessSeed {
@@ -858,6 +1294,11 @@ public class WorldServer extends World implements GeneratorAccessSeed {
//} finally { timer.stopTiming(); } // Paper - timings - move up
}
@@ -7091,45 +7031,7 @@ index 95da2a5602..11b4d62c46 100644
}
public void a(Entity entity, Entity entity1) {
@@ -915,6 +1368,12 @@ public class WorldServer extends World implements GeneratorAccessSeed {
int i = MathHelper.floor(entity.locX() / 16.0D);
int j = Math.min(15, Math.max(0, MathHelper.floor(entity.locY() / 16.0D))); // Paper - stay consistent with chunk add/remove behavior
int k = MathHelper.floor(entity.locZ() / 16.0D);
+ // Tuinity start
+ int oldRegionX = entity.chunkX >> com.tuinity.tuinity.chunk.SingleThreadChunkRegionManager.REGION_CHUNK_SIZE_SHIFT;
+ int oldRegionZ = entity.chunkZ >> com.tuinity.tuinity.chunk.SingleThreadChunkRegionManager.REGION_CHUNK_SIZE_SHIFT;
+ int newRegionX = i >> com.tuinity.tuinity.chunk.SingleThreadChunkRegionManager.REGION_CHUNK_SIZE_SHIFT;
+ int newRegionZ = k >> com.tuinity.tuinity.chunk.SingleThreadChunkRegionManager.REGION_CHUNK_SIZE_SHIFT;
+ // Tuinity end
if (!entity.inChunk || entity.chunkX != i || entity.chunkY != j || entity.chunkZ != k) {
// Paper start - remove entity if its in a chunk more correctly.
@@ -924,6 +1383,12 @@ public class WorldServer extends World implements GeneratorAccessSeed {
}
// Paper end
+ // Tuinity start
+ if (oldRegionX != newRegionX || oldRegionZ != newRegionZ) {
+ this.removeNavigatorsFromData(entity);
+ }
+ // Tuinity end
+
if (entity.inChunk && this.isChunkLoaded(entity.chunkX, entity.chunkZ)) {
this.getChunkAt(entity.chunkX, entity.chunkZ).a(entity, entity.chunkY);
}
@@ -937,6 +1402,11 @@ public class WorldServer extends World implements GeneratorAccessSeed {
} else {
this.getChunkAt(i, k).a(entity);
}
+ // Tuinity start
+ if (entity.inChunk && (oldRegionX != newRegionX || oldRegionZ != newRegionZ)) {
+ this.addNavigatorsIfPathingToRegion(entity);
+ }
+ // Tuinity end
}
this.getMethodProfiler().exit();
@@ -1295,7 +1765,7 @@ public class WorldServer extends World implements GeneratorAccessSeed {
@@ -1295,7 +1736,7 @@ public class WorldServer extends World implements GeneratorAccessSeed {
Entity entity = (Entity) iterator.next();
if (!(entity instanceof EntityPlayer)) {
@@ -7138,7 +7040,7 @@ index 95da2a5602..11b4d62c46 100644
throw (IllegalStateException) SystemUtils.c((Throwable) (new IllegalStateException("Removing entity while ticking!")));
}
@@ -1323,6 +1793,7 @@ public class WorldServer extends World implements GeneratorAccessSeed {
@@ -1323,6 +1764,7 @@ public class WorldServer extends World implements GeneratorAccessSeed {
public void unregisterEntity(Entity entity) {
org.spigotmc.AsyncCatcher.catchOp("entity unregister"); // Spigot
@@ -7146,7 +7048,7 @@ index 95da2a5602..11b4d62c46 100644
// Paper start - fix entity registration issues
if (entity instanceof EntityComplexPart) {
// Usually this is a no-op for complex parts, and ID's should be removed, but go ahead and remove it anyways
@@ -1389,17 +1860,108 @@ public class WorldServer extends World implements GeneratorAccessSeed {
@@ -1389,12 +1831,16 @@ public class WorldServer extends World implements GeneratorAccessSeed {
this.getScoreboard().a(entity);
// CraftBukkit start - SPIGOT-5278
if (entity instanceof EntityDrowned) {
@@ -7164,101 +7066,9 @@ index 95da2a5602..11b4d62c46 100644
+ this.navigators.remove(((EntityInsentient) entity).getNavigation()); this.navigatorsForIteration.remove(((EntityInsentient) entity).getNavigation());
+ // Tuinity end
}
+ this.removeNavigatorsFromData(entity); // Tuinity - optimise notify()
new com.destroystokyo.paper.event.entity.EntityRemoveFromWorldEvent(entity.getBukkitEntity()).callEvent(); // Paper - fire while valid
entity.valid = false; // CraftBukkit
}
+ // Tuinity start - optimise notify()
+ void removeNavigatorsIfNotPathingFromRegion(Entity entity) {
+ com.tuinity.tuinity.chunk.SingleThreadChunkRegionManager.RegionSection<PlayerChunkMap.RegionData> section =
+ this.getChunkProvider().playerChunkMap.dataRegionManager.getRegionSection(entity.chunkX, entity.chunkZ);
+ if (section != null) {
+ com.tuinity.tuinity.util.maplist.IteratorSafeOrderedReferenceSet<NavigationAbstract> navigators = (com.tuinity.tuinity.util.maplist.IteratorSafeOrderedReferenceSet)section.getOrCreateData(PlayerChunkMap.RegionData.PATHING_NAVIGATORS);
+ // Copied from above
+ if (entity instanceof EntityDrowned) {
+ if (!((EntityDrowned)entity).navigationWater.isViableForPathRecalculationChecking()) {
+ navigators.remove(((EntityDrowned)entity).navigationWater);
+ }
+ if (!((EntityDrowned)entity).navigationLand.isViableForPathRecalculationChecking()) {
+ navigators.remove(((EntityDrowned)entity).navigationLand);
+ }
+ } else if (entity instanceof EntityInsentient) {
+ if (!((EntityInsentient)entity).getNavigation().isViableForPathRecalculationChecking()) {
+ navigators.remove(((EntityInsentient)entity).getNavigation());
+ }
+ }
+ }
+ }
+
+ void removeNavigatorsFromData(Entity entity) {
+ com.tuinity.tuinity.chunk.SingleThreadChunkRegionManager.RegionSection<PlayerChunkMap.RegionData> section =
+ this.getChunkProvider().playerChunkMap.dataRegionManager.getRegionSection(entity.chunkX, entity.chunkZ);
+ if (section != null) {
+ com.tuinity.tuinity.util.maplist.IteratorSafeOrderedReferenceSet<NavigationAbstract> navigators = (com.tuinity.tuinity.util.maplist.IteratorSafeOrderedReferenceSet)section.getOrCreateData(PlayerChunkMap.RegionData.PATHING_NAVIGATORS);
+ // Copied from above
+ if (entity instanceof EntityDrowned) {
+ navigators.remove(((EntityDrowned)entity).navigationWater);
+ navigators.remove(((EntityDrowned)entity).navigationLand);
+ } else if (entity instanceof EntityInsentient) {
+ navigators.remove(((EntityInsentient)entity).getNavigation());
+ }
+ }
+ }
+
+ void addNavigatorsIfPathingToRegion(Entity entity) {
+ com.tuinity.tuinity.chunk.SingleThreadChunkRegionManager.RegionSection<PlayerChunkMap.RegionData> section =
+ this.getChunkProvider().playerChunkMap.dataRegionManager.getRegionSection(entity.chunkX, entity.chunkZ);
+ if (section != null) {
+ com.tuinity.tuinity.util.maplist.IteratorSafeOrderedReferenceSet<NavigationAbstract> navigators = (com.tuinity.tuinity.util.maplist.IteratorSafeOrderedReferenceSet)section.getOrCreateData(PlayerChunkMap.RegionData.PATHING_NAVIGATORS);
+ // Copied from above
+ if (entity instanceof EntityDrowned) {
+ if (((EntityDrowned)entity).navigationWater.isViableForPathRecalculationChecking()) {
+ navigators.add(((EntityDrowned)entity).navigationWater);
+ }
+ if (((EntityDrowned)entity).navigationLand.isViableForPathRecalculationChecking()) {
+ navigators.add(((EntityDrowned)entity).navigationLand);
+ }
+ } else if (entity instanceof EntityInsentient) {
+ if (((EntityInsentient)entity).getNavigation().isViableForPathRecalculationChecking()) {
+ navigators.add(((EntityInsentient)entity).getNavigation());
+ }
+ }
+ }
+ }
+
+ void updateNavigatorsInRegion(Entity entity) {
+ com.tuinity.tuinity.chunk.SingleThreadChunkRegionManager.RegionSection<PlayerChunkMap.RegionData> section =
+ this.getChunkProvider().playerChunkMap.dataRegionManager.getRegionSection(entity.chunkX, entity.chunkZ);
+ if (section != null) {
+ com.tuinity.tuinity.util.maplist.IteratorSafeOrderedReferenceSet<NavigationAbstract> navigators = (com.tuinity.tuinity.util.maplist.IteratorSafeOrderedReferenceSet)section.getOrCreateData(PlayerChunkMap.RegionData.PATHING_NAVIGATORS);
+ // Copied from above
+ if (entity instanceof EntityDrowned) {
+ if (((EntityDrowned)entity).navigationWater.isViableForPathRecalculationChecking()) {
+ navigators.add(((EntityDrowned)entity).navigationWater);
+ } else {
+ navigators.remove(((EntityDrowned)entity).navigationWater);
+ }
+ if (((EntityDrowned)entity).navigationLand.isViableForPathRecalculationChecking()) {
+ navigators.add(((EntityDrowned)entity).navigationLand);
+ } else {
+ navigators.remove(((EntityDrowned)entity).navigationLand);
+ }
+ } else if (entity instanceof EntityInsentient) {
+ if (((EntityInsentient)entity).getNavigation().isViableForPathRecalculationChecking()) {
+ navigators.add(((EntityInsentient)entity).getNavigation());
+ } else {
+ navigators.remove(((EntityInsentient)entity).getNavigation());
+ }
+ }
+ }
+ }
+ // Tuinity end - optimise notify()
+
private void registerEntity(Entity entity) {
org.spigotmc.AsyncCatcher.catchOp("entity register"); // Spigot
// Paper start - don't double enqueue entity registration
@@ -1410,7 +1972,7 @@ public class WorldServer extends World implements GeneratorAccessSeed {
@@ -1410,7 +1856,7 @@ public class WorldServer extends World implements GeneratorAccessSeed {
return;
}
// Paper end
@@ -7267,7 +7077,7 @@ index 95da2a5602..11b4d62c46 100644
if (!entity.isQueuedForRegister) { // Paper
this.entitiesToAdd.add(entity);
entity.isQueuedForRegister = true; // Paper
@@ -1418,6 +1980,7 @@ public class WorldServer extends World implements GeneratorAccessSeed {
@@ -1418,6 +1864,7 @@ public class WorldServer extends World implements GeneratorAccessSeed {
} else {
entity.isQueuedForRegister = false; // Paper
this.entitiesById.put(entity.getId(), entity);
@@ -7275,7 +7085,7 @@ index 95da2a5602..11b4d62c46 100644
if (entity instanceof EntityEnderDragon) {
EntityComplexPart[] aentitycomplexpart = ((EntityEnderDragon) entity).eJ();
int i = aentitycomplexpart.length;
@@ -1426,6 +1989,7 @@ public class WorldServer extends World implements GeneratorAccessSeed {
@@ -1426,6 +1873,7 @@ public class WorldServer extends World implements GeneratorAccessSeed {
EntityComplexPart entitycomplexpart = aentitycomplexpart[j];
this.entitiesById.put(entitycomplexpart.getId(), entitycomplexpart);
@@ -7283,7 +7093,7 @@ index 95da2a5602..11b4d62c46 100644
}
}
@@ -1450,12 +2014,16 @@ public class WorldServer extends World implements GeneratorAccessSeed {
@@ -1450,12 +1898,16 @@ public class WorldServer extends World implements GeneratorAccessSeed {
// this.getChunkProvider().addEntity(entity); // Paper - moved down below valid=true
// CraftBukkit start - SPIGOT-5278
if (entity instanceof EntityDrowned) {
@@ -7303,7 +7113,7 @@ index 95da2a5602..11b4d62c46 100644
}
entity.valid = true; // CraftBukkit
this.getChunkProvider().addEntity(entity); // Paper - from above to be below valid=true
@@ -1471,7 +2039,7 @@ public class WorldServer extends World implements GeneratorAccessSeed {
@@ -1471,7 +1923,7 @@ public class WorldServer extends World implements GeneratorAccessSeed {
}
public void removeEntity(Entity entity) {
@@ -7312,7 +7122,7 @@ index 95da2a5602..11b4d62c46 100644
throw (IllegalStateException) SystemUtils.c((Throwable) (new IllegalStateException("Removing entity while ticking!")));
} else {
this.removeEntityFromChunk(entity);
@@ -1567,13 +2135,32 @@ public class WorldServer extends World implements GeneratorAccessSeed {
@@ -1567,13 +2019,16 @@ public class WorldServer extends World implements GeneratorAccessSeed {
@Override
public void notify(BlockPosition blockposition, IBlockData iblockdata, IBlockData iblockdata1, int i) {
@@ -7322,50 +7132,21 @@ index 95da2a5602..11b4d62c46 100644
VoxelShape voxelshape1 = iblockdata1.getCollisionShape(this, blockposition);
if (VoxelShapes.c(voxelshape, voxelshape1, OperatorBoolean.NOT_SAME)) {
+ // Tuinity start - optimise notify()
+ com.tuinity.tuinity.chunk.SingleThreadChunkRegionManager.Region<PlayerChunkMap.RegionData> region = this.getChunkProvider().playerChunkMap.dataRegionManager.getRegion(blockposition.getX() >> 4, blockposition.getZ() >> 4);
+ if (region == null) {
+ return;
+ }
+ // Tuinity end - optimise notify()
boolean wasTicking = this.tickingEntities; this.tickingEntities = true; // Paper
- Iterator iterator = this.navigators.iterator();
+ // Tuinity start
+ // Tuinity start - optimise notify()
+ com.tuinity.tuinity.util.maplist.IteratorSafeOrderedReferenceSet.Iterator<com.tuinity.tuinity.chunk.SingleThreadChunkRegionManager.RegionSection<PlayerChunkMap.RegionData>> sectionIterator = null;
+ try {
+ for (sectionIterator = region.getSections(); sectionIterator.hasNext();) {
+ com.tuinity.tuinity.chunk.SingleThreadChunkRegionManager.RegionSection<PlayerChunkMap.RegionData> section = sectionIterator.next();
+ com.tuinity.tuinity.util.maplist.IteratorSafeOrderedReferenceSet<NavigationAbstract> navigators = (com.tuinity.tuinity.util.maplist.IteratorSafeOrderedReferenceSet)section.getData(PlayerChunkMap.RegionData.PATHING_NAVIGATORS);
+ if (navigators == null) {
+ continue;
+ }
+ com.tuinity.tuinity.util.maplist.IteratorSafeOrderedReferenceSet.Iterator iterator = navigators.iterator();
+ // Tuinity end - optimise notify()
+ com.tuinity.tuinity.util.maplist.IteratorSafeOrderedReferenceSet.Iterator iterator = this.navigatorsForIteration.iterator();
+ try { // Tuinity end
while (iterator.hasNext()) {
NavigationAbstract navigationabstract = (NavigationAbstract) iterator.next();
@@ -1581,7 +2168,21 @@ public class WorldServer extends World implements GeneratorAccessSeed {
if (!navigationabstract.i()) {
@@ -1582,6 +2037,9 @@ public class WorldServer extends World implements GeneratorAccessSeed {
navigationabstract.b(blockposition);
}
- }
+ // Tuinity start - optimise notify()
+ if (!navigationabstract.isViableForPathRecalculationChecking()) {
+ navigators.remove(navigationabstract);
+ }
+ // Tuinity end - optimise notify()
+ }
}
+ } finally { // Tuinity start
+ iterator.finishedIterating();
+ } // Tuinity end
+ } // Tuinity start - optimise notify()
+ } finally {
+ if (sectionIterator != null) {
+ sectionIterator.finishedIterating();
+ }
+ } // Tuinity end - optimise notify()
this.tickingEntities = wasTicking; // Paper
}

View File

@@ -5,7 +5,7 @@ Subject: [PATCH] AFK API
diff --git a/src/main/java/net/minecraft/server/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java
index ce4ebc96c..eb62555cb 100644
index ce4ebc96c0..eb62555cb2 100644
--- a/src/main/java/net/minecraft/server/EntityHuman.java
+++ b/src/main/java/net/minecraft/server/EntityHuman.java
@@ -84,6 +84,15 @@ public abstract class EntityHuman extends EntityLiving {
@@ -25,7 +25,7 @@ index ce4ebc96c..eb62555cb 100644
super(EntityTypes.PLAYER, world);
this.bL = ItemStack.b;
diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java
index 8b1e866b3..237b85135 100644
index 8e1655a975..3d77298806 100644
--- a/src/main/java/net/minecraft/server/EntityPlayer.java
+++ b/src/main/java/net/minecraft/server/EntityPlayer.java
@@ -1719,8 +1719,54 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
@@ -84,7 +84,7 @@ index 8b1e866b3..237b85135 100644
return this.serverStatisticManager;
}
diff --git a/src/main/java/net/minecraft/server/IEntityAccess.java b/src/main/java/net/minecraft/server/IEntityAccess.java
index 882b82d89..90c37e4a8 100644
index 882b82d895..90c37e4a8e 100644
--- a/src/main/java/net/minecraft/server/IEntityAccess.java
+++ b/src/main/java/net/minecraft/server/IEntityAccess.java
@@ -149,28 +149,18 @@ public interface IEntityAccess {
@@ -129,7 +129,7 @@ index 882b82d89..90c37e4a8 100644
@Nullable
diff --git a/src/main/java/net/minecraft/server/IEntitySelector.java b/src/main/java/net/minecraft/server/IEntitySelector.java
index a9b0c78d6..c8e384ab6 100644
index a9b0c78d6d..c8e384ab69 100644
--- a/src/main/java/net/minecraft/server/IEntitySelector.java
+++ b/src/main/java/net/minecraft/server/IEntitySelector.java
@@ -7,6 +7,7 @@ import javax.annotation.Nullable;
@@ -154,7 +154,7 @@ index a9b0c78d6..c8e384ab6 100644
// Paper start
public static final Predicate<Entity> affectsSpawning = (entity) -> {
diff --git a/src/main/java/net/minecraft/server/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java
index 602ed9aaa..43a88b728 100644
index e4aab53484..02feb7beca 100644
--- a/src/main/java/net/minecraft/server/PlayerConnection.java
+++ b/src/main/java/net/minecraft/server/PlayerConnection.java
@@ -236,6 +236,12 @@ public class PlayerConnection implements PacketListenerPlayIn {
@@ -198,7 +198,7 @@ index 602ed9aaa..43a88b728 100644
if (from.getX() != Double.MAX_VALUE) {
Location oldTo = to.clone();
diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
index 14318d046..ebf78f2cc 100644
index 215789b762..aac4e489a5 100644
--- a/src/main/java/net/minecraft/server/WorldServer.java
+++ b/src/main/java/net/minecraft/server/WorldServer.java
@@ -843,7 +843,7 @@ public class WorldServer extends World implements GeneratorAccessSeed {
@@ -210,7 +210,7 @@ index 14318d046..ebf78f2cc 100644
})) {
// CraftBukkit start
long l = this.worldData.getDayTime() + 24000L;
@@ -1176,7 +1176,7 @@ public class WorldServer extends World implements GeneratorAccessSeed {
@@ -1164,7 +1164,7 @@ public class WorldServer extends World implements GeneratorAccessSeed {
while (iterator.hasNext()) {
EntityPlayer entityplayer = (EntityPlayer) iterator.next();
@@ -220,7 +220,7 @@ index 14318d046..ebf78f2cc 100644
} else if (entityplayer.isSleeping()) {
++j;
diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java
index 803a7ff92..d699a9168 100644
index 803a7ff92a..d699a91685 100644
--- a/src/main/java/net/pl3x/purpur/PurpurConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java
@@ -1,6 +1,7 @@
@@ -248,7 +248,7 @@ index 803a7ff92..d699a9168 100644
private static void timingsSettings() {
timingsUrl = getString("settings.timings.url", timingsUrl);
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
index 361f7857e..2578a4677 100644
index 361f7857e4..2578a4677d 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -56,4 +56,15 @@ public class PurpurWorldConfig {
@@ -268,7 +268,7 @@ index 361f7857e..2578a4677 100644
+ }
}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
index 715d2c5e8..4904cb2ff 100644
index 715d2c5e88..4904cb2ff1 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
@@ -2155,4 +2155,21 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
@@ -294,7 +294,7 @@ index 715d2c5e8..4904cb2ff 100644
+ // Purpur end
}
diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java
index 37e930e0c..89dc611cd 100644
index 0b93635ba5..b47d6fa2de 100644
--- a/src/main/java/org/spigotmc/ActivationRange.java
+++ b/src/main/java/org/spigotmc/ActivationRange.java
@@ -207,6 +207,7 @@ public class ActivationRange

View File

@@ -5,10 +5,10 @@ Subject: [PATCH] Zombie horse naturally spawn
diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
index ebf78f2cc..646f9180f 100644
index aac4e489a5..b75bbca4da 100644
--- a/src/main/java/net/minecraft/server/WorldServer.java
+++ b/src/main/java/net/minecraft/server/WorldServer.java
@@ -1053,12 +1053,18 @@ public class WorldServer extends World implements GeneratorAccessSeed {
@@ -1041,12 +1041,18 @@ public class WorldServer extends World implements GeneratorAccessSeed {
boolean flag1 = this.getGameRules().getBoolean(GameRules.DO_MOB_SPAWNING) && this.random.nextDouble() < (double) difficultydamagescaler.b() * paperConfig.skeleHorseSpawnChance; // Paper
if (flag1) {
@@ -34,7 +34,7 @@ index ebf78f2cc..646f9180f 100644
EntityLightning entitylightning = (EntityLightning) EntityTypes.LIGHTNING_BOLT.a((World) this);
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
index 0073e3b85..b652bfbdc 100644
index 0073e3b85a..b652bfbdc3 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -145,4 +145,9 @@ public class PurpurWorldConfig {

View File

@@ -5,7 +5,7 @@ Subject: [PATCH] Cat spawning options
diff --git a/src/main/java/net/minecraft/server/IEntityAccess.java b/src/main/java/net/minecraft/server/IEntityAccess.java
index 90c37e4a8..7a42feb16 100644
index 90c37e4a8e..7a42feb16e 100644
--- a/src/main/java/net/minecraft/server/IEntityAccess.java
+++ b/src/main/java/net/minecraft/server/IEntityAccess.java
@@ -44,6 +44,7 @@ public interface IEntityAccess {
@@ -17,7 +17,7 @@ index 90c37e4a8..7a42feb16 100644
return this.a(oclass, axisalignedbb, IEntitySelector.g);
}
diff --git a/src/main/java/net/minecraft/server/MobSpawnerCat.java b/src/main/java/net/minecraft/server/MobSpawnerCat.java
index 5e17868a7..6d0ebd8af 100644
index 5e17868a76..6d0ebd8afe 100644
--- a/src/main/java/net/minecraft/server/MobSpawnerCat.java
+++ b/src/main/java/net/minecraft/server/MobSpawnerCat.java
@@ -16,7 +16,7 @@ public class MobSpawnerCat implements MobSpawner {
@@ -62,7 +62,7 @@ index 5e17868a7..6d0ebd8af 100644
}
diff --git a/src/main/java/net/minecraft/server/VillagePlace.java b/src/main/java/net/minecraft/server/VillagePlace.java
index adacfce6f..21e401acd 100644
index adacfce6f3..21e401acd7 100644
--- a/src/main/java/net/minecraft/server/VillagePlace.java
+++ b/src/main/java/net/minecraft/server/VillagePlace.java
@@ -45,6 +45,7 @@ public class VillagePlace extends RegionFileSection<VillagePlaceSection> {
@@ -74,7 +74,7 @@ index adacfce6f..21e401acd 100644
return this.c(predicate, blockposition, i, villageplace_occupancy).count();
}
diff --git a/src/main/java/net/minecraft/server/VillagePlaceType.java b/src/main/java/net/minecraft/server/VillagePlaceType.java
index a5718af9b..b6b4c8c49 100644
index a5718af9b6..b6b4c8c491 100644
--- a/src/main/java/net/minecraft/server/VillagePlaceType.java
+++ b/src/main/java/net/minecraft/server/VillagePlaceType.java
@@ -44,7 +44,7 @@ public class VillagePlaceType {
@@ -95,10 +95,10 @@ index a5718af9b..b6b4c8c49 100644
return this.E;
}
diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
index 07b91db7e..27913bb9c 100644
index b75bbca4da..e2f714382c 100644
--- a/src/main/java/net/minecraft/server/WorldServer.java
+++ b/src/main/java/net/minecraft/server/WorldServer.java
@@ -2565,6 +2565,7 @@ public class WorldServer extends World implements GeneratorAccessSeed {
@@ -2422,6 +2422,7 @@ public class WorldServer extends World implements GeneratorAccessSeed {
}
}
@@ -107,7 +107,7 @@ index 07b91db7e..27913bb9c 100644
return this.getChunkProvider().j();
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
index f01c74a2e..b32f4d74a 100644
index f01c74a2ea..b32f4d74a0 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -118,6 +118,15 @@ public class PurpurWorldConfig {

View File

@@ -5,7 +5,7 @@ Subject: [PATCH] Ridables
diff --git a/src/main/java/net/minecraft/server/AttributeDefaults.java b/src/main/java/net/minecraft/server/AttributeDefaults.java
index da66cf0a4..3aa05a80f 100644
index da66cf0a45..3aa05a80fe 100644
--- a/src/main/java/net/minecraft/server/AttributeDefaults.java
+++ b/src/main/java/net/minecraft/server/AttributeDefaults.java
@@ -9,7 +9,80 @@ import org.apache.logging.log4j.Logger;
@@ -91,7 +91,7 @@ index da66cf0a4..3aa05a80f 100644
public static AttributeProvider a(EntityTypes<? extends EntityLiving> entitytypes) {
return (AttributeProvider) AttributeDefaults.b.get(entitytypes);
diff --git a/src/main/java/net/minecraft/server/AttributeProvider.java b/src/main/java/net/minecraft/server/AttributeProvider.java
index dd235a6fc..ac902c614 100644
index dd235a6fc4..ac902c614d 100644
--- a/src/main/java/net/minecraft/server/AttributeProvider.java
+++ b/src/main/java/net/minecraft/server/AttributeProvider.java
@@ -101,6 +101,7 @@ public class AttributeProvider {
@@ -103,7 +103,7 @@ index dd235a6fc..ac902c614 100644
this.b = true;
return new AttributeProvider(this.a);
diff --git a/src/main/java/net/minecraft/server/ControllerLookDolphin.java b/src/main/java/net/minecraft/server/ControllerLookDolphin.java
index e5bdddfc1..8200ba60b 100644
index e5bdddfc14..8200ba60b7 100644
--- a/src/main/java/net/minecraft/server/ControllerLookDolphin.java
+++ b/src/main/java/net/minecraft/server/ControllerLookDolphin.java
@@ -1,6 +1,6 @@
@@ -124,7 +124,7 @@ index e5bdddfc1..8200ba60b 100644
this.d = false;
this.a.aC = this.a(this.a.aC, this.h() + 20.0F, this.b);
diff --git a/src/main/java/net/minecraft/server/ControllerMove.java b/src/main/java/net/minecraft/server/ControllerMove.java
index 8f9fb058c..eaf446946 100644
index 8f9fb058c1..eaf4469468 100644
--- a/src/main/java/net/minecraft/server/ControllerMove.java
+++ b/src/main/java/net/minecraft/server/ControllerMove.java
@@ -6,9 +6,9 @@ public class ControllerMove {
@@ -141,7 +141,7 @@ index 8f9fb058c..eaf446946 100644
public ControllerMove(EntityInsentient entityinsentient) {
diff --git a/src/main/java/net/minecraft/server/DamageSource.java b/src/main/java/net/minecraft/server/DamageSource.java
index bd0267ee4..8b36ac2b0 100644
index bd0267ee4b..8b36ac2b09 100644
--- a/src/main/java/net/minecraft/server/DamageSource.java
+++ b/src/main/java/net/minecraft/server/DamageSource.java
@@ -56,6 +56,7 @@ public class DamageSource {
@@ -161,7 +161,7 @@ index bd0267ee4..8b36ac2b0 100644
this.B = true;
return this;
diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
index 1f8ea2eeb..ade77f6fe 100644
index abe17d1535..976faf3bf1 100644
--- a/src/main/java/net/minecraft/server/Entity.java
+++ b/src/main/java/net/minecraft/server/Entity.java
@@ -80,7 +80,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
@@ -278,10 +278,10 @@ index 1f8ea2eeb..ade77f6fe 100644
@Override
public void sendMessage(IChatBaseComponent ichatbasecomponent, UUID uuid) {}
@@ -3612,4 +3641,47 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
void accept(Entity entity, double d0, double d1, double d2);
@@ -3618,4 +3647,47 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
return entityCount.incrementAndGet();
}
// Paper end
+
+ // Purpur start
+ private EntityHuman rider;
@@ -327,7 +327,7 @@ index 1f8ea2eeb..ade77f6fe 100644
+ // Purpur end
}
diff --git a/src/main/java/net/minecraft/server/EntityBat.java b/src/main/java/net/minecraft/server/EntityBat.java
index f230d84fa..bbf61d011 100644
index f230d84faa..bbf61d0111 100644
--- a/src/main/java/net/minecraft/server/EntityBat.java
+++ b/src/main/java/net/minecraft/server/EntityBat.java
@@ -14,9 +14,48 @@ public class EntityBat extends EntityAmbient {
@@ -403,7 +403,7 @@ index f230d84fa..bbf61d011 100644
BlockPosition blockposition = this.getChunkCoordinates();
BlockPosition blockposition1 = blockposition.up();
diff --git a/src/main/java/net/minecraft/server/EntityBee.java b/src/main/java/net/minecraft/server/EntityBee.java
index b1ff30fb1..0ed37e18f 100644
index b1ff30fb15..0ed37e18f7 100644
--- a/src/main/java/net/minecraft/server/EntityBee.java
+++ b/src/main/java/net/minecraft/server/EntityBee.java
@@ -37,6 +37,7 @@ public class EntityBee extends EntityAnimal implements IEntityAngerable, EntityB
@@ -534,7 +534,7 @@ index b1ff30fb1..0ed37e18f 100644
}
diff --git a/src/main/java/net/minecraft/server/EntityBlaze.java b/src/main/java/net/minecraft/server/EntityBlaze.java
index f55f12530..22b9c84b0 100644
index f55f125306..22b9c84b02 100644
--- a/src/main/java/net/minecraft/server/EntityBlaze.java
+++ b/src/main/java/net/minecraft/server/EntityBlaze.java
@@ -10,6 +10,7 @@ public class EntityBlaze extends EntityMonster {
@@ -614,7 +614,7 @@ index f55f12530..22b9c84b0 100644
if (this.c <= 0) {
this.c = 100;
diff --git a/src/main/java/net/minecraft/server/EntityCat.java b/src/main/java/net/minecraft/server/EntityCat.java
index 79de11ce2..eba8e77ca 100644
index 79de11ce2f..eba8e77ca7 100644
--- a/src/main/java/net/minecraft/server/EntityCat.java
+++ b/src/main/java/net/minecraft/server/EntityCat.java
@@ -41,6 +41,25 @@ public class EntityCat extends EntityTameableAnimal {
@@ -694,7 +694,7 @@ index 79de11ce2..eba8e77ca 100644
@Override
diff --git a/src/main/java/net/minecraft/server/EntityCaveSpider.java b/src/main/java/net/minecraft/server/EntityCaveSpider.java
index 776f3d25a..2e1f2dec1 100644
index 776f3d25a6..2e1f2dec17 100644
--- a/src/main/java/net/minecraft/server/EntityCaveSpider.java
+++ b/src/main/java/net/minecraft/server/EntityCaveSpider.java
@@ -8,6 +8,18 @@ public class EntityCaveSpider extends EntitySpider {
@@ -717,7 +717,7 @@ index 776f3d25a..2e1f2dec1 100644
return EntitySpider.eK().a(GenericAttributes.MAX_HEALTH, 12.0D);
}
diff --git a/src/main/java/net/minecraft/server/EntityChicken.java b/src/main/java/net/minecraft/server/EntityChicken.java
index 26dee32bf..feca1b369 100644
index 26dee32bfe..feca1b3693 100644
--- a/src/main/java/net/minecraft/server/EntityChicken.java
+++ b/src/main/java/net/minecraft/server/EntityChicken.java
@@ -18,6 +18,16 @@ public class EntityChicken extends EntityAnimal {
@@ -754,7 +754,7 @@ index 26dee32bf..feca1b369 100644
} else {
this.goalSelector.a(1, new PathfinderGoalPanic(this, 1.4D));
diff --git a/src/main/java/net/minecraft/server/EntityCod.java b/src/main/java/net/minecraft/server/EntityCod.java
index 9a99af6e9..039fae4c2 100644
index 9a99af6e9c..039fae4c29 100644
--- a/src/main/java/net/minecraft/server/EntityCod.java
+++ b/src/main/java/net/minecraft/server/EntityCod.java
@@ -6,6 +6,18 @@ public class EntityCod extends EntityFishSchool {
@@ -777,7 +777,7 @@ index 9a99af6e9..039fae4c2 100644
protected ItemStack eK() {
return new ItemStack(Items.COD_BUCKET);
diff --git a/src/main/java/net/minecraft/server/EntityComplexPart.java b/src/main/java/net/minecraft/server/EntityComplexPart.java
index c1b1bd123..26ff230ef 100644
index c1b1bd123e..26ff230ef7 100644
--- a/src/main/java/net/minecraft/server/EntityComplexPart.java
+++ b/src/main/java/net/minecraft/server/EntityComplexPart.java
@@ -47,4 +47,11 @@ public class EntityComplexPart extends Entity {
@@ -793,7 +793,7 @@ index c1b1bd123..26ff230ef 100644
+ // Purpur end
}
diff --git a/src/main/java/net/minecraft/server/EntityCow.java b/src/main/java/net/minecraft/server/EntityCow.java
index cfb009c81..18c2d5393 100644
index cfb009c811..18c2d53937 100644
--- a/src/main/java/net/minecraft/server/EntityCow.java
+++ b/src/main/java/net/minecraft/server/EntityCow.java
@@ -11,9 +11,22 @@ public class EntityCow extends EntityAnimal {
@@ -877,7 +877,7 @@ index cfb009c81..18c2d5393 100644
this.world.addEntity(mooshroom);
this.die();
diff --git a/src/main/java/net/minecraft/server/EntityCreeper.java b/src/main/java/net/minecraft/server/EntityCreeper.java
index 013639cc9..3ddfb5f34 100644
index 013639cc90..3ddfb5f340 100644
--- a/src/main/java/net/minecraft/server/EntityCreeper.java
+++ b/src/main/java/net/minecraft/server/EntityCreeper.java
@@ -18,12 +18,27 @@ public class EntityCreeper extends EntityMonster {
@@ -995,7 +995,7 @@ index 013639cc9..3ddfb5f34 100644
}
// Paper end
diff --git a/src/main/java/net/minecraft/server/EntityDolphin.java b/src/main/java/net/minecraft/server/EntityDolphin.java
index cde5c46fe..306454060 100644
index cde5c46fee..3064540602 100644
--- a/src/main/java/net/minecraft/server/EntityDolphin.java
+++ b/src/main/java/net/minecraft/server/EntityDolphin.java
@@ -17,6 +17,7 @@ public class EntityDolphin extends EntityWaterAnimal {
@@ -1128,7 +1128,7 @@ index cde5c46fe..306454060 100644
this.i.setMot(this.i.getMot().add(0.0D, 0.005D, 0.0D));
}
diff --git a/src/main/java/net/minecraft/server/EntityDrowned.java b/src/main/java/net/minecraft/server/EntityDrowned.java
index 6853ba319..8aa53c617 100644
index 6853ba3194..8aa53c617b 100644
--- a/src/main/java/net/minecraft/server/EntityDrowned.java
+++ b/src/main/java/net/minecraft/server/EntityDrowned.java
@@ -22,6 +22,16 @@ public class EntityDrowned extends EntityZombie implements IRangedEntity {
@@ -1184,7 +1184,7 @@ index 6853ba319..8aa53c617 100644
@Override
diff --git a/src/main/java/net/minecraft/server/EntityEnderDragon.java b/src/main/java/net/minecraft/server/EntityEnderDragon.java
index d617b5345..088aede37 100644
index d617b5345d..088aede370 100644
--- a/src/main/java/net/minecraft/server/EntityEnderDragon.java
+++ b/src/main/java/net/minecraft/server/EntityEnderDragon.java
@@ -46,6 +46,7 @@ public class EntityEnderDragon extends EntityInsentient implements IMonster {
@@ -1334,7 +1334,7 @@ index d617b5345..088aede37 100644
@Override
diff --git a/src/main/java/net/minecraft/server/EntityEnderman.java b/src/main/java/net/minecraft/server/EntityEnderman.java
index fde60d6c8..768764930 100644
index fde60d6c89..7687649300 100644
--- a/src/main/java/net/minecraft/server/EntityEnderman.java
+++ b/src/main/java/net/minecraft/server/EntityEnderman.java
@@ -30,9 +30,22 @@ public class EntityEnderman extends EntityMonster implements IEntityAngerable {
@@ -1402,7 +1402,7 @@ index fde60d6c8..768764930 100644
@Override
diff --git a/src/main/java/net/minecraft/server/EntityEndermite.java b/src/main/java/net/minecraft/server/EntityEndermite.java
index c4b1f318f..30f602bbc 100644
index c4b1f318f7..30f602bbc4 100644
--- a/src/main/java/net/minecraft/server/EntityEndermite.java
+++ b/src/main/java/net/minecraft/server/EntityEndermite.java
@@ -12,14 +12,28 @@ public class EntityEndermite extends EntityMonster {
@@ -1436,7 +1436,7 @@ index c4b1f318f..30f602bbc 100644
}
diff --git a/src/main/java/net/minecraft/server/EntityEvoker.java b/src/main/java/net/minecraft/server/EntityEvoker.java
index ae7b269de..9abbbd59f 100644
index ae7b269def..9abbbd59f4 100644
--- a/src/main/java/net/minecraft/server/EntityEvoker.java
+++ b/src/main/java/net/minecraft/server/EntityEvoker.java
@@ -12,10 +12,23 @@ public class EntityEvoker extends EntityIllagerWizard {
@@ -1496,7 +1496,7 @@ index ae7b269de..9abbbd59f 100644
@Override
diff --git a/src/main/java/net/minecraft/server/EntityFish.java b/src/main/java/net/minecraft/server/EntityFish.java
index 27d0f9351..d281114e5 100644
index 27d0f93510..d281114e5a 100644
--- a/src/main/java/net/minecraft/server/EntityFish.java
+++ b/src/main/java/net/minecraft/server/EntityFish.java
@@ -70,13 +70,12 @@ public abstract class EntityFish extends EntityWaterAnimal {
@@ -1558,7 +1558,7 @@ index 27d0f9351..d281114e5 100644
this.i.setMot(this.i.getMot().add(0.0D, 0.005D, 0.0D));
}
diff --git a/src/main/java/net/minecraft/server/EntityFishSchool.java b/src/main/java/net/minecraft/server/EntityFishSchool.java
index 08372b722..6a8e15f01 100644
index 08372b7226..6a8e15f016 100644
--- a/src/main/java/net/minecraft/server/EntityFishSchool.java
+++ b/src/main/java/net/minecraft/server/EntityFishSchool.java
@@ -16,7 +16,7 @@ public abstract class EntityFishSchool extends EntityFish {
@@ -1571,7 +1571,7 @@ index 08372b722..6a8e15f01 100644
@Override
diff --git a/src/main/java/net/minecraft/server/EntityFox.java b/src/main/java/net/minecraft/server/EntityFox.java
index 04b2bbea0..a73335e36 100644
index 04b2bbea0c..a73335e362 100644
--- a/src/main/java/net/minecraft/server/EntityFox.java
+++ b/src/main/java/net/minecraft/server/EntityFox.java
@@ -55,6 +55,39 @@ public class EntityFox extends EntityAnimal {
@@ -1695,7 +1695,7 @@ index 04b2bbea0..a73335e36 100644
}
diff --git a/src/main/java/net/minecraft/server/EntityGhast.java b/src/main/java/net/minecraft/server/EntityGhast.java
index a67611c4f..e857d6f85 100644
index a67611c4f9..e857d6f854 100644
--- a/src/main/java/net/minecraft/server/EntityGhast.java
+++ b/src/main/java/net/minecraft/server/EntityGhast.java
@@ -14,11 +14,42 @@ public class EntityGhast extends EntityFlying implements IMonster {
@@ -1769,7 +1769,7 @@ index a67611c4f..e857d6f85 100644
if (this.j-- <= 0) {
this.j += this.i.getRandom().nextInt(5) + 2;
diff --git a/src/main/java/net/minecraft/server/EntityGiantZombie.java b/src/main/java/net/minecraft/server/EntityGiantZombie.java
index 8dce2aad7..24eb6dca5 100644
index 8dce2aad77..24eb6dca5e 100644
--- a/src/main/java/net/minecraft/server/EntityGiantZombie.java
+++ b/src/main/java/net/minecraft/server/EntityGiantZombie.java
@@ -11,16 +11,28 @@ public class EntityGiantZombie extends EntityMonster {
@@ -1802,7 +1802,7 @@ index 8dce2aad7..24eb6dca5 100644
this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget<>(this, EntityHuman.class, true));
this.targetSelector.a(3, new PathfinderGoalNearestAttackableTarget<>(this, EntityVillager.class, false));
diff --git a/src/main/java/net/minecraft/server/EntityGuardian.java b/src/main/java/net/minecraft/server/EntityGuardian.java
index d42750fdd..881b2dd45 100644
index d42750fdd4..881b2dd45f 100644
--- a/src/main/java/net/minecraft/server/EntityGuardian.java
+++ b/src/main/java/net/minecraft/server/EntityGuardian.java
@@ -24,15 +24,36 @@ public class EntityGuardian extends EntityMonster {
@@ -1898,7 +1898,7 @@ index d42750fdd..881b2dd45 100644
Vec3D vec3d = new Vec3D(this.b - this.i.locX(), this.c - this.i.locY(), this.d - this.i.locZ());
double d0 = vec3d.f();
diff --git a/src/main/java/net/minecraft/server/EntityGuardianElder.java b/src/main/java/net/minecraft/server/EntityGuardianElder.java
index 5d2870f0e..8148bc8b4 100644
index 5d2870f0e8..8148bc8b4e 100644
--- a/src/main/java/net/minecraft/server/EntityGuardianElder.java
+++ b/src/main/java/net/minecraft/server/EntityGuardianElder.java
@@ -16,6 +16,18 @@ public class EntityGuardianElder extends EntityGuardian {
@@ -1921,7 +1921,7 @@ index 5d2870f0e..8148bc8b4 100644
return EntityGuardian.eM().a(GenericAttributes.MOVEMENT_SPEED, 0.30000001192092896D).a(GenericAttributes.ATTACK_DAMAGE, 8.0D).a(GenericAttributes.MAX_HEALTH, 80.0D);
}
diff --git a/src/main/java/net/minecraft/server/EntityHoglin.java b/src/main/java/net/minecraft/server/EntityHoglin.java
index cf64c8ca2..7f642fe67 100644
index cf64c8ca2c..7f642fe674 100644
--- a/src/main/java/net/minecraft/server/EntityHoglin.java
+++ b/src/main/java/net/minecraft/server/EntityHoglin.java
@@ -13,13 +13,25 @@ public class EntityHoglin extends EntityAnimal implements IMonster, IOglin {
@@ -1978,7 +1978,7 @@ index cf64c8ca2..7f642fe67 100644
@Override
diff --git a/src/main/java/net/minecraft/server/EntityHorse.java b/src/main/java/net/minecraft/server/EntityHorse.java
index 069111952..bd63a25e2 100644
index 069111952a..bd63a25e2c 100644
--- a/src/main/java/net/minecraft/server/EntityHorse.java
+++ b/src/main/java/net/minecraft/server/EntityHorse.java
@@ -12,6 +12,13 @@ public class EntityHorse extends EntityHorseAbstract {
@@ -1996,7 +1996,7 @@ index 069111952..bd63a25e2 100644
protected void eK() {
this.getAttributeInstance(GenericAttributes.MAX_HEALTH).setValue((double) this.fp());
diff --git a/src/main/java/net/minecraft/server/EntityHorseAbstract.java b/src/main/java/net/minecraft/server/EntityHorseAbstract.java
index c7757f9d0..a490d0715 100644
index c7757f9d0a..a490d0715d 100644
--- a/src/main/java/net/minecraft/server/EntityHorseAbstract.java
+++ b/src/main/java/net/minecraft/server/EntityHorseAbstract.java
@@ -39,12 +39,27 @@ public abstract class EntityHorseAbstract extends EntityAnimal implements IInven
@@ -2036,7 +2036,7 @@ index c7757f9d0..a490d0715 100644
}
diff --git a/src/main/java/net/minecraft/server/EntityHorseDonkey.java b/src/main/java/net/minecraft/server/EntityHorseDonkey.java
index 767d18d5a..cb8aee569 100644
index 767d18d5a0..cb8aee5691 100644
--- a/src/main/java/net/minecraft/server/EntityHorseDonkey.java
+++ b/src/main/java/net/minecraft/server/EntityHorseDonkey.java
@@ -8,6 +8,13 @@ public class EntityHorseDonkey extends EntityHorseChestedAbstract {
@@ -2054,7 +2054,7 @@ index 767d18d5a..cb8aee569 100644
protected SoundEffect getSoundAmbient() {
super.getSoundAmbient();
diff --git a/src/main/java/net/minecraft/server/EntityHorseMule.java b/src/main/java/net/minecraft/server/EntityHorseMule.java
index 3dd4d4f0f..243aeb736 100644
index 3dd4d4f0f3..243aeb736e 100644
--- a/src/main/java/net/minecraft/server/EntityHorseMule.java
+++ b/src/main/java/net/minecraft/server/EntityHorseMule.java
@@ -8,6 +8,12 @@ public class EntityHorseMule extends EntityHorseChestedAbstract {
@@ -2071,7 +2071,7 @@ index 3dd4d4f0f..243aeb736 100644
protected SoundEffect getSoundAmbient() {
super.getSoundAmbient();
diff --git a/src/main/java/net/minecraft/server/EntityHorseSkeleton.java b/src/main/java/net/minecraft/server/EntityHorseSkeleton.java
index abbc12c8e..b39feed7a 100644
index abbc12c8e0..b39feed7a9 100644
--- a/src/main/java/net/minecraft/server/EntityHorseSkeleton.java
+++ b/src/main/java/net/minecraft/server/EntityHorseSkeleton.java
@@ -12,6 +12,18 @@ public class EntityHorseSkeleton extends EntityHorseAbstract {
@@ -2112,7 +2112,7 @@ index abbc12c8e..b39feed7a 100644
@Override
diff --git a/src/main/java/net/minecraft/server/EntityHorseZombie.java b/src/main/java/net/minecraft/server/EntityHorseZombie.java
index acc5b8ca9..6e9806662 100644
index acc5b8ca90..6e9806662d 100644
--- a/src/main/java/net/minecraft/server/EntityHorseZombie.java
+++ b/src/main/java/net/minecraft/server/EntityHorseZombie.java
@@ -8,6 +8,18 @@ public class EntityHorseZombie extends EntityHorseAbstract {
@@ -2142,7 +2142,7 @@ index acc5b8ca9..6e9806662 100644
+ protected void eV() { if (world.purpurConfig.zombieHorseCanSwim) goalSelector.a(0, new PathfinderGoalFloat(this)); } // Purpur
}
diff --git a/src/main/java/net/minecraft/server/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java
index 48f9feaea..6c2b57a29 100644
index 48f9feaea1..6c2b57a294 100644
--- a/src/main/java/net/minecraft/server/EntityHuman.java
+++ b/src/main/java/net/minecraft/server/EntityHuman.java
@@ -2148,4 +2148,15 @@ public abstract class EntityHuman extends EntityLiving {
@@ -2162,7 +2162,7 @@ index 48f9feaea..6c2b57a29 100644
+ // Purpur end
}
diff --git a/src/main/java/net/minecraft/server/EntityIllagerIllusioner.java b/src/main/java/net/minecraft/server/EntityIllagerIllusioner.java
index f5c9e4e0a..5e6c7e317 100644
index f5c9e4e0ae..5e6c7e317a 100644
--- a/src/main/java/net/minecraft/server/EntityIllagerIllusioner.java
+++ b/src/main/java/net/minecraft/server/EntityIllagerIllusioner.java
@@ -20,6 +20,16 @@ public class EntityIllagerIllusioner extends EntityIllagerWizard implements IRan
@@ -2199,7 +2199,7 @@ index f5c9e4e0a..5e6c7e317 100644
this.targetSelector.a(2, (new PathfinderGoalNearestAttackableTarget<>(this, EntityHuman.class, true)).a(300));
this.targetSelector.a(3, (new PathfinderGoalNearestAttackableTarget<>(this, EntityVillagerAbstract.class, false)).a(300));
diff --git a/src/main/java/net/minecraft/server/EntityInsentient.java b/src/main/java/net/minecraft/server/EntityInsentient.java
index 7465e867b..2bda9d6c6 100644
index 7465e867ba..2bda9d6c6c 100644
--- a/src/main/java/net/minecraft/server/EntityInsentient.java
+++ b/src/main/java/net/minecraft/server/EntityInsentient.java
@@ -29,7 +29,7 @@ public abstract class EntityInsentient extends EntityLiving {
@@ -2320,7 +2320,7 @@ index 7465e867b..2bda9d6c6 100644
+ // Purpur end
}
diff --git a/src/main/java/net/minecraft/server/EntityIronGolem.java b/src/main/java/net/minecraft/server/EntityIronGolem.java
index bdff23688..954000a7b 100644
index bdff236883..954000a7b4 100644
--- a/src/main/java/net/minecraft/server/EntityIronGolem.java
+++ b/src/main/java/net/minecraft/server/EntityIronGolem.java
@@ -22,9 +22,22 @@ public class EntityIronGolem extends EntityGolem implements IEntityAngerable {
@@ -2371,7 +2371,7 @@ index bdff23688..954000a7b 100644
float f1 = 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.2F;
diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java
index a2d50a1fe..b8f59f29a 100644
index a2d50a1fef..b8f59f29a4 100644
--- a/src/main/java/net/minecraft/server/EntityLiving.java
+++ b/src/main/java/net/minecraft/server/EntityLiving.java
@@ -466,7 +466,7 @@ public abstract class EntityLiving extends Entity {
@@ -2406,7 +2406,7 @@ index a2d50a1fe..b8f59f29a 100644
this.bu = f;
}
diff --git a/src/main/java/net/minecraft/server/EntityLlama.java b/src/main/java/net/minecraft/server/EntityLlama.java
index e90ff597d..a6ca8e68e 100644
index e90ff597d1..a6ca8e68e4 100644
--- a/src/main/java/net/minecraft/server/EntityLlama.java
+++ b/src/main/java/net/minecraft/server/EntityLlama.java
@@ -18,7 +18,46 @@ public class EntityLlama extends EntityHorseChestedAbstract implements IRangedEn
@@ -2482,7 +2482,7 @@ index e90ff597d..a6ca8e68e 100644
return i == -1 ? null : EnumColor.fromColorIndex(i);
diff --git a/src/main/java/net/minecraft/server/EntityLlamaTrader.java b/src/main/java/net/minecraft/server/EntityLlamaTrader.java
index 665a9e852..f65e93b74 100644
index 665a9e8524..f65e93b742 100644
--- a/src/main/java/net/minecraft/server/EntityLlamaTrader.java
+++ b/src/main/java/net/minecraft/server/EntityLlamaTrader.java
@@ -11,6 +11,23 @@ public class EntityLlamaTrader extends EntityLlama {
@@ -2510,7 +2510,7 @@ index 665a9e852..f65e93b74 100644
protected EntityLlama fz() {
return (EntityLlama) EntityTypes.TRADER_LLAMA.a(this.world);
diff --git a/src/main/java/net/minecraft/server/EntityMagmaCube.java b/src/main/java/net/minecraft/server/EntityMagmaCube.java
index 8f9813ddd..9babff772 100644
index 8f9813ddd6..9babff772b 100644
--- a/src/main/java/net/minecraft/server/EntityMagmaCube.java
+++ b/src/main/java/net/minecraft/server/EntityMagmaCube.java
@@ -8,6 +8,23 @@ public class EntityMagmaCube extends EntitySlime {
@@ -2552,7 +2552,7 @@ index 8f9813ddd..9babff772 100644
@Override
diff --git a/src/main/java/net/minecraft/server/EntityMushroomCow.java b/src/main/java/net/minecraft/server/EntityMushroomCow.java
index 38df17bd2..7966b34f8 100644
index 38df17bd20..7966b34f8d 100644
--- a/src/main/java/net/minecraft/server/EntityMushroomCow.java
+++ b/src/main/java/net/minecraft/server/EntityMushroomCow.java
@@ -20,6 +20,18 @@ public class EntityMushroomCow extends EntityCow implements IShearable {
@@ -2593,7 +2593,7 @@ index 38df17bd2..7966b34f8 100644
Pair<MobEffectList, Integer> pair = (Pair) optional.get();
diff --git a/src/main/java/net/minecraft/server/EntityOcelot.java b/src/main/java/net/minecraft/server/EntityOcelot.java
index 9dc55b783..9bd6bc7d1 100644
index 9dc55b7832..9bd6bc7d18 100644
--- a/src/main/java/net/minecraft/server/EntityOcelot.java
+++ b/src/main/java/net/minecraft/server/EntityOcelot.java
@@ -16,6 +16,18 @@ public class EntityOcelot extends EntityAnimal {
@@ -2631,7 +2631,7 @@ index 9dc55b783..9bd6bc7d1 100644
this.targetSelector.a(1, new PathfinderGoalNearestAttackableTarget<>(this, EntityTurtle.class, 10, false, false, EntityTurtle.bo));
}
diff --git a/src/main/java/net/minecraft/server/EntityPanda.java b/src/main/java/net/minecraft/server/EntityPanda.java
index 01cc3d94d..4379380c2 100644
index 01cc3d94d3..4379380c25 100644
--- a/src/main/java/net/minecraft/server/EntityPanda.java
+++ b/src/main/java/net/minecraft/server/EntityPanda.java
@@ -46,6 +46,27 @@ public class EntityPanda extends EntityAnimal {
@@ -2767,7 +2767,7 @@ index 01cc3d94d..4379380c2 100644
}
}
diff --git a/src/main/java/net/minecraft/server/EntityParrot.java b/src/main/java/net/minecraft/server/EntityParrot.java
index 6bb73f869..822fe2691 100644
index 6bb73f869b..822fe26913 100644
--- a/src/main/java/net/minecraft/server/EntityParrot.java
+++ b/src/main/java/net/minecraft/server/EntityParrot.java
@@ -65,12 +65,58 @@ public class EntityParrot extends EntityPerchable implements EntityBird {
@@ -2843,7 +2843,7 @@ index 6bb73f869..822fe2691 100644
this.goalSelector.a(2, new PathfinderGoalSit(this));
this.goalSelector.a(2, new PathfinderGoalFollowOwner(this, 1.0D, 5.0F, 1.0F, true));
diff --git a/src/main/java/net/minecraft/server/EntityPhantom.java b/src/main/java/net/minecraft/server/EntityPhantom.java
index 03c9a8d0c..ee1ff6dc1 100644
index 03c9a8d0c2..ee1ff6dc17 100644
--- a/src/main/java/net/minecraft/server/EntityPhantom.java
+++ b/src/main/java/net/minecraft/server/EntityPhantom.java
@@ -25,6 +25,58 @@ public class EntityPhantom extends EntityFlying implements IMonster {
@@ -3014,7 +3014,7 @@ index 03c9a8d0c..ee1ff6dc1 100644
EntityPhantom.this.yaw += 180.0F;
this.j = 0.1F;
diff --git a/src/main/java/net/minecraft/server/EntityPig.java b/src/main/java/net/minecraft/server/EntityPig.java
index 87caac62b..43eaba96e 100644
index 87caac62b0..43eaba96e1 100644
--- a/src/main/java/net/minecraft/server/EntityPig.java
+++ b/src/main/java/net/minecraft/server/EntityPig.java
@@ -19,9 +19,22 @@ public class EntityPig extends EntityAnimal implements ISteerable, ISaddleable {
@@ -3041,7 +3041,7 @@ index 87caac62b..43eaba96e 100644
this.goalSelector.a(3, new PathfinderGoalBreed(this, 1.0D));
this.goalSelector.a(4, new PathfinderGoalTempt(this, 1.2D, RecipeItemStack.a(Items.CARROT_ON_A_STICK), false));
diff --git a/src/main/java/net/minecraft/server/EntityPigZombie.java b/src/main/java/net/minecraft/server/EntityPigZombie.java
index 194b76059..dbc5a74f6 100644
index 194b76059c..dbc5a74f6e 100644
--- a/src/main/java/net/minecraft/server/EntityPigZombie.java
+++ b/src/main/java/net/minecraft/server/EntityPigZombie.java
@@ -22,6 +22,16 @@ public class EntityPigZombie extends EntityZombie implements IEntityAngerable {
@@ -3062,7 +3062,7 @@ index 194b76059..dbc5a74f6 100644
public boolean jockeyOnlyBaby() {
return world.purpurConfig.zombifiedPiglinJockeyOnlyBaby;
diff --git a/src/main/java/net/minecraft/server/EntityPiglin.java b/src/main/java/net/minecraft/server/EntityPiglin.java
index e1b433007..55739e52e 100644
index e1b4330074..55739e52e1 100644
--- a/src/main/java/net/minecraft/server/EntityPiglin.java
+++ b/src/main/java/net/minecraft/server/EntityPiglin.java
@@ -25,6 +25,18 @@ public class EntityPiglin extends EntityPiglinAbstract implements ICrossbow {
@@ -3113,7 +3113,7 @@ index e1b433007..55739e52e 100644
@Override
diff --git a/src/main/java/net/minecraft/server/EntityPiglinBrute.java b/src/main/java/net/minecraft/server/EntityPiglinBrute.java
index 00db2d166..c672e31fc 100644
index 00db2d1668..c672e31fcb 100644
--- a/src/main/java/net/minecraft/server/EntityPiglinBrute.java
+++ b/src/main/java/net/minecraft/server/EntityPiglinBrute.java
@@ -15,6 +15,18 @@ public class EntityPiglinBrute extends EntityPiglinAbstract {
@@ -3155,7 +3155,7 @@ index 00db2d166..c672e31fc 100644
PiglinBruteAI.b(this);
PiglinBruteAI.c(this);
diff --git a/src/main/java/net/minecraft/server/EntityPillager.java b/src/main/java/net/minecraft/server/EntityPillager.java
index a3a428da9..bf5669c30 100644
index a3a428da99..bf5669c305 100644
--- a/src/main/java/net/minecraft/server/EntityPillager.java
+++ b/src/main/java/net/minecraft/server/EntityPillager.java
@@ -13,15 +13,29 @@ public class EntityPillager extends EntityIllagerAbstract implements ICrossbow {
@@ -3189,7 +3189,7 @@ index a3a428da9..bf5669c30 100644
this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget<>(this, EntityHuman.class, true));
this.targetSelector.a(3, new PathfinderGoalNearestAttackableTarget<>(this, EntityVillagerAbstract.class, false));
diff --git a/src/main/java/net/minecraft/server/EntityPolarBear.java b/src/main/java/net/minecraft/server/EntityPolarBear.java
index cd6d2e07e..c74a10d9b 100644
index cd6d2e07ec..c74a10d9b6 100644
--- a/src/main/java/net/minecraft/server/EntityPolarBear.java
+++ b/src/main/java/net/minecraft/server/EntityPolarBear.java
@@ -18,12 +18,34 @@ public class EntityPolarBear extends EntityAnimal implements IEntityAngerable {
@@ -3264,7 +3264,7 @@ index cd6d2e07e..c74a10d9b 100644
@Override
diff --git a/src/main/java/net/minecraft/server/EntityPufferFish.java b/src/main/java/net/minecraft/server/EntityPufferFish.java
index 639af6bd3..81e918572 100644
index 639af6bd3d..81e9185726 100644
--- a/src/main/java/net/minecraft/server/EntityPufferFish.java
+++ b/src/main/java/net/minecraft/server/EntityPufferFish.java
@@ -17,6 +17,18 @@ public class EntityPufferFish extends EntityFish {
@@ -3296,7 +3296,7 @@ index 639af6bd3..81e918572 100644
@Override
diff --git a/src/main/java/net/minecraft/server/EntityRabbit.java b/src/main/java/net/minecraft/server/EntityRabbit.java
index 98baf24bd..c5a9d7310 100644
index 98baf24bde..c5a9d7310f 100644
--- a/src/main/java/net/minecraft/server/EntityRabbit.java
+++ b/src/main/java/net/minecraft/server/EntityRabbit.java
@@ -20,6 +20,18 @@ public class EntityRabbit extends EntityAnimal {
@@ -3461,7 +3461,7 @@ index 98baf24bd..c5a9d7310 100644
this.d = flag;
}
diff --git a/src/main/java/net/minecraft/server/EntityRavager.java b/src/main/java/net/minecraft/server/EntityRavager.java
index 7064a12c8..c6d149061 100644
index 7064a12c89..c6d1490618 100644
--- a/src/main/java/net/minecraft/server/EntityRavager.java
+++ b/src/main/java/net/minecraft/server/EntityRavager.java
@@ -20,14 +20,37 @@ public class EntityRavager extends EntityRaider {
@@ -3512,7 +3512,7 @@ index 7064a12c8..c6d149061 100644
this.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).setValue(0.0D);
} else {
diff --git a/src/main/java/net/minecraft/server/EntitySalmon.java b/src/main/java/net/minecraft/server/EntitySalmon.java
index 51ec63413..6dfcee2c9 100644
index 51ec634133..6dfcee2c9b 100644
--- a/src/main/java/net/minecraft/server/EntitySalmon.java
+++ b/src/main/java/net/minecraft/server/EntitySalmon.java
@@ -6,6 +6,18 @@ public class EntitySalmon extends EntityFishSchool {
@@ -3535,7 +3535,7 @@ index 51ec63413..6dfcee2c9 100644
public int eN() {
return 5;
diff --git a/src/main/java/net/minecraft/server/EntitySheep.java b/src/main/java/net/minecraft/server/EntitySheep.java
index 2908e9cc4..04e585f44 100644
index 2908e9cc47..04e585f44c 100644
--- a/src/main/java/net/minecraft/server/EntitySheep.java
+++ b/src/main/java/net/minecraft/server/EntitySheep.java
@@ -56,10 +56,23 @@ public class EntitySheep extends EntityAnimal implements IShearable {
@@ -3563,7 +3563,7 @@ index 2908e9cc4..04e585f44 100644
this.goalSelector.a(2, new PathfinderGoalBreed(this, 1.0D));
this.goalSelector.a(3, new PathfinderGoalTempt(this, 1.1D, RecipeItemStack.a(Items.WHEAT), false));
diff --git a/src/main/java/net/minecraft/server/EntityShulker.java b/src/main/java/net/minecraft/server/EntityShulker.java
index f0394fe52..c5853f9f5 100644
index f0394fe521..c5853f9f51 100644
--- a/src/main/java/net/minecraft/server/EntityShulker.java
+++ b/src/main/java/net/minecraft/server/EntityShulker.java
@@ -29,12 +29,26 @@ public class EntityShulker extends EntityGolem implements IMonster {
@@ -3603,7 +3603,7 @@ index f0394fe52..c5853f9f5 100644
@Override
public boolean a() {
diff --git a/src/main/java/net/minecraft/server/EntitySilverfish.java b/src/main/java/net/minecraft/server/EntitySilverfish.java
index 35f15c8dd..0ea7af085 100644
index 35f15c8ddd..0ea7af0850 100644
--- a/src/main/java/net/minecraft/server/EntitySilverfish.java
+++ b/src/main/java/net/minecraft/server/EntitySilverfish.java
@@ -11,13 +11,27 @@ public class EntitySilverfish extends EntityMonster {
@@ -3643,7 +3643,7 @@ index 35f15c8dd..0ea7af085 100644
public void g() {
diff --git a/src/main/java/net/minecraft/server/EntitySkeleton.java b/src/main/java/net/minecraft/server/EntitySkeleton.java
index 7c39bec83..3f130e03b 100644
index 7c39bec831..3f130e03bf 100644
--- a/src/main/java/net/minecraft/server/EntitySkeleton.java
+++ b/src/main/java/net/minecraft/server/EntitySkeleton.java
@@ -6,6 +6,18 @@ public class EntitySkeleton extends EntitySkeletonAbstract {
@@ -3666,7 +3666,7 @@ index 7c39bec83..3f130e03b 100644
protected SoundEffect getSoundAmbient() {
return SoundEffects.ENTITY_SKELETON_AMBIENT;
diff --git a/src/main/java/net/minecraft/server/EntitySkeletonAbstract.java b/src/main/java/net/minecraft/server/EntitySkeletonAbstract.java
index 513bb3087..e21dbf46d 100644
index 513bb3087e..e21dbf46d6 100644
--- a/src/main/java/net/minecraft/server/EntitySkeletonAbstract.java
+++ b/src/main/java/net/minecraft/server/EntitySkeletonAbstract.java
@@ -28,12 +28,14 @@ public abstract class EntitySkeletonAbstract extends EntityMonster implements IR
@@ -3685,7 +3685,7 @@ index 513bb3087..e21dbf46d 100644
this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget<>(this, EntityHuman.class, true));
this.targetSelector.a(3, new PathfinderGoalNearestAttackableTarget<>(this, EntityIronGolem.class, true));
diff --git a/src/main/java/net/minecraft/server/EntitySkeletonStray.java b/src/main/java/net/minecraft/server/EntitySkeletonStray.java
index f985caada..d123fb82b 100644
index f985caada0..d123fb82b6 100644
--- a/src/main/java/net/minecraft/server/EntitySkeletonStray.java
+++ b/src/main/java/net/minecraft/server/EntitySkeletonStray.java
@@ -8,6 +8,18 @@ public class EntitySkeletonStray extends EntitySkeletonAbstract {
@@ -3708,7 +3708,7 @@ index f985caada..d123fb82b 100644
return b(entitytypes, worldaccess, enummobspawn, blockposition, random) && (enummobspawn == EnumMobSpawn.SPAWNER || worldaccess.e(blockposition));
}
diff --git a/src/main/java/net/minecraft/server/EntitySkeletonWither.java b/src/main/java/net/minecraft/server/EntitySkeletonWither.java
index c872be77a..96cb080d9 100644
index c872be77a6..96cb080d94 100644
--- a/src/main/java/net/minecraft/server/EntitySkeletonWither.java
+++ b/src/main/java/net/minecraft/server/EntitySkeletonWither.java
@@ -9,6 +9,18 @@ public class EntitySkeletonWither extends EntitySkeletonAbstract {
@@ -3731,7 +3731,7 @@ index c872be77a..96cb080d9 100644
protected void initPathfinder() {
this.targetSelector.a(3, new PathfinderGoalNearestAttackableTarget<>(this, EntityPiglinAbstract.class, true));
diff --git a/src/main/java/net/minecraft/server/EntitySlime.java b/src/main/java/net/minecraft/server/EntitySlime.java
index f74c82785..8483458e4 100644
index f74c827850..8483458e41 100644
--- a/src/main/java/net/minecraft/server/EntitySlime.java
+++ b/src/main/java/net/minecraft/server/EntitySlime.java
@@ -34,12 +34,45 @@ public class EntitySlime extends EntityInsentient implements IMonster {
@@ -3847,7 +3847,7 @@ index f74c82785..8483458e4 100644
}
diff --git a/src/main/java/net/minecraft/server/EntitySnowman.java b/src/main/java/net/minecraft/server/EntitySnowman.java
index dfe615814..bc3ac62b4 100644
index dfe615814d..bc3ac62b45 100644
--- a/src/main/java/net/minecraft/server/EntitySnowman.java
+++ b/src/main/java/net/minecraft/server/EntitySnowman.java
@@ -14,12 +14,26 @@ public class EntitySnowman extends EntityGolem implements IShearable, IRangedEnt
@@ -3904,7 +3904,7 @@ index dfe615814..bc3ac62b4 100644
}
diff --git a/src/main/java/net/minecraft/server/EntitySpider.java b/src/main/java/net/minecraft/server/EntitySpider.java
index 42f02b03b..889712b79 100644
index 42f02b03b1..889712b799 100644
--- a/src/main/java/net/minecraft/server/EntitySpider.java
+++ b/src/main/java/net/minecraft/server/EntitySpider.java
@@ -11,14 +11,28 @@ public class EntitySpider extends EntityMonster {
@@ -3937,7 +3937,7 @@ index 42f02b03b..889712b79 100644
this.targetSelector.a(2, new EntitySpider.PathfinderGoalSpiderNearestAttackableTarget<>(this, EntityHuman.class));
this.targetSelector.a(3, new EntitySpider.PathfinderGoalSpiderNearestAttackableTarget<>(this, EntityIronGolem.class));
diff --git a/src/main/java/net/minecraft/server/EntitySquid.java b/src/main/java/net/minecraft/server/EntitySquid.java
index 028a7fe2c..c9d246131 100644
index 028a7fe2cd..c9d2461318 100644
--- a/src/main/java/net/minecraft/server/EntitySquid.java
+++ b/src/main/java/net/minecraft/server/EntitySquid.java
@@ -26,17 +26,38 @@ public class EntitySquid extends EntityWaterAnimal {
@@ -4037,7 +4037,7 @@ index 028a7fe2c..c9d246131 100644
if (i > 100) {
diff --git a/src/main/java/net/minecraft/server/EntityStrider.java b/src/main/java/net/minecraft/server/EntityStrider.java
index 3bd9b53d4..3069a408a 100644
index 3bd9b53d4c..3069a408a4 100644
--- a/src/main/java/net/minecraft/server/EntityStrider.java
+++ b/src/main/java/net/minecraft/server/EntityStrider.java
@@ -28,6 +28,18 @@ public class EntityStrider extends EntityAnimal implements ISteerable, ISaddleab
@@ -4077,7 +4077,7 @@ index 3bd9b53d4..3069a408a 100644
if (flag && !this.isSilent()) {
this.world.playSound((EntityHuman) null, this.locX(), this.locY(), this.locZ(), SoundEffects.ENTITY_STRIDER_EAT, this.getSoundCategory(), 1.0F, 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.2F);
diff --git a/src/main/java/net/minecraft/server/EntityTameableAnimal.java b/src/main/java/net/minecraft/server/EntityTameableAnimal.java
index 9e008d56b..8f227678d 100644
index 9e008d56bb..8f227678dc 100644
--- a/src/main/java/net/minecraft/server/EntityTameableAnimal.java
+++ b/src/main/java/net/minecraft/server/EntityTameableAnimal.java
@@ -130,6 +130,7 @@ public abstract class EntityTameableAnimal extends EntityAnimal {
@@ -4089,7 +4089,7 @@ index 9e008d56b..8f227678d 100644
return entityliving == this.getOwner();
}
diff --git a/src/main/java/net/minecraft/server/EntityTropicalFish.java b/src/main/java/net/minecraft/server/EntityTropicalFish.java
index 495c28ccb..2c9df356e 100644
index 495c28ccb8..2c9df356e6 100644
--- a/src/main/java/net/minecraft/server/EntityTropicalFish.java
+++ b/src/main/java/net/minecraft/server/EntityTropicalFish.java
@@ -19,6 +19,18 @@ public class EntityTropicalFish extends EntityFishSchool {
@@ -4112,7 +4112,7 @@ index 495c28ccb..2c9df356e 100644
protected void initDatawatcher() {
super.initDatawatcher();
diff --git a/src/main/java/net/minecraft/server/EntityTurtle.java b/src/main/java/net/minecraft/server/EntityTurtle.java
index e025eef47..c29803367 100644
index e025eef476..c298033679 100644
--- a/src/main/java/net/minecraft/server/EntityTurtle.java
+++ b/src/main/java/net/minecraft/server/EntityTurtle.java
@@ -27,6 +27,18 @@ public class EntityTurtle extends EntityAnimal {
@@ -4194,7 +4194,7 @@ index e025eef47..c29803367 100644
if (this.h == ControllerMove.Operation.MOVE_TO && !this.i.getNavigation().m()) {
double d0 = this.b - this.i.locX();
diff --git a/src/main/java/net/minecraft/server/EntityVex.java b/src/main/java/net/minecraft/server/EntityVex.java
index ae05856f2..a70855235 100644
index ae05856f25..a708552358 100644
--- a/src/main/java/net/minecraft/server/EntityVex.java
+++ b/src/main/java/net/minecraft/server/EntityVex.java
@@ -19,6 +19,45 @@ public class EntityVex extends EntityMonster {
@@ -4291,7 +4291,7 @@ index ae05856f2..a70855235 100644
Vec3D vec3d = new Vec3D(this.b - EntityVex.this.locX(), this.c - EntityVex.this.locY(), this.d - EntityVex.this.locZ());
double d0 = vec3d.f();
diff --git a/src/main/java/net/minecraft/server/EntityVillager.java b/src/main/java/net/minecraft/server/EntityVillager.java
index 7add2fca1..a5f114933 100644
index 7add2fca10..a5f114933d 100644
--- a/src/main/java/net/minecraft/server/EntityVillager.java
+++ b/src/main/java/net/minecraft/server/EntityVillager.java
@@ -75,8 +75,19 @@ public class EntityVillager extends EntityVillagerAbstract implements Reputation
@@ -4335,7 +4335,7 @@ index 7add2fca1..a5f114933 100644
this.h(entityhuman);
}
diff --git a/src/main/java/net/minecraft/server/EntityVillagerTrader.java b/src/main/java/net/minecraft/server/EntityVillagerTrader.java
index 96dda6a14..7420ec2ea 100644
index 96dda6a14f..7420ec2eae 100644
--- a/src/main/java/net/minecraft/server/EntityVillagerTrader.java
+++ b/src/main/java/net/minecraft/server/EntityVillagerTrader.java
@@ -23,6 +23,7 @@ public class EntityVillagerTrader extends EntityVillagerAbstract {
@@ -4375,7 +4375,7 @@ index 96dda6a14..7420ec2ea 100644
this.setTradingPlayer(entityhuman);
this.openTrade(entityhuman, this.getScoreboardDisplayName(), 1);
diff --git a/src/main/java/net/minecraft/server/EntityVindicator.java b/src/main/java/net/minecraft/server/EntityVindicator.java
index a945a0a07..5e702f97a 100644
index a945a0a073..5e702f97a1 100644
--- a/src/main/java/net/minecraft/server/EntityVindicator.java
+++ b/src/main/java/net/minecraft/server/EntityVindicator.java
@@ -17,14 +17,28 @@ public class EntityVindicator extends EntityIllagerAbstract {
@@ -4408,7 +4408,7 @@ index a945a0a07..5e702f97a 100644
this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget<>(this, EntityHuman.class, true));
this.targetSelector.a(3, new PathfinderGoalNearestAttackableTarget<>(this, EntityVillagerAbstract.class, true));
diff --git a/src/main/java/net/minecraft/server/EntityWitch.java b/src/main/java/net/minecraft/server/EntityWitch.java
index 0ef981e5a..76fd72f33 100644
index 0ef981e5ad..76fd72f33c 100644
--- a/src/main/java/net/minecraft/server/EntityWitch.java
+++ b/src/main/java/net/minecraft/server/EntityWitch.java
@@ -24,6 +24,18 @@ public class EntityWitch extends EntityRaider implements IRangedEntity {
@@ -4444,7 +4444,7 @@ index 0ef981e5a..76fd72f33 100644
this.targetSelector.a(2, this.br);
this.targetSelector.a(3, this.bs);
diff --git a/src/main/java/net/minecraft/server/EntityWither.java b/src/main/java/net/minecraft/server/EntityWither.java
index 29bb74e51..1054b492c 100644
index 29bb74e51e..1054b492c2 100644
--- a/src/main/java/net/minecraft/server/EntityWither.java
+++ b/src/main/java/net/minecraft/server/EntityWither.java
@@ -32,6 +32,7 @@ public class EntityWither extends EntityMonster implements IRangedEntity {
@@ -4652,7 +4652,7 @@ index 29bb74e51..1054b492c 100644
@Override
diff --git a/src/main/java/net/minecraft/server/EntityWolf.java b/src/main/java/net/minecraft/server/EntityWolf.java
index 5779d1c9f..506b2a96f 100644
index 5779d1c9f9..506b2a96f2 100644
--- a/src/main/java/net/minecraft/server/EntityWolf.java
+++ b/src/main/java/net/minecraft/server/EntityWolf.java
@@ -33,9 +33,27 @@ public class EntityWolf extends EntityTameableAnimal implements IEntityAngerable
@@ -4692,7 +4692,7 @@ index 5779d1c9f..506b2a96f 100644
this.targetSelector.a(2, new PathfinderGoalOwnerHurtTarget(this));
this.targetSelector.a(3, (new PathfinderGoalHurtByTarget(this, new Class[0])).a(new Class[0])); // CraftBukkit - decompile error
diff --git a/src/main/java/net/minecraft/server/EntityZoglin.java b/src/main/java/net/minecraft/server/EntityZoglin.java
index 55df54733..ce4072f6e 100644
index 55df54733d..ce4072f6ea 100644
--- a/src/main/java/net/minecraft/server/EntityZoglin.java
+++ b/src/main/java/net/minecraft/server/EntityZoglin.java
@@ -21,6 +21,18 @@ public class EntityZoglin extends EntityMonster implements IMonster, IOglin {
@@ -4756,7 +4756,7 @@ index 55df54733..ce4072f6e 100644
this.eL();
}
diff --git a/src/main/java/net/minecraft/server/EntityZombie.java b/src/main/java/net/minecraft/server/EntityZombie.java
index 3e5c69287..d08747c66 100644
index 3e5c692876..d08747c66a 100644
--- a/src/main/java/net/minecraft/server/EntityZombie.java
+++ b/src/main/java/net/minecraft/server/EntityZombie.java
@@ -46,6 +46,16 @@ public class EntityZombie extends EntityMonster {
@@ -4789,7 +4789,7 @@ index 3e5c69287..d08747c66 100644
}
diff --git a/src/main/java/net/minecraft/server/EntityZombieHusk.java b/src/main/java/net/minecraft/server/EntityZombieHusk.java
index ce6d79780..02b0ae550 100644
index ce6d797801..02b0ae550a 100644
--- a/src/main/java/net/minecraft/server/EntityZombieHusk.java
+++ b/src/main/java/net/minecraft/server/EntityZombieHusk.java
@@ -9,6 +9,16 @@ public class EntityZombieHusk extends EntityZombie {
@@ -4810,7 +4810,7 @@ index ce6d79780..02b0ae550 100644
public boolean jockeyOnlyBaby() {
return world.purpurConfig.huskJockeyOnlyBaby;
diff --git a/src/main/java/net/minecraft/server/EntityZombieVillager.java b/src/main/java/net/minecraft/server/EntityZombieVillager.java
index 69e98dceb..cdcf3d1cf 100644
index 69e98dcebe..cdcf3d1cf5 100644
--- a/src/main/java/net/minecraft/server/EntityZombieVillager.java
+++ b/src/main/java/net/minecraft/server/EntityZombieVillager.java
@@ -29,6 +29,16 @@ public class EntityZombieVillager extends EntityZombie implements VillagerDataHo
@@ -4831,7 +4831,7 @@ index 69e98dceb..cdcf3d1cf 100644
public boolean jockeyOnlyBaby() {
return world.purpurConfig.zombieVillagerJockeyOnlyBaby;
diff --git a/src/main/java/net/minecraft/server/GeneratorAccess.java b/src/main/java/net/minecraft/server/GeneratorAccess.java
index b67aede00..ed09fe7fd 100644
index b67aede005..ed09fe7fdd 100644
--- a/src/main/java/net/minecraft/server/GeneratorAccess.java
+++ b/src/main/java/net/minecraft/server/GeneratorAccess.java
@@ -37,6 +37,7 @@ public interface GeneratorAccess extends ICombinedAccess, IWorldTime {
@@ -4843,7 +4843,7 @@ index b67aede00..ed09fe7fd 100644
default int getHeight() {
diff --git a/src/main/java/net/minecraft/server/IProjectile.java b/src/main/java/net/minecraft/server/IProjectile.java
index 0bac6b050..9a17eb606 100644
index 0bac6b0506..9a17eb6066 100644
--- a/src/main/java/net/minecraft/server/IProjectile.java
+++ b/src/main/java/net/minecraft/server/IProjectile.java
@@ -12,7 +12,7 @@ public abstract class IProjectile extends Entity {
@@ -4873,7 +4873,7 @@ index 0bac6b050..9a17eb606 100644
Entity entity1 = this.getShooter();
// Paper start - Cancel hit for vanished players
diff --git a/src/main/java/net/minecraft/server/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java
index 1ff07a08d..5b5e9211c 100644
index 1ff07a08dc..5b5e9211cd 100644
--- a/src/main/java/net/minecraft/server/PlayerConnection.java
+++ b/src/main/java/net/minecraft/server/PlayerConnection.java
@@ -2149,6 +2149,8 @@ public class PlayerConnection implements PacketListenerPlayIn {
@@ -4886,7 +4886,7 @@ index 1ff07a08d..5b5e9211c 100644
if ((entity instanceof EntityFish && origItem != null && origItem.getItem() == Items.WATER_BUCKET) && (event.isCancelled() || this.player.inventory.getItemInHand() == null || this.player.inventory.getItemInHand().getItem() != origItem)) {
this.sendPacket(new PacketPlayOutSpawnEntityLiving((EntityFish) entity));
diff --git a/src/main/java/net/minecraft/server/ProjectileHelper.java b/src/main/java/net/minecraft/server/ProjectileHelper.java
index b2c64b314..515ba50ae 100644
index b2c64b3144..515ba50aec 100644
--- a/src/main/java/net/minecraft/server/ProjectileHelper.java
+++ b/src/main/java/net/minecraft/server/ProjectileHelper.java
@@ -7,6 +7,7 @@ import javax.annotation.Nullable;
@@ -4898,7 +4898,7 @@ index b2c64b314..515ba50ae 100644
Vec3D vec3d = entity.getMot();
World world = entity.world;
diff --git a/src/main/java/net/minecraft/server/Vec3D.java b/src/main/java/net/minecraft/server/Vec3D.java
index 5af554870..c59305ef7 100644
index 5af554870b..c59305ef7d 100644
--- a/src/main/java/net/minecraft/server/Vec3D.java
+++ b/src/main/java/net/minecraft/server/Vec3D.java
@@ -39,6 +39,7 @@ public class Vec3D implements IPosition {
@@ -4926,7 +4926,7 @@ index 5af554870..c59305ef7 100644
return new Vec3D(this.x * d0, this.y * d1, this.z * d2);
}
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
index caaab5015..c3dbe7802 100644
index caaab50153..c3dbe78027 100644
--- a/src/main/java/net/minecraft/server/World.java
+++ b/src/main/java/net/minecraft/server/World.java
@@ -1516,5 +1516,10 @@ public abstract class World implements GeneratorAccess, AutoCloseable {
@@ -4941,7 +4941,7 @@ index caaab5015..c3dbe7802 100644
// Purpur end
}
diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java
index 8714d1574..af3739c79 100644
index 8714d1574d..af3739c79a 100644
--- a/src/main/java/net/pl3x/purpur/PurpurConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java
@@ -134,11 +134,13 @@ public class PurpurConfig {
@@ -4959,7 +4959,7 @@ index 8714d1574..af3739c79 100644
public static int dungeonSeed = -1;
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
index b070eed98..a0684f16c 100644
index b070eed986..a0684f16cb 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -42,11 +42,6 @@ public class PurpurWorldConfig {
@@ -5610,7 +5610,7 @@ index b070eed98..a0684f16c 100644
zombieVillagerJockeyTryExistingChickens = getBoolean("mobs.zombie_villager.jockey.try-existing-chickens", zombieVillagerJockeyTryExistingChickens);
diff --git a/src/main/java/net/pl3x/purpur/controller/ControllerLookWASD.java b/src/main/java/net/pl3x/purpur/controller/ControllerLookWASD.java
new file mode 100644
index 000000000..0b16a7b63
index 0000000000..0b16a7b634
--- /dev/null
+++ b/src/main/java/net/pl3x/purpur/controller/ControllerLookWASD.java
@@ -0,0 +1,76 @@
@@ -5692,7 +5692,7 @@ index 000000000..0b16a7b63
+}
diff --git a/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASD.java b/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASD.java
new file mode 100644
index 000000000..426688b3a
index 0000000000..426688b3a6
--- /dev/null
+++ b/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASD.java
@@ -0,0 +1,92 @@
@@ -5790,7 +5790,7 @@ index 000000000..426688b3a
+}
diff --git a/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASDFlying.java b/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASDFlying.java
new file mode 100644
index 000000000..33c51460a
index 0000000000..33c51460ab
--- /dev/null
+++ b/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASDFlying.java
@@ -0,0 +1,61 @@
@@ -5857,7 +5857,7 @@ index 000000000..33c51460a
+}
diff --git a/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASDFlyingWithSpacebar.java b/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASDFlyingWithSpacebar.java
new file mode 100644
index 000000000..f75375936
index 0000000000..f753759361
--- /dev/null
+++ b/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASDFlyingWithSpacebar.java
@@ -0,0 +1,61 @@
@@ -5924,7 +5924,7 @@ index 000000000..f75375936
+}
diff --git a/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASDWater.java b/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASDWater.java
new file mode 100644
index 000000000..1b08a0905
index 0000000000..1b08a0905b
--- /dev/null
+++ b/src/main/java/net/pl3x/purpur/controller/ControllerMoveWASDWater.java
@@ -0,0 +1,50 @@
@@ -5980,7 +5980,7 @@ index 000000000..1b08a0905
+}
diff --git a/src/main/java/net/pl3x/purpur/entity/DolphinSpit.java b/src/main/java/net/pl3x/purpur/entity/DolphinSpit.java
new file mode 100644
index 000000000..3b777c54f
index 0000000000..3b777c54f9
--- /dev/null
+++ b/src/main/java/net/pl3x/purpur/entity/DolphinSpit.java
@@ -0,0 +1,115 @@
@@ -6101,7 +6101,7 @@ index 000000000..3b777c54f
+}
diff --git a/src/main/java/net/pl3x/purpur/entity/PhantomFlames.java b/src/main/java/net/pl3x/purpur/entity/PhantomFlames.java
new file mode 100644
index 000000000..f5da00b10
index 0000000000..f5da00b100
--- /dev/null
+++ b/src/main/java/net/pl3x/purpur/entity/PhantomFlames.java
@@ -0,0 +1,120 @@
@@ -6227,7 +6227,7 @@ index 000000000..f5da00b10
+}
diff --git a/src/main/java/net/pl3x/purpur/pathfinder/PathfinderGoalHasRider.java b/src/main/java/net/pl3x/purpur/pathfinder/PathfinderGoalHasRider.java
new file mode 100644
index 000000000..68acd09a6
index 0000000000..68acd09a6e
--- /dev/null
+++ b/src/main/java/net/pl3x/purpur/pathfinder/PathfinderGoalHasRider.java
@@ -0,0 +1,21 @@
@@ -6254,7 +6254,7 @@ index 000000000..68acd09a6
+}
diff --git a/src/main/java/net/pl3x/purpur/pathfinder/PathfinderGoalHorseHasRider.java b/src/main/java/net/pl3x/purpur/pathfinder/PathfinderGoalHorseHasRider.java
new file mode 100644
index 000000000..c0ead608e
index 0000000000..c0ead608ed
--- /dev/null
+++ b/src/main/java/net/pl3x/purpur/pathfinder/PathfinderGoalHorseHasRider.java
@@ -0,0 +1,18 @@
@@ -6277,7 +6277,7 @@ index 000000000..c0ead608e
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
index 407c03408..d9a979fa6 100644
index 407c03408a..d9a979fa6d 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
@@ -1133,4 +1133,26 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
@@ -6308,7 +6308,7 @@ index 407c03408..d9a979fa6 100644
+ // Purpur end
}
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
index 8d5b08cbe..cfee9ee75 100644
index 8d5b08cbeb..cfee9ee753 100644
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
@@ -502,6 +502,18 @@ public class CraftEventFactory {