BaiZhanChengShenCS.lua 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525
  1. -- 百战成神(跨服 CS)
  2. --
  3. -- 职责:
  4. -- 1) 活动周期: Timer.oneMin/onHour -> timedStageHandle 开/关轮、发奖
  5. -- 2) 玩家数据: 积分、排行、匹配、REGISTER/UPDATE_SHOW
  6. -- 3) 协议: 处理普通服 LW_* , 回 WL_* 到对应 logic fd
  7. -- 4) 断连补偿: 逻辑服 LW_HELLO -> onLogicServerConnect 补 ACT_START/待发奖
  8. --
  9. -- 对外导出:
  10. -- oneMin, onHour, onLogicServerConnect, syncActStateToAllConnected
  11. -- N2C_* (InnerHandler 注册)
  12. local InnerMsg = require("core.InnerMsg")
  13. local Util = require("common.Util")
  14. local Timer = require("core.Timer")
  15. local MiddleManager = require("middle.MiddleManager")
  16. local BaiZhanChengShenDB = require("baiZhanChengShen.BaiZhanChengShenDB")
  17. local BaiZhanChengShenDefine = require("baiZhanChengShen.BaiZhanChengShenDefine")
  18. local BzcsLog = require("baiZhanChengShen.BaiZhanChengShenLog")
  19. ------------------------------------ 活动周期调度 ------------------------------------
  20. local wDay
  21. -- 刷新缓存的当前星期
  22. local function updateWDay()
  23. wDay = Util.getWeekDay()
  24. end
  25. -- 今日 0 点时间戳
  26. local function getTodayStartTime()
  27. return Util.getDayStartTime(os.time())
  28. end
  29. -- 将 baseTime 对齐到所在周开放首日 0:10 (getWeekDay: 1=周日, 7=周六)
  30. local function alignRoundStart(baseTime)
  31. local startW = BaiZhanChengShenDefine.BZCS_OPEN_WDAY_AREA[1]
  32. local endW = BaiZhanChengShenDefine.BZCS_OPEN_WDAY_AREA[2]
  33. local w = Util.getWeekDay(baseTime)
  34. local sub
  35. if startW <= endW then
  36. if w >= startW and w <= endW then
  37. sub = w - startW
  38. elseif w < startW then
  39. sub = w + 7 - startW
  40. else
  41. sub = w - startW
  42. end
  43. elseif w >= startW then
  44. sub = w - startW
  45. else
  46. sub = w + 7 - startW
  47. end
  48. local dayStart = Util.getDayStartTime(baseTime)
  49. return dayStart - sub * 86400 + BaiZhanChengShenDefine.BZCS_START_SEC
  50. end
  51. -- 由开局时间推算结束日(周日) 23:00 时间戳
  52. local function calcRoundEnd(startTime)
  53. local openStart = alignRoundStart(startTime)
  54. local endDayOffset = BaiZhanChengShenDefine.GetOpenEndDayOffset()
  55. local endDayStart = Util.getDayStartTime(openStart) + endDayOffset * 86400
  56. return endDayStart + BaiZhanChengShenDefine.BZCS_END_SEC
  57. end
  58. -- 当前是否在周六~周日开放日
  59. local function isInOpenWday()
  60. if not wDay then updateWDay() end
  61. local startW = BaiZhanChengShenDefine.BZCS_OPEN_WDAY_AREA[1]
  62. local endW = BaiZhanChengShenDefine.BZCS_OPEN_WDAY_AREA[2]
  63. if startW <= endW then
  64. return wDay >= startW and wDay <= endW
  65. end
  66. return wDay >= startW or wDay <= endW
  67. end
  68. -- 活动是否在时间窗内且处于开放星期
  69. local function isRunning()
  70. local now = os.time()
  71. local startTime, endTime = BaiZhanChengShenDB.GetActivityTimes()
  72. if startTime == 0 or endTime == 0 then
  73. return false
  74. end
  75. if now < startTime or now > endTime then
  76. return false
  77. end
  78. return isInOpenWday()
  79. end
  80. -- 向单个逻辑服 fd 推送当前活动状态(重连/跨服重启后补偿, 避免错过广播)
  81. local function sendActStateToFd(fd)
  82. if not fd then return end
  83. local startTime, endTime = BaiZhanChengShenDB.GetActivityTimes()
  84. if startTime > 0 and endTime > 0 and isRunning() then
  85. local msgData = InnerMsg.wl.WL_BZCS_ACT_START
  86. msgData.startTime = startTime
  87. msgData.endTime = endTime
  88. InnerMsg.sendMsg(fd, msgData)
  89. else
  90. local msgData = InnerMsg.wl.WL_BZCS_ACT_END
  91. InnerMsg.sendMsg(fd, msgData)
  92. end
  93. end
  94. -- 逻辑服连上跨服时: 同步活动状态 + 补发断连期间缓存的周期奖励
  95. function onLogicServerConnect(fd)
  96. if _G.is_middle ~= true or not fd then return end
  97. sendActStateToFd(fd)
  98. local serverId = FD_2_SVRINDEX and FD_2_SVRINDEX[fd]
  99. if not serverId then return end
  100. local pending = BaiZhanChengShenDB.TakePendingRewards(serverId)
  101. if #pending > 0 then
  102. local msgData = InnerMsg.wl.WL_BZCS_ISSUE_REWARD
  103. msgData.rewardList = pending
  104. InnerMsg.sendMsg(fd, msgData)
  105. BzcsLog.logAction("reward_reissue", string.format("serverId=%s cnt=%s", serverId, #pending))
  106. end
  107. end
  108. -- 跨服启动后向已连接逻辑服同步活动状态
  109. function syncActStateToAllConnected()
  110. if _G.is_middle ~= true then return end
  111. local fdList = MiddleManager.MiddleManager_GetAllFD()
  112. for _, fd in pairs(fdList) do
  113. sendActStateToFd(fd)
  114. end
  115. end
  116. -- 广播活动开启, 普通服写入 KEY_BZCS_START_TIME
  117. function ActOpen(startTime)
  118. local msgData = InnerMsg.wl.WL_BZCS_ACT_START
  119. msgData.startTime = startTime or os.time()
  120. local _, endTime = BaiZhanChengShenDB.GetActivityTimes()
  121. msgData.endTime = endTime
  122. local fdList = MiddleManager.MiddleManager_GetAllFD()
  123. for _, fd in pairs(fdList) do
  124. InnerMsg.sendMsg(fd, msgData)
  125. end
  126. end
  127. -- 广播活动结束
  128. function ActEnd()
  129. local msgData = InnerMsg.wl.WL_BZCS_ACT_END
  130. local fdList = MiddleManager.MiddleManager_GetAllFD()
  131. for _, fd in pairs(fdList) do
  132. InnerMsg.sendMsg(fd, msgData)
  133. end
  134. end
  135. -- 按 serverId 汇总待发奖 {{uuid,rank},...}
  136. local function groupRewardsByServer(playerList)
  137. local byServer = {}
  138. for _, info in ipairs(playerList) do
  139. local uuid, rank, serverId = info[1], info[2], info[3]
  140. if serverId then
  141. local list = byServer[serverId]
  142. if not list then
  143. list = {}
  144. byServer[serverId] = list
  145. end
  146. list[#list + 1] = {uuid, rank}
  147. end
  148. end
  149. return byServer
  150. end
  151. -- 向指定逻辑服批量下发排名奖励(每服一次 WL); 未连接则整批入 pending
  152. local function issueRewardBatch(serverId, rewardList)
  153. if not rewardList or #rewardList == 0 then return end
  154. local fd = MiddleManager.getFDBySvrIndex(serverId)
  155. if fd then
  156. local msgData = InnerMsg.wl.WL_BZCS_ISSUE_REWARD
  157. msgData.rewardList = rewardList
  158. InnerMsg.sendMsg(fd, msgData)
  159. BzcsLog.logAction("reward_issue_send", string.format("serverId=%s cnt=%s", serverId, #rewardList))
  160. else
  161. BaiZhanChengShenDB.AddPendingRewards(serverId, rewardList)
  162. BzcsLog.logAction("reward_issue_offline", string.format("serverId=%s cnt=%s", serverId, #rewardList))
  163. end
  164. end
  165. -- 末批发奖完成后标记 rewardIssued(1=最后一服)
  166. local function issueRewardBatchFinish(serverId, rewardList, markIssued)
  167. issueRewardBatch(serverId, rewardList)
  168. if markIssued == 1 then
  169. BaiZhanChengShenDB.SetRewardIssued(true)
  170. BzcsLog.logAction("reward_issue_done", string.format("serverId=%s lastBatchCnt=%s", serverId, #rewardList))
  171. end
  172. end
  173. -- 活动结束发奖: 按逻辑服批量 WL_BZCS_ISSUE_REWARD(服与服之间 2s 节流)
  174. function IssueRewardManager()
  175. if BaiZhanChengShenDB.IsRewardIssued() then
  176. return
  177. end
  178. local rewardPlayers = BaiZhanChengShenDB.GetAllPlayersForReward()
  179. local byServer = groupRewardsByServer(rewardPlayers)
  180. local serverList = {}
  181. for serverId, rewardList in pairs(byServer) do
  182. serverList[#serverList + 1] = {serverId, rewardList}
  183. end
  184. if #serverList == 0 then
  185. BaiZhanChengShenDB.SetRewardIssued(true)
  186. return
  187. end
  188. BzcsLog.logAction("reward_issue", string.format("playerCnt=%s serverCnt=%s", #rewardPlayers, #serverList))
  189. local delay = 0
  190. for i, entry in ipairs(serverList) do
  191. delay = delay + 2
  192. local markIssued = (i == #serverList) and 1 or 0
  193. Timer.addLater(delay, issueRewardBatchFinish, entry[1], entry[2], markIssued)
  194. end
  195. end
  196. -- 开启新周期: 重置 DB 并 ActOpen
  197. local function newRoundHandle(now)
  198. now = now or os.time()
  199. local startTime = alignRoundStart(now)
  200. local endTime = calcRoundEnd(startTime)
  201. BaiZhanChengShenDB.ResetForNewRound(startTime, endTime)
  202. ActOpen(startTime)
  203. BzcsLog.logAction("act_open", string.format("start=%s end=%s", startTime, endTime))
  204. end
  205. -- 结束当前周期: 发奖 + ActEnd
  206. local function endRoundHandle()
  207. if BaiZhanChengShenDB.IsRewardIssued() then
  208. return
  209. end
  210. BzcsLog.logAction("act_end", "begin_issue_reward")
  211. IssueRewardManager()
  212. ActEnd()
  213. end
  214. -- 放弃上轮未完成的周期发奖(满21天开新轮时不再补发)
  215. local function abandonUnissuedRewards()
  216. if BaiZhanChengShenDB.IsRewardIssued() then
  217. return
  218. end
  219. BzcsLog.logAction("reward_abandon", "new_round_skip")
  220. BaiZhanChengShenDB.SetRewardIssued(true)
  221. BaiZhanChengShenDB.ClearAllPendingRewards()
  222. ActEnd()
  223. end
  224. -- 是否应开启新轮(首次开轮 / 满21天开放日); 成功则已执行 newRoundHandle
  225. local function tryOpenNewRound(now, lastReset, startTime, endTime)
  226. if not isInOpenWday() then
  227. return false
  228. end
  229. if lastReset == 0 then
  230. newRoundHandle(now)
  231. return true
  232. end
  233. if Util.diffDay(lastReset) < BaiZhanChengShenDefine.BZCS_CYCLE_DAYS then
  234. return false
  235. end
  236. if startTime > 0 and now < endTime then
  237. return false
  238. end
  239. if not BaiZhanChengShenDB.IsRewardIssued() then
  240. abandonUnissuedRewards()
  241. end
  242. newRoundHandle(now)
  243. return true
  244. end
  245. -- 周期阶段机 (oneMin/onHour 调用):
  246. -- 1) 满足新轮条件(含满21天且上轮未发奖则放弃发奖直接开轮) -> newRoundHandle
  247. -- 2) 已过 endTime 且未发奖且未满21天新轮 -> endRoundHandle
  248. -- 3) 活动记录中但 isRunning 为假(如跨天) -> 修正时间并 ActOpen
  249. local function timedStageHandle()
  250. local now = os.time()
  251. local lastReset = BaiZhanChengShenDB.GetLastResetTime()
  252. local startTime, endTime = BaiZhanChengShenDB.GetActivityTimes()
  253. if tryOpenNewRound(now, lastReset, startTime, endTime) then
  254. return
  255. end
  256. if startTime > 0 and now >= endTime and not BaiZhanChengShenDB.IsRewardIssued() then
  257. endRoundHandle()
  258. return
  259. end
  260. if startTime > 0 and now >= startTime and now < endTime and not isRunning() then
  261. if isInOpenWday() then
  262. local ts = alignRoundStart(now)
  263. local te = calcRoundEnd(ts)
  264. BaiZhanChengShenDB.SetActivityTimes(ts, te)
  265. ActOpen(ts)
  266. end
  267. end
  268. end
  269. -- Timer 每分钟(跳过整点)检查阶段
  270. function oneMin()
  271. if _G.is_middle ~= true then return end
  272. if Util.getMin() == 0 then return end
  273. timedStageHandle()
  274. end
  275. -- Timer 每小时检查阶段, 0 点刷新星期
  276. function onHour(hour)
  277. if _G.is_middle ~= true then return end
  278. if hour == 0 or not wDay then
  279. updateWDay()
  280. end
  281. timedStageHandle()
  282. end
  283. ------------------------------------ N2C (普通服 LW -> 本模块 -> WL 回包) ------------------------------------
  284. -- msg 中带 sourceServerId/playerUuid, 通过 MiddleManager.getFDBySvrIndex 回包
  285. -- 向逻辑服 fd 发送 WL 协议
  286. local function sendWL(fd, msgData)
  287. if not fd then return false end
  288. InnerMsg.sendMsg(fd, msgData)
  289. return true
  290. end
  291. -- 业务失败时回 WL_BZCS_TIPS
  292. local function errTips(sourceServerId, playerUuid, errCode)
  293. BzcsLog.logAction("err_tips", string.format("serverId=%s uuid=%s err=%s", sourceServerId or 0, playerUuid or "", errCode or 0))
  294. local msgData = InnerMsg.wl.WL_BZCS_TIPS
  295. msgData.playerUuid = playerUuid
  296. msgData.errCode = errCode or 0
  297. local fd = MiddleManager.getFDBySvrIndex(sourceServerId)
  298. if not fd then return end
  299. sendWL(fd, msgData)
  300. end
  301. -- LW_BZCS_MATCH -> WL_BZCS_MATCH (±500步进扩大, 窗口内随机匹配最多3人; refreshRanks 非空时仅刷新展示)
  302. function N2C_Match(msg)
  303. local fd = MiddleManager.getFDBySvrIndex(msg.sourceServerId)
  304. if not isRunning() then
  305. return errTips(msg.sourceServerId, msg.playerUuid, BaiZhanChengShenDefine.BZCS_ERR_NOT_OPEN)
  306. end
  307. local pinfo = BaiZhanChengShenDB.GetPlayer(msg.playerUuid)
  308. local myScore = pinfo and pinfo.score or BaiZhanChengShenDefine.BZCS_INIT_SCORE
  309. local refreshRanks = msg.refreshRanks
  310. local opponents
  311. if refreshRanks and #refreshRanks > 0 then
  312. opponents = BaiZhanChengShenDB.GetMatchOpponentsByRanks(refreshRanks)
  313. if #opponents < #refreshRanks then
  314. opponents = BaiZhanChengShenDB.GetMatchOpponents(msg.playerUuid, myScore, {})
  315. end
  316. else
  317. opponents = BaiZhanChengShenDB.GetMatchOpponents(msg.playerUuid, myScore, {})
  318. end
  319. local msgData = InnerMsg.wl.WL_BZCS_MATCH
  320. msgData.playerUuid = msg.playerUuid
  321. msgData.myScore = myScore
  322. msgData.myRank = BaiZhanChengShenDB.GetRankByUuid(msg.playerUuid)
  323. msgData.opponentList = opponents
  324. sendWL(fd, msgData)
  325. end
  326. -- LW_BZCS_RANK_LIST -> WL_BZCS_RANK_LIST
  327. function N2C_RankList(msg)
  328. local fd = MiddleManager.getFDBySvrIndex(msg.sourceServerId)
  329. local msgData = InnerMsg.wl.WL_BZCS_RANK_LIST
  330. msgData.playerUuid = msg.playerUuid
  331. msgData.rankList = BaiZhanChengShenDB.GetRankList(BaiZhanChengShenDefine.BZCS_RANK_MAX)
  332. msgData.myRankInfo = BaiZhanChengShenDB.BuildPlayerRankInfo(msg.playerUuid)
  333. sendWL(fd, msgData)
  334. end
  335. -- LW_BZCS_OPPONENT_INFO -> WL_BZCS_OPPONENT_INFO
  336. function N2C_OpponentInfo(msg)
  337. local fd = MiddleManager.getFDBySvrIndex(msg.sourceServerId)
  338. local target = BaiZhanChengShenDB.GetPlayerByRank(msg.targetRank)
  339. local msgData = InnerMsg.wl.WL_BZCS_OPPONENT_INFO
  340. msgData.playerUuid = msg.playerUuid
  341. msgData.res = target and 0 or -1
  342. msgData.targetInfo = BaiZhanChengShenDB.BuildOpponentInfoSnapshot(target) or {}
  343. sendWL(fd, msgData)
  344. end
  345. -- LW_BZCS_OPPONENT_LINEUP -> WL_BZCS_OPPONENT_LINEUP (含机器人 showInfo)
  346. function N2C_OpponentLineup(msg)
  347. local fd = MiddleManager.getFDBySvrIndex(msg.sourceServerId)
  348. local target = BaiZhanChengShenDB.GetPlayerByRank(msg.targetRank)
  349. local msgData = InnerMsg.wl.WL_BZCS_OPPONENT_LINEUP
  350. msgData.playerUuid = msg.playerUuid
  351. msgData.targetRank = msg.targetRank or 0
  352. msgData.showInfo = target and target.showInfo or {}
  353. msgData.isRobot = target and target.isRobot or 0
  354. sendWL(fd, msgData)
  355. end
  356. -- LW_BZCS_CAN_FIGHT -> WL_BZCS_CAN_FIGHT (按开战时全服名次锁定对手, 扣次在 NS C2N_CanFight)
  357. function N2C_CanFight(msg)
  358. local fd = MiddleManager.getFDBySvrIndex(msg.sourceServerId)
  359. if not isRunning() then
  360. return errTips(msg.sourceServerId, msg.playerUuid, BaiZhanChengShenDefine.BZCS_ERR_NOT_OPEN)
  361. end
  362. local targetRank = msg.targetRank
  363. if not targetRank or targetRank < 1 then
  364. return errTips(msg.sourceServerId, msg.playerUuid, BaiZhanChengShenDefine.BZCS_ERR_TARGET_INVALID)
  365. end
  366. local target = BaiZhanChengShenDB.GetPlayerByRank(targetRank)
  367. if not target then
  368. return errTips(msg.sourceServerId, msg.playerUuid, BaiZhanChengShenDefine.BZCS_ERR_TARGET_INVALID)
  369. end
  370. if target.uuid == msg.playerUuid then
  371. return errTips(msg.sourceServerId, msg.playerUuid, BaiZhanChengShenDefine.BZCS_ERR_TARGET_INVALID)
  372. end
  373. local msgData = InnerMsg.wl.WL_BZCS_CAN_FIGHT
  374. msgData.playerUuid = msg.playerUuid
  375. msgData.targetRank = targetRank
  376. msgData.defUuid = target.uuid
  377. msgData.defServerId = target.serverId or 0
  378. local si = target.showInfo or {}
  379. msgData.defName = si.name or ""
  380. msgData.defScore = target.score or BaiZhanChengShenDefine.BZCS_INIT_SCORE
  381. msgData.isRobot = target.isRobot or 0
  382. msgData.res = 0
  383. sendWL(fd, msgData)
  384. end
  385. -- LW_BZCS_REGISTER 首次挑战注册跨服玩家(保留已有积分/firstJoinTime)
  386. function N2C_Register(msg)
  387. local pinfo = msg.playerInfo
  388. if not pinfo or not pinfo.uuid then return end
  389. local old = BaiZhanChengShenDB.GetPlayer(pinfo.uuid)
  390. if old then
  391. pinfo.score = old.score
  392. pinfo.scoreTime = old.scoreTime
  393. if (old.firstJoinTime or 0) > 0 then
  394. pinfo.firstJoinTime = old.firstJoinTime
  395. end
  396. else
  397. pinfo.score = BaiZhanChengShenDefine.BZCS_INIT_SCORE
  398. pinfo.firstJoinTime = pinfo.firstJoinTime or os.time()
  399. pinfo.scoreTime = os.time()
  400. end
  401. pinfo.isRobot = 0
  402. BaiZhanChengShenDB.UpsertPlayer(pinfo.uuid, pinfo)
  403. BzcsLog.logAction("register", string.format("uuid=%s serverId=%s score=%s firstJoin=%s", pinfo.uuid, pinfo.serverId or 0, pinfo.score or 0, pinfo.firstJoinTime or 0))
  404. end
  405. -- LW_BZCS_UPDATE_SHOW 增量合并展示数据
  406. function N2C_UpdateShow(msg)
  407. local pinfo = BaiZhanChengShenDB.GetPlayer(msg.playerUuid)
  408. if not pinfo or not msg.showInfo then return end
  409. pinfo.showInfo = pinfo.showInfo or {}
  410. BaiZhanChengShenDefine.MergeShowInfo(pinfo.showInfo, msg.showInfo)
  411. BaiZhanChengShenDB.UpsertPlayer(msg.playerUuid, pinfo)
  412. BzcsLog.logAction("update_show", string.format("uuid=%s type=%s race=%s", msg.playerUuid, msg.updateType or 0, msg.race or 0))
  413. end
  414. -- REGISTER 尚未落库时, 用 FIGHT_END 包字段建最小攻方记录(兜底乱序/丢包)
  415. local function ensureAtkRegistered(msg)
  416. local atkUuid = msg and msg.atkUuid
  417. if not atkUuid or atkUuid == "" then return end
  418. if BaiZhanChengShenDB.GetPlayer(atkUuid) then return end
  419. local pinfo = {
  420. uuid = atkUuid,
  421. serverId = msg.atkServerId or 0,
  422. score = BaiZhanChengShenDefine.BZCS_INIT_SCORE,
  423. firstJoinTime = os.time(),
  424. scoreTime = os.time(),
  425. isRobot = 0,
  426. showInfo = { name = msg.atkName or "" },
  427. }
  428. BaiZhanChengShenDB.UpsertPlayer(atkUuid, pinfo)
  429. BzcsLog.logAction("register_fallback", string.format("uuid=%s serverId=%s", atkUuid, pinfo.serverId))
  430. end
  431. -- LW_BZCS_FIGHT_END 整场结算: 攻守加减分, WL 通知攻方; 真人守方另发 WL_BZCS_DEF_NOTIFY
  432. function N2C_FightEnd(msg)
  433. local atkUuid = msg.atkUuid
  434. local defUuid = msg.defUuid
  435. local atkWin = msg.atkWin == 1
  436. local atkDelta = atkWin and BaiZhanChengShenDefine.BZCS_ATK_WIN_SCORE or BaiZhanChengShenDefine.BZCS_ATK_LOSE_SCORE
  437. local defDelta = atkWin and BaiZhanChengShenDefine.BZCS_DEF_LOSE_SCORE or BaiZhanChengShenDefine.BZCS_DEF_WIN_SCORE
  438. ensureAtkRegistered(msg)
  439. local atkScore = BaiZhanChengShenDB.UpdateScore(atkUuid, atkDelta)
  440. local defScore = BaiZhanChengShenDB.UpdateScore(defUuid, defDelta)
  441. if not atkScore then
  442. BzcsLog.logAction("fight_end_atk_score_fail", string.format(
  443. "atk=%s atkSvr=%s delta=%s", atkUuid or "", msg.atkServerId or 0, atkDelta
  444. ))
  445. atkScore = BaiZhanChengShenDefine.BZCS_INIT_SCORE + atkDelta
  446. end
  447. BzcsLog.logAction("fight_end", string.format(
  448. "atk=%s def=%s atkWin=%s atkDelta=%s defDelta=%s atkScore=%s defScore=%s atkSvr=%s defSvr=%s",
  449. atkUuid or "", defUuid or "", msg.atkWin or 0, atkDelta, defDelta, atkScore, defScore or -1,
  450. msg.atkServerId or 0, msg.defServerId or 0
  451. ))
  452. local atkFd = MiddleManager.getFDBySvrIndex(msg.atkServerId)
  453. local wlAtk = InnerMsg.wl.WL_BZCS_FIGHT_END
  454. wlAtk.playerUuid = atkUuid
  455. wlAtk.atkWin = msg.atkWin or 0
  456. wlAtk.scoreChange = atkDelta
  457. wlAtk.myScore = atkScore
  458. wlAtk.defName = msg.defName or ""
  459. wlAtk.defServerId = msg.defServerId or 0
  460. wlAtk.raceResults = msg.raceResults or {}
  461. if not sendWL(atkFd, wlAtk) then
  462. BzcsLog.logAction("fight_end_wl_fail", string.format("atk=%s atkSvr=%s", atkUuid or "", msg.atkServerId or 0))
  463. end
  464. local defInfo = BaiZhanChengShenDB.GetPlayer(defUuid)
  465. if defInfo and defInfo.isRobot ~= 1 and defInfo.serverId and defScore then
  466. local defFd = MiddleManager.getFDBySvrIndex(defInfo.serverId)
  467. if defFd then
  468. local wlDef = InnerMsg.wl.WL_BZCS_DEF_NOTIFY
  469. wlDef.playerUuid = defUuid
  470. wlDef.atkName = msg.atkName or ""
  471. wlDef.atkServerId = msg.atkServerId or 0
  472. wlDef.atkWin = msg.atkWin == 1 and 0 or 1
  473. wlDef.scoreChange = defDelta
  474. wlDef.myScore = defScore
  475. wlDef.raceResults = msg.raceResults or {}
  476. sendWL(defFd, wlDef)
  477. end
  478. elseif defInfo and defInfo.isRobot ~= 1 and not defScore then
  479. BzcsLog.logAction("fight_end_def_score_fail", string.format(
  480. "def=%s defSvr=%s delta=%s", defUuid or "", defInfo.serverId or 0, defDelta
  481. ))
  482. end
  483. end