示例#1
0
        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();
                    }                    
                }
            }
        }
示例#2
0
        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);
            //}
        }