ServerCommerceActBattleGroundNS.lua 33 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079
  1. -- 跨服商业活动-巅峰战场
  2. -- db
  3. -- human.db.ServerCommerce.battleGround = {
  4. -- heroBag = {}, -- 英雄背包
  5. -- isHaveNewHero = false, -- 是否获得新英雄
  6. -- unLockIdx = 0, -- 英雄解锁层数
  7. -- freeChallengeCnt = 5, -- 免费挑战次数
  8. -- lastResetTime = 1123156, -- 上一次重置免费挑战次数的时间戳
  9. -- lineUp = { -- 战斗阵容数据
  10. -- formation = 1,
  11. -- heroList = {},
  12. -- },
  13. -- matchList = {rank1, rank2, rank3, rank4, rank5}, -- 对手列表
  14. -- }
  15. local Msg = require("core.Msg")
  16. local Timer = require("core.Timer")
  17. local Config = require("Config")
  18. local Grid = require("bag.Grid")
  19. local BagLogic = require("bag.BagLogic")
  20. local ObjHuman = require("core.ObjHuman")
  21. local MailExcel = require("excel.mail")
  22. local MailManager = require("mail.MailManager")
  23. local Util = require("common.Util")
  24. local Lang = require("common.Lang")
  25. local Broadcast = require("broadcast.Broadcast")
  26. local InnerMsg = require("core.InnerMsg")
  27. local RoleHeadLogic = require("role.RoleHeadLogic")
  28. local ServerCommerceManager = require("serverCommerce.ServerCommerceManager")
  29. local ServerCommerceActDefine = require("serverCommerce.ServerCommerceActDefine")
  30. local battleGroundConfig = require("excel.ServerCommerceBattleGround")
  31. local MonsterExcel = require("excel.monster")
  32. local HeroConfig = require("excel.hero").hero
  33. local HeroDefine = require("hero.HeroDefine")
  34. local CombatDefine = require("combat.CombatDefine")
  35. local CombatLogic = require("combat.CombatLogic")
  36. local CombatPosLogic = require("combat.CombatPosLogic")
  37. local MiddleCommonLogic = require("middle.MiddleCommonLogic")
  38. local RoleDBLogic = require("role.RoleDBLogic")
  39. local Log = require("common.Log")
  40. local lua_mongo = _G.lua_mongo
  41. local rankListCache = {}
  42. local lastGetRankListTime = 0
  43. local LOGTYPE = "ServerCommerceActBattleGround"
  44. local function writeLog(logStr)
  45. Log.write(Log.LOGID_OSS_COMMON_ACT, logStr)
  46. end
  47. -- 玩家排名下降, 通过邮件通知
  48. local function rankReduceMail(mailId, receiverUuid, arg)
  49. if not mailId or not receiverUuid then
  50. return
  51. end
  52. local mailCfg = MailExcel.mail[mailId]
  53. local content = mailCfg.content
  54. if arg then
  55. content = Util.format(content, arg[1], arg[2], arg[3])
  56. end
  57. MailManager.add(MailManager.SYSTEM, receiverUuid, mailCfg.title, content, nil, mailCfg.senderName or "GM")
  58. end
  59. -- 排行奖励邮件
  60. local function sendAwardMail(mailId, receiverUuid, rank, itemArray)
  61. local mailCfg = MailExcel.mail[mailId]
  62. local content = mailCfg.content
  63. content = Util.format(content, rank or ServerCommerceActDefine.COMMERCEACT_NPC_CNT)
  64. MailManager.add(MailManager.SYSTEM, receiverUuid, mailCfg.title, content, itemArray, mailCfg.senderName or "GM")
  65. end
  66. -- 创建一个发奖queue
  67. local function createRewardQueue()
  68. local issueRewardQueue = {
  69. playerArray = {},
  70. insertMaxNum = 100, -- 一次最多插入数据库的邮件数量
  71. repeatMaxTimes = 3, -- 重试次数
  72. repeatTb = {},
  73. extraInfo = {},
  74. }
  75. function issueRewardQueue:add(playerInfo)
  76. table.insert(self.playerArray, playerInfo)
  77. end
  78. function issueRewardQueue:insertDB()
  79. local maxNum = math.min(self.insertMaxNum, #self.playerArray)
  80. local mailId = battleGroundConfig.var[1].rankAwardMailId
  81. for i=1, maxNum do
  82. local resTag = ServerCommerceActDefine.BG_MAIL_SUCC_TAG
  83. local playerInfo = table.remove(self.playerArray)
  84. local playerUuid = playerInfo[2]
  85. local ok, err = pcall(sendAwardMail, mailId, playerUuid, playerInfo[1], playerInfo[3])
  86. if not ok then
  87. if not self.repeatTb[playerUuid] or self.repeatTb[playerUuid] < self.repeatMaxTimes then
  88. issueRewardQueue:add(playerInfo)
  89. self.repeatTb[playerUuid] = (self.repeatTb[playerUuid] or 0) + 1
  90. end
  91. resTag = ServerCommerceActDefine.BG_MAIL_FAIL_TAG
  92. end
  93. -- 写入日志
  94. local str = string.format("ServerCommerceActBattleGround PrizeAward result: %s, playerUuid: %s, insertErrTimes: %d, errInfo: %s",
  95. resTag, playerUuid, self.repeatTb[playerUuid] or 0, err)
  96. writeLog(str)
  97. end
  98. if #self.playerArray > 0 then
  99. Timer.addLater(2, self.insertDB, self)
  100. end
  101. end
  102. return issueRewardQueue
  103. end
  104. -- 是否处于活动中
  105. local function isRunning()
  106. return true == ServerCommerceManager.CommerceAct_IsRun()
  107. end
  108. -- 生成对手算法
  109. local function matchListAlgorithm(rank)
  110. -- 输入验证
  111. if not rank or type(rank) ~= "number" or rank < 1 or rank > (ServerCommerceActDefine.COMMERCEACT_NPC_CNT + 1) then
  112. return {} -- 返回空列表或根据需求处理错误
  113. end
  114. local matchList = {}
  115. local usedRanks = {}
  116. -- 确保玩家自己不会被选为对手
  117. usedRanks[rank] = true
  118. -- 计算抽取范围
  119. local minRank = math.max(1, rank - 50)
  120. local maxRank = math.min(ServerCommerceActDefine.COMMERCEACT_NPC_CNT, rank + 10)
  121. -- 生成所有可能的对手排名
  122. local possibleRanks = {}
  123. for i = minRank, maxRank do
  124. if not usedRanks[i] then
  125. table.insert(possibleRanks, i)
  126. end
  127. end
  128. -- 如果可用对手不足5个,则返回所有可能的对手
  129. local numToSelect = math.min(5, #possibleRanks)
  130. if numToSelect == 0 then
  131. return {}
  132. end
  133. -- 随机抽取指定数量的对手
  134. for i = 1, numToSelect do
  135. -- 从剩余可选排名中随机选择一个
  136. local randomIndex = math.random(#possibleRanks)
  137. local selectedRank = possibleRanks[randomIndex]
  138. -- 添加到匹配列表
  139. table.insert(matchList, selectedRank)
  140. -- 从可选列表中移除已选中的排名
  141. table.remove(possibleRanks, randomIndex)
  142. -- 标记为已使用
  143. usedRanks[selectedRank] = true
  144. end
  145. table.sort( matchList, function (a, b)
  146. return a > b
  147. end)
  148. return matchList
  149. end
  150. -- 生成一个英雄模板数据
  151. local function genHeroGrid(heroId)
  152. local obj = {}
  153. obj[1] = heroId
  154. obj[2] = lua_mongo.id()
  155. return obj
  156. end
  157. -- 遍历
  158. local function findVal(list, val)
  159. for k, info in pairs(list or {}) do
  160. if info[1] == val then
  161. return k
  162. end
  163. end
  164. end
  165. -- 填充协议英雄数据
  166. local function populateHeroMsg(net, heroInfo, heroConfig, heroLv, heroStar, heroBagIdx)
  167. net.heroHeadId = heroConfig.head
  168. net.heroName = heroConfig.name
  169. net.heroCamp = heroConfig.camp
  170. net.heroLv = heroLv
  171. net.heroStar = heroStar
  172. net.heroGrade = heroConfig.grade or 0
  173. net.heroBodyId = heroConfig.body
  174. net.heroId = heroInfo[1] or 0
  175. net.heroUuid = heroInfo[2] or ""
  176. net.heroBagIdx = heroBagIdx or 0
  177. net.heroJob = heroConfig.job or 1
  178. end
  179. -- 获取可以解锁的英雄信息
  180. local function getUnlockHeroInfoByRank(rank)
  181. local unLockHero = battleGroundConfig.unLockHero
  182. for idx, cfg in ipairs(unLockHero) do
  183. if rank >= cfg.unLockRankArea[1] and rank <= cfg.unLockRankArea[2] then
  184. return idx, cfg.unLockHeroInfo
  185. end
  186. end
  187. end
  188. -- 解锁英雄
  189. local function unlockHero(human, unlockHeroInfo, isInit)
  190. human.db.ServerCommerce.battleGround = human.db.ServerCommerce.battleGround or {}
  191. local battleGroundData = human.db.ServerCommerce.battleGround
  192. battleGroundData.heroBag = battleGroundData.heroBag or {}
  193. local heroBagData = battleGroundData.heroBag
  194. if #unlockHeroInfo == 0 then
  195. for heroId, heroCfg in pairs(HeroConfig) do
  196. if heroCfg.grade >= HeroDefine.HERO_SSR_GRADE and not findVal(heroBagData, heroId) then
  197. heroBagData[#heroBagData+1] = genHeroGrid(heroId)
  198. end
  199. end
  200. battleGroundData.isHaveNewHero = true
  201. return
  202. end
  203. -- local heroList = {}
  204. local heroArr = {}
  205. for heroId, heroCfg in pairs(HeroConfig) do
  206. if heroCfg.grade >= HeroDefine.HERO_SSR_GRADE and not findVal(heroBagData, heroId) then
  207. -- heroList[heroId] = heroCfg
  208. heroArr[#heroArr+1] = {heroId, heroCfg}
  209. end
  210. end
  211. table.shuffle(heroArr)
  212. for _, heroCond in ipairs(unlockHeroInfo) do
  213. local campCond = heroCond[1] or 0
  214. local numCond = heroCond[2] or 0
  215. for i=1, numCond do
  216. for _, heroData in ipairs(heroArr) do
  217. local heroId = heroData[1]
  218. local heroCfg = heroData[2]
  219. if heroCfg.camp == campCond and not findVal(heroBagData, heroId) then
  220. heroBagData[#heroBagData+1] = genHeroGrid(heroId)
  221. break
  222. end
  223. end
  224. end
  225. end
  226. battleGroundData.isHaveNewHero = true
  227. if isInit then
  228. battleGroundData.isHaveNewHero = false
  229. end
  230. end
  231. -- 获取上阵英雄
  232. local function getLineupHeroArr(human)
  233. local heroArr
  234. local heroList = CombatPosLogic.getCombatHeros(human, CombatDefine.COMBAT_TYPE37)
  235. for _, heroUuid in ipairs(heroList) do
  236. if heroUuid and heroUuid ~= "" and heroUuid ~= "0" then
  237. local heroGrid = getHeroGridByUuid(human, heroUuid)
  238. if heroGrid then
  239. heroArr = heroArr or {}
  240. heroArr[#heroArr+1] = heroGrid.id
  241. end
  242. end
  243. end
  244. return heroArr
  245. end
  246. -- 生成玩家的展示数据
  247. local function populatePlayerShowData(human, showData, rank)
  248. showData.rank = rank
  249. showData.serverId = Config.SVR_INDEX
  250. showData.playerUuid = human.db._id
  251. showData.name = human.db.name
  252. showData.bodyId = RoleHeadLogic.getRoleAppearance(human, RoleHeadLogic.HEAD_TYPE_3) or 0
  253. showData.headId = RoleHeadLogic.getRoleAppearance(human, RoleHeadLogic.HEAD_TYPE_1) or 0
  254. showData.headFrameId = RoleHeadLogic.getRoleAppearance(human, RoleHeadLogic.HEAD_TYPE_2) or 0
  255. showData.heroArr = {}
  256. showData.heroArr = getLineupHeroArr(human)
  257. end
  258. -- 排名提高
  259. local function rankImprove(msg)
  260. local human = ObjHuman.onlineUuid[msg.playerUuid]
  261. if not human then
  262. local db = RoleDBLogic.getDb(msg.playerUuid)
  263. if not db then
  264. return
  265. end
  266. human = {}
  267. human.db = db
  268. end
  269. human.battleGroundRank = msg.newRank
  270. local newMatchList = matchListAlgorithm(human.battleGroundRank)
  271. -- 更新对手列表
  272. local battleGroundData = human.db.ServerCommerce.battleGround
  273. battleGroundData.matchList = newMatchList
  274. -- 检查是否能解锁新英雄
  275. local idx, unlockHeroInfo = getUnlockHeroInfoByRank(human.battleGroundRank)
  276. if idx ~= battleGroundData.unLockIdx then
  277. unlockHero(human, unlockHeroInfo)
  278. battleGroundData.unLockIdx = idx
  279. battleGroundData.isHaveNewHero = true
  280. end
  281. -- 玩家在线
  282. if human.fd then
  283. BattleGround_MatchPage_Query(human)
  284. return
  285. end
  286. -- 玩家不在线,则保存数据
  287. ObjHuman.save(human)
  288. end
  289. -- 排名降低
  290. local function rankReduce(msg)
  291. local human = ObjHuman.onlineUuid[msg.playerUuid]
  292. if not human then
  293. local db = RoleDBLogic.getDb(msg.playerUuid)
  294. if not db then
  295. return
  296. end
  297. human = {}
  298. human.db = db
  299. end
  300. -- 更新对手列表
  301. local battleGroundData = human.db.ServerCommerce.battleGround
  302. battleGroundData.matchList = matchListAlgorithm(msg.newRank)
  303. -- 邮件通知
  304. local varCfg = battleGroundConfig.var[1]
  305. local arg = {msg.atkeServerId - 810537, msg.atkName, msg.newRank}
  306. rankReduceMail(varCfg.defeatMailId, human.db._id, arg)
  307. -- 玩家在线
  308. if human.fd then
  309. human.battleGroundRank = msg.newRank
  310. return
  311. end
  312. -- 玩家不在线,则保存数据
  313. ObjHuman.save(human)
  314. end
  315. -- 战斗结束处理
  316. local function fightEndHanle(human, result)
  317. local msgData = InnerMsg.lw.LW_BATTLEGROUND_CHALLENGE_END
  318. msgData.sourceServerId = Config.SVR_INDEX
  319. msgData.playerUuid = human.db._id
  320. msgData.atkRank = human.battleGroundRank
  321. msgData.defRank = human.battleGroundCache.defRank
  322. msgData.challengeRes = CombatDefine.RESULT_WIN
  323. msgData.playerShowData = {}
  324. local varCfg = battleGroundConfig.var[1]
  325. local challengeAward = varCfg.defeatAward
  326. if result == CombatDefine.RESULT_WIN then
  327. -- 展示数据
  328. --if human.battleGroundRank <= ServerCommerceActDefine.COMMERCEACT_NPC_CNT then
  329. populatePlayerShowData(human, msgData.playerShowData, human.battleGroundCache.defRank)
  330. --end
  331. -- 挑战奖励
  332. challengeAward = varCfg.winAward
  333. end
  334. -- 发放挑战奖励
  335. local finalAwardArr = {}
  336. for i, itemInfo in ipairs(challengeAward) do
  337. finalAwardArr[i] = {itemInfo[1], itemInfo[2]}
  338. end
  339. BagLogic.addItemList(human, finalAwardArr, LOGTYPE)
  340. -- 通知跨服更新数据
  341. InnerMsg.sendMsg(0, msgData)
  342. end
  343. -- 获取排名奖励
  344. local function getRankAward(rank)
  345. local itemArr
  346. for i, cfg in ipairs(battleGroundConfig.rankAward) do
  347. if rank >= cfg.rankArea[1] and rank <= cfg.rankArea[2] then
  348. itemArr = {}
  349. for k, itemInfo in ipairs(cfg.rankAward) do
  350. itemArr[k] = {itemInfo[1], itemInfo[2]}
  351. end
  352. break
  353. end
  354. end
  355. return itemArr
  356. end
  357. function updateDaily(human)
  358. if not isRunning() then
  359. return
  360. end
  361. local battleGroundData = human.db.ServerCommerce and human.db.ServerCommerce.battleGround
  362. if not battleGroundData then
  363. return
  364. end
  365. local lastResetTime = battleGroundData.lastResetTime
  366. if not Util.isSameDay(lastResetTime) then
  367. battleGroundData.freeChallengeCnt = ServerCommerceActDefine.COMMERCEACT_DAILY_FREECHALLENGETIMES
  368. battleGroundData.lastResetTime = os.time()
  369. end
  370. end
  371. -- 根据英雄uuid获取英雄信息
  372. function getHeroGridByUuid(human, heroUuid)
  373. if not isRunning() then
  374. return
  375. end
  376. if not human.db.ServerCommerce then
  377. return
  378. end
  379. local battleGroundData = human.db.ServerCommerce.battleGround
  380. if not battleGroundData or not battleGroundData.heroBag then
  381. return
  382. end
  383. local heroGrid
  384. local heroBagData = battleGroundData.heroBag
  385. for bagIdx, heroInfo in ipairs(heroBagData) do
  386. if heroInfo[2] == heroUuid then
  387. heroGrid = {
  388. id = heroInfo[1],
  389. bagIndex = bagIdx,
  390. uuid = heroInfo[2],
  391. zhandouli = 0
  392. }
  393. break
  394. end
  395. end
  396. return heroGrid
  397. end
  398. -- 根据英雄id获取英雄信息
  399. function getHeroGridByheroId(human, heroId)
  400. if not isRunning() then
  401. return
  402. end
  403. if not human.db.ServerCommerce then
  404. return
  405. end
  406. local battleGroundData = human.db.ServerCommerce.battleGround
  407. if not battleGroundData or not battleGroundData.heroBag then
  408. return
  409. end
  410. local heroGrid
  411. local heroBagData = battleGroundData.heroBag
  412. for bagIdx, heroInfo in ipairs(heroBagData) do
  413. if heroInfo[1] == heroId then
  414. heroGrid = {
  415. id = heroInfo[1],
  416. bagIndex = bagIdx,
  417. uuid = heroInfo[2]
  418. }
  419. break
  420. end
  421. end
  422. return heroGrid
  423. end
  424. -- 是否获得英雄
  425. function isGetHero(human, heroId)
  426. return getHeroGridByheroId(human, heroId)
  427. end
  428. -- 阵容有更新
  429. function onUpdatePos(human)
  430. BattleGround_Lineup_Update(human)
  431. end
  432. -- 是否有红点
  433. function isRed(human)
  434. if not human.db.ServerCommerce or not human.db.ServerCommerce.battleGround then
  435. return false
  436. end
  437. local battleGroundData = human.db.ServerCommerce.battleGround
  438. if not battleGroundData.freeChallengeCnt or battleGroundData.freeChallengeCnt <= 0 then
  439. return false
  440. end
  441. return true
  442. end
  443. -- 推送主界面信息
  444. local function sendMainPageData(human)
  445. local msgRet = Msg.gc.GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_MAINPAGE_QUERY
  446. msgRet.myRank = human.battleGroundRank or (ServerCommerceActDefine.COMMERCEACT_NPC_CNT + 1)
  447. msgRet.freeChallengeCnt = 0
  448. msgRet.showBodyId = RoleHeadLogic.getRoleAppearance(human, RoleHeadLogic.HEAD_TYPE_3) or 0
  449. local battleGroundData = human.db.ServerCommerce and human.db.ServerCommerce.battleGround
  450. msgRet.freeChallengeCnt = battleGroundData and battleGroundData.freeChallengeCnt or ServerCommerceActDefine.COMMERCEACT_DAILY_FREECHALLENGETIMES
  451. Msg.send(msgRet, human.fd)
  452. end
  453. -- 推送排行榜数据
  454. local function sendRankListData(human)
  455. local msgRet = Msg.gc.GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_RANK_QUERY
  456. msgRet.rankList[0] = 0
  457. msgRet.isEnd = 0
  458. msgRet.myRankInfo.rank = ServerCommerceActDefine.COMMERCEACT_NPC_CNT
  459. msgRet.myRankInfo.serverId = Config.SVR_INDEX - ServerCommerceActDefine.BG_SERVERID_START
  460. msgRet.myRankInfo.name = human.db.name
  461. msgRet.myRankInfo.heroHeadId = RoleHeadLogic.getRoleAppearance(human, RoleHeadLogic.HEAD_TYPE_1) or 0
  462. msgRet.myRankInfo.heroHeadFrameId = RoleHeadLogic.getRoleAppearance(human, RoleHeadLogic.HEAD_TYPE_2) or 0
  463. local msgMaxLen = 20
  464. local len = 0
  465. local rankNum = #rankListCache
  466. for rank, rankInfo in ipairs(rankListCache) do
  467. len = len + 1
  468. msgRet.rankList[0] = len
  469. msgRet.rankList[len].rank = rank
  470. msgRet.rankList[len].serverId = rankInfo.serverId and (rankInfo.serverId - ServerCommerceActDefine.BG_SERVERID_START) or 1
  471. msgRet.rankList[len].name = rankInfo.name
  472. msgRet.rankList[len].heroHeadId = rankInfo.heroHeadId
  473. msgRet.rankList[len].heroHeadFrameId = rankInfo.heroHeadFrameId
  474. if rankInfo.playerUuid == human.db._id then
  475. msgRet.myRankInfo.rank = rank
  476. end
  477. if len >= msgMaxLen then
  478. rankNum = rankNum - len
  479. if rankNum <= 0 then
  480. msgRet.isEnd = 1
  481. return Msg.send(msgRet, human.fd)
  482. end
  483. Msg.send(msgRet, human.fd)
  484. len = 0
  485. end
  486. end
  487. if len > 0 then
  488. msgRet.isEnd = 1
  489. Msg.send(msgRet, human.fd)
  490. end
  491. end
  492. -- 主界面信息查询
  493. function BattleGround_MainPage_Query(human)
  494. if not isRunning() then
  495. return Broadcast.sendErr(human, Lang.ACT_NOT_START)
  496. end
  497. if not human.battleGroundRank then
  498. local msgData = InnerMsg.lw.LW_BATTLEGROUND_PLAYER_RANK_QUERY
  499. msgData.sourceServerId = Config.SVR_INDEX
  500. msgData.playerUuid = human.db._id
  501. return InnerMsg.sendMsg(0, msgData)
  502. end
  503. sendMainPageData(human)
  504. end
  505. -- 匹配界面信息查询
  506. function BattleGround_MatchPage_Query(human)
  507. if not isRunning() then
  508. return Broadcast.sendErr(human, Lang.ACT_NOT_START)
  509. end
  510. local battleGroundData = human.db.ServerCommerce.battleGround
  511. if not battleGroundData.matchList or not next(battleGroundData.matchList) then
  512. battleGroundData.matchList = matchListAlgorithm(human.battleGroundRank)
  513. end
  514. local msgData = InnerMsg.lw.LW_BATTLEGROUND_MATCHLIST_QUERY
  515. msgData.sourceServerId = Config.SVR_INDEX
  516. msgData.playerUuid = human.db._id
  517. msgData.matchList = {}
  518. for _, rank in ipairs(battleGroundData.matchList) do
  519. msgData.matchList[#msgData.matchList+1] = rank
  520. end
  521. InnerMsg.sendMsg(0, msgData)
  522. end
  523. -- 刷新匹配对手
  524. function BattleGround_Update_MatchList(human)
  525. if not isRunning() then
  526. return Broadcast.sendErr(human, Lang.ACT_NOT_START)
  527. end
  528. if not human.battleGroundRank then
  529. return
  530. end
  531. local battleGroundData = human.db.ServerCommerce.battleGround
  532. battleGroundData.matchList = matchListAlgorithm(human.battleGroundRank)
  533. BattleGround_MatchPage_Query(human)
  534. end
  535. -- 匹配对手查询
  536. function BattleGround_Player_Query(human, targetRank)
  537. if not isRunning() then
  538. return Broadcast.sendErr(human, Lang.ACT_NOT_START)
  539. end
  540. local battleGroundData = human.db.ServerCommerce.battleGround
  541. if not table.find(battleGroundData.matchList, targetRank) then
  542. return Broadcast.sendErr(human, Lang.BG_MATCHLIST_ERR)
  543. end
  544. local msgData = InnerMsg.lw.LW_BATTLEGROUND_PLAYER_DATA_QUERY
  545. msgData.sourceServerId = Config.SVR_INDEX
  546. msgData.playerUuid = human.db._id
  547. msgData.playerRank = targetRank
  548. InnerMsg.sendMsg(0, msgData)
  549. end
  550. -- 请求挑战某个排名玩家
  551. function BattleGround_Try_Challenge(human, targetRank)
  552. local msgData = InnerMsg.lw.LW_BATTLEGROUND_CHALLENGE_QUERY
  553. msgData.sourceServerId = Config.SVR_INDEX
  554. msgData.playerUuid = human.db._id
  555. msgData.rank = targetRank
  556. InnerMsg.sendMsg(0, msgData)
  557. end
  558. -- 英雄背包查询
  559. function BattleGround_HeroBag_Query(human)
  560. if not isRunning() then
  561. return Broadcast.sendErr(human, Lang.ACT_NOT_START)
  562. end
  563. local battleGroundData = human.db.ServerCommerce.battleGround
  564. if not battleGroundData.heroBag then
  565. local idx, unlockHeroInfo = getUnlockHeroInfoByRank(human.battleGroundRank)
  566. if unlockHeroInfo then
  567. unlockHero(human, unlockHeroInfo, true)
  568. battleGroundData.unLockIdx = idx
  569. end
  570. end
  571. local msgRet = Msg.gc.GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_HEROBAG_QUERY
  572. msgRet.heroArr[0] = 0
  573. msgRet.isEnd = 0
  574. local len, msgMaxLen = 0, 0
  575. local heroNum = #battleGroundData.heroBag
  576. for heroBagIdx, heroInfo in ipairs(battleGroundData.heroBag) do
  577. len = len + 1
  578. msgRet.heroArr[0] = len
  579. local heroConfig = HeroConfig[heroInfo[1]]
  580. populateHeroMsg(msgRet.heroArr[len], heroInfo, heroConfig, ServerCommerceActDefine.COMMERCEACT_HERO_LV, ServerCommerceActDefine.COMMERCEACT_HERO_STAR, heroBagIdx)
  581. if len >= msgMaxLen then
  582. heroNum = heroNum - len
  583. if heroNum <= 0 then
  584. msgRet.isEnd = 1
  585. return Msg.send(msgRet, human.fd)
  586. end
  587. Msg.send(msgRet, human.fd)
  588. len = 0
  589. end
  590. end
  591. if len > 0 then
  592. msgRet.isEnd = 1
  593. Msg.send(msgRet, human.fd)
  594. end
  595. battleGroundData.isHaveNewHero = false
  596. end
  597. -- 排行榜查询
  598. function BattleGround_RankList_Query(human)
  599. if not isRunning() then
  600. return Broadcast.sendErr(human, Lang.ACT_NOT_START)
  601. end
  602. local now = os.time()
  603. if #rankListCache == 0 or now - lastGetRankListTime >= ServerCommerceActDefine.COMMERCEACT_RANKUPDATE then
  604. local msgData = InnerMsg.lw.LW_BATTLEGROUND_RANKLIST_QUERY
  605. msgData.sourceServerId = Config.SVR_INDEX
  606. msgData.playerUuid = human.db._id
  607. return InnerMsg.sendMsg(0, msgData)
  608. end
  609. sendRankListData(human)
  610. end
  611. -- 排行奖励查询
  612. function BattleGround_RankAward_Query(human)
  613. if not isRunning() then
  614. return Broadcast.sendErr(human, Lang.ACT_NOT_START)
  615. end
  616. local msgRet = Msg.gc.GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_RANKAWARD_QUERY
  617. msgRet.rankAwardList[0] = 0
  618. msgRet.rankAwardList[0] = #battleGroundConfig.rankAward
  619. for i, cfg in ipairs(battleGroundConfig.rankAward) do
  620. msgRet.rankAwardList[i].minRank = cfg.rankArea[1]
  621. msgRet.rankAwardList[i].maxRank = cfg.rankArea[2]
  622. msgRet.rankAwardList[i].rankAward[0] = #cfg.rankAward
  623. for k, itemInfo in ipairs(cfg.rankAward) do
  624. Grid.makeItem(msgRet.rankAwardList[i].rankAward[k], itemInfo[1], itemInfo[2])
  625. end
  626. end
  627. Msg.send(msgRet, human.fd)
  628. end
  629. -- 更新阵容数据
  630. function BattleGround_Lineup_Update(human, msg)
  631. if not isRunning() then
  632. return
  633. end
  634. -- local battleGroundData = human.db.ServerCommerce.battleGround
  635. -- local formation = msg.formation
  636. -- local posList = CombatPosLogic.getPosList(formation)
  637. -- local heroList = Util.split(msg.heroList, ",", true)
  638. -- local reapetTb = {}
  639. -- for i = 1, CombatDefine.COMBAT_HERO_CNT do
  640. -- local heroId = heroList[i]
  641. -- if heroId > 0 then
  642. -- -- 英雄Id检测
  643. -- if HeroConfig[heroId] then
  644. -- return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
  645. -- end
  646. -- -- 英雄背包检测
  647. -- if not battleGroundData.heroBag or not table.find(battleGroundData.heroBag, heroId) then
  648. -- return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
  649. -- end
  650. -- -- 相同英雄检测
  651. -- if reapetTb[heroId] then
  652. -- return Broadcast.sendErr(human, Lang.HERO_SAME)
  653. -- end
  654. -- -- 位置检测
  655. -- if posList[i] == nil and i ~= CombatDefine.COMBAT_HERO_CNT then
  656. -- return Broadcast.sendErr(human, Lang.POS_ERROR)
  657. -- end
  658. -- reapetTb[heroId] = true
  659. -- end
  660. -- end
  661. -- battleGroundData.lineUp = battleGroundData.lineUp or {}
  662. -- battleGroundData.lineUp.formation = formation
  663. -- battleGroundData.lineUp.heroList = heroList
  664. -- 通知跨服更新
  665. if human.battleGroundRank and human.battleGroundRank <= ServerCommerceActDefine.COMMERCEACT_NPC_CNT then
  666. local msgData = InnerMsg.lw.LW_BATTLEGROUND_LINEUP_UPDATE
  667. msgData.sourceServerId = Config.SVR_INDEX
  668. msgData.playerUuid = human.db._id
  669. msgData.heroArr = getLineupHeroArr(human)
  670. InnerMsg.sendMsg(0, msgData)
  671. end
  672. end
  673. -- 活动结束
  674. function Act_End()
  675. local msgData = InnerMsg.lw.LW_BATTLEGROUND_ACT_END
  676. msgData.sourceServerId = Config.SVR_INDEX
  677. InnerMsg.sendMsg(0, msgData)
  678. end
  679. -----------------------------------------------C2N-------------------------------------------------------
  680. -- 跨服返回玩家排名数据
  681. function BG_C2N_PlayerRank_Res(msg)
  682. local human = ObjHuman.onlineUuid[msg.playerUuid]
  683. if not human then
  684. return
  685. end
  686. human.battleGroundRank = msg.playerRank
  687. sendMainPageData(human)
  688. end
  689. -- 跨服返回对手列表数据
  690. function BG_C2N_MatchList_Res(msg)
  691. local human = ObjHuman.onlineUuid[msg.playerUuid]
  692. if not human then
  693. return
  694. end
  695. local msgRet = Msg.gc.GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_MATCHLIST_QUERY
  696. msgRet.myRank = human.battleGroundRank or (ServerCommerceActDefine.COMMERCEACT_NPC_CNT + 1)
  697. msgRet.freeChallengeCnt = 0
  698. msgRet.isGetNew = 0
  699. msgRet.matchList[0] = 0
  700. local battleGroundData = human.db.ServerCommerce and human.db.ServerCommerce.battleGround
  701. local costItem = battleGroundConfig.var[1].cost
  702. Grid.makeItem(msgRet.exchangeCost, costItem[1], costItem[2])
  703. msgRet.freeChallengeCnt = battleGroundData and battleGroundData.freeChallengeCnt or ServerCommerceActDefine.COMMERCEACT_DAILY_FREECHALLENGETIMES
  704. msgRet.isGetNew = battleGroundData and battleGroundData.isHaveNewHero and 1 or 0
  705. msgRet.matchList[0] = #msg.playerInfoList
  706. for i, rankInfo in ipairs(msg.playerInfoList) do
  707. msgRet.matchList[i].rank = rankInfo.rank
  708. msgRet.matchList[i].serverId = rankInfo.serverId and (rankInfo.serverId - ServerCommerceActDefine.BG_SERVERID_START) or 1
  709. msgRet.matchList[i].name = rankInfo.name
  710. msgRet.matchList[i].showBodyId = rankInfo.showBodyId
  711. end
  712. Msg.send(msgRet, human.fd)
  713. end
  714. -- 跨服返回单个对手数据
  715. function BG_C2N_PlayerData_Res(msg)
  716. local human = ObjHuman.onlineUuid[msg.playerUuid]
  717. if not human then
  718. return
  719. end
  720. local playerInfo = msg.playerInfo
  721. local msgRet = Msg.gc.GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_PLAYER_QUERY
  722. msgRet.serverId = playerInfo.serverId and (playerInfo.serverId - ServerCommerceActDefine.BG_SERVERID_START) or 1
  723. msgRet.name = playerInfo.name
  724. msgRet.heroHeadId = playerInfo.heroHeadId
  725. msgRet.heroHeadFrameId = playerInfo.heroHeadFrameId
  726. msgRet.heroArr[0] = 0
  727. msgRet.isQuick = human.db.combatQuick and human.db.combatQuick[CombatDefine.COMBAT_TYPE37] or 0
  728. local heroInfo = {0}
  729. if playerInfo.monsteroutId == 0 then -- 真实玩家
  730. msgRet.heroArr[0] = #playerInfo.heroArr
  731. for i, heroId in ipairs(playerInfo.heroArr) do
  732. local heroConfig = HeroConfig[heroId]
  733. heroInfo[1] = heroId
  734. populateHeroMsg(msgRet.heroArr[i], heroInfo, heroConfig, ServerCommerceActDefine.COMMERCEACT_HERO_LV, ServerCommerceActDefine.COMMERCEACT_HERO_STAR)
  735. end
  736. else
  737. local monsterOutConfig = MonsterExcel.monsterOut[playerInfo.monsteroutId]
  738. msgRet.heroArr[0] = #monsterOutConfig.member
  739. for i, monsterInfo in ipairs(monsterOutConfig.member) do
  740. local monsterID = monsterInfo[1]
  741. local mcf = MonsterExcel.monster[monsterID]
  742. heroInfo[1] = monsterID
  743. populateHeroMsg(msgRet.heroArr[i], heroInfo, mcf, monsterInfo[2], mcf.star)
  744. end
  745. end
  746. Msg.send(msgRet, human.fd)
  747. end
  748. -- 跨服返回排行榜数据
  749. function BG_C2N_RankList_Res(msg)
  750. rankListCache = msg.rankList
  751. lastGetRankListTime = os.time()
  752. local human = ObjHuman.onlineUuid[msg.playerUuid]
  753. if not human then
  754. return
  755. end
  756. sendRankListData(human)
  757. end
  758. -- 跨服返回请求战斗结果
  759. function BG_C2N_Challenge_Res(msg)
  760. local human = ObjHuman.onlineUuid[msg.playerUuid]
  761. if not human then
  762. return
  763. end
  764. if msg.errCode ~= 0 then
  765. return Broadcast.sendErr(human, Lang.BG_MATCHLIST_ERR)
  766. end
  767. local playerUuid = msg.playerInfo.playerUuid
  768. local defServerId = msg.playerInfo.defServerId
  769. human.battleGroundCache = {
  770. defRank = msg.playerInfo.rank
  771. }
  772. if defServerId ~= 0 then -- 真实玩家
  773. local args = {
  774. combatType = CombatDefine.COMBAT_TYPE37,
  775. nServerIndex = defServerId,
  776. param = playerUuid
  777. }
  778. MiddleCommonLogic.MiddleCommonLogic_CombatBegin_LW(human, args)
  779. else
  780. CombatLogic.combatBegin(human, nil, {playerUuid}, CombatDefine.COMBAT_TYPE37)
  781. end
  782. end
  783. -- 跨服通知玩家排名更新
  784. function BG_C2N_RankUpdate(msg)
  785. if msg.updateType == 1 then -- 排名提高
  786. rankImprove(msg)
  787. else
  788. rankReduce(msg)
  789. end
  790. end
  791. -- 跨服通知发奖
  792. function BG_C2N_PrizeAward(msg)
  793. local playerArr = msg.playerArr
  794. if not next(playerArr) then
  795. return
  796. end
  797. local issueRewardQueue = createRewardQueue()
  798. for _, playerInfo in ipairs(playerArr) do
  799. local itemArr = getRankAward(playerInfo[1])
  800. if itemArr then
  801. playerInfo[3] = itemArr
  802. issueRewardQueue:add(playerInfo)
  803. end
  804. end
  805. issueRewardQueue:insertDB()
  806. end
  807. ----------------------------------战斗-----------------------------------
  808. function fight(human, args, combatType)
  809. if combatType ~= CombatDefine.COMBAT_TYPE37 then
  810. return Broadcast.sendErr(human, Lang.BG_COMBAT_TYPE_ERR)
  811. end
  812. local targetRank = tonumber(args[1])
  813. local battleGroundData = human.db.ServerCommerce.battleGround
  814. if not targetRank or not table.find(battleGroundData.matchList, targetRank) then
  815. return Broadcast.sendErr(human, Lang.BG_MATCHLIST_ERR)
  816. end
  817. -- if not battleGroundData.lineUp then
  818. -- return Broadcast.sendErr(human, Lang.SEAL_GROUND_COMBAT_HERO_ERR)
  819. -- end
  820. local heroList = CombatPosLogic.getCombatHeros(human, combatType)
  821. if not next(heroList) then
  822. return Broadcast.sendErr(human, Lang.SEAL_GROUND_COMBAT_HERO_ERR)
  823. end
  824. if battleGroundData.freeChallengeCnt <= 0 then
  825. local costItem = battleGroundConfig.var[1].cost
  826. local itemId, itemNum = costItem[1], costItem[2]
  827. if BagLogic.getItemCnt(human, itemId) < itemNum then
  828. return Broadcast.sendErr(human, Lang.BG_CONDITION_ERR)
  829. end
  830. BagLogic.delItem(human, itemId, itemNum, LOGTYPE)
  831. else
  832. battleGroundData.freeChallengeCnt = battleGroundData.freeChallengeCnt - 1
  833. end
  834. BattleGround_Try_Challenge(human, targetRank)
  835. end
  836. function getCombatMonsterOutID(human, side, args)
  837. if side ~= CombatDefine.DEFEND_SIDE then return end
  838. return args[1]
  839. end
  840. function getCombatObjList(human, side, args, combatType)
  841. if side == CombatDefine.ATTACK_SIDE and not human then return end
  842. if side == CombatDefine.DEFEND_SIDE and human then
  843. return
  844. end
  845. if not human then
  846. local uuid = args[1]
  847. local db = RoleDBLogic.getDb(uuid)
  848. if not db then
  849. return
  850. end
  851. human = {}
  852. human.db = db
  853. end
  854. -- local battleGroundData = human.db.ServerCommerce.battleGround
  855. -- local lineUpData = battleGroundData.lineUp
  856. -- if not lineUpData.heroList or not lineUpData.formation then
  857. -- return
  858. -- end
  859. local heroList, _, formation = CombatPosLogic.getCombatHeros(human, combatType)
  860. if not next(heroList) then
  861. return Broadcast.sendErr(human, Lang.SEAL_GROUND_COMBAT_HERO_ERR)
  862. end
  863. local fakeHuman = { db = {} }
  864. local objList = {}
  865. for i = 1, CombatDefine.COMBAT_HERO_CNT do
  866. local heroUuid = heroList[i]
  867. if heroUuid and heroUuid ~= "" and heroUuid ~= "0" then
  868. local heroInfo = getHeroGridByUuid(human, heroUuid)
  869. if not heroInfo then
  870. return Broadcast.sendErr(human, Lang.SEAL_GROUND_COMBAT_HERO_ERR)
  871. end
  872. objList[i] = CombatLogic.createHeroObj(fakeHuman, heroInfo.id, ServerCommerceActDefine.COMMERCEACT_HERO_LV, ServerCommerceActDefine.COMMERCEACT_HERO_STAR, i)
  873. end
  874. end
  875. local rolebase = CombatLogic.createRoleBaseByDB(human.db)
  876. return objList, nil, rolebase, formation
  877. end
  878. function onFightEnd(human, result, type, cbParam, combatInfo)
  879. local battleGroundCache = human.battleGroundCache
  880. if not battleGroundCache then
  881. return Broadcast.sendErr(human, Lang.DATA_ERR)
  882. end
  883. fightEndHanle(human, result)
  884. end