From 8a8329e10d9003867939df1e55bc93e84ebed55f Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期日, 22 九月 2019 18:33:52 +0800 Subject: [PATCH] 8282 [主干]跑环任务,每环都要物品灵石(跑环支持直接给灵石) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerWeekParty.py | 164 +++++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 124 insertions(+), 40 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerWeekParty.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerWeekParty.py index 7832d696..fcddb73 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerWeekParty.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerWeekParty.py @@ -25,6 +25,10 @@ import PlayerControl import ItemControler import ChPyNetSendPack +import Operate_EquipStone +import PlayerFeastWeekParty +import DataRecordPack +import PlayerGodWeapon import NetPackCommon import ShareDefine import PyGameData @@ -61,18 +65,22 @@ state = actWeekPartyInfo.get(ShareDefine.ActKey_State, 0) cfgID = actWeekPartyInfo.get(ShareDefine.ActKey_CfgID, 0) passlv = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_TrialTower_PassLV) - isOk = AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_Tower, passlv, False) - AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_Login, 1) - - playerWeekPartyID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_WeekPartyID, 0, ChConfig.Def_PDictType_WeekParty) # 玩家身上的活动ID - if not isOk and state: + if state: + #每天都要触发 + AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_Tower, passlv, False, True, False) + AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_Login, 1, False, False) + AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_Stone, Operate_EquipStone.GetTotalStoneLV(curPlayer), False, True, False) + AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_GodWeapon, PlayerGodWeapon.GetGodWeaponTotalLV(curPlayer), False, True, False) SyncWeekPartyPlayerInfo(curPlayer) + playerWeekPartyID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_WeekPartyID, 0, ChConfig.Def_PDictType_WeekParty) # 玩家身上的活动ID # 活动ID 相同的话不处理 if cfgID == playerWeekPartyID: #GameWorld.DebugLog("周狂欢活动ID不变,不处理!", curPlayer.GetPlayerID()) return + CheckWeekPartyActionCnt(curPlayer) # 未领取的奖励邮件发放 - __SendWeekPartyMail(curPlayer, playerWeekPartyID) + if playerWeekPartyID: + __SendWeekPartyMail(curPlayer, playerWeekPartyID) if not cfgID: GameWorld.DebugLog(' 周狂欢活动重置!') @@ -123,6 +131,7 @@ itemList = awardDict[point] for itemID, itemCnt, isBind in itemList: totalItemDict[itemID] = totalItemDict.get(itemID, 0) + itemCnt + DataRecordPack.DR_WeekPartyPoint(curPlayer, day, point) if not totalItemDict: return totalItemList = [[itemID, itemCnt, 1] for itemID, itemCnt in totalItemDict.items()] @@ -130,8 +139,9 @@ return -def AddWeekPartyActionCnt(curPlayer, actionID, addCnt=1, isAdd=True): +def AddWeekPartyActionCnt(curPlayer, actionID, addCnt=1, isAdd=True, isCompatible=False, isSync=True): '''增加周狂欢相关活动完成次数''' + PlayerFeastWeekParty.AddFeastWeekPartyActionCnt(curPlayer, actionID, addCnt, isAdd, isCompatible, isSync) #判断活动是否开启 if not addCnt: return @@ -139,8 +149,11 @@ state = actWeekPartyInfo.get(ShareDefine.ActKey_State, 0) cfgID = actWeekPartyInfo.get(ShareDefine.ActKey_CfgID, 0) - if not state or not cfgID: + if not cfgID: return + if not state and actionID not in ChConfig.AheadFinishWPActList: + return + actBossIpyData = IpyGameDataPY.GetIpyGameData("ActWeekParty", cfgID) if not actBossIpyData: return @@ -148,40 +161,102 @@ dayIndex = actWeekPartyInfo.get(ShareDefine.ActKey_DayIndex, 0) if dayIndex >= len(templateIDList): return + if actionID in ChConfig.AheadFinishWPActList: + isFind = False + for day, dayTidList in enumerate(templateIDList[dayIndex:]): + findTid = 0 + for tid in dayTidList: + if tid / 100 == actionID: + findTid = tid + break + if not findTid: + continue + ipyData = IpyGameDataPY.GetIpyGameData('WeekParty', findTid) + if not ipyData: + continue + totalTimes = ipyData.GetTotalTimes() + if addCnt != totalTimes: + continue + dayIndex = day + dayIndex + isFind = True + break + if not isFind: + return + dayTidList = templateIDList[dayIndex] - findTid = 0 + findTidList = [] for tid in dayTidList: if tid / 100 == actionID: - findTid = tid - break - if not findTid: + findTidList.append(tid) + if not findTidList: return - ipyData = IpyGameDataPY.GetIpyGameData('WeekParty', findTid) - if not ipyData: - return - totalTimes = ipyData.GetTotalTimes() - curTimes = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_WeekPartyCurTimes % (dayIndex, findTid), 0, ChConfig.Def_PDictType_WeekParty) - if isAdd: - addCnt = addCnt if totalTimes == 0 else min(totalTimes - curTimes, addCnt) - if addCnt <= 0: - return - updTimes = curTimes + addCnt - else: - updTimes = min(addCnt, totalTimes) - realAddCnt = updTimes - curTimes - if realAddCnt <= 0: - return - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_WeekPartyCurTimes % (dayIndex, findTid), updTimes, ChConfig.Def_PDictType_WeekParty) - #加积分 - singleTimes = ipyData.GetSingleTimes() - addPoint = (curTimes % singleTimes + realAddCnt)/singleTimes* ipyData.GetPoint() - curPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_WeekPartyPoint % dayIndex, 0, ChConfig.Def_PDictType_WeekParty) - updPoint = curPoint + addPoint - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_WeekPartyPoint % dayIndex, updPoint, ChConfig.Def_PDictType_WeekParty) - GameWorld.DebugLog(' 增加周狂欢相关活动完成次数 dayIndex=%s, findTid=%s, realAddCnt=%s,addPoint=%s' % (dayIndex, findTid, realAddCnt, addPoint)) - SyncWeekPartyPlayerInfo(curPlayer, dayIndex, findTid) + for findTid in findTidList: + ipyData = IpyGameDataPY.GetIpyGameData('WeekParty', findTid) + if not ipyData: + continue + totalTimes = ipyData.GetTotalTimes() + curTimes = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_WeekPartyCurTimes % (dayIndex, findTid), 0, ChConfig.Def_PDictType_WeekParty) + if isAdd: + curAddCnt = addCnt if totalTimes == 0 else min(totalTimes - curTimes, addCnt) + if curAddCnt <= 0: + continue + updTimes = curTimes + curAddCnt + else: + if not isCompatible and addCnt != totalTimes: + continue + updTimes = min(addCnt, totalTimes) + realAddCnt = updTimes - curTimes + if realAddCnt <= 0: + continue + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_WeekPartyCurTimes % (dayIndex, findTid), updTimes, ChConfig.Def_PDictType_WeekParty) + #加积分 + singleTimes = ipyData.GetSingleTimes() + addPoint = (curTimes % singleTimes + realAddCnt)/singleTimes* ipyData.GetPoint() + curPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_WeekPartyPoint % dayIndex, 0, ChConfig.Def_PDictType_WeekParty) + updPoint = curPoint + addPoint + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_WeekPartyPoint % dayIndex, updPoint, ChConfig.Def_PDictType_WeekParty) + GameWorld.DebugLog(' 增加周狂欢相关活动完成次数 dayIndex=%s, findTid=%s, realAddCnt=%s,addPoint=%s' % (dayIndex, findTid, realAddCnt, addPoint)) + if isSync: + SyncWeekPartyPlayerInfo(curPlayer, dayIndex, findTid) return True + +def CheckWeekPartyActionCnt(curPlayer): + ipyDataMgr = IpyGameDataPY.IPY_Data() + for actionType in ChConfig.AheadFinishWPActList: + if actionType == ChConfig.Def_WPAct_Horse: + for i in xrange(ipyDataMgr.GetHorseCount()): + ipyData = ipyDataMgr.GetHorseByIndex(i) + index = ipyData.GetHorseID() + lv = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Horser_LV % index, 0, ChConfig.Def_PDictType_Horse) + if lv: + AddWeekPartyActionCnt(curPlayer, actionType, index, False) + elif actionType == ChConfig.Def_WPAct_Pet: + petDataPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptPet) + for petDataIndex in range(petDataPack.GetCount()): + petItem = petDataPack.GetAt(petDataIndex) + if petItem.IsEmpty(): + continue + petNPCID = petItem.GetUserAttr(ShareDefine.Def_IudetPet_NPCID) + AddWeekPartyActionCnt(curPlayer, actionType, petNPCID, False) + elif actionType == ChConfig.Def_WPAct_Dogz: + for i in xrange(ipyDataMgr.GetDogzCount()): + ipyData = ipyDataMgr.GetDogzByIndex(i) + if GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_DogzFightState, i): + AddWeekPartyActionCnt(curPlayer, actionType, ipyData.GetDogzID(), False) + elif actionType == ChConfig.Def_WPAct_Rune: + runeHoleCnt = IpyGameDataPY.GetFuncCfg("RuneUnlock", 4) + for holeNum in xrange(1, runeHoleCnt + 1): + runeData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Rune_Data % holeNum, 0) + if not runeData: + continue + runeItemID = ItemControler.GetRuneItemID(runeData) + itemData = GameWorld.GetGameData().GetItemByTypeID(runeItemID) + if not itemData: + continue + itemColor = itemData.GetItemColor() + AddWeekPartyActionCnt(curPlayer, actionType, itemColor, False) + return def GetWeekPartyActionAward(curPlayer, day, templateID): '''领取周狂欢活动奖励''' @@ -209,7 +284,7 @@ #GameWorld.Log(' actionID=%s,curTimes=%s,gotTimes=%s,singleTimes=%s,newGotTimes=%s'%(actionID, curTimes, gotTimes,singleTimes, newGotTimes)) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_WeekPartyGotTimes % (day, templateID), newGotTimes, ChConfig.Def_PDictType_WeekParty) for itemID, itemCnt in awardDict.items(): - ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, 1, [IPY_GameWorld.rptItem]) + ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, 0, [IPY_GameWorld.rptItem]) SyncWeekPartyPlayerInfo(curPlayer, day, templateID) return @@ -246,20 +321,28 @@ return PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_WeekPartyAwardRecord % day, awardRecord | pow(2, getIndex), ChConfig.Def_PDictType_WeekParty) for itemID, itemCnt, isBind in itemList: - ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, isBind, [IPY_GameWorld.rptItem]) + ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, 0, [IPY_GameWorld.rptItem]) SyncWeekPartyPlayerInfo(curPlayer, day) + DataRecordPack.DR_WeekPartyPoint(curPlayer, day, getPoint) return def __GetAwardItem(curPlayer, ipyData, times=1): awardDict = {} - for itemID, itemCnt, isbind in ipyData.GetReward(): + awardItemList = __GetAwardItemListByJob(curPlayer, ipyData) + for itemID, itemCnt, isbind in awardItemList: if not itemID or not itemCnt: continue awardDict[itemID] = awardDict.get(itemID, 0) + itemCnt * times return awardDict +def __GetAwardItemListByJob(curPlayer, ipyData): + ## 根据职业获取对应奖励 + rewardItemInfo = ipyData.GetReward() + if isinstance(rewardItemInfo, dict): + return rewardItemInfo.get(curPlayer.GetJob(), []) + return rewardItemInfo def SyncWeekPartyPlayerInfo(curPlayer, day=-1, templateID=-1): #通知当前次数、已领次数 @@ -363,7 +446,8 @@ tInfo.SingleTimes = ipyData.GetSingleTimes() tInfo.Point = ipyData.GetPoint() tInfo.ItemInfo = [] - for itemID, itemCnt, isBind in ipyData.GetReward(): + awardItemList = __GetAwardItemListByJob(curPlayer, ipyData) + for itemID, itemCnt, isBind in awardItemList: awardItem = ChPyNetSendPack.tagMCWeekPartyItem() awardItem.ItemID = itemID awardItem.ItemCnt = itemCnt -- Gitblit v1.8.0