public void On_CMSG_GROUP_SET_LEADER(PacketClass packet, ClientClass client) { if (packet.Data.Length - 1 < 6) { return; } packet.GetInt16(); var name = packet.GetString(); _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] CMSG_GROUP_SET_LEADER [Name={2}]", client.IP, client.Port, name); var guid = _clusterServiceLocator.WcHandlerCharacter.GetCharacterGuidByName(name); if (guid == 0m) { SendPartyResult(client, "", PartyCommand.PARTY_OP_INVITE, PartyCommandResult.INVITE_NOT_FOUND); } else if (_clusterServiceLocator.WorldCluster.CharacteRs.ContainsKey(guid) == false) { SendPartyResult(client, "", PartyCommand.PARTY_OP_INVITE, PartyCommandResult.INVITE_NOT_FOUND); } else if (!client.Character.IsGroupLeader) { SendPartyResult(client, client.Character.Name, PartyCommand.PARTY_OP_INVITE, PartyCommandResult.INVITE_NOT_LEADER); } else { var tmp = _clusterServiceLocator.WorldCluster.CharacteRs; var argobjCharacter = tmp[guid]; client.Character.Group.SetLeader(argobjCharacter); tmp[guid] = argobjCharacter; } }
public void On_MSG_RANDOM_ROLL(PacketClass packet, ClientClass client) { if (packet.Data.Length - 1 < 13) { return; } packet.GetInt16(); var minRoll = packet.GetInt32(); var maxRoll = packet.GetInt32(); _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] MSG_RANDOM_ROLL [min={2} max={3}]", client.IP, client.Port, minRoll, maxRoll); var response = new PacketClass(Opcodes.MSG_RANDOM_ROLL); response.AddInt32(minRoll); response.AddInt32(maxRoll); response.AddInt32(_clusterServiceLocator.WorldCluster.Rnd.Next(minRoll, maxRoll)); response.AddUInt64(client.Character.Guid); if (client.Character.IsInGroup) { client.Character.Group.Broadcast(response); } else { client.SendMultiplyPackets(response); } response.Dispose(); }
public void On_CMSG_GROUP_UNINVITE_GUID(PacketClass packet, ClientClass client) { if (packet.Data.Length - 1 < 13) { return; } packet.GetInt16(); var guid = packet.GetUInt64(); _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] CMSG_GROUP_UNINVITE_GUID [0x{2:X}]", client.IP, client.Port, guid); // TODO: InBattlegrounds: INVITE_RESTRICTED if (guid == 0m) { SendPartyResult(client, "", PartyCommand.PARTY_OP_LEAVE, PartyCommandResult.INVITE_NOT_FOUND); } else if (_clusterServiceLocator.WorldCluster.CharacteRs.ContainsKey(guid) == false) { SendPartyResult(client, "", PartyCommand.PARTY_OP_LEAVE, PartyCommandResult.INVITE_NOT_FOUND); } else if (!client.Character.IsGroupLeader) { SendPartyResult(client, "", PartyCommand.PARTY_OP_LEAVE, PartyCommandResult.INVITE_NOT_LEADER); } else { var tmp = _clusterServiceLocator.WorldCluster.CharacteRs; var argobjCharacter = tmp[guid]; client.Character.Group.Leave(argobjCharacter); tmp[guid] = argobjCharacter; } }
public void On_CMSG_REQUEST_RAID_INFO(PacketClass packet, ClientClass client) { _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] CMSG_REQUEST_RAID_INFO", client.IP, client.Port); var q = new DataTable(); if (client.Character is object) { _clusterServiceLocator.WorldCluster.GetCharacterDatabase().Query(string.Format("SELECT * FROM characters_instances WHERE char_guid = {0};", client.Character.Guid), ref q); } var response = new PacketClass(Opcodes.SMSG_RAID_INSTANCE_INFO); response.AddInt32(q.Rows.Count); // Instances Counts var i = 0; foreach (DataRow r in q.Rows) { response.AddUInt32(Conversions.ToUInteger(r["map"])); // MapID response.AddUInt32((uint)(Conversions.ToInteger(r["expire"]) - _clusterServiceLocator.Functions.GetTimestamp(DateAndTime.Now))); // TimeLeft response.AddUInt32(Conversions.ToUInteger(r["instance"])); // InstanceID response.AddUInt32((uint)i); // Counter i += 1; } client.Send(response); response.Dispose(); }
public void On_CMSG_REQUEST_PARTY_MEMBER_STATS(PacketClass packet, ClientClass client) { if (packet.Data.Length - 1 < 13) { return; } packet.GetInt16(); var guid = packet.GetUInt64(); _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] CMSG_REQUEST_PARTY_MEMBER_STATS [{2:X}]", client.IP, client.Port, guid); if (!_clusterServiceLocator.WorldCluster.CharacteRs.ContainsKey(guid)) { // Character is offline var response = _clusterServiceLocator.Functions.BuildPartyMemberStatsOffline(guid); client.Send(response); response.Dispose(); } else if (_clusterServiceLocator.WorldCluster.CharacteRs[guid].IsInWorld == false) { // Character is offline (not in world) var response = _clusterServiceLocator.Functions.BuildPartyMemberStatsOffline(guid); client.Send(response); response.Dispose(); } else { // Request information from WorldServer var response = new PacketClass(0) { Data = _clusterServiceLocator.WorldCluster.CharacteRs[guid].GetWorld.GroupMemberStats(guid, 0) }; client.Send(response); response.Dispose(); } }
public void On_MSG_RAID_READY_CHECK(PacketClass packet, ClientClass client) { _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] MSG_RAID_READY_CHECK", client.IP, client.Port); if (client.Character.IsGroupLeader) { client.Character.Group.BroadcastToOther(packet, client.Character); } else { if (packet.Data.Length - 1 < 6) { return; } packet.GetInt16(); var result = packet.GetInt8(); if (result == 0) { // DONE: Not ready client.Character.Group.GetLeader().Client.Send(packet); } else { // DONE: Ready var response = new PacketClass(Opcodes.MSG_RAID_READY_CHECK); response.AddUInt64(client.Character.Guid); client.Character.Group.GetLeader().Client.Send(response); response.Dispose(); } } }
public void On_CMSG_GUILD_LEAVE(PacketClass packet, ClientClass client) { // packet.GetInt16() _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] CMSG_GUILD_LEAVE", client.IP, client.Port); // DONE: Checks if (!client.Character.IsInGuild) { _clusterServiceLocator.WcGuild.SendGuildResult(client, GuildCommand.GUILD_CREATE_S, GuildError.GUILD_PLAYER_NOT_IN_GUILD); return; } if (client.Character.IsGuildLeader) { _clusterServiceLocator.WcGuild.SendGuildResult(client, GuildCommand.GUILD_QUIT_S, GuildError.GUILD_LEADER_LEAVE); return; } _clusterServiceLocator.WcGuild.RemoveCharacterFromGuild(client.Character); _clusterServiceLocator.WcGuild.SendGuildResult(client, GuildCommand.GUILD_QUIT_S, GuildError.GUILD_PLAYER_NO_MORE_IN_GUILD, client.Character.Name); var response = new PacketClass(Opcodes.SMSG_GUILD_EVENT); response.AddInt8((byte)GuildEvent.LEFT); response.AddInt8(1); response.AddString(client.Character.Name); var argnotTo = 0UL; _clusterServiceLocator.WcGuild.BroadcastToGuild(response, client.Character.Guild, notTo: argnotTo); response.Dispose(); }
public void On_CMSG_GMTICKET_GETTICKET(PacketClass packet, ClientClass client) { _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] CMSG_GMTICKET_GETTICKET", client.IP, client.Port); PacketClass smsgGmticketGetticket = new(Opcodes.SMSG_GMTICKET_GETTICKET); DataTable mySqlResult = new(); _clusterServiceLocator.WorldCluster.GetCharacterDatabase().Query(string.Format("SELECT * FROM characters_tickets WHERE char_guid = {0};", client.Character.Guid), ref mySqlResult); if (mySqlResult.Rows.Count > 0) { smsgGmticketGetticket.AddInt32((int)GmTicketGetResult.GMTICKET_AVAILABLE); smsgGmticketGetticket.AddString(Conversions.ToString(mySqlResult.Rows[0]["ticket_text"])); } else { smsgGmticketGetticket.AddInt32((int)GmTicketGetResult.GMTICKET_NOTICKET); } client.Send(smsgGmticketGetticket); smsgGmticketGetticket.Dispose(); PacketClass smsgQueryTimeResponse = new(Opcodes.SMSG_QUERY_TIME_RESPONSE); smsgQueryTimeResponse.AddInt32(_clusterServiceLocator.NativeMethods.timeGetTime("")); // GetTimestamp(Now)) client.Send(smsgQueryTimeResponse); smsgQueryTimeResponse.Dispose(); }
public void SendIgnoreList(ClientClass client, WcHandlerCharacter.CharacterObject character) { // DONE: Query DB var q = new DataTable(); _clusterServiceLocator.WorldCluster.GetCharacterDatabase().Query(string.Format("SELECT * FROM character_social WHERE guid = {0} AND (flags & {1}) > 0;", character.Guid, Conversions.ToInteger(SocialFlag.SOCIAL_FLAG_IGNORED)), ref q); // DONE: Make the packet var smsgIgnoreList = new PacketClass(Opcodes.SMSG_IGNORE_LIST); if (q.Rows.Count > 0) { smsgIgnoreList.AddInt8((byte)q.Rows.Count); foreach (DataRow row in q.Rows) { smsgIgnoreList.AddUInt64(row.As <ulong>("friend")); // Player GUID } } else { smsgIgnoreList.AddInt8(0); } client.Send(smsgIgnoreList); smsgIgnoreList.Dispose(); _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] SMSG_IGNORE_LIST", client.IP, client.Port); }
public async void HandleAsync( ChannelReader <byte> reader, ChannelWriter <byte> writer, CancellationToken cancellationToken) { try { while (!cancellationToken.IsCancellationRequested) { var buffer = new byte[8192]; while (!cancellationToken.IsCancellationRequested) { await ReadEncodedPacketHeaderToBufferAsync(reader, buffer); var length = buffer[1] + buffer[0] * 256 + 2; await reader.ReadToArrayAsync(buffer, 6, length - 6); var packet = new PacketClass(buffer); clientClass.OnPacket(packet); } } } catch (Exception ex) { logger.Error("Packet handler error", ex); } }
public void On_CMSG_UPDATE_ACCOUNT_DATA(PacketClass packet, ClientClass client) { try { if (packet.Data.Length - 1 < 13) { return; } packet.GetInt16(); var dataId = packet.GetUInt32(); var uncompressedSize = packet.GetUInt32(); _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] CMSG_UPDATE_ACCOUNT_DATA [ID={2} Size={3}]", client.IP, client.Port, dataId, uncompressedSize); if (dataId > 7L) { return; } // TODO: How does Mangos Zero Handle the Account Data For the Character? // Dim AccData As New DataTable // _WorldCluster.AccountDatabase.Query(String.Format("SELECT account_id FROM accounts WHERE username = ""{0}"";", client.Account), AccData) // If AccData.Rows.Count = 0 Then // _WorldCluster.Log.WriteLine(LogType.WARNING, "[{0}:{1}] CMSG_UPDATE_ACCOUNT_DATA [Account ID not found]", client.IP, client.Port) // Exit Sub // End If // Dim AccID As Integer = CType(AccData.Rows(0).Item("account_id"), Integer) // AccData.Clear() // DONE: Clear the entry // If UncompressedSize = 0 Then // _WorldCluster.AccountDatabase.Update(String.Format("UPDATE `account_data` SET `account_data{0}`='' WHERE `account_id`={1}", DataID, AccID)) // Exit Sub // End If // DONE: Can not handle more than 65534 bytes // If UncompressedSize >= 65534 Then // _WorldCluster.Log.WriteLine(LogType.WARNING, "[{0}:{1}] CMSG_UPDATE_ACCOUNT_DATA [Invalid uncompressed size]", client.IP, client.Port) // Exit Sub // End If var receivedPacketSize = packet.Data.Length - packet.Offset; } // Dim dataStr As String // DONE: Check if it's compressed, if so, decompress it // If UncompressedSize > ReceivedPacketSize Then // Dim compressedBuffer(ReceivedPacketSize - 1) As Byte // Array.Copy(packet.Data, packet.Offset, compressedBuffer, 0, compressedBuffer.Length) // // dataStr = ToHex(DeCompress(compressedBuffer)) // Else // dataStr = ToHex(packet.Data, packet.Offset) // End If // _WorldCluster.AccountDatabase.Update(String.Format("UPDATE `account_data` SET `account_data{0}`={2} WHERE `account_id`={1};", DataID, AccID, dataStr)) catch (Exception e) { _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.FAILED, "Error while updating account data.{0}", Constants.vbCrLf + e); } }
public void On_CMSG_CHANNEL_SET_OWNER(PacketClass packet, ClientClass client) { packet.GetInt16(); var channelName = packet.GetString(); var channelNewOwner = packet.GetString(); _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] CMSG_CHANNEL_SET_OWNER [{2}, {3}]", client.IP, client.Port, channelName, channelNewOwner); // ChannelName = ChannelName.ToUpper if (_clusterServiceLocator.WsHandlerChannels.ChatChanneLs.ContainsKey(channelName)) { if (_clusterServiceLocator.WsHandlerChannels.ChatChanneLs[channelName].CanSetOwner(client.Character, channelNewOwner)) { foreach (var guid in _clusterServiceLocator.WsHandlerChannels.ChatChanneLs[channelName].Joined.ToArray()) { if ((_clusterServiceLocator.WorldCluster.CharacteRs[guid].Name.ToUpper() ?? "") == (channelNewOwner.ToUpper() ?? "")) { var tmp = _clusterServiceLocator.WorldCluster.CharacteRs; var argCharacter = tmp[guid]; _clusterServiceLocator.WsHandlerChannels.ChatChanneLs[channelName].SetOwner(argCharacter); tmp[guid] = argCharacter; break; } } } } }
public void On_CMSG_INSPECT(PacketClass packet, ClientClass client) { packet.GetInt16(); var guid = packet.GetUInt64(); _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] CMSG_INSPECT [GUID={2:X}]", client.IP, client.Port, guid); }
public void On_CMSG_GMTICKET_CREATE(PacketClass packet, ClientClass client) { packet.GetInt16(); var ticketMap = packet.GetUInt32(); var ticketX = packet.GetFloat(); var ticketY = packet.GetFloat(); var ticketZ = packet.GetFloat(); var ticketText = _clusterServiceLocator.Functions.EscapeString(packet.GetString()); DataTable mySqlResult = new(); _clusterServiceLocator.WorldCluster.GetCharacterDatabase().Query(string.Format("SELECT * FROM characters_tickets WHERE char_guid = {0};", client.Character.Guid), ref mySqlResult); PacketClass smsgGmticketCreate = new(Opcodes.SMSG_GMTICKET_CREATE); if (mySqlResult.Rows.Count > 0) { _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] CMSG_GMTICKET_CREATE", client.IP, client.Port); smsgGmticketCreate.AddInt32((int)GmTicketCreateResult.GMTICKET_ALREADY_HAVE); } else { _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] CMSG_GMTICKET_CREATE [{2}]", client.IP, client.Port, ticketText); _clusterServiceLocator.WorldCluster.GetCharacterDatabase().Update(string.Format("INSERT INTO characters_tickets (char_guid, ticket_text, ticket_x, ticket_y, ticket_z, ticket_map) VALUES ({0} , \"{1}\", {2}, {3}, {4}, {5});", client.Character.Guid, ticketText, Strings.Trim(Conversion.Str(ticketX)), Strings.Trim(Conversion.Str(ticketY)), Strings.Trim(Conversion.Str(ticketZ)), ticketMap)); smsgGmticketCreate.AddInt32((int)GmTicketCreateResult.GMTICKET_CREATE_OK); } client.Send(smsgGmticketCreate); smsgGmticketCreate.Dispose(); }
public void SendGuildQuery(ClientClass client, uint guildId) { if (guildId == 0L) { return; } // WARNING: This opcode is used also in character enum, so there must not be used any references to CharacterObject, only ClientClass // DONE: Load the guild if it doesn't exist in the memory if (GuilDs.ContainsKey(guildId) == false) { var tmpGuild = new Guild(guildId); GuilDs.Add(guildId, tmpGuild); } var response = new PacketClass(Opcodes.SMSG_GUILD_QUERY_RESPONSE); response.AddUInt32(guildId); response.AddString(GuilDs[guildId].Name); for (var i = 0; i <= 9; i++) { response.AddString(GuilDs[guildId].Ranks[i]); } response.AddInt32(GuilDs[guildId].EmblemStyle); response.AddInt32(GuilDs[guildId].EmblemColor); response.AddInt32(GuilDs[guildId].BorderStyle); response.AddInt32(GuilDs[guildId].BorderColor); response.AddInt32(GuilDs[guildId].BackgroundColor); response.AddInt32(0); client.Send(response); response.Dispose(); }
public void On_MSG_START_BACKWARD(PacketClass packet, ClientClass client) { try { client.Character.GetWorld.ClientPacket(client.Index, packet.Data); _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] MSG_START_BACKWARD [{2}]", client.IP, client.Port, client.Character.Map); } catch { // _WC_Network.WorldServer.Disconnect("NULL", New List(Of UInteger)() From {client.Character.Map}) 'There's an error coming from here, uncomment for full runtime error log details! _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.WARNING, "[{0}:{1}] MSG_START_BACKWARD error occured [{2}]", client.IP, client.Port, client.Character.Map); return; } // DONE: Save location on cluster client.Character.PositionX = packet.GetFloat(); // (15) client.Character.PositionY = packet.GetFloat(); client.Character.PositionZ = packet.GetFloat(); // DONE: Sync your location to other party / raid members if (client.Character.IsInGroup) { PacketClass statsPacket = new(Opcodes.UMSG_UPDATE_GROUP_MEMBERS) { Data = client.Character.GetWorld.GroupMemberStats(client.Character.Guid, (int)Functions.PartyMemberStatsFlag.GROUP_UPDATE_FLAG_POSITION + (int)Functions.PartyMemberStatsFlag.GROUP_UPDATE_FLAG_ZONE) }; client.Character.Group.BroadcastToOutOfRange(statsPacket, client.Character); statsPacket.Dispose(); } }
public void SendChatMessage(WcHandlerCharacter.CharacterObject sender, string message, LANGUAGES language, ChatMsg thisType) { PacketClass packet = _clusterServiceLocator.Functions.BuildChatMessage(sender.Guid, message, thisType, language, (byte)sender.ChatFlag); Broadcast(packet); packet.Dispose(); }
public void On_CMSG_GUILD_ROSTER(PacketClass packet, ClientClass client) { // packet.GetInt16() _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] CMSG_GUILD_ROSTER", client.IP, client.Port); _clusterServiceLocator.WcGuild.SendGuildRoster(client.Character); }
public void On_CMSG_CHANNEL_UNBAN(PacketClass packet, ClientClass client) { if (packet.Data.Length - 1 < 6) { return; } packet.GetInt16(); var channelName = packet.GetString(); if (packet.Data.Length - 1 < 6 + channelName.Length + 1) { return; } var playerName = _clusterServiceLocator.Functions.CapitalizeName(packet.GetString()); _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] CMSG_CHANNEL_UNBAN [{2}, {3}]", client.IP, client.Port, channelName, playerName); // ChannelName = ChannelName.ToUpper if (_clusterServiceLocator.WsHandlerChannels.ChatChanneLs.ContainsKey(channelName)) { _clusterServiceLocator.WsHandlerChannels.ChatChanneLs[channelName].UnBan(client.Character, playerName); } }
public void On_CMSG_GUILD_SET_PUBLIC_NOTE(PacketClass packet, ClientClass client) { if (packet.Data.Length - 1 < 6) { return; } packet.GetInt16(); var playerName = packet.GetString(); if (packet.Data.Length - 1 < 6 + playerName.Length + 1) { return; } var note = packet.GetString(); _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] CMSG_GUILD_SET_PUBLIC_NOTE [{2}]", client.IP, client.Port, playerName); if (!client.Character.IsInGuild) { _clusterServiceLocator.WcGuild.SendGuildResult(client, GuildCommand.GUILD_CREATE_S, GuildError.GUILD_PLAYER_NOT_IN_GUILD); return; } if (!client.Character.IsGuildRightSet(GuildRankRights.GR_RIGHT_EPNOTE)) { _clusterServiceLocator.WcGuild.SendGuildResult(client, GuildCommand.GUILD_CREATE_S, GuildError.GUILD_PERMISSIONS); return; } _clusterServiceLocator.WorldCluster.GetCharacterDatabase().Update(string.Format("UPDATE characters SET char_guildPNote = \"{1}\" WHERE char_name = \"{0}\";", playerName, note.Replace("\"", "_").Replace("'", "_"))); _clusterServiceLocator.WcGuild.SendGuildRoster(client.Character); }
public void On_CMSG_GUILD_DEL_RANK(PacketClass packet, ClientClass client) { packet.GetInt16(); _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] CMSG_GUILD_DEL_RANK", client.IP, client.Port); if (!client.Character.IsInGuild) { _clusterServiceLocator.WcGuild.SendGuildResult(client, GuildCommand.GUILD_CREATE_S, GuildError.GUILD_PLAYER_NOT_IN_GUILD); return; } if (!client.Character.IsGuildLeader) { _clusterServiceLocator.WcGuild.SendGuildResult(client, GuildCommand.GUILD_CREATE_S, GuildError.GUILD_PERMISSIONS); return; } // TODO: Check if someone in the guild is the rank we're removing? // TODO: Can we really remove all ranks? for (var i = 9; i >= 0; i -= 1) { if (!string.IsNullOrEmpty(client.Character.Guild.Ranks[i])) { _clusterServiceLocator.WorldCluster.GetCharacterDatabase().Update(string.Format("UPDATE guilds SET guild_rank{1} = '{2}', guild_rank{1}_Rights = '{3}' WHERE guild_id = {0};", client.Character.Guild.Id, i, "", 0)); _clusterServiceLocator.WcGuild.SendGuildQuery(client, client.Character.Guild.Id); _clusterServiceLocator.WcGuild.SendGuildRoster(client.Character); return; } } _clusterServiceLocator.WcGuild.SendGuildResult(client, GuildCommand.GUILD_CREATE_S, GuildError.GUILD_INTERNAL); }
public void On_CMSG_GUILD_RANK(PacketClass packet, ClientClass client) { if (packet.Data.Length - 1 < 14) { return; } packet.GetInt16(); var rankId = packet.GetInt32(); var rankRights = packet.GetUInt32(); var rankName = packet.GetString().Replace("\"", "_").Replace("'", "_"); _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] CMSG_GUILD_RANK [{2}:{3}:{4}]", client.IP, client.Port, rankId, rankRights, rankName); if (rankId < 0 || rankId > 9) { return; } if (!client.Character.IsInGuild) { _clusterServiceLocator.WcGuild.SendGuildResult(client, GuildCommand.GUILD_CREATE_S, GuildError.GUILD_PLAYER_NOT_IN_GUILD); return; } if (!client.Character.IsGuildLeader) { _clusterServiceLocator.WcGuild.SendGuildResult(client, GuildCommand.GUILD_CREATE_S, GuildError.GUILD_PERMISSIONS); return; } client.Character.Guild.Ranks[rankId] = rankName; client.Character.Guild.RankRights[rankId] = rankRights; _clusterServiceLocator.WorldCluster.GetCharacterDatabase().Update(string.Format("UPDATE guilds SET guild_rank{1} = \"{2}\", guild_rank{1}_Rights = {3} WHERE guild_id = {0};", client.Character.Guild.Id, rankId, rankName, rankRights)); _clusterServiceLocator.WcGuild.SendGuildQuery(client, client.Character.Guild.Id); _clusterServiceLocator.WcGuild.SendGuildRoster(client.Character); }
public void On_CMSG_ADD_IGNORE(PacketClass packet, ClientClass client) { if (packet.Data.Length - 1 < 6) { return; } packet.GetInt16(); PacketClass response = new(Opcodes.SMSG_FRIEND_STATUS); var name = packet.GetString(); var guid = 0UL; _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] CMSG_ADD_IGNORE [{2}]", client.IP, client.Port, name); // DONE: Get GUID from DB DataTable q = new(); _clusterServiceLocator.WorldCluster.GetCharacterDatabase().Query(string.Format("SELECT char_guid FROM characters WHERE char_name = \"{0}\";", name), ref q); if (q.Rows.Count > 0) { guid = (ulong)q.Rows[0].As <long>("char_guid"); q.Clear(); _clusterServiceLocator.WorldCluster.GetCharacterDatabase().Query(string.Format("SELECT flags FROM character_social WHERE flags = {0}", Conversions.ToByte(SocialFlag.SOCIAL_FLAG_IGNORED)), ref q); var numberOfFriends = q.Rows.Count; q.Clear(); _clusterServiceLocator.WorldCluster.GetCharacterDatabase().Query(string.Format("SELECT * FROM character_social WHERE guid = {0} AND friend = {1} AND flags = {2};", client.Character.Guid, guid, Conversions.ToByte(SocialFlag.SOCIAL_FLAG_IGNORED)), ref q); if (guid == client.Character.Guid) { response.AddInt8((byte)FriendResult.FRIEND_IGNORE_SELF); response.AddUInt64(guid); } else if (q.Rows.Count > 0) { response.AddInt8((byte)FriendResult.FRIEND_IGNORE_ALREADY); response.AddUInt64(guid); } else if (numberOfFriends >= (int)SocialList.MAX_IGNORES_ON_LIST) { response.AddInt8((byte)FriendResult.FRIEND_IGNORE_ALREADY); response.AddUInt64(guid); } else { response.AddInt8((byte)FriendResult.FRIEND_IGNORE_ADDED); response.AddUInt64(guid); _clusterServiceLocator.WorldCluster.GetCharacterDatabase().Update(string.Format("INSERT INTO character_social (guid, friend, flags) VALUES ({0}, {1}, {2});", client.Character.Guid, guid, Conversions.ToByte(SocialFlag.SOCIAL_FLAG_IGNORED))); client.Character.IgnoreList.Add(guid); } } else { response.AddInt8((byte)FriendResult.FRIEND_IGNORE_NOT_FOUND); response.AddUInt64(guid); } client.Send(response); response.Dispose(); q.Dispose(); _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] SMSG_FRIEND_STATUS", client.IP, client.Port); }
public void On_MSG_MOVE_START_FORWARD(PacketClass packet, ClientClass client) { try { client.Character.GetWorld.ClientPacket(client.Index, packet.Data); _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] MSG_MOVE_START_FOWARD [{2}]", client.IP, client.Port, client.Character.Map); } catch { _clusterServiceLocator.WcNetwork.WorldServer.Disconnect("NULL", new List <uint> { client.Character.Map }); _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.WARNING, "[{0}:{1}] MSG_MOVE_START_FOWARD error occured [{2}]", client.IP, client.Port, client.Character.Map); return; } // DONE: Save location on cluster client.Character.PositionX = packet.GetFloat(); // (15) client.Character.PositionY = packet.GetFloat(); client.Character.PositionZ = packet.GetFloat(); // DONE: Sync your location to other party / raid members if (client.Character.IsInGroup) { var statsPacket = new PacketClass(Opcodes.UMSG_UPDATE_GROUP_MEMBERS) { Data = client.Character.GetWorld.GroupMemberStats(client.Character.Guid, (int)Functions.PartyMemberStatsFlag.GROUP_UPDATE_FLAG_POSITION + (int)Functions.PartyMemberStatsFlag.GROUP_UPDATE_FLAG_ZONE) }; client.Character.Group.BroadcastToOutOfRange(statsPacket, client.Character); statsPacket.Dispose(); } }
public void AddToPacket(ref PacketClass packet, ObjectUpdateType updateType, ref ItemObject updateObject) { checked { packet.AddInt8((byte)updateType); packet.AddPackGUID(updateObject.GUID); if (updateType == ObjectUpdateType.UPDATETYPE_CREATE_OBJECT) { if (WorldServiceLocator._WorldServer.ITEMDatabase[updateObject.ItemEntry].ContainerSlots > 0) { packet.AddInt8(2); } else { packet.AddInt8(1); } packet.AddInt8(24); packet.AddUInt64(updateObject.GUID); } if (updateType is ObjectUpdateType.UPDATETYPE_CREATE_OBJECT or ObjectUpdateType.UPDATETYPE_VALUES) { var updateCount = 0; var num = UpdateMask.Count - 1; for (var j = 0; j <= num; j++) { if (UpdateMask.Get(j)) { updateCount = j; } } packet.AddInt8((byte)(checked (updateCount + 32) / 32)); packet.AddBitArray(UpdateMask, checked ((byte)(checked (updateCount + 32) / 32)) * 4); var num2 = UpdateMask.Count - 1; for (var i = 0; i <= num2; i++) { if (UpdateMask.Get(i)) { if (UpdateData[i] is uint) { packet.AddUInt32(Conversions.ToUInteger(UpdateData[i])); } else if (UpdateData[i] is float) { packet.AddSingle(Conversions.ToSingle(UpdateData[i])); } else { packet.AddInt32(Conversions.ToInteger(UpdateData[i])); } } } UpdateMask.SetAll(value: false); } if (packet is UpdatePacketClass @class) { @class.UpdatesCount++; } } }
private void CreateServerActionFun(string path, PacketClass classInfo) { //string fileName = Path.GetFileNameWithoutExtension(packetPath); //string outPath = packetPath.Replace(fileName, fileName + "_out"); //StreamWriter fileWrite = File.CreateText(outPath); //fileWrite.Write(output); }
public void OnClusterPacket(PacketClass packet, ClientClass client) { _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.WARNING, "[{0}:{1}] {2} [Redirected Packet]", client.IP, client.Port, packet.OpCode); if (client.Character is null || client.Character.IsInWorld == false) { _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.WARNING, "[{0}:{1}] Unknown Opcode 0x{2:X} [{2}], DataLen={4}", client.IP, client.Port, packet.OpCode, Constants.vbCrLf, packet.Length); _clusterServiceLocator.Packets.DumpPacket(packet.Data, client); }
public void On_CMSG_GMTICKET_SYSTEMSTATUS(PacketClass packet, ClientClass client) { _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] CMSG_GMTICKET_SYSTEMSTATUS", client.IP, client.Port); PacketClass smsgGmticketSystemstatus = new(Opcodes.SMSG_GMTICKET_SYSTEMSTATUS); smsgGmticketSystemstatus.AddInt32((int)GmTicketSystemStatus.GMTICKET_SYSTEMSTATUS_SURVEY); client.Send(smsgGmticketSystemstatus); smsgGmticketSystemstatus.Dispose(); }
public void PacketChange(string packetPath) { StreamReader stream = new StreamReader(packetPath); List <PacketClass> classes = new List <PacketClass>(); PacketClass curClass = new PacketClass(); string str; string className; int sqidx; while (!stream.EndOfStream) { str = stream.ReadLine(); if (str.Contains("public class")) { str = str.Remove(0, 13); sqidx = str.IndexOf(':'); str = str.Remove(sqidx); curClass = new PacketClass(); curClass.classID = classes.Count; curClass.className = str; classes.Add(curClass); } else if (str.Contains("output.Write")) { str = str.Remove(0, 12); sqidx = str.IndexOf('('); string attrType = str.Substring(0, sqidx); sqidx = str.IndexOf(')'); int idxSpace = str.IndexOf(','); string attrName = str.Substring(idxSpace + 1, sqidx - idxSpace - 1); curClass.attrNames.Add(attrName.Trim(' '), attrType); } } string output = ""; string outClientPath = Path.GetDirectoryName(packetPath) + "\\packets"; if (!Directory.Exists(outClientPath)) { Directory.CreateDirectory(outClientPath); } foreach (var clas in classes) { //output += "typeof(" + clas + "),\n"; //if (clas.className.Contains("CG")) { CreateClientActionFun(outClientPath, clas); } } //string fileName = Path.GetFileNameWithoutExtension(packetPath); //string outPath = packetPath.Replace(fileName, fileName + "_out"); //StreamWriter fileWrite = File.CreateText(outPath); //fileWrite.Write(output); }
public void AddToPacket(ref PacketClass packet, ObjectUpdateType updateType, ref WS_Corpses.CorpseObject updateObject) { checked { packet.AddInt8((byte)updateType); packet.AddPackGUID(updateObject.GUID); if (updateType == ObjectUpdateType.UPDATETYPE_CREATE_OBJECT) { packet.AddInt8(7); packet.AddInt8(88); packet.AddSingle(updateObject.positionX); packet.AddSingle(updateObject.positionY); packet.AddSingle(updateObject.positionZ); packet.AddSingle(updateObject.orientation); packet.AddUInt64(updateObject.GUID); } if (updateType == ObjectUpdateType.UPDATETYPE_CREATE_OBJECT || updateType == ObjectUpdateType.UPDATETYPE_VALUES) { int updateCount = 0; int num = UpdateMask.Count - 1; for (int j = 0; j <= num; j++) { if (UpdateMask.Get(j)) { updateCount = j; } } packet.AddInt8((byte)(checked (updateCount + 32) / 32)); packet.AddBitArray(UpdateMask, checked ((byte)(checked (updateCount + 32) / 32)) * 4); int num2 = UpdateMask.Count - 1; for (int i = 0; i <= num2; i++) { if (UpdateMask.Get(i)) { if (UpdateData[i] is uint) { packet.AddUInt32(Conversions.ToUInteger(UpdateData[i])); } else if (UpdateData[i] is float) { packet.AddSingle(Conversions.ToSingle(UpdateData[i])); } else { packet.AddInt32(Conversions.ToInteger(UpdateData[i])); } } } UpdateMask.SetAll(value: false); } if (packet is UpdatePacketClass @class) { @class.UpdatesCount++; } } }
private void InitPacketsList() { if (m_initialized) return; packetClassComboBox.Items.Clear(); PacketClass anyClassItem = new PacketClass(null, null); packetClassComboBox.Items.Add(anyClassItem); foreach (DictionaryEntry entry in PacketManager.GetPacketTypesByAttribute()) { LogPacketAttribute attr = (LogPacketAttribute)entry.Key; Type type = (Type)entry.Value; packetClassComboBox.Items.Add(new PacketClass(type, attr)); } packetClassComboBox.SelectedItem = anyClassItem; UpdateClassPropertiesList(); UpdateButtonsEnabledState(); m_initialized = true; }
/// <summary> /// Selects the packet and its property in comboboxes. /// </summary> /// <param name="packetClass">The packet class.</param> /// <param name="packetClassMember">The packet class member.</param> private void SelectPacketAndProperty(PacketClass packetClass, ClassMemberPath packetClassMember) { if (null != packetClass) { packetClassComboBox.SelectedItem = packetClass; } if (null != packetClassMember) { packetClassPropertyComboBox.SelectedItem = packetClassMember; } }