require "Message/SceneFight_pb" require "Message/RoomProto_pb" --require "Message/CommonProto_pb" MapFightManager = {} local this = MapFightManager local Network function this.Initialize() Game.GlobalEvent:AddEvent(Protocal.Connect, this.RegisterMessage) end function this.RegisterMessage(network) if network.type ~= SocketType.MAP_FIGHT then return end Network = network network.socket:RegistNetMessage(MessageTypeProto_pb.ROOM_START_GAME_INDICATION, this.OnRoomStartGame) network.socket:RegistNetMessage(MessageTypeProto_pb.SCENE_MSG_UPDATE_INDICATION, this.OnSceneInfoChange) network.socket:RegistNetMessage(MessageTypeProto_pb.SCENE_GAME_OVER_INDICATION, this.OnGameOver) Game.GlobalEvent:AddEvent(GameEvent.Room.GameStart, this.OnGameStart) this.RequestBloodyData() end this.selfAgent = nil this.otherAgents = nil this.walls = nil -- 请求血战数据 function this.RequestBloodyData() Log("请求血战数据") Network:SendMessageWithCallBack(MessageTypeProto_pb.ROOM_LOGIN_REQEUST, MessageTypeProto_pb.ROOM_LOGIN_RESPONSE, nil, function(buffer) local data = buffer:DataByte() local msg = RoomProto_pb.RoomLoginResponse() msg:ParseFromString(data) Log("拿到血战数据") this.OnGameDataPrepare(msg.roomMatchSuccessIndication) end) end --匹配成功,请求准备数据 function this.RoomStartGameReadyRequest(type) local data = RoomProto_pb.RoomStartGameReadyRequest() data.type = type local msg = data:SerializeToString() Network:SendMessageWithCallBack(MessageTypeProto_pb.ROOM_START_GAME_READY_REQUEST, MessageTypeProto_pb.ROOM_START_GAME_READY_RESPONSE, msg, function(buffer) local data = buffer:DataByte() local msg = RoomProto_pb.RoomStartGameReadyResponse() msg:ParseFromString(data) end) end function this.OnRoomStartGame(buffer) local data = buffer:DataByte() local msg = RoomProto_pb.RoomStartGameIndication() msg:ParseFromString(data) Log("你已经在游戏里了!") Game.GlobalEvent:DispatchEvent(GameEvent.Room.GameStart, this.CurRoomType) end -- 初始化 function this.OnGameDataPrepare(msg) Log("msg.type:"..tostring(msg.type)) if msg.type ~= 1 then return end this.ParseSceneInfo(msg.sceneInfo) this.walls = msg.sceneInfo.barrierPoint UIManager.OpenPanel(UIName.MapFightPanel) --重登时有可能监听到角色正在行走 if #this.selfAgent.path > 0 then table.reverse(this.selfAgent.path, 1, #this.selfAgent.path) Game.GlobalEvent:DispatchEvent(GameEvent.MapFight.Move, this.selfAgent.playerUid, this.selfAgent.path) end for k, v in pairs(this.otherAgents) do if #v.path > 0 then table.reverse(v.path, 1, #v.path) Game.GlobalEvent:DispatchEvent(GameEvent.MapFight.Move, k, v.path) end end this.buffList = {} --获取所有buff信息 for i=1, #msg.sceneInfo.actorEffectBufferInfo do local buff = this.CreateBuff(msg.sceneInfo.actorEffectBufferInfo[i]) this.buffList[buff.id] = buff Game.GlobalEvent:DispatchEvent(GameEvent.MapFight.BuffAdd, buff) end this.mineralList = {} --获取所有散矿信息 for i=1, #msg.sceneInfo.posMineral do local mineral = this.CreatePosMineral(msg.sceneInfo.posMineral[i]) this.mineralList[mineral.pos] = mineral Game.GlobalEvent:DispatchEvent(GameEvent.MapFight.MineralPointAdd, mineral) end -- 获取血战剩余时间 if msg.sceneInfo.remainTime then FightUIManager.remainTime = msg.sceneInfo.remainTime end this.RoomStartGameReadyRequest(RoomManager.CurRoomType) end function this.ParseSceneInfo(sceneInfo) Log("----ParseSceneInfo---") Log("msg.mapId:"..tostring(sceneInfo.mapId)) Log("#msg.agentInfos"..tostring(#sceneInfo.SceneActor)) this.otherAgents = {} --获取所有agent信息 for i=1, #sceneInfo.SceneActor do local agent = this.CreateAgent(sceneInfo.SceneActor[i]) if agent.playerUid == PlayerManager.uid then this.selfAgent = agent else this.otherAgents[agent.playerUid] = agent end end end function this.CreateBuff(buffInfo) Log("buffInfo.id:"..tostring(buffInfo.id)) Log("buffInfo.type:"..tostring(buffInfo.type)) Log("buffInfo.startTime:"..tostring(buffInfo.startTime)) Log("buffInfo.endTime:"..tostring(buffInfo.endTime)) Log("buffInfo.target:"..tostring(buffInfo.target)) Log("buffInfo.caster:"..tostring(buffInfo.caster)) Log("buffInfo.value:"..tostring(buffInfo.value)) local buff = {} buff.id = buffInfo.id buff.type = buffInfo.type buff.startTime = buffInfo.startTime buff.endTime = buffInfo.endTime buff.target = buffInfo.target buff.caster = buffInfo.caster buff.value = buffInfo.value return buff end function this.CreateAgent(agentInfo) Log("agent.playerUid:"..tostring(agentInfo.id)) Log("agent.type:"..tostring(agentInfo.type)) Log("agent.camp:"..tostring(agentInfo.Creature.camp)) Log("agent.curXY:"..tostring(agentInfo.curPos)) Log("agent.state:"..tostring(agentInfo.state)) Log("agent.userName:"..tostring(agentInfo.userName)) local agent = {} agent.playerUid = agentInfo.id agent.type = agentInfo.type agent.curXY = agentInfo.curPos agent.state = agentInfo.state --1 未准备 2 已准备 3 游戏开始 4 不可移动 5 移动 agent.userName = agentInfo.userName --1 未准备 2 已准备 3 游戏开始 4 不可移动 5 移动 if agentInfo.Creature then agent.curHp = agentInfo.Creature.curHp agent.maxHp = agentInfo.Creature.maxHp agent.camp = agentInfo.Creature.camp agent.path = agentInfo.Creature.path agent.mineral = agentInfo.Creature.mineral agent.speed = agentInfo.Creature.speed / 1000 agent.killNum = agentInfo.Creature.killNums end -- 过滤出所有玩家, 初始化 --if agentInfo.type == 1 then -- local playerInfo = {} -- playerInfo.id = agentInfo.id -- playerInfo.name = agentInfo.userName -- playerInfo.nineralNum = agentInfo.Creature.mineral -- playerInfo.killNum = agentInfo.Creature.killNums -- FightUIManager.playerInfo[agentInfo.id] = playerInfo -- --table.insert(FightUIManager.playerInfo, agentInfo.id, playerInfo) --end FightUIManager.UpDateRankInfo(agentInfo) return agent end function this.CreatePosMineral(mineralInfo) Log("mineralInfo.pos:"..tostring(mineralInfo.pos)) Log("mineralInfo.nums:"..tostring(mineralInfo.nums)) local mineral = {} mineral.pos = mineralInfo.pos mineral.nums = mineralInfo.nums return mineral end function this.OnGameOver(buffer) Log("----OnGameOver---") local data = buffer:DataByte() local msg = SceneFight_pb.SceneEndIndication() msg:ParseFromString(data) FightUIManager.SetFightResultScoreData(msg.sceneSimpleRankInfo) -- 保存分数数据 SocketManager.Disconnect(SocketType.MAP_FIGHT) RoomManager.IsMatch = 0 Game.GlobalEvent:DispatchEvent(GameEvent.MapFight.GameEnd) end function this.OnSceneInfoChange(buffer) Log("----OnSceneInfoChange---") local data = buffer:DataByte() local msg = SceneFight_pb.BroadMsgIndication() msg:ParseFromString(data) --Log("#msg.removeBufferId"..#msg.removeBufferId) for i=1, #msg.removeBufferId do local buffId = msg.removeBufferId[i] if this.buffList[buffId] then Log("remove buff id:"..buffId) local buff = this.buffList[buffId] this.buffList[buffId] = nil Game.GlobalEvent:DispatchEvent(GameEvent.MapFight.BuffRemove, buff) end end for i=1, #msg.removePosMineralId do local mineralId = msg.removePosMineralId[i] if this.mineralList[mineralId] then Log("remove mineral id:"..mineralId) local mineral = this.mineralList[mineralId] this.mineralList[mineralId] = nil Game.GlobalEvent:DispatchEvent(GameEvent.MapFight.MineralPointRemove, mineral) end end --Log("#msg.removeActorId"..#msg.removeActorId) for i=1, #msg.removeActorId do local actorId = msg.removeActorId[i] if this.otherAgents[actorId] then Log("remove agent id:"..actorId) local agent = this.otherAgents[actorId] this.otherAgents[actorId] = nil Game.GlobalEvent:DispatchEvent(GameEvent.MapFight.AgentRemove, agent) end end --Log("#msg.SceneActor"..#msg.SceneActor) for i=1, #msg.SceneActor do this.CheckActorInfoChange(msg.SceneActor[i]) end --Log("#msg.ActorEffectBufferInfo"..#msg.ActorEffectBufferInfo) for i=1, #msg.ActorEffectBufferInfo do this.CheckBuffChange(msg.ActorEffectBufferInfo[i]) end for i=1, #msg.PosMineral do this.CheckMineralChange(msg.PosMineral[i]) end -- 场景广播消息 for i = 1, #msg.sceneMsg do Log("SceneMsg.time" .. msg.sceneMsg[i].time) Log("SceneMsg.msg" .. msg.sceneMsg[i].msg) UIManager.OpenPanel(UIName.CurlingTipPanel, tostring(msg.sceneMsg[i].msg)) end end function this.CheckActorInfoChange(actorInfo) Log("CheckActorInfoChange !!!") local agent if this.selfAgent.playerUid == actorInfo.id then agent = this.selfAgent else if this.otherAgents[actorInfo.id] then agent = this.otherAgents[actorInfo.id] else agent = this.CreateAgent(actorInfo) this.otherAgents[actorInfo.id] = agent Game.GlobalEvent:DispatchEvent(GameEvent.MapFight.AgentAdd, agent) return end end agent.speed = actorInfo.Creature.speed / 1000 if agent.curHp ~= actorInfo.Creature.curHp then agent.curHp = actorInfo.Creature.curHp Game.GlobalEvent:DispatchEvent(GameEvent.MapFight.HPChange, actorInfo.id, actorInfo.Creature.curHp) end if agent.mineral ~= actorInfo.Creature.mineral then agent.mineral = actorInfo.Creature.mineral FightUIManager.UpDateRankInfo(actorInfo) Game.GlobalEvent:DispatchEvent(GameEvent.MapFight.MineralChange, actorInfo.id, actorInfo.Creature.mineral) end agent.maxHp = actorInfo.Creature.maxHp agent.state = actorInfo.state if agent.killNums ~= actorInfo.Creature.killNums then agent.killNums = actorInfo.Creature.killNums FightUIManager.UpDateRankInfo(actorInfo) end if agent.curXY ~= actorInfo.curPos then --Log("other pos change!!!!!!:"..actorInfo.curPos) --Log("cur pos !!!!!!:"..agent.curXY) Game.GlobalEvent:DispatchEvent(GameEvent.MapFight.PositionChange, actorInfo.id, actorInfo.curPos) end if #actorInfo.Creature.path > 0 then if actorInfo.state == 5 then --怪触发战斗时,该状态不为5 但有巡逻路径,此时不能走 --Log("other uid:"..actorInfo.id) --for i=1, #actorInfo.Creature.path do --Log("other move:"..actorInfo.Creature.path[i]) --end table.reverse(actorInfo.Creature.path, 1, #actorInfo.Creature.path) Game.GlobalEvent:DispatchEvent(GameEvent.MapFight.Move, actorInfo.id, actorInfo.Creature.path) end else --后端推过来的路径为空时,需要打断本地的寻路路径 Game.GlobalEvent:DispatchEvent(GameEvent.MapFight.PositionChange, actorInfo.id, actorInfo.curPos) end end function this.CheckBuffChange(buffInfo) Log("buffInfo Change !!!") local buff if not this.buffList[buffInfo.id] then buff = this.CreateBuff(buffInfo) this.buffList[buff.id] = buff Game.GlobalEvent:DispatchEvent(GameEvent.MapFight.BuffAdd, buff) else buff = this.buffList[buffInfo.id] local newBuff = this.CreateBuff(buffInfo) this.buffList[buff.id] = newBuff Game.GlobalEvent:DispatchEvent(GameEvent.MapFight.BuffChange, buff, newBuff) end end function this.CheckMineralChange(mineralInfo) Log("mineralInfo Change !!!") local mineral if not this.mineralList[mineralInfo.pos] then mineral = this.CreatePosMineral(mineralInfo) this.mineralList[mineralInfo.pos] = mineral Game.GlobalEvent:DispatchEvent(GameEvent.MapFight.MineralPointAdd, mineral) else mineral = this.mineralList[mineralInfo.pos] local newMineral = this.CreatePosMineral(mineralInfo) this.mineralList[mineralInfo.pos] = newMineral Game.GlobalEvent:DispatchEvent(GameEvent.MapFight.MineralPointChange, mineral, newMineral) end end function this.OnGameStart(type) if type ~= 1 then return end end --请求移动 function this.RoomSyncMyselfMoveRequest(pathList, func) local data = SceneFight_pb.SceneCommandRequest() data.type = 1 table.reverse(pathList, 1, #pathList) for i = 1, #pathList do local point = pathList[i] Log("path index:"..tostring(i).." pos:"..Map_UV2Pos(point.u, point.v)) data.parm:append(Map_UV2Pos(point.u, point.v)) end local msg = data:SerializeToString() Network:SendMessageWithCallBack(MessageTypeProto_pb.SCENE_COMMAND_REQUEST, MessageTypeProto_pb.SCENE_COMMAND_RESPONSE, msg, function(buffer) local data = buffer:DataByte() local msg = SceneFight_pb.SceneCommandResponse() msg:ParseFromString(data) Log("msg.type:"..msg.type) --指令类型 1:表示行走 Log("msg.result:"..msg.result) --行为结果 1 : 成功 0:失败 if msg.type == 1 and func then func(msg.result) end end) end return this