diff --git a/patches/net/minecraft/command/CommandTP.java.patch b/patches/net/minecraft/command/CommandTP.java.patch index 4faa0ab..bdff5bb 100644 --- a/patches/net/minecraft/command/CommandTP.java.patch +++ b/patches/net/minecraft/command/CommandTP.java.patch @@ -9,8 +9,8 @@ - throw new CommandException("commands.tp.notSameDimension", new Object[0]); + // CraftBukkit Start + // Use Bukkit teleport method in all cases. It has cross dimensional handling, events -+ if (entity.getBukkitEntity().teleport(entity.getBukkitEntity(), org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.COMMAND)) { -+ notifyCommandListener(sender, (ICommand) this, "commands.tp.success", new Object[] { entity.getName(), entity.getName()}); ++ if (entity.getBukkitEntity().teleport(entity1.getBukkitEntity(), org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.COMMAND)) { ++ notifyCommandListener(sender, (ICommand) this, "commands.tp.success", new Object[] { entity.getName(), entity1.getName()}); + // CraftBukkit End } - else diff --git a/patches/net/minecraft/network/NetHandlerPlayServer.java.patch b/patches/net/minecraft/network/NetHandlerPlayServer.java.patch index 039f266..fe50d4b 100644 --- a/patches/net/minecraft/network/NetHandlerPlayServer.java.patch +++ b/patches/net/minecraft/network/NetHandlerPlayServer.java.patch @@ -115,7 +115,7 @@ private int itemDropThreshold; private final IntHashMap pendingTransactions = new IntHashMap(); private double firstGoodX; -@@ -158,6 +207,25 @@ +@@ -158,6 +207,26 @@ private int lastMovePacketCounter; private ServerRecipeBookHelper field_194309_H = new ServerRecipeBookHelper(); @@ -136,12 +136,13 @@ + private float lastPitch = Float.MAX_VALUE; + private float lastYaw = Float.MAX_VALUE; + private boolean justTeleported = false; ++ private boolean hasMoved; // Spigot + private final static HashSet invalidItems = new HashSet(java.util.Arrays.asList(8, 9, 10, 11, 26, 34, 36, 43, 51, 55, 59, 62, 63, 64, 68, 71, 74, 75, 83, 90, 92, 93, 94, 104, 105, 115, 117, 118, 119, 125, 127, 132, 140, 141, 142, 144)); // TODO: Check after every update. + public NetHandlerPlayServer(MinecraftServer server, NetworkManager networkManagerIn, EntityPlayerMP playerIn) { this.serverController = server; -@@ -165,8 +233,13 @@ +@@ -165,8 +234,13 @@ networkManagerIn.setNetHandler(this); this.player = playerIn; playerIn.connection = this; @@ -155,7 +156,7 @@ public void update() { this.captureCurrentPosition(); -@@ -226,7 +299,7 @@ +@@ -226,7 +300,7 @@ this.serverController.profiler.startSection("keepAlive"); long i = this.currentTimeMillis(); @@ -164,7 +165,7 @@ { if (this.field_194403_g) { -@@ -242,11 +315,14 @@ +@@ -242,11 +316,14 @@ } this.serverController.profiler.endSection(); @@ -182,7 +183,7 @@ if (this.itemDropThreshold > 0) { -@@ -255,11 +331,12 @@ +@@ -255,11 +332,12 @@ if (this.player.getLastActiveTime() > 0L && this.serverController.getMaxPlayerIdleMinutes() > 0 && MinecraftServer.getCurrentTimeMillis() - this.player.getLastActiveTime() > (long)(this.serverController.getMaxPlayerIdleMinutes() * 1000 * 60)) { @@ -196,7 +197,7 @@ { this.firstGoodX = this.player.posX; this.firstGoodY = this.player.posY; -@@ -274,23 +351,48 @@ +@@ -274,23 +352,48 @@ return this.netManager; } @@ -254,7 +255,7 @@ } public void processInput(CPacketInput packetIn) -@@ -345,9 +447,34 @@ +@@ -345,9 +448,34 @@ double d9 = entity.motionX * entity.motionX + entity.motionY * entity.motionY + entity.motionZ * entity.motionZ; double d10 = d6 * d6 + d7 * d7 + d8 * d8; @@ -292,7 +293,7 @@ this.netManager.sendPacket(new SPacketMoveVehicle(entity)); return; } -@@ -370,10 +497,9 @@ +@@ -370,12 +498,11 @@ d10 = d6 * d6 + d7 * d7 + d8 * d8; boolean flag1 = false; @@ -302,14 +303,28 @@ flag1 = true; - LOGGER.warn("{} moved wrongly!", (Object)entity.getName()); } - +- ++ Location curPos = this.getPlayer().getLocation(); // Spigot entity.setPositionAndRotation(d3, d4, d5, f, f1); -@@ -388,6 +514,62 @@ + this.player.setPositionAndRotation(d3, d4, d5, this.player.rotationYaw, this.player.rotationPitch); // Forge - Resync player position on vehicle moving + boolean flag2 = worldserver.getCollisionBoxes(entity, entity.getEntityBoundingBox().shrink(0.0625D)).isEmpty(); +@@ -388,6 +515,73 @@ return; } + // CraftBukkit start - fire PlayerMoveEvent + Player player = this.getPlayer(); ++ // Spigot Start ++ if ( !hasMoved ) ++ { ++ lastPosX = curPos.getX(); ++ lastPosY = curPos.getY(); ++ lastPosZ = curPos.getZ(); ++ lastYaw = curPos.getYaw(); ++ lastPitch = curPos.getPitch(); ++ hasMoved = true; ++ } ++ // Spigot End + Location from = new Location(player.getWorld(), lastPosX, lastPosY, lastPosZ, lastYaw, lastPitch); // Get the Players previous Event location. + Location to = player.getLocation().clone(); // Start off the To location as the Players current location. + @@ -335,7 +350,7 @@ + this.lastPitch = to.getPitch(); + + // Skip the first time we do this -+ if (from.getX() != Double.MAX_VALUE) { ++ if (true) { // Spigot - don't skip any move events + Location oldTo = to.clone(); + PlayerMoveEvent event = new PlayerMoveEvent(player, from, to); + this.server.getPluginManager().callEvent(event); @@ -367,7 +382,7 @@ this.serverController.getPlayerList().serverUpdateMovingPlayer(this.player); this.player.addMovementStat(this.player.posX - d0, this.player.posY - d1, this.player.posZ - d2); this.vehicleFloating = d11 >= -0.03125D && !this.serverController.isFlightAllowed() && !worldserver.checkBlockCollision(entity.getEntityBoundingBox().grow(0.0625D).expand(0.0D, -0.55D, 0.0D)); -@@ -402,7 +584,7 @@ +@@ -402,7 +596,7 @@ { PacketThreadUtil.checkThreadAndEnqueue(packetIn, this, this.player.getServerWorld()); @@ -376,7 +391,7 @@ { this.player.setPositionAndRotation(this.targetPos.x, this.targetPos.y, this.targetPos.z, this.player.rotationYaw, this.player.rotationPitch); -@@ -461,7 +643,7 @@ +@@ -461,7 +655,7 @@ { WorldServer worldserver = this.serverController.getWorld(this.player.dimension); @@ -385,7 +400,7 @@ { if (this.networkTickCount == 0) { -@@ -475,6 +657,7 @@ +@@ -475,6 +669,7 @@ this.lastPositionUpdate = this.networkTickCount; this.setPlayerLocation(this.targetPos.x, this.targetPos.y, this.targetPos.z, this.player.rotationYaw, this.player.rotationPitch); } @@ -393,7 +408,7 @@ } else { -@@ -484,9 +667,17 @@ +@@ -484,9 +679,17 @@ { this.player.setPositionAndRotation(this.player.posX, this.player.posY, this.player.posZ, packetIn.getYaw(this.player.rotationYaw), packetIn.getPitch(this.player.rotationPitch)); this.serverController.getPlayerList().serverUpdateMovingPlayer(this.player); @@ -411,7 +426,7 @@ double d0 = this.player.posX; double d1 = this.player.posY; double d2 = this.player.posZ; -@@ -514,19 +705,34 @@ +@@ -514,19 +717,34 @@ ++this.movePacketCounter; int i = this.movePacketCounter - this.lastMovePacketCounter; @@ -450,7 +465,7 @@ this.setPlayerLocation(this.player.posX, this.player.posY, this.player.posZ, this.player.rotationYaw, this.player.rotationPitch); return; } -@@ -557,10 +763,9 @@ +@@ -557,10 +775,9 @@ d11 = d7 * d7 + d8 * d8 + d9 * d9; boolean flag = false; @@ -462,7 +477,7 @@ } this.player.setPositionAndRotation(d4, d5, d6, f, f1); -@@ -577,6 +782,69 @@ +@@ -577,6 +794,69 @@ } } @@ -532,7 +547,7 @@ this.floating = d12 >= -0.03125D; this.floating &= !this.serverController.isFlightAllowed() && !this.player.capabilities.allowFlying; this.floating &= !this.player.isPotionActive(MobEffects.LEVITATION) && !this.player.isElytraFlying() && !worldserver.checkBlockCollision(this.player.getEntityBoundingBox().grow(0.0625D).expand(0.0D, -0.55D, 0.0D)); -@@ -598,8 +866,74 @@ +@@ -598,8 +878,74 @@ this.setPlayerLocation(x, y, z, yaw, pitch, Collections.emptySet()); } @@ -607,7 +622,7 @@ double d0 = relativeSet.contains(SPacketPlayerPosLook.EnumFlags.X) ? this.player.posX : 0.0D; double d1 = relativeSet.contains(SPacketPlayerPosLook.EnumFlags.Y) ? this.player.posY : 0.0D; double d2 = relativeSet.contains(SPacketPlayerPosLook.EnumFlags.Z) ? this.player.posZ : 0.0D; -@@ -617,6 +951,14 @@ +@@ -617,6 +963,14 @@ f1 = pitch + this.player.rotationPitch; } @@ -622,7 +637,7 @@ if (++this.teleportId == Integer.MAX_VALUE) { this.teleportId = 0; -@@ -630,6 +972,7 @@ +@@ -630,6 +984,7 @@ public void processPlayerDigging(CPacketPlayerDigging packetIn) { PacketThreadUtil.checkThreadAndEnqueue(packetIn, this, this.player.getServerWorld()); @@ -630,7 +645,7 @@ WorldServer worldserver = this.serverController.getWorld(this.player.dimension); BlockPos blockpos = packetIn.getPosition(); this.player.markPlayerActive(); -@@ -641,7 +984,16 @@ +@@ -641,7 +996,16 @@ if (!this.player.isSpectator()) { ItemStack itemstack = this.player.getHeldItem(EnumHand.OFF_HAND); @@ -648,7 +663,7 @@ this.player.setHeldItem(EnumHand.MAIN_HAND, itemstack); } -@@ -650,6 +1002,20 @@ +@@ -650,6 +1014,20 @@ if (!this.player.isSpectator()) { @@ -669,7 +684,7 @@ this.player.dropItem(false); } -@@ -694,7 +1060,15 @@ +@@ -694,7 +1072,15 @@ } else { @@ -685,7 +700,7 @@ } } else -@@ -725,6 +1099,7 @@ +@@ -725,6 +1111,7 @@ public void processTryUseItemOnBlock(CPacketPlayerTryUseItemOnBlock packetIn) { PacketThreadUtil.checkThreadAndEnqueue(packetIn, this, this.player.getServerWorld()); @@ -693,7 +708,7 @@ WorldServer worldserver = this.serverController.getWorld(this.player.dimension); EnumHand enumhand = packetIn.getHand(); ItemStack itemstack = this.player.getHeldItem(enumhand); -@@ -738,6 +1113,13 @@ +@@ -738,6 +1125,13 @@ dist *= dist; if (this.targetPos == null && this.player.getDistanceSq((double)blockpos.getX() + 0.5D, (double)blockpos.getY() + 0.5D, (double)blockpos.getZ() + 0.5D) < dist && !this.serverController.isBlockProtected(worldserver, blockpos, this.player) && worldserver.getWorldBorder().contains(blockpos)) { @@ -707,7 +722,7 @@ this.player.interactionManager.processRightClickBlock(this.player, worldserver, itemstack, enumhand, blockpos, enumfacing, packetIn.getFacingX(), packetIn.getFacingY(), packetIn.getFacingZ()); } } -@@ -755,6 +1137,7 @@ +@@ -755,6 +1149,7 @@ public void processTryUseItem(CPacketPlayerTryUseItem packetIn) { PacketThreadUtil.checkThreadAndEnqueue(packetIn, this, this.player.getServerWorld()); @@ -715,7 +730,7 @@ WorldServer worldserver = this.serverController.getWorld(this.player.dimension); EnumHand enumhand = packetIn.getHand(); ItemStack itemstack = this.player.getHeldItem(enumhand); -@@ -762,7 +1145,46 @@ +@@ -762,7 +1157,46 @@ if (!itemstack.isEmpty()) { @@ -763,7 +778,7 @@ } } -@@ -774,7 +1196,8 @@ +@@ -774,7 +1208,8 @@ { Entity entity = null; @@ -773,7 +788,7 @@ { if (worldserver != null) { -@@ -792,6 +1215,7 @@ +@@ -792,6 +1227,7 @@ this.player.setSpectatingEntity(this.player); this.player.dismountRidingEntity(); @@ -781,7 +796,7 @@ if (entity.world == this.player.world) { this.player.setPositionAndUpdate(entity.posX, entity.posY, entity.posZ); -@@ -823,12 +1247,16 @@ +@@ -823,12 +1259,16 @@ this.serverController.getPlayerList().syncPlayerInventory(this.player); net.minecraftforge.fml.common.FMLCommonHandler.instance().firePlayerChangedDimensionEvent(this.player, prevDimension, this.player.dimension); } @@ -798,7 +813,7 @@ } public void processSteerBoat(CPacketSteerBoat packetIn) -@@ -844,13 +1272,27 @@ +@@ -844,13 +1284,27 @@ public void onDisconnect(ITextComponent reason) { @@ -828,11 +843,11 @@ if (this.serverController.isSinglePlayer() && this.player.getName().equals(this.serverController.getServerOwner())) { -@@ -877,6 +1319,13 @@ +@@ -877,6 +1331,13 @@ } } -+ if (packetIn == null) { ++ if (packetIn == null || this.processedDisconnect) { // Spigot + return; + } else if (packetIn instanceof SPacketSpawnPosition) { + SPacketSpawnPosition packet6 = (SPacketSpawnPosition) packetIn; @@ -842,7 +857,7 @@ try { this.netManager.sendPacket(packetIn); -@@ -899,23 +1348,42 @@ +@@ -899,23 +1360,42 @@ public void processHeldItemChange(CPacketHeldItemChange packetIn) { PacketThreadUtil.checkThreadAndEnqueue(packetIn, this, this.player.getServerWorld()); @@ -888,7 +903,7 @@ { TextComponentTranslation textcomponenttranslation = new TextComponentTranslation("chat.cannotSend", new Object[0]); textcomponenttranslation.getStyle().setColor(TextFormatting.RED); -@@ -931,14 +1399,54 @@ +@@ -931,47 +1411,277 @@ { if (!ChatAllowedCharacters.isAllowedCharacter(s.charAt(i))) { @@ -936,6 +951,18 @@ + LOGGER.warn(this.player.getName() + " tried to send an empty message"); + } else if (getPlayer().isConversing()) { + getPlayer().acceptConversationInput(s); ++ // Spigot start ++ final String message = s; ++ this.serverController.processQueue.add(new Waitable() ++ { ++ @Override ++ protected Object evaluate() ++ { ++ getPlayer().acceptConversationInput(message); ++ return null; ++ } ++ }); ++ // Spigot end + } else if (this.player.getChatVisibility() == EntityPlayer.EnumChatVisibility.SYSTEM) { // Re-add "Command Only" flag check + TextComponentTranslation chatmessage = new TextComponentTranslation("chat.cannotSend", new Object[0]); + @@ -947,8 +974,15 @@ } else { -@@ -948,30 +1456,205 @@ - this.serverController.getPlayerList().sendMessage(itextcomponent, false); + ITextComponent itextcomponent = new TextComponentTranslation("chat.type.text", this.player.getDisplayName(), net.minecraftforge.common.ForgeHooks.newChatWithLinks(s)); + itextcomponent = net.minecraftforge.common.ForgeHooks.onServerChatEvent(this, s, itextcomponent); +- if (itextcomponent == null) return; +- this.serverController.getPlayerList().sendMessage(itextcomponent, false); ++ if (itextcomponent != null && ((TextComponentTranslation)itextcomponent).getFormatArgs()[((TextComponentTranslation)itextcomponent).getFormatArgs().length - 1] instanceof String) ++ { ++ // use event message from Forge ++ s = (String) ((TextComponentTranslation)itextcomponent).getFormatArgs()[((TextComponentTranslation)itextcomponent).getFormatArgs().length - 1]; ++ } } - this.chatSpamThresholdCount += 20; @@ -1158,15 +1192,24 @@ this.player.markPlayerActive(); switch (packetIn.getAction()) -@@ -1053,6 +1736,7 @@ +@@ -1053,8 +1763,16 @@ public void processUseEntity(CPacketUseEntity packetIn) { PacketThreadUtil.checkThreadAndEnqueue(packetIn, this, this.player.getServerWorld()); + if (this.player.isMovementBlocked()) return; WorldServer worldserver = this.serverController.getWorld(this.player.dimension); Entity entity = packetIn.getEntityFromWorld(worldserver); ++ // Spigot Start ++ if ( entity == player && !player.isSpectator() ) ++ { ++ disconnect( "Cannot interact with self!" ); ++ return; ++ } ++ // Spigot End this.player.markPlayerActive(); -@@ -1069,20 +1753,58 @@ + + if (entity != null) +@@ -1069,20 +1787,58 @@ if (this.player.getDistanceSq(entity) < d0) { @@ -1226,7 +1269,7 @@ { this.disconnect(new TextComponentTranslation("multiplayer.disconnect.invalid_entity_attacked", new Object[0])); this.serverController.logWarning("Player " + this.player.getName() + " tried to attack an invalid entity"); -@@ -1090,6 +1812,10 @@ +@@ -1090,6 +1846,10 @@ } this.player.attackTargetEntityWithCurrentItem(entity); @@ -1237,7 +1280,7 @@ } } } -@@ -1108,7 +1834,8 @@ +@@ -1108,7 +1868,8 @@ if (this.player.queuedEndExit) { this.player.queuedEndExit = false; @@ -1247,7 +1290,7 @@ CriteriaTriggers.CHANGED_DIMENSION.trigger(this.player, DimensionType.THE_END, DimensionType.OVERWORLD); } else -@@ -1136,17 +1863,21 @@ +@@ -1136,17 +1897,21 @@ public void processCloseWindow(CPacketCloseWindow packetIn) { PacketThreadUtil.checkThreadAndEnqueue(packetIn, this, this.player.getServerWorld()); @@ -1271,7 +1314,7 @@ { NonNullList nonnulllist = NonNullList.create(); -@@ -1159,9 +1890,286 @@ +@@ -1159,9 +1924,286 @@ } else { @@ -1560,7 +1603,7 @@ { this.player.connection.sendPacket(new SPacketConfirmTransaction(packetIn.getWindowId(), packetIn.getActionNumber(), true)); this.player.isChangingQuantityOnly = true; -@@ -1178,8 +2186,8 @@ +@@ -1178,8 +2220,8 @@ for (int j = 0; j < this.player.openContainer.inventorySlots.size(); ++j) { @@ -1571,7 +1614,7 @@ nonnulllist1.add(itemstack1); } -@@ -1203,6 +2211,7 @@ +@@ -1203,6 +2245,7 @@ public void processEnchantItem(CPacketEnchantItem packetIn) { PacketThreadUtil.checkThreadAndEnqueue(packetIn, this, this.player.getServerWorld()); @@ -1579,7 +1622,7 @@ this.player.markPlayerActive(); if (this.player.openContainer.windowId == packetIn.getWindowId() && this.player.openContainer.getCanCraft(this.player) && !this.player.isSpectator()) -@@ -1242,8 +2251,47 @@ +@@ -1242,8 +2285,47 @@ } boolean flag1 = packetIn.getSlotId() >= 1 && packetIn.getSlotId() <= 45; @@ -1628,7 +1671,7 @@ if (flag1 && flag2) { if (itemstack.isEmpty()) -@@ -1273,6 +2321,7 @@ +@@ -1273,6 +2355,7 @@ public void processConfirmTransaction(CPacketConfirmTransaction packetIn) { PacketThreadUtil.checkThreadAndEnqueue(packetIn, this, this.player.getServerWorld()); @@ -1636,7 +1679,7 @@ Short oshort = this.pendingTransactions.lookup(this.player.openContainer.windowId); if (oshort != null && packetIn.getUid() == oshort.shortValue() && this.player.openContainer.windowId == packetIn.getWindowId() && !this.player.openContainer.getCanCraft(this.player) && !this.player.isSpectator()) -@@ -1284,6 +2333,7 @@ +@@ -1284,6 +2367,7 @@ public void processUpdateSign(CPacketUpdateSign packetIn) { PacketThreadUtil.checkThreadAndEnqueue(packetIn, this, this.player.getServerWorld()); @@ -1644,7 +1687,7 @@ this.player.markPlayerActive(); WorldServer worldserver = this.serverController.getWorld(this.player.dimension); BlockPos blockpos = packetIn.getPosition(); -@@ -1300,19 +2350,35 @@ +@@ -1300,19 +2384,35 @@ TileEntitySign tileentitysign = (TileEntitySign)tileentity; @@ -1682,7 +1725,7 @@ tileentitysign.markDirty(); worldserver.notifyBlockUpdate(blockpos, iblockstate, iblockstate, 3); } -@@ -1320,6 +2386,7 @@ +@@ -1320,6 +2420,7 @@ public void processKeepAlive(CPacketKeepAlive packetIn) { @@ -1690,7 +1733,7 @@ if (this.field_194403_g && packetIn.getKey() == this.field_194404_h) { int i = (int)(this.currentTimeMillis() - this.field_194402_f); -@@ -1328,7 +2395,11 @@ +@@ -1328,7 +2429,11 @@ } else if (!this.player.getName().equals(this.serverController.getServerOwner())) { @@ -1703,7 +1746,7 @@ } } -@@ -1340,12 +2411,25 @@ +@@ -1340,12 +2445,25 @@ public void processPlayerAbilities(CPacketPlayerAbilities packetIn) { PacketThreadUtil.checkThreadAndEnqueue(packetIn, this, this.player.getServerWorld()); @@ -1730,7 +1773,7 @@ List list = Lists.newArrayList(); for (String s : this.serverController.getTabCompletions(this.player, packetIn.getMessage(), packetIn.getTargetBlock(), packetIn.hasTargetBlock())) -@@ -1369,6 +2453,11 @@ +@@ -1369,6 +2487,11 @@ if ("MC|BEdit".equals(s)) { @@ -1742,7 +1785,7 @@ PacketBuffer packetbuffer = packetIn.getBufferData(); try -@@ -1395,15 +2484,22 @@ +@@ -1395,15 +2518,22 @@ if (itemstack.getItem() == Items.WRITABLE_BOOK && itemstack.getItem() == itemstack1.getItem()) { itemstack1.setTagInfo("pages", itemstack.getTagCompound().getTagList("pages", 8)); @@ -1765,7 +1808,7 @@ PacketBuffer packetbuffer1 = packetIn.getBufferData(); try -@@ -1443,12 +2539,14 @@ +@@ -1443,12 +2573,14 @@ } itemstack2.setTagInfo("pages", nbttaglist); @@ -1781,7 +1824,7 @@ } } else if ("MC|TrSel".equals(s)) -@@ -1466,6 +2564,7 @@ +@@ -1466,6 +2598,7 @@ catch (Exception exception5) { LOGGER.error("Couldn't select trade", (Throwable)exception5); @@ -1789,7 +1832,7 @@ } } else if ("MC|AdvCmd".equals(s)) -@@ -1528,6 +2627,7 @@ +@@ -1528,6 +2661,7 @@ catch (Exception exception4) { LOGGER.error("Couldn't set command block", (Throwable)exception4); @@ -1797,7 +1840,7 @@ } } else if ("MC|AutoCmd".equals(s)) -@@ -1606,6 +2706,7 @@ +@@ -1606,6 +2740,7 @@ catch (Exception exception3) { LOGGER.error("Couldn't set command block", (Throwable)exception3); @@ -1805,7 +1848,7 @@ } } else if ("MC|Beacon".equals(s)) -@@ -1632,6 +2733,7 @@ +@@ -1632,6 +2767,7 @@ catch (Exception exception2) { LOGGER.error("Couldn't set beacon", (Throwable)exception2); @@ -1813,7 +1856,7 @@ } } } -@@ -1743,6 +2845,7 @@ +@@ -1743,6 +2879,7 @@ catch (Exception exception1) { LOGGER.error("Couldn't set structure block", (Throwable)exception1); @@ -1821,7 +1864,7 @@ } } else if ("MC|PickItem".equals(s)) -@@ -1760,7 +2863,43 @@ +@@ -1760,7 +2897,43 @@ catch (Exception exception) { LOGGER.error("Couldn't pick item", (Throwable)exception);