diff --git a/Spigot-Server-Patches/Add-Debug-Entities-option-to-debug-dupe-uuid-issues.patch b/Spigot-Server-Patches/Add-Debug-Entities-option-to-debug-dupe-uuid-issues.patch index caf6da42dc..44fb131458 100644 --- a/Spigot-Server-Patches/Add-Debug-Entities-option-to-debug-dupe-uuid-issues.patch +++ b/Spigot-Server-Patches/Add-Debug-Entities-option-to-debug-dupe-uuid-issues.patch @@ -6,100 +6,81 @@ Subject: [PATCH] Add Debug Entities option to debug dupe uuid issues Add -Ddebug.entities=true to your JVM flags to gain more information diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java -index 69a058d830..b6c46e01d9 100644 +index c7d19d957..8dd589aae 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java @@ -0,0 +0,0 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke + public com.destroystokyo.paper.loottable.PaperLootableInventoryData lootableData; // Paper protected CraftEntity bukkitEntity; - EntityTrackerEntry tracker; // Paper ++ EntityTrackerEntry tracker; // Paper + Throwable addedToWorldStack; // Paper - entity debug public CraftEntity getBukkitEntity() { if (bukkitEntity == null) { bukkitEntity = CraftEntity.getEntity(world.getServer(), this); diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java -index c7712d2e71..1496125ddf 100644 +index 6bd181565..f9f0a94e9 100644 --- a/src/main/java/net/minecraft/server/World.java +++ b/src/main/java/net/minecraft/server/World.java -@@ -0,0 +0,0 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc +@@ -0,0 +0,0 @@ public abstract class World implements IIBlockAccess, GeneratorAccess, AutoClose public boolean pvpMode; public boolean keepSpawnInMemory = true; - public ChunkGenerator generator; + public org.bukkit.generator.ChunkGenerator generator; + public static final boolean DEBUG_ENTITIES = Boolean.getBoolean("debug.entities"); // Paper public boolean captureBlockStates = false; public boolean captureTreeGeneration = false; diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java -index 85a30652c4..6d1f70b39e 100644 +index 0b4990a00..3e41c080d 100644 --- a/src/main/java/net/minecraft/server/WorldServer.java +++ b/src/main/java/net/minecraft/server/WorldServer.java -@@ -0,0 +0,0 @@ public class WorldServer extends World implements IAsyncTaskHandler { - - // CraftBukkit start +@@ -0,0 +0,0 @@ public class WorldServer extends World { public final DimensionManager dimension; + private int tickPosition; + boolean hasPhysicsEvent = true; // Paper + private static Throwable getAddToWorldStackTrace(Entity entity) { + return new Throwable(entity + " Added to world at " + new java.util.Date()); + } // Add env and gen to constructor - public WorldServer(MinecraftServer minecraftserver, IDataManager idatamanager, PersistentCollection persistentcollection, WorldData worlddata, DimensionManager dimensionmanager, MethodProfiler methodprofiler, org.bukkit.World.Environment env, org.bukkit.generator.ChunkGenerator gen) { -@@ -0,0 +0,0 @@ public class WorldServer extends World implements IAsyncTaskHandler { - - private boolean j(Entity entity) { + public WorldServer(MinecraftServer minecraftserver, Executor executor, WorldNBTStorage worldnbtstorage, WorldData worlddata, DimensionManager dimensionmanager, GameProfilerFiller gameprofilerfiller, WorldLoadListener worldloadlistener, org.bukkit.World.Environment env, org.bukkit.generator.ChunkGenerator gen) { +@@ -0,0 +0,0 @@ public class WorldServer extends World { + org.spigotmc.AsyncCatcher.catchOp( "entity add"); // Spigot + if (entity.valid) { MinecraftServer.LOGGER.error("Attempted Double World add on " + entity, new Throwable()); return true; } // Paper if (entity.dead) { -- // WorldServer.a.warn("Tried to add entity {} but it was marked as removed already", EntityTypes.getName(entity.P())); // CraftBukkit + // Paper start + if (DEBUG_ENTITIES) { + new Throwable("Tried to add entity " + entity + " but it was marked as removed already").printStackTrace(); // CraftBukkit + getAddToWorldStackTrace(entity).printStackTrace(); + } + // Paper end + // WorldServer.LOGGER.warn("Tried to add entity {} but it was marked as removed already", EntityTypes.getName(entity.getEntityType())); // CraftBukkit return false; - } else { - UUID uuid = entity.getUniqueID(); -@@ -0,0 +0,0 @@ public class WorldServer extends World implements IAsyncTaskHandler { - this.g.remove(entity1); - } else { - if (!(entity instanceof EntityHuman)) { -- WorldServer.a.error("Keeping entity {} that already exists with UUID {} - " + entity1, EntityTypes.getName(entity1.P()), uuid.toString()); // CraftBukkit // Paper -- WorldServer.a.error("Deleting duplicate entity {}", entity); // Paper -+ if (DEBUG_ENTITIES) { -+ WorldServer.a.error("Keeping entity {} that already exists with UUID {}", entity1, uuid.toString()); // CraftBukkit // Paper -+ WorldServer.a.error("Deleting duplicate entity {}", entity); // Paper -+ -+ if (entity1.addedToWorldStack != null) { -+ entity1.addedToWorldStack.printStackTrace(); -+ } -+ getAddToWorldStackTrace(entity).printStackTrace(); -+ } - return false; - } + } else if (this.isUUIDTaken(entity)) { +@@ -0,0 +0,0 @@ public class WorldServer extends World { + } + } -@@ -0,0 +0,0 @@ public class WorldServer extends World implements IAsyncTaskHandler { - protected void b(Entity entity) { - super.b(entity); - this.entitiesById.a(entity.getId(), entity); -- this.entitiesByUUID.put(entity.getUniqueID(), entity); -+ // Paper start -+ if (DEBUG_ENTITIES) { -+ entity.addedToWorldStack = getAddToWorldStackTrace(entity); -+ } -+ -+ Entity old = this.entitiesByUUID.put(entity.getUniqueID(), entity); -+ if (old != null && old.getId() != entity.getId() && old.valid) { -+ Logger logger = LogManager.getLogger(); -+ logger.error("Overwrote an existing entity " + old + " with " + entity); +- this.entitiesByUUID.put(entity.getUniqueID(), entity); + if (DEBUG_ENTITIES) { -+ if (old.addedToWorldStack != null) { -+ old.addedToWorldStack.printStackTrace(); -+ } else { -+ logger.error("Oddly, the old entity was not added to the world in the normal way. Plugins?"); -+ } -+ entity.addedToWorldStack.printStackTrace(); ++ entity.addedToWorldStack = getAddToWorldStackTrace(entity); + } -+ } -+ // Paper end - Entity[] aentity = entity.bi(); - - if (aentity != null) { ++ ++ Entity old = this.entitiesByUUID.put(entity.getUniqueID(), entity); ++ if (old != null && old.getId() != entity.getId() && old.valid) { ++ Logger logger = LogManager.getLogger(); ++ logger.error("Overwrote an existing entity " + old + " with " + entity); ++ if (DEBUG_ENTITIES) { ++ if (old.addedToWorldStack != null) { ++ old.addedToWorldStack.printStackTrace(); ++ } else { ++ logger.error("Oddly, the old entity was not added to the world in the normal way. Plugins?"); ++ } ++ entity.addedToWorldStack.printStackTrace(); ++ } ++ } ++ + this.getChunkProvider().addEntity(entity); + if (entity instanceof EntityInsentient) { + this.I.add(((EntityInsentient) entity).getNavigation()); -- \ No newline at end of file diff --git a/Spigot-Server-Patches/Add-config-to-disable-ender-dragon-legacy-check.patch b/Spigot-Server-Patches/Add-config-to-disable-ender-dragon-legacy-check.patch index c1181a1b35..ae440f04d1 100644 --- a/Spigot-Server-Patches/Add-config-to-disable-ender-dragon-legacy-check.patch +++ b/Spigot-Server-Patches/Add-config-to-disable-ender-dragon-legacy-check.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add config to disable ender dragon legacy check diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java -index 47f8dfcc41..aa2be2ede6 100644 +index ce17447fa..3294fbbea 100644 --- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java +++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java @@ -0,0 +0,0 @@ public class PaperWorldConfig { @@ -19,7 +19,7 @@ index 47f8dfcc41..aa2be2ede6 100644 + } } diff --git a/src/main/java/net/minecraft/server/EnderDragonBattle.java b/src/main/java/net/minecraft/server/EnderDragonBattle.java -index a6259d9e6c..aad7ce93f6 100644 +index 5ae20b132..60ba37c92 100644 --- a/src/main/java/net/minecraft/server/EnderDragonBattle.java +++ b/src/main/java/net/minecraft/server/EnderDragonBattle.java @@ -0,0 +0,0 @@ public class EnderDragonBattle { diff --git a/Spigot-Server-Patches/Avoid-Chunk-Lookups-for-Entity-TileEntity-Current-Ch.patch b/Spigot-Server-Patches/Avoid-Chunk-Lookups-for-Entity-TileEntity-Current-Ch.patch index 98954505f4..fd00a5bf0f 100644 --- a/Spigot-Server-Patches/Avoid-Chunk-Lookups-for-Entity-TileEntity-Current-Ch.patch +++ b/Spigot-Server-Patches/Avoid-Chunk-Lookups-for-Entity-TileEntity-Current-Ch.patch @@ -10,68 +10,66 @@ to the object directly on the Entity/TileEntity object we can directly grab. Use that local value instead to reduce lookups in many hot places. diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java -index d87b08a49e..c7712d2e71 100644 +index 3737fca81..6bd181565 100644 --- a/src/main/java/net/minecraft/server/World.java +++ b/src/main/java/net/minecraft/server/World.java -@@ -0,0 +0,0 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc - int i = entity.chunkX; - int j = entity.chunkZ; - -- if (entity.inChunk && this.isChunkLoaded(i, j, true)) { -- this.getChunkAt(i, j).b(entity); -- } -+ Chunk chunk = entity.getCurrentChunk(); // Paper -+ if (chunk != null) chunk.removeEntity(entity); // Paper - - // CraftBukkit start - Decrement loop variable field if we've already ticked this entity - int index = this.entityList.indexOf(entity); -@@ -0,0 +0,0 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc - int k = entity.chunkX; - - j = entity.chunkZ; -- if (entity.inChunk && this.isChunkLoaded(k, j, true)) { -- this.getChunkAt(k, j).b(entity); -- } -+ Chunk chunk = entity.getCurrentChunk(); // Paper -+ if (chunk != null) chunk.removeEntity(entity); // Paper - //} // Paper - merge - - //for (Entity e : this.g) { // Paper - merge -@@ -0,0 +0,0 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc - j = entity.chunkX; - int l = entity.chunkZ; - -- if (entity.inChunk && this.isChunkLoaded(j, l, true)) { -- this.getChunkAt(j, l).b(entity); -- } -+ // Paper start -+ Chunk chunk = entity.getCurrentChunk(); -+ if (chunk != null) chunk.removeEntity(entity); -+ // Paper end - - guardEntityList = false; // Spigot - this.entityList.remove(this.tickPosition--); // CraftBukkit - Use field for loop variable -@@ -0,0 +0,0 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc +@@ -0,0 +0,0 @@ public abstract class World implements IIBlockAccess, GeneratorAccess, AutoClose + if (!tileentity.isRemoved() && tileentity.hasWorld()) { BlockPosition blockposition = tileentity.getPosition(); - // Paper start - Skip ticking in chunks scheduled for unload -- net.minecraft.server.Chunk chunk = this.getChunkIfLoaded(blockposition); -+ net.minecraft.server.Chunk chunk = tileentity.getCurrentChunk(); - boolean shouldTick = chunk != null; - if(this.paperConfig.skipEntityTickingInChunksScheduledForUnload) - shouldTick = shouldTick && chunk.scheduledForUnload == null; -@@ -0,0 +0,0 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc - tilesThisCycle--; +- if (this.isLoaded(blockposition) && this.getWorldBorder().a(blockposition)) { ++ Chunk currentChunk = tileentity.getCurrentChunk(); // Paper ++ if (currentChunk != null && this.getWorldBorder().a(blockposition)) { // Paper + try { + gameprofilerfiller.a(() -> { + return String.valueOf(TileEntityTypes.a(tileentity.q())); +@@ -0,0 +0,0 @@ public abstract class World implements IIBlockAccess, GeneratorAccess, AutoClose this.tileEntityListTick.remove(tileTickPosition--); + // Spigot end //this.tileEntityList.remove(tileentity); // Paper - remove unused list - if (this.isLoaded(tileentity.getPosition())) { -- this.getChunkAtWorldCoords(tileentity.getPosition()).d(tileentity.getPosition()); -+ // Paper start -+ net.minecraft.server.Chunk chunk = tileentity.getCurrentChunk(); -+ if (chunk != null) { -+ chunk.removeTileEntity(tileentity.getPosition()); -+ // Paper end ++ if (tileentity.getCurrentChunk() != null ) { // Paper - avoid lookups + this.getChunkAtWorldCoords(tileentity.getPosition()).removeTileEntity(tileentity.getPosition()); } } +@@ -0,0 +0,0 @@ public abstract class World implements IIBlockAccess, GeneratorAccess, AutoClose + } + // CraftBukkit end */ + +- if (this.isLoaded(tileentity1.getPosition())) { +- Chunk chunk = this.getChunkAtWorldCoords(tileentity1.getPosition()); ++ Chunk chunk = tileentity1.getCurrentChunk(); // Paper ++ if (chunk != null) { // Paper ++ //Chunk chunk = this.getChunkAtWorldCoords(tileentity1.getPosition()); // Paper + IBlockData iblockdata = chunk.getType(tileentity1.getPosition()); + + chunk.setTileEntity(tileentity1.getPosition(), tileentity1); +diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java +index 79be8cfa3..af62ab182 100644 +--- a/src/main/java/net/minecraft/server/WorldServer.java ++++ b/src/main/java/net/minecraft/server/WorldServer.java +@@ -0,0 +0,0 @@ public class WorldServer extends World { } + + this.entitiesByUUID.remove(entity.getUniqueID()); +- this.getChunkProvider().removeEntity(entity); ++ if (entity.getCurrentChunk() != null ) this.getChunkProvider().removeEntity(entity); // Paper + if (entity instanceof EntityPlayer) { + EntityPlayer entityplayer = (EntityPlayer) entity; + +@@ -0,0 +0,0 @@ public class WorldServer extends World { + } + + private void removeEntityFromChunk(Entity entity) { +- IChunkAccess ichunkaccess = this.getChunkAt(entity.chunkX, entity.chunkZ, ChunkStatus.FULL, false); ++ // Paper start ++ if (!entity.inChunk) return; ++ IChunkAccess ichunkaccess = this.getChunkIfLoaded(entity.chunkX, entity.chunkZ); ++ // Paper start + +- if (ichunkaccess instanceof Chunk) { ++ if (ichunkaccess != null) { + ((Chunk) ichunkaccess).b(entity); + } + -- \ No newline at end of file diff --git a/Spigot-Server-Patches/Avoid-item-merge-if-stack-size-above-max-stack-size.patch b/Spigot-Server-Patches/Avoid-item-merge-if-stack-size-above-max-stack-size.patch index c0c2dfe3b9..0cb2b3337c 100644 --- a/Spigot-Server-Patches/Avoid-item-merge-if-stack-size-above-max-stack-size.patch +++ b/Spigot-Server-Patches/Avoid-item-merge-if-stack-size-above-max-stack-size.patch @@ -5,18 +5,18 @@ Subject: [PATCH] Avoid item merge if stack size above max stack size diff --git a/src/main/java/net/minecraft/server/EntityItem.java b/src/main/java/net/minecraft/server/EntityItem.java -index e9986420c2..c9473087ad 100644 +index c582c6711..c5fefa060 100644 --- a/src/main/java/net/minecraft/server/EntityItem.java +++ b/src/main/java/net/minecraft/server/EntityItem.java @@ -0,0 +0,0 @@ public class EntityItem extends Entity { } - private void v() { + private void mergeNearby() { + // Paper start - avoid item merge if stack size above max stack size + ItemStack stack = getItemStack(); + if (stack.getCount() >= stack.getMaxStackSize()) return; + // Paper end // Spigot start double radius = world.spigotConfig.itemMerge; - Iterator iterator = this.world.a(EntityItem.class, this.getBoundingBox().grow(radius, radius, radius)).iterator(); + List list = this.world.a(EntityItem.class, this.getBoundingBox().grow(radius, radius, radius), (entityitem) -> { -- \ No newline at end of file diff --git a/Spigot-Server-Patches/Configurable-Alternative-LootPool-Luck-Formula.patch b/Spigot-Server-Patches/Configurable-Alternative-LootPool-Luck-Formula.patch index c8f59d9443..c9212a9ab0 100644 --- a/Spigot-Server-Patches/Configurable-Alternative-LootPool-Luck-Formula.patch +++ b/Spigot-Server-Patches/Configurable-Alternative-LootPool-Luck-Formula.patch @@ -36,7 +36,7 @@ This change will result in some major changes to fishing formulas. I would love to see this change in Vanilla, so Mojang please pull :) diff --git a/src/main/java/com/destroystokyo/paper/PaperConfig.java b/src/main/java/com/destroystokyo/paper/PaperConfig.java -index b85cd10437..d42853d14c 100644 +index 7fba61a6d..c8f9c45e5 100644 --- a/src/main/java/com/destroystokyo/paper/PaperConfig.java +++ b/src/main/java/com/destroystokyo/paper/PaperConfig.java @@ -0,0 +0,0 @@ public class PaperConfig { @@ -53,54 +53,81 @@ index b85cd10437..d42853d14c 100644 + } } diff --git a/src/main/java/net/minecraft/server/LootSelectorEntry.java b/src/main/java/net/minecraft/server/LootSelectorEntry.java -index 3e313bba7c..80f9f9a252 100644 +index 929053491..62cac814d 100644 --- a/src/main/java/net/minecraft/server/LootSelectorEntry.java +++ b/src/main/java/net/minecraft/server/LootSelectorEntry.java -@@ -0,0 +0,0 @@ import java.util.Random; +@@ -0,0 +0,0 @@ import org.apache.commons.lang3.ArrayUtils; - public abstract class LootSelectorEntry { + public abstract class LootSelectorEntry extends LootEntryAbstract { -- protected final int c; -- protected final int d; -+ protected final int c; public int getWeight() { return c; } // Paper - OBFHELPER -+ protected final int d; public int getQuality() { return d; } // Paper - OBFHELPER - protected final LootItemCondition[] e; +- protected final int e; +- protected final int f; ++ protected final int e; public int getWeight() { return e; } // Paper - OBFHELPER ++ protected final int f; public int getQuality() { return f; } // Paper - OBFHELPER + protected final LootItemFunction[] g; + private final BiFunction c; + private final LootEntry h = new LootSelectorEntry.c() { +@@ -0,0 +0,0 @@ public abstract class LootSelectorEntry extends LootEntryAbstract { + @Override + public T b(LootItemFunction.a lootitemfunction_a) { + this.c.add(lootitemfunction_a.b()); +- return (LootSelectorEntry.a) this.d(); ++ return this.d(); // Paper - decompile fix -- move to mcdev fixes + } - protected LootSelectorEntry(int i, int j, LootItemCondition[] alootitemcondition) { -@@ -0,0 +0,0 @@ public abstract class LootSelectorEntry { + protected LootItemFunction[] a() { +@@ -0,0 +0,0 @@ public abstract class LootSelectorEntry extends LootEntryAbstract { + + public T a(int i) { + this.a = i; +- return (LootSelectorEntry.a) this.d(); ++ return this.d(); // Paper - decompile fix -- move to mcdev fixes + } + + public T b(int i) { + this.b = i; +- return (LootSelectorEntry.a) this.d(); ++ return this.d(); // Paper - decompile fix -- MOVE UP + } } - public int a(float f) { -- return Math.max(MathHelper.d((float) this.c + (float) this.d * f), 0); -+ // Paper start - Offer an alternative loot formula to refactor how luck bonus applies -+ // SEE: https://luckformula.emc.gs for details and data -+ if (lastLuck != null && lastLuck == f) { + public abstract class c implements LootEntry { + +- protected c() {} ++ protected c() { ++ } + + @Override + public int a(float f) { +- return Math.max(MathHelper.d((float) LootSelectorEntry.this.e + (float) LootSelectorEntry.this.f * f), 0); ++ // Paper start - Offer an alternative loot formula to refactor how luck bonus applies ++ // SEE: https://luckformula.emc.gs for details and data ++ if (lastLuck != null && lastLuck == f) { ++ return lastWeight; ++ } ++ // This is vanilla ++ float qualityModifer = (float) getQuality() * f; ++ double baseWeight = (getWeight() + qualityModifer); ++ if (com.destroystokyo.paper.PaperConfig.useAlternativeLuckFormula) { ++ // Random boost to avoid losing precision in the final int cast on return ++ final int weightBoost = 100; ++ baseWeight *= weightBoost; ++ // If we have vanilla 1, bump that down to 0 so nothing is is impacted ++ // vanilla 3 = 300, 200 basis = impact 2% ++ // =($B2*(($B2-100)/100/100)) ++ double impacted = baseWeight * ((baseWeight - weightBoost) / weightBoost / 100); ++ // =($B$7/100) ++ float luckModifier = Math.min(100, f * 10) / 100; ++ // =B2 - (C2 *($B$7/100)) ++ baseWeight = Math.ceil(baseWeight - (impacted * luckModifier)); ++ } ++ lastLuck = f; ++ lastWeight = (int) Math.max(0, Math.floor(baseWeight)); + return lastWeight; -+ } -+ // This is vanilla -+ float qualityModifer = (float) this.getQuality() * f; -+ double baseWeight = (this.getWeight() + qualityModifer); -+ if (com.destroystokyo.paper.PaperConfig.useAlternativeLuckFormula) { -+ // Random boost to avoid losing precision in the final int cast on return -+ final int weightBoost = 100; -+ baseWeight *= weightBoost; -+ // If we have vanilla 1, bump that down to 0 so nothing is is impacted -+ // vanilla 3 = 300, 200 basis = impact 2% -+ // =($B2*(($B2-100)/100/100)) -+ double impacted = baseWeight * ((baseWeight - weightBoost) / weightBoost / 100); -+ // =($B$7/100) -+ float luckModifier = Math.min(100, f * 10) / 100; -+ // =B2 - (C2 *($B$7/100)) -+ baseWeight = Math.ceil(baseWeight - (impacted * luckModifier)); -+ } -+ lastLuck = f; -+ lastWeight = (int) Math.max(0, Math.floor(baseWeight)); -+ return lastWeight; + } } -+ private Float lastLuck = null; -+ private int lastWeight = 0; -+ // Paper end - - public abstract void a(Collection collection, Random random, LootTableInfo loottableinfo); - ++ private Float lastLuck = null; ++ private int lastWeight = 0; ++ // Paper end + } -- \ No newline at end of file diff --git a/Spigot-Server-Patches/Configurable-Bed-Search-Radius.patch b/Spigot-Server-Patches/Configurable-Bed-Search-Radius.patch index 85d57f0ebf..a488e45c97 100644 --- a/Spigot-Server-Patches/Configurable-Bed-Search-Radius.patch +++ b/Spigot-Server-Patches/Configurable-Bed-Search-Radius.patch @@ -10,7 +10,7 @@ player at their bed should it of became obstructed. Defaults to vanilla 1. diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java -index aa2be2ede6..f5b2e88f3b 100644 +index 3294fbbea..83e54cb90 100644 --- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java +++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java @@ -0,0 +0,0 @@ public class PaperWorldConfig { @@ -30,74 +30,74 @@ index aa2be2ede6..f5b2e88f3b 100644 + } } diff --git a/src/main/java/net/minecraft/server/BlockBed.java b/src/main/java/net/minecraft/server/BlockBed.java -index 06f627002c..d81a2db6cd 100644 +index 2a451025f..75331c986 100644 --- a/src/main/java/net/minecraft/server/BlockBed.java +++ b/src/main/java/net/minecraft/server/BlockBed.java @@ -0,0 +0,0 @@ public class BlockBed extends BlockFacingHorizontal implements ITileEntity { - @Nullable - public static BlockPosition a(IBlockAccess iblockaccess, BlockPosition blockposition, int i) { - EnumDirection enumdirection = (EnumDirection) iblockaccess.getType(blockposition).get(BlockBed.FACING); -+ // Paper - replace whole method -+ World world = (World) iblockaccess; + + public static Optional a(EntityTypes entitytypes, IWorldReader iworldreader, BlockPosition blockposition, int i) { + EnumDirection enumdirection = (EnumDirection) iworldreader.getType(blockposition).get(BlockBed.FACING); ++ // Paper - configurable bed search radius ++ World world = (World) iworldreader; + int radius = world.paperConfig.bedSearchRadius; -+ for (int r = 1; r <= radius; r++) { -+ int x = -r; -+ int z = r; ++ if (radius > 0) { ++ for (int r = 1; r <= radius; r++) { ++ int x = -r; ++ int z = r; + -+ // Iterates the edge of half of the box; then negates for other half. -+ while (x <= r && z > -r) { -+ for (int y = -1; y <= 1; y++) { -+ BlockPosition pos = blockposition.add(x, y, z); -+ if (isSafeRespawn(world, pos)) { -+ if (i-- <= 0) { -+ return pos; ++ // Iterates the edge of half of the box; then negates for other half. ++ while (x <= r && z > -r) { ++ for (int y = -1; y <= 1; y++) { ++ BlockPosition pos = blockposition.add(x, y, z); ++ Optional vector; ++ vector = isSafeRespawn(entitytypes, world, pos); ++ if (vector.isPresent()) { ++ if (i-- <= 0) { ++ return vector; ++ } + } -+ } -+ pos = blockposition.add(-x, y, -z); -+ if (isSafeRespawn(world, pos)) { -+ if (i-- <= 0) { -+ return pos; ++ pos = blockposition.add(-x, y, -z); ++ vector = isSafeRespawn(entitytypes, world, pos); ++ if (vector.isPresent()) { ++ if (i-- <= 0) { ++ return vector; ++ } + } -+ } + -+ pos = blockposition.add(enumdirection.getAdjacentX() + x, y, enumdirection.getAdjacentZ() + z); -+ if (isSafeRespawn(world, pos)) { -+ if (i-- <= 0) { -+ return pos; ++ vector = isSafeRespawn(entitytypes, world, pos); ++ if (vector.isPresent()) { ++ if (i-- <= 0) { ++ return vector; ++ } + } -+ } + -+ pos = blockposition.add(enumdirection.getAdjacentX() - x, y, enumdirection.getAdjacentZ() - z); -+ if (isSafeRespawn(world, pos)) { -+ if (i-- <= 0) { -+ return pos; ++ vector = isSafeRespawn(entitytypes, world, pos); ++ if (vector.isPresent()) { ++ if (i-- <= 0) { ++ return vector; ++ } + } + } -+ } -+ if (x < r) { -+ x++; -+ } else { -+ z--; ++ if (x < r) { ++ x++; ++ } else { ++ z--; ++ } + } + } -+ } + -+ return null; /* // Paper comment out ++ return Optional.empty(); ++ } ++ // Paper end int j = blockposition.getX(); int k = blockposition.getY(); int l = blockposition.getZ(); @@ -0,0 +0,0 @@ public class BlockBed extends BlockFacingHorizontal implements ITileEntity { - } - } - -- return null; -+ return null;*/ // Paper + return Optional.empty(); } -+ protected static boolean isSafeRespawn(IBlockAccess iblockaccess, BlockPosition blockposition) { // Paper - OBFHELPER + behavior improvement -+ return a(iblockaccess, blockposition) && iblockaccess.getType(blockposition.down()).getMaterial().isBuildable(); // Paper - ensure solid block -+ } - protected static boolean a(IBlockAccess iblockaccess, BlockPosition blockposition) { - return iblockaccess.getType(blockposition.down()).q() && !iblockaccess.getType(blockposition).getMaterial().isBuildable() && !iblockaccess.getType(blockposition.up()).getMaterial().isBuildable(); - } ++ protected static Optional isSafeRespawn(EntityTypes entityTypes, IWorldReader iworldreader, BlockPosition blockPosition) { return a(entityTypes, iworldreader, blockPosition); } // Paper -- obfhelper + protected static Optional a(EntityTypes entitytypes, IWorldReader iworldreader, BlockPosition blockposition) { + VoxelShape voxelshape = iworldreader.getType(blockposition).getCollisionShape(iworldreader, blockposition); + -- \ No newline at end of file diff --git a/Spigot-Server-Patches/Don-t-change-the-Entity-Random-seed-for-squids.patch b/Spigot-Server-Patches/Don-t-change-the-Entity-Random-seed-for-squids.patch index ad07c96ff2..9204f1f2da 100644 --- a/Spigot-Server-Patches/Don-t-change-the-Entity-Random-seed-for-squids.patch +++ b/Spigot-Server-Patches/Don-t-change-the-Entity-Random-seed-for-squids.patch @@ -5,16 +5,16 @@ Subject: [PATCH] Don't change the Entity Random seed for squids diff --git a/src/main/java/net/minecraft/server/EntitySquid.java b/src/main/java/net/minecraft/server/EntitySquid.java -index b9c76325db..ab79317a2d 100644 +index d5dff4b88..77c0ed42f 100644 --- a/src/main/java/net/minecraft/server/EntitySquid.java +++ b/src/main/java/net/minecraft/server/EntitySquid.java @@ -0,0 +0,0 @@ public class EntitySquid extends EntityWaterAnimal { - public EntitySquid(World world) { - super(EntityTypes.SQUID, world); - this.setSize(0.8F, 0.8F); -- this.random.setSeed((long) (1 + this.getId())); -+ //this.random.setSeed((long) (1 + this.getId())); // Paper - this.bI = 1.0F / (this.random.nextFloat() + 1.0F) * 0.2F; + + public EntitySquid(EntityTypes entitytypes, World world) { + super(entitytypes, world); +- this.random.setSeed((long) this.getId()); ++ //this.random.setSeed((long) this.getId()); // Paper + this.bF = 1.0F / (this.random.nextFloat() + 1.0F) * 0.2F; } -- \ No newline at end of file diff --git a/Spigot-Server-Patches/Don-t-process-despawn-if-entity-is-in-a-chunk-schedu.patch b/Spigot-Server-Patches/Don-t-process-despawn-if-entity-is-in-a-chunk-schedu.patch deleted file mode 100644 index d1d52d1601..0000000000 --- a/Spigot-Server-Patches/Don-t-process-despawn-if-entity-is-in-a-chunk-schedu.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Thu, 19 Jul 2018 01:23:00 -0400 -Subject: [PATCH] Don't process despawn if entity is in a chunk scheduled for - unload - -This won't happen anyways if the user has -"skip ticking for entities in chunks scheduled for unload" turned on, -but if they don't, protect from this instant killing the entity to -keep it vanilla in behavior - -a player may teleport away, and trigger instant despawn - -diff --git a/src/main/java/net/minecraft/server/EntityInsentient.java b/src/main/java/net/minecraft/server/EntityInsentient.java -index 98e214cdd6..ee5078370c 100644 ---- a/src/main/java/net/minecraft/server/EntityInsentient.java -+++ b/src/main/java/net/minecraft/server/EntityInsentient.java -@@ -0,0 +0,0 @@ public abstract class EntityInsentient extends EntityLiving { - if (this.persistent) { - this.ticksFarFromPlayer = 0; - } else { -+ Chunk currentChunk = getChunkAtLocation(); // Paper -+ if (currentChunk != null && currentChunk.scheduledForUnload != null) return; // Paper - EntityHuman entityhuman = this.world.findNearbyPlayer(this, -1.0D); - - if (entityhuman != null && entityhuman.affectsSpawning) { // Paper - Affects Spawning API --- \ No newline at end of file diff --git a/Spigot-Server-Patches/Don-t-save-Proto-Chunks.patch b/Spigot-Server-Patches/Don-t-save-Proto-Chunks.patch index 30db3bd8d6..d398ff3d08 100644 --- a/Spigot-Server-Patches/Don-t-save-Proto-Chunks.patch +++ b/Spigot-Server-Patches/Don-t-save-Proto-Chunks.patch @@ -7,37 +7,16 @@ These chunks are unfinished, and waste cpu time saving these unfinished chunks. the loadChunk method refuses to acknoledge they exists, and will restart a new chunk generation process to begin with, so saving them serves no benefit. -diff --git a/src/main/java/net/minecraft/server/ChunkRegionLoader.java b/src/main/java/net/minecraft/server/ChunkRegionLoader.java -index 0fc4d9f520..2c4a4fc6b7 100644 ---- a/src/main/java/net/minecraft/server/ChunkRegionLoader.java -+++ b/src/main/java/net/minecraft/server/ChunkRegionLoader.java -@@ -0,0 +0,0 @@ public class ChunkRegionLoader implements IChunkLoader, IAsyncChunkSaver { +diff --git a/src/main/java/net/minecraft/server/PlayerChunkMap.java b/src/main/java/net/minecraft/server/PlayerChunkMap.java +index 3fab45aa9..26fd5dd1e 100644 +--- a/src/main/java/net/minecraft/server/PlayerChunkMap.java ++++ b/src/main/java/net/minecraft/server/PlayerChunkMap.java +@@ -0,0 +0,0 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { } - public void saveChunk(World world, IChunkAccess ichunkaccess, boolean unloaded) throws IOException, ExceptionWorldConflict { -+ if (ichunkaccess.i().d() == ChunkStatus.Type.PROTOCHUNK) { return; } // Paper - don't save proto chunks - // Spigot end - world.checkSession(); - -diff --git a/src/main/java/net/minecraft/server/ChunkTaskScheduler.java b/src/main/java/net/minecraft/server/ChunkTaskScheduler.java -index 70a95c2636..56958a5ce3 100644 ---- a/src/main/java/net/minecraft/server/ChunkTaskScheduler.java -+++ b/src/main/java/net/minecraft/server/ChunkTaskScheduler.java -@@ -0,0 +0,0 @@ public class ChunkTaskScheduler extends Scheduler.a scheduler_a) { - ProtoChunk protochunk = (ProtoChunk) scheduler_a.a(); - -- return !protochunk.ab_() && !protochunk.h(); -+ return !protochunk.ab_() /*&& !protochunk.h()*/; // Paper - } - }; - -@@ -0,0 +0,0 @@ public class ChunkTaskScheduler extends Scheduler -Date: Sat, 21 Jul 2018 14:27:34 -0400 -Subject: [PATCH] Duplicate UUID Resolve Option - -Due to a bug in https://github.com/PaperMC/Paper/commit/2e29af3df05ec0a383f48be549d1c03200756d24 -which was added all the way back in March of 2016, it was unknown (potentially not at the time) -that an entity might actually change the seed of the random object. - -At some point, EntitySquid did start setting the seed. Due to this shared random, this caused -every entity to use a Random object with a predictable seed. - -This has caused entities to potentially generate with the same UUID.... - -Over the years, servers have had entities disappear, but no sign of trouble -because CraftBukkit removed the log lines indicating that something was wrong. - -We have fixed the root issue causing duplicate UUID's, however we now have chunk -files full of entities that have the same UUID as another entity! - -When these chunks load, the 2nd entity will not be added to the world correctly. - -If that chunk loads in a different order in the future, then it will reverse and the -missing one is now the one added to the world and not the other. This results in very -inconsistent entity behavior. - -This change allows you to recover any duplicate entity by generating a new UUID for it. -This also lets you delete them instead if you don't want to risk having new entities added to -the world that you previously did not see. - -But for those who are ok with leaving this inconsistent behavior, you may use WARN or NOTHING options. - -It is recommended you regenerate the entities, as these were legit entities, and deserve your love. - -diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java -index f5b2e88f3b..8c4ff18868 100644 ---- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java -+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java -@@ -0,0 +0,0 @@ public class PaperWorldConfig { - log("Bed Search Radius: " + bedSearchRadius); - } - } -+ -+ public enum DuplicateUUIDMode { -+ SAFE_REGEN, DELETE, NOTHING, WARN -+ } -+ public DuplicateUUIDMode duplicateUUIDMode = DuplicateUUIDMode.SAFE_REGEN; -+ public int duplicateUUIDDeleteRange = 32; -+ private void repairDuplicateUUID() { -+ String desiredMode = getString("duplicate-uuid-resolver", "saferegen").toLowerCase().trim(); -+ duplicateUUIDDeleteRange = getInt("duplicate-uuid-saferegen-delete-range", duplicateUUIDDeleteRange); -+ switch (desiredMode.toLowerCase()) { -+ case "regen": -+ case "regenerate": -+ case "saferegen": -+ case "saferegenerate": -+ duplicateUUIDMode = DuplicateUUIDMode.SAFE_REGEN; -+ log("Duplicate UUID Resolve: Regenerate New UUID if distant (Delete likely duplicates within " + duplicateUUIDDeleteRange + " blocks)"); -+ break; -+ case "remove": -+ case "delete": -+ duplicateUUIDMode = DuplicateUUIDMode.DELETE; -+ log("Duplicate UUID Resolve: Delete Entity"); -+ break; -+ case "silent": -+ case "nothing": -+ duplicateUUIDMode = DuplicateUUIDMode.NOTHING; -+ logError("Duplicate UUID Resolve: Do Nothing (no logs) - Warning, may lose indication of bad things happening"); -+ break; -+ case "log": -+ case "warn": -+ duplicateUUIDMode = DuplicateUUIDMode.WARN; -+ log("Duplicate UUID Resolve: Warn (do nothing but log it happened, may be spammy)"); -+ break; -+ default: -+ duplicateUUIDMode = DuplicateUUIDMode.WARN; -+ logError("Warning: Invalid duplicate-uuid-resolver config " + desiredMode + " - must be one of: regen, delete, nothing, warn"); -+ log("Duplicate UUID Resolve: Warn (do nothing but log it happened, may be spammy)"); -+ break; -+ } -+ } - } -diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java -index c2f12f92b0..e8c06e01b4 100644 ---- a/src/main/java/net/minecraft/server/Chunk.java -+++ b/src/main/java/net/minecraft/server/Chunk.java -@@ -0,0 +0,0 @@ - package net.minecraft.server; - -+// Paper start -+import com.destroystokyo.paper.PaperWorldConfig.DuplicateUUIDMode; -+import java.util.HashMap; -+import java.util.UUID; -+// Paper end - import com.destroystokyo.paper.exception.ServerInternalException; - import com.google.common.collect.Maps; - import com.google.common.collect.Queues; -@@ -0,0 +0,0 @@ public class Chunk implements IChunkAccess { - public final World world; - public final Map heightMap; - public Long scheduledForUnload; // Paper - delay chunk unloads -+ private static final Logger logger = LogManager.getLogger(); // Paper - public final int locX; - public final int locZ; - private boolean l; -@@ -0,0 +0,0 @@ public class Chunk implements IChunkAccess { - if (i != this.locX || j != this.locZ) { - Chunk.d.warn("Wrong location! ({}, {}) should be ({}, {}), {}", i, j, this.locX, this.locZ, entity); - entity.die(); -+ return; // Paper - } - - int k = MathHelper.floor(entity.locY / 16.0D); -@@ -0,0 +0,0 @@ public class Chunk implements IChunkAccess { - - for (int j = 0; j < i; ++j) { - List entityslice = aentityslice[j]; // Spigot -+ // Paper start -+ DuplicateUUIDMode mode = world.paperConfig.duplicateUUIDMode; -+ if (mode == DuplicateUUIDMode.WARN || mode == DuplicateUUIDMode.DELETE || mode == DuplicateUUIDMode.SAFE_REGEN) { -+ Map thisChunk = new HashMap<>(); -+ for (Iterator iterator = ((List) entityslice).iterator(); iterator.hasNext(); ) { -+ Entity entity = iterator.next(); -+ if (entity.dead || entity.valid) continue; -+ Entity other = ((WorldServer) world).entitiesByUUID.get(entity.uniqueID); -+ if (other == null || other.dead || world.getEntityUnloadQueue().contains(other)) { -+ other = thisChunk.get(entity.uniqueID); -+ } -+ -+ if (mode == DuplicateUUIDMode.SAFE_REGEN && other != null && !other.dead && -+ !world.getEntityUnloadQueue().contains(other) -+ && java.util.Objects.equals(other.getSaveID(), entity.getSaveID()) -+ && entity.getBukkitEntity().getLocation().distance(other.getBukkitEntity().getLocation()) < world.paperConfig.duplicateUUIDDeleteRange -+ ) { -+ if (World.DEBUG_ENTITIES) logger.warn("[DUPE-UUID] Duplicate UUID found used by " + other + ", deleted entity " + entity + " because it was near the duplicate and likely an actual duplicate. See https://github.com/PaperMC/Paper/issues/1223 for discussion on what this is about."); -+ entity.die(); -+ iterator.remove(); -+ continue; -+ } -+ if (other != null && !other.dead) { -+ switch (mode) { -+ case SAFE_REGEN: { -+ entity.setUUID(UUID.randomUUID()); -+ if (World.DEBUG_ENTITIES) logger.warn("[DUPE-UUID] Duplicate UUID found used by " + other + ", regenerated UUID for " + entity + ". See https://github.com/PaperMC/Paper/issues/1223 for discussion on what this is about."); -+ break; -+ } -+ case DELETE: { -+ if (World.DEBUG_ENTITIES) logger.warn("[DUPE-UUID] Duplicate UUID found used by " + other + ", deleted entity " + entity + ". See https://github.com/PaperMC/Paper/issues/1223 for discussion on what this is about."); -+ entity.die(); -+ iterator.remove(); -+ break; -+ } -+ default: -+ if (World.DEBUG_ENTITIES) logger.warn("[DUPE-UUID] Duplicate UUID found used by " + other + ", doing nothing to " + entity + ". See https://github.com/PaperMC/Paper/issues/1223 for discussion on what this is about."); -+ break; -+ } -+ } -+ thisChunk.put(entity.uniqueID, entity); -+ } -+ } -+ // Paper end - - // CraftBukkit start - List toRemove = new LinkedList<>(); -diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java -index b6c46e01d9..6598b87eef 100644 ---- a/src/main/java/net/minecraft/server/Entity.java -+++ b/src/main/java/net/minecraft/server/Entity.java -@@ -0,0 +0,0 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke - }); - } - -+ public void setUUID(UUID uuid) { a(uuid); } // Paper - OBFHELPER - public void a(UUID uuid) { - this.uniqueID = uuid; - this.au = this.uniqueID.toString(); -diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java -index 1496125ddf..a5f4b9ad94 100644 ---- a/src/main/java/net/minecraft/server/World.java -+++ b/src/main/java/net/minecraft/server/World.java -@@ -0,0 +0,0 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc - } - }; - // Spigot end -- protected final Set g = com.google.common.collect.Sets.newHashSet(); // Paper -+ protected final Set g = com.google.common.collect.Sets.newHashSet(); public Set getEntityUnloadQueue() { return g; };// Paper - OBFHELPER - //public final List tileEntityList = Lists.newArrayList(); // Paper - remove unused list - public final List tileEntityListTick = Lists.newArrayList(); - private final List c = Lists.newArrayList(); -diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java -index 6d1f70b39e..293818b196 100644 ---- a/src/main/java/net/minecraft/server/WorldServer.java -+++ b/src/main/java/net/minecraft/server/WorldServer.java -@@ -0,0 +0,0 @@ public class WorldServer extends World implements IAsyncTaskHandler { - private final MinecraftServer server; - public EntityTracker tracker; - private final PlayerChunkMap manager; -- private final Map entitiesByUUID = Maps.newHashMap(); -+ public final Map entitiesByUUID = Maps.newHashMap(); // Paper - public boolean savingDisabled; - private boolean J; - private int emptyTime; -@@ -0,0 +0,0 @@ public class WorldServer extends World implements IAsyncTaskHandler { - this.g.remove(entity1); - } else { - if (!(entity instanceof EntityHuman)) { -- if (DEBUG_ENTITIES) { -+ if (DEBUG_ENTITIES && entity.world.paperConfig.duplicateUUIDMode != com.destroystokyo.paper.PaperWorldConfig.DuplicateUUIDMode.NOTHING) { - WorldServer.a.error("Keeping entity {} that already exists with UUID {}", entity1, uuid.toString()); // CraftBukkit // Paper - WorldServer.a.error("Deleting duplicate entity {}", entity); // Paper - -@@ -0,0 +0,0 @@ public class WorldServer extends World implements IAsyncTaskHandler { - } - - Entity old = this.entitiesByUUID.put(entity.getUniqueID(), entity); -- if (old != null && old.getId() != entity.getId() && old.valid) { -+ if (old != null && old.getId() != entity.getId() && old.valid && entity.world.paperConfig.duplicateUUIDMode != com.destroystokyo.paper.PaperWorldConfig.DuplicateUUIDMode.NOTHING) { - Logger logger = LogManager.getLogger(); - logger.error("Overwrote an existing entity " + old + " with " + entity); - if (DEBUG_ENTITIES) { --- \ No newline at end of file diff --git a/Spigot-Server-Patches/EnderDragon-Events.patch b/Spigot-Server-Patches/EnderDragon-Events.patch index b09a5e51e6..8142689d5a 100644 --- a/Spigot-Server-Patches/EnderDragon-Events.patch +++ b/Spigot-Server-Patches/EnderDragon-Events.patch @@ -5,12 +5,12 @@ Subject: [PATCH] EnderDragon Events diff --git a/src/main/java/net/minecraft/server/DragonControllerLandedFlame.java b/src/main/java/net/minecraft/server/DragonControllerLandedFlame.java -index 1906bcfc96..50d291139c 100644 +index 4ab310cd6..90f6d58dd 100644 --- a/src/main/java/net/minecraft/server/DragonControllerLandedFlame.java +++ b/src/main/java/net/minecraft/server/DragonControllerLandedFlame.java @@ -0,0 +0,0 @@ public class DragonControllerLandedFlame extends AbstractDragonControllerLanded this.d.setDuration(200); - this.d.setParticle(Particles.j); + this.d.setParticle(Particles.DRAGON_BREATH); this.d.a(new MobEffect(MobEffects.HARM)); + if (new com.destroystokyo.paper.event.entity.EnderDragonFlameEvent((org.bukkit.entity.EnderDragon) this.a.getBukkitEntity(), (org.bukkit.entity.AreaEffectCloud) this.d.getBukkitEntity()).callEvent()) // Paper this.a.world.addEntity(this.d); @@ -22,12 +22,13 @@ index 1906bcfc96..50d291139c 100644 ++this.c; } ++ + public void removeAreaEffect() { this.e(); } // Paper - OBFHELPER + @Override public void e() { if (this.d != null) { - this.d.die(); diff --git a/src/main/java/net/minecraft/server/DragonControllerStrafe.java b/src/main/java/net/minecraft/server/DragonControllerStrafe.java -index e742586765..141ba1e5e6 100644 +index b46660576..bf15964e7 100644 --- a/src/main/java/net/minecraft/server/DragonControllerStrafe.java +++ b/src/main/java/net/minecraft/server/DragonControllerStrafe.java @@ -0,0 +0,0 @@ public class DragonControllerStrafe extends AbstractDragonController { @@ -41,7 +42,7 @@ index e742586765..141ba1e5e6 100644 if (this.d != null) { while (!this.d.b()) { diff --git a/src/main/java/net/minecraft/server/EntityDragonFireball.java b/src/main/java/net/minecraft/server/EntityDragonFireball.java -index 7df8fd4d74..c0d66a0233 100644 +index 239be99c5..2195b83ce 100644 --- a/src/main/java/net/minecraft/server/EntityDragonFireball.java +++ b/src/main/java/net/minecraft/server/EntityDragonFireball.java @@ -0,0 +0,0 @@ public class EntityDragonFireball extends EntityFireball { diff --git a/Spigot-Server-Patches/EntityShootBowEvent-consumeArrow-and-getArrowItem-AP.patch b/Spigot-Server-Patches/EntityShootBowEvent-consumeArrow-and-getArrowItem-AP.patch index eafd0f60d2..51ab2c443c 100644 --- a/Spigot-Server-Patches/EntityShootBowEvent-consumeArrow-and-getArrowItem-AP.patch +++ b/Spigot-Server-Patches/EntityShootBowEvent-consumeArrow-and-getArrowItem-AP.patch @@ -6,7 +6,7 @@ Subject: [PATCH] EntityShootBowEvent consumeArrow and getArrowItem API Adds ability to get what arrow was shot, and control if it should be consumed. diff --git a/src/main/java/net/minecraft/server/EntitySkeletonAbstract.java b/src/main/java/net/minecraft/server/EntitySkeletonAbstract.java -index 749a8a5272..6e2ee04c77 100644 +index e575d3cff..85157e80d 100644 --- a/src/main/java/net/minecraft/server/EntitySkeletonAbstract.java +++ b/src/main/java/net/minecraft/server/EntitySkeletonAbstract.java @@ -0,0 +0,0 @@ public abstract class EntitySkeletonAbstract extends EntityMonster implements IR @@ -19,10 +19,10 @@ index 749a8a5272..6e2ee04c77 100644 event.getProjectile().remove(); return; diff --git a/src/main/java/net/minecraft/server/ItemBow.java b/src/main/java/net/minecraft/server/ItemBow.java -index 6934114005..52bc68e6a6 100644 +index 50b815dc8..4ec02c8ce 100644 --- a/src/main/java/net/minecraft/server/ItemBow.java +++ b/src/main/java/net/minecraft/server/ItemBow.java -@@ -0,0 +0,0 @@ public class ItemBow extends Item { +@@ -0,0 +0,0 @@ public class ItemBow extends ItemProjectileWeapon { if ((double) f >= 0.1D) { boolean flag1 = flag && itemstack1.getItem() == Items.ARROW; @@ -30,7 +30,7 @@ index 6934114005..52bc68e6a6 100644 if (!world.isClientSide) { ItemArrow itemarrow = (ItemArrow) ((ItemArrow) (itemstack1.getItem() instanceof ItemArrow ? itemstack1.getItem() : Items.ARROW)); EntityArrow entityarrow = itemarrow.a(world, itemstack1, (EntityLiving) entityhuman); -@@ -0,0 +0,0 @@ public class ItemBow extends Item { +@@ -0,0 +0,0 @@ public class ItemBow extends ItemProjectileWeapon { entityarrow.setOnFire(100); } // CraftBukkit start @@ -39,17 +39,17 @@ index 6934114005..52bc68e6a6 100644 if (event.isCancelled()) { event.getProjectile().remove(); return; -@@ -0,0 +0,0 @@ public class ItemBow extends Item { - // CraftBukkit end - - itemstack.damage(1, entityhuman); +@@ -0,0 +0,0 @@ public class ItemBow extends ItemProjectileWeapon { + itemstack.damage(1, entityhuman, (entityhuman1) -> { + entityhuman1.d(entityhuman.getRaisedHand()); + }); - if (flag1 || entityhuman.abilities.canInstantlyBuild && (itemstack1.getItem() == Items.SPECTRAL_ARROW || itemstack1.getItem() == Items.TIPPED_ARROW)) { + consumeArrow = event.getConsumeArrow(); // Paper -+ if (!consumeArrow || flag1 || (entityhuman.abilities.canInstantlyBuild && ((itemstack1.getItem() == Items.SPECTRAL_ARROW) || (itemstack1.getItem() == Items.TIPPED_ARROW)))) { // Paper - add !consumeArrow ++ if (!consumeArrow || flag1 || (entityhuman.abilities.canInstantlyBuild && ((itemstack1.getItem() == Items.SPECTRAL_ARROW) || (itemstack1.getItem() == Items.TIPPED_ARROW)))) { // Paper - add entityarrow.fromPlayer = EntityArrow.PickupStatus.CREATIVE_ONLY; } -@@ -0,0 +0,0 @@ public class ItemBow extends Item { +@@ -0,0 +0,0 @@ public class ItemBow extends ItemProjectileWeapon { } world.a((EntityHuman) null, entityhuman.locX, entityhuman.locY, entityhuman.locZ, SoundEffects.ENTITY_ARROW_SHOOT, SoundCategory.PLAYERS, 1.0F, 1.0F / (ItemBow.i.nextFloat() * 0.4F + 1.2F) + f * 0.5F); @@ -58,25 +58,48 @@ index 6934114005..52bc68e6a6 100644 itemstack1.subtract(1); if (itemstack1.isEmpty()) { entityhuman.inventory.f(itemstack1); +diff --git a/src/main/java/net/minecraft/server/ItemCrossbow.java b/src/main/java/net/minecraft/server/ItemCrossbow.java +index 569e117b7..144c63c9a 100644 +--- a/src/main/java/net/minecraft/server/ItemCrossbow.java ++++ b/src/main/java/net/minecraft/server/ItemCrossbow.java +@@ -0,0 +0,0 @@ public class ItemCrossbow extends ItemProjectileWeapon { + ((IProjectile) object).shoot((double) vector3fa.a(), (double) vector3fa.b(), (double) vector3fa.c(), f1, f2); + } + // CraftBukkit start +- org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(entityliving, itemstack, (Entity) object, f); ++ org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(entityliving, itemstack, itemstack1, (IProjectile) object, f); // Paper // TODO: consume?? + if (event.isCancelled()) { + event.getProjectile().remove(); + return; diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java -index c02619bb57..acc80d0684 100644 +index 8d3dca2a9..4a16f2f53 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +@@ -0,0 +0,0 @@ import net.minecraft.server.GeneratorAccess; + import net.minecraft.server.IBlockData; + import net.minecraft.server.IChatBaseComponent; + import net.minecraft.server.IInventory; ++import net.minecraft.server.IProjectile; + import net.minecraft.server.ItemActionContext; + import net.minecraft.server.ItemStack; + import net.minecraft.server.Items; @@ -0,0 +0,0 @@ public class CraftEventFactory { /** * EntityShootBowEvent */ -- public static EntityShootBowEvent callEntityShootBowEvent(EntityLiving who, ItemStack itemstack, EntityArrow entityArrow, float force) { -+ public static EntityShootBowEvent callEntityShootBowEvent(EntityLiving who, /*bow*/ItemStack itemstack, /*arrow*/ ItemStack arrowItem, EntityArrow entityArrow, float force) { // Paper +- public static EntityShootBowEvent callEntityShootBowEvent(EntityLiving who, ItemStack itemstack, Entity entityArrow, float force) { ++ public static EntityShootBowEvent callEntityShootBowEvent(EntityLiving who, ItemStack itemstack, ItemStack arrowItem, IProjectile entityArrow, float force) { // paper LivingEntity shooter = (LivingEntity) who.getBukkitEntity(); CraftItemStack itemInHand = CraftItemStack.asCraftMirror(itemstack); - Arrow arrow = (Arrow) entityArrow.getBukkitEntity(); -@@ -0,0 +0,0 @@ public class CraftEventFactory { +- org.bukkit.entity.Entity arrow = entityArrow.getBukkitEntity(); ++ org.bukkit.entity.Entity arrow = ((Entity) entityArrow).getBukkitEntity(); // Paper + + if (itemInHand != null && (itemInHand.getType() == Material.AIR || itemInHand.getAmount() == 0)) { itemInHand = null; } - EntityShootBowEvent event = new EntityShootBowEvent(shooter, itemInHand, arrow, force); -+ EntityShootBowEvent event = new EntityShootBowEvent(shooter, itemInHand, CraftItemStack.asCraftMirror(arrowItem), arrow, force); // Paper ++ EntityShootBowEvent event = new EntityShootBowEvent(shooter, itemInHand, CraftItemStack.asCraftMirror(arrowItem), (Projectile) arrow, force); // Paper Bukkit.getPluginManager().callEvent(event); return event; diff --git a/Spigot-Server-Patches/Expand-Explosions-API.patch b/Spigot-Server-Patches/Expand-Explosions-API.patch index 333c7a8a19..b46e5f89fe 100644 --- a/Spigot-Server-Patches/Expand-Explosions-API.patch +++ b/Spigot-Server-Patches/Expand-Explosions-API.patch @@ -6,12 +6,12 @@ Subject: [PATCH] Expand Explosions API Add Entity as a Source capability, and add more API choices, and on Location. diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -index 1cc42edae8..cfa35740b4 100644 +index 3ed9d3f47..c8cbedb5c 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -0,0 +0,0 @@ public class CraftWorld implements World { public boolean createExplosion(double x, double y, double z, float power, boolean setFire, boolean breakBlocks) { - return !world.createExplosion(null, x, y, z, power, setFire, breakBlocks).wasCanceled; + return !world.createExplosion(null, x, y, z, power, setFire, breakBlocks ? Explosion.Effect.BREAK : Explosion.Effect.NONE).wasCanceled; } + // Paper start + public boolean createExplosion(Entity source, Location loc, float power, boolean setFire, boolean breakBlocks) { diff --git a/Spigot-Server-Patches/Fire-EntityShootBowEvent-for-Illusioner.patch b/Spigot-Server-Patches/Fire-EntityShootBowEvent-for-Illusioner.patch index d726e9cbc9..b7554dd747 100644 --- a/Spigot-Server-Patches/Fire-EntityShootBowEvent-for-Illusioner.patch +++ b/Spigot-Server-Patches/Fire-EntityShootBowEvent-for-Illusioner.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Fire EntityShootBowEvent for Illusioner diff --git a/src/main/java/net/minecraft/server/EntityIllagerIllusioner.java b/src/main/java/net/minecraft/server/EntityIllagerIllusioner.java -index 08af4453fa..8b595979e7 100644 +index 378267314..96ad67889 100644 --- a/src/main/java/net/minecraft/server/EntityIllagerIllusioner.java +++ b/src/main/java/net/minecraft/server/EntityIllagerIllusioner.java @@ -0,0 +0,0 @@ public class EntityIllagerIllusioner extends EntityIllagerWizard implements IRan @@ -27,5 +27,5 @@ index 08af4453fa..8b595979e7 100644 + // Paper end } - protected EntityArrow v(float f) { + class a extends EntityIllagerWizard.c { -- \ No newline at end of file diff --git a/Spigot-Server-Patches/Fix-CraftEntity-hashCode.patch b/Spigot-Server-Patches/Fix-CraftEntity-hashCode.patch index 0ddb726937..f1c9efaf81 100644 --- a/Spigot-Server-Patches/Fix-CraftEntity-hashCode.patch +++ b/Spigot-Server-Patches/Fix-CraftEntity-hashCode.patch @@ -21,7 +21,7 @@ check is essentially the same as this.getHandle() == other.getHandle() However, replaced it too to make it clearer of intent. diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -index 84a58c7dcd..a0e1a70d43 100644 +index e0ae72bbc..65621f966 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java @@ -0,0 +0,0 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { diff --git a/Spigot-Server-Patches/Ignore-Missing-Recipes-in-RecipeBook-to-avoid-data-e.patch b/Spigot-Server-Patches/Ignore-Missing-Recipes-in-RecipeBook-to-avoid-data-e.patch index 5db3f6d63c..eef571569e 100644 --- a/Spigot-Server-Patches/Ignore-Missing-Recipes-in-RecipeBook-to-avoid-data-e.patch +++ b/Spigot-Server-Patches/Ignore-Missing-Recipes-in-RecipeBook-to-avoid-data-e.patch @@ -6,29 +6,29 @@ Subject: [PATCH] Ignore Missing Recipes in RecipeBook to avoid data errors This code was causing NPE's in saving player data, potentially related to reloads. diff --git a/src/main/java/net/minecraft/server/RecipeBookServer.java b/src/main/java/net/minecraft/server/RecipeBookServer.java -index 5a21aed438..4d9f3d3695 100644 +index 440e8f134..091c4abbd 100644 --- a/src/main/java/net/minecraft/server/RecipeBookServer.java +++ b/src/main/java/net/minecraft/server/RecipeBookServer.java @@ -0,0 +0,0 @@ public class RecipeBookServer extends RecipeBook { + while (iterator.hasNext()) { MinecraftKey minecraftkey = (MinecraftKey) iterator.next(); - + // Paper start - ignore missing recipes -+ IRecipe recipe = this.h.a(minecraftkey); -+ if (recipe == null) continue; ++ final Optional> recipe = this.l.a(minecraftkey); ++ if (!recipe.isPresent()) continue; + // Paper end - nbttaglist.add((NBTBase) (new NBTTagString(minecraftkey.toString()))); - } + nbttaglist.add(new NBTTagString(minecraftkey.toString())); + } @@ -0,0 +0,0 @@ public class RecipeBookServer extends RecipeBook { + while (iterator1.hasNext()) { MinecraftKey minecraftkey1 = (MinecraftKey) iterator1.next(); - + // Paper start - ignore missing recipes -+ IRecipe recipe = this.h.a(minecraftkey1); -+ if (recipe == null) continue; ++ final Optional> recipe = this.l.a(minecraftkey1); ++ if (!recipe.isPresent()) continue; + // Paper end - nbttaglist1.add((NBTBase) (new NBTTagString(minecraftkey1.toString()))); - } + nbttaglist1.add(new NBTTagString(minecraftkey1.toString())); + } -- \ No newline at end of file diff --git a/Spigot-Server-Patches/Implement-EntityKnockbackByEntityEvent.patch b/Spigot-Server-Patches/Implement-EntityKnockbackByEntityEvent.patch index 983bd10aa5..6346e40271 100644 --- a/Spigot-Server-Patches/Implement-EntityKnockbackByEntityEvent.patch +++ b/Spigot-Server-Patches/Implement-EntityKnockbackByEntityEvent.patch @@ -6,36 +6,21 @@ Subject: [PATCH] Implement EntityKnockbackByEntityEvent This event is called when an entity receives knockback by another entity. diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java -index deb50b84f7..164e4b412a 100644 +index 8c6d53f44..d65933e9e 100644 --- a/src/main/java/net/minecraft/server/EntityLiving.java +++ b/src/main/java/net/minecraft/server/EntityLiving.java @@ -0,0 +0,0 @@ public abstract class EntityLiving extends Entity { - this.impulse = true; - float f1 = MathHelper.sqrt(d0 * d0 + d1 * d1); + Vec3D vec3d1 = (new Vec3D(d0, 0.0D, d1)).d().a((double) f); -+ // Paper start - preserve old velocity -+ double oldMotX = this.motX; -+ double oldMotY = this.motY; -+ double oldMotZ = this.motZ; -+ // Paper end + this.setMot(vec3d.x / 2.0D - vec3d1.x, this.onGround ? Math.min(0.4D, vec3d.y / 2.0D + (double) f) : vec3d.y, vec3d.z / 2.0D - vec3d1.z); + - this.motX /= 2.0D; - this.motZ /= 2.0D; - this.motX -= d0 / (double) f1 * (double) f; -@@ -0,0 +0,0 @@ public abstract class EntityLiving extends Entity { - } - } - + // Paper start - call EntityKnockbackByEntityEvent -+ org.bukkit.util.Vector delta = new org.bukkit.util.Vector(this.motX - oldMotX, this.motY - oldMotY, this.motZ - oldMotZ); ++ Vec3D currentMot = this.getMot(); ++ org.bukkit.util.Vector delta = new org.bukkit.util.Vector(currentMot.x - vec3d.x, currentMot.y - vec3d.y, currentMot.z - vec3d.z); + // Restore old velocity to be able to access it in the event -+ this.motX = oldMotX; -+ this.motY = oldMotY; -+ this.motZ = oldMotZ; ++ this.setMot(vec3d); + if (entity == null || new com.destroystokyo.paper.event.entity.EntityKnockbackByEntityEvent((LivingEntity) getBukkitEntity(), entity.getBukkitEntity(), f, delta).callEvent()) { -+ this.motX += delta.getX(); -+ this.motY += delta.getY(); -+ this.motZ += delta.getZ(); ++ this.setMot(vec3d.x + delta.getX(), vec3d.y + delta.getY(), vec3d.z + delta.getZ()); + } + // Paper end } diff --git a/Spigot-Server-Patches/Implement-World.getEntity-UUID-API.patch b/Spigot-Server-Patches/Implement-World.getEntity-UUID-API.patch index 0248b2cd30..db8091b3a5 100644 --- a/Spigot-Server-Patches/Implement-World.getEntity-UUID-API.patch +++ b/Spigot-Server-Patches/Implement-World.getEntity-UUID-API.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Implement World.getEntity(UUID) API diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -index cfa35740b4..609b911265 100644 +index c8cbedb5c..f8870f37b 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -0,0 +0,0 @@ public class CraftWorld implements World { @@ -21,6 +21,6 @@ index cfa35740b4..609b911265 100644 + // Paper end + public void save() { - // Spigot start - save(true); + this.server.checkSaveState(); + try { -- \ No newline at end of file diff --git a/Spigot-Server-Patches/InventoryCloseEvent-Reason-API.patch b/Spigot-Server-Patches/InventoryCloseEvent-Reason-API.patch index 0b238cdb25..530832d95c 100644 --- a/Spigot-Server-Patches/InventoryCloseEvent-Reason-API.patch +++ b/Spigot-Server-Patches/InventoryCloseEvent-Reason-API.patch @@ -6,34 +6,12 @@ Subject: [PATCH] InventoryCloseEvent Reason API Allows you to determine why an inventory was closed, enabling plugin developers to "confirm" things based on if it was player triggered close or not. -diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java -index a6cacd7da9..c2f12f92b0 100644 ---- a/src/main/java/net/minecraft/server/Chunk.java -+++ b/src/main/java/net/minecraft/server/Chunk.java -@@ -0,0 +0,0 @@ public class Chunk implements IChunkAccess { - { - if ( h instanceof org.bukkit.craftbukkit.entity.CraftHumanEntity ) - { -- ( (org.bukkit.craftbukkit.entity.CraftHumanEntity) h).getHandle().closeInventory(); -+ ( (org.bukkit.craftbukkit.entity.CraftHumanEntity) h).getHandle().closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason.UNLOADED); // Paper - } - } - } -@@ -0,0 +0,0 @@ public class Chunk implements IChunkAccess { - { - if ( h instanceof org.bukkit.craftbukkit.entity.CraftHumanEntity ) - { -- ( (org.bukkit.craftbukkit.entity.CraftHumanEntity) h).getHandle().closeInventory(); -+ ( (org.bukkit.craftbukkit.entity.CraftHumanEntity) h).getHandle().closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason.UNLOADED); // Paper - } - } - } diff --git a/src/main/java/net/minecraft/server/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java -index d4618d644a..cc1bc01b16 100644 +index 3031d73f5..f665dc0eb 100644 --- a/src/main/java/net/minecraft/server/EntityHuman.java +++ b/src/main/java/net/minecraft/server/EntityHuman.java @@ -0,0 +0,0 @@ public abstract class EntityHuman extends EntityLiving { - this.dg(); + this.dA(); super.tick(); if (!this.world.isClientSide && this.activeContainer != null && !this.activeContainer.canUse(this)) { - this.closeInventory(); @@ -42,7 +20,7 @@ index d4618d644a..cc1bc01b16 100644 } @@ -0,0 +0,0 @@ public abstract class EntityHuman extends EntityLiving { - return this.getHealth() <= 0.0F || this.isSleeping(); + return 20; } + // Paper start - unused code, but to keep signatures aligned @@ -56,7 +34,7 @@ index d4618d644a..cc1bc01b16 100644 this.activeContainer = this.defaultContainer; } diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java -index e4e1d999e9..dc72538de6 100644 +index 27ade8d7d..634c30d93 100644 --- a/src/main/java/net/minecraft/server/EntityPlayer.java +++ b/src/main/java/net/minecraft/server/EntityPlayer.java @@ -0,0 +0,0 @@ public class EntityPlayer extends EntityHuman implements ICrafting { @@ -69,23 +47,23 @@ index e4e1d999e9..dc72538de6 100644 } @@ -0,0 +0,0 @@ public class EntityPlayer extends EntityHuman implements ICrafting { - if (!event.getKeepInventory()) { - this.inventory.clear(); - } -- -+ this.closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason.DEATH); // Paper - this.setSpectatorTarget(this); // Remove spectated target - // CraftBukkit end + // SPIGOT-943 - only call if they have an inventory open + if (this.activeContainer != this.defaultContainer) { +- this.closeInventory(); ++ this.closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason.DEATH); // Paper + } + + String deathMessage = event.getDeathMessage(); @@ -0,0 +0,0 @@ public class EntityPlayer extends EntityHuman implements ICrafting { - this.a((new ChatMessage("container.spectatorCantOpen", new Object[0])).a(EnumChatFormat.RED), true); + return OptionalInt.empty(); } else { if (this.activeContainer != this.defaultContainer) { - this.closeInventory(); + this.closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason.OPEN_NEW); // Paper } - if (iinventory instanceof ITileInventory) { + this.nextContainerCounter(); @@ -0,0 +0,0 @@ public class EntityPlayer extends EntityHuman implements ICrafting { } // CraftBukkit end @@ -94,10 +72,10 @@ index e4e1d999e9..dc72538de6 100644 + this.closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason.OPEN_NEW); // Paper } - this.nextContainerCounter(); + // this.nextContainerCounter(); // CraftBukkit - moved up @@ -0,0 +0,0 @@ public class EntityPlayer extends EntityHuman implements ICrafting { - } + @Override public void closeInventory() { - CraftEventFactory.handleInventoryCloseEvent(this); // CraftBukkit + // Paper start @@ -110,10 +88,10 @@ index e4e1d999e9..dc72538de6 100644 this.m(); } diff --git a/src/main/java/net/minecraft/server/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java -index 6dea9456a4..0b5dc66897 100644 +index c9caf4423..fbdc755e8 100644 --- a/src/main/java/net/minecraft/server/PlayerConnection.java +++ b/src/main/java/net/minecraft/server/PlayerConnection.java -@@ -0,0 +0,0 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable { +@@ -0,0 +0,0 @@ public class PlayerConnection implements PacketListenerPlayIn { PlayerConnectionUtils.ensureMainThread(packetplayinclosewindow, this, this.player.getWorldServer()); if (this.player.isFrozen()) return; // CraftBukkit @@ -123,7 +101,7 @@ index 6dea9456a4..0b5dc66897 100644 this.player.m(); } diff --git a/src/main/java/net/minecraft/server/PlayerList.java b/src/main/java/net/minecraft/server/PlayerList.java -index 96eff10ffa..ddaa73e83d 100644 +index b855e7968..6d464a3dc 100644 --- a/src/main/java/net/minecraft/server/PlayerList.java +++ b/src/main/java/net/minecraft/server/PlayerList.java @@ -0,0 +0,0 @@ public abstract class PlayerList { @@ -135,8 +113,30 @@ index 96eff10ffa..ddaa73e83d 100644 PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(cserver.getPlayer(entityplayer), "\u00A7e" + entityplayer.getName() + " left the game"); cserver.getPluginManager().callEvent(playerQuitEvent); +diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java +index e400cc05d..79be8cfa3 100644 +--- a/src/main/java/net/minecraft/server/WorldServer.java ++++ b/src/main/java/net/minecraft/server/WorldServer.java +@@ -0,0 +0,0 @@ public class WorldServer extends World { + { + if ( h instanceof org.bukkit.craftbukkit.entity.CraftHumanEntity ) + { +- ( (org.bukkit.craftbukkit.entity.CraftHumanEntity) h).getHandle().closeInventory(); ++ ( (org.bukkit.craftbukkit.entity.CraftHumanEntity) h).getHandle().closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason.UNLOADED); // Paper + } + } + } +@@ -0,0 +0,0 @@ public class WorldServer extends World { + { + if ( h instanceof org.bukkit.craftbukkit.entity.CraftHumanEntity ) + { +- ( (org.bukkit.craftbukkit.entity.CraftHumanEntity) h).getHandle().closeInventory(); ++ ( (org.bukkit.craftbukkit.entity.CraftHumanEntity) h).getHandle().closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason.UNLOADED); // Paper + } + } + } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java -index 9b19dce9bd..cb7697f80b 100644 +index 6478d6126..356c503dd 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java @@ -0,0 +0,0 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { @@ -155,7 +155,7 @@ index 9b19dce9bd..cb7697f80b 100644 public boolean isBlocking() { return getHandle().isBlocking(); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 62235efde9..47426d8fda 100644 +index 01e260024..6ceb02200 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -0,0 +0,0 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @@ -168,7 +168,7 @@ index 62235efde9..47426d8fda 100644 // Check if the fromWorld and toWorld are the same. diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java -index acc80d0684..2cfe8afe13 100644 +index 4a16f2f53..de081ca1c 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -0,0 +0,0 @@ public class CraftEventFactory { diff --git a/Spigot-Server-Patches/LivingEntity-Hand-Raised-Item-Use-API.patch b/Spigot-Server-Patches/LivingEntity-Hand-Raised-Item-Use-API.patch index 3c025b40a0..b88d8cc1c3 100644 --- a/Spigot-Server-Patches/LivingEntity-Hand-Raised-Item-Use-API.patch +++ b/Spigot-Server-Patches/LivingEntity-Hand-Raised-Item-Use-API.patch @@ -6,33 +6,33 @@ Subject: [PATCH] LivingEntity Hand Raised/Item Use API How long an entity has raised hands to charge an attack or use an item diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java -index 164e4b412a..bc1ab273bd 100644 +index d65933e9e..58bfe8c1c 100644 --- a/src/main/java/net/minecraft/server/EntityLiving.java +++ b/src/main/java/net/minecraft/server/EntityLiving.java @@ -0,0 +0,0 @@ public abstract class EntityLiving extends Entity { - private float bI; - private int bJ; - private float bK; + private float bD; + private int jumpTicks; + private float bF; - protected ItemStack activeItem; + public ItemStack activeItem; // Paper - public - protected int bu; - protected int bv; - private BlockPosition bL; + protected int bo; + protected int bp; + private BlockPosition bG; @@ -0,0 +0,0 @@ public abstract class EntityLiving extends Entity { return this.activeItem; } -+ public int getItemUseRemainingTime() { return cX(); } // Paper - OBFHELPER - public int cX() { - return this.bu; ++ public int getItemUseRemainingTime() { return dm(); } // Paper - OBFHELPER + public int dm() { + return this.bo; } -+ public int getHandRaisedTime() { return cY(); } // Paper - OBFHELPER - public int cY() { - return this.isHandRaised() ? this.activeItem.k() - this.cX() : 0; ++ public int getHandRaisedTime() { return dn(); } // Paper - OBFHELPER + public int dn() { + return this.isHandRaised() ? this.activeItem.k() - this.dm() : 0; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java -index 8e65bfc78e..52834b6da3 100644 +index 182145ccf..29b23e30f 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java @@ -0,0 +0,0 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { diff --git a/Spigot-Server-Patches/Make-shield-blocking-delay-configurable.patch b/Spigot-Server-Patches/Make-shield-blocking-delay-configurable.patch index 73ee29a1eb..17cba8aecd 100644 --- a/Spigot-Server-Patches/Make-shield-blocking-delay-configurable.patch +++ b/Spigot-Server-Patches/Make-shield-blocking-delay-configurable.patch @@ -5,12 +5,12 @@ Subject: [PATCH] Make shield blocking delay configurable diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java -index 4727ac6eb5..47f8dfcc41 100644 +index fe9415b1d..ce17447fa 100644 --- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java +++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java @@ -0,0 +0,0 @@ public class PaperWorldConfig { - log("Villages can load chunks - Warning this can cause intense TPS loss. Strongly consider disabling this."); - } + disableEnderpearlExploit = getBoolean("game-mechanics.disable-unloaded-chunk-enderpearl-exploit", disableEnderpearlExploit); + log("Disable Unloaded Chunk Enderpearl Exploit: " + (disableEnderpearlExploit ? "enabled" : "disabled")); } + + public int shieldBlockingDelay = 5; @@ -19,23 +19,22 @@ index 4727ac6eb5..47f8dfcc41 100644 + } } diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java -index 02fcfc449c..deb50b84f7 100644 +index 9ef605ba3..8c6d53f44 100644 --- a/src/main/java/net/minecraft/server/EntityLiving.java +++ b/src/main/java/net/minecraft/server/EntityLiving.java @@ -0,0 +0,0 @@ public abstract class EntityLiving extends Entity { if (this.isHandRaised() && !this.activeItem.isEmpty()) { Item item = this.activeItem.getItem(); -- return item.d(this.activeItem) != EnumAnimation.BLOCK ? false : item.c(this.activeItem) - this.bu >= 5; -+ return item.d(this.activeItem) != EnumAnimation.BLOCK ? false : item.c(this.activeItem) - this.bu >= getShieldBlockingDelay(); // Paper - shieldBlockingDelay +- return item.e_(this.activeItem) != EnumAnimation.BLOCK ? false : item.f_(this.activeItem) - this.bo >= 5; ++ return item.e_(this.activeItem) != EnumAnimation.BLOCK ? false : item.f_(this.activeItem) - this.bo >= getShieldBlockingDelay(); // Paper - shieldBlockingDelay } else { return false; } @@ -0,0 +0,0 @@ public abstract class EntityLiving extends Entity { - public boolean df() { - return true; + public void d(EnumHand enumhand) { + this.c(enumhand == EnumHand.MAIN_HAND ? EnumItemSlot.MAINHAND : EnumItemSlot.OFFHAND); } -+ + // Paper start + public int shieldBlockingDelay = world.paperConfig.shieldBlockingDelay; + @@ -49,7 +48,7 @@ index 02fcfc449c..deb50b84f7 100644 + // Paper end } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java -index 2f96842bb9..8e65bfc78e 100644 +index f95347df0..182145ccf 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java @@ -0,0 +0,0 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { diff --git a/Spigot-Server-Patches/Optimize-RegistryID.c.patch b/Spigot-Server-Patches/Optimize-RegistryID.c.patch index 31b20c78c4..60f2a49c7a 100644 --- a/Spigot-Server-Patches/Optimize-RegistryID.c.patch +++ b/Spigot-Server-Patches/Optimize-RegistryID.c.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Optimize RegistryID.c() This is a frequent hotspot for world loading/saving. diff --git a/src/main/java/net/minecraft/server/RegistryID.java b/src/main/java/net/minecraft/server/RegistryID.java -index 5a5c464ea1..37641fa865 100644 +index e15d28671..e8a48b9a4 100644 --- a/src/main/java/net/minecraft/server/RegistryID.java +++ b/src/main/java/net/minecraft/server/RegistryID.java @@ -0,0 +0,0 @@ public class RegistryID implements Registry { diff --git a/Spigot-Server-Patches/Option-to-prevent-armor-stands-from-doing-entity-loo.patch b/Spigot-Server-Patches/Option-to-prevent-armor-stands-from-doing-entity-loo.patch index abe4eaf245..8a1e7db566 100644 --- a/Spigot-Server-Patches/Option-to-prevent-armor-stands-from-doing-entity-loo.patch +++ b/Spigot-Server-Patches/Option-to-prevent-armor-stands-from-doing-entity-loo.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Option to prevent armor stands from doing entity lookups diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java -index 8c4ff18868..6c4cb61dc5 100644 +index 83e54cb90..f06bb3ae1 100644 --- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java +++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java @@ -0,0 +0,0 @@ public class PaperWorldConfig { @@ -21,11 +21,11 @@ index 8c4ff18868..6c4cb61dc5 100644 private void maxEntityCollision() { maxCollisionsPerEntity = getInt( "max-entity-collisions", this.spigotConfig.getInt("max-entity-collisions", 8) ); diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java -index a5f4b9ad94..28fca165cd 100644 +index f9f0a94e9..79ded224c 100644 --- a/src/main/java/net/minecraft/server/World.java +++ b/src/main/java/net/minecraft/server/World.java -@@ -0,0 +0,0 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc - } +@@ -0,0 +0,0 @@ public abstract class World implements IIBlockAccess, GeneratorAccess, AutoClose + // Spigot end } + // Paper start - Prevent armor stands from doing entity lookups diff --git a/Spigot-Server-Patches/PlayerElytraBoostEvent.patch b/Spigot-Server-Patches/PlayerElytraBoostEvent.patch index 8d436df918..94e21ded1c 100644 --- a/Spigot-Server-Patches/PlayerElytraBoostEvent.patch +++ b/Spigot-Server-Patches/PlayerElytraBoostEvent.patch @@ -5,14 +5,15 @@ Subject: [PATCH] PlayerElytraBoostEvent diff --git a/src/main/java/net/minecraft/server/ItemFireworks.java b/src/main/java/net/minecraft/server/ItemFireworks.java -index dbb422e9da..13938775ba 100644 +index aea46ffae..9e86ef4ce 100644 --- a/src/main/java/net/minecraft/server/ItemFireworks.java +++ b/src/main/java/net/minecraft/server/ItemFireworks.java @@ -0,0 +0,0 @@ public class ItemFireworks extends Item { - EntityFireworks entityfireworks = new EntityFireworks(world, itemstack, entityhuman); - entityfireworks.spawningEntity = entityhuman.getUniqueID(); // Paper - + // Paper start + final EntityFireworks entityfireworks = new EntityFireworks(world, itemstack, entityhuman); + entityfireworks.spawningEntity = entityhuman.getUniqueID(); - world.addEntity(entityfireworks); +- // Paper end - if (!entityhuman.abilities.canInstantlyBuild) { - itemstack.subtract(1); + // Paper start @@ -23,8 +24,9 @@ index dbb422e9da..13938775ba 100644 + } else ((EntityPlayer) entityhuman).getBukkitEntity().updateInventory(); + } else if (entityhuman instanceof EntityPlayer) { + ((EntityPlayer) entityhuman).getBukkitEntity().updateInventory(); -+ // Paper end } ++ // Paper end } + return new InteractionResultWrapper<>(EnumInteractionResult.SUCCESS, entityhuman.b(enumhand)); -- \ No newline at end of file diff --git a/Spigot-Server-Patches/PlayerLaunchProjectileEvent.patch b/Spigot-Server-Patches/PlayerLaunchProjectileEvent.patch index 25923777f4..757e57917c 100644 --- a/Spigot-Server-Patches/PlayerLaunchProjectileEvent.patch +++ b/Spigot-Server-Patches/PlayerLaunchProjectileEvent.patch @@ -5,7 +5,7 @@ Subject: [PATCH] PlayerLaunchProjectileEvent diff --git a/src/main/java/net/minecraft/server/ItemEgg.java b/src/main/java/net/minecraft/server/ItemEgg.java -index 18e8825c48..5f3926d830 100644 +index 2bdb65bf8..f526af45f 100644 --- a/src/main/java/net/minecraft/server/ItemEgg.java +++ b/src/main/java/net/minecraft/server/ItemEgg.java @@ -0,0 +0,0 @@ public class ItemEgg extends Item { @@ -22,6 +22,7 @@ index 18e8825c48..5f3926d830 100644 if (!world.isClientSide) { EntityEgg entityegg = new EntityEgg(world, entityhuman); + entityegg.setItem(itemstack); entityegg.a(entityhuman, entityhuman.pitch, entityhuman.yaw, 0.0F, 1.5F, 1.0F); - world.addEntity(entityegg); + // Paper start @@ -45,12 +46,12 @@ index 18e8825c48..5f3926d830 100644 entityhuman.b(StatisticList.ITEM_USED.b(this)); diff --git a/src/main/java/net/minecraft/server/ItemEnderPearl.java b/src/main/java/net/minecraft/server/ItemEnderPearl.java -index 3672996c2d..719210da15 100644 +index eb5f62dec..e8e52d726 100644 --- a/src/main/java/net/minecraft/server/ItemEnderPearl.java +++ b/src/main/java/net/minecraft/server/ItemEnderPearl.java @@ -0,0 +0,0 @@ public class ItemEnderPearl extends Item { - EntityEnderPearl entityenderpearl = new EntityEnderPearl(world, entityhuman); + entityenderpearl.setItem(itemstack); entityenderpearl.a(entityhuman, entityhuman.pitch, entityhuman.yaw, 0.0F, 1.5F, 1.0F); - if (!world.addEntity(entityenderpearl)) { + // Paper start @@ -93,11 +94,11 @@ index 3672996c2d..719210da15 100644 entityhuman.b(StatisticList.ITEM_USED.b(this)); return new InteractionResultWrapper<>(EnumInteractionResult.SUCCESS, itemstack); diff --git a/src/main/java/net/minecraft/server/ItemExpBottle.java b/src/main/java/net/minecraft/server/ItemExpBottle.java -index d26b42f710..23b06169e2 100644 +index 35f842ede..eb626a6f0 100644 --- a/src/main/java/net/minecraft/server/ItemExpBottle.java +++ b/src/main/java/net/minecraft/server/ItemExpBottle.java @@ -0,0 +0,0 @@ public class ItemExpBottle extends Item { - + @Override public InteractionResultWrapper a(World world, EntityHuman entityhuman, EnumHand enumhand) { ItemStack itemstack = entityhuman.b(enumhand); - @@ -111,6 +112,7 @@ index d26b42f710..23b06169e2 100644 if (!world.isClientSide) { EntityThrownExpBottle entitythrownexpbottle = new EntityThrownExpBottle(world, entityhuman); + entitythrownexpbottle.setItem(itemstack); entitythrownexpbottle.a(entityhuman, entityhuman.pitch, entityhuman.yaw, -20.0F, 0.7F, 1.0F); - world.addEntity(entitythrownexpbottle); + // Paper start @@ -134,11 +136,11 @@ index d26b42f710..23b06169e2 100644 entityhuman.b(StatisticList.ITEM_USED.b(this)); diff --git a/src/main/java/net/minecraft/server/ItemLingeringPotion.java b/src/main/java/net/minecraft/server/ItemLingeringPotion.java -index a74c803e72..8d882b81bb 100644 +index e3683bdae..f3ad1cd6d 100644 --- a/src/main/java/net/minecraft/server/ItemLingeringPotion.java +++ b/src/main/java/net/minecraft/server/ItemLingeringPotion.java @@ -0,0 +0,0 @@ public class ItemLingeringPotion extends ItemPotion { - + @Override public InteractionResultWrapper a(World world, EntityHuman entityhuman, EnumHand enumhand) { ItemStack itemstack = entityhuman.b(enumhand); + /* // Paper start @@ -147,14 +149,16 @@ index a74c803e72..8d882b81bb 100644 world.a((EntityHuman) null, entityhuman.locX, entityhuman.locY, entityhuman.locZ, SoundEffects.ENTITY_LINGERING_POTION_THROW, SoundCategory.NEUTRAL, 0.5F, 0.4F / (ItemLingeringPotion.i.nextFloat() * 0.4F + 0.8F)); + */ // Paper end if (!world.isClientSide) { ++ + // Paper start - ensure stack count matches vanilla behavior without modifying original stack yet + ItemStack itemstack1 = itemstack.cloneItemStack(); + if (!entityhuman.abilities.canInstantlyBuild) { + itemstack1.setCount(1); + } + // Paper end - EntityPotion entitypotion = new EntityPotion(world, entityhuman, itemstack1); + EntityPotion entitypotion = new EntityPotion(world, entityhuman); + entitypotion.setItem(itemstack1); entitypotion.a(entityhuman, entityhuman.pitch, entityhuman.yaw, -20.0F, 0.5F, 1.0F); - world.addEntity(entitypotion); + // Paper start @@ -178,12 +182,12 @@ index a74c803e72..8d882b81bb 100644 entityhuman.b(StatisticList.ITEM_USED.b(this)); diff --git a/src/main/java/net/minecraft/server/ItemSnowball.java b/src/main/java/net/minecraft/server/ItemSnowball.java -index d8879e0847..95194ccdc8 100644 +index 624989dd7..c119785b7 100644 --- a/src/main/java/net/minecraft/server/ItemSnowball.java +++ b/src/main/java/net/minecraft/server/ItemSnowball.java @@ -0,0 +0,0 @@ public class ItemSnowball extends Item { - EntitySnowball entitysnowball = new EntitySnowball(world, entityhuman); + entitysnowball.setItem(itemstack); entitysnowball.a(entityhuman, entityhuman.pitch, entityhuman.yaw, 0.0F, 1.5F, 1.0F); - if (world.addEntity(entitysnowball)) { - if (!entityhuman.abilities.canInstantlyBuild) { @@ -211,11 +215,11 @@ index d8879e0847..95194ccdc8 100644 // CraftBukkit end diff --git a/src/main/java/net/minecraft/server/ItemSplashPotion.java b/src/main/java/net/minecraft/server/ItemSplashPotion.java -index 87e2825a84..2bddefb802 100644 +index e267e43fe..fa6d627db 100644 --- a/src/main/java/net/minecraft/server/ItemSplashPotion.java +++ b/src/main/java/net/minecraft/server/ItemSplashPotion.java @@ -0,0 +0,0 @@ public class ItemSplashPotion extends ItemPotion { - + @Override public InteractionResultWrapper a(World world, EntityHuman entityhuman, EnumHand enumhand) { ItemStack itemstack = entityhuman.b(enumhand); + /* // Paper start @@ -224,14 +228,15 @@ index 87e2825a84..2bddefb802 100644 world.a((EntityHuman) null, entityhuman.locX, entityhuman.locY, entityhuman.locZ, SoundEffects.ENTITY_SPLASH_POTION_THROW, SoundCategory.PLAYERS, 0.5F, 0.4F / (ItemSplashPotion.i.nextFloat() * 0.4F + 0.8F)); + */ // Paper end if (!world.isClientSide) { + EntityPotion entitypotion = new EntityPotion(world, entityhuman); + // Paper start - ensure stack count matches vanilla behavior without modifying original stack yet + ItemStack itemstack1 = itemstack.cloneItemStack(); + if (!entityhuman.abilities.canInstantlyBuild) { + itemstack1.setCount(1); + } + // Paper end - EntityPotion entitypotion = new EntityPotion(world, entityhuman, itemstack1); + entitypotion.setItem(itemstack1); entitypotion.a(entityhuman, entityhuman.pitch, entityhuman.yaw, -20.0F, 0.5F, 1.0F); - world.addEntity(entitypotion); + // Paper start diff --git a/Spigot-Server-Patches/PlayerReadyArrowEvent.patch b/Spigot-Server-Patches/PlayerReadyArrowEvent.patch index 4ffa87dde8..38a37ae644 100644 --- a/Spigot-Server-Patches/PlayerReadyArrowEvent.patch +++ b/Spigot-Server-Patches/PlayerReadyArrowEvent.patch @@ -6,73 +6,35 @@ Subject: [PATCH] PlayerReadyArrowEvent Called when a player is firing a bow and the server is choosing an arrow to use. Plugins can skip selection of certain arrows and control which is used. -diff --git a/src/main/java/net/minecraft/server/ItemBow.java b/src/main/java/net/minecraft/server/ItemBow.java -index 52bc68e6a6..f8dbc3c400 100644 ---- a/src/main/java/net/minecraft/server/ItemBow.java -+++ b/src/main/java/net/minecraft/server/ItemBow.java -@@ -0,0 +0,0 @@ - package net.minecraft.server; - -+import org.bukkit.craftbukkit.inventory.CraftItemStack; -+ - public class ItemBow extends Item { - - public ItemBow(Item.Info item_info) { -@@ -0,0 +0,0 @@ public class ItemBow extends Item { - // CraftBukkit end +diff --git a/src/main/java/net/minecraft/server/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java +index 27bf83f37..3031d73f5 100644 +--- a/src/main/java/net/minecraft/server/EntityHuman.java ++++ b/src/main/java/net/minecraft/server/EntityHuman.java +@@ -0,0 +0,0 @@ public abstract class EntityHuman extends EntityLiving { + return (EntitySize) EntityHuman.b.getOrDefault(entitypose, EntityHuman.bs); } -- private ItemStack a(EntityHuman entityhuman) { -- if (this.e_(entityhuman.b(EnumHand.OFF_HAND))) { -+ private ItemStack a(EntityHuman entityhuman, ItemStack bow) { // Paper -+ if (this.e_(entityhuman, bow, entityhuman.b(EnumHand.OFF_HAND))) { // Paper - return entityhuman.b(EnumHand.OFF_HAND); -- } else if (this.e_(entityhuman.b(EnumHand.MAIN_HAND))) { -+ } else if (this.e_(entityhuman, bow, entityhuman.b(EnumHand.MAIN_HAND))) { - return entityhuman.b(EnumHand.MAIN_HAND); - } else { - for (int i = 0; i < entityhuman.inventory.getSize(); ++i) { - ItemStack itemstack = entityhuman.inventory.getItem(i); - -- if (this.e_(itemstack)) { -+ if (this.e_(entityhuman, bow, itemstack)) { - return itemstack; - } - } -@@ -0,0 +0,0 @@ public class ItemBow extends Item { - } - } - -- protected boolean e_(ItemStack itemstack) { -- return itemstack.getItem() instanceof ItemArrow; + // Paper start -+ protected boolean e_(EntityHuman player, ItemStack bow, ItemStack itemstack) { -+ return itemstack.getItem() instanceof ItemArrow && ( -+ !(player instanceof EntityPlayer) || ++ protected boolean tryReadyArrow(ItemStack bow, ItemStack itemstack) { ++ return !(this instanceof EntityPlayer) || + new com.destroystokyo.paper.event.player.PlayerReadyArrowEvent( -+ ((EntityPlayer) player).getBukkitEntity(), -+ CraftItemStack.asCraftMirror(bow), -+ CraftItemStack.asCraftMirror(itemstack) -+ ).callEvent()); ++ ((EntityPlayer) this).getBukkitEntity(), ++ org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(bow), ++ org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemstack) ++ ).callEvent(); + // Paper end - } ++ } ++ + @Override + public ItemStack f(ItemStack itemstack) { + if (!(itemstack.getItem() instanceof ItemProjectileWeapon)) { +@@ -0,0 +0,0 @@ public abstract class EntityHuman extends EntityLiving { + for (int i = 0; i < this.inventory.getSize(); ++i) { + ItemStack itemstack2 = this.inventory.getItem(i); - public void a(ItemStack itemstack, World world, EntityLiving entityliving, int i) { - if (entityliving instanceof EntityHuman) { - EntityHuman entityhuman = (EntityHuman) entityliving; - boolean flag = entityhuman.abilities.canInstantlyBuild || EnchantmentManager.getEnchantmentLevel(Enchantments.ARROW_INFINITE, itemstack) > 0; -- ItemStack itemstack1 = this.a(entityhuman); -+ ItemStack itemstack1 = this.a(entityhuman, itemstack); // Paper - - if (!itemstack1.isEmpty() || flag) { - if (itemstack1.isEmpty()) { -@@ -0,0 +0,0 @@ public class ItemBow extends Item { - - public InteractionResultWrapper a(World world, EntityHuman entityhuman, EnumHand enumhand) { - ItemStack itemstack = entityhuman.b(enumhand); -- boolean flag = !this.a(entityhuman).isEmpty(); -+ boolean flag = !this.a(entityhuman, itemstack).isEmpty(); // Paper - - if (!entityhuman.abilities.canInstantlyBuild && !flag) { - return flag ? new InteractionResultWrapper<>(EnumInteractionResult.PASS, itemstack) : new InteractionResultWrapper<>(EnumInteractionResult.FAIL, itemstack); +- if (predicate.test(itemstack2)) { ++ if (predicate.test(itemstack2) && tryReadyArrow(itemstack, itemstack2)) { // Paper + return itemstack2; + } + } -- \ No newline at end of file diff --git a/Spigot-Server-Patches/Print-Error-details-when-failing-to-save-player-data.patch b/Spigot-Server-Patches/Print-Error-details-when-failing-to-save-player-data.patch index aaf3dcb7de..05eb5823d6 100644 --- a/Spigot-Server-Patches/Print-Error-details-when-failing-to-save-player-data.patch +++ b/Spigot-Server-Patches/Print-Error-details-when-failing-to-save-player-data.patch @@ -5,15 +5,15 @@ Subject: [PATCH] Print Error details when failing to save player data diff --git a/src/main/java/net/minecraft/server/WorldNBTStorage.java b/src/main/java/net/minecraft/server/WorldNBTStorage.java -index d5e21cc33c..577ba1b5f9 100644 +index e60e10c57..350ac42d6 100644 --- a/src/main/java/net/minecraft/server/WorldNBTStorage.java +++ b/src/main/java/net/minecraft/server/WorldNBTStorage.java -@@ -0,0 +0,0 @@ public class WorldNBTStorage implements IDataManager, IPlayerFileData { +@@ -0,0 +0,0 @@ public class WorldNBTStorage implements IPlayerFileData { file.renameTo(file1); } catch (Exception exception) { -- WorldNBTStorage.b.warn("Failed to save player data for {}", entityhuman.getDisplayName().getString()); -+ WorldNBTStorage.b.error("Failed to save player data for {}", entityhuman.getName(), exception); // Paper +- WorldNBTStorage.LOGGER.warn("Failed to save player data for {}", entityhuman.getDisplayName().getString()); ++ WorldNBTStorage.LOGGER.error("Failed to save player data for {}", entityhuman.getName(), exception); // Paper } } diff --git a/Spigot-Server-Patches/Properly-remove-entities-on-dimension-teleport.patch b/Spigot-Server-Patches/Properly-remove-entities-on-dimension-teleport.patch deleted file mode 100644 index 93fc823692..0000000000 --- a/Spigot-Server-Patches/Properly-remove-entities-on-dimension-teleport.patch +++ /dev/null @@ -1,49 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Sun, 10 Jun 2018 20:04:42 -0400 -Subject: [PATCH] Properly remove entities on dimension teleport - -To teleport an entity between dimensions, the server makes a copy -and puts the copy in the new location, and marks the old one dead. - -If this method got called for the same world in the same tick, -the entity would not have been removed from the UUID map, and the -world readd would fail. - -This can be triggered even with a plugin if the entity is teleported -twice in the same tick, from world A to B, then back from B to A. - -The re-add to A will fail to add the entity to the world. It will -actually be there, but it will not be visible on the client until -the server is restarted to re-try the add to world process again. - -This bug was unlikely to be seen by many due to the double teleport -requirement, but plugins (such as my own) use this method to -trigger a "reload" of the entity on the client. - -diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java -index 92a15ba947..debab1a715 100644 ---- a/src/main/java/net/minecraft/server/Entity.java -+++ b/src/main/java/net/minecraft/server/Entity.java -@@ -0,0 +0,0 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke - } - // CraftBukkit end */ - -- this.world.kill(this); -+ this.world.removeEntity(this); // Paper - Fully remove entity, can't have dupes in the UUID map - this.dead = false; - this.world.methodProfiler.enter("reposition"); - /* CraftBukkit start - Handled in calculateTarget -diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java -index e4730352d3..c08ee62e84 100644 ---- a/src/main/java/net/minecraft/server/WorldServer.java -+++ b/src/main/java/net/minecraft/server/WorldServer.java -@@ -0,0 +0,0 @@ public class WorldServer extends World implements IAsyncTaskHandler { - } - - protected void c(Entity entity) { -+ if (!this.entitiesByUUID.containsKey(entity.getUniqueID()) && !entity.valid) return; // Paper - Already removed, dont fire twice - this looks like it can happen even without our changes - super.c(entity); - this.entitiesById.d(entity.getId()); - this.entitiesByUUID.remove(entity.getUniqueID()); --- \ No newline at end of file diff --git a/Spigot-Server-Patches/RangedEntity-API.patch b/Spigot-Server-Patches/RangedEntity-API.patch index 96c5aafecf..8d45030964 100644 --- a/Spigot-Server-Patches/RangedEntity-API.patch +++ b/Spigot-Server-Patches/RangedEntity-API.patch @@ -8,7 +8,7 @@ and to perform an attack. diff --git a/src/main/java/com/destroystokyo/paper/entity/CraftRangedEntity.java b/src/main/java/com/destroystokyo/paper/entity/CraftRangedEntity.java new file mode 100644 -index 0000000000..696660b089 +index 000000000..696660b08 --- /dev/null +++ b/src/main/java/com/destroystokyo/paper/entity/CraftRangedEntity.java @@ -0,0 +0,0 @@ @@ -32,7 +32,7 @@ index 0000000000..696660b089 + } +} diff --git a/src/main/java/net/minecraft/server/IRangedEntity.java b/src/main/java/net/minecraft/server/IRangedEntity.java -index 4fd69850fd..b763bd11dd 100644 +index b4178ce1e..9b79ac77d 100644 --- a/src/main/java/net/minecraft/server/IRangedEntity.java +++ b/src/main/java/net/minecraft/server/IRangedEntity.java @@ -0,0 +0,0 @@ package net.minecraft.server; @@ -41,12 +41,12 @@ index 4fd69850fd..b763bd11dd 100644 - void a(EntityLiving entityliving, float f); + void a(EntityLiving entityliving, float f); default void rangedAttack(EntityLiving entityliving, float f) { a(entityliving, f); } // Paper - OBFHELPER - -- void s(boolean flag); -+ void s(boolean flag); default void setChargingAttack(boolean flag) { s(flag); } // Paper - OBFHELPER ++ ++ // - see EntitySkeletonAbstract melee goal ++ void q(boolean flag); default void setChargingAttack(boolean charging) { q(charging); }; // Paper } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftIllusioner.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftIllusioner.java -index 2ec1af8be4..f31d3eed3a 100644 +index 2ec1af8be..f31d3eed3 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftIllusioner.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftIllusioner.java @@ -0,0 +0,0 @@ @@ -64,7 +64,7 @@ index 2ec1af8be4..f31d3eed3a 100644 public CraftIllusioner(CraftServer server, EntityIllagerIllusioner entity) { super(server, entity); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLlama.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLlama.java -index 23ab78da15..3f94c5a920 100644 +index 23ab78da1..3f94c5a92 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLlama.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLlama.java @@ -0,0 +0,0 @@ @@ -84,7 +84,7 @@ index 23ab78da15..3f94c5a920 100644 public CraftLlama(CraftServer server, EntityLlama entity) { super(server, entity); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftSkeleton.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftSkeleton.java -index 4ed89615fd..4fa5e84ea4 100644 +index 9fef81cc2..1dc9b4412 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftSkeleton.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftSkeleton.java @@ -0,0 +0,0 @@ @@ -92,7 +92,6 @@ index 4ed89615fd..4fa5e84ea4 100644 +import com.destroystokyo.paper.entity.CraftRangedEntity; import net.minecraft.server.EntitySkeletonAbstract; - import org.bukkit.craftbukkit.CraftServer; import org.bukkit.entity.EntityType; import org.bukkit.entity.Skeleton; @@ -103,7 +102,7 @@ index 4ed89615fd..4fa5e84ea4 100644 public CraftSkeleton(CraftServer server, EntitySkeletonAbstract entity) { super(server, entity); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftSnowman.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftSnowman.java -index 0349f0a574..2e3d8fcdfa 100644 +index 0349f0a57..2e3d8fcdf 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftSnowman.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftSnowman.java @@ -0,0 +0,0 @@ @@ -121,25 +120,25 @@ index 0349f0a574..2e3d8fcdfa 100644 super(server, entity); } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftWitch.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftWitch.java -index c08833cb7a..f25998eb6d 100644 +index fb14179c3..49e0f2206 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftWitch.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftWitch.java @@ -0,0 +0,0 @@ package org.bukkit.craftbukkit.entity; -+import com.destroystokyo.paper.entity.CraftRangedEntity; ++import com.destroystokyo.paper.entity.CraftRangedEntity; // Paper import net.minecraft.server.EntityWitch; import org.bukkit.craftbukkit.CraftServer; - import org.bukkit.entity.Witch; import org.bukkit.entity.EntityType; + import org.bukkit.entity.Witch; --public class CraftWitch extends CraftMonster implements Witch { -+public class CraftWitch extends CraftMonster implements Witch, CraftRangedEntity { // Paper +-public class CraftWitch extends CraftRaider implements Witch { ++public class CraftWitch extends CraftRaider implements Witch, CraftRangedEntity { // Paper public CraftWitch(CraftServer server, EntityWitch entity) { super(server, entity); } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java -index 3df0fcb9b6..a1d04ff284 100644 +index 3df0fcb9b..a1d04ff28 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java @@ -0,0 +0,0 @@ diff --git a/Spigot-Server-Patches/Re-add-vanilla-entity-warnings-for-duplicates.patch b/Spigot-Server-Patches/Re-add-vanilla-entity-warnings-for-duplicates.patch index 25d4c7bab0..e8c766ad83 100644 --- a/Spigot-Server-Patches/Re-add-vanilla-entity-warnings-for-duplicates.patch +++ b/Spigot-Server-Patches/Re-add-vanilla-entity-warnings-for-duplicates.patch @@ -8,17 +8,17 @@ These are a critical sign that somethin went wrong, and you've lost some data... We should kind of know about these things you know. diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java -index c08ee62e84..85a30652c4 100644 +index af62ab182..0b4990a00 100644 --- a/src/main/java/net/minecraft/server/WorldServer.java +++ b/src/main/java/net/minecraft/server/WorldServer.java -@@ -0,0 +0,0 @@ public class WorldServer extends World implements IAsyncTaskHandler { - this.g.remove(entity1); - } else { - if (!(entity instanceof EntityHuman)) { -- // WorldServer.a.warn("Keeping entity {} that already exists with UUID {}", EntityTypes.getName(entity1.P()), uuid.toString()); // CraftBukkit -+ WorldServer.a.error("Keeping entity {} that already exists with UUID {} - " + entity1, EntityTypes.getName(entity1.P()), uuid.toString()); // CraftBukkit // Paper -+ WorldServer.a.error("Deleting duplicate entity {}", entity); // Paper - return false; - } - +@@ -0,0 +0,0 @@ public class WorldServer extends World { + if (entity1 == null) { + return false; + } else { +- // WorldServer.LOGGER.warn("Keeping entity {} that already exists with UUID {}", EntityTypes.getName(entity1.getEntityType()), entity.getUniqueID().toString()); // CraftBukkit ++ WorldServer.LOGGER.error("Keeping entity {} that already exists with UUID {}", EntityTypes.getName(entity1.getEntityType()), entity.getUniqueID().toString()); // CraftBukkit // paper ++ WorldServer.LOGGER.error("Deleting duplicate entity {}", entity); // CraftBukkit // paper + return true; + } + } -- \ No newline at end of file diff --git a/Spigot-Server-Patches/Refresh-player-inventory-when-cancelling-PlayerInter.patch b/Spigot-Server-Patches/Refresh-player-inventory-when-cancelling-PlayerInter.patch index b8d1a36d7b..d291ccca10 100644 --- a/Spigot-Server-Patches/Refresh-player-inventory-when-cancelling-PlayerInter.patch +++ b/Spigot-Server-Patches/Refresh-player-inventory-when-cancelling-PlayerInter.patch @@ -16,10 +16,10 @@ Refresh the player inventory when PlayerInteractEntityEvent is cancelled to avoid this problem. diff --git a/src/main/java/net/minecraft/server/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java -index 0b5dc66897..6d04c5733c 100644 +index fbdc755e8..a0f6addef 100644 --- a/src/main/java/net/minecraft/server/PlayerConnection.java +++ b/src/main/java/net/minecraft/server/PlayerConnection.java -@@ -0,0 +0,0 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable { +@@ -0,0 +0,0 @@ public class PlayerConnection implements PacketListenerPlayIn { } if (event.isCancelled()) { diff --git a/Spigot-Server-Patches/Speedup-BlockPos-by-fixing-inlining.patch b/Spigot-Server-Patches/Speedup-BlockPos-by-fixing-inlining.patch index 38d0dbf18b..869e2b77fd 100644 --- a/Spigot-Server-Patches/Speedup-BlockPos-by-fixing-inlining.patch +++ b/Spigot-Server-Patches/Speedup-BlockPos-by-fixing-inlining.patch @@ -21,7 +21,7 @@ This is based upon conclusions drawn from inspecting the assenmbly generated byt They had 'callq' (invoke) instead of 'mov' (get from memory) instructions. diff --git a/src/main/java/net/minecraft/server/BaseBlockPosition.java b/src/main/java/net/minecraft/server/BaseBlockPosition.java -index 4c7793f86d..cc17a414f5 100644 +index 7cb46d7a9..e96428bb2 100644 --- a/src/main/java/net/minecraft/server/BaseBlockPosition.java +++ b/src/main/java/net/minecraft/server/BaseBlockPosition.java @@ -0,0 +0,0 @@ import javax.annotation.concurrent.Immutable; @@ -79,40 +79,32 @@ index 4c7793f86d..cc17a414f5 100644 public BaseBlockPosition d(BaseBlockPosition baseblockposition) { return new BaseBlockPosition(this.getY() * baseblockposition.getZ() - this.getZ() * baseblockposition.getY(), this.getZ() * baseblockposition.getX() - this.getX() * baseblockposition.getZ(), this.getX() * baseblockposition.getY() - this.getY() * baseblockposition.getX()); + } + + public boolean a(BaseBlockPosition baseblockposition, double d0) { +- return this.distanceSquared((double) baseblockposition.a, (double) baseblockposition.b, (double) baseblockposition.c, false) < d0 * d0; ++ return this.distanceSquared((double) baseblockposition.x, (double) baseblockposition.y, (double) baseblockposition.z, false) < d0 * d0; // Paper + } + + public boolean a(IPosition iposition, double d0) { +@@ -0,0 +0,0 @@ public class BaseBlockPosition implements Comparable { + } + + public int n(BaseBlockPosition baseblockposition) { +- float f = (float) Math.abs(baseblockposition.getX() - this.a); +- float f1 = (float) Math.abs(baseblockposition.getY() - this.b); +- float f2 = (float) Math.abs(baseblockposition.getZ() - this.c); ++ float f = (float) Math.abs(baseblockposition.getX() - this.x); // Paper ++ float f1 = (float) Math.abs(baseblockposition.getY() - this.y); // Paper ++ float f2 = (float) Math.abs(baseblockposition.getZ() - this.z); // Paper + + return (int) (f + f1 + f2); + } diff --git a/src/main/java/net/minecraft/server/BlockPosition.java b/src/main/java/net/minecraft/server/BlockPosition.java -index 80e13dfb2e..20cf9255ba 100644 +index 64700b97c..a5e5a4eba 100644 --- a/src/main/java/net/minecraft/server/BlockPosition.java +++ b/src/main/java/net/minecraft/server/BlockPosition.java -@@ -0,0 +0,0 @@ public class BlockPosition extends BaseBlockPosition { - if (this.g == null) { - this.g = new BlockPosition.MutableBlockPosition(i, j, k); - return this.g; -- } else if (this.g.b == l && this.g.c == i1 && this.g.d == j1) { -+ } else if (this.g.x == l && this.g.y == i1 && this.g.z == j1) { - return (BlockPosition.MutableBlockPosition) this.endOfData(); - } else { -- if (this.g.b < l) { -- ++this.g.b; -- } else if (this.g.c < i1) { -- this.g.b = i; // Paper - decompile fix Readd line removed by the decompiler -- ++this.g.c; -- } else if (this.g.d < j1) { -- this.g.b = i; // Paper - decompile fix Readd line removed by the decompiler -- this.g.c = j; // Paper - decompile fix Readd line removed by the decompiler -- ++this.g.d; -+ if (this.g.x < l) { -+ ++this.g.x; -+ } else if (this.g.y < i1) { -+ this.g.x = i; // Paper - decompile fix Readd line removed by the decompiler -+ ++this.g.y; -+ } else if (this.g.z < j1) { -+ this.g.x = i; // Paper - decompile fix Readd line removed by the decompiler -+ this.g.y = j; // Paper - decompile fix Readd line removed by the decompiler -+ ++this.g.z; - } - - return this.g; -@@ -0,0 +0,0 @@ public class BlockPosition extends BaseBlockPosition { +@@ -0,0 +0,0 @@ public class BlockPosition extends BaseBlockPosition implements MinecraftSeriali } public static class MutableBlockPosition extends BlockPosition { @@ -127,7 +119,7 @@ index 80e13dfb2e..20cf9255ba 100644 @Override public boolean isValidLocation() { return b >= -30000000 && d >= -30000000 && b < 30000000 && d < 30000000 && c >= 0 && c < 256; -@@ -0,0 +0,0 @@ public class BlockPosition extends BaseBlockPosition { +@@ -0,0 +0,0 @@ public class BlockPosition extends BaseBlockPosition implements MinecraftSeriali public boolean isInvalidYLocation() { return c < 0 || c >= 256; } @@ -135,7 +127,7 @@ index 80e13dfb2e..20cf9255ba 100644 // Paper end public MutableBlockPosition() { -@@ -0,0 +0,0 @@ public class BlockPosition extends BaseBlockPosition { +@@ -0,0 +0,0 @@ public class BlockPosition extends BaseBlockPosition implements MinecraftSeriali } public MutableBlockPosition(int i, int j, int k) { @@ -150,26 +142,27 @@ index 80e13dfb2e..20cf9255ba 100644 + // Paper end } - public BlockPosition a(double d0, double d1, double d2) { -@@ -0,0 +0,0 @@ public class BlockPosition extends BaseBlockPosition { - return super.a(enumblockrotation).h(); + public MutableBlockPosition(double d0, double d1, double d2) { +@@ -0,0 +0,0 @@ public class BlockPosition extends BaseBlockPosition implements MinecraftSeriali + return super.a(enumblockrotation).immutableCopy(); } ++ + /* + // Paper start - use parent getters + @Override public int getX() { return this.b; - } -@@ -0,0 +0,0 @@ public class BlockPosition extends BaseBlockPosition { - +@@ -0,0 +0,0 @@ public class BlockPosition extends BaseBlockPosition implements MinecraftSeriali + @Override public int getZ() { return this.d; - } + }*/ + // Paper end - public BlockPosition.MutableBlockPosition setValues(int i, int j, int k) { return c(i, j, k);} // Paper - OBFHELPER - public BlockPosition.MutableBlockPosition c(int i, int j, int k) { + public BlockPosition.MutableBlockPosition setValues(int i, int j, int k) { return d(i, j, k);} // Paper - OBFHELPER + public BlockPosition.MutableBlockPosition d(int i, int j, int k) { - this.b = i; - this.c = j; - this.d = k; @@ -181,17 +174,17 @@ index 80e13dfb2e..20cf9255ba 100644 return this; } -@@ -0,0 +0,0 @@ public class BlockPosition extends BaseBlockPosition { +@@ -0,0 +0,0 @@ public class BlockPosition extends BaseBlockPosition implements MinecraftSeriali } public BlockPosition.MutableBlockPosition c(EnumDirection enumdirection, int i) { -- return this.c(this.b + enumdirection.getAdjacentX() * i, this.c + enumdirection.getAdjacentY() * i, this.d + enumdirection.getAdjacentZ() * i); -+ return this.c(x + enumdirection.getAdjacentX() * i, y + enumdirection.getAdjacentY() * i, z + enumdirection.getAdjacentZ() * i); // Paper - use xyz +- return this.d(this.b + enumdirection.getAdjacentX() * i, this.c + enumdirection.getAdjacentY() * i, this.d + enumdirection.getAdjacentZ() * i); ++ return this.d(this.x + enumdirection.getAdjacentX() * i, this.y + enumdirection.getAdjacentY() * i, this.z + enumdirection.getAdjacentZ() * i); } - public BlockPosition.MutableBlockPosition d(int i, int j, int k) { -- return this.c(this.b + i, this.c + j, this.d + k); -+ return this.c(x + i, y + j, z + k); // Paper - use xyz + public BlockPosition.MutableBlockPosition e(int i, int j, int k) { +- return this.d(this.b + i, this.c + j, this.d + k); ++ return this.d(this.x + i, this.y + j, this.z + k); } public void p(int i) { @@ -199,5 +192,5 @@ index 80e13dfb2e..20cf9255ba 100644 + this.y = i; // Paper change to y } - public BlockPosition toBlockPosition() { return h(); } // Paper - OBFHELPER + @Override -- \ No newline at end of file diff --git a/Spigot-Server-Patches/Use-asynchronous-Log4j-2-loggers.patch b/Spigot-Server-Patches/Use-asynchronous-Log4j-2-loggers.patch index 016f624151..5fab3c986d 100644 --- a/Spigot-Server-Patches/Use-asynchronous-Log4j-2-loggers.patch +++ b/Spigot-Server-Patches/Use-asynchronous-Log4j-2-loggers.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Use asynchronous Log4j 2 loggers diff --git a/pom.xml b/pom.xml -index 3ad5af3463..9cbd4880f7 100644 +index 16799b4cd..8c18a0c09 100644 --- a/pom.xml +++ b/pom.xml @@ -0,0 +0,0 @@ @@ -24,7 +24,7 @@ index 3ad5af3463..9cbd4880f7 100644 asm diff --git a/src/main/resources/log4j2.component.properties b/src/main/resources/log4j2.component.properties new file mode 100644 -index 0000000000..ee7c90784c +index 000000000..ee7c90784 --- /dev/null +++ b/src/main/resources/log4j2.component.properties @@ -0,0 +1 @@ diff --git a/Spigot-Server-Patches/Vex-getSummoner-API.patch b/Spigot-Server-Patches/Vex-getSummoner-API.patch index 5842383023..2fb1e290aa 100644 --- a/Spigot-Server-Patches/Vex-getSummoner-API.patch +++ b/Spigot-Server-Patches/Vex-getSummoner-API.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Vex#getSummoner API Get's the NPC that summoned this Vex diff --git a/src/main/java/net/minecraft/server/EntityVex.java b/src/main/java/net/minecraft/server/EntityVex.java -index 388d341262..c3864b869e 100644 +index ecfc057a1..83e022c91 100644 --- a/src/main/java/net/minecraft/server/EntityVex.java +++ b/src/main/java/net/minecraft/server/EntityVex.java @@ -0,0 +0,0 @@ public class EntityVex extends EntityMonster { @@ -15,10 +15,10 @@ index 388d341262..c3864b869e 100644 + public EntityInsentient getOwner() { return l(); } // Paper - OBFHELPER public EntityInsentient l() { - return this.b; + return this.c; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftVex.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftVex.java -index 0f01fc591d..c96a5df80a 100644 +index 737a37b6f..169c951ec 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftVex.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftVex.java @@ -0,0 +0,0 @@ diff --git a/Spigot-Server-Patches/add-more-information-to-Entity.toString.patch b/Spigot-Server-Patches/add-more-information-to-Entity.toString.patch index 65e7c18936..b7be1c0358 100644 --- a/Spigot-Server-Patches/add-more-information-to-Entity.toString.patch +++ b/Spigot-Server-Patches/add-more-information-to-Entity.toString.patch @@ -6,7 +6,7 @@ Subject: [PATCH] add more information to Entity.toString() UUID, ticks lived, valid, dead diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java -index debab1a715..69a058d830 100644 +index c28b498a2..c7d19d957 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java @@ -0,0 +0,0 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke