ServerCommerceActBattleGroundNS.lua 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081
  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. battleGroundData.isHaveNewHero = false
  572. local msgRet = Msg.gc.GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_HEROBAG_QUERY
  573. msgRet.heroArr[0] = 0
  574. msgRet.isEnd = 0
  575. local len, msgMaxLen = 0, 0
  576. local heroNum = #battleGroundData.heroBag
  577. for heroBagIdx, heroInfo in ipairs(battleGroundData.heroBag) do
  578. len = len + 1
  579. msgRet.heroArr[0] = len
  580. local heroConfig = HeroConfig[heroInfo[1]]
  581. populateHeroMsg(msgRet.heroArr[len], heroInfo, heroConfig, ServerCommerceActDefine.COMMERCEACT_HERO_LV, ServerCommerceActDefine.COMMERCEACT_HERO_STAR, heroBagIdx)
  582. if len >= msgMaxLen then
  583. heroNum = heroNum - len
  584. if heroNum <= 0 then
  585. msgRet.isEnd = 1
  586. return Msg.send(msgRet, human.fd)
  587. end
  588. Msg.send(msgRet, human.fd)
  589. len = 0
  590. end
  591. end
  592. if len > 0 then
  593. msgRet.isEnd = 1
  594. Msg.send(msgRet, human.fd)
  595. end
  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. ServerCommerceManager.CommerceAct_SendActInfo(human)
  834. end
  835. BattleGround_Try_Challenge(human, targetRank)
  836. end
  837. function getCombatMonsterOutID(human, side, args)
  838. if side ~= CombatDefine.DEFEND_SIDE then return end
  839. return args[1]
  840. end
  841. function getCombatObjList(human, side, args, combatType)
  842. if side == CombatDefine.ATTACK_SIDE and not human then return end
  843. if side == CombatDefine.DEFEND_SIDE and human then
  844. return
  845. end
  846. if not human then
  847. local uuid = args[1]
  848. local db = RoleDBLogic.getDb(uuid)
  849. if not db then
  850. return
  851. end
  852. human = {}
  853. human.db = db
  854. end
  855. -- local battleGroundData = human.db.ServerCommerce.battleGround
  856. -- local lineUpData = battleGroundData.lineUp
  857. -- if not lineUpData.heroList or not lineUpData.formation then
  858. -- return
  859. -- end
  860. local heroList, _, formation = CombatPosLogic.getCombatHeros(human, combatType)
  861. if not next(heroList) then
  862. return Broadcast.sendErr(human, Lang.SEAL_GROUND_COMBAT_HERO_ERR)
  863. end
  864. local fakeHuman = { db = {} }
  865. local objList = {}
  866. for i = 1, CombatDefine.COMBAT_HERO_CNT do
  867. local heroUuid = heroList[i]
  868. if heroUuid and heroUuid ~= "" and heroUuid ~= "0" then
  869. local heroInfo = getHeroGridByUuid(human, heroUuid)
  870. if not heroInfo then
  871. return Broadcast.sendErr(human, Lang.SEAL_GROUND_COMBAT_HERO_ERR)
  872. end
  873. objList[i] = CombatLogic.createHeroObj(fakeHuman, heroInfo.id, ServerCommerceActDefine.COMMERCEACT_HERO_LV, ServerCommerceActDefine.COMMERCEACT_HERO_STAR, i)
  874. end
  875. end
  876. local rolebase = CombatLogic.createRoleBaseByDB(human.db)
  877. return objList, nil, rolebase, formation
  878. end
  879. function onFightEnd(human, result, type, cbParam, combatInfo)
  880. local battleGroundCache = human.battleGroundCache
  881. if not battleGroundCache then
  882. return Broadcast.sendErr(human, Lang.DATA_ERR)
  883. end
  884. fightEndHanle(human, result)
  885. end