#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package Player.PlayerFeastWish # # @todo:½ÚÈÕ×£¸£ # @author hxp # @date 2021-01-29 # @version 1.0 # # ÏêϸÃèÊö: ½ÚÈÕ×£¸£ # #------------------------------------------------------------------------------- #"""Version = 2021-01-29 11:30""" #------------------------------------------------------------------------------- import ItemCommon import PyGameData import ShareDefine import PlayerControl import IpyGameDataPY import ItemControler import ChPyNetSendPack import IPY_GameWorld import NetPackCommon import GameWorld import ChConfig import random def OnPlayerLogin(curPlayer): isReset = __CheckPlayerFeastWishAction(curPlayer) if not isReset: actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FeastWish, {}) # »î¶¯ÖÐͬ²½»î¶¯ÐÅÏ¢ if actInfo.get(ShareDefine.ActKey_State): Sync_FeastWishActionInfo(curPlayer) Sync_FeastWishPlayerInfo(curPlayer) return def RefreshFeastWishActionInfo(): ## ÊÕµ½GameServerͬ²½µÄ»î¶¯ÐÅÏ¢£¬Ë¢Ð»ÐÅÏ¢ playerManager = GameWorld.GetPlayerManager() for index in xrange(playerManager.GetPlayerCount()): curPlayer = playerManager.GetPlayerByIndex(index) if not GameWorld.IsNormalPlayer(curPlayer): continue __CheckPlayerFeastWishAction(curPlayer) return def __CheckPlayerFeastWishAction(curPlayer): ## ¼ì²éÍæ¼Ò»î¶¯ÐÅÏ¢ playerID = curPlayer.GetPlayerID() actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FeastWish, {}) actID = actInfo.get(ShareDefine.ActKey_ID, 0) state = actInfo.get(ShareDefine.ActKey_State, 0) templateID = __GetWishTemplateID() playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastWishID) # Íæ¼ÒÉíÉϵĻID playerTemplateID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastWishTemplateID) # Íæ¼ÒÉíÉϵÄÄ£°åID # »î¶¯ID ÏàͬµÄ»°²»´¦Àí if actID == playerActID: GameWorld.DebugLog("½ÚÈÕ×£¸£»î¶¯ID²»±ä£¬²»´¦Àí£¡", curPlayer.GetPlayerID()) if state: if templateID and templateID != playerTemplateID: PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastWishTemplateID, templateID) return GameWorld.DebugLog("½ÚÈÕ×£¸£»î¶¯ÖØÖÃ! actID=%s,playerActID=%s,state=%s,templateID=%s,playerTemplateID=%s" % (actID, playerActID, state, templateID, playerTemplateID), playerID) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastWishID, actID) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastWishTemplateID, templateID) if playerTemplateID: __SendWishBottleItemMail(curPlayer, playerTemplateID) bottleNumList = GetWishBottleNumList() for bottleNum in bottleNumList: PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastWishBottleValue % bottleNum, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastWishBottleGetState % bottleNum, 0) if state: Sync_FeastWishActionInfo(curPlayer) Sync_FeastWishPlayerInfo(curPlayer) return True def __SendWishBottleItemMail(curPlayer, playerTemplateID): # δÁìÈ¡µÄ½±ÀøÓʼþ·¢·Å if not playerTemplateID: return bottleIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActFeastWishBottle", playerTemplateID) if not bottleIpyDataList: return playerID = curPlayer.GetPlayerID() batchPlayerIDList, batchAddItemList, batchParamList = [], [], [] for ipyData in bottleIpyDataList: bottleNum = ipyData.GetWishBottleNum() choosePrizeItemDict = ipyData.GetChoosePrizeItem() curWishValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastWishBottleValue % bottleNum) getState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastWishBottleGetState % bottleNum) getIndexList = [] for recordIndex in choosePrizeItemDict.keys(): if getState & pow(2, recordIndex): getIndexList.append(recordIndex) getTimes = len(getIndexList) maxTimes = ipyData.GetChooseTimeMax() if getTimes >= maxTimes: continue needGiveTimes = min(maxTimes - getTimes, curWishValue / ipyData.GetNeedWishValue()) if not needGiveTimes: continue awardItemList = [] for recordIndex, itemInfo in choosePrizeItemDict.items(): if recordIndex in getIndexList: continue awardItemList.append(itemInfo) curWishValue = curWishValue - ipyData.GetNeedWishValue() PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastWishBottleValue % bottleNum, curWishValue) getState = getState | pow(2, recordIndex) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastWishBottleGetState % bottleNum, getState) if len(awardItemList) >= needGiveTimes: break if not awardItemList: continue batchPlayerIDList.append([playerID]) batchAddItemList.append(awardItemList) batchParamList.append([bottleNum]) if batchPlayerIDList: PlayerControl.SendMailBatch("FeastWishBottleAwardMail", batchPlayerIDList, batchAddItemList, batchParamList) return #// AA 10 ½ÚÈÕ×£¸£Æ¿Ñ¡Ôñ½±ÀøÎïÆ· #tagCMFeastWishBottleChooseItem # #struct tagCMFeastWishBottleChooseItem #{ # tagHead Head; # BYTE BottleNum; //Æ¿×Ó±àºÅ # BYTE RecordIndex; //ÎïÆ·Ë÷Òý£¬ÓÃÓÚÑ¡Ôñ¼°¼Ç¼ÊÇ·ñÒÑÑ¡Ôñ #}; def OnFeastWishBottleChooseItem(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) bottleNum = clientData.BottleNum getRecordIndex = clientData.RecordIndex templateID = __GetWishTemplateID() GameWorld.DebugLog("½ÚÈÕ×£¸£Æ¿Ñ¡Ôñ½±Àø! templateID=%s,bottleNum=%s,getRecordIndex=%s" % (templateID, bottleNum, getRecordIndex)) if not templateID: return bottleIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActFeastWishBottle", templateID) if not bottleIpyDataList: return findIpyData = None for bottleIpyData in bottleIpyDataList: if bottleNum == bottleIpyData.GetWishBottleNum(): findIpyData = bottleIpyData break if not findIpyData: GameWorld.DebugLog(" ÕÒ²»µ½¶ÔÓ¦½ÚÈÕ×£¸£Æ¿! bottleNum=%s" % bottleNum) return choosePrizeItemDict = findIpyData.GetChoosePrizeItem() if getRecordIndex not in choosePrizeItemDict: GameWorld.DebugLog(" ÕÒ²»µ½¶ÔÓ¦½ÚÈÕ×£¸£Æ¿½±ÀøÎïÆ·! getRecordIndex=%s" % getRecordIndex) return curWishValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastWishBottleValue % bottleNum) getState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastWishBottleGetState % bottleNum) getTimes = 0 for recordIndex in choosePrizeItemDict.keys(): if getState & pow(2, recordIndex): getTimes += 1 if getRecordIndex == recordIndex: GameWorld.DebugLog(" ¸ÃÎïÆ·ÒѾ­Ñ¡Ôñ¹ý! getRecordIndex=%s,getState=%s" % (getRecordIndex, getState)) return if getTimes >= findIpyData.GetChooseTimeMax(): GameWorld.DebugLog(" ÒÑûÓÐÁìÈ¡´ÎÊý! getState=%s,getTimes=%s >= %s" % (getState, getTimes, findIpyData.GetChooseTimeMax())) return if curWishValue < findIpyData.GetNeedWishValue(): GameWorld.DebugLog(" ×£¸£Öµ²»×ãÁìÈ¡! curWishValue=%s < %s" % (curWishValue, findIpyData.GetNeedWishValue())) return if not ItemCommon.CheckPackHasSpace(curPlayer, IPY_GameWorld.rptItem): return itemInfo = choosePrizeItemDict[getRecordIndex] itemID, itemCount, isAuctionItem = itemInfo if not ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, [IPY_GameWorld.rptItem], ["", False, {}]): return updWishValue = curWishValue - findIpyData.GetNeedWishValue() PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastWishBottleValue % bottleNum, updWishValue) updGetState = getState | pow(2, getRecordIndex) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastWishBottleGetState % bottleNum, updGetState) Sync_FeastWishPlayerInfo(curPlayer, [bottleNum]) GameWorld.DebugLog(" Ñ¡Ôñ³É¹¦: getState=%s,updGetState=%s,curWishValue=%s,updWishValue=%s,itemInfo=%s" % (getState, updGetState, curWishValue, updWishValue, itemInfo)) if itemID in findIpyData.GetGoodItemIDList(): recFromType = 1 # ¼Ç¼À´Ô´£º 1-×£¸£Æ¿£¬2-×£¸£³Ø valueList = [itemID, itemCount, recFromType] strValueList = [curPlayer.GetPlayerName()] notifyType = 4 # ֪ͨȫ·þµ¥Ìõ GameWorld.AddUniversalGameRec(0, ShareDefine.Def_UniversalGameRecType_FeastWish, valueList, strValueList, notifyType) notifyKey = findIpyData.GetWorldNotifyKey() if notifyKey: PlayerControl.WorldNotify(0, notifyKey, [curPlayer.GetPlayerName(), itemID, "", itemCount]) return #// AA 11 ½ÚÈÕ×£¸£³Ø×£¸£ #tagCMFeastWishPoolWish # #struct tagCMFeastWishPoolWish #{ # tagHead Head; # BYTE WishCount; //×£¸£´ÎÊý #}; def OnFeastWishPoolWish(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) wishCount = clientData.WishCount templateID = __GetWishTemplateID() GameWorld.DebugLog("Íæ¼Ò½ÚÈÕ×£¸£: wishCount=%s,templateID=%s" % (wishCount, templateID)) if not templateID: return bottleIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActFeastWishBottle", templateID) poolIpyData = IpyGameDataPY.GetIpyGameData("ActFeastWishPool", templateID) if not bottleIpyDataList or not poolIpyData: return canWishCountList = IpyGameDataPY.GetFuncEvalCfg("FeastWishCfg", 2) if wishCount not in canWishCountList: return costItemID = IpyGameDataPY.GetFuncCfg("FeastWishCfg", 1) costItemNeedCount = wishCount costItemIndexList, bindCnt, unBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, costItemID) lackCount = max(0, costItemNeedCount - bindCnt - unBindCnt) if lackCount > 0: GameWorld.DebugLog(" ËùÐè×£¸£µÀ¾ß²»×ã!costItemID=%s,costItemNeedCount=%s,lackCount=%s" % (costItemID, costItemNeedCount, lackCount)) return giveWishValueTotal = 0 wishValueRange = IpyGameDataPY.GetFuncEvalCfg("FeastWishCfg", 3) giveItemDict = {} # ÓÃÓÚÅжÏÕ¼Óñ³°üÓà giveItemList = [] # ÓÃÓÚʵ¼Ê¸øÎïÆ·¼°Í¨ÖªÇ°¶ËÓã¬Ò»¸ö¸ö¸ø isAuctionItem = 0 # ĬÈϸø·ÇÅÄÆ· itemWeightInfoList = poolIpyData.GetWishPoolItemWeightInfo() for _ in xrange(wishCount): randItemInfo = GameWorld.GetResultByWeightList(itemWeightInfoList) if not randItemInfo: GameWorld.ErrLog("½ÚÈÕ×£¸£³ØÎïÆ·È¨ÖØÅäÖÃÒì³£! %s" % itemWeightInfoList) return itemID, itemCount = randItemInfo giveItemList.append([itemID, itemCount, isAuctionItem]) giveItemDict[itemID] = giveItemDict.get(itemID, 0) + itemCount giveWishValueTotal += random.randint(wishValueRange[0], wishValueRange[1]) checkSpaceList = [[itemID, itemCount, isAuctionItem] for itemID, itemCount in giveItemDict.items()] if not ItemControler.CheckPackSpaceEnough(curPlayer, checkSpaceList): return GameWorld.DebugLog(" giveWishValueTotal=%s,giveItemList=%s" % (giveWishValueTotal, giveItemList)) # ¿Û³ýÏûºÄ ItemCommon.DelCostItemByBind(curPlayer, costItemIndexList, bindCnt, unBindCnt, costItemNeedCount, "FeastWish") # ¼Ó×£¸£Öµ syncBottleNumList = [] for bottleIpyData in bottleIpyDataList: bottleNum = bottleIpyData.GetWishBottleNum() curWishValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastWishBottleValue % bottleNum) getState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastWishBottleGetState % bottleNum) getTimes = 0 for recordIndex in bottleIpyData.GetChoosePrizeItem().keys(): if getState & pow(2, recordIndex): getTimes += 1 canGetTimes = max(0, bottleIpyData.GetChooseTimeMax() - getTimes) wishValueMax = bottleIpyData.GetNeedWishValue() * canGetTimes if curWishValue >= wishValueMax: GameWorld.DebugLog(" Æ¿×Ó×£¸£ÖµÒÑÂú! bottleNum=%s,canGetTimes=%s,wishValueMax=%s <= curWishValue=%s" % (bottleNum, canGetTimes, wishValueMax, curWishValue)) continue updWishValue = min(wishValueMax, curWishValue + giveWishValueTotal) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FeastWishBottleValue % bottleNum, updWishValue) GameWorld.DebugLog(" Æ¿×Ó×£¸£Öµ¸üÐÂ! bottleNum=%s,canGetTimes=%s,wishValueMax=%s,curWishValue=%s,updWishValue=%s" % (bottleNum, canGetTimes, wishValueMax, curWishValue, updWishValue)) syncBottleNumList.append(bottleNum) # ¸øÎïÆ· goodItemIDList = poolIpyData.GetGoodItemIDList() notifyKey = poolIpyData.GetWorldNotifyKey() for itemID, itemCount, isAuctionItem in giveItemList: itemObj = ItemControler.GetOutPutItemObj(itemID, itemCount, isAuctionItem, curPlayer=curPlayer) itemUserData = itemObj.GetUserData() isOK = ItemControler.DoLogic_PutItemInPack(curPlayer, itemObj, ["FeastWish", False, {}], [IPY_GameWorld.rptItem]) if isOK and itemID in goodItemIDList: # ֪ͨGameServer¼Ç¼ºÃÎïÆ·ÂÖ²¥ recFromType = 2 # ¼Ç¼À´Ô´£º 1-×£¸£Æ¿£¬2-×£¸£³Ø valueList = [itemID, itemCount, recFromType] strValueList = [curPlayer.GetPlayerName()] notifyType = 4 # ֪ͨȫ·þµ¥Ìõ GameWorld.AddUniversalGameRec(0, ShareDefine.Def_UniversalGameRecType_FeastWish, valueList, strValueList, notifyType) if notifyKey: PlayerControl.WorldNotify(0, notifyKey, [curPlayer.GetPlayerName(), itemID, itemUserData, itemCount]) # ֪ͨǰ¶Ë½á¹û retPack = ChPyNetSendPack.tagMCFeastWishResult() retPack.AddWishValue = giveWishValueTotal retPack.WishResult = str(giveItemList) retPack.WishResultLen = len(retPack.WishResult) NetPackCommon.SendFakePack(curPlayer, retPack) if syncBottleNumList: Sync_FeastWishPlayerInfo(curPlayer, syncBottleNumList) return def GetFeastWishDropItemIDList(curPlayer, npcData): ## »ñÈ¡µôÂä×£¸£µÀ¾ßIDÁбí ## @return: [itemID, ...] actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FeastWish, {}) if not actInfo: return [] if not actInfo.get(ShareDefine.ActKey_State): return [] if not ChConfig.IsGameBoss(npcData): return [] npcID = npcData.GetNPCID() killBossCntLimitDict = IpyGameDataPY.GetFuncCfg('KillBossCntLimit', 1) limitIndex = GameWorld.GetDictValueByKey(killBossCntLimitDict, npcID) if limitIndex not in [ShareDefine.Def_Boss_Func_World, ShareDefine.Def_Boss_Func_Home]: # ¹æ¶¨Ö»ÓÐÊÀ½çboss¡¢bossÖ®¼Ò¿ÉµôÂä return dropRate = IpyGameDataPY.GetFuncCfg("FeastWishCfg", 4) if not GameWorld.CanHappen(dropRate): return wishItemID = IpyGameDataPY.GetFuncCfg("FeastWishCfg", 1) # ĬÈϵô1¸ö #GameWorld.DebugLog("µôÂä½ÚÈÕ×£¸£µÀ¾ß: npcID=%s,dropRate=%s,wishItemID=%s" % (npcID, dropRate, wishItemID)) return [wishItemID] def Sync_FeastWishPlayerInfo(curPlayer, bottleNumList=[]): ## ֪ͨ»î¶¯Íæ¼ÒÐÅÏ¢ if bottleNumList: syncBottleNumList = bottleNumList else: syncBottleNumList = GetWishBottleNumList() playerPack = ChPyNetSendPack.tagMCFeastWishPlayerInfo() playerPack.PlayerBottleInfo = [] for bottleNum in syncBottleNumList: playerBottle = ChPyNetSendPack.tagMCFeastWishPlayerBottle() playerBottle.BottleNum = bottleNum playerBottle.WishValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastWishBottleValue % bottleNum) playerBottle.ChooseRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FeastWishBottleGetState % bottleNum) playerPack.PlayerBottleInfo.append(playerBottle) playerPack.BottleCount = len(playerPack.PlayerBottleInfo) NetPackCommon.SendFakePack(curPlayer, playerPack) return def GetWishBottleNumList(): templateID = __GetWishTemplateID() if not templateID: return [] bottleIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActFeastWishBottle", templateID) if not bottleIpyDataList: return [] return [bottleIpyData.GetWishBottleNum() for bottleIpyData in bottleIpyDataList] def __GetWishTemplateID(): actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FeastWish, {}) if not actInfo: return 0 if not actInfo.get(ShareDefine.ActKey_State): return 0 cfgID = actInfo.get(ShareDefine.ActKey_CfgID) ipyData = IpyGameDataPY.GetIpyGameData("ActFeastWish", cfgID) if not ipyData: return 0 worldLV = actInfo.get(ShareDefine.ActKey_WorldLV) templateID = GameWorld.GetDictValueByRangeKey(ipyData.GetTemplateIDInfo(), worldLV, 0) return templateID def Sync_FeastWishActionInfo(curPlayer): ## ֪ͨ»î¶¯ÐÅÏ¢ actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FeastWish, {}) if not actInfo: return if not actInfo.get(ShareDefine.ActKey_State): return cfgID = actInfo.get(ShareDefine.ActKey_CfgID) ipyData = IpyGameDataPY.GetIpyGameData("ActFeastWish", cfgID) if not ipyData: return worldLV = actInfo.get(ShareDefine.ActKey_WorldLV) templateID = GameWorld.GetDictValueByRangeKey(ipyData.GetTemplateIDInfo(), worldLV, 0) if not templateID: return bottleIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActFeastWishBottle", templateID) poolIpyData = IpyGameDataPY.GetIpyGameData("ActFeastWishPool", templateID) startDateStr, endDateStr = GameWorld.GetOperationActionDateStr(ipyData) actPack = ChPyNetSendPack.tagMCFeastWishInfo() actPack.Clear() actPack.StartDate = startDateStr actPack.EndtDate = endDateStr actPack.LimitLV = ipyData.GetLVLimit() actPack.ResetType = ipyData.GetResetType() actPack.WishPoolShowItemList = poolIpyData.GetWishPoolClientItemShow() if poolIpyData else [] actPack.WishPoolShowCount = len(actPack.WishPoolShowItemList) actPack.BottleInfoList = [] if bottleIpyDataList: for bottleIpyData in bottleIpyDataList: bottleInfo = ChPyNetSendPack.tagMCFeastWishBottleInfo() bottleInfo.BottleNum = bottleIpyData.GetWishBottleNum() bottleInfo.NeedWishValue = bottleIpyData.GetNeedWishValue() bottleInfo.ChooseTimeMax = bottleIpyData.GetChooseTimeMax() bottleInfo.ChoosePrizeList = [] prizeItemDict = bottleIpyData.GetChoosePrizeItem() for recordIndex, itemInfo in prizeItemDict.items(): itemID, itemCount, isAuctionItem = itemInfo itemInfo = ChPyNetSendPack.tagMCFeastWishBottleItem() itemInfo.RecordIndex = recordIndex itemInfo.ItemID = itemID itemInfo.ItemCount = itemCount itemInfo.IsBind = isAuctionItem bottleInfo.ChoosePrizeList.append(itemInfo) bottleInfo.ChoosePrizeCount = len(bottleInfo.ChoosePrizeList) actPack.BottleInfoList.append(bottleInfo) actPack.BottleCount = len(actPack.BottleInfoList) NetPackCommon.SendFakePack(curPlayer, actPack) return