diff --git a/Spigot-Server-Patches/0267-Vanished-players-don-t-have-rights.patch b/Spigot-Server-Patches/0267-Vanished-players-don-t-have-rights.patch new file mode 100644 index 0000000000..46a8b15330 --- /dev/null +++ b/Spigot-Server-Patches/0267-Vanished-players-don-t-have-rights.patch @@ -0,0 +1,122 @@ +From e67d57bd1c9073fe848eda9eb7a7e459a838c108 Mon Sep 17 00:00:00 2001 +From: Hugo Manrique +Date: Mon, 23 Jul 2018 14:22:26 +0200 +Subject: [PATCH] Vanished players don't have rights + + +diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java +index 8dd589aae..57a4481c5 100644 +--- a/src/main/java/net/minecraft/server/Entity.java ++++ b/src/main/java/net/minecraft/server/Entity.java +@@ -94,7 +94,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke + private static double e = 1.0D; + private final EntityTypes f; + private int id; +- public boolean i; ++ public boolean i; public final boolean blocksEntitySpawning() { return this.i; } // Paper - OBFHELPER + public final List passengers; + protected int j; + private Entity vehicle; +diff --git a/src/main/java/net/minecraft/server/IEntityAccess.java b/src/main/java/net/minecraft/server/IEntityAccess.java +index bf7e0d17e..c5d5876c2 100644 +--- a/src/main/java/net/minecraft/server/IEntityAccess.java ++++ b/src/main/java/net/minecraft/server/IEntityAccess.java +@@ -22,9 +22,18 @@ public interface IEntityAccess { + return this.getEntities(entity, axisalignedbb, IEntitySelector.f); + } + ++ // Paper start + default boolean a(@Nullable Entity entity, VoxelShape voxelshape) { ++ return this.checkEntityCollision(entity, voxelshape, false); ++ } ++ default boolean checkEntityCollision(Entity entity, VoxelShape voxelshape, boolean checkCanSee) { + return voxelshape.isEmpty() ? true : this.getEntities(entity, voxelshape.getBoundingBox()).stream().filter((entity1) -> { ++ if (entity instanceof EntityPlayer && entity1 instanceof EntityPlayer ++ && !((EntityPlayer)entity).getBukkitEntity().canSee(((EntityPlayer)entity1).getBukkitEntity())) { ++ return false; ++ } + return !entity1.dead && entity1.i && (entity == null || !entity1.x(entity)); ++ // Paper end + }).noneMatch((entity1) -> { + return VoxelShapes.c(voxelshape, VoxelShapes.a(entity1.getBoundingBox()), OperatorBoolean.AND); + }); +@@ -147,7 +156,7 @@ public interface IEntityAccess { + + @Nullable + default T a(Class oclass, PathfinderTargetCondition pathfindertargetcondition, @Nullable EntityLiving entityliving, double d0, double d1, double d2, AxisAlignedBB axisalignedbb) { +- return this.a(this.a(oclass, axisalignedbb, (Predicate) null), pathfindertargetcondition, entityliving, d0, d1, d2); ++ return this.a(this.a(oclass, axisalignedbb, (Predicate) null), pathfindertargetcondition, entityliving, d0, d1, d2); // Paper - decompile fix + } + + @Nullable +@@ -157,7 +166,7 @@ public interface IEntityAccess { + Iterator iterator = list.iterator(); + + while (iterator.hasNext()) { +- T t1 = (EntityLiving) iterator.next(); ++ T t1 = (T) iterator.next(); // Paper - decompile fix + + if (pathfindertargetcondition.a(entityliving, t1)) { + double d4 = t1.e(d0, d1, d2); +@@ -193,7 +202,7 @@ public interface IEntityAccess { + Iterator iterator = list.iterator(); + + while (iterator.hasNext()) { +- T t0 = (EntityLiving) iterator.next(); ++ T t0 = (T) iterator.next(); // Paper - decompile fix + + if (pathfindertargetcondition.a(entityliving, t0)) { + list1.add(t0); +diff --git a/src/main/java/net/minecraft/server/IWorldReader.java b/src/main/java/net/minecraft/server/IWorldReader.java +index 0930552b1..c0aa21703 100644 +--- a/src/main/java/net/minecraft/server/IWorldReader.java ++++ b/src/main/java/net/minecraft/server/IWorldReader.java +@@ -95,7 +95,12 @@ public interface IWorldReader extends IIBlockAccess { + return ChunkStatus.EMPTY; + } + ++ // Paper start + default boolean a(IBlockData iblockdata, BlockPosition blockposition, VoxelShapeCollision voxelshapecollision) { ++ return this.checkEntityCollision(iblockdata, blockposition, voxelshapecollision, false); ++ } ++ default boolean checkEntityCollision(IBlockData iblockdata, BlockPosition blockposition, VoxelShapeCollision voxelshapecollision, boolean checkCanSee) { ++ // Paper end + VoxelShape voxelshape = iblockdata.b((IBlockAccess) this, blockposition, voxelshapecollision); + + return voxelshape.isEmpty() || this.a((Entity) null, voxelshape.a((double) blockposition.getX(), (double) blockposition.getY(), (double) blockposition.getZ())); +diff --git a/src/main/java/net/minecraft/server/ItemBlock.java b/src/main/java/net/minecraft/server/ItemBlock.java +index 59b1e6ce2..b90cc6652 100644 +--- a/src/main/java/net/minecraft/server/ItemBlock.java ++++ b/src/main/java/net/minecraft/server/ItemBlock.java +@@ -126,7 +126,8 @@ public class ItemBlock extends Item { + EntityHuman entityhuman = blockactioncontext.getEntity(); + VoxelShapeCollision voxelshapecollision = entityhuman == null ? VoxelShapeCollision.a() : VoxelShapeCollision.a((Entity) entityhuman); + // CraftBukkit start - store default return +- boolean defaultReturn = (!this.d() || iblockdata.canPlace(blockactioncontext.getWorld(), blockactioncontext.getClickPosition())) && blockactioncontext.getWorld().a(iblockdata, blockactioncontext.getClickPosition(), voxelshapecollision); ++ final World world = blockactioncontext.getWorld(); // Paper ++ boolean defaultReturn = (!this.d() || iblockdata.canPlace(world, blockactioncontext.getClickPosition())) && world.checkEntityCollision(iblockdata, blockactioncontext.getClickPosition(), voxelshapecollision, true); // Paper + org.bukkit.entity.Player player = (blockactioncontext.getEntity() instanceof EntityPlayer) ? (org.bukkit.entity.Player) blockactioncontext.getEntity().getBukkitEntity() : null; + + BlockCanBuildEvent event = new BlockCanBuildEvent(CraftBlock.at(blockactioncontext.getWorld(), blockactioncontext.getClickPosition()), player, CraftBlockData.fromData(iblockdata), defaultReturn); +diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +index de081ca1c..c09f7e7c4 100644 +--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java ++++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +@@ -1106,6 +1106,14 @@ public class CraftEventFactory { + Projectile projectile = (Projectile) entity.getBukkitEntity(); + org.bukkit.entity.Entity collided = position.getEntity().getBukkitEntity(); + com.destroystokyo.paper.event.entity.ProjectileCollideEvent event = new com.destroystokyo.paper.event.entity.ProjectileCollideEvent(projectile, collided); ++ ++ if (projectile.getShooter() instanceof Player && collided instanceof Player) { ++ if (!((Player) projectile.getShooter()).canSee((Player) collided)) { ++ event.setCancelled(true); ++ return event; ++ } ++ } ++ + Bukkit.getPluginManager().callEvent(event); + return event; + } +-- +2.21.0 + diff --git a/Spigot-Server-Patches/0268-Mark-chunk-dirty-anytime-entities-change-to-guarante.patch b/Spigot-Server-Patches/0268-Mark-chunk-dirty-anytime-entities-change-to-guarante.patch new file mode 100644 index 0000000000..b765b4f6f6 --- /dev/null +++ b/Spigot-Server-Patches/0268-Mark-chunk-dirty-anytime-entities-change-to-guarante.patch @@ -0,0 +1,30 @@ +From d52c89665ad3ede7d515a1867fac19060394faf0 Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Mon, 23 Jul 2018 22:18:31 -0400 +Subject: [PATCH] Mark chunk dirty anytime entities change to guarantee it + saves + + +diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java +index 54bb7f551..8b6a52d72 100644 +--- a/src/main/java/net/minecraft/server/Chunk.java ++++ b/src/main/java/net/minecraft/server/Chunk.java +@@ -433,6 +433,7 @@ public class Chunk implements IChunkAccess { + entity.chunkY = k; + entity.chunkZ = this.loc.z; + this.entitySlices[k].add(entity); ++ this.markDirty(); // Paper + } + + @Override +@@ -459,6 +460,7 @@ public class Chunk implements IChunkAccess { + return; + } + entityCounts.decrement(entity.getMinecraftKeyString()); ++ this.markDirty(); // Paper + // Paper end + } + +-- +2.21.0 + diff --git a/Spigot-Server-Patches/0300-Add-some-Debug-to-Chunk-Entity-slices.patch b/Spigot-Server-Patches/0269-Add-some-Debug-to-Chunk-Entity-slices.patch similarity index 83% rename from Spigot-Server-Patches/0300-Add-some-Debug-to-Chunk-Entity-slices.patch rename to Spigot-Server-Patches/0269-Add-some-Debug-to-Chunk-Entity-slices.patch index 6b10943e4f..1cabc18cd9 100644 --- a/Spigot-Server-Patches/0300-Add-some-Debug-to-Chunk-Entity-slices.patch +++ b/Spigot-Server-Patches/0269-Add-some-Debug-to-Chunk-Entity-slices.patch @@ -1,4 +1,4 @@ -From 9c6ef08691df7e3183ab14d8e9c709df4e71559a Mon Sep 17 00:00:00 2001 +From 87f3b1ce9adadf99167c2b90c044ad1132b62f7b Mon Sep 17 00:00:00 2001 From: Aikar Date: Mon, 23 Jul 2018 22:44:23 -0400 Subject: [PATCH] Add some Debug to Chunk Entity slices @@ -9,10 +9,10 @@ This should hopefully avoid duplicate entities ever being created if the entity was to end up in 2 different chunk slices diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java -index 5d187e5d7d..01abe5e376 100644 +index 8b6a52d72..0c8a2ac90 100644 --- a/src/main/java/net/minecraft/server/Chunk.java +++ b/src/main/java/net/minecraft/server/Chunk.java -@@ -709,6 +709,25 @@ public class Chunk implements IChunkAccess { +@@ -425,6 +425,25 @@ public class Chunk implements IChunkAccess { if (k >= this.entitySlices.length) { k = this.entitySlices.length - 1; } @@ -38,15 +38,15 @@ index 5d187e5d7d..01abe5e376 100644 if (!entity.inChunk || entity.getCurrentChunk() != this) entityCounts.increment(entity.getMinecraftKeyString()); // Paper entity.inChunk = true; -@@ -718,6 +737,7 @@ public class Chunk implements IChunkAccess { - entity.chunkZ = this.locZ; +@@ -433,6 +452,7 @@ public class Chunk implements IChunkAccess { + entity.chunkY = k; + entity.chunkZ = this.loc.z; this.entitySlices[k].add(entity); - // Paper start + entity.entitySlice = this.entitySlices[k]; // Paper - this.markDirty(); - if (entity instanceof EntityItem) { - itemCounts[k]++; -@@ -746,6 +766,9 @@ public class Chunk implements IChunkAccess { + this.markDirty(); // Paper + } + +@@ -456,6 +476,9 @@ public class Chunk implements IChunkAccess { } // Paper start if (entity.currentChunk != null && entity.currentChunk.get() == this) entity.setCurrentChunk(null); @@ -57,10 +57,10 @@ index 5d187e5d7d..01abe5e376 100644 return; } diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java -index 539273afbc..ead5af991c 100644 +index 57a4481c5..4648a93b0 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java -@@ -62,6 +62,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -64,6 +64,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke } } }; diff --git a/Spigot-Server-Patches/0302-EntityTransformedEvent.patch b/Spigot-Server-Patches/0270-EntityTransformedEvent.patch similarity index 56% rename from Spigot-Server-Patches/0302-EntityTransformedEvent.patch rename to Spigot-Server-Patches/0270-EntityTransformedEvent.patch index 057e7d2f6b..932d5faa79 100644 --- a/Spigot-Server-Patches/0302-EntityTransformedEvent.patch +++ b/Spigot-Server-Patches/0270-EntityTransformedEvent.patch @@ -1,38 +1,38 @@ -From 130c36491fe4a915582f5d62ef093f089f639e5c Mon Sep 17 00:00:00 2001 +From 30a85186e41137da0b21abd0ec1bf5fd954cbb87 Mon Sep 17 00:00:00 2001 From: Anthony MacAllister Date: Thu, 26 Jul 2018 15:30:03 -0400 Subject: [PATCH] EntityTransformedEvent diff --git a/src/main/java/net/minecraft/server/EntityMushroomCow.java b/src/main/java/net/minecraft/server/EntityMushroomCow.java -index 141c17bf80..dde9f1e61e 100644 +index 55048af34..ed990ddef 100644 --- a/src/main/java/net/minecraft/server/EntityMushroomCow.java +++ b/src/main/java/net/minecraft/server/EntityMushroomCow.java -@@ -53,6 +53,7 @@ public class EntityMushroomCow extends EntityCow { - if (CraftEventFactory.callEntityTransformEvent(this, entitycow, EntityTransformEvent.TransformReason.SHEARED).isCancelled()) { - return false; - } -+ if (!new com.destroystokyo.paper.event.entity.EntityTransformedEvent(this.getBukkitEntity(), entitycow.getBukkitEntity(), com.destroystokyo.paper.event.entity.EntityTransformedEvent.TransformedReason.SHEARED).callEvent()) return false; // Paper - this.world.addEntity(entitycow, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SHEARED); +@@ -101,6 +101,7 @@ public class EntityMushroomCow extends EntityCow { + if (CraftEventFactory.callEntityTransformEvent(this, entitycow, EntityTransformEvent.TransformReason.SHEARED).isCancelled()) { + return false; + } ++ if (!new com.destroystokyo.paper.event.entity.EntityTransformedEvent(this.getBukkitEntity(), entitycow.getBukkitEntity(), com.destroystokyo.paper.event.entity.EntityTransformedEvent.TransformedReason.SHEARED).callEvent()) return false; // Paper + this.world.addEntity(entitycow, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SHEARED); - this.die(); // CraftBukkit - from above + this.die(); // CraftBukkit - from above diff --git a/src/main/java/net/minecraft/server/EntityVillager.java b/src/main/java/net/minecraft/server/EntityVillager.java -index 78acac4ca7..f01e776fe5 100644 +index bc04086d7..d489a5a8c 100644 --- a/src/main/java/net/minecraft/server/EntityVillager.java +++ b/src/main/java/net/minecraft/server/EntityVillager.java -@@ -624,6 +624,7 @@ public class EntityVillager extends EntityAgeable implements NPC, IMerchant { - if (CraftEventFactory.callEntityTransformEvent(this, entitywitch, EntityTransformEvent.TransformReason.LIGHTNING).isCancelled()) { - return; - } -+ if (!new com.destroystokyo.paper.event.entity.EntityTransformedEvent(this.getBukkitEntity(), entitywitch.getBukkitEntity(), com.destroystokyo.paper.event.entity.EntityTransformedEvent.TransformedReason.LIGHTNING).callEvent()) return; // Paper - this.world.addEntity(entitywitch, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.LIGHTNING); - // CraftBukkit end - this.die(); +@@ -591,6 +591,7 @@ public class EntityVillager extends EntityVillagerAbstract implements Reputation + if (CraftEventFactory.callEntityTransformEvent(this, entitywitch, EntityTransformEvent.TransformReason.LIGHTNING).isCancelled()) { + return; + } ++ if (!new com.destroystokyo.paper.event.entity.EntityTransformedEvent(this.getBukkitEntity(), entitywitch.getBukkitEntity(), com.destroystokyo.paper.event.entity.EntityTransformedEvent.TransformedReason.LIGHTNING).callEvent()) return; // Paper + this.world.addEntity(entitywitch, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.LIGHTNING); + // CraftBukkit end + this.die(); diff --git a/src/main/java/net/minecraft/server/EntityZombie.java b/src/main/java/net/minecraft/server/EntityZombie.java -index 7a943a6c27..7998b80c17 100644 +index d9d993860..92d1cd851 100644 --- a/src/main/java/net/minecraft/server/EntityZombie.java +++ b/src/main/java/net/minecraft/server/EntityZombie.java -@@ -239,6 +239,7 @@ public class EntityZombie extends EntityMonster { +@@ -247,6 +247,7 @@ public class EntityZombie extends EntityMonster { return; } // CraftBukkit end @@ -40,25 +40,25 @@ index 7a943a6c27..7998b80c17 100644 this.world.addEntity(entityzombie, CreatureSpawnEvent.SpawnReason.DROWNED); // CraftBukkit - added spawn reason this.die(); } -@@ -401,6 +402,7 @@ public class EntityZombie extends EntityMonster { +@@ -418,6 +419,7 @@ public class EntityZombie extends EntityMonster { if (CraftEventFactory.callEntityTransformEvent(this, entityzombievillager, EntityTransformEvent.TransformReason.INFECTION).isCancelled()) { return; } + if (!new com.destroystokyo.paper.event.entity.EntityTransformedEvent(this.getBukkitEntity(), entityvillager.getBukkitEntity(), com.destroystokyo.paper.event.entity.EntityTransformedEvent.TransformedReason.INFECTED).callEvent()) return; // Paper - this.world.kill(entityvillager); // CraftBukkit - from above + entityvillager.die(); // CraftBukkit - from above this.world.addEntity(entityzombievillager, CreatureSpawnEvent.SpawnReason.INFECTION); // CraftBukkit - add SpawnReason // CraftBukkit end diff --git a/src/main/java/net/minecraft/server/EntityZombieVillager.java b/src/main/java/net/minecraft/server/EntityZombieVillager.java -index 670e38eb8e..359ac8b88c 100644 +index 042afd269..d7205a57e 100644 --- a/src/main/java/net/minecraft/server/EntityZombieVillager.java +++ b/src/main/java/net/minecraft/server/EntityZombieVillager.java -@@ -140,6 +140,7 @@ public class EntityZombieVillager extends EntityZombie { +@@ -159,6 +159,7 @@ public class EntityZombieVillager extends EntityZombie implements VillagerDataHo if (CraftEventFactory.callEntityTransformEvent(this, entityvillager, EntityTransformEvent.TransformReason.CURED).isCancelled()) { return; } + if (!new com.destroystokyo.paper.event.entity.EntityTransformedEvent(this.getBukkitEntity(), entityvillager.getBukkitEntity(), com.destroystokyo.paper.event.entity.EntityTransformedEvent.TransformedReason.CURED).callEvent()) return; // Paper - this.world.kill(this); // CraftBukkit - from above - this.world.addEntity(entityvillager, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CURED); // CraftBukkit - add SpawnReason + this.die(); // CraftBukkit - from above + worldserver.addEntity(entityvillager, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CURED); // CraftBukkit - add SpawnReason // CraftBukkit end -- 2.21.0 diff --git a/Spigot-Server-Patches/0303-SkeletonHorse-Additions.patch b/Spigot-Server-Patches/0271-SkeletonHorse-Additions.patch similarity index 66% rename from Spigot-Server-Patches/0303-SkeletonHorse-Additions.patch rename to Spigot-Server-Patches/0271-SkeletonHorse-Additions.patch index fa883a8f25..893d65452b 100644 --- a/Spigot-Server-Patches/0303-SkeletonHorse-Additions.patch +++ b/Spigot-Server-Patches/0271-SkeletonHorse-Additions.patch @@ -1,52 +1,52 @@ -From a7467abe0696ee5861f5778e965678098b7189b2 Mon Sep 17 00:00:00 2001 +From f9adb3309cff56aa1b9a667cb3af9139a3ee520d Mon Sep 17 00:00:00 2001 From: BillyGalbreath Date: Fri, 27 Jul 2018 22:36:31 -0500 Subject: [PATCH] SkeletonHorse Additions diff --git a/src/main/java/net/minecraft/server/EntityHorseSkeleton.java b/src/main/java/net/minecraft/server/EntityHorseSkeleton.java -index 06f37f28af..eae2b26655 100644 +index 9ac34dfa8..b96726456 100644 --- a/src/main/java/net/minecraft/server/EntityHorseSkeleton.java +++ b/src/main/java/net/minecraft/server/EntityHorseSkeleton.java @@ -6,7 +6,7 @@ public class EntityHorseSkeleton extends EntityHorseAbstract { - private final PathfinderGoalHorseTrap bM = new PathfinderGoalHorseTrap(this); - private boolean bN; -- private int bO; -+ private int bO; public int getTrapTime() { return this.bO; } // Paper - OBFHELPER + private final PathfinderGoalHorseTrap bJ = new PathfinderGoalHorseTrap(this); + private boolean bK; +- private int bL; ++ private int bL; public int getTrapTime() { return this.bL; } // Paper - OBFHELPER - public EntityHorseSkeleton(World world) { - super(EntityTypes.SKELETON_HORSE, world); -@@ -114,10 +114,12 @@ public class EntityHorseSkeleton extends EntityHorseAbstract { + public EntityHorseSkeleton(EntityTypes entitytypes, World world) { + super(entitytypes, world); +@@ -124,10 +124,12 @@ public class EntityHorseSkeleton extends EntityHorseAbstract { return 0.96F; } -+ public boolean isTrap() { return this.dy(); } // Paper - OBFHELPER - public boolean dy() { - return this.bN; ++ public boolean isTrap() { return this.dV(); } // Paper - OBFHELPER + public boolean dV() { + return this.bK; } -+ public void setTrap(boolean trap) { this.s(trap); } // Paper - OBFHELPER - public void s(boolean flag) { - if (flag != this.bN) { - this.bN = flag; ++ public void setTrap(boolean trap) { this.r(trap); } // Paper - OBFHELPER + public void r(boolean flag) { + if (flag != this.bK) { + this.bK = flag; diff --git a/src/main/java/net/minecraft/server/PathfinderGoalHorseTrap.java b/src/main/java/net/minecraft/server/PathfinderGoalHorseTrap.java -index a6979fe859..d4fdcbdfd6 100644 +index 7b0a6f82f..f09374413 100644 --- a/src/main/java/net/minecraft/server/PathfinderGoalHorseTrap.java +++ b/src/main/java/net/minecraft/server/PathfinderGoalHorseTrap.java -@@ -13,6 +13,7 @@ public class PathfinderGoalHorseTrap extends PathfinderGoal { - } +@@ -15,6 +15,7 @@ public class PathfinderGoalHorseTrap extends PathfinderGoal { + @Override public void e() { + if (!new com.destroystokyo.paper.event.entity.SkeletonHorseTrapEvent((org.bukkit.entity.SkeletonHorse) this.a.getBukkitEntity()).callEvent()) return; // Paper DifficultyDamageScaler difficultydamagescaler = this.a.world.getDamageScaler(new BlockPosition(this.a)); - this.a.s(false); + this.a.r(false); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftSkeletonHorse.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftSkeletonHorse.java -index e822c2200d..496d0c0cac 100644 +index e822c2200..2a7d1d4ec 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftSkeletonHorse.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftSkeletonHorse.java -@@ -26,4 +26,23 @@ public class CraftSkeletonHorse extends CraftAbstractHorse implements SkeletonHo +@@ -26,4 +26,26 @@ public class CraftSkeletonHorse extends CraftAbstractHorse implements SkeletonHo public Variant getVariant() { return Variant.SKELETON_HORSE; } @@ -57,14 +57,17 @@ index e822c2200d..496d0c0cac 100644 + return (EntityHorseSkeleton) super.getHandle(); + } + ++ @Override + public int getTrapTime() { + return getHandle().getTrapTime(); + } + ++ @Override + public boolean isTrap() { + return getHandle().isTrap(); + } + ++ @Override + public void setTrap(boolean trap) { + getHandle().setTrap(trap); + } diff --git a/Spigot-Server-Patches/0272-Prevent-Saving-Bad-entities-to-chunks.patch b/Spigot-Server-Patches/0272-Prevent-Saving-Bad-entities-to-chunks.patch new file mode 100644 index 0000000000..ec9834c69b --- /dev/null +++ b/Spigot-Server-Patches/0272-Prevent-Saving-Bad-entities-to-chunks.patch @@ -0,0 +1,65 @@ +From de82f12fa592c1bfcfb3a948dfedf4f2dc54130e Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Thu, 26 Jul 2018 00:11:12 -0400 +Subject: [PATCH] Prevent Saving Bad entities to chunks + +See https://github.com/PaperMC/Paper/issues/1223 + +Minecraft is saving invalid entities to the chunk files. + +Avoid saving bad data, and also make improvements to handle +loading these chunks. Any invalid entity will be instant killed, +so lets avoid adding it to the world... + +This lets us be safer about the dupe UUID resolver too, as now +we can ignore instant killed entities and avoid risk of duplicating +an invalid entity. + +This should reduce log occurrences of dupe uuid messages. + +diff --git a/src/main/java/net/minecraft/server/ChunkRegionLoader.java b/src/main/java/net/minecraft/server/ChunkRegionLoader.java +index 0fed039f3..2e9686b43 100644 +--- a/src/main/java/net/minecraft/server/ChunkRegionLoader.java ++++ b/src/main/java/net/minecraft/server/ChunkRegionLoader.java +@@ -304,6 +304,7 @@ public class ChunkRegionLoader { + NBTTagCompound nbttagcompound4; + Iterator iterator1; + ++ java.util.List toUpdate = new java.util.ArrayList<>(); // Paper + if (ichunkaccess.getChunkStatus().getType() == ChunkStatus.Type.LEVELCHUNK) { + Chunk chunk = (Chunk) ichunkaccess; + +@@ -314,6 +315,16 @@ public class ChunkRegionLoader { + + while (iterator2.hasNext()) { + Entity entity = (Entity) iterator2.next(); ++ // Paper start ++ if ((int)Math.floor(entity.locX) >> 4 != chunk.getPos().x || (int)Math.floor(entity.locZ) >> 4 != chunk.getPos().z) { ++ LogManager.getLogger().warn(entity + " is not in this chunk, skipping save. This a bug fix to a vanilla bug. Do not report this to PaperMC please."); ++ toUpdate.add(entity); ++ continue; ++ } ++ if (entity.dead) { ++ continue; ++ } ++ // Paper end + + nbttagcompound4 = new NBTTagCompound(); + if (entity.d(nbttagcompound4)) { +@@ -322,6 +333,13 @@ public class ChunkRegionLoader { + } + } + } ++ ++ // Paper start - move entities to the correct chunk ++ for (Entity entity : toUpdate) { ++ ((WorldServer)world).entityJoinedWorld(entity); ++ } ++ // Paper end ++ + } else { + ProtoChunk protochunk = (ProtoChunk) ichunkaccess; + +-- +2.21.0 + diff --git a/Spigot-Server-Patches/0305-Don-t-call-getItemMeta-on-hasItemMeta.patch b/Spigot-Server-Patches/0273-Don-t-call-getItemMeta-on-hasItemMeta.patch similarity index 90% rename from Spigot-Server-Patches/0305-Don-t-call-getItemMeta-on-hasItemMeta.patch rename to Spigot-Server-Patches/0273-Don-t-call-getItemMeta-on-hasItemMeta.patch index f6fc02e648..a91ee25096 100644 --- a/Spigot-Server-Patches/0305-Don-t-call-getItemMeta-on-hasItemMeta.patch +++ b/Spigot-Server-Patches/0273-Don-t-call-getItemMeta-on-hasItemMeta.patch @@ -1,4 +1,4 @@ -From 1357a61602da080e892436071b2f5171f3dc59ea Mon Sep 17 00:00:00 2001 +From f68a1e9331b68514649bda1dcddc06c8bd4017bc Mon Sep 17 00:00:00 2001 From: Hugo Manrique Date: Thu, 26 Jul 2018 14:10:23 +0200 Subject: [PATCH] Don't call getItemMeta on hasItemMeta @@ -11,10 +11,10 @@ Returns true if getDamage() == 0 or has damage tag or other tag is set. Check the `ItemMetaTest#testTaggedButNotMeta` method to see how this method behaves. diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java -index bc8fb28163..ca9399bdbe 100644 +index 1a7849767..2f872b640 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java -@@ -525,7 +525,7 @@ public final class CraftItemStack extends ItemStack { +@@ -534,7 +534,7 @@ public final class CraftItemStack extends ItemStack { @Override public boolean hasItemMeta() { @@ -24,18 +24,18 @@ index bc8fb28163..ca9399bdbe 100644 static boolean hasItemMeta(net.minecraft.server.ItemStack item) { diff --git a/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java b/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java -index d4f4508cce..3a2793f322 100644 +index 93c4e1239..2c9481042 100644 --- a/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java +++ b/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java -@@ -5,6 +5,7 @@ import static org.hamcrest.Matchers.*; - +@@ -4,6 +4,7 @@ import static org.hamcrest.Matchers.*; + import static org.junit.Assert.*; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; // Paper import java.util.List; import java.util.UUID; - -@@ -183,7 +184,47 @@ public class ItemMetaTest extends AbstractTestingBase { + import com.destroystokyo.paper.inventory.meta.ArmorStandMeta; // Paper +@@ -179,7 +180,47 @@ public class ItemMetaTest extends AbstractTestingBase { assertThat("noTag and enchanted stacks should not be similar", noTag.isSimilar(enchanted), is(false)); assertThat("noTag and enchanted stacks should not be equal", noTag.equals(enchanted), is(false)); diff --git a/Spigot-Server-Patches/0298-Vanished-players-don-t-have-rights.patch b/Spigot-Server-Patches/0298-Vanished-players-don-t-have-rights.patch deleted file mode 100644 index ba8f5fce15..0000000000 --- a/Spigot-Server-Patches/0298-Vanished-players-don-t-have-rights.patch +++ /dev/null @@ -1,97 +0,0 @@ -From 8230851068dc6fdb84a1ea3aa2f993f196bfc02c Mon Sep 17 00:00:00 2001 -From: Hugo Manrique -Date: Mon, 23 Jul 2018 14:22:26 +0200 -Subject: [PATCH] Vanished players don't have rights - - -diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java -index 6598b87eef..539273afbc 100644 ---- a/src/main/java/net/minecraft/server/Entity.java -+++ b/src/main/java/net/minecraft/server/Entity.java -@@ -92,7 +92,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke - private static int entityCount; - private final EntityTypes g; public EntityTypes getEntityType() { return g; } // Paper - OBFHELPER - private int id; -- public boolean j; -+ public boolean j; public boolean blocksEntitySpawning() { return j; } // Paper - OBFHELPER - public final List passengers; - protected int k; - private Entity vehicle; -diff --git a/src/main/java/net/minecraft/server/ItemBlock.java b/src/main/java/net/minecraft/server/ItemBlock.java -index f27d565e1e..49ad201c6e 100644 ---- a/src/main/java/net/minecraft/server/ItemBlock.java -+++ b/src/main/java/net/minecraft/server/ItemBlock.java -@@ -70,7 +70,8 @@ public class ItemBlock extends Item { - - protected boolean b(BlockActionContext blockactioncontext, IBlockData iblockdata) { - // CraftBukkit start - store default return -- boolean defaultReturn = iblockdata.canPlace(blockactioncontext.getWorld(), blockactioncontext.getClickPosition()) && blockactioncontext.getWorld().a(iblockdata, blockactioncontext.getClickPosition()); -+ final World world = blockactioncontext.getWorld(); // Paper -+ boolean defaultReturn = iblockdata.canPlace(world, blockactioncontext.getClickPosition()) && world.a(iblockdata, blockactioncontext.getClickPosition()) && world.checkNoVisiblePlayerCollisions(blockactioncontext.getEntity(), iblockdata.getCollisionShape(world, blockactioncontext.getClickPosition())); // Paper - Use our entity search - org.bukkit.entity.Player player = (blockactioncontext.getEntity() instanceof EntityPlayer) ? (org.bukkit.entity.Player) blockactioncontext.getEntity().getBukkitEntity() : null; - - BlockCanBuildEvent event = new BlockCanBuildEvent(CraftBlock.at(blockactioncontext.getWorld(), blockactioncontext.getClickPosition()), player, CraftBlockData.fromData(iblockdata), defaultReturn); -diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java -index 28fca165cd..1929e9d2ae 100644 ---- a/src/main/java/net/minecraft/server/World.java -+++ b/src/main/java/net/minecraft/server/World.java -@@ -1521,6 +1521,37 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc - } - } - -+ // Paper start - Based on method below -+ /** -+ * @param entity causing the action ex. block placer -+ * @param voxelshape area to search within -+ * @return if there are no visible players colliding -+ */ -+ public boolean checkNoVisiblePlayerCollisions(@Nullable Entity entity, VoxelShape voxelshape) { -+ if (voxelshape.isEmpty()) { -+ return true; -+ } else { -+ List list = this.getEntities((Entity) null, voxelshape.getBoundingBox()); -+ -+ for (int i = 0; i < list.size(); ++i) { -+ Entity entity1 = (Entity) list.get(i); -+ -+ if (entity instanceof EntityPlayer && entity1 instanceof EntityPlayer) { -+ if (!((EntityPlayer) entity).getBukkitEntity().canSee(((EntityPlayer) entity1).getBukkitEntity())) { -+ continue; -+ } -+ } -+ -+ if (!entity1.dead && entity1.blocksEntitySpawning()) { -+ return false; -+ } -+ } -+ -+ return true; -+ } -+ } -+ // Paper end -+ - public boolean a(@Nullable Entity entity, VoxelShape voxelshape) { - if (voxelshape.isEmpty()) { - return true; -diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java -index 2cfe8afe13..0a3a121cbc 100644 ---- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java -+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java -@@ -1000,6 +1000,14 @@ public class CraftEventFactory { - Projectile projectile = (Projectile) entity.getBukkitEntity(); - org.bukkit.entity.Entity collided = position.entity.getBukkitEntity(); - com.destroystokyo.paper.event.entity.ProjectileCollideEvent event = new com.destroystokyo.paper.event.entity.ProjectileCollideEvent(projectile, collided); -+ -+ if (projectile.getShooter() instanceof Player && collided instanceof Player) { -+ if (!((Player) projectile.getShooter()).canSee((Player) collided)) { -+ event.setCancelled(true); -+ return event; -+ } -+ } -+ - Bukkit.getPluginManager().callEvent(event); - return event; - } --- -2.21.0 - diff --git a/Spigot-Server-Patches/0299-Mark-chunk-dirty-anytime-entities-change-to-guarante.patch b/Spigot-Server-Patches/0299-Mark-chunk-dirty-anytime-entities-change-to-guarante.patch deleted file mode 100644 index e7d6526a37..0000000000 --- a/Spigot-Server-Patches/0299-Mark-chunk-dirty-anytime-entities-change-to-guarante.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 1219243ef0beb650d17ea1073f32e1100a3102ed Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Mon, 23 Jul 2018 22:18:31 -0400 -Subject: [PATCH] Mark chunk dirty anytime entities change to guarantee it - saves - - -diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java -index e8c06e01b4..5d187e5d7d 100644 ---- a/src/main/java/net/minecraft/server/Chunk.java -+++ b/src/main/java/net/minecraft/server/Chunk.java -@@ -718,6 +718,7 @@ public class Chunk implements IChunkAccess { - entity.chunkZ = this.locZ; - this.entitySlices[k].add(entity); - // Paper start -+ this.markDirty(); - if (entity instanceof EntityItem) { - itemCounts[k]++; - } else if (entity instanceof IInventory) { -@@ -748,6 +749,7 @@ public class Chunk implements IChunkAccess { - if (!this.entitySlices[i].remove(entity)) { - return; - } -+ this.markDirty(); - if (entity instanceof EntityItem) { - itemCounts[i]--; - } else if (entity instanceof IInventory) { --- -2.21.0 - diff --git a/Spigot-Server-Patches/0301-Optimize-Region-File-Cache.patch b/Spigot-Server-Patches/0301-Optimize-Region-File-Cache.patch deleted file mode 100644 index dd53bf2010..0000000000 --- a/Spigot-Server-Patches/0301-Optimize-Region-File-Cache.patch +++ /dev/null @@ -1,67 +0,0 @@ -From ea164536bfa0dfb4d6857ee576817bbc270be45f Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Mon, 23 Jul 2018 23:40:04 -0400 -Subject: [PATCH] Optimize Region File Cache - -CraftBukkit added synchronization to read and write methods. This adds -much more contention on this object for accessing region files, as -the entire read and write of NBT data is now a blocking operation. - -This causes issues when something then simply needs to check if a chunk exists -on the main thread, causing a block... - -However, this synchronization was unnecessary, because there is already -enough synchronization done to keep things safe - -1) Obtaining a Region File: Those methods are still static synchronized. - Meaning we can safely obtain a Region File concurrently. - -2) RegionFile data access: Methods reading and manipulating data from - a region file are also marked synchronized, ensuring that no 2 processes - are reading or writing data at the same time. - -3) Checking a region file for chunkExists: getOffset is also synchronized - ensuring that even if a chunk is currently being written, it will be safe. - -By removing these synchronizations, we reduce the locking to only -when data is being write or read. - -GZIP compression and NBT Buffer creation will no longer be part of the -synchronized context, reducing lock times. - -Ultimately: This brings us back to Vanilla, which has had no indication of region file loss. - -diff --git a/src/main/java/net/minecraft/server/RegionFileCache.java b/src/main/java/net/minecraft/server/RegionFileCache.java -index 964996976a..d072222390 100644 ---- a/src/main/java/net/minecraft/server/RegionFileCache.java -+++ b/src/main/java/net/minecraft/server/RegionFileCache.java -@@ -99,7 +99,7 @@ public class RegionFileCache { - - @Nullable - // CraftBukkit start - call sites hoisted for synchronization -- public static synchronized NBTTagCompound read(File file, int i, int j) throws IOException { -+ public static NBTTagCompound read(File file, int i, int j) throws IOException { // Paper - remove synchronization - RegionFile regionfile = a(file, i, j); - - DataInputStream datainputstream = regionfile.a(i & 31, j & 31); -@@ -112,7 +112,7 @@ public class RegionFileCache { - } - - @Nullable -- public static synchronized void write(File file, int i, int j, NBTTagCompound nbttagcompound) throws IOException { -+ public static void write(File file, int i, int j, NBTTagCompound nbttagcompound) throws IOException { - int attempts = 0; Exception laste = null; while (attempts++ < 5) { try { // Paper - RegionFile regionfile = a(file, i, j); - -@@ -138,7 +138,7 @@ public class RegionFileCache { - // Paper end - } - -- public static synchronized boolean chunkExists(File file, int i, int j) { -+ public static boolean chunkExists(File file, int i, int j) { // Paper - remove synchronization - RegionFile regionfile = b(file, i, j); - - return regionfile != null ? regionfile.d(i & 31, j & 31) : false; --- -2.21.0 - diff --git a/Spigot-Server-Patches/0304-Prevent-Saving-Bad-entities-to-chunks.patch b/Spigot-Server-Patches/0304-Prevent-Saving-Bad-entities-to-chunks.patch deleted file mode 100644 index 4ae9540c74..0000000000 --- a/Spigot-Server-Patches/0304-Prevent-Saving-Bad-entities-to-chunks.patch +++ /dev/null @@ -1,61 +0,0 @@ -From b2792f793f14531836806df7b1c402bb9137a930 Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Thu, 26 Jul 2018 00:11:12 -0400 -Subject: [PATCH] Prevent Saving Bad entities to chunks - -See https://github.com/PaperMC/Paper/issues/1223 - -Minecraft is saving invalid entities to the chunk files. - -Avoid saving bad data, and also make improvements to handle -loading these chunks. Any invalid entity will be instant killed, -so lets avoid adding it to the world... - -This lets us be safer about the dupe UUID resolver too, as now -we can ignore instant killed entities and avoid risk of duplicating -an invalid entity. - -This should reduce log occurrences of dupe uuid messages. - -diff --git a/src/main/java/net/minecraft/server/ChunkRegionLoader.java b/src/main/java/net/minecraft/server/ChunkRegionLoader.java -index 2c4a4fc6b7..485bce9872 100644 ---- a/src/main/java/net/minecraft/server/ChunkRegionLoader.java -+++ b/src/main/java/net/minecraft/server/ChunkRegionLoader.java -@@ -567,11 +567,22 @@ public class ChunkRegionLoader implements IChunkLoader, IAsyncChunkSaver { - - Iterator iterator; - -+ java.util.List toUpdate = new java.util.ArrayList<>(); // Paper - for (int j = 0; j < chunk.getEntitySlices().length; ++j) { - iterator = chunk.getEntitySlices()[j].iterator(); - - while (iterator.hasNext()) { - Entity entity = (Entity) iterator.next(); -+ // Paper start -+ if ((int)Math.floor(entity.locX) >> 4 != chunk.locX || (int)Math.floor(entity.locZ) >> 4 != chunk.locZ) { -+ LogManager.getLogger().warn(entity + " is not in this chunk, skipping save. This a bug fix to a vanilla bug. Do not report this to PaperMC please."); -+ toUpdate.add(entity); -+ continue; -+ } -+ if (entity.dead) { -+ continue; -+ } -+ // Paper end - NBTTagCompound nbttagcompound1 = new NBTTagCompound(); - - if (entity.d(nbttagcompound1)) { -@@ -580,6 +591,11 @@ public class ChunkRegionLoader implements IChunkLoader, IAsyncChunkSaver { - } - } - } -+ // Paper start - move entities to the correct chunk -+ for (Entity entity : toUpdate) { -+ world.entityJoinedWorld(entity, false); -+ } -+ // Paper end - - nbttagcompound.set("Entities", nbttaglist1); - NBTTagList nbttaglist2 = new NBTTagList(); --- -2.21.0 - diff --git a/Spigot-Server-Patches/0306-Always-process-chunk-removal-in-removeEntity.patch b/Spigot-Server-Patches/0306-Always-process-chunk-removal-in-removeEntity.patch deleted file mode 100644 index dc13c6bbc9..0000000000 --- a/Spigot-Server-Patches/0306-Always-process-chunk-removal-in-removeEntity.patch +++ /dev/null @@ -1,32 +0,0 @@ -From f88a68c596f190756119dec505888c50d543fc1b Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Sat, 28 Jul 2018 12:09:20 -0400 -Subject: [PATCH] Always process chunk removal in removeEntity - -Spigot might skip chunk registration changes in removeEntity -which can keep them in the chunk when they shouldnt be if done -during entity ticking. - -diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java -index 1929e9d2ae..1cbe6e17b7 100644 ---- a/src/main/java/net/minecraft/server/World.java -+++ b/src/main/java/net/minecraft/server/World.java -@@ -1107,13 +1107,14 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc - this.everyoneSleeping(); - } - -- if (!guardEntityList) { // Spigot - It will get removed after the tick if we are ticking -+ // if (!guardEntityList) { // Spigot - It will get removed after the tick if we are ticking // Paper - move down - int i = entity.chunkX; - int j = entity.chunkZ; - - Chunk chunk = entity.getCurrentChunk(); // Paper - if (chunk != null) chunk.removeEntity(entity); // Paper - -+ if (!guardEntityList) { // Spigot - It will get removed after the tick if we are ticking // Paper - always remove from current chunk above - // CraftBukkit start - Decrement loop variable field if we've already ticked this entity - int index = this.entityList.indexOf(entity); - if (index != -1) { --- -2.21.0 -