public void AddPlayerToGroups(F3_NetPlayerInfo player)
        {
            long uuid = player.GetPlayerUUID();
            string defaultGroup = player.GetPlayerDefaultGroup();
            if (!m_registeredGroups.ContainsKey(defaultGroup))
            {
                m_registeredGroups.Add(defaultGroup, new List<long>());
            }

            m_registeredGroups[defaultGroup].Add(uuid);

            string guildGroup = player.GetPlayerGuild();
            if (guildGroup != F3_NetCommonConstants.INVALID_GUILD)
            {
                if (!m_registeredGroups.ContainsKey(guildGroup))
                {
                    m_registeredGroups.Add(guildGroup, new List<long>());
                }
                m_registeredGroups[guildGroup].Add(uuid);
            }

            List<string> privateGroups = player.GetPlayerPrivateGroups();
            for (int i = 0; i < privateGroups.Count; i++)
            {
                string group = privateGroups[i];
                if (!m_registeredGroups.ContainsKey(group))
                {
                    m_registeredGroups.Add(group, new List<long>());
                }

                m_registeredGroups[group].Add(uuid);
            }
        }
        public F3_NetPlayerInfo FindPlayerByUUID(long uuid)
        {
            if (uuid == F3_NetCommonConstants.SENDER_GM)
            {
                F3_NetPlayerInfo gmInfo = new F3_NetPlayerInfo(uuid);
                gmInfo.SetPlayerName("Game_Master");
                return gmInfo;
            }

            if (m_connectedPlayers.ContainsKey(uuid))
            {
                return m_connectedPlayers[uuid];
            }
            return null;
        }
 public void ConnectPlayer(long uuid, F3_NetPlayerInfo player)
 {
     m_connectedPlayers.Add(uuid, player);
 }
        public override void OnDataReceived(NetIncomingMessage incMsg)
        {
            NetDataType type = (NetDataType)incMsg.ReadByte();
            long uuid = incMsg.SenderConnection.RemoteUniqueIdentifier;

            if (type == NetDataType.eDATA_AUTHENTICATION)
            {
                string name = incMsg.ReadString();
                string guild = incMsg.ReadString();
                string defaultgroup = incMsg.ReadString();
                int nbGroups = incMsg.ReadInt32();
                List<string> groups = new List<string>();

                for (int i = 0; i < nbGroups; i++)
                {
                    string group = incMsg.ReadString();
                    groups.Add(group);
                }

                F3_NetPlayerInfo player = new F3_NetPlayerInfo(uuid);
                player.SetPlayerName(name);
                player.SetPlayerGuild(guild);
                player.SetPlayerDefaultGroup(defaultgroup);
                player.SetPlayerPrivateGroups(groups);

                ConnectPlayer(uuid, player);
                AddPlayerToGroups(player);

                F3_ChatLine newLine = new F3_ChatLine();
                newLine.m_senderUUID = uuid;
                newLine.m_bIsConnecting = true;
                AddMessage(newLine);

                if (NotifyGroupOnStatusChangedEnabled() && guild != F3_NetCommonConstants.INVALID_GUILD)
                {
                    NotifyGroup(uuid, guild, newLine.m_msg, true);
                }
            }

            if (type == NetDataType.eDATA_MSG_TO_ALL)
            {
                F3_ChatLine newLine = new F3_ChatLine();
                newLine.m_senderUUID = uuid;
                newLine.m_msg = incMsg.ReadString();

                //Broadcast the message to everyone.
                NotifyEveryone(uuid, newLine.m_msg);

                AddMessage(newLine);
            }

            if (type == NetDataType.eDATA_PRIVATE_MSG)
            {
                F3_ChatLine newLine = new F3_ChatLine();
                newLine.m_senderUUID = uuid;
                newLine.m_receiver = incMsg.ReadString();
                newLine.m_bIsPrivate = true;
                newLine.m_msg = incMsg.ReadString();

                //Broadcast the message to everyone.
                if (Notify(uuid, newLine.m_receiver, newLine.m_msg))
                {
                    AddMessage(newLine);
                }
            }

            if (type == NetDataType.eDATA_GROUP_MSG)
            {

                F3_ChatMessage_Group msg = new F3_ChatMessage_Group();
                msg.FromNetMsg(incMsg);
                F3_ChatLine newLine = new F3_ChatLine();
                newLine.m_senderUUID = uuid;
                newLine.m_receiver = msg.GetGroup();
                newLine.m_bIsGroupMsg = true;
                newLine.m_msg = msg.GetMessage();

                //Broadcast the message to everyone.
                if (NotifyGroup(uuid, newLine.m_receiver, newLine.m_msg, false))
                {
                    AddMessage(newLine);
                }
            }

            if (type == NetDataType.eDATA_EXTERNAL_COMMAND)
            {
                NetCommandIDs cmdId = (NetCommandIDs)incMsg.ReadByte();

                if (cmdId != NetCommandIDs.eCMD_INVALID)
                {
                    NetCommand newCmd = new NetCommand(cmdId);
                    switch (cmdId)
                    {
                        case NetCommandIDs.eCMD_PM_GM:
                            {
                                string text = incMsg.ReadString();

                                F3_ChatLine newLine = new F3_ChatLine();
                                newLine.m_senderUUID = uuid;
                                newLine.m_receiver = "GM";
                                newLine.m_msg = text;
                                newLine.m_bIsPrivate = true;
                                newLine.m_bIsGameMaster = true;

                                AddMessage(newLine);
                                newLine.m_senderUUID = FindPlayerByUUID(uuid).GetPlayerUUID();
                                newCmd.SetUserData(newLine);
                                break;
                            }
                        //case NetCommandIDs.eCMD_SHUTDOWN:   //No User Data for now. Could add NetworkShutdownSequence perhaps.

                        default:
                            {
                                Console.WriteLine("Unrecognized Command");
                                break;
                            }
                    }

                    AddCommand(newCmd);
                }
            }
        }