| #!/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 NetPackCommon  | 
| import ItemControler  | 
| import ItemCommon  | 
| import GameWorld  | 
| import PlayerTask  | 
|   | 
| # ¾Û±¦ÅèĬÈÏ×î´ó½ø¶È  | 
| 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)  | 
|       | 
|     PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_MineWorkerCnt)  | 
|     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 == "Pull":  | 
|         areaPlayerID = dataMsg[0]  | 
|         if areaPlayerID == curPlayer.GetPlayerID():  | 
|             PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_MineItemSelf, 1)  | 
|         else:  | 
|             PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_MineItemRob, 1)  | 
|     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)  | 
|           | 
|     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 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  |