示例#1
0
        public void SendChatToUser(ServerPlayer from, ServerPlayer to, string chat, bool action)
        {
            if (chat == string.Empty)
            {
                return;
            }

            ChatMessageEventArgs args = new ChatMessageEventArgs();

            args.From        = from;
            args.To          = to;
            args.ToTeam      = to.ActualTeam;
            args.MessageText = chat;

            args.Action   = action;
            args.ChatType = from == null ? ChatMessageEventArgs.ChatMessageTypes.ServerPrivateMessage : ChatMessageEventArgs.ChatMessageTypes.PrivateMessage;

            if (args.To == null)
            {
                return;
            }

            MsgMessage msg = new MsgMessage();

            msg.MessageText = chat;
            msg.From        = from == null ? PlayerConstants.ServerPlayerID : from.PlayerID;
            msg.To          = to.PlayerID;
            msg.MessageType = action ? MsgMessage.MessageTypes.ActionMessage : MsgMessage.MessageTypes.ChatMessage;

            to.SendMessage(true, msg);

            MessageSent?.Invoke(this, args);
        }
示例#2
0
        public virtual void SendToPlayerID(NetworkMessage message, bool useUDP, int playerID)
        {
            ServerPlayer player = GetPlayerByID(playerID);

            if (player == null)
            {
                return;
            }

            player.SendMessage(!useUDP, message);
        }
示例#3
0
        public virtual bool AddPlayer(ServerPlayer player)
        {
            player.Exited       += Player_Exited;
            player.Disconnected += Player_Exited;

            ServerHost.PreAddPlayer(player);

            if (player.ActualTeam == TeamColors.NoTeam)
            {
                return(false);
            }

            player.Info = new PlayerInfo();

            lock (PlayerList)
                PlayerList.Add(player);

            Logger.Log2("Player " + player.Callsign + " assigned to team " + player.ActualTeam.ToString());

            lock (Teams)
            {
                if (!Teams.ContainsKey(player.ActualTeam))
                {
                    TeamInfo team = new TeamInfo();
                    team.Team           = player.ActualTeam;
                    team.PlayerAdded   += Team_PlayerAdded;
                    team.PlayerRemoved += Team_PlayerRemoved;
                    Teams.Add(player.ActualTeam, team);
                }

                Teams[player.ActualTeam].Add(player);
                if (Teams[player.ActualTeam].Members.Count == 1)
                {
                    TeamInited?.Invoke(this, Teams[player.ActualTeam]);
                }
            }

            Flags.SendInitialFlagUpdate(player);

            // tell them about everyone except them
            ServerPlayer[] locals = null;

            lock (PlayerList)
                locals = PlayerList.ToArray();

            MsgPlayerInfo info = new MsgPlayerInfo();

            foreach (ServerPlayer peer in locals)
            {
                if (peer == player)
                {
                    continue;
                }

                player.SendMessage(true, BuildPlayerAdd(peer));
                info.PlayerUpdates.Add(GetPlayerInfo(peer));
            }
            player.SendMessage(true, info);

            TeamInfo[] teams = null;
            lock (Teams)
                teams = Teams.Values.ToArray();

            MsgTeamUpdate tUpd = new MsgTeamUpdate();

            foreach (var team in teams)
            {
                if (team.Team == player.ActualTeam) // the event already sent this
                {
                    continue;
                }

                MsgTeamUpdate.TeamUpdate u = new MsgTeamUpdate.TeamUpdate();
                u.TeamID = team.Team;
                u.Size   = team.Size();
                u.Wins   = team.Wins;
                u.Losses = team.Losses;
                tUpd.TeamUpdates.Add(u);
            }
            player.SendMessage(tUpd);

            // tell everyone they joined
            SendToAll(BuildPlayerAdd(player), false);

            // send info bits to everyone
            info = new MsgPlayerInfo();
            info.PlayerUpdates.Add(GetPlayerInfo(player));
            SendToAll(info, false);

            ServerHost.PostAddPlayer(player);

            if (player.ActualTeam == TeamColors.ObserverTeam)
            {
                Chat.SendChatToUser(null, player, Resources.ObserverModeNotificatioMessage, false);
            }

            return(true);
        }