/// <summary>
        /// Set Properties
        /// </summary>
        internal void SetProps(CString Packet)
        {
            bool moved = false;
            while (Packet.BytesLeft > 0)
            {
                Int32 PropId = Packet.ReadGUByte1();

                switch ((Properties)PropId)
                {
                    case Properties.NICKNAME: // 0
                        this.SetNick(Packet.ReadChars(Packet.ReadGUByte1()));
                        break;

                    case Properties.MAXPOWER: // 1
                        this.FullHearts = Packet.ReadGUByte1();
                        break;

                    case Properties.CURPOWER: // 2
                        this.Hearts = (double)Packet.ReadGUByte1() / 2;
                        break;

                    case Properties.RUPEESCOUNT: // 3
                        this.Gralats = (int)Packet.ReadGUByte3();
                        break;

                    case Properties.ARROWSCOUNT: // 4
                        this.Arrows = Packet.ReadGUByte1();
                        break;

                    case Properties.BOMBSCOUNT: // 5
                        this.Bombs = Packet.ReadGUByte1();
                        break;

                    case Properties.GLOVEPOWER: // 6
                        this.GlovePower = Packet.ReadGUByte1();
                        break;

                    case Properties.BOMBPOWER: // 7
                        this.BombPower = Packet.ReadGUByte1();
                        break;

                    case Properties.SWORDPOWER: // 8
                    {
                        Int32 sp = Packet.ReadGUByte1();
                        if (sp > 4)
                        {
                            sp -= 30;
                            Int32 len = Packet.ReadGUByte1();
                            if (len > 0)
                                this.SwordImage = Packet.ReadChars(len);
                        }
                        else this.SwordImage = "sword" + sp + ".png";

                        this.SwordPower = sp;
                        break;
                    }

                    case Properties.SHIELDPOWER: // 9
                    {
                        Int32 sp = Packet.ReadGUByte1();
                        if (sp > 3)
                        {
                            sp -= 10;
                            if (sp < 0) break;
                            Int32 len = Packet.ReadGUByte1();
                            if (len > 0)
                                this.ShieldImage = Packet.ReadChars(len);
                        }
                        else this.ShieldImage = "shield" + sp + ".png";

                        this.ShieldPower = sp;
                        break;
                    }

                    case Properties.ANIMATION: // 10
                        this.Ani = Packet.ReadChars(Packet.ReadGUByte1());
                        break;

                    case Properties.HEADIMAGE: // 11
                    {
                        Int32 len = Packet.ReadGUByte1();
                        this.HeadImage = (len < 100 ? "head" + len + ".png" : Packet.ReadChars(len - 100));
                        break;
                    }

                    case Properties.CURCHAT: // 12
                        this.Chat = Packet.ReadChars(Packet.ReadGUByte1());
                        if (PlayerLevel != null)
                            PlayerLevel.CallNPCs("onPlayerChats", new object[] { this });
                        break;

                    case Properties.PLCOLORS: // 13
                        for (int i = 0; i < 5; i++)
                            this.ColorManager[i] = Packet.ReadGUByte1();
                        break;

                    case Properties.PLAYERID: // 14
                        Packet.ReadGUByte2();
                        break;

                    case Properties.PLAYERX: // 15 - obsolete
                        Packet.ReadGUByte1();
                        break;

                    case Properties.PLAYERY: // 16 - obsolete
                        Packet.ReadGUByte1();
                        break;

                    case Properties.PLSPRITE: // 17
                        this.Dir = Packet.ReadGUByte1() % 4;
                        break;

                    case Properties.PLSTATUS: // 18
                        this.PlayerStatus = Packet.ReadGUByte1();
                        if ((this.PlayerStatus & (int)Status.DEAD) != 0)
                        {
                            if (PlayerLevel != null)
                                PlayerLevel.CallNPCs("onPlayerDies", new object[] { this });
                        }
                        break;

                    case Properties.CARRYSPRITE: // 19
                        Packet.ReadGUByte1();
                        break;

                    case Properties.CURLEVEL: // 20
                        // Set new level
                        this.Level = Packet.ReadChars(Packet.ReadGUByte1()).Trim();

                        // Remove from old level
                        if (this.PlayerLevel != null)
                            this.PlayerLevel.DeletePlayer(this);

                        // Grab Map & Level Object
                        //this.PlayerMap = (this.Level.EndsWith(".gmap") ? Server.FindMap(this.Level) : null);
                        this.AdjustLevels();

                        // Add Player
                        if (this.PlayerLevel != null)
                            this.PlayerLevel.AddPlayer(this);
                        break;

                    case Properties.HORSEIMG: // 21
                        Packet.ReadChars(Packet.ReadGUByte1());
                        break;

                    case Properties.HORSEBUSHES: // 22
                        Packet.ReadGUByte1();
                        break;

                    case Properties.EFFECTCOLOR: // 23
                    {
                        int len = Packet.ReadGUByte1();
                        if (len > 0)
                            Packet.ReadGUByte4();
                        break;
                    }

                    case Properties.CARRYNPC: // 24
                        Packet.ReadGUByte3();
                        break;

                    case Properties.APCOUNTER: // 25
                        Packet.ReadGUByte2();
                        break;

                    case Properties.MAGICPOINTS: // 26
                        this.Magic = Packet.ReadGUByte1();
                        break;

                    case Properties.KILLSCOUNT: // 27
                        this.Kills = Packet.ReadGByte3();
                        break;

                    case Properties.DEATHSCOUNT: // 28
                        this.Deaths = Packet.ReadGByte3();
                        break;

                    case Properties.ONLINESECS: // 29
                        this.OnlineTime = Packet.ReadGByte3();
                        break;

                    case Properties.IPADDRESS: // 30
                        this.IPAddress = new System.Net.IPAddress(Packet.ReadGUByte5()).ToString();
                        break;

                    case Properties.UDPPORT: // 31
                        Packet.ReadGByte3();
                        break;

                    case Properties.ALIGNMENT: // 32
                        Packet.ReadGUByte1();
                        break;

                    case Properties.ADDITFLAGS: // 33
                        Packet.ReadGUByte1();
                        break;

                    case Properties.ACCOUNTNAME: // 34
                        this.Account = Packet.ReadChars(Packet.ReadGUByte1());
                        break;

                    case Properties.BODYIMAGE: // 35
                        this.BodyImage = Packet.ReadChars(Packet.ReadGUByte1());
                        break;

                    case Properties.PLRATING: // 36
                        Packet.ReadGUByte3();
                        break;

                    case Properties.GATTRIB1: // 37
                    case Properties.GATTRIB2: // 38
                    case Properties.GATTRIB3: // 39
                    case Properties.GATTRIB4: // 40
                    case Properties.GATTRIB5: // 41
                        Packet.ReadChars(Packet.ReadGUByte1());
                        break;

                    case Properties.PLATTACHNPC: // 42
                        Packet.ReadGUByte4();
                        break;

                    case Properties.GMAPLEVELX: // 43
                        GmapX = Packet.ReadGUByte1();
                        this.AdjustLevels();
                        break;

                    case Properties.GMAPLEVELY: // 44
                        GmapY = Packet.ReadGUByte1();
                        this.AdjustLevels();
                        break;

                    case Properties.PLAYERZ: // 45
                        Packet.ReadGUByte1();
                        break;

                    case Properties.GATTRIB6: // 46
                    case Properties.GATTRIB7: // 47
                    case Properties.GATTRIB8: // 48
                    case Properties.GATTRIB9: // 49
                        Packet.ReadChars(Packet.ReadGUByte1());
                        break;

                    case Properties.JOINLEAVELV: // 50
                        Packet.ReadGUByte1();
                        break;

                    case Properties.CONNECTED: // 51
                        Server.PlayerManager.DeletePlayer(Id);
                        break;

                    case Properties.LANGUAGE: // 52
                        Packet.ReadChars(Packet.ReadGUByte1());
                        break;

                    case Properties.STATUSMSG: // 53
                        Packet.ReadGUByte1();
                        break;

                    case Properties.GATTRIB10: // 54
                    case Properties.GATTRIB11: // 55
                    case Properties.GATTRIB12: // 56
                    case Properties.GATTRIB13: // 57
                    case Properties.GATTRIB14: // 58
                    case Properties.GATTRIB15: // 59
                    case Properties.GATTRIB16: // 60
                    case Properties.GATTRIB17: // 61
                    case Properties.GATTRIB18: // 62
                    case Properties.GATTRIB19: // 63
                    case Properties.GATTRIB20: // 64
                    case Properties.GATTRIB21: // 65
                    case Properties.GATTRIB22: // 66
                    case Properties.GATTRIB23: // 67
                    case Properties.GATTRIB24: // 68
                    case Properties.GATTRIB25: // 69
                    case Properties.GATTRIB26: // 70
                    case Properties.GATTRIB27: // 71
                    case Properties.GATTRIB28: // 72
                    case Properties.GATTRIB29: // 73
                    case Properties.GATTRIB30: // 74
                        Packet.ReadChars(Packet.ReadGUByte1());
                        break;

                    case Properties.OSTYPE: // 75
                        Packet.ReadChars(Packet.ReadGUByte1());
                        break;

                    case Properties.TEXTCODEPG: // 76
                        Packet.ReadGUByte3();
                        break;

                    case Properties.UNKNOWN77: // 77
                        break;

                    case Properties.PIXELX: // 78
                    {
                        int tmp = this.PixelX = Packet.ReadGUByte2();

                        // If the first bit is 1, our position is negative.
                        this.PixelX >>= 1;
                        if ((tmp & 0x0001) != 0)
                            this.PixelX = -this.PixelX;
                        moved = true;
                        break;
                    }

                    case Properties.PIXELY: // 79
                    {
                        int tmp = this.PixelY = Packet.ReadGUByte2();

                        // If the first bit is 1, our position is negative.
                        this.PixelY >>= 1;
                        if ((tmp & 0x0001) != 0)
                            this.PixelY = -this.PixelY;
                        moved = true;
                        break;
                    }

                    case Properties.PIXELZ: // 80
                        Packet.ReadGUByte2();
                        break;

                    case Properties.UNKNOWN81: // 81
                        break;

                    case Properties.COMMUNITY: // 82
                        Packet.ReadChars(Packet.ReadGUByte1());
                        break;

                    default:
                        System.Windows.Forms.MessageBox.Show("Invalid Prop: " + PropId);
                        break;
                }
            }

            if (moved && PlayerLevel != null)
            {
                GraalLevelNPC npc = PlayerLevel.isOnNPC(PixelX + touchtestd[dir*2], PixelY + touchtestd[dir*2+1]);
                if (npc != null)
                    npc.Call("onPlayerTouchsMe", new object[] { this });
            }
        }
        /*
        /// <summary>
        /// Send Colors
        /// </summary>
        internal void SendColors()
        {
            this.SendProp(Properties.PLCOLORS);
        }

        /// <summary>
        /// Send Flag to Framework
        /// </summary>
        internal void SendFlag(String FlagName, String FlagValue)
        {
            // fix packet for flag
            //Server.SendGSPacket(new CString() + (byte)GServerConnection.PacketOut.NC_NPCGET + (byte)GServerConnection.NCREQ.PLSETFLAG + (short)Id + FlagName + "=" + FlagValue);
        }

        /// <summary>
        /// Send Prop to GServer
        /// </summary>
        internal void SendProp(Properties PropId)
        {
            //Server.SendGSPacket(new CString() + (byte)GServerConnection.PacketOut.NC_NPCGET + (byte)GServerConnection.NCREQ.PLSETPROPS + (short)this.Id + (byte)PropId + GetProp(PropId));
        }

        /// <summary>
        /// Set Player Guild
        /// </summary>
        internal void SetGuild(string GuildName)
        {
            int guildStart, guildEnd;
            if ((guildStart = Nickname.IndexOf('(')) >= 0)
            {
                if ((guildEnd = Nickname.IndexOf(')', guildStart)) >= 0)
                    Nickname = Nickname.Substring(0, guildStart).TrimEnd();
            }

            if (GuildName != String.Empty)
                Nickname += " (" + GuildName + ")";
        }

        /// <summary>
        /// Set Player Nickname
        /// </summary>
        /// <param name="Nickname"></param>
        internal void SetNick(string Nickname)
        {
            // Set Nickname
            this.Nickname = Nickname;
            this.Guild = "";

            // Parse Guild
            int len = Nickname.LastIndexOf('(');
            if (len != -1)
            {
                int len2 = Nickname.LastIndexOf(')');
                if (len2 > len)
                    this.Guild = Nickname.Substring(len + 1, len2 - len - 1);
            }

            this.form.AddPlayer(this.account, this.Nickname);

        }
        */
        /// <summary>
        /// Set Properties
        /// </summary>
        public void SetProps(CString Packet)
        {
            this.form = Abstraction.GetInstance();
            bool moved = false;

            while (Packet.BytesLeft > 0)
            {
                Int32 PropId = Packet.ReadGUByte1();
                //this.form.AddPlayer(this.Account, this.Account);
                switch ((Properties)PropId)
                {
                    case Properties.NICKNAME: // 0
                        {
                            this.SetNick(Packet.ReadChars(Packet.ReadGUByte1()));
                            //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + this.Nickname + "");
                            break;
                        }

                    case Properties.MAXPOWER: // 1
                        this.FullHearts = Packet.ReadGUByte1();
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + this.FullHearts + "\r\n");
                        break;

                    case Properties.CURPOWER: // 2
                        this.Hearts = (double)Packet.ReadGUByte1() / 2;
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + this.Hearts + "\r\n");
                        break;

                    case Properties.RUPEESCOUNT: // 3
                        this.Gralats = (int)Packet.ReadGUByte3();
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + this.Gralats + "");
                        break;

                    case Properties.ARROWSCOUNT: // 4
                        this.Arrows = Packet.ReadGUByte1();
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + this.Arrows + "\r\n");
                        break;

                    case Properties.BOMBSCOUNT: // 5
                        this.Bombs = Packet.ReadGUByte1();
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + this.Bombs + "\r\n");
                        break;

                    case Properties.GLOVEPOWER: // 6
                        this.GlovePower = Packet.ReadGUByte1();
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + this.glovepower + "\r\n");
                        break;

                    case Properties.BOMBPOWER: // 7
                        this.BombPower = Packet.ReadGUByte1();
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + this.BombPower + "\r\n");
                        break;

                    case Properties.SWORDPOWER: // 8
                        {
                            Int32 sp = Packet.ReadGUByte1();
                            if (sp > 4)
                            {
                                sp -= 30;
                                Int32 len = Packet.ReadGUByte1();
                                if (len > 0)
                                    this.SwordImage = Packet.ReadChars(len);
                            }
                            else
                                this.SwordImage = "sword" + sp + ".png";

                            this.SwordPower = sp;
                            //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + this.swordpower + "\r\n");
                            break;
                        }

                    case Properties.SHIELDPOWER: // 9
                        {
                            Int32 sp = Packet.ReadGUByte1();
                            if (sp > 3)
                            {
                                sp -= 10;
                                if (sp < 0)
                                    break;
                                Int32 len = Packet.ReadGUByte1();
                                if (len > 0)
                                    this.ShieldImage = Packet.ReadChars(len);
                            }
                            else
                                this.ShieldImage = "shield" + sp + ".png";

                            this.ShieldPower = sp;
                            //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + this.shieldpower + "\r\n");
                            break;
                        }

                    case Properties.ANIMATION: // 10
                        this.Ani = Packet.ReadChars(Packet.ReadGUByte1());
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + this.ani + "\r\n");
                        break;

                    case Properties.HEADIMAGE: // 11
                        {
                            Int32 len = Packet.ReadGUByte1();
                            this.HeadImage = (len < 100 ? "head" + len + ".png" : Packet.ReadChars(len - 100));
                            //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + this.HeadImage + "");
                            break;
                        }

                    case Properties.CURCHAT:
                        {// 12
                            this.Chat = Packet.ReadChars(Packet.ReadGUByte1());
                            //if (PlayerLevel != null)
                            //	PlayerLevel.CallNPCs("onPlayerChats", new object[] { this });

                            if (this.Chat != null && this.Chat != "" && this.Account != "" && this.Account != null)
                                this.form.WriteText("(" + this.Account + ") " + this.Chat + "");

                            break;
                        }
                    case Properties.PLCOLORS: // 13
                        for (int i = 0; i < 5; i++)
                        {
                            this.ColorManager[i] = Packet.ReadGUByte1();
                            //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + this.ColorManager[i] + "\r\n");
                        }
                        break;

                    case Properties.PLAYERID: // 14
                        {
                            this.Id = (short)Packet.ReadGUByte2();
                            this.form.AddPlayer(this.Account, this.Account);
                            //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + this.Id + "");
                            break;

                        }
                    case Properties.PLAYERX: // 15 - obsolete
                        Packet.ReadGUByte1();
                        //this.X = ((double)Packet.ReadGUByte1() / 2);
                        //moved = true;
                    //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + Packet.ReadGUByte1().ToString() + "\r\n");
                        break;

                    case Properties.PLAYERY: // 16 - obsolete
                        Packet.ReadGUByte1();
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + Packet.ReadGUByte1().ToString() + "\r\n");
                        //this.Y = ((double)Packet.ReadGUByte1() / 2);
                        //moved = true;
                        break;

                    case Properties.PLSPRITE: // 17
                        this.Dir = Packet.ReadGUByte1() % 4;
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + this.dir + "\r\n");
                        break;

                    case Properties.PLSTATUS: // 18
                        this.PlayerStatus = Packet.ReadGUByte1();
                        if ((this.PlayerStatus & (int)Status.DEAD) != 0)
                        {
                            //if (PlayerLevel != null)
                            //	PlayerLevel.CallNPCs("onPlayerDies", new object[] { this });
                        }
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + this.PlayerStatus + "");
                        break;

                    case Properties.CARRYSPRITE: // 19
                        Packet.ReadGUByte1();
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + Packet.ReadGUByte1().ToString() + "\r\n");
                        break;

                    case Properties.CURLEVEL: // 20
                        string levelName = Packet.ReadChars(Packet.ReadGUByte1()).Trim();
                        if (this.Level != null)
                            this.Level.DeletePlayer(this);
                        this.Level = Server.FindLevel(levelName);
                        this.Level.AddPlayer(this);
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + this.Level.Name + "");
                        break;

                    case Properties.HORSEIMG: // 21
                        Packet.ReadChars(Packet.ReadGUByte1());
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + Packet.ReadChars(Packet.ReadGUByte1()).ToString() + "\r\n");
                        break;

                    case Properties.HORSEBUSHES: // 22
                        Packet.ReadGUByte1();
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + Packet.ReadGUByte1().ToString() + "\r\n");
                        break;

                    case Properties.EFFECTCOLOR: // 23
                        {
                            int len = Packet.ReadGUByte1();
                            if (len > 0)
                                Packet.ReadGUByte4();
                            break;
                        }

                    case Properties.CARRYNPC: // 24
                        Packet.ReadGUByte3();
                    //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + Packet.ReadGUByte3().ToString() + "\r\n");
                        break;

                    case Properties.APCOUNTER: // 25
                        Packet.ReadGUByte2();
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + Packet.ReadGUByte2().ToString() + "\r\n");
                        break;

                    case Properties.MAGICPOINTS: // 26
                        this.Magic = Packet.ReadGUByte1();
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + this.Magic.ToString() + "\r\n");
                        break;

                    case Properties.KILLSCOUNT: // 27
                        this.Kills = Packet.ReadGByte3();
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + this.kills.ToString() + "\r\n");
                        break;

                    case Properties.DEATHSCOUNT: // 28
                        this.Deaths = Packet.ReadGByte3();
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + this.deaths.ToString() + "\r\n");
                        break;

                    case Properties.ONLINESECS: // 29
                        this.OnlineTime = Packet.ReadGByte3();
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + this.onlinetime.ToString() + "\r\n");
                        break;

                    case Properties.IPADDRESS: // 30
                        this.IPAddress = new System.Net.IPAddress(Packet.ReadGUByte5()).ToString();
                        this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + this.IPAddress.ToString() + "");
                        break;

                    case Properties.UDPPORT: // 31
                        int port = Packet.ReadGByte3();
                        this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + port.ToString() + "");
                        break;

                    case Properties.ALIGNMENT: // 32
                        Packet.ReadGUByte1();
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + Packet.ReadGUByte1().ToString() + "\r\n");
                        break;

                    case Properties.ADDITFLAGS: // 33
                        Packet.ReadGUByte1();
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + Packet.ReadGUByte1().ToString() + "\r\n");
                        break;

                    case Properties.ACCOUNTNAME: // 34
                        this.Account = Packet.ReadChars(Packet.ReadGUByte1());
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + this.Account + "");
                        break;

                    case Properties.BODYIMAGE: // 35
                        this.BodyImage = Packet.ReadChars(Packet.ReadGUByte1());
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + this.bodyimg + "\r\n");
                        break;

                    case Properties.PLRATING: // 36
                        Packet.ReadGUByte3();
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + Packet.ReadGUByte3().ToString() + "\r\n");
                        break;

                    case Properties.GATTRIB1: // 37
                    case Properties.GATTRIB2: // 38
                    case Properties.GATTRIB3: // 39
                    case Properties.GATTRIB4: // 40
                    case Properties.GATTRIB5: // 41
                        Packet.ReadChars(Packet.ReadGUByte1());
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + Packet.ReadChars(Packet.ReadGUByte1()).ToString() + "\r\n");
                        break;

                    case Properties.PLATTACHNPC: // 42
                        Packet.ReadGUByte4();
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + Packet.ReadGUByte4().ToString() + "\r\n");
                        break;

                    case Properties.GMAPLEVELX: // 43
                        GmapX = Packet.ReadGUByte1();
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + GmapX.ToString() + "\r\n");
                        break;

                    case Properties.GMAPLEVELY: // 44
                        GmapY = Packet.ReadGUByte1();
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + GmapY.ToString() + "\r\n");
                        break;

                    case Properties.PLAYERZ: // 45
                        Packet.ReadGUByte1();
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + Packet.ReadGUByte1().ToString() + "\r\n");
                        break;

                    case Properties.GATTRIB6: // 46
                    case Properties.GATTRIB7: // 47
                    case Properties.GATTRIB8: // 48
                    case Properties.GATTRIB9: // 49
                        Packet.ReadChars(Packet.ReadGUByte1());
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + Packet.ReadChars(Packet.ReadGUByte1()).ToString() + "\r\n");
                        break;

                    case Properties.JOINLEAVELV: // 50
                        byte joinLeaveLv = Packet.ReadGUByte1();
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + joinLeaveLv.ToString() + "");
                        break;

                    case Properties.CONNECTED: // 51
                        {
                            //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "] Disconnected\r\n");
                            this.form.RMPlayer(this.Account);
                            Server.PlayerManager.DeletePlayer(Id);

                            // disconnect player.
                            break;
                        }

                    case Properties.LANGUAGE: // 52
                        Packet.ReadChars(Packet.ReadGUByte1());
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + Packet.ReadChars(Packet.ReadGUByte1()).ToString() + "\r\n");
                        break;

                    case Properties.STATUSMSG: // 53
                        byte statusMsg = Packet.ReadGUByte1();
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + statusMsg.ToString() + "");
                        break;

                    case Properties.GATTRIB10: // 54
                    case Properties.GATTRIB11: // 55
                    case Properties.GATTRIB12: // 56
                    case Properties.GATTRIB13: // 57
                    case Properties.GATTRIB14: // 58
                    case Properties.GATTRIB15: // 59
                    case Properties.GATTRIB16: // 60
                    case Properties.GATTRIB17: // 61
                    case Properties.GATTRIB18: // 62
                    case Properties.GATTRIB19: // 63
                    case Properties.GATTRIB20: // 64
                    case Properties.GATTRIB21: // 65
                    case Properties.GATTRIB22: // 66
                    case Properties.GATTRIB23: // 67
                    case Properties.GATTRIB24: // 68
                    case Properties.GATTRIB25: // 69
                    case Properties.GATTRIB26: // 70
                    case Properties.GATTRIB27: // 71
                    case Properties.GATTRIB28: // 72
                    case Properties.GATTRIB29: // 73
                    case Properties.GATTRIB30: // 74
                        Packet.ReadChars(Packet.ReadGUByte1());
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + Packet.ReadChars(Packet.ReadGUByte1()).ToString() + "\r\n");
                        break;

                    case Properties.OSTYPE: // 75
                        Packet.ReadChars(Packet.ReadGUByte1());
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + Packet.ReadChars(Packet.ReadGUByte1()).ToString() + "");
                        break;

                    case Properties.TEXTCODEPG: // 76
                        Packet.ReadGUByte3();
                        this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + Packet.ReadGUByte3().ToString() + "");
                        break;

                    case Properties.UNKNOWN77: // 77
                        this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + Packet.Text.ToString() + "");
                        break;

                    case Properties.PIXELX: // 78
                        {
                            int tmp = this.PixelX = Packet.ReadGUByte2();

                            // If the first bit is 1, our position is negative.
                            this.PixelX >>= 1;
                            if ((tmp & 0x0001) != 0)
                                this.PixelX = -this.PixelX;
                            moved = true;
                            //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + this.PixelX.ToString() + "\r\n");
                            break;
                        }

                    case Properties.PIXELY: // 79
                        {
                            int tmp = this.PixelY = Packet.ReadGUByte2();

                            // If the first bit is 1, our position is negative.
                            this.PixelY >>= 1;
                            if ((tmp & 0x0001) != 0)
                                this.PixelY = -this.PixelY;
                            moved = true;
                            //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + this.PixelY.ToString() + "\r\n");
                            break;
                        }

                    case Properties.PIXELZ: // 80
                        Packet.ReadGUByte2();
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]" + Packet.ReadGUByte2().ToString() + "\r\n");
                        break;

                    case Properties.UNKNOWN81: // 81
                        this.isLocalPlayer = false;
                        this.form.WriteText("(" + this.Account + "(" + this.Id.ToString() + ")) I am on other server.");
                        break;

                    case Properties.COMMUNITY: // 82
                        string communityname = Packet.ReadChars(Packet.ReadGUByte1());
                        //this.form.WriteText("[" + this.Account + "(" + this.Id.ToString() + ")" + "][" + Enum.GetName(typeof(Properties), PropId).ToString() + "]: " + communityname + "");
                        break;

                    default:
                        {
                            //this.form.WriteText("[" + PropId + "] " + Packet.Text + "\r\n");
                            this.form.WriteText("(" + this.Account + "(" + this.Id.ToString() + ")" + ") [" + PropId.ToString() + "]" + Packet.Text.ToString() + "");
                            break;
                        }
                }
            }

            //if (moved && PlayerLevel != null)
            //{
            //bool onGmap = PlayerLevel.Name.EndsWith(".gmap");
            //GraalLevelNPC npc = PlayerLevel.isOnNPC(PixelX + touchtestd[dir*2], PixelY + touchtestd[dir*2+1]);
            //if (npc != null)
            //	npc.Call("onPlayerTouchsMe", new object[] { this });
            //}
        }
        /// <summary>
        /// Set Properties
        /// </summary>
        public static Dictionary<int, dynamic> ParseProps(CString Packet)
        {
            Dictionary<int, dynamic> testProps = new Dictionary<int,dynamic>();

            while (Packet.BytesLeft > 0)
            {
                Int32 PropId = Packet.ReadGUByte1();

                switch ((Properties)PropId)
                {
                    case Properties.NICKNAME: // 0
                    case Properties.ANIMATION: // 10
                    case Properties.CURCHAT: // 12
                    case Properties.CURLEVEL: // 20
                    case Properties.HORSEIMG: // 21
                    case Properties.GATTRIB1: // 37
                    case Properties.GATTRIB2: // 38
                    case Properties.GATTRIB3: // 39
                    case Properties.GATTRIB4: // 40
                    case Properties.GATTRIB5: // 41
                    case Properties.ACCOUNTNAME: // 34
                    case Properties.BODYIMAGE: // 35
                    case Properties.GATTRIB6: // 46
                    case Properties.GATTRIB7: // 47
                    case Properties.GATTRIB8: // 48
                    case Properties.GATTRIB9: // 49
                    case Properties.LANGUAGE: // 52
                    case Properties.GATTRIB10: // 54
                    case Properties.GATTRIB11: // 55
                    case Properties.GATTRIB12: // 56
                    case Properties.GATTRIB13: // 57
                    case Properties.GATTRIB14: // 58
                    case Properties.GATTRIB15: // 59
                    case Properties.GATTRIB16: // 60
                    case Properties.GATTRIB17: // 61
                    case Properties.GATTRIB18: // 62
                    case Properties.GATTRIB19: // 63
                    case Properties.GATTRIB20: // 64
                    case Properties.GATTRIB21: // 65
                    case Properties.GATTRIB22: // 66
                    case Properties.GATTRIB23: // 67
                    case Properties.GATTRIB24: // 68
                    case Properties.GATTRIB25: // 69
                    case Properties.GATTRIB26: // 70
                    case Properties.GATTRIB27: // 71
                    case Properties.GATTRIB28: // 72
                    case Properties.GATTRIB29: // 73
                    case Properties.GATTRIB30: // 74
                    case Properties.OSTYPE: // 75
                    case Properties.COMMUNITY: // 82
                        testProps.Add(PropId, Packet.ReadChars(Packet.ReadGUByte1()));
                        break;

                    case Properties.CURPOWER: // 2
                        testProps.Add(PropId, (double)Packet.ReadGUByte1() / 2);
                        break;

                    case Properties.RUPEESCOUNT: // 3
                        testProps.Add(PropId, (int)Packet.ReadGUByte3());
                        break;

                    case Properties.MAXPOWER: // 1
                    case Properties.ARROWSCOUNT: // 4
                    case Properties.BOMBSCOUNT: // 5
                    case Properties.GLOVEPOWER: // 6
                    case Properties.BOMBPOWER: // 7
                    case Properties.PLAYERX: // 15 - obsolete
                    case Properties.PLAYERY: // 16 - obsolete
                    case Properties.PLSTATUS: // 18
                    case Properties.CARRYSPRITE: // 19
                        testProps.Add(PropId, Packet.ReadGUByte1());
                        break;

                    case Properties.SWORDPOWER: // 8
                        {
                            Int32 sp = Packet.ReadGUByte1();
                            string swordimage = "";
                            if (sp > 4)
                            {
                                sp -= 30;
                                Int32 len = Packet.ReadGUByte1();
                                if (len > 0)
                                    swordimage = Packet.ReadChars(len);
                            }
                            else
                                swordimage = "sword" + sp + ".png";

                            //this._swordPower = sp;
                            testProps.Add(PropId, sp.ToString() + swordimage);
                            break;
                        }

                    case Properties.SHIELDPOWER: // 9
                        {
                            Int32 sp = Packet.ReadGUByte1();
                            string shieldimage = "";
                            if (sp > 3)
                            {
                                sp -= 10;
                                if (sp < 0)
                                    break;
                                Int32 len = Packet.ReadGUByte1();
                                if (len > 0)
                                    shieldimage = Packet.ReadChars(len);
                            }
                            else
                                shieldimage = "shield" + sp + ".png";

                            testProps.Add(PropId, sp.ToString() + shieldimage);
                            break;
                        }

                    case Properties.HEADIMAGE: // 11
                        {
                            Int32 len = Packet.ReadGUByte1();
                            string headimage = (len < 100 ? "head" + len + ".png" : Packet.ReadChars(len - 100));
                            testProps.Add(PropId, headimage);
                            break;
                        }

                    case Properties.PLCOLORS: // 13
                        Dictionary<int, int> colors = new Dictionary<int, int>();
                        for (int i = 0; i < 5; i++)
                            colors.Add(i, Packet.ReadGUByte1());

                        testProps.Add(PropId, colors);
                        break;

                    case Properties.PLAYERID: // 14
                        testProps.Add(PropId, Packet.ReadGUByte2());
                        break;

                    case Properties.PLSPRITE: // 17
                        int dir = Packet.ReadGUByte1() % 4;
                        testProps.Add(PropId, dir);
                        break;

                    case Properties.HORSEBUSHES: // 22
                        testProps.Add(PropId, Packet.ReadGUByte1());
                        break;

                    case Properties.EFFECTCOLOR: // 23
                        {
                            int len = Packet.ReadGUByte1();
                            if (len > 0)
                                testProps.Add(PropId, Packet.ReadGUByte4());
                            break;
                        }

                    case Properties.CARRYNPC: // 24
                        testProps.Add(PropId, Packet.ReadGUByte3());
                        break;

                    case Properties.APCOUNTER: // 25
                        testProps.Add(PropId, Packet.ReadGUByte2());
                        break;

                    case Properties.MAGICPOINTS: // 26
                        testProps.Add(PropId, Packet.ReadGUByte1());
                        break;

                    case Properties.KILLSCOUNT: // 27
                        testProps.Add(PropId, Packet.ReadGByte3());
                        break;

                    case Properties.DEATHSCOUNT: // 28
                        testProps.Add(PropId, Packet.ReadGByte3());
                        break;

                    case Properties.ONLINESECS: // 29
                        testProps.Add(PropId, Packet.ReadGByte3());
                        break;

                    case Properties.IPADDRESS: // 30
                        testProps.Add(PropId, new System.Net.IPAddress(Packet.ReadGUByte5()).ToString());
                        break;

                    case Properties.UDPPORT: // 31
                        testProps.Add(PropId, Packet.ReadGByte3());
                        break;

                    case Properties.ALIGNMENT: // 32
                        testProps.Add(PropId, Packet.ReadGUByte1());
                        break;

                    case Properties.ADDITFLAGS: // 33
                        testProps.Add(PropId, Packet.ReadGUByte1());
                        break;

                    case Properties.PLRATING: // 36
                        testProps.Add(PropId, Packet.ReadGUByte3());
                        break;

                    case Properties.PLATTACHNPC: // 42
                        testProps.Add(PropId, Packet.ReadGUByte4());
                        break;

                    case Properties.GMAPLEVELX: // 43
                        testProps.Add(PropId, Packet.ReadGUByte1());
                        break;

                    case Properties.GMAPLEVELY: // 44
                        testProps.Add(PropId, Packet.ReadGUByte1());
                        break;

                    case Properties.PLAYERZ: // 45
                        testProps.Add(PropId, Packet.ReadGUByte1());
                        break;

                    case Properties.JOINLEAVELV: // 50
                        testProps.Add(PropId, Packet.ReadGUByte1());
                        break;

                    case Properties.CONNECTED: // 51
                        testProps.Add(PropId, true);
                        break;

                    case Properties.STATUSMSG: // 53
                        testProps.Add(PropId, Packet.ReadGUByte1());
                        break;

                    case Properties.TEXTCODEPG: // 76
                        testProps.Add(PropId, Packet.ReadGUByte3());
                        break;

                    case Properties.UNKNOWN77: // 77
                        testProps.Add(PropId, true);
                        break;

                    case Properties.PIXELX: // 78
                        {
                            int tmp = Packet.ReadGUByte2();

                            // If the first bit is 1, our position is negative.
                            tmp >>= 1;
                            if ((tmp & 0x0001) != 0)
                                tmp = -tmp;
                            testProps.Add(PropId, tmp);
                            break;
                        }

                    case Properties.PIXELY: // 79
                        {
                            int tmp = Packet.ReadGUByte2();

                            // If the first bit is 1, our position is negative.
                            tmp >>= 1;
                            if ((tmp & 0x0001) != 0)
                                tmp = -tmp;
                            testProps.Add(PropId, tmp);
                            break;
                        }

                    case Properties.PIXELZ: // 80
                        testProps.Add(PropId, Packet.ReadGUByte2());
                        break;

                    case Properties.UNKNOWN81: // 81
                        testProps.Add(PropId, true);
                        break;

                    default:
                        //System.Windows.Forms.MessageBox.Show("Invalid Prop: " + PropId);
                        break;
                }
            }

            return testProps;
        }