diff --git a/SteamWar-Patches/Chaos-Patches.patch b/SteamWar-Patches/Chaos-Patches.patch
deleted file mode 100644
index 75d2030..0000000
--- a/SteamWar-Patches/Chaos-Patches.patch
+++ /dev/null
@@ -1,1389 +0,0 @@
-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();
- }
- }
diff --git a/SteamWar-Patches/Disable_BuildVersion.patch b/SteamWar-Patches/Disable_BuildVersion.patch
new file mode 100644
index 0000000..51a60c3
--- /dev/null
+++ b/SteamWar-Patches/Disable_BuildVersion.patch
@@ -0,0 +1,32 @@
+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 163eed5a26a0c45590314f401c743ddc8adc92de)
++++ b/src/main/java/org/bukkit/craftbukkit/Main.java (revision 12c3f23057841f2868e5fcf4a4a836b73e52b1bb)
+@@ -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) {
diff --git a/SteamWar-Patches/Remove_EULA_Check.patch b/SteamWar-Patches/Remove_EULA_Check.patch
new file mode 100644
index 0000000..1c05e82
--- /dev/null
+++ b/SteamWar-Patches/Remove_EULA_Check.patch
@@ -0,0 +1,47 @@
+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 80e88864c308ef9c8481a5d5af2ec1bda862fa6d)
++++ b/src/main/java/net/minecraft/server/MinecraftServer.java (revision 74b59be6f63fa4b23e3d93746b36a4a33352a918)
+@@ -1162,28 +1162,8 @@
+ 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();
+@@ -2075,7 +2055,8 @@
+ }
+
+ private void bb() {
+- Block.REGISTRY_ID.forEach(IBlockData::c);
++ Thread blockRegistry = new Thread(() -> Block.REGISTRY_ID.forEach(IBlockData::c));
++ blockRegistry.start();
+ }
+
+ // CraftBukkit start
diff --git a/SteamWar-Patches/Remove_RAM_Check.patch b/SteamWar-Patches/Remove_RAM_Check.patch
new file mode 100644
index 0000000..d5ec23d
--- /dev/null
+++ b/SteamWar-Patches/Remove_RAM_Check.patch
@@ -0,0 +1,18 @@
+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 12c3f23057841f2868e5fcf4a4a836b73e52b1bb)
++++ b/src/main/java/net/minecraft/server/DedicatedServer.java (revision 80e88864c308ef9c8481a5d5af2ec1bda862fa6d)
+@@ -151,9 +151,6 @@
+ 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();