#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package Player.PlayerMineArea # # @todo:¿óÎ︣µØ # @author hxp # @date 2024-03-07 # @version 1.0 # # ÏêϸÃèÊö: ¿óÎ︣µØ # #------------------------------------------------------------------------------- #"""Version = 2024-03-07 19:30""" #------------------------------------------------------------------------------- import ChConfig import PlayerControl import IpyGameDataPY import IPY_GameWorld import ChPyNetSendPack import PlayerActTask import NetPackCommon import ItemControler import ItemCommon import GameWorld # ¾Û±¦ÅèĬÈÏ×î´ó½ø¶È MineTreasureProgressMax = 100 def OnPlayerLogin(curPlayer): freeWorkerCount = 0 workerNeedItemList = IpyGameDataPY.GetFuncEvalCfg("MineAreaWorker", 3) for needItemCount in workerNeedItemList: if needItemCount: break freeWorkerCount += 1 if freeWorkerCount > curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineWorkerCount): PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MineWorkerCount, freeWorkerCount) SyncPlayerMineAreaInfo(curPlayer) return def PlayerOnDay(curPlayer): PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MineHelpAwardCount, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MineWorkerEnergyUsed, 0) for refreshType in [0, 1]: PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MineRefreshCount % refreshType, 0) SyncPlayerMineAreaInfo(curPlayer) return def GetWorkerTotal(curPlayer): ## »ñÈ¡Íæ¼Ò¹¤ÈË×ÜÊý initCount = 0 # ÆðʼĬÈϹ¤ÈËÊý employCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineWorkerCount) return initCount + employCount def GetWorkerState(curPlayer): ## »ñÈ¡¹¤ÈËÆ£ÀÍ״̬ workerStateEnergyList = IpyGameDataPY.GetFuncEvalCfg("MineAreaWorker", 1) # ¹¤ÈËÆ£ÀÍ״̬ÌåÁ¦Áбí [³äÅæÌåÁ¦, Õý³£, ÐéÈõ, ¿Ý½ß]£¬×ÜÌåÁ¦=ËùÓÐÌåÁ¦Ïà¼Ó funcEnergy = 0 # ÆäËû¹¦ÄÜÔö¼ÓµÄÌåÁ¦ stateEnergy = 0 energyUsed = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineWorkerEnergyUsed) for state, energy in enumerate(workerStateEnergyList): if state == 0: energy += funcEnergy stateEnergy += energy if energyUsed <= stateEnergy: return state return len(workerStateEnergyList) - 1 # ĬÈÏ×î´óÆ£ÀÍ #// B0 30 ¸£µØÎïÆ·À­ #tagCMMineItemPull # #struct tagCMMineItemPull #{ # tagHead Head; # DWORD PlayerID; // ¸£µØËùÊôÍæ¼ÒID£¬0ĬÈÏ×Ô¼º # BYTE ItemIndex; // ÎïÆ·ËùÔÚλÖÃË÷Òý0~n # BYTE WorkerCount; // ÉϹ¤ÈËÈËÊý # BYTE IsPreview; // ÊÇ·ñÔ¤ÀÀ£»0-Ö±½ÓÀ­£¬1-Ô¤ÀÀ´ó¸Åʱ¼ä #}; def OnMineItemPull(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) areaPlayerID = clientData.PlayerID itemIndex = clientData.ItemIndex workerCount = clientData.WorkerCount isPreview = clientData.IsPreview if not areaPlayerID: areaPlayerID = curPlayer.GetPlayerID() workerTotal = GetWorkerTotal(curPlayer) workerState = GetWorkerState(curPlayer) SendToGameServer_MineArea(curPlayer, "Pull", [areaPlayerID, itemIndex, workerCount, workerState, workerTotal, isPreview]) return #// B0 31 ¸£µØÎïÆ·Ë¢Ð #tagCMMineItemRefresh # #struct tagCMMineItemRefresh # #{ # tagHead Head; # BYTE IsSuper; // ÊÇ·ñ³¬¼¶Ë¢Ð #}; def OnMineItemRefresh(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) playerID = curPlayer.GetPlayerID() isSuper = clientData.IsSuper refreshType = str(1 if isSuper else 0) moneyDict = IpyGameDataPY.GetFuncEvalCfg("MineAreaRefresh", 1, {}) if refreshType not in moneyDict: return moneyType, moneyValue = moneyDict[refreshType] if not PlayerControl.HaveMoney(curPlayer, moneyType, moneyValue): return refreshMaxDict = IpyGameDataPY.GetFuncEvalCfg("MineAreaRefresh", 2, {}) refreshCountMax = refreshMaxDict.get(refreshType, 0) refreshCountNow = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineRefreshCount % refreshType) if refreshCountMax and refreshCountNow >= refreshCountMax: GameWorld.DebugLog("¸£µØÎïÆ·Ë¢Ð´ÎÊýÒÑ´ï½ñÈÕÉÏÏÞ! isSuper=%s,refreshCountNow=%s >= %s" % (isSuper, refreshCountNow, refreshCountMax), playerID) return PlayerControl.PayMoney(curPlayer, moneyType, moneyValue, "MineItemRefresh") if refreshCountMax: refreshCountUpd = refreshCountNow + 1 PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MineRefreshCount % refreshType, refreshCountUpd) SyncPlayerMineAreaInfo(curPlayer) SendToGameServer_MineArea(curPlayer, "MineItemRefresh", [playerID, isSuper]) return #// B0 32 ¸£µØ¹¤È˹ÍÓ¶ #tagCMMineWorkerEmploy # #struct tagCMMineWorkerEmploy # #{ # tagHead Head; #}; def OnMineWorkerEmploy(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) playerID = curPlayer.GetPlayerID() employCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineWorkerCount) costItemCountList = IpyGameDataPY.GetFuncEvalCfg("MineAreaWorker", 3) if employCount >= len(costItemCountList): GameWorld.DebugLog("ÒÑ´ïµ½¸£µØ¹ÍÓ¶¹¤ÈËÊýÉÏÏÞ! employCount=%s" % employCount) return costItemCount = costItemCountList[employCount] costItemID = IpyGameDataPY.GetFuncCfg("MineAreaWorker", 2) if not costItemID: return # Ö§³ÖÅä0²»ÏûºÄ¸öÊý if costItemCount > 0: costItemIndexList, bindCnt, unBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, costItemID, costItemCount) lackCnt = costItemCount - bindCnt - unBindCnt if lackCnt > 0: GameWorld.DebugLog("¸£µØ¹ÍÓ¶¹¤È˵À¾ß²»×ã! costItemID=%s,costItemCount=%s,bindCnt=%s,unBindCnt=%s,lackCnt=%s,ÒѹÍÓ¶Êý=%s" % (costItemID, costItemCount, bindCnt, unBindCnt, lackCnt, employCount)) return delCnt = costItemCount ItemCommon.DelCostItemByBind(curPlayer, costItemIndexList, bindCnt, unBindCnt, delCnt, "MineWorkerEmploy") updEmployCount = employCount + 1 PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MineWorkerCount, updEmployCount) SyncPlayerMineAreaInfo(curPlayer) GameWorld.DebugLog("¸£µØ¹ÍÓ¶¹¤ÈË! costItemID=%s,costItemCount=%s,updEmployCount=%s" % (costItemID, costItemCount, updEmployCount), playerID) return def SendToGameServer_MineArea(curPlayer, msgType, dataMsg=""): playerID = curPlayer.GetPlayerID() msgList = str([msgType, dataMsg]) GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "MineArea", msgList, len(msgList)) GameWorld.Log("¸£µØ·¢ËÍGameServer: %s, %s" % (msgType, dataMsg), playerID) return def GameServer_MineArea_DoResult(curPlayer, msgData): msgType, dataMsg, _ = msgData ## ½áËã½±Àø if msgType == "MineAreaAwardGet": awardInfoList = dataMsg[0] __DoGiveMineAreaAward(curPlayer, awardInfoList) ## È¡ÏûÀ­È¡ £¨°üº¬Ö÷¶¯ »ò ±»¶¯Çý¸Ï£© elif msgType == "MineAreaCancelPull": areaPlayerID, reason = dataMsg __OnMineAreaPullEnd(curPlayer, areaPlayerID, reason) return def __DoGiveMineAreaAward(curPlayer, awardInfoList): playerID = curPlayer.GetPlayerID() energyUsed = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineWorkerEnergyUsed) addEnergyUsed = 0 awardItemDict = {} robCount = 0 # ÇÀ½ÙÊý GUIDList = [] for awardInfo in awardInfoList: GUID, awardTime, workerCount, areaPlayerID, mineID, itemLV, itemID, itemCount = awardInfo isToday = GameWorld.CheckTimeIsSameServerDayEx(awardTime) if isToday: addEnergyUsed += workerCount if playerID != areaPlayerID: robCount += 1 awardItemDict[itemID] = awardItemDict.get(itemID, 0) + itemCount GUIDList.append(GUID) GameWorld.DebugLog("½áË㸣µØ½±Àø! areaPlayerID=%s,mineID=%s,itemLV=%s,itemID=%s,itemCount=%s,awardTime=%s,isToday=%s,workerCount=%s %s" % (areaPlayerID, mineID, itemLV, itemID, itemCount, GameWorld.ChangeTimeNumToStr(awardTime), isToday, workerCount, GUID), playerID) __OnMineAreaPullEnd(curPlayer, areaPlayerID, "OK") if addEnergyUsed: energyUsed += addEnergyUsed PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MineWorkerEnergyUsed, energyUsed) GameWorld.DebugLog(" Ôö¼Ó¸£µØ¹¤ÈËÒÑÓþ«Á¦! addEnergyUsed=%s,updEnergyUsed=%s" % (addEnergyUsed, energyUsed), playerID) if robCount: OnAddMineTreasureProgress(curPlayer, robCount, False) SyncPlayerMineAreaInfo(curPlayer) awardItemList = [[itemID, itemCount, 0] for itemID, itemCount in awardItemDict.items()] ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, None, ["MineAreaAward", False, {}]) SendToGameServer_MineArea(curPlayer, "MineAreaAwardGetOK", [GUIDList, awardItemList]) return def __OnMineAreaPullEnd(curPlayer, areaPlayerID, reason): ## À­È¡½áÊø¶îÍâ´¦Àí£¬ °üº¬À­ÍꡢȡÏû¡¢±»Çý¸ÏµÈ GameWorld.DebugLog("__OnMineAreaPullEnd: areaPlayerID=%s, reason=%s" % (areaPlayerID, reason)) if curPlayer.GetPlayerID() == areaPlayerID: PlayerActTask.AddActTaskValue(curPlayer, ChConfig.ActTaskType_MineAreaEndSelf) else: PlayerActTask.AddActTaskValue(curPlayer, ChConfig.ActTaskType_MineAreaEndOther) return def OnMineTreasureByCTGID(curPlayer, ctgID): ## ³äÖµ¼¤»î¾Û±¦Åè treasureCTGIDList = IpyGameDataPY.GetFuncEvalCfg("MineAreaTreasure", 1) for treasureType, ctgIDList in enumerate(treasureCTGIDList): if not ctgIDList or ctgID not in ctgIDList: # Åä¿ÕÁбíµÄĬÈϼ¤»î continue state = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineTreasureState) if state&pow(2, treasureType): break updState = state|pow(2, treasureType) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MineTreasureState, updState) SyncPlayerMineAreaInfo(curPlayer) GameWorld.Log("¼¤»î¸£µØ¾Û±¦Åè: treasureType=%s,updState=%s" % (treasureType, updState), curPlayer.GetPlayerID()) break return def OnAddMineTreasureProgress(curPlayer, robCount, isNotify=True): ## Ôö¼Ó¾Û±¦Åè½ø¶È # @param robCount: ÇÀ¶áÎïÆ·Êý if robCount <= 0: return playerID = curPlayer.GetPlayerID() treasureCTGIDList = IpyGameDataPY.GetFuncEvalCfg("MineAreaTreasure", 1) treasureAddProgressList = IpyGameDataPY.GetFuncEvalCfg("MineAreaTreasure", 2) treasureState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineTreasureState) for treasureType, addProgressSet in enumerate(treasureAddProgressList): ctgIDList = treasureCTGIDList[treasureType] isActivite = 1 if (not ctgIDList or treasureState&pow(2, treasureType)) else 0 if not isActivite: continue curProgress = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineTreasureProgess % treasureType) if curProgress >= MineTreasureProgressMax: continue addProgress = addProgressSet * robCount updProgress = min(curProgress + addProgress, MineTreasureProgressMax) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MineTreasureProgess % treasureType, updProgress) GameWorld.DebugLog(" Ôö¼Ó¸£µØ¾Û±¦Åè½ø¶È: robCount=%s,treasureType=%s,curProgress=%s,addProgress=%s,updProgress=%s" % (robCount, treasureType, curProgress, addProgress, updProgress), playerID) if isNotify: SyncPlayerMineAreaInfo(curPlayer) return def GetMineTreasureAward(curPlayer, treasureType): ## ÁìÈ¡¾Û±¦Åè½±Àø playerID = curPlayer.GetPlayerID() treasureAward = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineTreasureAward) if treasureAward&pow(2, treasureType): GameWorld.DebugLog("¸£µØ¾Û±¦Åè½±ÀøÒÑÁìÈ¡¹ý! treasureType=%s,treasureAward=%s" % (treasureType, treasureAward), playerID) return curProgress = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineTreasureProgess % treasureType) if curProgress < MineTreasureProgressMax: GameWorld.DebugLog("¸£µØ¾Û±¦Åè½ø¶ÈδÂú£¬ÎÞ·¨Áì½±! treasureType=%s,curProgress=%s" % (treasureType, curProgress), playerID) return treasureAwardList = IpyGameDataPY.GetFuncEvalCfg("MineAreaTreasure", 3) if treasureType >= len(treasureAwardList): return awardItemList = treasureAwardList[treasureType] if not ItemControler.CheckPackSpaceEnough(curPlayer, awardItemList): return updAward = treasureAward|pow(2, treasureType) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MineTreasureAward, updAward) SyncPlayerMineAreaInfo(curPlayer) for itemID, itemCount, isAuctionItem in awardItemList: ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, [IPY_GameWorld.rptItem]) GameWorld.DebugLog("¸£µØ¾Û±¦ÅèÁì½±! treasureType=%s,updAward=%s,awardItemList=%s" % (treasureType, updAward, awardItemList), playerID) return def SyncPlayerMineAreaInfo(curPlayer): clientPack = ChPyNetSendPack.tagMCPlayerMineAreaInfo() clientPack.WorkerCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineWorkerCount) clientPack.EnergyUsed = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineWorkerEnergyUsed) clientPack.HelpAwardCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineHelpAwardCount) clientPack.RefreshCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineRefreshCount % 0) clientPack.RefreshCountSuper = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineRefreshCount % 1) treasureState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineTreasureState) treasureAward = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineTreasureAward) treasureCTGIDList = IpyGameDataPY.GetFuncEvalCfg("MineAreaTreasure", 1) clientPack.TreasureCount = len(treasureCTGIDList) clientPack.TreasureState = [0] * clientPack.TreasureCount clientPack.TreasureAward = [0] * clientPack.TreasureCount clientPack.TreasureProgress = [0] * clientPack.TreasureCount for treasureType, ctgIDList in enumerate(treasureCTGIDList): isActivite = 1 if (not ctgIDList or treasureState&pow(2, treasureType)) else 0 clientPack.TreasureState[treasureType] = isActivite clientPack.TreasureAward[treasureType] = 1 if treasureAward&pow(2, treasureType) else 0 clientPack.TreasureProgress[treasureType] = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineTreasureProgess % treasureType) NetPackCommon.SendFakePack(curPlayer, clientPack) return