Esempio n. 1
0
        CString setProps(CString pProps, int clientVersion)
        {
            CString ret = new CString();
            int len = 0;
            while (pProps.BytesLeft > 0)
            {
                char propId = pProps.readGUChar();
                CString oldProp = getProp(propId, clientVersion);
                //printf( "propId: %d\n", propId );
                switch ((NPCPROP)propId)
                {
                    case NPCPROP.IMAGE:
                        image = pProps.readChars(pProps.readGUChar());
                        if (image.ToString().Trim().Length != 0)// && clientVersion < CLVER_2_1 && getExtension(image).isEmpty())
                        image += new CString() + ".gif";
                        break;

                    case NPCPROP.SCRIPT:
                        clientScript = pProps.readChars(pProps.readGUShort());
                        break;

                    case NPCPROP.X:
                        if (blockPositionUpdates)
                        {
                            pProps.readGChar();
                            continue;
                        }
                        x = (float)(pProps.readGChar()) / 2.0f;
                        x2 = (int)(x * 16);
                        break;

                    case NPCPROP.Y:
                        if (blockPositionUpdates)
                        {
                            pProps.readGChar();
                            continue;
                        }
                        y = (float)(pProps.readGChar()) / 2.0f;
                        y2 = (int)(y * 16);
                        break;

                    case NPCPROP.POWER:
                        power = pProps.readGUChar();
                        break;

                    case NPCPROP.RUPEES:
                        rupees = (int)pProps.readGUInt();
                        break;

                    case NPCPROP.ARROWS:
                        darts = pProps.readGUChar();
                        break;

                    case NPCPROP.BOMBS:
                        bombs = pProps.readGUChar();
                        break;

                    case NPCPROP.GLOVEPOWER:
                        glovePower = pProps.readGUChar();
                        break;

                    case NPCPROP.BOMBPOWER:
                        bombPower = pProps.readGUChar();
                        break;

                    case NPCPROP.SWORDIMAGE:
                        {
                            int sp = pProps.readGUChar();
                            if (sp <= 4)
                                swordImage = new CString() + "sword" + new CString(sp.ToString()) + ".png";
                            else
                            {
                                sp -= 30;
                                len = pProps.readGUChar();
                                if (len > 0)
                                {
                                    swordImage = pProps.readChars(len);
                                    if (swordImage.ToString().Trim().Length != 0)// && clientVersion < CLVER_2_1 && getExtension(swordImage).isEmpty())
                                    swordImage += new CString() + ".gif";
                                }
                                else
                                    swordImage = new CString() + "";
                                //swordPower = clip(sp, ((settings->getBool("healswords", false) == true) ? -(settings->getInt("swordlimit", 3)) : 0), settings->getInt("swordlimit", 3));
                            }
                            swordPower = (char)sp;
                        }
                        break;

                    case NPCPROP.SHIELDIMAGE:
                        {
                            int sp = pProps.readGUChar();
                            if (sp <= 3)
                                shieldImage = new CString() + "shield" + new CString(sp.ToString()) + ".png";
                            else
                            {
                                sp -= 10;
                                len = pProps.readGUChar();
                                if (len > 0)
                                {
                                    shieldImage = pProps.readChars(len);
                                    if (shieldImage.ToString().Trim().Length != 0)// && clientVersion < CLVER_2_1 && getExtension(shieldImage).isEmpty())
                                    shieldImage += new CString() + ".gif";
                                }
                                else
                                    shieldImage = new CString() + "";
                            }
                            shieldPower = (char)sp;
                        }
                        break;

                    case NPCPROP.GANI:
                    /*
                if (clientVersion < CLVER_2_1)
                {
                    // Older clients don't use ganis.  This is the bow power and image instead.
                    int sp = pProps.readGUChar();
                    if (sp < 10)
                        bowImage = CString() + (char)sp;
                    else
                    {
                        sp -= 10;
                        if (sp < 0) break;
                        bowImage = pProps.readChars(sp);
                        if (!bowImage.isEmpty() && clientVersion < CLVER_2_1 && getExtension(bowImage).isEmpty())
                            bowImage + ".gif";
                        bowImage = CString() + (char)(10 + bowImage.Length) + bowImage;
                    }
                    break;
                }
                    */
                        gani = pProps.readChars(pProps.readGUChar());
                        break;

                    case NPCPROP.VISFLAGS:
                        visFlags = pProps.readGUChar();
                        break;

                    case NPCPROP.BLOCKFLAGS:
                        blockFlags = pProps.readGUChar();
                        break;

                    case NPCPROP.MESSAGE:
                        chatMsg = pProps.readChars(pProps.readGUChar());
                        break;

                    case NPCPROP.HURTDXDY:
                        hurtX = ((float)(pProps.readGUChar() - 32)) / 32;
                        hurtY = ((float)(pProps.readGUChar() - 32)) / 32;
                        break;

                    case NPCPROP.ID:
                        pProps.readGUInt();
                        break;

                    case NPCPROP.SPRITE:
                        sprite = pProps.readGUChar();
                        break;

                    case NPCPROP.COLORS:
                        for (int i = 0; i < 5; i++)
                            colors[i] = pProps.readGUChar();
                        break;

                    case NPCPROP.NICKNAME:
                        nickName = pProps.readChars(pProps.readGUChar());
                        break;

                    case NPCPROP.HORSEIMAGE:
                        horseImage = pProps.readChars(pProps.readGUChar());
                        if (horseImage.ToString().Trim().Length != 0)// && clientVersion < CLVER_2_1 && getExtension(horseImage).isEmpty())
                        horseImage += new CString() + ".gif";
                        break;

                    case NPCPROP.HEADIMAGE:
                        len = pProps.readGUChar();
                        if (len < 100)
                            headImage = new CString() + "head" + new CString(len.ToString()) + ".png";
                        else
                        {
                            headImage = pProps.readChars(len - 100);
                            if (headImage.ToString().Trim().Length != 0)// && clientVersion < CLVER_2_1 && getExtension(headImage).isEmpty())
                            headImage += new CString() + ".gif";
                        }
                        break;

                    case NPCPROP.ALIGNMENT:
                        ap = pProps.readGUChar();
                        if (ap < 0)
                            ap = (char)0;
                        else if (ap > 100)
                            ap = (char)100;
                //ap = clip(ap, 0, 100);
                        break;

                    case NPCPROP.IMAGEPART:
                        imagePart = pProps.readChars(6);
                        break;

                    case NPCPROP.BODYIMAGE:
                        bodyImage = pProps.readChars(pProps.readGUChar());
                        break;

                    case NPCPROP.GMAPLEVELX:
                        gmaplevelx = pProps.readGUChar();
                        break;

                    case NPCPROP.GMAPLEVELY:
                        gmaplevely = pProps.readGUChar();
                        break;

                    case NPCPROP.CLASS:
                        pProps.readChars(pProps.readGShort());
                        break;

                // Location, in pixels, of the npc on the level in 2.3+ clients.
                // Bit 0x0001 controls if it is negative or not.
                // Bits 0xFFFE are the actual value.
                    case NPCPROP.X2:
                        if (blockPositionUpdates)
                        {
                            pProps.readGUShort();
                            continue;
                        }

                        x2 = len = pProps.readGUShort();

                // If the first bit is 1, our position is negative.
                        x2 += 1;
                        if (((short)len & 0x0001) != 0)
                            x2 = -x2;

                // Let pre-2.3+ clients see 2.3+ movement.
                        x = (float)x2 / 16.0f;
                        break;

                    case NPCPROP.Y2:
                        if (blockPositionUpdates)
                        {
                            pProps.readGUShort();
                            continue;
                        }

                        y2 = len = pProps.readGUShort();

                // If the first bit is 1, our position is negative.
                        y2 += 1;
                        if (((short)len & 0x0001) != 0)
                            y2 = -y2;

                // Let pre-2.3+ clients see 2.3+ movement.
                        y = (float)y2 / 16.0f;
                        break;

                    case NPCPROP.SAVE0:
                        saves[0] = pProps.readGUChar();
                        break;
                    case NPCPROP.SAVE1:
                        saves[1] = pProps.readGUChar();
                        break;
                    case NPCPROP.SAVE2:
                        saves[2] = pProps.readGUChar();
                        break;
                    case NPCPROP.SAVE3:
                        saves[3] = pProps.readGUChar();
                        break;
                    case NPCPROP.SAVE4:
                        saves[4] = pProps.readGUChar();
                        break;
                    case NPCPROP.SAVE5:
                        saves[5] = pProps.readGUChar();
                        break;
                    case NPCPROP.SAVE6:
                        saves[6] = pProps.readGUChar();
                        break;
                    case NPCPROP.SAVE7:
                        saves[7] = pProps.readGUChar();
                        break;
                    case NPCPROP.SAVE8:
                        saves[8] = pProps.readGUChar();
                        break;
                    case NPCPROP.SAVE9:
                        saves[9] = pProps.readGUChar();
                        break;

                    case NPCPROP.GATTRIB1:
                        gAttribs[0] = pProps.readChars(pProps.readGUChar());
                        break;
                    case NPCPROP.GATTRIB2:
                        gAttribs[1] = pProps.readChars(pProps.readGUChar());
                        break;
                    case NPCPROP.GATTRIB3:
                        gAttribs[2] = pProps.readChars(pProps.readGUChar());
                        break;
                    case NPCPROP.GATTRIB4:
                        gAttribs[3] = pProps.readChars(pProps.readGUChar());
                        break;
                    case NPCPROP.GATTRIB5:
                        gAttribs[4] = pProps.readChars(pProps.readGUChar());
                        break;
                    case NPCPROP.GATTRIB6:
                        gAttribs[5] = pProps.readChars(pProps.readGUChar());
                        break;
                    case NPCPROP.GATTRIB7:
                        gAttribs[6] = pProps.readChars(pProps.readGUChar());
                        break;
                    case NPCPROP.GATTRIB8:
                        gAttribs[7] = pProps.readChars(pProps.readGUChar());
                        break;
                    case NPCPROP.GATTRIB9:
                        gAttribs[8] = pProps.readChars(pProps.readGUChar());
                        break;
                    case NPCPROP.GATTRIB10:
                        gAttribs[9] = pProps.readChars(pProps.readGUChar());
                        break;
                    case NPCPROP.GATTRIB11:
                        gAttribs[10] = pProps.readChars(pProps.readGUChar());
                        break;
                    case NPCPROP.GATTRIB12:
                        gAttribs[11] = pProps.readChars(pProps.readGUChar());
                        break;
                    case NPCPROP.GATTRIB13:
                        gAttribs[12] = pProps.readChars(pProps.readGUChar());
                        break;
                    case NPCPROP.GATTRIB14:
                        gAttribs[13] = pProps.readChars(pProps.readGUChar());
                        break;
                    case NPCPROP.GATTRIB15:
                        gAttribs[14] = pProps.readChars(pProps.readGUChar());
                        break;
                    case NPCPROP.GATTRIB16:
                        gAttribs[15] = pProps.readChars(pProps.readGUChar());
                        break;
                    case NPCPROP.GATTRIB17:
                        gAttribs[16] = pProps.readChars(pProps.readGUChar());
                        break;
                    case NPCPROP.GATTRIB18:
                        gAttribs[17] = pProps.readChars(pProps.readGUChar());
                        break;
                    case NPCPROP.GATTRIB19:
                        gAttribs[18] = pProps.readChars(pProps.readGUChar());
                        break;
                    case NPCPROP.GATTRIB20:
                        gAttribs[19] = pProps.readChars(pProps.readGUChar());
                        break;
                    case NPCPROP.GATTRIB21:
                        gAttribs[20] = pProps.readChars(pProps.readGUChar());
                        break;
                    case NPCPROP.GATTRIB22:
                        gAttribs[21] = pProps.readChars(pProps.readGUChar());
                        break;
                    case NPCPROP.GATTRIB23:
                        gAttribs[22] = pProps.readChars(pProps.readGUChar());
                        break;
                    case NPCPROP.GATTRIB24:
                        gAttribs[23] = pProps.readChars(pProps.readGUChar());
                        break;
                    case NPCPROP.GATTRIB25:
                        gAttribs[24] = pProps.readChars(pProps.readGUChar());
                        break;
                    case NPCPROP.GATTRIB26:
                        gAttribs[25] = pProps.readChars(pProps.readGUChar());
                        break;
                    case NPCPROP.GATTRIB27:
                        gAttribs[26] = pProps.readChars(pProps.readGUChar());
                        break;
                    case NPCPROP.GATTRIB28:
                        gAttribs[27] = pProps.readChars(pProps.readGUChar());
                        break;
                    case NPCPROP.GATTRIB29:
                        gAttribs[28] = pProps.readChars(pProps.readGUChar());
                        break;
                    case NPCPROP.GATTRIB30:
                        gAttribs[29] = pProps.readChars(pProps.readGUChar());
                        break;

                    default:
                        {
                            Console.Write("NPC %d (%.2f, %.2f): ", id, x, y);
                            Console.Write("Unknown prop: %ud, readPos: %d\n", propId, pProps.ReadCount);
                            for (int i = 0; i < pProps.Length; ++i)
                                Console.Write("%02x ", (char)pProps[i]);
                            Console.Write("\n");
                        }
                        return ret;
                }

                // If a prop changed, adjust its mod time.
                if (propId < (int)NPCPROP.COUNT)
                {
                    if (oldProp != getProp(propId, clientVersion))
                        modTime[propId] = new DateTime();
                }

                // Add to ret.
                ret += new CString() + (char)propId + getProp(propId, clientVersion);
            }
            return ret;
        }
        /// <summary>
        /// Set Properties
        /// </summary>
        /// <param name="Packet"></param>
        public void SetProps(CString Packet)
        {
            while (Packet.BytesLeft > 0)
            {
                Int32 PropId = Packet.readGUChar();
                //Console.Write("[prop]: " + PropId.ToString());
                switch ((Properties)PropId)
                {
                    case Properties.IMAGE: // 0
                        this.Image = Packet.readChars(Packet.readGUChar()).ToString();
                        break;

                    case Properties.SCRIPT: // 1
                        int length;
                        if (!this.npcserver)
                            length = Packet.readGUShort();
                        else
                            length = (int)Packet.ReadGUByte5();
                        this.Script = Packet.readChars(length).ToString();
                        this.Script = this.Script.Replace("\xa7", "\n");
                        this.Script = this.Script.Replace("�", "\n");
                        this.Script = this.Script.Replace("�", "\n");

                        //if (this.Script.IndexOf("void") > 0 || this.Script.IndexOf("join(") > 0)
                        this.CompileScript = true;

                        break;

                    case Properties.NPCX: // 2 - obsolete
                    //Packet.ReadGByte1 ();
                        this.OldX = (float)(Packet.readGChar()) / 2.0f;
                        this.PixelX = (int)(this.OldX * 16);
                        break;

                    case Properties.NPCY: // 3 - obsolete
                    //Packet.ReadGByte1 ();
                        this.OldY = (float)(Packet.readGChar()) / 2.0f;
                        this.PixelY = (int)(this.OldY * 16);
                        break;

                    case Properties.NPCPOWER: // 4
                        Packet.readGUChar();
                        break;

                    case Properties.NPCRUPEES: // 5
                        this.Gralats = (int)Packet.readGUInt();
                        break;

                    case Properties.ARROWS: // 6
                        this.Arrows = Packet.readGUChar();
                        break;

                    case Properties.BOMBS: // 7
                        this.Bombs = Packet.readGUChar();
                        break;

                    case Properties.GLOVEPOWER: // 8
                        Packet.readGUChar();
                        break;

                    case Properties.BOMBPOWER: // 9
                        Packet.readGUChar();
                        break;
                    case Properties.SWORDIMG: // 10
                        {
                            int sp = Packet.readGUChar();
                            if (sp <= 4)
                                _swordImage = "sword" + sp.ToString() + ".png";
                            else
                            {
                                sp -= 30;
                                int len = Packet.readGUChar();
                                if (len > 0)
                                {
                                    _swordImage = Packet.readChars(len).ToString();
                                    if (_swordImage.ToString().Trim().Length != 0)// && clientVersion < CLVER_2_1 && getExtension(swordImage).isEmpty())
                                    _swordImage += ".gif";
                                }
                                else
                                    _swordImage = "";
                                //swordPower = clip(sp, ((settings->getBool("healswords", false) == true) ? -(settings->getInt("swordlimit", 3)) : 0), settings->getInt("swordlimit", 3));
                            }
                            //_swordPower = (char)sp;
                        }
                        break;
                    case Properties.SHIELDIMG: // 11
                        {
                            int sp = Packet.readGUChar();
                            CString shieldImage = new CString();
                            int len;
                            if (sp <= 3)
                            {
                                shieldImage = new CString() + "shield" + new CString(sp.ToString()) + ".png";
                            }
                            else
                            {
                                sp -= 10;
                                len = Packet.readGUChar();
                                if (len > 0)
                                {
                                    shieldImage = Packet.readChars(len);
                                    if (shieldImage.ToString().Trim().Length != 0)// && clientVersion < CLVER_2_1 && getExtension(shieldImage).isEmpty())
                                    shieldImage += new CString() + ".gif";
                                }
                                else
                                    shieldImage = new CString() + "";
                            }
                            //shieldPower = (char)sp;
                            _shieldImage = shieldImage.ToString();
                        }
                        break;
                    case Properties.GANI: // 12
                        this.Animation = Packet.readChars(Packet.readGUChar()).ToString();
                        break;

                    case Properties.VISFLAGS: // 13
                        this.VisFlags = (sbyte)Packet.readGUChar();
                        break;

                    case Properties.BLOCKFLAGS: // 14
                        this.BlockFlags = (sbyte)Packet.readGUChar();
                        break;

                    case Properties.MESSAGE: // 15
                        this.Chat = Packet.readChars(Packet.readGUChar()).ToString();
                        break;
                    case Properties.HURTDXDY: // 16
                        float hurtX = ((float)(Packet.readGUChar() - 32)) / 32;
                        float hurtY = ((float)(Packet.readGUChar() - 32)) / 32;
                        break;
                    case Properties.NPCID: // 17
                        this.Id = (int)Packet.readGUInt();
                        break;

                    case Properties.SPRITE: // 18
                        this.Dir = Packet.readGUChar();
                        break;

                    case Properties.COLORS: // 19
                        for (int i = 0; i < 5; i++)
                            Packet.readGUChar();
                        break;

                    case Properties.NICKNAME: // 20
                        this.Nickname = Packet.readChars(Packet.readGUChar()).ToString();
                        break;

                    case Properties.HORSEIMG: // 21
                        Packet.readChars(Packet.readGUChar());
                        break;

                    case Properties.HEADIMG: // 22
                        {
                            Int32 len = Packet.readGUChar();
                            this.HeadImage = (len < 100 ? "head" + len + ".png" : Packet.readChars(len - 100).ToString());
                            break;
                        }

                    case Properties.SAVE0: // 23
                        this.Save[0] = (byte)Packet.readGUChar();
                        break;

                    case Properties.SAVE1: // 24
                        this.Save[1] = (byte)Packet.readGUChar();
                        break;

                    case Properties.SAVE2: // 25
                        this.Save[2] = (byte)Packet.readGUChar();
                        break;

                    case Properties.SAVE3: // 26
                        this.Save[3] = (byte)Packet.readGUChar();
                        break;

                    case Properties.SAVE4: // 27
                        this.Save[4] = (byte)Packet.readGUChar();
                        break;

                    case Properties.SAVE5: // 28
                        this.Save[5] = (byte)Packet.readGUChar();
                        break;

                    case Properties.SAVE6: // 29
                        this.Save[6] = (byte)Packet.readGUChar();
                        break;

                    case Properties.SAVE7: // 30
                        this.Save[7] = (byte)Packet.readGUChar();
                        break;

                    case Properties.SAVE8: // 31
                        this.Save[8] = (byte)Packet.readGUChar();
                        break;

                    case Properties.SAVE9: // 32
                        this.Save[9] = (byte)Packet.readGUChar();
                        break;

                    case Properties.ALIGNMENT: // 33
                        Packet.readGUChar();
                        break;

                    case Properties.IMAGEPART: // 34
                        this.ImagePart = Packet.readChars(6);
                        break;

                    case Properties.BODYIMG: // 35
                        this.BodyImage = Packet.readChars(Packet.readGUChar()).ToString();
                        break;

                    case Properties.GMAPLVLX: // 41
                        this.GMapX = (byte)Packet.readGUChar();
                        break;

                    case Properties.GMAPLVLY: // 42
                        this.GMapY = (byte)Packet.readGUChar();
                        break;
                    case Properties.GATTRIB6: // 44
                    case Properties.GATTRIB7: // 45
                    case Properties.GATTRIB8: // 46
                    case Properties.GATTRIB9: // 47
                    case Properties.GATTRIB10: // 53,
                    case Properties.GATTRIB11: // 54,
                    case Properties.GATTRIB12: // 55,
                    case Properties.GATTRIB13: // 56,
                    case Properties.GATTRIB14: // 57,
                    case Properties.GATTRIB15: // 58,
                    case Properties.GATTRIB16: // 59,
                    case Properties.GATTRIB17: // 60,
                    case Properties.GATTRIB18: // 61,
                    case Properties.GATTRIB19: // 62,
                    case Properties.GATTRIB20: // 63,
                    case Properties.GATTRIB21: // 64,
                    case Properties.GATTRIB22: // 65,
                    case Properties.GATTRIB23: // 66,
                    case Properties.GATTRIB24: // 67,
                    case Properties.GATTRIB25: // 68,
                    case Properties.GATTRIB26: // 69,
                    case Properties.GATTRIB27: // 70,
                    case Properties.GATTRIB28: // 71,
                    case Properties.GATTRIB29: // 72,
                    case Properties.GATTRIB30: // 73,
                        Packet.readChars(Packet.readGUChar());
                        break;

                    case Properties.CLASS: // 74
                        Packet.readChars(Packet.readGShort());
                        break;

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

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

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

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

                    default:
                        System.Console.WriteLine("Unknown NPC Prop: " + PropId + " Data: " + Packet.ReadString());
                    //Packet.ReadGUByte1 ();
                        return;

                }

                //Console.WriteLine(": " + this.GetProp((Properties)PropId).ToString());
            }

            // Compile script if script changed.
            //if (CompileScript)
            //	Server.Compiler.CompileAdd(this);
        }