GodsAreaNS.lua 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864
  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.attr[RoleDefine.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 = 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", resTag, uid, rank or defaultRank, self.repeatTb[uid] or 0)
  289. writeLog(str)
  290. end
  291. if #self.uidArray > 0 then
  292. Timer.addLater(3, MailQueue.insertDB, MailQueue)
  293. end
  294. end
  295. -- 查询排行榜信息
  296. function Query_RankList(human)
  297. if not isOpen(human) then
  298. return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  299. end
  300. local msgData = InnerMsg.lw.LW_GODSATREA_QUERY_RANKLIST
  301. msgData.playerUid = human.db._id
  302. msgData.sourceServerId = Config.SVR_INDEX
  303. InnerMsg.sendMsg(0, msgData)
  304. end
  305. -- 查看某个玩家具体信息
  306. function Query_PlayerInfo(human, targetRank, targetUid)
  307. if not isOpen(human) then
  308. return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  309. end
  310. if targetRank <= 0 or targetRank > #GodsAreaConfig.rankList then
  311. return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
  312. end
  313. local msgData = InnerMsg.lw.LW_GODSATREA_QUERY_PLAYER_INFO
  314. msgData.sourceServerId = Config.SVR_INDEX
  315. msgData.targetRank = targetRank
  316. msgData.targetUid = targetUid
  317. msgData.playerUid = human.db._id
  318. InnerMsg.sendMsg(0, msgData)
  319. end
  320. -- 向跨服查询能否挑战某个排名
  321. function Query_Challenge(human, defenseRank, defenseUid)
  322. if defenseRank <= 0 or defenseRank > #GodsAreaConfig.rankList then
  323. return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
  324. end
  325. local msgData = InnerMsg.lw.LW_GODSATREA_CHALLENGE_QUERY
  326. msgData.sourceServerId = Config.SVR_INDEX
  327. msgData.defenseRank = defenseRank
  328. msgData.defenseUid = defenseUid
  329. msgData.attackerUid = human.db._id
  330. InnerMsg.sendMsg(0, msgData)
  331. end
  332. -- 通知跨服,挑战胜利
  333. function Challenge_Win(human)
  334. local challengeInfo = human.godsArea_CombatInfo
  335. local msgData = InnerMsg.lw.LW_GODSATREA_WIN
  336. msgData.sourceServerId = Config.SVR_INDEX
  337. msgData.defenseRank = challengeInfo.defenseRank
  338. msgData.defenseUid = challengeInfo.defenseUid
  339. msgData.attackerUid = human.db._id
  340. msgData.attackInfo = {}
  341. local chenghaoId = GetPlayingMethonChenghao(human)
  342. if not chenghaoId then -- 没有排名时挑战成功, 则把展示数据发给跨服。如果有时许问题,则每次挑战都发给跨服
  343. msgData.attackInfo = generateShowInfo(human)
  344. end
  345. InnerMsg.sendMsg(0, msgData)
  346. end
  347. -- 查看某个名次的战斗录像
  348. function Query_CombatVideo(human, targetRank)
  349. if not isOpen(human) then
  350. return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
  351. end
  352. if targetRank <= 0 or targetRank > #GodsAreaConfig.rankList then
  353. return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
  354. end
  355. local msgData = InnerMsg.lw.LW_GODSATREA_QUERY_RANK_VIDEO
  356. msgData.playerUid = human.db._id
  357. msgData.targetRank = targetRank
  358. msgData.sourceServerId = Config.SVR_INDEX
  359. InnerMsg.sendMsg(0, msgData)
  360. end
  361. -- 通知跨服, 更新玩家角色数据
  362. function UpdatePlayerBaseInfo(human, newPlayerInfo)
  363. local msgData = InnerMsg.lw.LW_GODSATREA_UPDATE_PLAYER_BASE_INFO
  364. msgData.playerUid = human.db._id
  365. msgData.playerInfo = newPlayerInfo or {}
  366. InnerMsg.sendMsg(0, msgData)
  367. end
  368. -- 通知跨服, 更新玩家英雄数据
  369. function UpdatePlayerHeroInfo(human, newPlayerInfo)
  370. local msgData = InnerMsg.lw.LW_GODSATREA_UPDATE_PLAYER_HERO_INFO
  371. msgData.playerUid = human.db._id
  372. msgData.power = human.attr[RoleDefine.ZHANDOULI]
  373. msgData.heroInfo = newPlayerInfo or {}
  374. InnerMsg.sendMsg(0, msgData)
  375. end
  376. -- 客户端请求排行榜奖励
  377. function Query_RankReward(human)
  378. local msgRet = Msg.gc.GC_GODSAREA_GET_RANK_REWARD
  379. local rewardList = msgRet.rewardList
  380. rewardList[0] = 0
  381. for k,v in ipairs(GodsAreaConfig.reward) do
  382. rewardList[0] = k
  383. rewardList[k].rankLeft = v.rankArea[1]
  384. rewardList[k].rankRight = v.rankArea[2]
  385. local itemList = rewardList[k].itemList
  386. itemList[0] = 0
  387. for idx, itemCfg in ipairs(v.awardList) do
  388. itemList[0] = idx
  389. Grid.makeItem(itemList[idx], itemCfg[1], itemCfg[2])
  390. end
  391. end
  392. Msg.send(msgRet, human.fd)
  393. end
  394. -- 收到跨服发送的排行数据
  395. function NS_Send_RankList(playerUid, myRank, rankList)
  396. local human = ObjHuman.onlineUuid[playerUid]
  397. if not human then
  398. return
  399. end
  400. local srvIdx = getPlayerSrvIdx(human)
  401. local msgRet = Msg.gc.GC_GODSAREA_QUERY_RANKLIST
  402. msgRet.myRank.body = RoleHeadLogic.getRoleAppearance(human, RoleHeadLogic.HEAD_TYPE_3)
  403. msgRet.myRank.name = human.db.name
  404. msgRet.myRank.uid = playerUid
  405. msgRet.myRank.rank = myRank
  406. msgRet.myRank.power = human.attr[RoleDefine.ZHANDOULI] or 0
  407. msgRet.myRank.serverName = srvIdx .. "服"
  408. msgRet.myRank.head = RoleHeadLogic.getRoleAppearance(human, RoleHeadLogic.HEAD_TYPE_1)
  409. msgRet.myRank.headFrame = RoleHeadLogic.getRoleAppearance(human, RoleHeadLogic.HEAD_TYPE_2)
  410. msgRet.attrs[0] = 0
  411. if myRank ~= 0 then
  412. local rankCfg = GodsAreaConfig.rankList[myRank]
  413. local chenghaoCfg = RoleExcel.chenghao[rankCfg.chenghaoID]
  414. for k, v in ipairs(chenghaoCfg.attrs) do
  415. msgRet.attrs[0] = k
  416. msgRet.attrs[k].key = v[1]
  417. msgRet.attrs[k].value = v[2]
  418. end
  419. end
  420. local msgRankList = msgRet.rankList
  421. msgRankList[0] = 0
  422. for rank, playerInfo in ipairs(rankList) do
  423. msgRankList[0] = rank
  424. msgRankList[rank].body = playerInfo.body
  425. msgRankList[rank].name = playerInfo.name
  426. msgRankList[rank].rank = rank
  427. msgRankList[rank].head = playerInfo.head
  428. msgRankList[rank].headFrame = playerInfo.headFrame
  429. if playerInfo.uid then -- 真实玩家
  430. msgRankList[rank].uid = playerInfo.uid
  431. msgRankList[rank].power = playerInfo.power or 999999
  432. local playerServerIdx = math.max((playerInfo.serverId or 0) - SRV_BASE_NUM, 1)
  433. msgRankList[rank].serverName = playerServerIdx .. "服"
  434. else
  435. local npcCfg = GodsAreaConfig.rankList[rank]
  436. local monsterOutID = npcCfg.monsterOutID
  437. msgRankList[rank].uid = tostring(monsterOutID)
  438. msgRankList[rank].power = calcMOnsterPower(monsterOutID)
  439. msgRankList[rank].serverName = MONSTER_SRV_NAME
  440. end
  441. end
  442. Msg.send(msgRet, human.fd)
  443. end
  444. -- 收到跨服发送的玩家数据
  445. function NS_Send_PlayerInfo(playerUid, res, playerInfo)
  446. local human = ObjHuman.onlineUuid[playerUid]
  447. if not human then
  448. return
  449. end
  450. if res == -1 then
  451. return Broadcast.sendErr(human, Lang.DATA_ERR)
  452. end
  453. if res == -2 then
  454. return Broadcast.sendErr(human, Lang.DATA_OLD)
  455. end
  456. local msgRet = Msg.gc.GC_GODSAREA_GET_PLAYER_INFO
  457. msgRet.name = playerInfo.name
  458. msgRet.lv = playerInfo.lv
  459. msgRet.head = playerInfo.head
  460. msgRet.headFrame = playerInfo.headFrame
  461. local rankCfg = GodsAreaConfig.rankList[playerInfo.rank]
  462. local chenghaoCfg = RoleExcel.chenghao[rankCfg.chenghaoID]
  463. msgRet.attrs[0] = 0
  464. for k, v in ipairs(chenghaoCfg.attrs) do
  465. msgRet.attrs[0] = k
  466. msgRet.attrs[k].key = v[1]
  467. msgRet.attrs[k].value = v[2]
  468. end
  469. local len = 0
  470. msgRet.defendObjList[0] = 0
  471. if playerInfo.defendObjList then
  472. for idx, heroInfo in pairs(playerInfo.defendObjList) do
  473. len = len + 1
  474. msgRet.defendObjList[len].body = heroInfo.heroBody or 0
  475. msgRet.defendObjList[len].camp = heroInfo.heroCamp or 0
  476. msgRet.defendObjList[len].lv = heroInfo.heroLevel or 0
  477. msgRet.defendObjList[len].star = heroInfo.heroStar or 0
  478. end
  479. msgRet.defendObjList[0] = len
  480. else
  481. local monsterOutConfig = MonsterExcel.monsterOut[rankCfg.monsterOutID]
  482. for idx, monsterInfo in ipairs(monsterOutConfig.member) do
  483. msgRet.defendObjList[0] = idx
  484. local monsterID = monsterInfo[1]
  485. local mcf = MonsterExcel.monster[monsterID]
  486. msgRet.defendObjList[idx].body = mcf.body
  487. msgRet.defendObjList[idx].camp = mcf.camp
  488. msgRet.defendObjList[idx].lv = monsterInfo[2]
  489. msgRet.defendObjList[idx].star = mcf.star
  490. end
  491. end
  492. msgRet.rank = playerInfo.rank
  493. msgRet.uid = playerInfo.uid or tostring(rankCfg.monsterOutID)
  494. Msg.send(msgRet, human.fd)
  495. end
  496. -- 跨服通知能否挑战的结果
  497. function Query_Challenge_Result(playerUid, res, defenseServerId, defenseRank, defenseUid, defenseName)
  498. local human = ObjHuman.onlineUuid[playerUid]
  499. if not human then
  500. return
  501. end
  502. if res == -1 then
  503. return Broadcast.sendErr(human, Lang.DATA_ERR)
  504. end
  505. if res == -2 then
  506. return Broadcast.sendErr(human, Lang.DATA_OLD)
  507. end
  508. if res == -3 then
  509. return Broadcast.sendErr(human, Lang.CHALLENGE_STRONG_ONE)
  510. end
  511. if res == 1 then
  512. Broadcast.sendErr(human, Lang.CHALLENGING_SELF)
  513. end
  514. if res == 2 then
  515. Broadcast.sendErr(human, Lang.CHALLENGING_TARGET)
  516. end
  517. human.godsArea_CombatInfo = {
  518. defenseRank = defenseRank,
  519. defenseUid = defenseUid,
  520. defenseName = defenseName,
  521. }
  522. if tonumber(defenseUid) then -- 被挑战方是机器人
  523. CombatLogic.combatBegin(human, nil, {human.db._id, defenseRank }, CombatDefine.COMBAT_TYPE32)
  524. else
  525. local msg = {
  526. combatType = CombatDefine.COMBAT_TYPE32,
  527. nServerIndex = defenseServerId,
  528. param = defenseUid
  529. }
  530. MiddleCommonLogic.MiddleCommonLogic_CombatBegin_LW(human, msg)
  531. end
  532. end
  533. -- 收到跨服通知, 更换新的称号
  534. function NS_Change_Chenghao(playerUid, newRank, isWinner, enemyName)
  535. local human = ObjHuman.onlineUuid[playerUid]
  536. if not human then
  537. local db = RoleDBLogic.getDb(playerUid)
  538. if not db then
  539. return
  540. end
  541. human = {}
  542. human.db = db
  543. end
  544. -- 删除原有的称号
  545. local chenghaoId = GetPlayingMethonChenghao(human)
  546. if chenghaoId then
  547. -- RoleHeadLogic.unActive(playerUid, RoleHeadLogic.HEAD_TYPE_4, chenghaoId)
  548. if human.db.chenghaoList and human.db.chenghaoList[chenghaoId] then
  549. human.db.chenghaoList[chenghaoId] = nil
  550. end
  551. if human.db.chenghao and human.db.chenghao == chenghaoId then
  552. human.db.chenghao = nil
  553. end
  554. end
  555. -- 获得称号
  556. local rankCfg = GodsAreaConfig.rankList[newRank]
  557. if rankCfg then
  558. RoleHeadLogic.active(human, RoleHeadLogic.HEAD_TYPE_4, rankCfg.chenghaoID)
  559. end
  560. -- 如果是失败方, 发邮件通知
  561. if isWinner == 0 then
  562. sendMail(DEFAULT_MIAL_ID, human.db._id, nil, enemyName)
  563. end
  564. ObjHuman.save(human)
  565. -- 如果在线, 更新战力
  566. if ObjHuman.onlineUuid[playerUid] then
  567. RoleAttr.cleanHeroAttrCache(human)
  568. RoleAttr.doCalc(human)
  569. ObjHuman.sendAttr(human, RoleDefine.ZHANDOULI)
  570. end
  571. end
  572. -- 跨服返回录像数据
  573. function NS_Query_CombatVideo(isFinish, playerUid, videoData)
  574. local human = ObjHuman.onlineUuid[playerUid]
  575. if not human then
  576. return
  577. end
  578. if next(videoData) then
  579. if not human.GodsAreaVideoArray then
  580. human.GodsAreaVideoArray = {}
  581. -- Timer.addLater(3, timed_clear_videoCache, playerUid)
  582. end
  583. human.GodsAreaVideoArray[#human.GodsAreaVideoArray+1] = videoData
  584. if isFinish == 0 then
  585. return
  586. end
  587. end
  588. local msgRet = Msg.gc.GC_GODSAREA_QUERY_COMBATVIDEO
  589. msgRet.videoList[0] = 0
  590. local videoCnt = human.GodsAreaVideoArray and #human.GodsAreaVideoArray or 0
  591. for i = 1, videoCnt do
  592. if msgRet.videoList[0] < #msgRet.videoList then
  593. msgRet.videoList[0] = i
  594. local combatVideo = human.GodsAreaVideoArray[i]
  595. local combatInfo = combatVideo.combatInfo
  596. local net = msgRet.videoList[i]
  597. RoleLogic.makeRoleBase(combatInfo.attacker, net.atkData)
  598. net.heroList[0] = 0
  599. for _,pos in ipairs(CombatDefine.SIDE2POS[CombatDefine.ATTACK_SIDE]) do
  600. local grid = combatInfo.objList and combatInfo.objList[pos]
  601. if grid and grid.id ~= 0 then
  602. net.heroList[0] = net.heroList[0] + 1
  603. local index = net.heroList[0]
  604. HeroGrid.makeHeroInfo(net.heroList[index], grid)
  605. end
  606. end
  607. net.videoUuid = combatVideo._id
  608. net.time = combatInfo.time
  609. net.result = combatInfo.isWin == true and 1 or 0
  610. local formationConfig = CombatPosLogic.getFormationConfig(combatInfo.atkFormation)
  611. net.formation = formationConfig.name
  612. end
  613. end
  614. human.GodsAreaVideoArray = nil
  615. Msg.send(msgRet, human.fd)
  616. end
  617. --收到通知,给玩家发奖
  618. function NS_SendReward(uid2RankTb)
  619. if not checkSvrOpenDays() then
  620. return
  621. end
  622. local correctUuidArray = getCorrectUuidArray(uid2RankTb)
  623. if not correctUuidArray then
  624. return
  625. end
  626. MailQueue:clear()
  627. for _, playerInfo in ipairs(correctUuidArray) do
  628. MailQueue:add(playerInfo)
  629. end
  630. MailQueue:insertDB()
  631. end
  632. -- 收到跨服通知,更新玩家基础数据
  633. function NS_UpdatePlayerBaseInfo(playerUid)
  634. local human = ObjHuman.onlineUuid[playerUid]
  635. if not human then
  636. local db = RoleDBLogic.getDb(playerUid)
  637. if not db then
  638. return
  639. end
  640. human = {}
  641. human.db = db
  642. end
  643. local msgData = InnerMsg.lw.LW_GODSATREA_UPDATE_PLAYER_BASE_INFO
  644. msgData.playerUid = human.db._id
  645. msgData.playerInfo = generateShowInfo(human)
  646. msgData.playerInfo.heroList = nil
  647. InnerMsg.sendMsg(0, msgData)
  648. end
  649. function getCombatObjList(human, side, args, combatType)
  650. if side == CombatDefine.ATTACK_SIDE and not human then return end
  651. if side == CombatDefine.DEFEND_SIDE and human then
  652. return
  653. end
  654. if not human then
  655. local uuid = args[1]
  656. local db = RoleDBLogic.getDb(uuid)
  657. if not db then
  658. return
  659. end
  660. human = {}
  661. human.db = db
  662. end
  663. local heroList = CombatPosLogic.getCombatHeros(human, combatType)
  664. if next(heroList) then
  665. return CombatLogic.getHumanObjList(human, combatType)
  666. else
  667. return CombatLogic.getHumanObjList(human, CombatDefine.COMBAT_TYPE1)
  668. end
  669. end
  670. function getCombatMonsterOutID(human, side, args)
  671. if side ~= CombatDefine.DEFEND_SIDE then return end
  672. local rank = args[2]
  673. local rankCfg = GodsAreaConfig.rankList[rank]
  674. return rankCfg.monsterOutID
  675. end
  676. function onFightEnd(human, result, type, cbParam, combatInfo)
  677. local godsArea_CombatInfo = human.godsArea_CombatInfo
  678. if not godsArea_CombatInfo then
  679. return Broadcast.sendErr(human, Lang.DATA_ERR)
  680. end
  681. if result == CombatDefine.RESULT_WIN then
  682. Challenge_Win(human)
  683. end
  684. combatInfo.time = os.time()
  685. combatInfo.defender.name = godsArea_CombatInfo.defenseName
  686. CombatVideo.NS_Video_Save(CombatVideo.VIDEOTYPE_GODSAREA, combatInfo, {rank = godsArea_CombatInfo.defenseRank})
  687. end