Example #1
0
 public static LuaTable OnLuaDispatchMsg(short cmd, NetReadBuffer buffer)
 {
     if (m_LuaDispatchCall == null)
     {
         LuaTable G = LuaMgr.Instance.GetLuaEnv().Global;
         m_LuaNet          = G.Get <LuaTable>("Net");
         m_LuaDispatchCall = m_LuaNet.Get <DispatchMsgCall>("OnDispatchMsg");
     }
     return(m_LuaDispatchCall(m_LuaNet, cmd, buffer));
 }
Example #2
0
 /// <summary>
 /// 从缓冲区中读取数据。
 /// </summary>
 /// <param name="buffer">数据缓冲区。</param>
 public void Uppack(NetReadBuffer buffer)
 {
     mUID       = buffer.ReadInt64();
     mID        = buffer.ReadInt32();
     mCount     = buffer.ReadInt32();
     mBag       = buffer.ReadInt32();
     mPos       = buffer.ReadInt32();
     mUseCount  = buffer.ReadInt32();
     mTodayUse  = buffer.ReadInt32();
     mCanUseVal = buffer.ReadInt64();
     mFlag      = buffer.ReadInt64();
 }
Example #3
0
        /// <summary>
        /// 发送消息。
        /// </summary>
        /// <param name="msg"></param>
        private void SendMessage(RecvBuffer msg)
        {
            //try
            //{
            NetReadBuffer buffer = NetReadBuffer.CacheBuff;

            buffer.Init(msg.data, 0, msg.length);
            //LogMgr.Log("msg.cmd " + msg.cmd);
            MsgExHandler exhandler;

            if (msgExHandlers.TryGetValue(msg.cmd, out exhandler))
            {
                exhandler(buffer);
                return;
            }

            Type tp;

            if (msgTypes.TryGetValue(msg.cmd, out tp))
            {
                //走C#层 解包消息
                MsgData msgdata = Activator.CreateInstance(tp) as MsgData;
                msgdata.unpack(buffer);

                //接收调用
                MsgHandler handlerEvent;
                if (msgHandlers.TryGetValue(msg.cmd, out handlerEvent))
                {
                    handlerEvent(msgdata);
                }
                else
                {
#if UNITY_EDITOR
                    LogMgr.Log("NetClient.dispatchMsg Failed ,Unknow NetMessage Recevied cmd:{0}", msg.cmd);
#endif
                }
            }
            else
            {
                //走Lua层
                OnLuaDispatchMsg(msg.cmd, buffer);
            }
            //}
            //catch (Exception e)
            //{
            //    LogMgr.LogError(e.Message);
            //}
        }
Example #4
0
        private void OnEnterArenaData(GameEvent ge, EventParameter parameter)
        {
            NetReadBuffer buffer = parameter.objParameter as NetReadBuffer;

            CacheEnterHead.unpack(buffer);
            buffer.pos = 0;                                                       //重新给具体类型的消息读取

            if (CacheEnterHead.ObjType == (sbyte)EnEntType.EntType_VirtualPlayer) //EntType_VirtualPlayer
            {
                MsgData_sResArenaMemVo sstaticStruct = new MsgData_sResArenaMemVo();
                sstaticStruct.unpack(buffer);

                Debug.LogError(sstaticStruct.RoleID + "   " + sstaticStruct.Name);
                //CacheSceneObj(EnEntType.EntType_VirtualPlayer, sstaticStruct.Guid, sstaticStruct);
            }
        }
Example #5
0
        /// <summary>
        /// 分发收到的网络消息(主线程中调用)。
        /// </summary>
        protected void dispatchMsg()
        {
            //先将消息缓冲到临时列表,然后清空临界区列表,再通过临时列表派发,防止消息在派发时报错跳出,导致无法从列表里移除一直报错
            int n = 2;     //每帧最多处理2个消息

            //Debug.Log("recvMsgs.Count " + recvMsgs.Count);
            for (int i = 0; i < n; ++i)
            {
                RecvBuffer m = null;
                lock (recvMsgs)
                {
                    if (recvMsgs.Count > 0)
                    {
                        m = recvMsgs.Dequeue();
                    }
                }
                if (m == null)
                {
                    return;
                }

                //消息派发
                if (m.cmd == NetMsgDef.S_HEART_BEAT)
                {
                    //心跳
                    NetReadBuffer buf = NetReadBuffer.CacheBuff;
                    buf.Init(m.data, 0, m.length);
                    NetMgr.CacheRecvHeartBeat.unpack(buf);
                    CoreEntry.netMgr.OnReceiveHearBeat(m.tick, NetMgr.CacheRecvHeartBeat);
                }
                else if (m.cmd == NetMsgDef.S_FRAME_MSG)
                {
                    //合并包
                    UnpackFrameMessages(m, SendMessage);
                }
                else
                {
                    SendMessage(m);
                }
                cacheRecvMsgs.Cache(m);
            }
        }
Example #6
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);
            //}
        }
Example #7
0
 public virtual void unpack(NetReadBuffer buffer)
 {
 }