ObjectGuid CreateBuiltinChannelGuid(uint channelId, AreaTableRecord zoneEntry = null) { ChatChannelsRecord channelEntry = CliDB.ChatChannelsStorage.LookupByKey(channelId); uint zoneId = zoneEntry != null ? zoneEntry.Id : 0; if (channelEntry.Flags.HasAnyFlag(ChannelDBCFlags.Global | ChannelDBCFlags.CityOnly)) { zoneId = 0; } ulong high = 0; high |= (ulong)HighGuid.ChatChannel << 58; high |= (ulong)Global.WorldMgr.GetRealmId().Index << 42; high |= 1ul << 25; // built-in if (channelEntry.Flags.HasAnyFlag(ChannelDBCFlags.CityOnly2)) { high |= 1ul << 24; // trade } high |= (ulong)(zoneId) << 10; high |= (ulong)(_team == Team.Alliance ? 3 : 5) << 4; ObjectGuid channelGuid = new(); channelGuid.SetRawValue(high, channelId); return(channelGuid); }
public Channel(uint channelId, Team team = 0, AreaTableRecord zoneEntry = null) { _channelFlags = ChannelFlags.General; _channelId = channelId; _channelTeam = team; _zoneEntry = zoneEntry; ChatChannelsRecord channelEntry = CliDB.ChatChannelsStorage.LookupByKey(channelId); if (channelEntry.Flags.HasAnyFlag(ChannelDBCFlags.Trade)) // for trade channel { _channelFlags |= ChannelFlags.Trade; } if (channelEntry.Flags.HasAnyFlag(ChannelDBCFlags.CityOnly2)) // for city only channels { _channelFlags |= ChannelFlags.City; } if (channelEntry.Flags.HasAnyFlag(ChannelDBCFlags.Lfg)) // for LFG channel { _channelFlags |= ChannelFlags.Lfg; } else // for all other channels { _channelFlags |= ChannelFlags.NotLfg; } }
public Channel GetJoinChannel(uint channelId, string name, AreaTableRecord zoneEntry = null) { if (channelId != 0) // builtin { ChatChannelsRecord channelEntry = CliDB.ChatChannelsStorage.LookupByKey(channelId); uint zoneId = zoneEntry != null ? zoneEntry.Id : 0; if (channelEntry.Flags.HasAnyFlag(ChannelDBCFlags.Global | ChannelDBCFlags.CityOnly)) { zoneId = 0; } Tuple <uint, uint> key = Tuple.Create(channelId, zoneId); var channel = _channels.LookupByKey(key); if (channel != null) { return(channel); } Channel newChannel = new Channel(channelId, _team, zoneEntry); _channels[key] = newChannel; return(newChannel); } else // custom { var channel = _customChannels.LookupByKey(name.ToLower()); if (channel != null) { return(channel); } Channel newChannel = new Channel(name, _team); _customChannels[name.ToLower()] = newChannel; return(newChannel); } }
void HandleLeaveChannel(LeaveChannel packet) { if (string.IsNullOrEmpty(packet.ChannelName) && packet.ZoneChannelID == 0) { return; } AreaTableRecord zone = CliDB.AreaTableStorage.LookupByKey(GetPlayer().GetZoneId()); if (packet.ZoneChannelID != 0) { ChatChannelsRecord channel = CliDB.ChatChannelsStorage.LookupByKey(packet.ZoneChannelID); if (channel == null) { return; } if (zone == null || !GetPlayer().CanJoinConstantChannelInZone(channel, zone)) { return; } } ChannelManager cMgr = ChannelManager.ForTeam(GetPlayer().GetTeam()); if (cMgr != null) { Channel channel = cMgr.GetChannel((uint)packet.ZoneChannelID, packet.ChannelName, GetPlayer(), true, zone); if (channel != null) { channel.LeaveChannel(GetPlayer(), true); } if (packet.ZoneChannelID != 0) { cMgr.LeftChannel((uint)packet.ZoneChannelID, zone); } else { cMgr.LeftChannel(packet.ChannelName); } } }
public static void GetChannelName(ref string channelName, uint channelId, LocaleConstant locale, AreaTableRecord zoneEntry) { if (channelId != 0) { ChatChannelsRecord channelEntry = CliDB.ChatChannelsStorage.LookupByKey(channelId); if (!channelEntry.Flags.HasAnyFlag(ChannelDBCFlags.Global)) { if (channelEntry.Flags.HasAnyFlag(ChannelDBCFlags.CityOnly)) { channelName = string.Format(channelEntry.Name[locale].ConvertFormatSyntax(), Global.ObjectMgr.GetCypherString(CypherStrings.ChannelCity, locale)); } else { channelName = string.Format(channelEntry.Name[locale].ConvertFormatSyntax(), zoneEntry.AreaName[locale]); } } else { channelName = channelEntry.Name[locale]; } } }
void HandleJoinChannel(JoinChannel packet) { AreaTableRecord zone = CliDB.AreaTableStorage.LookupByKey(GetPlayer().GetZoneId()); if (packet.ChatChannelId != 0) { ChatChannelsRecord channel = CliDB.ChatChannelsStorage.LookupByKey(packet.ChatChannelId); if (channel == null) { return; } if (zone == null || !GetPlayer().CanJoinConstantChannelInZone(channel, zone)) { return; } } if (string.IsNullOrEmpty(packet.ChannelName)) { return; } if (packet.ChannelName.IsNumber()) { return; } ChannelManager cMgr = ChannelManager.ForTeam(GetPlayer().GetTeam()); if (cMgr != null) { Channel channel = cMgr.GetJoinChannel((uint)packet.ChatChannelId, packet.ChannelName, zone); if (channel != null) { channel.JoinChannel(GetPlayer(), packet.Password); } } }
public Channel GetChannel(uint channelId, string name, Player player, bool notify = true, AreaTableRecord zoneEntry = null) { Channel result = null; if (channelId != 0) // builtin { ChatChannelsRecord channelEntry = CliDB.ChatChannelsStorage.LookupByKey(channelId); uint zoneId = zoneEntry != null ? zoneEntry.Id : 0; if (channelEntry.Flags.HasAnyFlag(ChannelDBCFlags.Global | ChannelDBCFlags.CityOnly)) { zoneId = 0; } Tuple <uint, uint> key = Tuple.Create(channelId, zoneId); var channel = _channels.LookupByKey(key); if (channel != null) { result = channel; } } else // custom { var channel = _customChannels.LookupByKey(name.ToLower()); if (channel != null) { result = channel; } } if (result == null && notify) { string channelName = name; Channel.GetChannelName(ref channelName, channelId, player.GetSession().GetSessionDbcLocale(), zoneEntry); SendNotOnChannelNotify(player, channelName); } return(result); }
public void LeftChannel(uint channelId, AreaTableRecord zoneEntry) { ChatChannelsRecord channelEntry = CliDB.ChatChannelsStorage.LookupByKey(channelId); uint zoneId = zoneEntry != null ? zoneEntry.Id : 0; if (channelEntry.Flags.HasAnyFlag(ChannelDBCFlags.Global | ChannelDBCFlags.CityOnly)) { zoneId = 0; } Tuple <uint, uint> key = Tuple.Create(channelId, zoneId); var channel = _channels.LookupByKey(key); if (channel == null) { return; } if (channel.GetNumPlayers() == 0) { _channels.Remove(key); } }
void HandleJoinChannel(JoinChannel packet) { AreaTableRecord zone = CliDB.AreaTableStorage.LookupByKey(GetPlayer().GetZoneId()); if (packet.ChatChannelId != 0) { ChatChannelsRecord channel = CliDB.ChatChannelsStorage.LookupByKey(packet.ChatChannelId); if (channel == null) { return; } if (zone == null || !GetPlayer().CanJoinConstantChannelInZone(channel, zone)) { return; } } if (packet.ChannelName.IsEmpty() || char.IsDigit(packet.ChannelName[0])) { ChannelNotify channelNotify = new(); channelNotify.Type = ChatNotify.InvalidNameNotice; channelNotify.Channel = packet.ChannelName; SendPacket(channelNotify); return; } if (packet.Password.Length > 127) { Log.outError(LogFilter.Network, $"Player {GetPlayer().GetGUID()} tried to create a channel with a password more than 127 characters long - blocked"); return; } ChannelManager cMgr = ChannelManager.ForTeam(GetPlayer().GetTeam()); if (cMgr != null) { if (packet.ChatChannelId != 0) { // system channel Channel channel = cMgr.GetSystemChannel((uint)packet.ChatChannelId, zone); if (channel != null) { channel.JoinChannel(GetPlayer()); } } else { // custom channel if (packet.ChannelName.Length > 31) { Log.outError(LogFilter.Network, $"Player {GetPlayer().GetGUID()} tried to create a channel with a name more than 31 characters long - blocked"); return; } Channel channel = cMgr.GetCustomChannel(packet.ChannelName); if (channel != null) { channel.JoinChannel(GetPlayer(), packet.Password); } else { channel = cMgr.CreateCustomChannel(packet.ChannelName); if (channel != null) { channel.SetPassword(packet.Password); channel.JoinChannel(GetPlayer(), packet.Password); } } } } }