Exemple #1
0
        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);
        }
Exemple #2
0
        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;
            }
        }
Exemple #3
0
        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);
            }
        }
Exemple #4
0
        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);
                }
            }
        }
Exemple #5
0
 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];
         }
     }
 }
Exemple #6
0
        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);
                }
            }
        }
Exemple #7
0
        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);
        }
Exemple #8
0
        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);
            }
        }
Exemple #9
0
        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);
                        }
                    }
                }
            }
        }