From f0a93e845b52229b1764e000fcadaeada50f6f0d Mon Sep 17 00:00:00 2001 From: tr7zw Date: Sat, 27 Jun 2020 15:45:01 +0200 Subject: [PATCH] Remove old patches, get add enough patches so the server starts to build again --- patches/server-old/0001-Modify-POM.patch | 83 - .../server-old/0003-EMC-MC-Log-utils.patch | 96 - .../0004-EMC-PlayerUseItem-Event.patch | 168 -- patches/server-old/0005-EMC-Anvil-Event.patch | 45 - .../0006-EMC-ArrowHitBlock-Event.patch | 24 - .../0007-EMC-MonsterEggSpawn-Event.patch | 69 - .../0008-EMC-MovedTooQuickly-event.patch | 29 - .../0009-EMC-Legacy-Data-Converter.patch | 2674 ----------------- .../server-old/0010-EMC-Disable-Snooper.patch | 31 - .../0011-EMC-Add-EntityEffectAddedEvent.patch | 33 - ...Disable-UUID-conversion-Already-done.patch | 38 - ...13-EMC-LivingEntityArmorProtectEvent.patch | 39 - .../0014-EMC-EntityKnockbackEvent.patch | 61 - .../0015-EMC-ZombieReinforcementEvent.patch | 37 - .../server-old/0016-EMC-Accept-the-EULA.patch | 25 - .../0017-EMC-Ignore-statistics-warnings.patch | 35 - .../0018-EMC-ServerReloadEvent.patch | 24 - .../0019-EMC-SnowmanThrowSnowballEvent.patch | 50 - ...Reset-Ender-Crystals-on-Dragon-Spawn.patch | 32 - .../0021-EMC-EntityAttackedEntityEvent.patch | 33 - .../0022-EMC-Human-getAttackPct.patch | 46 - .../0023-EMC-Tweak-Explosions.patch | 50 - ...MC-SpawnEggMeta-setSpawnedEntity-API.patch | 66 - ...rgetEvent-and-remove-target-for-canc.patch | 42 - ...it.createInventory-with-type-LECTERN.patch | 148 - ...-EMC-Add-the-PlayerThrowTridentEvent.patch | 33 - ...EMC-Add-the-BlockHarvestBeehiveEvent.patch | 36 - ...ted-server-showing-in-ping-before-se.patch | 25 - ...fig-yapfa-command-and-basic-settings.patch | 461 --- .../0034-Kill-the-vanilla-GameProfiler.patch | 93 - .../server-old/0035-Remove-Stream-usage.patch | 589 ---- ...nly-players-to-have-collisions-with-.patch | 111 - ...llow-to-change-the-piston-push-limit.patch | 59 - .../0038-Add-NBT-API-as-first-class-lib.patch | 27 - .../0039-Player-saving-async-FileIO.patch | 370 --- ...r-method-to-call-itself-more-than-on.patch | 97 - ...ble-I-O-operation-on-load-player-fil.patch | 36 - .../0042-Akarin-Save-json-list-async.patch | 40 - ...imize-door-interact-with-pathfinding.patch | 170 -- ...-Fix-Always-increment-arrow-despawn-.patch | 42 - ...-Skip-events-if-there-s-no-listeners.patch | 32 - .../0046-Purpur-Add-more-timings-timers.patch | 218 -- .../0047-Modify-default-configs.patch | 39 - .../0048-lithium-MixinDirection.patch | 60 - .../server-old/0049-lithium-MixinBox.patch | 59 - .../server-old/0050-lithium-enum_values.patch | 80 - ...0051-lithium-MixinAxisCycleDirection.patch | 109 - .../0052-lithium-MixinGoalSelector.patch | 39 - .../0053-lithium-MixinLandPathNodeMaker.patch | 116 - .../server-old/0054-lithium-MixinBiome.patch | 211 -- ...0055-lithium-MixinTypeFilterableList.patch | 117 - .../0056-Item-stuck-sleep-config.patch | 41 - .../0057-Option-for-simpler-Villagers.patch | 181 -- ...ize-furnance-fuel-and-recipe-lookups.patch | 77 - .../0059-Optimize-Hopper-logic.patch | 329 -- .../0002-Brandings.patch | 14 +- ...003-Don-t-save-Fireworks-and-Arrows.patch} | 8 +- .../0004-Add-GameProfileLookupEvent.patch} | 26 +- .../0005-Add-getLastTickMs-api.patch} | 32 +- 59 files changed, 40 insertions(+), 7915 deletions(-) delete mode 100644 patches/server-old/0001-Modify-POM.patch delete mode 100644 patches/server-old/0003-EMC-MC-Log-utils.patch delete mode 100644 patches/server-old/0004-EMC-PlayerUseItem-Event.patch delete mode 100644 patches/server-old/0005-EMC-Anvil-Event.patch delete mode 100644 patches/server-old/0006-EMC-ArrowHitBlock-Event.patch delete mode 100644 patches/server-old/0007-EMC-MonsterEggSpawn-Event.patch delete mode 100644 patches/server-old/0008-EMC-MovedTooQuickly-event.patch delete mode 100644 patches/server-old/0009-EMC-Legacy-Data-Converter.patch delete mode 100644 patches/server-old/0010-EMC-Disable-Snooper.patch delete mode 100644 patches/server-old/0011-EMC-Add-EntityEffectAddedEvent.patch delete mode 100644 patches/server-old/0012-EMC-Disable-UUID-conversion-Already-done.patch delete mode 100644 patches/server-old/0013-EMC-LivingEntityArmorProtectEvent.patch delete mode 100644 patches/server-old/0014-EMC-EntityKnockbackEvent.patch delete mode 100644 patches/server-old/0015-EMC-ZombieReinforcementEvent.patch delete mode 100644 patches/server-old/0016-EMC-Accept-the-EULA.patch delete mode 100644 patches/server-old/0017-EMC-Ignore-statistics-warnings.patch delete mode 100644 patches/server-old/0018-EMC-ServerReloadEvent.patch delete mode 100644 patches/server-old/0019-EMC-SnowmanThrowSnowballEvent.patch delete mode 100644 patches/server-old/0020-EMC-Reset-Ender-Crystals-on-Dragon-Spawn.patch delete mode 100644 patches/server-old/0021-EMC-EntityAttackedEntityEvent.patch delete mode 100644 patches/server-old/0022-EMC-Human-getAttackPct.patch delete mode 100644 patches/server-old/0023-EMC-Tweak-Explosions.patch delete mode 100644 patches/server-old/0024-EMC-SpawnEggMeta-setSpawnedEntity-API.patch delete mode 100644 patches/server-old/0025-EMC-ConduitNewTargetEvent-and-remove-target-for-canc.patch delete mode 100644 patches/server-old/0026-EMC-Fix-Bukkit.createInventory-with-type-LECTERN.patch delete mode 100644 patches/server-old/0027-EMC-Add-the-PlayerThrowTridentEvent.patch delete mode 100644 patches/server-old/0028-EMC-Add-the-BlockHarvestBeehiveEvent.patch delete mode 100644 patches/server-old/0029-Purpur-Fix-outdated-server-showing-in-ping-before-se.patch delete mode 100644 patches/server-old/0033-Add-config-yapfa-command-and-basic-settings.patch delete mode 100644 patches/server-old/0034-Kill-the-vanilla-GameProfiler.patch delete mode 100644 patches/server-old/0035-Remove-Stream-usage.patch delete mode 100644 patches/server-old/0036-Add-option-for-only-players-to-have-collisions-with-.patch delete mode 100644 patches/server-old/0037-Allow-to-change-the-piston-push-limit.patch delete mode 100644 patches/server-old/0038-Add-NBT-API-as-first-class-lib.patch delete mode 100644 patches/server-old/0039-Player-saving-async-FileIO.patch delete mode 100644 patches/server-old/0040-Stop-a-pathfinder-method-to-call-itself-more-than-on.patch delete mode 100644 patches/server-old/0041-Akarin-Avoid-double-I-O-operation-on-load-player-fil.patch delete mode 100644 patches/server-old/0042-Akarin-Save-json-list-async.patch delete mode 100644 patches/server-old/0043-Akarin-Optimize-door-interact-with-pathfinding.patch delete mode 100644 patches/server-old/0044-Purpur-MC-125757-Fix-Always-increment-arrow-despawn-.patch delete mode 100644 patches/server-old/0045-Purpur-Skip-events-if-there-s-no-listeners.patch delete mode 100644 patches/server-old/0046-Purpur-Add-more-timings-timers.patch delete mode 100644 patches/server-old/0047-Modify-default-configs.patch delete mode 100644 patches/server-old/0048-lithium-MixinDirection.patch delete mode 100644 patches/server-old/0049-lithium-MixinBox.patch delete mode 100644 patches/server-old/0050-lithium-enum_values.patch delete mode 100644 patches/server-old/0051-lithium-MixinAxisCycleDirection.patch delete mode 100644 patches/server-old/0052-lithium-MixinGoalSelector.patch delete mode 100644 patches/server-old/0053-lithium-MixinLandPathNodeMaker.patch delete mode 100644 patches/server-old/0054-lithium-MixinBiome.patch delete mode 100644 patches/server-old/0055-lithium-MixinTypeFilterableList.patch delete mode 100644 patches/server-old/0056-Item-stuck-sleep-config.patch delete mode 100644 patches/server-old/0057-Option-for-simpler-Villagers.patch delete mode 100644 patches/server-old/0058-Heavily-optimize-furnance-fuel-and-recipe-lookups.patch delete mode 100644 patches/server-old/0059-Optimize-Hopper-logic.patch rename patches/{server-old => server}/0002-Brandings.patch (93%) rename patches/{server-old/0030-Don-t-save-Fireworks-and-Arrows.patch => server/0003-Don-t-save-Fireworks-and-Arrows.patch} (79%) rename patches/{server-old/0031-Add-GameProfileLookupEvent.patch => server/0004-Add-GameProfileLookupEvent.patch} (81%) rename patches/{server-old/0032-Add-getLastTickMs-api.patch => server/0005-Add-getLastTickMs-api.patch} (75%) diff --git a/patches/server-old/0001-Modify-POM.patch b/patches/server-old/0001-Modify-POM.patch deleted file mode 100644 index 8d3bd3ca..00000000 --- a/patches/server-old/0001-Modify-POM.patch +++ /dev/null @@ -1,83 +0,0 @@ -From 12c6f0850f54b35a108041a4be02a26df06d5a82 Mon Sep 17 00:00:00 2001 -From: tr7zw -Date: Wed, 26 Feb 2020 17:08:07 +0100 -Subject: [PATCH] Modify POM - ---- - pom.xml | 25 +++++++++++++++---------- - 1 file changed, 15 insertions(+), 10 deletions(-) - -diff --git a/pom.xml b/pom.xml -index ba3d10a1b7..f2cc703fe6 100644 ---- a/pom.xml -+++ b/pom.xml -@@ -1,11 +1,12 @@ - - 4.0.0 -- tuinity -+ yapfa - jar - 1.15.2-R0.1-SNAPSHOT -- Tuinity-Server -- https://github.com/Spottedleaf/Tuinity -+ YAPFA -+ https://github.com/tr7zw/YAPFA -+ - - - UTF-8 -@@ -17,16 +18,16 @@ - - - -- com.tuinity -- tuinity-parent -+ de.tr7zw.yapfa -+ yapfa-parent - dev-SNAPSHOT - ../pom.xml - - - - -- com.tuinity -- tuinity-api -+ de.tr7zw.yapfa -+ yapfa-api - ${project.version} - compile - -@@ -148,6 +149,10 @@ - - Please see https://www.spigotmc.org/go/maven for more information. - --> -+ -+ destroystokyo-repo -+ https://papermc.io/repo/repository/maven-public/ -+ - - spigotmc-public - https://hub.spigotmc.org/nexus/content/groups/public/ -@@ -163,15 +168,15 @@ - - - -- tuinity-${minecraft.version} -- install -+ yapfa-${minecraft.version} -+ clean install - - - com.lukegb.mojo - gitdescribe-maven-plugin - 1.3 - -- git-Tuinity- -+ git-YAPFA- - .. - - --- -2.25.1.windows.1 - diff --git a/patches/server-old/0003-EMC-MC-Log-utils.patch b/patches/server-old/0003-EMC-MC-Log-utils.patch deleted file mode 100644 index da7ba2d4..00000000 --- a/patches/server-old/0003-EMC-MC-Log-utils.patch +++ /dev/null @@ -1,96 +0,0 @@ -From 02a0c772887e055ffacd10374480110a073c285b Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Sat, 10 Dec 2016 14:00:25 -0500 -Subject: [PATCH] EMC MC Log utils - ---- - src/main/java/net/minecraft/server/MCLog.java | 77 +++++++++++++++++++ - 1 file changed, 77 insertions(+) - create mode 100644 src/main/java/net/minecraft/server/MCLog.java - -diff --git a/src/main/java/net/minecraft/server/MCLog.java b/src/main/java/net/minecraft/server/MCLog.java -new file mode 100644 -index 00000000..bf28f00d ---- /dev/null -+++ b/src/main/java/net/minecraft/server/MCLog.java -@@ -0,0 +1,77 @@ -+/* -+ * Copyright (c) 2016 Starlis LLC / Daniel Ennis (Aikar) - MIT License -+ * -+ * Permission is hereby granted, free of charge, to any person obtaining -+ * a copy of this software and associated documentation files (the -+ * "Software"), to deal in the Software without restriction, including -+ * without limitation the rights to use, copy, modify, merge, publish, -+ * distribute, sublicense, and/or sell copies of the Software, and to -+ * permit persons to whom the Software is furnished to do so, subject to -+ * the following conditions: -+ * -+ * The above copyright notice and this permission notice shall be -+ * included in all copies or substantial portions of the Software. -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -+ */ -+ -+package net.minecraft.server; -+ -+import org.apache.commons.lang.exception.ExceptionUtils; -+ -+import java.util.logging.Logger; -+import java.util.regex.Pattern; -+ -+public class MCLog { -+ private static final Logger LOGGER = Logger.getLogger("NMS"); -+ private static final Pattern NEWLINE = Pattern.compile("\n"); -+ -+ private MCLog() {} -+ -+ -+ public static void log(String message) { -+ info(message); -+ } -+ -+ -+ public static void info(String message) { -+ for (String s : NEWLINE.split(message)) { -+ LOGGER.info(s); -+ } -+ } -+ -+ public static void warn(String message) { -+ for (String s : NEWLINE.split(message)) { -+ LOGGER.warning(s); -+ } -+ } -+ -+ public static void severe(String message) { -+ for (String s : NEWLINE.split(message)) { -+ LOGGER.severe(s); -+ } -+ } -+ -+ public static void exception(String msg) { -+ exception(new Throwable(msg)); -+ } -+ -+ public static void exception(Throwable e) { -+ exception(e.getMessage(), e); -+ } -+ -+ public static void exception(String msg, Throwable e) { -+ if (msg != null) { -+ severe(msg); -+ } -+ severe(ExceptionUtils.getFullStackTrace(e)); -+ } -+ -+ -+} --- -2.25.1.windows.1 - diff --git a/patches/server-old/0004-EMC-PlayerUseItem-Event.patch b/patches/server-old/0004-EMC-PlayerUseItem-Event.patch deleted file mode 100644 index 26a5e741..00000000 --- a/patches/server-old/0004-EMC-PlayerUseItem-Event.patch +++ /dev/null @@ -1,168 +0,0 @@ -From 8455f7508c6c62acf1a2d42494a9a8eccfb1cf9e Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Sat, 22 Dec 2012 00:35:15 -0500 -Subject: [PATCH] EMC PlayerUseItem Event - -This lets us control when an item is consumed and change the item. ---- - .../net/minecraft/server/EntityLiving.java | 2 +- - .../server/PlayerInteractManager.java | 90 ++++++++++++++++--- - 2 files changed, 78 insertions(+), 14 deletions(-) - -diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java -index 3fc2360a10..5ad0aacf01 100644 ---- a/src/main/java/net/minecraft/server/EntityLiving.java -+++ b/src/main/java/net/minecraft/server/EntityLiving.java -@@ -1912,7 +1912,7 @@ public abstract class EntityLiving extends Entity { - } - } - -- public void a(EnumHand enumhand, ItemStack itemstack) { -+ public void setHand(EnumHand hand, ItemStack item) { a(hand, item); } public void a(EnumHand enumhand, ItemStack itemstack) { // Paper - OBFHELPER - if (enumhand == EnumHand.MAIN_HAND) { - this.setSlot(EnumItemSlot.MAINHAND, itemstack); - } else { -diff --git a/src/main/java/net/minecraft/server/PlayerInteractManager.java b/src/main/java/net/minecraft/server/PlayerInteractManager.java -index 272c1f0eaf..76a8d94229 100644 ---- a/src/main/java/net/minecraft/server/PlayerInteractManager.java -+++ b/src/main/java/net/minecraft/server/PlayerInteractManager.java -@@ -432,6 +432,15 @@ public class PlayerInteractManager { - } - - public EnumInteractionResult a(EntityHuman entityhuman, World world, ItemStack itemstack, EnumHand enumhand) { -+ // Paper start - Allow control over if item should be consumed or not. -+ org.bukkit.inventory.EquipmentSlot bukkitHand = enumhand == EnumHand.MAIN_HAND ? org.bukkit.inventory.EquipmentSlot.HAND : org.bukkit.inventory.EquipmentSlot.OFF_HAND; -+ org.bukkit.craftbukkit.inventory.CraftItemStack craftitem = org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemstack); -+ org.bukkit.craftbukkit.inventory.CraftItemStack origItemClone = craftitem.clone(); -+ com.empireminecraft.customevents.PlayerUseItemEvent event = new com.empireminecraft.customevents.PlayerUseItemEvent(player.getBukkitEntity(), craftitem, bukkitHand); -+ if (!event.callEvent()) { -+ return EnumInteractionResult.FAIL; -+ } -+ // Paper end - if (this.gamemode == EnumGamemode.SPECTATOR) { - return EnumInteractionResult.PASS; - } else if (entityhuman.getCooldownTracker().hasCooldown(itemstack.getItem())) { -@@ -439,27 +448,53 @@ public class PlayerInteractManager { - } else { - int i = itemstack.getCount(); - int j = itemstack.getDamage(); -+ // Paper start -+ ItemStack orig = itemstack; -+ if (event.getTempItem() != null) { -+ itemstack = org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(event.getTempItem()); -+ entityhuman.setHand(enumhand, itemstack); -+ } -+ // Paper end - InteractionResultWrapper interactionresultwrapper = itemstack.a(world, entityhuman, enumhand); -+ - ItemStack itemstack1 = (ItemStack) interactionresultwrapper.b(); -+ // Paper start - change order and redo lots of things here. -+ if (event.getTempItem() != null) { -+ // restore original item -+ entityhuman.setHand(enumhand, itemstack1 = orig); -+ } - -- if (itemstack1 == itemstack && itemstack1.getCount() == i && itemstack1.k() <= 0 && itemstack1.getDamage() == j) { -- return interactionresultwrapper.a(); -- } else if (interactionresultwrapper.a() == EnumInteractionResult.FAIL && itemstack1.k() > 0 && !entityhuman.isHandRaised()) { -+ boolean isSame = itemstack1 == itemstack && itemstack1.getCount() == i && itemstack1.k() <= 0 && itemstack1.getDamage() == j; -+ // This was just a short circuit, always run post use on success -+ if (interactionresultwrapper.a() == EnumInteractionResult.FAIL && itemstack1.k() > 0 && !entityhuman.isHandRaised()) { -+ // if fail, abort - this is vanilla - return interactionresultwrapper.a(); - } else { -- entityhuman.a(enumhand, itemstack1); -- if (this.isCreative()) { -+ if (!event.shouldConsumeItem() || this.isCreative()) { // Paper - add getConsumeItem - moved up - itemstack1.setCount(i); - if (itemstack1.e() && itemstack1.getDamage() != j) { - itemstack1.setDamage(j); - } - } -+ org.bukkit.inventory.ItemStack craftNew = org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemstack1); -+ com.destroystokyo.paper.event.player.PlayerPostUseItemEvent postUseItemEvent = new com.destroystokyo.paper.event.player.PlayerPostUseItemEvent(player.getBukkitEntity(), origItemClone, craftNew, bukkitHand); -+ postUseItemEvent.callEvent(); -+ -+ //noinspection ObjectEquality -+ if (craftNew != postUseItemEvent.getNewItem()) { -+ // Use a different new item instead. Not good to do if its a "Hold to use item" FYI! -+ itemstack1 = org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(postUseItemEvent.getNewItem()); -+ isSame = false; -+ } -+ entityhuman.a(enumhand, itemstack1); -+ // Paper end - - if (itemstack1.isEmpty()) { - entityhuman.a(enumhand, ItemStack.a); -+ isSame = false; // Paper - } - -- if (!entityhuman.isHandRaised()) { -+ if (itemstack1.isEmpty() || (!isSame && !entityhuman.isHandRaised())) { // Paper - add !isSame - ((EntityPlayer) entityhuman).updateInventory(entityhuman.defaultContainer); - } - -@@ -473,6 +508,7 @@ public class PlayerInteractManager { - public boolean firedInteract = false; - public EnumInteractionResult a(EntityHuman entityhuman, World world, ItemStack itemstack, EnumHand enumhand, MovingObjectPositionBlock movingobjectpositionblock) { - BlockPosition blockposition = movingobjectpositionblock.getBlockPosition(); -+ org.bukkit.util.Vector hitVector = new org.bukkit.util.Vector(movingobjectpositionblock.getPos().x, movingobjectpositionblock.getPos().y, movingobjectpositionblock.getPos().z); // Paper - Ensure last 3 floats line up as vector params - IBlockData iblockdata = world.getType(blockposition); - EnumInteractionResult enuminteractionresult = EnumInteractionResult.PASS; - boolean cancelledBlock = false; -@@ -540,17 +576,45 @@ public class PlayerInteractManager { - } - - if (!itemstack.isEmpty() && enuminteractionresult != EnumInteractionResult.SUCCESS && !interactResult) { // add !interactResult SPIGOT-764 -- ItemActionContext itemactioncontext = new ItemActionContext(entityhuman, enumhand, movingobjectpositionblock); -+ // Paper start - Allow control over if item should be consumed or not. -+ org.bukkit.inventory.EquipmentSlot bukkitHand = enumhand == EnumHand.MAIN_HAND ? org.bukkit.inventory.EquipmentSlot.HAND : org.bukkit.inventory.EquipmentSlot.OFF_HAND; -+ org.bukkit.craftbukkit.inventory.CraftItemStack craftitem = org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemstack); -+ com.empireminecraft.customevents.PlayerPlaceItemAtEvent eventPlace = new com.empireminecraft.customevents.PlayerPlaceItemAtEvent( -+ (org.bukkit.entity.Player) entityhuman.getBukkitEntity(), craftitem, -+ MCUtil.toLocation(world, blockposition), -+ org.bukkit.craftbukkit.block.CraftBlock.notchToBlockFace(movingobjectpositionblock.getDirection()), -+ hitVector, bukkitHand); -+ -+ if (!eventPlace.callEvent()) { -+ return EnumInteractionResult.FAIL; -+ } - -- if (this.isCreative()) { -- int i = itemstack.getCount(); -- enuminteractionresult = itemstack.placeItem(itemactioncontext, enumhand); -+ ItemStack orig = itemstack; -+ if (eventPlace.getTempItem() != null) { -+ itemstack = org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(eventPlace.getTempItem()); -+ entityhuman.setHand(enumhand, itemstack); -+ } -+ //replace entityhuman.b(enumhand) with itemstack -+ ItemActionContext itemactioncontext = new ItemActionContext(entityhuman, enumhand, movingobjectpositionblock); - -+ int i = itemstack.getCount(); -+ enuminteractionresult = itemstack.placeItem(itemactioncontext, enumhand); -+ if (eventPlace.getTempItem() != null) { -+ entityhuman.setHand(enumhand, itemstack = orig); -+ } -+ if (!eventPlace.getConsumeItem() || this.isCreative()) { - itemstack.setCount(i); -- return enuminteractionresult; -- } else { -- return itemstack.placeItem(itemactioncontext, enumhand); - } -+ if (enuminteractionresult != EnumInteractionResult.FAIL) { -+ com.destroystokyo.paper.event.player.PlayerPostPlaceItemAtEvent postUseItemEvent = -+ new com.destroystokyo.paper.event.player.PlayerPostPlaceItemAtEvent(player.getBukkitEntity(), craftitem, -+ MCUtil.toLocation(world, blockposition), -+ org.bukkit.craftbukkit.block.CraftBlock.notchToBlockFace(movingobjectpositionblock.getDirection()), -+ hitVector, bukkitHand); -+ postUseItemEvent.callEvent(); -+ } -+ return enuminteractionresult; -+ // Paper end - } - } - return enuminteractionresult; --- -2.25.1.windows.1 - diff --git a/patches/server-old/0005-EMC-Anvil-Event.patch b/patches/server-old/0005-EMC-Anvil-Event.patch deleted file mode 100644 index c7b6b4f1..00000000 --- a/patches/server-old/0005-EMC-Anvil-Event.patch +++ /dev/null @@ -1,45 +0,0 @@ -From 12d1be74c6892d67c0c4e134b3bceb7de7806e34 Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Mon, 31 Dec 2012 01:25:46 -0500 -Subject: [PATCH] EMC Anvil Event - -Fire an event for anvil usage, remove cap from server, send level to client ---- - .../java/net/minecraft/server/ContainerAnvil.java | 14 ++++++++++++++ - 1 file changed, 14 insertions(+) - -diff --git a/src/main/java/net/minecraft/server/ContainerAnvil.java b/src/main/java/net/minecraft/server/ContainerAnvil.java -index 286b930d..49c264b3 100644 ---- a/src/main/java/net/minecraft/server/ContainerAnvil.java -+++ b/src/main/java/net/minecraft/server/ContainerAnvil.java -@@ -7,6 +7,10 @@ import org.apache.logging.log4j.LogManager; - import org.apache.logging.log4j.Logger; - - // CraftBukkit start -+import com.empireminecraft.customevents.AnvilEvent; // EMC -+import org.bukkit.Bukkit; // EMC -+import org.bukkit.entity.Player; // EMC -+import org.bukkit.craftbukkit.inventory.CraftItemStack; // EMC - import org.bukkit.craftbukkit.inventory.CraftInventoryView; - // CraftBukkit end - -@@ -298,6 +302,16 @@ public class ContainerAnvil extends Container { - if (this.levelCost.get() >= maximumRepairCost && !this.player.abilities.canInstantlyBuild) { // CraftBukkit - itemstack1 = ItemStack.a; - } -+ // EMC start -+ AnvilEvent event = new AnvilEvent((Player) player.getBukkitEntity(), CraftItemStack.asBukkitCopy(itemstack), CraftItemStack.asBukkitCopy(itemstack2), CraftItemStack.asBukkitCopy(itemstack1), this.levelCost.get()); -+ Bukkit.getPluginManager().callEvent(event); -+ if (event.isCancelled()) { -+ itemstack1 = ItemStack.NULL_ITEM; -+ } else { -+ itemstack1 = CraftItemStack.asNMSCopy(event.getResult()); -+ this.levelCost.set(event.getCost()); -+ } -+ // EMC end - - if (!itemstack1.isEmpty()) { - int k2 = itemstack1.getRepairCost(); --- -2.25.1.windows.1 - diff --git a/patches/server-old/0006-EMC-ArrowHitBlock-Event.patch b/patches/server-old/0006-EMC-ArrowHitBlock-Event.patch deleted file mode 100644 index 4a669364..00000000 --- a/patches/server-old/0006-EMC-ArrowHitBlock-Event.patch +++ /dev/null @@ -1,24 +0,0 @@ -From 46809af9ebcd3c662537d6660809a849537f8173 Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Sun, 19 May 2013 21:09:31 -0400 -Subject: [PATCH] EMC ArrowHitBlock Event - ---- - src/main/java/net/minecraft/server/EntityArrow.java | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/src/main/java/net/minecraft/server/EntityArrow.java b/src/main/java/net/minecraft/server/EntityArrow.java -index 9c97edf9..4dc53d3f 100644 ---- a/src/main/java/net/minecraft/server/EntityArrow.java -+++ b/src/main/java/net/minecraft/server/EntityArrow.java -@@ -308,6 +308,7 @@ public abstract class EntityArrow extends Entity implements IProjectile { - this.a(SoundEffects.ENTITY_ARROW_HIT); - this.o(false); - this.w(); -+ if (new com.destroystokyo.paper.event.entity.ArrowHitBlockEvent((org.bukkit.entity.AbstractArrow) this.getBukkitEntity(), world.getWorld().getBlockAt(movingobjectpositionblock.getBlockPosition().getX(), movingobjectpositionblock.getBlockPosition().getY(), movingobjectpositionblock.getBlockPosition().getZ())).callEvent()) // Paper - iblockdata.a(this.world, iblockdata, movingobjectpositionblock, this); - } - --- -2.25.1.windows.1 - diff --git a/patches/server-old/0007-EMC-MonsterEggSpawn-Event.patch b/patches/server-old/0007-EMC-MonsterEggSpawn-Event.patch deleted file mode 100644 index 4d80e9b2..00000000 --- a/patches/server-old/0007-EMC-MonsterEggSpawn-Event.patch +++ /dev/null @@ -1,69 +0,0 @@ -From 43bc55b8a3402aa3555da5d1c52f1d8ba86c70b8 Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Sat, 20 Jul 2013 22:40:56 -0400 -Subject: [PATCH] EMC MonsterEggSpawn Event - -Get the itemstack used to spawn an entity ---- - .../net/minecraft/server/EntityTypes.java | 29 +++++++++++++++++-- - 1 file changed, 26 insertions(+), 3 deletions(-) - -diff --git a/src/main/java/net/minecraft/server/EntityTypes.java b/src/main/java/net/minecraft/server/EntityTypes.java -index 4100e367..29adb85a 100644 ---- a/src/main/java/net/minecraft/server/EntityTypes.java -+++ b/src/main/java/net/minecraft/server/EntityTypes.java -@@ -11,6 +11,7 @@ import java.util.stream.Stream; - import javax.annotation.Nullable; - import org.apache.logging.log4j.LogManager; - import org.apache.logging.log4j.Logger; -+import org.bukkit.event.entity.CreatureSpawnEvent; - - public class EntityTypes { - -@@ -156,18 +157,40 @@ public class EntityTypes { - - @Nullable - public Entity spawnCreature(World world, @Nullable ItemStack itemstack, @Nullable EntityHuman entityhuman, BlockPosition blockposition, EnumMobSpawn enummobspawn, boolean flag, boolean flag1) { -- return this.spawnCreature(world, itemstack == null ? null : itemstack.getTag(), itemstack != null && itemstack.hasName() ? itemstack.getName() : null, entityhuman, blockposition, enummobspawn, flag, flag1); -+ // EMC start - pas itemtack for monster eggs -+ return this.spawnCreature(world, itemstack, itemstack == null ? null : itemstack.getTag(), itemstack != null && itemstack.hasName() ? itemstack.getName() : null, entityhuman, blockposition, enummobspawn, flag, flag1); - } - - @Nullable -- public T spawnCreature(World world, @Nullable NBTTagCompound nbttagcompound, @Nullable IChatBaseComponent ichatbasecomponent, @Nullable EntityHuman entityhuman, BlockPosition blockposition, EnumMobSpawn enummobspawn, boolean flag, boolean flag1) { -+ public T spawnCreature(World world, ItemStack itemstack, @Nullable NBTTagCompound nbttagcompound, @Nullable IChatBaseComponent ichatbasecomponent, @Nullable EntityHuman entityhuman, BlockPosition blockposition, EnumMobSpawn enummobspawn, boolean flag, boolean flag1) { - // CraftBukkit start -- return this.spawnCreature(world, nbttagcompound, ichatbasecomponent, entityhuman, blockposition, enummobspawn, flag, flag1, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER_EGG); -+ return this.spawnCreature(world, itemstack, nbttagcompound, ichatbasecomponent, entityhuman, blockposition, enummobspawn, flag, flag1, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER_EGG); - } - -+ @Nullable -+ public T spawnCreature(World world, @Nullable NBTTagCompound nbttagcompound, @Nullable IChatBaseComponent ichatbasecomponent, @Nullable EntityHuman entityhuman, BlockPosition blockposition, EnumMobSpawn enummobspawn, boolean flag, boolean flag1) { -+ return spawnCreature(world, null, nbttagcompound, ichatbasecomponent, entityhuman, blockposition, enummobspawn, flag, flag1, CreatureSpawnEvent.SpawnReason.NATURAL); -+ } - @Nullable - public T spawnCreature(World world, @Nullable NBTTagCompound nbttagcompound, @Nullable IChatBaseComponent ichatbasecomponent, @Nullable EntityHuman entityhuman, BlockPosition blockposition, EnumMobSpawn enummobspawn, boolean flag, boolean flag1, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason) { -+ return spawnCreature(world, null, nbttagcompound, ichatbasecomponent, entityhuman, blockposition, enummobspawn, flag, flag1, spawnReason); -+ } -+ public T spawnCreature(World world, ItemStack itemstack, @Nullable NBTTagCompound nbttagcompound, @Nullable IChatBaseComponent ichatbasecomponent, @Nullable EntityHuman entityhuman, BlockPosition blockposition, EnumMobSpawn enummobspawn, boolean flag, boolean flag1, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason) { -+ // EMC end - add itemstack to methods - T t0 = this.createCreature(world, nbttagcompound, ichatbasecomponent, entityhuman, blockposition, enummobspawn, flag, flag1); -+ // EMC start - if false the spawn was cancelled, add new event -+ if (spawnReason == org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER_EGG && itemstack != null && t0 != null) { -+ final com.empireminecraft.customevents.MonsterEggSpawnEvent event = new com.empireminecraft.customevents.MonsterEggSpawnEvent(entityhuman != null ? entityhuman.getBukkitEntity() : null, (org.bukkit.entity.LivingEntity) t0.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemstack)); -+ -+ if (!event.callEvent()) { -+ ((WorldServer)world).removeEntity(t0); -+ return null; -+ } -+ if (event.getEntity().getEntityId() != t0.getId()) { -+ return (T) ((org.bukkit.craftbukkit.entity.CraftEntity) event.getEntity()).getHandle(); -+ } -+ } -+ // EMC end - - return world.addEntity(t0, spawnReason) ? t0 : null; // Don't return an entity when CreatureSpawnEvent is canceled - // CraftBukkit end --- -2.25.1.windows.1 - diff --git a/patches/server-old/0008-EMC-MovedTooQuickly-event.patch b/patches/server-old/0008-EMC-MovedTooQuickly-event.patch deleted file mode 100644 index 4c35a7c8..00000000 --- a/patches/server-old/0008-EMC-MovedTooQuickly-event.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 590cd93be05350962a3c1423796a1521c5d4450a Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Sat, 28 Sep 2013 22:01:47 -0400 -Subject: [PATCH] EMC MovedTooQuickly event - -also make creative immune to this event ---- - src/main/java/net/minecraft/server/PlayerConnection.java | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/src/main/java/net/minecraft/server/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java -index ecf7a8c6d9..64d5136346 100644 ---- a/src/main/java/net/minecraft/server/PlayerConnection.java -+++ b/src/main/java/net/minecraft/server/PlayerConnection.java -@@ -1045,9 +1045,11 @@ public class PlayerConnection implements PacketListenerPlayIn { - - if (d11 - d10 > Math.max(f2, Math.pow((double) (org.spigotmc.SpigotConfig.movedTooQuicklyMultiplier * (float) i * speed), 2)) && !this.isExemptPlayer()) { - // CraftBukkit end -+ if (new com.empireminecraft.customevents.MovedTooQuicklyEvent(d10, getPlayer()).callEvent()) { // EMC - PlayerConnection.LOGGER.warn("{} moved too quickly! {},{},{}", this.player.getDisplayName().getString(), d7, d8, d9); - this.a(this.player.locX(), this.player.locY(), this.player.locZ(), this.player.yaw, this.player.pitch); - return; -+ } // EMC - } - } - --- -2.25.1.windows.1 - diff --git a/patches/server-old/0009-EMC-Legacy-Data-Converter.patch b/patches/server-old/0009-EMC-Legacy-Data-Converter.patch deleted file mode 100644 index d36aab17..00000000 --- a/patches/server-old/0009-EMC-Legacy-Data-Converter.patch +++ /dev/null @@ -1,2674 +0,0 @@ -From ae7e9dcb3edb5e1273a72578c3a6adc458292385 Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Thu, 21 Mar 2019 23:31:44 -0400 -Subject: [PATCH] EMC Legacy Data Converter - ---- - .../server/DataConverterRegistry.java | 2 +- - .../net/minecraft/server/DataConverters.java | 2641 +++++++++++++++++ - 2 files changed, 2642 insertions(+), 1 deletion(-) - create mode 100644 src/main/java/net/minecraft/server/DataConverters.java - -diff --git a/src/main/java/net/minecraft/server/DataConverterRegistry.java b/src/main/java/net/minecraft/server/DataConverterRegistry.java -index 77c77973..c6757f74 100644 ---- a/src/main/java/net/minecraft/server/DataConverterRegistry.java -+++ b/src/main/java/net/minecraft/server/DataConverterRegistry.java -@@ -16,7 +16,7 @@ public class DataConverterRegistry { - private static final DataFixer c = b(); - - private static DataFixer b() { -- DataFixerBuilder datafixerbuilder = new DataFixerBuilder(SharedConstants.getGameVersion().getWorldVersion()); -+ DataConverters datafixerbuilder = new DataConverters(SharedConstants.getGameVersion().getWorldVersion()); // Paper - - a(datafixerbuilder); - return datafixerbuilder.build(SystemUtils.e()); -diff --git a/src/main/java/net/minecraft/server/DataConverters.java b/src/main/java/net/minecraft/server/DataConverters.java -new file mode 100644 -index 00000000..b1f5ff45 ---- /dev/null -+++ b/src/main/java/net/minecraft/server/DataConverters.java -@@ -0,0 +1,2641 @@ -+package net.minecraft.server; -+ -+import com.google.common.collect.Lists; -+import com.google.common.collect.Maps; -+ -+import java.lang.reflect.Type; -+import java.util.ArrayList; -+import java.util.EnumMap; -+import java.util.HashMap; -+import java.util.Iterator; -+import java.util.List; -+import java.util.Locale; -+import java.util.Map; -+import java.util.Random; -+import java.util.Set; -+import java.util.UUID; -+import java.util.concurrent.Executor; -+ -+import com.google.common.collect.Sets; -+import com.google.gson.Gson; -+import com.google.gson.GsonBuilder; -+import com.google.gson.JsonArray; -+import com.google.gson.JsonDeserializationContext; -+import com.google.gson.JsonDeserializer; -+import com.google.gson.JsonElement; -+import com.google.gson.JsonParseException; -+import com.mojang.datafixers.DSL.TypeReference; -+import com.mojang.datafixers.DataFixer; -+import com.mojang.datafixers.DataFixerBuilder; -+import com.mojang.datafixers.Dynamic; -+import com.mojang.datafixers.schemas.Schema; -+import org.apache.logging.log4j.LogManager; -+import org.apache.logging.log4j.Logger; -+ -+import javax.annotation.Nullable; -+ -+/** -+ * Handles converting all Pre 1.13.2 data using the Legacy DataFix System (ported to 1.13.2) -+ * -+ * We register a DFU Fixer per Legacy Data Version and apply the fixes using legacy strategy -+ * which is safer, faster and cleaner code. -+ * -+ * The pre DFU code did not fail when the Source version was unknown. -+ * -+ * This class also provides util methods for converting compounds to wrap the update call to -+ * receive the source version in the compound -+ * -+ */ -+public class DataConverters extends DataFixerBuilder { -+ -+ private static final DynamicOpsNBT OPS_NBT = DynamicOpsNBT.a; -+ public static final int LEGACY_VERSION = 1343; -+ public static int DATA_VERSION; -+ public static DataConverters INSTANCE; -+ -+ private final Map> converters = new EnumMap<>(LegacyType.class); -+ private final Map> inspectors = new EnumMap(LegacyType.class); -+ -+ // Set on build -+ private DataFixer fixer; -+ private static final Map DFU_TO_LEGACY = new HashMap<>(); -+ -+ public enum LegacyType { -+ LEVEL(DataFixTypes.LEVEL.a()), -+ PLAYER(DataFixTypes.PLAYER.a()), -+ CHUNK(DataFixTypes.CHUNK.a()), -+ BLOCK_ENTITY(() -> "block_entity"), -+ ENTITY(DataConverterTypes.ENTITY), -+ ITEM_INSTANCE(DataConverterTypes.ITEM_STACK), -+ OPTIONS(DataFixTypes.OPTIONS.a()), -+ STRUCTURE(DataFixTypes.STRUCTURE.a()); -+ -+ private final TypeReference type; -+ -+ LegacyType(TypeReference type) { -+ this.type = type; -+ DFU_TO_LEGACY.put(type.typeName(), this); -+ } -+ -+ public TypeReference getDFUType() { -+ return type; -+ } -+ } -+ -+ DataConverters(int dataVersion) { -+ super(dataVersion); -+ DATA_VERSION = dataVersion; -+ INSTANCE = this; -+ registerConverters(); -+ registerInspectors(); -+ } -+ -+ -+ // Called after fixers are built and ready for FIXING -+ public DataFixer build(final Executor executor) { -+ return this.fixer = new WrappedDataFixer(super.build(executor)); -+ } -+ -+ private class WrappedDataFixer implements DataFixer { -+ private final DataFixer realFixer; -+ -+ WrappedDataFixer(DataFixer realFixer) { -+ this.realFixer = realFixer; -+ } -+ -+ @Override -+ public Dynamic update(TypeReference type, Dynamic dynamic, int sourceVer, int targetVer) { -+ LegacyType legacyType = DFU_TO_LEGACY.get(type.typeName()); -+ if (sourceVer < LEGACY_VERSION && legacyType != null) { -+ NBTTagCompound cmp = (NBTTagCompound) dynamic.getValue(); -+ int desiredVersion = Math.min(targetVer, LEGACY_VERSION); -+ -+ cmp = convert(legacyType, cmp, sourceVer, desiredVersion); -+ sourceVer = desiredVersion; -+ dynamic = new Dynamic(OPS_NBT, cmp); -+ } -+ return realFixer.update(type, dynamic, sourceVer, targetVer); -+ } -+ -+ private NBTTagCompound convert(LegacyType type, NBTTagCompound cmp, int sourceVer, int desiredVersion) { -+ List converters = DataConverters.this.converters.get(type); -+ if (converters != null && !converters.isEmpty()) { -+ for (DataConverter converter : converters) { -+ int dataVersion = converter.getDataVersion(); -+ if (dataVersion > sourceVer && dataVersion <= desiredVersion) { -+ cmp = converter.convert(cmp); -+ } -+ } -+ } -+ -+ List inspectors = DataConverters.this.inspectors.get(type); -+ if (inspectors != null && !inspectors.isEmpty()) { -+ for (DataInspector inspector : inspectors) { -+ cmp = inspector.inspect(cmp, sourceVer, desiredVersion); -+ } -+ } -+ -+ return cmp; -+ } -+ -+ @Override -+ public Schema getSchema(int i) { -+ return realFixer.getSchema(i); -+ } -+ } -+ -+ public static NBTTagCompound convert(LegacyType type, NBTTagCompound cmp) { -+ return convert(type.getDFUType(), cmp); -+ } -+ -+ public static NBTTagCompound convert(LegacyType type, NBTTagCompound cmp, int sourceVer) { -+ return convert(type.getDFUType(), cmp, sourceVer); -+ } -+ public static NBTTagCompound convert(LegacyType type, NBTTagCompound cmp, int sourceVer, int targetVer) { -+ return convert(type.getDFUType(), cmp, sourceVer, targetVer); -+ } -+ -+ public static NBTTagCompound convert(TypeReference type, NBTTagCompound cmp) { -+ int i = cmp.hasKeyOfType("DataVersion", 99) ? cmp.getInt("DataVersion") : -1; -+ return convert(type, cmp, i); -+ } -+ -+ public static NBTTagCompound convert(TypeReference type, NBTTagCompound cmp, int sourceVer) { -+ return convert(type, cmp, sourceVer, DATA_VERSION); -+ } -+ -+ public static NBTTagCompound convert(TypeReference type, NBTTagCompound cmp, int sourceVer, int targetVer) { -+ if (sourceVer >= targetVer) { -+ return cmp; -+ } -+ return (NBTTagCompound) INSTANCE.fixer.update(type, new Dynamic<>(OPS_NBT, cmp), sourceVer, targetVer).getValue(); -+ } -+ -+ -+ public interface DataInspector { -+ NBTTagCompound inspect(NBTTagCompound cmp, int sourceVer, int targetVer); -+ } -+ -+ public interface DataConverter { -+ -+ int getDataVersion(); -+ -+ NBTTagCompound convert(NBTTagCompound cmp); -+ } -+ -+ -+ private void registerInspector(LegacyType type, DataInspector inspector) { -+ this.inspectors.computeIfAbsent(type, k -> new ArrayList<>()).add(inspector); -+ } -+ -+ private void registerConverter(LegacyType type, DataConverter converter) { -+ int version = converter.getDataVersion(); -+ -+ List list = this.converters.computeIfAbsent(type, k -> new ArrayList<>()); -+ if (!list.isEmpty() && list.get(list.size() - 1).getDataVersion() > version) { -+ for (int j = 0; j < list.size(); ++j) { -+ if (list.get(j).getDataVersion() > version) { -+ list.add(j, converter); -+ break; -+ } -+ } -+ } else { -+ list.add(converter); -+ } -+ } -+ -+ private void registerInspectors() { -+ registerEntityItemList("EntityHorseDonkey", "SaddleItem", "Items"); -+ registerEntityItemList("EntityHorseMule", "Items"); -+ registerEntityItemList("EntityMinecartChest", "Items"); -+ registerEntityItemList("EntityMinecartHopper", "Items"); -+ registerEntityItemList("EntityVillager", "Inventory"); -+ registerEntityItemListEquipment("EntityArmorStand"); -+ registerEntityItemListEquipment("EntityBat"); -+ registerEntityItemListEquipment("EntityBlaze"); -+ registerEntityItemListEquipment("EntityCaveSpider"); -+ registerEntityItemListEquipment("EntityChicken"); -+ registerEntityItemListEquipment("EntityCow"); -+ registerEntityItemListEquipment("EntityCreeper"); -+ registerEntityItemListEquipment("EntityEnderDragon"); -+ registerEntityItemListEquipment("EntityEnderman"); -+ registerEntityItemListEquipment("EntityEndermite"); -+ registerEntityItemListEquipment("EntityEvoker"); -+ registerEntityItemListEquipment("EntityGhast"); -+ registerEntityItemListEquipment("EntityGiantZombie"); -+ registerEntityItemListEquipment("EntityGuardian"); -+ registerEntityItemListEquipment("EntityGuardianElder"); -+ registerEntityItemListEquipment("EntityHorse"); -+ registerEntityItemListEquipment("EntityHorseDonkey"); -+ registerEntityItemListEquipment("EntityHorseMule"); -+ registerEntityItemListEquipment("EntityHorseSkeleton"); -+ registerEntityItemListEquipment("EntityHorseZombie"); -+ registerEntityItemListEquipment("EntityIronGolem"); -+ registerEntityItemListEquipment("EntityMagmaCube"); -+ registerEntityItemListEquipment("EntityMushroomCow"); -+ registerEntityItemListEquipment("EntityOcelot"); -+ registerEntityItemListEquipment("EntityPig"); -+ registerEntityItemListEquipment("EntityPigZombie"); -+ registerEntityItemListEquipment("EntityRabbit"); -+ registerEntityItemListEquipment("EntitySheep"); -+ registerEntityItemListEquipment("EntityShulker"); -+ registerEntityItemListEquipment("EntitySilverfish"); -+ registerEntityItemListEquipment("EntitySkeleton"); -+ registerEntityItemListEquipment("EntitySkeletonStray"); -+ registerEntityItemListEquipment("EntitySkeletonWither"); -+ registerEntityItemListEquipment("EntitySlime"); -+ registerEntityItemListEquipment("EntitySnowman"); -+ registerEntityItemListEquipment("EntitySpider"); -+ registerEntityItemListEquipment("EntitySquid"); -+ registerEntityItemListEquipment("EntityVex"); -+ registerEntityItemListEquipment("EntityVillager"); -+ registerEntityItemListEquipment("EntityVindicator"); -+ registerEntityItemListEquipment("EntityWitch"); -+ registerEntityItemListEquipment("EntityWither"); -+ registerEntityItemListEquipment("EntityWolf"); -+ registerEntityItemListEquipment("EntityZombie"); -+ registerEntityItemListEquipment("EntityZombieHusk"); -+ registerEntityItemListEquipment("EntityZombieVillager"); -+ registerEntityItemSingle("EntityFireworks", "FireworksItem"); -+ registerEntityItemSingle("EntityHorse", "ArmorItem"); -+ registerEntityItemSingle("EntityHorse", "SaddleItem"); -+ registerEntityItemSingle("EntityHorseMule", "SaddleItem"); -+ registerEntityItemSingle("EntityHorseSkeleton", "SaddleItem"); -+ registerEntityItemSingle("EntityHorseZombie", "SaddleItem"); -+ registerEntityItemSingle("EntityItem", "Item"); -+ registerEntityItemSingle("EntityItemFrame", "Item"); -+ registerEntityItemSingle("EntityPotion", "Potion"); -+ -+ registerInspector(LegacyType.BLOCK_ENTITY, new DataInspectorItem("TileEntityRecordPlayer", "RecordItem")); -+ registerInspector(LegacyType.BLOCK_ENTITY, new DataInspectorItemList("TileEntityBrewingStand", "Items")); -+ registerInspector(LegacyType.BLOCK_ENTITY, new DataInspectorItemList("TileEntityChest", "Items")); -+ registerInspector(LegacyType.BLOCK_ENTITY, new DataInspectorItemList("TileEntityDispenser", "Items")); -+ registerInspector(LegacyType.BLOCK_ENTITY, new DataInspectorItemList("TileEntityDropper", "Items")); -+ registerInspector(LegacyType.BLOCK_ENTITY, new DataInspectorItemList("TileEntityFurnace", "Items")); -+ registerInspector(LegacyType.BLOCK_ENTITY, new DataInspectorItemList("TileEntityHopper", "Items")); -+ registerInspector(LegacyType.BLOCK_ENTITY, new DataInspectorItemList("TileEntityShulkerBox", "Items")); -+ registerInspector(LegacyType.BLOCK_ENTITY, new DataInspectorMobSpawnerMobs()); -+ registerInspector(LegacyType.CHUNK, new DataInspectorChunks()); -+ registerInspector(LegacyType.ENTITY, new DataInspectorCommandBlock()); -+ registerInspector(LegacyType.ENTITY, new DataInspectorEntityPassengers()); -+ registerInspector(LegacyType.ENTITY, new DataInspectorMobSpawnerMinecart()); -+ registerInspector(LegacyType.ENTITY, new DataInspectorVillagers()); -+ registerInspector(LegacyType.ITEM_INSTANCE, new DataInspectorBlockEntity()); -+ registerInspector(LegacyType.ITEM_INSTANCE, new DataInspectorEntity()); -+ registerInspector(LegacyType.LEVEL, new DataInspectorLevelPlayer()); -+ registerInspector(LegacyType.PLAYER, new DataInspectorPlayer()); -+ registerInspector(LegacyType.PLAYER, new DataInspectorPlayerVehicle()); -+ registerInspector(LegacyType.STRUCTURE, new DataInspectorStructure()); -+ } -+ -+ private void registerConverters() { -+ registerConverter(LegacyType.ENTITY, new DataConverterEquipment()); -+ registerConverter(LegacyType.BLOCK_ENTITY, new DataConverterSignText()); -+ registerConverter(LegacyType.ITEM_INSTANCE, new DataConverterMaterialId()); -+ registerConverter(LegacyType.ITEM_INSTANCE, new DataConverterPotionId()); -+ registerConverter(LegacyType.ITEM_INSTANCE, new DataConverterSpawnEgg()); -+ registerConverter(LegacyType.ENTITY, new DataConverterMinecart()); -+ registerConverter(LegacyType.BLOCK_ENTITY, new DataConverterMobSpawner()); -+ registerConverter(LegacyType.ENTITY, new DataConverterUUID()); -+ registerConverter(LegacyType.ENTITY, new DataConverterHealth()); -+ registerConverter(LegacyType.ENTITY, new DataConverterSaddle()); -+ registerConverter(LegacyType.ENTITY, new DataConverterHanging()); -+ registerConverter(LegacyType.ENTITY, new DataConverterDropChances()); -+ registerConverter(LegacyType.ENTITY, new DataConverterRiding()); -+ registerConverter(LegacyType.ENTITY, new DataConverterArmorStand()); -+ registerConverter(LegacyType.ITEM_INSTANCE, new DataConverterBook()); -+ registerConverter(LegacyType.ITEM_INSTANCE, new DataConverterCookedFish()); -+ registerConverter(LegacyType.ENTITY, new DataConverterZombie()); -+ registerConverter(LegacyType.OPTIONS, new DataConverterVBO()); -+ registerConverter(LegacyType.ENTITY, new DataConverterGuardian()); -+ registerConverter(LegacyType.ENTITY, new DataConverterSkeleton()); -+ registerConverter(LegacyType.ENTITY, new DataConverterZombieType()); -+ registerConverter(LegacyType.ENTITY, new DataConverterHorse()); -+ registerConverter(LegacyType.BLOCK_ENTITY, new DataConverterTileEntity()); -+ registerConverter(LegacyType.ENTITY, new DataConverterEntity()); -+ registerConverter(LegacyType.ITEM_INSTANCE, new DataConverterBanner()); -+ registerConverter(LegacyType.ITEM_INSTANCE, new DataConverterPotionWater()); -+ registerConverter(LegacyType.ENTITY, new DataConverterShulker()); -+ registerConverter(LegacyType.ITEM_INSTANCE, new DataConverterShulkerBoxItem()); -+ registerConverter(LegacyType.BLOCK_ENTITY, new DataConverterShulkerBoxBlock()); -+ registerConverter(LegacyType.OPTIONS, new DataConverterLang()); -+ registerConverter(LegacyType.ITEM_INSTANCE, new DataConverterTotem()); -+ registerConverter(LegacyType.CHUNK, new DataConverterBedBlock()); -+ registerConverter(LegacyType.ITEM_INSTANCE, new DataConverterBedItem()); -+ } -+ -+ private void registerEntityItemList(String type, String... keys) { -+ registerInspector(LegacyType.ENTITY, new DataInspectorItemList(type, keys)); -+ } -+ -+ private void registerEntityItemSingle(String type, String key) { -+ registerInspector(LegacyType.ENTITY, new DataInspectorItem(type, key)); -+ } -+ -+ private void registerEntityItemListEquipment(String type) { -+ registerEntityItemList(type, "ArmorItems", "HandItems"); -+ } -+ private static final Map OLD_ID_TO_KEY_MAP = new HashMap<>(); -+ -+ static { -+ final Map map = OLD_ID_TO_KEY_MAP; -+ map.put("EntityItem", new MinecraftKey("item")); -+ map.put("EntityExperienceOrb", new MinecraftKey("xp_orb")); -+ map.put("EntityAreaEffectCloud", new MinecraftKey("area_effect_cloud")); -+ map.put("EntityGuardianElder", new MinecraftKey("elder_guardian")); -+ map.put("EntitySkeletonWither", new MinecraftKey("wither_skeleton")); -+ map.put("EntitySkeletonStray", new MinecraftKey("stray")); -+ map.put("EntityEgg", new MinecraftKey("egg")); -+ map.put("EntityLeash", new MinecraftKey("leash_knot")); -+ map.put("EntityPainting", new MinecraftKey("painting")); -+ map.put("EntityTippedArrow", new MinecraftKey("arrow")); -+ map.put("EntitySnowball", new MinecraftKey("snowball")); -+ map.put("EntityLargeFireball", new MinecraftKey("fireball")); -+ map.put("EntitySmallFireball", new MinecraftKey("small_fireball")); -+ map.put("EntityEnderPearl", new MinecraftKey("ender_pearl")); -+ map.put("EntityEnderSignal", new MinecraftKey("eye_of_ender_signal")); -+ map.put("EntityPotion", new MinecraftKey("potion")); -+ map.put("EntityThrownExpBottle", new MinecraftKey("xp_bottle")); -+ map.put("EntityItemFrame", new MinecraftKey("item_frame")); -+ map.put("EntityWitherSkull", new MinecraftKey("wither_skull")); -+ map.put("EntityTNTPrimed", new MinecraftKey("tnt")); -+ map.put("EntityFallingBlock", new MinecraftKey("falling_block")); -+ map.put("EntityFireworks", new MinecraftKey("fireworks_rocket")); -+ map.put("EntityZombieHusk", new MinecraftKey("husk")); -+ map.put("EntitySpectralArrow", new MinecraftKey("spectral_arrow")); -+ map.put("EntityShulkerBullet", new MinecraftKey("shulker_bullet")); -+ map.put("EntityDragonFireball", new MinecraftKey("dragon_fireball")); -+ map.put("EntityZombieVillager", new MinecraftKey("zombie_villager")); -+ map.put("EntityHorseSkeleton", new MinecraftKey("skeleton_horse")); -+ map.put("EntityHorseZombie", new MinecraftKey("zombie_horse")); -+ map.put("EntityArmorStand", new MinecraftKey("armor_stand")); -+ map.put("EntityHorseDonkey", new MinecraftKey("donkey")); -+ map.put("EntityHorseMule", new MinecraftKey("mule")); -+ map.put("EntityEvokerFangs", new MinecraftKey("evocation_fangs")); -+ map.put("EntityEvoker", new MinecraftKey("evocation_illager")); -+ map.put("EntityVex", new MinecraftKey("vex")); -+ map.put("EntityVindicator", new MinecraftKey("vindication_illager")); -+ map.put("EntityIllagerIllusioner", new MinecraftKey("illusion_illager")); -+ map.put("EntityMinecartCommandBlock", new MinecraftKey("commandblock_minecart")); -+ map.put("EntityBoat", new MinecraftKey("boat")); -+ map.put("EntityMinecartRideable", new MinecraftKey("minecart")); -+ map.put("EntityMinecartChest", new MinecraftKey("chest_minecart")); -+ map.put("EntityMinecartFurnace", new MinecraftKey("furnace_minecart")); -+ map.put("EntityMinecartTNT", new MinecraftKey("tnt_minecart")); -+ map.put("EntityMinecartHopper", new MinecraftKey("hopper_minecart")); -+ map.put("EntityMinecartMobSpawner", new MinecraftKey("spawner_minecart")); -+ map.put("EntityCreeper", new MinecraftKey("creeper")); -+ map.put("EntitySkeleton", new MinecraftKey("skeleton")); -+ map.put("EntitySpider", new MinecraftKey("spider")); -+ map.put("EntityGiantZombie", new MinecraftKey("giant")); -+ map.put("EntityZombie", new MinecraftKey("zombie")); -+ map.put("EntitySlime", new MinecraftKey("slime")); -+ map.put("EntityGhast", new MinecraftKey("ghast")); -+ map.put("EntityPigZombie", new MinecraftKey("zombie_pigman")); -+ map.put("EntityEnderman", new MinecraftKey("enderman")); -+ map.put("EntityCaveSpider", new MinecraftKey("cave_spider")); -+ map.put("EntitySilverfish", new MinecraftKey("silverfish")); -+ map.put("EntityBlaze", new MinecraftKey("blaze")); -+ map.put("EntityMagmaCube", new MinecraftKey("magma_cube")); -+ map.put("EntityEnderDragon", new MinecraftKey("ender_dragon")); -+ map.put("EntityWither", new MinecraftKey("wither")); -+ map.put("EntityBat", new MinecraftKey("bat")); -+ map.put("EntityWitch", new MinecraftKey("witch")); -+ map.put("EntityEndermite", new MinecraftKey("endermite")); -+ map.put("EntityGuardian", new MinecraftKey("guardian")); -+ map.put("EntityShulker", new MinecraftKey("shulker")); -+ map.put("EntityPig", new MinecraftKey("pig")); -+ map.put("EntitySheep", new MinecraftKey("sheep")); -+ map.put("EntityCow", new MinecraftKey("cow")); -+ map.put("EntityChicken", new MinecraftKey("chicken")); -+ map.put("EntitySquid", new MinecraftKey("squid")); -+ map.put("EntityWolf", new MinecraftKey("wolf")); -+ map.put("EntityMushroomCow", new MinecraftKey("mooshroom")); -+ map.put("EntitySnowman", new MinecraftKey("snowman")); -+ map.put("EntityOcelot", new MinecraftKey("ocelot")); -+ map.put("EntityIronGolem", new MinecraftKey("villager_golem")); -+ map.put("EntityHorse", new MinecraftKey("horse")); -+ map.put("EntityRabbit", new MinecraftKey("rabbit")); -+ map.put("EntityPolarBear", new MinecraftKey("polar_bear")); -+ map.put("EntityLlama", new MinecraftKey("llama")); -+ map.put("EntityLlamaSpit", new MinecraftKey("llama_spit")); -+ map.put("EntityParrot", new MinecraftKey("parrot")); -+ map.put("EntityVillager", new MinecraftKey("villager")); -+ map.put("EntityEnderCrystal", new MinecraftKey("ender_crystal")); -+ map.put("TileEntityFurnace", new MinecraftKey("furnace")); -+ map.put("TileEntityChest", new MinecraftKey("chest")); -+ map.put("TileEntityEnderChest", new MinecraftKey("ender_chest")); -+ map.put("TileEntityRecordPlayer", new MinecraftKey("jukebox")); -+ map.put("TileEntityDispenser", new MinecraftKey("dispenser")); -+ map.put("TileEntityDropper", new MinecraftKey("dropper")); -+ map.put("TileEntitySign", new MinecraftKey("sign")); -+ map.put("TileEntityMobSpawner", new MinecraftKey("mob_spawner")); -+ map.put("TileEntityNote", new MinecraftKey("noteblock")); -+ map.put("TileEntityPiston", new MinecraftKey("piston")); -+ map.put("TileEntityBrewingStand", new MinecraftKey("brewing_stand")); -+ map.put("TileEntityEnchantTable", new MinecraftKey("enchanting_table")); -+ map.put("TileEntityEnderPortal", new MinecraftKey("end_portal")); -+ map.put("TileEntityBeacon", new MinecraftKey("beacon")); -+ map.put("TileEntitySkull", new MinecraftKey("skull")); -+ map.put("TileEntityLightDetector", new MinecraftKey("daylight_detector")); -+ map.put("TileEntityHopper", new MinecraftKey("hopper")); -+ map.put("TileEntityComparator", new MinecraftKey("comparator")); -+ map.put("TileEntityFlowerPot", new MinecraftKey("flower_pot")); -+ map.put("TileEntityBanner", new MinecraftKey("banner")); -+ map.put("TileEntityStructure", new MinecraftKey("structure_block")); -+ map.put("TileEntityEndGateway", new MinecraftKey("end_gateway")); -+ map.put("TileEntityCommand", new MinecraftKey("command_block")); -+ map.put("TileEntityShulkerBox", new MinecraftKey("shulker_box")); -+ map.put("TileEntityBed", new MinecraftKey("bed")); -+ } -+ -+ private static MinecraftKey getKey(String type) { -+ final MinecraftKey key = OLD_ID_TO_KEY_MAP.get(type); -+ if (key == null) { -+ throw new IllegalArgumentException("Unknown mapping for " + type); -+ } -+ return key; -+ } -+ -+ private static void convertCompound(LegacyType type, NBTTagCompound cmp, String key, int sourceVer, int targetVer) { -+ cmp.set(key, convert(type, cmp.getCompound(key), sourceVer, targetVer)); -+ } -+ -+ private static void convertItem(NBTTagCompound nbttagcompound, String key, int sourceVer, int targetVer) { -+ if (nbttagcompound.hasKeyOfType(key, 10)) { -+ convertCompound(LegacyType.ITEM_INSTANCE, nbttagcompound, key, sourceVer, targetVer); -+ } -+ } -+ -+ private static void convertItems(NBTTagCompound nbttagcompound, String key, int sourceVer, int targetVer) { -+ if (nbttagcompound.hasKeyOfType(key, 9)) { -+ NBTTagList nbttaglist = nbttagcompound.getList(key, 10); -+ -+ for (int j = 0; j < nbttaglist.size(); ++j) { -+ nbttaglist.set(j, convert(LegacyType.ITEM_INSTANCE, nbttaglist.getCompound(j), sourceVer, targetVer)); -+ } -+ } -+ -+ } -+ -+ private static class DataConverterEquipment implements DataConverter { -+ -+ DataConverterEquipment() {} -+ -+ public int getDataVersion() { -+ return 100; -+ } -+ -+ public NBTTagCompound convert(NBTTagCompound cmp) { -+ NBTTagList nbttaglist = cmp.getList("Equipment", 10); -+ NBTTagList nbttaglist1; -+ -+ if (!nbttaglist.isEmpty() && !cmp.hasKeyOfType("HandItems", 10)) { -+ nbttaglist1 = new NBTTagList(); -+ nbttaglist1.add(nbttaglist.get(0)); -+ nbttaglist1.add(new NBTTagCompound()); -+ cmp.set("HandItems", nbttaglist1); -+ } -+ -+ if (nbttaglist.size() > 1 && !cmp.hasKeyOfType("ArmorItem", 10)) { -+ nbttaglist1 = new NBTTagList(); -+ nbttaglist1.add(nbttaglist.get(1)); -+ nbttaglist1.add(nbttaglist.get(2)); -+ nbttaglist1.add(nbttaglist.get(3)); -+ nbttaglist1.add(nbttaglist.get(4)); -+ cmp.set("ArmorItems", nbttaglist1); -+ } -+ -+ cmp.remove("Equipment"); -+ if (cmp.hasKeyOfType("DropChances", 9)) { -+ nbttaglist1 = cmp.getList("DropChances", 5); -+ NBTTagList nbttaglist2; -+ -+ if (!cmp.hasKeyOfType("HandDropChances", 10)) { -+ nbttaglist2 = new NBTTagList(); -+ nbttaglist2.add(NBTTagFloat.a(nbttaglist1.d(0))); -+ nbttaglist2.add(NBTTagFloat.a(0.0F)); -+ cmp.set("HandDropChances", nbttaglist2); -+ } -+ -+ if (!cmp.hasKeyOfType("ArmorDropChances", 10)) { -+ nbttaglist2 = new NBTTagList(); -+ nbttaglist2.add(NBTTagFloat.a(nbttaglist1.d(1))); -+ nbttaglist2.add(NBTTagFloat.a(nbttaglist1.d(2))); -+ nbttaglist2.add(NBTTagFloat.a(nbttaglist1.d(3))); -+ nbttaglist2.add(NBTTagFloat.a(nbttaglist1.d(4))); -+ cmp.set("ArmorDropChances", nbttaglist2); -+ } -+ -+ cmp.remove("DropChances"); -+ } -+ -+ return cmp; -+ } -+ } -+ -+ private static class DataInspectorBlockEntity implements DataInspector { -+ -+ private static final Map b = Maps.newHashMap(); -+ private static final Map c = Maps.newHashMap(); -+ -+ DataInspectorBlockEntity() {} -+ -+ @Nullable -+ private static String convertEntityId(int i, String s) { -+ String key = new MinecraftKey(s).toString(); -+ if (i < 515 && DataInspectorBlockEntity.b.containsKey(key)) { -+ return DataInspectorBlockEntity.b.get(key); -+ } else { -+ return DataInspectorBlockEntity.c.get(key); -+ } -+ } -+ -+ public NBTTagCompound inspect(NBTTagCompound cmp, int sourceVer, int targetVer) { -+ if (!cmp.hasKeyOfType("tag", 10)) { -+ return cmp; -+ } else { -+ NBTTagCompound nbttagcompound1 = cmp.getCompound("tag"); -+ -+ if (nbttagcompound1.hasKeyOfType("BlockEntityTag", 10)) { -+ NBTTagCompound nbttagcompound2 = nbttagcompound1.getCompound("BlockEntityTag"); -+ String s = cmp.getString("id"); -+ String s1 = convertEntityId(sourceVer, s); -+ boolean flag; -+ -+ if (s1 == null) { -+ // CraftBukkit - Remove unnecessary warning (occurs when deserializing a Shulker Box item) -+ // DataInspectorBlockEntity.a.warn("Unable to resolve BlockEntity for ItemInstance: {}", s); -+ flag = false; -+ } else { -+ flag = !nbttagcompound2.hasKey("id"); -+ nbttagcompound2.setString("id", s1); -+ } -+ -+ convert(LegacyType.BLOCK_ENTITY, nbttagcompound2, sourceVer, targetVer); -+ if (flag) { -+ nbttagcompound2.remove("id"); -+ } -+ } -+ -+ return cmp; -+ } -+ } -+ -+ static { -+ Map map = DataInspectorBlockEntity.b; -+ -+ map.put("minecraft:furnace", "Furnace"); -+ map.put("minecraft:lit_furnace", "Furnace"); -+ map.put("minecraft:chest", "Chest"); -+ map.put("minecraft:trapped_chest", "Chest"); -+ map.put("minecraft:ender_chest", "EnderChest"); -+ map.put("minecraft:jukebox", "RecordPlayer"); -+ map.put("minecraft:dispenser", "Trap"); -+ map.put("minecraft:dropper", "Dropper"); -+ map.put("minecraft:sign", "Sign"); -+ map.put("minecraft:mob_spawner", "MobSpawner"); -+ map.put("minecraft:noteblock", "Music"); -+ map.put("minecraft:brewing_stand", "Cauldron"); -+ map.put("minecraft:enhanting_table", "EnchantTable"); -+ map.put("minecraft:command_block", "CommandBlock"); -+ map.put("minecraft:beacon", "Beacon"); -+ map.put("minecraft:skull", "Skull"); -+ map.put("minecraft:daylight_detector", "DLDetector"); -+ map.put("minecraft:hopper", "Hopper"); -+ map.put("minecraft:banner", "Banner"); -+ map.put("minecraft:flower_pot", "FlowerPot"); -+ map.put("minecraft:repeating_command_block", "CommandBlock"); -+ map.put("minecraft:chain_command_block", "CommandBlock"); -+ map.put("minecraft:standing_sign", "Sign"); -+ map.put("minecraft:wall_sign", "Sign"); -+ map.put("minecraft:piston_head", "Piston"); -+ map.put("minecraft:daylight_detector_inverted", "DLDetector"); -+ map.put("minecraft:unpowered_comparator", "Comparator"); -+ map.put("minecraft:powered_comparator", "Comparator"); -+ map.put("minecraft:wall_banner", "Banner"); -+ map.put("minecraft:standing_banner", "Banner"); -+ map.put("minecraft:structure_block", "Structure"); -+ map.put("minecraft:end_portal", "Airportal"); -+ map.put("minecraft:end_gateway", "EndGateway"); -+ map.put("minecraft:shield", "Shield"); -+ map = DataInspectorBlockEntity.c; -+ map.put("minecraft:furnace", "minecraft:furnace"); -+ map.put("minecraft:lit_furnace", "minecraft:furnace"); -+ map.put("minecraft:chest", "minecraft:chest"); -+ map.put("minecraft:trapped_chest", "minecraft:chest"); -+ map.put("minecraft:ender_chest", "minecraft:enderchest"); -+ map.put("minecraft:jukebox", "minecraft:jukebox"); -+ map.put("minecraft:dispenser", "minecraft:dispenser"); -+ map.put("minecraft:dropper", "minecraft:dropper"); -+ map.put("minecraft:sign", "minecraft:sign"); -+ map.put("minecraft:mob_spawner", "minecraft:mob_spawner"); -+ map.put("minecraft:noteblock", "minecraft:noteblock"); -+ map.put("minecraft:brewing_stand", "minecraft:brewing_stand"); -+ map.put("minecraft:enhanting_table", "minecraft:enchanting_table"); -+ map.put("minecraft:command_block", "minecraft:command_block"); -+ map.put("minecraft:beacon", "minecraft:beacon"); -+ map.put("minecraft:skull", "minecraft:skull"); -+ map.put("minecraft:daylight_detector", "minecraft:daylight_detector"); -+ map.put("minecraft:hopper", "minecraft:hopper"); -+ map.put("minecraft:banner", "minecraft:banner"); -+ map.put("minecraft:flower_pot", "minecraft:flower_pot"); -+ map.put("minecraft:repeating_command_block", "minecraft:command_block"); -+ map.put("minecraft:chain_command_block", "minecraft:command_block"); -+ map.put("minecraft:shulker_box", "minecraft:shulker_box"); -+ map.put("minecraft:white_shulker_box", "minecraft:shulker_box"); -+ map.put("minecraft:orange_shulker_box", "minecraft:shulker_box"); -+ map.put("minecraft:magenta_shulker_box", "minecraft:shulker_box"); -+ map.put("minecraft:light_blue_shulker_box", "minecraft:shulker_box"); -+ map.put("minecraft:yellow_shulker_box", "minecraft:shulker_box"); -+ map.put("minecraft:lime_shulker_box", "minecraft:shulker_box"); -+ map.put("minecraft:pink_shulker_box", "minecraft:shulker_box"); -+ map.put("minecraft:gray_shulker_box", "minecraft:shulker_box"); -+ map.put("minecraft:silver_shulker_box", "minecraft:shulker_box"); -+ map.put("minecraft:cyan_shulker_box", "minecraft:shulker_box"); -+ map.put("minecraft:purple_shulker_box", "minecraft:shulker_box"); -+ map.put("minecraft:blue_shulker_box", "minecraft:shulker_box"); -+ map.put("minecraft:brown_shulker_box", "minecraft:shulker_box"); -+ map.put("minecraft:green_shulker_box", "minecraft:shulker_box"); -+ map.put("minecraft:red_shulker_box", "minecraft:shulker_box"); -+ map.put("minecraft:black_shulker_box", "minecraft:shulker_box"); -+ map.put("minecraft:bed", "minecraft:bed"); -+ map.put("minecraft:standing_sign", "minecraft:sign"); -+ map.put("minecraft:wall_sign", "minecraft:sign"); -+ map.put("minecraft:piston_head", "minecraft:piston"); -+ map.put("minecraft:daylight_detector_inverted", "minecraft:daylight_detector"); -+ map.put("minecraft:unpowered_comparator", "minecraft:comparator"); -+ map.put("minecraft:powered_comparator", "minecraft:comparator"); -+ map.put("minecraft:wall_banner", "minecraft:banner"); -+ map.put("minecraft:standing_banner", "minecraft:banner"); -+ map.put("minecraft:structure_block", "minecraft:structure_block"); -+ map.put("minecraft:end_portal", "minecraft:end_portal"); -+ map.put("minecraft:end_gateway", "minecraft:end_gateway"); -+ map.put("minecraft:shield", "minecraft:shield"); -+ } -+ } -+ -+ private static class DataInspectorEntity implements DataInspector { -+ -+ private static final Logger a = LogManager.getLogger(); -+ -+ DataInspectorEntity() {} -+ -+ public NBTTagCompound inspect(NBTTagCompound cmp, int sourceVer, int targetVer) { -+ NBTTagCompound nbttagcompound1 = cmp.getCompound("tag"); -+ -+ if (nbttagcompound1.hasKeyOfType("EntityTag", 10)) { -+ NBTTagCompound nbttagcompound2 = nbttagcompound1.getCompound("EntityTag"); -+ String s = cmp.getString("id"); -+ String s1; -+ -+ if ("minecraft:armor_stand".equals(s)) { -+ s1 = sourceVer < 515 ? "ArmorStand" : "minecraft:armor_stand"; -+ } else { -+ if (!"minecraft:spawn_egg".equals(s)) { -+ return cmp; -+ } -+ -+ s1 = nbttagcompound2.getString("id"); -+ } -+ -+ boolean flag; -+ -+ if (s1 == null) { -+ DataInspectorEntity.a.warn("Unable to resolve Entity for ItemInstance: {}", s); -+ flag = false; -+ } else { -+ flag = !nbttagcompound2.hasKeyOfType("id", 8); -+ nbttagcompound2.setString("id", s1); -+ } -+ -+ convert(LegacyType.ENTITY, nbttagcompound2, sourceVer, targetVer); -+ if (flag) { -+ nbttagcompound2.remove("id"); -+ } -+ } -+ -+ return cmp; -+ } -+ } -+ -+ -+ private abstract static class DataInspectorTagged implements DataInspector { -+ -+ private final MinecraftKey key; -+ -+ DataInspectorTagged(String type) { -+ this.key = getKey(type); -+ } -+ -+ public NBTTagCompound inspect(NBTTagCompound cmp, int sourceVer, int targetVer) { -+ if (this.key.equals(new MinecraftKey(cmp.getString("id")))) { -+ cmp = this.inspectChecked(cmp, sourceVer, targetVer); -+ } -+ -+ return cmp; -+ } -+ -+ abstract NBTTagCompound inspectChecked(NBTTagCompound nbttagcompound, int sourceVer, int targetVer); -+ } -+ -+ private static class DataInspectorItemList extends DataInspectorTagged { -+ -+ private final String[] keys; -+ -+ DataInspectorItemList(String oclass, String... astring) { -+ super(oclass); -+ this.keys = astring; -+ } -+ -+ NBTTagCompound inspectChecked(NBTTagCompound nbttagcompound, int sourceVer, int targetVer) { -+ for (String s : this.keys) { -+ DataConverters.convertItems(nbttagcompound, s, sourceVer, targetVer); -+ } -+ -+ return nbttagcompound; -+ } -+ } -+ private static class DataInspectorItem extends DataInspectorTagged { -+ -+ private final String[] keys; -+ -+ DataInspectorItem(String oclass, String... astring) { -+ super(oclass); -+ this.keys = astring; -+ } -+ -+ NBTTagCompound inspectChecked(NBTTagCompound nbttagcompound, int sourceVer, int targetVer) { -+ for (String key : this.keys) { -+ DataConverters.convertItem(nbttagcompound, key, sourceVer, targetVer); -+ } -+ -+ return nbttagcompound; -+ } -+ } -+ -+ private static class DataConverterMaterialId implements DataConverter { -+ -+ private static final String[] materials = new String[2268]; -+ -+ DataConverterMaterialId() {} -+ -+ public int getDataVersion() { -+ return 102; -+ } -+ -+ public NBTTagCompound convert(NBTTagCompound cmp) { -+ if (cmp.hasKeyOfType("id", 99)) { -+ short short0 = cmp.getShort("id"); -+ -+ if (short0 > 0 && short0 < materials.length && materials[short0] != null) { -+ cmp.setString("id", materials[short0]); -+ } -+ } -+ -+ return cmp; -+ } -+ -+ static { -+ materials[1] = "minecraft:stone"; -+ materials[2] = "minecraft:grass"; -+ materials[3] = "minecraft:dirt"; -+ materials[4] = "minecraft:cobblestone"; -+ materials[5] = "minecraft:planks"; -+ materials[6] = "minecraft:sapling"; -+ materials[7] = "minecraft:bedrock"; -+ materials[8] = "minecraft:flowing_water"; -+ materials[9] = "minecraft:water"; -+ materials[10] = "minecraft:flowing_lava"; -+ materials[11] = "minecraft:lava"; -+ materials[12] = "minecraft:sand"; -+ materials[13] = "minecraft:gravel"; -+ materials[14] = "minecraft:gold_ore"; -+ materials[15] = "minecraft:iron_ore"; -+ materials[16] = "minecraft:coal_ore"; -+ materials[17] = "minecraft:log"; -+ materials[18] = "minecraft:leaves"; -+ materials[19] = "minecraft:sponge"; -+ materials[20] = "minecraft:glass"; -+ materials[21] = "minecraft:lapis_ore"; -+ materials[22] = "minecraft:lapis_block"; -+ materials[23] = "minecraft:dispenser"; -+ materials[24] = "minecraft:sandstone"; -+ materials[25] = "minecraft:noteblock"; -+ materials[27] = "minecraft:golden_rail"; -+ materials[28] = "minecraft:detector_rail"; -+ materials[29] = "minecraft:sticky_piston"; -+ materials[30] = "minecraft:web"; -+ materials[31] = "minecraft:tallgrass"; -+ materials[32] = "minecraft:deadbush"; -+ materials[33] = "minecraft:piston"; -+ materials[35] = "minecraft:wool"; -+ materials[37] = "minecraft:yellow_flower"; -+ materials[38] = "minecraft:red_flower"; -+ materials[39] = "minecraft:brown_mushroom"; -+ materials[40] = "minecraft:red_mushroom"; -+ materials[41] = "minecraft:gold_block"; -+ materials[42] = "minecraft:iron_block"; -+ materials[43] = "minecraft:double_stone_slab"; -+ materials[44] = "minecraft:stone_slab"; -+ materials[45] = "minecraft:brick_block"; -+ materials[46] = "minecraft:tnt"; -+ materials[47] = "minecraft:bookshelf"; -+ materials[48] = "minecraft:mossy_cobblestone"; -+ materials[49] = "minecraft:obsidian"; -+ materials[50] = "minecraft:torch"; -+ materials[51] = "minecraft:fire"; -+ materials[52] = "minecraft:mob_spawner"; -+ materials[53] = "minecraft:oak_stairs"; -+ materials[54] = "minecraft:chest"; -+ materials[56] = "minecraft:diamond_ore"; -+ materials[57] = "minecraft:diamond_block"; -+ materials[58] = "minecraft:crafting_table"; -+ materials[60] = "minecraft:farmland"; -+ materials[61] = "minecraft:furnace"; -+ materials[62] = "minecraft:lit_furnace"; -+ materials[65] = "minecraft:ladder"; -+ materials[66] = "minecraft:rail"; -+ materials[67] = "minecraft:stone_stairs"; -+ materials[69] = "minecraft:lever"; -+ materials[70] = "minecraft:stone_pressure_plate"; -+ materials[72] = "minecraft:wooden_pressure_plate"; -+ materials[73] = "minecraft:redstone_ore"; -+ materials[76] = "minecraft:redstone_torch"; -+ materials[77] = "minecraft:stone_button"; -+ materials[78] = "minecraft:snow_layer"; -+ materials[79] = "minecraft:ice"; -+ materials[80] = "minecraft:snow"; -+ materials[81] = "minecraft:cactus"; -+ materials[82] = "minecraft:clay"; -+ materials[84] = "minecraft:jukebox"; -+ materials[85] = "minecraft:fence"; -+ materials[86] = "minecraft:pumpkin"; -+ materials[87] = "minecraft:netherrack"; -+ materials[88] = "minecraft:soul_sand"; -+ materials[89] = "minecraft:glowstone"; -+ materials[90] = "minecraft:portal"; -+ materials[91] = "minecraft:lit_pumpkin"; -+ materials[95] = "minecraft:stained_glass"; -+ materials[96] = "minecraft:trapdoor"; -+ materials[97] = "minecraft:monster_egg"; -+ materials[98] = "minecraft:stonebrick"; -+ materials[99] = "minecraft:brown_mushroom_block"; -+ materials[100] = "minecraft:red_mushroom_block"; -+ materials[101] = "minecraft:iron_bars"; -+ materials[102] = "minecraft:glass_pane"; -+ materials[103] = "minecraft:melon_block"; -+ materials[106] = "minecraft:vine"; -+ materials[107] = "minecraft:fence_gate"; -+ materials[108] = "minecraft:brick_stairs"; -+ materials[109] = "minecraft:stone_brick_stairs"; -+ materials[110] = "minecraft:mycelium"; -+ materials[111] = "minecraft:waterlily"; -+ materials[112] = "minecraft:nether_brick"; -+ materials[113] = "minecraft:nether_brick_fence"; -+ materials[114] = "minecraft:nether_brick_stairs"; -+ materials[116] = "minecraft:enchanting_table"; -+ materials[119] = "minecraft:end_portal"; -+ materials[120] = "minecraft:end_portal_frame"; -+ materials[121] = "minecraft:end_stone"; -+ materials[122] = "minecraft:dragon_egg"; -+ materials[123] = "minecraft:redstone_lamp"; -+ materials[125] = "minecraft:double_wooden_slab"; -+ materials[126] = "minecraft:wooden_slab"; -+ materials[127] = "minecraft:cocoa"; -+ materials[128] = "minecraft:sandstone_stairs"; -+ materials[129] = "minecraft:emerald_ore"; -+ materials[130] = "minecraft:ender_chest"; -+ materials[131] = "minecraft:tripwire_hook"; -+ materials[133] = "minecraft:emerald_block"; -+ materials[134] = "minecraft:spruce_stairs"; -+ materials[135] = "minecraft:birch_stairs"; -+ materials[136] = "minecraft:jungle_stairs"; -+ materials[137] = "minecraft:command_block"; -+ materials[138] = "minecraft:beacon"; -+ materials[139] = "minecraft:cobblestone_wall"; -+ materials[141] = "minecraft:carrots"; -+ materials[142] = "minecraft:potatoes"; -+ materials[143] = "minecraft:wooden_button"; -+ materials[145] = "minecraft:anvil"; -+ materials[146] = "minecraft:trapped_chest"; -+ materials[147] = "minecraft:light_weighted_pressure_plate"; -+ materials[148] = "minecraft:heavy_weighted_pressure_plate"; -+ materials[151] = "minecraft:daylight_detector"; -+ materials[152] = "minecraft:redstone_block"; -+ materials[153] = "minecraft:quartz_ore"; -+ materials[154] = "minecraft:hopper"; -+ materials[155] = "minecraft:quartz_block"; -+ materials[156] = "minecraft:quartz_stairs"; -+ materials[157] = "minecraft:activator_rail"; -+ materials[158] = "minecraft:dropper"; -+ materials[159] = "minecraft:stained_hardened_clay"; -+ materials[160] = "minecraft:stained_glass_pane"; -+ materials[161] = "minecraft:leaves2"; -+ materials[162] = "minecraft:log2"; -+ materials[163] = "minecraft:acacia_stairs"; -+ materials[164] = "minecraft:dark_oak_stairs"; -+ materials[170] = "minecraft:hay_block"; -+ materials[171] = "minecraft:carpet"; -+ materials[172] = "minecraft:hardened_clay"; -+ materials[173] = "minecraft:coal_block"; -+ materials[174] = "minecraft:packed_ice"; -+ materials[175] = "minecraft:double_plant"; -+ materials[256] = "minecraft:iron_shovel"; -+ materials[257] = "minecraft:iron_pickaxe"; -+ materials[258] = "minecraft:iron_axe"; -+ materials[259] = "minecraft:flint_and_steel"; -+ materials[260] = "minecraft:apple"; -+ materials[261] = "minecraft:bow"; -+ materials[262] = "minecraft:arrow"; -+ materials[263] = "minecraft:coal"; -+ materials[264] = "minecraft:diamond"; -+ materials[265] = "minecraft:iron_ingot"; -+ materials[266] = "minecraft:gold_ingot"; -+ materials[267] = "minecraft:iron_sword"; -+ materials[268] = "minecraft:wooden_sword"; -+ materials[269] = "minecraft:wooden_shovel"; -+ materials[270] = "minecraft:wooden_pickaxe"; -+ materials[271] = "minecraft:wooden_axe"; -+ materials[272] = "minecraft:stone_sword"; -+ materials[273] = "minecraft:stone_shovel"; -+ materials[274] = "minecraft:stone_pickaxe"; -+ materials[275] = "minecraft:stone_axe"; -+ materials[276] = "minecraft:diamond_sword"; -+ materials[277] = "minecraft:diamond_shovel"; -+ materials[278] = "minecraft:diamond_pickaxe"; -+ materials[279] = "minecraft:diamond_axe"; -+ materials[280] = "minecraft:stick"; -+ materials[281] = "minecraft:bowl"; -+ materials[282] = "minecraft:mushroom_stew"; -+ materials[283] = "minecraft:golden_sword"; -+ materials[284] = "minecraft:golden_shovel"; -+ materials[285] = "minecraft:golden_pickaxe"; -+ materials[286] = "minecraft:golden_axe"; -+ materials[287] = "minecraft:string"; -+ materials[288] = "minecraft:feather"; -+ materials[289] = "minecraft:gunpowder"; -+ materials[290] = "minecraft:wooden_hoe"; -+ materials[291] = "minecraft:stone_hoe"; -+ materials[292] = "minecraft:iron_hoe"; -+ materials[293] = "minecraft:diamond_hoe"; -+ materials[294] = "minecraft:golden_hoe"; -+ materials[295] = "minecraft:wheat_seeds"; -+ materials[296] = "minecraft:wheat"; -+ materials[297] = "minecraft:bread"; -+ materials[298] = "minecraft:leather_helmet"; -+ materials[299] = "minecraft:leather_chestplate"; -+ materials[300] = "minecraft:leather_leggings"; -+ materials[301] = "minecraft:leather_boots"; -+ materials[302] = "minecraft:chainmail_helmet"; -+ materials[303] = "minecraft:chainmail_chestplate"; -+ materials[304] = "minecraft:chainmail_leggings"; -+ materials[305] = "minecraft:chainmail_boots"; -+ materials[306] = "minecraft:iron_helmet"; -+ materials[307] = "minecraft:iron_chestplate"; -+ materials[308] = "minecraft:iron_leggings"; -+ materials[309] = "minecraft:iron_boots"; -+ materials[310] = "minecraft:diamond_helmet"; -+ materials[311] = "minecraft:diamond_chestplate"; -+ materials[312] = "minecraft:diamond_leggings"; -+ materials[313] = "minecraft:diamond_boots"; -+ materials[314] = "minecraft:golden_helmet"; -+ materials[315] = "minecraft:golden_chestplate"; -+ materials[316] = "minecraft:golden_leggings"; -+ materials[317] = "minecraft:golden_boots"; -+ materials[318] = "minecraft:flint"; -+ materials[319] = "minecraft:porkchop"; -+ materials[320] = "minecraft:cooked_porkchop"; -+ materials[321] = "minecraft:painting"; -+ materials[322] = "minecraft:golden_apple"; -+ materials[323] = "minecraft:sign"; -+ materials[324] = "minecraft:wooden_door"; -+ materials[325] = "minecraft:bucket"; -+ materials[326] = "minecraft:water_bucket"; -+ materials[327] = "minecraft:lava_bucket"; -+ materials[328] = "minecraft:minecart"; -+ materials[329] = "minecraft:saddle"; -+ materials[330] = "minecraft:iron_door"; -+ materials[331] = "minecraft:redstone"; -+ materials[332] = "minecraft:snowball"; -+ materials[333] = "minecraft:boat"; -+ materials[334] = "minecraft:leather"; -+ materials[335] = "minecraft:milk_bucket"; -+ materials[336] = "minecraft:brick"; -+ materials[337] = "minecraft:clay_ball"; -+ materials[338] = "minecraft:reeds"; -+ materials[339] = "minecraft:paper"; -+ materials[340] = "minecraft:book"; -+ materials[341] = "minecraft:slime_ball"; -+ materials[342] = "minecraft:chest_minecart"; -+ materials[343] = "minecraft:furnace_minecart"; -+ materials[344] = "minecraft:egg"; -+ materials[345] = "minecraft:compass"; -+ materials[346] = "minecraft:fishing_rod"; -+ materials[347] = "minecraft:clock"; -+ materials[348] = "minecraft:glowstone_dust"; -+ materials[349] = "minecraft:fish"; -+ materials[350] = "minecraft:cooked_fish"; // Paper - cooked_fished -> cooked_fish -+ materials[351] = "minecraft:dye"; -+ materials[352] = "minecraft:bone"; -+ materials[353] = "minecraft:sugar"; -+ materials[354] = "minecraft:cake"; -+ materials[355] = "minecraft:bed"; -+ materials[356] = "minecraft:repeater"; -+ materials[357] = "minecraft:cookie"; -+ materials[358] = "minecraft:filled_map"; -+ materials[359] = "minecraft:shears"; -+ materials[360] = "minecraft:melon"; -+ materials[361] = "minecraft:pumpkin_seeds"; -+ materials[362] = "minecraft:melon_seeds"; -+ materials[363] = "minecraft:beef"; -+ materials[364] = "minecraft:cooked_beef"; -+ materials[365] = "minecraft:chicken"; -+ materials[366] = "minecraft:cooked_chicken"; -+ materials[367] = "minecraft:rotten_flesh"; -+ materials[368] = "minecraft:ender_pearl"; -+ materials[369] = "minecraft:blaze_rod"; -+ materials[370] = "minecraft:ghast_tear"; -+ materials[371] = "minecraft:gold_nugget"; -+ materials[372] = "minecraft:nether_wart"; -+ materials[373] = "minecraft:potion"; -+ materials[374] = "minecraft:glass_bottle"; -+ materials[375] = "minecraft:spider_eye"; -+ materials[376] = "minecraft:fermented_spider_eye"; -+ materials[377] = "minecraft:blaze_powder"; -+ materials[378] = "minecraft:magma_cream"; -+ materials[379] = "minecraft:brewing_stand"; -+ materials[380] = "minecraft:cauldron"; -+ materials[381] = "minecraft:ender_eye"; -+ materials[382] = "minecraft:speckled_melon"; -+ materials[383] = "minecraft:spawn_egg"; -+ materials[384] = "minecraft:experience_bottle"; -+ materials[385] = "minecraft:fire_charge"; -+ materials[386] = "minecraft:writable_book"; -+ materials[387] = "minecraft:written_book"; -+ materials[388] = "minecraft:emerald"; -+ materials[389] = "minecraft:item_frame"; -+ materials[390] = "minecraft:flower_pot"; -+ materials[391] = "minecraft:carrot"; -+ materials[392] = "minecraft:potato"; -+ materials[393] = "minecraft:baked_potato"; -+ materials[394] = "minecraft:poisonous_potato"; -+ materials[395] = "minecraft:map"; -+ materials[396] = "minecraft:golden_carrot"; -+ materials[397] = "minecraft:skull"; -+ materials[398] = "minecraft:carrot_on_a_stick"; -+ materials[399] = "minecraft:nether_star"; -+ materials[400] = "minecraft:pumpkin_pie"; -+ materials[401] = "minecraft:fireworks"; -+ materials[402] = "minecraft:firework_charge"; -+ materials[403] = "minecraft:enchanted_book"; -+ materials[404] = "minecraft:comparator"; -+ materials[405] = "minecraft:netherbrick"; -+ materials[406] = "minecraft:quartz"; -+ materials[407] = "minecraft:tnt_minecart"; -+ materials[408] = "minecraft:hopper_minecart"; -+ materials[417] = "minecraft:iron_horse_armor"; -+ materials[418] = "minecraft:golden_horse_armor"; -+ materials[419] = "minecraft:diamond_horse_armor"; -+ materials[420] = "minecraft:lead"; -+ materials[421] = "minecraft:name_tag"; -+ materials[422] = "minecraft:command_block_minecart"; -+ materials[2256] = "minecraft:record_13"; -+ materials[2257] = "minecraft:record_cat"; -+ materials[2258] = "minecraft:record_blocks"; -+ materials[2259] = "minecraft:record_chirp"; -+ materials[2260] = "minecraft:record_far"; -+ materials[2261] = "minecraft:record_mall"; -+ materials[2262] = "minecraft:record_mellohi"; -+ materials[2263] = "minecraft:record_stal"; -+ materials[2264] = "minecraft:record_strad"; -+ materials[2265] = "minecraft:record_ward"; -+ materials[2266] = "minecraft:record_11"; -+ materials[2267] = "minecraft:record_wait"; -+ // Paper start -+ materials[409] = "minecraft:prismarine_shard"; -+ materials[410] = "minecraft:prismarine_crystals"; -+ materials[411] = "minecraft:rabbit"; -+ materials[412] = "minecraft:cooked_rabbit"; -+ materials[413] = "minecraft:rabbit_stew"; -+ materials[414] = "minecraft:rabbit_foot"; -+ materials[415] = "minecraft:rabbit_hide"; -+ materials[416] = "minecraft:armor_stand"; -+ materials[423] = "minecraft:mutton"; -+ materials[424] = "minecraft:cooked_mutton"; -+ materials[425] = "minecraft:banner"; -+ materials[426] = "minecraft:end_crystal"; -+ materials[427] = "minecraft:spruce_door"; -+ materials[428] = "minecraft:birch_door"; -+ materials[429] = "minecraft:jungle_door"; -+ materials[430] = "minecraft:acacia_door"; -+ materials[431] = "minecraft:dark_oak_door"; -+ materials[432] = "minecraft:chorus_fruit"; -+ materials[433] = "minecraft:chorus_fruit_popped"; -+ materials[434] = "minecraft:beetroot"; -+ materials[435] = "minecraft:beetroot_seeds"; -+ materials[436] = "minecraft:beetroot_soup"; -+ materials[437] = "minecraft:dragon_breath"; -+ materials[438] = "minecraft:splash_potion"; -+ materials[439] = "minecraft:spectral_arrow"; -+ materials[440] = "minecraft:tipped_arrow"; -+ materials[441] = "minecraft:lingering_potion"; -+ materials[442] = "minecraft:shield"; -+ materials[443] = "minecraft:elytra"; -+ materials[444] = "minecraft:spruce_boat"; -+ materials[445] = "minecraft:birch_boat"; -+ materials[446] = "minecraft:jungle_boat"; -+ materials[447] = "minecraft:acacia_boat"; -+ materials[448] = "minecraft:dark_oak_boat"; -+ materials[449] = "minecraft:totem_of_undying"; -+ materials[450] = "minecraft:shulker_shell"; -+ materials[452] = "minecraft:iron_nugget"; -+ materials[453] = "minecraft:knowledge_book"; -+ // Paper end -+ } -+ } -+ -+ private static class DataConverterArmorStand implements DataConverter { -+ -+ DataConverterArmorStand() {} -+ -+ public int getDataVersion() { -+ return 147; -+ } -+ -+ public NBTTagCompound convert(NBTTagCompound cmp) { -+ if ("ArmorStand".equals(cmp.getString("id")) && cmp.getBoolean("Silent") && !cmp.getBoolean("Marker")) { -+ cmp.remove("Silent"); -+ } -+ -+ return cmp; -+ } -+ } -+ -+ private static class DataConverterBanner implements DataConverter { -+ -+ DataConverterBanner() {} -+ -+ public int getDataVersion() { -+ return 804; -+ } -+ -+ public NBTTagCompound convert(NBTTagCompound cmp) { -+ if ("minecraft:banner".equals(cmp.getString("id")) && cmp.hasKeyOfType("tag", 10)) { -+ NBTTagCompound nbttagcompound1 = cmp.getCompound("tag"); -+ -+ if (nbttagcompound1.hasKeyOfType("BlockEntityTag", 10)) { -+ NBTTagCompound nbttagcompound2 = nbttagcompound1.getCompound("BlockEntityTag"); -+ -+ if (nbttagcompound2.hasKeyOfType("Base", 99)) { -+ cmp.setShort("Damage", (short) (nbttagcompound2.getShort("Base") & 15)); -+ if (nbttagcompound1.hasKeyOfType("display", 10)) { -+ NBTTagCompound nbttagcompound3 = nbttagcompound1.getCompound("display"); -+ -+ if (nbttagcompound3.hasKeyOfType("Lore", 9)) { -+ NBTTagList nbttaglist = nbttagcompound3.getList("Lore", 8); -+ -+ if (nbttaglist.size() == 1 && "(+NBT)".equals(nbttaglist.getString(0))) { -+ return cmp; -+ } -+ } -+ } -+ -+ nbttagcompound2.remove("Base"); -+ if (nbttagcompound2.isEmpty()) { -+ nbttagcompound1.remove("BlockEntityTag"); -+ } -+ -+ if (nbttagcompound1.isEmpty()) { -+ cmp.remove("tag"); -+ } -+ } -+ } -+ } -+ -+ return cmp; -+ } -+ } -+ -+ private static class DataConverterPotionId implements DataConverter { -+ -+ private static final String[] potions = new String[128]; -+ -+ DataConverterPotionId() {} -+ -+ public int getDataVersion() { -+ return 102; -+ } -+ -+ public NBTTagCompound convert(NBTTagCompound cmp) { -+ if ("minecraft:potion".equals(cmp.getString("id"))) { -+ NBTTagCompound nbttagcompound1 = cmp.getCompound("tag"); -+ short short0 = cmp.getShort("Damage"); -+ -+ if (!nbttagcompound1.hasKeyOfType("Potion", 8)) { -+ String s = DataConverterPotionId.potions[short0 & 127]; -+ -+ nbttagcompound1.setString("Potion", s == null ? "minecraft:water" : s); -+ cmp.set("tag", nbttagcompound1); -+ if ((short0 & 16384) == 16384) { -+ cmp.setString("id", "minecraft:splash_potion"); -+ } -+ } -+ -+ if (short0 != 0) { -+ cmp.setShort("Damage", (short) 0); -+ } -+ } -+ -+ return cmp; -+ } -+ -+ static { -+ DataConverterPotionId.potions[0] = "minecraft:water"; -+ DataConverterPotionId.potions[1] = "minecraft:regeneration"; -+ DataConverterPotionId.potions[2] = "minecraft:swiftness"; -+ DataConverterPotionId.potions[3] = "minecraft:fire_resistance"; -+ DataConverterPotionId.potions[4] = "minecraft:poison"; -+ DataConverterPotionId.potions[5] = "minecraft:healing"; -+ DataConverterPotionId.potions[6] = "minecraft:night_vision"; -+ DataConverterPotionId.potions[7] = null; -+ DataConverterPotionId.potions[8] = "minecraft:weakness"; -+ DataConverterPotionId.potions[9] = "minecraft:strength"; -+ DataConverterPotionId.potions[10] = "minecraft:slowness"; -+ DataConverterPotionId.potions[11] = "minecraft:leaping"; -+ DataConverterPotionId.potions[12] = "minecraft:harming"; -+ DataConverterPotionId.potions[13] = "minecraft:water_breathing"; -+ DataConverterPotionId.potions[14] = "minecraft:invisibility"; -+ DataConverterPotionId.potions[15] = null; -+ DataConverterPotionId.potions[16] = "minecraft:awkward"; -+ DataConverterPotionId.potions[17] = "minecraft:regeneration"; -+ DataConverterPotionId.potions[18] = "minecraft:swiftness"; -+ DataConverterPotionId.potions[19] = "minecraft:fire_resistance"; -+ DataConverterPotionId.potions[20] = "minecraft:poison"; -+ DataConverterPotionId.potions[21] = "minecraft:healing"; -+ DataConverterPotionId.potions[22] = "minecraft:night_vision"; -+ DataConverterPotionId.potions[23] = null; -+ DataConverterPotionId.potions[24] = "minecraft:weakness"; -+ DataConverterPotionId.potions[25] = "minecraft:strength"; -+ DataConverterPotionId.potions[26] = "minecraft:slowness"; -+ DataConverterPotionId.potions[27] = "minecraft:leaping"; -+ DataConverterPotionId.potions[28] = "minecraft:harming"; -+ DataConverterPotionId.potions[29] = "minecraft:water_breathing"; -+ DataConverterPotionId.potions[30] = "minecraft:invisibility"; -+ DataConverterPotionId.potions[31] = null; -+ DataConverterPotionId.potions[32] = "minecraft:thick"; -+ DataConverterPotionId.potions[33] = "minecraft:strong_regeneration"; -+ DataConverterPotionId.potions[34] = "minecraft:strong_swiftness"; -+ DataConverterPotionId.potions[35] = "minecraft:fire_resistance"; -+ DataConverterPotionId.potions[36] = "minecraft:strong_poison"; -+ DataConverterPotionId.potions[37] = "minecraft:strong_healing"; -+ DataConverterPotionId.potions[38] = "minecraft:night_vision"; -+ DataConverterPotionId.potions[39] = null; -+ DataConverterPotionId.potions[40] = "minecraft:weakness"; -+ DataConverterPotionId.potions[41] = "minecraft:strong_strength"; -+ DataConverterPotionId.potions[42] = "minecraft:slowness"; -+ DataConverterPotionId.potions[43] = "minecraft:strong_leaping"; -+ DataConverterPotionId.potions[44] = "minecraft:strong_harming"; -+ DataConverterPotionId.potions[45] = "minecraft:water_breathing"; -+ DataConverterPotionId.potions[46] = "minecraft:invisibility"; -+ DataConverterPotionId.potions[47] = null; -+ DataConverterPotionId.potions[48] = null; -+ DataConverterPotionId.potions[49] = "minecraft:strong_regeneration"; -+ DataConverterPotionId.potions[50] = "minecraft:strong_swiftness"; -+ DataConverterPotionId.potions[51] = "minecraft:fire_resistance"; -+ DataConverterPotionId.potions[52] = "minecraft:strong_poison"; -+ DataConverterPotionId.potions[53] = "minecraft:strong_healing"; -+ DataConverterPotionId.potions[54] = "minecraft:night_vision"; -+ DataConverterPotionId.potions[55] = null; -+ DataConverterPotionId.potions[56] = "minecraft:weakness"; -+ DataConverterPotionId.potions[57] = "minecraft:strong_strength"; -+ DataConverterPotionId.potions[58] = "minecraft:slowness"; -+ DataConverterPotionId.potions[59] = "minecraft:strong_leaping"; -+ DataConverterPotionId.potions[60] = "minecraft:strong_harming"; -+ DataConverterPotionId.potions[61] = "minecraft:water_breathing"; -+ DataConverterPotionId.potions[62] = "minecraft:invisibility"; -+ DataConverterPotionId.potions[63] = null; -+ DataConverterPotionId.potions[64] = "minecraft:mundane"; -+ DataConverterPotionId.potions[65] = "minecraft:long_regeneration"; -+ DataConverterPotionId.potions[66] = "minecraft:long_swiftness"; -+ DataConverterPotionId.potions[67] = "minecraft:long_fire_resistance"; -+ DataConverterPotionId.potions[68] = "minecraft:long_poison"; -+ DataConverterPotionId.potions[69] = "minecraft:healing"; -+ DataConverterPotionId.potions[70] = "minecraft:long_night_vision"; -+ DataConverterPotionId.potions[71] = null; -+ DataConverterPotionId.potions[72] = "minecraft:long_weakness"; -+ DataConverterPotionId.potions[73] = "minecraft:long_strength"; -+ DataConverterPotionId.potions[74] = "minecraft:long_slowness"; -+ DataConverterPotionId.potions[75] = "minecraft:long_leaping"; -+ DataConverterPotionId.potions[76] = "minecraft:harming"; -+ DataConverterPotionId.potions[77] = "minecraft:long_water_breathing"; -+ DataConverterPotionId.potions[78] = "minecraft:long_invisibility"; -+ DataConverterPotionId.potions[79] = null; -+ DataConverterPotionId.potions[80] = "minecraft:awkward"; -+ DataConverterPotionId.potions[81] = "minecraft:long_regeneration"; -+ DataConverterPotionId.potions[82] = "minecraft:long_swiftness"; -+ DataConverterPotionId.potions[83] = "minecraft:long_fire_resistance"; -+ DataConverterPotionId.potions[84] = "minecraft:long_poison"; -+ DataConverterPotionId.potions[85] = "minecraft:healing"; -+ DataConverterPotionId.potions[86] = "minecraft:long_night_vision"; -+ DataConverterPotionId.potions[87] = null; -+ DataConverterPotionId.potions[88] = "minecraft:long_weakness"; -+ DataConverterPotionId.potions[89] = "minecraft:long_strength"; -+ DataConverterPotionId.potions[90] = "minecraft:long_slowness"; -+ DataConverterPotionId.potions[91] = "minecraft:long_leaping"; -+ DataConverterPotionId.potions[92] = "minecraft:harming"; -+ DataConverterPotionId.potions[93] = "minecraft:long_water_breathing"; -+ DataConverterPotionId.potions[94] = "minecraft:long_invisibility"; -+ DataConverterPotionId.potions[95] = null; -+ DataConverterPotionId.potions[96] = "minecraft:thick"; -+ DataConverterPotionId.potions[97] = "minecraft:regeneration"; -+ DataConverterPotionId.potions[98] = "minecraft:swiftness"; -+ DataConverterPotionId.potions[99] = "minecraft:long_fire_resistance"; -+ DataConverterPotionId.potions[100] = "minecraft:poison"; -+ DataConverterPotionId.potions[101] = "minecraft:strong_healing"; -+ DataConverterPotionId.potions[102] = "minecraft:long_night_vision"; -+ DataConverterPotionId.potions[103] = null; -+ DataConverterPotionId.potions[104] = "minecraft:long_weakness"; -+ DataConverterPotionId.potions[105] = "minecraft:strength"; -+ DataConverterPotionId.potions[106] = "minecraft:long_slowness"; -+ DataConverterPotionId.potions[107] = "minecraft:leaping"; -+ DataConverterPotionId.potions[108] = "minecraft:strong_harming"; -+ DataConverterPotionId.potions[109] = "minecraft:long_water_breathing"; -+ DataConverterPotionId.potions[110] = "minecraft:long_invisibility"; -+ DataConverterPotionId.potions[111] = null; -+ DataConverterPotionId.potions[112] = null; -+ DataConverterPotionId.potions[113] = "minecraft:regeneration"; -+ DataConverterPotionId.potions[114] = "minecraft:swiftness"; -+ DataConverterPotionId.potions[115] = "minecraft:long_fire_resistance"; -+ DataConverterPotionId.potions[116] = "minecraft:poison"; -+ DataConverterPotionId.potions[117] = "minecraft:strong_healing"; -+ DataConverterPotionId.potions[118] = "minecraft:long_night_vision"; -+ DataConverterPotionId.potions[119] = null; -+ DataConverterPotionId.potions[120] = "minecraft:long_weakness"; -+ DataConverterPotionId.potions[121] = "minecraft:strength"; -+ DataConverterPotionId.potions[122] = "minecraft:long_slowness"; -+ DataConverterPotionId.potions[123] = "minecraft:leaping"; -+ DataConverterPotionId.potions[124] = "minecraft:strong_harming"; -+ DataConverterPotionId.potions[125] = "minecraft:long_water_breathing"; -+ DataConverterPotionId.potions[126] = "minecraft:long_invisibility"; -+ DataConverterPotionId.potions[127] = null; -+ } -+ } -+ -+ private static class DataConverterSpawnEgg implements DataConverter { -+ -+ private static final String[] eggs = new String[256]; -+ -+ DataConverterSpawnEgg() {} -+ -+ public int getDataVersion() { -+ return 105; -+ } -+ -+ public NBTTagCompound convert(NBTTagCompound cmp) { -+ if ("minecraft:spawn_egg".equals(cmp.getString("id"))) { -+ NBTTagCompound nbttagcompound1 = cmp.getCompound("tag"); -+ NBTTagCompound nbttagcompound2 = nbttagcompound1.getCompound("EntityTag"); -+ short short0 = cmp.getShort("Damage"); -+ -+ if (!nbttagcompound2.hasKeyOfType("id", 8)) { -+ String s = DataConverterSpawnEgg.eggs[short0 & 255]; -+ -+ if (s != null) { -+ nbttagcompound2.setString("id", s); -+ nbttagcompound1.set("EntityTag", nbttagcompound2); -+ cmp.set("tag", nbttagcompound1); -+ } -+ } -+ -+ if (short0 != 0) { -+ cmp.setShort("Damage", (short) 0); -+ } -+ } -+ -+ return cmp; -+ } -+ -+ static { -+ -+ DataConverterSpawnEgg.eggs[1] = "Item"; -+ DataConverterSpawnEgg.eggs[2] = "XPOrb"; -+ DataConverterSpawnEgg.eggs[7] = "ThrownEgg"; -+ DataConverterSpawnEgg.eggs[8] = "LeashKnot"; -+ DataConverterSpawnEgg.eggs[9] = "Painting"; -+ DataConverterSpawnEgg.eggs[10] = "Arrow"; -+ DataConverterSpawnEgg.eggs[11] = "Snowball"; -+ DataConverterSpawnEgg.eggs[12] = "Fireball"; -+ DataConverterSpawnEgg.eggs[13] = "SmallFireball"; -+ DataConverterSpawnEgg.eggs[14] = "ThrownEnderpearl"; -+ DataConverterSpawnEgg.eggs[15] = "EyeOfEnderSignal"; -+ DataConverterSpawnEgg.eggs[16] = "ThrownPotion"; -+ DataConverterSpawnEgg.eggs[17] = "ThrownExpBottle"; -+ DataConverterSpawnEgg.eggs[18] = "ItemFrame"; -+ DataConverterSpawnEgg.eggs[19] = "WitherSkull"; -+ DataConverterSpawnEgg.eggs[20] = "PrimedTnt"; -+ DataConverterSpawnEgg.eggs[21] = "FallingSand"; -+ DataConverterSpawnEgg.eggs[22] = "FireworksRocketEntity"; -+ DataConverterSpawnEgg.eggs[23] = "TippedArrow"; -+ DataConverterSpawnEgg.eggs[24] = "SpectralArrow"; -+ DataConverterSpawnEgg.eggs[25] = "ShulkerBullet"; -+ DataConverterSpawnEgg.eggs[26] = "DragonFireball"; -+ DataConverterSpawnEgg.eggs[30] = "ArmorStand"; -+ DataConverterSpawnEgg.eggs[41] = "Boat"; -+ DataConverterSpawnEgg.eggs[42] = "MinecartRideable"; -+ DataConverterSpawnEgg.eggs[43] = "MinecartChest"; -+ DataConverterSpawnEgg.eggs[44] = "MinecartFurnace"; -+ DataConverterSpawnEgg.eggs[45] = "MinecartTNT"; -+ DataConverterSpawnEgg.eggs[46] = "MinecartHopper"; -+ DataConverterSpawnEgg.eggs[47] = "MinecartSpawner"; -+ DataConverterSpawnEgg.eggs[40] = "MinecartCommandBlock"; -+ DataConverterSpawnEgg.eggs[48] = "Mob"; -+ DataConverterSpawnEgg.eggs[49] = "Monster"; -+ DataConverterSpawnEgg.eggs[50] = "Creeper"; -+ DataConverterSpawnEgg.eggs[51] = "Skeleton"; -+ DataConverterSpawnEgg.eggs[52] = "Spider"; -+ DataConverterSpawnEgg.eggs[53] = "Giant"; -+ DataConverterSpawnEgg.eggs[54] = "Zombie"; -+ DataConverterSpawnEgg.eggs[55] = "Slime"; -+ DataConverterSpawnEgg.eggs[56] = "Ghast"; -+ DataConverterSpawnEgg.eggs[57] = "PigZombie"; -+ DataConverterSpawnEgg.eggs[58] = "Enderman"; -+ DataConverterSpawnEgg.eggs[59] = "CaveSpider"; -+ DataConverterSpawnEgg.eggs[60] = "Silverfish"; -+ DataConverterSpawnEgg.eggs[61] = "Blaze"; -+ DataConverterSpawnEgg.eggs[62] = "LavaSlime"; -+ DataConverterSpawnEgg.eggs[63] = "EnderDragon"; -+ DataConverterSpawnEgg.eggs[64] = "WitherBoss"; -+ DataConverterSpawnEgg.eggs[65] = "Bat"; -+ DataConverterSpawnEgg.eggs[66] = "Witch"; -+ DataConverterSpawnEgg.eggs[67] = "Endermite"; -+ DataConverterSpawnEgg.eggs[68] = "Guardian"; -+ DataConverterSpawnEgg.eggs[69] = "Shulker"; -+ DataConverterSpawnEgg.eggs[90] = "Pig"; -+ DataConverterSpawnEgg.eggs[91] = "Sheep"; -+ DataConverterSpawnEgg.eggs[92] = "Cow"; -+ DataConverterSpawnEgg.eggs[93] = "Chicken"; -+ DataConverterSpawnEgg.eggs[94] = "Squid"; -+ DataConverterSpawnEgg.eggs[95] = "Wolf"; -+ DataConverterSpawnEgg.eggs[96] = "MushroomCow"; -+ DataConverterSpawnEgg.eggs[97] = "SnowMan"; -+ DataConverterSpawnEgg.eggs[98] = "Ozelot"; -+ DataConverterSpawnEgg.eggs[99] = "VillagerGolem"; -+ DataConverterSpawnEgg.eggs[100] = "EntityHorse"; -+ DataConverterSpawnEgg.eggs[101] = "Rabbit"; -+ DataConverterSpawnEgg.eggs[120] = "Villager"; -+ DataConverterSpawnEgg.eggs[200] = "EnderCrystal"; -+ } -+ } -+ -+ private static class DataConverterMinecart implements DataConverter { -+ -+ private static final List a = Lists.newArrayList(new String[] { "MinecartRideable", "MinecartChest", "MinecartFurnace", "MinecartTNT", "MinecartSpawner", "MinecartHopper", "MinecartCommandBlock"}); -+ -+ DataConverterMinecart() {} -+ -+ public int getDataVersion() { -+ return 106; -+ } -+ -+ public NBTTagCompound convert(NBTTagCompound cmp) { -+ if ("Minecart".equals(cmp.getString("id"))) { -+ String s = "MinecartRideable"; -+ int i = cmp.getInt("Type"); -+ -+ if (i > 0 && i < DataConverterMinecart.a.size()) { -+ s = DataConverterMinecart.a.get(i); -+ } -+ -+ cmp.setString("id", s); -+ cmp.remove("Type"); -+ } -+ -+ return cmp; -+ } -+ } -+ -+ private static class DataConverterMobSpawner implements DataConverter { -+ -+ DataConverterMobSpawner() {} -+ -+ public int getDataVersion() { -+ return 107; -+ } -+ -+ public NBTTagCompound convert(NBTTagCompound cmp) { -+ if (!"MobSpawner".equals(cmp.getString("id"))) { -+ return cmp; -+ } else { -+ if (cmp.hasKeyOfType("EntityId", 8)) { -+ String s = cmp.getString("EntityId"); -+ NBTTagCompound nbttagcompound1 = cmp.getCompound("SpawnData"); -+ -+ nbttagcompound1.setString("id", s.isEmpty() ? "Pig" : s); -+ cmp.set("SpawnData", nbttagcompound1); -+ cmp.remove("EntityId"); -+ } -+ -+ if (cmp.hasKeyOfType("SpawnPotentials", 9)) { -+ NBTTagList nbttaglist = cmp.getList("SpawnPotentials", 10); -+ -+ for (int i = 0; i < nbttaglist.size(); ++i) { -+ NBTTagCompound nbttagcompound2 = nbttaglist.getCompound(i); -+ -+ if (nbttagcompound2.hasKeyOfType("Type", 8)) { -+ NBTTagCompound nbttagcompound3 = nbttagcompound2.getCompound("Properties"); -+ -+ nbttagcompound3.setString("id", nbttagcompound2.getString("Type")); -+ nbttagcompound2.set("Entity", nbttagcompound3); -+ nbttagcompound2.remove("Type"); -+ nbttagcompound2.remove("Properties"); -+ } -+ } -+ } -+ -+ return cmp; -+ } -+ } -+ } -+ -+ private static class DataConverterUUID implements DataConverter { -+ -+ DataConverterUUID() {} -+ -+ public int getDataVersion() { -+ return 108; -+ } -+ -+ public NBTTagCompound convert(NBTTagCompound cmp) { -+ if (cmp.hasKeyOfType("UUID", 8)) { -+ cmp.setUUID("UUID", UUID.fromString(cmp.getString("UUID"))); -+ } -+ -+ return cmp; -+ } -+ } -+ -+ private static class DataConverterHealth implements DataConverter { -+ -+ private static final Set a = Sets.newHashSet(new String[] { "ArmorStand", "Bat", "Blaze", "CaveSpider", "Chicken", "Cow", "Creeper", "EnderDragon", "Enderman", "Endermite", "EntityHorse", "Ghast", "Giant", "Guardian", "LavaSlime", "MushroomCow", "Ozelot", "Pig", "PigZombie", "Rabbit", "Sheep", "Shulker", "Silverfish", "Skeleton", "Slime", "SnowMan", "Spider", "Squid", "Villager", "VillagerGolem", "Witch", "WitherBoss", "Wolf", "Zombie"}); -+ -+ DataConverterHealth() {} -+ -+ public int getDataVersion() { -+ return 109; -+ } -+ -+ public NBTTagCompound convert(NBTTagCompound cmp) { -+ if (DataConverterHealth.a.contains(cmp.getString("id"))) { -+ float f; -+ -+ if (cmp.hasKeyOfType("HealF", 99)) { -+ f = cmp.getFloat("HealF"); -+ cmp.remove("HealF"); -+ } else { -+ if (!cmp.hasKeyOfType("Health", 99)) { -+ return cmp; -+ } -+ -+ f = cmp.getFloat("Health"); -+ } -+ -+ cmp.setFloat("Health", f); -+ } -+ -+ return cmp; -+ } -+ } -+ -+ private static class DataConverterSaddle implements DataConverter { -+ -+ DataConverterSaddle() {} -+ -+ public int getDataVersion() { -+ return 110; -+ } -+ -+ public NBTTagCompound convert(NBTTagCompound cmp) { -+ if ("EntityHorse".equals(cmp.getString("id")) && !cmp.hasKeyOfType("SaddleItem", 10) && cmp.getBoolean("Saddle")) { -+ NBTTagCompound nbttagcompound1 = new NBTTagCompound(); -+ -+ nbttagcompound1.setString("id", "minecraft:saddle"); -+ nbttagcompound1.setByte("Count", (byte) 1); -+ nbttagcompound1.setShort("Damage", (short) 0); -+ cmp.set("SaddleItem", nbttagcompound1); -+ cmp.remove("Saddle"); -+ } -+ -+ return cmp; -+ } -+ } -+ -+ private static class DataConverterHanging implements DataConverter { -+ -+ DataConverterHanging() {} -+ -+ public int getDataVersion() { -+ return 111; -+ } -+ -+ public NBTTagCompound convert(NBTTagCompound cmp) { -+ String s = cmp.getString("id"); -+ boolean flag = "Painting".equals(s); -+ boolean flag1 = "ItemFrame".equals(s); -+ -+ if ((flag || flag1) && !cmp.hasKeyOfType("Facing", 99)) { -+ EnumDirection enumdirection; -+ -+ if (cmp.hasKeyOfType("Direction", 99)) { -+ enumdirection = EnumDirection.fromType2(cmp.getByte("Direction")); -+ cmp.setInt("TileX", cmp.getInt("TileX") + enumdirection.getAdjacentX()); -+ cmp.setInt("TileY", cmp.getInt("TileY") + enumdirection.getAdjacentY()); -+ cmp.setInt("TileZ", cmp.getInt("TileZ") + enumdirection.getAdjacentZ()); -+ cmp.remove("Direction"); -+ if (flag1 && cmp.hasKeyOfType("ItemRotation", 99)) { -+ cmp.setByte("ItemRotation", (byte) (cmp.getByte("ItemRotation") * 2)); -+ } -+ } else { -+ enumdirection = EnumDirection.fromType2(cmp.getByte("Dir")); -+ cmp.remove("Dir"); -+ } -+ -+ cmp.setByte("Facing", (byte) enumdirection.get2DRotationValue()); -+ } -+ -+ return cmp; -+ } -+ } -+ -+ private static class DataConverterDropChances implements DataConverter { -+ -+ DataConverterDropChances() {} -+ -+ public int getDataVersion() { -+ return 113; -+ } -+ -+ public NBTTagCompound convert(NBTTagCompound cmp) { -+ NBTTagList nbttaglist; -+ -+ if (cmp.hasKeyOfType("HandDropChances", 9)) { -+ nbttaglist = cmp.getList("HandDropChances", 5); -+ if (nbttaglist.size() == 2 && nbttaglist.d(0) == 0.0F && nbttaglist.d(1) == 0.0F) { -+ cmp.remove("HandDropChances"); -+ } -+ } -+ -+ if (cmp.hasKeyOfType("ArmorDropChances", 9)) { -+ nbttaglist = cmp.getList("ArmorDropChances", 5); -+ if (nbttaglist.size() == 4 && nbttaglist.d(0) == 0.0F && nbttaglist.d(1) == 0.0F && nbttaglist.d(2) == 0.0F && nbttaglist.d(3) == 0.0F) { -+ cmp.remove("ArmorDropChances"); -+ } -+ } -+ -+ return cmp; -+ } -+ } -+ -+ private static class DataConverterRiding implements DataConverter { -+ -+ DataConverterRiding() {} -+ -+ public int getDataVersion() { -+ return 135; -+ } -+ -+ public NBTTagCompound convert(NBTTagCompound cmp) { -+ while (cmp.hasKeyOfType("Riding", 10)) { -+ NBTTagCompound nbttagcompound1 = this.b(cmp); -+ -+ this.convert(cmp, nbttagcompound1); -+ cmp = nbttagcompound1; -+ } -+ -+ return cmp; -+ } -+ -+ protected void convert(NBTTagCompound nbttagcompound, NBTTagCompound nbttagcompound1) { -+ NBTTagList nbttaglist = new NBTTagList(); -+ -+ nbttaglist.add(nbttagcompound); -+ nbttagcompound1.set("Passengers", nbttaglist); -+ } -+ -+ protected NBTTagCompound b(NBTTagCompound nbttagcompound) { -+ NBTTagCompound nbttagcompound1 = nbttagcompound.getCompound("Riding"); -+ -+ nbttagcompound.remove("Riding"); -+ return nbttagcompound1; -+ } -+ } -+ -+ private static class DataConverterBook implements DataConverter { -+ -+ DataConverterBook() {} -+ -+ public int getDataVersion() { -+ return 165; -+ } -+ -+ public NBTTagCompound convert(NBTTagCompound cmp) { -+ if ("minecraft:written_book".equals(cmp.getString("id"))) { -+ NBTTagCompound nbttagcompound1 = cmp.getCompound("tag"); -+ -+ if (nbttagcompound1.hasKeyOfType("pages", 9)) { -+ NBTTagList nbttaglist = nbttagcompound1.getList("pages", 8); -+ -+ for (int i = 0; i < nbttaglist.size(); ++i) { -+ String s = nbttaglist.getString(i); -+ Object object = null; -+ -+ if (!"null".equals(s) && !UtilColor.b(s)) { -+ if ((s.charAt(0) != 34 || s.charAt(s.length() - 1) != 34) && (s.charAt(0) != 123 || s.charAt(s.length() - 1) != 125)) { -+ object = new ChatComponentText(s); -+ } else { -+ try { -+ object = ChatDeserializer.a(DataConverterSignText.a, s, IChatBaseComponent.class, true); -+ if (object == null) { -+ object = new ChatComponentText(""); -+ } -+ } catch (JsonParseException jsonparseexception) { -+ ; -+ } -+ -+ if (object == null) { -+ try { -+ object = IChatBaseComponent.ChatSerializer.a(s); -+ } catch (JsonParseException jsonparseexception1) { -+ ; -+ } -+ } -+ -+ if (object == null) { -+ try { -+ object = IChatBaseComponent.ChatSerializer.b(s); -+ } catch (JsonParseException jsonparseexception2) { -+ ; -+ } -+ } -+ -+ if (object == null) { -+ object = new ChatComponentText(s); -+ } -+ } -+ } else { -+ object = new ChatComponentText(""); -+ } -+ -+ nbttaglist.set(i, NBTTagString.a(IChatBaseComponent.ChatSerializer.a((IChatBaseComponent) object))); -+ } -+ -+ nbttagcompound1.set("pages", nbttaglist); -+ } -+ } -+ -+ return cmp; -+ } -+ } -+ -+ private static class DataConverterCookedFish implements DataConverter { -+ -+ private static final MinecraftKey a = new MinecraftKey("cooked_fished"); -+ -+ DataConverterCookedFish() {} -+ -+ public int getDataVersion() { -+ return 502; -+ } -+ -+ public NBTTagCompound convert(NBTTagCompound cmp) { -+ if (cmp.hasKeyOfType("id", 8) && DataConverterCookedFish.a.equals(new MinecraftKey(cmp.getString("id")))) { -+ cmp.setString("id", "minecraft:cooked_fish"); -+ } -+ -+ return cmp; -+ } -+ } -+ -+ private static class DataConverterZombie implements DataConverter { -+ -+ private static final Random a = new Random(); -+ -+ DataConverterZombie() {} -+ -+ public int getDataVersion() { -+ return 502; -+ } -+ -+ public NBTTagCompound convert(NBTTagCompound cmp) { -+ if ("Zombie".equals(cmp.getString("id")) && cmp.getBoolean("IsVillager")) { -+ if (!cmp.hasKeyOfType("ZombieType", 99)) { -+ int i = -1; -+ -+ if (cmp.hasKeyOfType("VillagerProfession", 99)) { -+ try { -+ i = this.convert(cmp.getInt("VillagerProfession")); -+ } catch (RuntimeException runtimeexception) { -+ ; -+ } -+ } -+ -+ if (i == -1) { -+ i = this.convert(DataConverterZombie.a.nextInt(6)); -+ } -+ -+ cmp.setInt("ZombieType", i); -+ } -+ -+ cmp.remove("IsVillager"); -+ } -+ -+ return cmp; -+ } -+ -+ private int convert(int i) { -+ return i >= 0 && i < 6 ? i : -1; -+ } -+ } -+ -+ private static class DataConverterVBO implements DataConverter { -+ -+ DataConverterVBO() {} -+ -+ public int getDataVersion() { -+ return 505; -+ } -+ -+ public NBTTagCompound convert(NBTTagCompound cmp) { -+ cmp.setString("useVbo", "true"); -+ return cmp; -+ } -+ } -+ -+ private static class DataConverterGuardian implements DataConverter { -+ -+ DataConverterGuardian() {} -+ -+ public int getDataVersion() { -+ return 700; -+ } -+ -+ public NBTTagCompound convert(NBTTagCompound cmp) { -+ if ("Guardian".equals(cmp.getString("id"))) { -+ if (cmp.getBoolean("Elder")) { -+ cmp.setString("id", "ElderGuardian"); -+ } -+ -+ cmp.remove("Elder"); -+ } -+ -+ return cmp; -+ } -+ } -+ -+ private static class DataConverterSkeleton implements DataConverter { -+ -+ DataConverterSkeleton() {} -+ -+ public int getDataVersion() { -+ return 701; -+ } -+ -+ public NBTTagCompound convert(NBTTagCompound cmp) { -+ String s = cmp.getString("id"); -+ -+ if ("Skeleton".equals(s)) { -+ int i = cmp.getInt("SkeletonType"); -+ -+ if (i == 1) { -+ cmp.setString("id", "WitherSkeleton"); -+ } else if (i == 2) { -+ cmp.setString("id", "Stray"); -+ } -+ -+ cmp.remove("SkeletonType"); -+ } -+ -+ return cmp; -+ } -+ } -+ -+ private static class DataConverterZombieType implements DataConverter { -+ -+ DataConverterZombieType() {} -+ -+ public int getDataVersion() { -+ return 702; -+ } -+ -+ public NBTTagCompound convert(NBTTagCompound cmp) { -+ if ("Zombie".equals(cmp.getString("id"))) { -+ int i = cmp.getInt("ZombieType"); -+ -+ switch (i) { -+ case 0: -+ default: -+ break; -+ -+ case 1: -+ case 2: -+ case 3: -+ case 4: -+ case 5: -+ cmp.setString("id", "ZombieVillager"); -+ cmp.setInt("Profession", i - 1); -+ break; -+ -+ case 6: -+ cmp.setString("id", "Husk"); -+ } -+ -+ cmp.remove("ZombieType"); -+ } -+ -+ return cmp; -+ } -+ } -+ -+ private static class DataConverterHorse implements DataConverter { -+ -+ DataConverterHorse() {} -+ -+ public int getDataVersion() { -+ return 703; -+ } -+ -+ public NBTTagCompound convert(NBTTagCompound cmp) { -+ if ("EntityHorse".equals(cmp.getString("id"))) { -+ int i = cmp.getInt("Type"); -+ -+ switch (i) { -+ case 0: -+ default: -+ cmp.setString("id", "Horse"); -+ break; -+ -+ case 1: -+ cmp.setString("id", "Donkey"); -+ break; -+ -+ case 2: -+ cmp.setString("id", "Mule"); -+ break; -+ -+ case 3: -+ cmp.setString("id", "ZombieHorse"); -+ break; -+ -+ case 4: -+ cmp.setString("id", "SkeletonHorse"); -+ } -+ -+ cmp.remove("Type"); -+ } -+ -+ return cmp; -+ } -+ } -+ -+ private static class DataConverterTileEntity implements DataConverter { -+ -+ private static final Map a = Maps.newHashMap(); -+ -+ DataConverterTileEntity() {} -+ -+ public int getDataVersion() { -+ return 704; -+ } -+ -+ public NBTTagCompound convert(NBTTagCompound cmp) { -+ String s = DataConverterTileEntity.a.get(cmp.getString("id")); -+ -+ if (s != null) { -+ cmp.setString("id", s); -+ } -+ -+ return cmp; -+ } -+ -+ static { -+ DataConverterTileEntity.a.put("Airportal", "minecraft:end_portal"); -+ DataConverterTileEntity.a.put("Banner", "minecraft:banner"); -+ DataConverterTileEntity.a.put("Beacon", "minecraft:beacon"); -+ DataConverterTileEntity.a.put("Cauldron", "minecraft:brewing_stand"); -+ DataConverterTileEntity.a.put("Chest", "minecraft:chest"); -+ DataConverterTileEntity.a.put("Comparator", "minecraft:comparator"); -+ DataConverterTileEntity.a.put("Control", "minecraft:command_block"); -+ DataConverterTileEntity.a.put("DLDetector", "minecraft:daylight_detector"); -+ DataConverterTileEntity.a.put("Dropper", "minecraft:dropper"); -+ DataConverterTileEntity.a.put("EnchantTable", "minecraft:enchanting_table"); -+ DataConverterTileEntity.a.put("EndGateway", "minecraft:end_gateway"); -+ DataConverterTileEntity.a.put("EnderChest", "minecraft:ender_chest"); -+ DataConverterTileEntity.a.put("FlowerPot", "minecraft:flower_pot"); -+ DataConverterTileEntity.a.put("Furnace", "minecraft:furnace"); -+ DataConverterTileEntity.a.put("Hopper", "minecraft:hopper"); -+ DataConverterTileEntity.a.put("MobSpawner", "minecraft:mob_spawner"); -+ DataConverterTileEntity.a.put("Music", "minecraft:noteblock"); -+ DataConverterTileEntity.a.put("Piston", "minecraft:piston"); -+ DataConverterTileEntity.a.put("RecordPlayer", "minecraft:jukebox"); -+ DataConverterTileEntity.a.put("Sign", "minecraft:sign"); -+ DataConverterTileEntity.a.put("Skull", "minecraft:skull"); -+ DataConverterTileEntity.a.put("Structure", "minecraft:structure_block"); -+ DataConverterTileEntity.a.put("Trap", "minecraft:dispenser"); -+ } -+ } -+ -+ private static class DataConverterEntity implements DataConverter { -+ -+ private static final Map a = Maps.newHashMap(); -+ -+ DataConverterEntity() {} -+ -+ public int getDataVersion() { -+ return 704; -+ } -+ -+ public NBTTagCompound convert(NBTTagCompound cmp) { -+ String s = DataConverterEntity.a.get(cmp.getString("id")); -+ -+ if (s != null) { -+ cmp.setString("id", s); -+ } -+ -+ return cmp; -+ } -+ -+ static { -+ DataConverterEntity.a.put("AreaEffectCloud", "minecraft:area_effect_cloud"); -+ DataConverterEntity.a.put("ArmorStand", "minecraft:armor_stand"); -+ DataConverterEntity.a.put("Arrow", "minecraft:arrow"); -+ DataConverterEntity.a.put("Bat", "minecraft:bat"); -+ DataConverterEntity.a.put("Blaze", "minecraft:blaze"); -+ DataConverterEntity.a.put("Boat", "minecraft:boat"); -+ DataConverterEntity.a.put("CaveSpider", "minecraft:cave_spider"); -+ DataConverterEntity.a.put("Chicken", "minecraft:chicken"); -+ DataConverterEntity.a.put("Cow", "minecraft:cow"); -+ DataConverterEntity.a.put("Creeper", "minecraft:creeper"); -+ DataConverterEntity.a.put("Donkey", "minecraft:donkey"); -+ DataConverterEntity.a.put("DragonFireball", "minecraft:dragon_fireball"); -+ DataConverterEntity.a.put("ElderGuardian", "minecraft:elder_guardian"); -+ DataConverterEntity.a.put("EnderCrystal", "minecraft:ender_crystal"); -+ DataConverterEntity.a.put("EnderDragon", "minecraft:ender_dragon"); -+ DataConverterEntity.a.put("Enderman", "minecraft:enderman"); -+ DataConverterEntity.a.put("Endermite", "minecraft:endermite"); -+ DataConverterEntity.a.put("EyeOfEnderSignal", "minecraft:eye_of_ender_signal"); -+ DataConverterEntity.a.put("FallingSand", "minecraft:falling_block"); -+ DataConverterEntity.a.put("Fireball", "minecraft:fireball"); -+ DataConverterEntity.a.put("FireworksRocketEntity", "minecraft:fireworks_rocket"); -+ DataConverterEntity.a.put("Ghast", "minecraft:ghast"); -+ DataConverterEntity.a.put("Giant", "minecraft:giant"); -+ DataConverterEntity.a.put("Guardian", "minecraft:guardian"); -+ DataConverterEntity.a.put("Horse", "minecraft:horse"); -+ DataConverterEntity.a.put("Husk", "minecraft:husk"); -+ DataConverterEntity.a.put("Item", "minecraft:item"); -+ DataConverterEntity.a.put("ItemFrame", "minecraft:item_frame"); -+ DataConverterEntity.a.put("LavaSlime", "minecraft:magma_cube"); -+ DataConverterEntity.a.put("LeashKnot", "minecraft:leash_knot"); -+ DataConverterEntity.a.put("MinecartChest", "minecraft:chest_minecart"); -+ DataConverterEntity.a.put("MinecartCommandBlock", "minecraft:commandblock_minecart"); -+ DataConverterEntity.a.put("MinecartFurnace", "minecraft:furnace_minecart"); -+ DataConverterEntity.a.put("MinecartHopper", "minecraft:hopper_minecart"); -+ DataConverterEntity.a.put("MinecartRideable", "minecraft:minecart"); -+ DataConverterEntity.a.put("MinecartSpawner", "minecraft:spawner_minecart"); -+ DataConverterEntity.a.put("MinecartTNT", "minecraft:tnt_minecart"); -+ DataConverterEntity.a.put("Mule", "minecraft:mule"); -+ DataConverterEntity.a.put("MushroomCow", "minecraft:mooshroom"); -+ DataConverterEntity.a.put("Ozelot", "minecraft:ocelot"); -+ DataConverterEntity.a.put("Painting", "minecraft:painting"); -+ DataConverterEntity.a.put("Pig", "minecraft:pig"); -+ DataConverterEntity.a.put("PigZombie", "minecraft:zombie_pigman"); -+ DataConverterEntity.a.put("PolarBear", "minecraft:polar_bear"); -+ DataConverterEntity.a.put("PrimedTnt", "minecraft:tnt"); -+ DataConverterEntity.a.put("Rabbit", "minecraft:rabbit"); -+ DataConverterEntity.a.put("Sheep", "minecraft:sheep"); -+ DataConverterEntity.a.put("Shulker", "minecraft:shulker"); -+ DataConverterEntity.a.put("ShulkerBullet", "minecraft:shulker_bullet"); -+ DataConverterEntity.a.put("Silverfish", "minecraft:silverfish"); -+ DataConverterEntity.a.put("Skeleton", "minecraft:skeleton"); -+ DataConverterEntity.a.put("SkeletonHorse", "minecraft:skeleton_horse"); -+ DataConverterEntity.a.put("Slime", "minecraft:slime"); -+ DataConverterEntity.a.put("SmallFireball", "minecraft:small_fireball"); -+ DataConverterEntity.a.put("SnowMan", "minecraft:snowman"); -+ DataConverterEntity.a.put("Snowball", "minecraft:snowball"); -+ DataConverterEntity.a.put("SpectralArrow", "minecraft:spectral_arrow"); -+ DataConverterEntity.a.put("Spider", "minecraft:spider"); -+ DataConverterEntity.a.put("Squid", "minecraft:squid"); -+ DataConverterEntity.a.put("Stray", "minecraft:stray"); -+ DataConverterEntity.a.put("ThrownEgg", "minecraft:egg"); -+ DataConverterEntity.a.put("ThrownEnderpearl", "minecraft:ender_pearl"); -+ DataConverterEntity.a.put("ThrownExpBottle", "minecraft:xp_bottle"); -+ DataConverterEntity.a.put("ThrownPotion", "minecraft:potion"); -+ DataConverterEntity.a.put("Villager", "minecraft:villager"); -+ DataConverterEntity.a.put("VillagerGolem", "minecraft:villager_golem"); -+ DataConverterEntity.a.put("Witch", "minecraft:witch"); -+ DataConverterEntity.a.put("WitherBoss", "minecraft:wither"); -+ DataConverterEntity.a.put("WitherSkeleton", "minecraft:wither_skeleton"); -+ DataConverterEntity.a.put("WitherSkull", "minecraft:wither_skull"); -+ DataConverterEntity.a.put("Wolf", "minecraft:wolf"); -+ DataConverterEntity.a.put("XPOrb", "minecraft:xp_orb"); -+ DataConverterEntity.a.put("Zombie", "minecraft:zombie"); -+ DataConverterEntity.a.put("ZombieHorse", "minecraft:zombie_horse"); -+ DataConverterEntity.a.put("ZombieVillager", "minecraft:zombie_villager"); -+ } -+ } -+ -+ private static class DataConverterPotionWater implements DataConverter { -+ -+ DataConverterPotionWater() {} -+ -+ public int getDataVersion() { -+ return 806; -+ } -+ -+ public NBTTagCompound convert(NBTTagCompound cmp) { -+ String s = cmp.getString("id"); -+ -+ if ("minecraft:potion".equals(s) || "minecraft:splash_potion".equals(s) || "minecraft:lingering_potion".equals(s) || "minecraft:tipped_arrow".equals(s)) { -+ NBTTagCompound nbttagcompound1 = cmp.getCompound("tag"); -+ -+ if (!nbttagcompound1.hasKeyOfType("Potion", 8)) { -+ nbttagcompound1.setString("Potion", "minecraft:water"); -+ } -+ -+ if (!cmp.hasKeyOfType("tag", 10)) { -+ cmp.set("tag", nbttagcompound1); -+ } -+ } -+ -+ return cmp; -+ } -+ } -+ -+ private static class DataConverterShulker implements DataConverter { -+ -+ DataConverterShulker() {} -+ -+ public int getDataVersion() { -+ return 808; -+ } -+ -+ public NBTTagCompound convert(NBTTagCompound cmp) { -+ if ("minecraft:shulker".equals(cmp.getString("id")) && !cmp.hasKeyOfType("Color", 99)) { -+ cmp.setByte("Color", (byte) 10); -+ } -+ -+ return cmp; -+ } -+ } -+ -+ private static class DataConverterShulkerBoxItem implements DataConverter { -+ -+ public static final String[] a = new String[] { "minecraft:white_shulker_box", "minecraft:orange_shulker_box", "minecraft:magenta_shulker_box", "minecraft:light_blue_shulker_box", "minecraft:yellow_shulker_box", "minecraft:lime_shulker_box", "minecraft:pink_shulker_box", "minecraft:gray_shulker_box", "minecraft:silver_shulker_box", "minecraft:cyan_shulker_box", "minecraft:purple_shulker_box", "minecraft:blue_shulker_box", "minecraft:brown_shulker_box", "minecraft:green_shulker_box", "minecraft:red_shulker_box", "minecraft:black_shulker_box"}; -+ -+ DataConverterShulkerBoxItem() {} -+ -+ public int getDataVersion() { -+ return 813; -+ } -+ -+ public NBTTagCompound convert(NBTTagCompound cmp) { -+ if ("minecraft:shulker_box".equals(cmp.getString("id")) && cmp.hasKeyOfType("tag", 10)) { -+ NBTTagCompound nbttagcompound1 = cmp.getCompound("tag"); -+ -+ if (nbttagcompound1.hasKeyOfType("BlockEntityTag", 10)) { -+ NBTTagCompound nbttagcompound2 = nbttagcompound1.getCompound("BlockEntityTag"); -+ -+ if (nbttagcompound2.getList("Items", 10).isEmpty()) { -+ nbttagcompound2.remove("Items"); -+ } -+ -+ int i = nbttagcompound2.getInt("Color"); -+ -+ nbttagcompound2.remove("Color"); -+ if (nbttagcompound2.isEmpty()) { -+ nbttagcompound1.remove("BlockEntityTag"); -+ } -+ -+ if (nbttagcompound1.isEmpty()) { -+ cmp.remove("tag"); -+ } -+ -+ cmp.setString("id", DataConverterShulkerBoxItem.a[i % 16]); -+ } -+ } -+ -+ return cmp; -+ } -+ } -+ -+ private static class DataConverterShulkerBoxBlock implements DataConverter { -+ -+ DataConverterShulkerBoxBlock() {} -+ -+ public int getDataVersion() { -+ return 813; -+ } -+ -+ public NBTTagCompound convert(NBTTagCompound cmp) { -+ if ("minecraft:shulker".equals(cmp.getString("id"))) { -+ cmp.remove("Color"); -+ } -+ -+ return cmp; -+ } -+ } -+ -+ private static class DataConverterLang implements DataConverter { -+ -+ DataConverterLang() {} -+ -+ public int getDataVersion() { -+ return 816; -+ } -+ -+ public NBTTagCompound convert(NBTTagCompound cmp) { -+ if (cmp.hasKeyOfType("lang", 8)) { -+ cmp.setString("lang", cmp.getString("lang").toLowerCase(Locale.ROOT)); -+ } -+ -+ return cmp; -+ } -+ } -+ -+ private static class DataConverterTotem implements DataConverter { -+ -+ DataConverterTotem() {} -+ -+ public int getDataVersion() { -+ return 820; -+ } -+ -+ public NBTTagCompound convert(NBTTagCompound cmp) { -+ if ("minecraft:totem".equals(cmp.getString("id"))) { -+ cmp.setString("id", "minecraft:totem_of_undying"); -+ } -+ -+ return cmp; -+ } -+ } -+ -+ private static class DataConverterBedBlock implements DataConverter { -+ -+ private static final Logger a = LogManager.getLogger(); -+ -+ DataConverterBedBlock() {} -+ -+ public int getDataVersion() { -+ return 1125; -+ } -+ -+ public NBTTagCompound convert(NBTTagCompound cmp) { -+ boolean flag = true; -+ -+ try { -+ NBTTagCompound nbttagcompound1 = cmp.getCompound("Level"); -+ int i = nbttagcompound1.getInt("xPos"); -+ int j = nbttagcompound1.getInt("zPos"); -+ NBTTagList nbttaglist = nbttagcompound1.getList("TileEntities", 10); -+ NBTTagList nbttaglist1 = nbttagcompound1.getList("Sections", 10); -+ -+ for (int k = 0; k < nbttaglist1.size(); ++k) { -+ NBTTagCompound nbttagcompound2 = nbttaglist1.getCompound(k); -+ byte b0 = nbttagcompound2.getByte("Y"); -+ byte[] abyte = nbttagcompound2.getByteArray("Blocks"); -+ -+ for (int l = 0; l < abyte.length; ++l) { -+ if (416 == (abyte[l] & 255) << 4) { -+ int i1 = l & 15; -+ int j1 = l >> 8 & 15; -+ int k1 = l >> 4 & 15; -+ NBTTagCompound nbttagcompound3 = new NBTTagCompound(); -+ -+ nbttagcompound3.setString("id", "bed"); -+ nbttagcompound3.setInt("x", i1 + (i << 4)); -+ nbttagcompound3.setInt("y", j1 + (b0 << 4)); -+ nbttagcompound3.setInt("z", k1 + (j << 4)); -+ nbttaglist.add(nbttagcompound3); -+ } -+ } -+ } -+ } catch (Exception exception) { -+ DataConverterBedBlock.a.warn("Unable to datafix Bed blocks, level format may be missing tags."); -+ } -+ -+ return cmp; -+ } -+ } -+ -+ private static class DataConverterBedItem implements DataConverter { -+ -+ DataConverterBedItem() {} -+ -+ public int getDataVersion() { -+ return 1125; -+ } -+ -+ public NBTTagCompound convert(NBTTagCompound cmp) { -+ if ("minecraft:bed".equals(cmp.getString("id")) && cmp.getShort("Damage") == 0) { -+ cmp.setShort("Damage", (short) EnumColor.RED.getColorIndex()); -+ } -+ -+ return cmp; -+ } -+ } -+ -+ private static class DataConverterSignText implements DataConverter { -+ -+ public static final Gson a = new GsonBuilder().registerTypeAdapter(IChatBaseComponent.class, new JsonDeserializer() { -+ IChatBaseComponent a(JsonElement jsonelement, Type type, JsonDeserializationContext jsondeserializationcontext) throws JsonParseException { -+ if (jsonelement.isJsonPrimitive()) { -+ return new ChatComponentText(jsonelement.getAsString()); -+ } else if (jsonelement.isJsonArray()) { -+ JsonArray jsonarray = jsonelement.getAsJsonArray(); -+ IChatBaseComponent ichatbasecomponent = null; -+ Iterator iterator = jsonarray.iterator(); -+ -+ while (iterator.hasNext()) { -+ JsonElement jsonelement1 = (JsonElement) iterator.next(); -+ IChatBaseComponent ichatbasecomponent1 = this.a(jsonelement1, jsonelement1.getClass(), jsondeserializationcontext); -+ -+ if (ichatbasecomponent == null) { -+ ichatbasecomponent = ichatbasecomponent1; -+ } else { -+ ichatbasecomponent.addSibling(ichatbasecomponent1); -+ } -+ } -+ -+ return ichatbasecomponent; -+ } else { -+ throw new JsonParseException("Don\'t know how to turn " + jsonelement + " into a Component"); -+ } -+ } -+ -+ public Object deserialize(JsonElement jsonelement, Type type, JsonDeserializationContext jsondeserializationcontext) throws JsonParseException { -+ return this.a(jsonelement, type, jsondeserializationcontext); -+ } -+ }).create(); -+ -+ DataConverterSignText() {} -+ -+ public int getDataVersion() { -+ return 101; -+ } -+ -+ public NBTTagCompound convert(NBTTagCompound cmp) { -+ if ("Sign".equals(cmp.getString("id"))) { -+ this.convert(cmp, "Text1"); -+ this.convert(cmp, "Text2"); -+ this.convert(cmp, "Text3"); -+ this.convert(cmp, "Text4"); -+ } -+ -+ return cmp; -+ } -+ -+ private void convert(NBTTagCompound nbttagcompound, String s) { -+ String s1 = nbttagcompound.getString(s); -+ Object object = null; -+ -+ if (!"null".equals(s1) && !UtilColor.b(s1)) { -+ if ((s1.charAt(0) != 34 || s1.charAt(s1.length() - 1) != 34) && (s1.charAt(0) != 123 || s1.charAt(s1.length() - 1) != 125)) { -+ object = new ChatComponentText(s1); -+ } else { -+ try { -+ object = ChatDeserializer.a(DataConverterSignText.a, s1, IChatBaseComponent.class, true); -+ if (object == null) { -+ object = new ChatComponentText(""); -+ } -+ } catch (JsonParseException jsonparseexception) { -+ ; -+ } -+ -+ if (object == null) { -+ try { -+ object = IChatBaseComponent.ChatSerializer.a(s1); -+ } catch (JsonParseException jsonparseexception1) { -+ ; -+ } -+ } -+ -+ if (object == null) { -+ try { -+ object = IChatBaseComponent.ChatSerializer.b(s1); -+ } catch (JsonParseException jsonparseexception2) { -+ ; -+ } -+ } -+ -+ if (object == null) { -+ object = new ChatComponentText(s1); -+ } -+ } -+ } else { -+ object = new ChatComponentText(""); -+ } -+ -+ nbttagcompound.setString(s, IChatBaseComponent.ChatSerializer.a((IChatBaseComponent) object)); -+ } -+ } -+ -+ private static class DataInspectorPlayerVehicle implements DataInspector { -+ @Override -+ public NBTTagCompound inspect(NBTTagCompound cmp, int sourceVer, int targetVer) { -+ if (cmp.hasKeyOfType("RootVehicle", 10)) { -+ NBTTagCompound nbttagcompound1 = cmp.getCompound("RootVehicle"); -+ -+ if (nbttagcompound1.hasKeyOfType("Entity", 10)) { -+ convertCompound(LegacyType.ENTITY, nbttagcompound1, "Entity", sourceVer, targetVer); -+ } -+ } -+ -+ return cmp; -+ } -+ } -+ -+ private static class DataInspectorLevelPlayer implements DataInspector { -+ @Override -+ public NBTTagCompound inspect(NBTTagCompound cmp, int sourceVer, int targetVer) { -+ if (cmp.hasKeyOfType("Player", 10)) { -+ convertCompound(LegacyType.PLAYER, cmp, "Player", sourceVer, targetVer); -+ } -+ -+ return cmp; -+ } -+ } -+ -+ private static class DataInspectorStructure implements DataInspector { -+ @Override -+ public NBTTagCompound inspect(NBTTagCompound cmp, int sourceVer, int targetVer) { -+ NBTTagList nbttaglist; -+ int j; -+ NBTTagCompound nbttagcompound1; -+ -+ if (cmp.hasKeyOfType("entities", 9)) { -+ nbttaglist = cmp.getList("entities", 10); -+ -+ for (j = 0; j < nbttaglist.size(); ++j) { -+ nbttagcompound1 = (NBTTagCompound) nbttaglist.get(j); -+ if (nbttagcompound1.hasKeyOfType("nbt", 10)) { -+ convertCompound(LegacyType.ENTITY, nbttagcompound1, "nbt", sourceVer, targetVer); -+ } -+ } -+ } -+ -+ if (cmp.hasKeyOfType("blocks", 9)) { -+ nbttaglist = cmp.getList("blocks", 10); -+ -+ for (j = 0; j < nbttaglist.size(); ++j) { -+ nbttagcompound1 = (NBTTagCompound) nbttaglist.get(j); -+ if (nbttagcompound1.hasKeyOfType("nbt", 10)) { -+ convertCompound(LegacyType.BLOCK_ENTITY, nbttagcompound1, "nbt", sourceVer, targetVer); -+ } -+ } -+ } -+ -+ return cmp; -+ } -+ } -+ -+ private static class DataInspectorChunks implements DataInspector { -+ @Override -+ public NBTTagCompound inspect(NBTTagCompound cmp, int sourceVer, int targetVer) { -+ if (cmp.hasKeyOfType("Level", 10)) { -+ NBTTagCompound nbttagcompound1 = cmp.getCompound("Level"); -+ NBTTagList nbttaglist; -+ int j; -+ -+ if (nbttagcompound1.hasKeyOfType("Entities", 9)) { -+ nbttaglist = nbttagcompound1.getList("Entities", 10); -+ -+ for (j = 0; j < nbttaglist.size(); ++j) { -+ nbttaglist.set(j, convert(LegacyType.ENTITY, (NBTTagCompound) nbttaglist.get(j), sourceVer, targetVer)); -+ } -+ } -+ -+ if (nbttagcompound1.hasKeyOfType("TileEntities", 9)) { -+ nbttaglist = nbttagcompound1.getList("TileEntities", 10); -+ -+ for (j = 0; j < nbttaglist.size(); ++j) { -+ nbttaglist.set(j, convert(LegacyType.BLOCK_ENTITY, (NBTTagCompound) nbttaglist.get(j), sourceVer, targetVer)); -+ } -+ } -+ } -+ -+ return cmp; -+ } -+ } -+ -+ private static class DataInspectorEntityPassengers implements DataInspector { -+ @Override -+ public NBTTagCompound inspect(NBTTagCompound cmp, int sourceVer, int targetVer) { -+ if (cmp.hasKeyOfType("Passengers", 9)) { -+ NBTTagList nbttaglist = cmp.getList("Passengers", 10); -+ -+ for (int j = 0; j < nbttaglist.size(); ++j) { -+ nbttaglist.set(j, convert(LegacyType.ENTITY, nbttaglist.getCompound(j), sourceVer, targetVer)); -+ } -+ } -+ -+ return cmp; -+ } -+ } -+ -+ private static class DataInspectorPlayer implements DataInspector { -+ @Override -+ public NBTTagCompound inspect(NBTTagCompound cmp, int sourceVer, int targetVer) { -+ convertItems(cmp, "Inventory", sourceVer, targetVer); -+ convertItems(cmp, "EnderItems", sourceVer, targetVer); -+ if (cmp.hasKeyOfType("ShoulderEntityLeft", 10)) { -+ convertCompound(LegacyType.ENTITY, cmp, "ShoulderEntityLeft", sourceVer, targetVer); -+ } -+ -+ if (cmp.hasKeyOfType("ShoulderEntityRight", 10)) { -+ convertCompound(LegacyType.ENTITY, cmp, "ShoulderEntityRight", sourceVer, targetVer); -+ } -+ -+ return cmp; -+ } -+ } -+ -+ private static class DataInspectorVillagers implements DataInspector { -+ MinecraftKey entityVillager = getKey("EntityVillager"); -+ -+ @Override -+ public NBTTagCompound inspect(NBTTagCompound cmp, int sourceVer, int targetVer) { -+ if (entityVillager.equals(new MinecraftKey(cmp.getString("id"))) && cmp.hasKeyOfType("Offers", 10)) { -+ NBTTagCompound nbttagcompound1 = cmp.getCompound("Offers"); -+ -+ if (nbttagcompound1.hasKeyOfType("Recipes", 9)) { -+ NBTTagList nbttaglist = nbttagcompound1.getList("Recipes", 10); -+ -+ for (int j = 0; j < nbttaglist.size(); ++j) { -+ NBTTagCompound nbttagcompound2 = nbttaglist.getCompound(j); -+ -+ convertItem(nbttagcompound2, "buy", sourceVer, targetVer); -+ convertItem(nbttagcompound2, "buyB", sourceVer, targetVer); -+ convertItem(nbttagcompound2, "sell", sourceVer, targetVer); -+ nbttaglist.set(j, nbttagcompound2); -+ } -+ } -+ } -+ -+ return cmp; -+ } -+ } -+ -+ private static class DataInspectorMobSpawnerMinecart implements DataInspector { -+ MinecraftKey entityMinecartMobSpawner = getKey("EntityMinecartMobSpawner"); -+ MinecraftKey tileEntityMobSpawner = getKey("TileEntityMobSpawner"); -+ -+ @Override -+ public NBTTagCompound inspect(NBTTagCompound cmp, int sourceVer, int targetVer) { -+ String s = cmp.getString("id"); -+ if (entityMinecartMobSpawner.equals(new MinecraftKey(s))) { -+ cmp.setString("id", tileEntityMobSpawner.toString()); -+ convert(LegacyType.BLOCK_ENTITY, cmp, sourceVer, targetVer); -+ cmp.setString("id", s); -+ } -+ -+ return cmp; -+ } -+ } -+ -+ private static class DataInspectorMobSpawnerMobs implements DataInspector { -+ MinecraftKey tileEntityMobSpawner = getKey("TileEntityMobSpawner"); -+ -+ @Override -+ public NBTTagCompound inspect(NBTTagCompound cmp, int sourceVer, int targetVer) { -+ if (tileEntityMobSpawner.equals(new MinecraftKey(cmp.getString("id")))) { -+ if (cmp.hasKeyOfType("SpawnPotentials", 9)) { -+ NBTTagList nbttaglist = cmp.getList("SpawnPotentials", 10); -+ -+ for (int j = 0; j < nbttaglist.size(); ++j) { -+ NBTTagCompound nbttagcompound1 = nbttaglist.getCompound(j); -+ -+ convertCompound(LegacyType.ENTITY, nbttagcompound1, "Entity", sourceVer, targetVer); -+ } -+ } -+ -+ convertCompound(LegacyType.ENTITY, cmp, "SpawnData", sourceVer, targetVer); -+ } -+ -+ return cmp; -+ } -+ } -+ -+ private static class DataInspectorCommandBlock implements DataInspector { -+ MinecraftKey tileEntityCommand = getKey("TileEntityCommand"); -+ -+ @Override -+ public NBTTagCompound inspect(NBTTagCompound cmp, int sourceVer, int targetVer) { -+ if (tileEntityCommand.equals(new MinecraftKey(cmp.getString("id")))) { -+ cmp.setString("id", "Control"); -+ convert(LegacyType.BLOCK_ENTITY, cmp, sourceVer, targetVer); -+ cmp.setString("id", "MinecartCommandBlock"); -+ } -+ -+ return cmp; -+ } -+ } -+} --- -2.25.1.windows.1 - diff --git a/patches/server-old/0010-EMC-Disable-Snooper.patch b/patches/server-old/0010-EMC-Disable-Snooper.patch deleted file mode 100644 index 10fec6b2..00000000 --- a/patches/server-old/0010-EMC-Disable-Snooper.patch +++ /dev/null @@ -1,31 +0,0 @@ -From c4694a7bbb7b7b1d6ba7d10b8d4a9946f325f6b1 Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Fri, 10 Jan 2014 22:05:59 -0500 -Subject: [PATCH] EMC Disable Snooper - -What purpose does it provide... ---- - src/main/java/net/minecraft/server/MinecraftServer.java | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index f0959d301..d18387971 100644 ---- a/src/main/java/net/minecraft/server/MinecraftServer.java -+++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1275,11 +1275,11 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant 100) { // Spigot -+ if (false && ((DedicatedServer) this).getDedicatedServerProperties().snooperEnabled && !this.snooper.d() && this.ticks > 100) { // Spigot // EMC - disable snooper - this.snooper.a(); - } - -- if (((DedicatedServer) this).getDedicatedServerProperties().snooperEnabled && this.ticks % 6000 == 0) { // Spigot -+ if (false && ((DedicatedServer) this).getDedicatedServerProperties().snooperEnabled && this.ticks % 6000 == 0) { // Spigot // EMC - disable snooper - this.snooper.b(); - } - --- -2.25.1.windows.1 - diff --git a/patches/server-old/0011-EMC-Add-EntityEffectAddedEvent.patch b/patches/server-old/0011-EMC-Add-EntityEffectAddedEvent.patch deleted file mode 100644 index 30993e66..00000000 --- a/patches/server-old/0011-EMC-Add-EntityEffectAddedEvent.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 8bfe01395811790bab91f9418a6edeb84c67bf82 Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Fri, 21 Feb 2014 00:50:46 -0500 -Subject: [PATCH] EMC Add EntityEffectAddedEvent - ---- - src/main/java/net/minecraft/server/EntityLiving.java | 10 ++++++++++ - 1 file changed, 10 insertions(+) - -diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java -index 3cbd13e5d..f35daa374 100644 ---- a/src/main/java/net/minecraft/server/EntityLiving.java -+++ b/src/main/java/net/minecraft/server/EntityLiving.java -@@ -803,6 +803,16 @@ public abstract class EntityLiving extends Entity { - } - // CraftBukkit end - -+ // EMC start -+ com.empireminecraft.customevents.EntityEffectAddedEvent addedEvent = new com.empireminecraft.customevents.EntityEffectAddedEvent((org.bukkit.entity.LivingEntity) this.getBukkitEntity(), new org.bukkit.potion.PotionEffect( -+ org.bukkit.potion.PotionEffectType.getById(MobEffectList.getId(mobeffect.getMobEffect())), -+ mobeffect.getDuration(), mobeffect.getAmplifier(), mobeffect.isAmbient(), mobeffect.isShowParticles(), mobeffect.isShowIcon())); -+ if (!addedEvent.callEvent()) { -+ return false; -+ } -+ final org.bukkit.potion.PotionEffect effect = addedEvent.getEffect(); -+ mobeffect = new MobEffect(MobEffectList.fromId(effect.getType().getId()), effect.getDuration(), effect.getAmplifier(), effect.isAmbient(), effect.hasParticles(), effect.hasIcon()); -+ // EMC end - if (!this.d(mobeffect)) { - return false; - } else { --- -2.25.1.windows.1 - diff --git a/patches/server-old/0012-EMC-Disable-UUID-conversion-Already-done.patch b/patches/server-old/0012-EMC-Disable-UUID-conversion-Already-done.patch deleted file mode 100644 index 1b78171f..00000000 --- a/patches/server-old/0012-EMC-Disable-UUID-conversion-Already-done.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 4be963b73f959de6fa6d5aa2c7c52e1a8bb90e0d Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Mon, 14 Apr 2014 20:44:38 -0400 -Subject: [PATCH] EMC Disable UUID conversion - Already done - ---- - src/main/java/net/minecraft/server/DedicatedServer.java | 2 +- - .../java/net/minecraft/server/NameReferencingFileConverter.java | 1 + - 2 files changed, 2 insertions(+), 1 deletion(-) - -diff --git a/src/main/java/net/minecraft/server/DedicatedServer.java b/src/main/java/net/minecraft/server/DedicatedServer.java -index 1f1243ae8..77651d228 100644 ---- a/src/main/java/net/minecraft/server/DedicatedServer.java -+++ b/src/main/java/net/minecraft/server/DedicatedServer.java -@@ -250,7 +250,7 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer - DedicatedServer.LOGGER.warn("To change this, set \"online-mode\" to \"true\" in the server.properties file."); - } - -- if (this.convertNames()) { -+ if (false) { // EMC - disable UUID Conversion - this.getUserCache().c(); - } - -diff --git a/src/main/java/net/minecraft/server/NameReferencingFileConverter.java b/src/main/java/net/minecraft/server/NameReferencingFileConverter.java -index d3c2e1bed..286564108 100644 ---- a/src/main/java/net/minecraft/server/NameReferencingFileConverter.java -+++ b/src/main/java/net/minecraft/server/NameReferencingFileConverter.java -@@ -425,6 +425,7 @@ public class NameReferencingFileConverter { - } - - public static boolean e(MinecraftServer minecraftserver) { -+ if (true) return true; // EMC - Disable UUID conversion - boolean flag = b(); - - flag = flag && f(minecraftserver); --- -2.25.1.windows.1 - diff --git a/patches/server-old/0013-EMC-LivingEntityArmorProtectEvent.patch b/patches/server-old/0013-EMC-LivingEntityArmorProtectEvent.patch deleted file mode 100644 index a24624e6..00000000 --- a/patches/server-old/0013-EMC-LivingEntityArmorProtectEvent.patch +++ /dev/null @@ -1,39 +0,0 @@ -From fc2073e34d536014f05201cbba184d55ea8ff2f5 Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Wed, 12 Mar 2014 23:10:04 -0400 -Subject: [PATCH] EMC LivingEntityArmorProtectEvent - -To control if armor should protect entity, how much if so, and how much item damage to give. ---- - src/main/java/net/minecraft/server/EntityLiving.java | 8 +++++++- - 1 file changed, 7 insertions(+), 1 deletion(-) - -diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java -index f35daa374..11be0931c 100644 ---- a/src/main/java/net/minecraft/server/EntityLiving.java -+++ b/src/main/java/net/minecraft/server/EntityLiving.java -@@ -39,6 +39,7 @@ import org.bukkit.event.player.PlayerItemConsumeEvent; - // CraftBukkit end - - import co.aikar.timings.MinecraftTimings; // Paper -+import com.empireminecraft.customevents.LivingEntityArmorProtectEvent; // EMC - - public abstract class EntityLiving extends Entity { - -@@ -1576,7 +1577,12 @@ public abstract class EntityLiving extends Entity { - public int getArmorStrength() { - AttributeInstance attributeinstance = this.getAttributeInstance(GenericAttributes.ARMOR); - -- return MathHelper.floor(attributeinstance.getValue()); -+ // EMC start -+ final double value = attributeinstance.getValue(); -+ LivingEntityArmorProtectEvent event = new LivingEntityArmorProtectEvent(this.getBukkitLivingEntity(), value); -+ event.callEvent(); -+ return MathHelper.floor(event.getArmorValue()); -+ // EMC end - } - - protected void damageArmor(float f) {} --- -2.25.1.windows.1 - diff --git a/patches/server-old/0014-EMC-EntityKnockbackEvent.patch b/patches/server-old/0014-EMC-EntityKnockbackEvent.patch deleted file mode 100644 index 0c7f006b..00000000 --- a/patches/server-old/0014-EMC-EntityKnockbackEvent.patch +++ /dev/null @@ -1,61 +0,0 @@ -From 8a17ab20323f2a0c9bb28767f61c8f44cd21eb9b Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Sun, 16 Mar 2014 20:44:46 -0400 -Subject: [PATCH] EMC EntityKnockbackEvent - -Control knockback power of entity attacks ---- - .../java/net/minecraft/server/EnchantmentManager.java | 9 +++++++-- - src/main/java/net/minecraft/server/EntityHuman.java | 2 +- - src/main/java/net/minecraft/server/EntityInsentient.java | 2 +- - 3 files changed, 9 insertions(+), 4 deletions(-) - -diff --git a/src/main/java/net/minecraft/server/EnchantmentManager.java b/src/main/java/net/minecraft/server/EnchantmentManager.java -index d96c03a1a..9fc637f96 100644 ---- a/src/main/java/net/minecraft/server/EnchantmentManager.java -+++ b/src/main/java/net/minecraft/server/EnchantmentManager.java -@@ -186,8 +186,13 @@ public class EnchantmentManager { - } - } - -- public static int b(EntityLiving entityliving) { -- return a(Enchantments.KNOCKBACK, entityliving); -+ // EMC start - rename and add target -+ public static int getKnockbackEnchantmentLevel(EntityLiving entityliving, EntityLiving target) { // EMC - OBF HELPER -+ int level = a(Enchantments.KNOCKBACK, entityliving); -+ com.empireminecraft.customevents.EntityKnockbackEvent event = new com.empireminecraft.customevents.EntityKnockbackEvent((org.bukkit.entity.LivingEntity) entityliving.getBukkitEntity(), target != null ? (org.bukkit.entity.LivingEntity) target.getBukkitEntity() : null, level); -+ event.callEvent(); -+ return event.getLevel(); -+ // EMC end - } - - public static int getFireAspectEnchantmentLevel(EntityLiving entityliving) { -diff --git a/src/main/java/net/minecraft/server/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java -index 7df24be46..8f4bb71b1 100644 ---- a/src/main/java/net/minecraft/server/EntityHuman.java -+++ b/src/main/java/net/minecraft/server/EntityHuman.java -@@ -1062,7 +1062,7 @@ public abstract class EntityHuman extends EntityLiving { - boolean flag = f2 > 0.9F; - boolean flag1 = false; - byte b0 = 0; -- int i = b0 + EnchantmentManager.b((EntityLiving) this); -+ int i = b0 + EnchantmentManager.getKnockbackEnchantmentLevel(this, entity instanceof EntityLiving ? (EntityLiving) entity : null); // EMC - - if (this.isSprinting() && flag) { - sendSoundEffect(this, this.locX(), this.locY(), this.locZ(), SoundEffects.ENTITY_PLAYER_ATTACK_KNOCKBACK, this.getSoundCategory(), 1.0F, 1.0F); // Paper - send while respecting visibility -diff --git a/src/main/java/net/minecraft/server/EntityInsentient.java b/src/main/java/net/minecraft/server/EntityInsentient.java -index 5aca7a913..eec434374 100644 ---- a/src/main/java/net/minecraft/server/EntityInsentient.java -+++ b/src/main/java/net/minecraft/server/EntityInsentient.java -@@ -1308,7 +1308,7 @@ public abstract class EntityInsentient extends EntityLiving { - - if (entity instanceof EntityLiving) { - f += EnchantmentManager.a(this.getItemInMainHand(), ((EntityLiving) entity).getMonsterType()); -- f1 += (float) EnchantmentManager.b((EntityLiving) this); -+ f1 += EnchantmentManager.getKnockbackEnchantmentLevel(this, (EntityLiving) entity); // EMC - } - - int i = EnchantmentManager.getFireAspectEnchantmentLevel(this); --- -2.25.1.windows.1 - diff --git a/patches/server-old/0015-EMC-ZombieReinforcementEvent.patch b/patches/server-old/0015-EMC-ZombieReinforcementEvent.patch deleted file mode 100644 index 33ca9863..00000000 --- a/patches/server-old/0015-EMC-ZombieReinforcementEvent.patch +++ /dev/null @@ -1,37 +0,0 @@ -From e7486752efce7b488d80f8dd7bcec48d24813140 Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Sat, 22 Mar 2014 23:52:54 -0400 -Subject: [PATCH] EMC ZombieReinforcementEvent - -Control when a zombie reinforcement event should occur (modify chance) -also makes it run on all difficulty levels ---- - src/main/java/net/minecraft/server/EntityZombie.java | 12 +++++++++++- - 1 file changed, 11 insertions(+), 1 deletion(-) - -diff --git a/src/main/java/net/minecraft/server/EntityZombie.java b/src/main/java/net/minecraft/server/EntityZombie.java -index 07ebc1d81..7524fd75c 100644 ---- a/src/main/java/net/minecraft/server/EntityZombie.java -+++ b/src/main/java/net/minecraft/server/EntityZombie.java -@@ -322,7 +322,17 @@ public class EntityZombie extends EntityMonster { - entityliving = (EntityLiving) damagesource.getEntity(); - } - -- if (entityliving != null && this.world.getDifficulty() == EnumDifficulty.HARD && (double) this.random.nextFloat() < this.getAttributeInstance(EntityZombie.d).getValue() && this.world.getGameRules().getBoolean(GameRules.DO_MOB_SPAWNING)) { -+ // EMC start -+ boolean spawnReinforcements = false; -+ if (entityliving != null && this.world.getGameRules().getBoolean(GameRules.DO_MOB_SPAWNING)) { -+ final double chance = this.getAttributeInstance(EntityZombie.d).getValue(); -+ com.empireminecraft.customevents.ZombieReinforcementEvent event = new com.empireminecraft.customevents.ZombieReinforcementEvent( this.getBukkitEntity(), (org.bukkit.entity.LivingEntity) entityliving.getBukkitEntity(), chance); -+ if (event.callEvent()) { -+ spawnReinforcements = this.random.nextFloat() < event.getChance(); -+ } -+ } -+ if (spawnReinforcements) { -+ // EMC end - int i = MathHelper.floor(this.locX()); - int j = MathHelper.floor(this.locY()); - int k = MathHelper.floor(this.locZ()); --- -2.25.1.windows.1 - diff --git a/patches/server-old/0016-EMC-Accept-the-EULA.patch b/patches/server-old/0016-EMC-Accept-the-EULA.patch deleted file mode 100644 index 48a0d6a5..00000000 --- a/patches/server-old/0016-EMC-Accept-the-EULA.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 14c689580aaabdfd138bd91311381b404145d429 Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Fri, 5 Sep 2014 23:04:54 -0400 -Subject: [PATCH] EMC Accept the EULA - -Starlis LLC, the owner of Empire Minecraft, accepts the Minecraft EULA with this commit. ---- - src/main/java/net/minecraft/server/MinecraftServer.java | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index d18387971..16535da3e 100644 ---- a/src/main/java/net/minecraft/server/MinecraftServer.java -+++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1487,6 +1487,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant -Date: Thu, 30 Apr 2015 22:12:01 -0400 -Subject: [PATCH] EMC Ignore statistics warnings - ---- - .../java/net/minecraft/server/ServerStatisticManager.java | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/src/main/java/net/minecraft/server/ServerStatisticManager.java b/src/main/java/net/minecraft/server/ServerStatisticManager.java -index 449e4ec8c..b3c9a5a84 100644 ---- a/src/main/java/net/minecraft/server/ServerStatisticManager.java -+++ b/src/main/java/net/minecraft/server/ServerStatisticManager.java -@@ -113,15 +113,15 @@ public class ServerStatisticManager extends StatisticManager { - SystemUtils.a(this.a(statisticwrapper, s2), (statistic) -> { - this.a.put(statistic, nbttagcompound2.getInt(s2)); - }, () -> { -- ServerStatisticManager.LOGGER.warn("Invalid statistic in {}: Don't know what {} is", this.d, s2); -+ //ServerStatisticManager.LOGGER.warn("Invalid statistic in {}: Don't know what {} is", this.d, s2); // EMC - }); - } else { -- ServerStatisticManager.LOGGER.warn("Invalid statistic value in {}: Don't know what {} is for key {}", this.d, nbttagcompound2.get(s2), s2); -+ //ServerStatisticManager.LOGGER.warn("Invalid statistic value in {}: Don't know what {} is for key {}", this.d, nbttagcompound2.get(s2), s2); // EMC - } - } - - }, () -> { -- ServerStatisticManager.LOGGER.warn("Invalid statistic type in {}: Don't know what {} is", this.d, s1); -+ //ServerStatisticManager.LOGGER.warn("Invalid statistic type in {}: Don't know what {} is", this.d, s1); // EMC - }); - } - } --- -2.25.1.windows.1 - diff --git a/patches/server-old/0018-EMC-ServerReloadEvent.patch b/patches/server-old/0018-EMC-ServerReloadEvent.patch deleted file mode 100644 index 9366560b..00000000 --- a/patches/server-old/0018-EMC-ServerReloadEvent.patch +++ /dev/null @@ -1,24 +0,0 @@ -From 8838825c46b92baf9a3959360cc013e0e98512f6 Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Thu, 25 Jun 2015 21:00:09 -0400 -Subject: [PATCH] EMC ServerReloadEvent - ---- - src/main/java/org/bukkit/craftbukkit/CraftServer.java | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 6181f5886..206165c13 100644 ---- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java -+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -780,6 +780,7 @@ public final class CraftServer implements Server { - @Override - public void reload() { - org.spigotmc.WatchdogThread.hasStarted = false; // Paper - Disable watchdog early timeout on reload -+ new com.empireminecraft.customevents.ServerReloadEvent().callEvent(); // EMC - reloadCount++; - configuration = YamlConfiguration.loadConfiguration(getConfigFile()); - commandsConfiguration = YamlConfiguration.loadConfiguration(getCommandsConfigFile()); --- -2.25.1.windows.1 - diff --git a/patches/server-old/0019-EMC-SnowmanThrowSnowballEvent.patch b/patches/server-old/0019-EMC-SnowmanThrowSnowballEvent.patch deleted file mode 100644 index 0a235288..00000000 --- a/patches/server-old/0019-EMC-SnowmanThrowSnowballEvent.patch +++ /dev/null @@ -1,50 +0,0 @@ -From d783496b060c74d30ec174f08b4d28db6a32240c Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Mon, 21 Dec 2015 13:33:00 -0500 -Subject: [PATCH] EMC SnowmanThrowSnowballEvent - ---- - .../net/minecraft/server/EntitySnowman.java | 20 +++++++++++++++++++ - 1 file changed, 20 insertions(+) - -diff --git a/src/main/java/net/minecraft/server/EntitySnowman.java b/src/main/java/net/minecraft/server/EntitySnowman.java -index dee55c5de..9d1cfae9e 100644 ---- a/src/main/java/net/minecraft/server/EntitySnowman.java -+++ b/src/main/java/net/minecraft/server/EntitySnowman.java -@@ -9,6 +9,25 @@ public class EntitySnowman extends EntityGolem implements IRangedEntity { - - private static final DataWatcherObject b = DataWatcher.a(EntitySnowman.class, DataWatcherRegistry.a); - -+ // EMC start -+ public static boolean fireEvent(EntitySnowman snowman, EntitySnowball snowball, EntityLiving target) { -+ org.bukkit.entity.Snowman bukkitSnowman = (org.bukkit.entity.Snowman) snowman.getBukkitEntity(); -+ org.bukkit.entity.Snowball bukkitSnowball = (org.bukkit.entity.Snowball) snowball.getBukkitEntity(); -+ snowball.projectileSource = bukkitSnowman; -+ -+ if (!(new org.bukkit.event.entity.ProjectileLaunchEvent(bukkitSnowball).callEvent())) { -+ return false; -+ } -+ -+ com.empireminecraft.customevents.SnowmanThrowSnowballEvent event = new com.empireminecraft.customevents.SnowmanThrowSnowballEvent( -+ bukkitSnowman, -+ bukkitSnowball, -+ target.getBukkitLivingEntity() -+ ); -+ return event.callEvent(); -+ } -+ // EMC end -+ - public EntitySnowman(EntityTypes entitytypes, World world) { - super(entitytypes, world); - } -@@ -98,6 +117,7 @@ public class EntitySnowman extends EntityGolem implements IRangedEntity { - float f1 = MathHelper.sqrt(d1 * d1 + d3 * d3) * 0.2F; - - entitysnowball.shoot(d1, d2 + (double) f1, d3, 1.6F, 12.0F); -+ if (!fireEvent(this, entitysnowball, entityliving)) return; // EMC - this.a(SoundEffects.ENTITY_SNOW_GOLEM_SHOOT, 1.0F, 1.0F / (this.getRandom().nextFloat() * 0.4F + 0.8F)); - this.world.addEntity(entitysnowball); - } --- -2.25.1.windows.1 - diff --git a/patches/server-old/0020-EMC-Reset-Ender-Crystals-on-Dragon-Spawn.patch b/patches/server-old/0020-EMC-Reset-Ender-Crystals-on-Dragon-Spawn.patch deleted file mode 100644 index cae9a012..00000000 --- a/patches/server-old/0020-EMC-Reset-Ender-Crystals-on-Dragon-Spawn.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 2f7775f215dfaa838a8f0291df085f0170d52616 Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Wed, 1 Jun 2016 23:29:17 -0400 -Subject: [PATCH] EMC Reset Ender Crystals on Dragon Spawn - ---- - src/main/java/net/minecraft/server/EnderDragonBattle.java | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/src/main/java/net/minecraft/server/EnderDragonBattle.java b/src/main/java/net/minecraft/server/EnderDragonBattle.java -index 687efa022..2617a6c0d 100644 ---- a/src/main/java/net/minecraft/server/EnderDragonBattle.java -+++ b/src/main/java/net/minecraft/server/EnderDragonBattle.java -@@ -403,6 +403,7 @@ public class EnderDragonBattle { - entityenderdragon.setPositionRotation(0.0D, 128.0D, 0.0D, this.d.random.nextFloat() * 360.0F, 0.0F); - this.d.addEntity(entityenderdragon); - this.m = entityenderdragon.getUniqueID(); -+ this.resetCrystals(); // EMC - return entityenderdragon; - } - -@@ -506,6 +507,7 @@ public class EnderDragonBattle { - - } - -+ private void resetCrystals() { this.f(); } // EMC // OBF HELPER - public void f() { - Iterator iterator = WorldGenEnder.a((GeneratorAccess) this.d).iterator(); - --- -2.25.1.windows.1 - diff --git a/patches/server-old/0021-EMC-EntityAttackedEntityEvent.patch b/patches/server-old/0021-EMC-EntityAttackedEntityEvent.patch deleted file mode 100644 index a0b1208f..00000000 --- a/patches/server-old/0021-EMC-EntityAttackedEntityEvent.patch +++ /dev/null @@ -1,33 +0,0 @@ -From ada07cd97f6156000435baa7ea856c47734567df Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Wed, 20 Dec 2017 21:42:45 -0500 -Subject: [PATCH] EMC EntityAttackedEntityEvent - -For when you need to know one Entity has attacked another entity -and that the damage event was not cancelled. ---- - .../org/bukkit/craftbukkit/event/CraftEventFactory.java | 7 +++++++ - 1 file changed, 7 insertions(+) - -diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java -index ce8d7877a..b661951ef 100644 ---- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java -+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java -@@ -1008,7 +1008,14 @@ public class CraftEventFactory { - callEvent(event); - - if (!event.isCancelled()) { -+ // Paper start -+ if (damager != null && !com.destroystokyo.paper.event.entity.EntityAttackedEntityEvent.callEvent(damager.getBukkitEntity(), damagee.getBukkitEntity(), cause, event.getFinalDamage())) { -+ event.setCancelled(true); -+ return event; -+ } -+ // Paper end - event.getEntity().setLastDamageCause(event); -+ - } - - return event; --- -2.25.1.windows.1 - diff --git a/patches/server-old/0022-EMC-Human-getAttackPct.patch b/patches/server-old/0022-EMC-Human-getAttackPct.patch deleted file mode 100644 index 922c847e..00000000 --- a/patches/server-old/0022-EMC-Human-getAttackPct.patch +++ /dev/null @@ -1,46 +0,0 @@ -From 979225fb1762c9b4aee62feba99afb9bc35f096b Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Sun, 17 Jun 2018 02:09:37 -0400 -Subject: [PATCH] EMC Human#getAttackPct - ---- - src/main/java/net/minecraft/server/EntityHuman.java | 2 ++ - .../java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java | 2 ++ - 2 files changed, 4 insertions(+) - -diff --git a/src/main/java/net/minecraft/server/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java -index 8f4bb71b1..c1e8ff6ab 100644 ---- a/src/main/java/net/minecraft/server/EntityHuman.java -+++ b/src/main/java/net/minecraft/server/EntityHuman.java -@@ -79,6 +79,7 @@ public abstract class EntityHuman extends EntityLiving { - public boolean fauxSleeping; - public String spawnWorld = ""; - public int oldLevel = -1; -+ public float lastAttackPct = 0; // EMC - - @Override - public CraftHumanEntity getBukkitEntity() { -@@ -1054,6 +1055,7 @@ public abstract class EntityHuman extends EntityLiving { - } - - float f2 = this.s(0.5F); -+ this.lastAttackPct = f2; // EMC - - f *= 0.2F + f2 * f2 * 0.8F; - f1 *= f2; -diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java -index a2815073b..faa65ef20 100644 ---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java -+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java -@@ -72,6 +72,8 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { - private boolean op; - private GameMode mode; - -+ @Override public float getAttackPct() { return getHandle().lastAttackPct; } // EMC -+ - public CraftHumanEntity(final CraftServer server, final EntityHuman entity) { - super(server, entity); - mode = server.getDefaultGameMode(); --- -2.25.1.windows.1 - diff --git a/patches/server-old/0023-EMC-Tweak-Explosions.patch b/patches/server-old/0023-EMC-Tweak-Explosions.patch deleted file mode 100644 index 941cf4c3..00000000 --- a/patches/server-old/0023-EMC-Tweak-Explosions.patch +++ /dev/null @@ -1,50 +0,0 @@ -From f749ae5ccf988b6c09be53cf99b7e462063feb53 Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Wed, 20 Jun 2018 22:35:39 -0400 -Subject: [PATCH] EMC Tweak Explosions - ---- - src/main/java/net/minecraft/server/Explosion.java | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - -diff --git a/src/main/java/net/minecraft/server/Explosion.java b/src/main/java/net/minecraft/server/Explosion.java -index 2552f860f..cfe37b7ff 100644 ---- a/src/main/java/net/minecraft/server/Explosion.java -+++ b/src/main/java/net/minecraft/server/Explosion.java -@@ -97,6 +97,7 @@ public class Explosion { - int i; - int j; - -+ if (this.a || this.b != Effect.NONE) { // EMC - don't run block processing if neither flag is set - for (int k = 0; k < 16; ++k) { - for (i = 0; i < 16; ++i) { - for (j = 0; j < 16; ++j) { -@@ -142,6 +143,7 @@ public class Explosion { - } - } - } -+ } // EMC - don't run block processing if neither flag is set - - this.blocks.addAll(set); - float f3 = this.size * 2.0F; -@@ -156,7 +158,7 @@ public class Explosion { - List list = this.world.getEntities(this.source, new AxisAlignedBB((double) i, (double) l, (double) j1, (double) j, (double) i1, (double) k1), new com.google.common.base.Predicate() { - @Override - public boolean apply(Entity entity) { -- return IEntitySelector.canAITarget().test(entity) && !entity.dead; -+ return IEntitySelector.canAITarget().test(entity) && !entity.dead && !(entity instanceof EntityItem); // EMC - } - }); - // Paper end -@@ -220,7 +222,7 @@ public class Explosion { - boolean flag1 = this.b != Explosion.Effect.NONE; - - if (flag) { -- if (this.size >= 2.0F && flag1) { -+ if (this.size >= 2.0F/* && flag1*/) { // EMC - don't care about block breaks flag for animation - this.world.addParticle(Particles.EXPLOSION_EMITTER, this.posX, this.posY, this.posZ, 1.0D, 0.0D, 0.0D); - } else { - this.world.addParticle(Particles.EXPLOSION, this.posX, this.posY, this.posZ, 1.0D, 0.0D, 0.0D); --- -2.25.1.windows.1 - diff --git a/patches/server-old/0024-EMC-SpawnEggMeta-setSpawnedEntity-API.patch b/patches/server-old/0024-EMC-SpawnEggMeta-setSpawnedEntity-API.patch deleted file mode 100644 index 8951228c..00000000 --- a/patches/server-old/0024-EMC-SpawnEggMeta-setSpawnedEntity-API.patch +++ /dev/null @@ -1,66 +0,0 @@ -From 60e46f496c569bccb4bbba4846976ac50b1e8731 Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Sat, 18 Aug 2018 22:03:33 -0400 -Subject: [PATCH] EMC SpawnEggMeta#setSpawnedEntity API - -lets you copy an entities data into a spawn egg. -Partial data is supported through a predicate, letting MC -follow normal spawn behavior in the summon phase. ---- - .../inventory/CraftMetaSpawnEgg.java | 25 +++++++++++++++++-- - 1 file changed, 23 insertions(+), 2 deletions(-) - -diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSpawnEgg.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSpawnEgg.java -index 0634fb36d..24ac98e4d 100644 ---- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSpawnEgg.java -+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSpawnEgg.java -@@ -2,6 +2,9 @@ package org.bukkit.craftbukkit.inventory; - - import com.google.common.collect.ImmutableMap.Builder; - import java.util.Map; -+ -+import net.minecraft.server.DataConverterTypes; // EMC -+import net.minecraft.server.DataConverters; // EMC - import net.minecraft.server.MinecraftKey; - import net.minecraft.server.NBTBase; - import net.minecraft.server.NBTTagCompound; -@@ -75,9 +78,9 @@ public class CraftMetaSpawnEgg extends CraftMetaItem implements SpawnEggMeta { - } - - // Tag still has some other data, lets try our luck with a conversion -- if (!entityTag.isEmpty()) { -+ if (!entityTag.isEmpty() && getVersion() > 0) { // EMC - // SPIGOT-4128: This is hopeless until we start versioning stacks. RIP data. -- // entityTag = (NBTTagCompound) MinecraftServer.getServer().dataConverterManager.update(DataConverterTypes.ENTITY, new Dynamic(DynamicOpsNBT.a, entityTag), -1, CraftMagicNumbers.DATA_VERSION).getValue(); -+ entityTag = DataConverters.convert(DataConverterTypes.ENTITY, entityTag, getVersion()); // EMC - } - - // See if we can read a converted ID tag -@@ -188,6 +191,24 @@ public class CraftMetaSpawnEgg extends CraftMetaItem implements SpawnEggMeta { - return spawnedType != null; - } - -+ // Paper start -+ private static final String[] removeKeys = { -+ "UUIDLeast", "UUIDMost", "Pos", "PortalCooldown", "Paper.Origin", "Paper.FromMobSpawner", "Passengers", "Dimension" -+ }; -+ -+ @Override -+ public void setSpawnedEntity(org.bukkit.entity.Entity entity, java.util.function.Predicate keyFilter) { -+ entityTag = ((org.bukkit.craftbukkit.entity.CraftEntity) entity).getHandle().save(new NBTTagCompound()); -+ for (String removeKey : removeKeys) { -+ entityTag.remove(removeKey); -+ } -+ if (keyFilter != null) { -+ entityTag.map.keySet().removeIf(keyFilter); -+ } -+ entityTag.setBoolean("Paper.CustomSpawnEgg", true); -+ } -+ // Paper end -+ - @Override - public EntityType getSpawnedType() { - throw new UnsupportedOperationException("Must check item type to get spawned type"); --- -2.25.1.windows.1 - diff --git a/patches/server-old/0025-EMC-ConduitNewTargetEvent-and-remove-target-for-canc.patch b/patches/server-old/0025-EMC-ConduitNewTargetEvent-and-remove-target-for-canc.patch deleted file mode 100644 index 61fa8538..00000000 --- a/patches/server-old/0025-EMC-ConduitNewTargetEvent-and-remove-target-for-canc.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 01c6938c93255619c89e749911cc41df63f2655a Mon Sep 17 00:00:00 2001 -From: chickeneer -Date: Sun, 14 Jul 2019 13:50:53 -0500 -Subject: [PATCH] EMC ConduitNewTargetEvent and remove target for cancelled - damage events - ---- - .../java/net/minecraft/server/TileEntityConduit.java | 11 +++++++++-- - 1 file changed, 9 insertions(+), 2 deletions(-) - -diff --git a/src/main/java/net/minecraft/server/TileEntityConduit.java b/src/main/java/net/minecraft/server/TileEntityConduit.java -index 34c191d76..3f487a9d9 100644 ---- a/src/main/java/net/minecraft/server/TileEntityConduit.java -+++ b/src/main/java/net/minecraft/server/TileEntityConduit.java -@@ -199,7 +199,14 @@ public class TileEntityConduit extends TileEntity implements ITickable { - List list = this.world.a(EntityLiving.class, this.m(), (java.util.function.Predicate) (entityliving1) -> { // CraftBukkit - decompile error - return entityliving1 instanceof IMonster && entityliving1.isInWaterOrRain(); - }); -- -+ // EMC start -+ List bukkitEntities = Lists.newArrayListWithCapacity(list.size()); -+ for (EntityLiving entity : list) { -+ bukkitEntities.add(entity.getBukkitLivingEntity()); -+ } -+ new com.empireminecraft.customevents.ConduitNewTargetEvent(bukkitEntities, CraftBlock.at(this.world, this.position)).callEvent(); -+ list.removeIf(entityLiving -> !bukkitEntities.contains(entityLiving.getBukkitLivingEntity())); -+ // EMC end - if (!list.isEmpty()) { - this.target = (EntityLiving) list.get(this.world.random.nextInt(list.size())); - } -@@ -212,7 +219,7 @@ public class TileEntityConduit extends TileEntity implements ITickable { - CraftEventFactory.blockDamage = CraftBlock.at(this.world, this.position); - if (this.target.damageEntity(DamageSource.MAGIC, 4.0F)) { - this.world.playSound((EntityHuman) null, this.target.locX(), this.target.locY(), this.target.locZ(), SoundEffects.BLOCK_CONDUIT_ATTACK_TARGET, SoundCategory.BLOCKS, 1.0F, 1.0F); -- } -+ } else { this.target = null; } // EMC - CraftEventFactory.blockDamage = null; - // CraftBukkit end - } --- -2.25.1.windows.1 - diff --git a/patches/server-old/0026-EMC-Fix-Bukkit.createInventory-with-type-LECTERN.patch b/patches/server-old/0026-EMC-Fix-Bukkit.createInventory-with-type-LECTERN.patch deleted file mode 100644 index dd4e79cc..00000000 --- a/patches/server-old/0026-EMC-Fix-Bukkit.createInventory-with-type-LECTERN.patch +++ /dev/null @@ -1,148 +0,0 @@ -From db51502b040569dcacc24b38213690c21bd8b4ca Mon Sep 17 00:00:00 2001 -From: willies952002 -Date: Fri, 16 Aug 2019 22:18:35 -0400 -Subject: [PATCH] EMC Fix Bukkit.createInventory() with type LECTERN - -This fixes an issue with Bukkit which makes it possible to open a Lectern interface, but not be able to interact with it (e.g.: change pages). The following changes had to be made: - -nms.TileEntityLectern: -- Add `virtual` flag, this is used to stop calls that would attempt to update a block which we do not have, as well as used in the following change. - -nms.TileEntityLectern$LecternInventory -- in `a(EntityHuman)`, add `(TileEntityLectern.this.virtual && TileEntityLectern.this.hasBook()) ||` to short-circuit the "can use" logic -- Add `getLectern()` method for use in the following change. - -obc.e.CraftHumanEntity#openInventory(Inventory): -- Check if the wrapped inventory is a TileEntityLectern.LecternInventory, and get the Lectern from that - -obc.i.u.CraftTileInventoryConverter$Lectern: -- Mark the created lectern as "virtual" -- Override `getInventory(IInventory)` to return a CraftInventoryLectern. - -This patch is licensed under the MIT License. -License: https://opensource.org/licenses/MIT ---- - .../net/minecraft/server/TileEntityLectern.java | 14 +++++++++++--- - .../craftbukkit/entity/CraftHumanEntity.java | 6 ++++++ - .../util/CraftTileInventoryConverter.java | 13 ++++++++++++- - 3 files changed, 29 insertions(+), 4 deletions(-) - -diff --git a/src/main/java/net/minecraft/server/TileEntityLectern.java b/src/main/java/net/minecraft/server/TileEntityLectern.java -index c3b854b6a..2fa24a386 100644 ---- a/src/main/java/net/minecraft/server/TileEntityLectern.java -+++ b/src/main/java/net/minecraft/server/TileEntityLectern.java -@@ -18,6 +18,11 @@ public class TileEntityLectern extends TileEntity implements Clearable, ITileInv - // CraftBukkit start - add fields and methods - public IInventory inventory = new LecternInventory(); // Tuinity - need non-final for `createCopyForPush` - public class LecternInventory implements IInventory { -+ // EMC start -+ public TileEntityLectern getLectern() { -+ return TileEntityLectern.this; -+ } -+ // EMC end - - public List transaction = new ArrayList<>(); - private int maxStack = 1; -@@ -75,7 +80,7 @@ public class TileEntityLectern extends TileEntity implements Clearable, ITileInv - - @Override - public ItemStack splitStack(int i, int j) { -- if (i == 0) { -+ if (i == 0 && !TileEntityLectern.this.virtual) { // EMC - ItemStack itemstack = TileEntityLectern.this.book.cloneAndSubtract(j); - - if (TileEntityLectern.this.book.isEmpty()) { -@@ -90,7 +95,7 @@ public class TileEntityLectern extends TileEntity implements Clearable, ITileInv - - @Override - public ItemStack splitWithoutUpdate(int i) { -- if (i == 0) { -+ if (i == 0 && !TileEntityLectern.this.virtual) { // EMC - ItemStack itemstack = TileEntityLectern.this.book; - - TileEntityLectern.this.book = ItemStack.a; -@@ -125,7 +130,7 @@ public class TileEntityLectern extends TileEntity implements Clearable, ITileInv - - @Override - public boolean a(EntityHuman entityhuman) { -- return TileEntityLectern.this.world.getTileEntity(TileEntityLectern.this.position) != TileEntityLectern.this ? false : (entityhuman.g((double) TileEntityLectern.this.position.getX() + 0.5D, (double) TileEntityLectern.this.position.getY() + 0.5D, (double) TileEntityLectern.this.position.getZ() + 0.5D) > 64.0D ? false : TileEntityLectern.this.hasBook()); -+ return (TileEntityLectern.this.virtual && TileEntityLectern.this.hasBook()) || TileEntityLectern.this.world.getTileEntity(TileEntityLectern.this.position) != TileEntityLectern.this ? false : (entityhuman.g((double) TileEntityLectern.this.position.getX() + 0.5D, (double) TileEntityLectern.this.position.getY() + 0.5D, (double) TileEntityLectern.this.position.getZ() + 0.5D) > 64.0D ? false : TileEntityLectern.this.hasBook()); - } - - @Override -@@ -165,6 +170,7 @@ public class TileEntityLectern extends TileEntity implements Clearable, ITileInv - private ItemStack book; - private int page; - private int maxPage; -+ public boolean virtual = false; // EMC - - // Tuinity start - pushable TE's - @Override -@@ -198,6 +204,7 @@ public class TileEntityLectern extends TileEntity implements Clearable, ITileInv - } - - private void k() { -+ if (this.virtual) return; // EMC - this.page = 0; - this.maxPage = 0; - BlockLectern.setHasBook(this.getWorld(), this.getPosition(), this.getBlock(), false); -@@ -215,6 +222,7 @@ public class TileEntityLectern extends TileEntity implements Clearable, ITileInv - - if (j != this.page) { - this.page = j; -+ if (this.virtual) return; // EMC - this.update(); - if (this.world != null) BlockLectern.a(this.getWorld(), this.getPosition(), this.getBlock()); // CraftBukkit - } -diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java -index faa65ef20..74b9c4516 100644 ---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java -+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java -@@ -31,6 +31,7 @@ import net.minecraft.server.PacketPlayInCloseWindow; - import net.minecraft.server.PacketPlayOutOpenWindow; - import net.minecraft.server.TileEntity; - import net.minecraft.server.TileEntityContainer; -+import net.minecraft.server.TileEntityLectern.LecternInventory; - import net.minecraft.server.Vec3D; - import org.bukkit.GameMode; - import org.bukkit.Location; -@@ -328,6 +329,11 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { - if (craft.getInventory() instanceof ITileInventory) { - iinventory = (ITileInventory) craft.getInventory(); - } -+ // EMC start -+ if (craft.getInventory() instanceof LecternInventory) { -+ iinventory = ((LecternInventory)craft.getInventory()).getLectern(); -+ } -+ // EMC end - } - - if (iinventory instanceof ITileInventory) { -diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/util/CraftTileInventoryConverter.java b/src/main/java/org/bukkit/craftbukkit/inventory/util/CraftTileInventoryConverter.java -index 32b36c70a..f0c1d6110 100644 ---- a/src/main/java/org/bukkit/craftbukkit/inventory/util/CraftTileInventoryConverter.java -+++ b/src/main/java/org/bukkit/craftbukkit/inventory/util/CraftTileInventoryConverter.java -@@ -126,8 +126,19 @@ public abstract class CraftTileInventoryConverter implements CraftInventoryCreat - - @Override - public IInventory getTileEntity() { -- return new TileEntityLectern().inventory; -+ // EMC start -+ TileEntityLectern lectern = new TileEntityLectern(); -+ lectern.virtual = true; -+ return lectern.inventory; -+ // EMC end - } -+ -+ // EMC start -+ @Override -+ public Inventory getInventory(IInventory tileEntity) { -+ return new org.bukkit.craftbukkit.inventory.CraftInventoryLectern(tileEntity); -+ } -+ // EMC end - } - - public static class Smoker extends CraftTileInventoryConverter { --- -2.25.1.windows.1 - diff --git a/patches/server-old/0027-EMC-Add-the-PlayerThrowTridentEvent.patch b/patches/server-old/0027-EMC-Add-the-PlayerThrowTridentEvent.patch deleted file mode 100644 index 35408ec8..00000000 --- a/patches/server-old/0027-EMC-Add-the-PlayerThrowTridentEvent.patch +++ /dev/null @@ -1,33 +0,0 @@ -From ab02a56558a446bdd59ee0d545181dc1cc5c8654 Mon Sep 17 00:00:00 2001 -From: chickeneer -Date: Fri, 29 Nov 2019 02:48:17 -0600 -Subject: [PATCH] EMC Add the PlayerThrowTridentEvent - ---- - src/main/java/net/minecraft/server/ItemTrident.java | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/src/main/java/net/minecraft/server/ItemTrident.java b/src/main/java/net/minecraft/server/ItemTrident.java -index f571a1586..2997c0e98 100644 ---- a/src/main/java/net/minecraft/server/ItemTrident.java -+++ b/src/main/java/net/minecraft/server/ItemTrident.java -@@ -1,6 +1,8 @@ - package net.minecraft.server; - - import com.google.common.collect.Multimap; -+import org.bukkit.craftbukkit.inventory.CraftItemStack; -+import org.bukkit.entity.Player; - - public class ItemTrident extends Item { - -@@ -62,6 +64,7 @@ public class ItemTrident extends Item { - } - return; - } -+ (new com.destroystokyo.paper.event.player.PlayerThrowTridentEvent((Player) entityhuman.getBukkitEntity(), CraftItemStack.asCraftMirror(itemstack), entitythrowntrident.getBukkitEntity())).callEvent(); // Paper - - itemstack.damage(1, entityhuman, (entityhuman1) -> { - entityhuman1.broadcastItemBreak(entityliving.getRaisedHand()); --- -2.25.1.windows.1 - diff --git a/patches/server-old/0028-EMC-Add-the-BlockHarvestBeehiveEvent.patch b/patches/server-old/0028-EMC-Add-the-BlockHarvestBeehiveEvent.patch deleted file mode 100644 index 6b04d128..00000000 --- a/patches/server-old/0028-EMC-Add-the-BlockHarvestBeehiveEvent.patch +++ /dev/null @@ -1,36 +0,0 @@ -From 92ca427597f1f01e52e82ba71c81b8148ceab7ef Mon Sep 17 00:00:00 2001 -From: chickeneer -Date: Fri, 17 Jan 2020 21:32:10 -0600 -Subject: [PATCH] EMC Add the BlockHarvestBeehiveEvent - ---- - src/main/java/net/minecraft/server/IDispenseBehavior.java | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/src/main/java/net/minecraft/server/IDispenseBehavior.java b/src/main/java/net/minecraft/server/IDispenseBehavior.java -index 3af686c7f..df0501b65 100644 ---- a/src/main/java/net/minecraft/server/IDispenseBehavior.java -+++ b/src/main/java/net/minecraft/server/IDispenseBehavior.java -@@ -4,6 +4,7 @@ import java.util.Iterator; - import java.util.List; - import java.util.Random; - // CraftBukkit start -+import com.empireminecraft.customevents.BlockHarvestBeehiveEvent; - import org.bukkit.Location; - import org.bukkit.TreeType; - import org.bukkit.craftbukkit.event.CraftEventFactory; -@@ -861,6 +862,11 @@ public interface IDispenseBehavior { - int k = (Integer) iblockdata.get(BlockBeehive.c); - - if (k >= 5) { -+ // EMC start -+ if (!(new BlockHarvestBeehiveEvent(bukkitBlock, MCUtil.toBukkitBlock(world, blockposition), craftItem).callEvent())) { -+ return itemstack; -+ } -+ // EMC end - if (itemstack.isDamaged(1, world.random, (EntityPlayer) null)) { - itemstack.setCount(0); - } --- -2.25.1.windows.1 - diff --git a/patches/server-old/0029-Purpur-Fix-outdated-server-showing-in-ping-before-se.patch b/patches/server-old/0029-Purpur-Fix-outdated-server-showing-in-ping-before-se.patch deleted file mode 100644 index 2b5e3e3c..00000000 --- a/patches/server-old/0029-Purpur-Fix-outdated-server-showing-in-ping-before-se.patch +++ /dev/null @@ -1,25 +0,0 @@ -From ba093bacd8385828644662b4da96ec7b57bed9ab Mon Sep 17 00:00:00 2001 -From: William Blake Galbreath -Date: Tue, 4 Jun 2019 15:50:08 -0500 -Subject: [PATCH] Purpur Fix 'outdated server' showing in ping before server - fully boots - ---- - src/main/java/net/minecraft/server/PacketStatusListener.java | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/src/main/java/net/minecraft/server/PacketStatusListener.java b/src/main/java/net/minecraft/server/PacketStatusListener.java -index 4bb21c48b..30f16db02 100644 ---- a/src/main/java/net/minecraft/server/PacketStatusListener.java -+++ b/src/main/java/net/minecraft/server/PacketStatusListener.java -@@ -135,6 +135,7 @@ public class PacketStatusListener implements PacketStatusInListener { - - this.networkManager.sendPacket(new PacketStatusOutServerInfo(ping)); - */ -+ if (this.minecraftServer.getServerPing().getServerData() == null) return; // Purpur - do not respond to pings before we know the protocol version - com.destroystokyo.paper.network.StandardPaperServerListPingEventImpl.processRequest(this.minecraftServer, this.networkManager); - // Paper end - } --- -2.25.1.windows.1 - diff --git a/patches/server-old/0033-Add-config-yapfa-command-and-basic-settings.patch b/patches/server-old/0033-Add-config-yapfa-command-and-basic-settings.patch deleted file mode 100644 index 8f96774a..00000000 --- a/patches/server-old/0033-Add-config-yapfa-command-and-basic-settings.patch +++ /dev/null @@ -1,461 +0,0 @@ -From 6f518067553e9a77f33a2b71594219d86403f4ea Mon Sep 17 00:00:00 2001 -From: tr7zw -Date: Thu, 5 Mar 2020 22:31:50 +0100 -Subject: [PATCH] Add config, yapfa command and basic settings - ---- - .../java/de/tr7zw/yapfa/YapfaCommand.java | 129 +++++++++++ - src/main/java/de/tr7zw/yapfa/YapfaConfig.java | 219 ++++++++++++++++++ - .../net/minecraft/server/DedicatedServer.java | 9 + - .../java/net/minecraft/server/Entity.java | 7 +- - .../net/minecraft/server/EntityLiving.java | 4 + - 5 files changed, 365 insertions(+), 3 deletions(-) - create mode 100644 src/main/java/de/tr7zw/yapfa/YapfaCommand.java - create mode 100644 src/main/java/de/tr7zw/yapfa/YapfaConfig.java - -diff --git a/src/main/java/de/tr7zw/yapfa/YapfaCommand.java b/src/main/java/de/tr7zw/yapfa/YapfaCommand.java -new file mode 100644 -index 000000000..76d83f3db ---- /dev/null -+++ b/src/main/java/de/tr7zw/yapfa/YapfaCommand.java -@@ -0,0 +1,129 @@ -+package de.tr7zw.yapfa; -+ -+import java.io.File; -+import java.util.ArrayList; -+import java.util.Arrays; -+import java.util.Collection; -+import java.util.Collections; -+import java.util.Iterator; -+import java.util.List; -+import java.util.Locale; -+ -+import org.bukkit.Bukkit; -+import org.bukkit.ChatColor; -+import org.bukkit.Location; -+import org.bukkit.command.Command; -+import org.bukkit.command.CommandSender; -+ -+import com.google.common.base.Functions; -+import com.google.common.collect.Iterables; -+import com.google.common.collect.Lists; -+ -+import net.minecraft.server.MinecraftKey; -+import net.minecraft.server.MinecraftServer; -+ -+public class YapfaCommand extends Command { -+ -+ public YapfaCommand(String name) { -+ super(name); -+ this.description = "YAPFA related commands"; -+ this.usageMessage = "/yapfa [help | reload | info | version]"; -+ this.setPermission("bukkit.command.yapfa"); -+ } -+ -+ @Override -+ public List tabComplete(CommandSender sender, String alias, String[] args, Location location) throws IllegalArgumentException { -+ if (args.length <= 1) -+ return getListMatchingLast(args, "help", "info", "reload", "version"); -+ return Collections.emptyList(); -+ } -+ -+ // Code from Mojang - copyright them -+ public static List getListMatchingLast(String[] args, String... matches) { -+ return getListMatchingLast(args, (Collection) Arrays.asList(matches)); -+ } -+ -+ public static boolean matches(String s, String s1) { -+ return s1.regionMatches(true, 0, s, 0, s.length()); -+ } -+ -+ public static List getListMatchingLast(String[] strings, Collection collection) { -+ String last = strings[strings.length - 1]; -+ ArrayList results = Lists.newArrayList(); -+ -+ if (!collection.isEmpty()) { -+ Iterator iterator = Iterables.transform(collection, Functions.toStringFunction()).iterator(); -+ -+ while (iterator.hasNext()) { -+ String s1 = (String) iterator.next(); -+ -+ if (matches(last, s1)) { -+ results.add(s1); -+ } -+ } -+ -+ if (results.isEmpty()) { -+ iterator = collection.iterator(); -+ -+ while (iterator.hasNext()) { -+ Object object = iterator.next(); -+ -+ if (object instanceof MinecraftKey && matches(last, ((MinecraftKey) object).getKey())) { -+ results.add(String.valueOf(object)); -+ } -+ } -+ } -+ } -+ -+ return results; -+ } -+ // end copy stuff -+ -+ @Override -+ public boolean execute(CommandSender sender, String commandLabel, String[] args) { -+ if (!testPermission(sender)) return true; -+ -+ if (args.length == 0) { -+ sender.sendMessage(ChatColor.RED + "Usage: " + usageMessage); -+ return false; -+ } -+ -+ switch (args[0].toLowerCase(Locale.ENGLISH)) { -+ case "info": -+ doInfo(sender); -+ break; -+ case "reload": -+ doReload(sender); -+ break; -+ case "ver": -+ case "version": -+ Command ver = org.bukkit.Bukkit.getServer().getCommandMap().getCommand("version"); -+ if (ver != null) { -+ ver.execute(sender, commandLabel, new String[0]); -+ break; -+ } -+ // else - fall through to default -+ default: -+ sender.sendMessage(ChatColor.RED + "Usage: " + usageMessage); -+ return false; -+ } -+ -+ return true; -+ } -+ -+ private void doInfo(CommandSender sender) { -+ Command.broadcastCommandMessage(sender, ChatColor.GREEN + "Last tick took " + Bukkit.getLastTickMs() + "ms"); -+ //TODO -+ } -+ -+ private void doReload(CommandSender sender) { -+ Command.broadcastCommandMessage(sender, ChatColor.RED + "Please note that this command is not supported and may cause issues."); -+ Command.broadcastCommandMessage(sender, ChatColor.RED + "If you encounter any issues please use the /stop command to restart your server."); -+ -+ MinecraftServer console = MinecraftServer.getServer(); -+ de.tr7zw.yapfa.YapfaConfig.init(new File("yapfa.yml")); -+ console.server.reloadCount++; -+ -+ Command.broadcastCommandMessage(sender, ChatColor.GREEN + "YAPFA config reload complete."); -+ } -+} -\ No newline at end of file -diff --git a/src/main/java/de/tr7zw/yapfa/YapfaConfig.java b/src/main/java/de/tr7zw/yapfa/YapfaConfig.java -new file mode 100644 -index 000000000..9711cbc52 ---- /dev/null -+++ b/src/main/java/de/tr7zw/yapfa/YapfaConfig.java -@@ -0,0 +1,219 @@ -+package de.tr7zw.yapfa; -+ -+import com.destroystokyo.paper.io.chunk.ChunkTaskManager; -+import com.google.common.base.Strings; -+import com.google.common.base.Throwables; -+ -+import java.io.File; -+import java.io.IOException; -+import java.lang.reflect.InvocationTargetException; -+import java.lang.reflect.Method; -+import java.lang.reflect.Modifier; -+import java.nio.charset.StandardCharsets; -+import java.util.HashMap; -+import java.util.List; -+import java.util.Map; -+import java.util.Set; -+import java.util.concurrent.TimeUnit; -+import java.util.logging.Level; -+import java.util.regex.Pattern; -+ -+import com.google.common.collect.Lists; -+import net.minecraft.server.MinecraftServer; -+import org.bukkit.Bukkit; -+import org.bukkit.ChatColor; -+import org.bukkit.command.Command; -+import org.bukkit.configuration.ConfigurationSection; -+import org.bukkit.configuration.InvalidConfigurationException; -+import org.bukkit.configuration.file.YamlConfiguration; -+import co.aikar.timings.Timings; -+import co.aikar.timings.TimingsManager; -+import org.spigotmc.SpigotConfig; -+import org.spigotmc.WatchdogThread; -+ -+public class YapfaConfig { -+ -+ private static File CONFIG_FILE; -+ private static final String HEADER = "This is the main configuration file for YAPFA.\n" -+ + "YAPFA contains many breaking changes and settings, so know what you are doing!\n" -+ + "You have been warned!\n"; -+ /*========================================================================*/ -+ public static YamlConfiguration config; -+ static int version; -+ static Map commands; -+ private static boolean verbose; -+ private static boolean fatalError; -+ /*========================================================================*/ -+ private static boolean metricsStarted; -+ -+ public static void init(File configFile) { -+ CONFIG_FILE = configFile; -+ config = new YamlConfiguration(); -+ try { -+ config.load(CONFIG_FILE); -+ } catch (IOException ex) { -+ } catch (InvalidConfigurationException ex) { -+ Bukkit.getLogger().log(Level.SEVERE, "Could not load yapfa.yml, please correct your syntax errors", ex); -+ throw Throwables.propagate(ex); -+ } -+ config.options().header(HEADER); -+ config.options().copyDefaults(true); -+ verbose = getBoolean("verbose", false); -+ -+ commands = new HashMap(); -+ commands.put("yapfa", new YapfaCommand("yapfa")); -+ -+ version = getInt("config-version", 1); -+ set("config-version", 1); -+ readConfig(YapfaConfig.class, null); -+ } -+ -+ protected static void logError(String s) { -+ Bukkit.getLogger().severe(s); -+ } -+ -+ protected static void fatal(String s) { -+ fatalError = true; -+ throw new RuntimeException("Fatal yapfa.yml config error: " + s); -+ } -+ -+ protected static void log(String s) { -+ if (verbose) { -+ Bukkit.getLogger().info(s); -+ } -+ } -+ -+ public static void registerCommands() { -+ for (Map.Entry entry : commands.entrySet()) { -+ MinecraftServer.getServer().server.getCommandMap().register(entry.getKey(), "Yapfa", entry.getValue()); -+ } -+ } -+ -+ static void readConfig(Class clazz, Object instance) { -+ for (Method method : clazz.getDeclaredMethods()) { -+ if (Modifier.isPrivate(method.getModifiers())) { -+ if (method.getParameterTypes().length == 0 && method.getReturnType() == Void.TYPE) { -+ try { -+ method.setAccessible(true); -+ method.invoke(instance); -+ } catch (InvocationTargetException ex) { -+ throw Throwables.propagate(ex.getCause()); -+ } catch (Exception ex) { -+ Bukkit.getLogger().log(Level.SEVERE, "Error invoking " + method, ex); -+ } -+ } -+ } -+ } -+ -+ try { -+ config.save(CONFIG_FILE); -+ } catch (IOException ex) { -+ Bukkit.getLogger().log(Level.SEVERE, "Could not save " + CONFIG_FILE, ex); -+ } -+ } -+ -+ private static final Pattern SPACE = Pattern.compile(" "); -+ private static final Pattern NOT_NUMERIC = Pattern.compile("[^-\\d.]"); -+ public static int getSeconds(String str) { -+ str = SPACE.matcher(str).replaceAll(""); -+ final char unit = str.charAt(str.length() - 1); -+ str = NOT_NUMERIC.matcher(str).replaceAll(""); -+ double num; -+ try { -+ num = Double.parseDouble(str); -+ } catch (Exception e) { -+ num = 0D; -+ } -+ switch (unit) { -+ case 'd': num *= (double) 60*60*24; break; -+ case 'h': num *= (double) 60*60; break; -+ case 'm': num *= (double) 60; break; -+ default: case 's': break; -+ } -+ return (int) num; -+ } -+ -+ protected static String timeSummary(int seconds) { -+ String time = ""; -+ -+ if (seconds > 60 * 60 * 24) { -+ time += TimeUnit.SECONDS.toDays(seconds) + "d"; -+ seconds %= 60 * 60 * 24; -+ } -+ -+ if (seconds > 60 * 60) { -+ time += TimeUnit.SECONDS.toHours(seconds) + "h"; -+ seconds %= 60 * 60; -+ } -+ -+ if (seconds > 0) { -+ time += TimeUnit.SECONDS.toMinutes(seconds) + "m"; -+ } -+ return time; -+ } -+ -+ private static void set(String path, Object val) { -+ config.set(path, val); -+ } -+ -+ private static boolean getBoolean(String path, boolean def) { -+ config.addDefault(path, def); -+ return config.getBoolean(path, config.getBoolean(path)); -+ } -+ -+ private static double getDouble(String path, double def) { -+ config.addDefault(path, def); -+ return config.getDouble(path, config.getDouble(path)); -+ } -+ -+ private static float getFloat(String path, float def) { -+ // TODO: Figure out why getFloat() always returns the default value. -+ return (float) getDouble(path, (double) def); -+ } -+ -+ private static int getInt(String path, int def) { -+ config.addDefault(path, def); -+ return config.getInt(path, config.getInt(path)); -+ } -+ -+ private static List getList(String path, T def) { -+ config.addDefault(path, def); -+ return (List) config.getList(path, config.getList(path)); -+ } -+ -+ private static String getString(String path, String def) { -+ config.addDefault(path, def); -+ return config.getString(path, config.getString(path)); -+ } -+ -+ public static boolean disableEntityWaterChecks = false; -+ private static void disableEntityWaterChecks() { -+ disableEntityWaterChecks = getBoolean("settings.disableEntityWaterChecks", false); -+ } -+ -+ public static boolean disableEntityStuckChecks = false; -+ private static void disableEntityStuckChecks() { -+ disableEntityStuckChecks = getBoolean("settings.disableEntityStuckChecks", false); -+ } -+ -+ public static boolean disablePlayerOutOfWorldBorderCheck = false; -+ private static void disablePlayerOutOfWorldBorderCheck() { -+ disablePlayerOutOfWorldBorderCheck = getBoolean("settings.disablePlayerOutOfWorldBorderCheck", false); -+ } -+ -+ public static boolean disableEntityCollisions = false; -+ private static void disableEntityCollisions() { -+ disableEntityCollisions = getBoolean("settings.disableEntityCollisions", false); -+ } -+ -+ public static int checkEntityBlockCollisionTicks = 1; -+ private static void checkEntityBlockCollisionTicks() { -+ checkEntityBlockCollisionTicks = getInt("settings.checkEntityBlockCollisionTicks", 1); -+ } -+ -+ public static boolean disableEntityCollisionboxes = false; -+ private static void disableEntityCollisionboxes() { -+ disableEntityCollisionboxes = getBoolean("settings.disableEntityCollisionboxes", false); -+ } -+ -+} -\ No newline at end of file -diff --git a/src/main/java/net/minecraft/server/DedicatedServer.java b/src/main/java/net/minecraft/server/DedicatedServer.java -index 77651d228..bbf4f1ef6 100644 ---- a/src/main/java/net/minecraft/server/DedicatedServer.java -+++ b/src/main/java/net/minecraft/server/DedicatedServer.java -@@ -194,6 +194,15 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer - com.destroystokyo.paper.PaperConfig.registerCommands(); - com.destroystokyo.paper.VersionHistoryManager.INSTANCE.getClass(); // load version history now - // Paper end -+ // YAPFA start -+ try { -+ de.tr7zw.yapfa.YapfaConfig.init(new File("yapfa.yml")); -+ } catch (Exception e) { -+ DedicatedServer.LOGGER.error("Unable to load server configuration", e); -+ return false; -+ } -+ de.tr7zw.yapfa.YapfaConfig.registerCommands(); -+ // YAPFA end - com.tuinity.tuinity.config.TuinityConfig.init((File) options.valueOf("tuinity-settings")); // Tuinity - Server Config - - this.setSpawnAnimals(dedicatedserverproperties.spawnAnimals); -diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java -index 6d62a1af5..2e3329bd2 100644 ---- a/src/main/java/net/minecraft/server/Entity.java -+++ b/src/main/java/net/minecraft/server/Entity.java -@@ -768,6 +768,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke - - try { - this.inLava = false; -+ if(MinecraftServer.currentTick % de.tr7zw.yapfa.YapfaConfig.checkEntityBlockCollisionTicks == 0) // YAPFA - this.checkBlockCollisions(); - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Checking entity block collision"); -@@ -1029,9 +1030,9 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke - private Vec3D e(Vec3D vec3d) { - AxisAlignedBB axisalignedbb = this.getBoundingBox(); - VoxelShapeCollision voxelshapecollision = VoxelShapeCollision.a(this); -- VoxelShape voxelshape = this.world.getWorldBorder().a(); -- Stream stream = !this.world.getWorldBorder().isInBounds(axisalignedbb) ? Stream.empty() : Stream.of(this.world.getWorldBorder().a()); // Paper -- Stream stream1 = this.world.b(this, axisalignedbb.a(vec3d), (Set) ImmutableSet.of()); -+ -+ Stream stream = !this.world.getWorldBorder().isInBounds(axisalignedbb) ? Stream.empty() : Stream.of(this.world.getWorldBorder().a()); // Tuinity - optimise voxelshapes -+ Stream stream1 = de.tr7zw.yapfa.YapfaConfig.disableEntityCollisionboxes ? Stream.empty() : this.world.b(this, axisalignedbb.a(vec3d), (Set) ImmutableSet.of()); // YAPFA - StreamAccumulator streamaccumulator = new StreamAccumulator<>(Stream.concat(stream1, stream)); - Vec3D vec3d1 = vec3d.g() == 0.0D ? vec3d : a(this, vec3d, axisalignedbb, this.world, voxelshapecollision, streamaccumulator); - boolean flag = vec3d.x != vec3d1.x; -diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java -index 11be0931c..b77960710 100644 ---- a/src/main/java/net/minecraft/server/EntityLiving.java -+++ b/src/main/java/net/minecraft/server/EntityLiving.java -@@ -246,6 +246,7 @@ public abstract class EntityLiving extends Entity { - this.world.getMethodProfiler().enter("livingEntityBaseTick"); - boolean flag = this instanceof EntityHuman; - -+ if(!de.tr7zw.yapfa.YapfaConfig.disableEntityStuckChecks) { // YAPFA start - if (this.isAlive()) { - if (this.inBlock()) { - this.damageEntity(DamageSource.STUCK, 1.0F); -@@ -261,6 +262,7 @@ public abstract class EntityLiving extends Entity { - } - } - } -+ } // YAPFA end - - if (this.isFireProof() || this.world.isClientSide) { - this.extinguish(); -@@ -269,6 +271,7 @@ public abstract class EntityLiving extends Entity { - boolean flag1 = flag && ((EntityHuman) this).abilities.isInvulnerable; - - if (this.isAlive()) { -+ if(this instanceof EntityPlayer || !de.tr7zw.yapfa.YapfaConfig.disableEntityWaterChecks) { // YAPFA start - if (this.a(TagsFluid.WATER) && this.world.getType(new BlockPosition(this.locX(), this.getHeadY(), this.locZ())).getBlock() != Blocks.BUBBLE_COLUMN) { - if (!this.canBreatheUnderwater() && !MobEffectUtil.c(this) && !flag1) { // Paper - use OBFHELPER so it can be overridden - this.setAirTicks(this.l(this.getAirTicks())); -@@ -294,6 +297,7 @@ public abstract class EntityLiving extends Entity { - } else if (this.getAirTicks() < this.bw()) { - this.setAirTicks(this.m(this.getAirTicks())); - } -+ } // YAPFA end - - if (!this.world.isClientSide) { - BlockPosition blockposition = new BlockPosition(this); --- -2.25.1.windows.1 - diff --git a/patches/server-old/0034-Kill-the-vanilla-GameProfiler.patch b/patches/server-old/0034-Kill-the-vanilla-GameProfiler.patch deleted file mode 100644 index 08d2acb3..00000000 --- a/patches/server-old/0034-Kill-the-vanilla-GameProfiler.patch +++ /dev/null @@ -1,93 +0,0 @@ -From 1f3dd8087b0e674afbaa194b51590251711a6991 Mon Sep 17 00:00:00 2001 -From: tr7zw -Date: Thu, 5 Mar 2020 23:08:01 +0100 -Subject: [PATCH] Kill the vanilla "GameProfiler" - ---- - .../de/tr7zw/yapfa/GameProfilerDisabled.java | 51 +++++++++++++++++++ - .../net/minecraft/server/MinecraftServer.java | 4 +- - 2 files changed, 53 insertions(+), 2 deletions(-) - create mode 100644 src/main/java/de/tr7zw/yapfa/GameProfilerDisabled.java - -diff --git a/src/main/java/de/tr7zw/yapfa/GameProfilerDisabled.java b/src/main/java/de/tr7zw/yapfa/GameProfilerDisabled.java -new file mode 100644 -index 000000000..96a2270a8 ---- /dev/null -+++ b/src/main/java/de/tr7zw/yapfa/GameProfilerDisabled.java -@@ -0,0 +1,51 @@ -+package de.tr7zw.yapfa; -+ -+import java.util.function.IntSupplier; -+import java.util.function.Supplier; -+ -+import net.minecraft.server.GameProfiler; -+ -+public class GameProfilerDisabled extends GameProfiler{ -+ -+ public GameProfilerDisabled(IntSupplier var0) { -+ super(var0); -+ } -+ -+ @Override -+ public net.minecraft.server.GameProfiler.a d() { -+ return super.d(); -+ } -+ -+ @Override -+ public void a() { -+ } -+ -+ @Override -+ public void b() { -+ } -+ -+ @Override -+ public void enter(String var0) { -+ } -+ -+ @Override -+ public void a(Supplier var0) { -+ } -+ -+ @Override -+ public void exit() { -+ } -+ -+ @Override -+ public void exitEnter(String var0) { -+ } -+ -+ @Override -+ public void c(String var0) { -+ } -+ -+ @Override -+ public void c(Supplier var0) { -+ } -+ -+} -diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index f41584b85..53acfcd5b 100644 ---- a/src/main/java/net/minecraft/server/MinecraftServer.java -+++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -80,7 +80,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant tickables = Lists.newArrayList(); -- private final GameProfiler methodProfiler = new GameProfiler(this::ak); -+ private final GameProfiler methodProfiler = new de.tr7zw.yapfa.GameProfilerDisabled(this::ak); // YAPFA - private ServerConnection serverConnection; - public final WorldLoadListenerFactory worldLoadListenerFactory; - private final ServerPing serverPing = new ServerPing(); -@@ -964,7 +964,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant -Date: Mon, 23 Mar 2020 18:20:58 +0100 -Subject: [PATCH] Remove Stream usage - -This removes streams from the entity collision code, Crafting Manager and some other useless places. ---- - .../yapfa/collision/CollisionHelper.java | 123 +++++++++++++++ - src/main/java/net/minecraft/server/Block.java | 2 +- - .../net/minecraft/server/BlockPosition.java | 2 +- - .../net/minecraft/server/CraftingManager.java | 58 +++++-- - .../java/net/minecraft/server/Entity.java | 145 ++++++++++++++++-- - .../net/minecraft/server/EntityLiving.java | 1 + - .../net/minecraft/server/VoxelShapes.java | 103 +++++++++++++ - 7 files changed, 400 insertions(+), 34 deletions(-) - create mode 100644 src/main/java/de/tr7zw/yapfa/collision/CollisionHelper.java - -diff --git a/src/main/java/de/tr7zw/yapfa/collision/CollisionHelper.java b/src/main/java/de/tr7zw/yapfa/collision/CollisionHelper.java -new file mode 100644 -index 000000000..d67753937 ---- /dev/null -+++ b/src/main/java/de/tr7zw/yapfa/collision/CollisionHelper.java -@@ -0,0 +1,123 @@ -+package de.tr7zw.yapfa.collision; -+ -+import java.util.List; -+import java.util.Spliterator; -+import java.util.Spliterators; -+import java.util.Spliterators.AbstractSpliterator; -+import java.util.function.Consumer; -+ -+import javax.annotation.Nullable; -+ -+import com.google.common.collect.Lists; -+ -+import net.minecraft.server.AxisAlignedBB; -+import net.minecraft.server.BlockPosition; -+import net.minecraft.server.BlockPosition.MutableBlockPosition; -+import net.minecraft.server.Blocks; -+import net.minecraft.server.CursorPosition; -+import net.minecraft.server.Entity; -+import net.minecraft.server.IBlockAccess; -+import net.minecraft.server.IBlockData; -+import net.minecraft.server.ICollisionAccess; -+import net.minecraft.server.MathHelper; -+import net.minecraft.server.OperatorBoolean; -+import net.minecraft.server.StreamAccumulator; -+import net.minecraft.server.VoxelShape; -+import net.minecraft.server.VoxelShapeCollision; -+import net.minecraft.server.VoxelShapes; -+ -+public class CollisionHelper { -+ -+ public static AbstractSpliterator b(ICollisionAccess collisionAccess, VoxelShape worldBorder, @Nullable Entity var0, AxisAlignedBB var1) { -+ int var2 = MathHelper.floor((double) (var1.minX - 1.0E-7)) - 1; -+ int var3 = MathHelper.floor((double) (var1.maxX + 1.0E-7)) + 1; -+ int var4 = MathHelper.floor((double) (var1.minY - 1.0E-7)) - 1; -+ int var5 = MathHelper.floor((double) (var1.maxY + 1.0E-7)) + 1; -+ int var6 = MathHelper.floor((double) (var1.minZ - 1.0E-7)) - 1; -+ int var7 = MathHelper.floor((double) (var1.maxZ + 1.0E-7)) + 1; -+ final VoxelShapeCollision var8 = var0 == null ? VoxelShapeCollision.a() : VoxelShapeCollision.a((Entity) var0); -+ final CursorPosition var9 = new CursorPosition(var2, var4, var6, var3, var5, var7); -+ final BlockPosition.MutableBlockPosition var10 = new BlockPosition.MutableBlockPosition(); -+ final VoxelShape var11 = VoxelShapes.a((AxisAlignedBB) var1); -+ return new Spliterators.AbstractSpliterator(Long.MAX_VALUE, 1280) { -+ boolean a; -+ { -+ -+ this.a = var0 == null; -+ } -+ -+ @Override -+ public boolean tryAdvance(Consumer var02) { -+ int var2; -+ int var3; -+ if (!this.a) { -+ this.a = true; -+ VoxelShape var1 = collisionAccess.getWorldBorder().a(); -+ var2 = VoxelShapes.c((VoxelShape) var1, -+ (VoxelShape) VoxelShapes.a((AxisAlignedBB) var0.getBoundingBox().shrink(1.0E-7)), -+ (OperatorBoolean) OperatorBoolean.AND) ? 1 : 0; -+ var3 = VoxelShapes.c((VoxelShape) var1, -+ (VoxelShape) VoxelShapes.a((AxisAlignedBB) var0.getBoundingBox().g(1.0E-7)), -+ (OperatorBoolean) OperatorBoolean.AND) ? 1 : 0; -+ if (var2 == 0 && var3 != 0) { -+ var02.accept((VoxelShape) var1); -+ return true; -+ } -+ } -+ while (var9.a()) { -+ IBlockAccess var7; -+ int var6; -+ int var5; -+ VoxelShape var92; -+ VoxelShape var102; -+ int var1 = var9.b(); -+ var2 = var9.c(); -+ var3 = var9.d(); -+ int var4 = var9.e(); -+ if (var4 == 3 || (var7 = collisionAccess.c(var5 = var1 >> 4, var6 = var3 >> 4)) == null) -+ continue; -+ var10.d(var1, var2, var3); -+ IBlockData var82 = var7.getType((BlockPosition) var10); -+ if (var4 == 1 && !var82.f() || var4 == 2 && var82.getBlock() != Blocks.MOVING_PISTON -+ || !VoxelShapes.c((VoxelShape) var11, -+ (VoxelShape) (var102 = (var92 = var82.b((IBlockAccess) collisionAccess, -+ (BlockPosition) var10, var8)).a((double) var1, (double) var2, -+ (double) var3)), -+ (OperatorBoolean) OperatorBoolean.AND)) -+ continue; -+ var02.accept((VoxelShape) var102); -+ return true; -+ } -+ return false; -+ } -+ }; -+ } -+ -+ public static class SpliteratorAccumulator { -+ private final List a = Lists.newArrayList(); -+ private final Spliterator b; -+ -+ public SpliteratorAccumulator(Spliterator var0) { -+ this.b = var0; -+ } -+ -+ public Spliterators.AbstractSpliterator a() { -+ return new Spliterators.AbstractSpliterator(Long.MAX_VALUE, 0) { -+ private int b; -+ -+ @Override -+ public boolean tryAdvance(Consumer var0) { -+ while (this.b >= SpliteratorAccumulator.this.a.size()) { -+ if (SpliteratorAccumulator.this.b.tryAdvance(SpliteratorAccumulator.this.a::add)) -+ continue; -+ return false; -+ } -+ var0.accept(SpliteratorAccumulator.this.a.get(this.b++)); -+ return true; -+ } -+ }; -+ } -+ -+ } -+ -+} -diff --git a/src/main/java/net/minecraft/server/Block.java b/src/main/java/net/minecraft/server/Block.java -index 66244a9d0..7b3a71e33 100644 ---- a/src/main/java/net/minecraft/server/Block.java -+++ b/src/main/java/net/minecraft/server/Block.java -@@ -100,7 +100,7 @@ public class Block implements IMaterial { - - while (iterator.hasNext()) { - Entity entity = (Entity) iterator.next(); -- double d0 = VoxelShapes.a(EnumDirection.EnumAxis.Y, entity.getBoundingBox().d(0.0D, 1.0D, 0.0D), Stream.of(voxelshape), -1.0D); -+ double d0 = VoxelShapes.a(EnumDirection.EnumAxis.Y, entity.getBoundingBox().d(0.0D, 1.0D, 0.0D), voxelshape, -1.0D); // YAPFA - - entity.enderTeleportTo(entity.locX(), entity.locY() + 1.0D + d0, entity.locZ()); - } -diff --git a/src/main/java/net/minecraft/server/BlockPosition.java b/src/main/java/net/minecraft/server/BlockPosition.java -index 4c64798fb..c429470cd 100644 ---- a/src/main/java/net/minecraft/server/BlockPosition.java -+++ b/src/main/java/net/minecraft/server/BlockPosition.java -@@ -72,7 +72,7 @@ public class BlockPosition extends BaseBlockPosition implements MinecraftSeriali - - @Override - public T a(DynamicOps dynamicops) { -- return dynamicops.createIntList(IntStream.of(new int[]{this.getX(), this.getY(), this.getZ()})); -+ return (T) new NBTTagIntArray(new int[]{this.getX(), this.getY(), this.getZ()}); // YAPFA - } - - public static long getAdjacent(int baseX, int baseY, int baseZ, EnumDirection enumdirection) { return asLong(baseX + enumdirection.getAdjacentX(), baseY + enumdirection.getAdjacentY(), baseZ + enumdirection.getAdjacentZ()); } // Paper -diff --git a/src/main/java/net/minecraft/server/CraftingManager.java b/src/main/java/net/minecraft/server/CraftingManager.java -index f0d7a91fa..15e2439d6 100644 ---- a/src/main/java/net/minecraft/server/CraftingManager.java -+++ b/src/main/java/net/minecraft/server/CraftingManager.java -@@ -8,14 +8,18 @@ import com.google.gson.GsonBuilder; - import com.google.gson.JsonObject; - import com.google.gson.JsonParseException; - import com.google.gson.JsonSyntaxException; -+ -+import java.util.ArrayList; - import java.util.Collection; - import java.util.Collections; - import java.util.Comparator; -+import java.util.HashSet; - import java.util.Iterator; - import java.util.List; - import java.util.Map; - import java.util.Objects; - import java.util.Optional; -+import java.util.Set; - import java.util.Map.Entry; - import java.util.stream.Collectors; - import java.util.stream.Stream; -@@ -82,21 +86,31 @@ public class CraftingManager extends ResourceDataJson { - // CraftBukkit end - - public > Optional craft(Recipes recipes, C c0, World world) { -- // CraftBukkit start -- Optional recipe = this.a(recipes).values().stream().flatMap((irecipe) -> { -- return SystemUtils.a(recipes.a(irecipe, world, c0)); -- }).findFirst(); -- c0.setCurrentRecipe(recipe.orElse(null)); // CraftBukkit - Clear recipe when no recipe is found -- // CraftBukkit end -- return recipe; -+ // YAPFA start -+ for(IRecipe rep : this.a(recipes).values()) { -+ Optional optional = recipes.a(rep, world, c0); -+ if(optional.isPresent()) { -+ c0.setCurrentRecipe(optional.get()); -+ return optional; -+ } -+ } -+ c0.setCurrentRecipe(null); // CraftBukkit - Clear recipe when no recipe is found -+ return Optional.empty(); -+ // YAPFA end - } - - public > List b(Recipes recipes, C c0, World world) { -- return (List) this.a(recipes).values().stream().flatMap((irecipe) -> { -- return SystemUtils.a(recipes.a(irecipe, world, c0)); -- }).sorted(Comparator.comparing((irecipe) -> { -+ // YAPFA start -+ List list = new ArrayList(); -+ for(IRecipe rec : this.a(recipes).values()) { -+ Optional optional = recipes.a(rec, world, c0); -+ optional.ifPresent(list::add); -+ } -+ list.sort(Comparator.comparing((irecipe) -> { - return irecipe.getResult().j(); -- })).collect(Collectors.toList()); -+ })); -+ return list; -+ // YAPFA end - } - - private > Map> a(Recipes recipes) { -@@ -120,15 +134,25 @@ public class CraftingManager extends ResourceDataJson { - } - - public Optional> a(MinecraftKey minecraftkey) { -- return this.recipes.values().stream().map((map) -> { -- return map.get(minecraftkey); // CraftBukkit - decompile error -- }).filter(Objects::nonNull).findFirst(); -+ // YAPFA start -+ for(Object2ObjectLinkedOpenHashMap> map : this.recipes.values()) { -+ IRecipe rec = map.get(minecraftkey); -+ if(rec != null) { -+ return Optional.of(rec); -+ } -+ } -+ return Optional.empty(); -+ // YAPFA end - } - - public Collection> b() { -- return (Collection) this.recipes.values().stream().flatMap((map) -> { -- return map.values().stream(); -- }).collect(Collectors.toSet()); -+ // YAPFA start -+ Set> recipes = new HashSet>(); -+ for(Object2ObjectLinkedOpenHashMap> map : this.recipes.values()) { -+ recipes.addAll(map.values()); -+ } -+ return recipes; -+ // YAPFA end - } - - public Stream c() { -diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java -index 2e3329bd2..902c98cf8 100644 ---- a/src/main/java/net/minecraft/server/Entity.java -+++ b/src/main/java/net/minecraft/server/Entity.java -@@ -13,6 +13,7 @@ import java.util.Locale; - import java.util.Optional; - import java.util.Random; - import java.util.Set; -+import java.util.Spliterators.AbstractSpliterator; - import java.util.UUID; - import java.util.concurrent.atomic.AtomicInteger; - import java.util.stream.Stream; -@@ -1030,31 +1031,60 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke - private Vec3D e(Vec3D vec3d) { - AxisAlignedBB axisalignedbb = this.getBoundingBox(); - VoxelShapeCollision voxelshapecollision = VoxelShapeCollision.a(this); -- -- Stream stream = !this.world.getWorldBorder().isInBounds(axisalignedbb) ? Stream.empty() : Stream.of(this.world.getWorldBorder().a()); // Tuinity - optimise voxelshapes -- Stream stream1 = de.tr7zw.yapfa.YapfaConfig.disableEntityCollisionboxes ? Stream.empty() : this.world.b(this, axisalignedbb.a(vec3d), (Set) ImmutableSet.of()); // YAPFA -- StreamAccumulator streamaccumulator = new StreamAccumulator<>(Stream.concat(stream1, stream)); -- Vec3D vec3d1 = vec3d.g() == 0.0D ? vec3d : a(this, vec3d, axisalignedbb, this.world, voxelshapecollision, streamaccumulator); -+ VoxelShape worldBorder = this.world.getWorldBorder().a(); -+ // YAPFA start -+ Vec3D vec3d1; -+ StreamAccumulator streamaccumulator = new StreamAccumulator<>(Stream.concat(Stream.empty(), Stream.empty())); -+ //boolean useVoxelShape = false; -+ if(de.tr7zw.yapfa.YapfaConfig.disableEntityCollisionboxes) { -+ //useVoxelShape = VoxelShapes.c(worldBorder, VoxelShapes.a(axisalignedbb.shrink(1.0E-7D)), OperatorBoolean.AND); -+ vec3d1 = vec3d.g() == 0.0D ? vec3d : aNonStream(this, vec3d, axisalignedbb, this.world, voxelshapecollision, worldBorder); -+ } else { -+ Stream stream = !this.world.getWorldBorder().isInBounds(axisalignedbb) ? Stream.empty() : Stream.of(this.world.getWorldBorder().a()); // Tuinity - optimise voxelshapes -+ Stream stream1 = de.tr7zw.yapfa.YapfaConfig.disableEntityCollisionboxes ? Stream.empty() : this.world.b(this, axisalignedbb.a(vec3d), (Set) ImmutableSet.of()); // YAPFA -+ streamaccumulator = new StreamAccumulator<>(Stream.concat(stream1, stream)); -+ vec3d1 = vec3d.g() == 0.0D ? vec3d : a(this, vec3d, axisalignedbb, this.world, voxelshapecollision, streamaccumulator); -+ } - boolean flag = vec3d.x != vec3d1.x; - boolean flag1 = vec3d.y != vec3d1.y; - boolean flag2 = vec3d.z != vec3d1.z; - boolean flag3 = this.onGround || flag1 && vec3d.y < 0.0D; - - if (this.H > 0.0F && flag3 && (flag || flag2)) { -- Vec3D vec3d2 = a(this, new Vec3D(vec3d.x, (double) this.H, vec3d.z), axisalignedbb, this.world, voxelshapecollision, streamaccumulator); -- Vec3D vec3d3 = a(this, new Vec3D(0.0D, (double) this.H, 0.0D), axisalignedbb.b(vec3d.x, 0.0D, vec3d.z), this.world, voxelshapecollision, streamaccumulator); -+ if(de.tr7zw.yapfa.YapfaConfig.disableEntityCollisionboxes) { - -- if (vec3d3.y < (double) this.H) { -- Vec3D vec3d4 = a(this, new Vec3D(vec3d.x, 0.0D, vec3d.z), axisalignedbb.b(vec3d3), this.world, voxelshapecollision, streamaccumulator).e(vec3d3); -+ Vec3D vec3d2 = aNonStream(this, new Vec3D(vec3d.x, (double) this.H, vec3d.z), axisalignedbb, this.world, voxelshapecollision, worldBorder); -+ Vec3D vec3d3 = aNonStream(this, new Vec3D(0.0D, (double) this.H, 0.0D), axisalignedbb.b(vec3d.x, 0.0D, vec3d.z), this.world, voxelshapecollision, worldBorder); -+ -+ if (vec3d3.y < (double) this.H) { -+ Vec3D vec3d4 = aNonStream(this, new Vec3D(vec3d.x, 0.0D, vec3d.z), axisalignedbb.b(vec3d3), this.world, voxelshapecollision, worldBorder).e(vec3d3); -+ -+ if (b(vec3d4) > b(vec3d2)) { -+ vec3d2 = vec3d4; -+ } -+ } - -- if (b(vec3d4) > b(vec3d2)) { -- vec3d2 = vec3d4; -+ if (b(vec3d2) > b(vec3d1)) { -+ return vec3d2.e(aNonStream(this, new Vec3D(0.0D, -vec3d2.y + vec3d.y, 0.0D), axisalignedbb.b(vec3d2), this.world, voxelshapecollision, worldBorder)); - } -- } -+ } else { -+ Vec3D vec3d2 = a(this, new Vec3D(vec3d.x, (double) this.H, vec3d.z), axisalignedbb, this.world, voxelshapecollision, streamaccumulator); -+ Vec3D vec3d3 = a(this, new Vec3D(0.0D, (double) this.H, 0.0D), axisalignedbb.b(vec3d.x, 0.0D, vec3d.z), this.world, voxelshapecollision, streamaccumulator); - -- if (b(vec3d2) > b(vec3d1)) { -- return vec3d2.e(a(this, new Vec3D(0.0D, -vec3d2.y + vec3d.y, 0.0D), axisalignedbb.b(vec3d2), this.world, voxelshapecollision, streamaccumulator)); -- } -+ if (vec3d3.y < (double) this.H) { -+ Vec3D vec3d4 = a(this, new Vec3D(vec3d.x, 0.0D, vec3d.z), axisalignedbb.b(vec3d3), this.world, voxelshapecollision, streamaccumulator).e(vec3d3); -+ -+ if (b(vec3d4) > b(vec3d2)) { -+ vec3d2 = vec3d4; -+ } -+ } -+ -+ if (b(vec3d2) > b(vec3d1)) { -+ return vec3d2.e(a(this, new Vec3D(0.0D, -vec3d2.y + vec3d.y, 0.0D), axisalignedbb.b(vec3d2), this.world, voxelshapecollision, streamaccumulator)); -+ } -+ } -+ // YAPFA end -+ - } - - return vec3d1; -@@ -1078,6 +1108,91 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke - return a(vec3d, axisalignedbb, world, voxelshapecollision, streamaccumulator); - } - } -+ -+ // YAPFA start -+ public static Vec3D aNonStream(@Nullable Entity entity, Vec3D vec3d, AxisAlignedBB axisalignedbb, World world, VoxelShapeCollision voxelshapecollision, VoxelShape worldBorder) { -+ boolean flag = vec3d.x == 0.0D; -+ boolean flag1 = vec3d.y == 0.0D; -+ boolean flag2 = vec3d.z == 0.0D; -+ -+ if ((!flag || !flag1) && (!flag || !flag2) && (!flag1 || !flag2)) { -+ return a(vec3d, axisalignedbb, de.tr7zw.yapfa.collision.CollisionHelper.b(world, worldBorder, entity, axisalignedbb.a(vec3d))); -+ } else { -+ return a(vec3d, axisalignedbb, world, voxelshapecollision, worldBorder); -+ } -+ } -+ -+ public static Vec3D a(Vec3D vec3d, AxisAlignedBB axisalignedbb, AbstractSpliterator split) { -+ double d0 = vec3d.x; -+ double d1 = vec3d.y; -+ double d2 = vec3d.z; -+ de.tr7zw.yapfa.collision.CollisionHelper.SpliteratorAccumulator acc = new de.tr7zw.yapfa.collision.CollisionHelper.SpliteratorAccumulator(split); -+ if (d1 != 0.0D) { -+ d1 = VoxelShapes.a(EnumDirection.EnumAxis.Y, axisalignedbb, acc.a(), d1); -+ if (d1 != 0.0D) { -+ axisalignedbb = axisalignedbb.d(0.0D, d1, 0.0D); -+ } -+ } -+ -+ boolean flag = Math.abs(d0) < Math.abs(d2); -+ -+ if (flag && d2 != 0.0D) { -+ d2 = VoxelShapes.a(EnumDirection.EnumAxis.Z, axisalignedbb, acc.a(), d2); -+ if (d2 != 0.0D) { -+ axisalignedbb = axisalignedbb.d(0.0D, 0.0D, d2); -+ } -+ } -+ -+ if (d0 != 0.0D) { -+ d0 = VoxelShapes.a(EnumDirection.EnumAxis.X, axisalignedbb, acc.a(), d0); -+ if (!flag && d0 != 0.0D) { -+ axisalignedbb = axisalignedbb.d(d0, 0.0D, 0.0D); -+ } -+ } -+ -+ if (!flag && d2 != 0.0D) { -+ d2 = VoxelShapes.a(EnumDirection.EnumAxis.Z, axisalignedbb, acc.a(), d2); -+ } -+ -+ return new Vec3D(d0, d1, d2); -+ } -+ -+ public static Vec3D a(Vec3D vec3d, AxisAlignedBB axisalignedbb, IWorldReader iworldreader, VoxelShapeCollision voxelshapecollision, VoxelShape voxelShape) { -+ double d0 = vec3d.x; -+ double d1 = vec3d.y; -+ double d2 = vec3d.z; -+ -+ if (d1 != 0.0D) { -+ d1 = VoxelShapes.a(EnumDirection.EnumAxis.Y, axisalignedbb, iworldreader, d1, voxelshapecollision, voxelShape); -+ if (d1 != 0.0D) { -+ axisalignedbb = axisalignedbb.d(0.0D, d1, 0.0D); -+ } -+ } -+ -+ boolean flag = Math.abs(d0) < Math.abs(d2); -+ -+ if (flag && d2 != 0.0D) { -+ d2 = VoxelShapes.a(EnumDirection.EnumAxis.Z, axisalignedbb, iworldreader, d2, voxelshapecollision, voxelShape); -+ if (d2 != 0.0D) { -+ axisalignedbb = axisalignedbb.d(0.0D, 0.0D, d2); -+ } -+ } -+ -+ if (d0 != 0.0D) { -+ d0 = VoxelShapes.a(EnumDirection.EnumAxis.X, axisalignedbb, iworldreader, d0, voxelshapecollision, voxelShape); -+ if (!flag && d0 != 0.0D) { -+ axisalignedbb = axisalignedbb.d(d0, 0.0D, 0.0D); -+ } -+ } -+ -+ if (!flag && d2 != 0.0D) { -+ d2 = VoxelShapes.a(EnumDirection.EnumAxis.Z, axisalignedbb, iworldreader, d2, voxelshapecollision, voxelShape); -+ } -+ -+ return new Vec3D(d0, d1, d2); -+ } -+ -+ // YAPFA end - - public static Vec3D a(Vec3D vec3d, AxisAlignedBB axisalignedbb, StreamAccumulator streamaccumulator) { - double d0 = vec3d.x; -diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java -index b77960710..65685734d 100644 ---- a/src/main/java/net/minecraft/server/EntityLiving.java -+++ b/src/main/java/net/minecraft/server/EntityLiving.java -@@ -2662,6 +2662,7 @@ public abstract class EntityLiving extends Entity { - this.a(axisalignedbb, this.getBoundingBox()); - } - -+ if(!de.tr7zw.yapfa.YapfaConfig.disableEntityCollisions) // YAPFA - this.collideNearby(); - this.world.getMethodProfiler().exit(); - } -diff --git a/src/main/java/net/minecraft/server/VoxelShapes.java b/src/main/java/net/minecraft/server/VoxelShapes.java -index 5e24ce485..d651ed5fb 100644 ---- a/src/main/java/net/minecraft/server/VoxelShapes.java -+++ b/src/main/java/net/minecraft/server/VoxelShapes.java -@@ -5,9 +5,12 @@ import com.google.common.math.DoubleMath; - import com.google.common.math.IntMath; - import it.unimi.dsi.fastutil.doubles.DoubleArrayList; - import it.unimi.dsi.fastutil.doubles.DoubleList; -+ - import java.util.Arrays; - import java.util.Iterator; - import java.util.Objects; -+import java.util.Spliterators; -+import java.util.Spliterators.AbstractSpliterator; - import java.util.stream.Stream; - - public final class VoxelShapes { -@@ -256,6 +259,106 @@ public final class VoxelShapes { - - return d0; - } -+ -+ // YAPFA start -+ -+ public static double a(EnumDirection.EnumAxis enumdirection_enumaxis, AxisAlignedBB axisalignedbb, VoxelShape voxel, double d0) { -+ d0 = voxel.a(enumdirection_enumaxis, axisalignedbb, d0); -+ if (Math.abs(d0) < 1.0E-7D) { -+ return 0.0D; -+ } -+ -+ return d0; -+ } -+ -+ public static double a(EnumDirection.EnumAxis enumdirection_enumaxis, AxisAlignedBB axisalignedbb, AbstractSpliterator stream, double d0) { -+ for (Iterator iterator = Spliterators.iterator(stream); iterator.hasNext(); d0 = ((VoxelShape) iterator.next()).a(enumdirection_enumaxis, axisalignedbb, d0)) { -+ if (Math.abs(d0) < 1.0E-7D) { -+ return 0.0D; -+ } -+ } -+ -+ return d0; -+ } -+ -+ public static double a(EnumDirection.EnumAxis enumdirection_enumaxis, AxisAlignedBB axisalignedbb, IWorldReader iworldreader, double d0, VoxelShapeCollision voxelshapecollision, VoxelShape voxel) { -+ return a(axisalignedbb, iworldreader, d0, voxelshapecollision, EnumAxisCycle.a(enumdirection_enumaxis, EnumDirection.EnumAxis.Z), voxel); -+ } -+ -+ private static double a(AxisAlignedBB axisalignedbb, IWorldReader iworldreader, double d0, VoxelShapeCollision voxelshapecollision, EnumAxisCycle enumaxiscycle, VoxelShape voxelshape) { -+ if (axisalignedbb.b() >= 1.0E-6D && axisalignedbb.c() >= 1.0E-6D && axisalignedbb.d() >= 1.0E-6D) { -+ if (Math.abs(d0) < 1.0E-7D) { -+ return 0.0D; -+ } else { -+ EnumAxisCycle enumaxiscycle1 = enumaxiscycle.a(); -+ EnumDirection.EnumAxis enumdirection_enumaxis = enumaxiscycle1.a(EnumDirection.EnumAxis.X); -+ EnumDirection.EnumAxis enumdirection_enumaxis1 = enumaxiscycle1.a(EnumDirection.EnumAxis.Y); -+ EnumDirection.EnumAxis enumdirection_enumaxis2 = enumaxiscycle1.a(EnumDirection.EnumAxis.Z); -+ BlockPosition.MutableBlockPosition blockposition_mutableblockposition = new BlockPosition.MutableBlockPosition(); -+ int i = MathHelper.floor(axisalignedbb.a(enumdirection_enumaxis) - 1.0E-7D) - 1; -+ int j = MathHelper.floor(axisalignedbb.b(enumdirection_enumaxis) + 1.0E-7D) + 1; -+ int k = MathHelper.floor(axisalignedbb.a(enumdirection_enumaxis1) - 1.0E-7D) - 1; -+ int l = MathHelper.floor(axisalignedbb.b(enumdirection_enumaxis1) + 1.0E-7D) + 1; -+ double d1 = axisalignedbb.a(enumdirection_enumaxis2) - 1.0E-7D; -+ double d2 = axisalignedbb.b(enumdirection_enumaxis2) + 1.0E-7D; -+ boolean flag = d0 > 0.0D; -+ int i1 = flag ? MathHelper.floor(axisalignedbb.b(enumdirection_enumaxis2) - 1.0E-7D) - 1 : MathHelper.floor(axisalignedbb.a(enumdirection_enumaxis2) + 1.0E-7D) + 1; -+ int j1 = a(d0, d1, d2); -+ int k1 = flag ? 1 : -1; -+ int l1 = i1; -+ -+ while (true) { -+ if (flag) { -+ if (l1 > j1) { -+ break; -+ } -+ } else if (l1 < j1) { -+ break; -+ } -+ -+ for (int i2 = i; i2 <= j; ++i2) { -+ for (int j2 = k; j2 <= l; ++j2) { -+ int k2 = 0; -+ -+ if (i2 == i || i2 == j) { -+ ++k2; -+ } -+ -+ if (j2 == k || j2 == l) { -+ ++k2; -+ } -+ -+ if (l1 == i1 || l1 == j1) { -+ ++k2; -+ } -+ -+ if (k2 < 3) { -+ blockposition_mutableblockposition.a(enumaxiscycle1, i2, j2, l1); -+ IBlockData iblockdata = iworldreader.getType(blockposition_mutableblockposition); -+ -+ if ((k2 != 1 || iblockdata.f()) && (k2 != 2 || iblockdata.getBlock() == Blocks.MOVING_PISTON)) { -+ d0 = iblockdata.b((IBlockAccess) iworldreader, blockposition_mutableblockposition, voxelshapecollision).a(enumdirection_enumaxis2, axisalignedbb.d((double) (-blockposition_mutableblockposition.getX()), (double) (-blockposition_mutableblockposition.getY()), (double) (-blockposition_mutableblockposition.getZ())), d0); -+ if (Math.abs(d0) < 1.0E-7D) { -+ return 0.0D; -+ } -+ -+ j1 = a(d0, d1, d2); -+ } -+ } -+ } -+ } -+ -+ l1 += k1; -+ } -+ -+ return voxelshape.a(enumdirection_enumaxis2, axisalignedbb, d0); -+ } -+ } else { -+ return d0; -+ } -+ } -+ -+ // YAPFA end - - public static double a(EnumDirection.EnumAxis enumdirection_enumaxis, AxisAlignedBB axisalignedbb, IWorldReader iworldreader, double d0, VoxelShapeCollision voxelshapecollision, Stream stream) { - return a(axisalignedbb, iworldreader, d0, voxelshapecollision, EnumAxisCycle.a(enumdirection_enumaxis, EnumDirection.EnumAxis.Z), stream); --- -2.25.1.windows.1 - diff --git a/patches/server-old/0036-Add-option-for-only-players-to-have-collisions-with-.patch b/patches/server-old/0036-Add-option-for-only-players-to-have-collisions-with-.patch deleted file mode 100644 index 2c9a447d..00000000 --- a/patches/server-old/0036-Add-option-for-only-players-to-have-collisions-with-.patch +++ /dev/null @@ -1,111 +0,0 @@ -From cbc381e8a8b5dab8c94757bfd8ff84c83d47223e Mon Sep 17 00:00:00 2001 -From: tr7zw -Date: Mon, 23 Mar 2020 23:11:10 +0100 -Subject: [PATCH] Add option for only players to have collisions with Entities - ---- - src/main/java/de/tr7zw/yapfa/YapfaConfig.java | 6 ++ - .../net/minecraft/server/EntityLiving.java | 68 ++++++++++--------- - 2 files changed, 43 insertions(+), 31 deletions(-) - -diff --git a/src/main/java/de/tr7zw/yapfa/YapfaConfig.java b/src/main/java/de/tr7zw/yapfa/YapfaConfig.java -index 9711cbc52..655c4e68f 100644 ---- a/src/main/java/de/tr7zw/yapfa/YapfaConfig.java -+++ b/src/main/java/de/tr7zw/yapfa/YapfaConfig.java -@@ -216,4 +216,10 @@ public class YapfaConfig { - disableEntityCollisionboxes = getBoolean("settings.disableEntityCollisionboxes", false); - } - -+ public static boolean onlyPlayerCollisions = false; -+ private static void onlyPlayerCollisions() { -+ onlyPlayerCollisions = getBoolean("settings.onlyPlayerCollisions", false); -+ } -+ -+ - } -\ No newline at end of file -diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java -index 65685734d..7a01daa57 100644 ---- a/src/main/java/net/minecraft/server/EntityLiving.java -+++ b/src/main/java/net/minecraft/server/EntityLiving.java -@@ -2702,40 +2702,46 @@ public abstract class EntityLiving extends Entity { - if (i <= 0 && world.paperConfig.maxCollisionsPerEntity <= 0) { - return; - } -- // Paper - end don't run getEntities if we're not going to use its result -+ // Tuinity - end don't run getEntities if we're not going to use its result -+ // YAPFA start - // Tuinity start - reduce memory allocation from collideNearby - List list = com.tuinity.tuinity.util.CachedLists.getTempGetEntitiesList(); -- this.world.getEntities(this, this.getBoundingBox(), IEntitySelector.a(this), list); - try { -- // Tuinity end - reduce memory allocation from collideNearby -- -- if (!list.isEmpty()) { -- // Paper - move up -- int j; -- -- if (i > 0 && list.size() > i - 1 && this.random.nextInt(4) == 0) { -- j = 0; -- -- for (int k = 0; k < list.size(); ++k) { -- if (!((Entity) list.get(k)).isPassenger()) { -- ++j; -- } -- } -- -- if (j > i - 1) { -- this.damageEntity(DamageSource.CRAMMING, 6.0F); -- } -- } -- -- numCollisions = Math.max(0, numCollisions - world.paperConfig.maxCollisionsPerEntity); // Paper -- for (j = 0; j < list.size() && numCollisions < world.paperConfig.maxCollisionsPerEntity; ++j) { // Paper -- Entity entity = (Entity) list.get(j); -- entity.numCollisions++; // Paper -- numCollisions++; // Paper -- -- this.C(entity); -- } -- } -+ if(de.tr7zw.yapfa.YapfaConfig.onlyPlayerCollisions) { -+ this.world.getEntities(this, this.getBoundingBox(), entity -> entity.getEntityType() == EntityTypes.PLAYER, list); -+ } else { -+ this.world.getEntities(this, this.getBoundingBox(), IEntitySelector.a(this), list); -+ } -+ // Tuinity end - reduce memory allocation from collideNearby -+ // YAPFA end -+ -+ if (!list.isEmpty()) { -+ // Paper - move up -+ int j; -+ -+ if (i > 0 && list.size() > i - 1 && this.random.nextInt(4) == 0) { -+ j = 0; -+ -+ for (int k = 0; k < list.size(); ++k) { -+ if (!((Entity) list.get(k)).isPassenger()) { -+ ++j; -+ } -+ } -+ -+ if (j > i - 1) { -+ this.damageEntity(DamageSource.CRAMMING, 6.0F); -+ } -+ } -+ -+ numCollisions = Math.max(0, numCollisions - world.paperConfig.maxCollisionsPerEntity); // Paper -+ for (j = 0; j < list.size() && numCollisions < world.paperConfig.maxCollisionsPerEntity; ++j) { // Paper -+ Entity entity = (Entity) list.get(j); -+ entity.numCollisions++; // Paper -+ numCollisions++; // Paper -+ -+ this.C(entity); -+ } -+ } - } finally { // Tuinity start - reduce memory allocation from collideNearby - com.tuinity.tuinity.util.CachedLists.returnTempGetEntitiesList(list); - } // Tuinity end - reduce memory allocation from collideNearby --- -2.25.1.windows.1 - diff --git a/patches/server-old/0037-Allow-to-change-the-piston-push-limit.patch b/patches/server-old/0037-Allow-to-change-the-piston-push-limit.patch deleted file mode 100644 index ff6739e4..00000000 --- a/patches/server-old/0037-Allow-to-change-the-piston-push-limit.patch +++ /dev/null @@ -1,59 +0,0 @@ -From 63da5c960563a9e464659ce236f5f157e663fc49 Mon Sep 17 00:00:00 2001 -From: tr7zw -Date: Sun, 29 Mar 2020 00:35:03 +0100 -Subject: [PATCH] Allow to change the piston push limit - ---- - src/main/java/de/tr7zw/yapfa/YapfaConfig.java | 4 ++++ - .../java/net/minecraft/server/PistonExtendsChecker.java | 6 +++--- - 2 files changed, 7 insertions(+), 3 deletions(-) - -diff --git a/src/main/java/de/tr7zw/yapfa/YapfaConfig.java b/src/main/java/de/tr7zw/yapfa/YapfaConfig.java -index 655c4e68f..29587589c 100644 ---- a/src/main/java/de/tr7zw/yapfa/YapfaConfig.java -+++ b/src/main/java/de/tr7zw/yapfa/YapfaConfig.java -@@ -221,5 +221,9 @@ public class YapfaConfig { - onlyPlayerCollisions = getBoolean("settings.onlyPlayerCollisions", false); - } - -+ public static int pistonPushLimit = 12; -+ private static void pistonPushLimit() { -+ pistonPushLimit = getInt("settings.pistonPushLimit", 12); -+ } - - } -\ No newline at end of file -diff --git a/src/main/java/net/minecraft/server/PistonExtendsChecker.java b/src/main/java/net/minecraft/server/PistonExtendsChecker.java -index 8ac7d30be..de1c98cca 100644 ---- a/src/main/java/net/minecraft/server/PistonExtendsChecker.java -+++ b/src/main/java/net/minecraft/server/PistonExtendsChecker.java -@@ -79,7 +79,7 @@ public class PistonExtendsChecker { - } else { - int i = 1; - -- if (i + this.f.size() > 12) { -+ if (i + this.f.size() > de.tr7zw.yapfa.YapfaConfig.pistonPushLimit) { // YAPFA - return false; - } else { - while (a(block)) { -@@ -93,7 +93,7 @@ public class PistonExtendsChecker { - } - - ++i; -- if (i + this.f.size() > 12) { -+ if (i + this.f.size() > de.tr7zw.yapfa.YapfaConfig.pistonPushLimit) { // YAPFA - return false; - } - } -@@ -141,7 +141,7 @@ public class PistonExtendsChecker { - return true; - } - -- if (this.f.size() >= 12) { -+ if (this.f.size() >= de.tr7zw.yapfa.YapfaConfig.pistonPushLimit) { // YAPFA - return false; - } - --- -2.25.1.windows.1 - diff --git a/patches/server-old/0038-Add-NBT-API-as-first-class-lib.patch b/patches/server-old/0038-Add-NBT-API-as-first-class-lib.patch deleted file mode 100644 index 9b34e697..00000000 --- a/patches/server-old/0038-Add-NBT-API-as-first-class-lib.patch +++ /dev/null @@ -1,27 +0,0 @@ -From c0898b6a58fe806a40f9f49fdb2bc618514297c8 Mon Sep 17 00:00:00 2001 -From: tr7zw -Date: Thu, 2 Apr 2020 18:49:38 +0200 -Subject: [PATCH] Add NBT-API as first-class lib - ---- - pom.xml | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/pom.xml b/pom.xml -index e58fddead..5a4c6fe4f 100644 ---- a/pom.xml -+++ b/pom.xml -@@ -306,6 +306,10 @@ - net.minecraft.server - net.minecraft.server.v${minecraft_version} - -+ -+ de.tr7zw.changeme.nbtapi -+ de.tr7zw.nbtapi -+ - - - --- -2.25.1.windows.1 - diff --git a/patches/server-old/0039-Player-saving-async-FileIO.patch b/patches/server-old/0039-Player-saving-async-FileIO.patch deleted file mode 100644 index 9e03f06e..00000000 --- a/patches/server-old/0039-Player-saving-async-FileIO.patch +++ /dev/null @@ -1,370 +0,0 @@ -From 5c1c7417e29d6e8542938e04f83483c0a5c483ae Mon Sep 17 00:00:00 2001 -From: tr7zw -Date: Sat, 4 Apr 2020 23:23:04 +0200 -Subject: [PATCH] Player saving async FileIO - ---- - .../server/AdvancementDataPlayer.java | 106 ++++++++++-------- - .../net/minecraft/server/EntityHuman.java | 16 ++- - .../java/net/minecraft/server/PlayerList.java | 28 ++++- - .../server/ServerStatisticManager.java | 20 +++- - .../net/minecraft/server/WorldNBTStorage.java | 33 ++++-- - 5 files changed, 139 insertions(+), 64 deletions(-) - -diff --git a/src/main/java/net/minecraft/server/AdvancementDataPlayer.java b/src/main/java/net/minecraft/server/AdvancementDataPlayer.java -index c41e13847..cd1c8eb71 100644 ---- a/src/main/java/net/minecraft/server/AdvancementDataPlayer.java -+++ b/src/main/java/net/minecraft/server/AdvancementDataPlayer.java -@@ -26,6 +26,8 @@ import java.util.List; - import java.util.Map; - import java.util.Set; - import java.util.Map.Entry; -+import java.util.concurrent.ExecutorService; -+import java.util.concurrent.Executors; - import java.util.stream.Collectors; - import java.util.stream.Stream; - import javax.annotation.Nullable; -@@ -48,6 +50,7 @@ public class AdvancementDataPlayer { - @Nullable - private Advancement k; - private boolean l = true; -+ public static ExecutorService saveThread = Executors.newSingleThreadExecutor(); // YAPFA - - public AdvancementDataPlayer(MinecraftServer minecraftserver, File file, EntityPlayer entityplayer) { - this.d = minecraftserver; -@@ -220,53 +223,66 @@ public class AdvancementDataPlayer { - - jsonelement.getAsJsonObject().addProperty("DataVersion", SharedConstants.getGameVersion().getWorldVersion()); - -+ // YAPFA start -+ String gson = null; - try { -- FileOutputStream fileoutputstream = new FileOutputStream(this.e); -- Throwable throwable = null; -- -- try { -- OutputStreamWriter outputstreamwriter = new OutputStreamWriter(fileoutputstream, Charsets.UTF_8.newEncoder()); -- Throwable throwable1 = null; -- -- try { -- AdvancementDataPlayer.b.toJson(jsonelement, outputstreamwriter); -- } catch (Throwable throwable2) { -- throwable1 = throwable2; -- throw throwable2; -- } finally { -- if (outputstreamwriter != null) { -- if (throwable1 != null) { -- try { -- outputstreamwriter.close(); -- } catch (Throwable throwable3) { -- throwable1.addSuppressed(throwable3); -- } -- } else { -- outputstreamwriter.close(); -- } -- } -- -- } -- } catch (Throwable throwable4) { -- throwable = throwable4; -- throw throwable4; -- } finally { -- if (fileoutputstream != null) { -- if (throwable != null) { -- try { -- fileoutputstream.close(); -- } catch (Throwable throwable5) { -- throwable.addSuppressed(throwable5); -- } -- } else { -- fileoutputstream.close(); -- } -- } -- -- } -- } catch (IOException ioexception) { -- AdvancementDataPlayer.LOGGER.error("Couldn't save player advancements to {}", this.e, ioexception); -+ gson = AdvancementDataPlayer.b.toJson(jsonelement); -+ } catch (Throwable throwable) { -+ throw throwable; -+ } -+ if(gson != null) { -+ final String fGson = gson; -+ saveThread.submit(() -> { -+ try { -+ FileOutputStream fileoutputstream = new FileOutputStream(this.e); -+ Throwable throwable = null; -+ -+ try { -+ OutputStreamWriter outputstreamwriter = new OutputStreamWriter(fileoutputstream, Charsets.UTF_8.newEncoder()); -+ Throwable throwable1 = null; -+ -+ try { -+ outputstreamwriter.write(fGson); -+ } catch (Throwable throwable2) { -+ throwable1 = throwable2; -+ throw throwable2; -+ } finally { -+ if (outputstreamwriter != null) { -+ if (throwable1 != null) { -+ try { -+ outputstreamwriter.close(); -+ } catch (Throwable throwable3) { -+ throwable1.addSuppressed(throwable3); -+ } -+ } else { -+ outputstreamwriter.close(); -+ } -+ } -+ -+ } -+ } catch (Throwable throwable4) { -+ throwable = throwable4; -+ throw throwable4; -+ } finally { -+ if (fileoutputstream != null) { -+ if (throwable != null) { -+ try { -+ fileoutputstream.close(); -+ } catch (Throwable throwable5) { -+ throwable.addSuppressed(throwable5); -+ } -+ } else { -+ fileoutputstream.close(); -+ } -+ } -+ -+ } -+ } catch (IOException ioexception) { -+ AdvancementDataPlayer.LOGGER.error("Couldn't save player advancements to {}", this.e, ioexception); -+ } -+ }); - } -+ // YAPFA end - - } - -diff --git a/src/main/java/net/minecraft/server/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java -index c1e8ff6ab..db4f62883 100644 ---- a/src/main/java/net/minecraft/server/EntityHuman.java -+++ b/src/main/java/net/minecraft/server/EntityHuman.java -@@ -733,11 +733,23 @@ public abstract class EntityHuman extends EntityLiving { - - } - -+ // YAPFA start -+ private NBTTagList inventorySnapshot = null; -+ private NBTTagList enderchestSnapshot = null; -+ -+ -+ public void takeInventorySnapshot() { -+ inventorySnapshot = this.inventory.a(new NBTTagList()); -+ enderchestSnapshot = this.enderChest.f(); -+ } -+ -+ // YAPFA end -+ - @Override - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setInt("DataVersion", SharedConstants.getGameVersion().getWorldVersion()); -- nbttagcompound.set("Inventory", this.inventory.a(new NBTTagList())); -+ nbttagcompound.set("Inventory", inventorySnapshot != null ? inventorySnapshot : this.inventory.a(new NBTTagList())); inventorySnapshot = null;// YAPFA - nbttagcompound.setInt("SelectedItemSlot", this.inventory.itemInHandIndex); - nbttagcompound.setShort("SleepTimer", (short) this.sleepTicks); - nbttagcompound.setFloat("XpP", this.exp); -@@ -754,7 +766,7 @@ public abstract class EntityHuman extends EntityLiving { - - this.foodData.b(nbttagcompound); - this.abilities.a(nbttagcompound); -- nbttagcompound.set("EnderItems", this.enderChest.f()); -+ nbttagcompound.set("EnderItems", enderchestSnapshot != null ? enderchestSnapshot : this.enderChest.f()); enderchestSnapshot = null;// YAPFA - if (!this.getShoulderEntityLeft().isEmpty()) { - nbttagcompound.set("ShoulderEntityLeft", this.getShoulderEntityLeft()); - } -diff --git a/src/main/java/net/minecraft/server/PlayerList.java b/src/main/java/net/minecraft/server/PlayerList.java -index 5b634f238..1ae0c15c4 100644 ---- a/src/main/java/net/minecraft/server/PlayerList.java -+++ b/src/main/java/net/minecraft/server/PlayerList.java -@@ -17,6 +17,8 @@ import java.util.Optional; - import java.util.Set; - import java.util.UUID; - import java.util.concurrent.CompletableFuture; -+import java.util.concurrent.TimeUnit; -+ - import javax.annotation.Nullable; - import org.apache.logging.log4j.LogManager; - import org.apache.logging.log4j.Logger; -@@ -1210,6 +1212,28 @@ public abstract class PlayerList { - if (team != null) scoreboard.removeTeam(team); - } - // Paper end -+ -+ // YAPFA start - make sure all saves are done -+ try { -+ ((WorldNBTStorage)playerFileData).saveThread.shutdown(); -+ boolean done = ((WorldNBTStorage)playerFileData).saveThread.awaitTermination(60, TimeUnit.SECONDS); -+ if(!done) { -+ LOGGER.error("Players did not save completly!"); -+ } -+ ServerStatisticManager.saveThread.shutdown(); -+ done = ServerStatisticManager.saveThread.awaitTermination(60, TimeUnit.SECONDS); -+ if(!done) { -+ LOGGER.error("Stats did not save completly!"); -+ } -+ AdvancementDataPlayer.saveThread.shutdown(); -+ done = AdvancementDataPlayer.saveThread.awaitTermination(60, TimeUnit.SECONDS); -+ if(!done) { -+ LOGGER.error("Advancements did not save completly!"); -+ } -+ } catch (InterruptedException e) { -+ e.printStackTrace(); -+ } -+ // YAPFA end - } - // Paper end - -@@ -1249,13 +1273,13 @@ public abstract class PlayerList { - File file = new File(this.server.getWorldServer(DimensionManager.OVERWORLD).getDataManager().getDirectory(), "stats"); - File file1 = new File(file, uuid + ".json"); - -- if (!file1.exists()) { -+ /*if (!file1.exists()) { // YAPFA dont check for old stats files with sync File IO - File file2 = new File(file, displayName + ".json"); // CraftBukkit - - if (file2.exists() && file2.isFile()) { - file2.renameTo(file1); - } -- } -+ }*/ - - serverstatisticmanager = new ServerStatisticManager(this.server, file1); - // this.o.put(uuid, serverstatisticmanager); // CraftBukkit -diff --git a/src/main/java/net/minecraft/server/ServerStatisticManager.java b/src/main/java/net/minecraft/server/ServerStatisticManager.java -index b3c9a5a84..edeb8b4fb 100644 ---- a/src/main/java/net/minecraft/server/ServerStatisticManager.java -+++ b/src/main/java/net/minecraft/server/ServerStatisticManager.java -@@ -20,6 +20,9 @@ import java.util.Map; - import java.util.Optional; - import java.util.Set; - import java.util.Map.Entry; -+import java.util.concurrent.ExecutorService; -+import java.util.concurrent.Executors; -+ - import org.apache.logging.log4j.LogManager; - import org.apache.logging.log4j.Logger; - -@@ -30,6 +33,7 @@ public class ServerStatisticManager extends StatisticManager { - private final File d; - private final Set> e = Sets.newHashSet(); - private int f = -300; -+ public static ExecutorService saveThread = Executors.newSingleThreadExecutor(); // YAPFA - - public ServerStatisticManager(MinecraftServer minecraftserver, File file) { - this.c = minecraftserver; -@@ -40,7 +44,9 @@ public class ServerStatisticManager extends StatisticManager { - Statistic wrapper = StatisticList.CUSTOM.b( entry.getKey() ); - this.a.put( wrapper, entry.getValue().intValue() ); - } -- // Spigot end -+ // Spigot ends -+ // YAPFA start -+ saveThread.submit(() -> { - if (file.isFile()) { - try { - this.a(minecraftserver.aC(), org.apache.commons.io.FileUtils.readFileToString(file)); -@@ -50,17 +56,21 @@ public class ServerStatisticManager extends StatisticManager { - ServerStatisticManager.LOGGER.error("Couldn't parse statistics file {}", file, jsonparseexception); - } - } -- -+ }); - } - - public void a() { - if ( org.spigotmc.SpigotConfig.disableStatSaving ) return; // Spigot -+ // YAPFA start -+ String str = this.b(); -+ saveThread.submit(() -> { - try { -- org.apache.commons.io.FileUtils.writeStringToFile(this.d, this.b()); -+ org.apache.commons.io.FileUtils.writeStringToFile(this.d, str); - } catch (IOException ioexception) { - ServerStatisticManager.LOGGER.error("Couldn't save stats", ioexception); - } -- -+ }); -+ // YAPFA end - } - - @Override -@@ -111,7 +121,7 @@ public class ServerStatisticManager extends StatisticManager { - - if (nbttagcompound2.hasKeyOfType(s2, 99)) { - SystemUtils.a(this.a(statisticwrapper, s2), (statistic) -> { -- this.a.put(statistic, nbttagcompound2.getInt(s2)); -+ this.a.put(statistic, nbttagcompound2.getInt(s2) + this.a.getOrDefault(statistic, 0)); // YAPFA fix async load - }, () -> { - //ServerStatisticManager.LOGGER.warn("Invalid statistic in {}: Don't know what {} is", this.d, s2); // EMC - }); -diff --git a/src/main/java/net/minecraft/server/WorldNBTStorage.java b/src/main/java/net/minecraft/server/WorldNBTStorage.java -index 350ac42d6..c80673770 100644 ---- a/src/main/java/net/minecraft/server/WorldNBTStorage.java -+++ b/src/main/java/net/minecraft/server/WorldNBTStorage.java -@@ -15,6 +15,9 @@ import org.apache.logging.log4j.Logger; - - // CraftBukkit start - import java.util.UUID; -+import java.util.concurrent.ExecutorService; -+import java.util.concurrent.Executors; -+ - import org.bukkit.craftbukkit.entity.CraftPlayer; - // CraftBukkit end - -@@ -28,6 +31,7 @@ public class WorldNBTStorage implements IPlayerFileData { - private final DefinedStructureManager g; - protected final DataFixer a; - private UUID uuid = null; // CraftBukkit -+ public ExecutorService saveThread = Executors.newSingleThreadExecutor(); // YAPFA - - public WorldNBTStorage(File file, String s, @Nullable MinecraftServer minecraftserver, DataFixer datafixer) { - this.a = datafixer; -@@ -140,16 +144,25 @@ public class WorldNBTStorage implements IPlayerFileData { - public void save(EntityHuman entityhuman) { - if(!com.destroystokyo.paper.PaperConfig.savePlayerData) return; // Paper - Make player data saving configurable - try { -- NBTTagCompound nbttagcompound = entityhuman.save(new NBTTagCompound()); -- File file = new File(this.playerDir, entityhuman.getUniqueIDString() + ".dat.tmp"); -- File file1 = new File(this.playerDir, entityhuman.getUniqueIDString() + ".dat"); -- -- NBTCompressedStreamTools.a(nbttagcompound, (OutputStream) (new FileOutputStream(file))); -- if (file1.exists()) { -- file1.delete(); -- } -- -- file.renameTo(file1); -+ // YAPFA start -+ entityhuman.takeInventorySnapshot(); // Take a sync inventory/enderchest snapshot to prevent duping -+ saveThread.submit(() -> { // Save the tag async -+ try { -+ NBTTagCompound nbttagcompound = entityhuman.save(new NBTTagCompound()); -+ File file = new File(this.playerDir, entityhuman.getUniqueIDString() + ".dat.tmp"); -+ File file1 = new File(this.playerDir, entityhuman.getUniqueIDString() + ".dat"); -+ -+ NBTCompressedStreamTools.a(nbttagcompound, (OutputStream) (new FileOutputStream(file))); -+ if (file1.exists()) { -+ file1.delete(); -+ } -+ -+ file.renameTo(file1); -+ } catch (Exception exception) { -+ WorldNBTStorage.LOGGER.error("Failed to save player data for {}", entityhuman.getName(), exception); // Paper -+ } -+ }); -+ // YAPFA end - } catch (Exception exception) { - WorldNBTStorage.LOGGER.error("Failed to save player data for {}", entityhuman.getName(), exception); // Paper - } --- -2.25.1.windows.1 - diff --git a/patches/server-old/0040-Stop-a-pathfinder-method-to-call-itself-more-than-on.patch b/patches/server-old/0040-Stop-a-pathfinder-method-to-call-itself-more-than-on.patch deleted file mode 100644 index 9dbc3f17..00000000 --- a/patches/server-old/0040-Stop-a-pathfinder-method-to-call-itself-more-than-on.patch +++ /dev/null @@ -1,97 +0,0 @@ -From d2f92d223a1713c1d8fe0c45ffb28e30481209b8 Mon Sep 17 00:00:00 2001 -From: tr7zw -Date: Mon, 6 Apr 2020 01:05:08 +0200 -Subject: [PATCH] Stop a pathfinder method to call itself more than once - -This miiiight help to fix the pathfinder from going nuts. Only time will tell. ---- - .../minecraft/server/PathfinderNormal.java | 24 +++++++++++-------- - 1 file changed, 14 insertions(+), 10 deletions(-) - -diff --git a/src/main/java/net/minecraft/server/PathfinderNormal.java b/src/main/java/net/minecraft/server/PathfinderNormal.java -index 61e4dbcd4..f406abd84 100644 ---- a/src/main/java/net/minecraft/server/PathfinderNormal.java -+++ b/src/main/java/net/minecraft/server/PathfinderNormal.java -@@ -96,49 +96,49 @@ public class PathfinderNormal extends PathfinderAbstract { - } - - double d0 = a((IBlockAccess) this.a, new BlockPosition(pathpoint.a, pathpoint.b, pathpoint.c)); -- PathPoint pathpoint1 = this.a(pathpoint.a, pathpoint.b, pathpoint.c + 1, j, d0, EnumDirection.SOUTH); -+ PathPoint pathpoint1 = this.a(pathpoint.a, pathpoint.b, pathpoint.c + 1, j, d0, EnumDirection.SOUTH, 0); // YAPFA - - if (pathpoint1 != null && !pathpoint1.i && pathpoint1.k >= 0.0F) { - apathpoint[i++] = pathpoint1; - } - -- PathPoint pathpoint2 = this.a(pathpoint.a - 1, pathpoint.b, pathpoint.c, j, d0, EnumDirection.WEST); -+ PathPoint pathpoint2 = this.a(pathpoint.a - 1, pathpoint.b, pathpoint.c, j, d0, EnumDirection.WEST, 0); // YAPFA - - if (pathpoint2 != null && !pathpoint2.i && pathpoint2.k >= 0.0F) { - apathpoint[i++] = pathpoint2; - } - -- PathPoint pathpoint3 = this.a(pathpoint.a + 1, pathpoint.b, pathpoint.c, j, d0, EnumDirection.EAST); -+ PathPoint pathpoint3 = this.a(pathpoint.a + 1, pathpoint.b, pathpoint.c, j, d0, EnumDirection.EAST, 0); // YAPFA - - if (pathpoint3 != null && !pathpoint3.i && pathpoint3.k >= 0.0F) { - apathpoint[i++] = pathpoint3; - } - -- PathPoint pathpoint4 = this.a(pathpoint.a, pathpoint.b, pathpoint.c - 1, j, d0, EnumDirection.NORTH); -+ PathPoint pathpoint4 = this.a(pathpoint.a, pathpoint.b, pathpoint.c - 1, j, d0, EnumDirection.NORTH, 0); // YAPFA - - if (pathpoint4 != null && !pathpoint4.i && pathpoint4.k >= 0.0F) { - apathpoint[i++] = pathpoint4; - } - -- PathPoint pathpoint5 = this.a(pathpoint.a - 1, pathpoint.b, pathpoint.c - 1, j, d0, EnumDirection.NORTH); -+ PathPoint pathpoint5 = this.a(pathpoint.a - 1, pathpoint.b, pathpoint.c - 1, j, d0, EnumDirection.NORTH, 0); // YAPFA - - if (this.a(pathpoint, pathpoint2, pathpoint4, pathpoint5)) { - apathpoint[i++] = pathpoint5; - } - -- PathPoint pathpoint6 = this.a(pathpoint.a + 1, pathpoint.b, pathpoint.c - 1, j, d0, EnumDirection.NORTH); -+ PathPoint pathpoint6 = this.a(pathpoint.a + 1, pathpoint.b, pathpoint.c - 1, j, d0, EnumDirection.NORTH, 0); // YAPFA - - if (this.a(pathpoint, pathpoint3, pathpoint4, pathpoint6)) { - apathpoint[i++] = pathpoint6; - } - -- PathPoint pathpoint7 = this.a(pathpoint.a - 1, pathpoint.b, pathpoint.c + 1, j, d0, EnumDirection.SOUTH); -+ PathPoint pathpoint7 = this.a(pathpoint.a - 1, pathpoint.b, pathpoint.c + 1, j, d0, EnumDirection.SOUTH, 0); // YAPFA - - if (this.a(pathpoint, pathpoint2, pathpoint1, pathpoint7)) { - apathpoint[i++] = pathpoint7; - } - -- PathPoint pathpoint8 = this.a(pathpoint.a + 1, pathpoint.b, pathpoint.c + 1, j, d0, EnumDirection.SOUTH); -+ PathPoint pathpoint8 = this.a(pathpoint.a + 1, pathpoint.b, pathpoint.c + 1, j, d0, EnumDirection.SOUTH, 0); // YAPFA - - if (this.a(pathpoint, pathpoint3, pathpoint1, pathpoint8)) { - apathpoint[i++] = pathpoint8; -@@ -159,7 +159,11 @@ public class PathfinderNormal extends PathfinderAbstract { - } - - @Nullable -- private PathPoint a(int i, int j, int k, int l, double d0, EnumDirection enumdirection) { -+ private PathPoint a(int i, int j, int k, int l, double d0, EnumDirection enumdirection, int tries) { // YAPFA -+ if(tries > 1) { -+ System.out.println("Stopped an entity falling into a Pathfinder loop. This might or might not be right! " + super.b.toString()); -+ return null; // YAPFA - This might stop the Pathfinder from going nuts -+ } - PathPoint pathpoint = null; - BlockPosition blockposition = new BlockPosition(i, j, k); - double d1 = a((IBlockAccess) this.a, blockposition); -@@ -181,7 +185,7 @@ public class PathfinderNormal extends PathfinderAbstract { - return pathpoint; - } else { - if ((pathpoint == null || pathpoint.k < 0.0F) && l > 0 && pathtype != PathType.FENCE && pathtype != PathType.TRAPDOOR) { -- pathpoint = this.a(i, j + 1, k, l - 1, d0, enumdirection); -+ pathpoint = this.a(i, j + 1, k, l - 1, d0, enumdirection, ++tries); - if (pathpoint != null && (pathpoint.l == PathType.OPEN || pathpoint.l == PathType.WALKABLE) && this.b.getWidth() < 1.0F) { - double d3 = (double) (i - enumdirection.getAdjacentX()) + 0.5D; - double d4 = (double) (k - enumdirection.getAdjacentZ()) + 0.5D; --- -2.25.1.windows.1 - diff --git a/patches/server-old/0041-Akarin-Avoid-double-I-O-operation-on-load-player-fil.patch b/patches/server-old/0041-Akarin-Avoid-double-I-O-operation-on-load-player-fil.patch deleted file mode 100644 index ae03752e..00000000 --- a/patches/server-old/0041-Akarin-Avoid-double-I-O-operation-on-load-player-fil.patch +++ /dev/null @@ -1,36 +0,0 @@ -From cc1010c26310272c4ba064408870bc5ca13c76f4 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?=E3=84=97=E3=84=A0=CB=8B=20=E3=84=91=E3=84=A7=CB=8A?= - -Date: Thu, 2 Apr 2020 11:29:08 +0800 -Subject: [PATCH] Akarin Avoid double I/O operation on load player file - ---- - src/main/java/net/minecraft/server/WorldNBTStorage.java | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -diff --git a/src/main/java/net/minecraft/server/WorldNBTStorage.java b/src/main/java/net/minecraft/server/WorldNBTStorage.java -index c80673770..65813c84e 100644 ---- a/src/main/java/net/minecraft/server/WorldNBTStorage.java -+++ b/src/main/java/net/minecraft/server/WorldNBTStorage.java -@@ -178,7 +178,8 @@ public class WorldNBTStorage implements IPlayerFileData { - File file = new File(this.playerDir, entityhuman.getUniqueIDString() + ".dat"); - // Spigot Start - boolean usingWrongFile = false; -- if ( org.bukkit.Bukkit.getOnlineMode() && !file.exists() ) // Paper - Check online mode first -+ boolean normalFile = file.exists() && file.isFile(); // Akarin - ensures normal file -+ if ( org.bukkit.Bukkit.getOnlineMode() && !normalFile ) // Paper - Check online mode first // Akarin - ensures normal file - { - file = new File( this.playerDir, UUID.nameUUIDFromBytes( ( "OfflinePlayer:" + entityhuman.getName() ).getBytes( "UTF-8" ) ).toString() + ".dat"); - if ( file.exists() ) -@@ -189,7 +190,7 @@ public class WorldNBTStorage implements IPlayerFileData { - } - // Spigot End - -- if (file.exists() && file.isFile()) { -+ if (normalFile) { // Akarin - avoid double I/O operation - nbttagcompound = NBTCompressedStreamTools.a((InputStream) (new FileInputStream(file))); - } - // Spigot Start --- -2.25.1.windows.1 - diff --git a/patches/server-old/0042-Akarin-Save-json-list-async.patch b/patches/server-old/0042-Akarin-Save-json-list-async.patch deleted file mode 100644 index 2724cf83..00000000 --- a/patches/server-old/0042-Akarin-Save-json-list-async.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 9e840e4a39728a5f36b0ce3a79e9f3b9fddbd2b6 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?=E3=84=97=E3=84=A0=CB=8B=20=E3=84=91=E3=84=A7=CB=8A?= - -Date: Thu, 2 Apr 2020 11:16:18 +0800 -Subject: [PATCH] Akarin Save json list async - ---- - src/main/java/net/minecraft/server/JsonList.java | 6 +++++- - 1 file changed, 5 insertions(+), 1 deletion(-) - -diff --git a/src/main/java/net/minecraft/server/JsonList.java b/src/main/java/net/minecraft/server/JsonList.java -index c97be42dd..370841cad 100644 ---- a/src/main/java/net/minecraft/server/JsonList.java -+++ b/src/main/java/net/minecraft/server/JsonList.java -@@ -168,6 +168,7 @@ public class JsonList> { - } - - public void save() throws IOException { -+ Runnable runnable = () -> { // Akarin - Save json list async - this.removeStaleEntries(); // Paper - remove expired values before saving - Collection collection = this.d.values(); - String s = this.b.toJson(collection); -@@ -176,10 +177,13 @@ public class JsonList> { - try { - bufferedwriter = Files.newWriter(this.c, StandardCharsets.UTF_8); - bufferedwriter.write(s); -+ } catch (IOException e) { // Akarin - Save json list async -+ JsonList.LOGGER.warn("Failed to save " + this.c, e); // Akarin - Save json list async - } finally { - IOUtils.closeQuietly(bufferedwriter); - } -- -+ }; // Akarin - Save json list async -+ MCUtil.scheduleAsyncTask(runnable); // Akarin - Save json list async - } - - public void load() throws FileNotFoundException { --- -2.25.1.windows.1 - diff --git a/patches/server-old/0043-Akarin-Optimize-door-interact-with-pathfinding.patch b/patches/server-old/0043-Akarin-Optimize-door-interact-with-pathfinding.patch deleted file mode 100644 index fb66054f..00000000 --- a/patches/server-old/0043-Akarin-Optimize-door-interact-with-pathfinding.patch +++ /dev/null @@ -1,170 +0,0 @@ -From 617cb03e6388b01fac2a9e8b3d31cd1b3496dbc5 Mon Sep 17 00:00:00 2001 -From: Sotr -Date: Wed, 15 Apr 2020 03:51:50 +0700 -Subject: [PATCH] Akarin Optimize door interact with pathfinding - ---- - .../akarin/server/IndexedBlockPosition.java | 35 +++++++++++++ - .../server/BehaviorInteractDoor.java | 49 ++++++++++++++++--- - .../net/minecraft/server/BehaviorSleep.java | 2 +- - 3 files changed, 77 insertions(+), 9 deletions(-) - create mode 100644 src/main/java/io/akarin/server/IndexedBlockPosition.java - -diff --git a/src/main/java/io/akarin/server/IndexedBlockPosition.java b/src/main/java/io/akarin/server/IndexedBlockPosition.java -new file mode 100644 -index 000000000..83bf1d4ca ---- /dev/null -+++ b/src/main/java/io/akarin/server/IndexedBlockPosition.java -@@ -0,0 +1,35 @@ -+package io.akarin.server; -+ -+import net.minecraft.server.BlockPosition; -+ -+public class IndexedBlockPosition { -+ private final int index; -+ private final BlockPosition position; -+ -+ public IndexedBlockPosition(int index, BlockPosition position) { -+ this.index = index; -+ this.position = position; -+ } -+ -+ public static IndexedBlockPosition of(int index, BlockPosition position) { -+ return new IndexedBlockPosition(index, position); -+ } -+ -+ public int index() { -+ return index; -+ } -+ -+ public BlockPosition get() { -+ return position; -+ } -+ -+ @Override -+ public int hashCode() { -+ return position.hashCode(); -+ } -+ -+ @Override -+ public boolean equals(Object obj) { -+ return position.equals(obj); -+ } -+} -diff --git a/src/main/java/net/minecraft/server/BehaviorInteractDoor.java b/src/main/java/net/minecraft/server/BehaviorInteractDoor.java -index 01d9c2d92..3db22c5f4 100644 ---- a/src/main/java/net/minecraft/server/BehaviorInteractDoor.java -+++ b/src/main/java/net/minecraft/server/BehaviorInteractDoor.java -@@ -1,7 +1,9 @@ - package net.minecraft.server; - - import com.google.common.collect.ImmutableMap; -+import com.google.common.collect.Lists; - import com.google.common.collect.Sets; -+import io.akarin.server.IndexedBlockPosition; - import java.util.Iterator; - import java.util.List; - import java.util.Set; -@@ -19,32 +21,63 @@ public class BehaviorInteractDoor extends Behavior { - BehaviorController behaviorcontroller = entityliving.getBehaviorController(); - PathEntity pathentity = (PathEntity) behaviorcontroller.getMemory(MemoryModuleType.PATH).get(); - List list = (List) behaviorcontroller.getMemory(MemoryModuleType.INTERACTABLE_DOORS).get(); -+ // Akarin start - remove stream -+ /* - List list1 = (List) pathentity.d().stream().map((pathpoint) -> { - return new BlockPosition(pathpoint.a, pathpoint.b, pathpoint.c); - }).collect(Collectors.toList()); -- Set set = this.a(worldserver, list, list1); -+ */ -+ -+ List points = pathentity.getPoints(); -+ java.util.Map list1 = new java.util.HashMap(points.size()); -+ for (int index = 0; index < points.size(); index++) { -+ PathPoint point = points.get(index); -+ list1.put(new BlockPosition(point.a, point.b, point.c), index); -+ } -+ -+ // Akarin end -+ Set set = this.a(worldserver, list, list1); // Akarin - IndexedBlockPosition - int j = pathentity.f() - 1; - - this.a(worldserver, list1, set, j, entityliving, behaviorcontroller); - } - -- private Set a(WorldServer worldserver, List list, List list1) { -+ private Set a(WorldServer worldserver, List list, java.util.Map list1) { // Akarin - List -> Map, IndexedBlockPosition -+ // Akarin start - remove stream -+ /* - Stream stream = list.stream().filter((globalpos) -> { - return globalpos.getDimensionManager() == worldserver.getWorldProvider().getDimensionManager(); - }).map(GlobalPos::getBlockPosition); - - list1.getClass(); - return (Set) stream.filter(list1::contains).collect(Collectors.toSet()); -+ */ -+ -+ Set set = Sets.newHashSet(); -+ DimensionManager manager = worldserver.getWorldProvider().getDimensionManager(); -+ -+ for (GlobalPos globalPos : list) { -+ if (globalPos.getDimensionManager() == manager) { -+ BlockPosition position = globalPos.getBlockPosition(); -+ Integer index = list1.get(position); -+ if (index != null) // contains -+ set.add(IndexedBlockPosition.of(index, position)); -+ } -+ } -+ -+ return set; -+ // Akarin end - } - -- private void a(WorldServer worldserver, List list, Set set, int i, EntityLiving entityliving, BehaviorController behaviorcontroller) { -- set.forEach((blockposition) -> { -- int j = list.indexOf(blockposition); -+ private void a(WorldServer worldserver, java.util.Map list, Set set, int i, EntityLiving entityliving, BehaviorController behaviorcontroller) { // Akarin - List -> Map, IndexedBlockPosition -+ set.forEach((indexedblockposition) -> { // Akarin - IndexedBlockPosition -+ BlockPosition blockposition = indexedblockposition.get(); // Akarin - IndexedBlockPosition -+ // int j = list.indexOf(blockposition); // Akarin - IndexedBlockPosition - IBlockData iblockdata = worldserver.getType(blockposition); - Block block = iblockdata.getBlock(); - - if (TagsBlock.WOODEN_DOORS.isTagged(block) && block instanceof BlockDoor) { -- boolean flag = j >= i; -+ boolean flag = indexedblockposition.index() >= i; // Akarin - IndexedBlockPosition - - // CraftBukkit start - entities opening doors - org.bukkit.event.entity.EntityInteractEvent event = new org.bukkit.event.entity.EntityInteractEvent(entityliving.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(entityliving.world, blockposition)); -@@ -74,14 +107,14 @@ public class BehaviorInteractDoor extends Behavior { - a(worldserver, list, i, entityliving, behaviorcontroller); - } - -- public static void a(WorldServer worldserver, List list, int i, EntityLiving entityliving, BehaviorController behaviorcontroller) { -+ public static void a(WorldServer worldserver, java.util.Map list, int i, EntityLiving entityliving, BehaviorController behaviorcontroller) { // Akarin - List -> Map - behaviorcontroller.getMemory(MemoryModuleType.OPENED_DOORS).ifPresent((set) -> { - Iterator iterator = set.iterator(); - - while (iterator.hasNext()) { - GlobalPos globalpos = (GlobalPos) iterator.next(); - BlockPosition blockposition = globalpos.getBlockPosition(); -- int j = list.indexOf(blockposition); -+ int j = list.getOrDefault(blockposition, -1); // Akarin - List -> Map - - if (worldserver.getWorldProvider().getDimensionManager() != globalpos.getDimensionManager()) { - iterator.remove(); -diff --git a/src/main/java/net/minecraft/server/BehaviorSleep.java b/src/main/java/net/minecraft/server/BehaviorSleep.java -index dfe0f6650..46eb63308 100644 ---- a/src/main/java/net/minecraft/server/BehaviorSleep.java -+++ b/src/main/java/net/minecraft/server/BehaviorSleep.java -@@ -57,7 +57,7 @@ public class BehaviorSleep extends Behavior { - protected void a(WorldServer worldserver, EntityLiving entityliving, long i) { - if (i > this.a) { - entityliving.getBehaviorController().getMemory(MemoryModuleType.OPENED_DOORS).ifPresent((set) -> { -- BehaviorInteractDoor.a(worldserver, (List) ImmutableList.of(), 0, entityliving, entityliving.getBehaviorController()); -+ BehaviorInteractDoor.a(worldserver, com.google.common.collect.ImmutableMap.of(), 0, entityliving, entityliving.getBehaviorController()); // Akarin - List -> Map - }); - entityliving.entitySleep(((GlobalPos) entityliving.getBehaviorController().getMemory(MemoryModuleType.HOME).get()).getBlockPosition()); - } --- -2.25.1.windows.1 - diff --git a/patches/server-old/0044-Purpur-MC-125757-Fix-Always-increment-arrow-despawn-.patch b/patches/server-old/0044-Purpur-MC-125757-Fix-Always-increment-arrow-despawn-.patch deleted file mode 100644 index 8398f236..00000000 --- a/patches/server-old/0044-Purpur-MC-125757-Fix-Always-increment-arrow-despawn-.patch +++ /dev/null @@ -1,42 +0,0 @@ -From bb1039b72c063e2a5f8185a3aeb64014bca60ff4 Mon Sep 17 00:00:00 2001 -From: William Blake Galbreath -Date: Fri, 21 Feb 2020 17:04:51 -0600 -Subject: [PATCH] Purpur MC-125757 Fix - Always increment arrow despawn counter - ---- - src/main/java/net/minecraft/server/EntityArrow.java | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -diff --git a/src/main/java/net/minecraft/server/EntityArrow.java b/src/main/java/net/minecraft/server/EntityArrow.java -index 4dc53d3fa..3b1b133f9 100644 ---- a/src/main/java/net/minecraft/server/EntityArrow.java -+++ b/src/main/java/net/minecraft/server/EntityArrow.java -@@ -147,6 +147,8 @@ public abstract class EntityArrow extends Entity implements IProjectile { - this.extinguish(); - } - -+ this.checkDespawnCounter(); // Purpur - moved from below - MC-125757 -+ - if (this.inGround && !flag) { - if (this.aq != iblockdata && this.world.a(this.getBoundingBox().g(0.06D))) { - this.inGround = false; -@@ -154,7 +156,7 @@ public abstract class EntityArrow extends Entity implements IProjectile { - this.despawnCounter = 0; - this.as = 0; - } else if (!this.world.isClientSide) { -- this.i(); -+ // this.i(); // Purpur moved up - MC-125757 - } - - ++this.d; -@@ -275,6 +277,7 @@ public abstract class EntityArrow extends Entity implements IProjectile { - } - } - -+ protected void checkDespawnCounter() { i(); } // Purpur - OBFHELPER - protected void i() { - ++this.despawnCounter; - if (this.despawnCounter >= (fromPlayer == PickupStatus.CREATIVE_ONLY ? world.paperConfig.creativeArrowDespawnRate : (fromPlayer == PickupStatus.DISALLOWED ? world.paperConfig.nonPlayerArrowDespawnRate : ((this instanceof EntityThrownTrident) ? world.spigotConfig.tridentDespawnRate : world.spigotConfig.arrowDespawnRate)))) { // Spigot // Paper - TODO: Extract this to init? --- -2.25.1.windows.1 - diff --git a/patches/server-old/0045-Purpur-Skip-events-if-there-s-no-listeners.patch b/patches/server-old/0045-Purpur-Skip-events-if-there-s-no-listeners.patch deleted file mode 100644 index db8f31b8..00000000 --- a/patches/server-old/0045-Purpur-Skip-events-if-there-s-no-listeners.patch +++ /dev/null @@ -1,32 +0,0 @@ -From fbfdf8d2a0899a87c93b7de7ddcfcf7fd94bb1a5 Mon Sep 17 00:00:00 2001 -From: William Blake Galbreath -Date: Sat, 4 Apr 2020 03:07:59 -0500 -Subject: [PATCH] Purpur Skip events if there's no listeners - ---- - src/main/java/net/minecraft/server/CommandDispatcher.java | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/src/main/java/net/minecraft/server/CommandDispatcher.java b/src/main/java/net/minecraft/server/CommandDispatcher.java -index 2d512aa4f..2c8ef6dd6 100644 ---- a/src/main/java/net/minecraft/server/CommandDispatcher.java -+++ b/src/main/java/net/minecraft/server/CommandDispatcher.java -@@ -274,6 +274,7 @@ public class CommandDispatcher { - } - - private void runSync(EntityPlayer entityplayer, Collection bukkit, RootCommandNode rootcommandnode) { -+ if (PlayerCommandSendEvent.getHandlerList().getRegisteredListeners().length > 0) { // Purpur - skip all this crap if there's nothing listening - // Paper end - Async command map building - new com.destroystokyo.paper.event.brigadier.AsyncPlayerSendCommandsEvent(entityplayer.getBukkitEntity(), (RootCommandNode) rootcommandnode, false).callEvent(); // Paper - PlayerCommandSendEvent event = new PlayerCommandSendEvent(entityplayer.getBukkitEntity(), new LinkedHashSet<>(bukkit)); -@@ -286,6 +287,7 @@ public class CommandDispatcher { - } - } - // CraftBukkit end -+ } // Purpur - skip event - entityplayer.playerConnection.sendPacket(new PacketPlayOutCommands(rootcommandnode)); - } - --- -2.25.1.windows.1 - diff --git a/patches/server-old/0046-Purpur-Add-more-timings-timers.patch b/patches/server-old/0046-Purpur-Add-more-timings-timers.patch deleted file mode 100644 index f3159ae5..00000000 --- a/patches/server-old/0046-Purpur-Add-more-timings-timers.patch +++ /dev/null @@ -1,218 +0,0 @@ -From ce9af22565f9719a92cb3011327c997b6bd72ee9 Mon Sep 17 00:00:00 2001 -From: tr7zw -Date: Tue, 21 Apr 2020 15:49:52 +0200 -Subject: [PATCH] Purpur Add more timings timers - ---- - .../co/aikar/timings/MinecraftTimings.java | 22 +++++++++++++++++++ - .../minecraft/server/EntityInsentient.java | 12 ++++++++++ - .../net/minecraft/server/EntityLiving.java | 16 +++++++++++++- - .../server/PathfinderGoalSelector.java | 6 +++++ - .../net/minecraft/server/WorldServer.java | 2 ++ - 5 files changed, 57 insertions(+), 1 deletion(-) - -diff --git a/src/main/java/co/aikar/timings/MinecraftTimings.java b/src/main/java/co/aikar/timings/MinecraftTimings.java -index 2966c5731..ae5586737 100644 ---- a/src/main/java/co/aikar/timings/MinecraftTimings.java -+++ b/src/main/java/co/aikar/timings/MinecraftTimings.java -@@ -45,6 +45,28 @@ public final class MinecraftTimings { - - public static final Timing scoreboardScoreSearch = Timings.ofSafe("Scoreboard score search"); // Tuinity - add timings for scoreboard search - -+ // Purpur start -+ public static final Timing goalCleanup = Timings.ofSafe("PathfinderGoal - Cleanup"); -+ public static final Timing goalUpdate = Timings.ofSafe("PathfinderGoal - Update"); -+ public static final Timing goalTick = Timings.ofSafe("PathfinderGoal - Tick"); -+ -+ public static final Timing entityMovementTick = Timings.ofSafe("Entity Movement"); -+ public static final Timing entityMovementTickAI = Timings.ofSafe("Entity Movement - AI"); -+ public static final Timing entityMovementTickNewAI = Timings.ofSafe("Entity Movement - New AI"); -+ public static final Timing entityMovementTickJump = Timings.ofSafe("Entity Movement - Jump"); -+ public static final Timing entityMovementTickTravel = Timings.ofSafe("Entity Movement - Travel"); -+ public static final Timing entityMovementTickPush = Timings.ofSafe("Entity Movement - Push"); -+ -+ public static final Timing entityInsentientSensing = Timings.ofSafe("Entity Insentient - Sensing"); -+ public static final Timing entityInsentientTargetSelector = Timings.ofSafe("Entity Insentient - TargetSelector"); -+ public static final Timing entityInsentientGoalSelector = Timings.ofSafe("Entity Insentient - GoalSelector"); -+ public static final Timing entityInsentientNavigation = Timings.ofSafe("Entity Insentient - Navigation"); -+ public static final Timing entityInsentientMobTick = Timings.ofSafe("Entity Insentient - MobTick"); -+ public static final Timing entityInsentientControls = Timings.ofSafe("Entity Insentient - Controls"); -+ -+ public static final Timing passengerTick = Timings.ofSafe("Passenger Tick"); -+ // Purpur end -+ - private static final Map, String> taskNameCache = new MapMaker().weakKeys().makeMap(); - - private MinecraftTimings() {} -diff --git a/src/main/java/net/minecraft/server/EntityInsentient.java b/src/main/java/net/minecraft/server/EntityInsentient.java -index eec434374..916deddd7 100644 ---- a/src/main/java/net/minecraft/server/EntityInsentient.java -+++ b/src/main/java/net/minecraft/server/EntityInsentient.java -@@ -677,21 +677,32 @@ public abstract class EntityInsentient extends EntityLiving { - } - // Paper end - this.world.getMethodProfiler().enter("sensing"); -+ co.aikar.timings.MinecraftTimings.entityInsentientSensing.startTiming(); // Purpur - this.bw.a(); -+ co.aikar.timings.MinecraftTimings.entityInsentientSensing.stopTiming(); // Purpur - this.world.getMethodProfiler().exit(); - this.world.getMethodProfiler().enter("targetSelector"); -+ co.aikar.timings.MinecraftTimings.entityInsentientTargetSelector.startTiming(); // Purpur - this.targetSelector.doTick(); -+ co.aikar.timings.MinecraftTimings.entityInsentientTargetSelector.stopTiming(); // Purpur - this.world.getMethodProfiler().exit(); - this.world.getMethodProfiler().enter("goalSelector"); -+ co.aikar.timings.MinecraftTimings.entityInsentientGoalSelector.startTiming(); // Purpur - this.goalSelector.doTick(); -+ co.aikar.timings.MinecraftTimings.entityInsentientGoalSelector.stopTiming(); // Purpur - this.world.getMethodProfiler().exit(); - this.world.getMethodProfiler().enter("navigation"); -+ co.aikar.timings.MinecraftTimings.entityInsentientNavigation.startTiming(); // Purpur - this.navigation.c(); -+ co.aikar.timings.MinecraftTimings.entityInsentientNavigation.stopTiming(); // Purpur - this.world.getMethodProfiler().exit(); - this.world.getMethodProfiler().enter("mob tick"); -+ co.aikar.timings.MinecraftTimings.entityInsentientMobTick.startTiming(); // Purpur - this.mobTick(); -+ co.aikar.timings.MinecraftTimings.entityInsentientMobTick.stopTiming(); // Purpur - this.world.getMethodProfiler().exit(); - this.world.getMethodProfiler().enter("controls"); -+ co.aikar.timings.MinecraftTimings.entityInsentientControls.startTiming(); // Purpur - this.world.getMethodProfiler().enter("move"); - this.moveController.a(); - this.world.getMethodProfiler().exitEnter("look"); -@@ -699,6 +710,7 @@ public abstract class EntityInsentient extends EntityLiving { - this.world.getMethodProfiler().exitEnter("jump"); - this.bq.b(); - this.world.getMethodProfiler().exit(); -+ co.aikar.timings.MinecraftTimings.entityInsentientControls.stopTiming(); // Purpur - this.world.getMethodProfiler().exit(); - this.K(); - } -diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java -index 7a01daa57..1d66afe9b 100644 ---- a/src/main/java/net/minecraft/server/EntityLiving.java -+++ b/src/main/java/net/minecraft/server/EntityLiving.java -@@ -2413,7 +2413,11 @@ public abstract class EntityLiving extends Entity { - } - } - -- this.movementTick(); -+ -+ MinecraftTimings.entityMovementTick.startTiming(); // Purpur -+ if (!dead) this.movementTick(); // Purpur -+ MinecraftTimings.entityMovementTick.stopTiming(); // Purpur -+ - double d0 = this.locX() - this.lastX; - double d1 = this.locZ() - this.lastZ; - float f = (float) (d0 * d0 + d1 * d1); -@@ -2620,18 +2624,23 @@ public abstract class EntityLiving extends Entity { - - this.setMot(d4, d5, d6); - this.world.getMethodProfiler().enter("ai"); -+ co.aikar.timings.MinecraftTimings.entityMovementTickAI.startTiming(); // Purpur - if (this.isFrozen()) { - this.jumping = false; - this.aZ = 0.0F; - this.bb = 0.0F; - } else if (this.doAITick()) { - this.world.getMethodProfiler().enter("newAi"); -+ co.aikar.timings.MinecraftTimings.entityMovementTickNewAI.startTiming(); // Purpur - this.doTick(); -+ co.aikar.timings.MinecraftTimings.entityMovementTickNewAI.stopTiming(); // Purpur - this.world.getMethodProfiler().exit(); - } -+ co.aikar.timings.MinecraftTimings.entityMovementTickAI.stopTiming(); // Purpur - - this.world.getMethodProfiler().exit(); - this.world.getMethodProfiler().enter("jump"); -+ co.aikar.timings.MinecraftTimings.entityMovementTickJump.startTiming(); // Purpur - if (this.jumping) { - if (this.N > 0.0D && (!this.onGround || this.N > 0.4D)) { - this.c(TagsFluid.WATER); -@@ -2646,21 +2655,26 @@ public abstract class EntityLiving extends Entity { - } else { - this.jumpTicks = 0; - } -+ co.aikar.timings.MinecraftTimings.entityMovementTickJump.stopTiming(); // Purpur - - this.world.getMethodProfiler().exit(); - this.world.getMethodProfiler().enter("travel"); -+ co.aikar.timings.MinecraftTimings.entityMovementTickTravel.startTiming(); // Purpur - this.aZ *= 0.98F; - this.bb *= 0.98F; - this.n(); - AxisAlignedBB axisalignedbb = this.getBoundingBox(); - - this.e(new Vec3D((double) this.aZ, (double) this.ba, (double) this.bb)); -+ co.aikar.timings.MinecraftTimings.entityMovementTickTravel.stopTiming(); // Purpur - this.world.getMethodProfiler().exit(); - this.world.getMethodProfiler().enter("push"); -+ co.aikar.timings.MinecraftTimings.entityMovementTickPush.startTiming(); // Purpur - if (this.bn > 0) { - --this.bn; - this.a(axisalignedbb, this.getBoundingBox()); - } -+ co.aikar.timings.MinecraftTimings.entityMovementTickPush.stopTiming(); // Purpur - - if(!de.tr7zw.yapfa.YapfaConfig.disableEntityCollisions) // YAPFA - this.collideNearby(); -diff --git a/src/main/java/net/minecraft/server/PathfinderGoalSelector.java b/src/main/java/net/minecraft/server/PathfinderGoalSelector.java -index a68fc11ec..95dde6653 100644 ---- a/src/main/java/net/minecraft/server/PathfinderGoalSelector.java -+++ b/src/main/java/net/minecraft/server/PathfinderGoalSelector.java -@@ -78,6 +78,7 @@ public class PathfinderGoalSelector { - private static final PathfinderGoal.Type[] PATHFINDER_GOAL_TYPES = PathfinderGoal.Type.values(); // Paper - remove streams from pathfindergoalselector - - public void doTick() { -+ co.aikar.timings.MinecraftTimings.goalCleanup.startTiming(); - this.e.enter("goalCleanup"); - // Paper start - remove streams from pathfindergoalselector - for (Iterator iterator = this.d.iterator(); iterator.hasNext();) { -@@ -97,8 +98,10 @@ public class PathfinderGoalSelector { - } - - }); -+ co.aikar.timings.MinecraftTimings.goalCleanup.stopTiming(); - this.e.exit(); - this.e.enter("goalUpdate"); -+ co.aikar.timings.MinecraftTimings.goalUpdate.startTiming(); - // Paper start - remove streams from pathfindergoalselector - goal_update_loop: for (Iterator iterator = this.d.iterator(); iterator.hasNext();) { - PathfinderGoalWrapped wrappedGoal = iterator.next(); -@@ -141,8 +144,10 @@ public class PathfinderGoalSelector { - wrappedGoal.c(); - } - // Paper end - remove streams from pathfindergoalselector -+ co.aikar.timings.MinecraftTimings.goalUpdate.stopTiming(); - this.e.exit(); - this.e.enter("goalTick"); -+ co.aikar.timings.MinecraftTimings.goalTick.startTiming(); - // Paper start - remove streams from pathfindergoalselector - for (Iterator iterator = this.d.iterator(); iterator.hasNext();) { - PathfinderGoalWrapped wrappedGoal = iterator.next(); -@@ -151,6 +156,7 @@ public class PathfinderGoalSelector { - } - } - // Paper end - remove streams from pathfindergoalselector -+ co.aikar.timings.MinecraftTimings.goalTick.stopTiming(); - this.e.exit(); - } - -diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java -index 24cd10c96..44eec7b1b 100644 ---- a/src/main/java/net/minecraft/server/WorldServer.java -+++ b/src/main/java/net/minecraft/server/WorldServer.java -@@ -1302,7 +1302,9 @@ public class WorldServer extends World { - return IRegistry.ENTITY_TYPE.getKey(entity1.getEntityType()).toString(); - }); - gameprofilerfiller.c("tickPassenger"); -+ co.aikar.timings.MinecraftTimings.passengerTick.startTiming(); // Purpur - entity1.passengerTick(); -+ co.aikar.timings.MinecraftTimings.passengerTick.stopTiming(); // Purpur - gameprofilerfiller.exit(); - } - --- -2.25.1.windows.1 - diff --git a/patches/server-old/0047-Modify-default-configs.patch b/patches/server-old/0047-Modify-default-configs.patch deleted file mode 100644 index 1bc04b79..00000000 --- a/patches/server-old/0047-Modify-default-configs.patch +++ /dev/null @@ -1,39 +0,0 @@ -From ab054278d0f0a33616d880af02263ac45ddd212e Mon Sep 17 00:00:00 2001 -From: tr7zw -Date: Tue, 21 Apr 2020 16:14:10 +0200 -Subject: [PATCH] Modify default configs - ---- - src/main/java/com/destroystokyo/paper/PaperConfig.java | 2 +- - src/main/java/com/destroystokyo/paper/PaperWorldConfig.java | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/src/main/java/com/destroystokyo/paper/PaperConfig.java b/src/main/java/com/destroystokyo/paper/PaperConfig.java -index 8444819f0..f83c43f6c 100644 ---- a/src/main/java/com/destroystokyo/paper/PaperConfig.java -+++ b/src/main/java/com/destroystokyo/paper/PaperConfig.java -@@ -202,7 +202,7 @@ public class PaperConfig { - - public static String timingsServerName; - private static void timings() { -- boolean timings = getBoolean("timings.enabled", true); -+ boolean timings = getBoolean("timings.enabled", false); // YAPFA don't profile by default - boolean verboseTimings = getBoolean("timings.verbose", true); - TimingsManager.privacy = getBoolean("timings.server-name-privacy", false); - TimingsManager.hiddenConfigs = getList("timings.hidden-config-entries", Lists.newArrayList("database", "settings.bungeecord-addresses")); -diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java -index ecacb72b9..340502d92 100644 ---- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java -+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java -@@ -648,7 +648,7 @@ public class PaperWorldConfig { - } - - public boolean cooldownHopperWhenFull = true; -- public boolean disableHopperMoveEvents = false; -+ public boolean disableHopperMoveEvents = true; // YAPFA disable by default - private void hopperOptimizations() { - cooldownHopperWhenFull = getBoolean("hopper.cooldown-when-full", cooldownHopperWhenFull); - log("Cooldown Hoppers when Full: " + (cooldownHopperWhenFull ? "enabled" : "disabled")); --- -2.25.1.windows.1 - diff --git a/patches/server-old/0048-lithium-MixinDirection.patch b/patches/server-old/0048-lithium-MixinDirection.patch deleted file mode 100644 index f06f34a2..00000000 --- a/patches/server-old/0048-lithium-MixinDirection.patch +++ /dev/null @@ -1,60 +0,0 @@ -From 4b13ca08957ac2c70e129670244a74120f69d7e4 Mon Sep 17 00:00:00 2001 -From: tr7zw -Date: Mon, 11 May 2020 21:00:44 +0200 -Subject: [PATCH] lithium MixinDirection - ---- - .../java/net/minecraft/server/EnumDirection.java | 16 ++++++++++++---- - 1 file changed, 12 insertions(+), 4 deletions(-) - -diff --git a/src/main/java/net/minecraft/server/EnumDirection.java b/src/main/java/net/minecraft/server/EnumDirection.java -index 3b7bb296d..b4258ec78 100644 ---- a/src/main/java/net/minecraft/server/EnumDirection.java -+++ b/src/main/java/net/minecraft/server/EnumDirection.java -@@ -17,13 +17,13 @@ public enum EnumDirection implements INamable { - DOWN(0, 1, -1, "down", EnumDirection.EnumAxisDirection.NEGATIVE, EnumDirection.EnumAxis.Y, new BaseBlockPosition(0, -1, 0)), UP(1, 0, -1, "up", EnumDirection.EnumAxisDirection.POSITIVE, EnumDirection.EnumAxis.Y, new BaseBlockPosition(0, 1, 0)), NORTH(2, 3, 2, "north", EnumDirection.EnumAxisDirection.NEGATIVE, EnumDirection.EnumAxis.Z, new BaseBlockPosition(0, 0, -1)), SOUTH(3, 2, 0, "south", EnumDirection.EnumAxisDirection.POSITIVE, EnumDirection.EnumAxis.Z, new BaseBlockPosition(0, 0, 1)), WEST(4, 5, 1, "west", EnumDirection.EnumAxisDirection.NEGATIVE, EnumDirection.EnumAxis.X, new BaseBlockPosition(-1, 0, 0)), EAST(5, 4, 3, "east", EnumDirection.EnumAxisDirection.POSITIVE, EnumDirection.EnumAxis.X, new BaseBlockPosition(1, 0, 0)); - - private final int g; -- private final int h; -+ private final int h; // YAPFA this is idOpposit(yarn) - private final int i; - private final String j; - private final EnumDirection.EnumAxis k; - private final EnumDirection.EnumAxisDirection l; - private final BaseBlockPosition m; -- private static final EnumDirection[] n = values(); -+ private static final EnumDirection[] n = values(); private static final EnumDirection[] ALL = n;// YAPFA OBF HELPER - private static final Map o = (Map) Arrays.stream(EnumDirection.n).collect(Collectors.toMap(EnumDirection::l, (enumdirection) -> { - return enumdirection; - })); -@@ -95,8 +95,12 @@ public enum EnumDirection implements INamable { - return this.l; - } - -+ /** -+ * @reason Avoid the modulo/abs operations -+ * @author JellySquid -+ */ - public EnumDirection opposite() { -- return fromType1(this.h); -+ return ALL[this.h]; - } - - public EnumDirection f() { -@@ -182,8 +186,12 @@ public enum EnumDirection implements INamable { - return (float) ((this.i & 3) * 90); - } - -+ /** -+ * @reason Do not allocate an excessive number of Direction arrays -+ * @author JellySquid -+ */ - public static EnumDirection a(Random random) { -- return values()[random.nextInt(values().length)]; -+ return ALL[random.nextInt(ALL.length)]; - } - - public static EnumDirection a(double d0, double d1, double d2) { --- -2.25.1.windows.1 - diff --git a/patches/server-old/0049-lithium-MixinBox.patch b/patches/server-old/0049-lithium-MixinBox.patch deleted file mode 100644 index 79415c52..00000000 --- a/patches/server-old/0049-lithium-MixinBox.patch +++ /dev/null @@ -1,59 +0,0 @@ -From a433ea4d262e200a4f746625dc641712a60e7524 Mon Sep 17 00:00:00 2001 -From: tr7zw -Date: Mon, 11 May 2020 21:02:57 +0200 -Subject: [PATCH] lithium MixinBox - ---- - .../net/minecraft/server/AxisAlignedBB.java | 34 ++++++++++++++++--- - 1 file changed, 30 insertions(+), 4 deletions(-) - -diff --git a/src/main/java/net/minecraft/server/AxisAlignedBB.java b/src/main/java/net/minecraft/server/AxisAlignedBB.java -index 688c5b1bd..e78e27588 100644 ---- a/src/main/java/net/minecraft/server/AxisAlignedBB.java -+++ b/src/main/java/net/minecraft/server/AxisAlignedBB.java -@@ -150,12 +150,38 @@ public class AxisAlignedBB { - return new AxisAlignedBB((double) structureboundingbox.a, (double) structureboundingbox.b, (double) structureboundingbox.c, (double) (structureboundingbox.d + 1), (double) (structureboundingbox.e + 1), (double) (structureboundingbox.f + 1)); - } - -+ /** -+ * @reason Simplify the code to better help the JVM optimize it -+ * @author JellySquid -+ */ - public double a(EnumDirection.EnumAxis enumdirection_enumaxis) { -- return enumdirection_enumaxis.a(this.minX, this.minY, this.minZ); -- } -- -+ switch (enumdirection_enumaxis) { -+ case X: -+ return this.minX; -+ case Y: -+ return this.minY; -+ case Z: -+ return this.minZ; -+ } -+ -+ throw new IllegalArgumentException(); -+ } -+ -+ /** -+ * @reason Simplify the code to better help the JVM optimize it -+ * @author JellySquid -+ */ - public double b(EnumDirection.EnumAxis enumdirection_enumaxis) { -- return enumdirection_enumaxis.a(this.maxX, this.maxY, this.maxZ); -+ switch (enumdirection_enumaxis) { -+ case X: -+ return this.maxX; -+ case Y: -+ return this.maxY; -+ case Z: -+ return this.maxZ; -+ } -+ -+ throw new IllegalArgumentException(); - } - - public boolean equals(Object object) { --- -2.25.1.windows.1 - diff --git a/patches/server-old/0050-lithium-enum_values.patch b/patches/server-old/0050-lithium-enum_values.patch deleted file mode 100644 index 56a5eb47..00000000 --- a/patches/server-old/0050-lithium-enum_values.patch +++ /dev/null @@ -1,80 +0,0 @@ -From ab79d849781b7d9ce55ac075c3ba44ef131d1d32 Mon Sep 17 00:00:00 2001 -From: tr7zw -Date: Mon, 11 May 2020 21:37:44 +0200 -Subject: [PATCH] lithium enum_values - ---- - src/main/java/net/minecraft/server/BlockPiston.java | 8 ++++---- - src/main/java/net/minecraft/server/EntityLiving.java | 6 +++++- - .../java/net/minecraft/server/PistonExtendsChecker.java | 4 +++- - 3 files changed, 12 insertions(+), 6 deletions(-) - -diff --git a/src/main/java/net/minecraft/server/BlockPiston.java b/src/main/java/net/minecraft/server/BlockPiston.java -index 8312ed779..23a2c1a91 100644 ---- a/src/main/java/net/minecraft/server/BlockPiston.java -+++ b/src/main/java/net/minecraft/server/BlockPiston.java -@@ -138,8 +138,9 @@ public class BlockPiston extends BlockDirectional { - - } - -+ private final static EnumDirection[] aenumdirection = EnumDirection.values(); // YAPFA - don't recreate -+ - private boolean a(World world, BlockPosition blockposition, EnumDirection enumdirection) { -- EnumDirection[] aenumdirection = EnumDirection.values(); - int i = aenumdirection.length; - - int j; -@@ -156,12 +157,11 @@ public class BlockPiston extends BlockDirectional { - return true; - } else { - BlockPosition blockposition1 = blockposition.up(); -- EnumDirection[] aenumdirection1 = EnumDirection.values(); - -- j = aenumdirection1.length; -+ j = aenumdirection.length; - - for (int k = 0; k < j; ++k) { -- EnumDirection enumdirection2 = aenumdirection1[k]; -+ EnumDirection enumdirection2 = aenumdirection[k]; - - if (enumdirection2 != EnumDirection.DOWN && world.isBlockFacePowered(blockposition1.shift(enumdirection2), enumdirection2)) { - return true; -diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java -index 1d66afe9b..2b3e264ed 100644 ---- a/src/main/java/net/minecraft/server/EntityLiving.java -+++ b/src/main/java/net/minecraft/server/EntityLiving.java -@@ -2499,9 +2499,13 @@ public abstract class EntityLiving extends Entity { - } - } - -+ /** -+ * @reason Avoid cloning enum values -+ */ -+ private final static EnumItemSlot[] aenumitemslot = EnumItemSlot.values(); -+ - // Paper start - split into own method from above - public void updateEntityEquipment() { -- EnumItemSlot[] aenumitemslot = EnumItemSlot.values(); - int k = aenumitemslot.length; - for (int l = 0; l < k; ++l) { - EnumItemSlot enumitemslot = aenumitemslot[l]; -diff --git a/src/main/java/net/minecraft/server/PistonExtendsChecker.java b/src/main/java/net/minecraft/server/PistonExtendsChecker.java -index de1c98cca..1ac3e5a37 100644 ---- a/src/main/java/net/minecraft/server/PistonExtendsChecker.java -+++ b/src/main/java/net/minecraft/server/PistonExtendsChecker.java -@@ -167,9 +167,11 @@ public class PistonExtendsChecker { - this.f.addAll(list2); - } - -+ private final static EnumDirection[] aenumdirection = EnumDirection.values(); // YAPFA - don't recreate -+ - private boolean a(BlockPosition blockposition) { - IBlockData iblockdata = this.a.getType(blockposition); -- EnumDirection[] aenumdirection = EnumDirection.values(); -+ - int i = aenumdirection.length; - - for (int j = 0; j < i; ++j) { --- -2.25.1.windows.1 - diff --git a/patches/server-old/0051-lithium-MixinAxisCycleDirection.patch b/patches/server-old/0051-lithium-MixinAxisCycleDirection.patch deleted file mode 100644 index 82a5aec7..00000000 --- a/patches/server-old/0051-lithium-MixinAxisCycleDirection.patch +++ /dev/null @@ -1,109 +0,0 @@ -From 4234086655d80465db6e7bcc13936ab6bab9edd3 Mon Sep 17 00:00:00 2001 -From: tr7zw -Date: Mon, 11 May 2020 21:50:18 +0200 -Subject: [PATCH] lithium MixinAxisCycleDirection - ---- - .../net/minecraft/server/EnumAxisCycle.java | 90 +++++++++++++++++++ - 1 file changed, 90 insertions(+) - create mode 100644 src/main/java/net/minecraft/server/EnumAxisCycle.java - -diff --git a/src/main/java/net/minecraft/server/EnumAxisCycle.java b/src/main/java/net/minecraft/server/EnumAxisCycle.java -new file mode 100644 -index 000000000..d05cddcc9 ---- /dev/null -+++ b/src/main/java/net/minecraft/server/EnumAxisCycle.java -@@ -0,0 +1,90 @@ -+package net.minecraft.server; -+ -+public enum EnumAxisCycle { -+ -+ NONE { -+ @Override -+ public int a(int i, int j, int k, EnumDirection.EnumAxis enumdirection_enumaxis) { -+ return enumdirection_enumaxis.a(i, j, k); -+ } -+ -+ @Override -+ public EnumDirection.EnumAxis a(EnumDirection.EnumAxis enumdirection_enumaxis) { -+ return enumdirection_enumaxis; -+ } -+ -+ @Override -+ public EnumAxisCycle a() { -+ return this; -+ } -+ }, -+ FORWARD { -+ @Override -+ public int a(int i, int j, int k, EnumDirection.EnumAxis enumdirection_enumaxis) { -+ return enumdirection_enumaxis.a(k, i, j); -+ } -+ -+ /** -+ * The JVM has difficulty optimizing these functions due to the use of dynamic dispatch. They can trivially be -+ * implemented as a simple switch lookup table. -+ */ -+ @Override -+ public EnumDirection.EnumAxis a(EnumDirection.EnumAxis enumdirection_enumaxis) { -+ switch (enumdirection_enumaxis) { -+ case X: -+ return EnumDirection.EnumAxis.Y; -+ case Y: -+ return EnumDirection.EnumAxis.Z; -+ case Z: -+ return EnumDirection.EnumAxis.X; -+ } -+ -+ throw new IllegalArgumentException(); -+ } -+ -+ @Override -+ public EnumAxisCycle a() { -+ return BACKWARD; -+ } -+ }, -+ BACKWARD { -+ @Override -+ public int a(int i, int j, int k, EnumDirection.EnumAxis enumdirection_enumaxis) { -+ return enumdirection_enumaxis.a(j, k, i); -+ } -+ -+ @Override -+ public EnumDirection.EnumAxis a(EnumDirection.EnumAxis enumdirection_enumaxis) { -+ switch (enumdirection_enumaxis) { -+ case X: -+ return EnumDirection.EnumAxis.Z; -+ case Y: -+ return EnumDirection.EnumAxis.X; -+ case Z: -+ return EnumDirection.EnumAxis.Y; -+ } -+ -+ throw new IllegalArgumentException(); -+ } -+ -+ @Override -+ public EnumAxisCycle a() { -+ return FORWARD; -+ } -+ }; -+ -+ public static final EnumDirection.EnumAxis[] d = EnumDirection.EnumAxis.values(); -+ public static final EnumAxisCycle[] e = values(); -+ -+ private EnumAxisCycle() {} -+ -+ public abstract int a(int i, int j, int k, EnumDirection.EnumAxis enumdirection_enumaxis); -+ -+ public abstract EnumDirection.EnumAxis a(EnumDirection.EnumAxis enumdirection_enumaxis); -+ -+ public abstract EnumAxisCycle a(); -+ -+ public static EnumAxisCycle a(EnumDirection.EnumAxis enumdirection_enumaxis, EnumDirection.EnumAxis enumdirection_enumaxis1) { -+ return EnumAxisCycle.e[Math.floorMod(enumdirection_enumaxis1.ordinal() - enumdirection_enumaxis.ordinal(), 3)]; -+ } -+} --- -2.25.1.windows.1 - diff --git a/patches/server-old/0052-lithium-MixinGoalSelector.patch b/patches/server-old/0052-lithium-MixinGoalSelector.patch deleted file mode 100644 index a38a6ac3..00000000 --- a/patches/server-old/0052-lithium-MixinGoalSelector.patch +++ /dev/null @@ -1,39 +0,0 @@ -From f2bae99a264f92eb358ffbe933bc640ecc913ab1 Mon Sep 17 00:00:00 2001 -From: tr7zw -Date: Mon, 11 May 2020 22:07:17 +0200 -Subject: [PATCH] lithium MixinGoalSelector - -Only replaces the set type, might want to also port the logic rewrite in the future ---- - .../java/net/minecraft/server/PathfinderGoalSelector.java | 8 ++++++-- - 1 file changed, 6 insertions(+), 2 deletions(-) - -diff --git a/src/main/java/net/minecraft/server/PathfinderGoalSelector.java b/src/main/java/net/minecraft/server/PathfinderGoalSelector.java -index 95dde6653..8c0c93197 100644 ---- a/src/main/java/net/minecraft/server/PathfinderGoalSelector.java -+++ b/src/main/java/net/minecraft/server/PathfinderGoalSelector.java -@@ -1,7 +1,8 @@ - package net.minecraft.server; - - import com.destroystokyo.paper.util.set.OptimizedSmallEnumSet; // Paper - remove streams from pathfindergoalselector --import com.google.common.collect.Sets; -+import it.unimi.dsi.fastutil.objects.ObjectLinkedOpenHashSet; -+ - import java.util.EnumMap; - import java.util.EnumSet; - import java.util.Iterator; // Paper - remove streams from pathfindergoalselector -@@ -26,7 +27,10 @@ public class PathfinderGoalSelector { - } - }; - private final Map c = new EnumMap(PathfinderGoal.Type.class); -- private final Set d = Sets.newLinkedHashSet();public Set getTasks() { return d; }// Paper - OBFHELPER -+ /** -+ * Replace the task set with an optimized collection type which performs better for iteration. -+ */ -+ private final Set d = new ObjectLinkedOpenHashSet();/* YAPFA better set */public Set getTasks() { return d; }// Paper - OBFHELPER - private final GameProfilerFiller e; - private final EnumSet f = EnumSet.noneOf(PathfinderGoal.Type.class); // Paper unused, but dummy to prevent plugins from crashing as hard. Theyll need to support paper in a special case if this is super important, but really doesn't seem like it would be. - private final OptimizedSmallEnumSet goalTypes = new OptimizedSmallEnumSet<>(PathfinderGoal.Type.class); // Paper - remove streams from pathfindergoalselector --- -2.25.1.windows.1 - diff --git a/patches/server-old/0053-lithium-MixinLandPathNodeMaker.patch b/patches/server-old/0053-lithium-MixinLandPathNodeMaker.patch deleted file mode 100644 index 9642c9a6..00000000 --- a/patches/server-old/0053-lithium-MixinLandPathNodeMaker.patch +++ /dev/null @@ -1,116 +0,0 @@ -From 1610e22769a72ab49a755f32df790a01c750b71b Mon Sep 17 00:00:00 2001 -From: tr7zw -Date: Mon, 11 May 2020 22:56:27 +0200 -Subject: [PATCH] lithium MixinLandPathNodeMaker - ---- - .../minecraft/server/PathfinderNormal.java | 66 +++++++++++++++---- - 1 file changed, 55 insertions(+), 11 deletions(-) - -diff --git a/src/main/java/net/minecraft/server/PathfinderNormal.java b/src/main/java/net/minecraft/server/PathfinderNormal.java -index f406abd84..cbe9b6439 100644 ---- a/src/main/java/net/minecraft/server/PathfinderNormal.java -+++ b/src/main/java/net/minecraft/server/PathfinderNormal.java -@@ -1,6 +1,10 @@ - package net.minecraft.server; - - import com.google.common.collect.Sets; -+ -+import it.unimi.dsi.fastutil.objects.Reference2ReferenceMap; -+import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap; -+ - import java.util.EnumSet; - import java.util.Iterator; - import java.util.Set; -@@ -8,6 +12,12 @@ import javax.annotation.Nullable; - - public class PathfinderNormal extends PathfinderAbstract { - -+ // YAPFA start -+ -+ // This is not thread-safe! -+ private static final Reference2ReferenceMap commonTypes = new Reference2ReferenceOpenHashMap<>(); -+ // YAPFA end -+ - protected float j; - - public PathfinderNormal() {} -@@ -455,12 +465,48 @@ public class PathfinderNormal extends PathfinderAbstract { - // Tuinity end - reduce blockpos allocation - IBlockData iblockdata = iblockaccess.getTypeIfLoaded(blockposition); // Paper - if (iblockdata == null) return PathType.BLOCKED; // Paper -- Block block = iblockdata.getBlock(); -- Material material = iblockdata.getMaterial(); -+ // Check early if the block is air as it will always be open regardless of other conditions -+ if(iblockdata.isAir())return PathType.OPEN; -+ -+ // Get the cached type for this block state -+ PathType type = commonTypes.get(iblockdata); -+ -+ // No result has been cached for this block state yet, so calculate and cache it -+ if (type == null) { -+ commonTypes.put(iblockdata, type = getPathType(iblockaccess, blockposition, iblockdata)); -+ } -+ // If the node type is open, it means that we were unable to determine a more specific type, so we need -+ // to check the fallback path. -+ if (type == PathType.OPEN) { -+ // This is only ever called in vanilla after all other possibilities are exhausted, but before fluid checks -+ // It should be safe to perform it last in actuality and take advantage of the cache for fluid types as well -+ // since fluids will always pass this check. -+ if (!iblockdata.a(iblockaccess, blockposition, PathMode.LAND)) { -+ return PathType.BLOCKED; -+ } - -- if (iblockdata.isAir()) { -+ // All checks succeed, this path node really is open! - return PathType.OPEN; -- } else if (!block.a(TagsBlock.TRAPDOORS) && block != Blocks.LILY_PAD) { -+ } -+ -+ // Return the cached value since we found an obstacle earlier -+ return type; -+ -+ -+ -+ // Tuinity start - reduce blockpos allocation -+ } finally { -+ blockposition.close(); -+ } -+ // Tuinity end - reduce blockpos allocation -+ } -+ -+ private static PathType getPathType(IBlockAccess iblockaccess, BlockPosition.PooledBlockPosition blockposition, -+ IBlockData iblockdata) { -+ Block block = iblockdata.getBlock(); -+ Material material = iblockdata.getMaterial(); -+ -+ if (!block.a(TagsBlock.TRAPDOORS) && block != Blocks.LILY_PAD) { - if (block == Blocks.FIRE) { - return PathType.DAMAGE_FIRE; - } else if (block == Blocks.CACTUS) { -@@ -484,17 +530,15 @@ public class PathfinderNormal extends PathfinderAbstract { - } else if (!block.a(TagsBlock.FENCES) && !block.a(TagsBlock.WALLS) && (!(block instanceof BlockFenceGate) || (Boolean) iblockdata.get(BlockFenceGate.OPEN))) { - Fluid fluid = iblockdata.getFluid(); // Tuinity - optimise out world#getFluid - -- return fluid.a(TagsFluid.WATER) ? PathType.WATER : (fluid.a(TagsFluid.LAVA) ? PathType.LAVA : (iblockdata.a(iblockaccess, blockposition, PathMode.LAND) ? PathType.OPEN : PathType.BLOCKED)); -+ if(fluid.a(TagsFluid.WATER))return PathType.WATER; -+ if(fluid.a(TagsFluid.LAVA))return PathType.LAVA; -+ -+ return PathType.OPEN; - } else { - return PathType.FENCE; - } - } else { - return PathType.TRAPDOOR; - } -- // Tuinity start - reduce blockpos allocation -- } finally { -- blockposition.close(); -- } -- // Tuinity end - reduce blockpos allocation -- } -+ } - } --- -2.25.1.windows.1 - diff --git a/patches/server-old/0054-lithium-MixinBiome.patch b/patches/server-old/0054-lithium-MixinBiome.patch deleted file mode 100644 index 9672a491..00000000 --- a/patches/server-old/0054-lithium-MixinBiome.patch +++ /dev/null @@ -1,211 +0,0 @@ -From b4ebbec2a49e352d00a35a45d0a9e0333fb3d5b3 Mon Sep 17 00:00:00 2001 -From: tr7zw -Date: Tue, 12 May 2020 00:38:31 +0200 -Subject: [PATCH] lithium MixinBiome - ---- - .../common/util/collections/HashedList.java | 168 ++++++++++++++++++ - .../java/net/minecraft/server/BiomeBase.java | 4 +- - 2 files changed, 171 insertions(+), 1 deletion(-) - create mode 100644 src/main/java/me/jellysquid/mods/lithium/common/util/collections/HashedList.java - -diff --git a/src/main/java/me/jellysquid/mods/lithium/common/util/collections/HashedList.java b/src/main/java/me/jellysquid/mods/lithium/common/util/collections/HashedList.java -new file mode 100644 -index 000000000..a2e3e96e1 ---- /dev/null -+++ b/src/main/java/me/jellysquid/mods/lithium/common/util/collections/HashedList.java -@@ -0,0 +1,168 @@ -+package me.jellysquid.mods.lithium.common.util.collections; -+ -+import it.unimi.dsi.fastutil.objects.ObjectArraySet; -+ -+import java.util.*; -+ -+/** -+ * Wraps a {@link List} with a hash table which provides O(1) lookups for {@link Collection#contains(Object)}. -+ * -+ * @see https://github.com/jellysquid3/lithium-fabric/blob/1.16.x/fabric/src/main/java/me/jellysquid/mods/lithium/common/util/collections/HashedList.java -+ */ -+public class HashedList implements List { -+ private final List list; -+ private final Set set; -+ -+ private HashedList(List list, Set set) { -+ this.list = list; -+ this.set = set; -+ } -+ -+ @Override -+ public int size() { -+ return this.list.size(); -+ } -+ -+ @Override -+ public boolean isEmpty() { -+ return this.list.isEmpty(); -+ } -+ -+ @Override -+ public boolean contains(Object o) { -+ return this.set.contains(o); -+ } -+ -+ @Override -+ public Iterator iterator() { -+ return this.list.iterator(); -+ } -+ -+ @Override -+ public Object[] toArray() { -+ return this.list.toArray(); -+ } -+ -+ @Override -+ public T1[] toArray(T1[] a) { -+ return this.list.toArray(a); -+ } -+ -+ @Override -+ public boolean add(T t) { -+ this.set.add(t); -+ -+ return this.list.add(t); -+ } -+ -+ @Override -+ public boolean remove(Object o) { -+ this.set.remove(o); -+ -+ return this.list.remove(o); -+ } -+ -+ @Override -+ public boolean containsAll(Collection c) { -+ return this.set.containsAll(c); -+ } -+ -+ @Override -+ public boolean addAll(Collection c) { -+ this.set.addAll(c); -+ -+ return this.list.addAll(c); -+ } -+ -+ @Override -+ public boolean addAll(int index, Collection c) { -+ this.set.addAll(c); -+ -+ return this.list.addAll(index, c); -+ } -+ -+ @Override -+ public boolean removeAll(Collection c) { -+ this.set.removeAll(c); -+ -+ return this.list.removeAll(c); -+ } -+ -+ @Override -+ public boolean retainAll(Collection c) { -+ this.set.retainAll(c); -+ -+ return this.list.retainAll(c); -+ } -+ -+ @Override -+ public void clear() { -+ this.set.clear(); -+ this.list.clear(); -+ } -+ -+ @Override -+ public T get(int index) { -+ return this.list.get(index); -+ } -+ -+ @Override -+ public T set(int index, T element) { -+ T prev = this.list.set(index, element); -+ -+ if (prev != null) { -+ this.set.remove(prev); -+ } -+ -+ this.set.add(element); -+ -+ return prev; -+ } -+ -+ @Override -+ public void add(int index, T element) { -+ this.set.add(element); -+ -+ this.list.add(index, element); -+ } -+ -+ @Override -+ public T remove(int index) { -+ T prev = this.list.remove(index); -+ -+ if (prev != null) { -+ this.set.remove(prev); -+ } -+ -+ return prev; -+ } -+ -+ @Override -+ public int indexOf(Object o) { -+ return this.list.indexOf(o); -+ } -+ -+ @Override -+ public int lastIndexOf(Object o) { -+ return this.list.lastIndexOf(o); -+ } -+ -+ @Override -+ public ListIterator listIterator() { -+ return this.list.listIterator(); -+ } -+ -+ @Override -+ public ListIterator listIterator(int index) { -+ return this.list.listIterator(index); -+ } -+ -+ @Override -+ public List subList(int fromIndex, int toIndex) { -+ return this.list.subList(fromIndex, toIndex); -+ } -+ -+ public static HashedList wrapper(List list) { -+ return new HashedList<>(list, new ObjectArraySet<>(list)); -+ } -+} -\ No newline at end of file -diff --git a/src/main/java/net/minecraft/server/BiomeBase.java b/src/main/java/net/minecraft/server/BiomeBase.java -index ef6c85557..49ca5f8cc 100644 ---- a/src/main/java/net/minecraft/server/BiomeBase.java -+++ b/src/main/java/net/minecraft/server/BiomeBase.java -@@ -4,6 +4,8 @@ import com.google.common.collect.Lists; - import com.google.common.collect.Maps; - import com.google.common.collect.Sets; - import it.unimi.dsi.fastutil.longs.Long2FloatLinkedOpenHashMap; -+import me.jellysquid.mods.lithium.common.util.collections.HashedList; -+ - import java.util.Arrays; - import java.util.Iterator; - import java.util.List; -@@ -104,7 +106,7 @@ public abstract class BiomeBase { - for (j = 0; j < i; ++j) { - EnumCreatureType enumcreaturetype = aenumcreaturetype[j]; - -- this.v.put(enumcreaturetype, new MobList()); // Paper -+ this.v.put(enumcreaturetype, HashedList.wrapper(new MobList())); // Paper // YAPFA lithium change - } - - } else { --- -2.25.1.windows.1 - diff --git a/patches/server-old/0055-lithium-MixinTypeFilterableList.patch b/patches/server-old/0055-lithium-MixinTypeFilterableList.patch deleted file mode 100644 index b0304456..00000000 --- a/patches/server-old/0055-lithium-MixinTypeFilterableList.patch +++ /dev/null @@ -1,117 +0,0 @@ -From 481a33f0227035223a90855c9d90d9139ac8ed98 Mon Sep 17 00:00:00 2001 -From: tr7zw -Date: Tue, 12 May 2020 01:16:14 +0200 -Subject: [PATCH] lithium MixinTypeFilterableList - ---- - .../net/minecraft/server/EntitySlice.java | 97 +++++++++++++++++++ - 1 file changed, 97 insertions(+) - create mode 100644 src/main/java/net/minecraft/server/EntitySlice.java - -diff --git a/src/main/java/net/minecraft/server/EntitySlice.java b/src/main/java/net/minecraft/server/EntitySlice.java -new file mode 100644 -index 000000000..e61f53a15 ---- /dev/null -+++ b/src/main/java/net/minecraft/server/EntitySlice.java -@@ -0,0 +1,97 @@ -+package net.minecraft.server; -+ -+import java.util.AbstractCollection; -+import java.util.ArrayList; -+import java.util.Collection; -+import java.util.Collections; -+import java.util.Iterator; -+import java.util.List; -+import java.util.Map; -+import java.util.stream.Collectors; -+ -+import com.google.common.collect.Iterators; -+import com.google.common.collect.Lists; -+import com.google.common.collect.Maps; -+ -+public class EntitySlice extends AbstractCollection { -+ private final Map, List> a = Maps.newHashMap(); -+ private final Class b; -+ private final List c = Lists.newArrayList(); -+ -+ public EntitySlice(Class var0) { -+ this.b = var0; -+ this.a.put(var0, this.c); -+ } -+ -+ @Override -+ public boolean add(T var0) { -+ boolean var1 = false; -+ for (Map.Entry, List> var3 : this.a.entrySet()) { -+ if (!var3.getKey().isInstance(var0)) -+ continue; -+ var1 |= var3.getValue().add(var0); -+ } -+ return var1; -+ } -+ -+ @Override -+ public boolean remove(Object var0) { -+ boolean var1 = false; -+ for (Map.Entry, List> var3 : this.a.entrySet()) { -+ if (!var3.getKey().isInstance(var0)) -+ continue; -+ List var4 = var3.getValue(); -+ var1 |= var4.remove(var0); -+ } -+ return var1; -+ } -+ -+ @Override -+ public boolean contains(Object var0) { -+ return this.a(var0.getClass()).contains(var0); -+ } -+ -+ /** -+ * @reason Only perform the slow Class#isAssignableFrom(Class) if a list doesn't exist for the type, otherwise -+ * we can assume it's already valid. The slow-path code is moved to a separate method to help the JVM inline this. -+ * @author JellySquid -+ */ -+ public Collection a(Class var02) { -+ Collection collection = this.a.get(var02); -+ -+ if(collection == null) { -+ collection = createCollection(var02); -+ } -+ -+ return (Collection) Collections.unmodifiableCollection(collection); -+ } -+ -+ public Collection createCollection(Class var02) { -+ if (!this.b.isAssignableFrom(var02)) { -+ throw new IllegalArgumentException("Don't know how to search for " + var02); -+ } -+ List list = new ArrayList<>(); -+ -+ for (T allElement : this.c) { -+ if (var02.isInstance(allElement)) { -+ list.add(allElement); -+ } -+ } -+ -+ this.a.put(var02, list); -+ return list; -+ } -+ -+ @Override -+ public Iterator iterator() { -+ if (this.c.isEmpty()) { -+ return Collections.emptyIterator(); -+ } -+ return Iterators.unmodifiableIterator(this.c.iterator()); -+ } -+ -+ @Override -+ public int size() { -+ return this.c.size(); -+ } -+} -\ No newline at end of file --- -2.25.1.windows.1 - diff --git a/patches/server-old/0056-Item-stuck-sleep-config.patch b/patches/server-old/0056-Item-stuck-sleep-config.patch deleted file mode 100644 index 72b02c25..00000000 --- a/patches/server-old/0056-Item-stuck-sleep-config.patch +++ /dev/null @@ -1,41 +0,0 @@ -From d345be4dc0b8cd474190e7b819fa315d90c9eced Mon Sep 17 00:00:00 2001 -From: tr7zw -Date: Tue, 16 Jun 2020 17:29:20 +0200 -Subject: [PATCH] Item stuck sleep config - ---- - src/main/java/de/tr7zw/yapfa/YapfaConfig.java | 5 +++++ - src/main/java/net/minecraft/server/EntityItem.java | 2 +- - 2 files changed, 6 insertions(+), 1 deletion(-) - -diff --git a/src/main/java/de/tr7zw/yapfa/YapfaConfig.java b/src/main/java/de/tr7zw/yapfa/YapfaConfig.java -index 29587589c..78d21c2ea 100644 ---- a/src/main/java/de/tr7zw/yapfa/YapfaConfig.java -+++ b/src/main/java/de/tr7zw/yapfa/YapfaConfig.java -@@ -226,4 +226,9 @@ public class YapfaConfig { - pistonPushLimit = getInt("settings.pistonPushLimit", 12); - } - -+ public static int itemStuckSleepTicks = 1; -+ private static void itemStuckSleepTicks() { -+ itemStuckSleepTicks = getInt("settings.itemStuckSleepTicks", 1); -+ } -+ - } -\ No newline at end of file -diff --git a/src/main/java/net/minecraft/server/EntityItem.java b/src/main/java/net/minecraft/server/EntityItem.java -index 2926fbb95..42884fba1 100644 ---- a/src/main/java/net/minecraft/server/EntityItem.java -+++ b/src/main/java/net/minecraft/server/EntityItem.java -@@ -79,7 +79,7 @@ public class EntityItem extends Entity { - - if (this.world.isClientSide) { - this.noclip = false; -- } else { -+ } else if(!this.onGround || this.noclip || this.ticksLived % de.tr7zw.yapfa.YapfaConfig.itemStuckSleepTicks == 0) { // YAPFA - this.noclip = !this.world.getCubes(this); - if (this.noclip) { - this.k(this.locX(), (this.getBoundingBox().minY + this.getBoundingBox().maxY) / 2.0D, this.locZ()); --- -2.25.1.windows.1 - diff --git a/patches/server-old/0057-Option-for-simpler-Villagers.patch b/patches/server-old/0057-Option-for-simpler-Villagers.patch deleted file mode 100644 index 47cccceb..00000000 --- a/patches/server-old/0057-Option-for-simpler-Villagers.patch +++ /dev/null @@ -1,181 +0,0 @@ -From 203ec11528c759173d4c210127fe7c755dd285ca Mon Sep 17 00:00:00 2001 -From: tr7zw -Date: Fri, 19 Jun 2020 19:21:35 +0200 -Subject: [PATCH] Option for simpler Villagers - -Option to extremly simplefy the villager AI. ---- - src/main/java/de/tr7zw/yapfa/YapfaConfig.java | 10 +++ - .../net/minecraft/server/EntityVillager.java | 84 ++++++++++++++++++- - 2 files changed, 91 insertions(+), 3 deletions(-) - -diff --git a/src/main/java/de/tr7zw/yapfa/YapfaConfig.java b/src/main/java/de/tr7zw/yapfa/YapfaConfig.java -index 78d21c2ea..5af955493 100644 ---- a/src/main/java/de/tr7zw/yapfa/YapfaConfig.java -+++ b/src/main/java/de/tr7zw/yapfa/YapfaConfig.java -@@ -231,4 +231,14 @@ public class YapfaConfig { - itemStuckSleepTicks = getInt("settings.itemStuckSleepTicks", 1); - } - -+ public static boolean simplerVillagerBehavior = false; -+ private static void simplerVillagerBehavior() { -+ simplerVillagerBehavior = getBoolean("settings.villager.simplerVillagerBehavior", false); -+ } -+ -+ public static boolean villagersHideAtNight = false; -+ private static void villagersHideAtNight() { -+ villagersHideAtNight = getBoolean("settings.villager.villagersHideAtNight", false); -+ } -+ - } -\ No newline at end of file -diff --git a/src/main/java/net/minecraft/server/EntityVillager.java b/src/main/java/net/minecraft/server/EntityVillager.java -index 7da267d28..f875494b5 100644 ---- a/src/main/java/net/minecraft/server/EntityVillager.java -+++ b/src/main/java/net/minecraft/server/EntityVillager.java -@@ -6,6 +6,8 @@ import com.google.common.collect.ImmutableSet; - import com.mojang.datafixers.Dynamic; - import com.mojang.datafixers.types.DynamicOps; - import com.mojang.datafixers.util.Pair; -+ -+import de.tr7zw.yapfa.YapfaConfig; - import it.unimi.dsi.fastutil.ints.Int2ObjectMap; - import java.util.Iterator; - import java.util.List; -@@ -29,6 +31,9 @@ import org.bukkit.event.entity.VillagerReplenishTradeEvent; - - public class EntityVillager extends EntityVillagerAbstract implements ReputationHandler, VillagerDataHolder { - -+ //YAPFA -+ private boolean simplerVillagerBehavior = YapfaConfig.simplerVillagerBehavior; //get this during villager creation so a reloaded config doesn't get them into an invalid state -+ - private static final DataWatcherObject bz = DataWatcher.a(EntityVillager.class, DataWatcherRegistry.q); - public static final Map bx = ImmutableMap.of(Items.BREAD, 4, Items.POTATO, 1, Items.CARROT, 1, Items.BEETROOT, 1); - private static final Set bA = ImmutableSet.of(Items.BREAD, Items.POTATO, Items.CARROT, Items.WHEAT, Items.WHEAT_SEEDS, Items.BEETROOT, new Item[]{Items.BEETROOT_SEEDS}); -@@ -61,13 +66,51 @@ public class EntityVillager extends EntityVillagerAbstract implements Reputation - public EntityVillager(EntityTypes entitytypes, World world, VillagerType villagertype) { - super(entitytypes, world); - this.bG = new Reputation(); -- ((Navigation) this.getNavigation()).a(true); -- this.getNavigation().d(true); -+ if(!simplerVillagerBehavior) { -+ ((Navigation) this.getNavigation()).a(true); -+ this.getNavigation().d(true); -+ }else { -+ initPathfinder(); -+ } - this.setCanPickupLoot(true); - this.setVillagerData(this.getVillagerData().withType(villagertype).withProfession(VillagerProfession.NONE)); - this.bo = this.a(new Dynamic(DynamicOpsNBT.a, new NBTTagCompound())); -+ - } - -+ //YAPFA start -+ @Override -+ protected void initPathfinder() { -+ if(!simplerVillagerBehavior)return; -+ this.goalSelector.a(0, new PathfinderGoalFloat(this)); -+ if(YapfaConfig.villagersHideAtNight) { -+ this.goalSelector.a(0, new PathfinderGoalUseItem<>(this, PotionUtil.a(new ItemStack(Items.POTION), Potions.INVISIBILITY), SoundEffects.ENTITY_WANDERING_TRADER_DISAPPEARED, (entityvillagertrader) -> { -+ return !this.world.isDay() && !entityvillagertrader.isInvisible(); -+ })); -+ this.goalSelector.a(0, new PathfinderGoalUseItem<>(this, new ItemStack(Items.MILK_BUCKET), SoundEffects.ENTITY_WANDERING_TRADER_REAPPEARED, (entityvillagertrader) -> { -+ return this.world.isDay() && entityvillagertrader.isInvisible(); -+ })); -+ } -+ this.goalSelector.a(1, new PathfinderGoalTradeWithPlayer(this)); -+ this.goalSelector.a(1, new PathfinderGoalAvoidTarget<>(this, EntityZombie.class, 8.0F, 0.5D, 0.5D)); -+ this.goalSelector.a(1, new PathfinderGoalAvoidTarget<>(this, EntityEvoker.class, 12.0F, 0.5D, 0.5D)); -+ this.goalSelector.a(1, new PathfinderGoalAvoidTarget<>(this, EntityVindicator.class, 8.0F, 0.5D, 0.5D)); -+ this.goalSelector.a(1, new PathfinderGoalAvoidTarget<>(this, EntityVex.class, 8.0F, 0.5D, 0.5D)); -+ this.goalSelector.a(1, new PathfinderGoalAvoidTarget<>(this, EntityPillager.class, 15.0F, 0.5D, 0.5D)); -+ this.goalSelector.a(1, new PathfinderGoalAvoidTarget<>(this, EntityIllagerIllusioner.class, 12.0F, 0.5D, 0.5D)); -+ this.goalSelector.a(1, new PathfinderGoalPanic(this, 0.5D)); -+ this.goalSelector.a(1, new PathfinderGoalLookAtTradingPlayer(this)); -+ this.goalSelector.a(2, new PathfinderGoalStrollVillage(this, 0.6D)); -+ this.goalSelector.a(3, new PathfinderGoalMoveThroughVillage(this, 0.6D, false, 4, () -> { -+ return false; -+ })); -+ this.goalSelector.a(4, new PathfinderGoalMoveTowardsRestriction(this, 0.35D)); -+ this.goalSelector.a(8, new PathfinderGoalRandomStrollLand(this, 0.35D)); -+ this.goalSelector.a(9, new PathfinderGoalInteract(this, EntityHuman.class, 3.0F, 1.0F)); -+ this.goalSelector.a(10, new PathfinderGoalLookAtPlayer(this, EntityInsentient.class, 8.0F)); -+ } -+ //YAPFA end -+ - @Override - public BehaviorController getBehaviorController() { - return (BehaviorController) super.getBehaviorController(); // CraftBukkit - decompile error -@@ -75,6 +118,7 @@ public class EntityVillager extends EntityVillagerAbstract implements Reputation - - @Override - protected BehaviorController a(Dynamic dynamic) { -+ if(simplerVillagerBehavior)return super.a(dynamic); //YAPFA Don't use behaviorcontroller for simple Villagers - BehaviorController behaviorcontroller = new BehaviorController<>(EntityVillager.bN, EntityVillager.bO, dynamic); - - this.a(behaviorcontroller); -@@ -153,12 +197,44 @@ public class EntityVillager extends EntityVillagerAbstract implements Reputation - } - // Spigot End - -+ // YAPFA start -+ private VillagerProfession getRandomProfession() { -+ int type = random.nextInt(13); -+ switch(type) { -+ case 0: return VillagerProfession.ARMORER; -+ case 1: return VillagerProfession.BUTCHER; -+ case 2: return VillagerProfession.CARTOGRAPHER; -+ case 3: return VillagerProfession.CLERIC; -+ case 4: return VillagerProfession.FARMER; -+ case 5: return VillagerProfession.FISHERMAN; -+ case 6: return VillagerProfession.FLETCHER; -+ case 7: return VillagerProfession.LEATHERWORKER; -+ case 8: return VillagerProfession.LIBRARIAN; -+ case 9: return VillagerProfession.MASON; -+ case 10: return VillagerProfession.SHEPHERD; -+ case 11: return VillagerProfession.TOOLSMITH; -+ case 12: return VillagerProfession.WEAPONSMITH; -+ default: return VillagerProfession.FARMER; -+ } -+ } -+ -+ // YAPFA end -+ - @Override // Paper start - tick trades while inactive - protected void mobTick() { mobTick(false); } - protected void mobTick(boolean inactive) { - // Paper end -+ // YAPFA start -+ if(simplerVillagerBehavior && this.getVillagerData().getProfession() == VillagerProfession.NONE) -+ this.setVillagerData(this.getVillagerData().withProfession(getRandomProfession())); -+ if(simplerVillagerBehavior) { -+ if (eF()) { -+ eE(); -+ } -+ } -+ // YAPFA end - this.world.getMethodProfiler().enter("brain"); -- if (!inactive) this.getBehaviorController().a((WorldServer) this.world, this); // CraftBukkit - decompile error // Paper -+ if(!simplerVillagerBehavior) if (!inactive) this.getBehaviorController().a((WorldServer) this.world, this); // CraftBukkit - decompile error // Paper // YAPFA - this.world.getMethodProfiler().exit(); - if (!this.et() && this.bB > 0) { - --this.bB; -@@ -556,6 +632,7 @@ public class EntityVillager extends EntityVillagerAbstract implements Reputation - } - - private void a(Entity entity) { -+ if(simplerVillagerBehavior)return; // YAPFA - if (this.world instanceof WorldServer) { - Optional> optional = this.bo.getMemory(MemoryModuleType.VISIBLE_MOBS); - -@@ -572,6 +649,7 @@ public class EntityVillager extends EntityVillagerAbstract implements Reputation - } - - public void a(MemoryModuleType memorymoduletype) { -+ if(simplerVillagerBehavior)return; // YAPFA - if (this.world instanceof WorldServer) { - MinecraftServer minecraftserver = ((WorldServer) this.world).getMinecraftServer(); - --- -2.25.1.windows.1 - diff --git a/patches/server-old/0058-Heavily-optimize-furnance-fuel-and-recipe-lookups.patch b/patches/server-old/0058-Heavily-optimize-furnance-fuel-and-recipe-lookups.patch deleted file mode 100644 index b8af8d88..00000000 --- a/patches/server-old/0058-Heavily-optimize-furnance-fuel-and-recipe-lookups.patch +++ /dev/null @@ -1,77 +0,0 @@ -From fc57ac7c185f3eb5c2805f25344b868babeb5310 Mon Sep 17 00:00:00 2001 -From: tr7zw -Date: Thu, 25 Jun 2020 23:40:12 +0200 -Subject: [PATCH] Heavily optimize furnance fuel and recipe lookups - ---- - .../net/minecraft/server/CraftingManager.java | 7 ++++++ - .../minecraft/server/TileEntityFurnace.java | 22 +++++++++++++++++++ - 2 files changed, 29 insertions(+) - -diff --git a/src/main/java/net/minecraft/server/CraftingManager.java b/src/main/java/net/minecraft/server/CraftingManager.java -index 15e2439d6..e226e0069 100644 ---- a/src/main/java/net/minecraft/server/CraftingManager.java -+++ b/src/main/java/net/minecraft/server/CraftingManager.java -@@ -87,6 +87,13 @@ public class CraftingManager extends ResourceDataJson { - - public > Optional craft(Recipes recipes, C c0, World world) { - // YAPFA start -+ if(c0.getCurrentRecipe() != null) { -+ Optional optional = recipes.a(c0.getCurrentRecipe(), world, c0); -+ if(optional.isPresent()) { -+ c0.setCurrentRecipe(optional.get()); -+ return optional; -+ } -+ } - for(IRecipe rep : this.a(recipes).values()) { - Optional optional = recipes.a(rep, world, c0); - if(optional.isPresent()) { -diff --git a/src/main/java/net/minecraft/server/TileEntityFurnace.java b/src/main/java/net/minecraft/server/TileEntityFurnace.java -index 7d50b7056..9299148a8 100644 ---- a/src/main/java/net/minecraft/server/TileEntityFurnace.java -+++ b/src/main/java/net/minecraft/server/TileEntityFurnace.java -@@ -97,7 +97,13 @@ public abstract class TileEntityFurnace extends TileEntityContainer implements I - this.c = recipes; - } - -+ //YAPFA -+ private static Map cachedFuelMap = null; -+ - public static Map f() { -+ if(cachedFuelMap != null) { -+ return cachedFuelMap; // YAPFA -+ } - Map map = Maps.newLinkedHashMap(); - - a(map, (IMaterial) Items.LAVA_BUCKET, 20000); -@@ -160,6 +166,7 @@ public abstract class TileEntityFurnace extends TileEntityContainer implements I - a(map, (IMaterial) Blocks.FLETCHING_TABLE, 300); - a(map, (IMaterial) Blocks.SMITHING_TABLE, 300); - a(map, (IMaterial) Blocks.COMPOSTER, 300); -+ cachedFuelMap = map; // YAPFA - return map; - } - -@@ -594,4 +601,19 @@ public abstract class TileEntityFurnace extends TileEntityContainer implements I - } - - } -+ -+ // YAPFA start -+ private IRecipe cachedRecipe = null; -+ @Override -+ public IRecipe getCurrentRecipe() { -+ return cachedRecipe; -+ } -+ @Override -+ public void setCurrentRecipe(IRecipe recipe) { -+ cachedRecipe = recipe; -+ } -+ -+ -+ // YAPFA end -+ - } --- -2.25.1.windows.1 - diff --git a/patches/server-old/0059-Optimize-Hopper-logic.patch b/patches/server-old/0059-Optimize-Hopper-logic.patch deleted file mode 100644 index 02e77c40..00000000 --- a/patches/server-old/0059-Optimize-Hopper-logic.patch +++ /dev/null @@ -1,329 +0,0 @@ -From 5f2f5a3294c8d2e71c9459f0f88c272c477b6848 Mon Sep 17 00:00:00 2001 -From: tr7zw -Date: Fri, 26 Jun 2020 01:11:47 +0200 -Subject: [PATCH] Optimize Hopper logic - ---- - .../net/minecraft/server/BlockHopper.java | 229 ++++++++++++++++++ - .../minecraft/server/TileEntityHopper.java | 36 ++- - 2 files changed, 261 insertions(+), 4 deletions(-) - create mode 100644 src/main/java/net/minecraft/server/BlockHopper.java - -diff --git a/src/main/java/net/minecraft/server/BlockHopper.java b/src/main/java/net/minecraft/server/BlockHopper.java -new file mode 100644 -index 000000000..63e024e9d ---- /dev/null -+++ b/src/main/java/net/minecraft/server/BlockHopper.java -@@ -0,0 +1,229 @@ -+package net.minecraft.server; -+ -+import java.util.OptionalInt; -+import net.minecraft.server.Block; -+import net.minecraft.server.BlockActionContext; -+import net.minecraft.server.BlockPosition; -+import net.minecraft.server.BlockProperties; -+import net.minecraft.server.BlockStateBoolean; -+import net.minecraft.server.BlockStateDirection; -+import net.minecraft.server.BlockStateList; -+import net.minecraft.server.BlockTileEntity; -+import net.minecraft.server.Container; -+import net.minecraft.server.Entity; -+import net.minecraft.server.EntityHuman; -+import net.minecraft.server.EntityLiving; -+import net.minecraft.server.EnumBlockMirror; -+import net.minecraft.server.EnumBlockRotation; -+import net.minecraft.server.EnumDirection; -+import net.minecraft.server.EnumHand; -+import net.minecraft.server.EnumInteractionResult; -+import net.minecraft.server.EnumRenderType; -+import net.minecraft.server.IBlockAccess; -+import net.minecraft.server.IBlockData; -+import net.minecraft.server.IBlockDataHolder; -+import net.minecraft.server.IBlockState; -+import net.minecraft.server.IChatBaseComponent; -+import net.minecraft.server.IHopper; -+import net.minecraft.server.IInventory; -+import net.minecraft.server.ITileInventory; -+import net.minecraft.server.InventoryUtils; -+import net.minecraft.server.ItemStack; -+import net.minecraft.server.MinecraftKey; -+import net.minecraft.server.MovingObjectPositionBlock; -+import net.minecraft.server.OperatorBoolean; -+import net.minecraft.server.PathMode; -+import net.minecraft.server.StatisticList; -+import net.minecraft.server.TileEntity; -+import net.minecraft.server.TileEntityHopper; -+import net.minecraft.server.VoxelShape; -+import net.minecraft.server.VoxelShapeCollision; -+import net.minecraft.server.VoxelShapes; -+import net.minecraft.server.World; -+ -+public class BlockHopper extends BlockTileEntity { -+ public static final BlockStateDirection FACING = BlockProperties.M; -+ public static final BlockStateBoolean ENABLED = BlockProperties.f; -+ private static final VoxelShape c = Block.a((double) 0.0, (double) 10.0, (double) 0.0, (double) 16.0, (double) 16.0, -+ (double) 16.0); -+ private static final VoxelShape d = Block.a((double) 4.0, (double) 4.0, (double) 4.0, (double) 12.0, (double) 10.0, -+ (double) 12.0); -+ private static final VoxelShape e = VoxelShapes.a((VoxelShape) d, (VoxelShape) c); -+ private static final VoxelShape f = VoxelShapes.a((VoxelShape) e, (VoxelShape) IHopper.a, -+ (OperatorBoolean) OperatorBoolean.ONLY_FIRST); -+ private static final VoxelShape g = VoxelShapes.a((VoxelShape) f, -+ (VoxelShape) Block.a((double) 6.0, (double) 0.0, (double) 6.0, (double) 10.0, (double) 4.0, (double) 10.0)); -+ private static final VoxelShape h = VoxelShapes.a((VoxelShape) f, (VoxelShape) Block.a((double) 12.0, (double) 4.0, -+ (double) 6.0, (double) 16.0, (double) 8.0, (double) 10.0)); -+ private static final VoxelShape i = VoxelShapes.a((VoxelShape) f, -+ (VoxelShape) Block.a((double) 6.0, (double) 4.0, (double) 0.0, (double) 10.0, (double) 8.0, (double) 4.0)); -+ private static final VoxelShape j = VoxelShapes.a((VoxelShape) f, (VoxelShape) Block.a((double) 6.0, (double) 4.0, -+ (double) 12.0, (double) 10.0, (double) 8.0, (double) 16.0)); -+ private static final VoxelShape k = VoxelShapes.a((VoxelShape) f, -+ (VoxelShape) Block.a((double) 0.0, (double) 4.0, (double) 6.0, (double) 4.0, (double) 8.0, (double) 10.0)); -+ private static final VoxelShape w = IHopper.a; -+ private static final VoxelShape x = VoxelShapes.a((VoxelShape) IHopper.a, (VoxelShape) Block.a((double) 12.0, -+ (double) 8.0, (double) 6.0, (double) 16.0, (double) 10.0, (double) 10.0)); -+ private static final VoxelShape y = VoxelShapes.a((VoxelShape) IHopper.a, -+ (VoxelShape) Block.a((double) 6.0, (double) 8.0, (double) 0.0, (double) 10.0, (double) 10.0, (double) 4.0)); -+ private static final VoxelShape z = VoxelShapes.a((VoxelShape) IHopper.a, (VoxelShape) Block.a((double) 6.0, -+ (double) 8.0, (double) 12.0, (double) 10.0, (double) 10.0, (double) 16.0)); -+ private static final VoxelShape A = VoxelShapes.a((VoxelShape) IHopper.a, -+ (VoxelShape) Block.a((double) 0.0, (double) 8.0, (double) 6.0, (double) 4.0, (double) 10.0, (double) 10.0)); -+ -+ public BlockHopper(Block.Info var0) { -+ super(var0); -+ this.p((IBlockData) ((IBlockData) ((IBlockData) this.blockStateList.getBlockData()).set((IBlockState) FACING, -+ (Comparable) EnumDirection.DOWN)).set((IBlockState) ENABLED, (Comparable) Boolean.valueOf(true))); -+ } -+ -+ public VoxelShape a(IBlockData var0, IBlockAccess var1, BlockPosition var2, VoxelShapeCollision var3) { -+ switch ((EnumDirection) var0.get((IBlockState) FACING)) { -+ case DOWN : { -+ return g; -+ } -+ case NORTH : { -+ return i; -+ } -+ case SOUTH : { -+ return j; -+ } -+ case WEST : { -+ return k; -+ } -+ case EAST : { -+ return h; -+ } -+ } -+ return f; -+ } -+ -+ public VoxelShape j(IBlockData var0, IBlockAccess var1, BlockPosition var2) { -+ switch ((EnumDirection) var0.get((IBlockState) FACING)) { -+ case DOWN : { -+ return w; -+ } -+ case NORTH : { -+ return y; -+ } -+ case SOUTH : { -+ return z; -+ } -+ case WEST : { -+ return A; -+ } -+ case EAST : { -+ return x; -+ } -+ } -+ return IHopper.a; -+ } -+ -+ public IBlockData getPlacedState(BlockActionContext var0) { -+ EnumDirection var1; -+ return (IBlockData) ((IBlockData) this.getBlockData().set((IBlockState) FACING, -+ (Comparable) ((var1 = var0.getClickedFace().opposite()).m() == EnumDirection.EnumAxis.Y -+ ? EnumDirection.DOWN -+ : var1))).set((IBlockState) ENABLED, (Comparable) Boolean.valueOf(true)); -+ } -+ -+ public TileEntity createTile(IBlockAccess var0) { -+ return new TileEntityHopper(); -+ } -+ -+ public void postPlace(World var0, BlockPosition var1, IBlockData var2, EntityLiving var3, ItemStack var4) { -+ TileEntity var5; -+ if (var4.hasName() && (var5 = var0.getTileEntity(var1)) instanceof TileEntityHopper) { -+ ((TileEntityHopper) var5).setCustomName(var4.getName()); -+ } -+ } -+ -+ public void onPlace(IBlockData var0, World var1, BlockPosition var2, IBlockData var3, boolean var4) { -+ if (var3.getBlock() == var0.getBlock()) { -+ return; -+ } -+ this.a(var1, var2, var0); -+ } -+ -+ public EnumInteractionResult interact(IBlockData var0, World var1, BlockPosition var2, EntityHuman var3, -+ EnumHand var4, MovingObjectPositionBlock var5) { -+ if (var1.isClientSide) { -+ return EnumInteractionResult.SUCCESS; -+ } -+ TileEntity var6 = var1.getTileEntity(var2); -+ if (var6 instanceof TileEntityHopper) { -+ var3.openContainer((ITileInventory) ((TileEntityHopper) var6)); -+ var3.a(StatisticList.INSPECT_HOPPER); -+ } -+ return EnumInteractionResult.SUCCESS; -+ } -+ -+ public void doPhysics(IBlockData var0, World var1, BlockPosition var2, Block var3, BlockPosition var4, -+ boolean var5) { -+ this.a(var1, var2, var0); -+ //YAPFA start -+ TileEntity tileEntity = var1.getTileEntity(var2); -+ if (tileEntity instanceof TileEntityHopper) { -+ ((TileEntityHopper)tileEntity).flushCaches(); -+ } -+ // YAPFA end -+ } -+ -+ private void a(World var0, BlockPosition var1, IBlockData var2) { -+ boolean var3; -+ boolean bl = var3 = !var0.isBlockIndirectlyPowered(var1); -+ if (var3 != (Boolean) var2.get((IBlockState) ENABLED)) { -+ var0.setTypeAndData(var1, (IBlockData) var2.set((IBlockState) ENABLED, (Comparable) Boolean.valueOf(var3)), -+ 4); -+ } -+ } -+ -+ public void remove(IBlockData var0, World var1, BlockPosition var2, IBlockData var3, boolean var4) { -+ if (var0.getBlock() == var3.getBlock()) { -+ return; -+ } -+ TileEntity var5 = var1.getTileEntity(var2); -+ if (var5 instanceof TileEntityHopper) { -+ InventoryUtils.dropInventory((World) var1, (BlockPosition) var2, (IInventory) ((TileEntityHopper) var5)); -+ var1.updateAdjacentComparators(var2, (Block) this); -+ } -+ super.remove(var0, var1, var2, var3, var4); -+ } -+ -+ public EnumRenderType c(IBlockData var0) { -+ return EnumRenderType.MODEL; -+ } -+ -+ public boolean isComplexRedstone(IBlockData var0) { -+ return true; -+ } -+ -+ public int a(IBlockData var0, World var1, BlockPosition var2) { -+ return Container.a((TileEntity) var1.getTileEntity(var2)); -+ } -+ -+ public IBlockData a(IBlockData var0, EnumBlockRotation var1) { -+ return (IBlockData) var0.set((IBlockState) FACING, -+ (Comparable) var1.a((EnumDirection) var0.get((IBlockState) FACING))); -+ } -+ -+ public IBlockData a(IBlockData var0, EnumBlockMirror var1) { -+ return var0.a(var1.a((EnumDirection) var0.get((IBlockState) FACING))); -+ } -+ -+ protected void a(BlockStateList.a var0) { -+ var0.a(new IBlockState[]{FACING, ENABLED}); -+ } -+ -+ public void a(IBlockData var0, World var1, BlockPosition var2, Entity var3) { -+ TileEntity var4 = var1.getTileEntity(var2); -+ if (var4 instanceof TileEntityHopper) { -+ ((TileEntityHopper) var4).a(var3); -+ } -+ } -+ -+ public boolean a(IBlockData var0, IBlockAccess var1, BlockPosition var2, PathMode var3) { -+ return false; -+ } -+ -+} -\ No newline at end of file -diff --git a/src/main/java/net/minecraft/server/TileEntityHopper.java b/src/main/java/net/minecraft/server/TileEntityHopper.java -index c755faed4..0e5ee991b 100644 ---- a/src/main/java/net/minecraft/server/TileEntityHopper.java -+++ b/src/main/java/net/minecraft/server/TileEntityHopper.java -@@ -2,6 +2,7 @@ package net.minecraft.server; - - import java.util.Iterator; - import java.util.List; -+import java.util.Optional; - import java.util.function.Supplier; - import java.util.stream.Collectors; - import java.util.stream.IntStream; -@@ -611,14 +612,28 @@ public class TileEntityHopper extends TileEntityLootable implements IHopper, ITi - - @Nullable - private IInventory k() { -+ if(this.cachedPush != null)return this.cachedPush; - EnumDirection enumdirection = (EnumDirection) this.getBlock().get(BlockHopper.FACING); - -- return b(this.getWorld(), this.position.shift(enumdirection)); -+ this.cachedPush = b(this.getWorld(), this.position.shift(enumdirection)); -+ return this.cachedPush; - } - - @Nullable - public static IInventory b(IHopper ihopper) { -- return a(ihopper.getWorld(), ihopper.z(), ihopper.A() + 1.0D, ihopper.B()); -+ //YAPFA start -+ if(ihopper instanceof TileEntityHopper) { -+ TileEntityHopper hopper = (TileEntityHopper) ihopper; -+ if(hopper.cachedAbove != null) { -+ return hopper.cachedAbove; -+ } -+ IInventory inv = a(ihopper.getWorld(), ihopper.z(), ihopper.A() + 1.0D, ihopper.B()); -+ hopper.cachedAbove = inv; -+ return inv; -+ }else { -+ return a(ihopper.getWorld(), ihopper.z(), ihopper.A() + 1.0D, ihopper.B()); -+ } -+ //YAPFA end - } - - public static List c(IHopper ihopper) { -@@ -658,7 +673,7 @@ public class TileEntityHopper extends TileEntityLootable implements IHopper, ITi - } - } - } -- -+ - if (object == null && (!optimizeEntities || !org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(block).isOccluding())) { // Paper - List list = world.getEntities((Entity) null, new AxisAlignedBB(d0 - 0.5D, d1 - 0.5D, d2 - 0.5D, d0 + 0.5D, d1 + 0.5D, d2 + 0.5D), IEntitySelector.d); - -@@ -666,7 +681,7 @@ public class TileEntityHopper extends TileEntityLootable implements IHopper, ITi - object = (IInventory) list.get(world.random.nextInt(list.size())); - } - } -- -+ - return (IInventory) object; - } - -@@ -728,4 +743,17 @@ public class TileEntityHopper extends TileEntityLootable implements IHopper, ITi - protected Container createContainer(int i, PlayerInventory playerinventory) { - return new ContainerHopper(i, playerinventory, this); - } -+ -+ // YAPFA start -+ -+ private IInventory cachedAbove = null; -+ private IInventory cachedPush = null; -+ -+ public void flushCaches() { -+ cachedAbove = null; -+ cachedPush = null; -+ } -+ -+ // YAPFA end -+ - } --- -2.25.1.windows.1 - diff --git a/patches/server-old/0002-Brandings.patch b/patches/server/0002-Brandings.patch similarity index 93% rename from patches/server-old/0002-Brandings.patch rename to patches/server/0002-Brandings.patch index 091b38d4..04c1a4c6 100644 --- a/patches/server-old/0002-Brandings.patch +++ b/patches/server/0002-Brandings.patch @@ -1,4 +1,4 @@ -From 30d59c2a98c12d62b63dcbd48db70bab1a06fb65 Mon Sep 17 00:00:00 2001 +From cc5313e0e8db5f4110b990ed6aa41f4373951d30 Mon Sep 17 00:00:00 2001 From: tr7zw Date: Wed, 26 Feb 2020 18:37:34 +0100 Subject: [PATCH] Brandings @@ -53,10 +53,10 @@ index 000000000..b7a73408e +} \ No newline at end of file diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 3c9392077..f0959d301 100644 +index 0ccfc0729..e1373f2c0 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1630,7 +1630,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant Date: Wed, 26 Feb 2020 21:39:58 +0100 Subject: [PATCH] Don't save Fireworks and Arrows @@ -8,13 +8,13 @@ Subject: [PATCH] Don't save Fireworks and Arrows 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java -index 37f854764..6d62a1af5 100644 +index 2b9c0105f..b28b668bd 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java -@@ -1763,7 +1763,8 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke +@@ -1719,7 +1719,8 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke } - public boolean c(NBTTagCompound nbttagcompound) { + public boolean a_(NBTTagCompound nbttagcompound) { - String s = this.getSaveID(); + if(this instanceof EntityFireworks || this instanceof EntityArrow)return false; // YAPFA + String s = this.getSaveID(); diff --git a/patches/server-old/0031-Add-GameProfileLookupEvent.patch b/patches/server/0004-Add-GameProfileLookupEvent.patch similarity index 81% rename from patches/server-old/0031-Add-GameProfileLookupEvent.patch rename to patches/server/0004-Add-GameProfileLookupEvent.patch index 704d8fd0..1c72a299 100644 --- a/patches/server-old/0031-Add-GameProfileLookupEvent.patch +++ b/patches/server/0004-Add-GameProfileLookupEvent.patch @@ -1,15 +1,15 @@ -From 0317ae3d5823e21bb23b654753463efae5deb2a0 Mon Sep 17 00:00:00 2001 +From 4f0a395b13722946811e1453770f69bf6d70641e Mon Sep 17 00:00:00 2001 From: tr7zw Date: Wed, 26 Feb 2020 22:22:02 +0100 Subject: [PATCH] Add GameProfileLookupEvent --- - .../paper/profile/CraftPlayerProfile.java | 22 ++++++++++++++----- - .../net/minecraft/server/TileEntitySkull.java | 15 ++++++++++++- - 2 files changed, 31 insertions(+), 6 deletions(-) + .../paper/profile/CraftPlayerProfile.java | 26 ++++++++++++++----- + .../net/minecraft/server/TileEntitySkull.java | 15 ++++++++++- + 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/destroystokyo/paper/profile/CraftPlayerProfile.java b/src/main/java/com/destroystokyo/paper/profile/CraftPlayerProfile.java -index 00b7630cc..74ffeab50 100644 +index d73de9eb8..8b9c017bd 100644 --- a/src/main/java/com/destroystokyo/paper/profile/CraftPlayerProfile.java +++ b/src/main/java/com/destroystokyo/paper/profile/CraftPlayerProfile.java @@ -5,9 +5,13 @@ import com.google.common.base.Charsets; @@ -26,15 +26,17 @@ index 00b7630cc..74ffeab50 100644 import org.bukkit.craftbukkit.entity.CraftPlayer; import org.spigotmc.SpigotConfig; -@@ -183,11 +187,19 @@ public class CraftPlayerProfile implements PlayerProfile { +@@ -183,13 +187,21 @@ public class CraftPlayerProfile implements PlayerProfile { - boolean isCompleteFromCache = this.completeFromCache(false, onlineMode); + boolean isCompleteFromCache = this.completeFromCache(true, onlineMode); if (onlineMode && (!isCompleteFromCache || textures && !hasTextures())) { - GameProfile result = server.getSessionService().fillProfileProperties(profile, true); - if (result != null) { - copyProfileProperties(result, this.profile, true); - } -- server.getUserCache().saveProfile(this.profile); +- if (this.profile.isComplete()) { +- server.getUserCache().saveProfile(this.profile); +- } + // YAPFA start + GameProfileLookupEvent event = new GameProfileLookupEvent(!Bukkit.isPrimaryThread(), profile.getId(), profile.getName()); + Bukkit.getServer().getPluginManager().callEvent(event); @@ -45,14 +47,16 @@ index 00b7630cc..74ffeab50 100644 + if (result != null) { + copyProfileProperties(result, this.profile, true); + } -+ server.getUserCache().saveProfile(this.profile); ++ if (this.profile.isComplete()) { ++ server.getUserCache().saveProfile(this.profile); ++ } + } + // YAPFA end } return profile.isComplete() && (!onlineMode || !textures || hasTextures()); } diff --git a/src/main/java/net/minecraft/server/TileEntitySkull.java b/src/main/java/net/minecraft/server/TileEntitySkull.java -index 93030a7b2..8bd78ef91 100644 +index fb7aa15c2..7d7ab2fc0 100644 --- a/src/main/java/net/minecraft/server/TileEntitySkull.java +++ b/src/main/java/net/minecraft/server/TileEntitySkull.java @@ -4,9 +4,14 @@ import com.google.common.collect.Iterables; @@ -70,7 +74,7 @@ index 93030a7b2..8bd78ef91 100644 // Spigot start import com.google.common.base.Predicate; import com.google.common.cache.LoadingCache; -@@ -74,7 +79,15 @@ public class TileEntitySkull extends TileEntity /*implements ITickable*/ { // Pa +@@ -77,7 +82,15 @@ public class TileEntitySkull extends TileEntity /*implements ITickable*/ { // Pa if ( property == null ) { diff --git a/patches/server-old/0032-Add-getLastTickMs-api.patch b/patches/server/0005-Add-getLastTickMs-api.patch similarity index 75% rename from patches/server-old/0032-Add-getLastTickMs-api.patch rename to patches/server/0005-Add-getLastTickMs-api.patch index b0eca8ad..f3b20d88 100644 --- a/patches/server-old/0032-Add-getLastTickMs-api.patch +++ b/patches/server/0005-Add-getLastTickMs-api.patch @@ -1,54 +1,50 @@ -From 62ec7712ed6ecad895b32d7968ff4200110af0ec Mon Sep 17 00:00:00 2001 +From 24155adba5a1a7cadfcf0a61c3e0d8f77cd8509b Mon Sep 17 00:00:00 2001 From: tr7zw Date: Thu, 5 Mar 2020 21:13:33 +0100 Subject: [PATCH] Add getLastTickMs() api --- - src/main/java/net/minecraft/server/MinecraftServer.java | 7 +++++++ + src/main/java/net/minecraft/server/MinecraftServer.java | 5 +++++ src/main/java/org/bukkit/craftbukkit/CraftServer.java | 9 +++++++++ src/main/java/org/spigotmc/TicksPerSecondCommand.java | 2 +- - 3 files changed, 17 insertions(+), 1 deletion(-) + 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 16535da3e..f41584b85 100644 +index e1373f2c0..9bb5e0c98 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -901,6 +901,8 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant