/// <summary> /// Handles packets sent from the game server /// </summary> /// <param name="packet">The packet.</param> public void OnPacket(GameServerPacket packet) { switch (packet.Id) { case GameServerInPacketType.GameMessage: OnGameMessage(packet); break; case GameServerInPacketType.InformationMessage: OnInformationMessage(packet); break; case GameServerInPacketType.WorldItemAction: OnWorldItemAction(packet); break; case GameServerInPacketType.PlayerInGame: OnPlayerInGame(packet); break; case GameServerInPacketType.LoadAct: OnLoadAct(packet); break; case GameServerInPacketType.AssignPlayer: OnAssignPlayer(packet); break; case GameServerInPacketType.PlayerMove: OnPlayerMove(packet); break; case GameServerInPacketType.PlayerReassign: OnPlayerReassign(packet); break; default: break; } }
/// <summary> /// Game server has completed our request to join the game. We request to enter the /// game along with starting the ping thread. /// </summary> /// <param name="packet">The packet.</param> private void OnGameLogonSuccess(GameServerPacket packet) { SendPacket(new EnterGameOut()); // Ping thread used to keep our connection to the server alive pingThread = new Thread(() => { LogServer("Ping thread started"); while (client.Connected) { Thread.Sleep(7000); SendPing(); } LogServer("Ping thread ended"); }); pingThread.Name = "PING:" + characterName; pingThread.IsBackground = true; pingThread.Start(); AntiIdleCounter = 0; AntiIdleTimer = new Timer( n => { SayOverhead(characterName + " Anti-Idle " + (AntiIdleCounter++)); }, null, 0, 300000 ); IsInGame = true; FireOnEnterGameEvent(); }
/// <summary> /// Handles WorldItemAction (0x9c) packets. Keeps track of items in player's main inventory. /// </summary> /// <param name="packet">The packet.</param> private void OnWorldItemAction(GameServerPacket packet) { WorldItemEventIn fromServer; try { fromServer = new WorldItemEventIn(packet); } catch (Exception) { LogError("Failed to parse item: " + Util.GetPacketDump(packet.Data, true)); } //StringBuilder sb = new StringBuilder(); // //sb.AppendLine("Item: " + fromServer.item); //foreach (var item in fromServer.item.Properties) //{ // sb.AppendLine(" " + item); //} //sb.AppendLine(" " ); //LogDebug(sb); //if (fromServer.item.Location == Item.ItemLocation.Stored && fromServer.item.StorageId == Item.StorageType.Inventory) //{ // items.Add(fromServer.item); //} }
private void OnLoadAct(GameServerPacket packet) { LoadActIn fromServer = new LoadActIn(packet); CurrentAct = fromServer.Act + 1; Log("Entering act " + CurrentAct); }
public LoadActIn(GameServerPacket packet) { BinaryReader br = new BinaryReader(new MemoryStream(packet.Data)); Act = br.ReadByte(); Seed1 = br.ReadUInt32(); AreaId = br.ReadUInt16(); Seed2 = br.ReadUInt32(); }
public PlayerReassignIn(GameServerPacket packet) { BinaryReader br = new BinaryReader(new MemoryStream(packet.Data)); EntityType = br.ReadByte(); ID = br.ReadUInt32(); X = br.ReadUInt16(); Y = br.ReadUInt16(); UnknownFlag = br.ReadByte(); }
public AssignPlayerIn(GameServerPacket packet) { BinaryReader br = new BinaryReader(new MemoryStream(packet.Data)); ID = br.ReadUInt32(); Class = br.ReadByte(); Name = Util.ReadSpecialString(br); br.ReadBytes(15 - Name.Length); X = br.ReadUInt16(); Y = br.ReadUInt16(); }
public PlayerMoveIn(GameServerPacket packet) { BinaryReader br = new BinaryReader(new MemoryStream(packet.Data)); ID = br.ReadUInt32(); MovementType = br.ReadByte(); DestX = br.ReadUInt16(); DestY = br.ReadUInt16(); Unknown = br.ReadByte(); SourceX = br.ReadUInt16(); SourceY = br.ReadUInt16(); }
public PlayerInGameIn(GameServerPacket packet) { BinaryReader br = new BinaryReader(new MemoryStream(packet.Data)); ushort messageLength = br.ReadUInt16(); PlayerID = br.ReadUInt32(); PlayerClass = br.ReadByte(); PlayerName = Util.ReadSpecialString(br); br.ReadBytes(15 - PlayerName.Length); PlayerLevel = br.ReadUInt16(); PlayerPartyID = br.ReadUInt16(); }
public InformationMessageIn(GameServerPacket packet) { BinaryReader br = new BinaryReader(new MemoryStream(packet.Data)); Event = (InformationEvents)br.ReadByte(); Action = br.ReadByte(); EntityID = br.ReadUInt32(); EntityType = br.ReadByte(); First = Util.ReadAndUnpadString(br, 16); Second = Util.ReadAndUnpadString(br, 16); }
/// <summary> /// Handles the GameLogonRequestIn packet. This packet is sent to us when we first connect /// to the game server. We reply with a logon request and a ping /// </summary> /// <param name="packet">The packet.</param> private void OnRequestLogonInfo(GameServerPacket packet) { GameLogonRequestOut toServer = new GameLogonRequestOut( gameServerArgs.GameHash, gameServerArgs.GameToken, settings.ClientVersion, (byte)gameServerArgs.CharacterClass, gameServerArgs.CharacterName ); SendPacket(toServer); SendPing(); }
public GameMessageIn(GameServerPacket packet) { BinaryReader br = new BinaryReader(new MemoryStream(packet.Data)); ChatType = (ChatTypes)br.ReadByte(); UnknownA = br.ReadByte(); EntityType = br.ReadByte(); EntityID = br.ReadUInt32(); UnknownB = br.ReadByte(); UnknownC = br.ReadByte(); CharacterName = Util.ReadSpecialString(br); Message = Util.ReadSpecialString(br);; }
private void OnPlayerReassign(GameServerPacket packet) { PlayerReassignIn fromServer = new PlayerReassignIn(packet); if (fromServer.ID != clientPlayerId) { Log("Reassign from other client"); return; } PositionX = fromServer.X; PositionY = fromServer.Y; Log(string.Format("Reassigned player to {0}, {1}", PositionX, PositionY)); if (AlreadyDispersed) { return; } AlreadyDispersed = true; ushort moveToX = PositionX; ushort moveToY = PositionY; switch (CurrentAct) { case 1: moveToY -= 20; break; case 2: moveToY += 20; break; case 3: moveToX += 20; moveToY += 20; break; case 4: moveToX -= 40; moveToY += 20; break; case 5: moveToX += 20; break; } SendPacket(new RunToLocationOut(moveToX, moveToY)); }
private void OnAssignPlayer(GameServerPacket packet) { AssignPlayerIn fromServer = new AssignPlayerIn(packet); if (fromServer.X == 0 && fromServer.Y == 0 && String.Compare(fromServer.Name, characterName, StringComparison.OrdinalIgnoreCase) == 0) { // This bot clientPlayerId = fromServer.ID; } else { // Other players } }
/// <summary> /// Handles inviting all players already in a game /// </summary> /// <param name="packet">The packet.</param> private void OnPlayerInGame(GameServerPacket packet) { PlayerInGameIn fromServer = new PlayerInGameIn(packet); if (fromServer.IsPlayerInParty) { return; } if (String.Compare(characterName, fromServer.PlayerName, System.StringComparison.OrdinalIgnoreCase) != 0) { // invite player... Log(string.Format("Inviting player: {0}", fromServer.PlayerName)); SendPacket(new PartyRequestOut(PartyRequestOut.RequestType.Invite, fromServer.PlayerID)); } }
/// <summary> /// Handles InformationMessageIn packets. Keeps track of total number of players /// in game. /// </summary> /// <param name="packet">The packet.</param> private void OnInformationMessage(GameServerPacket packet) { InformationMessageIn fromServer = new InformationMessageIn(packet); Log(fromServer); switch (fromServer.Event) { case InformationMessageIn.InformationEvents.PlayerTimeout: case InformationMessageIn.InformationEvents.PlayerDropped: case InformationMessageIn.InformationEvents.PlayerQuit: { bool isBot = settings.BotNames.Contains(fromServer.First.ToLower()); PlayerNames.Remove(fromServer.First); Log(String.Format("{0}/{1} players remaining", PlayerNames.Count, MaxPlayers)); FireOnPlayerCountEvent(new PlayerCountArgs(PlayerNames.Count, MaxPlayers, fromServer.First, false, isBot)); break; } case InformationMessageIn.InformationEvents.PlayerJoined: { bool isBot = settings.BotNames.Contains(fromServer.First.ToLower()); PlayerNames.Add(fromServer.First); Log(String.Format("{0}/{1} players total", PlayerNames.Count, MaxPlayers)); FireOnPlayerCountEvent(new PlayerCountArgs(PlayerNames.Count, MaxPlayers, fromServer.First, true, isBot)); } break; case InformationMessageIn.InformationEvents.PlayerRelation: // Accept any party requests if (fromServer.Action == 0x02 && fromServer.EntityType == 0x05) { SendPacket(new PartyRequestOut(PartyRequestOut.RequestType.Accept, fromServer.EntityID)); } break; default: break; } }
/// <summary> /// Handles chat messages from other players and objects in game /// </summary> /// <param name="packet">The packet.</param> private void OnGameMessage(GameServerPacket packet) { GameMessageIn fromServer = new GameMessageIn(packet); Log(fromServer); if (fromServer.ChatType == GameMessageIn.ChatTypes.ChatMessage) { if (String.CompareOrdinal(fromServer.CharacterName, settings.MasterName) == 0) { switch (fromServer.Message.Trim().ToLower()) { case "#exit": Say("Bye"); FireOnShutdownEvent(); LeaveGame(); return; } } } }
/// <summary> /// Handles packets sent from the game server /// </summary> /// <param name="packet">The packet.</param> public void OnPacket(GameServerPacket packet) { switch (packet.Id) { case GameServerInPacketType.GameMessage: OnGameMessage(packet); break; case GameServerInPacketType.InformationMessage: OnInformationMessage(packet); break; case GameServerInPacketType.WorldItemAction: OnWorldItemAction(packet); break; case GameServerInPacketType.PlayerInGame: OnPlayerInGame(packet); break; case GameServerInPacketType.LoadAct: OnLoadAct(packet); break; case GameServerInPacketType.AssignPlayer: OnAssignPlayer(packet); break; case GameServerInPacketType.PlayerMove: OnPlayerMove(packet); break; case GameServerInPacketType.PlayerReassign: OnPlayerReassign(packet); break; default: break; } }
/// <summary> /// Gets the next decompressed packet from byte array. Processed data will be removed from /// input array. /// </summary> /// <exception cref="ApplicationException">Thrown when encountering an unhandled packet with no size.</exception> /// <param name="decompressedData">[in,out] Byte array containing decompressed data.</param> /// <returns>The next decompressed packet.</returns> private GameServerPacket GetNextDecompressedPacket(ref byte[] decompressedData) { GameServerPacket packet = new GameServerPacket(); int decompressedPacketSize = Compression.GetDecompressedPacketSize(decompressedData); if (decompressedPacketSize == 0xFF) { Fail(FailureArgs.FailureTypes.UnknownPacketSize, String.Format("Unhandled special packet {0:X2}", decompressedData[0])); throw new ApplicationException("Bad packet data encountered (No size)"); } packet.Id = (GameServerInPacketType)decompressedData[0]; packet.Data = new byte[decompressedPacketSize - 1]; if (packet.Data.Length > 0) { Array.Copy(decompressedData, 1, packet.Data, 0, packet.Data.Length); } Util.RemoveBeginningBytes(ref decompressedData, decompressedPacketSize); return(packet); }
public UpdateItemUIIn(GameServerPacket packet) { BinaryReader br = new BinaryReader(new MemoryStream(packet.Data)); Id = (IdTypes)br.ReadByte(); }
private void OnAssignPlayer(GameServerPacket packet) { AssignPlayerIn fromServer = new AssignPlayerIn(packet); if (fromServer.X == 0 && fromServer.Y == 0 && String.Compare(fromServer.Name, characterName, StringComparison.OrdinalIgnoreCase) == 0) { // This bot clientPlayerId = fromServer.ID; } else { // Other players } }
/// <summary> /// Handles WorldItemAction (0x9c) packets. Keeps track of items in player's main inventory. /// </summary> /// <param name="packet">The packet.</param> private void OnWorldItemAction(GameServerPacket packet) { WorldItemEventIn fromServer; try { fromServer = new WorldItemEventIn(packet); } catch (Exception) { LogError("Failed to parse item: " + Util.GetPacketDump(packet.Data, true)); } //StringBuilder sb = new StringBuilder(); // //sb.AppendLine("Item: " + fromServer.item); //foreach (var item in fromServer.item.Properties) //{ // sb.AppendLine(" " + item); //} //sb.AppendLine(" " ); //LogDebug(sb); //if (fromServer.item.Location == Item.ItemLocation.Stored && fromServer.item.StorageId == Item.StorageType.Inventory) //{ // items.Add(fromServer.item); //} }
/// <summary> /// Gets the next decompressed packet from byte array. Processed data will be removed from /// input array. /// </summary> /// <exception cref="ApplicationException">Thrown when encountering an unhandled packet with no size.</exception> /// <param name="decompressedData">[in,out] Byte array containing decompressed data.</param> /// <returns>The next decompressed packet.</returns> private GameServerPacket GetNextDecompressedPacket(ref byte[] decompressedData) { GameServerPacket packet = new GameServerPacket(); int decompressedPacketSize = Compression.GetDecompressedPacketSize(decompressedData); if (decompressedPacketSize == 0xFF) { Fail(FailureArgs.FailureTypes.UnknownPacketSize, String.Format("Unhandled special packet {0:X2}", decompressedData[0])); throw new ApplicationException("Bad packet data encountered (No size)"); } packet.Id = (GameServerInPacketType)decompressedData[0]; packet.Data = new byte[decompressedPacketSize - 1]; if (packet.Data.Length > 0) { Array.Copy(decompressedData, 1, packet.Data, 0, packet.Data.Length); } Util.RemoveBeginningBytes(ref decompressedData, decompressedPacketSize); return packet; }
public AssignPlayerIn(GameServerPacket packet) { BinaryReader br = new BinaryReader(new MemoryStream(packet.Data)); ID = br.ReadUInt32(); Class = br.ReadByte(); Name = Util.ReadSpecialString(br); br.ReadBytes(15 - Name.Length); X = br.ReadUInt16(); Y = br.ReadUInt16(); }
private void OnPlayerMove(GameServerPacket packet) { PlayerMoveIn fromServer = new PlayerMoveIn(packet); }
public PlayerReassignIn(GameServerPacket packet) { BinaryReader br = new BinaryReader(new MemoryStream(packet.Data)); EntityType = br.ReadByte(); ID = br.ReadUInt32(); X = br.ReadUInt16(); Y = br.ReadUInt16(); UnknownFlag = br.ReadByte(); }
public InformationMessageIn(GameServerPacket packet) { BinaryReader br = new BinaryReader(new MemoryStream(packet.Data)); Event = (InformationEvents)br.ReadByte(); Action = br.ReadByte(); EntityID = br.ReadUInt32(); EntityType = br.ReadByte(); First = Util.ReadAndUnpadString(br, 16); Second = Util.ReadAndUnpadString(br, 16); }
/// <summary> /// Game server has completed our request to join the game. We request to enter the /// game along with starting the ping thread. /// </summary> /// <param name="packet">The packet.</param> private void OnGameLogonSuccess(GameServerPacket packet) { SendPacket(new EnterGameOut()); // Ping thread used to keep our connection to the server alive pingThread = new Thread(() => { LogServer("Ping thread started"); while (client.Connected) { Thread.Sleep(7000); SendPing(); } LogServer("Ping thread ended"); }); pingThread.Name = "PING:" + characterName; pingThread.IsBackground = true; pingThread.Start(); AntiIdleCounter = 0; AntiIdleTimer = new Timer( n => { SayOverhead(characterName + " Anti-Idle " + (AntiIdleCounter++)); }, null, 0, 300000 ); IsInGame = true; FireOnEnterGameEvent(); }
private void OnLoadAct(GameServerPacket packet) { LoadActIn fromServer = new LoadActIn(packet); CurrentAct = fromServer.Act + 1; Log("Entering act " + CurrentAct); }
/// <summary> /// Handles inviting all players already in a game /// </summary> /// <param name="packet">The packet.</param> private void OnPlayerInGame(GameServerPacket packet) { PlayerInGameIn fromServer = new PlayerInGameIn(packet); if (fromServer.IsPlayerInParty) { return; } if (String.Compare(characterName, fromServer.PlayerName, System.StringComparison.OrdinalIgnoreCase) != 0) { // invite player... Log(string.Format("Inviting player: {0}", fromServer.PlayerName)); SendPacket(new PartyRequestOut(PartyRequestOut.RequestType.Invite, fromServer.PlayerID)); } }
public WorldItemEventIn(GameServerPacket packet) { item = new Item(packet.GetBytes()); }
public PlayerInGameIn(GameServerPacket packet) { BinaryReader br = new BinaryReader(new MemoryStream(packet.Data)); ushort messageLength = br.ReadUInt16(); PlayerID = br.ReadUInt32(); PlayerClass = br.ReadByte(); PlayerName = Util.ReadSpecialString(br); br.ReadBytes(15 - PlayerName.Length); PlayerLevel = br.ReadUInt16(); PlayerPartyID = br.ReadUInt16(); }
public WorldItemEventIn(GameServerPacket packet) { item = new Item(packet.GetBytes()); }
private void OnPlayerMove(GameServerPacket packet) { PlayerMoveIn fromServer = new PlayerMoveIn(packet); }
public PlayerMoveIn(GameServerPacket packet) { BinaryReader br = new BinaryReader(new MemoryStream(packet.Data)); ID = br.ReadUInt32(); MovementType = br.ReadByte(); DestX = br.ReadUInt16(); DestY = br.ReadUInt16(); Unknown = br.ReadByte(); SourceX = br.ReadUInt16(); SourceY = br.ReadUInt16(); }
/// <summary> /// Handles InformationMessageIn packets. Keeps track of total number of players /// in game. /// </summary> /// <param name="packet">The packet.</param> private void OnInformationMessage(GameServerPacket packet) { InformationMessageIn fromServer = new InformationMessageIn(packet); Log(fromServer); switch (fromServer.Event) { case InformationMessageIn.InformationEvents.PlayerTimeout: case InformationMessageIn.InformationEvents.PlayerDropped: case InformationMessageIn.InformationEvents.PlayerQuit: { bool isBot = settings.BotNames.Contains(fromServer.First.ToLower()); PlayerNames.Remove(fromServer.First); Log(String.Format("{0}/{1} players remaining", PlayerNames.Count, MaxPlayers)); FireOnPlayerCountEvent(new PlayerCountArgs(PlayerNames.Count, MaxPlayers, fromServer.First, false, isBot)); break; } case InformationMessageIn.InformationEvents.PlayerJoined: { bool isBot = settings.BotNames.Contains(fromServer.First.ToLower()); PlayerNames.Add(fromServer.First); Log(String.Format("{0}/{1} players total", PlayerNames.Count, MaxPlayers)); FireOnPlayerCountEvent(new PlayerCountArgs(PlayerNames.Count, MaxPlayers, fromServer.First, true, isBot)); } break; case InformationMessageIn.InformationEvents.PlayerRelation: // Accept any party requests if (fromServer.Action == 0x02 && fromServer.EntityType == 0x05) { SendPacket(new PartyRequestOut(PartyRequestOut.RequestType.Accept, fromServer.EntityID)); } break; default: break; } }
public LoadActIn(GameServerPacket packet) { BinaryReader br = new BinaryReader(new MemoryStream(packet.Data)); Act = br.ReadByte(); Seed1 = br.ReadUInt32(); AreaId = br.ReadUInt16(); Seed2 = br.ReadUInt32(); }
/// <summary> /// Handles chat messages from other players and objects in game /// </summary> /// <param name="packet">The packet.</param> private void OnGameMessage(GameServerPacket packet) { GameMessageIn fromServer = new GameMessageIn(packet); Log(fromServer); if (fromServer.ChatType == GameMessageIn.ChatTypes.ChatMessage) { if (String.CompareOrdinal(fromServer.CharacterName, settings.MasterName) == 0) { switch (fromServer.Message.Trim().ToLower()) { case "#exit": Say("Bye"); FireOnShutdownEvent(); LeaveGame(); return; } } } }
public UpdateItemUIIn(GameServerPacket packet) { BinaryReader br = new BinaryReader(new MemoryStream(packet.Data)); Id = (IdTypes)br.ReadByte(); }
/// <summary> /// Handles the GameLogonReceipt packet. Should contain some game information, but /// we queried the game before joining. Just wait for the GameLogonSuccess packet. /// </summary> /// <param name="packet">The packet.</param> private void OnGameLogonReceipt(GameServerPacket packet) { }
/// <summary> /// Handles the GameLogonReceipt packet. Should contain some game information, but /// we queried the game before joining. Just wait for the GameLogonSuccess packet. /// </summary> /// <param name="packet">The packet.</param> private void OnGameLogonReceipt(GameServerPacket packet) { }
private void OnPlayerReassign(GameServerPacket packet) { PlayerReassignIn fromServer = new PlayerReassignIn(packet); if (fromServer.ID != clientPlayerId) { Log("Reassign from other client"); return; } PositionX = fromServer.X; PositionY = fromServer.Y; Log(string.Format("Reassigned player to {0}, {1}", PositionX, PositionY)); if (AlreadyDispersed) return; AlreadyDispersed = true; ushort moveToX = PositionX; ushort moveToY = PositionY; switch (CurrentAct) { case 1: moveToY -= 20; break; case 2: moveToY += 20; break; case 3: moveToX += 20; moveToY += 20; break; case 4: moveToX -= 40; moveToY += 20; break; case 5: moveToX += 20; break; } SendPacket(new RunToLocationOut(moveToX, moveToY)); }
/// <summary> /// Handles the GameLogonRequestIn packet. This packet is sent to us when we first connect /// to the game server. We reply with a logon request and a ping /// </summary> /// <param name="packet">The packet.</param> private void OnRequestLogonInfo(GameServerPacket packet) { GameLogonRequestOut toServer = new GameLogonRequestOut( gameServerArgs.GameHash, gameServerArgs.GameToken, settings.ClientVersion, (byte)gameServerArgs.CharacterClass, gameServerArgs.CharacterName ); SendPacket(toServer); SendPing(); }
public byte UnknownC; //(0x05 chat, 0x01 recv-wisp) #endregion Fields #region Constructors public GameMessageIn(GameServerPacket packet) { BinaryReader br = new BinaryReader(new MemoryStream(packet.Data)); ChatType = (ChatTypes)br.ReadByte(); UnknownA = br.ReadByte(); EntityType = br.ReadByte(); EntityID = br.ReadUInt32(); UnknownB = br.ReadByte(); UnknownC = br.ReadByte(); CharacterName = Util.ReadSpecialString(br); Message = Util.ReadSpecialString(br); ; }