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)); }
/// <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(); }
/// <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); //} }
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); } }
/// <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); } }
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); //} }
public virtual void unpack(NetReadBuffer buffer) { }