ServerCommerceActBattleGroundNS.lua 37 KB

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