package net.minecraft.network; import java.io.ByteArrayInputStream; import java.io.DataInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.Random; import java.util.logging.Logger; import cpw.mods.fml.common.network.FMLNetworkHandler; import net.minecraft.entity.Entity; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.ContainerBeacon; import net.minecraft.inventory.ContainerMerchant; import net.minecraft.inventory.ContainerRepair; import net.minecraft.inventory.Slot; import net.minecraft.item.Item; import net.minecraft.item.ItemEditableBook; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemWritableBook; import net.minecraft.nbt.NBTTagString; import net.minecraft.network.packet.NetHandler; import net.minecraft.network.packet.Packet; import net.minecraft.network.packet.Packet0KeepAlive; import net.minecraft.network.packet.Packet101CloseWindow; import net.minecraft.network.packet.Packet102WindowClick; import net.minecraft.network.packet.Packet103SetSlot; import net.minecraft.network.packet.Packet106Transaction; import net.minecraft.network.packet.Packet107CreativeSetSlot; import net.minecraft.network.packet.Packet108EnchantItem; import net.minecraft.network.packet.Packet10Flying; import net.minecraft.network.packet.Packet130UpdateSign; import net.minecraft.network.packet.Packet131MapData; import net.minecraft.network.packet.Packet13PlayerLookMove; import net.minecraft.network.packet.Packet14BlockDig; import net.minecraft.network.packet.Packet15Place; import net.minecraft.network.packet.Packet16BlockItemSwitch; import net.minecraft.network.packet.Packet18Animation; import net.minecraft.network.packet.Packet19EntityAction; import net.minecraft.network.packet.Packet202PlayerAbilities; import net.minecraft.network.packet.Packet203AutoComplete; import net.minecraft.network.packet.Packet204ClientInfo; import net.minecraft.network.packet.Packet205ClientCommand; import net.minecraft.network.packet.Packet250CustomPayload; import net.minecraft.network.packet.Packet255KickDisconnect; import net.minecraft.network.packet.Packet3Chat; import net.minecraft.network.packet.Packet53BlockChange; import net.minecraft.network.packet.Packet7UseEntity; import net.minecraft.network.packet.Packet9Respawn; import net.minecraft.server.MinecraftServer; import net.minecraft.server.management.BanEntry; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityBeacon; import net.minecraft.tileentity.TileEntityCommandBlock; import net.minecraft.tileentity.TileEntitySign; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.ChatAllowedCharacters; import net.minecraft.util.ChunkCoordinates; import net.minecraft.util.IntHashMap; import net.minecraft.util.MathHelper; import net.minecraft.world.WorldServer; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.Event; import net.minecraftforge.event.ForgeEventFactory; import net.minecraftforge.event.ServerChatEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent.Action; public class NetServerHandler extends NetHandler { /** The logging system. */ public static Logger logger = Logger.getLogger("Minecraft"); /** The underlying network manager for this server handler. */ public INetworkManager netManager; /** This is set to true whenever a player disconnects from the server. */ public boolean connectionClosed = false; /** Reference to the MinecraftServer object. */ private MinecraftServer mcServer; /** Reference to the EntityPlayerMP object. */ public EntityPlayerMP playerEntity; /** incremented each tick */ private int currentTicks; /** * player is kicked if they float for over 80 ticks without flying enabled */ public int ticksForFloatKick; private boolean field_72584_h; private int keepAliveRandomID; private long keepAliveTimeSent; private static Random randomGenerator = new Random(); private long ticksOfLastKeepAlive; private int chatSpamThresholdCount = 0; private int creativeItemCreationSpamThresholdTally = 0; /** The last known x position for this connection. */ private double lastPosX; /** The last known y position for this connection. */ private double lastPosY; /** The last known z position for this connection. */ private double lastPosZ; /** is true when the player has moved since his last movement packet */ private boolean hasMoved = true; private IntHashMap field_72586_s = new IntHashMap(); public NetServerHandler(MinecraftServer par1, INetworkManager par2, EntityPlayerMP par3) { this.mcServer = par1; this.netManager = par2; par2.setNetHandler(this); this.playerEntity = par3; par3.playerNetServerHandler = this; } /** * run once each game tick */ public void networkTick() { this.field_72584_h = false; ++this.currentTicks; this.mcServer.theProfiler.startSection("packetflow"); this.netManager.processReadPackets(); this.mcServer.theProfiler.endStartSection("keepAlive"); if ((long)this.currentTicks - this.ticksOfLastKeepAlive > 20L) { this.ticksOfLastKeepAlive = (long)this.currentTicks; this.keepAliveTimeSent = System.nanoTime() / 1000000L; this.keepAliveRandomID = randomGenerator.nextInt(); this.sendPacketToPlayer(new Packet0KeepAlive(this.keepAliveRandomID)); } if (this.chatSpamThresholdCount > 0) { --this.chatSpamThresholdCount; } if (this.creativeItemCreationSpamThresholdTally > 0) { --this.creativeItemCreationSpamThresholdTally; } this.mcServer.theProfiler.endStartSection("playerTick"); this.mcServer.theProfiler.endSection(); } public void kickPlayerFromServer(String par1Str) { if (!this.connectionClosed) { this.playerEntity.mountEntityAndWakeUp(); this.sendPacketToPlayer(new Packet255KickDisconnect(par1Str)); this.netManager.serverShutdown(); this.mcServer.getConfigurationManager().sendPacketToAllPlayers(new Packet3Chat("\u00a7e" + this.playerEntity.username + " left the game.")); this.mcServer.getConfigurationManager().playerLoggedOut(this.playerEntity); this.connectionClosed = true; } } public void handleFlying(Packet10Flying par1Packet10Flying) { WorldServer var2 = this.mcServer.worldServerForDimension(this.playerEntity.dimension); this.field_72584_h = true; if (!this.playerEntity.playerConqueredTheEnd) { double var3; if (!this.hasMoved) { var3 = par1Packet10Flying.yPosition - this.lastPosY; if (par1Packet10Flying.xPosition == this.lastPosX && var3 * var3 < 0.01D && par1Packet10Flying.zPosition == this.lastPosZ) { this.hasMoved = true; } } if (this.hasMoved) { double var5; double var7; double var9; double var13; if (this.playerEntity.ridingEntity != null) { float var34 = this.playerEntity.rotationYaw; float var4 = this.playerEntity.rotationPitch; this.playerEntity.ridingEntity.updateRiderPosition(); var5 = this.playerEntity.posX; var7 = this.playerEntity.posY; var9 = this.playerEntity.posZ; double var35 = 0.0D; var13 = 0.0D; if (par1Packet10Flying.rotating) { var34 = par1Packet10Flying.yaw; var4 = par1Packet10Flying.pitch; } if (par1Packet10Flying.moving && par1Packet10Flying.yPosition == -999.0D && par1Packet10Flying.stance == -999.0D) { if (Math.abs(par1Packet10Flying.xPosition) > 1.0D || Math.abs(par1Packet10Flying.zPosition) > 1.0D) { System.err.println(this.playerEntity.username + " was caught trying to crash the server with an invalid position."); this.kickPlayerFromServer("Nope!"); return; } var35 = par1Packet10Flying.xPosition; var13 = par1Packet10Flying.zPosition; } this.playerEntity.onGround = par1Packet10Flying.onGround; this.playerEntity.onUpdateEntity(); this.playerEntity.moveEntity(var35, 0.0D, var13); this.playerEntity.setPositionAndRotation(var5, var7, var9, var34, var4); this.playerEntity.motionX = var35; this.playerEntity.motionZ = var13; if (this.playerEntity.ridingEntity != null) { var2.uncheckedUpdateEntity(this.playerEntity.ridingEntity, true); } if (this.playerEntity.ridingEntity != null) { this.playerEntity.ridingEntity.updateRiderPosition(); } if (!this.hasMoved) //Fixes teleportation kick while riding entities { return; } this.mcServer.getConfigurationManager().serverUpdateMountedMovingPlayer(this.playerEntity); this.lastPosX = this.playerEntity.posX; this.lastPosY = this.playerEntity.posY; this.lastPosZ = this.playerEntity.posZ; var2.updateEntity(this.playerEntity); return; } if (this.playerEntity.isPlayerSleeping()) { this.playerEntity.onUpdateEntity(); this.playerEntity.setPositionAndRotation(this.lastPosX, this.lastPosY, this.lastPosZ, this.playerEntity.rotationYaw, this.playerEntity.rotationPitch); var2.updateEntity(this.playerEntity); return; } var3 = this.playerEntity.posY; this.lastPosX = this.playerEntity.posX; this.lastPosY = this.playerEntity.posY; this.lastPosZ = this.playerEntity.posZ; var5 = this.playerEntity.posX; var7 = this.playerEntity.posY; var9 = this.playerEntity.posZ; float var11 = this.playerEntity.rotationYaw; float var12 = this.playerEntity.rotationPitch; if (par1Packet10Flying.moving && par1Packet10Flying.yPosition == -999.0D && par1Packet10Flying.stance == -999.0D) { par1Packet10Flying.moving = false; } if (par1Packet10Flying.moving) { var5 = par1Packet10Flying.xPosition; var7 = par1Packet10Flying.yPosition; var9 = par1Packet10Flying.zPosition; var13 = par1Packet10Flying.stance - par1Packet10Flying.yPosition; if (!this.playerEntity.isPlayerSleeping() && (var13 > 1.65D || var13 < 0.1D)) { this.kickPlayerFromServer("Illegal stance"); logger.warning(this.playerEntity.username + " had an illegal stance: " + var13); return; } if (Math.abs(par1Packet10Flying.xPosition) > 3.2E7D || Math.abs(par1Packet10Flying.zPosition) > 3.2E7D) { this.kickPlayerFromServer("Illegal position"); return; } } if (par1Packet10Flying.rotating) { var11 = par1Packet10Flying.yaw; var12 = par1Packet10Flying.pitch; } this.playerEntity.onUpdateEntity(); this.playerEntity.ySize = 0.0F; this.playerEntity.setPositionAndRotation(this.lastPosX, this.lastPosY, this.lastPosZ, var11, var12); if (!this.hasMoved) { return; } var13 = var5 - this.playerEntity.posX; double var15 = var7 - this.playerEntity.posY; double var17 = var9 - this.playerEntity.posZ; double var19 = Math.min(Math.abs(var13), Math.abs(this.playerEntity.motionX)); double var21 = Math.min(Math.abs(var15), Math.abs(this.playerEntity.motionY)); double var23 = Math.min(Math.abs(var17), Math.abs(this.playerEntity.motionZ)); double var25 = var19 * var19 + var21 * var21 + var23 * var23; if (var25 > 100.0D && (!this.mcServer.isSinglePlayer() || !this.mcServer.getServerOwner().equals(this.playerEntity.username))) { logger.warning(this.playerEntity.username + " moved too quickly! " + var13 + "," + var15 + "," + var17 + " (" + var19 + ", " + var21 + ", " + var23 + ")"); this.setPlayerLocation(this.lastPosX, this.lastPosY, this.lastPosZ, this.playerEntity.rotationYaw, this.playerEntity.rotationPitch); return; } float var27 = 0.0625F; boolean var28 = var2.getCollidingBoundingBoxes(this.playerEntity, this.playerEntity.boundingBox.copy().contract((double)var27, (double)var27, (double)var27)).isEmpty(); if (this.playerEntity.onGround && !par1Packet10Flying.onGround && var15 > 0.0D) { this.playerEntity.addExhaustion(0.2F); } if (!this.hasMoved) //Fixes "Moved Too Fast" kick when being teleported while moving { return; } this.playerEntity.moveEntity(var13, var15, var17); this.playerEntity.onGround = par1Packet10Flying.onGround; this.playerEntity.addMovementStat(var13, var15, var17); double var29 = var15; var13 = var5 - this.playerEntity.posX; var15 = var7 - this.playerEntity.posY; if (var15 > -0.5D || var15 < 0.5D) { var15 = 0.0D; } var17 = var9 - this.playerEntity.posZ; var25 = var13 * var13 + var15 * var15 + var17 * var17; boolean var31 = false; if (var25 > 0.0625D && !this.playerEntity.isPlayerSleeping() && !this.playerEntity.theItemInWorldManager.isCreative()) { var31 = true; logger.warning(this.playerEntity.username + " moved wrongly!"); } if (!this.hasMoved) //Fixes "Moved Too Fast" kick when being teleported while moving { return; } this.playerEntity.setPositionAndRotation(var5, var7, var9, var11, var12); boolean var32 = var2.getCollidingBoundingBoxes(this.playerEntity, this.playerEntity.boundingBox.copy().contract((double)var27, (double)var27, (double)var27)).isEmpty(); if (var28 && (var31 || !var32) && !this.playerEntity.isPlayerSleeping() && !this.playerEntity.noClip) { this.setPlayerLocation(this.lastPosX, this.lastPosY, this.lastPosZ, var11, var12); return; } AxisAlignedBB var33 = this.playerEntity.boundingBox.copy().expand((double)var27, (double)var27, (double)var27).addCoord(0.0D, -0.55D, 0.0D); if (!this.mcServer.isFlightAllowed() && !this.playerEntity.theItemInWorldManager.isCreative() && !var2.isAABBNonEmpty(var33) && !this.playerEntity.capabilities.allowFlying) { if (var29 >= -0.03125D) { ++this.ticksForFloatKick; if (this.ticksForFloatKick > 80) { logger.warning(this.playerEntity.username + " was kicked for floating too long!"); this.kickPlayerFromServer("Flying is not enabled on this server"); return; } } } else { this.ticksForFloatKick = 0; } if (!this.hasMoved) //Fixes "Moved Too Fast" kick when being teleported while moving { return; } this.playerEntity.onGround = par1Packet10Flying.onGround; this.mcServer.getConfigurationManager().serverUpdateMountedMovingPlayer(this.playerEntity); this.playerEntity.updateFlyingState(this.playerEntity.posY - var3, par1Packet10Flying.onGround); } } } /** * Moves the player to the specified destination and rotation */ public void setPlayerLocation(double par1, double par3, double par5, float par7, float par8) { this.hasMoved = false; this.lastPosX = par1; this.lastPosY = par3; this.lastPosZ = par5; this.playerEntity.setPositionAndRotation(par1, par3, par5, par7, par8); this.playerEntity.playerNetServerHandler.sendPacketToPlayer(new Packet13PlayerLookMove(par1, par3 + 1.6200000047683716D, par3, par5, par7, par8, false)); } public void handleBlockDig(Packet14BlockDig par1Packet14BlockDig) { WorldServer var2 = this.mcServer.worldServerForDimension(this.playerEntity.dimension); if (par1Packet14BlockDig.status == 4) { this.playerEntity.dropOneItem(false); } else if (par1Packet14BlockDig.status == 3) { this.playerEntity.dropOneItem(true); } else if (par1Packet14BlockDig.status == 5) { this.playerEntity.stopUsingItem(); } else { int var3 = this.mcServer.getSpawnProtectionSize(); boolean var4 = var2.provider.dimensionId != 0 || this.mcServer.getConfigurationManager().getOps().isEmpty() || this.mcServer.getConfigurationManager().areCommandsAllowed(this.playerEntity.username) || var3 <= 0 || this.mcServer.isSinglePlayer(); boolean var5 = false; if (par1Packet14BlockDig.status == 0) { var5 = true; } if (par1Packet14BlockDig.status == 1) { var5 = true; } if (par1Packet14BlockDig.status == 2) { var5 = true; } int var6 = par1Packet14BlockDig.xPosition; int var7 = par1Packet14BlockDig.yPosition; int var8 = par1Packet14BlockDig.zPosition; if (var5) { double var9 = this.playerEntity.posX - ((double)var6 + 0.5D); double var11 = this.playerEntity.posY - ((double)var7 + 0.5D) + 1.5D; double var13 = this.playerEntity.posZ - ((double)var8 + 0.5D); double var15 = var9 * var9 + var11 * var11 + var13 * var13; double dist = playerEntity.theItemInWorldManager.getBlockReachDistance() + 1; dist *= dist; if (var15 > dist) { return; } if (var7 >= this.mcServer.getBuildLimit()) { return; } } ChunkCoordinates var17 = var2.getSpawnPoint(); int var10 = MathHelper.abs_int(var6 - var17.posX); int var18 = MathHelper.abs_int(var8 - var17.posZ); if (var10 > var18) { var18 = var10; } if (par1Packet14BlockDig.status == 0) { if (var18 <= var3 && !var4) { ForgeEventFactory.onPlayerInteract(playerEntity, Action.LEFT_CLICK_BLOCK, var6, var7, var8, 0); this.playerEntity.playerNetServerHandler.sendPacketToPlayer(new Packet53BlockChange(var6, var7, var8, var2)); } else { this.playerEntity.theItemInWorldManager.onBlockClicked(var6, var7, var8, par1Packet14BlockDig.face); } } else if (par1Packet14BlockDig.status == 2) { this.playerEntity.theItemInWorldManager.uncheckedTryHarvestBlock(var6, var7, var8); if (var2.getBlockId(var6, var7, var8) != 0) { this.playerEntity.playerNetServerHandler.sendPacketToPlayer(new Packet53BlockChange(var6, var7, var8, var2)); } } else if (par1Packet14BlockDig.status == 1) { this.playerEntity.theItemInWorldManager.cancelDestroyingBlock(var6, var7, var8); if (var2.getBlockId(var6, var7, var8) != 0) { this.playerEntity.playerNetServerHandler.sendPacketToPlayer(new Packet53BlockChange(var6, var7, var8, var2)); } } } } public void handlePlace(Packet15Place par1Packet15Place) { WorldServer var2 = this.mcServer.worldServerForDimension(this.playerEntity.dimension); ItemStack var3 = this.playerEntity.inventory.getCurrentItem(); boolean var4 = false; int var5 = par1Packet15Place.getXPosition(); int var6 = par1Packet15Place.getYPosition(); int var7 = par1Packet15Place.getZPosition(); int var8 = par1Packet15Place.getDirection(); int var9 = this.mcServer.getSpawnProtectionSize(); boolean var10 = var2.provider.dimensionId != 0 || this.mcServer.getConfigurationManager().getOps().isEmpty() || this.mcServer.getConfigurationManager().areCommandsAllowed(this.playerEntity.username) || var9 <= 0 || this.mcServer.isSinglePlayer(); if (par1Packet15Place.getDirection() == 255) { if (var3 == null) { return; } PlayerInteractEvent event = ForgeEventFactory.onPlayerInteract(playerEntity, PlayerInteractEvent.Action.RIGHT_CLICK_AIR, 0, 0, 0, -1); if (event.useItem != Event.Result.DENY) { this.playerEntity.theItemInWorldManager.tryUseItem(this.playerEntity, var2, var3); } } else if (par1Packet15Place.getYPosition() >= this.mcServer.getBuildLimit() - 1 && (par1Packet15Place.getDirection() == 1 || par1Packet15Place.getYPosition() >= this.mcServer.getBuildLimit())) { this.playerEntity.playerNetServerHandler.sendPacketToPlayer(new Packet3Chat("\u00a77Height limit for building is " + this.mcServer.getBuildLimit())); var4 = true; } else { ChunkCoordinates var11 = var2.getSpawnPoint(); int var12 = MathHelper.abs_int(var5 - var11.posX); int var13 = MathHelper.abs_int(var7 - var11.posZ); if (var12 > var13) { var13 = var12; } double dist = playerEntity.theItemInWorldManager.getBlockReachDistance() + 1; dist *= dist; if (this.hasMoved && this.playerEntity.getDistanceSq((double)var5 + 0.5D, (double)var6 + 0.5D, (double)var7 + 0.5D) < dist && (var13 > var9 || var10)) { this.playerEntity.theItemInWorldManager.activateBlockOrUseItem(this.playerEntity, var2, var3, var5, var6, var7, var8, par1Packet15Place.getXOffset(), par1Packet15Place.getYOffset(), par1Packet15Place.getZOffset()); } var4 = true; } if (var4) { this.playerEntity.playerNetServerHandler.sendPacketToPlayer(new Packet53BlockChange(var5, var6, var7, var2)); if (var8 == 0) { --var6; } if (var8 == 1) { ++var6; } if (var8 == 2) { --var7; } if (var8 == 3) { ++var7; } if (var8 == 4) { --var5; } if (var8 == 5) { ++var5; } this.playerEntity.playerNetServerHandler.sendPacketToPlayer(new Packet53BlockChange(var5, var6, var7, var2)); } var3 = this.playerEntity.inventory.getCurrentItem(); if (var3 != null && var3.stackSize == 0) { this.playerEntity.inventory.mainInventory[this.playerEntity.inventory.currentItem] = null; var3 = null; } if (var3 == null || var3.getMaxItemUseDuration() == 0) { this.playerEntity.playerInventoryBeingManipulated = true; this.playerEntity.inventory.mainInventory[this.playerEntity.inventory.currentItem] = ItemStack.copyItemStack(this.playerEntity.inventory.mainInventory[this.playerEntity.inventory.currentItem]); Slot var14 = this.playerEntity.openContainer.getSlotFromInventory(this.playerEntity.inventory, this.playerEntity.inventory.currentItem); this.playerEntity.openContainer.detectAndSendChanges(); this.playerEntity.playerInventoryBeingManipulated = false; if (!ItemStack.areItemStacksEqual(this.playerEntity.inventory.getCurrentItem(), par1Packet15Place.getItemStack())) { this.sendPacketToPlayer(new Packet103SetSlot(this.playerEntity.openContainer.windowId, var14.slotNumber, this.playerEntity.inventory.getCurrentItem())); } } } public void handleErrorMessage(String par1Str, Object[] par2ArrayOfObj) { logger.info(this.playerEntity.username + " lost connection: " + par1Str); this.mcServer.getConfigurationManager().sendPacketToAllPlayers(new Packet3Chat("\u00a7e" + this.playerEntity.username + " left the game.")); this.mcServer.getConfigurationManager().playerLoggedOut(this.playerEntity); this.connectionClosed = true; if (this.mcServer.isSinglePlayer() && this.playerEntity.username.equals(this.mcServer.getServerOwner())) { logger.info("Stopping singleplayer server as player logged out"); this.mcServer.initiateShutdown(); } } /** * Default handler called for packets that don't have their own handlers in NetClientHandler; currentlly does * nothing. */ public void unexpectedPacket(Packet par1Packet) { logger.warning(this.getClass() + " wasn\'t prepared to deal with a " + par1Packet.getClass()); this.kickPlayerFromServer("Protocol error, unexpected packet"); } /** * addToSendQueue. if it is a chat packet, check before sending it */ public void sendPacketToPlayer(Packet par1Packet) { if (par1Packet instanceof Packet3Chat) { Packet3Chat var2 = (Packet3Chat)par1Packet; int var3 = this.playerEntity.getChatVisibility(); if (var3 == 2) { return; } if (var3 == 1 && !var2.getIsServer()) { return; } } this.netManager.addToSendQueue(par1Packet); } public void handleBlockItemSwitch(Packet16BlockItemSwitch par1Packet16BlockItemSwitch) { if (par1Packet16BlockItemSwitch.id >= 0 && par1Packet16BlockItemSwitch.id < InventoryPlayer.getHotbarSize()) { this.playerEntity.inventory.currentItem = par1Packet16BlockItemSwitch.id; } else { logger.warning(this.playerEntity.username + " tried to set an invalid carried item"); } } public void handleChat(Packet3Chat par1Packet3Chat) { par1Packet3Chat = FMLNetworkHandler.handleChatMessage(this, par1Packet3Chat); if (this.playerEntity.getChatVisibility() == 2) { this.sendPacketToPlayer(new Packet3Chat("Cannot send chat message.")); } else { String var2 = par1Packet3Chat.message; if (var2.length() > 100) { this.kickPlayerFromServer("Chat message too long"); } else { var2 = var2.trim(); for (int var3 = 0; var3 < var2.length(); ++var3) { if (!ChatAllowedCharacters.isAllowedCharacter(var2.charAt(var3))) { this.kickPlayerFromServer("Illegal characters in chat"); return; } } if (var2.startsWith("/")) { this.handleSlashCommand(var2); } else { if (this.playerEntity.getChatVisibility() == 1) { this.sendPacketToPlayer(new Packet3Chat("Cannot send chat message.")); return; } ServerChatEvent event = new ServerChatEvent(this.playerEntity, var2, "<" + this.playerEntity.username + "> " + var2); if (MinecraftForge.EVENT_BUS.post(event)) { return; } var2 = event.line; logger.info(var2); this.mcServer.getConfigurationManager().sendPacketToAllPlayers(new Packet3Chat(var2, false)); } this.chatSpamThresholdCount += 20; if (this.chatSpamThresholdCount > 200 && !this.mcServer.getConfigurationManager().areCommandsAllowed(this.playerEntity.username)) { this.kickPlayerFromServer("disconnect.spam"); } } } } /** * Processes a / command */ private void handleSlashCommand(String par1Str) { this.mcServer.getCommandManager().executeCommand(this.playerEntity, par1Str); } public void handleAnimation(Packet18Animation par1Packet18Animation) { if (par1Packet18Animation.animate == 1) { this.playerEntity.swingItem(); } } /** * runs registerPacket on the given Packet19EntityAction */ public void handleEntityAction(Packet19EntityAction par1Packet19EntityAction) { if (par1Packet19EntityAction.state == 1) { this.playerEntity.setSneaking(true); } else if (par1Packet19EntityAction.state == 2) { this.playerEntity.setSneaking(false); } else if (par1Packet19EntityAction.state == 4) { this.playerEntity.setSprinting(true); } else if (par1Packet19EntityAction.state == 5) { this.playerEntity.setSprinting(false); } else if (par1Packet19EntityAction.state == 3) { this.playerEntity.wakeUpPlayer(false, true, true); this.hasMoved = false; } } public void handleKickDisconnect(Packet255KickDisconnect par1Packet255KickDisconnect) { this.netManager.networkShutdown("disconnect.quitting", new Object[0]); } /** * returns 0 for memoryMapped connections */ public int packetSize() { return this.netManager.packetSize(); } public void handleUseEntity(Packet7UseEntity par1Packet7UseEntity) { WorldServer var2 = this.mcServer.worldServerForDimension(this.playerEntity.dimension); Entity var3 = var2.getEntityByID(par1Packet7UseEntity.targetEntity); if (var3 != null) { boolean var4 = this.playerEntity.canEntityBeSeen(var3); double var5 = 36.0D; if (!var4) { var5 = 9.0D; } if (this.playerEntity.getDistanceSqToEntity(var3) < var5) { if (par1Packet7UseEntity.isLeftClick == 0) { this.playerEntity.interactWith(var3); } else if (par1Packet7UseEntity.isLeftClick == 1) { this.playerEntity.attackTargetEntityWithCurrentItem(var3); } } } } public void handleClientCommand(Packet205ClientCommand par1Packet205ClientCommand) { if (par1Packet205ClientCommand.forceRespawn == 1) { if (this.playerEntity.playerConqueredTheEnd) { this.playerEntity = this.mcServer.getConfigurationManager().respawnPlayer(this.playerEntity, 0, true); } else if (this.playerEntity.getServerForPlayer().getWorldInfo().isHardcoreModeEnabled()) { if (this.mcServer.isSinglePlayer() && this.playerEntity.username.equals(this.mcServer.getServerOwner())) { this.playerEntity.playerNetServerHandler.kickPlayerFromServer("You have died. Game over, man, it\'s game over!"); this.mcServer.deleteWorldAndStopServer(); } else { BanEntry var2 = new BanEntry(this.playerEntity.username); var2.setBanReason("Death in Hardcore"); this.mcServer.getConfigurationManager().getBannedPlayers().put(var2); this.playerEntity.playerNetServerHandler.kickPlayerFromServer("You have died. Game over, man, it\'s game over!"); } } else { if (this.playerEntity.getHealth() > 0) { return; } this.playerEntity = this.mcServer.getConfigurationManager().respawnPlayer(this.playerEntity, playerEntity.dimension, false); } } } /** * If this returns false, all packets will be queued for the main thread to handle, even if they would otherwise be * processed asynchronously. Used to avoid processing packets on the client before the world has been downloaded * (which happens on the main thread) */ public boolean canProcessPacketsAsync() { return true; } /** * respawns the player */ public void handleRespawn(Packet9Respawn par1Packet9Respawn) {} public void handleCloseWindow(Packet101CloseWindow par1Packet101CloseWindow) { this.playerEntity.closeInventory(); } public void handleWindowClick(Packet102WindowClick par1Packet102WindowClick) { if (this.playerEntity.openContainer.windowId == par1Packet102WindowClick.window_Id && this.playerEntity.openContainer.isPlayerNotUsingContainer(this.playerEntity)) { ItemStack var2 = this.playerEntity.openContainer.slotClick(par1Packet102WindowClick.inventorySlot, par1Packet102WindowClick.mouseClick, par1Packet102WindowClick.holdingShift, this.playerEntity); if (ItemStack.areItemStacksEqual(par1Packet102WindowClick.itemStack, var2)) { this.playerEntity.playerNetServerHandler.sendPacketToPlayer(new Packet106Transaction(par1Packet102WindowClick.window_Id, par1Packet102WindowClick.action, true)); this.playerEntity.playerInventoryBeingManipulated = true; this.playerEntity.openContainer.detectAndSendChanges(); this.playerEntity.updateHeldItem(); this.playerEntity.playerInventoryBeingManipulated = false; } else { this.field_72586_s.addKey(this.playerEntity.openContainer.windowId, Short.valueOf(par1Packet102WindowClick.action)); this.playerEntity.playerNetServerHandler.sendPacketToPlayer(new Packet106Transaction(par1Packet102WindowClick.window_Id, par1Packet102WindowClick.action, false)); this.playerEntity.openContainer.setPlayerIsPresent(this.playerEntity, false); ArrayList var3 = new ArrayList(); for (int var4 = 0; var4 < this.playerEntity.openContainer.inventorySlots.size(); ++var4) { var3.add(((Slot)this.playerEntity.openContainer.inventorySlots.get(var4)).getStack()); } this.playerEntity.sendContainerAndContentsToPlayer(this.playerEntity.openContainer, var3); } } } public void handleEnchantItem(Packet108EnchantItem par1Packet108EnchantItem) { if (this.playerEntity.openContainer.windowId == par1Packet108EnchantItem.windowId && this.playerEntity.openContainer.isPlayerNotUsingContainer(this.playerEntity)) { this.playerEntity.openContainer.enchantItem(this.playerEntity, par1Packet108EnchantItem.enchantment); this.playerEntity.openContainer.detectAndSendChanges(); } } /** * Handle a creative slot packet. */ public void handleCreativeSetSlot(Packet107CreativeSetSlot par1Packet107CreativeSetSlot) { if (this.playerEntity.theItemInWorldManager.isCreative()) { boolean var2 = par1Packet107CreativeSetSlot.slot < 0; ItemStack var3 = par1Packet107CreativeSetSlot.itemStack; boolean var4 = par1Packet107CreativeSetSlot.slot >= 1 && par1Packet107CreativeSetSlot.slot < 36 + InventoryPlayer.getHotbarSize(); boolean var5 = var3 == null || var3.itemID < Item.itemsList.length && var3.itemID >= 0 && Item.itemsList[var3.itemID] != null; boolean var6 = var3 == null || var3.getItemDamage() >= 0 && var3.getItemDamage() >= 0 && var3.stackSize <= 64 && var3.stackSize > 0; if (var4 && var5 && var6) { if (var3 == null) { this.playerEntity.inventoryContainer.putStackInSlot(par1Packet107CreativeSetSlot.slot, (ItemStack)null); } else { this.playerEntity.inventoryContainer.putStackInSlot(par1Packet107CreativeSetSlot.slot, var3); } this.playerEntity.inventoryContainer.setPlayerIsPresent(this.playerEntity, true); } else if (var2 && var5 && var6 && this.creativeItemCreationSpamThresholdTally < 200) { this.creativeItemCreationSpamThresholdTally += 20; EntityItem var7 = this.playerEntity.dropPlayerItem(var3); if (var7 != null) { var7.func_70288_d(); } } } } public void handleTransaction(Packet106Transaction par1Packet106Transaction) { Short var2 = (Short)this.field_72586_s.lookup(this.playerEntity.openContainer.windowId); if (var2 != null && par1Packet106Transaction.shortWindowId == var2.shortValue() && this.playerEntity.openContainer.windowId == par1Packet106Transaction.windowId && !this.playerEntity.openContainer.isPlayerNotUsingContainer(this.playerEntity)) { this.playerEntity.openContainer.setPlayerIsPresent(this.playerEntity, true); } } /** * Updates Client side signs */ public void handleUpdateSign(Packet130UpdateSign par1Packet130UpdateSign) { WorldServer var2 = this.mcServer.worldServerForDimension(this.playerEntity.dimension); if (var2.blockExists(par1Packet130UpdateSign.xPosition, par1Packet130UpdateSign.yPosition, par1Packet130UpdateSign.zPosition)) { TileEntity var3 = var2.getBlockTileEntity(par1Packet130UpdateSign.xPosition, par1Packet130UpdateSign.yPosition, par1Packet130UpdateSign.zPosition); if (var3 instanceof TileEntitySign) { TileEntitySign var4 = (TileEntitySign)var3; if (!var4.isEditable()) { this.mcServer.logWarning("Player " + this.playerEntity.username + " just tried to change non-editable sign"); return; } } int var6; int var8; for (var8 = 0; var8 < 4; ++var8) { boolean var5 = true; if (par1Packet130UpdateSign.signLines[var8].length() > 15) { var5 = false; } else { for (var6 = 0; var6 < par1Packet130UpdateSign.signLines[var8].length(); ++var6) { if (ChatAllowedCharacters.allowedCharacters.indexOf(par1Packet130UpdateSign.signLines[var8].charAt(var6)) < 0) { var5 = false; } } } if (!var5) { par1Packet130UpdateSign.signLines[var8] = "!?"; } } if (var3 instanceof TileEntitySign) { var8 = par1Packet130UpdateSign.xPosition; int var9 = par1Packet130UpdateSign.yPosition; var6 = par1Packet130UpdateSign.zPosition; TileEntitySign var7 = (TileEntitySign)var3; System.arraycopy(par1Packet130UpdateSign.signLines, 0, var7.signText, 0, 4); var7.onInventoryChanged(); var2.markBlockForUpdate(var8, var9, var6); } } } /** * Handle a keep alive packet. */ public void handleKeepAlive(Packet0KeepAlive par1Packet0KeepAlive) { if (par1Packet0KeepAlive.randomId == this.keepAliveRandomID) { int var2 = (int)(System.nanoTime() / 1000000L - this.keepAliveTimeSent); this.playerEntity.ping = (this.playerEntity.ping * 3 + var2) / 4; } } /** * determine if it is a server handler */ public boolean isServerHandler() { return true; } /** * Handle a player abilities packet. */ public void handlePlayerAbilities(Packet202PlayerAbilities par1Packet202PlayerAbilities) { this.playerEntity.capabilities.isFlying = par1Packet202PlayerAbilities.getFlying() && this.playerEntity.capabilities.allowFlying; } public void handleAutoComplete(Packet203AutoComplete par1Packet203AutoComplete) { StringBuilder var2 = new StringBuilder(); String var4; for (Iterator var3 = this.mcServer.getPossibleCompletions(this.playerEntity, par1Packet203AutoComplete.getText()).iterator(); var3.hasNext(); var2.append(var4)) { var4 = (String)var3.next(); if (var2.length() > 0) { var2.append("\u0000"); } } this.playerEntity.playerNetServerHandler.sendPacketToPlayer(new Packet203AutoComplete(var2.toString())); } public void handleClientInfo(Packet204ClientInfo par1Packet204ClientInfo) { this.playerEntity.updateClientInfo(par1Packet204ClientInfo); } public void handleCustomPayload(Packet250CustomPayload par1Packet250CustomPayload) { FMLNetworkHandler.handlePacket250Packet(par1Packet250CustomPayload, netManager, this); } public void handleVanilla250Packet(Packet250CustomPayload par1Packet250CustomPayload) { DataInputStream var2; ItemStack var3; ItemStack var4; if ("MC|BEdit".equals(par1Packet250CustomPayload.channel)) { try { var2 = new DataInputStream(new ByteArrayInputStream(par1Packet250CustomPayload.data)); var3 = Packet.readItemStack(var2); if (!ItemWritableBook.validBookTagPages(var3.getTagCompound())) { throw new IOException("Invalid book tag!"); } var4 = this.playerEntity.inventory.getCurrentItem(); if (var3 != null && var3.itemID == Item.writableBook.itemID && var3.itemID == var4.itemID) { var4.setTagInfo("pages", var3.getTagCompound().getTagList("pages")); } } catch (Exception var12) { var12.printStackTrace(); } } else if ("MC|BSign".equals(par1Packet250CustomPayload.channel)) { try { var2 = new DataInputStream(new ByteArrayInputStream(par1Packet250CustomPayload.data)); var3 = Packet.readItemStack(var2); if (!ItemEditableBook.validBookTagContents(var3.getTagCompound())) { throw new IOException("Invalid book tag!"); } var4 = this.playerEntity.inventory.getCurrentItem(); if (var3 != null && var3.itemID == Item.writtenBook.itemID && var4.itemID == Item.writableBook.itemID) { var4.setTagInfo("author", new NBTTagString("author", this.playerEntity.username)); var4.setTagInfo("title", new NBTTagString("title", var3.getTagCompound().getString("title"))); var4.setTagInfo("pages", var3.getTagCompound().getTagList("pages")); var4.itemID = Item.writtenBook.itemID; } } catch (Exception var11) { var11.printStackTrace(); } } else { int var14; if ("MC|TrSel".equals(par1Packet250CustomPayload.channel)) { try { var2 = new DataInputStream(new ByteArrayInputStream(par1Packet250CustomPayload.data)); var14 = var2.readInt(); Container var16 = this.playerEntity.openContainer; if (var16 instanceof ContainerMerchant) { ((ContainerMerchant)var16).setCurrentRecipeIndex(var14); } } catch (Exception var10) { var10.printStackTrace(); } } else { int var18; if ("MC|AdvCdm".equals(par1Packet250CustomPayload.channel)) { if (!this.mcServer.isCommandBlockEnabled()) { this.playerEntity.sendChatToPlayer(this.playerEntity.translateString("advMode.notEnabled", new Object[0])); } else if (this.playerEntity.canCommandSenderUseCommand(2, "") && this.playerEntity.capabilities.isCreativeMode) { try { var2 = new DataInputStream(new ByteArrayInputStream(par1Packet250CustomPayload.data)); var14 = var2.readInt(); var18 = var2.readInt(); int var5 = var2.readInt(); String var6 = Packet.readString(var2, 256); TileEntity var7 = this.playerEntity.worldObj.getBlockTileEntity(var14, var18, var5); if (var7 != null && var7 instanceof TileEntityCommandBlock) { ((TileEntityCommandBlock)var7).setCommand(var6); this.playerEntity.worldObj.markBlockForUpdate(var14, var18, var5); this.playerEntity.sendChatToPlayer("Command set: " + var6); } } catch (Exception var9) { var9.printStackTrace(); } } else { this.playerEntity.sendChatToPlayer(this.playerEntity.translateString("advMode.notAllowed", new Object[0])); } } else if ("MC|Beacon".equals(par1Packet250CustomPayload.channel)) { if (this.playerEntity.openContainer instanceof ContainerBeacon) { try { var2 = new DataInputStream(new ByteArrayInputStream(par1Packet250CustomPayload.data)); var14 = var2.readInt(); var18 = var2.readInt(); ContainerBeacon var17 = (ContainerBeacon)this.playerEntity.openContainer; Slot var19 = var17.getSlot(0); if (var19.getHasStack()) { var19.decrStackSize(1); TileEntityBeacon var20 = var17.getBeacon(); var20.func_82128_d(var14); var20.func_82127_e(var18); var20.onInventoryChanged(); } } catch (Exception var8) { var8.printStackTrace(); } } } else if ("MC|ItemName".equals(par1Packet250CustomPayload.channel) && this.playerEntity.openContainer instanceof ContainerRepair) { ContainerRepair var13 = (ContainerRepair)this.playerEntity.openContainer; if (par1Packet250CustomPayload.data != null && par1Packet250CustomPayload.data.length >= 1) { String var15 = ChatAllowedCharacters.filerAllowedCharacters(new String(par1Packet250CustomPayload.data)); if (var15.length() <= 30) { var13.updateItemName(var15); } } else { var13.updateItemName(""); } } } } } @Override /** * Contains logic for handling packets containing arbitrary unique item data. Currently this is only for maps. */ public void handleMapData(Packet131MapData par1Packet131MapData) { FMLNetworkHandler.handlePacket131Packet(this, par1Packet131MapData); } // modloader compat -- yuk! @Override public EntityPlayerMP getPlayer() { return playerEntity; } }