| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package Player.PlayerActGarbageSorting  | 
| #  | 
| # @todo:À¬»ø·ÖÀà»î¶¯  | 
| # @author hxp  | 
| # @date 2021-05-13  | 
| # @version 1.0  | 
| #  | 
| # ÏêϸÃèÊö: À¬»ø·ÖÀà»î¶¯  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #"""Version = 2021-05-13 19:30"""  | 
| #-------------------------------------------------------------------------------  | 
|   | 
| import PyGameData  | 
| import ShareDefine  | 
| import PlayerControl  | 
| import IpyGameDataPY  | 
| import ItemControler  | 
| import ChPyNetSendPack  | 
| import NetPackCommon  | 
| import GameWorld  | 
| import ChConfig  | 
| import ItemCommon  | 
| import PlayerBillboard  | 
|   | 
| def OnPlayerLogin(curPlayer):  | 
|       | 
|     for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_GarbageSorting, {}).values():  | 
|         actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)  | 
|         isReset = __CheckPlayerGarbageSortingAction(curPlayer, actNum)  | 
|         if not isReset:  | 
|             # »î¶¯ÖÐͬ²½»î¶¯ÐÅÏ¢  | 
|             if actInfo.get(ShareDefine.ActKey_State):  | 
|                 Sync_GarbageSortingActionInfo(curPlayer, actNum)  | 
|                 Sync_GarbageTaskInfo(curPlayer, actNum)  | 
|     return  | 
|   | 
| def RefreshGarbageSortingActionInfo(actNum):  | 
|     ## ÊÕµ½GameServerͬ²½µÄ»î¶¯ÐÅÏ¢£¬Ë¢Ð»ÐÅÏ¢  | 
|     playerManager = GameWorld.GetPlayerManager()  | 
|     for index in xrange(playerManager.GetPlayerCount()):  | 
|         curPlayer = playerManager.GetPlayerByIndex(index)  | 
|         if curPlayer.GetID() == 0:  | 
|             continue  | 
|         __CheckPlayerGarbageSortingAction(curPlayer, actNum)  | 
|     return  | 
|   | 
| def __CheckPlayerGarbageSortingAction(curPlayer, actNum):  | 
|     ## ¼ì²éÍæ¼Ò»î¶¯Êý¾ÝÐÅÏ¢  | 
|       | 
|     playerID = curPlayer.GetPlayerID()  | 
|     actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_GarbageSorting, actNum)  | 
|     actID = actInfo.get(ShareDefine.ActKey_ID, 0)  | 
|     state = actInfo.get(ShareDefine.ActKey_State, 0)  | 
|     cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)  | 
|       | 
|     playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GarbageSortingID % actNum) # Íæ¼ÒÉíÉϵĻID  | 
|       | 
|     # »î¶¯ID ÏàͬµÄ»°²»´¦Àí  | 
|     if actID == playerActID:  | 
|         GameWorld.DebugLog("À¬»ø·ÖÀà»î¶¯ID²»±ä£¬²»´¦Àí£¡actNum=%s,actID=%s" % (actNum, actID), playerID)  | 
|         return  | 
|       | 
|     actWorldLV = actInfo.get(ShareDefine.ActKey_WorldLV, 0)  | 
|       | 
|     GameWorld.DebugLog("À¬»ø·ÖÀàÖØÖÃ! actNum=%s,actID=%s,playerActID=%s,state=%s,cfgID=%s"   | 
|                        % (actNum, actID, playerActID, state, cfgID), playerID)  | 
|       | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GarbageSortingID % actNum, actID)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GarbageSortingWorldLV % actNum, actWorldLV)  | 
|     for taskID in ChConfig.GarbageTaskList:  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GarbageTaskValue % (actNum, taskID), 0)  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GarbageTaskFinishCount % (actNum, taskID), 0)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GarbageEnvironmentValue % actNum, 0)  | 
|       | 
|     # Çå³ýÀ¬»ø±³°üÎïÆ·¡¢ÖØÖû·±£Öµ  | 
|     ItemControler.ClearPack(curPlayer, ShareDefine.rptGarbage)  | 
|     PlayerControl.SetPlayerCurrency(curPlayer, ShareDefine.TYPE_Price_Environment, 0)  | 
|       | 
|     Sync_GarbageSortingActionInfo(curPlayer, actNum)  | 
|     Sync_GarbageTaskInfo(curPlayer, actNum)  | 
|     return True  | 
|   | 
| def AddActGarbageTaskProgress(curPlayer, taskID, addValue=1, valueInfo=None, isTJG=False):  | 
|     ## Ôö¼ÓÀ¬»øÊÕ¼¯ÈÎÎñ½ø¶È  | 
|     # @param valueInfo: taskID ¶ÔÓ¦µÄ×Ô¶¨ÒåÀ©Õ¹ÐÅÏ¢Öµ  | 
|     if addValue <= 0:  | 
|         return  | 
|       | 
|     giveGarbageItemList = []  | 
|     for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_GarbageSorting, {}).values():  | 
|         actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)  | 
|         if not actInfo.get(ShareDefine.ActKey_State):  | 
|             #GameWorld.DebugLog("À¬»ø·ÖÀà»î¶¯Î´¿ªÆô! actNum=%s" % actNum)  | 
|             continue  | 
|           | 
|         if taskID == ChConfig.Def_GarbageTask_CTG:  | 
|             cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)  | 
|             if not cfgID:  | 
|                 continue  | 
|               | 
|             ipyData = IpyGameDataPY.GetIpyGameData("ActGarbageSorting", cfgID)  | 
|             if not ipyData:  | 
|                 continue  | 
|               | 
|             coinType = valueInfo  | 
|             ctgTypeEffValue = ipyData.GetCTGTypeEffValue()  | 
|             if not ctgTypeEffValue & pow(2, coinType):  | 
|                 #GameWorld.DebugLog("À¬»ø·ÖÀà»î¶¯³äÖµÀàÐͶԸûÎÞЧ! actNum=%s,coinType=%s,ctgTypeEffValue=%s"   | 
|                 #                   % (actNum, coinType, ctgTypeEffValue), curPlayer.GetPlayerID())  | 
|                 continue  | 
|               | 
|         taskIpyData = IpyGameDataPY.GetIpyGameData("ActGarbageTask", taskID)  | 
|         if not taskIpyData:  | 
|             continue  | 
|         maxFinishCount = taskIpyData.GetFinishTimeMax()  | 
|         maxValue = ChConfig.Def_UpperLimit_DWord  | 
|         if maxFinishCount:  | 
|             maxValue = min(maxValue, taskIpyData.GetFinishNeedValue() * maxFinishCount)  | 
|               | 
|         curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GarbageTaskValue % (actNum, taskID))  | 
|         updValue = min(curValue + addValue, maxValue)  | 
|         if curValue >= maxValue:  | 
|             #GameWorld.DebugLog("¸ÃÀ¬»ø·ÖÀà»î¶¯ÈÎÎñÒÑ´ïµ½×î´ó½ø¶ÈÖµ!actNum=%s,taskID=%s,curValue(%s) >= maxValue(%s)"   | 
|             #                   % (actNum, taskID, curValue, maxValue))  | 
|             continue  | 
|           | 
|         #GameWorld.DebugLog("Ôö¼ÓÀ¬»ø·ÖÀà»î¶¯ÈÎÎñ½ø¶È: actNum=%s,taskID=%s,curValue=%s,addValue=%s,updValue=%s"   | 
|         #                   % (actNum, taskID, curValue, addValue, updValue))  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GarbageTaskValue % (actNum, taskID), updValue)  | 
|           | 
|         # Íê³Éʱ×Ô¶¯²úÉúÀ¬»ø  | 
|         if taskIpyData.GetAutoProduce():  | 
|             giveItemList = __DoCheckFinishGarbageTask(curPlayer, actNum, taskID, taskIpyData, isTJG)  | 
|             if giveItemList:  | 
|                 giveGarbageItemList += giveItemList  | 
|                 continue  | 
|               | 
|         Sync_GarbageTaskInfo(curPlayer, actNum, taskID)  | 
|           | 
|     return giveGarbageItemList  | 
|   | 
| def __DoCheckFinishGarbageTask(curPlayer, actNum, taskID, taskIpyData=None, isTJG=False):  | 
|     ## ¼ì²éÍê³ÉÀ¬»øÊÕ¼¯ÈÎÎñ  | 
|       | 
|     if not taskIpyData:  | 
|         taskIpyData = IpyGameDataPY.GetIpyGameData("ActGarbageTask", taskID)  | 
|     if not taskIpyData:  | 
|         return  | 
|     curFinishCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GarbageTaskFinishCount % (actNum, taskID))  | 
|     maxFinishCount = taskIpyData.GetFinishTimeMax()  | 
|     if maxFinishCount and curFinishCount >= maxFinishCount:  | 
|         GameWorld.DebugLog("¸ÃÀ¬»ø·ÖÀà»î¶¯ÈÎÎñÒÑ´ïµ½×î´óÍê³É´ÎÊý!actNum=%s,taskID=%s,curFinishCount=%s" % (actNum, taskID, curFinishCount))  | 
|         return  | 
|       | 
|     curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GarbageTaskValue % (actNum, taskID))  | 
|     updFinishCount = curValue / taskIpyData.GetFinishNeedValue()  | 
|     if maxFinishCount:  | 
|         updFinishCount = min(maxFinishCount, updFinishCount)  | 
|     addFinishCount = updFinishCount - curFinishCount  | 
|     if addFinishCount <= 0:  | 
|         #GameWorld.DebugLog("À¬»ø·ÖÀà»î¶¯ÈÎÎñδÍê³É£¬ÎÞ·¨ÁìÈ¡!actNum=%s,taskID=%s,curValue=%s,curFinishCount=%s,updFinishCount=%s"   | 
|         #                   % (actNum, taskID, curValue, curFinishCount, updFinishCount))  | 
|         return  | 
|       | 
|     # ¸øÀ¬»øÊÕ¼¯½±Àø  | 
|     giveItemDict = {}  | 
|     rateList = taskIpyData.GetProduceGarbageRateList()  | 
|     for _ in xrange(addFinishCount):  | 
|         itemInfo = GameWorld.GetResultByRandomList(rateList)  | 
|         if not itemInfo:  | 
|             continue  | 
|         itemID, itemCount, isAuctionItem = itemInfo  | 
|         befItemCount = giveItemDict[itemID][1] if itemID in giveItemDict else 0  | 
|         giveItemDict[itemID] = [itemID, befItemCount + itemCount, isAuctionItem]  | 
|     giveItemList = giveItemDict.values()  | 
|       | 
|     if not giveItemList:  | 
|         return  | 
|       | 
|     if not ItemControler.CheckPackSpaceEnough(curPlayer, giveItemList):  | 
|         return  | 
|       | 
|     #GameWorld.DebugLog("À¬»ø·ÖÀà»î¶¯ÈÎÎñÍê³É£¬¸ø½±Àø! actNum=%s,taskID=%s,curValue=%s,curFinishCount=%s,addFinishCount=%s,updFinishCount=%s"   | 
|     #                   % (actNum, taskID, curValue, curFinishCount, addFinishCount, updFinishCount))  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GarbageTaskFinishCount % (actNum, taskID), updFinishCount)  | 
|       | 
|     if not isTJG:  | 
|         for itemID, itemCnt, isAuctionItem in giveItemList:  | 
|             ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, isAuctionItem, [])  | 
|               | 
|     Sync_GarbageTaskInfo(curPlayer, actNum, taskID)  | 
|     return giveItemList  | 
|   | 
| #// AA 14 À¬»ø·ÖÀà»î¶¯·ÖÀàÀ¬»ø #tagCMActGarbageSorting  | 
| #  | 
| #struct    tagCMActGarbageSorting  | 
| #{  | 
| #    tagHead        Head;  | 
| #    BYTE        ActNum;        //»î¶¯±àºÅ  | 
| #    BYTE        GarbageSortingType;    //À¬»ø·ÖÀàÀàÐÍ£¬¼´ÊôÓÚÄÄÖÖÀ¬»ø  | 
| #    BYTE        ItemIndexCount;        //À¬»ø±³°üÖеÄÎïÆ·Ë÷ÒýÊý  | 
| #    BYTE        ItemIndexList[ItemIndexCount];    //À¬»ø±³°üÖеÄÎïÆ·Ë÷ÒýÁÐ±í  | 
| #};  | 
| def OnActGarbageSorting(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     actNum = clientData.ActNum  | 
|     sortingType = clientData.GarbageSortingType  | 
|     itemIndexList = clientData.ItemIndexList  | 
|       | 
|     playerID = curPlayer.GetPlayerID()  | 
|       | 
|     GameWorld.DebugLog("À¬»ø·ÖÀàͶ·Å: sortingType=%s,itemIndexList=%s" % (sortingType, itemIndexList), playerID)  | 
|       | 
|     isRight = 1  | 
|     environmentValueInfo = IpyGameDataPY.GetFuncEvalCfg("GarbageSorting", 2)  | 
|     addEnvValueTotal = 0  | 
|     garbagePack = curPlayer.GetItemManager().GetPack(ShareDefine.rptGarbage)  | 
|     for index in itemIndexList:  | 
|         if index >= garbagePack.GetCount():  | 
|             continue  | 
|         curItem = garbagePack.GetAt(index)  | 
|         if not ItemCommon.CheckItemCanUse(curItem):  | 
|             continue  | 
|         itemID = curItem.GetItemTypeID()  | 
|         itemSortingType = curItem.GetEffectByIndex(0).GetEffectValue(0)  | 
|         if sortingType == itemSortingType:  | 
|             delCount = curItem.GetCount()  | 
|             addEnvValue = environmentValueInfo[0] * delCount  | 
|         else:  | 
|             delCount = 1 # ´íÎóÖ»¿Û³ý1Ò»¸ö  | 
|             addEnvValue = environmentValueInfo[1] * delCount  | 
|             isRight = 0  | 
|               | 
|         ItemControler.SetItemCount(curItem, max(0, curItem.GetCount() - delCount))  | 
|         addEnvValueTotal += addEnvValue  | 
|         GameWorld.DebugLog("    index=%s,itemID=%s,itemSortingType=%s,delCount=%s,addEnvValue=%s"   | 
|                            % (index, itemID, itemSortingType, delCount, addEnvValue), playerID)  | 
|           | 
|     if not addEnvValueTotal:  | 
|         return  | 
|       | 
|     PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_Environment, addEnvValueTotal, isSysHint=False)  | 
|     actEnvValueTotal = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GarbageEnvironmentValue % actNum) + addEnvValueTotal  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GarbageEnvironmentValue % actNum, actEnvValueTotal)      | 
|     GameWorld.DebugLog("    addEnvValueTotal=%s,actEnvValueTotal=%s,curEnvValue=%s"   | 
|                        % (addEnvValueTotal, actEnvValueTotal, PlayerControl.GetMoney(curPlayer, ShareDefine.TYPE_Price_Environment)), playerID)  | 
|       | 
|     PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_Environment, actEnvValueTotal)  | 
|       | 
|     # Í¨Öª½á¹û  | 
|     clientPack = ChPyNetSendPack.tagMCActGarbageSortingResult()  | 
|     clientPack.ActNum = actNum  | 
|     clientPack.GarbageSortingType = sortingType  | 
|     clientPack.IsRight = isRight  | 
|     clientPack.AddEnvValue = addEnvValueTotal  | 
|     clientPack.HisEnvValueTotal = actEnvValueTotal  | 
|     NetPackCommon.SendFakePack(curPlayer, clientPack)  | 
|     return  | 
|   | 
|   | 
| #// AA 15 À¬»ø·ÖÀà»î¶¯ÊÕ¼¯ÒÑÍê³ÉµÄÈÎÎñÀ¬»ø #tagCMActGarbageGetTaskAward  | 
| #  | 
| #struct    tagCMActGarbageGetTaskAward  | 
| #{  | 
| #    tagHead        Head;  | 
| #    BYTE        ActNum;        //»î¶¯±àºÅ  | 
| #    BYTE        GarbageTaskID;    //À¬»øÈÎÎñID  | 
| #};  | 
| def OnActGarbageGetTaskAward(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     actNum = clientData.ActNum  | 
|     taskID = clientData.GarbageTaskID  | 
|     __DoCheckFinishGarbageTask(curPlayer, actNum, taskID)  | 
|     return  | 
|   | 
| def Sync_GarbageTaskInfo(curPlayer, actNum, taskID=0):  | 
|     ## Í¨ÖªÀ¬»øÊÕ¼¯ÈÎÎñÐÅÏ¢  | 
|     syncTaskIDList = [taskID] if taskID else ChConfig.GarbageTaskList  | 
|     clientPack = ChPyNetSendPack.tagMCActGarbageTaskInfo()  | 
|     clientPack.ActNum = actNum  | 
|     clientPack.HisEnvValueTotal = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GarbageEnvironmentValue % actNum)  | 
|     clientPack.GarbageTaskList = []  | 
|     for taskID in syncTaskIDList:  | 
|         task = ChPyNetSendPack.tagMCActGarbageTask()  | 
|         task.GarbageTaskID = taskID  | 
|         task.GarbageTaskValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GarbageTaskValue % (actNum, taskID))  | 
|         task.GarbageTaskFinishCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GarbageTaskFinishCount % (actNum, taskID))  | 
|         clientPack.GarbageTaskList.append(task)  | 
|     clientPack.GarbageTaskCount = len(clientPack.GarbageTaskList)  | 
|     NetPackCommon.SendFakePack(curPlayer, clientPack)  | 
|     return  | 
|   | 
| def Sync_GarbageSortingActionInfo(curPlayer, actNum):  | 
|     ## Í¨Öª»î¶¯ÐÅÏ¢  | 
|       | 
|     actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_GarbageSorting, actNum)  | 
|     if not actInfo.get(ShareDefine.ActKey_State):  | 
|         return  | 
|       | 
|     cfgID = actInfo.get(ShareDefine.ActKey_CfgID)  | 
|     ipyData = IpyGameDataPY.GetIpyGameData("ActGarbageSorting", cfgID)  | 
|     if not ipyData:  | 
|         return  | 
|       | 
|     startDateStr, endDateStr = GameWorld.GetOperationActionDateStr(ipyData)  | 
|     clientPack = ChPyNetSendPack.tagMCActGarbageSortingInfo()  | 
|     clientPack.ActNum = actNum  | 
|     clientPack.StartDate = startDateStr  | 
|     clientPack.EndtDate = endDateStr  | 
|     clientPack.LimitLV = ipyData.GetLVLimit()  | 
|     clientPack.ResetType = ipyData.GetResetType()  | 
|     NetPackCommon.SendFakePack(curPlayer, clientPack)  | 
|     return  | 
|   |