GodsAreaNS.lua 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865
  1. -- 诸神圣域(普通服)
  2. -- 玩法: 开服>=29天, 角色等级>=100级即可参与。一共49个排名,初始时全部为机器人,玩家挑战成功可占领位置,并获得对应排名的称号。
  3. -- 玩家没上榜,可以挑战榜上任何排名,玩家上榜后,只能挑战比玩家高的排名。
  4. local Config = require("Config")
  5. local MonsterExcel = require("excel.monster")
  6. local MailExcel = require("excel.mail")
  7. local RoleExcel = require("excel.role")
  8. local Lang = require("common.Lang")
  9. local Util = require("common.Util")
  10. local Msg = require("core.Msg")
  11. local HeroGrid = require("hero.HeroGrid")
  12. local InnerMsg = require("core.InnerMsg")
  13. local ObjHuman = require("core.ObjHuman")
  14. local Broadcast = require("broadcast.Broadcast")
  15. local CombatLogic = require("combat.CombatLogic")
  16. local CombatDefine = require("combat.CombatDefine")
  17. local CombatPosLogic = require("combat.CombatPosLogic")
  18. local CombatVideo = require("combat.CombatVideo")
  19. local RoleDefine = require("role.RoleDefine")
  20. local RoleLogic = require("role.RoleLogic")
  21. local RoleHeadLogic = require("role.RoleHeadLogic")
  22. local RoleAttr = require("role.RoleAttr")
  23. local RoleDBLogic = require("role.RoleDBLogic")
  24. local MailManager = require("mail.MailManager")
  25. local RoleSystemLogic = require("roleSystem.RoleSystemLogic")
  26. local RoleSystemDefine = require("roleSystem.RoleSystemDefine")
  27. local GodsAreaConfig = require("excel.godsArea")
  28. local MiddleCommonLogic = require("middle.MiddleCommonLogic")
  29. local HeroExcel = require("excel.hero")
  30. local Log = require("common.Log")
  31. local Timer = require("core.Timer")
  32. local CommonDB = require("common.CommonDB")
  33. local RoleSystemExcel = require("excel.roleSystem")
  34. local Grid = require("bag.Grid")
  35. local MonsterGrid = require("monster.MonsterGrid")
  36. -- 战败通知邮件Id
  37. local DEFAULT_MIAL_ID = 7021
  38. -- 发奖励通知邮件Id
  39. local REWARD_MAIL_ID = 7020
  40. local REWARD_MAIL_ID2 = 7022
  41. local FAIL_TAG = "fail"
  42. local SUCC_TAG = "succ"
  43. local MONSTER_SRV_NAME = "1服"
  44. local SRV_BASE_NUM = 810537
  45. MailQueue = {
  46. uidArray = {},
  47. insertMaxNum = 100, -- 一次最多插入数据库的邮件数量
  48. repeatMaxTimes = 3, -- 第一次失败后重试次数
  49. repeatTb = {}
  50. }
  51. local function checkLv(nowLv)
  52. local ctrlCfg = RoleSystemExcel.roleSystem[RoleSystemDefine.ROLE_SYS_ID_1305]
  53. if ctrlCfg.lv > nowLv then
  54. return false
  55. end
  56. return true
  57. end
  58. local function checkSvrOpenDays()
  59. local openDay = CommonDB.getServerOpenDay()
  60. local ctrlCfg = RoleSystemExcel.roleSystem[RoleSystemDefine.ROLE_SYS_ID_1305]
  61. if ctrlCfg.openSvrDay > openDay then
  62. return false
  63. end
  64. return true
  65. end
  66. -- 单个英雄数据
  67. local function getHeroInfo(human, targetHeroUuid)
  68. local HeroLogic = require("hero.HeroLogic")
  69. local heroGrid = HeroLogic.getHeroGridByUuid(human, targetHeroUuid)
  70. if heroGrid then
  71. local heroCfg = HeroExcel.hero[heroGrid.id]
  72. local heroInfo = {
  73. heroUuid = targetHeroUuid,
  74. heroStar = heroGrid.star,
  75. heroLevel = heroGrid.lv,
  76. heroCamp = heroGrid.camp or heroCfg.camp,
  77. heroBody = heroCfg.body
  78. }
  79. return heroInfo
  80. end
  81. end
  82. -- 获取上阵英雄数据
  83. local function getHeroListInfo(human, targetHeroUuid)
  84. local len = 0
  85. local heroArr = {}
  86. local heroList = CombatPosLogic.getCombatHeros(human, CombatDefine.COMBAT_TYPE32)
  87. if not next(heroList) then
  88. heroList = CombatPosLogic.getCombatHeros(human, CombatDefine.COMBAT_TYPE1)
  89. end
  90. for _, heroUuid in pairs(heroList) do
  91. if not targetHeroUuid or targetHeroUuid == heroUuid then
  92. len = len + 1
  93. heroArr[len] = getHeroInfo(human, heroUuid)
  94. end
  95. end
  96. if len == 0 then
  97. return
  98. end
  99. return heroArr
  100. end
  101. -- 生成展示数据
  102. local function generateShowInfo(human)
  103. local showInfo = {
  104. name = human.db.name,
  105. level = human.db.lv,
  106. uid = human.db._id,
  107. serverId = Config.SVR_INDEX,
  108. power = human.db.zhandouli,
  109. }
  110. showInfo.head = RoleHeadLogic.getRoleAppearance(human, RoleHeadLogic.HEAD_TYPE_1)
  111. showInfo.headFrame = RoleHeadLogic.getRoleAppearance(human, RoleHeadLogic.HEAD_TYPE_2)
  112. showInfo.body = RoleHeadLogic.getRoleAppearance(human, RoleHeadLogic.HEAD_TYPE_3)
  113. showInfo.heroList = getHeroListInfo(human)
  114. return showInfo
  115. end
  116. local function calcMOnsterPower(monsterOutID)
  117. local power = 0
  118. local objList = MonsterGrid.createMonsterObjListByMonsterOutID(monsterOutID)
  119. if not objList then
  120. return power
  121. end
  122. for _, monster in ipairs(objList) do
  123. power = power + (monster.power or 0)
  124. end
  125. return power
  126. end
  127. local function getPlayerSrvIdx(human)
  128. local newUniqueTag = human.db.newUniqueTag
  129. local tbl = Util.split(newUniqueTag, "|")
  130. return tbl[2]
  131. end
  132. local function getRankReward(rank)
  133. local rewardCfg = GodsAreaConfig.reward
  134. if not rank then
  135. return rewardCfg[#rewardCfg].awardList
  136. end
  137. for k,v in ipairs(GodsAreaConfig.reward) do
  138. if rank >= v.rankArea[1] and rank <= v.rankArea[2] then
  139. return v.awardList
  140. end
  141. end
  142. end
  143. local function getCorrectUuidArray(uid2RankTb)
  144. local DataCache = require("core.DataCache")
  145. local playerUidList = DataCache.Get_PlayerUuidList()
  146. local len = 0
  147. local uidArray = {}
  148. for uid, rank in pairs(uid2RankTb or {}) do
  149. len = len + 1
  150. uidArray[len] = {uid, rank}
  151. end
  152. for uid, lv in pairs(playerUidList or {}) do
  153. if not uid2RankTb or not uid2RankTb[uid] then
  154. if checkLv(lv) then
  155. len = len + 1
  156. uidArray[len] = {uid}
  157. end
  158. end
  159. end
  160. if len == 0 then
  161. return
  162. end
  163. return uidArray
  164. end
  165. local function writeLog(logStr)
  166. Log.write(Log.LOGID_OSS_GODSAREA_MAIL, logStr)
  167. end
  168. local function sendMail(mailId, receiverUuid, itemArray, arg)
  169. if not mailId or not receiverUuid then
  170. return
  171. end
  172. local mailCfg = MailExcel.mail[mailId]
  173. local content = mailCfg.content
  174. if arg then
  175. content = Util.format(content, arg)
  176. end
  177. MailManager.add(MailManager.SYSTEM, receiverUuid, mailCfg.title, content, itemArray, mailCfg.senderName or "GM")
  178. end
  179. -- local function timed_clear_videoCache(playerUid)
  180. -- local human = ObjHuman.onlineUuid[playerUid]
  181. -- if not human then
  182. -- return
  183. -- end
  184. -- human.GodsAreaVideoArray = nil
  185. -- end
  186. -- GM,清理所有诸神圣域的称号
  187. function GM_ClearChenghao(human)
  188. for _, rankCfg in ipairs(GodsAreaConfig.rankList) do
  189. RoleHeadLogic.unActive(human.db._id, RoleHeadLogic.HEAD_TYPE_4, rankCfg.chenghaoID)
  190. end
  191. end
  192. function isOpen(human)
  193. return RoleSystemLogic.isOpen(human, RoleSystemDefine.ROLE_SYS_ID_1305)
  194. end
  195. -- 获取角色身上属于本系统功能特有的称号ID
  196. function GetPlayingMethonChenghao(human)
  197. local chenghaoList = RoleHeadLogic.GetRoleAdornInfo(human, RoleHeadLogic.HEAD_TYPE_4)
  198. if not chenghaoList then
  199. return
  200. end
  201. for _, rankCfg in ipairs(GodsAreaConfig.rankList) do
  202. if chenghaoList[rankCfg.chenghaoID] then
  203. return rankCfg.chenghaoID
  204. end
  205. end
  206. end
  207. -- 玩家更新展示信息
  208. -- showType: 1-改名, 2-升级 3-头像, 4-头像框,5-形象
  209. function UpdateShowData(human, showType)
  210. if not isOpen(human) then
  211. return
  212. end
  213. if not GetPlayingMethonChenghao(human) then
  214. return
  215. end
  216. if showType < 1 or showType > 5 then
  217. return
  218. end
  219. local playerInfo = {}
  220. if showType == 1 then
  221. playerInfo.name = human.db.name
  222. elseif showType == 2 then
  223. playerInfo.level = human.db.lv
  224. elseif showType == 3 then
  225. playerInfo.head = RoleHeadLogic.getRoleAppearance(human, RoleHeadLogic.HEAD_TYPE_1)
  226. elseif showType == 4 then
  227. playerInfo.headFrame = RoleHeadLogic.getRoleAppearance(human, RoleHeadLogic.HEAD_TYPE_2)
  228. elseif showType == 5 then
  229. playerInfo.body = RoleHeadLogic.getRoleAppearance(human, RoleHeadLogic.HEAD_TYPE_3)
  230. end
  231. UpdatePlayerBaseInfo(human, playerInfo)
  232. end
  233. -- 更新玩家英雄数据
  234. -- 参数heroUuid, opType 都没有时标识更新全部英雄数据
  235. -- opType: 操作类型, 0-删除, 1-更新单个英雄数据, 2- 更新所有英雄数据
  236. function UpdateHeroData(human, heroUuid, opType)
  237. if not isOpen(human) then
  238. return
  239. end
  240. if not GetPlayingMethonChenghao(human) then
  241. return
  242. end
  243. local heroInfoList = {opType = 1}
  244. if opType and opType == 0 then
  245. heroInfoList.opType = 0
  246. heroInfoList.removeHeroUuid = heroUuid
  247. else
  248. if not opType and not heroUuid then
  249. heroInfoList.opType = 2
  250. end
  251. heroInfoList.heroList = getHeroListInfo(human, heroUuid)
  252. if not heroInfoList.heroList then
  253. return
  254. end
  255. end
  256. UpdatePlayerHeroInfo(human, heroInfoList)
  257. end
  258. function MailQueue:add(playerInfo)
  259. table.insert(self.uidArray, playerInfo)
  260. end
  261. function MailQueue:clear()
  262. Util.cleanTable(self.uidArray)
  263. Util.cleanTable(self.repeatTb)
  264. end
  265. function MailQueue:insertDB()
  266. local defaultRank = 999
  267. local maxNum = math.min(self.insertMaxNum, #self.uidArray)
  268. local defaultAward = getRankReward(defaultRank)
  269. for i=1, maxNum do
  270. local resTag = SUCC_TAG
  271. local playerInfo = table.remove(self.uidArray)
  272. local uid = playerInfo[1]
  273. local rank = playerInfo[2]
  274. local awardArray = defaultAward
  275. local mailId = REWARD_MAIL_ID2
  276. if rank then
  277. mailId = REWARD_MAIL_ID
  278. awardArray = getRankReward(rank)
  279. end
  280. local ok, err = pcall(sendMail, mailId, uid, awardArray, rank)
  281. if not ok then
  282. if not self.repeatTb[uid] or self.repeatTb[uid] < self.repeatMaxTimes then -- 插入失败后,最多重新插入3次
  283. MailQueue:add(playerInfo)
  284. self.repeatTb[uid] = (self.repeatTb[uid] or 0) + 1
  285. end
  286. resTag = FAIL_TAG
  287. end
  288. local str = string.format("发放奖励结果: %s, 玩家uid: %s, 排名: %d, 失败次数: %d, errInfo: %s",
  289. resTag, uid, rank or defaultRank, self.repeatTb[uid] or 0, err)
  290. writeLog(str)
  291. end
  292. if #self.uidArray > 0 then
  293. Timer.addLater(3, MailQueue.insertDB, MailQueue)
  294. end
  295. end
  296. -- 查询排行榜信息
  297. function Query_RankList(human)
  298. if not isOpen(human) then
  299. return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  300. end
  301. local msgData = InnerMsg.lw.LW_GODSATREA_QUERY_RANKLIST
  302. msgData.playerUid = human.db._id
  303. msgData.sourceServerId = Config.SVR_INDEX
  304. InnerMsg.sendMsg(0, msgData)
  305. end
  306. -- 查看某个玩家具体信息
  307. function Query_PlayerInfo(human, targetRank, targetUid)
  308. if not isOpen(human) then
  309. return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  310. end
  311. if targetRank <= 0 or targetRank > #GodsAreaConfig.rankList then
  312. return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
  313. end
  314. local msgData = InnerMsg.lw.LW_GODSATREA_QUERY_PLAYER_INFO
  315. msgData.sourceServerId = Config.SVR_INDEX
  316. msgData.targetRank = targetRank
  317. msgData.targetUid = targetUid
  318. msgData.playerUid = human.db._id
  319. InnerMsg.sendMsg(0, msgData)
  320. end
  321. -- 向跨服查询能否挑战某个排名
  322. function Query_Challenge(human, defenseRank, defenseUid)
  323. if defenseRank <= 0 or defenseRank > #GodsAreaConfig.rankList then
  324. return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
  325. end
  326. local msgData = InnerMsg.lw.LW_GODSATREA_CHALLENGE_QUERY
  327. msgData.sourceServerId = Config.SVR_INDEX
  328. msgData.defenseRank = defenseRank
  329. msgData.defenseUid = defenseUid
  330. msgData.attackerUid = human.db._id
  331. InnerMsg.sendMsg(0, msgData)
  332. end
  333. -- 通知跨服,挑战胜利
  334. function Challenge_Win(human)
  335. local challengeInfo = human.godsArea_CombatInfo
  336. local msgData = InnerMsg.lw.LW_GODSATREA_WIN
  337. msgData.sourceServerId = Config.SVR_INDEX
  338. msgData.defenseRank = challengeInfo.defenseRank
  339. msgData.defenseUid = challengeInfo.defenseUid
  340. msgData.attackerUid = human.db._id
  341. msgData.attackInfo = {}
  342. local chenghaoId = GetPlayingMethonChenghao(human)
  343. if not chenghaoId then -- 没有排名时挑战成功, 则把展示数据发给跨服。如果有时许问题,则每次挑战都发给跨服
  344. msgData.attackInfo = generateShowInfo(human)
  345. end
  346. InnerMsg.sendMsg(0, msgData)
  347. end
  348. -- 查看某个名次的战斗录像
  349. function Query_CombatVideo(human, targetRank)
  350. if not isOpen(human) then
  351. return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  352. end
  353. if targetRank <= 0 or targetRank > #GodsAreaConfig.rankList then
  354. return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
  355. end
  356. local msgData = InnerMsg.lw.LW_GODSATREA_QUERY_RANK_VIDEO
  357. msgData.playerUid = human.db._id
  358. msgData.targetRank = targetRank
  359. msgData.sourceServerId = Config.SVR_INDEX
  360. InnerMsg.sendMsg(0, msgData)
  361. end
  362. -- 通知跨服, 更新玩家角色数据
  363. function UpdatePlayerBaseInfo(human, newPlayerInfo)
  364. local msgData = InnerMsg.lw.LW_GODSATREA_UPDATE_PLAYER_BASE_INFO
  365. msgData.playerUid = human.db._id
  366. msgData.playerInfo = newPlayerInfo or {}
  367. InnerMsg.sendMsg(0, msgData)
  368. end
  369. -- 通知跨服, 更新玩家英雄数据
  370. function UpdatePlayerHeroInfo(human, newPlayerInfo)
  371. local msgData = InnerMsg.lw.LW_GODSATREA_UPDATE_PLAYER_HERO_INFO
  372. msgData.playerUid = human.db._id
  373. msgData.power = human.db.zhandouli
  374. msgData.heroInfo = newPlayerInfo or {}
  375. InnerMsg.sendMsg(0, msgData)
  376. end
  377. -- 客户端请求排行榜奖励
  378. function Query_RankReward(human)
  379. local msgRet = Msg.gc.GC_GODSAREA_GET_RANK_REWARD
  380. local rewardList = msgRet.rewardList
  381. rewardList[0] = 0
  382. for k,v in ipairs(GodsAreaConfig.reward) do
  383. rewardList[0] = k
  384. rewardList[k].rankLeft = v.rankArea[1]
  385. rewardList[k].rankRight = v.rankArea[2]
  386. local itemList = rewardList[k].itemList
  387. itemList[0] = 0
  388. for idx, itemCfg in ipairs(v.awardList) do
  389. itemList[0] = idx
  390. Grid.makeItem(itemList[idx], itemCfg[1], itemCfg[2])
  391. end
  392. end
  393. Msg.send(msgRet, human.fd)
  394. end
  395. -- 收到跨服发送的排行数据
  396. function NS_Send_RankList(playerUid, myRank, rankList)
  397. local human = ObjHuman.onlineUuid[playerUid]
  398. if not human then
  399. return
  400. end
  401. local srvIdx = getPlayerSrvIdx(human)
  402. local msgRet = Msg.gc.GC_GODSAREA_QUERY_RANKLIST
  403. msgRet.myRank.body = RoleHeadLogic.getRoleAppearance(human, RoleHeadLogic.HEAD_TYPE_3)
  404. msgRet.myRank.name = human.db.name
  405. msgRet.myRank.uid = playerUid
  406. msgRet.myRank.rank = myRank
  407. msgRet.myRank.power = human.db.zhandouli or 0
  408. msgRet.myRank.serverName = srvIdx .. "服"
  409. msgRet.myRank.head = RoleHeadLogic.getRoleAppearance(human, RoleHeadLogic.HEAD_TYPE_1)
  410. msgRet.myRank.headFrame = RoleHeadLogic.getRoleAppearance(human, RoleHeadLogic.HEAD_TYPE_2)
  411. msgRet.attrs[0] = 0
  412. if myRank ~= 0 then
  413. local rankCfg = GodsAreaConfig.rankList[myRank]
  414. local chenghaoCfg = RoleExcel.chenghao[rankCfg.chenghaoID]
  415. for k, v in ipairs(chenghaoCfg.attrs) do
  416. msgRet.attrs[0] = k
  417. msgRet.attrs[k].key = v[1]
  418. msgRet.attrs[k].value = v[2]
  419. end
  420. end
  421. local msgRankList = msgRet.rankList
  422. msgRankList[0] = 0
  423. for rank, playerInfo in ipairs(rankList) do
  424. msgRankList[0] = rank
  425. msgRankList[rank].body = playerInfo.body
  426. msgRankList[rank].name = playerInfo.name
  427. msgRankList[rank].rank = rank
  428. msgRankList[rank].head = playerInfo.head
  429. msgRankList[rank].headFrame = playerInfo.headFrame
  430. if playerInfo.uid then -- 真实玩家
  431. msgRankList[rank].uid = playerInfo.uid
  432. msgRankList[rank].power = playerInfo.power or 999999
  433. local playerServerIdx = math.max((playerInfo.serverId or 0) - SRV_BASE_NUM, 1)
  434. msgRankList[rank].serverName = playerServerIdx .. "服"
  435. else
  436. local npcCfg = GodsAreaConfig.rankList[rank]
  437. local monsterOutID = npcCfg.monsterOutID
  438. msgRankList[rank].uid = tostring(monsterOutID)
  439. msgRankList[rank].power = calcMOnsterPower(monsterOutID)
  440. msgRankList[rank].serverName = MONSTER_SRV_NAME
  441. end
  442. end
  443. Msg.send(msgRet, human.fd)
  444. end
  445. -- 收到跨服发送的玩家数据
  446. function NS_Send_PlayerInfo(playerUid, res, playerInfo)
  447. local human = ObjHuman.onlineUuid[playerUid]
  448. if not human then
  449. return
  450. end
  451. if res == -1 then
  452. return Broadcast.sendErr(human, Lang.DATA_ERR)
  453. end
  454. if res == -2 then
  455. return Broadcast.sendErr(human, Lang.DATA_OLD)
  456. end
  457. local msgRet = Msg.gc.GC_GODSAREA_GET_PLAYER_INFO
  458. msgRet.name = playerInfo.name
  459. msgRet.lv = playerInfo.lv
  460. msgRet.head = playerInfo.head
  461. msgRet.headFrame = playerInfo.headFrame
  462. local rankCfg = GodsAreaConfig.rankList[playerInfo.rank]
  463. local chenghaoCfg = RoleExcel.chenghao[rankCfg.chenghaoID]
  464. msgRet.attrs[0] = 0
  465. for k, v in ipairs(chenghaoCfg.attrs) do
  466. msgRet.attrs[0] = k
  467. msgRet.attrs[k].key = v[1]
  468. msgRet.attrs[k].value = v[2]
  469. end
  470. local len = 0
  471. msgRet.defendObjList[0] = 0
  472. if playerInfo.defendObjList then
  473. for idx, heroInfo in pairs(playerInfo.defendObjList) do
  474. len = len + 1
  475. msgRet.defendObjList[len].body = heroInfo.heroBody or 0
  476. msgRet.defendObjList[len].camp = heroInfo.heroCamp or 0
  477. msgRet.defendObjList[len].lv = heroInfo.heroLevel or 0
  478. msgRet.defendObjList[len].star = heroInfo.heroStar or 0
  479. end
  480. msgRet.defendObjList[0] = len
  481. else
  482. local monsterOutConfig = MonsterExcel.monsterOut[rankCfg.monsterOutID]
  483. for idx, monsterInfo in ipairs(monsterOutConfig.member) do
  484. msgRet.defendObjList[0] = idx
  485. local monsterID = monsterInfo[1]
  486. local mcf = MonsterExcel.monster[monsterID]
  487. msgRet.defendObjList[idx].body = mcf.body
  488. msgRet.defendObjList[idx].camp = mcf.camp
  489. msgRet.defendObjList[idx].lv = monsterInfo[2]
  490. msgRet.defendObjList[idx].star = mcf.star
  491. end
  492. end
  493. msgRet.rank = playerInfo.rank
  494. msgRet.uid = playerInfo.uid or tostring(rankCfg.monsterOutID)
  495. Msg.send(msgRet, human.fd)
  496. end
  497. -- 跨服通知能否挑战的结果
  498. function Query_Challenge_Result(playerUid, res, defenseServerId, defenseRank, defenseUid, defenseName)
  499. local human = ObjHuman.onlineUuid[playerUid]
  500. if not human then
  501. return
  502. end
  503. if res == -1 then
  504. return Broadcast.sendErr(human, Lang.DATA_ERR)
  505. end
  506. if res == -2 then
  507. return Broadcast.sendErr(human, Lang.DATA_OLD)
  508. end
  509. if res == -3 then
  510. return Broadcast.sendErr(human, Lang.CHALLENGE_STRONG_ONE)
  511. end
  512. if res == 1 then
  513. Broadcast.sendErr(human, Lang.CHALLENGING_SELF)
  514. end
  515. if res == 2 then
  516. Broadcast.sendErr(human, Lang.CHALLENGING_TARGET)
  517. end
  518. human.godsArea_CombatInfo = {
  519. defenseRank = defenseRank,
  520. defenseUid = defenseUid,
  521. defenseName = defenseName,
  522. }
  523. if tonumber(defenseUid) then -- 被挑战方是机器人
  524. CombatLogic.combatBegin(human, nil, {human.db._id, defenseRank }, CombatDefine.COMBAT_TYPE32)
  525. else
  526. local msg = {
  527. combatType = CombatDefine.COMBAT_TYPE32,
  528. nServerIndex = defenseServerId,
  529. param = defenseUid
  530. }
  531. MiddleCommonLogic.MiddleCommonLogic_CombatBegin_LW(human, msg)
  532. end
  533. end
  534. -- 收到跨服通知, 更换新的称号
  535. function NS_Change_Chenghao(playerUid, newRank, isWinner, enemyName)
  536. local human = ObjHuman.onlineUuid[playerUid]
  537. if not human then
  538. local db = RoleDBLogic.getDb(playerUid)
  539. if not db then
  540. return
  541. end
  542. human = {}
  543. human.db = db
  544. end
  545. -- 删除原有的称号
  546. local chenghaoId = GetPlayingMethonChenghao(human)
  547. if chenghaoId then
  548. -- RoleHeadLogic.unActive(playerUid, RoleHeadLogic.HEAD_TYPE_4, chenghaoId)
  549. if human.db.chenghaoList and human.db.chenghaoList[chenghaoId] then
  550. human.db.chenghaoList[chenghaoId] = nil
  551. end
  552. if human.db.chenghao and human.db.chenghao == chenghaoId then
  553. human.db.chenghao = nil
  554. end
  555. end
  556. -- 获得称号
  557. local rankCfg = GodsAreaConfig.rankList[newRank]
  558. if rankCfg then
  559. RoleHeadLogic.active(human, RoleHeadLogic.HEAD_TYPE_4, rankCfg.chenghaoID)
  560. end
  561. -- 如果是失败方, 发邮件通知
  562. if isWinner == 0 then
  563. sendMail(DEFAULT_MIAL_ID, human.db._id, nil, enemyName)
  564. end
  565. ObjHuman.save(human)
  566. -- 如果在线, 更新战力
  567. if ObjHuman.onlineUuid[playerUid] then
  568. RoleAttr.cleanHeroAttrCache(human)
  569. RoleAttr.doCalc(human)
  570. ObjHuman.sendAttr(human, RoleDefine.ZHANDOULI)
  571. end
  572. end
  573. -- 跨服返回录像数据
  574. function NS_Query_CombatVideo(isFinish, playerUid, videoData)
  575. local human = ObjHuman.onlineUuid[playerUid]
  576. if not human then
  577. return
  578. end
  579. if next(videoData) then
  580. if not human.GodsAreaVideoArray then
  581. human.GodsAreaVideoArray = {}
  582. -- Timer.addLater(3, timed_clear_videoCache, playerUid)
  583. end
  584. human.GodsAreaVideoArray[#human.GodsAreaVideoArray+1] = videoData
  585. if isFinish == 0 then
  586. return
  587. end
  588. end
  589. local msgRet = Msg.gc.GC_GODSAREA_QUERY_COMBATVIDEO
  590. msgRet.videoList[0] = 0
  591. local videoCnt = human.GodsAreaVideoArray and #human.GodsAreaVideoArray or 0
  592. for i = 1, videoCnt do
  593. if msgRet.videoList[0] < #msgRet.videoList then
  594. msgRet.videoList[0] = i
  595. local combatVideo = human.GodsAreaVideoArray[i]
  596. local combatInfo = combatVideo.combatInfo
  597. local net = msgRet.videoList[i]
  598. RoleLogic.makeRoleBase(combatInfo.attacker, net.atkData)
  599. net.heroList[0] = 0
  600. for _,pos in ipairs(CombatDefine.SIDE2POS[CombatDefine.ATTACK_SIDE]) do
  601. local grid = combatInfo.objList and combatInfo.objList[pos]
  602. if grid and grid.id ~= 0 then
  603. net.heroList[0] = net.heroList[0] + 1
  604. local index = net.heroList[0]
  605. HeroGrid.makeHeroInfo(net.heroList[index], grid)
  606. end
  607. end
  608. net.videoUuid = combatVideo._id
  609. net.time = combatInfo.time
  610. net.result = combatInfo.isWin == true and 1 or 0
  611. local formationConfig = CombatPosLogic.getFormationConfig(combatInfo.atkFormation)
  612. net.formation = formationConfig.name
  613. end
  614. end
  615. human.GodsAreaVideoArray = nil
  616. Msg.send(msgRet, human.fd)
  617. end
  618. --收到通知,给玩家发奖
  619. function NS_SendReward(uid2RankTb)
  620. if not checkSvrOpenDays() then
  621. return
  622. end
  623. local correctUuidArray = getCorrectUuidArray(uid2RankTb)
  624. if not correctUuidArray then
  625. return
  626. end
  627. MailQueue:clear()
  628. for _, playerInfo in ipairs(correctUuidArray) do
  629. MailQueue:add(playerInfo)
  630. end
  631. MailQueue:insertDB()
  632. end
  633. -- 收到跨服通知,更新玩家基础数据
  634. function NS_UpdatePlayerBaseInfo(playerUid)
  635. local human = ObjHuman.onlineUuid[playerUid]
  636. if not human then
  637. local db = RoleDBLogic.getDb(playerUid)
  638. if not db then
  639. return
  640. end
  641. human = {}
  642. human.db = db
  643. end
  644. local msgData = InnerMsg.lw.LW_GODSATREA_UPDATE_PLAYER_BASE_INFO
  645. msgData.playerUid = human.db._id
  646. msgData.playerInfo = generateShowInfo(human)
  647. msgData.playerInfo.heroList = nil
  648. InnerMsg.sendMsg(0, msgData)
  649. end
  650. function getCombatObjList(human, side, args, combatType)
  651. if side == CombatDefine.ATTACK_SIDE and not human then return end
  652. if side == CombatDefine.DEFEND_SIDE and human then
  653. return
  654. end
  655. if not human then
  656. local uuid = args[1]
  657. local db = RoleDBLogic.getDb(uuid)
  658. if not db then
  659. return
  660. end
  661. human = {}
  662. human.db = db
  663. end
  664. local heroList = CombatPosLogic.getCombatHeros(human, combatType)
  665. if next(heroList) then
  666. return CombatLogic.getHumanObjList(human, combatType)
  667. else
  668. return CombatLogic.getHumanObjList(human, CombatDefine.COMBAT_TYPE1)
  669. end
  670. end
  671. function getCombatMonsterOutID(human, side, args)
  672. if side ~= CombatDefine.DEFEND_SIDE then return end
  673. local rank = args[2]
  674. local rankCfg = GodsAreaConfig.rankList[rank]
  675. return rankCfg.monsterOutID
  676. end
  677. function onFightEnd(human, result, type, cbParam, combatInfo)
  678. local godsArea_CombatInfo = human.godsArea_CombatInfo
  679. if not godsArea_CombatInfo then
  680. return Broadcast.sendErr(human, Lang.DATA_ERR)
  681. end
  682. if result == CombatDefine.RESULT_WIN then
  683. Challenge_Win(human)
  684. end
  685. combatInfo.time = os.time()
  686. combatInfo.defender.name = godsArea_CombatInfo.defenseName
  687. CombatVideo.NS_Video_Save(CombatVideo.VIDEOTYPE_GODSAREA, combatInfo, {rank = godsArea_CombatInfo.defenseRank})
  688. end