From eda1c4429db2e7a3b1b79eee0cba0fc7abec7290 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 04 七月 2024 19:12:34 +0800
Subject: [PATCH] 10198 【香港】【越南】【主干】【砍树】【后端】BOSS凭证优化

---
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActBossTrial.py                      |  167 ++++++++++++++++-----------
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py          |   19 ++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py        |   24 +++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py               |    7 +
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossActionControl.py              |   25 +++-
 ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py                                    |    7 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActBossTrial.py |   53 ++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py      |   26 ++++
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py                         |    4 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py                  |    1 
 10 files changed, 255 insertions(+), 78 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossActionControl.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossActionControl.py
index 7652dfe..b6912a2 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossActionControl.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossActionControl.py
@@ -542,7 +542,7 @@
             
             isEnd = True
             state = 0 # 默认关闭
-            stateJoin = 0 # 可参与状态
+            stateJoin = ShareDefine.ActStateJoin_None # 可参与状态,0-参与前;1-可参与;2-参与结束
             cfgID = ipyData.GetCfgID()
             groupName = ipyData.GetActGroupName()
             zoneID = ipyData.GetZoneID()
@@ -565,10 +565,12 @@
                     for jIndex, joinStartDateTime in enumerate(joinStartTimeList):
                         endJoinDateTime = joinEndTimeList[jIndex]
                         if joinStartDateTime <= curDateTime < endJoinDateTime:
-                            stateJoin = state
+                            stateJoin = ShareDefine.ActStateJoin_Start
                             break
+                        elif curDateTime >= endJoinDateTime:
+                            stateJoin = ShareDefine.ActStateJoin_End
                 else:
-                    stateJoin = state
+                    stateJoin = ShareDefine.ActStateJoin_Start if state else ShareDefine.ActStateJoin_None
                     
             serverIDRangeList = actInfoDict.get(ShareDefine.ActKey_ServerIDRangeList)
             # 全服广播提示信息
@@ -598,8 +600,8 @@
             if not isReload and dbState == state and dbStateJoin == stateJoin and dbActID == actID and not forceReset:
                 #已经是这个状态了
                 continue
-            GameWorld.Log("跨服运营活动状态: actName=%s,cfgID=%s,groupName=%s,zoneID=%s,dbState=%s -> state=%s,isEnd=%s, dbActID=%s -> actID=%s,forceReset=%s" 
-                          % (actName, cfgID, groupName, zoneID, dbState, state, isEnd, dbActID, actID, forceReset))
+            GameWorld.Log("跨服运营活动状态: actName=%s,cfgID=%s,groupName=%s,zoneID=%s,dbState=%s -> state=%s,isEnd=%s, dbActID=%s -> actID=%s,forceReset=%s, dbStateJoin=%s -> stateJoin=%s" 
+                          % (actName, cfgID, groupName, zoneID, dbState, state, isEnd, dbActID, actID, forceReset, dbStateJoin, stateJoin))
             
             # 更新状态
             actInfoDict[ShareDefine.ActKey_State] = state
@@ -621,7 +623,7 @@
                     CrossActCTGBillboard.OnActIDChange(cfgID, dbTemplateID, state)
                     
                 if actName == ShareDefine.CrossActName_BossTrial:
-                    PlayerActBossTrial.OnCrossActIDChange(cfgID, state)
+                    PlayerActBossTrial.OnCrossActIDChange(cfgID, zoneID, ipyData, state)
                     
                 else:
                     actChangeList.append([actName, ipyData, state, cfgID, groupName, zoneID, dbActID, actID, forceReset, dbTemplateID])
@@ -636,6 +638,17 @@
                               % (actName, cfgID, groupName, zoneID, dbState, state, actIDChange, dbTemplateID))
                 actStateChangeList.append([actName, ipyData, dbState, state, cfgID, groupName, zoneID, actIDChange, dbTemplateID])
                 
+            # 仅活动有配置参与时间段的会触发
+            if actID and dbActID == actID and dbStateJoin != stateJoin:
+                GameWorld.Log("    参与状态变更: dbStateJoin=%s,stateJoin=%s" % (dbStateJoin, stateJoin))
+                # 参与开始
+                if stateJoin == ShareDefine.ActStateJoin_Start:
+                    pass
+                # 参与结束
+                elif stateJoin == ShareDefine.ActStateJoin_End:
+                    if actName == ShareDefine.CrossActName_BossTrial:
+                        PlayerActBossTrial.OnCrossActJoinEnd(cfgID, zoneID, ipyData)
+                        
             GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossActInfo % actName, crossActInfoDict[actName])
             # 非活动中的处理完关闭后,最后删除
             if not state and isEnd:
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
index d8ae9bd..c89e50d 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldActionControl.py
@@ -742,7 +742,7 @@
         for sendMapServerMsgDict in curActMapInfoDictList:
             
             state = 0 # 默认关闭
-            stateJoin = 0 # 可参与状态
+            stateJoin = ShareDefine.ActStateJoin_None # 可参与状态,0-参与前;1-可参与;2-参与结束
             ipyData = None
             
             actNum = sendMapServerMsgDict.get(ShareDefine.ActKey_ActNum, 0)
@@ -773,10 +773,12 @@
                         for jIndex, joinStartDateTime in enumerate(joinStartTimeList):
                             endJoinDateTime = joinEndTimeList[jIndex]
                             if joinStartDateTime <= curDateTime < endJoinDateTime:
-                                stateJoin = state
+                                stateJoin = ShareDefine.ActStateJoin_Start
                                 break
+                            elif curDateTime >= endJoinDateTime:
+                                stateJoin = ShareDefine.ActStateJoin_End
                     else:
-                        stateJoin = state
+                        stateJoin = ShareDefine.ActStateJoin_Start if state else ShareDefine.ActStateJoin_None
                         
                     # 全服广播提示信息
                     if curDateTime in notifyDict:
@@ -857,6 +859,17 @@
             else:
                 GameWorld.Log("    dbActID不变: dbActID=%s,curActID=%s" % (dbActID, curActID))
                 
+            # 仅活动有配置参与时间段的会触发
+            if curActID and dbActID == curActID and preStateJoin != stateJoin:
+                GameWorld.Log("    参与状态变更: preStateJoin=%s,stateJoin=%s" % (preStateJoin, stateJoin))
+                # 参与开始
+                if stateJoin == ShareDefine.ActStateJoin_Start:
+                    pass
+                # 参与结束
+                elif stateJoin == ShareDefine.ActStateJoin_End:
+                    if actName == ShareDefine.OperationActionName_BossTrial:
+                        PlayerActBossTrial.OnActJoinEnd(actNum, ipyData, dayIndex)
+                        
             if ipyData and actName in ShareDefine.NeedWorldLVOperationActNameList:
                 actWorldLV = PlayerDBGSEvent.GetDBGSTrig_ByKey(dbOperationActWorldLVKey)
                 sendMapServerMsgDict[ShareDefine.ActKey_WorldLV] = actWorldLV
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActBossTrial.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActBossTrial.py
index 6b9f197..0480bd5 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActBossTrial.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActBossTrial.py
@@ -18,6 +18,7 @@
 import ShareDefine
 import DataRecordPack
 import PlayerCompensation
+import PlayerDBGSEvent
 import PlayerBillboard
 import IpyGameDataPY
 import GameWorld
@@ -29,6 +30,7 @@
 
 def OnActStart(actNum):
     ## 活动开启
+    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActBossTrialAward % actNum, 0)
     PlayerBillboard.ClearBillboardByIndex(ShareDefine.Def_BT_BossTrialSubmit)
     PlayerBillboard.ClearBillboardByIndex(ShareDefine.Def_BT_BossTrialSubmitFamily)
     
@@ -43,19 +45,41 @@
 
 def OnActEnd(actNum, ipyData, dayIndex):
     ## 活动结束
-    OnGiveFamilyOrderAwawrd(actNum, ipyData, dayIndex)
     cfgID = ipyData.GetCfgID() if ipyData else 0
-    # 发放排行奖励
-    GameWorld.Log("=== boss历练活动结束!发放本服个人榜单奖励! === actNum=%s,cfgID=%s,dayIndex=%s" % (actNum, cfgID, dayIndex))
-    if not cfgID:
-        return
-    BillboardType = ShareDefine.Def_BT_BossTrialSubmit
-    templateID = GameWorld.GetTemplateID(ipyData, cfgID, dayIndex)
-    __OnEndAward_Personal(templateID, BillboardType)
+    GameWorld.Log("=== boss历练活动结束! === actNum=%s,cfgID=%s,dayIndex=%s" % (actNum, cfgID, dayIndex))
     
-    DataRecordPack.DR_BillboardData(BillboardType, "BossTrial", {"actNum":actNum, "cfgID":cfgID, "dayIndex":dayIndex, "templateID":templateID})
-    PlayerBillboard.CopyBillboard(ShareDefine.Def_BT_BossTrialSubmitBak, BillboardType)
-    PlayerBillboard.ClearBillboardByIndex(BillboardType)
+    __OnEndAward(actNum, ipyData, dayIndex) # 兼容活动没有配置参与时间段的在活动结束补触发结算奖励
+    
+    DataRecordPack.DR_BillboardData(ShareDefine.Def_BT_BossTrialSubmitFamily, "BossTrial", {"actNum":actNum, "cfgID":cfgID, "dayIndex":dayIndex})
+    PlayerBillboard.CopyBillboard(ShareDefine.Def_BT_BossTrialSubmitFamilyBak, ShareDefine.Def_BT_BossTrialSubmitFamily)
+    
+    DataRecordPack.DR_BillboardData(ShareDefine.Def_BT_BossTrialSubmit, "BossTrial", {"actNum":actNum, "cfgID":cfgID, "dayIndex":dayIndex})
+    PlayerBillboard.CopyBillboard(ShareDefine.Def_BT_BossTrialSubmitBak, ShareDefine.Def_BT_BossTrialSubmit)
+    GameWorld.Log("=================================================================================")
+    return
+
+def OnActJoinEnd(actNum, ipyData, dayIndex):
+    ## 活动参与结束
+    __OnEndAward(actNum, ipyData, dayIndex)
+    return
+
+def __OnEndAward(actNum, ipyData, dayIndex):
+    ## 结算奖励
+    cfgID = ipyData.GetCfgID() if ipyData else 0
+    awardState = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActBossTrialAward % actNum)
+    if awardState:
+        #已经结算过该活动
+        GameWorld.Log("boss历练活动已经结算过奖励了! actNum=%s,cfgID=%s,dayIndex=%s" % (actNum, cfgID, dayIndex))
+        return
+    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActBossTrialAward % actNum, 1)
+    
+    GameWorld.Log("=== 本服boss历练活动发放榜单奖励! === actNum=%s,cfgID=%s,dayIndex=%s" % (actNum, cfgID, dayIndex))
+    
+    familyTemplateID = GameWorld.GetTemplateIDByList(ipyData.GetFamilyTemplateIDList(), dayIndex)
+    __OnEndAward_Family(familyTemplateID, ShareDefine.Def_BT_BossTrialSubmitFamily)
+    
+    templateID = GameWorld.GetTemplateID(ipyData, cfgID, dayIndex)
+    __OnEndAward_Personal(templateID, ShareDefine.Def_BT_BossTrialSubmit)
     GameWorld.Log("=================================================================================")
     return
 
@@ -74,7 +98,7 @@
     for tempIpyData in tempIpyDataList:
         rankAwardDict[tempIpyData.GetRank()] = tempIpyData.GetAwardItemList()
         
-    GameWorld.Log("    templateID=%s,rankAwardDict=%s" % (templateID, rankAwardDict))
+    GameWorld.Log("结算个人榜单奖励: templateID=%s,rankAwardDict=%s" % (templateID, rankAwardDict))
     billBoard.Sort()
     for index in xrange(billBoard.GetCount()):
         billBoardData = billBoard.At(index)
@@ -98,30 +122,14 @@
         
     return
 
-def OnGiveFamilyOrderAwawrd(actNum, ipyData, dayIndex):
-    cfgID = ipyData.GetCfgID() if ipyData else 0
-    # 发放排行奖励
-    GameWorld.Log("=== boss历练活动结束!发放本服仙盟榜单奖励! === actNum=%s,cfgID=%s,dayIndex=%s" % (actNum, cfgID, dayIndex))
-    if not cfgID:
-        return
-    BillboardType = ShareDefine.Def_BT_BossTrialSubmitFamily
-    templateID = GameWorld.GetTemplateIDByList(ipyData.GetFamilyTemplateIDList(), dayIndex)
-    __OnEndAward_Family(templateID, BillboardType)
-    
-    DataRecordPack.DR_BillboardData(BillboardType, "BossTrial", {"actNum":actNum, "cfgID":cfgID, "dayIndex":dayIndex, "templateID":templateID})
-    PlayerBillboard.CopyBillboard(ShareDefine.Def_BT_BossTrialSubmitFamilyBak, BillboardType)
-    PlayerBillboard.ClearBillboardByIndex(BillboardType)
-    GameWorld.Log("=================================================================================")
-    return
-
-def __OnEndAward_Family(templateID, billboardType):
+def __OnEndAward_Family(familyTemplateID, billboardType):
     billBoard = GameWorld.GetBillboard().FindBillboard(billboardType)
     if not billBoard:
         return
-    if not templateID:
+    if not familyTemplateID:
         GameWorld.Log("本次活动没有仙盟榜奖励!")
         return
-    tempIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBossTrialTemplate", templateID)
+    tempIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBossTrialTemplate", familyTemplateID)
     if not tempIpyDataList:
         return
     
@@ -129,7 +137,7 @@
     for tempIpyData in tempIpyDataList:
         rankAwardDict[tempIpyData.GetRank()] = [tempIpyData.GetAwardItemList(), tempIpyData.GetMemAwardItemList()]
         
-    GameWorld.Log("    templateID=%s,rankAwardDict=%s" % (templateID, rankAwardDict))
+    GameWorld.Log("结算仙盟榜单奖励: familyTemplateID=%s,rankAwardDict=%s" % (familyTemplateID, rankAwardDict))
     billBoard.Sort()
     
     familyManager = GameWorld.GetFamilyManager()
@@ -379,7 +387,7 @@
     if not actInfo or not actInfo[ShareDefine.ActKey_State]:
         GameWorld.ErrLog("跨服boss历练非活动中,无法提交! cfgID=%s, zoneID=%s" % (cfgID, zoneID))
         return
-    if not actInfo[ShareDefine.ActKey_StateJoin]:
+    if actInfo[ShareDefine.ActKey_StateJoin] != ShareDefine.ActStateJoin_Start:
         GameWorld.ErrLog("跨服boss历练非可参与状态,无法提交! cfgID=%s, zoneID=%s" % (cfgID, zoneID))
         return
     ipyData = IpyGameDataPY.GetIpyGameData("CrossActBossTrial", cfgID)
@@ -407,34 +415,69 @@
         
     return
 
-def OnCrossActIDChange(cfgID, state):
-    ## 活动ID变更
+def OnCrossActIDChange(cfgID, zoneID, ipyData, state):
+    ## 跨服活动ID变更
+    if state:
+        OnCrossActStart(cfgID, zoneID, ipyData)
+    else:
+        OnCrossActEnd(cfgID, zoneID, ipyData)
+    return
+
+def OnCrossActStart(cfgID, zoneID, ipyData):
+    ## 跨服活动开启
     
-    # 先结算活动
-    zoneID = 0
-    ipyData = IpyGameDataPY.GetIpyGameData("CrossActBossTrial", cfgID)
-    if ipyData:
-        zoneID = ipyData.GetZoneID()
-        
-        PersonalTemplateID = ipyData.GetPersonalTemplateID()
-        FamilyTemplateID = ipyData.GetFamilyTemplateID()
-        
-        __GiveCrossOrderAwardPersonal(cfgID, zoneID, PersonalTemplateID, ShareDefine.Def_CBT_BossTrialSubmit)
-        __GiveCrossOrderAwardFamily(cfgID, zoneID, FamilyTemplateID, ShareDefine.Def_CBT_BossTrialSubmitFamily)
-            
-    # 如果有新活动,处理新活动
-    if not state:
+    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActBossTrialAwardC % zoneID, 0)
+    
+    groupValue1 = zoneID
+    billboardMgr = PyDataManager.GetCrossBillboardManager()
+    billboardObj = billboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_BossTrialSubmit, groupValue1)
+    billboardObj.ClearData() # 新活动重置榜单数据
+    
+    billboardObj = billboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_BossTrialSubmitFamily, groupValue1)
+    billboardObj.ClearData() # 新活动重置榜单数据    
+    return
+
+def OnCrossActEnd(cfgID, zoneID, ipyData):
+    ## 跨服活动结束
+    
+    groupValue1 = zoneID
+    GameWorld.Log("=== 跨服boss历练活动结束! === cfgID=%s,zoneID=%s" % (cfgID, zoneID))
+    __OnCrossEndAward(cfgID, zoneID, ipyData)
+    
+    # 备份、清除榜单数据
+    billboardMgr = PyDataManager.GetCrossBillboardManager()
+    billboardObj = billboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_BossTrialSubmit, groupValue1)
+    CrossBillboard.CopyBillboardEx(ShareDefine.Def_CBT_BossTrialSubmit, ShareDefine.Def_CBT_BossTrialSubmitBak, groupValue1)
+    billboardObj.ClearData()
+    
+    billboardObj = billboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_BossTrialSubmitFamily, groupValue1)
+    CrossBillboard.CopyBillboardEx(ShareDefine.Def_CBT_BossTrialSubmitFamily, ShareDefine.Def_CBT_BossTrialSubmitFamilyBak, groupValue1)
+    billboardObj.ClearData()
+    GameWorld.Log("=================================================================================")
+    return
+
+def OnCrossActJoinEnd(cfgID, zoneID, ipyData):
+    ## 跨服活动参与结束
+    __OnCrossEndAward(cfgID, zoneID, ipyData)
+    return
+
+def __OnCrossEndAward(cfgID, zoneID, ipyData):
+    ## 结算跨服奖励
+    awardState = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActBossTrialAwardC % zoneID)
+    if awardState:
+        #已经结算过该活动
+        GameWorld.Log("跨服boss历练活动已经结算过奖励了! cfgID=%s,zoneID=%s" % (cfgID, zoneID))
         return
+    PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActBossTrialAwardC % zoneID, 1)
     
-    if zoneID:
-        groupValue1 = zoneID
-        billboardMgr = PyDataManager.GetCrossBillboardManager()
-        billboardObj = billboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_BossTrialSubmit, groupValue1)
-        billboardObj.ClearData() # 新活动重置榜单数据
-        
-        billboardObj = billboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_BossTrialSubmitFamily, groupValue1)
-        billboardObj.ClearData() # 新活动重置榜单数据
-        
+    GameWorld.Log("=== 跨服boss历练活动发放榜单奖励! === cfgID=%s,zoneID=%s" % (cfgID, zoneID))
+    
+    PersonalTemplateID = ipyData.GetPersonalTemplateID()
+    FamilyTemplateID = ipyData.GetFamilyTemplateID()
+    
+    __GiveCrossOrderAwardPersonal(cfgID, zoneID, PersonalTemplateID, ShareDefine.Def_CBT_BossTrialSubmit)
+    __GiveCrossOrderAwardFamily(cfgID, zoneID, FamilyTemplateID, ShareDefine.Def_CBT_BossTrialSubmitFamily)
+    GameWorld.Log("=================================================================================")
     return
     
 def __GiveCrossOrderAwardPersonal(cfgID, zoneID, templateID, billboardType):
@@ -482,10 +525,6 @@
                 orderCount += 1
                 billboardIndex += 1
                 
-    # 结算完备份、清除榜单数据
-    if billboardType == ShareDefine.Def_CBT_BossTrialSubmit:
-        CrossBillboard.CopyBillboardEx(billboardType, ShareDefine.Def_CBT_BossTrialSubmitBak, groupValue1)
-        billboardObj.ClearData()
     return
 
 def __GiveCrossOrderAwardFamily(cfgID, zoneID, templateID, billboardType):
@@ -536,9 +575,5 @@
         sendMsg = {"cfgID":cfgID, "zoneID":zoneID, "templateID":templateID, "awardFamilyList":awardFamilyList}
         CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossBossTrialFamilyAward, sendMsg)
         
-    # 结算完备份、清除榜单数据
-    if billboardType == ShareDefine.Def_CBT_BossTrialSubmitFamily:
-        CrossBillboard.CopyBillboardEx(billboardType, ShareDefine.Def_CBT_BossTrialSubmitFamilyBak, groupValue1)
-        billboardObj.ClearData()
     return
 
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py
index ce9ffb1..62f2e42 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerDBGSEvent.py
@@ -174,6 +174,10 @@
 Def_CrossChampionshipStateError = "CrossChampionshipStateError"
 #跨服排位争霸赛活动状态异常后续处理状态
 Def_CrossChampionshipErrorDo = "CrossChampionshipErrorDo"
+#boss历练结算状态,参数(actNum),跨服活动参数(zoneID)
+Def_ActBossTrialAward = "ActBossTrialAward_%s"
+#跨服boss历练结算状态,参数(zoneID)
+Def_ActBossTrialAwardC = "ActBossTrialAwardC_%s"
 
 def SetInitOpenServerTime(initTime):
     openDatetime = GameWorld.ChangeTimeNumToDatetime(initTime)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
index 5158df0..cd646e4 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -368,6 +368,13 @@
 ActKey_IpyDataInfo = "IpyDataInfo" # 活动对应 IpyData 信息
 ActKey_DBInfo = "DBInfo" # 保存db的历史活动信息
 
+#活动参与状态
+(
+ActStateJoin_None, # 参与前或未开启 0
+ActStateJoin_Start, # 开启参与中 1
+ActStateJoin_End, # 参与结束,仅有配置参与时间段的活动有该状态 2
+) = range(3)
+
 #答题类型枚举
 Def_Game_ExamTypeList = range(1, 4 + 1)
 (
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index d8ea020..177ec98 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -4021,6 +4021,7 @@
 Def_PDict_ZhuXianBossHelpCnt = "ZhuXianBossHelpCnt"  # 协助次数
 
 #boss历练
+Def_PDict_BossTrialRecycleState = "BossTrialRecycleState"  # 活动物品回收状态,该活动所有的本服、跨服活动结束才回收 1-标记等待回收;2-已回收过
 Def_PDict_CA_BossTrialID = "CA_BossTrialID"  # 玩家身上的活动ID,唯一标识,取活动开始日期time值
 Def_PDict_BossTrialID = "BossTrialID_%s"  # 玩家身上的活动ID,唯一标识,取活动开始日期time,参数(活动编号)
 Def_PDict_BossTrialSubmitCount = "BossTrialSubmitCount_%s"  # 提交凭证物品个数,参数(活动编号)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
index c4220d1..183b08d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
@@ -32,6 +32,7 @@
 import NetPackCommon
 import Operate_EquipStone
 import PlayerFairyCeremony
+import PlayerActBossTrial
 import PlayerMagicWeapon
 import IpyGameDataPY
 import DataRecordPack
@@ -1151,7 +1152,11 @@
                 #GameWorld.DebugLog("增加副本次数默认使用! mapID=%s" % mapID)
                 tagItem.Clear()
                 return True
-            
+        #活动道具自动转化
+        if PlayerActBossTrial.CheckActItemAutoTransform(curPlayer, tagItem, itemID, tagItemCount):
+            tagItem.Clear()
+            return True
+        
         if itemID in ChConfig.Def_TransformItemIDList or tagItem.GetType() == ChConfig.Def_ItemType_AutoUseMoney:
             # 直接转化为对应货币的物品仅在放入背包时直接转化,否则还是以真实物品的形式存在,但堆叠上限需要做特殊处理
             if packIndex == IPY_GameWorld.rptItem:
@@ -2691,6 +2696,23 @@
         curItem.Clear()
     return
 
+def ClearItemID(curPlayer, clearItemIDList, packTypeList=[IPY_GameWorld.rptItem, IPY_GameWorld.rptWarehouse]):
+    ## 清除指定的物品ID列表
+    clearCountDict = {}
+    for packType in packTypeList:
+        pack = curPlayer.GetItemManager().GetPack(packType)
+        for i in xrange(pack.GetCount()):
+            curItem = pack.GetAt(i)
+            if not curItem or curItem.IsEmpty():
+                continue
+            itemID = curItem.GetItemTypeID()
+            if itemID not in clearItemIDList:
+                continue
+            itemCount = curItem.GetCount()
+            curItem.Clear()
+            clearCountDict[itemID] = clearCountDict.get(itemID, 0) + itemCount
+    return clearCountDict
+
 def PutItemInTempSwap(curPlayer, itemID, isAuctionItem=0):
     ## 临时背包放入物品
     # 临时交换背包目前只开放1个格子,每次放入前先清空再放入
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActBossTrial.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActBossTrial.py
index 1a49c82..1fb9c3a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActBossTrial.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerActBossTrial.py
@@ -106,6 +106,7 @@
     
     playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BossTrialID % actNum) # 玩家身上的活动ID
     
+    __CheckActItemRecycle(curPlayer) # 必须在活动ID更新之前处理
     # 活动ID 相同的话不处理
     if actID == playerActID:
         GameWorld.DebugLog("Boss历练活动ID不变,不处理! actID=%s" % actID, curPlayer.GetPlayerID())
@@ -150,6 +151,7 @@
     
     playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CA_BossTrialID) # 玩家身上的活动ID
     
+    __CheckActItemRecycle(curPlayer) # 必须在活动ID更新之前处理
     # 活动ID 相同的话不处理
     if actID == playerActID:
         GameWorld.DebugLog("跨服Boss历练活动ID不变,不处理!cfgID=%s,dayIndex=%s,actID=%s" % (cfgID, dayIndex, actID), playerID)   
@@ -163,7 +165,54 @@
     Sync_CrossActBossTrialActionInfo(curPlayer)
     return True
 
+def __CheckActItemRecycle(curPlayer):
+    ## 检查活动物品回收,玩家所有参与过的活动ID都结束后才处理
+    
+    if IsInActBossTrial(curPlayer):
+        # 还有活动中,标记待回收,如果一直有交替的活动开启中,则该状态一直为等待回收状态
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BossTrialRecycleState, 1)
+        return
+    
+    playerID = curPlayer.GetPlayerID()
+    recycleState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BossTrialRecycleState)
+    if not recycleState:
+        # 这样可以兼容回收功能上线后,确保老玩家之前屯的活动物品不会被回收,至少可以参与一次
+        GameWorld.DebugLog("Boss历练活动玩家没有标记过等待回收活动物品,不处理!", playerID)
+        return
+    
+    if recycleState == 2:
+        # 因为结束参与及活动结束都会触发检查,所以需要标记已处理过,防止一次活动多次回收
+        GameWorld.DebugLog("Boss历练活动已回收过活动物品!", playerID)
+        return
+    
+    actItemID = IpyGameDataPY.GetFuncCfg("BossTrial", 1)
+    clearCountDict = ItemControler.ClearItemID(curPlayer, [actItemID])
+    clearCount = clearCountDict.get(actItemID, 0)
+    GameWorld.Log("Boss历练活动回收活动物品! actItemID=%s,clearCount=%s" % (actItemID, clearCount), playerID)
+    if clearCount > 0:
+        addMoney = clearCount
+        PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_BossTrial, addMoney, "BossTrialRecycle")
+        paramList = [clearCount, actItemID, actItemID, addMoney]
+        PlayerControl.SendMailByKey("BossTrialRecycle", [playerID], [], paramList)
+        
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BossTrialRecycleState, 2)
+    return
 
+def CheckActItemAutoTransform(curPlayer, tagItem, itemID, tagItemCount):
+    ## 检查活动物品自动转化为对应积分,物品实例外部统一清理
+    if itemID != IpyGameDataPY.GetFuncCfg("BossTrial", 1):
+        return False
+    if IsInActBossTrial(curPlayer):
+        return False
+    GameWorld.DebugLog("Boss历练活动非参与中,自动回收获得的活动物品! itemID=%s,itemCount=%s" % (itemID, tagItemCount))
+    PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_BossTrial, tagItemCount, "BossTrialRecycle")
+    return True
+
+def IsInActBossTrial(curPlayer):
+    ## 是否有正在参与中的进行中活动
+    return PlayerControl.IsInOperationAction(curPlayer, ShareDefine.OperationActionName_BossTrial, ChConfig.Def_PDict_BossTrialID, 
+                                             ShareDefine.CrossActName_BossTrial, ChConfig.Def_PDict_CA_BossTrialID)
+    
 def SendToGameServer_BossTrial(curPlayer, msgType, dataMsg=""):
     playerID = curPlayer.GetPlayerID()
     msgList = str([msgType, dataMsg])
@@ -192,11 +241,11 @@
     
     crossActInfo = CrossRealmPlayer.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_BossTrial)
     if crossActInfo.get(ShareDefine.ActKey_State, 0):
-        if not crossActInfo.get(ShareDefine.ActKey_StateJoin):
+        if crossActInfo.get(ShareDefine.ActKey_StateJoin) != ShareDefine.ActStateJoin_Start:
             GameWorld.Log("跨服Boss历练非参与活动中: actNum=%s" % actNum, playerID)
             return
     else:
-        if not actInfo.get(ShareDefine.ActKey_StateJoin):
+        if actInfo.get(ShareDefine.ActKey_StateJoin) != ShareDefine.ActStateJoin_Start:
             GameWorld.Log("Boss历练非参与活动中: actNum=%s" % actNum, playerID)
             return
         
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
index a5bd730..deeb53e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -6084,6 +6084,32 @@
     return
 
 #---------------------------------------------------------------------
+def IsInOperationAction(curPlayer, actName, actIDKey, crossActName="", crossActIDKey=""):
+    ## 玩家是否有正在参与中的活动中运营活动
+    
+    if crossActName and crossActIDKey:
+        playerActID = curPlayer.NomalDictGetProperty(crossActIDKey)
+        actInfo = CrossRealmPlayer.GetPlayerCrossActInfo(curPlayer, crossActName)
+        actID = actInfo.get(ShareDefine.ActKey_ID, 0)
+        cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)
+        stateJoin = actInfo.get(ShareDefine.ActKey_StateJoin, 0)
+        if stateJoin == ShareDefine.ActStateJoin_Start and actID == playerActID:
+            GameWorld.DebugLog("%s活动玩家正在参与中! cfgID=%s,actID=%s,stateJoin=%s" 
+                               % (crossActName, cfgID, actID, stateJoin), curPlayer.GetPlayerID())
+            return True
+        
+    for actInfo in PyGameData.g_operationActionDict.get(actName, {}).values():
+        actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)
+        actID = actInfo.get(ShareDefine.ActKey_ID, 0)
+        stateJoin = actInfo.get(ShareDefine.ActKey_StateJoin, 0)
+        playerActID = curPlayer.NomalDictGetProperty(actIDKey % actNum)
+        if stateJoin == ShareDefine.ActStateJoin_Start and actID == playerActID:
+            GameWorld.DebugLog("%s玩家正在参与中! actNum=%s,actID=%s,stateJoin=%s" 
+                               % (actName, actNum, actID, stateJoin), curPlayer.GetPlayerID())
+            return True
+        
+    return False
+
 def RefreshOperationAction_ExpRate():
     playerManager = GameWorld.GetPlayerManager()
     for i in xrange(playerManager.GetPlayerCount()):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index 5158df0..cd646e4 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -368,6 +368,13 @@
 ActKey_IpyDataInfo = "IpyDataInfo" # 活动对应 IpyData 信息
 ActKey_DBInfo = "DBInfo" # 保存db的历史活动信息
 
+#活动参与状态
+(
+ActStateJoin_None, # 参与前或未开启 0
+ActStateJoin_Start, # 开启参与中 1
+ActStateJoin_End, # 参与结束,仅有配置参与时间段的活动有该状态 2
+) = range(3)
+
 #答题类型枚举
 Def_Game_ExamTypeList = range(1, 4 + 1)
 (

--
Gitblit v1.8.0