private void OnLeaveScene(GameEvent ge, EventParameter parameter) { MsgData_sSceneObjectLeaveNotify data = parameter.msgParameter as MsgData_sSceneObjectLeaveNotify; long serverID = (long)data.ObjectID; if (mObjRecord.ContainsKey(serverID)) { mObjRecord.Remove(serverID); //Debug.LogError("怪物消失" + serverID); } if (mBackgroundPlayer.ContainsKey(serverID)) { mBackgroundPlayer.Remove(serverID); return; } for (int i = 0; i < mSceneDataList.Count; i++) { if (mSceneDataList[i].ObjGuid == serverID) { mSceneDataList.RemoveAt(i); break; } } for(int i = 0;i < mDeathCache.Count;i++) { if(serverID == mDeathCache[i].ID) { mDeathCache.RemoveAt(i); break; } } for (int i = 0; i < mSceneCache.Count; i++) { if (mSceneCache[i].ObjGuid == serverID) { mSceneCache.RemoveAt(i); return; } } if (!bSceneLoaded) { return; } if (data.ObjectType == (sbyte)EnEntType.EnEntType_Item) { EventParameter param = EventParameter.Get(); param.longParameter = serverID; CoreEntry.gEventMgr.TriggerEvent(GameEvent.GE_OBJ_ITEM_LEAVE, param); return; } else if (data.ObjectType == (sbyte)EnEntType.EnEntType_GatherObj) { CollectionObj collection = CoreEntry.gEntityMgr.GetCollectionByServerID(serverID) as CollectionObj; if (null != collection) { CoreEntry.gEntityMgr.RemoveCollectionByServerID(serverID); collection.RecycleObj(); } return; } else if (data.ObjectType == (sbyte)EnEntType.EnEntType_StaticObj) { PortalObj portal = CoreEntry.gEntityMgr.GetPortalByServerID(serverID) as PortalObj; if (null != portal) { CoreEntry.gEntityMgr.RemovePortalByServerID(serverID); portal.RecycleObj(); } return; } else if (data.ObjectType == (sbyte)EnEntType.EnEntType_Trap) { Trap trap = CoreEntry.gEntityMgr.GetTrapByServerID(serverID) as Trap; if (null != trap) { CoreEntry.gEntityMgr.RemoveTrapByServerID(serverID); trap.RecycleObj(); } return; } ActorObj actor = CoreEntry.gActorMgr.GetActorByServerID(serverID); if (null != actor) { if (!actor.mActorState.IsDeathEnd()) { if (!mLeaveCache.Contains(actor)) { mLeaveCache.Add(actor); } return; } CoreEntry.gActorMgr.RemoveActorByServerID(serverID); actor.RecycleObj(); EventParameter param = EventParameter.Get(); param.longParameter = serverID; CoreEntry.gEventMgr.TriggerEvent(GameEvent.GE_ACTOR_REMOVE, param); if (actor is OtherPlayer) { param = EventParameter.Get(); param.longParameter = serverID; CoreEntry.gEventMgr.TriggerEvent(GameEvent.GE_OTHERPLAYER_LEAVE, param); } //有后台玩家则切换进来 if (mBackgroundPlayer.Count > 0) { int num = CoreEntry.gActorMgr.GetAllPlayerActors().Count - 1 + GetCacheNumber(EnEntType.EnEntType_Player); if (num < CreateMaxPlayer) { var e = mBackgroundPlayer.GetEnumerator(); if (e.MoveNext()) { ScenePlayerData value = e.Current.Value; SceneObj sceneobj = CacheSceneObj(EnEntType.EnEntType_Player, value.Guid, value.EnterData); sceneobj.PlayerData = value; mBackgroundPlayer.Remove(value.Guid); } e.Dispose(); } } } }