/// <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(); }
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(); }
/// <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]); } } }
public string GetPlayerTempalteid(long uid) { PlayerDelegate player = GetPlayerDelegate(uid); if (player == null) { return(null); } else { return(player.templateid); } }
/// <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(); }
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; } } } } }
/// <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); } } }
/// <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); }
/// <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]); } }
//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(); }
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(); } }
/// <summary> /// 显示一个玩家 /// </summary> public void ShowPlayer(PlayerDelegate player) { m_PlayerQueue.Enqueue(player); }