ServerCommerceActBattleGroundNS.lua 35 KB

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