10198 【香港】【越南】【主干】【砍树】【后端】BOSS凭证优化
| | |
| | |
|
| | | isEnd = True
|
| | | state = 0 # 默认关闭
|
| | | stateJoin = 0 # 可参与状态
|
| | | stateJoin = ShareDefine.ActStateJoin_None # 可参与状态,0-参与前;1-可参与;2-参与结束
|
| | | cfgID = ipyData.GetCfgID()
|
| | | groupName = ipyData.GetActGroupName()
|
| | | zoneID = ipyData.GetZoneID()
|
| | |
| | | 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)
|
| | | # 全服广播提示信息
|
| | |
| | | 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
|
| | |
| | | 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])
|
| | |
| | | % (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:
|
| | |
| | | for sendMapServerMsgDict in curActMapInfoDictList:
|
| | |
|
| | | state = 0 # 默认关闭
|
| | | stateJoin = 0 # 可参与状态
|
| | | stateJoin = ShareDefine.ActStateJoin_None # 可参与状态,0-参与前;1-可参与;2-参与结束
|
| | | ipyData = None
|
| | |
|
| | | actNum = sendMapServerMsgDict.get(ShareDefine.ActKey_ActNum, 0)
|
| | |
| | | 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:
|
| | |
| | | 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
|
| | |
| | | import ShareDefine |
| | | import DataRecordPack |
| | | import PlayerCompensation |
| | | import PlayerDBGSEvent |
| | | import PlayerBillboard |
| | | import IpyGameDataPY |
| | | import GameWorld |
| | |
| | | |
| | | def OnActStart(actNum): |
| | | ## 活动开启 |
| | | PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActBossTrialAward % actNum, 0) |
| | | PlayerBillboard.ClearBillboardByIndex(ShareDefine.Def_BT_BossTrialSubmit) |
| | | PlayerBillboard.ClearBillboardByIndex(ShareDefine.Def_BT_BossTrialSubmitFamily) |
| | | |
| | |
| | | |
| | | 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 |
| | | |
| | |
| | | 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) |
| | |
| | | |
| | | 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 |
| | | |
| | |
| | | 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() |
| | |
| | | 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) |
| | |
| | | |
| | | 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): |
| | |
| | | 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): |
| | |
| | | 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 |
| | | |
| | |
| | | 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)
|
| | |
| | | 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)
|
| | | (
|
| | |
| | | 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" # 提交凭证物品个数,参数(活动编号)
|
| | |
| | | import NetPackCommon
|
| | | import Operate_EquipStone
|
| | | import PlayerFairyCeremony
|
| | | import PlayerActBossTrial
|
| | | import PlayerMagicWeapon
|
| | | import IpyGameDataPY
|
| | | import DataRecordPack
|
| | |
| | | #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:
|
| | |
| | | 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个格子,每次放入前先清空再放入
|
| | |
| | | |
| | | 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()) |
| | |
| | | |
| | | 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) |
| | |
| | | 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]) |
| | |
| | | |
| | | 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 |
| | | |
| | |
| | | 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()):
|
| | |
| | | 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)
|
| | | (
|