Esempio n. 1
0
        public void Enable()
        {
            client.Rsa = Constants.RSAKey.OpenTibiaM;

            loginClientPort = GetFreePort();
            worldClientPort = GetFreePort(loginClientPort + 1);

            if (!client.IsOpenTibiaServer && client.LoginServers[0].Server == "127.0.0.1")
            {
                loginServers = Client.DefaultServers;
            }
            else
            {
                loginServers = client.LoginServers;
            }

            client.LoginServers = new LoginServer[] { new LoginServer("127.0.0.1", loginClientPort) };

            if (client.Version.Number == ClientVersion.Version1011.Number)
            {
                Util.Memory.WriteBytes(client.ProcessHandle, client.MemoryAddresses.ClientProxyCheckFunctionPointer, client.MemoryAddresses.ClientProxyCheckFunctionNOP, 15);
            }

            clientInMessage  = new InMessage();
            clientOutMessage = new OutMessage();

            serverInMessage  = new InMessage();
            serverOutMessage = new OutMessage();

            StartListen();
        }
Esempio n. 2
0
		public void Enable()
		{
			client.Rsa = Constants.RSAKey.OpenTibiaM;

			loginClientPort = GetFreePort();
			worldClientPort = GetFreePort(loginClientPort + 1);

			if (!client.IsOpenTibiaServer && client.LoginServers[0].Server == "127.0.0.1")
				loginServers = Client.DefaultServers;
			else
				loginServers = client.LoginServers;

			client.LoginServers = new LoginServer[] { new LoginServer("127.0.0.1", loginClientPort) };
            
            if (client.Version.Number == ClientVersion.Version1011.Number)
                Util.Memory.WriteBytes(client.ProcessHandle, client.MemoryAddresses.ClientProxyCheckFunctionPointer, client.MemoryAddresses.ClientProxyCheckFunctionNOP, 15);

			clientInMessage = new InMessage();
			clientOutMessage = new OutMessage();

			serverInMessage = new InMessage();
			serverOutMessage = new OutMessage();

			StartListen();
		}
Esempio n. 3
0
        public static void OpenTibiaDecrypt(InMessage msg)
        {
            if (msg.Size - msg.ReadPosition != 128)
            {
                throw new Exception("Invalid message size.");
            }

            var decrypted = openTibiaDecryptEngine.ProcessBlock(msg.Buffer, msg.ReadPosition, 128);
            var padSize   = 128 - decrypted.Length;

            if (padSize > 0)
            {
                Array.Clear(msg.Buffer, msg.ReadPosition, padSize);
            }
            else
            {
                padSize = 0;
            }

            Array.Copy(decrypted, 0, msg.Buffer, msg.ReadPosition + padSize, decrypted.Length);

            if (msg.ReadByte() != 0)
            {
                throw new Exception("Invalid decrypted message.");
            }

            msg.Encrypted = false;
        }
Esempio n. 4
0
        public void Enable()
        {
            client.Rsa = Constants.RSAKey.OpenTibiaM;

            loginClientPort = GetFreePort();
            worldClientPort = GetFreePort(loginClientPort + 1);

            if (!client.IsOpenTibiaServer && client.LoginServers[0].Server == "localhost")
            {
                loginServers = Client.DefaultServers;
            }
            else
            {
                loginServers = client.LoginServers;
            }


            client.LoginServers = new LoginServer[] { new LoginServer("localhost", loginClientPort) };

            clientInMessage  = new InMessage();
            clientOutMessage = new OutMessage();

            serverInMessage  = new InMessage();
            serverOutMessage = new OutMessage();

            StartListen();
        }
Esempio n. 5
0
        private void ParseServerPlayerStats(InMessage message)
        {
            var health    = message.ReadUShort();
            var healthMax = message.ReadUShort();

            var freeCapacity = message.ReadUInt();
            var capacity     = message.ReadUInt();

            var experience = message.ReadULong();

            var level        = message.ReadUShort();
            var levelPercent = message.ReadByte();

            var mana    = message.ReadUShort();
            var manaMax = message.ReadUShort();

            var magicLevel        = message.ReadByte();
            var baseMagicLevel    = message.ReadByte();
            var magicLevelPercent = message.ReadByte();

            var soul            = message.ReadByte();
            var stamina         = message.ReadUShort();
            var speed           = message.ReadUShort();
            var regeneration    = message.ReadUShort();
            var offlineTranning = message.ReadUShort();
        }
Esempio n. 6
0
 private void ParseServerFloorDescription(InMessage message, List <Tile> tiles, int x, int y, int z, int width, int height, int offset, ref int skipTiles)
 {
     for (int nx = 0; nx < width; nx++)
     {
         for (int ny = 0; ny < height; ny++)
         {
             if (skipTiles == 0)
             {
                 var tileOpt = message.PeekUShort();
                 // Decide if we have to skip tiles
                 // or if it is a real tile
                 if (tileOpt >= 0xFF00)
                 {
                     skipTiles = (short)(message.ReadUShort() & 0xFF);
                 }
                 else
                 {
                     //real tile so read tile
                     tiles.Add(ParseServerTileDescription(message, new Location(x + nx + offset, y + ny + offset, z)));
                     skipTiles = (short)(message.ReadUShort() & 0xFF);
                 }
             }
             else
             {
                 skipTiles--;
             }
         }
     }
 }
Esempio n. 7
0
        private void ParseServerFloorChangeDown(InMessage message)
        {
            Location myPos = client.PlayerLocation;

            myPos = new Location(myPos.X, myPos.Y, myPos.Z + 1);

            //going from surface to underground

            var tiles = new List <Tile>();

            int skipTiles = 0;

            if (myPos.Z == 8)
            {
                int j, i;
                for (i = myPos.Z, j = -1; i < (int)myPos.Z + 3; ++i, --j)
                {
                    ParseServerFloorDescription(message, tiles, myPos.X - 8, myPos.Y - 6, i, 18, 14, j, ref skipTiles);
                }
            }
            //going further down
            else if (myPos.Z > 8 && myPos.Z < 14)
            {
                ParseServerFloorDescription(message, tiles, myPos.X - 8, myPos.Y - 6, myPos.Z + 2, 18, 14, -3, ref skipTiles);
            }

            client.PlayerLocation = new Location(myPos.X - 1, myPos.Y - 1, myPos.Z);
            client.Map.OnMapUpdated(tiles);
        }
Esempio n. 8
0
        private Item GetItem(InMessage message, ushort itemid)
        {
            if (itemid == ushort.MaxValue)
            {
                itemid = message.ReadUShort();
            }

            ItemType type = client.Items.Get(itemid);

            if (type == null)
            {
                throw new Exception("[GetItem] (" + itemid + ") Can't find the item type.");
            }

            byte count   = 0;
            byte subtype = 0;

            if (type.IsStackable)
            {
                count = message.ReadByte();
            }
            else if (type.IsSplash || type.IsFluidContainer)
            {
                subtype = message.ReadByte();
            }

            if (type.IsAnimation)
            {
                message.ReadByte(); // Desconhecido
            }
            return(new Item(type, count, subtype));
        }
Esempio n. 9
0
        private void ParseClientSay(InMessage message)
        {
            string receiver  = null;
            ushort channelId = 0;

            MessageClasses type = (MessageClasses)message.ReadByte();

            switch (type)
            {
            case MessageClasses.PRIVATE_TO:
            case MessageClasses.GAMEMASTER_PRIVATE_TO:
                receiver = message.ReadString();
                break;

            case MessageClasses.CHANNEL:
            case MessageClasses.CHANNEL_HIGHLIGHT:
            case MessageClasses.GAMEMASTER_CHANNEL:
                channelId = message.ReadUShort();
                break;

            default:
                break;
            }

            string text = message.ReadString();

            client.Chat.OnPlayerSpeak(receiver, channelId, type, text);
        }
Esempio n. 10
0
        private void ParseServerPlayerCash(InMessage message)
        {
            var cash = message.ReadUInt();
            var num  = message.ReadByte();

            message.ReadBytes(num * 3);
        }
Esempio n. 11
0
        private void ParseClientSay(InMessage message)
        {
            string receiver = null;
            ushort channelId = 0;

            MessageClasses type = (MessageClasses)message.ReadByte();
            switch (type)
            {
                case MessageClasses.PRIVATE_TO:
                case MessageClasses.GAMEMASTER_PRIVATE_TO:
                    receiver = message.ReadString();
                    break;

                case MessageClasses.CHANNEL:
                case MessageClasses.CHANNEL_HIGHLIGHT:
                case MessageClasses.GAMEMASTER_CHANNEL:
                    channelId = message.ReadUShort();
                    break;

                default:
                    break;
            }

            string text = message.ReadString();

            client.Chat.OnPlayerSpeak(receiver, channelId, type, text);
        }
Esempio n. 12
0
        private void ParseServerCreatureSpeak(InMessage message)
        {
            var      statementId = message.ReadUInt();
            var      name        = message.ReadString();
            var      level       = message.ReadUShort();
            var      type        = (MessageClasses)message.ReadByte();
            Location location    = null;

            switch (type)
            {
            case MessageClasses.SPEAK_SAY:
            case MessageClasses.SPEAK_WHISPER:
            case MessageClasses.SPEAK_YELL:
            case MessageClasses.SPEAK_MONSTER_SAY:
            case MessageClasses.SPEAK_MONSTER_YELL:
            case MessageClasses.SPEAK_SPELL:
            case MessageClasses.NPC_FROM:
                location = message.ReadLocation();
                break;

            case MessageClasses.CHANNEL:
            case MessageClasses.CHANNEL_HIGHLIGHT:
            case MessageClasses.GAMEMASTER_CHANNEL:
                var channelId = message.ReadUShort();
                break;

            default:
                break;
            }

            var text = message.ReadString();

            client.Chat.OnCreatureSpeak(statementId, name, level, type, location, text);
        }
Esempio n. 13
0
        private void ParseServerFloorChangeUp(InMessage message)
        {
            Location myPos = client.PlayerLocation;

            myPos = new Location(myPos.X, myPos.Y, myPos.Z - 1);

            var tiles = new List <Tile>();

            if (myPos.Z == 7)
            {
                int skip = 0;
                ParseServerFloorDescription(message, tiles, myPos.X - 8, myPos.Y - 6, 5, 18, 14, 3, ref skip); //(floor 7 and 6 already set)
                ParseServerFloorDescription(message, tiles, myPos.X - 8, myPos.Y - 6, 4, 18, 14, 4, ref skip);
                ParseServerFloorDescription(message, tiles, myPos.X - 8, myPos.Y - 6, 3, 18, 14, 5, ref skip);
                ParseServerFloorDescription(message, tiles, myPos.X - 8, myPos.Y - 6, 2, 18, 14, 6, ref skip);
                ParseServerFloorDescription(message, tiles, myPos.X - 8, myPos.Y - 6, 1, 18, 14, 7, ref skip);
                ParseServerFloorDescription(message, tiles, myPos.X - 8, myPos.Y - 6, 0, 18, 14, 8, ref skip);
            }
            else if (myPos.Z > 7)
            {
                int skip = 0;
                ParseServerFloorDescription(message, tiles, myPos.X - 8, myPos.Y - 6, myPos.Z - 3, 18, 14, 3, ref skip);
            }

            client.PlayerLocation = new Location(myPos.X + 1, myPos.Y + 1, myPos.Z);
            client.Map.OnMapUpdated(tiles);
        }
Esempio n. 14
0
        private void ParseServerMapDescription(InMessage message, List <Tile> tiles, int x, int y, int z, int width, int height)
        {
            int startz, endz, zstep;

            //calculate map limits
            if (z > 7)
            {
                startz = z - 2;
                endz   = Math.Min(16 - 1, z + 2);
                zstep  = 1;
            }
            else
            {
                startz = 7;
                endz   = 0;
                zstep  = -1;
            }

            int skipTiles = 0;

            for (int nz = startz; nz != endz + zstep; nz += zstep)
            {
                ParseServerFloorDescription(message, tiles, x, y, nz, width, height, z - nz, ref skipTiles);
            }
        }
Esempio n. 15
0
        private void ParseServerTileRemoveThing(InMessage message)
        {
            Location location = message.ReadLocation();
            var      stack    = message.ReadByte();

            if (location.IsCreature) //TODO: Veirificar o porque disso.
            {
                return;
            }

            Tile tile = client.Map.GetTile(location);

            if (tile == null)
            {
                throw new Exception("[ParseServerTileRemoveThing] Tile not found.");
            }

            var thing = tile.GetThing(stack);

            if (thing == null) // The client will send update tile.
            {
                return;
            }

            tile.RemoveThing(stack);
        }
Esempio n. 16
0
        private void ParseServerBasicData(InMessage message)
        {
            var isPremmium = message.ReadByte();
            var vocation   = message.ReadByte();

            var knowSpells = message.ReadUShort();

            message.ReadBytes(knowSpells);
        }
Esempio n. 17
0
        private void ParseServerSelfAppear(InMessage message)
        {
            client.BattleList.Clear();
            client.Map.Clear();

            client.PlayerId = message.ReadUInt();
            message.ReadUShort();
            client.PlayerCanReportBugs = message.ReadByte() != 0;
        }
Esempio n. 18
0
 private void ParseServerPlayerSkills(InMessage message)
 {
     for (int i = 0; i <= (int)Skills.LAST; i++)
     {
         var skill        = message.ReadByte();
         var skillBase    = message.ReadByte();
         var skillPercent = message.ReadByte();
     }
 }
Esempio n. 19
0
        private void ParseServerCreatePrivateChannel(InMessage message)
        {
            var channelId = message.ReadUShort();
            var name      = message.ReadString();

            message.ReadUShort();
            message.ReadString();
            message.ReadUShort();
        }
Esempio n. 20
0
 private void ParseServerItemTextWindow(InMessage message)
 {
     var windowID = message.ReadUInt();
     var itemID   = message.ReadUShort();
     var maxlen   = message.ReadUShort();
     var text     = message.ReadString();
     var writter  = message.ReadString();
     var date     = message.ReadString();
 }
Esempio n. 21
0
        private void ParseServerChannelList(InMessage message)
        {
            var count = message.ReadByte();

            for (uint i = 0; i < count; ++i)
            {
                var channelId = message.ReadUShort();
                var name      = message.ReadString();
            }
        }
Esempio n. 22
0
        private void ParseServerSafeTradeRequest(InMessage message, bool ack)
        {
            var name  = message.ReadString();
            var count = message.ReadByte();

            for (uint i = 0; i < count; ++i)
            {
                Item item = GetItem(message, ushort.MaxValue);
            }
        }
        public Connection(Socket socket, OtItems items)
        {
            this.socket = socket;
            this.items = items;

            message = new InMessage();
            map = new OtMap(items);

            BeginReceive();
        }
Esempio n. 24
0
        private void ParseServerMoveEast(InMessage message)
        {
            var location = new Location(client.PlayerLocation.X + 1, client.PlayerLocation.Y, client.PlayerLocation.Z);

            client.PlayerLocation = location;

            var tiles = new List <Tile>();

            ParseServerMapDescription(message, tiles, location.X + 9, location.Y - 6, location.Z, 1, 14);
            client.Map.OnMapUpdated(tiles);
        }
Esempio n. 25
0
        private void ParseServerQuestList(InMessage message)
        {
            var nQuests = message.ReadUShort();

            for (uint i = 0; i < nQuests; ++i)
            {
                var questsID    = message.ReadUShort();
                var questsName  = message.ReadString();
                var questsState = message.ReadByte();
            }
        }
Esempio n. 26
0
        private void ParseServerCreatureOutfit(InMessage message)
        {
            var      creatureID = message.ReadUInt();
            Creature creature   = client.BattleList.GetCreature(creatureID);
            var      outfit     = message.ReadOutfit();

            if (creature != null)
            {
                creature.Outfit = outfit;
            }
        }
Esempio n. 27
0
        private void ParseServerQuestPartList(InMessage message)
        {
            var questsID = message.ReadUShort();
            var nMission = message.ReadByte();

            for (uint i = 0; i < nMission; ++i)
            {
                var questsName = message.ReadString();
                var questsDesc = message.ReadString();
            }
        }
Esempio n. 28
0
        private void ParseServerMarketEnter(InMessage message)
        {
            message.ReadUInt();
            message.ReadByte();
            var num = message.ReadUShort();

            for (int i = 0; i < num; i++)
            {
                message.ReadUInt();
            }
        }
Esempio n. 29
0
        private void ParseServerMoveNorth(InMessage message)
        {
            var location = new Location(client.PlayerLocation.X, client.PlayerLocation.Y - 1, client.PlayerLocation.Z);

            client.PlayerLocation = location;

            var tiles = new List <Tile>();

            ParseServerMapDescription(message, tiles, location.X - 8, location.Y - 6, location.Z, 18, 1);
            client.Map.OnMapUpdated(tiles);
        }
Esempio n. 30
0
        private void ParseServerMapDescription(InMessage message)
        {
            var location = message.ReadLocation();

            client.PlayerLocation = location;

            var tiles = new List <Tile>();

            ParseServerMapDescription(message, tiles, location.X - 8, location.Y - 6, location.Z, 18, 14);
            client.Map.OnMapUpdated(tiles);
        }
Esempio n. 31
0
        private void ParseServerVipState(InMessage message)
        {
            var creatureID = message.ReadUInt();
            var name       = message.ReadString();

            if (client.Version.Number > ClientVersion.Version961.Number)
            {
                var unk1 = message.ReadString();
                var unk2 = message.ReadUInt();
                var unk3 = message.ReadByte();
            }

            var unk4 = message.ReadByte(); //status?
        }
Esempio n. 32
0
        private void ParseServerTileAddThing(InMessage message)
        {
            Location location = message.ReadLocation();
            var      stack    = message.ReadByte();

            Thing thing = GetThing(message);
            Tile  tile  = client.Map.GetTile(location);

            if (tile == null)
            {
                throw new Exception("[ParseServerTileAddThing] Tile not found.");
            }

            tile.AddThing(stack, thing);
            client.Map.SetTile(tile);
        }
Esempio n. 33
0
        private void ParseServerOpenChannel(InMessage message)
        {
            var channelId = message.ReadUShort();
            var name      = message.ReadString();

            var num = message.ReadUShort();

            for (int i = 0; i < num; i++)
            {
                message.ReadString();
            }
            num = message.ReadUShort();
            for (int i = 0; i < num; i++)
            {
                message.ReadString();
            }
        }
Esempio n. 34
0
        public static void OpenTibiaDecrypt(InMessage msg)
        {
            if (msg.Size - msg.ReadPosition != 128)
                throw new Exception("Invalid message size.");

            var decrypted = openTibiaDecryptEngine.ProcessBlock(msg.Buffer, msg.ReadPosition, 128);
            var padSize = 128 - decrypted.Length;

            if (padSize > 0)
                Array.Clear(msg.Buffer, msg.ReadPosition, padSize);
            else
                padSize = 0;

            Array.Copy(decrypted, 0, msg.Buffer, msg.ReadPosition + padSize, decrypted.Length);

            if (msg.ReadByte() != 0)
                throw new Exception("Invalid decrypted message.");

            msg.Encrypted = false;
        }
        public void ParseClientMessage(InMessage message)
        {
            var packetStart = 0;
            try
            {
                packetStart = message.ReadPosition;
                byte cmd = message.ReadByte();

                switch (cmd)
                {
                    case 0x96:
                        ParseClientSay(message);
                        break;
                }

            }
            catch (Exception ex)
            {
                Trace.TraceWarning(ex.Message + "\nPacket Bytes: " + message.Buffer.ToHexString(packetStart, message.ReadPosition - packetStart));
            }
        }
Esempio n. 36
0
        public void Enable()
        {
            client.Rsa = Constants.RSAKey.OpenTibiaM;

            loginClientPort = GetFreePort();
            worldClientPort = GetFreePort(loginClientPort + 1);

            if (!client.IsOpenTibiaServer && client.LoginServers[0].Server == "localhost")
                loginServers = Client.DefaultServers;
            else
                loginServers = client.LoginServers;

            client.LoginServers = new LoginServer[] { new LoginServer("localhost", loginClientPort) };

            clientInMessage = new InMessage();
            clientOutMessage = new OutMessage();

            serverInMessage = new InMessage();
            serverOutMessage = new OutMessage();

            StartListen();
        }
Esempio n. 37
0
        /// <summary>
        /// Decrypts the message
        /// </summary>
        /// <param name="msg">The message to be dencrypted.</param>
        /// <param name="key">The key to be used.</param>
        public static unsafe void Decrypt(InMessage msg, uint[] key)
        {
            if (msg == null)
                throw new Exception("Null message.");

            if (key == null)
                throw new Exception("Null key.");

            if (!msg.Encrypted)
                throw new Exception("Can't dencrypt a dencrypted message.");

            var msgSize = msg.Size - 6;

            if (msg.Size <= 6 || msgSize % 8 > 0)
                throw new Exception("Wrong message size.");

            fixed (byte* bufferPtr = msg.Buffer)
            {
                var words = (uint*)(bufferPtr + 6);

                for (var pos = 0; pos < msgSize / 4; pos += 2)
                {
                    var count = 32;
                    var sum = 0xC6EF3720;

                    while (count-- > 0)
                    {
                        words[pos + 1] -= (words[pos] << 4 ^ words[pos] >> 5) + words[pos] ^ sum
                            + key[sum >> 11 & 3];
                        sum -= DELTA;
                        words[pos] -= (words[pos + 1] << 4 ^ words[pos + 1] >> 5) + words[pos + 1] ^ sum
                            + key[sum & 3];
                    }
                }
            }

            msg.Size = BitConverter.ToUInt16(msg.Buffer, 6) + 2 + 6;
            msg.Encrypted = false;
        }
Esempio n. 38
0
        public void ParseClientMessage(InMessage message)
        {
            var packetStart = 0;
            try
            {
                packetStart = message.ReadPosition;
                byte cmd = message.ReadByte();

                switch (cmd)
                {
                    case 0x96:
                        ParseClientSay(message);
                        break;
                    case 0xF4://244
                        ParseClientMarketLeave(message);
                        break;
                    case 0xF5://245
                        ParseClientMarketBrowse(message);
                        break;
                    case 0xF6://246
                        ParseClientMarketCreate(message);
                        break;
                    case 0xF7://247
                        ParseClientMarketCancel(message);
                        break;
                    case 0xF8://248
                        ParseClientMarketAccept(message);
                        break;
                }

            }
            catch (Exception ex)
            {
                Trace.TraceWarning(ex.Message + "\nPacket Bytes: " + message.Buffer.ToHexString(packetStart, message.ReadPosition - packetStart));
            }

        }
        private void ParsePacket(InMessage message)
        {
            while (message.ReadPosition < message.Size)
            {
                var packetType = (TibiaCastPacketType)message.ReadByte();

                switch (packetType)
                {

                    case TibiaCastPacketType.CloseShopWindow:
                        //this.g(ax);
                        message.ReadByte();
                        break;
                    case TibiaCastPacketType.Initialize:
                        ParseInitialize(message);
                        break;
                    case TibiaCastPacketType.TibiaPackets:
                        ParseTibiaPackets(message);
                        break;
                    case TibiaCastPacketType.Message:
                        message.ReadString();
                        message.ReadString();
                        break;
                    default:
                        throw new Exception(string.Format("Unknown packet type ({0}) when reading TibiaCast file.", packetType));
                }
            }
        }
 private void ParseServerMarketLeave(InMessage message)
 {
 }
        private void ParseInitialize(InMessage message)
        {
            if (minorVersion >= 10)
                message.ReadByte(); //?

            int count = message.ReadUShort();
            for (int i = 0; i < count; i++)
            {
                var creature = new Creature(message.ReadUInt());
                creature.Type = (CreatureType)message.ReadByte();
                creature.Name = message.ReadString();

                //Trace.WriteLine(String.Format("Creature[{0}]: {1}", i, creature.Name));

                creature.Health = message.ReadByte();
                var direction = (Direction)message.ReadByte();
                creature.LookDirection = direction;
                creature.TurnDirection = direction;

                //Outfit
                creature.Outfit = message.ReadOutfit();
                creature.LightLevel = message.ReadByte();
                creature.LightColor = message.ReadByte();
                creature.Speed = message.ReadUShort();
                creature.Skull = message.ReadByte();
                creature.Shield = message.ReadByte();
                creature.Emblem = message.ReadByte();
                creature.IsImpassable = message.ReadByte() == 0x01;

                //10.20+ includes an extra 4 bytes per creature
                //These bytes could alter the read order, but since I don't know what they are for yet, I'll read them out of the way.
                message.ReadUInt();

                //speech category?
                if (client.Version.Number >= ClientVersion.Version1036.Number)
                    message.ReadByte();

                client.BattleList.AddCreature(creature);
            }

            ParseTibiaPackets(message);
        }
 private void ParseServerMarketBrowser(InMessage message)
 {
     ushort num = message.ReadUShort();
     if (num == 65535)
     {
         var count = message.ReadUInt();
         for (int i = 0; i < count; i++)
         {
             message.ReadUInt();
             message.ReadUShort();
             message.ReadUShort();
             message.ReadUShort();
             message.ReadUInt();
             message.ReadByte();
         }
         count = message.ReadUInt();
         for (int j = 0; j <= count; j++)
         {
             message.ReadUInt();
             message.ReadUShort();
             message.ReadUShort();
             message.ReadUShort();
             message.ReadUInt();
             message.ReadByte();
         }
     }
     else if (num == 65534)
     {
         var count = message.ReadUInt();
         for (int k = 0; k <= count; k++)
         {
             message.ReadUInt();
             message.ReadUShort();
             message.ReadUShort();
             message.ReadUShort();
             message.ReadUInt();
         }
         count = message.ReadUInt();
         for (int l = 0; l <= count; l++)
         {
             message.ReadUInt();
             message.ReadUShort();
             message.ReadUShort();
             message.ReadUShort();
             message.ReadUInt();
         }
     }
     else
     {
         var count = message.ReadUInt();
         for (int m = 0; m < count; m++)
         {
             message.ReadUInt();
             message.ReadUShort();
             message.ReadUShort();
             message.ReadUInt();
             message.ReadString();
         }
         count = message.ReadUInt();
         for (int n = 0; n < count; n++)
         {
             message.ReadUInt();
             message.ReadUShort();
             message.ReadUShort();
             message.ReadUInt();
             message.ReadString();
         }
     }
 }
 private void ParseServerMarketEnter(InMessage message)
 {
     message.ReadUInt();
     message.ReadByte();
     var num = message.ReadUShort();
     for (int i = 0; i < num; i++)
         message.ReadUInt();
 }
        public void Read(string[] fileNames)
        {
            int count = 0;

            foreach (var fileName in fileNames)
            {
                ++count;

                try
                {
                    if (!File.Exists(fileName))
                    {
                        Trace.WriteLine("[Error] Could not find the file " + fileName);
                        continue;
                    }

                    using (var fileStream = File.OpenRead(fileName))
                    {

                        var reader = new BinaryReader(fileStream);
                        majorVersion = reader.ReadByte();
                        minorVersion = reader.ReadByte();

                        if (minorVersion == 21)
                            client.Version = ClientVersion.Version1036;
                        else if (minorVersion == 22)
                            client.Version = ClientVersion.Version1038;
                        else if (minorVersion == 23)
                            client.Version = ClientVersion.Version1038;
                        else if (minorVersion == 24)
                            client.Version = ClientVersion.Version1041;
                        else if (minorVersion == 30)
                            client.Version = ClientVersion.Version1079;

                        if(majorVersion != currentMajorVersion)
                        {
                            Trace.WriteLine("[Error] (" + Path.GetFileName(fileName) + ") Unsupported TibiaCast Version " + majorVersion + "." + minorVersion);
                            break;
                        }

                        if (majorVersion > 4 || (majorVersion == 4 && minorVersion >= 5))
                        {
                            test1 = reader.ReadUInt32();
                        }

                        if (minorVersion >= 9)
                            reader.ReadByte(); //?

                        reader = new BinaryReader(new DeflateStream(fileStream, CompressionMode.Decompress));

                        Trace.WriteLine("[" + majorVersion + "." + minorVersion + "] Tracking " + Path.GetFileName(fileName) + " (" + count + " of " + fileNames.Length + ").");

                        var nextPacketTime = reader.ReadUInt32();

                        var buffer = new byte[ushort.MaxValue];
                        int packetSize;
                        do
                        {
                            packetSize = reader.ReadInt32();

                            if (packetSize == 0) //end
                                break;

                            reader.BaseStream.Read(buffer, 0, packetSize);
                            var message = new InMessage(buffer, packetSize);

                            //System.Threading.Thread.Sleep(10);
                            ParsePacket(message);

                            nextPacketTime = reader.ReadUInt32();

                        } while (packetSize != 0);
                    }

                    Trace.WriteLine("File " + Path.GetFileName(fileName) + " successfully tracked.");
                }
                catch (Exception ex)
                {
                    Trace.WriteLine("Exception while tracking " + Path.GetFileName(fileName)
                        + ". Details: " + ex.Message);
                }
            }
        }
        private void ParseServerMoveWest(InMessage message)
        {
            var location = new Location(client.PlayerLocation.X - 1, client.PlayerLocation.Y, client.PlayerLocation.Z);
            client.PlayerLocation = location;

            var tiles = new List<Tile>();
            ParseServerMapDescription(message, tiles, location.X - 8, location.Y - 6, location.Z, 1, 14);
            client.Map.OnMapUpdated(tiles);
        }
 private void ParseServerInventoryResetSlot(InMessage message)
 {
     var slot = message.ReadByte();
 }
        private void ParseServerOpenChannel(InMessage message)
        {
            var channelId = message.ReadUShort();
            var name = message.ReadString();

            var num = message.ReadUShort();
            for (int i = 0; i < num; i++)
                message.ReadString();
            num = message.ReadUShort();
            for (int i = 0; i < num; i++)
                message.ReadString();
        }
 private void ParseServerItemTextWindow(InMessage message)
 {
     var windowID = message.ReadUInt();
     var itemID = message.ReadUShort();
     var maxlen = message.ReadUShort();
     var text = message.ReadString();
     var writter = message.ReadString();
     var date = message.ReadString();
 }
 private void ParseServerInventorySetSlot(InMessage message)
 {
     var slot = message.ReadByte();
     Item item = GetItem(message, ushort.MaxValue);
 }
 private void ParseServerMagicEffect(InMessage message)
 {
     Location location = message.ReadLocation();
     var effect = message.ReadByte();
 }
        private void ParseServerMapDescription(InMessage message)
        {
            var location = message.ReadLocation();
            client.PlayerLocation = location;

            var tiles = new List<Tile>();
            ParseServerMapDescription(message, tiles, location.X - 8, location.Y - 6, location.Z, 18, 14);
            client.Map.OnMapUpdated(tiles);
        }
        private void ParseServerMapDescription(InMessage message, List<Tile> tiles, int x, int y, int z, int width, int height)
        {
            int startz, endz, zstep;
            //calculate map limits
            if (z > 7)
            {
                startz = z - 2;
                endz = Math.Min(16 - 1, z + 2);
                zstep = 1;
            }
            else
            {
                startz = 7;
                endz = 0;
                zstep = -1;
            }

            int skipTiles = 0;
            for (int nz = startz; nz != endz + zstep; nz += zstep)
                ParseServerFloorDescription(message, tiles, x, y, nz, width, height, z - nz, ref skipTiles);
        }
        private void ParseTibiaPacket(InMessage message)
        {
            var cmd = message.ReadByte();

            switch (cmd)
            {
                case 0x6C:
                case 0x6D:
                    var location = message.ReadLocation();
                    var stack = message.ReadByte();
                    if (location.IsCreature && !client.BattleList.ContainsCreature(location.GetCretureId(stack)))
                        return;
                    break;
            }

            message.ReadPosition = 0;
            client.ProtocolWorld.ParseServerMessage(message);
        }
 private void ParseServerHouseTextWindow(InMessage message)
 {
     var unk = message.ReadByte();
     var windowId = message.ReadUInt();
     var text = message.ReadString();
 }
 private void ParseTibiaPackets(InMessage message)
 {
     var packetCount = message.ReadUShort();
     for (int j = 0; j < packetCount; j++)
     {
         var packetSize = message.ReadUShort();
         var packet = message.ReadBytes(packetSize);
         var packetMessage = new InMessage(packet, packetSize);
         ParseTibiaPacket(packetMessage);
     }
 }
 private void ParseServerGMActions(InMessage message)
 {
 }
        private void ParseServerMoveSouth(InMessage message)
        {
            var location = new Location(client.PlayerLocation.X, client.PlayerLocation.Y + 1, client.PlayerLocation.Z);
            client.PlayerLocation = location;

            var tiles = new List<Tile>();
            ParseServerMapDescription(message, tiles, location.X - 8, location.Y + 7, location.Z, 18, 1);
            client.Map.OnMapUpdated(tiles);
        }
 private void ParseServerFYIMessage(InMessage message)
 {
     message.ReadString();
 }
        private void ParseInitialize(InMessage message)
        {
            int count = message.ReadUShort();
            for (int i = 0; i < count; i++)
            {
                var creature = new Creature(message.ReadUInt());
                creature.Type = (CreatureType)message.ReadByte();
                creature.Name = message.ReadString();

                //Trace.WriteLine(String.Format("Creature[{0}]: {1}", i, creature.Name));

                creature.Health = message.ReadByte();
                var direction = (Direction)message.ReadByte();
                creature.LookDirection = direction;
                creature.TurnDirection = direction;

                //Outfit
                creature.Outfit = message.ReadOutfit();
                creature.LightLevel = message.ReadByte();
                creature.LightColor = message.ReadByte();
                creature.Speed = message.ReadUShort();
                creature.Skull = message.ReadByte();
                creature.Shield = message.ReadByte();
                creature.Emblem = message.ReadByte();
                creature.IsImpassable = message.ReadByte() == 0x01;

                client.BattleList.AddCreature(creature);
            }

            ParseTibiaPackets(message);
        }
        private void ParseServerMarketDetail(InMessage message)
        {
            message.ReadUShort();
            for (int i = 0; i < 15; i++)
                message.ReadString();

            var num2 = message.ReadByte();
            if (num2 > 0)
                message.ReadBytes(num2 * 16);
            num2 = message.ReadByte();
            if (num2 > 0)
                message.ReadBytes(num2 * 16);
        }