diff --git a/Spigot-Server-Patches/0264-Fix-CraftEntity-hashCode.patch b/Spigot-Server-Patches/0235-Fix-CraftEntity-hashCode.patch similarity index 91% rename from Spigot-Server-Patches/0264-Fix-CraftEntity-hashCode.patch rename to Spigot-Server-Patches/0235-Fix-CraftEntity-hashCode.patch index 410a97e990..2a4c554eca 100644 --- a/Spigot-Server-Patches/0264-Fix-CraftEntity-hashCode.patch +++ b/Spigot-Server-Patches/0235-Fix-CraftEntity-hashCode.patch @@ -1,4 +1,4 @@ -From d83d55251a2b2bf4b9408f88226935e421c430f8 Mon Sep 17 00:00:00 2001 +From f528a12b1b3b67cfd3718621f96e1db6c24590c9 Mon Sep 17 00:00:00 2001 From: Aikar Date: Sun, 10 Jun 2018 20:20:15 -0400 Subject: [PATCH] Fix CraftEntity hashCode @@ -21,10 +21,10 @@ 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 -@@ -558,14 +558,15 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { +@@ -686,14 +686,15 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { return false; } final CraftEntity other = (CraftEntity) obj; diff --git a/Spigot-Server-Patches/0236-Configurable-Alternative-LootPool-Luck-Formula.patch b/Spigot-Server-Patches/0236-Configurable-Alternative-LootPool-Luck-Formula.patch new file mode 100644 index 0000000000..7b61905d62 --- /dev/null +++ b/Spigot-Server-Patches/0236-Configurable-Alternative-LootPool-Luck-Formula.patch @@ -0,0 +1,135 @@ +From a3244fa27146516e44847fe9cbba51338ae4348e Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Fri, 15 Jun 2018 00:30:32 -0400 +Subject: [PATCH] Configurable Alternative LootPool Luck Formula + +Rewrites the Vanilla luck application formula so that luck can be +applied to items that do not have any quality defined. + +See: https://luckformula.emc.gs for data and details +----------- + +The rough summary is: +My goal was that in a pool, when luck was applied, the pool +rebalances so the percentages for bigger items is +lowered and smaller items is boosted. + +Do this by boosting and then reducing the weight value, +so that larger numbers are penalized more than smaller numbers. +resulting in a larger reduction of entries for more common +items than the reduction on small weights, +giving smaller weights more of a chance + +----------- + +This work kind of obsoletes quality, but quality would be useful +for 2 items with same weight that you want luck to impact +in varying directions. + +Fishing still falls into that as the weights are closer, so luck +will invalidate junk more. + +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 7fba61a6d..c8f9c45e5 100644 +--- a/src/main/java/com/destroystokyo/paper/PaperConfig.java ++++ b/src/main/java/com/destroystokyo/paper/PaperConfig.java +@@ -276,4 +276,12 @@ public class PaperConfig { + "such as inventories, experience points, advancements and the like will not be saved when they log out."); + } + } ++ ++ public static boolean useAlternativeLuckFormula = false; ++ private static void useAlternativeLuckFormula() { ++ useAlternativeLuckFormula = getBoolean("settings.use-alternative-luck-formula", false); ++ if (useAlternativeLuckFormula) { ++ Bukkit.getLogger().log(Level.INFO, "Using Aikar's Alternative Luck Formula to apply Luck attribute to all loot pool calculations. See https://luckformula.emc.gs"); ++ } ++ } + } +diff --git a/src/main/java/net/minecraft/server/LootSelectorEntry.java b/src/main/java/net/minecraft/server/LootSelectorEntry.java +index 929053491..62cac814d 100644 +--- a/src/main/java/net/minecraft/server/LootSelectorEntry.java ++++ b/src/main/java/net/minecraft/server/LootSelectorEntry.java +@@ -13,8 +13,8 @@ import org.apache.commons.lang3.ArrayUtils; + + public abstract class LootSelectorEntry extends LootEntryAbstract { + +- 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() { +@@ -127,7 +127,7 @@ 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 LootItemFunction[] a() { +@@ -136,22 +136,49 @@ 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 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; + } + } ++ private Float lastLuck = null; ++ private int lastWeight = 0; ++ // Paper end + } +-- +2.21.0 + diff --git a/Spigot-Server-Patches/0266-Print-Error-details-when-failing-to-save-player-data.patch b/Spigot-Server-Patches/0237-Print-Error-details-when-failing-to-save-player-data.patch similarity index 54% rename from Spigot-Server-Patches/0266-Print-Error-details-when-failing-to-save-player-data.patch rename to Spigot-Server-Patches/0237-Print-Error-details-when-failing-to-save-player-data.patch index 2f2b77516a..c4b0bbd518 100644 --- a/Spigot-Server-Patches/0266-Print-Error-details-when-failing-to-save-player-data.patch +++ b/Spigot-Server-Patches/0237-Print-Error-details-when-failing-to-save-player-data.patch @@ -1,19 +1,19 @@ -From b19ec64b2b7728405a294db829c98d4c37b137da Mon Sep 17 00:00:00 2001 +From 42956378a65b0412666a7f30f8a29fca334e5ce6 Mon Sep 17 00:00:00 2001 From: Aikar Date: Fri, 15 Jun 2018 20:37:03 -0400 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 -@@ -154,7 +154,7 @@ public class WorldNBTStorage implements IDataManager, IPlayerFileData { +@@ -151,7 +151,7 @@ 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/0267-Make-shield-blocking-delay-configurable.patch b/Spigot-Server-Patches/0238-Make-shield-blocking-delay-configurable.patch similarity index 65% rename from Spigot-Server-Patches/0267-Make-shield-blocking-delay-configurable.patch rename to Spigot-Server-Patches/0238-Make-shield-blocking-delay-configurable.patch index 35340f8e7d..949e89bc4e 100644 --- a/Spigot-Server-Patches/0267-Make-shield-blocking-delay-configurable.patch +++ b/Spigot-Server-Patches/0238-Make-shield-blocking-delay-configurable.patch @@ -1,16 +1,16 @@ -From 43309180bebc7a1df2dd169fed98dd2f02737f59 Mon Sep 17 00:00:00 2001 +From b3cdaca5ce72cb5807c5b6fb21744a9c0de5be0c Mon Sep 17 00:00:00 2001 From: BillyGalbreath Date: Sat, 16 Jun 2018 01:18:16 -0500 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 -@@ -442,4 +442,9 @@ public class PaperWorldConfig { - log("Villages can load chunks - Warning this can cause intense TPS loss. Strongly consider disabling this."); - } +@@ -365,4 +365,9 @@ public class PaperWorldConfig { + 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 -@@ -2701,7 +2701,7 @@ public abstract class EntityLiving extends Entity { +@@ -2915,7 +2915,7 @@ 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; } -@@ -2789,4 +2789,16 @@ public abstract class EntityLiving extends Entity { - public boolean df() { - return true; +@@ -3151,4 +3151,15 @@ public abstract class EntityLiving extends Entity { + public void d(EnumHand enumhand) { + this.c(enumhand == EnumHand.MAIN_HAND ? EnumItemSlot.MAINHAND : EnumItemSlot.OFFHAND); } -+ + // Paper start + public int shieldBlockingDelay = world.paperConfig.shieldBlockingDelay; + @@ -49,10 +48,10 @@ 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 -@@ -558,5 +558,15 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { +@@ -559,5 +559,15 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { public void setArrowsStuck(int arrows) { getHandle().setArrowCount(arrows); } diff --git a/Spigot-Server-Patches/0268-Ignore-Missing-Recipes-in-RecipeBook-to-avoid-data-e.patch b/Spigot-Server-Patches/0239-Ignore-Missing-Recipes-in-RecipeBook-to-avoid-data-e.patch similarity index 67% rename from Spigot-Server-Patches/0268-Ignore-Missing-Recipes-in-RecipeBook-to-avoid-data-e.patch rename to Spigot-Server-Patches/0239-Ignore-Missing-Recipes-in-RecipeBook-to-avoid-data-e.patch index 93c58e9619..9816a7fe2e 100644 --- a/Spigot-Server-Patches/0268-Ignore-Missing-Recipes-in-RecipeBook-to-avoid-data-e.patch +++ b/Spigot-Server-Patches/0239-Ignore-Missing-Recipes-in-RecipeBook-to-avoid-data-e.patch @@ -1,4 +1,4 @@ -From cc6a121371a695b0890a0a4a88221769e8f08e43 Mon Sep 17 00:00:00 2001 +From 6731f23f1615e38fd9d7d0b6d89e50045ce2f016 Mon Sep 17 00:00:00 2001 From: Aikar Date: Sat, 16 Jun 2018 16:23:38 -0400 Subject: [PATCH] Ignore Missing Recipes in RecipeBook to avoid data errors @@ -6,31 +6,31 @@ 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 @@ -78,6 +78,10 @@ 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())); + } @@ -88,6 +92,10 @@ 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())); + } -- 2.21.0 diff --git a/Spigot-Server-Patches/0269-EntityShootBowEvent-consumeArrow-and-getArrowItem-AP.patch b/Spigot-Server-Patches/0240-EntityShootBowEvent-consumeArrow-and-getArrowItem-AP.patch similarity index 63% rename from Spigot-Server-Patches/0269-EntityShootBowEvent-consumeArrow-and-getArrowItem-AP.patch rename to Spigot-Server-Patches/0240-EntityShootBowEvent-consumeArrow-and-getArrowItem-AP.patch index 99104085e1..3717345e4d 100644 --- a/Spigot-Server-Patches/0269-EntityShootBowEvent-consumeArrow-and-getArrowItem-AP.patch +++ b/Spigot-Server-Patches/0240-EntityShootBowEvent-consumeArrow-and-getArrowItem-AP.patch @@ -1,4 +1,4 @@ -From 72ff41a6569670f3194ca52bf850eef0349b13a8 Mon Sep 17 00:00:00 2001 +From 874ba3a727fad9bf8f9784944ac3a2e23a5c155d Mon Sep 17 00:00:00 2001 From: Aikar Date: Sat, 15 Jun 2013 19:51:17 -0400 Subject: [PATCH] EntityShootBowEvent consumeArrow and getArrowItem API @@ -6,10 +6,10 @@ 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 -@@ -152,7 +152,7 @@ public abstract class EntitySkeletonAbstract extends EntityMonster implements IR +@@ -157,7 +157,7 @@ public abstract class EntitySkeletonAbstract extends EntityMonster implements IR entityarrow.shoot(d0, d1 + d3 * 0.20000000298023224D, d2, 1.6F, (float) (14 - this.world.getDifficulty().a() * 4)); // CraftBukkit start @@ -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 -@@ -55,6 +55,7 @@ public class ItemBow extends Item { +@@ -36,6 +36,7 @@ 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); -@@ -80,7 +81,7 @@ public class ItemBow extends Item { +@@ -61,7 +62,7 @@ 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; -@@ -88,7 +89,8 @@ public class ItemBow extends Item { - // CraftBukkit end - - itemstack.damage(1, entityhuman); +@@ -71,7 +72,8 @@ 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; } -@@ -105,7 +107,7 @@ public class ItemBow extends Item { +@@ -88,7 +90,7 @@ 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 +@@ -208,7 +208,7 @@ 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 -@@ -332,7 +332,7 @@ public class CraftEventFactory { +@@ -47,6 +47,7 @@ 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; +@@ -437,16 +438,16 @@ 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(); -@@ -341,7 +341,7 @@ 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/0241-PlayerReadyArrowEvent.patch b/Spigot-Server-Patches/0241-PlayerReadyArrowEvent.patch new file mode 100644 index 0000000000..bbdfa34fcc --- /dev/null +++ b/Spigot-Server-Patches/0241-PlayerReadyArrowEvent.patch @@ -0,0 +1,42 @@ +From 0cdddf9367dc7f2c534b18f99bce0f153d4cc7da Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Mon, 18 Jun 2018 01:12:53 -0400 +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/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 +@@ -2032,6 +2032,17 @@ public abstract class EntityHuman extends EntityLiving { + return (EntitySize) EntityHuman.b.getOrDefault(entitypose, EntityHuman.bs); + } + ++ // Paper start ++ protected boolean tryReadyArrow(ItemStack bow, ItemStack itemstack) { ++ return !(this instanceof EntityPlayer) || ++ new com.destroystokyo.paper.event.player.PlayerReadyArrowEvent( ++ ((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)) { +@@ -2048,7 +2059,7 @@ public abstract class EntityHuman extends EntityLiving { + for (int i = 0; i < this.inventory.getSize(); ++i) { + ItemStack itemstack2 = this.inventory.getItem(i); + +- if (predicate.test(itemstack2)) { ++ if (predicate.test(itemstack2) && tryReadyArrow(itemstack, itemstack2)) { // Paper + return itemstack2; + } + } +-- +2.21.0 + diff --git a/Spigot-Server-Patches/0271-Fire-EntityShootBowEvent-for-Illusioner.patch b/Spigot-Server-Patches/0242-Fire-EntityShootBowEvent-for-Illusioner.patch similarity index 86% rename from Spigot-Server-Patches/0271-Fire-EntityShootBowEvent-for-Illusioner.patch rename to Spigot-Server-Patches/0242-Fire-EntityShootBowEvent-for-Illusioner.patch index 8d84f3f132..efd4ac6274 100644 --- a/Spigot-Server-Patches/0271-Fire-EntityShootBowEvent-for-Illusioner.patch +++ b/Spigot-Server-Patches/0242-Fire-EntityShootBowEvent-for-Illusioner.patch @@ -1,14 +1,14 @@ -From 534d093b17cb43c542e46b2efe94bbe4e8f7dfbd Mon Sep 17 00:00:00 2001 +From 15f975b03733628dbc8406c8b3dab599b68ea3bb Mon Sep 17 00:00:00 2001 From: Aikar Date: Mon, 18 Jun 2018 22:19:36 -0400 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 -@@ -123,8 +123,18 @@ public class EntityIllagerIllusioner extends EntityIllagerWizard implements IRan +@@ -138,8 +138,18 @@ public class EntityIllagerIllusioner extends EntityIllagerWizard implements IRan double d3 = (double) MathHelper.sqrt(d0 * d0 + d2 * d2); entityarrow.shoot(d0, d1 + d3 * 0.20000000298023224D, d2, 1.6F, (float) (14 - this.world.getDifficulty().a() * 4)); @@ -27,7 +27,7 @@ index 08af4453fa..8b595979e7 100644 + // Paper end } - protected EntityArrow v(float f) { + class a extends EntityIllagerWizard.c { -- 2.21.0 diff --git a/Spigot-Server-Patches/0243-Implement-EntityKnockbackByEntityEvent.patch b/Spigot-Server-Patches/0243-Implement-EntityKnockbackByEntityEvent.patch new file mode 100644 index 0000000000..f186396bd0 --- /dev/null +++ b/Spigot-Server-Patches/0243-Implement-EntityKnockbackByEntityEvent.patch @@ -0,0 +1,31 @@ +From 4312a5c952e133eafb39adc49e655f1445468cd7 Mon Sep 17 00:00:00 2001 +From: Brokkonaut +Date: Mon, 18 Jun 2018 15:46:23 +0200 +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 8c6d53f44..d65933e9e 100644 +--- a/src/main/java/net/minecraft/server/EntityLiving.java ++++ b/src/main/java/net/minecraft/server/EntityLiving.java +@@ -1424,6 +1424,16 @@ public abstract class EntityLiving extends Entity { + Vec3D vec3d1 = (new Vec3D(d0, 0.0D, d1)).d().a((double) f); + + 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); ++ ++ // Paper start - call EntityKnockbackByEntityEvent ++ 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.setMot(vec3d); ++ if (entity == null || new com.destroystokyo.paper.event.entity.EntityKnockbackByEntityEvent((LivingEntity) getBukkitEntity(), entity.getBukkitEntity(), f, delta).callEvent()) { ++ this.setMot(vec3d.x + delta.getX(), vec3d.y + delta.getY(), vec3d.z + delta.getZ()); ++ } ++ // Paper end + } + } + +-- +2.21.0 + diff --git a/Spigot-Server-Patches/0273-Expand-Explosions-API.patch b/Spigot-Server-Patches/0244-Expand-Explosions-API.patch similarity index 81% rename from Spigot-Server-Patches/0273-Expand-Explosions-API.patch rename to Spigot-Server-Patches/0244-Expand-Explosions-API.patch index 8cd0245094..920a595f7b 100644 --- a/Spigot-Server-Patches/0273-Expand-Explosions-API.patch +++ b/Spigot-Server-Patches/0244-Expand-Explosions-API.patch @@ -1,4 +1,4 @@ -From 440eeef40055f8f50ababeb0f190fba4bac3cd9c Mon Sep 17 00:00:00 2001 +From 3fe29c64acb5071f4ee13259b444dcb4d298e859 Mon Sep 17 00:00:00 2001 From: Aikar Date: Wed, 20 Jun 2018 23:17:24 -0400 Subject: [PATCH] Expand Explosions API @@ -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 -@@ -539,6 +539,11 @@ public class CraftWorld implements World { +@@ -710,6 +710,11 @@ 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/0274-LivingEntity-Hand-Raised-Item-Use-API.patch b/Spigot-Server-Patches/0245-LivingEntity-Hand-Raised-Item-Use-API.patch similarity index 70% rename from Spigot-Server-Patches/0274-LivingEntity-Hand-Raised-Item-Use-API.patch rename to Spigot-Server-Patches/0245-LivingEntity-Hand-Raised-Item-Use-API.patch index 4054c97daf..f5ac3333f1 100644 --- a/Spigot-Server-Patches/0274-LivingEntity-Hand-Raised-Item-Use-API.patch +++ b/Spigot-Server-Patches/0245-LivingEntity-Hand-Raised-Item-Use-API.patch @@ -1,4 +1,4 @@ -From b0ace26dda67fe67e597961dc025a8df70d902f6 Mon Sep 17 00:00:00 2001 +From 42e917cd4fe357b4ebee9bb1e2adfff968f3b020 Mon Sep 17 00:00:00 2001 From: Aikar Date: Fri, 29 Jun 2018 00:21:28 -0400 Subject: [PATCH] LivingEntity Hand Raised/Item Use API @@ -6,36 +6,36 @@ 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 -@@ -106,7 +106,7 @@ public abstract class EntityLiving extends Entity { - private float bI; - private int bJ; - private float bK; +@@ -109,7 +109,7 @@ public abstract class EntityLiving extends Entity { + 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; -@@ -2690,10 +2690,12 @@ public abstract class EntityLiving extends Entity { + protected int bo; + protected int bp; + private BlockPosition bG; +@@ -2893,10 +2893,12 @@ 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 -@@ -568,5 +568,25 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { +@@ -569,5 +569,25 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { public void setShieldBlockingDelay(int delay) { getHandle().setShieldBlockingDelay(delay); } diff --git a/Spigot-Server-Patches/0275-RangedEntity-API.patch b/Spigot-Server-Patches/0246-RangedEntity-API.patch similarity index 89% rename from Spigot-Server-Patches/0275-RangedEntity-API.patch rename to Spigot-Server-Patches/0246-RangedEntity-API.patch index 8eeaa32915..f0151caaf4 100644 --- a/Spigot-Server-Patches/0275-RangedEntity-API.patch +++ b/Spigot-Server-Patches/0246-RangedEntity-API.patch @@ -1,4 +1,4 @@ -From 4e5232bc88f4f7f5c7913f8cbd30e71973252d33 Mon Sep 17 00:00:00 2001 +From 14ffddbe3a78171ba0871e8c122359580ecec888 Mon Sep 17 00:00:00 2001 From: Aikar Date: Tue, 26 Jun 2018 22:00:49 -0400 Subject: [PATCH] RangedEntity API @@ -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 +1,19 @@ @@ -32,21 +32,21 @@ 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 -@@ -2,7 +2,7 @@ package net.minecraft.server; +@@ -2,5 +2,8 @@ package net.minecraft.server; public interface IRangedEntity { - 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 @@ -1,11 +1,12 @@ @@ -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 @@ -1,5 +1,6 @@ @@ -84,15 +84,14 @@ 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 -@@ -1,12 +1,13 @@ +@@ -1,11 +1,12 @@ package org.bukkit.craftbukkit.entity; +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 @@ -1,11 +1,12 @@ @@ -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 @@ -1,11 +1,12 @@ 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 @@ -1,5 +1,6 @@ diff --git a/Spigot-Server-Patches/0276-Add-config-to-disable-ender-dragon-legacy-check.patch b/Spigot-Server-Patches/0247-Add-config-to-disable-ender-dragon-legacy-check.patch similarity index 92% rename from Spigot-Server-Patches/0276-Add-config-to-disable-ender-dragon-legacy-check.patch rename to Spigot-Server-Patches/0247-Add-config-to-disable-ender-dragon-legacy-check.patch index 1abff66dcc..c0f5960cf1 100644 --- a/Spigot-Server-Patches/0276-Add-config-to-disable-ender-dragon-legacy-check.patch +++ b/Spigot-Server-Patches/0247-Add-config-to-disable-ender-dragon-legacy-check.patch @@ -1,14 +1,14 @@ -From 0b1be3cdc11bb23eee5fe71b501121bafb812ddd Mon Sep 17 00:00:00 2001 +From 578426cb83913b333e58ee88e26f12aa7e016c17 Mon Sep 17 00:00:00 2001 From: BillyGalbreath Date: Fri, 22 Jun 2018 10:38:31 -0500 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 -@@ -447,4 +447,9 @@ public class PaperWorldConfig { +@@ -370,4 +370,9 @@ public class PaperWorldConfig { private void shieldBlockingDelay() { shieldBlockingDelay = getInt("game-mechanics.shield-blocking-delay", 5); } @@ -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 @@ -28,10 +28,10 @@ public class EnderDragonBattle { diff --git a/Spigot-Server-Patches/0277-Implement-World.getEntity-UUID-API.patch b/Spigot-Server-Patches/0248-Implement-World.getEntity-UUID-API.patch similarity index 77% rename from Spigot-Server-Patches/0277-Implement-World.getEntity-UUID-API.patch rename to Spigot-Server-Patches/0248-Implement-World.getEntity-UUID-API.patch index 2da495bd4c..d92d48b696 100644 --- a/Spigot-Server-Patches/0277-Implement-World.getEntity-UUID-API.patch +++ b/Spigot-Server-Patches/0248-Implement-World.getEntity-UUID-API.patch @@ -1,14 +1,14 @@ -From f0ca58a8e0ebfb5e2e3b90874b70a7c01562a0fa Mon Sep 17 00:00:00 2001 +From a2240a33505d12875b4c786d32e28c961acc6904 Mon Sep 17 00:00:00 2001 From: Brokkonaut Date: Tue, 3 Jul 2018 16:08:14 +0200 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 -@@ -890,6 +890,14 @@ public class CraftWorld implements World { +@@ -1061,6 +1061,14 @@ public class CraftWorld implements World { return list; } @@ -21,8 +21,8 @@ index cfa35740b4..609b911265 100644 + // Paper end + public void save() { - // Spigot start - save(true); + this.server.checkSaveState(); + try { -- 2.21.0 diff --git a/Spigot-Server-Patches/0278-InventoryCloseEvent-Reason-API.patch b/Spigot-Server-Patches/0249-InventoryCloseEvent-Reason-API.patch similarity index 79% rename from Spigot-Server-Patches/0278-InventoryCloseEvent-Reason-API.patch rename to Spigot-Server-Patches/0249-InventoryCloseEvent-Reason-API.patch index 4ed9864073..eb87213e26 100644 --- a/Spigot-Server-Patches/0278-InventoryCloseEvent-Reason-API.patch +++ b/Spigot-Server-Patches/0249-InventoryCloseEvent-Reason-API.patch @@ -1,4 +1,4 @@ -From 1d495495333e3af2404bad9dc68d0b11ca1e0537 Mon Sep 17 00:00:00 2001 +From bee370a5eb7dc4c813473fa4262b6ff0df258974 Mon Sep 17 00:00:00 2001 From: Aikar Date: Tue, 3 Jul 2018 21:56:23 -0400 Subject: [PATCH] InventoryCloseEvent Reason API @@ -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 -@@ -944,7 +944,7 @@ 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 - } - } - } -@@ -969,7 +969,7 @@ 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 -@@ -158,7 +158,7 @@ public abstract class EntityHuman extends EntityLiving { - this.dg(); +@@ -149,7 +149,7 @@ public abstract class EntityHuman extends EntityLiving { + this.dA(); super.tick(); if (!this.world.isClientSide && this.activeContainer != null && !this.activeContainer.canUse(this)) { - this.closeInventory(); @@ -41,8 +19,8 @@ index d4618d644a..cc1bc01b16 100644 this.activeContainer = this.defaultContainer; } -@@ -360,6 +360,13 @@ public abstract class EntityHuman extends EntityLiving { - return this.getHealth() <= 0.0F || this.isSleeping(); +@@ -336,6 +336,13 @@ public abstract class EntityHuman extends EntityLiving { + return 20; } + // Paper start - unused code, but to keep signatures aligned @@ -56,10 +34,10 @@ 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 -@@ -344,7 +344,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { +@@ -359,7 +359,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { } // Paper end if (!this.world.isClientSide && !this.activeContainer.canUse(this)) { @@ -68,25 +46,25 @@ index e4e1d999e9..dc72538de6 100644 this.activeContainer = this.defaultContainer; } -@@ -555,7 +555,7 @@ 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 +@@ -527,7 +527,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { -@@ -873,7 +873,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { - this.a((new ChatMessage("container.spectatorCantOpen", new Object[0])).a(EnumChatFormat.RED), true); + // 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(); +@@ -1036,7 +1036,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { + 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) { -@@ -946,7 +946,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { + this.nextContainerCounter(); +@@ -1086,7 +1086,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { } // CraftBukkit end if (this.activeContainer != this.defaultContainer) { @@ -94,10 +72,10 @@ index e4e1d999e9..dc72538de6 100644 + this.closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason.OPEN_NEW); // Paper } - this.nextContainerCounter(); -@@ -1011,7 +1011,12 @@ public class EntityPlayer extends EntityHuman implements ICrafting { - } + // this.nextContainerCounter(); // CraftBukkit - moved up +@@ -1150,7 +1150,12 @@ 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 -@@ -2001,7 +2001,7 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable { +@@ -2050,7 +2050,7 @@ public class PlayerConnection implements PacketListenerPlayIn { PlayerConnectionUtils.ensureMainThread(packetplayinclosewindow, this, this.player.getWorldServer()); if (this.player.isFrozen()) return; // CraftBukkit @@ -123,10 +101,10 @@ 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 -@@ -422,7 +422,7 @@ public abstract class PlayerList { +@@ -400,7 +400,7 @@ public abstract class PlayerList { entityplayer.a(StatisticList.LEAVE_GAME); // CraftBukkit start - Quitting must be before we do final save of data, in case plugins need to modify it @@ -135,11 +113,33 @@ 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 +@@ -988,7 +988,7 @@ 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 + } + } + } +@@ -1011,7 +1011,7 @@ 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 -@@ -513,8 +513,13 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { +@@ -567,8 +567,13 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { } public void closeInventory() { @@ -155,10 +155,10 @@ 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 -@@ -743,7 +743,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -769,7 +769,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { // Close any foreign inventory if (getHandle().activeContainer != getHandle().defaultContainer) { @@ -168,10 +168,10 @@ 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 -@@ -1110,8 +1110,19 @@ public class CraftEventFactory { +@@ -1225,8 +1225,19 @@ public class CraftEventFactory { return event; } diff --git a/Spigot-Server-Patches/0250-Avoid-Chunk-Lookups-for-Entity-TileEntity-Current-Ch.patch b/Spigot-Server-Patches/0250-Avoid-Chunk-Lookups-for-Entity-TileEntity-Current-Ch.patch new file mode 100644 index 0000000000..ea4ea049d0 --- /dev/null +++ b/Spigot-Server-Patches/0250-Avoid-Chunk-Lookups-for-Entity-TileEntity-Current-Ch.patch @@ -0,0 +1,77 @@ +From 9c190db2972a8f21254928867c46fb46f765ea81 Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Wed, 4 Jul 2018 03:39:51 -0400 +Subject: [PATCH] Avoid Chunk Lookups for Entity/TileEntity Current Chunk + +In many places where we simply want the current chunk the entity +is in, instead of doing a hashmap lookup for it, we now have access +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 3737fca81..6bd181565 100644 +--- a/src/main/java/net/minecraft/server/World.java ++++ b/src/main/java/net/minecraft/server/World.java +@@ -759,7 +759,8 @@ public abstract class World implements IIBlockAccess, GeneratorAccess, AutoClose + if (!tileentity.isRemoved() && tileentity.hasWorld()) { + BlockPosition blockposition = tileentity.getPosition(); + +- 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())); +@@ -793,7 +794,7 @@ 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())) { ++ if (tileentity.getCurrentChunk() != null ) { // Paper - avoid lookups + this.getChunkAtWorldCoords(tileentity.getPosition()).removeTileEntity(tileentity.getPosition()); + } + } +@@ -814,8 +815,9 @@ 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 +@@ -1068,7 +1068,7 @@ 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; + +@@ -1122,9 +1122,12 @@ 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); + } + +-- +2.21.0 + diff --git a/Spigot-Server-Patches/0251-Configurable-Bed-Search-Radius.patch b/Spigot-Server-Patches/0251-Configurable-Bed-Search-Radius.patch new file mode 100644 index 0000000000..b4c593011c --- /dev/null +++ b/Spigot-Server-Patches/0251-Configurable-Bed-Search-Radius.patch @@ -0,0 +1,105 @@ +From 123cf353a72db41320695ad0ca68af2be035beb5 Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Wed, 4 Jul 2018 15:22:06 -0400 +Subject: [PATCH] Configurable Bed Search Radius + +Allows you to increase how far to check for a safe place to respawn +a player near their bed, allowing a better chance to respawn the +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 3294fbbea..83e54cb90 100644 +--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java ++++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java +@@ -375,4 +375,15 @@ public class PaperWorldConfig { + private void scanForLegacyEnderDragon() { + scanForLegacyEnderDragon = getBoolean("game-mechanics.scan-for-legacy-ender-dragon", true); + } ++ ++ public int bedSearchRadius = 1; ++ private void bedSearchRadius() { ++ bedSearchRadius = getInt("bed-search-radius", 1); ++ if (bedSearchRadius < 1) { ++ bedSearchRadius = 1; ++ } ++ if (bedSearchRadius > 1) { ++ log("Bed Search Radius: " + bedSearchRadius); ++ } ++ } + } +diff --git a/src/main/java/net/minecraft/server/BlockBed.java b/src/main/java/net/minecraft/server/BlockBed.java +index 2a451025f..75331c986 100644 +--- a/src/main/java/net/minecraft/server/BlockBed.java ++++ b/src/main/java/net/minecraft/server/BlockBed.java +@@ -171,6 +171,58 @@ public class BlockBed extends BlockFacingHorizontal implements ITileEntity { + + 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; ++ 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); ++ Optional vector; ++ vector = isSafeRespawn(entitytypes, world, pos); ++ if (vector.isPresent()) { ++ if (i-- <= 0) { ++ return vector; ++ } ++ } ++ pos = blockposition.add(-x, y, -z); ++ vector = isSafeRespawn(entitytypes, world, pos); ++ if (vector.isPresent()) { ++ if (i-- <= 0) { ++ return vector; ++ } ++ } ++ ++ vector = isSafeRespawn(entitytypes, world, pos); ++ if (vector.isPresent()) { ++ if (i-- <= 0) { ++ return vector; ++ } ++ } ++ ++ vector = isSafeRespawn(entitytypes, world, pos); ++ if (vector.isPresent()) { ++ if (i-- <= 0) { ++ return vector; ++ } ++ } ++ } ++ if (x < r) { ++ x++; ++ } else { ++ z--; ++ } ++ } ++ } ++ ++ return Optional.empty(); ++ } ++ // Paper end + int j = blockposition.getX(); + int k = blockposition.getY(); + int l = blockposition.getZ(); +@@ -200,6 +252,7 @@ public class BlockBed extends BlockFacingHorizontal implements ITileEntity { + return Optional.empty(); + } + ++ 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); + +-- +2.21.0 + diff --git a/Spigot-Server-Patches/0281-Vex-getSummoner-API.patch b/Spigot-Server-Patches/0252-Vex-getSummoner-API.patch similarity index 87% rename from Spigot-Server-Patches/0281-Vex-getSummoner-API.patch rename to Spigot-Server-Patches/0252-Vex-getSummoner-API.patch index 6571f56361..c9feec9344 100644 --- a/Spigot-Server-Patches/0281-Vex-getSummoner-API.patch +++ b/Spigot-Server-Patches/0252-Vex-getSummoner-API.patch @@ -1,4 +1,4 @@ -From 21a3bb2c4364a30d0d8a1596884bbfe151c22e1f Mon Sep 17 00:00:00 2001 +From 0c4b39af55f46555a3913eaef96d6ea0e2afc844 Mon Sep 17 00:00:00 2001 From: Aikar Date: Wed, 4 Jul 2018 15:30:22 -0400 Subject: [PATCH] Vex#getSummoner API @@ -6,19 +6,19 @@ 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 -@@ -86,6 +86,7 @@ public class EntityVex extends EntityMonster { +@@ -92,6 +92,7 @@ public class EntityVex extends EntityMonster { } + 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 @@ -1,8 +1,10 @@ diff --git a/Spigot-Server-Patches/0282-Refresh-player-inventory-when-cancelling-PlayerInter.patch b/Spigot-Server-Patches/0253-Refresh-player-inventory-when-cancelling-PlayerInter.patch similarity index 86% rename from Spigot-Server-Patches/0282-Refresh-player-inventory-when-cancelling-PlayerInter.patch rename to Spigot-Server-Patches/0253-Refresh-player-inventory-when-cancelling-PlayerInter.patch index ac5b27f592..a21cf4fd83 100644 --- a/Spigot-Server-Patches/0282-Refresh-player-inventory-when-cancelling-PlayerInter.patch +++ b/Spigot-Server-Patches/0253-Refresh-player-inventory-when-cancelling-PlayerInter.patch @@ -1,4 +1,4 @@ -From 831e570a9d59d466810523e85b1fa31867af7cf2 Mon Sep 17 00:00:00 2001 +From 288ab6704822a825fba34d1d9d44fdb44d12f5df Mon Sep 17 00:00:00 2001 From: Minecrell Date: Fri, 13 Jul 2018 14:54:43 +0200 Subject: [PATCH] Refresh player inventory when cancelling @@ -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 -@@ -1916,6 +1916,7 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable { +@@ -1964,6 +1964,7 @@ public class PlayerConnection implements PacketListenerPlayIn { } if (event.isCancelled()) { diff --git a/Spigot-Server-Patches/0254-Don-t-change-the-Entity-Random-seed-for-squids.patch b/Spigot-Server-Patches/0254-Don-t-change-the-Entity-Random-seed-for-squids.patch new file mode 100644 index 0000000000..0ca24fb570 --- /dev/null +++ b/Spigot-Server-Patches/0254-Don-t-change-the-Entity-Random-seed-for-squids.patch @@ -0,0 +1,22 @@ +From a0ac76e611c316afe5b54e884aa833f58380a427 Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Thu, 19 Jul 2018 01:05:00 -0400 +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 d5dff4b88..77c0ed42f 100644 +--- a/src/main/java/net/minecraft/server/EntitySquid.java ++++ b/src/main/java/net/minecraft/server/EntitySquid.java +@@ -19,7 +19,7 @@ public class EntitySquid extends EntityWaterAnimal { + + 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; + } + +-- +2.21.0 + diff --git a/Spigot-Server-Patches/0255-Re-add-vanilla-entity-warnings-for-duplicates.patch b/Spigot-Server-Patches/0255-Re-add-vanilla-entity-warnings-for-duplicates.patch new file mode 100644 index 0000000000..6fcacb0946 --- /dev/null +++ b/Spigot-Server-Patches/0255-Re-add-vanilla-entity-warnings-for-duplicates.patch @@ -0,0 +1,26 @@ +From b92318c67ab59e8e299a7a1a8908bf62cee0c69e Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Thu, 19 Jul 2018 01:08:05 -0400 +Subject: [PATCH] Re-add vanilla entity warnings for duplicates + +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 af62ab182..0b4990a00 100644 +--- a/src/main/java/net/minecraft/server/WorldServer.java ++++ b/src/main/java/net/minecraft/server/WorldServer.java +@@ -973,7 +973,8 @@ 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; + } + } +-- +2.21.0 + diff --git a/Spigot-Server-Patches/0286-Avoid-item-merge-if-stack-size-above-max-stack-size.patch b/Spigot-Server-Patches/0256-Avoid-item-merge-if-stack-size-above-max-stack-size.patch similarity index 68% rename from Spigot-Server-Patches/0286-Avoid-item-merge-if-stack-size-above-max-stack-size.patch rename to Spigot-Server-Patches/0256-Avoid-item-merge-if-stack-size-above-max-stack-size.patch index c7ef11d98f..2724d219bc 100644 --- a/Spigot-Server-Patches/0286-Avoid-item-merge-if-stack-size-above-max-stack-size.patch +++ b/Spigot-Server-Patches/0256-Avoid-item-merge-if-stack-size-above-max-stack-size.patch @@ -1,24 +1,24 @@ -From 04e89bbfc9881b015778fc6e3916d3df9274d0bb Mon Sep 17 00:00:00 2001 +From d8d88222f6045eb3afdb50a693eec564b1825252 Mon Sep 17 00:00:00 2001 From: Hugo Manrique Date: Mon, 16 Jul 2018 12:42:20 +0200 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 -@@ -173,6 +173,10 @@ public class EntityItem extends Entity { +@@ -166,6 +166,10 @@ 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) -> { -- 2.21.0 diff --git a/Spigot-Server-Patches/0287-Use-asynchronous-Log4j-2-loggers.patch b/Spigot-Server-Patches/0257-Use-asynchronous-Log4j-2-loggers.patch similarity index 88% rename from Spigot-Server-Patches/0287-Use-asynchronous-Log4j-2-loggers.patch rename to Spigot-Server-Patches/0257-Use-asynchronous-Log4j-2-loggers.patch index a9b66bef2c..7d8c874942 100644 --- a/Spigot-Server-Patches/0287-Use-asynchronous-Log4j-2-loggers.patch +++ b/Spigot-Server-Patches/0257-Use-asynchronous-Log4j-2-loggers.patch @@ -1,11 +1,11 @@ -From 82e41eb16264f724aa8745bc2ab2b2f0a50e94e8 Mon Sep 17 00:00:00 2001 +From aef479838d337b9eb508d751c6544760f5001d1c Mon Sep 17 00:00:00 2001 From: Minecrell Date: Tue, 17 Jul 2018 16:42:17 +0200 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 @@ -74,6 +74,13 @@ @@ -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/0288-add-more-information-to-Entity.toString.patch b/Spigot-Server-Patches/0258-add-more-information-to-Entity.toString.patch similarity index 89% rename from Spigot-Server-Patches/0288-add-more-information-to-Entity.toString.patch rename to Spigot-Server-Patches/0258-add-more-information-to-Entity.toString.patch index 0d70d60c64..4e8f8f0f2b 100644 --- a/Spigot-Server-Patches/0288-add-more-information-to-Entity.toString.patch +++ b/Spigot-Server-Patches/0258-add-more-information-to-Entity.toString.patch @@ -1,4 +1,4 @@ -From 2f51486373507742b96ba70777b50ad07388317c Mon Sep 17 00:00:00 2001 +From 07e48b2c5dbbf935e62fd18340ec507326878d8f Mon Sep 17 00:00:00 2001 From: Aikar Date: Thu, 19 Jul 2018 01:13:28 -0400 Subject: [PATCH] add more information to Entity.toString() @@ -6,10 +6,10 @@ 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 -@@ -2514,7 +2514,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -2423,7 +2423,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke } public String toString() { diff --git a/Spigot-Server-Patches/0259-Add-Debug-Entities-option-to-debug-dupe-uuid-issues.patch b/Spigot-Server-Patches/0259-Add-Debug-Entities-option-to-debug-dupe-uuid-issues.patch new file mode 100644 index 0000000000..51411db722 --- /dev/null +++ b/Spigot-Server-Patches/0259-Add-Debug-Entities-option-to-debug-dupe-uuid-issues.patch @@ -0,0 +1,88 @@ +From a862de455ad3f18990ad3c2debc852ca691c4857 Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Sat, 21 Jul 2018 08:25:40 -0400 +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 c7d19d957..8dd589aae 100644 +--- a/src/main/java/net/minecraft/server/Entity.java ++++ b/src/main/java/net/minecraft/server/Entity.java +@@ -72,6 +72,8 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke + public com.destroystokyo.paper.loottable.PaperLootableInventoryData lootableData; // Paper + protected CraftEntity bukkitEntity; + ++ 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 6bd181565..f9f0a94e9 100644 +--- a/src/main/java/net/minecraft/server/World.java ++++ b/src/main/java/net/minecraft/server/World.java +@@ -68,6 +68,7 @@ public abstract class World implements IIBlockAccess, GeneratorAccess, AutoClose + public boolean pvpMode; + public boolean keepSpawnInMemory = true; + 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 0b4990a00..3e41c080d 100644 +--- a/src/main/java/net/minecraft/server/WorldServer.java ++++ b/src/main/java/net/minecraft/server/WorldServer.java +@@ -77,6 +77,9 @@ 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, Executor executor, WorldNBTStorage worldnbtstorage, WorldData worlddata, DimensionManager dimensionmanager, GameProfilerFiller gameprofilerfiller, WorldLoadListener worldloadlistener, org.bukkit.World.Environment env, org.bukkit.generator.ChunkGenerator gen) { +@@ -937,6 +940,12 @@ 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) { ++ // 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 if (this.isUUIDTaken(entity)) { +@@ -1099,7 +1108,24 @@ public class WorldServer extends World { + } + } + +- this.entitiesByUUID.put(entity.getUniqueID(), entity); ++ 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); ++ 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()); +-- +2.21.0 + diff --git a/Spigot-Server-Patches/0290-EnderDragon-Events.patch b/Spigot-Server-Patches/0260-EnderDragon-Events.patch similarity index 86% rename from Spigot-Server-Patches/0290-EnderDragon-Events.patch rename to Spigot-Server-Patches/0260-EnderDragon-Events.patch index 83519962bb..eef716a32d 100644 --- a/Spigot-Server-Patches/0290-EnderDragon-Events.patch +++ b/Spigot-Server-Patches/0260-EnderDragon-Events.patch @@ -1,16 +1,16 @@ -From 807b6b37d1576b5cf82fb5c8a9423c69647fca98 Mon Sep 17 00:00:00 2001 +From e572a4cfb10329466bb5f5fa0a7dc4c55c168796 Mon Sep 17 00:00:00 2001 From: BillyGalbreath Date: Sat, 21 Jul 2018 01:51:27 -0500 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 -@@ -63,7 +63,9 @@ public class DragonControllerLandedFlame extends AbstractDragonControllerLanded +@@ -65,7 +65,9 @@ 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); @@ -18,19 +18,20 @@ index 1906bcfc96..50d291139c 100644 } } -@@ -73,6 +75,7 @@ public class DragonControllerLandedFlame extends AbstractDragonControllerLanded +@@ -76,6 +78,8 @@ public class DragonControllerLandedFlame extends AbstractDragonControllerLanded ++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 -@@ -67,7 +67,9 @@ public class DragonControllerStrafe extends AbstractDragonController { +@@ -68,7 +68,9 @@ public class DragonControllerStrafe extends AbstractDragonController { EntityDragonFireball entitydragonfireball = new EntityDragonFireball(this.a.world, this.a, d9, d10, d11); entitydragonfireball.setPositionRotation(d6, d7, d8, 0.0F, 0.0F); @@ -41,10 +42,10 @@ 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 -@@ -39,8 +39,10 @@ public class EntityDragonFireball extends EntityFireball { +@@ -40,8 +40,10 @@ public class EntityDragonFireball extends EntityFireball { } } diff --git a/Spigot-Server-Patches/0291-PlayerElytraBoostEvent.patch b/Spigot-Server-Patches/0261-PlayerElytraBoostEvent.patch similarity index 75% rename from Spigot-Server-Patches/0291-PlayerElytraBoostEvent.patch rename to Spigot-Server-Patches/0261-PlayerElytraBoostEvent.patch index 8e0a146018..9d6719051b 100644 --- a/Spigot-Server-Patches/0291-PlayerElytraBoostEvent.patch +++ b/Spigot-Server-Patches/0261-PlayerElytraBoostEvent.patch @@ -1,18 +1,19 @@ -From df3cc340d9321a3ffd4b9d60edce8159c44f749d Mon Sep 17 00:00:00 2001 +From 142259f15f4baeeb62a3e50a16feeea0ab76f918 Mon Sep 17 00:00:00 2001 From: BillyGalbreath Date: Sat, 21 Jul 2018 01:59:59 -0500 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 -@@ -33,9 +33,15 @@ public class ItemFireworks extends Item { - EntityFireworks entityfireworks = new EntityFireworks(world, itemstack, entityhuman); - entityfireworks.spawningEntity = entityhuman.getUniqueID(); // Paper - +@@ -35,11 +35,16 @@ public class ItemFireworks extends Item { + // 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,10 +24,11 @@ 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)); -- 2.21.0 diff --git a/Spigot-Server-Patches/0292-PlayerLaunchProjectileEvent.patch b/Spigot-Server-Patches/0262-PlayerLaunchProjectileEvent.patch similarity index 93% rename from Spigot-Server-Patches/0292-PlayerLaunchProjectileEvent.patch rename to Spigot-Server-Patches/0262-PlayerLaunchProjectileEvent.patch index a6c8c7c0d4..6600b63d4e 100644 --- a/Spigot-Server-Patches/0292-PlayerLaunchProjectileEvent.patch +++ b/Spigot-Server-Patches/0262-PlayerLaunchProjectileEvent.patch @@ -1,14 +1,14 @@ -From a247cf802ea037f8e9df044e64fddc17ed3a43ef Mon Sep 17 00:00:00 2001 +From 63edfb2b28cc8754bf733769d831ddcaec199744 Mon Sep 17 00:00:00 2001 From: BillyGalbreath Date: Sat, 21 Jul 2018 03:11:03 -0500 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 -@@ -9,16 +9,34 @@ public class ItemEgg extends Item { +@@ -10,17 +10,35 @@ public class ItemEgg extends Item { public InteractionResultWrapper a(World world, EntityHuman entityhuman, EnumHand enumhand) { ItemStack itemstack = entityhuman.b(enumhand); @@ -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 -@@ -14,7 +14,19 @@ public class ItemEnderPearl extends Item { - EntityEnderPearl entityenderpearl = new EntityEnderPearl(world, entityhuman); +@@ -16,7 +16,19 @@ public class ItemEnderPearl extends Item { + entityenderpearl.setItem(itemstack); entityenderpearl.a(entityhuman, entityhuman.pitch, entityhuman.yaw, 0.0F, 1.5F, 1.0F); - if (!world.addEntity(entityenderpearl)) { + // Paper start @@ -69,7 +70,7 @@ index 3672996c2d..719210da15 100644 if (entityhuman instanceof EntityPlayer) { ((EntityPlayer) entityhuman).getBukkitEntity().updateInventory(); } -@@ -22,13 +34,15 @@ public class ItemEnderPearl extends Item { +@@ -24,13 +36,15 @@ public class ItemEnderPearl extends Item { } } @@ -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 -@@ -8,17 +8,34 @@ public class ItemExpBottle extends Item { - +@@ -9,18 +9,35 @@ 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 -@@ -8,14 +8,38 @@ public class ItemLingeringPotion extends ItemPotion { - +@@ -9,15 +9,40 @@ 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 -@@ -21,15 +21,23 @@ public class ItemSnowball extends Item { - EntitySnowball entitysnowball = new EntitySnowball(world, entityhuman); +@@ -23,15 +23,23 @@ public class ItemSnowball extends Item { + 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 -@@ -8,14 +8,38 @@ public class ItemSplashPotion extends ItemPotion { - +@@ -9,15 +9,39 @@ 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/0294-Speedup-BlockPos-by-fixing-inlining.patch b/Spigot-Server-Patches/0263-Speedup-BlockPos-by-fixing-inlining.patch similarity index 64% rename from Spigot-Server-Patches/0294-Speedup-BlockPos-by-fixing-inlining.patch rename to Spigot-Server-Patches/0263-Speedup-BlockPos-by-fixing-inlining.patch index 567c06abc5..0347796a35 100644 --- a/Spigot-Server-Patches/0294-Speedup-BlockPos-by-fixing-inlining.patch +++ b/Spigot-Server-Patches/0263-Speedup-BlockPos-by-fixing-inlining.patch @@ -1,4 +1,4 @@ -From a37310c6dad755affd1bf6e87c34649cc598b732 Mon Sep 17 00:00:00 2001 +From 44546c450aad2cfac08a12d27bf967dd28e0eaba Mon Sep 17 00:00:00 2001 From: Techcable Date: Wed, 30 Nov 2016 20:56:58 -0600 Subject: [PATCH] Speedup BlockPos by fixing inlining @@ -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 @@ -7,22 +7,22 @@ import javax.annotation.concurrent.Immutable; @@ -55,7 +55,7 @@ index 4c7793f86d..cc17a414f5 100644 } public BaseBlockPosition(double d0, double d1, double d2) { -@@ -49,17 +49,19 @@ public class BaseBlockPosition implements Comparable { +@@ -49,24 +49,26 @@ public class BaseBlockPosition implements Comparable { return this.getY() == baseblockposition.getY() ? (this.getZ() == baseblockposition.getZ() ? this.getX() - baseblockposition.getX() : this.getZ() - baseblockposition.getZ()) : this.getY() - baseblockposition.getY(); } @@ -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) { +@@ -91,9 +93,9 @@ 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 -@@ -202,18 +202,18 @@ 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; -@@ -296,11 +296,12 @@ public class BlockPosition extends BaseBlockPosition { +@@ -335,11 +335,12 @@ 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; -@@ -309,6 +310,7 @@ public class BlockPosition extends BaseBlockPosition { +@@ -348,6 +349,7 @@ 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() { -@@ -320,10 +322,13 @@ public class BlockPosition extends BaseBlockPosition { +@@ -359,10 +361,13 @@ 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) { -@@ -342,6 +347,8 @@ public class BlockPosition extends BaseBlockPosition { - return super.a(enumblockrotation).h(); + public MutableBlockPosition(double d0, double d1, double d2) { +@@ -389,6 +394,9 @@ public class BlockPosition extends BaseBlockPosition implements MinecraftSeriali + return super.a(enumblockrotation).immutableCopy(); } ++ + /* + // Paper start - use parent getters + @Override public int getX() { return this.b; - } -@@ -352,13 +359,16 @@ public class BlockPosition extends BaseBlockPosition { - +@@ -402,13 +410,16 @@ 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; } -@@ -376,15 +386,15 @@ public class BlockPosition extends BaseBlockPosition { +@@ -438,15 +449,15 @@ 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,7 +192,7 @@ index 80e13dfb2e..20cf9255ba 100644 + this.y = i; // Paper change to y } - public BlockPosition toBlockPosition() { return h(); } // Paper - OBFHELPER + @Override -- 2.21.0 diff --git a/Spigot-Server-Patches/0264-Don-t-save-Proto-Chunks.patch b/Spigot-Server-Patches/0264-Don-t-save-Proto-Chunks.patch new file mode 100644 index 0000000000..4f103eb6d7 --- /dev/null +++ b/Spigot-Server-Patches/0264-Don-t-save-Proto-Chunks.patch @@ -0,0 +1,24 @@ +From f29752f88bfc321f53e982778b9fa3004aaeca8b Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Sun, 22 Jul 2018 21:21:41 -0400 +Subject: [PATCH] Don't save Proto Chunks + +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/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 +@@ -614,6 +614,7 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { + } + + public void saveChunk(IChunkAccess ichunkaccess, boolean save) { ++ if (ichunkaccess.getChunkStatus().getType() == ChunkStatus.Type.PROTOCHUNK) { return; } // Paper - don't save proto chunks + // CraftBukkit end + this.n.a(ichunkaccess.getPos()); + if (save) { // CraftBukkit +-- +2.21.0 + diff --git a/Spigot-Server-Patches/0265-Configurable-Alternative-LootPool-Luck-Formula.patch b/Spigot-Server-Patches/0265-Configurable-Alternative-LootPool-Luck-Formula.patch deleted file mode 100644 index b6a1b43f8f..0000000000 --- a/Spigot-Server-Patches/0265-Configurable-Alternative-LootPool-Luck-Formula.patch +++ /dev/null @@ -1,108 +0,0 @@ -From ca534128e22e65b35817572014741051107a190f Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Fri, 15 Jun 2018 00:30:32 -0400 -Subject: [PATCH] Configurable Alternative LootPool Luck Formula - -Rewrites the Vanilla luck application formula so that luck can be -applied to items that do not have any quality defined. - -See: https://luckformula.emc.gs for data and details ------------ - -The rough summary is: -My goal was that in a pool, when luck was applied, the pool -rebalances so the percentages for bigger items is -lowered and smaller items is boosted. - -Do this by boosting and then reducing the weight value, -so that larger numbers are penalized more than smaller numbers. -resulting in a larger reduction of entries for more common -items than the reduction on small weights, -giving smaller weights more of a chance - ------------ - -This work kind of obsoletes quality, but quality would be useful -for 2 items with same weight that you want luck to impact -in varying directions. - -Fishing still falls into that as the weights are closer, so luck -will invalidate junk more. - -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 ---- a/src/main/java/com/destroystokyo/paper/PaperConfig.java -+++ b/src/main/java/com/destroystokyo/paper/PaperConfig.java -@@ -300,4 +300,12 @@ public class PaperConfig { - "such as inventories, experience points, advancements and the like will not be saved when they log out."); - } - } -+ -+ public static boolean useAlternativeLuckFormula = false; -+ private static void useAlternativeLuckFormula() { -+ useAlternativeLuckFormula = getBoolean("settings.use-alternative-luck-formula", false); -+ if (useAlternativeLuckFormula) { -+ Bukkit.getLogger().log(Level.INFO, "Using Aikar's Alternative Luck Formula to apply Luck attribute to all loot pool calculations. See https://luckformula.emc.gs"); -+ } -+ } - } -diff --git a/src/main/java/net/minecraft/server/LootSelectorEntry.java b/src/main/java/net/minecraft/server/LootSelectorEntry.java -index 3e313bba7c..80f9f9a252 100644 ---- a/src/main/java/net/minecraft/server/LootSelectorEntry.java -+++ b/src/main/java/net/minecraft/server/LootSelectorEntry.java -@@ -14,8 +14,8 @@ import java.util.Random; - - public abstract class LootSelectorEntry { - -- 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 LootSelectorEntry(int i, int j, LootItemCondition[] alootitemcondition) { -@@ -25,8 +25,34 @@ public abstract class LootSelectorEntry { - } - - 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) { -+ 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); - --- -2.21.0 - diff --git a/Spigot-Server-Patches/0296-Optimize-RegistryID.c.patch b/Spigot-Server-Patches/0265-Optimize-RegistryID.c.patch similarity index 83% rename from Spigot-Server-Patches/0296-Optimize-RegistryID.c.patch rename to Spigot-Server-Patches/0265-Optimize-RegistryID.c.patch index f61f8d6d68..580d8a50fa 100644 --- a/Spigot-Server-Patches/0296-Optimize-RegistryID.c.patch +++ b/Spigot-Server-Patches/0265-Optimize-RegistryID.c.patch @@ -1,4 +1,4 @@ -From 82c0f3c7cdd722722ee6bfd3047ecc52fab78026 Mon Sep 17 00:00:00 2001 +From 6d8bc880e02369cc0c7c8db23895c3c8c3e1459b Mon Sep 17 00:00:00 2001 From: Andrew Steinborn Date: Mon, 23 Jul 2018 13:08:19 -0400 Subject: [PATCH] Optimize RegistryID.c() @@ -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 @@ -14,12 +14,14 @@ public class RegistryID implements Registry { @@ -24,7 +24,7 @@ index 5a5c464ea1..37641fa865 100644 } public int getId(@Nullable K k0) { -@@ -43,9 +45,14 @@ public class RegistryID implements Registry { +@@ -44,9 +46,14 @@ public class RegistryID implements Registry { } private int c() { @@ -39,7 +39,7 @@ index 5a5c464ea1..37641fa865 100644 return this.e; } -@@ -59,6 +66,7 @@ public class RegistryID implements Registry { +@@ -60,6 +67,7 @@ public class RegistryID implements Registry { this.d = (K[]) (new Object[i]); // Paper - decompile fix this.e = 0; this.f = 0; @@ -47,7 +47,7 @@ index 5a5c464ea1..37641fa865 100644 for (int j = 0; j < ak.length; ++j) { if (ak[j] != null) { -@@ -84,6 +92,7 @@ public class RegistryID implements Registry { +@@ -85,6 +93,7 @@ public class RegistryID implements Registry { this.b[k] = k0; this.c[k] = i; this.d[i] = k0; @@ -55,7 +55,7 @@ index 5a5c464ea1..37641fa865 100644 ++this.f; if (i == this.e) { ++this.e; -@@ -148,6 +157,7 @@ public class RegistryID implements Registry { +@@ -149,6 +158,7 @@ public class RegistryID implements Registry { Arrays.fill(this.d, (Object) null); this.e = 0; this.f = 0; diff --git a/Spigot-Server-Patches/0297-Option-to-prevent-armor-stands-from-doing-entity-loo.patch b/Spigot-Server-Patches/0266-Option-to-prevent-armor-stands-from-doing-entity-loo.patch similarity index 84% rename from Spigot-Server-Patches/0297-Option-to-prevent-armor-stands-from-doing-entity-loo.patch rename to Spigot-Server-Patches/0266-Option-to-prevent-armor-stands-from-doing-entity-loo.patch index e3dd2f193c..7eed10d0ef 100644 --- a/Spigot-Server-Patches/0297-Option-to-prevent-armor-stands-from-doing-entity-loo.patch +++ b/Spigot-Server-Patches/0266-Option-to-prevent-armor-stands-from-doing-entity-loo.patch @@ -1,14 +1,14 @@ -From 6244aa55134ca674298f84bd72c07d62cc31a54d Mon Sep 17 00:00:00 2001 +From fb75e9482864768f1f26db3e016ac518ce57e478 Mon Sep 17 00:00:00 2001 From: Hugo Manrique Date: Mon, 23 Jul 2018 12:57:39 +0200 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 -@@ -375,6 +375,11 @@ public class PaperWorldConfig { +@@ -326,6 +326,11 @@ 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 -@@ -1539,6 +1539,14 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc - } +@@ -866,6 +866,14 @@ 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/0270-PlayerReadyArrowEvent.patch b/Spigot-Server-Patches/0270-PlayerReadyArrowEvent.patch deleted file mode 100644 index 02d1dbd627..0000000000 --- a/Spigot-Server-Patches/0270-PlayerReadyArrowEvent.patch +++ /dev/null @@ -1,80 +0,0 @@ -From 279fcab87ebe9244d2907f4554af9cd125dcb293 Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Mon, 18 Jun 2018 01:12:53 -0400 -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 -@@ -1,5 +1,7 @@ - package net.minecraft.server; - -+import org.bukkit.craftbukkit.inventory.CraftItemStack; -+ - public class ItemBow extends Item { - - public ItemBow(Item.Info item_info) { -@@ -16,16 +18,16 @@ public class ItemBow extends Item { - // CraftBukkit end - } - -- 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; - } - } -@@ -34,15 +36,23 @@ 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) || -+ new com.destroystokyo.paper.event.player.PlayerReadyArrowEvent( -+ ((EntityPlayer) player).getBukkitEntity(), -+ CraftItemStack.asCraftMirror(bow), -+ CraftItemStack.asCraftMirror(itemstack) -+ ).callEvent()); -+ // Paper end - } - - 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()) { -@@ -141,7 +151,7 @@ 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); --- -2.21.0 - diff --git a/Spigot-Server-Patches/0272-Implement-EntityKnockbackByEntityEvent.patch b/Spigot-Server-Patches/0272-Implement-EntityKnockbackByEntityEvent.patch deleted file mode 100644 index 933bba8605..0000000000 --- a/Spigot-Server-Patches/0272-Implement-EntityKnockbackByEntityEvent.patch +++ /dev/null @@ -1,46 +0,0 @@ -From b554c6c2f5953c364a8872108a0f6fd331225c31 Mon Sep 17 00:00:00 2001 -From: Brokkonaut -Date: Mon, 18 Jun 2018 15:46:23 +0200 -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 ---- a/src/main/java/net/minecraft/server/EntityLiving.java -+++ b/src/main/java/net/minecraft/server/EntityLiving.java -@@ -1251,6 +1251,12 @@ public abstract class EntityLiving extends Entity { - this.impulse = true; - float f1 = MathHelper.sqrt(d0 * d0 + d1 * d1); - -+ // Paper start - preserve old velocity -+ double oldMotX = this.motX; -+ double oldMotY = this.motY; -+ double oldMotZ = this.motZ; -+ // Paper end -+ - this.motX /= 2.0D; - this.motZ /= 2.0D; - this.motX -= d0 / (double) f1 * (double) f; -@@ -1263,6 +1269,18 @@ 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); -+ // Restore old velocity to be able to access it in the event -+ this.motX = oldMotX; -+ this.motY = oldMotY; -+ this.motZ = oldMotZ; -+ 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(); -+ } -+ // Paper end - } - } - --- -2.21.0 - diff --git a/Spigot-Server-Patches/0279-Avoid-Chunk-Lookups-for-Entity-TileEntity-Current-Ch.patch b/Spigot-Server-Patches/0279-Avoid-Chunk-Lookups-for-Entity-TileEntity-Current-Ch.patch deleted file mode 100644 index 885f49fd26..0000000000 --- a/Spigot-Server-Patches/0279-Avoid-Chunk-Lookups-for-Entity-TileEntity-Current-Ch.patch +++ /dev/null @@ -1,79 +0,0 @@ -From bc5d4dcd27553b19ebbd6f37ba6281fc26c5f2be Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Wed, 4 Jul 2018 03:39:51 -0400 -Subject: [PATCH] Avoid Chunk Lookups for Entity/TileEntity Current Chunk - -In many places where we simply want the current chunk the entity -is in, instead of doing a hashmap lookup for it, we now have access -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 ---- a/src/main/java/net/minecraft/server/World.java -+++ b/src/main/java/net/minecraft/server/World.java -@@ -1110,9 +1110,8 @@ 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); -@@ -1196,9 +1195,8 @@ 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 -@@ -1262,9 +1260,10 @@ 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 -@@ -1309,7 +1308,7 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc - 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; -@@ -1345,8 +1344,11 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc - tilesThisCycle--; - this.tileEntityListTick.remove(tileTickPosition--); - //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 - } - } - } --- -2.21.0 - diff --git a/Spigot-Server-Patches/0280-Configurable-Bed-Search-Radius.patch b/Spigot-Server-Patches/0280-Configurable-Bed-Search-Radius.patch deleted file mode 100644 index 015b2448c5..0000000000 --- a/Spigot-Server-Patches/0280-Configurable-Bed-Search-Radius.patch +++ /dev/null @@ -1,105 +0,0 @@ -From f1cf963f3f14757f6fb2f07fe26fdd50e8201883 Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Wed, 4 Jul 2018 15:22:06 -0400 -Subject: [PATCH] Configurable Bed Search Radius - -Allows you to increase how far to check for a safe place to respawn -a player near their bed, allowing a better chance to respawn the -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 ---- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java -+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java -@@ -452,4 +452,15 @@ public class PaperWorldConfig { - private void scanForLegacyEnderDragon() { - scanForLegacyEnderDragon = getBoolean("game-mechanics.scan-for-legacy-ender-dragon", true); - } -+ -+ public int bedSearchRadius = 1; -+ private void bedSearchRadius() { -+ bedSearchRadius = getInt("bed-search-radius", 1); -+ if (bedSearchRadius < 1) { -+ bedSearchRadius = 1; -+ } -+ if (bedSearchRadius > 1) { -+ log("Bed Search Radius: " + bedSearchRadius); -+ } -+ } - } -diff --git a/src/main/java/net/minecraft/server/BlockBed.java b/src/main/java/net/minecraft/server/BlockBed.java -index 06f627002c..d81a2db6cd 100644 ---- a/src/main/java/net/minecraft/server/BlockBed.java -+++ b/src/main/java/net/minecraft/server/BlockBed.java -@@ -187,6 +187,52 @@ 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; -+ int radius = world.paperConfig.bedSearchRadius; -+ 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; -+ } -+ } -+ pos = blockposition.add(-x, y, -z); -+ if (isSafeRespawn(world, pos)) { -+ if (i-- <= 0) { -+ return pos; -+ } -+ } -+ -+ pos = blockposition.add(enumdirection.getAdjacentX() + x, y, enumdirection.getAdjacentZ() + z); -+ if (isSafeRespawn(world, pos)) { -+ if (i-- <= 0) { -+ return pos; -+ } -+ } -+ -+ pos = blockposition.add(enumdirection.getAdjacentX() - x, y, enumdirection.getAdjacentZ() - z); -+ if (isSafeRespawn(world, pos)) { -+ if (i-- <= 0) { -+ return pos; -+ } -+ } -+ } -+ if (x < r) { -+ x++; -+ } else { -+ z--; -+ } -+ } -+ } -+ -+ return null; /* // Paper comment out - int j = blockposition.getX(); - int k = blockposition.getY(); - int l = blockposition.getZ(); -@@ -212,9 +258,12 @@ public class BlockBed extends BlockFacingHorizontal implements ITileEntity { - } - } - -- return null; -+ return null;*/ // Paper - } - -+ 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(); - } --- -2.21.0 - diff --git a/Spigot-Server-Patches/0283-Don-t-change-the-Entity-Random-seed-for-squids.patch b/Spigot-Server-Patches/0283-Don-t-change-the-Entity-Random-seed-for-squids.patch deleted file mode 100644 index 39cc98409a..0000000000 --- a/Spigot-Server-Patches/0283-Don-t-change-the-Entity-Random-seed-for-squids.patch +++ /dev/null @@ -1,22 +0,0 @@ -From d4d2715633e038dca7705ed0ecbda6daff2dfae4 Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Thu, 19 Jul 2018 01:05:00 -0400 -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 ---- a/src/main/java/net/minecraft/server/EntitySquid.java -+++ b/src/main/java/net/minecraft/server/EntitySquid.java -@@ -22,7 +22,7 @@ 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; - } - --- -2.21.0 - diff --git a/Spigot-Server-Patches/0284-Re-add-vanilla-entity-warnings-for-duplicates.patch b/Spigot-Server-Patches/0284-Re-add-vanilla-entity-warnings-for-duplicates.patch deleted file mode 100644 index 4f5ad6712b..0000000000 --- a/Spigot-Server-Patches/0284-Re-add-vanilla-entity-warnings-for-duplicates.patch +++ /dev/null @@ -1,26 +0,0 @@ -From c0b99f356c30002ae8fb2536b5e0b78a7b8bfc4c Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Thu, 19 Jul 2018 01:08:05 -0400 -Subject: [PATCH] Re-add vanilla entity warnings for duplicates - -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 ---- a/src/main/java/net/minecraft/server/WorldServer.java -+++ b/src/main/java/net/minecraft/server/WorldServer.java -@@ -963,7 +963,8 @@ 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; - } - --- -2.21.0 - diff --git a/Spigot-Server-Patches/0289-Add-Debug-Entities-option-to-debug-dupe-uuid-issues.patch b/Spigot-Server-Patches/0289-Add-Debug-Entities-option-to-debug-dupe-uuid-issues.patch deleted file mode 100644 index 8223ee3d57..0000000000 --- a/Spigot-Server-Patches/0289-Add-Debug-Entities-option-to-debug-dupe-uuid-issues.patch +++ /dev/null @@ -1,107 +0,0 @@ -From 0a837c25363d2b05d8a03aa1f80adf0502ca126c Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Sat, 21 Jul 2018 08:25:40 -0400 -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 ---- a/src/main/java/net/minecraft/server/Entity.java -+++ b/src/main/java/net/minecraft/server/Entity.java -@@ -71,6 +71,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke - protected CraftEntity bukkitEntity; - - 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 ---- a/src/main/java/net/minecraft/server/World.java -+++ b/src/main/java/net/minecraft/server/World.java -@@ -110,6 +110,7 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc - public boolean pvpMode; - public boolean keepSpawnInMemory = true; - public 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 ---- a/src/main/java/net/minecraft/server/WorldServer.java -+++ b/src/main/java/net/minecraft/server/WorldServer.java -@@ -51,6 +51,9 @@ public class WorldServer extends World implements IAsyncTaskHandler { - - // CraftBukkit start - public final DimensionManager dimension; -+ 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) { -@@ -951,7 +954,12 @@ public class WorldServer extends World implements IAsyncTaskHandler { - - private boolean j(Entity entity) { - 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 - return false; - } else { - UUID uuid = entity.getUniqueID(); -@@ -963,8 +971,15 @@ 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; - } - -@@ -981,7 +996,25 @@ 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); -+ 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(); -+ } -+ } -+ // Paper end - Entity[] aentity = entity.bi(); - - if (aentity != null) { --- -2.21.0 - diff --git a/Spigot-Server-Patches/0295-Don-t-save-Proto-Chunks.patch b/Spigot-Server-Patches/0295-Don-t-save-Proto-Chunks.patch deleted file mode 100644 index 190d00d477..0000000000 --- a/Spigot-Server-Patches/0295-Don-t-save-Proto-Chunks.patch +++ /dev/null @@ -1,45 +0,0 @@ -From 745f1a69fc7480310f06db300dd9b112b92ceb00 Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Sun, 22 Jul 2018 21:21:41 -0400 -Subject: [PATCH] Don't save Proto Chunks - -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 -@@ -304,6 +304,7 @@ public class ChunkRegionLoader implements IChunkLoader, IAsyncChunkSaver { - } - - 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 -@@ -21,7 +21,7 @@ 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 - } - }; - -@@ -85,6 +85,7 @@ public class ChunkTaskScheduler extends Scheduler