| #!/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 PlayerSuccess  | 
| import ShareDefine  | 
| import ItemCommon  | 
| import EventShell  | 
| import GameWorld  | 
| import time  | 
|   | 
| # ¾Û±¦ÅèĬÈÏ×î´ó½ø¶È  | 
| MineTreasureProgressMax = 100  | 
|   | 
| # Ë¢ÐÂÀàÐÍÁÐ±í  | 
| RefreshTypeList = (  | 
| RefreshType_Comm, # ×Ô¼ºÎïÆ·ÆÕͨˢР0  | 
| RefreshType_Super, # ×Ô¼ºÎïÆ·³¬¼¶Ë¢Ð 1  | 
| RefreshType_Rob, # ÇÀ½ÙÖÜÎ§Íæ¼ÒˢР2  | 
| ) = range(3)  | 
|   | 
| 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 RefreshTypeList:  | 
|         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 -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)  | 
|     if workerCount > 0 and workerState < 0:  | 
|         energyUsed = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineWorkerEnergyUsed)  | 
|         GameWorld.DebugLog("¸£µØÆ£ÀÍÖµÒÑÂú£¬ÎÞ·¨ÔÙÀÎïÆ·! energyUsed=%s" % energyUsed)  | 
|         return  | 
|       | 
|     SendToGameServer_MineArea(curPlayer, "Pull", [areaPlayerID, itemIndex, workerCount, workerState, workerTotal, isPreview])  | 
|     return  | 
|   | 
| #// B0 31 ¸£µØÎïÆ·Ë¢Ð #tagCMMineItemRefresh  | 
| #  | 
| #struct    tagCMMineItemRefresh  | 
| #  | 
| #{  | 
| #    tagHead        Head;  | 
| #    BYTE        RefreshType;    // Ë¢ÐÂÀàÐÍ£º0-×Ô¼ºÎïÆ·ÆÕͨˢУ»1-×Ô¼ºÎïÆ·³¬¼¶Ë¢Ð£»2-ÖÜΧ¸£µØÍæ¼ÒÁбíˢР | 
| #};  | 
| def OnMineItemRefresh(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     playerID = curPlayer.GetPlayerID()  | 
|     refreshType = clientData.RefreshType  | 
|       | 
|     moneyType, moneyValue = 0, 0  | 
|     moneyDict = IpyGameDataPY.GetFuncEvalCfg("MineAreaRefresh", 1, {})  | 
|     if str(refreshType) in moneyDict:  | 
|         moneyType, moneyValue = moneyDict[str(refreshType)]  | 
|         if not PlayerControl.HaveMoney(curPlayer, moneyType, moneyValue):  | 
|             return  | 
|           | 
|     costItemID, costItemCount = 0, 0  | 
|     refreshMaxDict = IpyGameDataPY.GetFuncEvalCfg("MineAreaRefresh", 2, {})  | 
|     refreshCountMax = refreshMaxDict.get(str(refreshType), 0)  | 
|     refreshCountNow = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineRefreshCount % refreshType)  | 
|     if refreshCountMax and refreshCountNow >= refreshCountMax:  | 
|         if refreshType == RefreshType_Super:  | 
|             employCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineWorkerCount)  | 
|             employMax = len(IpyGameDataPY.GetFuncEvalCfg("MineAreaWorker", 3))  | 
|             if employCount < employMax:  | 
|                 GameWorld.DebugLog("¸£µØ¹ÍÓ¶¹¤ÈËÊýδ´ïµ½ÉÏÏÞ£¬²»ÄÜʹÓùÍÓ¶µÀ¾ß½øÐг¬¼¶Ë¢ÐÂ! employCount=%s < %s" % (employCount, employMax), playerID)  | 
|                 return  | 
|             costItemID = IpyGameDataPY.GetFuncCfg("MineAreaWorker", 2)  | 
|             costItemCount = IpyGameDataPY.GetFuncCfg("MineAreaRefresh", 3)  | 
|             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"   | 
|                                    % (costItemID, costItemCount, bindCnt, unBindCnt, lackCnt))  | 
|                 return  | 
|         else:  | 
|             GameWorld.DebugLog("¸£µØÎïÆ·Ë¢Ð´ÎÊýÒÑ´ï½ñÈÕÉÏÏÞ! refreshType=%s,refreshCountNow=%s >= %s" % (refreshType, refreshCountNow, refreshCountMax), playerID)  | 
|             return  | 
|           | 
|     GameWorld.DebugLog("¸£µØË¢ÐÂ: refreshType=%s,refreshCountNow=%s,moneyType=%s,moneyValue=%s,costItemID=%s,costItemCount=%s"   | 
|                        % (refreshType, refreshCountNow, moneyType, moneyValue, costItemID, costItemCount), playerID)  | 
|     if moneyType and moneyValue:  | 
|         PlayerControl.PayMoney(curPlayer, moneyType, moneyValue, "MineItemRefresh")  | 
|           | 
|     if costItemID and costItemCount:  | 
|         delCnt = costItemCount  | 
|         ItemCommon.DelCostItemByBind(curPlayer, costItemIndexList, bindCnt, unBindCnt, delCnt, "MineItemRefresh")  | 
|           | 
|     if refreshCountMax and refreshCountNow < refreshCountMax:  | 
|         refreshCountUpd = refreshCountNow + 1  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MineRefreshCount % refreshType, refreshCountUpd)  | 
|         SyncPlayerMineAreaInfo(curPlayer)  | 
|           | 
|     if refreshType == RefreshType_Rob:  | 
|         SendToGameServer_MineArea(curPlayer, "MineRobRefresh", [])  | 
|     else:  | 
|         isSuper = 1 if refreshType == RefreshType_Super else 0  | 
|         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)  | 
|           | 
|     ## ÀÈ¡  | 
|     elif msgType == "Pull":  | 
|         areaPlayerID = dataMsg[0]  | 
|         isRob = (areaPlayerID and curPlayer.GetPlayerID() != areaPlayerID)  | 
|         EventShell.EventResponse_MineAreaPull(curPlayer, isRob)  | 
|     return  | 
|   | 
| def __DoGiveMineAreaAward(curPlayer, awardInfoList):  | 
|       | 
|     playerID = curPlayer.GetPlayerID()  | 
|     energyUsed = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineWorkerEnergyUsed)  | 
|     addEnergyUsed = 0  | 
|     awardItemDict = {}  | 
|     robCount = 0 # ÇÀ½ÙÊý  | 
|     selfCount = 0 # ×Ô¼ºÊýÁ¿  | 
|     for awardInfo in awardInfoList:  | 
|         awardTime, workerCount, areaPlayerID, mineID, itemLV, itemID, itemCount = awardInfo  | 
|         isToday = GameWorld.CheckTimeIsSameServerDayEx(awardTime)  | 
|         if isToday:  | 
|             addEnergyUsed += workerCount  | 
|         if playerID != areaPlayerID:  | 
|             robCount += 1  | 
|         else:  | 
|             selfCount += 1  | 
|         awardItemDict[itemID] = awardItemDict.get(itemID, 0) + itemCount  | 
|         GameWorld.DebugLog("½áË㸣µØ½±Àø! areaPlayerID=%s,mineID=%s,itemLV=%s,itemID=%s,itemCount=%s,awardTime=%s,isToday=%s,workerCount=%s"   | 
|                            % (areaPlayerID, mineID, itemLV, itemID, itemCount, GameWorld.ChangeTimeNumToStr(awardTime), isToday, workerCount), 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)  | 
|           | 
|     PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_MineAreaCnt, selfCount + robCount)  | 
|     if selfCount:  | 
|         PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_MineAreaSelfCnt, selfCount)  | 
|     if robCount:  | 
|         PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_MineAreaRobCnt, 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", [None, 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  | 
|   | 
| #// B0 35 ¸£µØ¹Ü¼ÒÃâ·ÑÊÔÓà#tagCMMineHouseKeeperFreeUse  | 
| #  | 
| #struct    tagCMMineHouseKeeperFreeUse  | 
| #{  | 
| #    tagHead        Head;  | 
| #};  | 
| def OnMineHouseKeeperFreeUse(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     OnActMineHousekeeper(curPlayer, 0)  | 
|     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  | 
|       | 
|     keeperCTGIDList = IpyGameDataPY.GetFuncEvalCfg("MineAreaHousekeeper", 3)  | 
|     for keeperIndex, ctgIDList in enumerate(keeperCTGIDList, 1):  | 
|         if ctgID in ctgIDList:  | 
|             OnActMineHousekeeper(curPlayer, keeperIndex)  | 
|             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 OnActMineHousekeeper(curPlayer, keeperIndex):  | 
|     ## ¼¤»î/Ôö¼Ó×Ô¶¯¹Ü¼Òʱ³¤  | 
|     # @param keeperIndex: ¹Ü¼ÒµµÎ»Ë÷Òý£¬0-Ãâ·Ñ£¬>0-¸¶·Ñµµ  | 
|       | 
|     playerID = curPlayer.GetPlayerID()  | 
|     endTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineHousekeeperEndTime)  | 
|     if keeperIndex == 0:  | 
|         if endTime:  | 
|             GameWorld.DebugLog("¸£µØÃâ·Ñ¹Ü¼ÒÒÑÁìÈ¡¹ý£¡", playerID)  | 
|             return  | 
|           | 
|     openServerDayLimit = IpyGameDataPY.GetFuncCfg("MineAreaHousekeeper", 1)  | 
|     if openServerDayLimit:  | 
|         openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1  | 
|         if openServerDay <= openServerDayLimit:  | 
|             GameWorld.ErrLog("¿ª·þÌìδµ½£¬ÎÞ·¨Ê¹Óø£µØ¹Ü¼Ò£¡ keeperIndex=%s,openServerDay=%s <= %s"   | 
|                              % (keeperIndex, openServerDay, openServerDayLimit), playerID)  | 
|             return  | 
|           | 
|     keeperDaysList = IpyGameDataPY.GetFuncEvalCfg("MineAreaHousekeeper", 2)  | 
|     if keeperIndex < 0 or keeperIndex >= len(keeperDaysList):  | 
|         return  | 
|     addDays = keeperDaysList[keeperIndex]  | 
|     addSeconds = addDays * 24 * 3600  | 
|     curTime = int(time.time())  | 
|       | 
|     endTimeStr = GameWorld.ChangeTimeNumToStr(endTime) if endTime else ""  | 
|     GameWorld.DebugLog("¼¤»î¸£µØ¹Ü¼Ò: keeperIndex=%s,addDays=%s(%s)" % (keeperIndex, addDays, addSeconds), playerID)  | 
|     GameWorld.DebugLog("    ¹Ü¼Òµ½ÆÚʱ¼ä: endTime=%s, %s" % (endTime, endTimeStr), playerID)  | 
|     if not endTime:  | 
|         updEndTime = curTime + addSeconds  | 
|         GameWorld.DebugLog("    ¼¤»î¹Ü¼Ò", playerID)  | 
|     elif curTime >= endTime:  | 
|         updEndTime = curTime + addSeconds   | 
|         GameWorld.DebugLog("    ÒѹýÆÚ£¬ÖØÐ¼¤»î¹Ü¼Ò", playerID)  | 
|     else:  | 
|         updEndTime = endTime + addSeconds  | 
|         GameWorld.DebugLog("    Ðø·Ñ¹Ü¼Òʱ³¤", playerID)  | 
|           | 
|     GameWorld.DebugLog("    ¸üйܼÒʱ³¤: updEndTime=%s, %s" % (updEndTime, GameWorld.ChangeTimeNumToStr(updEndTime)), playerID)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MineHousekeeperEndTime, updEndTime)  | 
|     SyncPlayerMineAreaInfo(curPlayer)  | 
|     return  | 
|   | 
| def SyncPlayerMineAreaInfo(curPlayer):  | 
|     clientPack = ChPyNetSendPack.tagMCPlayerMineAreaInfo()  | 
|     clientPack.WorkerCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineWorkerCount)  | 
|     clientPack.EnergyUsed = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineWorkerEnergyUsed)  | 
|     clientPack.HousekeeperEndTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineHousekeeperEndTime)  | 
|     clientPack.HelpAwardCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineHelpAwardCount)  | 
|     clientPack.RefreshCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineRefreshCount % RefreshType_Comm)  | 
|     clientPack.RefreshCountSuper = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineRefreshCount % RefreshType_Super)  | 
|     clientPack.RefreshCountRob = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineRefreshCount % RefreshType_Rob)  | 
|       | 
|     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  |