Bladeren bron

巅峰战场相关

gitxsm 4 maanden geleden
bovenliggende
commit
e7d2afa198

+ 1 - 0
script/common/DB.lua

@@ -37,6 +37,7 @@ db_middle_rank			=	Config.DB_NAME .. ".middle_rank"		 -- 中心服排行榜数
 db_gods_area			=	Config.DB_NAME .. ".godsArea"			 -- 诸神圣域
 db_area_battle			= 	Config.DB_NAME .. ".areaBattle"			 -- 战区争霸
 db_anotherWorldBattle	= 	Config.DB_NAME .. ".anotherWorldBattle"	 -- 异界之战
+db_battleground			= 	Config.DB_NAME .. ".battleground"	 	 -- 跨服活动之巅峰战场
 -- 加db第一步 请先确认是否要建对应字段的索引 第二步请确认合服逻辑是否要修改 
 
 function init()

+ 94 - 23
script/common/InnerHandler.lua

@@ -34,6 +34,8 @@ local AreaBattleCS = require("areaBattle.AreaBattleCS")
 local AreaBattleNS = require("areaBattle.AreaBattleNS")
 local AnotherWorldBattleNS = require("anotherWorldBattle.AnotherWorldBattleNS")
 local AnotherWorldBattleCS = require("anotherWorldBattle.AnotherWorldBattleCS")
+local ServerCommerceActBattleGroundNS = require("serverCommerce.ServerCommerceActBattleGroundNS")
+local ServerCommerceActBattleGroundCS = require("serverCommerce.ServerCommerceActBattleGroundCS")
 
 
 
@@ -584,48 +586,117 @@ end
 
 -------------------- 巅峰战场跨服协议开始 ---------------------------
 -- 普通服请求跨服排名数据(普通->中心)
-function LW_PEAK_BATTLEFIELD_QUERY_RANK_O2C(fd, msg)
+-- function LW_PEAK_BATTLEFIELD_QUERY_RANK_O2C(fd, msg)
+--     if _G.is_middle ~= true then return end
+--     ServerCommerceActPeakBettleMiddle.LW_PEAK_BATTLEFIELD_QUERY_RANK_O2C(fd, msg)
+-- end
+
+-- -- 请求跨服排名数据(中心->数据服)
+-- function WL_PEAK_BATTLEFIELD_QUERY_RANK_C2D(fd, msg)
+--     ServerCommerceActPeakBettleMiddle.WL_PEAK_BATTLEFIELD_QUERY_RANK_C2D(fd, msg)
+-- end
+
+-- -- 请求跨服排名数据(数据服->中心)
+-- function LW_PEAK_BATTLEFIELD_QUERY_RANK_D2C(fd, msg)
+--     if _G.is_middle ~= true then return end
+--     ServerCommerceActPeakBettleMiddle.LW_PEAK_BATTLEFIELD_QUERY_RANK_D2C(fd, msg)
+-- end
+
+-- -- 获取到跨服排名数据(中心->普通)
+-- function WL_PEAK_BATTLEFIELD_QUERY_RANK_C2O(fd, msg)
+--     ServerCommerceActPeakBettleMiddle.WL_PEAK_BATTLEFIELD_QUERY_RANK_C2O(fd, msg)
+-- end
+
+-- -- 普通服通知排名变化(普通->中心)
+-- function LW_PEAK_BATTLEFIELD_RANK_CHANGE_O2C(fd, msg)
+--     if _G.is_middle ~= true then return end
+--     ServerCommerceActPeakBettleMiddle.LW_PEAK_BATTLEFIELD_RANK_CHANGE_O2C(fd, msg)
+-- end
+
+-- -- 排名变化通知(中心->数据服)
+-- function WL_PEAK_BATTLEFIELD_RANK_CHANGE_C2D(fd, msg)
+--     ServerCommerceActPeakBettleMiddle.WL_PEAK_BATTLEFIELD_RANK_CHANGE_C2D(fd, msg)
+-- end
+
+-- -- 发送排名奖励(数据服->中心)
+-- function LW_PEAK_BATTLEFIELD_SEND_RANK_REWARD_D2C(fd, msg)
+--     if _G.is_middle ~= true then return end
+--     ServerCommerceActPeakBettleMiddle.LW_PEAK_BATTLEFIELD_SEND_RANK_REWARD_D2C(fd, msg)
+-- end
+
+-- -- 发送排名奖励(中心->普通)
+-- function WL_PEAK_BATTLEFIELD_SEND_RANK_REWARD_C2O(fd, msg)
+--     ServerCommerceActPeakBettleMiddle.WL_PEAK_BATTLEFIELD_SEND_RANK_REWARD_C2O(fd, msg)
+-- end
+
+function LW_BATTLEGROUND_PLAYER_RANK_QUERY(fd, msg)
     if _G.is_middle ~= true then return end
-    ServerCommerceActPeakBettleMiddle.LW_PEAK_BATTLEFIELD_QUERY_RANK_O2C(fd, msg)
+    ServerCommerceActBattleGroundCS.BG_N2C_PlayerRank_Req(msg)
+end
+function WL_BATTLEGROUND_PLAYER_RANK_QUERY(fd, msg)
+    ServerCommerceActBattleGroundNS.BG_C2N_PlayerRank_Res(msg)
 end
 
--- 请求跨服排名数据(中心->数据服)
-function WL_PEAK_BATTLEFIELD_QUERY_RANK_C2D(fd, msg)
-    ServerCommerceActPeakBettleMiddle.WL_PEAK_BATTLEFIELD_QUERY_RANK_C2D(fd, msg)
+function LW_BATTLEGROUND_MATCHLIST_QUERY(fd, msg)
+    if _G.is_middle ~= true then return end
+    ServerCommerceActBattleGroundCS.BG_N2C_MatchList_Req(msg)
+end
+function WL_BATTLEGROUND_MATCHLIST_QUERY(fd, msg)
+    ServerCommerceActBattleGroundNS.BG_C2N_MatchList_Res(msg)
+end
+
+
+function LW_BATTLEGROUND_PLAYER_DATA_QUERY(fd, msg)
+    if _G.is_middle ~= true then return end
+    ServerCommerceActBattleGroundCS.BG_N2C_PlayerData_Req(msg)
+end
+function WL_BATTLEGROUND_PLAYER_DATA_QUERY(fd, msg)
+    ServerCommerceActBattleGroundNS.BG_C2N_PlayerData_Res(msg)
 end
 
--- 请求跨服排名数据(数据服->中心)
-function LW_PEAK_BATTLEFIELD_QUERY_RANK_D2C(fd, msg)
+
+function LW_BATTLEGROUND_RANKLIST_QUERY(fd, msg)
     if _G.is_middle ~= true then return end
-    ServerCommerceActPeakBettleMiddle.LW_PEAK_BATTLEFIELD_QUERY_RANK_D2C(fd, msg)
+    ServerCommerceActBattleGroundCS.BG_N2C_RankList_Req(msg)
+end
+function WL_BATTLEGROUND_RANKLIST_QUERY(fd, msg)
+    ServerCommerceActBattleGroundNS.BG_C2N_RankList_Res(msg)
 end
 
--- 获取到跨服排名数据(中心->普通)
-function WL_PEAK_BATTLEFIELD_QUERY_RANK_C2O(fd, msg)
-    ServerCommerceActPeakBettleMiddle.WL_PEAK_BATTLEFIELD_QUERY_RANK_C2O(fd, msg)
+
+function LW_BATTLEGROUND_CHALLENGE_QUERY(fd, msg)
+    if _G.is_middle ~= true then return end
+    ServerCommerceActBattleGroundCS.BG_N2C_Challenge_Req(msg)
+end
+function WL_BATTLEGROUND_CHALLENGE_QUERY(fd, msg)
+    ServerCommerceActBattleGroundNS.BG_C2N_Challenge_Res(msg)
 end
 
--- 普通服通知排名变化(普通->中心)
-function LW_PEAK_BATTLEFIELD_RANK_CHANGE_O2C(fd, msg)
+
+function LW_BATTLEGROUND_CHALLENGE_END(fd, msg)
     if _G.is_middle ~= true then return end
-    ServerCommerceActPeakBettleMiddle.LW_PEAK_BATTLEFIELD_RANK_CHANGE_O2C(fd, msg)
+    ServerCommerceActBattleGroundCS.BG_N2C_Challenge_End(msg)
 end
 
--- 排名变化通知(中心->数据服)
-function WL_PEAK_BATTLEFIELD_RANK_CHANGE_C2D(fd, msg)
-    ServerCommerceActPeakBettleMiddle.WL_PEAK_BATTLEFIELD_RANK_CHANGE_C2D(fd, msg)
+function WL_BATTLEGROUND_NOTIFY_PLAYER(fd, msg)
+    ServerCommerceActBattleGroundNS.BG_C2N_RankReduce(msg)
 end
 
--- 发送排名奖励(数据服->中心)
-function LW_PEAK_BATTLEFIELD_SEND_RANK_REWARD_D2C(fd, msg)
+function LW_BATTLEGROUND_LINEUP_UPDATE(fd, msg)
     if _G.is_middle ~= true then return end
-    ServerCommerceActPeakBettleMiddle.LW_PEAK_BATTLEFIELD_SEND_RANK_REWARD_D2C(fd, msg)
+    ServerCommerceActBattleGroundCS.BG_N2C_Lineup_Update(msg)
 end
 
--- 发送排名奖励(中心->普通)
-function WL_PEAK_BATTLEFIELD_SEND_RANK_REWARD_C2O(fd, msg)
-    ServerCommerceActPeakBettleMiddle.WL_PEAK_BATTLEFIELD_SEND_RANK_REWARD_C2O(fd, msg)
+function LW_BATTLEGROUND_ACT_END(fd, msg)
+    if _G.is_middle ~= true then return end
+    ServerCommerceActBattleGroundCS.BG_N2C_Act_End(msg)
 end
+
+function WL_BATTLEGROUND_NOTIFY_PRIZEAWARD(fd, msg)
+    ServerCommerceActBattleGroundNS.BG_C2N_PrizeAward(msg)
+end
+
+
 -------------------- 巅峰战场跨服协议结束 ---------------------------
 
 -------------------- 返利开始 ---------------------------

+ 61 - 50
script/common/InnerProto.lua

@@ -1053,64 +1053,75 @@ WL_AREABATTLE_VIDEOSHOW_QUERY = {
 -- }
 
 
--- -- 查询玩家信息
--- LW_BATTLEGROUND_PLAYER_DATA_QUERY = {
---   {"sourceServerId",          "int"},        -- 请求服服务器Id
---   {"playerUuid",              "string"},     -- 玩家uuid
---   {"playerRank",               "int"},       -- 玩家排名
--- }
--- WL_BATTLEGROUND_PLAYER_DATA_QUERY = {
---   {"playerUuid",              "string"},     -- 玩家uuid
---   {"playerInfo",              "table"},      -- 玩家信息
--- }
+-- 查询玩家信息
+LW_BATTLEGROUND_PLAYER_DATA_QUERY = {
+  {"sourceServerId",          "int"},        -- 请求服服务器Id
+  {"playerUuid",              "string"},     -- 玩家uuid
+  {"playerRank",               "int"},       -- 玩家排名
+}
+WL_BATTLEGROUND_PLAYER_DATA_QUERY = {
+  {"playerUuid",              "string"},     -- 玩家uuid
+  {"playerInfo",              "table"},      -- 玩家信息
+}
 
 
--- -- 查询排行榜数据
--- LW_BATTLEGROUND_RANKLIST_QUERY = {
---   {"sourceServerId",          "int"},        -- 请求服服务器Id
---   {"playerUuid",              "string"},     -- 玩家uuid
--- }
--- WL_BATTLEGROUND_RANKLIST_QUERY = {
---   {"playerUuid",              "string"},     -- 玩家uuid
---   {"rankList",                "table"},      -- 排行榜信息
--- }
+-- 查询排行榜数据
+LW_BATTLEGROUND_RANKLIST_QUERY = {
+  {"sourceServerId",          "int"},        -- 请求服服务器Id
+  {"playerUuid",              "string"},     -- 玩家uuid
+}
+WL_BATTLEGROUND_RANKLIST_QUERY = {
+  {"playerUuid",              "string"},     -- 玩家uuid
+  {"rankList",                "table"},      -- 排行榜信息
+}
 
 
--- -- 请求挑战玩家
--- LW_BATTLEGROUND_CHALLENGE_QUERY = {
---   {"sourceServerId",          "int"},        -- 请求服服务器Id
---   {"playerUuid",              "string"},     -- 玩家uuid
---   {"rank",                    "int"},        -- 排名数组
--- }
--- WL_BATTLEGROUND_CHALLENGE_QUERY = {
---   {"playerUuid",              "string"},     -- 玩家uuid
---   {"playerInfo",              "table"},      -- 排名数组
--- }
+-- 请求挑战玩家
+LW_BATTLEGROUND_CHALLENGE_QUERY = {
+  {"sourceServerId",          "int"},        -- 请求服服务器Id
+  {"playerUuid",              "string"},     -- 玩家uuid
+  {"rank",                    "int"},        -- 排名数组
+}
+WL_BATTLEGROUND_CHALLENGE_QUERY = {
+  {"errCode",                 "int"},        -- 错误码
+  {"playerUuid",              "string"},     -- 玩家uuid
+  {"playerInfo",              "table"},      -- 玩家数组
+}
 
--- -- 挑战结束
--- LW_BATTLEGROUND_CHALLENGE_END = {
---   {"sourceServerId",          "int"},        -- 请求服服务器Id
---   {"playerUuid",              "string"},     -- 玩家uuid
---   {"challengeRes",            "int"},        -- 挑战结果
---   {"playerShowData",          "table"},      -- 玩家展示信息
--- }
+-- 挑战结束
+LW_BATTLEGROUND_CHALLENGE_END = {
+  {"sourceServerId",          "int"},        -- 请求服服务器Id
+  {"playerUuid",              "string"},     -- 玩家uuid
+  {"atkRank",                 "int"},        -- 挑战方原排名
+  {"defRank",                 "int"},        -- 防守方原排名
+  {"challengeRes",            "int"},        -- 挑战结果
+  {"playerShowData",          "table"},      -- 挑战方玩家展示信息
+}
 
--- -- 通知玩家被打落排名了
--- WL_BATTLEGROUND_NOTIFY_PLAYER = {
---   {"playerUuid",              "string"},     -- 玩家uuid
--- }
+-- 通知玩家排名降低了
+WL_BATTLEGROUND_NOTIFY_PLAYER = {
+  {"playerUuid",              "string"},     -- 玩家uuid
+  {"newRank",                 "int"},        -- 最新排名
+  {"atkeServerId",            "int"},        -- 挑战方服务器Id
+  {"atkName",                 "string"},     -- 挑战者名字
+}
 
--- -- 玩家更新阵容
--- LW_BATTLEGROUND_LINEUP_UPDATE = {
---   {"sourceServerId",          "int"},        -- 请求服服务器Id
---   {"playerUuid",              "string"},     -- 玩家uuid
---   {"heroArr",                 "table"},      -- 阵容英雄列表
--- }
+-- 玩家更新阵容
+LW_BATTLEGROUND_LINEUP_UPDATE = {
+  {"sourceServerId",          "int"},        -- 请求服服务器Id
+  {"playerUuid",              "string"},     -- 玩家uuid
+  {"heroArr",                 "table"},      -- 阵容英雄列表
+}
 
--- -- 通知发奖
--- WL_BATTLEGROUND_NOTIFY_PRIZEAWARD = {
---   {"playerArr",              "table"},     -- 要发奖的玩家信息列表
--- }
+-- 活动结束
+LW_BATTLEGROUND_ACT_END = {
+  {"sourceServerId",          "int"},        -- 请求服服务器Id
+}
+
+-- 通知发奖
+WL_BATTLEGROUND_NOTIFY_PRIZEAWARD = {
+  {"playerArr",              "table"},     -- 要发奖的玩家信息列表
+}
 
 
 --------------------- 巅峰战场跨服协议结束 -----------------------------------

+ 26 - 8
script/common/InnerProtoID.lua

@@ -123,14 +123,23 @@ _ENV[123] = 'LW_AREABATTLE_VIDEOSHOW_QUERY'
 _ENV[124] = 'WL_AREABATTLE_VIDEOSHOW_QUERY'
 
 -- 巅峰战场跨服协议
-_ENV[125] = 'LW_PEAK_BATTLEFIELD_QUERY_RANK_O2C'
-_ENV[126] = 'WL_PEAK_BATTLEFIELD_QUERY_RANK_C2D'
-_ENV[127] = 'LW_PEAK_BATTLEFIELD_QUERY_RANK_D2C'
-_ENV[128] = 'WL_PEAK_BATTLEFIELD_QUERY_RANK_C2O'
-_ENV[129] = 'LW_PEAK_BATTLEFIELD_RANK_CHANGE_O2C'
-_ENV[130] = 'WL_PEAK_BATTLEFIELD_RANK_CHANGE_C2D'
-_ENV[131] = 'LW_PEAK_BATTLEFIELD_SEND_RANK_REWARD_D2C'
-_ENV[132] = 'WL_PEAK_BATTLEFIELD_SEND_RANK_REWARD_C2O'
+-- _ENV[125] = 'LW_PEAK_BATTLEFIELD_QUERY_RANK_O2C'
+-- _ENV[126] = 'WL_PEAK_BATTLEFIELD_QUERY_RANK_C2D'
+-- _ENV[127] = 'LW_PEAK_BATTLEFIELD_QUERY_RANK_D2C'
+-- _ENV[128] = 'WL_PEAK_BATTLEFIELD_QUERY_RANK_C2O'
+-- _ENV[129] = 'LW_PEAK_BATTLEFIELD_RANK_CHANGE_O2C'
+-- _ENV[130] = 'WL_PEAK_BATTLEFIELD_RANK_CHANGE_C2D'
+-- _ENV[131] = 'LW_PEAK_BATTLEFIELD_SEND_RANK_REWARD_D2C'
+-- _ENV[132] = 'WL_PEAK_BATTLEFIELD_SEND_RANK_REWARD_C2O'
+
+_ENV[125] = 'LW_BATTLEGROUND_PLAYER_RANK_QUERY'
+_ENV[126] = 'WL_BATTLEGROUND_PLAYER_RANK_QUERY'
+_ENV[127] = 'LW_BATTLEGROUND_PLAYER_DATA_QUERY'
+_ENV[128] = 'WL_BATTLEGROUND_PLAYER_DATA_QUERY'
+_ENV[129] = 'LW_BATTLEGROUND_RANKLIST_QUERY'
+_ENV[130] = 'WL_BATTLEGROUND_RANKLIST_QUERY'
+_ENV[131] = 'LW_BATTLEGROUND_CHALLENGE_QUERY'
+_ENV[132] = 'WL_BATTLEGROUND_CHALLENGE_QUERY'
 
 _ENV[133] = 'WL_ANOTHERWORLDBATTLE_TIPS'
 _ENV[134] = 'LW_ANOTHERWORLDBATTLE_GET_STATE'
@@ -171,3 +180,12 @@ _ENV[168] = 'WL_ANOTHERWORLDBATTLE_GET_MYUIONMORALE'
 _ENV[169] = 'LW_ANOTHERWORLDBATTLE_UIONMORALE_DO'
 _ENV[170] = 'WL_ANOTHERWORLDBATTLE_UIONMORALE_DO'
 
+
+_ENV[171] = 'LW_BATTLEGROUND_CHALLENGE_END'
+_ENV[172] = 'WL_BATTLEGROUND_NOTIFY_PLAYER'
+_ENV[173] = 'LW_BATTLEGROUND_LINEUP_UPDATE'
+_ENV[174] = 'WL_BATTLEGROUND_NOTIFY_PRIZEAWARD'
+_ENV[175] = 'LW_BATTLEGROUND_MATCHLIST_QUERY'
+_ENV[176] = 'WL_BATTLEGROUND_MATCHLIST_QUERY'
+_ENV[177] = 'LW_BATTLEGROUND_ACT_END'
+

+ 7 - 1
script/common/Lang.lua

@@ -853,4 +853,10 @@ AB_MIYAO_NOT_ENOUG = [[秘钥不足]]
 
 LOST_NO_BUY = [[未达一键扫荡条件]]
 LOST_HAS_CHALLENGE = [[已经战斗过, 不能一键扫荡]]
-LOST_HAS_ONECLICKSWEEP = [[已经一键扫荡过]]
+LOST_HAS_ONECLICKSWEEP = [[已经一键扫荡过]]
+
+
+--------------------------巅峰战场-------------------------
+BG_MATCHLIST_ERR = [[匹配列表中未找到该对手]]
+BG_COMBAT_TYPE_ERR = [[战斗类型错误]]
+BG_CONDITION_ERR = [[挑战次数或挑战券不足]]

+ 1 - 0
script/common/LogDefine.lua

@@ -314,6 +314,7 @@ DEFINE = {
 	elfUpGradeStar			= 776,			-- 精灵升星
 	anotherWorldBattleTreasure = 777,		-- 异界寻宝
 	AnotherWorldBattleNS 	= 778,			-- 异界之战
+	ServerCommerceActBattleGround 	= 779,  -- 巅峰战场
 
 
 	errHandle				= 99999,		-- 异常处理

+ 13 - 13
script/common/ProtoID.lua

@@ -1737,18 +1737,18 @@ _ENV[1777]="CG_ZHUANPAN_ONCE_REWARD_GET"
 _ENV[1778]="CG_ALL_HERO_BOOK_QUERY"
 _ENV[1779]="GC_ALL_HERO_BOOK_QUERY"
 
--- _ENV[1780]="CG_SERVEERCOMMERCE_ACT_BATTLEGROUND_MAINPAGE_QUERY"
--- _ENV[1781]="GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_MAINPAGE_QUERY"
--- _ENV[1782]="CG_SERVEERCOMMERCE_ACT_BATTLEGROUND_MATCHLIST_QUERY"
--- _ENV[1783]="GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_MATCHLIST_QUERY"
--- _ENV[1784]="CG_SERVEERCOMMERCE_ACT_BATTLEGROUND_PLAYER_QUERY"
--- _ENV[1785]="GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_PLAYER_QUERY"
--- _ENV[1786]="CG_SERVEERCOMMERCE_ACT_BATTLEGROUND_HEROBAG_QUERY"
--- _ENV[1787]="GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_HEROBAG_QUERY"
--- _ENV[1788]="CG_SERVEERCOMMERCE_ACT_BATTLEGROUND_RANK_QUERY"
--- _ENV[1789]="GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_RANK_QUERY"
--- _ENV[1790]="CG_SERVEERCOMMERCE_ACT_BATTLEGROUND_RANKAWARD_QUERY"
--- _ENV[1791]="GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_RANKAWARD_QUERY"
--- _ENV[1792]="CG_SERVEERCOMMERCE_ACT_BATTLEGROUND_ATKLINEUP_UPDATE"
+_ENV[1781]="CG_SERVEERCOMMERCE_ACT_BATTLEGROUND_MAINPAGE_QUERY"
+_ENV[1782]="GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_MAINPAGE_QUERY"
+_ENV[1783]="CG_SERVEERCOMMERCE_ACT_BATTLEGROUND_MATCHLIST_QUERY"
+_ENV[1784]="GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_MATCHLIST_QUERY"
+_ENV[1785]="CG_SERVEERCOMMERCE_ACT_BATTLEGROUND_PLAYER_QUERY"
+_ENV[1786]="GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_PLAYER_QUERY"
+_ENV[1787]="CG_SERVEERCOMMERCE_ACT_BATTLEGROUND_HEROBAG_QUERY"
+_ENV[1788]="GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_HEROBAG_QUERY"
+_ENV[1789]="CG_SERVEERCOMMERCE_ACT_BATTLEGROUND_RANK_QUERY"
+_ENV[1790]="GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_RANK_QUERY"
+_ENV[1791]="CG_SERVEERCOMMERCE_ACT_BATTLEGROUND_RANKAWARD_QUERY"
+_ENV[1792]="GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_RANKAWARD_QUERY"
+_ENV[1793]="CG_SERVEERCOMMERCE_ACT_BATTLEGROUND_ATKLINEUP_UPDATE"
 
 _ENV[1795]="GC_AB_TIPS"

+ 1 - 1
script/module/combat/CombatDefine.lua

@@ -207,9 +207,9 @@ COMBAT_TYPE31 = 31 --幽暗禁地
 COMBAT_TYPE32 = 32 --诸神圣域
 COMBAT_TYPE33 = 33 -- 战区争霸
 COMBAT_TYPE34 = 34 --节日活动BOSS
-
 COMBAT_TYPE35 = 35 --异界之战进攻
 COMBAT_TYPE36 = 36 --异界之战防守
+COMBAT_TYPE37 = 37 -- 巅峰战场
 
 
 

+ 8 - 1
script/module/middle/MiddleCommonLogic.lua

@@ -195,6 +195,13 @@ function MiddleCommonLogic_CombatBegin_LW(human, msg)
     print("[MiddleCommonLogic_CombatBegin_LW] 发送给中心服 = ")
 end
 
+
+
+local sp_combatType_list = {
+    [CombatDefine.COMBAT_TYPE35] = true,
+    [CombatDefine.COMBAT_TYPE37] = true,
+}
+
 -- msg = WL_COMBAT_GETINFO
 function MiddleCommonLogic_CombatBegin_WL(fd, msg)
     local tMsgData = InnerMsg.lw.LW_COMBAT_GETINFO_SEND
@@ -213,7 +220,7 @@ function MiddleCommonLogic_CombatBegin_WL(fd, msg)
 
 	-- local combatHero = CombatPosLogic.getCombatHeros(fakeHuman, CombatDefine.COMBAT_TYPE1, nil, true)
 
-    if CombatDefine.COMBAT_TYPE35 ~= nCombatType then
+    if not sp_combatType_list[nCombatType] then
         local combatHero = CombatPosLogic.getCombatHeros(fakeHuman, nCombatType, nil, true)
         if not combatHero or not next(combatHero) then
             print("[MiddleCommonLogic_CombatBegin_WL] 没有获取到对应玩家的英雄列表, 取默认战斗列表")

+ 3 - 0
script/module/middle/MiddleConnect.lua

@@ -110,6 +110,9 @@ end
 function initAfterStart()
     onTimer() -- 啟動拉取一下middleInfo
     MiddleCommonRank.MiddleCommonRank_InitAfterStart()
+
+    local ServerCommerceActBattleGroundCS = require("serverCommerce.ServerCommerceActBattleGroundCS")
+    ServerCommerceActBattleGroundCS.BattleGround_InitAfterStart()
 end
 
 function onTimer()

+ 1 - 0
script/module/middle/MiddleDefine.lua

@@ -13,6 +13,7 @@ MIDDLE_CAN_COMBAT =
     [16] = 1,           -- 天梯赛 防
     [32] = 1,           -- 诸神圣域
     [35] = 1,           -- 异界之战
+    [37] = 1,           -- 巅峰战场
 }
 
 MIDDLE_GET_COMBAT_TIME = 5      -- 跨服战斗请求数据超时时间

+ 31 - 2
script/module/serverCommerce/Handler.lua

@@ -2,7 +2,8 @@ local CommerceActCharge = require("serverCommerce.ServerCommerceActCharge")
 local CommerceActShop = require("serverCommerce.ServerCommerceActShop")
 local CommerceActRank = require("serverCommerce.ServerCommerceActRank")
 local CommerceActTask =  require("serverCommerce.ServerCommerceActTask")
-local CommerceActPeakBettle = require("serverCommerce.ServerCommerceActPeakBettle")
+-- local CommerceActPeakBettle = require("serverCommerce.ServerCommerceActPeakBettle")
+local ServerCommerceActBattleGroundNS = require("serverCommerce.ServerCommerceActBattleGroundNS")
 
 -- 请求战区集结任务信息
 function CG_SERVEERCOMMERCE_ACT_TASKQUERY(human, msg)
@@ -68,4 +69,32 @@ end
 -- -- 查询排名奖励
 -- function CG_PEAK_BATTLEFIELD_RANK_REWARD_QUERY(human)
 --     CommerceActPeakBettle.CommerceActPeakBettle_RankRewardQuery(human)
--- end
+-- end
+
+function CG_SERVEERCOMMERCE_ACT_BATTLEGROUND_MAINPAGE_QUERY(human, msg)
+    ServerCommerceActBattleGroundNS.BattleGround_MainPage_Query(human)
+end
+
+function CG_SERVEERCOMMERCE_ACT_BATTLEGROUND_MATCHLIST_QUERY(human, msg)
+    ServerCommerceActBattleGroundNS.BattleGround_MatchPage_Query(human)
+end
+
+function CG_SERVEERCOMMERCE_ACT_BATTLEGROUND_PLAYER_QUERY(human, msg)
+    ServerCommerceActBattleGroundNS.BattleGround_Player_Query(human, msg.rank)
+end
+
+function CG_SERVEERCOMMERCE_ACT_BATTLEGROUND_HEROBAG_QUERY(human, msg)
+    ServerCommerceActBattleGroundNS.BattleGround_HeroBag_Query(human)
+end
+
+function CG_SERVEERCOMMERCE_ACT_BATTLEGROUND_RANK_QUERY(human, msg)
+    ServerCommerceActBattleGroundNS.BattleGround_RankList_Query(human)
+end
+
+function GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_RANKAWARD_QUERY(human, msg)
+    ServerCommerceActBattleGroundNS.BattleGround_RankAward_Query(human)
+end
+
+function CG_SERVEERCOMMERCE_ACT_BATTLEGROUND_ATKLINEUP_UPDATE(human, msg)
+    ServerCommerceActBattleGroundNS.BattleGround_Lineup_Update(human, msg)
+end

+ 91 - 1
script/module/serverCommerce/Proto.lua

@@ -213,4 +213,94 @@ GC_SERVEERCOMMERCE_ACT_RANK_QUERY = {
 -- GC_PEAK_BATTLEFIELD_RANK_REWARD_QUERY = {
 --     {"rank",            1,      "int"},                    -- 当前排名
 --     {"rewardList",      20,     "int"},                     -- 排名奖励ID列表
--- }
+-- }
+
+BATTLEGROUND_MATCHPLAYER_INFO = {
+    {"rank",              1,      "int"},                  -- 当前排名
+    {"serverId",          1,      "int"},                  -- 所属服务器Id
+    {"name",              1,      "string"},               -- 名字
+    {"showBodyId",        1,      "int"},                  -- 形象Id
+}
+
+BATTLEGROUND_HERO_INFO = {
+    {"heroHeadId",            1,      "int"},              -- 英雄头像Id
+    {"heroName",              1,      "string"},           -- 英雄名字
+    {"heroCamp",              1,      "byte"},             -- 英雄种族
+    {"heroLv",                1,      "short"},            -- 英雄等级
+    {"heroStar",              1,      "byte"},             -- 英雄星级
+    {"heroGrade",             1,      "byte"},             -- 英雄品质
+    {"heroBodyId",            1,      "int"},              -- 英雄形像Id
+    {"heroId",                1,      "int"},              -- 英雄Id
+}
+
+SERVEERCOMMERCE_ACT_RANK_INFO = {
+    {"rank",              1,      "int"},                  -- 当前排名
+    {"serverId",          1,      "int"},                  -- 所属服务器Id
+    {"name",              1,      "string"},               -- 名字
+    {"heroHeadId",        1,      "int"},                  -- 玩家头像Id
+    {"heroHeadFrameId",   1,      "int"},                  -- 玩家头像框Id
+}
+
+SERVEERCOMMERCE_ACT_RANKAWARD_INFO = {
+    {"minRank",                1,      "short"},            -- 最低排名
+    {"maxRank",                1,      "short"},            -- 最高排名
+    {"rankAward",              3,      ItemData},           -- 排名奖励
+}
+
+
+-- 查询巅峰战场主界面数据
+CG_SERVEERCOMMERCE_ACT_BATTLEGROUND_MAINPAGE_QUERY = {}
+GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_MAINPAGE_QUERY = {
+    {"myRank",              1,      "int"},                  -- 当前排名
+    {"freeChallengeCnt",    1,      "byte"},                 -- 免费挑战次数
+    {"showBodyId",           1,      "int"},                 -- 形象Id
+}
+
+-- 匹配列表界面查询
+CG_SERVEERCOMMERCE_ACT_BATTLEGROUND_MATCHLIST_QUERY = {}
+GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_MATCHLIST_QUERY = {
+    {"myRank",              1,      "int"},                  -- 当前排名
+    {"freeChallengeCnt",    1,      "byte"},                 -- 免费挑战次数
+    {"matchList",           5,      BATTLEGROUND_MATCHPLAYER_INFO},   -- 匹配列表
+    {"isGetNew",            1,      "byte"},                 -- 是否获得新英雄, 0-没有, 1-有
+    {"exchangeCost",        1,      ItemData},               -- 挑战一次消耗的挑战券信息
+}
+
+-- 查询玩家数据
+CG_SERVEERCOMMERCE_ACT_BATTLEGROUND_PLAYER_QUERY = {
+    {"rank",              1,      "int"},                  -- 当前排名
+}
+GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_PLAYER_QUERY = {
+    {"serverId",          1,      "int"},                  -- 所属服务器Id
+    {"name",              1,      "string"},               -- 名字
+    {"heroArr",           6,      BATTLEGROUND_HERO_INFO}, -- 英雄列表
+    {"heroHeadId",        1,      "int"},                  -- 玩家头像Id
+    {"heroHeadFrameId",   1,      "int"},                  -- 玩家头像框Id
+}
+
+-- 英雄背包查询
+CG_SERVEERCOMMERCE_ACT_BATTLEGROUND_HEROBAG_QUERY = {}
+GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_HEROBAG_QUERY = {
+    {"heroArr",           30,      BATTLEGROUND_HERO_INFO}, -- 英雄列表
+    {"isEnd",              1,      "byte"},        -- 分段协议发送完成标识, 0-没有, 1-发完
+}
+
+-- 排行榜查询
+CG_SERVEERCOMMERCE_ACT_BATTLEGROUND_RANK_QUERY = {}
+GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_RANK_QUERY = {
+    {"rankList",           20,      SERVEERCOMMERCE_ACT_RANK_INFO}, -- 排行榜列表
+    {"myRankInfo",         1,        SERVEERCOMMERCE_ACT_RANK_INFO}, -- 我的排名信息
+    {"isEnd",              1,      "byte"}, -- 分段发完标识, 0-没有, 1-发完
+}
+
+-- 排名奖励查询
+CG_SERVEERCOMMERCE_ACT_BATTLEGROUND_RANKAWARD_QUERY = {}
+GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_RANKAWARD_QUERY = {
+    {"rankAwardList",           10,      SERVEERCOMMERCE_ACT_RANKAWARD_INFO}, -- 排行榜奖励
+}
+
+-- 设置进攻阵容
+CG_SERVEERCOMMERCE_ACT_BATTLEGROUND_ATKLINEUP_UPDATE = {
+    {"formation",	1,	    "short"},--阵法
+	{"heroList"	,	1,		"string"}, --上阵英雄
+}

+ 479 - 0
script/module/serverCommerce/ServerCommerceActBattleGroundCS.lua

@@ -0,0 +1,479 @@
+-- 跨服商业活动-巅峰战场(跨服)
+
+local Msg = require("core.Msg")
+local Timer = require("core.Timer")
+local DB = require("common.DB")
+local CommonDB = require("common.CommonDB")
+local CommonDefine = require("common.CommonDefine")
+local Log = require("common.Log")
+local LuaMongo = _G.lua_mongo
+local Util = require("common.Util")
+local Grid = require("bag.Grid")
+local MiddleConnect = require("middle.MiddleConnect")
+local InnerMsg = require("core.InnerMsg")
+local MiddleManager = require("middle.MiddleManager")
+local NpcConfig = require("excel.jjc").skyladdernpc
+local CreateRole = require("role.CreateRole")
+local ServerCommerceActDefine = require("serverCommerce.ServerCommerceActDefine")
+local CombatDefine = require("combat.CombatDefine")
+
+local dbUpdate = {_id=nil}
+local dbUpdateField = {}
+
+local RANK_SHOW_NUM = 50    -- 排行榜显示的数量
+local notifyActEnd = false  -- 是否收到活动结束通知的标识
+
+local battleGroundData = {
+    -- allAreaRankList = { -- 各个战区排行榜, 榜上的都是真实玩家
+    --     [WarZoneServerIdx] = {
+    --         [rank] = {
+    --             rank = rank,
+    --             serverId = serverId,
+    --             playerUuid = playerUuid,
+    --             name = name,
+    --             bodyId = bodyId,
+    --             headId = headId,
+    --             headFrameId = headFrameId,
+    --             heroArr = {heroId1, heroId2},
+    --         },
+    --     },
+    -- },
+
+    -- generaRankList = {   -- 通用排行榜(榜上都是机器人),各个战区排行榜上没有真实玩家或对应排名没有真实玩家时, 使用该排行榜
+    --         [rank] = {
+    --             rank = rank,
+    --             serverId = serverId,
+    --             playerUuid = playerUuid,
+    --             name = name,
+    --             bodyId = bodyId,
+    --             headId = headId,
+    --             headFrameId = headFrameId,
+    --             monsterOutID = monsterOutID, -- 机器人才有
+    --             heroArr = {heroId1, heroId2},
+    --         },
+    --     },
+    -- },
+
+    -- joinList = { -- 参加过该活动的玩家列表
+    --     -- {serverId, playerUuid},
+    --     -- {serverId2, playerUuid2},
+    -- },
+}
+
+local function cmp(a, b)
+    return a.rank < b.rank
+end
+
+-- 生成一个排行榜列表
+local function genRankList(rankList)
+    local function genPlayerData(player, tNpcConfig, rank)
+        local r = math.random(1, #tNpcConfig.monsterOutID)
+        player.rank = rank
+        player.name = CreateRole.getRandomName()
+        player.headId = CreateRole.getRandomHead()
+        player.headFrameId = CreateRole.getRandomHeadFrame()
+        player.bodyId = CreateRole.getRandomBody()
+        player.playerUuid = tNpcConfig.monsterOutID[r]
+        player.monsterOutID = tNpcConfig.monsterOutID[r]
+    end
+
+    local rank = 1
+    for _, cfg in ipairs(NpcConfig) do
+        for i = 1, cfg.cnt do
+            rankList[rank] = {}
+            genPlayerData(rankList[rank], cfg, rank)
+            rank = rank + 1
+            if rank > ServerCommerceActDefine.COMMERCEACT_NPC_CNT then
+                break
+            end
+        end
+    end
+end
+
+-- 插入数据
+local function insertData(data)
+    LuaMongo.insert(DB.db_battleground, data)
+end
+-- 修改db单个字段
+local function updateValue(key, value)
+	if not key then return end
+
+    if value then
+		dbUpdateField["$set"] = {[key]=value}
+		dbUpdateField["$unset"] = nil
+	else
+		dbUpdateField["$set"] = nil
+		dbUpdateField["$unset"] = {[key]=1}
+	end
+
+	dbUpdate._id = battleGroundData._id
+	LuaMongo.update(DB.db_battleground, dbUpdate, dbUpdateField)
+end
+
+-- 保存所有数据
+local function saveAllData()
+    dbUpdate._id = battleGroundData._id
+    LuaMongo.update(DB.db_battleground, dbUpdate, battleGroundData)
+end
+
+local function loadData()
+    LuaMongo.find(DB.db_battleground)
+    local data = {}
+    if LuaMongo.next(data) then
+        battleGroundData = data
+    end
+
+    if battleGroundData.allAreaRankList and next(battleGroundData.allAreaRankList) then
+        for areaIdx, rankList in pairs(battleGroundData.allAreaRankList) do
+            table.sort(rankList, cmp)
+        end
+    end
+
+    if not battleGroundData.generaRankList then
+        battleGroundData.generaRankList = {}
+        genRankList(battleGroundData.generaRankList)
+        insertData(battleGroundData)
+    end
+
+    table.sort(battleGroundData.generaRankList, cmp)
+end
+
+
+
+function BattleGround_InitAfterStart()
+    if _G.is_middle ~= true then
+        return
+    end
+    loadData()
+end
+
+
+-- 通过本服Id获取所在战区Id
+local function getWarZoneServerIdx(sourceServerId)
+    local nServerKey = MiddleConnect.MiddleConnect_TrueServerID2ConfServerID(sourceServerId)
+    nServerKey = MiddleConnect.MiddleConnect_GetWarZoneServer(nServerKey)
+    return nServerKey
+end
+
+
+-- 生成一个战区排行榜
+local function genWarZoneRankList(warZoneServerIdx)
+    local isInsert = false
+    if not next(battleGroundData) then
+        isInsert = true
+    end
+
+    battleGroundData.allAreaRankList = battleGroundData.allAreaRankList or {}
+    battleGroundData.allAreaRankList[warZoneServerIdx] = {}
+    genRankList(battleGroundData.allAreaRankList[warZoneServerIdx])
+
+    if isInsert then
+        return insertData(battleGroundData)
+    end
+
+    updateValue("allAreaRankList".."."..warZoneServerIdx, battleGroundData.allAreaRankList[warZoneServerIdx])
+end
+
+-- 获取本服所在战区的排行榜
+local function getMyWarZoneRankList(sourceServerId)
+    local warZoneServerIdx = getWarZoneServerIdx(sourceServerId)
+    if not battleGroundData.allAreaRankList or not battleGroundData.allAreaRankList[warZoneServerIdx] then
+        -- genWarZoneRankList(warZoneServerIdx)
+        return
+    end
+
+    return battleGroundData.allAreaRankList[warZoneServerIdx]
+end
+
+-- 初始化本战区的排行榜
+local function initMyWarZoneRankList(sourceServerId)
+    local warZoneServerIdx = getWarZoneServerIdx(sourceServerId)
+    if not battleGroundData.allAreaRankList or not battleGroundData.allAreaRankList[warZoneServerIdx] then
+        battleGroundData.allAreaRankList = battleGroundData.allAreaRankList or {}
+        battleGroundData.allAreaRankList[warZoneServerIdx] = {}
+    end
+end
+
+-- 获取通用排行榜
+local function getGeneraRankList()
+    return battleGroundData.generaRankList
+end
+
+-- 通过玩家uuid获取排名
+local function getPlayerRankByUuid(rankList, targetPlayerUuid)
+    local targetRank = ServerCommerceActDefine.COMMERCEACT_NPC_CNT + 1
+    if not rankList then
+        return targetRank
+    end
+
+    for rank, rankInfo in ipairs(rankList) do
+        if rankInfo.playerUuid == targetPlayerUuid then
+            targetRank = rank
+            break
+        end
+    end
+
+    return targetRank
+end
+
+-- 遍历
+local function findVal(list, val)
+    for k, info in pairs(list or {}) do
+        if info[2] == val then
+            return k
+        end
+    end
+end
+
+-- 发奖
+local function issueReward(fd, rankArr)
+    local msgData = InnerMsg.wl.WL_BATTLEGROUND_NOTIFY_PLAYER
+    msgData.playerArr = rankArr
+    InnerMsg.sendMsg(fd, msgData)
+end
+
+
+
+
+-- 普通服请求玩家排名
+function BG_N2C_PlayerRank_Req(msg)
+    local msgData = InnerMsg.wl.WL_BATTLEGROUND_PLAYER_RANK_QUERY
+    msgData.playerRank = 0
+    msgData.playerUuid = msg.playerUuid
+
+    local myWarZoneRankList = getMyWarZoneRankList(msg.sourceServerId)
+    msgData.playerRank = getPlayerRankByUuid(myWarZoneRankList, msg.playerUuid)
+
+    local fd = MiddleManager.getFDBySvrIndex(msg.sourceServerId)
+    InnerMsg.sendMsg(fd, msgData)
+end
+
+-- 普通服请求对手数据
+function BG_N2C_MatchList_Req(msg)
+    local msgData = InnerMsg.wl.WL_BATTLEGROUND_MATCHLIST_QUERY
+    msgData.playerUuid = msg.playerUuid
+    msgData.playerInfoList = {}
+
+    local myWarZoneRankList = getMyWarZoneRankList(msg.sourceServerId)
+    local generaRankList = getGeneraRankList()
+
+    for _, rank in ipairs(msg.matchList) do
+        local rankInfo = myWarZoneRankList and myWarZoneRankList[rank] or generaRankList[rank]
+        if rankInfo then
+            msgData.playerInfoList[#msgData.playerInfoList+1] = {
+                rank = rank,
+                serverId = rankInfo.serverId,
+                name = rankInfo.name,
+                showBodyId = rankInfo.bodyId
+            }
+        end
+    end
+
+    local fd = MiddleManager.getFDBySvrIndex(msg.sourceServerId)
+    InnerMsg.sendMsg(fd, msgData)
+end
+
+-- 普通服请求玩家数据
+function BG_N2C_PlayerData_Req(msg)
+    local msgData = InnerMsg.wl.WL_BATTLEGROUND_PLAYER_DATA_QUERY
+    msgData.playerUuid = msg.playerUuid
+    msgData.playerInfo = {}
+
+    local myWarZoneRankList = getMyWarZoneRankList(msg.sourceServerId)
+    local generaRankList = getGeneraRankList()
+    local rankInfo = myWarZoneRankList and myWarZoneRankList[rank] or generaRankList[rank]
+
+    if rankInfo then
+        msgData.playerInfo.serverId = rankInfo.serverId
+        msgData.playerInfo.name = rankInfo.name
+        msgData.playerInfo.heroHeadId = rankInfo.headId
+        msgData.playerInfo.heroHeadFrameId = rankInfo.headFrameId
+        msgData.playerInfo.monsteroutId = 0
+
+        if rankInfo.serverId then -- 真实玩家
+            msgData.playerInfo.heroArr = {}
+            for _, heroId in ipairs(rankInfo.heroArr or {}) do
+                msgData.playerInfo.heroArr[#msgData.playerInfo.heroArr+1] = heroId
+            end
+        else
+            -- 机器人
+            msgData.playerInfo.monsteroutId = rankInfo.monsterOutID
+        end
+    end
+
+    local fd = MiddleManager.getFDBySvrIndex(msg.sourceServerId)
+    InnerMsg.sendMsg(fd, msgData)
+end
+
+-- 普通服请求排行榜数据
+function BG_N2C_RankList_Req(msg)
+    local msgData = InnerMsg.wl.WL_BATTLEGROUND_RANKLIST_QUERY
+    msgData.playerUuid = msg.playerUuid
+    msgData.rankList = {}
+
+    local myWarZoneRankList = getMyWarZoneRankList(msg.sourceServerId)
+    local generaRankList = getGeneraRankList()
+
+    for rank=1, RANK_SHOW_NUM do
+        local rankInfo = myWarZoneRankList and myWarZoneRankList[rank] or generaRankList[rank]
+        msgData.rankList[rank] = {
+            rank = rank,
+            serverId = rankInfo.serverId,
+            name = rankInfo.name,
+            heroHeadId = rankInfo.headId,
+            heroHeadFrameId = rankInfo.headFrameId,
+        }
+    end
+
+    local fd = MiddleManager.getFDBySvrIndex(msg.sourceServerId)
+    InnerMsg.sendMsg(fd, msgData)
+end
+
+-- 玩家请求挑战某个排名
+function BG_N2C_Challenge_Req(msg)
+    local msgData = InnerMsg.wl.WL_BATTLEGROUND_CHALLENGE_QUERY
+    msgData.playerUuid = msg.playerUuid
+    msgData.playerInfo = {}
+    msgData.errCode = 0
+    local fd = MiddleManager.getFDBySvrIndex(msg.sourceServerId)
+
+    local targetRank = msg.rank
+    local myWarZoneRankList = getMyWarZoneRankList(msg.sourceServerId)
+    local generaRankList = getGeneraRankList()
+    local targetRanker = myWarZoneRankList and myWarZoneRankList[rank] or generaRankList[rank]
+    if not targetRanker then
+        msgData.errCode = -1
+        return InnerMsg.sendMsg(fd, msgData)
+    end
+
+    msgData.playerInfo = {
+        rank = targetRank,
+        playerUuid = targetRanker.playerUuid,
+        defServerId = targetRanker.serverId or 0
+    }
+
+    InnerMsg.sendMsg(fd, msgData)
+end
+
+-- 挑战结束
+function BG_N2C_Challenge_End(msg)
+    local atkPlayerUuid = msg.playerUuid
+    local atkRank = msg.atkRank
+    local defRank = msg.defRank
+    local challengeRes = msg.challengeRes
+
+    -- 加入参与列表
+    battleGroundData.joinList = battleGroundData.joinList or {}
+    if not findVal(battleGroundData.joinList, atkPlayerUuid) then
+        battleGroundData.joinList[#battleGroundData.joinList+1] = {msg.sourceServerId, atkPlayerUuid}
+        updateValue("joinList", battleGroundData.joinList)
+    end
+
+    -- 挑战没有胜利
+    if challengeRes ~= CombatDefine.RESULT_WIN then
+        return
+    end
+
+    local myWarZoneRankList = getMyWarZoneRankList(msg.sourceServerId)
+    if not myWarZoneRankList then
+        initMyWarZoneRankList(msg.sourceServerId)
+        myWarZoneRankList = getMyWarZoneRankList(msg.sourceServerId)
+    end
+
+
+    -- 检查挑战方当前排名与挑战时排名是否一致
+    local atkRanker = myWarZoneRankList[atkRank]
+    if atkRanker and atkRanker.playerUuid ~= atkPlayerUuid then
+        atkRank = getPlayerRankByUuid(myWarZoneRankList, msg.playerUuid)
+    end
+
+    local defTemp = myWarZoneRankList[defRank]
+
+    -- 第一次挑战
+    if not atkRanker then
+        atkRanker = msg.playerShowData
+    end
+
+    -- 挑战方排名提升为被挑战方原排名
+    atkRanker.rank = defRank
+    myWarZoneRankList[defRank] = atkRanker
+
+    -- 如果双方都在本战区排行榜上, 被挑战方排名下降为原挑战方排名
+    if defTemp and atkRank <= ServerCommerceActDefine.COMMERCEACT_NPC_CNT then
+        defTemp.rank = atkRank
+        myWarZoneRankList[atkRank] = defTemp
+    end
+
+    -- 如果被挑战方是真实玩家, 则通知
+    if defTemp and defTemp.serverId ~= 0 then
+        local msgData = InnerMsg.wl.WL_BATTLEGROUND_NOTIFY_PLAYER
+        msgData.playerUuid = defTemp.playerUuid
+        msgData.newRank = defTemp.rank
+        msgData.atkeServerId = msg.sourceServerId
+        msgData.atkName = atkRanker.name
+        local fd = MiddleManager.getFDBySvrIndex(defTemp.serverId)
+        InnerMsg.sendMsg(fd, msgData)
+    end
+
+    local warZoneServerIdx = getWarZoneServerIdx(msg.sourceServerId)
+    updateValue("allAreaRankList".."."..warZoneServerIdx, battleGroundData.allAreaRankList[warZoneServerIdx])
+end
+
+-- 更换战斗阵容
+function BG_N2C_Lineup_Update(msg)
+    local myWarZoneRankList = getMyWarZoneRankList(msg.sourceServerId)
+    local myRank = getPlayerRankByUuid(myWarZoneRankList, msg.playerUuid)
+    if myRank > ServerCommerceActDefine.COMMERCEACT_NPC_CNT then
+        return
+    end
+
+    myWarZoneRankList[myRank].heroArr = msg.heroArr
+    local warZoneServerIdx = getWarZoneServerIdx(msg.sourceServerId)
+    updateValue("allAreaRankList".."."..warZoneServerIdx, battleGroundData.allAreaRankList[warZoneServerIdx])
+end
+
+-- 活动结束
+function BG_N2C_Act_End(msg)
+    if notifyActEnd then
+        return
+    end
+
+    local fd_2_Rank = {}
+    local joinList = battleGroundData.joinList
+    local allAreaRankList = battleGroundData.allAreaRankList
+
+    -- 参与玩家(包括在榜玩家)
+    for _, playerInfo in ipairs(joinList) do
+        local serverId = playerInfo[1]
+        local fd = MiddleManager.getFDBySvrIndex(serverId)
+        fd_2_Rank[fd] = fd_2_Rank[fd] or {}
+        fd_2_Rank[fd][#fd_2_Rank[fd]+1] = {ServerCommerceActDefine.COMMERCEACT_NPC_CNT, playerInfo[2]}
+    end
+
+    -- 在榜玩家
+    for _, rankList in pairs(allAreaRankList or {}) do
+        for _, player in ipairs(rankList) do
+            local fd = MiddleManager.getFDBySvrIndex(player.serverId)
+            fd_2_Rank[fd] = fd_2_Rank[fd] or {}
+            local idx = findVal(fd_2_Rank[fd], player.playerUuid)
+            if idx then
+                fd_2_Rank[fd][idx][1] = player.rank
+            end
+        end
+    end
+
+    if next(fd_2_Rank) then
+        local delay_sec = 0
+        for fd, rankArr in pairs(fd_2_Rank) do
+            delay_sec = delay_sec + 3
+            Timer.addLater(delay_sec, issueReward, fd, rankArr)
+        end
+
+        -- 重置排行榜数据
+        battleGroundData = {}
+        saveAllData()
+
+        -- 更新标识
+        notifyActEnd = true
+    end
+end

+ 875 - 0
script/module/serverCommerce/ServerCommerceActBattleGroundNS.lua

@@ -0,0 +1,875 @@
+-- 跨服商业活动-巅峰战场
+
+-- db
+-- human.db.ServerCommerce.battleGround = {
+--     heroBag = {}, -- 英雄背包
+--     isHaveNewHero = false, -- 是否获得新英雄
+--     unLockIdx = 0, -- 英雄解锁层数
+--     freeChallengeCnt = 5, -- 免费挑战次数
+--     lastResetTime = 1123156, -- 上一次重置免费挑战次数的时间戳
+--     lineUp = {          -- 战斗阵容数据
+--         formation = 1,
+--         heroList = {},
+--     },
+--     matchList = {rank1, rank2, rank3, rank4, rank5}, -- 对手列表
+-- }
+
+local Msg = require("core.Msg")
+local Timer = require("core.Timer")
+local Config = require("Config")
+local Grid = require("bag.Grid")
+local BagLogic = require("bag.BagLogic")
+local ObjHuman = require("core.ObjHuman")
+local MailExcel = require("excel.mail")
+local MailManager = require("mail.MailManager")
+local Util = require("common.Util")
+local Lang = require("common.Lang")
+local Broadcast = require("broadcast.Broadcast")
+local InnerMsg = require("core.InnerMsg")
+local RoleHeadLogic = require("role.RoleHeadLogic")
+local ServerCommerceManager = require("serverCommerce.ServerCommerceManager")
+local ServerCommerceActDefine = require("serverCommerce.ServerCommerceActDefine")
+local battleGroundConfig = require("excel.ServerCommerceBattleGround")
+local MonsterExcel = require("excel.monster")
+local HeroConfig = require("excel.hero").hero
+local HeroDefine = require("hero.HeroDefine")
+local CombatDefine = require("combat.CombatDefine")
+local CombatLogic = require("combat.CombatLogic")
+local CombatPosLogic = require("combat.CombatPosLogic")
+local MiddleCommonLogic = require("middle.MiddleCommonLogic")
+local RoleDBLogic = require("role.RoleDBLogic")
+local Log = require("common.Log")
+
+
+local rankListCache = {}
+local lastGetRankListTime = 0
+local LOGTYPE = "ServerCommerceActBattleGround"
+
+
+local function writeLog(logStr)
+    Log.write(Log.LOGID_OSS_COMMON_ACT, logStr)
+end
+
+-- 玩家排名下降, 通过邮件通知
+local function rankReduceMail(mailId, receiverUuid, arg)
+    if not mailId or not receiverUuid then
+        return
+    end
+
+    local mailCfg = MailExcel.mail[mailId]
+    local content = mailCfg.content
+    if arg then
+        content = Util.format(content, arg[1], arg[2], arg[3])
+    end
+    MailManager.add(MailManager.SYSTEM, receiverUuid, mailCfg.title, content, nil, mailCfg.senderName or "GM")
+end
+
+-- 排行奖励邮件
+local function sendAwardMail(mailId, receiverUuid, itemArray)
+    local mailCfg = MailExcel.mail[mailId]
+    local content = mailCfg.content
+    MailManager.add(MailManager.SYSTEM, receiverUuid, mailCfg.title, content, itemArray, mailCfg.senderName or "GM")
+end
+
+-- 创建一个发奖queue
+local function createRewardQueue()
+    local issueRewardQueue = {
+        playerArray = {},
+        insertMaxNum = 100, -- 一次最多插入数据库的邮件数量
+        repeatMaxTimes = 3, -- 重试次数
+        repeatTb = {},
+        extraInfo = {},
+    }
+
+    function issueRewardQueue:add(playerInfo)
+        table.insert(self.playerArray, playerInfo)
+    end
+
+    function issueRewardQueue:insertDB()
+        local maxNum = math.min(self.insertMaxNum, #self.playerArray)
+        local mailId = battleGroundConfig.var[1].rankAwardMailId
+        for i=1, maxNum do
+            local resTag = ServerCommerceActDefine.BG_MAIL_SUCC_TAG
+            local playerInfo = table.remove(self.playerArray)
+            local rank = playerInfo[1]
+            local playerUuid = playerInfo[2]
+
+            local ok, err = pcall(sendAwardMail, mailId, playerUuid, playerInfo[3])
+
+            if not ok then
+                if not self.repeatTb[playerUuid] or self.repeatTb[playerUuid] < self.repeatMaxTimes then
+                    issueRewardQueue:add(playerInfo)
+                    self.repeatTb[playerUuid] = (self.repeatTb[playerUuid] or 0) + 1
+                end
+
+                resTag = ServerCommerceActDefine.BG_MAIL_FAIL_TAG
+            end
+
+            -- 写入日志
+            local str = string.format("ServerCommerceActBattleGround PrizeAward result: %s, playerUuid: %s, insertErrTimes: %d, errInfo: %s",
+                    resTag, playerUuid, self.repeatTb[playerUuid] or 0, err)
+
+            writeLog(str)
+        end
+
+        if #self.playerArray > 0 then
+            Timer.addLater(2, self.insertDB, self)
+        end
+    end
+
+    return issueRewardQueue
+end
+
+
+-- 是否处于活动中
+local function isRunning()
+    return true == ServerCommerceManager.CommerceAct_IsRun()
+end
+
+-- 生成对手算法
+local function matchListAlgorithm(rank)
+    -- 输入验证
+    if not rank or type(rank) ~= "number" or rank < 1 or rank > ServerCommerceActDefine.COMMERCEACT_NPC_CNT then
+        return {}  -- 返回空列表或根据需求处理错误
+    end
+    
+    local matchList = {}
+    local usedRanks = {}
+    
+    -- 确保玩家自己不会被选为对手
+    usedRanks[rank] = true
+    
+    -- 计算抽取范围
+    local minRank = math.max(1, rank - 50)
+    local maxRank = math.min(ServerCommerceActDefine.COMMERCEACT_NPC_CNT, rank + 10)
+    
+    -- 生成所有可能的对手排名
+    local possibleRanks = {}
+    for i = minRank, maxRank do
+        if not usedRanks[i] then
+            table.insert(possibleRanks, i)
+        end
+    end
+    
+    -- 如果可用对手不足5个,则返回所有可能的对手
+    local numToSelect = math.min(5, #possibleRanks)
+    
+    if numToSelect == 0 then
+        return {}
+    end
+    
+    -- 随机抽取指定数量的对手
+    for i = 1, numToSelect do
+        -- 从剩余可选排名中随机选择一个
+        local randomIndex = math.random(#possibleRanks)
+        local selectedRank = possibleRanks[randomIndex]
+        
+        -- 添加到匹配列表
+        table.insert(matchList, selectedRank)
+        
+        -- 从可选列表中移除已选中的排名
+        table.remove(possibleRanks, randomIndex)
+        
+        -- 标记为已使用
+        usedRanks[selectedRank] = true
+    end
+    
+    return matchList
+end
+
+-- 填充协议英雄数据
+local function populateHeroMsg(net, heroId, heroConfig, heroLv, heroStar)
+    net.heroHeadId = heroConfig.head
+    net.heroName = heroConfig.name
+    net.heroCamp = heroConfig.camp
+    net.heroLv = heroLv
+    net.heroStar = heroStar
+    net.heroGrade = heroConfig.grade
+    net.heroBodyId = heroConfig.body
+    net.heroId = heroId
+end
+
+-- 获取可以解锁的英雄信息
+local function getUnlockHeroInfoByRank(rank)
+    local unLockHero = battleGroundConfig.unLockHero
+    for idx, cfg in ipairs(unLockHero) do
+        if rank >= cfg.unLockRankArea[1] and rank <= cfg.unLockRankArea[2] then
+            return idx, cfg.unLockHeroInfo
+        end
+    end
+end
+
+-- 解锁英雄
+local function unlockHero(human, unlockHeroInfo, isInit)
+    human.db.ServerCommerce.battleGround = human.db.ServerCommerce.battleGround or {}
+    local battleGroundData = human.db.ServerCommerce.battleGround
+    battleGroundData.heroBag = battleGroundData.heroBag or {}
+    local heroBagData = battleGroundData.heroBag
+
+    if #unlockHeroInfo == 0 then
+        for heroId, heroCfg in pairs(HeroConfig) do
+            if heroCfg.grade >= HeroDefine.HERO_SSR_GRADE and not table.find(heroBagData, heroId) then
+                heroBagData[#heroBagData+1] = heroId
+            end
+        end
+
+        battleGroundData.isHaveNewHero = true
+        return
+    end
+
+    local heroList = {}
+    for heroId, heroCfg in pairs(HeroConfig) do
+        if heroCfg.grade >= HeroDefine.HERO_SSR_GRADE and not table.find(heroBagData, heroId) then
+            heroList[heroId] = heroCfg
+        end
+    end
+
+    for _, heroCond in ipairs(unlockHeroInfo) do
+        local campCond = heroCond[1] or 0
+        local numCond = heroCond[2] or 0
+        for i=1, numCond do
+            for heroId, heroCfg in pairs(heroList) do
+                if heroCfg.camp == campCond and not table.find(heroBagData, heroId) then
+                    heroBagData[#heroBagData+1] = heroId
+                    break
+                end
+            end
+        end
+    end
+
+    battleGroundData.isHaveNewHero = true
+    if isInit then
+        battleGroundData.isHaveNewHero = false
+    end
+end
+
+-- 获取上阵英雄
+local function getLineupHeroArr(human)
+    local heroArr
+    local battleGroundData = human.db.ServerCommerce.battleGround
+    local lineUpData = battleGroundData.lineUpData
+    for _, heroId in ipairs(lineUpData.heroList) do
+        if heroId and heroId ~= 0 then
+            heroArr = heroArr or {}
+            heroArr[#heroArr+1] = heroId
+        end
+    end
+    return heroArr
+end
+
+-- 生成玩家的展示数据
+local function populatePlayerShowData(human, showData, rank)
+    showData.rank = rank
+    showData.serverId = Config.SVR_INDEX
+    showData.playerUuid = human.db._id
+    showData.name = human.db.name
+    showData.bodyId = RoleHeadLogic.GetRoleAdornInfo(human, RoleHeadLogic.HEAD_TYPE_3) or 0
+    showData.headId = RoleHeadLogic.GetRoleAdornInfo(human, RoleHeadLogic.HEAD_TYPE_1) or 0
+    showData.headFrameId = RoleHeadLogic.GetRoleAdornInfo(human, RoleHeadLogic.HEAD_TYPE_2) or 0
+    showData.heroArr = {}
+
+    showData.heroArr = getLineupHeroArr(human)
+end
+
+-- 战斗结束处理
+local function fightEndHanle(human, result)
+    local msgData = InnerMsg.lw.LW_BATTLEGROUND_CHALLENGE_END
+    msgData.sourceServerId = Config.SVR_INDEX
+    msgData.playerUuid = human.db._id
+    msgData.atkRank = human.battleGroundRank
+    msgData.defRank = human.battleGroundCache.defRank
+    msgData.challengeRes = CombatDefine.RESULT_WIN
+    msgData.playerShowData = {}
+
+    local varCfg = battleGroundConfig.var[1]
+    local challengeAward = varCfg.defeatAward
+
+    if result == CombatDefine.RESULT_WIN then
+        human.battleGroundRank = human.battleGroundCache.defRank
+        local newMatchList = matchListAlgorithm(human.battleGroundRank)
+
+        -- 更新对手列表
+        local battleGroundData = human.db.ServerCommerce.battleGround
+        battleGroundData.matchList = newMatchList
+
+        -- 检查是否能解锁新英雄
+        local idx, unlockHeroInfo = getUnlockHeroInfoByRank(human.battleGroundRank)
+        if idx ~= battleGroundData.unLockIdx then
+            unlockHero(human, unlockHeroInfo)
+            battleGroundData.unLockIdx = idx
+        end
+
+        -- 展示数据
+        populatePlayerShowData(human, msgData.playerShowData, human.battleGroundCache.defRank)
+
+        -- 挑战奖励
+        challengeAward = varCfg.winAward
+    end
+
+    -- 发放挑战奖励
+    local finalAwardArr = {}
+    for i, itemInfo in ipairs(challengeAward) do
+        finalAwardArr[i] = {itemInfo[1], itemInfo[2]}
+    end
+    BagLogic.addItemList(human, finalAwardArr, LOGTYPE)
+
+    -- 通知跨服更新数据
+    InnerMsg.sendMsg(0, msgData)
+end
+
+-- 获取排名奖励
+local function getRankAward(rank)
+    local itemArr
+    for i, cfg in ipairs(battleGroundConfig.rankAward) do
+        if rank >= cfg.rankArea[1] and rank <= cfg.rankArea[1] then
+            itemArr = {}
+            for k, itemInfo in ipairs(cfg.rankAward) do
+                itemArr[k] = {itemInfo[1], itemInfo[2]}
+            end
+
+            break
+        end
+    end
+
+    return itemArr
+end
+
+
+function updateDaily(human)
+    if not isRunning() then
+        return
+    end
+
+    local battleGroundData = human.db.ServerCommerce and human.db.ServerCommerce.battleGround
+    if not battleGroundData then
+        return
+    end
+
+    local lastResetTime = battleGroundData.lastResetTime
+    if not Util.isSameDay(lastResetTime) then
+        battleGroundData.freeChallengeCnt = ServerCommerceActDefine.COMMERCEACT_DAILY_FREECHALLENGETIMES
+        battleGroundData.lastResetTime = os.time()
+    end
+end
+
+
+-- 推送主界面信息
+local function sendMainPageData(human)
+    local msgRet = Msg.gc.GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_MAINPAGE_QUERY
+    msgRet.myRank = human.battleGroundRank or (ServerCommerceActDefine.COMMERCEACT_NPC_CNT + 1)
+    msgRet.freeChallengeCnt = 0
+    msgRet.showBodyId = RoleHeadLogic.GetRoleAdornInfo(human, RoleHeadLogic.HEAD_TYPE_3) or 0
+
+    local battleGroundData = human.db.ServerCommerce and human.db.ServerCommerce.battleGround
+    msgRet.freeChallengeCnt = battleGroundData and battleGroundData.freeChallengeCnt or ServerCommerceActDefine.COMMERCEACT_DAILY_FREECHALLENGETIMES
+    Msg.send(msgRet, human.fd)
+end
+
+-- 推送排行榜数据
+local function sendRankListData(human)
+    local msgRet = Msg.gc.GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_RANK_QUERY
+    msgRet.rankList[0] = 0
+    msgRet.isEnd = 0
+    msgRet.myRankInfo.rank = human.battleGroundRank
+    msgRet.myRankInfo.serverId = Config.SVR_INDEX
+    msgRet.myRankInfo.name = human.db.name
+    msgRet.myRankInfo.heroHeadId = RoleHeadLogic.GetRoleAdornInfo(human, RoleHeadLogic.HEAD_TYPE_1) or 0
+    msgRet.myRankInfo.heroHeadFrameId = RoleHeadLogic.GetRoleAdornInfo(human, RoleHeadLogic.HEAD_TYPE_2) or 0
+
+    local msgMaxLen = 20
+    local len = 0
+    local rankNum = #rankListCache
+
+    for rank, rankInfo in ipairs(rankListCache) do
+        len = len + 1
+        msgRet.rankList[0] = len
+        msgRet.rankList[len].rank = rank
+        msgRet.rankList[len].serverId = rankInfo.serverId or 0
+        msgRet.rankList[len].name = rankInfo.name
+        msgRet.rankList[len].heroHeadId = rankInfo.heroHeadId
+        msgRet.rankList[len].heroHeadFrameId = rankInfo.heroHeadFrameId
+
+        if len >= msgMaxLen then
+            rankNum = rankNum - len
+
+            if rankNum <= 0 then
+                msgRet.isEnd = 1
+                return Msg.send(msgRet, human.fd)
+            end
+
+            Msg.send(msgRet, human.fd)
+            len = 0
+        end
+    end
+
+    if len > 0 then
+        msgRet.isEnd = 1
+        Msg.send(msgRet, human.fd)
+    end
+end
+
+-- 主界面信息查询
+function BattleGround_MainPage_Query(human)
+    if not isRunning() then
+        return Broadcast.sendErr(human, Lang.ACT_NOT_START)
+    end
+
+    if not human.battleGroundRank then
+        local msgData = InnerMsg.lw.LW_BATTLEGROUND_PLAYER_RANK_QUERY
+        msgData.sourceServerId = Config.SVR_INDEX
+        msgData.playerUuid = human.db._id
+        return InnerMsg.sendMsg(0, msgData)
+    end
+
+    sendMainPageData(human)
+end
+
+-- 匹配界面信息查询
+function BattleGround_MatchPage_Query(human)
+    if not isRunning() then
+        return Broadcast.sendErr(human, Lang.ACT_NOT_START)
+    end
+
+    local battleGroundData = human.db.ServerCommerce.battleGround
+    if not battleGroundData.matchList then
+        battleGroundData.matchList = matchListAlgorithm(human.battleGroundRank)
+    end
+
+    local msgData = InnerMsg.lw.LW_BATTLEGROUND_MATCHLIST_QUERY
+    msgData.sourceServerId = Config.SVR_INDEX
+    msgData.playerUuid = human.db._id
+    msgData.matchList = {}
+
+    for _, rank in ipairs(battleGroundData.matchList) do
+        msgData.matchList[#msgData.matchList+1] = rank
+    end
+
+    InnerMsg.sendMsg(0, msgData)
+end
+
+-- 匹配对手查询
+function BattleGround_Player_Query(human, targetRank)
+    if not isRunning() then
+        return Broadcast.sendErr(human, Lang.ACT_NOT_START)
+    end
+
+    local battleGroundData = human.db.ServerCommerce.battleGround
+    if not table.find(battleGroundData.matchList, targetRank) then
+        return Broadcast.sendErr(human, Lang.BG_MATCHLIST_ERR)
+    end
+
+    local msgData = InnerMsg.lw.LW_BATTLEGROUND_PLAYER_DATA_QUERY
+    msgData.sourceServerId = Config.SVR_INDEX
+    msgData.playerUuid = human.db._id
+    msgData.playerRank = targetRank
+
+    InnerMsg.sendMsg(0, msgData)
+end
+
+-- 英雄背包查询
+function BattleGround_HeroBag_Query(human)
+    if not isRunning() then
+        return Broadcast.sendErr(human, Lang.ACT_NOT_START)
+    end
+
+    local battleGroundData = human.db.ServerCommerce.battleGround
+    if not battleGroundData.heroBag then
+        local idx, unlockHeroInfo = getUnlockHeroInfoByRank(human.battleGroundRank)
+        if unlockHeroInfo then
+            unlockHero(human, unlockHeroInfo, true)
+            battleGroundData.unLockIdx = idx
+        end
+    end
+
+    local msgRet = Msg.gc.GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_HEROBAG_QUERY
+    msgRet.heroArr[0] = 0
+    msgRet.isEnd = 0
+
+
+    local len, msgMaxLen = 0, 0
+    local heroNum = #battleGroundData.heroBag
+    for _, heroId in ipairs(battleGroundData.heroBag) do
+        len = len + 1
+        msgRet.heroArr[0] = len
+        local heroConfig = HeroConfig[heroId]
+        populateHeroMsg(msgRet.heroArr[len], heroId, heroConfig, ServerCommerceActDefine.COMMERCEACT_HERO_LV, ServerCommerceActDefine.COMMERCEACT_HERO_STAR)
+
+        if len >= msgMaxLen then
+            heroNum = heroNum - len
+            if heroNum <= 0 then
+                msgRet.isEnd = 1
+                return Msg.send(msgRet, human.fd)
+            end
+
+            Msg.send(msgRet, human.fd)
+            len = 0
+        end
+    end
+
+    if len > 0 then
+        msgRet.isEnd = 1
+        Msg.send(msgRet, human.fd)
+    end
+end
+
+-- 排行榜查询
+function BattleGround_RankList_Query(human)
+    if not isRunning() then
+        return Broadcast.sendErr(human, Lang.ACT_NOT_START)
+    end
+
+    local now = os.time()
+    if #rankListCache == 0 or now - lastGetRankListTime >= ServerCommerceActDefine.COMMERCEACT_RANKUPDATE then
+        local msgData = InnerMsg.lw.LW_BATTLEGROUND_RANKLIST_QUERY
+        msgData.sourceServerId = Config.SVR_INDEX
+        msgData.playerUuid = human.db._id
+        return InnerMsg.sendMsg(0, msgData)
+    end
+
+    sendRankListData(human)
+end
+
+-- 排行奖励查询
+function BattleGround_RankAward_Query(human)
+    if not isRunning() then
+        return Broadcast.sendErr(human, Lang.ACT_NOT_START)
+    end
+
+    local msgRet = Msg.gc.GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_RANKAWARD_QUERY
+    msgRet.rankAwardList[0] = 0
+
+    msgRet.rankAwardList[0] = #battleGroundConfig.rankAward
+    for i, cfg in ipairs(battleGroundConfig.rankAward) do
+        msgRet.rankAwardList[i].minRank = cfg.rankArea[1]
+        msgRet.rankAwardList[i].maxRank = cfg.rankArea[2]
+        msgRet.rankAwardList[i].rankAward[0] = #cfg.rankAward
+
+        for k, itemInfo in ipairs(cfg.rankAward) do
+            Grid.makeItem(msgRet.rankAwardList[i].rankAward[k], itemInfo[1], itemInfo[2])
+        end
+    end
+
+    Msg.send(msgRet, human.fd)
+end
+
+-- 更新阵容数据
+function BattleGround_Lineup_Update(human, msg)
+    if not isRunning() then
+        return Broadcast.sendErr(human, Lang.ACT_NOT_START)
+    end
+
+    local battleGroundData = human.db.ServerCommerce.battleGround
+
+    local formation = msg.formation
+    local posList = CombatPosLogic.getPosList(formation)
+    local heroList = Util.split(msg.heroList, ",", true)
+
+    local reapetTb = {}
+    for i = 1, CombatDefine.COMBAT_HERO_CNT do
+        local heroId = heroList[i]
+        if heroId > 0 then
+            -- 英雄Id检测
+            if HeroConfig[heroId] then
+                return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
+            end
+
+            -- 英雄背包检测
+            if not battleGroundData.heroBag or not table.find(battleGroundData.heroBag, heroId) then
+                return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
+            end
+
+            -- 相同英雄检测
+            if reapetTb[heroId] then
+                return Broadcast.sendErr(human, Lang.HERO_SAME)
+            end
+
+            -- 位置检测
+            if posList[i] == nil and i ~= CombatDefine.COMBAT_HERO_CNT then
+                return Broadcast.sendErr(human, Lang.POS_ERROR)
+            end
+
+            reapetTb[heroId] = true
+        end
+    end
+
+    battleGroundData.lineUp = battleGroundData.lineUp or {}
+    battleGroundData.lineUp.formation = formation
+    battleGroundData.lineUp.heroList = heroList
+
+    -- 通知跨服更新
+    if human.battleGroundRank and human.battleGroundRank <= ServerCommerceActDefine.COMMERCEACT_NPC_CNT then
+        local msgData = InnerMsg.lw.LW_BATTLEGROUND_LINEUP_UPDATE
+        msgData.sourceServerId = Config.SVR_INDEX
+        msgData.playerUuid = human.db._id
+        msgData.heroArr = getLineupHeroArr(human)
+        InnerMsg.sendMsg(0, msgData)
+    end
+end
+
+-- 活动结束
+function Act_End()
+    local msgData = InnerMsg.lw.LW_BATTLEGROUND_ACT_END
+    msgData.sourceServerId = Config.SVR_INDEX
+    InnerMsg.sendMsg(0, msgData)
+end
+
+-----------------------------------------------C2N-------------------------------------------------------
+
+-- 跨服返回玩家排名数据
+function BG_C2N_PlayerRank_Res(msg)
+    local human = ObjHuman.onlineUuid[msg.playerUuid]
+    if not human then
+        return
+    end
+
+    human.battleGroundRank = msg.playerRank
+    sendMainPageData(human)
+end
+
+-- 跨服返回对手列表数据
+function BG_C2N_MatchList_Res(msg)
+    local human = ObjHuman.onlineUuid[msg.playerUuid]
+    if not human then
+        return
+    end
+
+    local msgRet = Msg.gc.GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_MATCHLIST_QUERY
+    msgRet.myRank = human.battleGroundRank or (ServerCommerceActDefine.COMMERCEACT_NPC_CNT + 1)
+    msgRet.freeChallengeCnt = 0
+    msgRet.isGetNew = 0
+    msgRet.matchList[0] = 0
+
+    local battleGroundData = human.db.ServerCommerce and human.db.ServerCommerce.battleGround
+
+    local costItem = battleGroundConfig.var[1].cost
+    Grid.makeItem(msgRet.exchangeCost, costItem[1], costItem[2])
+
+    msgRet.freeChallengeCnt = battleGroundData and battleGroundData.freeChallengeCnt or ServerCommerceActDefine.COMMERCEACT_DAILY_FREECHALLENGETIMES
+    msgRet.isGetNew = battleGroundData and battleGroundData.isHaveNewHero and 1 or 0
+
+    msgRet.matchList[0] = #msg.playerInfoList
+    for i, rankInfo in ipairs(msg.playerInfoList) do
+        msgRet.matchList[i].rank = rankInfo.rank
+        msgRet.matchList[i].serverId = rankInfo.serverId or 0
+        msgRet.matchList[i].name = rankInfo.name
+        msgRet.matchList[i].showBodyId = rankInfo.showBodyId
+    end
+
+    Msg.send(msgRet, human.fd)
+end
+
+-- 跨服返回单个对手数据
+function BG_C2N_PlayerData_Res(msg)
+    local human = ObjHuman.onlineUuid[msg.playerUuid]
+    if not human then
+        return
+    end
+
+    local playerInfo = msg.playerInfo
+    local msgRet = Msg.gc.GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_PLAYER_QUERY
+    msgRet.serverId = playerInfo.serverId or 0
+    msgRet.name = playerInfo.name
+    msgRet.heroHeadId = playerInfo.heroHeadId
+    msgRet.heroHeadFrameId = playerInfo.heroHeadFrameId
+    msgRet.heroArr[0] = 0
+
+    if playerInfo.monsteroutId == 0 then -- 真实玩家
+        msgRet.heroArr[0] = #playerInfo.heroArr
+        for i, heroId in ipairs(playerInfo.heroArr) do
+            local heroConfig = HeroConfig[heroId]
+            populateHeroMsg(msgRet.heroArr[i], heroId, heroConfig, ServerCommerceActDefine.COMMERCEACT_HERO_LV, ServerCommerceActDefine.COMMERCEACT_HERO_STAR)
+        end
+    else
+        local monsterOutConfig = MonsterExcel.monsterOut[playerInfo.monsteroutId]
+        msgRet.heroArr[0] = #monsterOutConfig.member
+        for i, monsterInfo in ipairs(monsterOutConfig.member) do
+            local monsterID = monsterInfo[1]
+            local mcf = MonsterExcel.monster[monsterID]
+            populateHeroMsg(msgRet.heroArr[i], monsterID, mcf, monsterInfo[2], mcf.star)
+        end
+    end
+end
+
+-- 跨服返回排行榜数据
+function BG_C2N_RankList_Res(msg)
+    rankListCache = msg.rankList
+    lastGetRankListTime = os.time()
+
+    local human = ObjHuman.onlineUuid[msg.playerUuid]
+    if not human then
+        return
+    end
+
+    sendRankListData(human)
+end
+
+-- 跨服返回请求战斗结果
+function BG_C2N_Challenge_Res(msg)
+    local human = ObjHuman.onlineUuid[msg.playerUuid]
+    if not human then
+        return
+    end
+
+    if msg.errCode ~= 0 then
+        return Broadcast.sendErr(human, Lang.BG_MATCHLIST_ERR)
+    end
+
+    local playerUuid = msg.playerInfo.playerUuid
+    local defServerId = msg.playerInfo.defServerId
+
+    human.battleGroundCache = {
+        defRank = msg.playerInfo.rank
+    }
+
+    if defServerId ~= 0 then -- 真实玩家
+        local args = {
+            combatType = CombatDefine.COMBAT_TYPE37,
+            nServerIndex = defServerId,
+            param = playerUuid
+        }
+        MiddleCommonLogic.MiddleCommonLogic_CombatBegin_LW(human, args)
+    else
+        CombatLogic.combatBegin(human, nil, {playerUuid}, CombatDefine.COMBAT_TYPE37)
+    end
+end
+
+-- 跨服通知玩家排名下降
+function BG_C2N_RankReduce(msg)
+    local human = ObjHuman.onlineUuid[msg.playerUuid]
+    if not human then
+        local db = RoleDBLogic.getDb(msg.playerUuid)
+        if not db then
+            return
+        end
+
+        human = {}
+        human.db = db
+    end
+
+    -- 更新对手列表
+    local battleGroundData = human.db.ServerCommerce.battleGround
+    battleGroundData.matchList = matchListAlgorithm(msg.newRank)
+
+    -- 邮件通知
+    local varCfg = battleGroundConfig.var[1]
+    local arg = {msg.atkeServerId - 810537, msg.atkName, msg.newRank}
+    rankReduceMail(varCfg.defeatMailId, human.db.id, arg)
+
+    -- 玩家在线
+    if human.fd then
+        human.battleGroundRank = msg.newRank
+        return
+    end
+
+    -- 玩家不在线,则保存数据
+    ObjHuman.save(human)
+end
+
+-- 跨服通知发奖
+function BG_C2N_PrizeAward(msg)
+    local playerArr = msg.playerArr
+    if not next(playerArr) then
+        return
+    end
+
+    local issueRewardQueue = createRewardQueue()
+
+    for _, playerInfo in ipairs(playerArr) do
+        local itemArr = getRankAward(playerInfo[1])
+        if itemArr then
+            playerInfo[3] = itemArr
+            issueRewardQueue:add(itemArr)
+        end
+    end
+
+    issueRewardQueue:insertDB()
+end
+
+
+
+----------------------------------战斗-----------------------------------
+
+function fight(human, args, combatType)
+    if combatType ~= CombatDefine.COMBAT_TYPE37 then
+        return Broadcast.sendErr(human, Lang.BG_COMBAT_TYPE_ERR)
+    end
+
+    local targetRank = tonumber(args[1])
+    local battleGroundData = human.db.ServerCommerce.battleGround
+    if not targetRank or not table.find(battleGroundData.matchList, targetRank) then
+        return Broadcast.sendErr(human, Lang.BG_MATCHLIST_ERR)
+    end
+
+    if not battleGroundData.lineUp then
+        return Broadcast.sendErr(human, Lang.SEAL_GROUND_COMBAT_HERO_ERR)
+    end
+
+    if battleGroundData.freeChallengeCnt <= 0 then
+        local costItem = battleGroundConfig.var[1].cost
+        local itemId, itemNum = costItem[1], costItem[2]
+        if BagLogic.getItemCnt(human, itemId) < itemNum then
+            return Broadcast.sendErr(human, Lang.BG_CONDITION_ERR)
+        end
+
+        BagLogic.delItem(human, itemId, itemNum, LOGTYPE)
+    else
+        battleGroundData.freeChallengeCnt = battleGroundData.freeChallengeCnt - 1
+    end
+
+    local msgData = InnerMsg.lw.LW_BATTLEGROUND_CHALLENGE_QUERY
+    msgData.sourceServerId = Config.SVR_INDEX
+    msgData.playerUuid = human.db._id
+    msgData.rank = targetRank
+    InnerMsg.sendMsg(0, msgData)
+end
+
+function getCombatMonsterOutID(human, side, args)
+    if side ~= CombatDefine.DEFEND_SIDE then return end
+    return args[1]
+end
+
+
+function getCombatObjList(human, side, args, combatType)
+    if side == CombatDefine.ATTACK_SIDE and not human then return end
+
+    if side == CombatDefine.DEFEND_SIDE and human then
+        return
+    end
+
+    if not human then
+        local uuid = args[1]
+        local db = RoleDBLogic.getDb(uuid)
+        if not db then
+            return
+        end
+        human = {}
+        human.db = db
+    end
+
+    local battleGroundData = human.db.ServerCommerce.battleGround
+    local lineUpData = battleGroundData.lineUp
+    if not lineUpData.heroList or not lineUpData.formation then
+        return
+    end
+
+    local fakeHuman = {}
+    local objList = {}
+    for i = 1, CombatDefine.COMBAT_HERO_CNT do
+        local heroId = lineUpData.heroList[i]
+        if heroId and heroId ~= 0 then
+            objList[i] = CombatLogic.createHeroObj(fakeHuman, heroId, ServerCommerceActDefine.COMMERCEACT_HERO_LV, ServerCommerceActDefine.COMMERCEACT_HERO_STAR, i)
+        end
+    end
+
+    local rolebase = CombatLogic.createRoleBaseByDB(human.db)
+    return objList, nil, rolebase, lineUpData.formation
+end
+
+function onFightEnd(human, result, type, cbParam, combatInfo)
+    local battleGroundCache = human.battleGroundCache
+    if not battleGroundCache then
+        return Broadcast.sendErr(human, Lang.DATA_ERR)
+    end
+
+    fightEndHanle(human, result)
+end

+ 11 - 1
script/module/serverCommerce/ServerCommerceActDefine.lua

@@ -42,4 +42,14 @@ COMMERCEACT_SHOP_PAY_STATE4 = 4         -- 已领取
 -- 积分物品ID
 COMERCEACT_POINT_GOODSID = 9001         -- 积分物品ID
 
-COMMERCEACT_SHOW_OPENDAY = 8            -- 活动显示所需开服天数
+COMMERCEACT_SHOW_OPENDAY = 8            -- 活动显示所需开服天数
+
+
+COMMERCEACT_DAILY_FREECHALLENGETIMES = 5 -- 巅峰战场每日免费次数
+COMMERCEACT_HERO_STAR = 15               -- 巅峰战场英雄星级
+COMMERCEACT_HERO_LV = 600                -- 巅峰战场英雄等级
+COMMERCEACT_NPC_CNT = 999               -- 巅峰战场机器人数量
+
+
+BG_MAIL_SUCC_TAG = "succ"
+BG_MAIL_FAIL_TAG = "fail"

+ 23 - 0
script/module/serverCommerce/ServerCommerceManager.lua

@@ -68,6 +68,10 @@ function CommerceAct_CreateHumanDB(human)
         nBatchID = nBatchID,       -- 批次
         bSendPlayerMail = false,        -- 是否发送个人邮件
         bSendServerMail = false,        -- 是否发送全服邮件
+        battleGround = {
+            freeChallengeCnt = ServerCommerceActDefine.COMMERCEACT_DAILY_FREECHALLENGETIMES,
+            resetTime = os.time(),
+        },
     }
 
     for nID, module in pairs(tCommerceActModuel) do
@@ -180,6 +184,10 @@ end
 function CommerceAct_End()
     -- 排行榜结束
     ServerCommerceMiddle.CommerceMiddle_QueryServerRank(ServerCommerceActDefine.COMMERCEACT_SENDSERVERMAIL)
+
+    -- 处理巅峰战场活动
+    local ServerCommerceActBattleGroundNS = require("serverCommerce.ServerCommerceActBattleGroundNS")
+    ServerCommerceActBattleGroundNS.Act_End()
 end
 
 -- 延迟向中心服请求数据
@@ -550,6 +558,21 @@ function CommerceAct_GetActTime(tData)
 
 end
 
+-- 跨天
+function updateDaily(human, funcID)
+    if not human then
+        return
+    end
+
+    if true == CommerceAct_IsRun() then
+        for _, module in pairs(tCommerceActModuel) do
+            if module and module.onLogin then
+                module.updateDaily(human)
+            end
+        end
+    end
+end
+
 -- 玩家登录
 function onLogin(human, funcID)
     if not human then