Esempio n. 1
0
        /// <summary>
        /// 玩家隐藏
        /// </summary>
        /// <param name="uid"></param>
        public void PlayerHide(long uid)
        {
            if (m_ManagedPlayers.ContainsKey(uid))
            {
                PlayerDelegate player = m_ManagedPlayers[uid];
                if (player == null)
                {
                    return;
                }
                player.preloaded = false;
                player.created   = false;
                m_ManagedPlayers.Remove(uid);
                if (player.IsSpecial())
                {
                    m_SpcialPlayers.Add(uid, player);
                }
                else
                {
                    m_RegionPlayers.Add(uid, player);
                }
            }
            PlayerController pc = PlayerManager.GetPlayerController(uid);

            if (pc == null)
            {
                return;
            }
            if (pc.IsLocal)
            {
                return;
            }
            PlayerManager.UnregisterPlayerController(pc);
            pc.Destroy();
        }
Esempio n. 2
0
        public void ProcessPlayerCommInSync(object incomingData)
        {
            UserAid = GetLocalPlayerAid();
            string      scenetype = EB.Dot.String("scenetype", incomingData, "");
            IDictionary players   = EB.Dot.Object(scenetype + ".pl", incomingData, null);

            if (players == null)
            {
                return;
            }
            int num = 0;

            foreach (DictionaryEntry entry in players)
            {
                long userid = System.Convert.ToInt64(entry.Key);
                if (entry.Value == null)//Player leave
                {
                    continue;
                }
                if (userid == LoginManager.Instance.LocalUserId.Value)
                {
                    continue;
                }
                if (m_ManagedPlayers.ContainsKey(userid))
                {
                    continue;
                }

                IDictionary datatmp = entry.Value as IDictionary;
                if (datatmp["pos"] != null)
                {
                    PlayerIn(userid, datatmp, scenetype);
                    num++;
                }
            }
            if (num == 0)
            {
                return;
            }
            int less = MaxManagedPlayer - m_ManagedPlayers.Count;

            if (less > 0)
            {
                for (int i = 0; i < less; i++)
                {
                    PlayerDelegate player = GetPlayerToShow();
                    if (player != null)
                    {
                        ShowPlayer(player);
                    }
                    else
                    {
                        break;
                    }
                }
            }
            PrintStats();
        }
Esempio n. 3
0
        /// <summary>
        /// is slow function  use less
        /// </summary>
        public void ClearNotCurrentScenePlayer()
        {
            List <long> player_to_remove = new List <long>();

            foreach (KeyValuePair <long, PlayerDelegate> entry in m_RegionPlayers)
            {
                PlayerDelegate player = entry.Value;
                if (!player.sceneid.Equals(m_CurrentSceneID))
                {
                    player_to_remove.Add(player.id);
                }
            }
            for (int i = 0; i < player_to_remove.Count; i++)
            {
                if (m_RegionPlayers.ContainsKey(player_to_remove[i]))
                {
                    m_RegionPlayers.Remove(player_to_remove[i]);
                }
            }

            player_to_remove.Clear();
            foreach (KeyValuePair <long, PlayerDelegate> entry in m_SpcialPlayers)
            {
                PlayerDelegate player = entry.Value;
                if (!player.sceneid.Equals(m_CurrentSceneID))
                {
                    player_to_remove.Add(player.id);
                }
            }
            for (int i = 0; i < player_to_remove.Count; i++)
            {
                if (m_SpcialPlayers.ContainsKey(player_to_remove[i]))
                {
                    m_SpcialPlayers.Remove(player_to_remove[i]);
                }
            }
            player_to_remove.Clear();

            foreach (KeyValuePair <long, PlayerDelegate> entry in m_ManagedPlayers)
            {
                PlayerDelegate player = entry.Value;
                if (!player.sceneid.Equals(m_CurrentSceneID))
                {
                    player_to_remove.Add(player.id);
                }
            }
            for (int i = 0; i < player_to_remove.Count; i++)
            {
                if (m_ManagedPlayers.ContainsKey(player_to_remove[i]))
                {
                    m_ManagedPlayers.Remove(player_to_remove[i]);
                }
            }
        }
Esempio n. 4
0
        public string GetPlayerTempalteid(long uid)
        {
            PlayerDelegate player = GetPlayerDelegate(uid);

            if (player == null)
            {
                return(null);
            }
            else
            {
                return(player.templateid);
            }
        }
Esempio n. 5
0
        /// <summary>
        /// 玩家离开
        /// </summary>
        /// <param name="uid"></param>
        public void PlayerOut(long uid)
        {
            //从ManagedPlayers中删除
            //获取一个GetPlayerToShow
            //显示 ShowPlayer
            if (m_ManagedPlayers.ContainsKey(uid))
            {
                m_ManagedPlayers.Remove(uid);
                if (m_ManagedPlayers.Count < MaxManagedPlayer)
                {
                    PlayerDelegate player = GetPlayerToShow();
                    if (player != null)
                    {
                        ShowPlayer(player);
                    }
                }
                PrintStats();
//#if PRINT_PLAYER_SYNC_DEBUG
//			EB.Debug.LogWarning("Player leave uid=" + uid);
//#endif
            }
            else
            {
                if (m_RegionPlayers.ContainsKey(uid))
                {
                    m_RegionPlayers.Remove(uid);
                }
                else if (m_SpcialPlayers.ContainsKey(uid))
                {
                    m_SpcialPlayers.Remove(uid);
                }
            }
//#if PRINT_PLAYER_SYNC_DEBUG
//			CheckConsistent();
//#endif

            PlayerController pc = PlayerManager.GetPlayerController(uid);

            if (pc == null)
            {
                return;
            }
            if (pc.IsLocal)
            {
                return;
            }
            PlayerManager.UnregisterPlayerController(pc);
            pc.Destroy();
        }
Esempio n. 6
0
        void MatchPlayersToMaxManagerPlayer()
        {
            if (m_ManagedPlayers.Count == MaxManagedPlayer)
            {
                return;
            }
            else if (m_ManagedPlayers.Count > MaxManagedPlayer)
            {
                int         delta   = m_ManagedPlayers.Count - MaxManagedPlayer;
                List <long> toclear = new List <long>(delta);
                foreach (KeyValuePair <long, PlayerDelegate> kv in m_ManagedPlayers)
                {
                    delta--;
                    toclear.Add(kv.Value.id);
                    if (delta == 0)
                    {
                        break;
                    }
                }

                for (int i = 0; i < toclear.Count; i++)
                {
                    PlayerHide(toclear[i]);
                }
            }
            else
            {
                int less = MaxManagedPlayer - m_ManagedPlayers.Count;
                if (less > 0)
                {
                    for (int i = 0; i < less; i++)
                    {
                        PlayerDelegate player = GetPlayerToShow();
                        if (player != null)
                        {
                            ShowPlayer(player);
                        }
                        else
                        {
                            break;
                        }
                    }
                }
            }
        }
Esempio n. 7
0
        /// <summary>
        /// 玩家进入region
        /// </summary>
        /// <param name=""></param>
        public void PlayerIn(long userid, IDictionary data, string scenetype)
        {
            PlayerDelegate player = new PlayerDelegate(userid, data, scenetype);

            if (player.IsSpecial())
            {
                if (!m_SpcialPlayers.ContainsKey(player.id))
                {
                    m_SpcialPlayers.Add(player.id, player);
                }
            }
            else
            {
                if (!m_RegionPlayers.ContainsKey(player.id))
                {
                    m_RegionPlayers.Add(player.id, player);
                }
            }
        }
Esempio n. 8
0
        /// <summary>
        /// 获取一个可以显示的Player
        /// </summary>
        /// <returns></returns>
        public PlayerDelegate GetPlayerToShow()
        {
            if (m_SpcialPlayers.Count > 0)
            {
                Dictionary <long, PlayerDelegate> .Enumerator enu = m_SpcialPlayers.GetEnumerator();
                enu.MoveNext();
                PlayerDelegate player = enu.Current.Value;
                m_SpcialPlayers.Remove(player.id);
//#if PRINT_PLAYER_SYNC_DEBUG
//			EB.Debug.LogWarning("Player add uid=" + player.id);
//#endif
                if (!m_ManagedPlayers.ContainsKey(player.id))
                {
                    m_ManagedPlayers.Add(player.id, player);
                }
                else
                {
                    EB.Debug.LogWarning("Already Managed this Player {0}", player.id);
                }
                return(player);
            }
            else if (m_RegionPlayers.Count > 0)
            {
                Dictionary <long, PlayerDelegate> .Enumerator enu = m_RegionPlayers.GetEnumerator();
                enu.MoveNext();
                PlayerDelegate player = enu.Current.Value;
                m_RegionPlayers.Remove(player.id);
//#if PRINT_PLAYER_SYNC_DEBUG
//			EB.Debug.LogWarning("Player add uid=" + player.id);
//#endif
                if (!m_ManagedPlayers.ContainsKey(player.id))
                {
                    m_ManagedPlayers.Add(player.id, player);
                }
                else
                {
                    EB.Debug.LogWarning("Already Managed this Player {0}", player.id);
                }
                return(player);
            }
            return(null);
        }
Esempio n. 9
0
        /// <summary>
        /// 清理queue 以免占用太多内存 在战斗回多人场景时
        /// </summary>
        void FreshQueue()
        {
            if (m_PlayerQueue.Count <= 200)
            {
                return;
            }
            List <PlayerDelegate> list = new List <PlayerDelegate>(128);

            while (m_PlayerQueue.Count > 0)
            {
                PlayerDelegate playerdata = m_PlayerQueue.Dequeue();
                if (m_ManagedPlayers.ContainsKey(playerdata.id))
                {
                    list.Add(playerdata);
                }
            }

            for (int i = 0; i < list.Count; i++)
            {
                m_PlayerQueue.Enqueue(list[i]);
            }
        }
Esempio n. 10
0
        //private Dictionary<long, PlayerDelegate> m_RegionPlayers;
        //private Dictionary<long, PlayerDelegate> m_SpcialPlayers;
        //private Dictionary<long, PlayerDelegate> m_ManagedPlayers;
        public void MergePlayer(string scenetype, IDictionary scenedata)
        {
            if (scenedata == null)
            {
                EB.Debug.LogWarning("MergePlayer scenedata is null");
                return;
            }
            //long sceneid = EB.Dot.Long("id", scenedata, 0);
            IDictionary playerdata = EB.Dot.Object("pl", scenedata, null);

            if (playerdata == null)
            {
                EB.Debug.LogWarning("MergePlayer pl is null");
                return;
            }
            List <long> player_to_remove = new List <long>();

            //Manager have scenedata didnot must clear
            foreach (KeyValuePair <long, PlayerDelegate> kv in m_RegionPlayers)
            {
                if (!playerdata.Contains(kv.Key.ToString()))
                {
                    player_to_remove.Add(kv.Key);
                }
            }
            for (int i = 0; i < player_to_remove.Count; i++)
            {
                m_RegionPlayers.Remove(player_to_remove[i]);
            }

            player_to_remove.Clear();

            foreach (KeyValuePair <long, PlayerDelegate> kv in m_SpcialPlayers)
            {
                if (!playerdata.Contains(kv.Key.ToString()))
                {
                    player_to_remove.Add(kv.Key);
                }
            }
            for (int i = 0; i < player_to_remove.Count; i++)
            {
                m_RegionPlayers.Remove(player_to_remove[i]);
            }

            player_to_remove.Clear();

            foreach (KeyValuePair <long, PlayerDelegate> kv in m_ManagedPlayers)
            {
                if (!playerdata.Contains(kv.Key.ToString()))
                {
                    player_to_remove.Add(kv.Key);
                }
            }
            for (int i = 0; i < player_to_remove.Count; i++)
            {
                PlayerOut(player_to_remove[i]);
            }

            //scenedata have  Manager didnot must add
            int num = 0;

            foreach (DictionaryEntry de in playerdata)
            {
                long userid = System.Convert.ToInt64(de.Key);
                if (de.Value == null)//Player leave
                {
                    continue;
                }
                if (userid == LoginManager.Instance.LocalUserId.Value)
                {
                    continue;
                }
                if (m_ManagedPlayers.ContainsKey(userid))
                {
                    continue;
                }

                IDictionary datatmp = de.Value as IDictionary;
                if (datatmp["pos"] != null)
                {
                    PlayerIn(userid, datatmp, scenetype);
                    num++;
                }
            }

            if (num == 0)
            {
                return;
            }
            int less = MaxManagedPlayer - m_ManagedPlayers.Count;

            if (less > 0)
            {
                for (int i = 0; i < less; i++)
                {
                    PlayerDelegate player = GetPlayerToShow();
                    if (player != null)
                    {
                        ShowPlayer(player);
                    }
                    else
                    {
                        break;
                    }
                }
            }
            PrintStats();
        }
Esempio n. 11
0
        void Update()
        {
            if (m_MaxManagedPlayer < 0)
            {
                CalcMaxPlayer();
            }
            else
            {
                if (needSyncNumToServer)
                {
                    needSyncNumToServer = false;
                }
            }

            FreshQueue();
            if (!m_IsCanShow)
            {
                return;
            }
            if (!GM.AssetManager.IsIdle)
            {
                return;
            }
            if (m_PlayerQueue.Count > 0)
            {
                PlayerDelegate playerdata = m_PlayerQueue.Dequeue();
                if (playerdata != null)
                {
                    if (playerdata.sceneid != m_CurrentSceneID)
                    {
//#if PRINT_PLAYER_SYNC_DEBUG
//					EB.Debug.LogWarning("Player not this scene uid=" + playerdata.id);
//#endif
                        m_ManagedPlayers.Remove(playerdata.id);
                    }
                    else if (m_ManagedPlayers.ContainsKey(playerdata.id))
                    {
                        if (!playerdata.preloaded)
                        {
                            if (m_CurrentSceneLogic != null)
                            {
                                m_CurrentSceneLogic.PreloadAsync(playerdata.id, (success) => { playerdata.preloaded = success; m_PlayerQueue.Enqueue(playerdata); });
                            }
                            else
                            {
                                EB.Debug.LogError("CurrentSceneLogic is Null");
                            }
                        }
                        else if (!m_ManagedPlayers[playerdata.id].created)
                        {
                            m_ManagedPlayers[playerdata.id].created = true;
                            if (m_CurrentSceneLogic != null)
                            {
                                m_CurrentSceneLogic.CreateOtherPlayer(playerdata.pos, playerdata.quater, playerdata.id);
                            }
                            else
                            {
                                EB.Debug.LogError("CurrentSceneLogic is Null");
                            }
                        }
                    }
//#if PRINT_PLAYER_SYNC_DEBUG
//				CheckConsistent();
//#endif
                }
            }
            else
            {
                MatchPlayersToMaxManagerPlayer();
            }
        }
Esempio n. 12
0
 /// <summary>
 /// 显示一个玩家
 /// </summary>
 public void ShowPlayer(PlayerDelegate player)
 {
     m_PlayerQueue.Enqueue(player);
 }