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(); }
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(); }
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 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(); }
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(); }
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--; } } } }
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); }
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)); }
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); }
private void ParseServerPlayerCash(InMessage message) { var cash = message.ReadUInt(); var num = message.ReadByte(); message.ReadBytes(num * 3); }
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); }
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); }
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); }
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 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); }
private void ParseServerBasicData(InMessage message) { var isPremmium = message.ReadByte(); var vocation = message.ReadByte(); var knowSpells = message.ReadUShort(); message.ReadBytes(knowSpells); }
private void ParseServerSelfAppear(InMessage message) { client.BattleList.Clear(); client.Map.Clear(); client.PlayerId = message.ReadUInt(); message.ReadUShort(); client.PlayerCanReportBugs = message.ReadByte() != 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(); } }
private void ParseServerCreatePrivateChannel(InMessage message) { var channelId = message.ReadUShort(); var name = message.ReadString(); message.ReadUShort(); message.ReadString(); message.ReadUShort(); }
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 ParseServerChannelList(InMessage message) { var count = message.ReadByte(); for (uint i = 0; i < count; ++i) { var channelId = message.ReadUShort(); var name = message.ReadString(); } }
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(); }
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); }
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(); } }
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; } }
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(); } }
private void ParseServerMarketEnter(InMessage message) { message.ReadUInt(); message.ReadByte(); var num = message.ReadUShort(); for (int i = 0; i < num; i++) { message.ReadUInt(); } }
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); }
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 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? }
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); }
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(); } }
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)); } }
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(); }
/// <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; }
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); }