diff --git a/SteamWar-Patches/Chaos-Patches.patch b/SteamWar-Patches/Chaos-Patches.patch
new file mode 100644
index 0000000..75d2030
--- /dev/null
+++ b/SteamWar-Patches/Chaos-Patches.patch
@@ -0,0 +1,1389 @@
+Index: pom.xml
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+diff --git a/pom.xml b/pom.xml
+--- a/pom.xml (revision 22fba2706e53d3d24a5901b2881c3d97f9781f34)
++++ b/pom.xml (revision a16617e368c59c772e5873c8c3a4040444e4ea57)
+@@ -345,6 +345,7 @@
+
+
+
++ spigot
+
+
+
+Index: src/main/java/net/minecraft/server/CommandDispatcher.java
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+diff --git a/src/main/java/net/minecraft/server/CommandDispatcher.java b/src/main/java/net/minecraft/server/CommandDispatcher.java
+--- a/src/main/java/net/minecraft/server/CommandDispatcher.java (revision 22fba2706e53d3d24a5901b2881c3d97f9781f34)
++++ b/src/main/java/net/minecraft/server/CommandDispatcher.java (revision a16617e368c59c772e5873c8c3a4040444e4ea57)
+@@ -7,7 +7,6 @@
+ import com.mojang.brigadier.builder.ArgumentBuilder;
+ import com.mojang.brigadier.builder.LiteralArgumentBuilder;
+ import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+-import com.mojang.brigadier.context.CommandContext;
+ import com.mojang.brigadier.exceptions.CommandSyntaxException;
+ import com.mojang.brigadier.tree.CommandNode;
+ import com.mojang.brigadier.tree.RootCommandNode;
+@@ -22,7 +21,6 @@
+ // CraftBukkit start
+ import com.google.common.base.Joiner;
+ import java.util.LinkedHashSet;
+-import org.bukkit.craftbukkit.command.VanillaCommandWrapper;
+ import org.bukkit.event.player.PlayerCommandSendEvent;
+ import org.bukkit.event.server.ServerCommandEvent;
+ // CraftBukkit end
+@@ -34,79 +32,18 @@
+
+ // CraftBukkit start
+ public final CommandDispatcher init(boolean flag) {
+- CommandAdvancement.a(this.b);
+- CommandExecute.a(this.b);
+- CommandBossBar.a(this.b);
+ CommandClear.a(this.b);
+- CommandClone.a(this.b);
+- CommandData.a(this.b);
+- CommandDatapack.a(this.b);
+- CommandDebug.a(this.b);
+ CommandGamemodeDefault.a(this.b);
+- CommandDifficulty.a(this.b);
+- CommandEffect.a(this.b);
+- CommandMe.a(this.b);
+- CommandEnchant.a(this.b);
+- CommandXp.a(this.b);
+- CommandFill.a(this.b);
+- CommandForceload.a(this.b);
+- CommandFunction.a(this.b);
+ CommandGamemode.a(this.b);
+ CommandGamerule.a(this.b);
+ CommandGive.a(this.b);
+ CommandHelp.a(this.b);
+- CommandKick.a(this.b);
+- CommandKill.a(this.b);
+- CommandList.a(this.b);
+- CommandLocate.a(this.b);
+- CommandLoot.a(this.b);
+- CommandTell.a(this.b);
+- CommandParticle.a(this.b);
+- CommandPlaySound.a(this.b);
+- CommandPublish.a(this.b);
+ CommandReload.a(this.b);
+- CommandRecipe.a(this.b);
+- CommandReplaceItem.a(this.b);
+- CommandSay.a(this.b);
+- CommandSchedule.a(this.b);
+- CommandScoreboard.a(this.b);
+- CommandSeed.a(this.b);
+- CommandSetBlock.a(this.b);
+- CommandSpawnpoint.a(this.b);
+- CommandSetWorldSpawn.a(this.b);
+ CommandSpectate.a(this.b);
+- CommandSpreadPlayers.a(this.b);
+- CommandStopSound.a(this.b);
+- CommandSummon.a(this.b);
+- CommandTag.a(this.b);
+- CommandTeam.a(this.b);
+- CommandTeamMsg.a(this.b);
+ CommandTeleport.a(this.b);
+- CommandTellRaw.a(this.b);
+ CommandTime.a(this.b);
+- CommandTitle.a(this.b);
+- CommandTrigger.a(this.b);
+- CommandWeather.a(this.b);
+- CommandWorldBorder.a(this.b);
+- if (SharedConstants.b) {
+- GameTestHarnessTestCommand.a(this.b);
+- }
+
+- if (flag) {
+- CommandBanIp.a(this.b);
+- CommandBanList.a(this.b);
+- CommandBan.a(this.b);
+- CommandDeop.a(this.b);
+- CommandOp.a(this.b);
+- CommandPardon.a(this.b);
+- CommandPardonIP.a(this.b);
+- CommandSaveAll.a(this.b);
+- CommandSaveOff.a(this.b);
+- CommandSaveOn.a(this.b);
+- CommandIdleTimeout.a(this.b);
+- CommandStop.a(this.b);
+- CommandWhitelist.a(this.b);
+- }
++ CommandStop.a(this.b);
+
+ this.b.findAmbiguities((commandnode, commandnode1, commandnode2, collection) -> {
+ // CommandDispatcher.LOGGER.warn("Ambiguity between arguments {} and {} with inputs: {}", this.b.getPath(commandnode1), this.b.getPath(commandnode2), collection); // CraftBukkit
+Index: src/main/java/net/minecraft/server/DedicatedServer.java
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+diff --git a/src/main/java/net/minecraft/server/DedicatedServer.java b/src/main/java/net/minecraft/server/DedicatedServer.java
+--- a/src/main/java/net/minecraft/server/DedicatedServer.java (revision 22fba2706e53d3d24a5901b2881c3d97f9781f34)
++++ b/src/main/java/net/minecraft/server/DedicatedServer.java (revision a16617e368c59c772e5873c8c3a4040444e4ea57)
+@@ -151,12 +151,13 @@
+ thread.setUncaughtExceptionHandler(new DefaultUncaughtExceptionHandler(DedicatedServer.LOGGER));
+ thread.start();
+ DedicatedServer.LOGGER.info("Starting minecraft server version " + SharedConstants.getGameVersion().getName());
+- if (Runtime.getRuntime().maxMemory() / 1024L / 1024L < 512L) {
+- DedicatedServer.LOGGER.warn("To start the server with more ram, launch it as \"java -Xmx1024M -Xms1024M -jar minecraft_server.jar\"");
+- }
+
+ DedicatedServer.LOGGER.info("Loading properties");
+ DedicatedServerProperties dedicatedserverproperties = this.propertyManager.getProperties();
++ long l = SystemUtils.getMonotonicNanos() - MinecraftServer.startNanos;
++ String s2 = String.format(Locale.ROOT, "%.3fs", (double) l / 1.0E9D);
++
++ DedicatedServer.LOGGER.info("({})! For loading properties", s2);
+
+ if (this.isEmbeddedServer()) {
+ this.b("127.0.0.1");
+@@ -170,6 +171,10 @@
+ org.spigotmc.SpigotConfig.init((File) options.valueOf("spigot-settings"));
+ org.spigotmc.SpigotConfig.registerCommands();
+ // Spigot end
++ l = SystemUtils.getMonotonicNanos() - MinecraftServer.startNanos;
++ s2 = String.format(Locale.ROOT, "%.3fs", (double) l / 1.0E9D);
++
++ DedicatedServer.LOGGER.info("({})! For loading spigot-settings", s2);
+
+ this.setSpawnAnimals(dedicatedserverproperties.spawnAnimals);
+ this.setSpawnNPCs(dedicatedserverproperties.spawnNpcs);
+@@ -194,6 +199,10 @@
+
+ DedicatedServer.LOGGER.info("Generating keypair");
+ this.a(MinecraftEncryption.b());
++ l = SystemUtils.getMonotonicNanos() - MinecraftServer.startNanos;
++ s2 = String.format(Locale.ROOT, "%.3fs", (double) l / 1.0E9D);
++
++ DedicatedServer.LOGGER.info("({})! For Encryption + Properties", s2);
+ DedicatedServer.LOGGER.info("Starting Minecraft server on {}:{}", this.getServerIp().isEmpty() ? "*" : this.getServerIp(), this.getPort());
+
+ try {
+@@ -208,8 +217,11 @@
+ // CraftBukkit start
+ // this.a((PlayerList) (new DedicatedPlayerList(this))); // Spigot - moved up
+ server.loadPlugins();
+- server.enablePlugins(org.bukkit.plugin.PluginLoadOrder.STARTUP);
+ // CraftBukkit end
++ l = SystemUtils.getMonotonicNanos() - MinecraftServer.startNanos;
++ s2 = String.format(Locale.ROOT, "%.3fs", (double) l / 1.0E9D);
++
++ DedicatedServer.LOGGER.info("({})! For loading Plugins", s2);
+
+ if (!this.getOnlineMode()) {
+ DedicatedServer.LOGGER.warn("**** SERVER IS RUNNING IN OFFLINE/INSECURE MODE!");
+@@ -233,7 +245,6 @@
+ return false;
+ } else {
+ this.convertable = new Convertable(server.getWorldContainer().toPath(), server.getWorldContainer().toPath().resolve("../backups"), this.dataConverterManager); // CraftBukkit - moved from MinecraftServer constructor
+- long i = SystemUtils.getMonotonicNanos();
+ String s = dedicatedserverproperties.levelSeed;
+ String s1 = dedicatedserverproperties.generatorSettings;
+ long j = (new Random()).nextLong();
+@@ -256,6 +267,10 @@
+ TileEntitySkull.a(this.getUserCache());
+ TileEntitySkull.a(this.getMinecraftSessionService());
+ UserCache.a(this.getOnlineMode());
++ l = SystemUtils.getMonotonicNanos() - MinecraftServer.startNanos;
++ s2 = String.format(Locale.ROOT, "%.3fs", (double) l / 1.0E9D);
++
++ DedicatedServer.LOGGER.info("({})! For Initializing stuff", s2);
+ DedicatedServer.LOGGER.info("Preparing level \"{}\"", this.getWorld());
+ JsonObject jsonobject = new JsonObject();
+
+@@ -272,8 +287,8 @@
+ }
+
+ this.a(this.getWorld(), this.getWorld(), j, worldtype, jsonobject);
+- long l = SystemUtils.getMonotonicNanos() - i;
+- String s2 = String.format(Locale.ROOT, "%.3fs", (double) l / 1.0E9D);
++ l = SystemUtils.getMonotonicNanos() - MinecraftServer.startNanos;
++ s2 = String.format(Locale.ROOT, "%.3fs", (double) l / 1.0E9D);
+
+ DedicatedServer.LOGGER.info("Done ({})! For help, type \"help\"", s2);
+ if (dedicatedserverproperties.announcePlayerAchievements != null) {
+Index: src/main/java/net/minecraft/server/DispenserRegistry.java
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+diff --git a/src/main/java/net/minecraft/server/DispenserRegistry.java b/src/main/java/net/minecraft/server/DispenserRegistry.java
+--- a/src/main/java/net/minecraft/server/DispenserRegistry.java (revision 22fba2706e53d3d24a5901b2881c3d97f9781f34)
++++ b/src/main/java/net/minecraft/server/DispenserRegistry.java (revision a16617e368c59c772e5873c8c3a4040444e4ea57)
+@@ -7,16 +7,6 @@
+ import org.apache.logging.log4j.LogManager;
+ import org.apache.logging.log4j.Logger;
+
+-// CraftBukkit start
+-import java.util.List;
+-import org.bukkit.Location;
+-import org.bukkit.TreeType;
+-import org.bukkit.craftbukkit.inventory.CraftItemStack;
+-import org.bukkit.craftbukkit.util.DummyGeneratorAccess;
+-import org.bukkit.event.block.BlockDispenseEvent;
+-import org.bukkit.event.world.StructureGrowEvent;
+-// CraftBukkit end
+-
+ public class DispenserRegistry {
+
+ public static final PrintStream a = System.out;
+@@ -30,79 +20,16 @@
+ throw new IllegalStateException("Unable to load registries");
+ } else {
+ BlockFire.c();
+- BlockComposter.c();
++ //BlockComposter.c();
+ if (EntityTypes.getName(EntityTypes.PLAYER) == null) {
+ throw new IllegalStateException("Failed loading EntityTypes");
+ } else {
+- PotionBrewer.a();
+- PlayerSelector.a();
++ //PotionBrewer.a();
++ //PlayerSelector.a();
+ IDispenseBehavior.c();
+ ArgumentRegistry.a();
+ d();
+ }
+- // CraftBukkit start - easier than fixing the decompile
+- DataConverterFlattenData.map(1008, "{Name:'minecraft:oak_sign',Properties:{rotation:'0'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'0'}}");
+- DataConverterFlattenData.map(1009, "{Name:'minecraft:oak_sign',Properties:{rotation:'1'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'1'}}");
+- DataConverterFlattenData.map(1010, "{Name:'minecraft:oak_sign',Properties:{rotation:'2'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'2'}}");
+- DataConverterFlattenData.map(1011, "{Name:'minecraft:oak_sign',Properties:{rotation:'3'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'3'}}");
+- DataConverterFlattenData.map(1012, "{Name:'minecraft:oak_sign',Properties:{rotation:'4'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'4'}}");
+- DataConverterFlattenData.map(1013, "{Name:'minecraft:oak_sign',Properties:{rotation:'5'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'5'}}");
+- DataConverterFlattenData.map(1014, "{Name:'minecraft:oak_sign',Properties:{rotation:'6'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'6'}}");
+- DataConverterFlattenData.map(1015, "{Name:'minecraft:oak_sign',Properties:{rotation:'7'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'7'}}");
+- DataConverterFlattenData.map(1016, "{Name:'minecraft:oak_sign',Properties:{rotation:'8'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'8'}}");
+- DataConverterFlattenData.map(1017, "{Name:'minecraft:oak_sign',Properties:{rotation:'9'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'9'}}");
+- DataConverterFlattenData.map(1018, "{Name:'minecraft:oak_sign',Properties:{rotation:'10'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'10'}}");
+- DataConverterFlattenData.map(1019, "{Name:'minecraft:oak_sign',Properties:{rotation:'11'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'11'}}");
+- DataConverterFlattenData.map(1020, "{Name:'minecraft:oak_sign',Properties:{rotation:'12'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'12'}}");
+- DataConverterFlattenData.map(1021, "{Name:'minecraft:oak_sign',Properties:{rotation:'13'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'13'}}");
+- DataConverterFlattenData.map(1022, "{Name:'minecraft:oak_sign',Properties:{rotation:'14'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'14'}}");
+- DataConverterFlattenData.map(1023, "{Name:'minecraft:oak_sign',Properties:{rotation:'15'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'15'}}");
+- DataConverterMaterialId.ID_MAPPING.put(323, "minecraft:oak_sign");
+-
+- DataConverterFlattenData.map(1440, "{Name:\'minecraft:portal\',Properties:{axis:\'x\'}}", new String[]{"{Name:\'minecraft:portal\',Properties:{axis:\'x\'}}"});
+-
+- DataConverterMaterialId.ID_MAPPING.put(409, "minecraft:prismarine_shard");
+- DataConverterMaterialId.ID_MAPPING.put(410, "minecraft:prismarine_crystals");
+- DataConverterMaterialId.ID_MAPPING.put(411, "minecraft:rabbit");
+- DataConverterMaterialId.ID_MAPPING.put(412, "minecraft:cooked_rabbit");
+- DataConverterMaterialId.ID_MAPPING.put(413, "minecraft:rabbit_stew");
+- DataConverterMaterialId.ID_MAPPING.put(414, "minecraft:rabbit_foot");
+- DataConverterMaterialId.ID_MAPPING.put(415, "minecraft:rabbit_hide");
+- DataConverterMaterialId.ID_MAPPING.put(416, "minecraft:armor_stand");
+-
+- DataConverterMaterialId.ID_MAPPING.put(423, "minecraft:mutton");
+- DataConverterMaterialId.ID_MAPPING.put(424, "minecraft:cooked_mutton");
+- DataConverterMaterialId.ID_MAPPING.put(425, "minecraft:banner");
+- DataConverterMaterialId.ID_MAPPING.put(426, "minecraft:end_crystal");
+- DataConverterMaterialId.ID_MAPPING.put(427, "minecraft:spruce_door");
+- DataConverterMaterialId.ID_MAPPING.put(428, "minecraft:birch_door");
+- DataConverterMaterialId.ID_MAPPING.put(429, "minecraft:jungle_door");
+- DataConverterMaterialId.ID_MAPPING.put(430, "minecraft:acacia_door");
+- DataConverterMaterialId.ID_MAPPING.put(431, "minecraft:dark_oak_door");
+- DataConverterMaterialId.ID_MAPPING.put(432, "minecraft:chorus_fruit");
+- DataConverterMaterialId.ID_MAPPING.put(433, "minecraft:chorus_fruit_popped");
+- DataConverterMaterialId.ID_MAPPING.put(434, "minecraft:beetroot");
+- DataConverterMaterialId.ID_MAPPING.put(435, "minecraft:beetroot_seeds");
+- DataConverterMaterialId.ID_MAPPING.put(436, "minecraft:beetroot_soup");
+- DataConverterMaterialId.ID_MAPPING.put(437, "minecraft:dragon_breath");
+- DataConverterMaterialId.ID_MAPPING.put(438, "minecraft:splash_potion");
+- DataConverterMaterialId.ID_MAPPING.put(439, "minecraft:spectral_arrow");
+- DataConverterMaterialId.ID_MAPPING.put(440, "minecraft:tipped_arrow");
+- DataConverterMaterialId.ID_MAPPING.put(441, "minecraft:lingering_potion");
+- DataConverterMaterialId.ID_MAPPING.put(442, "minecraft:shield");
+- DataConverterMaterialId.ID_MAPPING.put(443, "minecraft:elytra");
+- DataConverterMaterialId.ID_MAPPING.put(444, "minecraft:spruce_boat");
+- DataConverterMaterialId.ID_MAPPING.put(445, "minecraft:birch_boat");
+- DataConverterMaterialId.ID_MAPPING.put(446, "minecraft:jungle_boat");
+- DataConverterMaterialId.ID_MAPPING.put(447, "minecraft:acacia_boat");
+- DataConverterMaterialId.ID_MAPPING.put(448, "minecraft:dark_oak_boat");
+- DataConverterMaterialId.ID_MAPPING.put(449, "minecraft:totem_of_undying");
+- DataConverterMaterialId.ID_MAPPING.put(450, "minecraft:shulker_shell");
+- DataConverterMaterialId.ID_MAPPING.put(452, "minecraft:iron_nugget");
+- DataConverterMaterialId.ID_MAPPING.put(453, "minecraft:knowledge_book");
+-
+- DataConverterSpawnEgg.ID_MAPPING[23] = "Arrow";
+- // CraftBukkit end
+ }
+ }
+ }
+Index: src/main/java/net/minecraft/server/IDispenseBehavior.java
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+diff --git a/src/main/java/net/minecraft/server/IDispenseBehavior.java b/src/main/java/net/minecraft/server/IDispenseBehavior.java
+--- a/src/main/java/net/minecraft/server/IDispenseBehavior.java (revision 22fba2706e53d3d24a5901b2881c3d97f9781f34)
++++ b/src/main/java/net/minecraft/server/IDispenseBehavior.java (revision a16617e368c59c772e5873c8c3a4040444e4ea57)
+@@ -1,16 +1,9 @@
+ package net.minecraft.server;
+
+-import java.util.Iterator;
+-import java.util.List;
+ import java.util.Random;
+ // CraftBukkit start
+-import org.bukkit.Location;
+-import org.bukkit.TreeType;
+-import org.bukkit.craftbukkit.event.CraftEventFactory;
+ import org.bukkit.craftbukkit.inventory.CraftItemStack;
+-import org.bukkit.craftbukkit.util.DummyGeneratorAccess;
+ import org.bukkit.event.block.BlockDispenseEvent;
+-import org.bukkit.event.world.StructureGrowEvent;
+ // CraftBukkit end
+
+ public interface IDispenseBehavior {
+@@ -49,176 +42,6 @@
+ entityspectralarrow.fromPlayer = EntityArrow.PickupStatus.ALLOWED;
+ return entityspectralarrow;
+ }
+- }));
+- BlockDispenser.a((IMaterial) Items.EGG, (IDispenseBehavior) (new DispenseBehaviorProjectile() {
+- @Override
+- protected IProjectile a(World world, IPosition iposition, ItemStack itemstack) {
+- return (IProjectile) SystemUtils.a((new EntityEgg(world, iposition.getX(), iposition.getY(), iposition.getZ())), (entityegg) -> { // CraftBukkit - decompile error
+- entityegg.setItem(itemstack);
+- });
+- }
+- }));
+- BlockDispenser.a((IMaterial) Items.SNOWBALL, (IDispenseBehavior) (new DispenseBehaviorProjectile() {
+- @Override
+- protected IProjectile a(World world, IPosition iposition, ItemStack itemstack) {
+- return (IProjectile) SystemUtils.a((new EntitySnowball(world, iposition.getX(), iposition.getY(), iposition.getZ())), (entitysnowball) -> { // CraftBukkit - decompile error
+- entitysnowball.setItem(itemstack);
+- });
+- }
+- }));
+- BlockDispenser.a((IMaterial) Items.EXPERIENCE_BOTTLE, (IDispenseBehavior) (new DispenseBehaviorProjectile() {
+- @Override
+- protected IProjectile a(World world, IPosition iposition, ItemStack itemstack) {
+- return (IProjectile) SystemUtils.a((new EntityThrownExpBottle(world, iposition.getX(), iposition.getY(), iposition.getZ())), (entitythrownexpbottle) -> { // CraftBukkit - decompile error
+- entitythrownexpbottle.setItem(itemstack);
+- });
+- }
+-
+- @Override
+- protected float a() {
+- return super.a() * 0.5F;
+- }
+-
+- @Override
+- protected float getPower() {
+- return super.getPower() * 1.25F;
+- }
+- }));
+- BlockDispenser.a((IMaterial) Items.SPLASH_POTION, new IDispenseBehavior() {
+- @Override
+- public ItemStack dispense(ISourceBlock isourceblock, ItemStack itemstack) {
+- return (new DispenseBehaviorProjectile() {
+- @Override
+- protected IProjectile a(World world, IPosition iposition, ItemStack itemstack1) {
+- return (IProjectile) SystemUtils.a((new EntityPotion(world, iposition.getX(), iposition.getY(), iposition.getZ())), (entitypotion) -> { // CraftBukkit - decompile error
+- entitypotion.setItem(itemstack1);
+- });
+- }
+-
+- @Override
+- protected float a() {
+- return super.a() * 0.5F;
+- }
+-
+- @Override
+- protected float getPower() {
+- return super.getPower() * 1.25F;
+- }
+- }).dispense(isourceblock, itemstack);
+- }
+- });
+- BlockDispenser.a((IMaterial) Items.LINGERING_POTION, new IDispenseBehavior() {
+- @Override
+- public ItemStack dispense(ISourceBlock isourceblock, ItemStack itemstack) {
+- return (new DispenseBehaviorProjectile() {
+- @Override
+- protected IProjectile a(World world, IPosition iposition, ItemStack itemstack1) {
+- return (IProjectile) SystemUtils.a((new EntityPotion(world, iposition.getX(), iposition.getY(), iposition.getZ())), (entitypotion) -> { // CraftBukkit - decompile error
+- entitypotion.setItem(itemstack1);
+- });
+- }
+-
+- @Override
+- protected float a() {
+- return super.a() * 0.5F;
+- }
+-
+- @Override
+- protected float getPower() {
+- return super.getPower() * 1.25F;
+- }
+- }).dispense(isourceblock, itemstack);
+- }
+- });
+- DispenseBehaviorItem dispensebehavioritem = new DispenseBehaviorItem() {
+- @Override
+- public ItemStack a(ISourceBlock isourceblock, ItemStack itemstack) {
+- EnumDirection enumdirection = (EnumDirection) isourceblock.getBlockData().get(BlockDispenser.FACING);
+- EntityTypes> entitytypes = ((ItemMonsterEgg) itemstack.getItem()).b(itemstack.getTag());
+-
+- // CraftBukkit start
+- World world = isourceblock.getWorld();
+- ItemStack itemstack1 = itemstack.cloneAndSubtract(1);
+- org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ());
+- CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1);
+-
+- BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0));
+- if (!BlockDispenser.eventFired) {
+- world.getServer().getPluginManager().callEvent(event);
+- }
+-
+- if (event.isCancelled()) {
+- itemstack.add(1);
+- return itemstack;
+- }
+-
+- if (!event.getItem().equals(craftItem)) {
+- itemstack.add(1);
+- // Chain to handler for new item
+- ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
+- IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem());
+- if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) {
+- idispensebehavior.dispense(isourceblock, eventStack);
+- return itemstack;
+- }
+- }
+-
+- entitytypes.spawnCreature(isourceblock.getWorld(), itemstack, (EntityHuman) null, isourceblock.getBlockPosition().shift(enumdirection), EnumMobSpawn.DISPENSER, enumdirection != EnumDirection.UP, false);
+- // itemstack.subtract(1); // Handled during event processing
+- // CraftBukkit end
+- return itemstack;
+- }
+- };
+- Iterator iterator = ItemMonsterEgg.f().iterator();
+-
+- while (iterator.hasNext()) {
+- ItemMonsterEgg itemmonsteregg = (ItemMonsterEgg) iterator.next();
+-
+- BlockDispenser.a((IMaterial) itemmonsteregg, (IDispenseBehavior) dispensebehavioritem);
+- }
+-
+- BlockDispenser.a((IMaterial) Items.ARMOR_STAND, (IDispenseBehavior) (new DispenseBehaviorItem() {
+- @Override
+- public ItemStack a(ISourceBlock isourceblock, ItemStack itemstack) {
+- EnumDirection enumdirection = (EnumDirection) isourceblock.getBlockData().get(BlockDispenser.FACING);
+- BlockPosition blockposition = isourceblock.getBlockPosition().shift(enumdirection);
+- World world = isourceblock.getWorld();
+-
+- // CraftBukkit start
+- ItemStack itemstack1 = itemstack.cloneAndSubtract(1);
+- org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ());
+- CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1);
+-
+- BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0));
+- if (!BlockDispenser.eventFired) {
+- world.getServer().getPluginManager().callEvent(event);
+- }
+-
+- if (event.isCancelled()) {
+- itemstack.add(1);
+- return itemstack;
+- }
+-
+- if (!event.getItem().equals(craftItem)) {
+- itemstack.add(1);
+- // Chain to handler for new item
+- ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
+- IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem());
+- if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) {
+- idispensebehavior.dispense(isourceblock, eventStack);
+- return itemstack;
+- }
+- }
+- // CraftBukkit end
+-
+- EntityArmorStand entityarmorstand = new EntityArmorStand(world, (double) blockposition.getX() + 0.5D, (double) blockposition.getY(), (double) blockposition.getZ() + 0.5D);
+-
+- EntityTypes.a(world, (EntityHuman) null, (Entity) entityarmorstand, itemstack.getTag());
+- entityarmorstand.yaw = enumdirection.n();
+- world.addEntity(entityarmorstand);
+- // itemstack.subtract(1); // CraftBukkit - Handled during event processing
+- return itemstack;
+- }
+ }));
+ BlockDispenser.a((IMaterial) Items.FIREWORK_ROCKET, (IDispenseBehavior) (new DispenseBehaviorItem() {
+ @Override
+@@ -326,139 +149,6 @@
+ protected void a(ISourceBlock isourceblock) {
+ isourceblock.getWorld().triggerEffect(1018, isourceblock.getBlockPosition(), 0);
+ }
+- }));
+- BlockDispenser.a((IMaterial) Items.OAK_BOAT, (IDispenseBehavior) (new DispenseBehaviorBoat(EntityBoat.EnumBoatType.OAK)));
+- BlockDispenser.a((IMaterial) Items.SPRUCE_BOAT, (IDispenseBehavior) (new DispenseBehaviorBoat(EntityBoat.EnumBoatType.SPRUCE)));
+- BlockDispenser.a((IMaterial) Items.BIRCH_BOAT, (IDispenseBehavior) (new DispenseBehaviorBoat(EntityBoat.EnumBoatType.BIRCH)));
+- BlockDispenser.a((IMaterial) Items.JUNGLE_BOAT, (IDispenseBehavior) (new DispenseBehaviorBoat(EntityBoat.EnumBoatType.JUNGLE)));
+- BlockDispenser.a((IMaterial) Items.DARK_OAK_BOAT, (IDispenseBehavior) (new DispenseBehaviorBoat(EntityBoat.EnumBoatType.DARK_OAK)));
+- BlockDispenser.a((IMaterial) Items.ACACIA_BOAT, (IDispenseBehavior) (new DispenseBehaviorBoat(EntityBoat.EnumBoatType.ACACIA)));
+- DispenseBehaviorItem dispensebehavioritem1 = new DispenseBehaviorItem() {
+- private final DispenseBehaviorItem b = new DispenseBehaviorItem();
+-
+- @Override
+- public ItemStack a(ISourceBlock isourceblock, ItemStack itemstack) {
+- ItemBucket itembucket = (ItemBucket) itemstack.getItem();
+- BlockPosition blockposition = isourceblock.getBlockPosition().shift((EnumDirection) isourceblock.getBlockData().get(BlockDispenser.FACING));
+- World world = isourceblock.getWorld();
+-
+- // CraftBukkit start
+- int x = blockposition.getX();
+- int y = blockposition.getY();
+- int z = blockposition.getZ();
+- IBlockData iblockdata = world.getType(blockposition);
+- Material material = iblockdata.getMaterial();
+- if (world.isEmpty(blockposition) || !material.isBuildable() || material.isReplaceable() || ((iblockdata.getBlock() instanceof IFluidContainer) && ((IFluidContainer) iblockdata.getBlock()).canPlace(world, blockposition, iblockdata, itembucket.fluidType))) {
+- org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ());
+- CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack);
+-
+- BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(x, y, z));
+- if (!BlockDispenser.eventFired) {
+- world.getServer().getPluginManager().callEvent(event);
+- }
+-
+- if (event.isCancelled()) {
+- return itemstack;
+- }
+-
+- if (!event.getItem().equals(craftItem)) {
+- // Chain to handler for new item
+- ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
+- IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem());
+- if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) {
+- idispensebehavior.dispense(isourceblock, eventStack);
+- return itemstack;
+- }
+- }
+-
+- itembucket = (ItemBucket) CraftItemStack.asNMSCopy(event.getItem()).getItem();
+- }
+- // CraftBukkit end
+-
+- if (itembucket.a((EntityHuman) null, world, blockposition, (MovingObjectPositionBlock) null)) {
+- itembucket.a(world, itemstack, blockposition);
+- // CraftBukkit start - Handle stacked buckets
+- Item item = Items.BUCKET;
+- itemstack.subtract(1);
+- if (itemstack.isEmpty()) {
+- itemstack.setItem(Items.BUCKET);
+- itemstack.setCount(1);
+- } else if (((TileEntityDispenser) isourceblock.getTileEntity()).addItem(new ItemStack(item)) < 0) {
+- this.b.dispense(isourceblock, new ItemStack(item));
+- }
+- // CraftBukkit end
+- return itemstack;
+- } else {
+- return this.b.dispense(isourceblock, itemstack);
+- }
+- }
+- };
+-
+- BlockDispenser.a((IMaterial) Items.LAVA_BUCKET, (IDispenseBehavior) dispensebehavioritem1);
+- BlockDispenser.a((IMaterial) Items.WATER_BUCKET, (IDispenseBehavior) dispensebehavioritem1);
+- BlockDispenser.a((IMaterial) Items.SALMON_BUCKET, (IDispenseBehavior) dispensebehavioritem1);
+- BlockDispenser.a((IMaterial) Items.COD_BUCKET, (IDispenseBehavior) dispensebehavioritem1);
+- BlockDispenser.a((IMaterial) Items.PUFFERFISH_BUCKET, (IDispenseBehavior) dispensebehavioritem1);
+- BlockDispenser.a((IMaterial) Items.TROPICAL_FISH_BUCKET, (IDispenseBehavior) dispensebehavioritem1);
+- BlockDispenser.a((IMaterial) Items.BUCKET, (IDispenseBehavior) (new DispenseBehaviorItem() {
+- private final DispenseBehaviorItem b = new DispenseBehaviorItem();
+-
+- @Override
+- public ItemStack a(ISourceBlock isourceblock, ItemStack itemstack) {
+- World world = isourceblock.getWorld();
+- BlockPosition blockposition = isourceblock.getBlockPosition().shift((EnumDirection) isourceblock.getBlockData().get(BlockDispenser.FACING));
+- IBlockData iblockdata = world.getType(blockposition);
+- Block block = iblockdata.getBlock();
+-
+- if (block instanceof IFluidSource) {
+- FluidType fluidtype = ((IFluidSource) block).removeFluid(DummyGeneratorAccess.INSTANCE, blockposition, iblockdata); // CraftBukkit
+-
+- if (!(fluidtype instanceof FluidTypeFlowing)) {
+- return super.a(isourceblock, itemstack);
+- } else {
+- Item item = fluidtype.a();
+-
+- // CraftBukkit start
+- org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ());
+- CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack);
+-
+- BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(blockposition.getX(), blockposition.getY(), blockposition.getZ()));
+- if (!BlockDispenser.eventFired) {
+- world.getServer().getPluginManager().callEvent(event);
+- }
+-
+- if (event.isCancelled()) {
+- return itemstack;
+- }
+-
+- if (!event.getItem().equals(craftItem)) {
+- // Chain to handler for new item
+- ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
+- IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem());
+- if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) {
+- idispensebehavior.dispense(isourceblock, eventStack);
+- return itemstack;
+- }
+- }
+-
+- fluidtype = ((IFluidSource) block).removeFluid(world, blockposition, iblockdata); // From above
+- // CraftBukkit end
+-
+- itemstack.subtract(1);
+- if (itemstack.isEmpty()) {
+- return new ItemStack(item);
+- } else {
+- if (((TileEntityDispenser) isourceblock.getTileEntity()).addItem(new ItemStack(item)) < 0) {
+- this.b.dispense(isourceblock, new ItemStack(item));
+- }
+-
+- return itemstack;
+- }
+- }
+- } else {
+- return super.a(isourceblock, itemstack);
+- }
+- }
+ }));
+ BlockDispenser.a((IMaterial) Items.FLINT_AND_STEEL, (IDispenseBehavior) (new DispenseBehaviorMaybe() {
+ @Override
+@@ -512,360 +202,6 @@
+ itemstack.setCount(0);
+ }
+
+- return itemstack;
+- }
+- }));
+- BlockDispenser.a((IMaterial) Items.BONE_MEAL, (IDispenseBehavior) (new DispenseBehaviorMaybe() {
+- @Override
+- protected ItemStack a(ISourceBlock isourceblock, ItemStack itemstack) {
+- this.dispensed = true;
+- World world = isourceblock.getWorld();
+- BlockPosition blockposition = isourceblock.getBlockPosition().shift((EnumDirection) isourceblock.getBlockData().get(BlockDispenser.FACING));
+- // CraftBukkit start
+- org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ());
+- CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack);
+-
+- BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0));
+- if (!BlockDispenser.eventFired) {
+- world.getServer().getPluginManager().callEvent(event);
+- }
+-
+- if (event.isCancelled()) {
+- return itemstack;
+- }
+-
+- if (!event.getItem().equals(craftItem)) {
+- // Chain to handler for new item
+- ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
+- IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem());
+- if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) {
+- idispensebehavior.dispense(isourceblock, eventStack);
+- return itemstack;
+- }
+- }
+-
+- world.captureTreeGeneration = true;
+- // CraftBukkit end
+-
+- if (!ItemBoneMeal.a(itemstack, world, blockposition) && !ItemBoneMeal.a(itemstack, world, blockposition, (EnumDirection) null)) {
+- this.dispensed = false;
+- } else if (!world.isClientSide) {
+- world.triggerEffect(2005, blockposition, 0);
+- }
+- // CraftBukkit start
+- world.captureTreeGeneration = false;
+- if (world.capturedBlockStates.size() > 0) {
+- TreeType treeType = BlockSapling.treeType;
+- BlockSapling.treeType = null;
+- Location location = new Location(world.getWorld(), blockposition.getX(), blockposition.getY(), blockposition.getZ());
+- List blocks = new java.util.ArrayList<>(world.capturedBlockStates.values());
+- world.capturedBlockStates.clear();
+- StructureGrowEvent structureEvent = null;
+- if (treeType != null) {
+- structureEvent = new StructureGrowEvent(location, treeType, false, null, blocks);
+- org.bukkit.Bukkit.getPluginManager().callEvent(structureEvent);
+- }
+- if (structureEvent == null || !structureEvent.isCancelled()) {
+- for (org.bukkit.block.BlockState blockstate : blocks) {
+- blockstate.update(true);
+- }
+- }
+- }
+- // CraftBukkit end
+-
+- return itemstack;
+- }
+- }));
+- BlockDispenser.a((IMaterial) Blocks.TNT, (IDispenseBehavior) (new DispenseBehaviorItem() {
+- @Override
+- protected ItemStack a(ISourceBlock isourceblock, ItemStack itemstack) {
+- World world = isourceblock.getWorld();
+- BlockPosition blockposition = isourceblock.getBlockPosition().shift((EnumDirection) isourceblock.getBlockData().get(BlockDispenser.FACING));
+- // EntityTNTPrimed entitytntprimed = new EntityTNTPrimed(world, (double) blockposition.getX() + 0.5D, (double) blockposition.getY(), (double) blockposition.getZ() + 0.5D, (EntityLiving) null);
+-
+- // CraftBukkit start
+- ItemStack itemstack1 = itemstack.cloneAndSubtract(1);
+- org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ());
+- CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1);
+-
+- BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector((double) blockposition.getX() + 0.5D, (double) blockposition.getY(), (double) blockposition.getZ() + 0.5D));
+- if (!BlockDispenser.eventFired) {
+- world.getServer().getPluginManager().callEvent(event);
+- }
+-
+- if (event.isCancelled()) {
+- itemstack.add(1);
+- return itemstack;
+- }
+-
+- if (!event.getItem().equals(craftItem)) {
+- itemstack.add(1);
+- // Chain to handler for new item
+- ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
+- IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem());
+- if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) {
+- idispensebehavior.dispense(isourceblock, eventStack);
+- return itemstack;
+- }
+- }
+-
+- EntityTNTPrimed entitytntprimed = new EntityTNTPrimed(world, event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ(), (EntityLiving) null);
+- // CraftBukkit end
+-
+- world.addEntity(entitytntprimed);
+- world.playSound((EntityHuman) null, entitytntprimed.locX(), entitytntprimed.locY(), entitytntprimed.locZ(), SoundEffects.ENTITY_TNT_PRIMED, SoundCategory.BLOCKS, 1.0F, 1.0F);
+- // itemstack.subtract(1); // CraftBukkit - handled above
+- return itemstack;
+- }
+- }));
+- DispenseBehaviorMaybe dispensebehaviormaybe = new DispenseBehaviorMaybe() {
+- @Override
+- protected ItemStack a(ISourceBlock isourceblock, ItemStack itemstack) {
+- this.dispensed = ItemArmor.a(isourceblock, itemstack);
+- return itemstack;
+- }
+- };
+-
+- BlockDispenser.a((IMaterial) Items.CREEPER_HEAD, (IDispenseBehavior) dispensebehaviormaybe);
+- BlockDispenser.a((IMaterial) Items.ZOMBIE_HEAD, (IDispenseBehavior) dispensebehaviormaybe);
+- BlockDispenser.a((IMaterial) Items.DRAGON_HEAD, (IDispenseBehavior) dispensebehaviormaybe);
+- BlockDispenser.a((IMaterial) Items.SKELETON_SKULL, (IDispenseBehavior) dispensebehaviormaybe);
+- BlockDispenser.a((IMaterial) Items.PLAYER_HEAD, (IDispenseBehavior) dispensebehaviormaybe);
+- BlockDispenser.a((IMaterial) Items.WITHER_SKELETON_SKULL, (IDispenseBehavior) (new DispenseBehaviorMaybe() {
+- @Override
+- protected ItemStack a(ISourceBlock isourceblock, ItemStack itemstack) {
+- World world = isourceblock.getWorld();
+- EnumDirection enumdirection = (EnumDirection) isourceblock.getBlockData().get(BlockDispenser.FACING);
+- BlockPosition blockposition = isourceblock.getBlockPosition().shift(enumdirection);
+-
+- // CraftBukkit start
+- org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ());
+- CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack);
+-
+- BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(blockposition.getX(), blockposition.getY(), blockposition.getZ()));
+- if (!BlockDispenser.eventFired) {
+- world.getServer().getPluginManager().callEvent(event);
+- }
+-
+- if (event.isCancelled()) {
+- return itemstack;
+- }
+-
+- if (!event.getItem().equals(craftItem)) {
+- // Chain to handler for new item
+- ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
+- IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem());
+- if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) {
+- idispensebehavior.dispense(isourceblock, eventStack);
+- return itemstack;
+- }
+- }
+- // CraftBukkit end
+-
+- if (world.isEmpty(blockposition) && BlockWitherSkull.b(world, blockposition, itemstack)) {
+- world.setTypeAndData(blockposition, (IBlockData) Blocks.WITHER_SKELETON_SKULL.getBlockData().set(BlockSkull.a, enumdirection.m() == EnumDirection.EnumAxis.Y ? 0 : enumdirection.opposite().get2DRotationValue() * 4), 3);
+- TileEntity tileentity = world.getTileEntity(blockposition);
+-
+- if (tileentity instanceof TileEntitySkull) {
+- BlockWitherSkull.a(world, blockposition, (TileEntitySkull) tileentity);
+- }
+-
+- itemstack.subtract(1);
+- this.dispensed = true;
+- } else {
+- this.dispensed = ItemArmor.a(isourceblock, itemstack);
+- }
+-
+- return itemstack;
+- }
+- }));
+- BlockDispenser.a((IMaterial) Blocks.CARVED_PUMPKIN, (IDispenseBehavior) (new DispenseBehaviorMaybe() {
+- @Override
+- protected ItemStack a(ISourceBlock isourceblock, ItemStack itemstack) {
+- World world = isourceblock.getWorld();
+- BlockPosition blockposition = isourceblock.getBlockPosition().shift((EnumDirection) isourceblock.getBlockData().get(BlockDispenser.FACING));
+- BlockPumpkinCarved blockpumpkincarved = (BlockPumpkinCarved) Blocks.CARVED_PUMPKIN;
+-
+- // CraftBukkit start
+- org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ());
+- CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack);
+-
+- BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(blockposition.getX(), blockposition.getY(), blockposition.getZ()));
+- if (!BlockDispenser.eventFired) {
+- world.getServer().getPluginManager().callEvent(event);
+- }
+-
+- if (event.isCancelled()) {
+- return itemstack;
+- }
+-
+- if (!event.getItem().equals(craftItem)) {
+- // Chain to handler for new item
+- ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
+- IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem());
+- if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) {
+- idispensebehavior.dispense(isourceblock, eventStack);
+- return itemstack;
+- }
+- }
+- // CraftBukkit end
+-
+- if (world.isEmpty(blockposition) && blockpumpkincarved.a((IWorldReader) world, blockposition)) {
+- if (!world.isClientSide) {
+- world.setTypeAndData(blockposition, blockpumpkincarved.getBlockData(), 3);
+- }
+-
+- itemstack.subtract(1);
+- this.dispensed = true;
+- } else {
+- this.dispensed = ItemArmor.a(isourceblock, itemstack);
+- }
+-
+- return itemstack;
+- }
+- }));
+- BlockDispenser.a((IMaterial) Blocks.SHULKER_BOX.getItem(), (IDispenseBehavior) (new DispenseBehaviorShulkerBox()));
+- EnumColor[] aenumcolor = EnumColor.values();
+- int i = aenumcolor.length;
+-
+- for (int j = 0; j < i; ++j) {
+- EnumColor enumcolor = aenumcolor[j];
+-
+- BlockDispenser.a((IMaterial) BlockShulkerBox.a(enumcolor).getItem(), (IDispenseBehavior) (new DispenseBehaviorShulkerBox()));
+- }
+-
+- BlockDispenser.a((IMaterial) Items.GLASS_BOTTLE.getItem(), (IDispenseBehavior) (new DispenseBehaviorMaybe() {
+- private final DispenseBehaviorItem c = new DispenseBehaviorItem();
+-
+- private ItemStack a(ISourceBlock isourceblock, ItemStack itemstack, ItemStack itemstack1) {
+- itemstack.subtract(1);
+- if (itemstack.isEmpty()) {
+- return itemstack1.cloneItemStack();
+- } else {
+- if (((TileEntityDispenser) isourceblock.getTileEntity()).addItem(itemstack1.cloneItemStack()) < 0) {
+- this.c.dispense(isourceblock, itemstack1.cloneItemStack());
+- }
+-
+- return itemstack;
+- }
+- }
+-
+- @Override
+- public ItemStack a(ISourceBlock isourceblock, ItemStack itemstack) {
+- this.dispensed = false;
+- World world = isourceblock.getWorld();
+- BlockPosition blockposition = isourceblock.getBlockPosition().shift((EnumDirection) isourceblock.getBlockData().get(BlockDispenser.FACING));
+- IBlockData iblockdata = world.getType(blockposition);
+- Block block = iblockdata.getBlock();
+-
+- // CraftBukkit start
+- org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ());
+- CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack);
+-
+- BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(blockposition.getX(), blockposition.getY(), blockposition.getZ()));
+- if (!BlockDispenser.eventFired) {
+- world.getServer().getPluginManager().callEvent(event);
+- }
+-
+- if (event.isCancelled()) {
+- return itemstack;
+- }
+-
+- if (!event.getItem().equals(craftItem)) {
+- // Chain to handler for new item
+- ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
+- IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem());
+- if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) {
+- idispensebehavior.dispense(isourceblock, eventStack);
+- return itemstack;
+- }
+- }
+- // CraftBukkit end
+-
+- if (block.a(TagsBlock.BEEHIVES) && (Integer) iblockdata.get(BlockBeehive.c) >= 5) {
+- ((BlockBeehive) iblockdata.getBlock()).a(world.getMinecraftWorld(), iblockdata, blockposition, (EntityHuman) null, TileEntityBeehive.ReleaseStatus.BEE_RELEASED);
+- this.dispensed = true;
+- return this.a(isourceblock, itemstack, new ItemStack(Items.pX));
+- } else if (world.getFluid(blockposition).a(TagsFluid.WATER)) {
+- this.dispensed = true;
+- return this.a(isourceblock, itemstack, PotionUtil.a(new ItemStack(Items.POTION), Potions.WATER));
+- } else {
+- return super.a(isourceblock, itemstack);
+- }
+- }
+- }));
+- BlockDispenser.a((IMaterial) Items.SHEARS.getItem(), (IDispenseBehavior) (new DispenseBehaviorMaybe() {
+- @Override
+- protected ItemStack a(ISourceBlock isourceblock, ItemStack itemstack) {
+- World world = isourceblock.getWorld();
+- // CraftBukkit start
+- org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ());
+- CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack);
+-
+- BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0));
+- if (!BlockDispenser.eventFired) {
+- world.getServer().getPluginManager().callEvent(event);
+- }
+-
+- if (event.isCancelled()) {
+- return itemstack;
+- }
+-
+- if (!event.getItem().equals(craftItem)) {
+- // Chain to handler for new item
+- ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
+- IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem());
+- if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) {
+- idispensebehavior.dispense(isourceblock, eventStack);
+- return itemstack;
+- }
+- }
+- // CraftBukkit end
+-
+- if (!world.p_()) {
+- this.dispensed = false;
+- BlockPosition blockposition = isourceblock.getBlockPosition().shift((EnumDirection) isourceblock.getBlockData().get(BlockDispenser.FACING));
+- List list = world.a(EntitySheep.class, new AxisAlignedBB(blockposition));
+- Iterator iterator1 = list.iterator();
+-
+- while (iterator1.hasNext()) {
+- EntitySheep entitysheep = (EntitySheep) iterator1.next();
+-
+- if (entitysheep.isAlive() && !entitysheep.isSheared() && !entitysheep.isBaby()) {
+- // CraftBukkit start
+- if (CraftEventFactory.callBlockShearEntityEvent(entitysheep, bukkitBlock, craftItem).isCancelled()) {
+- continue;
+- }
+- // CraftBukkit end
+- entitysheep.shear();
+- if (itemstack.isDamaged(1, world.random, (EntityPlayer) null)) {
+- itemstack.setCount(0);
+- }
+-
+- this.dispensed = true;
+- break;
+- }
+- }
+-
+- if (!this.dispensed) {
+- IBlockData iblockdata = world.getType(blockposition);
+-
+- if (iblockdata.a(TagsBlock.BEEHIVES)) {
+- int k = (Integer) iblockdata.get(BlockBeehive.c);
+-
+- if (k >= 5) {
+- if (itemstack.isDamaged(1, world.random, (EntityPlayer) null)) {
+- itemstack.setCount(0);
+- }
+-
+- BlockBeehive.a(world, blockposition);
+- ((BlockBeehive) iblockdata.getBlock()).a(world, iblockdata, blockposition, (EntityHuman) null, TileEntityBeehive.ReleaseStatus.BEE_RELEASED);
+- this.dispensed = true;
+- }
+- }
+- }
+- }
+-
+ return itemstack;
+ }
+ }));
+Index: src/main/java/net/minecraft/server/JsonList.java
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+diff --git a/src/main/java/net/minecraft/server/JsonList.java b/src/main/java/net/minecraft/server/JsonList.java
+--- a/src/main/java/net/minecraft/server/JsonList.java (revision 22fba2706e53d3d24a5901b2881c3d97f9781f34)
++++ b/src/main/java/net/minecraft/server/JsonList.java (revision a16617e368c59c772e5873c8c3a4040444e4ea57)
+@@ -156,6 +156,8 @@
+ }
+
+ public void save() throws IOException {
++ if(!c.canWrite())
++ return;
+ Collection collection = this.d.values();
+ String s = this.b.toJson(collection);
+ BufferedWriter bufferedwriter = null;
+Index: src/main/java/net/minecraft/server/MinecraftServer.java
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
+--- a/src/main/java/net/minecraft/server/MinecraftServer.java (revision 22fba2706e53d3d24a5901b2881c3d97f9781f34)
++++ b/src/main/java/net/minecraft/server/MinecraftServer.java (revision a16617e368c59c772e5873c8c3a4040444e4ea57)
+@@ -30,19 +30,7 @@
+ import java.nio.file.Paths;
+ import java.security.KeyPair;
+ import java.text.SimpleDateFormat;
+-import java.util.ArrayList;
+-import java.util.Arrays;
+-import java.util.Base64;
+-import java.util.Collection;
+-import java.util.Collections;
+-import java.util.Comparator;
+-import java.util.Date;
+-import java.util.Iterator;
+-import java.util.List;
+-import java.util.Map;
+-import java.util.Optional;
+-import java.util.Random;
+-import java.util.UUID;
++import java.util.*;
+ import java.util.Map.Entry;
+ import java.util.concurrent.CompletableFuture;
+ import java.util.concurrent.Executor;
+@@ -168,11 +156,12 @@
+ private boolean forceTicks;
+ // CraftBukkit end
+ // Spigot start
+- public static final int TPS = 20;
+- public static final int TICK_TIME = 1000000000 / TPS;
++ public static int TPS = 20;
++ public static int TICK_TIME = 1000000000 / TPS;
+ private static final int SAMPLE_INTERVAL = 100;
+ public final double[] recentTps = new double[ 3 ];
+ public final SlackActivityAccountant slackActivityAccountant = new SlackActivityAccountant();
++ public static long startNanos;
+ // Spigot end
+
+ public MinecraftServer(OptionSet options, Proxy proxy, DataFixer datafixer, CommandDispatcher commanddispatcher, YggdrasilAuthenticationService yggdrasilauthenticationservice, MinecraftSessionService minecraftsessionservice, GameProfileRepository gameprofilerepository, UserCache usercache, WorldLoadListenerFactory worldloadlistenerfactory, String s) {
+@@ -449,10 +438,8 @@
+ }
+ }
+ this.a(this.getDifficulty(), true);
+- for (WorldServer worldserver : this.getWorlds()) {
+- this.loadSpawn(worldserver.getChunkProvider().playerChunkMap.worldLoadListener, worldserver);
+- this.server.getPluginManager().callEvent(new org.bukkit.event.world.WorldLoadEvent(worldserver.getWorld()));
+- }
++
++ this.getWorlds().forEach(worldserver -> this.server.getPluginManager().callEvent(new org.bukkit.event.world.WorldLoadEvent(worldserver.getWorld())));
+
+ this.server.enablePlugins(org.bukkit.plugin.PluginLoadOrder.POSTWORLD);
+ this.server.getPluginManager().callEvent(new ServerLoadEvent(ServerLoadEvent.LoadType.STARTUP));
+@@ -1132,6 +1119,7 @@
+ }
+
+ public static void main(final OptionSet optionset) { // CraftBukkit - replaces main(String[] astring)
++ startNanos = SystemUtils.getMonotonicNanos();
+ /* CraftBukkit start - Replace everything
+ OptionParser optionparser = new OptionParser();
+ OptionSpec optionspec = optionparser.accepts("nogui");
+@@ -1162,36 +1150,27 @@
+ DedicatedServerSettings dedicatedserversettings = new DedicatedServerSettings(optionset); // CraftBukkit - CLI argument support
+
+ dedicatedserversettings.save();
+- java.nio.file.Path java_nio_file_path1 = Paths.get("eula.txt");
+- EULA eula = new EULA(java_nio_file_path1);
+-
+- if (optionset.has("initSettings")) { // CraftBukkit
+- MinecraftServer.LOGGER.info("Initialized '" + java_nio_file_path.toAbsolutePath().toString() + "' and '" + java_nio_file_path1.toAbsolutePath().toString() + "'");
+- return;
+- }
+
+ // Spigot Start
+- boolean eulaAgreed = Boolean.getBoolean( "com.mojang.eula.agree" );
+- if ( eulaAgreed )
+- {
+- System.err.println( "You have used the Spigot command line EULA agreement flag." );
+- System.err.println( "By using this setting you are indicating your agreement to Mojang's EULA (https://account.mojang.com/documents/minecraft_eula)." );
+- System.err.println( "If you do not agree to the above EULA please stop your server and remove this flag immediately." );
+- }
+- // Spigot End
+- if (!eula.a() && !eulaAgreed) { // Spigot
+- MinecraftServer.LOGGER.info("You need to agree to the EULA in order to run the server. Go to eula.txt for more info.");
+- return;
+- }
+-
+ CrashReport.h();
+- DispenserRegistry.init();
+- DispenserRegistry.c();
++ Thread registryThread = new Thread(() -> {
++ DispenserRegistry.init();
++ DispenserRegistry.c();
++ }, "RegistryInitializer");
++ registryThread.start();
++ long l = SystemUtils.getMonotonicNanos() - MinecraftServer.startNanos;
++ String s2 = String.format(Locale.ROOT, "%.3fs", (double) l / 1.0E9D);
++
++ LOGGER.info("({})! For Loading Registries", s2);
+ File s = (File) optionset.valueOf("universe"); // CraftBukkit
+ YggdrasilAuthenticationService yggdrasilauthenticationservice = new YggdrasilAuthenticationService(Proxy.NO_PROXY, UUID.randomUUID().toString());
+ MinecraftSessionService minecraftsessionservice = yggdrasilauthenticationservice.createMinecraftSessionService();
+ GameProfileRepository gameprofilerepository = yggdrasilauthenticationservice.createProfileRepository();
+ UserCache usercache = new UserCache(gameprofilerepository, new File(s, MinecraftServer.b.getName()));
++ l = SystemUtils.getMonotonicNanos() - MinecraftServer.startNanos;
++ s2 = String.format(Locale.ROOT, "%.3fs", (double) l / 1.0E9D);
++
++ LOGGER.info("({})! For Initializing Repositories", s2);
+ // CraftBukkit start
+ String s1 = (String) Optional.ofNullable(optionset.valueOf("world")).orElse(dedicatedserversettings.getProperties().levelName);
+ final DedicatedServer dedicatedserver = new DedicatedServer(optionset, dedicatedserversettings, DataConverterRegistry.a(), yggdrasilauthenticationservice, minecraftsessionservice, gameprofilerepository, usercache, WorldLoadListenerLogger::new, s1);
+@@ -1242,6 +1221,10 @@
+ dedicatedserver.setEraseCache(true);
+ }
+
++ l = SystemUtils.getMonotonicNanos() - MinecraftServer.startNanos;
++ s2 = String.format(Locale.ROOT, "%.3fs", (double) l / 1.0E9D);
++
++ LOGGER.info("({})! For Initializing Dedicated Server", s2);
+ dedicatedserver.serverThread.start();
+ // CraftBukkit end
+ } catch (Exception exception) {
+@@ -1724,47 +1707,39 @@
+ }
+
+ private void b(WorldData worlddata) {
+- List list = Lists.newArrayList(this.resourcePackRepository.d());
+- Iterator iterator = this.resourcePackRepository.b().iterator();
+-
+- while (iterator.hasNext()) {
+- ResourcePackLoader resourcepackloader = (ResourcePackLoader) iterator.next();
++ Thread reloadResource = new Thread(() -> {
++ List list = Lists.newArrayList(this.resourcePackRepository.d());
++ Iterator iterator = this.resourcePackRepository.b().iterator();
++ while (iterator.hasNext()) {
++ ResourcePackLoader resourcepackloader = (ResourcePackLoader) iterator.next();
+
+- if (!worlddata.N().contains(resourcepackloader.e()) && !list.contains(resourcepackloader)) {
+- MinecraftServer.LOGGER.info("Found new data pack {}, loading it automatically", resourcepackloader.e());
+- resourcepackloader.h().a(list, resourcepackloader, (resourcepackloader1) -> {
+- return resourcepackloader1;
+- }, false);
+- }
+- }
++ if (!worlddata.N().contains(resourcepackloader.e()) && !list.contains(resourcepackloader)) {
++ MinecraftServer.LOGGER.info("Found new data pack {}, loading it automatically", resourcepackloader.e());
++ resourcepackloader.h().a(list, resourcepackloader, (resourcepackloader1) -> {
++ return resourcepackloader1;
++ }, false);
++ }
++ }
+
+- this.resourcePackRepository.a((Collection) list);
+- List list1 = Lists.newArrayList();
++ this.resourcePackRepository.a((Collection) list);
++ List list1 = Lists.newArrayList();
+
+- this.resourcePackRepository.d().forEach((resourcepackloader1) -> {
+- list1.add(resourcepackloader1.d());
+- });
+- CompletableFuture completablefuture = this.ae.a(this.executorService, this, list1, MinecraftServer.i);
+-
+- this.awaitTasks(completablefuture::isDone);
+-
+- try {
+- completablefuture.get();
+- } catch (Exception exception) {
+- MinecraftServer.LOGGER.error("Failed to reload data packs", exception);
+- }
+-
+- worlddata.O().clear();
+- worlddata.N().clear();
+- this.resourcePackRepository.d().forEach((resourcepackloader1) -> {
+- worlddata.O().add(resourcepackloader1.e());
+- });
+- this.resourcePackRepository.b().forEach((resourcepackloader1) -> {
+- if (!this.resourcePackRepository.d().contains(resourcepackloader1)) {
+- worlddata.N().add(resourcepackloader1.e());
+- }
+-
++ this.resourcePackRepository.d().forEach((resourcepackloader1) -> {
++ list1.add(resourcepackloader1.d());
++ });
++ this.ae.a(this.executorService, this, list1, MinecraftServer.i);
++ worlddata.O().clear();
++ worlddata.N().clear();
++ this.resourcePackRepository.d().forEach((resourcepackloader1) -> {
++ worlddata.O().add(resourcepackloader1.e());
++ });
++ this.resourcePackRepository.b().forEach((resourcepackloader1) -> {
++ if (!this.resourcePackRepository.d().contains(resourcepackloader1)) {
++ worlddata.N().add(resourcepackloader1.e());
++ }
++ });
+ });
++ reloadResource.start();
+ }
+
+ public void a(CommandListenerWrapper commandlistenerwrapper) {
+@@ -2075,7 +2050,8 @@
+ }
+
+ private void bb() {
+- Block.REGISTRY_ID.forEach(IBlockData::c);
++ Thread blockRegistry = new Thread(() -> Block.REGISTRY_ID.forEach(IBlockData::c));
++ blockRegistry.start();
+ }
+
+ // CraftBukkit start
+Index: src/main/java/org/bukkit/craftbukkit/CraftServer.java
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java (revision 22fba2706e53d3d24a5901b2881c3d97f9781f34)
++++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java (revision a16617e368c59c772e5873c8c3a4040444e4ea57)
+@@ -38,6 +38,7 @@
+ import java.util.Map;
+ import java.util.Set;
+ import java.util.UUID;
++import java.util.concurrent.*;
+ import java.util.function.Consumer;
+ import java.util.logging.Level;
+ import java.util.logging.Logger;
+@@ -234,6 +235,7 @@
+ public boolean ignoreVanillaPermissions = false;
+ private final List playerView;
+ public int reloadCount;
++ private boolean allPluginsLoaded = false;
+
+ static {
+ ConfigurationSerialization.registerClass(CraftOfflinePlayer.class);
+@@ -347,22 +349,38 @@
+ public void loadPlugins() {
+ pluginManager.registerInterface(JavaPluginLoader.class);
+
+- File pluginFolder = (File) console.options.valueOf("plugins");
++ Thread pluginloader = new Thread(() -> {
++ File pluginFolder = (File) console.options.valueOf("plugins");
+
+- if (pluginFolder.exists()) {
+- Plugin[] plugins = pluginManager.loadPlugins(pluginFolder);
+- for (Plugin plugin : plugins) {
+- try {
+- String message = String.format("Loading %s", plugin.getDescription().getFullName());
+- plugin.getLogger().info(message);
+- plugin.onLoad();
+- } catch (Throwable ex) {
+- Logger.getLogger(CraftServer.class.getName()).log(Level.SEVERE, ex.getMessage() + " initializing " + plugin.getDescription().getFullName() + " (Is it up to date?)", ex);
++ if (pluginFolder.exists()) {
++ Plugin[] plugins = pluginManager.loadPlugins(pluginFolder);
++ ThreadPoolExecutor group = new ThreadPoolExecutor(2, 4, 5, TimeUnit.SECONDS, new ArrayBlockingQueue(Math.min(plugins.length, 1)));
++ for (Plugin plugin : plugins) {
++ group.execute(() -> {
++ try {
++ String message = String.format("Loading %s", plugin.getDescription().getFullName());
++ plugin.getLogger().info(message);
++ plugin.onLoad();
++ } catch (Throwable ex) {
++ Logger.getLogger(CraftServer.class.getName()).log(Level.SEVERE, ex.getMessage() + " initializing " + plugin.getDescription().getFullName() + " (Is it up to date?)", ex);
++ }
++ });
+ }
+- }
+- } else {
+- pluginFolder.mkdir();
+- }
++ try {
++ while (!group.getQueue().isEmpty()) {
++ Thread.sleep(10);
++ }
++ enablePlugins(PluginLoadOrder.STARTUP);
++ } catch (InterruptedException e) {
++ logger.severe(e.getMessage());
++ e.printStackTrace();
++ System.exit(1);
++ }
++ } else {
++ pluginFolder.mkdir();
++ }
++ });
++ pluginloader.start();
+ }
+
+ public void enablePlugins(PluginLoadOrder type) {
+@@ -831,7 +849,6 @@
+ ));
+ }
+ loadPlugins();
+- enablePlugins(PluginLoadOrder.STARTUP);
+ enablePlugins(PluginLoadOrder.POSTWORLD);
+ getPluginManager().callEvent(new ServerLoadEvent(ServerLoadEvent.LoadType.RELOAD));
+ }
+Index: src/main/java/org/bukkit/craftbukkit/Main.java
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java
+--- a/src/main/java/org/bukkit/craftbukkit/Main.java (revision 22fba2706e53d3d24a5901b2881c3d97f9781f34)
++++ b/src/main/java/org/bukkit/craftbukkit/Main.java (revision a16617e368c59c772e5873c8c3a4040444e4ea57)
+@@ -181,23 +181,6 @@
+ System.setProperty(jline.TerminalFactory.JLINE_TERMINAL, jline.UnsupportedTerminal.class.getName());
+ }
+
+- if (options.has("noconsole")) {
+- useConsole = false;
+- }
+-
+- if (false && Main.class.getPackage().getImplementationVendor() != null && System.getProperty("IReallyKnowWhatIAmDoingISwear") == null) {
+- Date buildDate = new Date(Integer.parseInt(Main.class.getPackage().getImplementationVendor()) * 1000L);
+-
+- Calendar deadline = Calendar.getInstance();
+- deadline.add(Calendar.DAY_OF_YEAR, -21);
+- if (buildDate.before(deadline.getTime())) {
+- System.err.println("*** Error, this build is outdated ***");
+- System.err.println("*** Please download a new build as per instructions from https://www.spigotmc.org/go/outdated-spigot ***");
+- System.err.println("*** Server will start in 20 seconds ***");
+- Thread.sleep(TimeUnit.SECONDS.toMillis(20));
+- }
+- }
+-
+ System.out.println("Loading libraries, please wait...");
+ MinecraftServer.main(options);
+ } catch (Throwable t) {
+Index: src/main/java/org/bukkit/craftbukkit/command/ColouredConsoleSender.java
+IDEA additional info:
+Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
+<+>UTF-8
+===================================================================
+diff --git a/src/main/java/org/bukkit/craftbukkit/command/ColouredConsoleSender.java b/src/main/java/org/bukkit/craftbukkit/command/ColouredConsoleSender.java
+--- a/src/main/java/org/bukkit/craftbukkit/command/ColouredConsoleSender.java (revision 22fba2706e53d3d24a5901b2881c3d97f9781f34)
++++ b/src/main/java/org/bukkit/craftbukkit/command/ColouredConsoleSender.java (revision a16617e368c59c772e5873c8c3a4040444e4ea57)
+@@ -66,10 +66,6 @@
+ }
+
+ public static ConsoleCommandSender getInstance() {
+- if (Bukkit.getConsoleSender() != null) {
+- return Bukkit.getConsoleSender();
+- } else {
+- return new ColouredConsoleSender();
+- }
++ return new ColouredConsoleSender();
+ }
+ }