From 17a6cf93c19a3a74bc38c06d85f7655c0266105a Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 04 七月 2024 19:06:30 +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 489ae9c..448293c 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossActionControl.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossActionControl.py
@@ -541,7 +541,7 @@
isEnd = True
state = 0 # 默认关闭
- stateJoin = 0 # 可参与状态
+ stateJoin = ShareDefine.ActStateJoin_None # 可参与状态,0-参与前;1-可参与;2-参与结束
cfgID = ipyData.GetCfgID()
groupName = ipyData.GetActGroupName()
zoneID = ipyData.GetZoneID()
@@ -564,10 +564,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)
# 全服广播提示信息
@@ -597,8 +599,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
@@ -620,7 +622,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])
@@ -635,6 +637,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 a805153..c52caee 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 eab8276..d8f7ebe 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -4055,6 +4055,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 58bc0eb..5a9e24c 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
@@ -1152,7 +1153,11 @@
#GameWorld.DebugLog("增加副本次数默认使用! mapID=%s" % mapID)
tagItem.Clear()
return True
-
+ #活动道具自动转化
+ if PlayerActBossTrial.CheckActItemAutoTransform(curPlayer, tagItem, itemID, tagItemCount):
+ tagItem.Clear()
+ return True
+
#增加竞技场次数
if itemEff.GetEffectID() == ChConfig.Def_Effect_AddArenaBattleCount:
PlayerArena.AddArenaBattleCount(curPlayer, itemEff.GetEffectValue(0))
@@ -2333,6 +2338,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 3926240..3af815c 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -6054,6 +6054,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 a805153..c52caee 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