001    package net.minecraft.network.packet;
002    
003    import java.io.DataInputStream;
004    import java.io.DataOutputStream;
005    import java.io.IOException;
006    
007    import cpw.mods.fml.common.network.FMLNetworkHandler;
008    import net.minecraft.world.EnumGameType;
009    import net.minecraft.world.WorldType;
010    
011    public class Packet1Login extends Packet
012    {
013        /** The player's entity ID */
014        public int clientEntityId = 0;
015        public WorldType terrainType;
016        public boolean hardcoreMode;
017        public EnumGameType gameType;
018    
019        /** -1: The Nether, 0: The Overworld, 1: The End */
020        public int dimension;
021    
022        /** The difficulty setting byte. */
023        public byte difficultySetting;
024    
025        /** Defaults to 128 */
026        public byte worldHeight;
027    
028        /** The maximum players. */
029        public byte maxPlayers;
030    
031        private boolean vanillaCompatible;
032        
033        public Packet1Login()
034        {
035            this.vanillaCompatible = FMLNetworkHandler.vanillaLoginPacketCompatibility();
036        }
037    
038        public Packet1Login(int par1, WorldType par2WorldType, EnumGameType par3EnumGameType, boolean par4, int par5, int par6, int par7, int par8)
039        {
040            this.clientEntityId = par1;
041            this.terrainType = par2WorldType;
042            this.dimension = par5;
043            this.difficultySetting = (byte)par6;
044            this.gameType = par3EnumGameType;
045            this.worldHeight = (byte)par7;
046            this.maxPlayers = (byte)par8;
047            this.hardcoreMode = par4;
048            this.vanillaCompatible = false;
049        }
050    
051        /**
052         * Abstract. Reads the raw packet data from the data stream.
053         */
054        public void readPacketData(DataInputStream par1DataInputStream) throws IOException
055        {
056            this.clientEntityId = par1DataInputStream.readInt();
057            String var2 = readString(par1DataInputStream, 16);
058            this.terrainType = WorldType.parseWorldType(var2);
059    
060            if (this.terrainType == null)
061            {
062                this.terrainType = WorldType.DEFAULT;
063            }
064    
065            byte var3 = par1DataInputStream.readByte();
066            this.hardcoreMode = (var3 & 8) == 8;
067            int var4 = var3 & -9;
068            this.gameType = EnumGameType.getByID(var4);
069    
070            if (vanillaCompatible)
071            {
072                this.dimension = par1DataInputStream.readByte();
073            }
074            else
075            {
076                this.dimension = par1DataInputStream.readInt();
077            }
078    
079            this.difficultySetting = par1DataInputStream.readByte();
080            this.worldHeight = par1DataInputStream.readByte();
081            this.maxPlayers = par1DataInputStream.readByte();
082        }
083    
084        /**
085         * Abstract. Writes the raw packet data to the data stream.
086         */
087        public void writePacketData(DataOutputStream par1DataOutputStream) throws IOException
088        {
089            par1DataOutputStream.writeInt(this.clientEntityId);
090            writeString(this.terrainType == null ? "" : this.terrainType.getWorldTypeName(), par1DataOutputStream);
091            int var2 = this.gameType.getID();
092    
093            if (this.hardcoreMode)
094            {
095                var2 |= 8;
096            }
097    
098            par1DataOutputStream.writeByte(var2);
099    
100            if (vanillaCompatible)
101            {
102                par1DataOutputStream.writeByte(this.dimension);
103            }
104            else
105            {
106                par1DataOutputStream.writeInt(this.dimension);
107            }
108    
109            par1DataOutputStream.writeByte(this.difficultySetting);
110            par1DataOutputStream.writeByte(this.worldHeight);
111            par1DataOutputStream.writeByte(this.maxPlayers);
112        }
113    
114        /**
115         * Passes this Packet on to the NetHandler for processing.
116         */
117        public void processPacket(NetHandler par1NetHandler)
118        {
119            par1NetHandler.handleLogin(this);
120        }
121    
122        /**
123         * Abstract. Return the size of the packet (not counting the header).
124         */
125        public int getPacketSize()
126        {
127            int var1 = 0;
128    
129            if (this.terrainType != null)
130            {
131                var1 = this.terrainType.getWorldTypeName().length();
132            }
133    
134            return 6 + 2 * var1 + 4 + 4 + 1 + 1 + 1 + (vanillaCompatible ? 0 : 3);
135        }
136    }