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(); } } } }
private void OnEnterScene(GameEvent ge, EventParameter parameter) { NetReadBuffer buffer = parameter.objParameter as NetReadBuffer; CacheEnterHead.unpack(buffer); buffer.pos = 0; //重新给具体类型的消息读取 if (CacheEnterHead.ObjType == (sbyte)EnEntType.EnEntType_Player)//其它玩家 { MsgData_sSceneObjectEnterHuman humanStruct = new MsgData_sSceneObjectEnterHuman(); humanStruct.unpack(buffer); //队友一定创建 bool inteam = PlayerData.Instance.TeamData.IsInTeam(humanStruct.Guid); int num = inteam ? 0 : (CoreEntry.gActorMgr.GetAllPlayerActors().Count - 1 + GetCacheNumber(EnEntType.EnEntType_Player)); if (num < CreateMaxPlayer) { CacheSceneObj(EnEntType.EnEntType_Player, humanStruct.Guid, humanStruct); } else { ScenePlayerData playerdata = new ScenePlayerData(); playerdata.EnterData = humanStruct; if (!mBackgroundPlayer.ContainsKey(playerdata.Guid)) { mBackgroundPlayer.Add(playerdata.Guid, playerdata); } else { LogMgr.LogError("玩家已经在缓存中 guid:{0}", playerdata.Guid); } } } else if (CacheEnterHead.ObjType == (sbyte)EnEntType.EnEntType_Monster)//怪物 { MsgData_sSceneObjectEnterMonster monsterStruct = new MsgData_sSceneObjectEnterMonster(); monsterStruct.unpack(buffer); if (CoreEntry.gCurrentMapDesc.Get<int>("type") == 31) //幻灵副本 ,延时刷怪 { DungeonMgr.Instance.AddMonster(monsterStruct); } else { CacheSceneObj(EnEntType.EnEntType_Monster, monsterStruct.Guid, monsterStruct); } } else if (CacheEnterHead.ObjType == (sbyte)EnEntType.EnEntType_NPC)//NPC { MsgData_sSceneObjectEnterNPC npcStruct = new MsgData_sSceneObjectEnterNPC(); npcStruct.unpack(buffer); CacheSceneObj(EnEntType.EnEntType_NPC, npcStruct.Guid, npcStruct); } else if (CacheEnterHead.ObjType == (sbyte)EnEntType.EnEntType_Item)//物品 { MsgData_sSceneObjectEnterItem itemStruct = new MsgData_sSceneObjectEnterItem(); itemStruct.unpack(buffer); if (itemStruct.Owner == PlayerData.Instance.RoleID) { CacheSceneObj(EnEntType.EnEntType_Item, itemStruct.Guid, itemStruct); EventParameter ep = EventParameter.Get(); ep.intParameter = itemStruct.ConfigID; ep.intParameter1 = itemStruct.Count; ep.longParameter = itemStruct.Source; CoreEntry.gEventMgr.TriggerEvent(GameEvent.GE_ITEM_DROP, ep); } } else if (CacheEnterHead.ObjType == (sbyte)EnEntType.EnEntType_GatherObj) { MsgData_sSceneObjectEnterCollection collectionStruct = new MsgData_sSceneObjectEnterCollection(); collectionStruct.unpack(buffer); CacheSceneObj(EnEntType.EnEntType_GatherObj, collectionStruct.Guid, collectionStruct); } else if (CacheEnterHead.ObjType == (sbyte)EnEntType.EnEntType_Trap)//陷阱 { MsgData_sSceneObjectEnterTrap trapStruct = new MsgData_sSceneObjectEnterTrap(); trapStruct.unpack(buffer); CacheSceneObj(EnEntType.EnEntType_Trap, trapStruct.Guid, trapStruct); } else if (CacheEnterHead.ObjType == (sbyte)EnEntType.EnEntType_Pet) { MsgData_sSceneObjectEnterPet petStruct = new MsgData_sSceneObjectEnterPet(); petStruct.unpack(buffer); CacheSceneObj(EnEntType.EnEntType_Pet, petStruct.Guid, petStruct); } else if (CacheEnterHead.ObjType == (sbyte)EnEntType.EnEntType_BiaoChe) { MsgData_sSceneObjectEnterBiaoChe cheStruct = new MsgData_sSceneObjectEnterBiaoChe(); cheStruct.unpack(buffer); CacheSceneObj(EnEntType.EnEntType_BiaoChe, cheStruct.Guid, cheStruct); } else if (CacheEnterHead.ObjType == (sbyte)EnEntType.EnEntType_StaticObj)//Portal { MsgData_sSceneObjectEnterStaticObj sstaticStruct = new MsgData_sSceneObjectEnterStaticObj(); sstaticStruct.unpack(buffer); CacheSceneObj(EnEntType.EnEntType_StaticObj, sstaticStruct.Guid, sstaticStruct); } else if (CacheEnterHead.ObjType == (sbyte)EnEntType.EntType_VirtualPlayer)//EntType_VirtualPlayer { MsgData_sSceneObjectEnterVirtualPlayer sstaticStruct = new MsgData_sSceneObjectEnterVirtualPlayer(); sstaticStruct.unpack(buffer); //Debug.LogError(sstaticStruct.Guid+" " + sstaticStruct.HP+" " +sstaticStruct.Level + " "+sstaticStruct.Power+" " +sstaticStruct.Wing); CacheSceneObj(EnEntType.EntType_VirtualPlayer, sstaticStruct.Guid, sstaticStruct); } //下方的游戏中还没用到,就不改了,减少被没必要的GC,以后需要可参照上方定义协议数据后使用 //else if (baseStruct.ObjType == (sbyte)EnEntType.EnEntType_Patrol) //{ // PatrolEnterStruct patrolStruct = new PatrolEnterStruct(); // PacketUtil.Unpack<PatrolEnterStruct>(data.Data, out patrolStruct); //} //else if (baseStruct.ObjType == (sbyte)EnEntType.EnEntType_Duke) //{ // DukeEnterStruct dukeStruct = new DukeEnterStruct(); // PacketUtil.Unpack<DukeEnterStruct>(data.Data, out dukeStruct); //} //else if (baseStruct.ObjType == (sbyte)EnEntType.EnEntType_BiaoChe) //{ // BiaoCheEnterStruct biaocheStruct = new BiaoCheEnterStruct(); // PacketUtil.Unpack<BiaoCheEnterStruct>(data.Data, out biaocheStruct); //} }