ServerCommerceActBattleGroundNS.lua 36 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187
  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 rankNoChange(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. local newMatchList = matchListAlgorithm(msg.newRank)
  278. local battleGroundData = human.db.ServerCommerce.battleGround
  279. battleGroundData.matchList = newMatchList
  280. -- 玩家在线
  281. if human.fd then
  282. -- BattleGround_MatchPage_Query(human)
  283. return
  284. end
  285. -- 玩家不在线,则保存数据
  286. ObjHuman.save(human)
  287. end
  288. -- 排名提高
  289. local function rankImprove(msg)
  290. local human = ObjHuman.onlineUuid[msg.playerUuid]
  291. if not human then
  292. local db = RoleDBLogic.getDb(msg.playerUuid)
  293. if not db then
  294. return
  295. end
  296. human = {}
  297. human.db = db
  298. end
  299. human.battleGroundRank = msg.newRank
  300. -- local newMatchList = matchListAlgorithm(human.battleGroundRank)
  301. -- 更新对手列表
  302. local battleGroundData = human.db.ServerCommerce.battleGround
  303. -- battleGroundData.matchList = newMatchList
  304. rankNoChange(msg)
  305. -- 检查是否能解锁新英雄
  306. local idx, unlockHeroInfo = getUnlockHeroInfoByRank(human.battleGroundRank)
  307. if idx ~= battleGroundData.unLockIdx then
  308. unlockHero(human, unlockHeroInfo)
  309. battleGroundData.unLockIdx = idx
  310. battleGroundData.isHaveNewHero = true
  311. end
  312. -- 玩家在线
  313. if human.fd then
  314. -- BattleGround_MatchPage_Query(human)
  315. return
  316. end
  317. -- 玩家不在线,则保存数据
  318. ObjHuman.save(human)
  319. end
  320. -- 排名降低
  321. local function rankReduce(msg)
  322. local human = ObjHuman.onlineUuid[msg.playerUuid]
  323. if not human then
  324. local db = RoleDBLogic.getDb(msg.playerUuid)
  325. if not db then
  326. return
  327. end
  328. human = {}
  329. human.db = db
  330. end
  331. -- 更新对手列表
  332. local battleGroundData = human.db.ServerCommerce.battleGround
  333. battleGroundData.matchList = matchListAlgorithm(msg.newRank)
  334. -- 邮件通知
  335. local varCfg = battleGroundConfig.var[1]
  336. local arg = {msg.atkeServerId - ServerCommerceActDefine.BG_SERVERID_START, msg.atkName, msg.newRank}
  337. rankReduceMail(varCfg.defeatMailId, human.db._id, arg)
  338. -- 玩家在线
  339. if human.fd then
  340. human.battleGroundRank = msg.newRank
  341. return
  342. end
  343. -- 玩家不在线,则保存数据
  344. ObjHuman.save(human)
  345. end
  346. -- 战斗结束处理
  347. local function fightEndHanle(human, result)
  348. local msgData = InnerMsg.lw.LW_BATTLEGROUND_CHALLENGE_END
  349. msgData.sourceServerId = Config.SVR_INDEX
  350. msgData.playerUuid = human.db._id
  351. msgData.atkRank = human.battleGroundRank
  352. msgData.defRank = human.battleGroundCache.defRank
  353. msgData.challengeRes = result
  354. msgData.playerShowData = {}
  355. local varCfg = battleGroundConfig.var[1]
  356. local challengeAward = varCfg.defeatAward
  357. if result == CombatDefine.RESULT_WIN then
  358. -- 更新对手列表
  359. -- local newMatchList = matchListAlgorithm(human.battleGroundRank)
  360. -- local battleGroundData = human.db.ServerCommerce.battleGround
  361. -- battleGroundData.matchList = newMatchList
  362. -- 展示数据
  363. --if human.battleGroundRank <= ServerCommerceActDefine.COMMERCEACT_NPC_CNT then
  364. populatePlayerShowData(human, msgData.playerShowData, human.battleGroundCache.defRank)
  365. --end
  366. -- 挑战奖励
  367. challengeAward = varCfg.winAward
  368. end
  369. -- 发放挑战奖励
  370. local finalAwardArr = {}
  371. for i, itemInfo in ipairs(challengeAward) do
  372. finalAwardArr[i] = {itemInfo[1], itemInfo[2]}
  373. end
  374. BagLogic.addItemList(human, finalAwardArr, LOGTYPE)
  375. -- 通知跨服更新数据
  376. InnerMsg.sendMsg(0, msgData)
  377. end
  378. -- 获取排名奖励
  379. local function getRankAward(rank)
  380. local itemArr
  381. for i, cfg in ipairs(battleGroundConfig.rankAward) do
  382. if rank >= cfg.rankArea[1] and rank <= cfg.rankArea[2] then
  383. itemArr = {}
  384. for k, itemInfo in ipairs(cfg.rankAward) do
  385. itemArr[k] = {itemInfo[1], itemInfo[2]}
  386. end
  387. break
  388. end
  389. end
  390. return itemArr
  391. end
  392. function updateDaily(human)
  393. if not isRunning() then
  394. return
  395. end
  396. if human.db.ServerCommerce and not human.db.ServerCommerce.battleGround then
  397. initData(human)
  398. end
  399. local battleGroundData = human.db.ServerCommerce and human.db.ServerCommerce.battleGround
  400. if not battleGroundData then
  401. return
  402. end
  403. local lastResetTime = battleGroundData.lastResetTime
  404. if not Util.isSameDay(lastResetTime) then
  405. battleGroundData.freeChallengeCnt = ServerCommerceActDefine.COMMERCEACT_DAILY_FREECHALLENGETIMES
  406. battleGroundData.lastResetTime = os.time()
  407. end
  408. end
  409. -- 根据英雄uuid获取英雄信息
  410. function getHeroGridByUuid(human, heroUuid)
  411. if not isRunning() then
  412. return
  413. end
  414. if not human.db.ServerCommerce then
  415. return
  416. end
  417. local battleGroundData = human.db.ServerCommerce.battleGround
  418. if not battleGroundData or not battleGroundData.heroBag then
  419. return
  420. end
  421. local heroGrid
  422. local heroBagData = battleGroundData.heroBag
  423. for bagIdx, heroInfo in ipairs(heroBagData) do
  424. if heroInfo[2] == heroUuid then
  425. heroGrid = {
  426. id = heroInfo[1],
  427. bagIndex = bagIdx,
  428. uuid = heroInfo[2],
  429. zhandouli = 0
  430. }
  431. break
  432. end
  433. end
  434. return heroGrid
  435. end
  436. -- 根据英雄id获取英雄信息
  437. function getHeroGridByheroId(human, heroId)
  438. if not isRunning() then
  439. return
  440. end
  441. if not human.db.ServerCommerce then
  442. return
  443. end
  444. local battleGroundData = human.db.ServerCommerce.battleGround
  445. if not battleGroundData or not battleGroundData.heroBag then
  446. return
  447. end
  448. local heroGrid
  449. local heroBagData = battleGroundData.heroBag
  450. for bagIdx, heroInfo in ipairs(heroBagData) do
  451. if heroInfo[1] == heroId then
  452. heroGrid = {
  453. id = heroInfo[1],
  454. bagIndex = bagIdx,
  455. uuid = heroInfo[2]
  456. }
  457. break
  458. end
  459. end
  460. return heroGrid
  461. end
  462. -- 是否获得英雄
  463. function isGetHero(human, heroId)
  464. return getHeroGridByheroId(human, heroId)
  465. end
  466. -- 阵容有更新
  467. function onUpdatePos(human)
  468. BattleGround_Lineup_Update(human)
  469. end
  470. -- 是否有红点
  471. function isRed(human)
  472. -- 兼容老数据
  473. if human.db.ServerCommerce and not human.db.ServerCommerce.battleGround then
  474. initData(human)
  475. end
  476. if not human.db.ServerCommerce or not human.db.ServerCommerce.battleGround then
  477. return false
  478. end
  479. local battleGroundData = human.db.ServerCommerce.battleGround
  480. if not battleGroundData.freeChallengeCnt or battleGroundData.freeChallengeCnt <= 0 then
  481. return false
  482. end
  483. return true
  484. end
  485. -- 推送主界面信息
  486. local function sendMainPageData(human)
  487. local msgRet = Msg.gc.GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_MAINPAGE_QUERY
  488. msgRet.myRank = human.battleGroundRank or (ServerCommerceActDefine.COMMERCEACT_NPC_CNT + 1)
  489. msgRet.freeChallengeCnt = 0
  490. msgRet.showBodyId = RoleHeadLogic.getRoleAppearance(human, RoleHeadLogic.HEAD_TYPE_3) or 0
  491. local battleGroundData = human.db.ServerCommerce and human.db.ServerCommerce.battleGround
  492. msgRet.freeChallengeCnt = battleGroundData and battleGroundData.freeChallengeCnt or ServerCommerceActDefine.COMMERCEACT_DAILY_FREECHALLENGETIMES
  493. Msg.send(msgRet, human.fd)
  494. end
  495. -- 推送排行榜数据
  496. local function sendRankListData(human)
  497. local msgRet = Msg.gc.GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_RANK_QUERY
  498. msgRet.rankList[0] = 0
  499. msgRet.isEnd = 0
  500. msgRet.myRankInfo.rank = ServerCommerceActDefine.COMMERCEACT_NPC_CNT
  501. msgRet.myRankInfo.serverId = Config.SVR_INDEX - ServerCommerceActDefine.BG_SERVERID_START
  502. msgRet.myRankInfo.name = human.db.name
  503. msgRet.myRankInfo.heroHeadId = RoleHeadLogic.getRoleAppearance(human, RoleHeadLogic.HEAD_TYPE_1) or 0
  504. msgRet.myRankInfo.heroHeadFrameId = RoleHeadLogic.getRoleAppearance(human, RoleHeadLogic.HEAD_TYPE_2) or 0
  505. local msgMaxLen = 20
  506. local len = 0
  507. local rankNum = #rankListCache
  508. for rank, rankInfo in ipairs(rankListCache) do
  509. len = len + 1
  510. msgRet.rankList[0] = len
  511. msgRet.rankList[len].rank = rank
  512. msgRet.rankList[len].serverId = rankInfo.serverId and (rankInfo.serverId - ServerCommerceActDefine.BG_SERVERID_START) or 1
  513. msgRet.rankList[len].name = rankInfo.name
  514. msgRet.rankList[len].heroHeadId = rankInfo.heroHeadId
  515. msgRet.rankList[len].heroHeadFrameId = rankInfo.heroHeadFrameId
  516. if rankInfo.playerUuid == human.db._id then
  517. msgRet.myRankInfo.rank = rank
  518. end
  519. if len >= msgMaxLen then
  520. rankNum = rankNum - len
  521. if rankNum <= 0 then
  522. msgRet.isEnd = 1
  523. return Msg.send(msgRet, human.fd)
  524. end
  525. Msg.send(msgRet, human.fd)
  526. len = 0
  527. end
  528. end
  529. if len > 0 then
  530. msgRet.isEnd = 1
  531. Msg.send(msgRet, human.fd)
  532. end
  533. end
  534. -- 主界面信息查询
  535. function BattleGround_MainPage_Query(human)
  536. if not isRunning() then
  537. return Broadcast.sendErr(human, Lang.ACT_NOT_START)
  538. end
  539. if human.db.ServerCommerce and not human.db.ServerCommerce.battleGround then
  540. initData(human)
  541. end
  542. if not human.battleGroundRank then
  543. local msgData = InnerMsg.lw.LW_BATTLEGROUND_PLAYER_RANK_QUERY
  544. msgData.sourceServerId = Config.SVR_INDEX
  545. msgData.playerUuid = human.db._id
  546. return InnerMsg.sendMsg(0, msgData)
  547. end
  548. sendMainPageData(human)
  549. end
  550. -- 匹配界面信息查询
  551. function BattleGround_MatchPage_Query(human)
  552. if not isRunning() then
  553. return Broadcast.sendErr(human, Lang.ACT_NOT_START)
  554. end
  555. local battleGroundData = human.db.ServerCommerce.battleGround
  556. if not battleGroundData.matchList or not next(battleGroundData.matchList) then
  557. battleGroundData.matchList = matchListAlgorithm(human.battleGroundRank)
  558. end
  559. local msgData = InnerMsg.lw.LW_BATTLEGROUND_MATCHLIST_QUERY
  560. msgData.sourceServerId = Config.SVR_INDEX
  561. msgData.playerUuid = human.db._id
  562. msgData.matchList = {}
  563. for _, rank in ipairs(battleGroundData.matchList) do
  564. msgData.matchList[#msgData.matchList+1] = rank
  565. end
  566. InnerMsg.sendMsg(0, msgData)
  567. end
  568. -- 刷新匹配对手
  569. function BattleGround_Update_MatchList(human)
  570. if not isRunning() then
  571. return Broadcast.sendErr(human, Lang.ACT_NOT_START)
  572. end
  573. if not human.battleGroundRank then
  574. return
  575. end
  576. local battleGroundData = human.db.ServerCommerce.battleGround
  577. battleGroundData.matchList = matchListAlgorithm(human.battleGroundRank)
  578. BattleGround_MatchPage_Query(human)
  579. end
  580. -- 匹配对手查询
  581. function BattleGround_Player_Query(human, targetRank)
  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 not table.find(battleGroundData.matchList, targetRank) then
  587. return Broadcast.sendErr(human, Lang.BG_MATCHLIST_ERR)
  588. end
  589. local msgData = InnerMsg.lw.LW_BATTLEGROUND_PLAYER_DATA_QUERY
  590. msgData.sourceServerId = Config.SVR_INDEX
  591. msgData.playerUuid = human.db._id
  592. msgData.playerRank = targetRank
  593. InnerMsg.sendMsg(0, msgData)
  594. end
  595. -- 请求挑战某个排名玩家
  596. function BattleGround_Try_Challenge(human, targetRank)
  597. local msgData = InnerMsg.lw.LW_BATTLEGROUND_CHALLENGE_QUERY
  598. msgData.sourceServerId = Config.SVR_INDEX
  599. msgData.playerUuid = human.db._id
  600. msgData.rank = targetRank
  601. InnerMsg.sendMsg(0, msgData)
  602. end
  603. -- 一键扫荡
  604. function BattleGround_OneClickSweep(human)
  605. if not isRunning() then
  606. return Broadcast.sendErr(human, Lang.ACT_NOT_START)
  607. end
  608. local battleGroundData = human.db.ServerCommerce.battleGround
  609. if battleGroundData.freeChallengeCnt <= 0 then
  610. return Broadcast.sendErr(human, Lang.BG_FREECNT_NOT_ENOUGH)
  611. end
  612. local winAwardCfg = battleGroundConfig.var[1].winAward
  613. local winAwardArr = {}
  614. for i, itemInfo in ipairs(winAwardCfg) do
  615. winAwardArr[i] = { itemInfo[1], itemInfo[2] * battleGroundData.freeChallengeCnt }
  616. end
  617. battleGroundData.freeChallengeCnt = 0
  618. BattleGround_MatchPage_Query(human)
  619. BagLogic.addItemList(human, winAwardArr, LOGTYPE)
  620. ServerCommerceManager.CommerceAct_SendActInfo(human)
  621. end
  622. -- 英雄背包查询
  623. function BattleGround_HeroBag_Query(human)
  624. if not isRunning() then
  625. return Broadcast.sendErr(human, Lang.ACT_NOT_START)
  626. end
  627. local battleGroundData = human.db.ServerCommerce.battleGround
  628. if not battleGroundData.heroBag then
  629. local idx, unlockHeroInfo = getUnlockHeroInfoByRank(human.battleGroundRank)
  630. if unlockHeroInfo then
  631. unlockHero(human, unlockHeroInfo, true)
  632. battleGroundData.unLockIdx = idx
  633. end
  634. end
  635. -- battleGroundData.isHaveNewHero = false
  636. local msgRet = Msg.gc.GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_HEROBAG_QUERY
  637. msgRet.heroArr[0] = 0
  638. msgRet.isEnd = 0
  639. local len, msgMaxLen = 0, 0
  640. local heroNum = #battleGroundData.heroBag
  641. for heroBagIdx, heroInfo in ipairs(battleGroundData.heroBag) do
  642. len = len + 1
  643. msgRet.heroArr[0] = len
  644. local heroConfig = HeroConfig[heroInfo[1]]
  645. populateHeroMsg(msgRet.heroArr[len], heroInfo, heroConfig, ServerCommerceActDefine.COMMERCEACT_HERO_LV, ServerCommerceActDefine.COMMERCEACT_HERO_STAR, heroBagIdx)
  646. if len >= msgMaxLen then
  647. heroNum = heroNum - len
  648. if heroNum <= 0 then
  649. msgRet.isEnd = 1
  650. return Msg.send(msgRet, human.fd)
  651. end
  652. Msg.send(msgRet, human.fd)
  653. len = 0
  654. end
  655. end
  656. if len > 0 then
  657. msgRet.isEnd = 1
  658. Msg.send(msgRet, human.fd)
  659. end
  660. end
  661. -- 已经知道获得新英雄了
  662. function BattleGround_AlreadyKonw_GetNewHero(human)
  663. if not isRunning() then
  664. return Broadcast.sendErr(human, Lang.ACT_NOT_START)
  665. end
  666. local battleGroundData = human.db.ServerCommerce.battleGround
  667. battleGroundData.isHaveNewHero = false
  668. end
  669. -- 排行榜查询
  670. function BattleGround_RankList_Query(human)
  671. if not isRunning() then
  672. return Broadcast.sendErr(human, Lang.ACT_NOT_START)
  673. end
  674. local now = os.time()
  675. if #rankListCache == 0 or now - lastGetRankListTime >= ServerCommerceActDefine.BG_COMMERCEACT_RANKUPDATE then
  676. local msgData = InnerMsg.lw.LW_BATTLEGROUND_RANKLIST_QUERY
  677. msgData.sourceServerId = Config.SVR_INDEX
  678. msgData.playerUuid = human.db._id
  679. return InnerMsg.sendMsg(0, msgData)
  680. end
  681. sendRankListData(human)
  682. end
  683. -- 排行奖励查询
  684. function BattleGround_RankAward_Query(human)
  685. if not isRunning() then
  686. return Broadcast.sendErr(human, Lang.ACT_NOT_START)
  687. end
  688. local msgRet = Msg.gc.GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_RANKAWARD_QUERY
  689. msgRet.rankAwardList[0] = 0
  690. msgRet.rankAwardList[0] = #battleGroundConfig.rankAward
  691. for i, cfg in ipairs(battleGroundConfig.rankAward) do
  692. msgRet.rankAwardList[i].minRank = cfg.rankArea[1]
  693. msgRet.rankAwardList[i].maxRank = cfg.rankArea[2]
  694. msgRet.rankAwardList[i].rankAward[0] = #cfg.rankAward
  695. for k, itemInfo in ipairs(cfg.rankAward) do
  696. Grid.makeItem(msgRet.rankAwardList[i].rankAward[k], itemInfo[1], itemInfo[2])
  697. end
  698. end
  699. Msg.send(msgRet, human.fd)
  700. end
  701. -- 更新阵容数据
  702. function BattleGround_Lineup_Update(human, msg)
  703. if not isRunning() then
  704. return
  705. end
  706. -- local battleGroundData = human.db.ServerCommerce.battleGround
  707. -- local formation = msg.formation
  708. -- local posList = CombatPosLogic.getPosList(formation)
  709. -- local heroList = Util.split(msg.heroList, ",", true)
  710. -- local reapetTb = {}
  711. -- for i = 1, CombatDefine.COMBAT_HERO_CNT do
  712. -- local heroId = heroList[i]
  713. -- if heroId > 0 then
  714. -- -- 英雄Id检测
  715. -- if HeroConfig[heroId] then
  716. -- return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
  717. -- end
  718. -- -- 英雄背包检测
  719. -- if not battleGroundData.heroBag or not table.find(battleGroundData.heroBag, heroId) then
  720. -- return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
  721. -- end
  722. -- -- 相同英雄检测
  723. -- if reapetTb[heroId] then
  724. -- return Broadcast.sendErr(human, Lang.HERO_SAME)
  725. -- end
  726. -- -- 位置检测
  727. -- if posList[i] == nil and i ~= CombatDefine.COMBAT_HERO_CNT then
  728. -- return Broadcast.sendErr(human, Lang.POS_ERROR)
  729. -- end
  730. -- reapetTb[heroId] = true
  731. -- end
  732. -- end
  733. -- battleGroundData.lineUp = battleGroundData.lineUp or {}
  734. -- battleGroundData.lineUp.formation = formation
  735. -- battleGroundData.lineUp.heroList = heroList
  736. -- 通知跨服更新
  737. if human.battleGroundRank and human.battleGroundRank <= ServerCommerceActDefine.COMMERCEACT_NPC_CNT then
  738. local msgData = InnerMsg.lw.LW_BATTLEGROUND_LINEUP_UPDATE
  739. msgData.sourceServerId = Config.SVR_INDEX
  740. msgData.playerUuid = human.db._id
  741. msgData.heroArr = getLineupHeroArr(human)
  742. InnerMsg.sendMsg(0, msgData)
  743. end
  744. end
  745. -- 活动结束
  746. function Act_End()
  747. local msgData = InnerMsg.lw.LW_BATTLEGROUND_ACT_END
  748. msgData.sourceServerId = Config.SVR_INDEX
  749. InnerMsg.sendMsg(0, msgData)
  750. end
  751. -----------------------------------------------C2N-------------------------------------------------------
  752. -- 跨服返回玩家排名数据
  753. function BG_C2N_PlayerRank_Res(msg)
  754. local human = ObjHuman.onlineUuid[msg.playerUuid]
  755. if not human then
  756. return
  757. end
  758. human.battleGroundRank = msg.playerRank
  759. sendMainPageData(human)
  760. end
  761. -- 跨服返回对手列表数据
  762. function BG_C2N_MatchList_Res(msg)
  763. local human = ObjHuman.onlineUuid[msg.playerUuid]
  764. if not human then
  765. return
  766. end
  767. local msgRet = Msg.gc.GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_MATCHLIST_QUERY
  768. msgRet.myRank = human.battleGroundRank or (ServerCommerceActDefine.COMMERCEACT_NPC_CNT + 1)
  769. msgRet.freeChallengeCnt = 0
  770. msgRet.isGetNew = 0
  771. msgRet.matchList[0] = 0
  772. local battleGroundData = human.db.ServerCommerce and human.db.ServerCommerce.battleGround
  773. local costItem = battleGroundConfig.var[1].cost
  774. Grid.makeItem(msgRet.exchangeCost, costItem[1], costItem[2])
  775. msgRet.freeChallengeCnt = battleGroundData and battleGroundData.freeChallengeCnt or ServerCommerceActDefine.COMMERCEACT_DAILY_FREECHALLENGETIMES
  776. msgRet.isGetNew = battleGroundData and battleGroundData.isHaveNewHero and 1 or 0
  777. msgRet.matchList[0] = #msg.playerInfoList
  778. for i, rankInfo in ipairs(msg.playerInfoList) do
  779. msgRet.matchList[i].rank = rankInfo.rank
  780. msgRet.matchList[i].serverId = rankInfo.serverId and (rankInfo.serverId - ServerCommerceActDefine.BG_SERVERID_START) or 1
  781. msgRet.matchList[i].name = rankInfo.name
  782. msgRet.matchList[i].showBodyId = rankInfo.showBodyId
  783. end
  784. Msg.send(msgRet, human.fd)
  785. end
  786. -- 跨服返回单个对手数据
  787. function BG_C2N_PlayerData_Res(msg)
  788. local human = ObjHuman.onlineUuid[msg.playerUuid]
  789. if not human then
  790. return
  791. end
  792. local playerInfo = msg.playerInfo
  793. local msgRet = Msg.gc.GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_PLAYER_QUERY
  794. msgRet.serverId = playerInfo.serverId and (playerInfo.serverId - ServerCommerceActDefine.BG_SERVERID_START) or 1
  795. msgRet.name = playerInfo.name
  796. msgRet.heroHeadId = playerInfo.heroHeadId
  797. msgRet.heroHeadFrameId = playerInfo.heroHeadFrameId
  798. msgRet.heroArr[0] = 0
  799. msgRet.isQuick = human.db.combatQuick and human.db.combatQuick[CombatDefine.COMBAT_TYPE37] or 0
  800. local heroInfo = {0}
  801. if playerInfo.monsteroutId == 0 then -- 真实玩家
  802. msgRet.heroArr[0] = #playerInfo.heroArr
  803. for i, heroId in ipairs(playerInfo.heroArr) do
  804. local heroConfig = HeroConfig[heroId]
  805. heroInfo[1] = heroId
  806. populateHeroMsg(msgRet.heroArr[i], heroInfo, heroConfig, ServerCommerceActDefine.COMMERCEACT_HERO_LV, ServerCommerceActDefine.COMMERCEACT_HERO_STAR)
  807. end
  808. else
  809. local monsterOutConfig = MonsterExcel.monsterOut[playerInfo.monsteroutId]
  810. msgRet.heroArr[0] = #monsterOutConfig.member
  811. for i, monsterInfo in ipairs(monsterOutConfig.member) do
  812. local monsterID = monsterInfo[1]
  813. local mcf = MonsterExcel.monster[monsterID]
  814. heroInfo[1] = monsterID
  815. populateHeroMsg(msgRet.heroArr[i], heroInfo, mcf, monsterInfo[2], mcf.star)
  816. end
  817. end
  818. Msg.send(msgRet, human.fd)
  819. end
  820. -- 跨服返回排行榜数据
  821. function BG_C2N_RankList_Res(msg)
  822. rankListCache = msg.rankList
  823. lastGetRankListTime = os.time()
  824. local human = ObjHuman.onlineUuid[msg.playerUuid]
  825. if not human then
  826. return
  827. end
  828. sendRankListData(human)
  829. end
  830. -- 跨服返回请求战斗结果
  831. function BG_C2N_Challenge_Res(msg)
  832. local human = ObjHuman.onlineUuid[msg.playerUuid]
  833. if not human then
  834. return
  835. end
  836. if msg.errCode ~= 0 then
  837. return Broadcast.sendErr(human, Lang.BG_MATCHLIST_ERR)
  838. end
  839. local playerUuid = msg.playerInfo.playerUuid
  840. local defServerId = msg.playerInfo.defServerId
  841. human.battleGroundCache = {
  842. defRank = msg.playerInfo.rank
  843. }
  844. if defServerId ~= 0 then -- 真实玩家
  845. local args = {
  846. combatType = CombatDefine.COMBAT_TYPE37,
  847. nServerIndex = defServerId,
  848. param = playerUuid
  849. }
  850. MiddleCommonLogic.MiddleCommonLogic_CombatBegin_LW(human, args)
  851. else
  852. CombatLogic.combatBegin(human, nil, {playerUuid}, CombatDefine.COMBAT_TYPE37)
  853. end
  854. end
  855. -- 跨服通知玩家排名更新
  856. function BG_C2N_RankUpdate(msg)
  857. if msg.updateType == 1 then -- 排名提高
  858. rankImprove(msg)
  859. elseif msg.updateType == 0 then -- 排名没变化
  860. rankNoChange(msg)
  861. else
  862. rankReduce(msg)
  863. end
  864. end
  865. -- 跨服通知发奖
  866. function BG_C2N_PrizeAward(msg)
  867. local playerArr = msg.playerArr
  868. if not next(playerArr) then
  869. return
  870. end
  871. local issueRewardQueue = createRewardQueue()
  872. for _, playerInfo in ipairs(playerArr) do
  873. local itemArr = getRankAward(playerInfo[1])
  874. if itemArr then
  875. playerInfo[3] = itemArr
  876. issueRewardQueue:add(playerInfo)
  877. end
  878. end
  879. issueRewardQueue:insertDB()
  880. end
  881. ----------------------------------战斗-----------------------------------
  882. function fight(human, args, combatType)
  883. if combatType ~= CombatDefine.COMBAT_TYPE37 then
  884. return Broadcast.sendErr(human, Lang.BG_COMBAT_TYPE_ERR)
  885. end
  886. local targetRank = tonumber(args[1])
  887. local battleGroundData = human.db.ServerCommerce.battleGround
  888. if not targetRank or not table.find(battleGroundData.matchList, targetRank) then
  889. return Broadcast.sendErr(human, Lang.BG_MATCHLIST_ERR)
  890. end
  891. -- if not battleGroundData.lineUp then
  892. -- return Broadcast.sendErr(human, Lang.SEAL_GROUND_COMBAT_HERO_ERR)
  893. -- end
  894. local heroList = CombatPosLogic.getCombatHeros(human, combatType)
  895. if not next(heroList) then
  896. return Broadcast.sendErr(human, Lang.SEAL_GROUND_COMBAT_HERO_ERR)
  897. end
  898. if battleGroundData.freeChallengeCnt <= 0 then
  899. local costItem = battleGroundConfig.var[1].cost
  900. local itemId, itemNum = costItem[1], costItem[2]
  901. if BagLogic.getItemCnt(human, itemId) < itemNum then
  902. return Broadcast.sendErr(human, Lang.BG_CONDITION_ERR)
  903. end
  904. BagLogic.delItem(human, itemId, itemNum, LOGTYPE)
  905. else
  906. battleGroundData.freeChallengeCnt = battleGroundData.freeChallengeCnt - 1
  907. if battleGroundData.freeChallengeCnt <= 0 then
  908. ServerCommerceManager.CommerceAct_SendActInfo(human)
  909. end
  910. end
  911. BattleGround_Try_Challenge(human, targetRank)
  912. end
  913. function getCombatMonsterOutID(human, side, args)
  914. if side ~= CombatDefine.DEFEND_SIDE then return end
  915. return args[1]
  916. end
  917. function getCombatObjList(human, side, args, combatType)
  918. if side == CombatDefine.ATTACK_SIDE and not human then return end
  919. if side == CombatDefine.DEFEND_SIDE and human then
  920. return
  921. end
  922. if not human then
  923. local uuid = args[1]
  924. local db = RoleDBLogic.getDb(uuid)
  925. if not db then
  926. return
  927. end
  928. human = {}
  929. human.db = db
  930. end
  931. -- local battleGroundData = human.db.ServerCommerce.battleGround
  932. -- local lineUpData = battleGroundData.lineUp
  933. -- if not lineUpData.heroList or not lineUpData.formation then
  934. -- return
  935. -- end
  936. local heroList, _, formation = CombatPosLogic.getCombatHeros(human, combatType)
  937. if not next(heroList) then
  938. return Broadcast.sendErr(human, Lang.SEAL_GROUND_COMBAT_HERO_ERR)
  939. end
  940. local heroLv = ServerCommerceActDefine.COMMERCEACT_HERO_LV
  941. local heroStar = ServerCommerceActDefine.COMMERCEACT_HERO_STAR
  942. local attrsChange = {
  943. [RoleDefine.ATK] = 2,
  944. [RoleDefine.HP] = 2,
  945. [RoleDefine.BAOJI] = 1.7,
  946. [RoleDefine.HURT_RATE] = 2,
  947. }
  948. local fakeHuman = { db = {} }
  949. local objList = {}
  950. for i = 1, CombatDefine.COMBAT_HERO_CNT do
  951. local heroUuid = heroList[i]
  952. if heroUuid and heroUuid ~= "" and heroUuid ~= "0" then
  953. local heroInfo = getHeroGridByUuid(human, heroUuid)
  954. if not heroInfo then
  955. return Broadcast.sendErr(human, Lang.SEAL_GROUND_COMBAT_HERO_ERR)
  956. end
  957. objList[i] = CombatLogic.createHeroObj(fakeHuman, heroInfo.id, heroLv, heroStar, i, nil, attrsChange)
  958. end
  959. end
  960. local rolebase = CombatLogic.createRoleBaseByDB(human.db)
  961. return objList, nil, rolebase, formation
  962. end
  963. function onFightEnd(human, result, type, cbParam, combatInfo)
  964. local battleGroundCache = human.battleGroundCache
  965. if not battleGroundCache then
  966. return Broadcast.sendErr(human, Lang.DATA_ERR)
  967. end
  968. fightEndHanle(human, result)
  969. end