public void SendIgnoreList(ClientClass client, WcHandlerCharacter.CharacterObject character) { // DONE: Query DB DataTable q = new(); _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 PacketClass smsgIgnoreList = new(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 void BroadcastChatMessageGuild(WcHandlerCharacter.CharacterObject sender, string message, LANGUAGES language, int guildId) { // DONE: Check for guild member if (!sender.IsInGuild) { SendGuildResult(sender.Client, GuildCommand.GUILD_CREATE_S, GuildError.GUILD_PLAYER_NOT_IN_GUILD); return; } // DONE: Check for rights to speak if (!sender.IsGuildRightSet(GuildRankRights.GR_RIGHT_GCHATSPEAK)) { SendGuildResult(sender.Client, GuildCommand.GUILD_CREATE_S, GuildError.GUILD_PERMISSIONS); return; } // DONE: Build packet var packet = _clusterServiceLocator.Functions.BuildChatMessage(sender.Guid, message, ChatMsg.CHAT_MSG_GUILD, language, (byte)sender.ChatFlag); // DONE: Send message to everyone var tmpArray = sender.Guild.Members.ToArray(); foreach (var member in tmpArray) { if (_clusterServiceLocator.WorldCluster.CharacteRs.ContainsKey(member)) { if (_clusterServiceLocator.WorldCluster.CharacteRs[member].IsGuildRightSet(GuildRankRights.GR_RIGHT_GCHATLISTEN)) { _clusterServiceLocator.WorldCluster.CharacteRs[member].Client.SendMultiplyPackets(packet); } } } packet.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 SendGameTime(ClientClass client, WcHandlerCharacter.CharacterObject character) { var smsgLoginSettimespeed = new PacketClass(Opcodes.SMSG_LOGIN_SETTIMESPEED); try { var time = DateTime.Now; var year = time.Year - 2000; var month = time.Month - 1; var day = time.Day - 1; var dayOfWeek = (int)time.DayOfWeek; var hour = time.Hour; var minute = time.Minute; // SMSG_LOGIN_SETTIMESPEED.AddInt32(CType((((((Minute + (Hour << 6)) + (DayOfWeek << 11)) + (Day << 14)) + (Year << 18)) + (Month << 20)), Integer)) smsgLoginSettimespeed.AddInt32(minute + (hour << 6) + (dayOfWeek << 11) + (day << 14) + (month << 20) + (year << 24)); smsgLoginSettimespeed.AddSingle(0.01666667f); client.Send(smsgLoginSettimespeed); } finally { smsgLoginSettimespeed.Dispose(); } _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] SMSG_LOGIN_SETTIMESPEED", client.IP, client.Port); }
public void SendTriggerCinematic(ClientClass client, WcHandlerCharacter.CharacterObject character) { var packet = new PacketClass(Opcodes.SMSG_TRIGGER_CINEMATIC); try { if (_clusterServiceLocator.WsDbcDatabase.CharRaces.ContainsKey((int)character.Race)) { packet.AddInt32(_clusterServiceLocator.WsDbcDatabase.CharRaces[(int)character.Race].CinematicId); } else { _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.WARNING, "[{0}:{1}] SMSG_TRIGGER_CINEMATIC [Error: RACE={2} CLASS={3}]", client.IP, client.Port, character.Race, character.Classe); return; } client.Send(packet); } finally { packet.Dispose(); } _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] SMSG_TRIGGER_CINEMATIC", client.IP, client.Port); }
public void RemoveCharacterFromGuild(WcHandlerCharacter.CharacterObject objCharacter) { _clusterServiceLocator.WorldCluster.GetCharacterDatabase().Update(string.Format("UPDATE characters SET char_guildId = {0}, char_guildRank = 0, char_guildOffNote = '', char_guildPNote = '' WHERE char_guid = {1};", 0, objCharacter.Guid)); objCharacter.Guild.Members.Remove(objCharacter.Guid); objCharacter.Guild = null; objCharacter.GuildRank = 0; objCharacter.SendGuildUpdate(); }
public void BroadcastToOther(PacketClass packet, WcHandlerCharacter.CharacterObject objCharacter) { for (byte i = 0, loopTo = (byte)(Members.Length - 1); i <= loopTo; i++) { if (Members[i] is object && !ReferenceEquals(Members[i], objCharacter) && Members[i].Client is object) { Members[i].Client.SendMultiplyPackets(packet); } } }
public void SendAccountMd5(ClientClass client, WcHandlerCharacter.CharacterObject character) { var foundData = false; // TODO: How Does Mangos Zero Handle the Account Data For the Characters? // Dim AccData As New DataTable // _WorldCluster.AccountDatabase.Query(String.Format("SELECT id FROM account WHERE username = ""{0}"";", client.Account), AccData) // If AccData.Rows.Count > 0 Then // Dim AccID As Integer = CType(AccData.Rows(0).Item("account_id"), Integer) // AccData.Clear() // _WorldCluster.AccountDatabase.Query(String.Format("SELECT * FROM account_data WHERE account_id = {0}", AccID), AccData) // If AccData.Rows.Count > 0 Then // FoundData = True // Else // _WorldCluster.AccountDatabase.Update(String.Format("INSERT INTO account_data VALUES({0}, '', '', '', '', '', '', '', '')", AccID)) // End If // End If var smsgAccountDataTimes = new PacketClass(Opcodes.SMSG_ACCOUNT_DATA_MD5); try { // Dim md5hash As MD5 = MD5.Create() for (var i = 0; i <= 7; i++) { if (foundData) { } // Dim tmpBytes() As Byte = AccData.Rows(0).Item("account_data" & i) // If tmpBytes.Length = 0 Then // SMSG_ACCOUNT_DATA_TIMES.AddInt64(0) // SMSG_ACCOUNT_DATA_TIMES.AddInt64(0) // Else // SMSG_ACCOUNT_DATA_TIMES.AddByteArray(md5hash.ComputeHash(tmpBytes)) // End If else { smsgAccountDataTimes.AddInt64(0L); smsgAccountDataTimes.AddInt64(0L); } } // md5hash.Clear() // md5hash = Nothing client.Send(smsgAccountDataTimes); } finally { smsgAccountDataTimes.Dispose(); } _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] SMSG_ACCOUNT_DATA_MD5", client.IP, client.Port); }
public void BroadcastToOutOfRange(PacketClass packet, WcHandlerCharacter.CharacterObject objCharacter) { for (byte i = 0, loopTo = (byte)(Members.Length - 1); i <= loopTo; i++) { if (Members[i] is object && !ReferenceEquals(Members[i], objCharacter) && Members[i].Client is object) { if (objCharacter.Map != Members[i].Map || Math.Sqrt(Math.Pow(objCharacter.PositionX - Members[i].PositionX, 2d) + Math.Pow(objCharacter.PositionY - Members[i].PositionY, 2d)) > _clusterServiceLocator.GlobalConstants.DEFAULT_DISTANCE_VISIBLE) { Members[i].Client.SendMultiplyPackets(packet); } } } }
public void LoadIgnoreList(WcHandlerCharacter.CharacterObject objCharacter) { // DONE: Query DB DataTable q = new(); _clusterServiceLocator.WorldCluster.GetCharacterDatabase().Query(string.Format("SELECT * FROM character_social WHERE guid = {0} AND flags = {1};", objCharacter.Guid, Conversions.ToByte(SocialFlag.SOCIAL_FLAG_IGNORED)), ref q); // DONE: Add to list foreach (DataRow row in q.Rows) { objCharacter.IgnoreList.Add(row.As <ulong>("friend")); } }
public void SendFriendList(ClientClass client, WcHandlerCharacter.CharacterObject character) { // DONE: Query DB DataTable q = new(); _clusterServiceLocator.WorldCluster.GetCharacterDatabase().Query(string.Format("SELECT * FROM character_social WHERE guid = {0} AND (flags & {1}) > 0;", character.Guid, Conversions.ToInteger(SocialFlag.SOCIAL_FLAG_FRIEND)), ref q); // DONE: Make the packet PacketClass smsgFriendList = new(Opcodes.SMSG_FRIEND_LIST); if (q.Rows.Count > 0) { smsgFriendList.AddInt8((byte)q.Rows.Count); foreach (DataRow row in q.Rows) { var guid = row.As <ulong>("friend"); smsgFriendList.AddUInt64(guid); // Player GUID if (_clusterServiceLocator.WorldCluster.CharacteRs.ContainsKey(guid) && _clusterServiceLocator.WorldCluster.CharacteRs[guid].IsInWorld) { if (_clusterServiceLocator.WorldCluster.CharacteRs[guid].Dnd) { smsgFriendList.AddInt8((byte)FriendStatus.FRIEND_STATUS_DND); } else if (_clusterServiceLocator.WorldCluster.CharacteRs[guid].Afk) { smsgFriendList.AddInt8((byte)FriendStatus.FRIEND_STATUS_AFK); } else { smsgFriendList.AddInt8((byte)FriendStatus.FRIEND_STATUS_ONLINE); } smsgFriendList.AddInt32((int)_clusterServiceLocator.WorldCluster.CharacteRs[guid].Zone); // Area smsgFriendList.AddInt32(_clusterServiceLocator.WorldCluster.CharacteRs[guid].Level); // Level smsgFriendList.AddInt32((int)_clusterServiceLocator.WorldCluster.CharacteRs[guid].Classe); // Class } else { smsgFriendList.AddInt8((byte)FriendStatus.FRIEND_STATUS_OFFLINE); } } } else { smsgFriendList.AddInt8(0); } client.Send(smsgFriendList); smsgFriendList.Dispose(); _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] SMSG_FRIEND_LIST", client.IP, client.Port); }
public void SetLootMaster(WcHandlerCharacter.CharacterObject objCharacter) { _lootMaster = Leader; for (byte i = 0, loopTo = (byte)(Members.Length - 1); i <= loopTo; i++) { if (ReferenceEquals(Members[i], objCharacter)) { _lootMaster = i; break; } } SendGroupList(); }
// Basic Guild Framework public void AddCharacterToGuild(WcHandlerCharacter.CharacterObject objCharacter, int guildId, int guildRank = 4) { _clusterServiceLocator.WorldCluster.GetCharacterDatabase().Update(string.Format("UPDATE characters SET char_guildId = {0}, char_guildRank = {2}, char_guildOffNote = '', char_guildPNote = '' WHERE char_guid = {1};", guildId, objCharacter.Guid, guildRank)); if (GuilDs.ContainsKey((uint)guildId) == false) { var tmpGuild = new Guild((uint)guildId); GuilDs.Add((uint)guildId, tmpGuild); } objCharacter.Guild = GuilDs[(uint)guildId]; objCharacter.Guild.Members.Add(objCharacter.Guid); objCharacter.GuildRank = (byte)guildRank; objCharacter.SendGuildUpdate(); }
// Members Options public void SendGuildMotd(WcHandlerCharacter.CharacterObject objCharacter) { if (objCharacter.IsInGuild) { if (!string.IsNullOrEmpty(objCharacter.Guild.Motd)) { var response = new PacketClass(Opcodes.SMSG_GUILD_EVENT); response.AddInt8((byte)GuildEvent.MOTD); response.AddInt8(1); response.AddString(objCharacter.Guild.Motd); objCharacter.Client.Send(response); response.Dispose(); } } }
public void SendCorpseReclaimDelay(ClientClass client, WcHandlerCharacter.CharacterObject character, int seconds = 30) { var packet = new PacketClass(Opcodes.SMSG_CORPSE_RECLAIM_DELAY); try { packet.AddInt32(seconds * 1000); client.Send(packet); } finally { packet.Dispose(); } _clusterServiceLocator.WorldCluster.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] SMSG_CORPSE_RECLAIM_DELAY [{2}s]", client.IP, client.Port, seconds); }
public void NewLeader(WcHandlerCharacter.CharacterObject leaver = null) { byte chosenMember = 255; bool newLootMaster = false; for (byte i = 0, loopTo = (byte)(Members.Length - 1); i <= loopTo; i++) { if (Members[i] is object && Members[i].Client is object) { if (leaver is object && ReferenceEquals(leaver, Members[i])) { if (i == _lootMaster) { newLootMaster = true; } if (chosenMember != 255) { break; } } else if (Members[i].GroupAssistant && chosenMember == 255) { chosenMember = i; } else if (chosenMember == 255) { chosenMember = i; } } } if (chosenMember != 255) { Leader = chosenMember; if (newLootMaster) { _lootMaster = Leader; } PacketClass response = new(Opcodes.SMSG_GROUP_SET_LEADER); response.AddString(Members[Leader].Name); Broadcast(response); response.Dispose(); _clusterServiceLocator.WcNetwork.WorldServer.GroupSendUpdate(Id); } }
public Group(WcHandlerCharacter.CharacterObject objCharacter, ClusterServiceLocator clusterServiceLocator) { _clusterServiceLocator = clusterServiceLocator; Members = new WcHandlerCharacter.CharacterObject[_clusterServiceLocator.GlobalConstants.GROUP_SIZE + 1]; Id = Interlocked.Increment(ref _clusterServiceLocator.WcHandlersGroup._groupCounter); _clusterServiceLocator.WcHandlersGroup.GrouPs.Add(Id, this); Members[0] = objCharacter; Members[1] = null; Members[2] = null; Members[3] = null; Members[4] = null; Leader = 0; _lootMaster = 255; objCharacter.Group = this; objCharacter.GroupAssistant = false; objCharacter.GetWorld.ClientSetGroup(objCharacter.Client.Index, Id); }
public void Join(WcHandlerCharacter.CharacterObject objCharacter) { for (byte i = 0, loopTo = (byte)(Members.Length - 1); i <= loopTo; i++) { if (Members[i] is null) { Members[i] = objCharacter; objCharacter.Group = this; objCharacter.GroupAssistant = false; break; } } _clusterServiceLocator.WcNetwork.WorldServer.GroupSendUpdate(Id); objCharacter.GetWorld.ClientSetGroup(objCharacter.Client.Index, Id); SendGroupList(); }
public void NotifyGuildStatus(WcHandlerCharacter.CharacterObject objCharacter, GuildEvent status) { if (objCharacter.Guild is null) { return; } var statuspacket = new PacketClass(Opcodes.SMSG_GUILD_EVENT); statuspacket.AddInt8((byte)status); statuspacket.AddInt8(1); statuspacket.AddString(objCharacter.Name); statuspacket.AddInt8(0); statuspacket.AddInt8(0); statuspacket.AddInt8(0); BroadcastToGuild(statuspacket, objCharacter.Guild, objCharacter.Guid); statuspacket.Dispose(); }
public void SetLeader(WcHandlerCharacter.CharacterObject objCharacter) { for (byte i = 0, loopTo = (byte)Members.Length; i <= loopTo; i++) { if (ReferenceEquals(Members[i], objCharacter)) { Leader = i; break; } } PacketClass packet = new(Opcodes.SMSG_GROUP_SET_LEADER); packet.AddString(objCharacter.Name); Broadcast(packet); packet.Dispose(); _clusterServiceLocator.WcNetwork.WorldServer.GroupSendUpdate(Id); SendGroupList(); }
public void Leave(WcHandlerCharacter.CharacterObject objCharacter) { if (GetMembersCount() == 2) { Dispose(); return; } for (byte i = 0, loopTo = (byte)(Members.Length - 1); i <= loopTo; i++) { if (ReferenceEquals(Members[i], objCharacter)) { objCharacter.Group = null; Members[i] = null; // DONE: If current is leader then choose new if (i == Leader) { NewLeader(); } // DONE: If current is lootMaster then choose new if (i == _lootMaster) { _lootMaster = Leader; } if (objCharacter.Client is object) { PacketClass packet = new(Opcodes.SMSG_GROUP_UNINVITE); objCharacter.Client.Send(packet); packet.Dispose(); } break; } } _clusterServiceLocator.WcNetwork.WorldServer.GroupSendUpdate(Id); objCharacter.GetWorld.ClientSetGroup(objCharacter.Client.Index, -1); CheckMembers(); }
public void NewLeader(WcHandlerCharacter.CharacterObject leaver = null) { byte chosenMember = 255; var newLootMaster = false; for (byte i = 0, loopTo = (byte)(Members.Length - 1); i <= loopTo; i++) { if (Members[i] is not null && Members[i].Client is not null) { if (leaver is not null && ReferenceEquals(leaver, Members[i])) { if (i == _lootMaster) { newLootMaster = true; } if (chosenMember != 255) { break; } }
public void NotifyFriendStatus(WcHandlerCharacter.CharacterObject objCharacter, FriendStatus s) { DataTable q = new(); _clusterServiceLocator.WorldCluster.GetCharacterDatabase().Query(string.Format("SELECT guid FROM character_social WHERE friend = {0} AND (flags & {1}) > 0;", objCharacter.Guid, Conversions.ToInteger(SocialFlag.SOCIAL_FLAG_FRIEND)), ref q); // DONE: Send "Friend offline/online" PacketClass friendpacket = new(Opcodes.SMSG_FRIEND_STATUS); friendpacket.AddInt8((byte)s); friendpacket.AddUInt64(objCharacter.Guid); foreach (DataRow row in q.Rows) { var guid = row.As <ulong>("guid"); if (_clusterServiceLocator.WorldCluster.CharacteRs.ContainsKey(guid) && _clusterServiceLocator.WorldCluster.CharacteRs[guid].Client is not null) { _clusterServiceLocator.WorldCluster.CharacteRs[guid].Client.SendMultiplyPackets(friendpacket); } } friendpacket.Dispose(); }
public void SendGuildRoster(WcHandlerCharacter.CharacterObject objCharacter) { if (!objCharacter.IsInGuild) { return; } // DONE: Count the ranks byte guildRanksCount = 0; for (var i = 0; i <= 9; i++) { if (!string.IsNullOrEmpty(objCharacter.Guild.Ranks[i])) { guildRanksCount = (byte)(guildRanksCount + 1); } } // DONE: Count the members var members = new DataTable(); _clusterServiceLocator.WorldCluster.GetCharacterDatabase().Query("SELECT char_online, char_guid, char_name, char_class, char_level, char_zone_id, char_logouttime, char_guildRank, char_guildPNote, char_guildOffNote FROM characters WHERE char_guildId = " + objCharacter.Guild.Id + ";", ref members); var response = new PacketClass(Opcodes.SMSG_GUILD_ROSTER); response.AddInt32(members.Rows.Count); response.AddString(objCharacter.Guild.Motd); response.AddString(objCharacter.Guild.Info); response.AddInt32(guildRanksCount); for (var i = 0; i <= 9; i++) { if (!string.IsNullOrEmpty(objCharacter.Guild.Ranks[i])) { response.AddUInt32(objCharacter.Guild.RankRights[i]); } } var officer = objCharacter.IsGuildRightSet(GuildRankRights.GR_RIGHT_VIEWOFFNOTE); for (int i = 0, loopTo = members.Rows.Count - 1; i <= loopTo; i++) { if (members.Rows[i].As <byte>("char_online") == 1) { response.AddUInt64(members.Rows[i].As <ulong>("char_guid")); response.AddInt8(1); // OnlineFlag response.AddString(members.Rows[i].As <string>("char_name")); response.AddInt32(members.Rows[i].As <int>("char_guildRank")); response.AddInt8(members.Rows[i].As <byte>("char_level")); response.AddInt8(members.Rows[i].As <byte>("char_class")); response.AddInt32(members.Rows[i].As <int>("char_zone_id")); response.AddString(members.Rows[i].As <string>("char_guildPNote")); if (officer) { response.AddString(members.Rows[i].As <string>("char_guildOffNote")); } else { response.AddInt8(0); } } else { response.AddUInt64(members.Rows[i].As <ulong>("char_guid")); response.AddInt8(0); // OfflineFlag response.AddString(members.Rows[i].As <string>("char_name")); response.AddInt32(members.Rows[i].As <int>("char_guildRank")); response.AddInt8(members.Rows[i].As <byte>("char_level")); response.AddInt8(members.Rows[i].As <byte>("char_class")); response.AddInt32(members.Rows[i].As <int>("char_zone_id")); // 0 = < 1 hour / 0.1 = 2.4 hours / 1 = 24 hours (1 day) // (Time logged out / 86400) = Days offline var daysOffline = (float)((_clusterServiceLocator.Functions.GetTimestamp(DateAndTime.Now) - members.Rows[i].As <uint>("char_logouttime")) / (double)DateInterval.Day); response.AddSingle(daysOffline); // Days offline response.AddString(members.Rows[i].As <string>("char_guildPNote")); if (officer) { response.AddString(members.Rows[i].As <string>("char_guildOffNote")); } else { response.AddInt8(0); } } } objCharacter.Client.Send(response); response.Dispose(); }