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(); + } + }