#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # #------------------------------------------------------------------------------- # ##@package Player.PlayerFeastWeekParty # # @todo:½ÚÈÕѲÀñ # @author xdh # @date 2018-07-12 16:50 # @version 1.0 # # # ÏêϸÃèÊö: ½ÚÈÕѲÀñ # #--------------------------------------------------------------------- """Version = 2018-07-12 16:50""" #--------------------------------------------------------------------- import IPY_GameWorld import GameWorld import ChConfig import IpyGameDataPY import PlayerControl import ItemControler import ChPyNetSendPack import Operate_EquipStone import DataRecordPack import PlayerGodWeapon import NetPackCommon import ShareDefine import PyGameData import ItemCommon def OnLogin(curPlayer): isReset = __CheckPlayerFeastWeekPartyAction(curPlayer) if not isReset: actCostRebateInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FeastWeekParty, {}) # »î¶¯ÖÐͬ²½»î¶¯ÐÅÏ¢ SyncFeastWeekPartyInfo(curPlayer) if actCostRebateInfo.get(ShareDefine.ActKey_State): AddFeastWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_Login, 1, False, False, False) SyncFeastWeekPartyPlayerInfo(curPlayer) return def RefreshOperationAction_FeastWeekParty(): playerManager = GameWorld.GetPlayerManager() for i in xrange(playerManager.GetPlayerCount()): curPlayer = playerManager.GetPlayerByIndex(i) if curPlayer == None or not curPlayer.GetInitOK(): continue __CheckPlayerFeastWeekPartyAction(curPlayer) return def __CheckPlayerFeastWeekPartyAction(curPlayer): ## ¼ì²éÍæ¼Ò½ÚÈÕѲÀñ»î¶¯Êý¾ÝÐÅÏ¢ playerID = curPlayer.GetPlayerID() actFeastWeekPartyInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FeastWeekParty, {}) state = actFeastWeekPartyInfo.get(ShareDefine.ActKey_State, 0) actID = actFeastWeekPartyInfo.get(ShareDefine.ActKey_ID, 0) cfgID = actFeastWeekPartyInfo.get(ShareDefine.ActKey_CfgID, 0) playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_WeekPartyActID, 0, ChConfig.Def_PDictType_FeastWeekParty) # Íæ¼ÒÉíÉϵĻID playerFeastWeekPartyID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastWeekPartyID, 0, ChConfig.Def_PDictType_FeastWeekParty) # Íæ¼ÒÉíÉϵĻÅäÖÃID # »î¶¯ID ÏàͬµÄ»°²»´¦Àí if actID == playerActID: GameWorld.DebugLog("½ÚÈÕѲÀñ»î¶¯ID²»±ä£¬²»´¦Àí£¡playerActID=%s" % playerActID, curPlayer.GetPlayerID()) if state: CheckFeastWeekPartyActionCnt(curPlayer, True) return # δÁìÈ¡µÄ½±ÀøÓʼþ·¢·Å if playerFeastWeekPartyID: __SendFeastWeekPartyMail(curPlayer, playerFeastWeekPartyID) GameWorld.DebugLog(' ½ÚÈÕѲÀñ»î¶¯ÖØÖÃ!') curPlayer.ClearNomalDict(ChConfig.Def_PDictType_FeastWeekParty) GameWorld.DebugLog("½ÚÈÕѲÀñ±ä¸ü! state=%s,actID=%s,cfgID=%s,playerFeastWeekPartyID=%s" % (state, actID, cfgID, playerFeastWeekPartyID), playerID) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_WeekPartyActID, actID, ChConfig.Def_PDictType_FeastWeekParty) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastWeekPartyID, cfgID, ChConfig.Def_PDictType_FeastWeekParty) if state: CheckFeastWeekPartyActionCnt(curPlayer, False) SyncFeastWeekPartyInfo(curPlayer) SyncFeastWeekPartyPlayerInfo(curPlayer) return True def __SendFeastWeekPartyMail(curPlayer, cfgID): # δÁìÈ¡µÄ½±ÀøÓʼþ·¢·Å actBossIpyData = IpyGameDataPY.GetIpyGameData("ActFeastWeekParty", cfgID) if not actBossIpyData: return templateIDList = actBossIpyData.GetTemplateID() if not templateIDList: return totalItemDict = {} for day, tidList in enumerate(templateIDList): for tid in tidList: ipyData = IpyGameDataPY.GetIpyGameData('FeastWeekParty', tid) if not ipyData: continue singleTimes = ipyData.GetSingleTimes() curTimes = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastWeekPartyCurTimes % (day, tid), 0, ChConfig.Def_PDictType_FeastWeekParty) gotTimes = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastWeekPartyGotTimes % (day, tid), 0, ChConfig.Def_PDictType_FeastWeekParty) canGotCnt = (curTimes - gotTimes) / singleTimes if not canGotCnt: continue itemDict = __GetAwardItem(curPlayer, ipyData, canGotCnt) GameWorld.AddDictValue(totalItemDict, itemDict) #»ý·Ö½±Àø for day, awardDict in actBossIpyData.GetPointAward().items(): pointList = awardDict.keys() pointList.sort() for i, point in enumerate(pointList): curPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastWeekPartyPoint % day, 0, ChConfig.Def_PDictType_FeastWeekParty) if curPoint < point: continue awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastWeekPartyAwardRecord % day, 0, ChConfig.Def_PDictType_FeastWeekParty) if awardRecord & pow(2, i): continue itemList = awardDict[point] for itemID, itemCnt, isBind in itemList: totalItemDict[itemID] = totalItemDict.get(itemID, 0) + itemCnt DataRecordPack.DR_FeastWeekPartyPoint(curPlayer, day, point) if not totalItemDict: return totalItemList = [[itemID, itemCnt, 1] for itemID, itemCnt in totalItemDict.items()] PlayerControl.SendMailByKey('SecondWeekReward2', [curPlayer.GetID()], totalItemList) return def AddFeastWeekPartyActionCnt(curPlayer, actionID, addCnt=1, isAdd=True, isCompatible=False, isSync=True): '''Ôö¼Ó½ÚÈÕѲÀñÏà¹Ø»î¶¯Íê³É´ÎÊý''' #ÅжϻÊÇ·ñ¿ªÆô if not addCnt: return actFeastWeekPartyInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FeastWeekParty, {}) state = actFeastWeekPartyInfo.get(ShareDefine.ActKey_State, 0) cfgID = actFeastWeekPartyInfo.get(ShareDefine.ActKey_CfgID, 0) if not cfgID: return if not state: return actBossIpyData = IpyGameDataPY.GetIpyGameData("ActFeastWeekParty", cfgID) if not actBossIpyData: return templateIDList = actBossIpyData.GetTemplateID() dayIndex = actFeastWeekPartyInfo.get(ShareDefine.ActKey_DayIndex, 0) if dayIndex >= len(templateIDList): return dayTidList = templateIDList[dayIndex] findTid = 0 for tid in dayTidList: if tid / 100 == actionID: findTid = tid break if not findTid: return ipyData = IpyGameDataPY.GetIpyGameData('FeastWeekParty', findTid) if not ipyData: return totalTimes = ipyData.GetTotalTimes() curTimes = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastWeekPartyCurTimes % (dayIndex, findTid), 0, ChConfig.Def_PDictType_FeastWeekParty) if isAdd: addCnt = addCnt if totalTimes == 0 else min(totalTimes - curTimes, addCnt) if addCnt <= 0: return updTimes = curTimes + addCnt else: if not isCompatible and addCnt != totalTimes: return updTimes = min(addCnt, totalTimes) realAddCnt = updTimes - curTimes if realAddCnt <= 0: return PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastWeekPartyCurTimes % (dayIndex, findTid), updTimes, ChConfig.Def_PDictType_FeastWeekParty) #¼Ó»ý·Ö singleTimes = ipyData.GetSingleTimes() addPoint = (curTimes % singleTimes + realAddCnt)/singleTimes* ipyData.GetPoint() curPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastWeekPartyPoint % dayIndex, 0, ChConfig.Def_PDictType_FeastWeekParty) updPoint = curPoint + addPoint PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastWeekPartyPoint % dayIndex, updPoint, ChConfig.Def_PDictType_FeastWeekParty) GameWorld.DebugLog(' Ôö¼Ó½ÚÈÕѲÀñÏà¹Ø»î¶¯Íê³É´ÎÊý dayIndex=%s, findTid=%s, realAddCnt=%s,addPoint=%s' % (dayIndex, findTid, realAddCnt, addPoint)) if isSync: SyncFeastWeekPartyPlayerInfo(curPlayer, dayIndex, findTid) return True def CheckFeastWeekPartyActionCnt(curPlayer, isSync): ## ͬ²½»î¶¯×´Ì¬Ê±ÐèÒª´¥·¢µÄ # Áé³è¼¤»î 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) AddFeastWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_Pet, petNPCID, False, isSync=isSync) # ³öÕ½ÉñÊÞ ipyDataMgr = IpyGameDataPY.IPY_Data() for i in xrange(ipyDataMgr.GetDogzCount()): ipyData = ipyDataMgr.GetDogzByIndex(i) if GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_DogzFightState, i): AddFeastWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_Dogz, ipyData.GetDogzID(), False, isSync=isSync) # ´©´÷ijƷÖÊ·ûÓ¡ 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() AddFeastWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_Rune, itemColor, False, isSync=isSync) AddFeastWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_Login, 1, False, False, isSync) passlv = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_TrialTower_PassLV) AddFeastWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_Tower, passlv, False, True, isSync) AddFeastWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_Stone, Operate_EquipStone.GetTotalStoneLV(curPlayer), False, True, isSync) AddFeastWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_GodWeapon, PlayerGodWeapon.GetGodWeaponTotalLV(curPlayer), False, True, isSync) return def GetFeastWeekPartyActionAward(curPlayer, day, templateID): '''ÁìÈ¡½ÚÈÕѲÀñ»î¶¯½±Àø''' templateID = GameWorld.ToIntDef(templateID, 0) ipyData = IpyGameDataPY.GetIpyGameData('FeastWeekParty', templateID) if not ipyData: return singleTimes = ipyData.GetSingleTimes() curTimes = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastWeekPartyCurTimes % (day, templateID), 0, ChConfig.Def_PDictType_FeastWeekParty) gotTimes = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastWeekPartyGotTimes % (day, templateID), 0, ChConfig.Def_PDictType_FeastWeekParty) if curTimes - gotTimes < singleTimes: return #¸ø½±Àø awardDict = __GetAwardItem(curPlayer, ipyData) # ¼ì²é±³°ü needSpace = len(awardDict) packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace) if needSpace > packSpace: PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_998371") return #¸üдÎÊý ÿ´ÎÁì½±Ö»ÁìÒ»´Î newGotTimes = gotTimes + singleTimes #GameWorld.Log(' actionID=%s,curTimes=%s,gotTimes=%s,singleTimes=%s,newGotTimes=%s'%(actionID, curTimes, gotTimes,singleTimes, newGotTimes)) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastWeekPartyGotTimes % (day, templateID), newGotTimes, ChConfig.Def_PDictType_FeastWeekParty) for itemID, itemCnt in awardDict.items(): ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, 0, [IPY_GameWorld.rptItem]) SyncFeastWeekPartyPlayerInfo(curPlayer, day, templateID) return def GetFeastWeekPartyPointAward(curPlayer, day, getPoint): ##ÁìÈ¡½ÚÈÕѲÀñ»ý·Ö½±Àø getPoint = GameWorld.ToIntDef(getPoint, 0) actFeastWeekPartyInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FeastWeekParty, {}) state = actFeastWeekPartyInfo.get(ShareDefine.ActKey_State, 0) cfgID = actFeastWeekPartyInfo.get(ShareDefine.ActKey_CfgID, 0) if not state or not cfgID: return actBossIpyData = IpyGameDataPY.GetIpyGameData("ActFeastWeekParty", cfgID) if not actBossIpyData: return curPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastWeekPartyPoint % day, 0, ChConfig.Def_PDictType_FeastWeekParty) if curPoint < getPoint: return pointAwardDict = actBossIpyData.GetPointAward().get(day, {}) pointList = pointAwardDict.keys() pointList.sort() if getPoint not in pointList: return getIndex = pointList.index(getPoint) awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastWeekPartyAwardRecord % day, 0, ChConfig.Def_PDictType_FeastWeekParty) if awardRecord & pow(2, getIndex): GameWorld.Log(' ÁìÈ¡½ÚÈÕѲÀñ»ý·Ö½±Àø£¬ ÒÑÁìÈ¡ day=%s, getPoint=%s' % (day, getPoint)) return itemList = pointAwardDict[getPoint] needSpace = len(itemList) packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace) if needSpace > packSpace: PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_998371") return PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastWeekPartyAwardRecord % day, awardRecord | pow(2, getIndex), ChConfig.Def_PDictType_FeastWeekParty) for itemID, itemCnt, isBind in itemList: ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, 0, [IPY_GameWorld.rptItem]) SyncFeastWeekPartyPlayerInfo(curPlayer, day) DataRecordPack.DR_FeastWeekPartyPoint(curPlayer, day, getPoint) return def __GetAwardItem(curPlayer, ipyData, times=1): awardDict = {} for itemID, itemCnt, isbind in ipyData.GetReward(): if not itemID or not itemCnt: continue awardDict[itemID] = awardDict.get(itemID, 0) + itemCnt * times return awardDict def SyncFeastWeekPartyPlayerInfo(curPlayer, day=-1, templateID=-1): #֪ͨµ±Ç°´ÎÊý¡¢ÒÑÁì´ÎÊý actFeastWeekPartyInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FeastWeekParty, {}) state = actFeastWeekPartyInfo.get(ShareDefine.ActKey_State, 0) cfgID = actFeastWeekPartyInfo.get(ShareDefine.ActKey_CfgID, 0) if not state or not cfgID: return actBossIpyData = IpyGameDataPY.GetIpyGameData("ActFeastWeekParty", cfgID) if not actBossIpyData: return templateIDList = actBossIpyData.GetTemplateID() if not templateIDList: return if day != -1: if day >= len(templateIDList): return syncDayList = [day] else: syncDayList = range(len(templateIDList)) packData = ChPyNetSendPack.tagMCFeastWeekPartyPlayerInfo() packData.DayInfoList = [] for cday in syncDayList: tiemInfo = ChPyNetSendPack.tagMCFeastWeekPartyDayPlayerInfo() tiemInfo.DayIndex = cday tiemInfo.Point = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastWeekPartyPoint % cday, 0, ChConfig.Def_PDictType_FeastWeekParty) tiemInfo.AwardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastWeekPartyAwardRecord % cday, 0, ChConfig.Def_PDictType_FeastWeekParty) tiemInfo.TaskList = [] for tID in templateIDList[cday]: if templateID != -1 and tID != templateID: continue tipyData = IpyGameDataPY.GetIpyGameData('FeastWeekParty', tID) if not tipyData: continue taskInfo = ChPyNetSendPack.tagMCFeastWeekPartyTaskInfo() taskInfo.TemplateID = tID taskInfo.CurTimes = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastWeekPartyCurTimes % (cday, tID), 0, ChConfig.Def_PDictType_FeastWeekParty) taskInfo.GotTimes = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastWeekPartyGotTimes % (cday, tID), 0, ChConfig.Def_PDictType_FeastWeekParty) tiemInfo.TaskList.append(taskInfo) tiemInfo.ACount = len(tiemInfo.TaskList) packData.DayInfoList.append(tiemInfo) packData.Count = len(packData.DayInfoList) NetPackCommon.SendFakePack(curPlayer, packData) return def SyncFeastWeekPartyInfo(curPlayer): actFeastWeekPartyInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FeastWeekParty, {}) state = actFeastWeekPartyInfo.get(ShareDefine.ActKey_State, 0) cfgID = actFeastWeekPartyInfo.get(ShareDefine.ActKey_CfgID, 0) if not cfgID: return actBossIpyData = IpyGameDataPY.GetIpyGameData("ActFeastWeekParty", cfgID) if not actBossIpyData: return templateIDList = actBossIpyData.GetTemplateID() if not templateIDList: return pointAwardDict = actBossIpyData.GetPointAward() actInfo = ChPyNetSendPack.tagMCFeastWeekPartyInfo() actInfo.Clear() actInfo.StartDate = actBossIpyData.GetStartDate() actInfo.EndtDate = actBossIpyData.GetEndDate() actInfo.AdvanceMinutes = actBossIpyData.GetAdvanceMinutes() actInfo.IsDayReset = actBossIpyData.GetIsDayReset() actInfo.ResetType = actBossIpyData.GetResetType() actInfo.LimitLV = actBossIpyData.GetLVLimit() actInfo.DayInfoList = [] tidList = [] for day, dayActList in enumerate(templateIDList): dayInfo = ChPyNetSendPack.tagMCFeastWeekPartyDayInfo() dayInfo.TemplateList = dayActList dayInfo.ActCnt = len(dayActList) for tid in dayActList: if tid not in tidList: tidList.append(tid) dayInfo.PItemInfo = [] for point, itemList in pointAwardDict.get(day, {}).items(): for itemID, itemCnt, isBind in itemList: awardItem = ChPyNetSendPack.tagMCFeastWeekPartyItem() awardItem.ItemID = itemID awardItem.ItemCnt = itemCnt awardItem.IsBind = isBind awardItem.NeedPoint = point dayInfo.PItemInfo.append(awardItem) dayInfo.PCount = len(dayInfo.PItemInfo) actInfo.DayInfoList.append(dayInfo) actInfo.DayCnt = len(actInfo.DayInfoList) actInfo.ActionInfo = [] for tid in tidList: ipyData = IpyGameDataPY.GetIpyGameData('FeastWeekParty', tid) if not ipyData: GameWorld.ErrLog(' ½ÚÈÕѲÀñÄ£°å±íÕÒ²»µ½Ä£°å%s' % tid) continue tInfo = ChPyNetSendPack.tagMCFeastWeekPartyAction() tInfo.TemplateID = tid tInfo.ActionType = ipyData.GetActionType() tInfo.TotalTimes = ipyData.GetTotalTimes() tInfo.SingleTimes = ipyData.GetSingleTimes() tInfo.Point = ipyData.GetPoint() tInfo.ItemInfo = [] for itemID, itemCnt, isBind in ipyData.GetReward(): awardItem = ChPyNetSendPack.tagMCFeastWeekPartyItem() awardItem.ItemID = itemID awardItem.ItemCnt = itemCnt awardItem.IsBind = isBind awardItem.NeedPoint = 0 tInfo.ItemInfo.append(awardItem) tInfo.Count = len(tInfo.ItemInfo) actInfo.ActionInfo.append(tInfo) actInfo.TCount = len(actInfo.ActionInfo) NetPackCommon.SendFakePack(curPlayer, actInfo) return