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