local Msg = require("core.Msg") local InnerMsg = require("core.InnerMsg") local ObjHuman = require("core.ObjHuman") local Util = require("common.Util") local Config = require("Config") local Lang = require("common.Lang") local LuaMongo = _G.lua_mongo local DB = require("common.DB") local RoleDBLogic = require("role.RoleDBLogic") local CombatLogic = require("combat.CombatLogic") local CombatPosLogic = require("combat.CombatPosLogic") local CombatDefine = require("combat.CombatDefine") local UnionWarDBLogic = require("union.UnionWarDBLogic") local UnionWarMiddleLogic = require("union.UnionWarMiddleLogic") local HeroGrid = require("hero.HeroGrid") local Grid = require("bag.Grid") local BagLogic = require("bag.BagLogic") local Broadcast = require("broadcast.Broadcast") local RoleDefine = require("role.RoleDefine") local UnionDBLogic = require("union.UnionDBLogic") local RoleLogic = require("role.RoleLogic") local MailManager = require("mail.MailManager") local BattleLogic = require("battle.BattleLogic") local MailDefine = require("mail.MailIdDefine") local MailExcel = require("excel.mail").mail local MonsterOutExcel = require("excel.monster").monsterOut local UnionWarExcel = require("excel.unionWar") local RobotExcel = UnionWarExcel.robot local DefineConf = UnionWarExcel.define[1] local LvExcel = UnionWarExcel.lv local RankExcel = UnionWarExcel.rank local RoleSystemLogic = require("roleSystem.RoleSystemLogic") local RoleSystemDefine = require("roleSystem.RoleSystemDefine") local BillboardDB = require("billboard.BillboardDB") local BillboardDefine = require("billboard.BillboardDefine") local Broadcast = require("broadcast.Broadcast") local Timer = require("core.Timer") local MiddleConnect = require("middle.MiddleConnect") --活动阶段 WDAY = {[1] = 1,[3] = 1,[5] = 1} --获取公会战阶段 HOUR1 = {5,8} --确认 HOUR2 = {8,12} --匹配 HOUR3 = {12,20} --战斗 HOUR4 = {20,24} --结算 STATE0 = 0 --非活动阶段 STATE1 = 1 --确认 STATE2 = 2 --匹配 STATE3 = 3 --战斗 STATE4 = 4 --结算 UNION_STATE1 = 1 --匹配成功 UNION_STATE2 = 2 --确认不成功 UNION_STATE3 = 3 --匹配不成功 UNION_LV = 2 -- 公会等级条件 UNION_HUOYUE = 5 --功会活跃人数条件 HUOYUE_TIME = 86400 UNION_FEIXU_CNT = 5 -- 废墟可挑战次数 local function getLocalUnionWarData(localData,unionUuid) localData[unionUuid] = localData[unionUuid] or {member = {},memberCnt = 0,star = 0,cnt = 0,exp = 0,lv = 0,rank = {}} return localData[unionUuid] end local function getLocalMemberData(unionWarData,uuid) unionWarData.member[uuid] = unionWarData.member[uuid] or {name = "",cnt = 0,shop = {{},{}},chengjiu = {{},{}}} return unionWarData.member[uuid] end local function getUnionWarRankRewardID(rank) for k, v in ipairs(RankExcel) do if v.minRank <= rank and rank <= v.maxRank then return k end end return 0 end local function getUnionWarData(human,memberData) if not human.db.unionWarData then human.db.unionWarData = {} human.db.unionWarData.shop = Util.copyTable(memberData.shop) human.db.unionWarData.upShopTime = memberData.upShopTime human.db.unionWarData.chengjiu = Util.copyTable(memberData.chengjiu) human.db.unionWarData.cnt = memberData.cnt end local now = os.time() if not human.db.unionWarData.upShopTime or human.db.unionWarData.upShopTime < now then human.db.unionWarData.upShopTime = Util.getWeekStartTime(now) + 86400 * 7 human.db.unionWarData.shop[1] = {} end return human.db.unionWarData end function fontFakeObj(objList) local fakeList = {} for i = 1, CombatDefine.COMBAT_HERO_CNT do local obj = objList[i] if obj then fakeList[i] = {} fakeList[i] = Util.copyTable(obj) local fake = fakeList[i] fake.beSkillList = nil fake.skillList = nil fake.beSkillListTemp = nil fake.attrs = nil fake.attrs2 = {} fake.attrs2[RoleDefine.HP] = obj.attrs[RoleDefine.HP] fake.attrs2[RoleDefine.DEF] = obj.attrs[RoleDefine.DEF] fake.attrs2[RoleDefine.ATK] = obj.attrs[RoleDefine.ATK] fake.attrs2[RoleDefine.SPEED] = obj.attrs[RoleDefine.SPEED] fake.attrs2[RoleDefine.ATK_RATE] = obj.attrs[RoleDefine.SPEED_RATE] fake.attrs2[RoleDefine.DEF_RATE] = obj.attrs[RoleDefine.SPEED_RATE] fake.attrs2[RoleDefine.HP_RATE] = obj.attrs[RoleDefine.SPEED_RATE] fake.attrs2[RoleDefine.SPEED_RATE] = obj.attrs[RoleDefine.SPEED_RATE] -- fake.attrsting = "" -- for k,v in pairs(obj.attrs) do -- fake.attrsting = fake.attrsting .. "|" .. k.. "," .. v -- end end end return fakeList end local function getData(data) if data.lv < UNION_LV then return end local unionData = {member = {}} local len = 0 local huoyueCnt = 0 local sortList = {} local localData = UnionWarDBLogic.getLocalData() local unionUuid = data._id local now = os.time() local d = os.date("*t",now) d.hour = HOUR4[1] d.min = 0 d.sec = 0 local boxEndTime = os.time(d) + 24 * 3600 local donateTime = Util.getDayStartTime(os.time()) donateTime = donateTime - HUOYUE_TIME localData[unionUuid] = localData[unionUuid] or {member = {},memberCnt = 0,star = 0,cnt = 0,exp = 0,lv = 0,rank = {}} localData[unionUuid].rank = {} if localData[unionUuid].box and localData[unionUuid].box.endTime and localData[unionUuid].box.endTime < now then localData[unionUuid].isWin = nil localData[unionUuid].isMatch = nil end for k,v in pairs(data.member) do local db = RoleDBLogic.getDb(k) if db then if db.lastLoginTime and db.lastLoginTime >= donateTime then huoyueCnt = huoyueCnt + 1 end local objList, helpList, rolebase,formation, jiban = CombatLogic.getHumanObjList({db = db},CombatDefine.COMBAT_TYPE3) if rolebase.zhandouli > 0 then len = len + 1 local battleMonsterOutID = BattleLogic.getCombatMonsterOutID({db = db}, CombatDefine.DEFEND_SIDE) if not battleMonsterOutID then battleMonsterOutID = 10001 end unionData.member[k] = {objList = objList,helpList = helpList,formation = formation, jiban = jiban , rolebase = rolebase,name = db.name ,attackStar = 0,defendStar = 3,defendCnt = 0,attackCnt = 0, jifen = 0,log = {},battleMonsterOutID = battleMonsterOutID} -- sortList[len] = {k,rolebase.zhandouli} localData[unionUuid].member[k] = localData[unionUuid].member[k] or {name = db.name,cnt = 0,shop = {{},{}},chengjiu = {{},{}}} localData[unionUuid].member[k].join = 1 localData[unionUuid].member[k].post = v.post localData[unionUuid].member[k].rolebase = rolebase localData[unionUuid].member[k].boxTime = boxEndTime end end end if len == 0 or huoyueCnt < UNION_HUOYUE then return end for k, v in pairs(localData[unionUuid].member) do if not data.member[k] then localData[unionUuid].member[k] = nil end end table.sort(sortList,function(a,b) return a[2] > b[2] end) for k,v in ipairs(sortList) do unionData.member[v[1]].index = k localData[unionUuid].rank[k] = {v[1],0,0} end unionData.memberCnt = len unionData.unionUuid = data._id unionData.name = data.name unionData.bannerID = data.bannerID unionData.lv = data.lv unionData.zhandouli = data.zhandouli unionData.svrName = Config.SVR_NAME unionData.svrIndex = Config.SVR_INDEX unionData.rank = BillboardDB.getRank(BillboardDefine.TYPE_UNION,data._id) or 0 localData[unionUuid].memberCnt = len localData[unionUuid].star = 0 return unionData end --重置公会战数据(资格确认) fileds = {unionUuid = 1,name = 1,bannerID = 1,lv = 1,zhandouli = 1,member = 1} local ToMidUnionList = nil function refreshData() print(" refreshData refreshData refreshData") ToMidUnionList = {} LuaMongo.find(DB.db_union,nil,fileds) local msgRet = InnerMsg.lw.LW_UNION_WAR_ADD msgRet.list = {} local len = 0 local unionList = {} local unionUuid while true do local data = {} if not LuaMongo.next(data) then break end unionList[#unionList + 1] = data end for k,data in ipairs(unionList) do local unionData = getData(data) if unionData then unionUuid = unionData.unionUuid local toLen = #ToMidUnionList + 1 ToMidUnionList[toLen] = {} ToMidUnionList[toLen].member = {} ToMidUnionList[toLen].unionUuid = unionUuid ToMidUnionList[toLen].member = Util.copyTable(unionData.member) unionData.member = {} len = len + 1 msgRet.list[len] = unionData end if len >= 5 then InnerMsg.sendMsg(0, msgRet) Util.cleanTable(msgRet.list) len = 0 end end if len >= 1 then InnerMsg.sendMsg(0, msgRet) end UnionWarDBLogic.updateDB() print(" Timer.addLater(1, sendUnionToMid) Timer.addLater(1, sendUnionToMid)") Timer.addLater(1, sendUnionToMid) end local function getSurCnt(member) local len = 0 if not member then return len end for _ in pairs(member) do len = len + 1 end return len end function sendUnionToMid() print(" sendUnionToMid , sendUnionToMid , sendUnionToMid") if ToMidUnionList and #ToMidUnionList > 0 then print(" sendUnionToMid sendUnionToMid sendUnionToMid", #ToMidUnionList) local data = ToMidUnionList[#ToMidUnionList] if data and data.unionUuid then local msgRet = InnerMsg.lw.LW_UNION_WAR_MEMBER msgRet.unionUuid = data.unionUuid msgRet.list = {} Util.cleanTable(msgRet.list) local len = 0 local sendUuid = {} if #ToMidUnionList == 1 and getSurCnt(data.member) <= 10 then data.isEnd = 1 end local isSend = false msgRet.isEnd = data.isEnd or 0 for k,v in pairs(data.member) do len = len + 1 msgRet.list[len] = {k,v} sendUuid[k] = 1 if len >= 10 then -- Util.printTable(msgRet) InnerMsg.sendMsg(0, msgRet) Util.cleanTable(msgRet.list) isSend = true break end end if not isSend then -- Util.printTable(msgRet) InnerMsg.sendMsg(0, msgRet) Util.cleanTable(msgRet.list) end local surLen = 0 for uuid in pairs(data.member) do if sendUuid[uuid] then data.member[uuid] = nil else surLen = surLen + 1 end end print(" surLen surLen ", surLen) if surLen == 0 then ToMidUnionList[#ToMidUnionList] = nil print(" del ToMidUnionList !", #ToMidUnionList) end if #ToMidUnionList > 0 then Timer.addLater(1, sendUnionToMid) else ToMidUnionList = nil end end end end -- 匹配完成 各个单服 将匹配上的 公会标记 用于红点 function middleUnionMatchFinish(msg) local localData = UnionWarDBLogic.getLocalData() for unionUuid in pairs(msg.list) do if localData[unionUuid] then localData[unionUuid].isMatch = true localData[unionUuid].matchTime = os.time() end end end function getState() local now = os.time() local d = os.date("*t",now) local wday = d.wday local h = d.hour -- 周一 周三 周五 公会战 if WDAY[wday - 1] then if h >= HOUR1[1] and h < HOUR1[2] then return STATE1 elseif h >= HOUR2[1] and h < HOUR2[2] then return STATE2 elseif h >= HOUR3[1] and h < HOUR3[2] then return STATE3 elseif h >= HOUR4[1] and h < HOUR4[2] then return STATE4 end end return STATE0 end function getEndTime(actState) local now = os.time() local d = os.date("*t",now) if actState == STATE0 then local wday = d.wday if wday < 6 then d.hour = HOUR2[2] local checkTime = os.time(d) return checkTime + 24 * 60 * 60 - now elseif wday == 6 then if actState < STATE3 then d.hour = HOUR2[2] else d.hour = HOUR3[2] end d.min = 0 d.sec = 0 local checkTime = os.time(d) return checkTime - now else local Monday = Util.getWeekStartTime() return Monday + 24 * 60 * 60 * 7 + HOUR2[2] * 3600 - now end else if actState < STATE3 then d.hour = HOUR2[2] else d.hour = HOUR3[2] end d.min = 0 d.sec = 0 local checkTime = os.time(d) return checkTime - now end end function getWarTime(human) local msgRet = Msg.gc.GC_UNION_WAR_TIME if MiddleConnect.IS_MIDDLE_CONNECT then local actState = getState() msgRet.actState = actState msgRet.time = getEndTime(actState) Msg.send(msgRet,human.fd) else msgRet.actState = 0 msgRet.time = 0 Msg.send(msgRet,human.fd) end end local function getChengjiuExcel(type) if type == 1 then return UnionWarExcel.chengjiu1 else return UnionWarExcel.chengjiu2 end end local function isDotChengjiu(human,localData,unionWarData,memberData,type) local ChengjiuExcel = getChengjiuExcel(type) if not memberData then --未参与公会战 return end local getList,cnt local humanData = getUnionWarData(human,memberData) if type == 1 then cnt = humanData.cnt getList = humanData.chengjiu[1] else cnt = unionWarData.cnt getList = humanData.chengjiu[2] end for k, v in ipairs(ChengjiuExcel) do if not getList[k] and v.cnt <= cnt then return true end end end local function sendState(human,actState,unionState) local msgRet = Msg.gc.GC_UNION_WAR_STATE msgRet.actState = actState msgRet.unionState = unionState msgRet.winState = 0 msgRet.cjDot = 0 msgRet.zgDot = 0 msgRet.shopDot = 0 msgRet.fightDot = 0 msgRet.pipeiDot = 0 local localData = UnionWarDBLogic.getLocalData() local unionWarData = getLocalUnionWarData(localData,human.db.unionUuid) local memberData = getLocalMemberData(unionWarData,human.db._id) if unionWarData and memberData and isDotChengjiu(human,localData,unionWarData,memberData,1) or isDotChengjiu(human,localData,unionWarData,memberData,2) then msgRet.cjDot = 1 end if unionWarData and isDotByBox(human, unionWarData) then msgRet.zgDot = 1 end if unionWarData and isDotByShop(human, unionWarData) then msgRet.shopDot = 1 end if unionWarData and isDotByCnt(human, unionWarData) then msgRet.fightDot = 1 end if unionWarData and isDotByPiPei(human, unionWarData) then msgRet.pipeiDot = 1 end if actState == STATE4 and unionState == UNION_STATE1 then msgRet.winState = unionWarData.isWin and unionWarData.isWin or 0 end Msg.send(msgRet,human.fd) end --请求:查询状态 --返回:状态,攻守双方成员 local function fontUnionWarTeam(net,data) local localData = UnionWarDBLogic.getLocalData() local unionWarData = getLocalUnionWarData(localData,data.unionUuid) local rankData = unionWarData.rank local temp = {} for i = 1,3 do if rankData[i] then temp[rankData[i][1]] = i else break end end net.unionUuid = data.unionUuid net.name = data.name net.svrName = data.svrName or "" net.bannerID = data.bannerID net.star = data.star local len = 0 for k,v in pairs(data.member) do len = len + 1 net.list[len].index = v.index net.list[len].uuid = v.uuid net.list[len].name = v.name net.list[len].star = v.star net.list[len].zhandouli = v.zhandouli net.list[len].rank = temp[v.uuid] or 0 local pos = RobotExcel[v.index].pos net.list[len].x = pos[1] net.list[len].y = pos[2] end net.list[0] = len end local function fontSimpleRank(net,unionUuid) local localData = UnionWarDBLogic.getLocalData() local unionWarData = getLocalUnionWarData(localData,unionUuid) local memberList = unionWarData.member local len = 0 local fields = {name = 1} local db for k,v in ipairs(unionWarData.rank) do len = len + 1 net[len].rank = k db = RoleDBLogic.getDb(v[1], fields) net[len].name = db and db.name or memberList[v[1]].name if len >= 3 then break end end net[0] = len end function onLogin(human) end function query(human,msg, actState) local msgRet = Msg.gc.GC_UNION_WAR_QUERY local localData = UnionWarDBLogic.getLocalData() local unionWarData = getLocalUnionWarData(localData,human.db.unionUuid) fontUnionWarTeam(msgRet.attacker,msg.attacker) fontUnionWarTeam(msgRet.defender,msg.defender) fontSimpleRank(msgRet.threeRank,msg.attacker.unionUuid) local now = os.time() local d = os.date("*t",now) d.hour = HOUR3[2] --[[ if actState == STATE2 then d.hour = HOUR2[2] else d.hour = HOUR3[2] end ]] d.min = 0 d.sec = 0 local checkTime = os.time(d) msgRet.leftTime = checkTime - now msgRet.cnt = msg.cnt msgRet.maxCnt = DefineConf.cnt -- Msg.trace(msgRet) Msg.send(msgRet,human.fd) end function CGQuery(human) end function WLQuery(human,msg) local actState = getState() sendState(human,actState,msg.state) if msg.state == UNION_STATE1 then query(human,msg, actState) end end -- 客户端 最多请求三次 -- 用于给 客户端 给予 停留在公会战界面 倒计时结束 公会战结果 查询更新 function CGEndQuery(human) local msgRet = Msg.gc.GC_UNION_WAR_END_STATE_QUERY local localData = UnionWarDBLogic.getLocalData() local unionWarData = getLocalUnionWarData(localData,human.db.unionUuid) msgRet.winState = unionWarData.isWin and unionWarData.isWin or 0 Msg.send(msgRet,human.fd) end local function fontBufferNet(msgRet, lv) msgRet.maxBuff = #UnionWarExcel.buff local config = UnionWarExcel.buff[lv] msgRet.nowAttr[0] = 0 msgRet.nextAttr[0] = 0 if config then for k, v in ipairs(config.attr) do local net = msgRet.nowAttr[k] net.key = v[1] net.value = v[2] end msgRet.nowAttr[0] = #config.attr end if lv + 1 <= msgRet.maxBuff then local nextConfig = UnionWarExcel.buff[lv + 1] for k, v in ipairs(nextConfig.attr) do local net = msgRet.nextAttr[k] net.key = v[1] net.value = v[2] end msgRet.nextAttr[0] = #nextConfig.attr end end -- BUF 请求 function CGBuffQuery(human) local msgRet = Msg.gc.GC_UNION_WAR_BUFF msgRet.buffLv = 0 fontBufferNet(msgRet, 0) if human then Msg.send(msgRet,human.fd) end local actState = getState() if actState > STATE1 then local msgRet = InnerMsg.lw.LW_UNION_WAR_BUFF_QUERY msgRet.uuid = human.db._id msgRet.unionUuid = human.db.unionUuid InnerMsg.sendMsg(0, msgRet) end end function WLBuffQuery(human, msg) local msgRet = Msg.gc.GC_UNION_WAR_BUFF msgRet.buffLv = msg.buffLv fontBufferNet(msgRet, msg.buffLv) if human and human.fd then Msg.send(msgRet,human.fd) else local localData = UnionWarDBLogic.getLocalData() local unionWarData = getLocalUnionWarData(localData, msg.unionUuid) if not unionWarData or not unionWarData.member then return end for uuid,_ in pairs(unionWarData.member) do local human = ObjHuman.onlineUuid[uuid] if human and human.fd then Msg.send(msgRet,human.fd) end end end end --请求:公会成员信息 --返回:公会成员信息 function CGInfo(human,unionUuid,targetUuid) local msgRet = InnerMsg.lw.LW_UNION_WAR_INFO msgRet.uuid = human.db._id msgRet.attackUnionUuid = human.db.unionUuid msgRet.unionUuid = unionUuid msgRet.targetUuid = targetUuid InnerMsg.sendMsg(0, msgRet) end -- 封装 英雄 local function fontHeroList(net,data) local len = 0 local monsterOutID = data.monsterOutID if monsterOutID then for k,v in ipairs(MonsterOutExcel[monsterOutID].member) do if v[1] > 0 then len = len + 1 HeroGrid.makeHeroSimpleByMonsterID(net[len],v[1],{lv = v[2]}) end end else for i = 1,CombatDefine.COMBAT_HERO_CNT do local obj = data.objList[i] if obj then len = len + 1 HeroGrid.makeHeroSimpleByID(net[len],obj.id, obj.bagIndex,{lv = obj.lv,star = obj.star}) end end end net[0] = len end function getDiff(robotConf,diff,monsterOutID, isFeixu) if isFeixu then diff = 3 return robotConf.rate[diff],0,robotConf.jifen2 else return robotConf.rate[diff],robotConf.star[diff],robotConf.jifen1[diff] end end -- 玩家信息 function WLInfo(human,msg) local msgRet = Msg.gc.GC_UNION_WAR_INFO local target = msg.target msgRet.cnt = msg.cnt msgRet.maxCnt = DefineConf.cnt msgRet.unionUuid = msg.unionUuid msgRet.uuid = target.uuid msgRet.index = msg.index msgRet.star = target.defendStar msgRet.zhandouli = target.zhandouli msgRet.defendCnt = target.defendCnt msgRet.canFight = msg.canFight msgRet.feixuCnt = target.loseBuff local len = 0 local monsterOutID = target.monsterOutID if monsterOutID then msgRet.isRobot = 1 else msgRet.isRobot = 0 end local robotConf = RobotExcel[target.index] local diffList = robotConf.diff local isFeixu = target.defendStar <= 0 if isFeixu then diffList = {3} end for k,v in ipairs(diffList) do len = len + 1 local net = msgRet.diffList[len] net.diff = v net.rate,net.star,net.jifen = getDiff(robotConf,k,monsterOutID) local len1 = 0 for k1,v1 in ipairs(robotConf.item[v]) do len1 = len1 + 1 Grid.makeItem(net.item[len1], v1[1], v1[2]) end net.item[0] = len1 end msgRet.diffList[0] = len -- Util.printTable(target) fontHeroList(msgRet.list,target) Msg.send(msgRet,human.fd) end --请求:匹配列表 --返回:匹配列表 function CGMatch(human) local msgRet = InnerMsg.lw.LW_UNION_WAR_MATCH msgRet.uuid = human.db._id msgRet.unionUuid = human.db.unionUuid InnerMsg.sendMsg(0, msgRet) end function WLMatch(human,msg) local msgRet = Msg.gc.GC_UNION_WAR_MATCH local len = 0 for k,v in ipairs(msg.list) do len = len + 1 local net = msgRet.list[len] net.nameLeft = v[1][1] net.rankLeft = v[1][3] or 0 net.nameRight = v[2][1] net.rankRight = v[2][3] or 0 net.svrNameLeft = v[3][3] net.svrNameRight = v[3][4] if len >= 60 then break end end msgRet.list[0] = len Msg.send(msgRet,human.fd) if human.db.unionUuid then local localData = UnionWarDBLogic.getLocalData() local unionWarData = getLocalUnionWarData(localData,human.db.unionUuid) if unionWarData then local memberData = getLocalMemberData(unionWarData,human.db._id) local humanData = getUnionWarData(human,memberData) local actState = getState() if actState >= STATE2 and not Util.isSameDay(humanData.pipeiLook) then humanData.pipeiLook = os.time() RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_1006) end end end end --请求:日志 --返回:日志 function CGAtkLog(human, type) local msgRet = InnerMsg.lw.LW_UNION_WAR_ATKLOG msgRet.uuid = human.db._id msgRet.type = type msgRet.unionUuid = human.db.unionUuid InnerMsg.sendMsg(0, msgRet) end function WLAtkLog(human, msg) local msgRet = Msg.gc.GC_UNION_WAR_ATKLOG msgRet.type = msg.type local len = 0 for k,v in ipairs(msg.list) do len = len + 1 local net = msgRet.list[len] net.upTime = v[1] net.ret = v[2] and 1 or 0 net.name = v[3] net.defName = v[4] net.star = v[5] net.jifen = v[6] net.unionUuid = v[7] net.atkUnionStar = v[8] or 0 net.buffLv = v[9] and v[9] or 0 end msgRet.list[0] = len -- Msg.trace(msgRet) Msg.send(msgRet,human.fd) end --请求 防守日志 --返回 防守日志 function CGDefLog(human,uuid, unionUuid) local msgRet = InnerMsg.lw.LW_UNION_WAR_DEFLOG msgRet.uuid = human.db._id msgRet.unionUuid = human.db.unionUuid msgRet.defendUuid = uuid msgRet.defendUnion = unionUuid InnerMsg.sendMsg(0, msgRet) end function WLDefLog(human,msg) local msgRet = Msg.gc.GC_UNION_WAR_DEFLOG msgRet.zhandouli = msg.defender.zhandouli fontHeroList(msgRet.heroList,msg.defender) local len = 0 for k,v in ipairs(msg.list) do len = len + 1 local net = msgRet.logList[len] net.id = 0 net.name = v.name net.zhandouli = v.zhandouli net.diff = v.diff net.result = v.result net.time = v.upTime local formationConfig = CombatPosLogic.getFormationConfig(v.formation) net.formation = formationConfig.name net.videoIndex = v.videoIndex fontHeroList(net.list,v.target) end msgRet.logList[0] = len --Msg.trace(msgRet) Msg.send(msgRet,human.fd) end function CGVideo(human, videoIndex) local msgRet = InnerMsg.lw.LW_UNION_WAR_VIDEO msgRet.uuid = human.db._id msgRet.unionUuid = human.db.unionUuid msgRet.index = videoIndex InnerMsg.sendMsg(0, msgRet) end function WLVideo(human,msg) CombatLogic.repeatCombat(human, msg.combatInfo) end --请求:挑战 --返回:挑战失败原因或者战斗帧 function fight(human,args) local actState = getState() if actState ~= STATE3 then return Broadcast.sendErr(human, Lang.UNION_WAR_FIGHT_ERR_END) end local msgRet = InnerMsg.lw.LW_UNION_WAR_FIGHT msgRet.unionUuid = human.db.unionUuid msgRet.attackUuid = human.db._id msgRet.defendUuid = args[1] msgRet.diff = args[2] InnerMsg.sendMsg(0, msgRet) print("================fight", msgRet.diff) end function sendfightErr(human, msg) if msg.state == UnionWarMiddleLogic.FIGHT2 then Broadcast.sendErr(human, Lang.UNION_WAR_FIGHT_ERR_TILI) elseif msg.state == UnionWarMiddleLogic.FIGHT3 then Broadcast.sendErr(human, Lang.UNION_WAR_FIGHT_ERR_ING) elseif msg.state == UnionWarMiddleLogic.FIGHT4 then Broadcast.sendErr(human, Lang.UNION_WAR_FIGHT_ERR_BEING) elseif msg.state == UnionWarMiddleLogic.FIGHT5 then Broadcast.sendErr(human, Lang.UNION_WAR_FIGHT_ERR_STAR) elseif msg.state == UnionWarMiddleLogic.FIGHT6 then Broadcast.sendErr(human, Lang.UNION_WAR_FIGHT_ERR_ZIGE) end end function WLFight(human,msg) print("================wlfight",msg.state,UnionWarMiddleLogic.FIGHT1) if msg.state ~= UnionWarMiddleLogic.FIGHT1 then sendfightErr(human, msg) return end human.unionWar = {} human.unionWar.target = Util.copyTable(msg.defender) human.unionWar.diff = msg.diff human.unionWar.name = msg.name CombatLogic.combatBegin(human,1001, {}, CombatDefine.COMBAT_TYPE12) end function getCombatObjList(human, side) if side == CombatDefine.ATTACK_SIDE then return CombatLogic.getHumanObjList(human,CombatDefine.COMBAT_TYPE1) else local target = human.unionWar.target local diff = human.unionWar.diff local rate = RobotExcel[target.index].rate[diff] for k,v in pairs(target.objList) do v.attrs[RoleDefine.ATK] = v.attrs[RoleDefine.ATK] * rate/10000 v.attrs[RoleDefine.DEF] = v.attrs[RoleDefine.DEF] * rate/10000 v.attrs[RoleDefine.HP] = v.attrs[RoleDefine.HP] * rate/10000 end return target.objList, target.helpList, target.rolebase,target.formation, target.jiban end end --挑战结束回调 function onFightEnd(human,ret, combatType, cbParam, combatInfo) local msgRet = InnerMsg.lw.LW_UNION_WAR_FIGHT_END msgRet.upTime = os.time() msgRet.uuid = human.db._id msgRet.unionUuid = human.db.unionUuid msgRet.combatInfo = combatInfo InnerMsg.sendMsg(0, msgRet) combatInfo.endStatus = CombatLogic.COMBAT_END_STATUS1 human.unionWar = human.unionWar or {} human.unionWar.combatInfo = combatInfo end function WLFightEnd(human,msg) local msgRet = Msg.gc.GC_UNION_WAR_FIGHT_END msgRet.diff = msg.diff msgRet.unionStar = msg.unionStar msgRet.defendStar = msg.defender.defendStar msgRet.defendUuid = msg.defender.uuid or "" msgRet.defIndex = msg.defender.index msgRet.cnt = msg.cnt local combatInfo = msg.combatInfo local target = msg.defender local diff = msg.diff local isFeixu = msg.isFeixu == 1 and true or false local robotConf = RobotExcel[target.index] local rate,star,jifen = getDiff(robotConf, diff,target.monsterOutID, isFeixu) combatInfo.endParam = rate.."|"..star.."|"..msg.defUnionName combatInfo.rewardItem = robotConf.item[diff] local localData = UnionWarDBLogic.getLocalData() local unionWarData = localData[human.db.unionUuid] local rankData = unionWarData.rank local addStar = msg.addStar local memberData = unionWarData.member[human.db._id] if combatInfo.isWin then if memberData then memberData.cnt = memberData.cnt + 1 local chengjiuData = getUnionWarData(human,memberData) chengjiuData.cnt = chengjiuData.cnt + 1 end else combatInfo.rewardItem = robotConf.item2[diff] jifen = 1 addStar = 0 end if memberData then local humanData = getUnionWarData(human,memberData) humanData.fightCnt = humanData.fightCnt or 0 humanData.fightCnt = msg.cnt humanData.fightTime = os.time() end -- 玩家增加 公会战积分 星级 for k,v in ipairs(rankData) do if v[1] == human.db._id then v[2] = v[2] + jifen v[3] = v[3] + addStar break end end table.sort(rankData,function(a,b) return a[2] > b[2] end) UnionWarDBLogic.updateDB() fontSimpleRank(msgRet.threeRank, human.db.unionUuid) Msg.send(msgRet,human.fd) for k,v in ipairs(combatInfo.rewardItem) do BagLogic.addItem(human, v[1], v[2], "unionWar") end CombatLogic.sendCombatFinish(human,combatInfo) human.unionWar = nil RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_1006) end -- 通知参与公会战的在线玩家场景更新 星级 同步 function WLFightTongzhi(msg) local msgRet = Msg.gc.GC_UNION_WAR_SCENE_INFO msgRet.unionUuid = msg.atkUnion msgRet.unionStar = msg.atkUnionStar msgRet.defendUuid = msg.defUuid msgRet.defendStar = msg.defStar msgRet.defIndex = msg.defIndex msgRet.targetUnion = msg.defUnion local ToUuid = msg.unionUuid fontSimpleRank(msgRet.threeRank, ToUuid) local localData = UnionWarDBLogic.getLocalData() local unionWarData = getLocalUnionWarData(localData, ToUuid) for uuid,_ in pairs(unionWarData.member) do if uuid ~= msg.atkUuid then local human = ObjHuman.onlineUuid[uuid] if human then Msg.send(msgRet,human.fd) end end end end --请求:开箱子 --返回:开箱子 function CGBox(human) local localData = UnionWarDBLogic.getLocalData() local unionWarData = getLocalUnionWarData(localData,human.db.unionUuid) local boxData = unionWarData.box local msgRet = Msg.gc.GC_UNION_WAR_BOX msgRet.leftTime = 0 msgRet.isWin = 1 local len = 0 local now = os.time() if boxData and now < boxData.endTime then msgRet.leftTime = boxData.endTime - now msgRet.isWin = unionWarData.isWin for k,v in ipairs(boxData.list) do len = len + 1 local net = msgRet.list[len] if v[3] then net.isOpen = 1 net.name = unionWarData.member[v[3]].name Grid.makeItem(net.item[1],v[1],v[2]) net.item[0] = 1 if net.name == "" then local fake = {} RoleLogic.getRoleBaseByUuid(v[3], fake) net.name = fake and fake.name or "" end else net.isOpen = 2 net.name = "" net.item[0] = 0 end end end msgRet.list[0] = len -- Msg.trace(msgRet) Msg.send(msgRet,human.fd) end -- 战果宝箱领取 function CGBoxGet(human,ind) local localData = UnionWarDBLogic.getLocalData() local unionWarData = getLocalUnionWarData(localData,human.db.unionUuid) local boxData = unionWarData.box if not boxData then return end if not unionWarData.member[human.db._id] then return end local now = os.time() if now > boxData.endTime then Broadcast.sendErr(human, Lang.UNION_WAR_BOX_TIME_ERR) return end if not unionWarData.member[human.db._id].boxTime then Broadcast.sendErr(human, Lang.UNION_WAR_BOX_TIME_ERR_2) return end if unionWarData.member[human.db._id].boxTime < boxData.endTime then Broadcast.sendErr(human, Lang.UNION_WAR_BOX_TIME_ERR_2) return end if not boxData.list[ind] then return end if boxData.list[ind][3] then Broadcast.sendErr(human, Lang.UNION_WAR_BOX_NOT_ERR) return end for k,v in ipairs(boxData.list) do if v[3] == human.db._id then Broadcast.sendErr(human, Lang.UNION_WAR_BOX_GET_ERR) return end end boxData.list[ind][3] = human.db._id local itemID = boxData.list[ind][1] local itemCnt = boxData.list[ind][2] BagLogic.cleanMomentItemList() BagLogic.updateMomentItem(BagLogic.ADDITEM_TYPE_1, itemID, itemCnt) BagLogic.addMomentItemList(human, "unionWar") local msgRet = Msg.gc.GC_UNION_WAR_BOX_GET msgRet.ind = ind local net = msgRet.box net.isOpen = 1 net.name = unionWarData.member[human.db._id].name Grid.makeItem(net.item[1],itemID, itemCnt) net.item[0] = 1 Msg.send(msgRet,human.fd) RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_1006) updateRed(human) end -- 公会战结束 function actFinish(msg) local localData = UnionWarDBLogic.getLocalData() local now = os.time() local d = os.date("*t",now) d.hour = HOUR4[1] d.min = 0 d.sec = 0 local endTime = os.time(d) + 24 * 3600 local boxItem local perExp = DefineConf.perExp local randMax for k,v in ipairs(msg.list) do if v[4] == Config.SVR_INDEX then local unionWarData = localData[v[1]] if unionWarData then if v[3] == 1 then boxItem = DefineConf.boxItem else boxItem = DefineConf.boxItem2 end randMax = #boxItem unionWarData.isWin = v[3] unionWarData.star = v[2] Util.initTable(unionWarData.box) unionWarData.box = {endTime = endTime,list = {}} for i = 1,unionWarData.memberCnt do local r = math.random(1,randMax) unionWarData.box.list[i] = {boxItem[r][1],boxItem[r][2]} end if v[3] == 1 then unionWarData.exp = unionWarData.exp + unionWarData.memberCnt * perExp unionWarData.cnt = unionWarData.cnt + 1 unionWarData.lv = LvExcel[#LvExcel].lv for k,v in ipairs(LvExcel) do if unionWarData.exp < v.exp then unionWarData.lv = v.lv - 1 break end end end end end end UnionWarDBLogic.updateDB() local localData = UnionWarDBLogic.getLocalData() local title = MailExcel[MailDefine.MAIL_ID_UNION_WAR].title local content = MailExcel[MailDefine.MAIL_ID_UNION_WAR].content local senderName = MailExcel[MailDefine.MAIL_ID_UNION_WAR].senderName for unionUuid,unionWarData in pairs(localData) do for k,v in ipairs(unionWarData.rank) do if v[2] == 0 then break end local rankID = getUnionWarRankRewardID(k) local conf = RankExcel[rankID] if not conf then break end MailManager.add(MailManager.SYSTEM, v[1], title, Util.format(content, k, v[2]) , conf.item, senderName) end end end --0 不可领取 1 可以领取 2 已经领取 CHENGJIU_STATE0 = 0 CHENGJIU_STATE1 = 1 CHENGJIU_STATE2 = 2 function CGChengjiu(human,type) local ChengjiuExcel = getChengjiuExcel(type) local localData = UnionWarDBLogic.getLocalData() local unionWarData = getLocalUnionWarData(localData,human.db.unionUuid) local memberData = getLocalMemberData(unionWarData,human.db._id) local humanData = getUnionWarData(human,memberData) local getList,cnt if type == 1 then cnt = humanData.cnt getList = humanData.chengjiu[1] else cnt = unionWarData.cnt getList = humanData.chengjiu[2] end local msgRet = Msg.gc.GC_UNION_WAR_CHENGJIU msgRet.type = type local len = 0 for k, v in ipairs(ChengjiuExcel) do len = len + 1 local net = msgRet.list[len] net.id = k net.title = v.title or "" net.maxCnt = v.cnt net.cnt = cnt if getList[k] then net.state = CHENGJIU_STATE2 elseif v.cnt <= cnt then net.state = CHENGJIU_STATE1 else net.state = CHENGJIU_STATE0 end local len1 = 0 for k1,v1 in ipairs(v.item) do len1 = len1 + 1 Grid.makeItem(net.item[len1],v1[1],v1[2]) end net.item[0] = len1 end msgRet.list[0] = len Msg.send(msgRet,human.fd) end function chegnjiuFinishGm(human, type) local ChengjiuExcel = getChengjiuExcel(type) local localData = UnionWarDBLogic.getLocalData() local unionWarData = localData[human.db.unionUuid] local memberData = getLocalMemberData(unionWarData,human.db._id) if not memberData then --未参与公会战 return end local humanData = getUnionWarData(human,memberData) if type == 1 then humanData.cnt = humanData.cnt or 0 humanData.cnt = humanData.cnt + 10 else unionWarData.cnt = unionWarData.cnt + 10 end UnionWarDBLogic.updateDB() end function CGChengjiuGet(human,type,id) local ChengjiuExcel = getChengjiuExcel(type) local localData = UnionWarDBLogic.getLocalData() local unionWarData = getLocalUnionWarData(localData,human.db.unionUuid) local memberData = getLocalMemberData(unionWarData,human.db._id) if not memberData then --未参与公会战 return end local humanData = getUnionWarData(human,memberData) local getList,cnt if type == 1 then cnt = humanData.cnt getList = humanData.chengjiu[1] else cnt = unionWarData.cnt getList = humanData.chengjiu[2] end if getList[id] then --已经领取 return end local conf = ChengjiuExcel[id] if cnt < conf.cnt then --未达成成就 return end getList[id] = 1 -- Util.printTable(conf.item) BagLogic.addItemList(human, conf.item, "unionWar") local msgRet = Msg.gc.GC_UNION_WAR_CHENGJIU_GET msgRet.type = type msgRet.id = id Msg.send(msgRet,human.fd) RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_1006) updateRed(human) end local function getShopExcel(type) if type == 1 then return UnionWarExcel.shop1 else return UnionWarExcel.shop2 end end function upWarShopLv(human, lv) local localData = UnionWarDBLogic.getLocalData() local unionWarData = getLocalUnionWarData(localData,human.db.unionUuid) if not unionWarData then return end unionWarData.lv = lv end function CGShop(human,type) local ShopExcel = getShopExcel(type) local localData = UnionWarDBLogic.getLocalData() local unionWarData = getLocalUnionWarData(localData,human.db.unionUuid) local memberData = getLocalMemberData(unionWarData,human.db._id) local humanData = getUnionWarData(human,memberData) local buyList if type == 1 then buyList = humanData.shop[1] else buyList = humanData.shop[2] end local msgRet = Msg.gc.GC_UNION_WAR_SHOP_QUERY msgRet.type = type local lv = unionWarData.lv msgRet.shopLv = lv msgRet.exp = unionWarData.exp local nextShopConf = LvExcel[unionWarData.lv + 1] msgRet.maxExp = nextShopConf and nextShopConf.exp or 0 local len = 0 for k,v in pairs(ShopExcel) do if v.lv <= lv + 1 then len = len + 1 local net = msgRet.list[len] net.id = k net.cnt = buyList[k] or 0 net.maxCnt = v.limit net.needLv = v.lv Grid.makeItem(net.item,v.item[1],v.item[2]) net.cost = v.cost net.discount = v.discount end end msgRet.list[0] = len Msg.send(msgRet,human.fd) end function CGBuy(human,type,id,buyCnt) local ShopExcel = getShopExcel(type) local localData = UnionWarDBLogic.getLocalData() local unionWarData = getLocalUnionWarData(localData,human.db.unionUuid) local memberData = getLocalMemberData(unionWarData,human.db._id) local humanData = getUnionWarData(human,memberData) local buyList if type == 1 then buyList = humanData.shop[1] else buyList = humanData.shop[2] end local conf = ShopExcel[id] if conf.lv > unionWarData.lv then --等级不够 return end buyCnt = buyCnt or 1 local cnt = buyList[id] or 0 if conf.limit > 0 and cnt + buyCnt > conf.limit then --达到限购次数 return end if not ObjHuman.checkRMB(human, conf.cost * buyCnt) then return end cnt = cnt + buyCnt buyList[id] = cnt ObjHuman.decZuanshi(human, -conf.cost * buyCnt, "unionWar") BagLogic.cleanMomentItemList() BagLogic.updateMomentItem(BagLogic.ADDITEM_TYPE_1, conf.item[1],conf.item[2] * buyCnt) BagLogic.addMomentItemList(human, "unionWar") local msgRet = Msg.gc.GC_UNION_WAR_SHOP_BUY msgRet.type = type msgRet.id = id msgRet.cnt = cnt Msg.send(msgRet,human.fd) RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_1006) updateRed(human) end function CGRank(human) local localData = UnionWarDBLogic.getLocalData() local unionWarData = getLocalUnionWarData(localData,human.db.unionUuid) local memberList = unionWarData.member local msgRet = Msg.gc.GC_UNION_WAR_RANK local len = 0 for k,v in ipairs(unionWarData.rank) do len = len + 1 local net = msgRet.list[len] net.uuid = v[1] net.rank = k local member = memberList[v[1]] RoleLogic.makeRoleBase(member.rolebase,net.roleBase) net.job = member.post local rankID = getUnionWarRankRewardID(k) local len1 = 0 for k1,v1 in ipairs(RankExcel[rankID].item) do len1 = len1 + 1 Grid.makeItem(net.items[len1],v1[1],v1[2]) end net.items[0] = len1 net.jifen = v[2] net.star = v[3] end msgRet.list[0] = len Msg.send(msgRet,human.fd) end function auto(str) print(" auto 1111") local Gm = require("chat.Gm") local CreateRole = require("role.CreateRole") local memberCnt = 30 local now = os.time() local union = UnionDBLogic.getUnionByName(str) local teamUuidStr = "" local teamHide = {[0] = memberCnt} for i = 1, memberCnt do local account = str .. string.format("%02d", i) local db = RoleDBLogic.getDbByAccount(account) if not db then db = CreateRole.creatFakeDb(account) db.lastLoginTime = os.time() db.lastLogoutTime = os.time() end local human = {} human.db = db -- ObjHuman.exPand(human) Gm.d3.god(human) if not union then union = UnionDBLogic.addUnion(human, str, 1, "") end if not union then return end if not db.unionUuid then db.unionUuid = union._id UnionDBLogic.addUnionMember(union, human.db._id) end CombatPosLogic.setCombatByUnionWarGm(human, CombatDefine.COMBAT_TYPE3) union.member[human.db._id].lastDonateTime = now ObjHuman.save(human) end union.lv = UNION_LV UnionDBLogic.updateUnionData(union) end local UNION_RANKREWARD_STATE = nil function CGRankReward(human) local msgRet = Msg.gc.GC_UNION_WAR_RANK_REWARD if not UNION_RANKREWARD_STATE then for k, v in ipairs(RankExcel) do local net = msgRet.list[k] net.id = k net.minRank = v.minRank net.maxRank = v.maxRank for j, h in ipairs(v.item) do Grid.makeItem(net.items[j], h[1], h[2]) end net.items[0] = #v.item end msgRet.list[0] = #RankExcel end Msg.send(msgRet, human.fd) end function isDotByBox(human, unionWarData) local now = os.time() if not unionWarData then local localData = UnionWarDBLogic.getLocalData() unionWarData = getLocalUnionWarData(localData,human.db.unionUuid) end if not unionWarData then return end local boxData = unionWarData.box if not unionWarData.member[human.db._id] then return end if not boxData or not boxData.endTime then return end if now > boxData.endTime then return end -- 检测 有没有领过 for k,v in ipairs(boxData.list) do if v[3] == human.db._id then return end end return true end function isDotByShop(human, unionWarData) local memberData = getLocalMemberData(unionWarData,human.db._id) local humanData = getUnionWarData(human,memberData) local buyList for type = 1 , 2 do if type == 1 then buyList = humanData.shop[1] else buyList = humanData.shop[2] end local lv = unionWarData.lv local len = 0 local ShopExcel = getShopExcel(type) for k,v in pairs(ShopExcel) do if v.lv <= lv and not buyList[k] then return true end end end end function isDotByCnt(human, unionWarData) local actState = getState() if actState == STATE3 and unionWarData.isMatch and Util.isSameDay(unionWarData.matchTime) then local memberData = getLocalMemberData(unionWarData,human.db._id) local humanData = getUnionWarData(human,memberData) if not humanData.fightCnt then return true end if Util.isSameDay(humanData.fightTime) then if humanData.fightCnt and humanData.fightCnt < UnionWarExcel.define[1].cnt then return true end else return true end end end function isDotByPiPei(human, unionWarData) local memberData = getLocalMemberData(unionWarData,human.db._id) local humanData = getUnionWarData(human,memberData) local actState = getState() if actState >= STATE2 and actState < STATE4 and unionWarData.isMatch then if not Util.isSameDay(humanData.pipeiLook) then return true end end end function isDot(human) if not human.db.unionUuid then return end local localData = UnionWarDBLogic.getLocalData() local unionWarData = getLocalUnionWarData(localData,human.db.unionUuid) if not unionWarData then return end -- 成就 local memberData = getLocalMemberData(unionWarData,human.db._id) if isDotChengjiu(human,localData,unionWarData,memberData,1) or isDotChengjiu(human,localData,unionWarData,memberData,2) then return true end if isDotByBox(human, unionWarData) then return true end if isDotByShop(human, unionWarData) then return true end if isDotByCnt(human, unionWarData) then return true end if isDotByPiPei(human, unionWarData) then return true end end -- 更新界面 红点 function updateRed(human) local msgRet = Msg.gc.GC_UNION_WAR_RED msgRet.cjDot = 0 msgRet.zgDot = 0 msgRet.shopDot = 0 msgRet.fightDot = 0 msgRet.pipeiDot = 0 local localData = UnionWarDBLogic.getLocalData() local unionWarData = getLocalUnionWarData(localData,human.db.unionUuid) local memberData = getLocalMemberData(unionWarData,human.db._id) if not memberData then Msg.send(msgRet,human.fd) return end if unionWarData and memberData and isDotChengjiu(human,localData,unionWarData,memberData,1) or isDotChengjiu(human,localData,unionWarData,memberData,2) then msgRet.cjDot = 1 end if unionWarData and isDotByBox(human, unionWarData) then msgRet.zgDot = 1 end if unionWarData and isDotByShop(human, unionWarData) then msgRet.shopDot = 1 end if unionWarData and isDotByCnt(human, unionWarData) then msgRet.fightDot = 1 end if unionWarData and isDotByPiPei(human, unionWarData) then msgRet.pipeiDot = 1 end Msg.send(msgRet,human.fd) end