| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package Player.PlayerGuaji  | 
| #  | 
| # @todo:¹Ò»úÊÕÒæ  | 
| # @author hxp  | 
| # @date 2024-06-12  | 
| # @version 1.0  | 
| #  | 
| # ÏêϸÃèÊö: ¹Ò»úÊÕÒæ  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #"""Version = 2024-06-12 18:00"""  | 
| #-------------------------------------------------------------------------------  | 
|   | 
| import ChConfig  | 
| import ShareDefine  | 
| import PlayerControl  | 
| import ChPyNetSendPack  | 
| import PlayerWorldAverageLv  | 
| import PlayerActGarbageSorting  | 
| import PlayerActCollectWords  | 
| import PlayerGoldInvest  | 
| import FormulaControl  | 
| import NetPackCommon  | 
| import IpyGameDataPY  | 
| import ItemControler  | 
| import GameFuncComm  | 
| import GameWorld  | 
| import PlayerVip  | 
|   | 
| import time  | 
|   | 
| Def_Process_Seconds = 60 # ÔÚÏß¶¨Ê±´¦Àí¼ä¸ô£¬Ã룬ÀëÏßÉÏÏߺóÒ»´ÎÐÔ´¦Àí  | 
|   | 
| def DoGuajiOpen(curPlayer):  | 
|     openAwardMinutes = IpyGameDataPY.GetFuncCfg("GuajiTime", 1) # ¹¦ÄÜ¿ªÆô»ñµÃÊÕÒæÊ±³¤£¬·ÖÖÓ  | 
|     AddGuajiAward(curPlayer, openAwardMinutes * 60)  | 
|     return  | 
|   | 
| def OnPlayerLogin(curPlayer):  | 
|     if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Guaji):  | 
|         return  | 
|     if not ProcessGuaji(curPlayer):  | 
|         Sync_GuajiAward(curPlayer)  | 
|     return  | 
|   | 
| def PlayerOnDay(curPlayer):  | 
|     if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Guaji):  | 
|         return  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GuajiQuickCount, 0)  | 
|     Sync_GuajiAward(curPlayer)  | 
|     return  | 
|   | 
| def ProcessGuaji(curPlayer):  | 
|     ## ¹Ò»ú¶¨Ê±´¦ÀíÊÕÒæ  | 
|     if GameWorld.IsCrossServer():  | 
|         return  | 
|     if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Guaji):  | 
|         return  | 
|       | 
|     curTime = int(time.time())  | 
|     lastCalcTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GuajiCalcTime)  | 
|     if not lastCalcTime:  | 
|         lastCalcTime = curTime  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GuajiCalcTime, curTime)  | 
|           | 
|     awardSeconds = passSeconds = curTime - lastCalcTime  | 
|     if passSeconds <= Def_Process_Seconds:  | 
|         # Ã¿ÂúxÃëͳ¼ÆÒ»´Î  | 
|         return  | 
|       | 
|     if awardSeconds < Def_Process_Seconds + 10:  | 
|         awardSeconds = Def_Process_Seconds  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GuajiCalcTime, lastCalcTime + awardSeconds)  | 
|     else:  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GuajiCalcTime, curTime)          | 
|           | 
|     return AddGuajiAward(curPlayer, awardSeconds)  | 
|   | 
| def AddGuajiAward(curPlayer, awardSeconds):  | 
|     ## Ôö¼Ó¹Ò»ú½±Àø  | 
|     if awardSeconds <= 0:  | 
|         return  | 
|       | 
|     playerID = curPlayer.GetPlayerID()  | 
|     curAwardSeconds = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GuajiAwardSeconds)  | 
|     maxSeconds = GetGuajiSecondsMax(curPlayer)  | 
|     if curAwardSeconds >= maxSeconds:  | 
|         GameWorld.DebugLog("¹Ò»úÊÕÒæÊ±³¤ÒÑ´ïÉÏÏÞ: curAwardSeconds=%s >= %s" % (curAwardSeconds, maxSeconds), playerID)  | 
|         return  | 
|       | 
|     awardSeconds = min(maxSeconds - curAwardSeconds, awardSeconds)  | 
|     if awardSeconds <= 0:  | 
|         return  | 
|       | 
|     addExp, giveMoneyDict, giveItemDict = CalcGuajiAward(curPlayer, awardSeconds, True)  | 
|       | 
|     updAwardSeconds = curAwardSeconds + awardSeconds  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GuajiAwardSeconds, updAwardSeconds)  | 
|     GameWorld.DebugLog("±£´æ¹Ò»úÀÛ¼ÆÊÕÒæ: curAwardSeconds=%s,updAwardSeconds=%s,maxSeconds=%s" % (curAwardSeconds, updAwardSeconds, maxSeconds), playerID)  | 
|       | 
|     # ¾Ñé  | 
|     exp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GuajiExpPoint) * ChConfig.Def_PerPointValue \  | 
|         + curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GuajiExp) + addExp  | 
|     updExpPoint = exp / ChConfig.Def_PerPointValue  | 
|     updExp = exp % ChConfig.Def_PerPointValue  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GuajiExpPoint, updExpPoint)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GuajiExp, updExp)  | 
|     GameWorld.DebugLog("    ÀۼƾÑé: %sÒÚ%s" % (updExpPoint, updExp), playerID)  | 
|       | 
|     # »õ±Ò  | 
|     for moneyType, addValue in giveMoneyDict.items():  | 
|         saveNum = GetSaveNum(curPlayer, ChConfig.Def_PDict_GuajiMoneyType, moneyType)  | 
|         if saveNum == None:  | 
|             continue  | 
|         moneyValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GuajiMoneyValue % saveNum)  | 
|         updMoney = min(moneyValue + addValue, ChConfig.Def_UpperLimit_DWord)  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GuajiMoneyType % saveNum, moneyType)  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GuajiMoneyValue % saveNum, updMoney)  | 
|         GameWorld.DebugLog("    Àۼƻõ±Ò: moneyType=%s,updMoney=%s,saveNum=%s" % (moneyType, updMoney, saveNum), playerID)  | 
|           | 
|     # ÎïÆ·  | 
|     for itemID, addCount in giveItemDict.items():  | 
|         saveNum = GetSaveNum(curPlayer, ChConfig.Def_PDict_GuajiItemID, itemID)  | 
|         if saveNum == None:  | 
|             continue  | 
|         curCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GuajiItemCount % saveNum)  | 
|         updCount = min(curCount + addCount, ChConfig.Def_UpperLimit_DWord)  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GuajiItemID % saveNum, itemID)  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GuajiItemCount % saveNum, updCount)  | 
|         GameWorld.DebugLog("    ÀÛ¼ÆÎïÆ·: itemID=%s,updCount=%s,saveNum=%s" % (itemID, updCount, saveNum), playerID)  | 
|           | 
|     Sync_GuajiAward(curPlayer)  | 
|     return True  | 
|   | 
| def GetSaveNum(curPlayer, key, compValue):  | 
|     for num in range(100):  | 
|         value = curPlayer.NomalDictGetProperty(key % num)  | 
|         if not value or compValue == value:  | 
|             # ¿ÕÖµ»òÕßÃüÖÐ  | 
|             return num  | 
|     return  | 
|   | 
| def GetGuajiSecondsMax(curPlayer):  | 
|     ## ¹Ò»úÊÕÒæÊ±³¤ÉÏÏÞ£¬Ãë  | 
|     # ³õʼ  | 
|     initHours = IpyGameDataPY.GetFuncCfg("GuajiTime", 2) # ³õʼʱ³¤£¬Ð¡Ê±  | 
|       | 
|     # ¾³½çÔö¼Ó  | 
|     curRealmLV = curPlayer.GetOfficialRank()  | 
|     realmAddHours = 0  | 
|     realmAddHoursDict = IpyGameDataPY.GetFuncEvalCfg("GuajiTime", 3, {})  | 
|     realmLVList = [int(k) for k in realmAddHoursDict.keys()]  | 
|     realmLVList.sort()  | 
|     for realmLV in realmLVList:  | 
|         if curRealmLV >= realmLV:  | 
|             realmAddHours = realmAddHoursDict[str(realmLV)]  | 
|         else:  | 
|             break  | 
|       | 
|     totalHours = initHours + realmAddHours  | 
|     return totalHours * 3600  | 
|   | 
| def GetGuajiAwardInfoSave(curPlayer):  | 
|     ## »ñÈ¡Òѱ£´æµÄÀۼƹһúÊÕÒæÐÅÏ¢  | 
|     lastCalcTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GuajiCalcTime)  | 
|     awardSeconds = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GuajiAwardSeconds)  | 
|     if lastCalcTime:  | 
|         awardSeconds += max(0, int(time.time() - lastCalcTime))  | 
|     awardSeconds = min(awardSeconds, GetGuajiSecondsMax(curPlayer))  | 
|       | 
|     exp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GuajiExpPoint) * ChConfig.Def_PerPointValue + \  | 
|         curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GuajiExp)  | 
|           | 
|     moneyDict = {}  | 
|     for num in range(100):  | 
|         moneyType = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GuajiMoneyType % num)  | 
|         if not moneyType:  | 
|             break  | 
|         moneyDict[moneyType] = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GuajiMoneyValue % num)  | 
|           | 
|     itemDict = {}  | 
|     for num in range(100):  | 
|         itemID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GuajiItemID % num)  | 
|         if not itemID:  | 
|             break  | 
|         itemDict[itemID] = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GuajiItemCount % num)  | 
|           | 
|     return awardSeconds, exp, moneyDict, itemDict  | 
|   | 
| def CalcGuajiAward(curPlayer, awardSeconds, useUnsecond):  | 
|     ## ¼ÆËã¹Ò»úÊÕÒæ£¬Ö»¼ÆËãÊÕÒæ£¬²»×ö½áË㣬½áËãÂß¼ÓÉÍâ²ã¾ö¶¨  | 
|       | 
|     playerID = curPlayer.GetPlayerID()  | 
|     reLV = curPlayer.GetLV()  | 
|     lvIpyData = PlayerControl.GetPlayerLVIpyData(reLV)  | 
|     reExp = lvIpyData.GetReExp() if lvIpyData else 0  | 
|     worldLV = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv)  | 
|     GameWorld.DebugLog("¼ÆËã¹Ò»úÊÕÒæ: awardSeconds=%s,useUnsecond=%s,reLV=%s,reExp=%s,worldLV=%s"   | 
|                        % (awardSeconds, useUnsecond, reLV, reExp, worldLV), playerID)  | 
|       | 
|     # ¾Ñé  | 
|     expRate = GetGuajiExpRate(curPlayer)  | 
|     secondBaseExp = int(eval(FormulaControl.GetCompileFormula("GuajiExp", IpyGameDataPY.GetFuncCfg("GuajiAward", 1))))  | 
|     secondExp = int(secondBaseExp * expRate / float(ChConfig.Def_MaxRateValue))  | 
|     addExp = awardSeconds * secondExp  | 
|     GameWorld.DebugLog("    Ã¿Ãë¾Ñé: %s, addExp=%s,secondBaseExp=%s,expRate=%s" % (secondExp, addExp, secondBaseExp, expRate), playerID)  | 
|       | 
|     # Ã¿Ãë²ú³ö»õ±Ò  | 
|     moneyDict = {}  | 
|     perSecondMoneyFromulaDict = IpyGameDataPY.GetFuncEvalCfg("GuajiAward", 2, {}) # Ã¿Ãë»ñµÃ»õ±Ò¹«Ê½ {»õ±ÒÀàÐÍ:"ÿÃë»ñµÃÊýÁ¿¹«Ê½", ...}  | 
|     for moneyType, formula in perSecondMoneyFromulaDict.items():  | 
|         secondMoney = int(eval(FormulaControl.GetCompileFormula("GuajiMoney_%s" % moneyType, formula)))  | 
|         moneyValue = awardSeconds * secondMoney  | 
|         moneyDict[moneyType] = moneyValue  | 
|         GameWorld.DebugLog("    Ã¿Ãë»õ±Ò: moneyType=%s,secondMoney=%s,moneyValue=%s" % (moneyType, secondMoney, moneyValue), playerID)  | 
|           | 
|     # Ã¿xÃë²ú³ö1»õ±Ò  | 
|     perMoneyTimeFromulaDict = IpyGameDataPY.GetFuncEvalCfg("GuajiAward", 3, {}) # Ã¿xÃë»ñµÃ1¸ö»õ±Ò¹«Ê½ {»õ±ÒÀàÐÍ:"xÃ빫ʽ", ...}  | 
|     for moneyType, formula in perMoneyTimeFromulaDict.items():  | 
|         moneyAwardSeconds = awardSeconds  | 
|         if useUnsecond:  | 
|             moneyAwardSeconds += curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GuajiMoneyUnSeconds % moneyType)  | 
|         oneMoneyNeedSeconds = int(eval(FormulaControl.GetCompileFormula("GuajiMoney_%s" % moneyType, formula)))  | 
|         moneyValue = moneyAwardSeconds / oneMoneyNeedSeconds  | 
|         moneyDict[moneyType] = moneyValue  | 
|         GameWorld.DebugLog("    Ã¿XÃë»õ±Ò: moneyType=%s,oneMoneyNeedSeconds=%s,moneyValue=%s,moneyAwardSeconds=%s"   | 
|                            % (moneyType, oneMoneyNeedSeconds, moneyValue, moneyAwardSeconds), playerID)  | 
|           | 
|         if useUnsecond:  | 
|             unSeconds = moneyAwardSeconds % oneMoneyNeedSeconds  | 
|             PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GuajiMoneyUnSeconds % moneyType, unSeconds)  | 
|             GameWorld.DebugLog("        moneyType=%s,unSeconds=%s" % (moneyType, unSeconds), playerID)  | 
|               | 
|     # ÎïÆ·  | 
|     giveItemSecondsSet = IpyGameDataPY.GetFuncCfg("GuajiAward", 4) # Ã¿xÃë»ñµÃÒ»´ÎËæ»úÎïÆ·»ú»á  | 
|     lvItemRateDict = IpyGameDataPY.GetFuncEvalCfg("GuajiAward", 5, {})  | 
|     itemAwardSeconds = awardSeconds  | 
|     if useUnsecond:  | 
|         itemAwardSeconds += curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GuajiItemUnSeconds)  | 
|               | 
|     itemAwardTimes = itemAwardSeconds / giveItemSecondsSet # ¸øÎïÆ·´ÎÊý  | 
|     GameWorld.DebugLog("    ¸øÎïÆ·´ÎÊý: %s, itemAwardSeconds=%s,giveItemSecondsSet=%s" % (itemAwardTimes, itemAwardSeconds, giveItemSecondsSet), playerID)  | 
|       | 
|     if useUnsecond:  | 
|         unSeconds = itemAwardSeconds % giveItemSecondsSet  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GuajiItemUnSeconds, unSeconds)  | 
|         GameWorld.DebugLog("    ¸øÎïÆ·Î´´¦ÀíÃëÊý=%s" % unSeconds, playerID)  | 
|           | 
|     lvList = lvItemRateDict.keys()  | 
|     lvList.sort()  | 
|     itemRateList = []  | 
|     for lv in lvList:  | 
|         if reLV >= lv:  | 
|             itemRateList = lvItemRateDict[lv]  | 
|         else:  | 
|             break  | 
|           | 
|     dropCountTotal = 0  | 
|     itemDict = {}  | 
|     maxRate = itemRateList[-1][0]  | 
|     GameWorld.DebugLog("    itemRateList=%s,maxRate=%s" % (itemRateList, maxRate), playerID)  | 
|     if itemAwardTimes > 100: # ³¬¹ýx´ÎµÄ£¬ÏȽøÐÐÅúÁ¿´¦Àí  | 
|         preRate = 0  | 
|         for rateInfo in itemRateList:  | 
|             rate, itemInfo = rateInfo  | 
|             curRate = rate - preRate  | 
|             preRate = rate  | 
|             if curRate <= 0:  | 
|                 continue  | 
|             totalRate = curRate * itemAwardTimes # ×ܸÅÂÊ  | 
|             dropCount = totalRate / maxRate # ¿ÉµôÂä¼þÊý  | 
|             rateEx = totalRate % maxRate # Ê£Óà¸ÅÂÊ  | 
|             if GameWorld.CanHappen(rateEx, maxRate):  | 
|                 dropCount += 1  | 
|             dropCountTotal += dropCount # ²ú³öÊÇÊÇ¿ÕÎïÆ·Ò²ÒªËãÖ´ÐеôÂä´ÎÊý  | 
|             GameWorld.DebugLog("    ¹Ò»úÎïÆ·: itemInfo=%s,curRate=%s,totalRate=%s,rateEx=%s,dropCount=%s,dropCountTotal=%s"   | 
|                                % (itemInfo, curRate, totalRate, rateEx, dropCount, dropCountTotal), playerID)  | 
|             if not dropCount:  | 
|                 continue  | 
|               | 
|             if not itemInfo:  | 
|                 continue  | 
|             itemID, itemCount = itemInfo  | 
|             itemDict[itemID] = itemDict.get(itemID, 0) + itemCount * dropCount  | 
|               | 
|     awardTimesEx = itemAwardTimes - dropCountTotal  | 
|     GameWorld.DebugLog("    awardTimesEx=%s" % awardTimesEx, playerID)  | 
|     if awardTimesEx > 0:  | 
|         for _ in range(awardTimesEx):  | 
|             itemInfo = GameWorld.GetResultByRandomList(itemRateList)  | 
|             if not itemInfo:  | 
|                 continue  | 
|             itemID, itemCount = itemInfo  | 
|             itemDict[itemID] = itemDict.get(itemID, 0) + itemCount  | 
|               | 
|     # ¼¯×ÖµôÂä  | 
|     dropWordsCountDict = PlayerActCollectWords.OnGetGuajiAwardItemDict(curPlayer, awardSeconds, useUnsecond)  | 
|     for itemID, dropCount in dropWordsCountDict.items():  | 
|         itemDict[itemID] = itemDict.get(itemID, 0) + dropCount  | 
|           | 
|     # À¬»ø»ØÊÕ  | 
|     giveGarbageItemList = PlayerActGarbageSorting.OnGetGuajiAwardItemDict(curPlayer, awardSeconds, useUnsecond)  | 
|     for itemID, dropCount in giveGarbageItemList.items():  | 
|         itemDict[itemID] = itemDict.get(itemID, 0) + dropCount  | 
|           | 
|     GameWorld.DebugLog("    itemDict=%s" % (itemDict), playerID)  | 
|     return addExp, moneyDict, itemDict  | 
|   | 
| def GetGuajiExpRate(curPlayer):  | 
|     ## ¹Ò»úÊÕÒæ¾Ñé¼Ó³É  | 
|     expRate = curPlayer.GetFightExpRate() # ÏµÍ³¼°¹¦ÄÜÀÛ¼Ó  | 
|     expRate += PlayerWorldAverageLv.GetWorldAverageLvExpRate(curPlayer) # ÊÀ½çµÈ¼¶  | 
|     expRate += PlayerVip.GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_FightExpRate) # VIP¼Ó³É  | 
|     return expRate  | 
|   | 
| def OnGetGuajiAward(curPlayer, isQuick):  | 
|     ## ÁìÈ¡¹Ò»úÊÕÒæ  | 
|     # @param isQuick: ÊÇ·ñ¿ìËÙÊÕÒæ  | 
|       | 
|     playerID = curPlayer.GetPlayerID()  | 
|     GameWorld.DebugLog("ÁìÈ¡¹Ò»úÊÕÒæ!  isQuick=%s" % isQuick, playerID)  | 
|       | 
|     if isQuick:  | 
|         quickCountToday = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GuajiQuickCount)  | 
|         quickCountFree = IpyGameDataPY.GetFuncCfg("GuajiQuick", 2)  | 
|         vipCanBuyCount = PlayerVip.GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_GuajiQuickBuy)  | 
|         quickCountMax = quickCountFree + vipCanBuyCount  | 
|         if quickCountToday >= quickCountMax:  | 
|             GameWorld.DebugLog("¿ìËÙ¹Ò»úÊÕÒæ´ÎÊýÒÑ´ïÿÈÕÉÏÏÞ!  quickCountToday=%s" % quickCountToday, playerID)  | 
|             return  | 
|           | 
|         if quickCountToday >= quickCountFree and not PlayerGoldInvest.GetInvestState(curPlayer, ChConfig.InvestType_Life):  | 
|             todayBuyCount = quickCountToday - quickCountFree # ½ñÈÕÒѹºÂò´ÎÊý  | 
|             costMoneyType = IpyGameDataPY.GetFuncCfg("GuajiQuick", 3)  | 
|             costMoneyList = IpyGameDataPY.GetFuncEvalCfg("GuajiQuick", 4)  | 
|             if not costMoneyType or not costMoneyList:  | 
|                 return  | 
|             costMoneyValue = costMoneyList[todayBuyCount] if len(costMoneyList) > todayBuyCount else costMoneyList[-1]  | 
|               | 
|             GameWorld.DebugLog("    todayBuyCount=%s,costMoneyType=%s,costMoneyValue=%s"   | 
|                                % (todayBuyCount, costMoneyType, costMoneyValue), playerID)  | 
|             if not PlayerControl.PayMoney(curPlayer, costMoneyType, costMoneyValue, "Guaji"):  | 
|                 return  | 
|               | 
|         awardSeconds = IpyGameDataPY.GetFuncCfg("GuajiQuick", 1) * 3600  | 
|         exp, moneyDict, itemDict = CalcGuajiAward(curPlayer, awardSeconds, False)  | 
|           | 
|         quickCountToday += 1  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GuajiQuickCount, quickCountToday)  | 
|         GameWorld.DebugLog("    ¸üпìËÙ¹Ò»úÊÕÒæ´ÎÊý: quickCountToday=%s,quickCountMax=%s" % (quickCountToday, quickCountMax), playerID)  | 
|     else:  | 
|         awardSeconds, exp, moneyDict, itemDict = GetGuajiAwardInfoSave(curPlayer)  | 
|           | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GuajiCalcTime, int(time.time())) # ÉèÖÃͳ¼ÆÊ±¼ä£¬ÖØÐÂͳ¼Æ   | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GuajiAwardSeconds, 0)  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GuajiExp, 0)  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GuajiExpPoint, 0)  | 
|         for num in range(100):  | 
|             if not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GuajiMoneyType % num):  | 
|                 break  | 
|             PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GuajiMoneyType % num, 0)  | 
|             PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GuajiMoneyValue % num, 0)  | 
|         for num in range(100):  | 
|             if not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GuajiItemID % num):  | 
|                 break  | 
|             PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GuajiItemID % num, 0)  | 
|             PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GuajiItemCount % num, 0)  | 
|         Sync_GuajiAward(curPlayer)  | 
|           | 
|     __DoGiveGuajiAward(curPlayer, awardSeconds, exp, moneyDict, itemDict)  | 
|     return  | 
|   | 
| def GiveGuajiAward(curPlayer, awardSeconds):  | 
|     ## Ö±½Ó¸ø¹Ò»úÊÕÒæ  | 
|     GameWorld.DebugLog("Ö±½Ó¸ø¹Ò»úÊÕÒæ: awardSeconds=%s" % awardSeconds, curPlayer.GetPlayerID())  | 
|     exp, moneyDict, itemDict = CalcGuajiAward(curPlayer, awardSeconds, False)  | 
|     __DoGiveGuajiAward(curPlayer, awardSeconds, exp, moneyDict, itemDict)  | 
|     return  | 
|   | 
| def __DoGiveGuajiAward(curPlayer, awardSeconds, exp, moneyDict, itemDict):  | 
|     ## Êµ¼Ê¸ø¹Ò»úÊÕÒæ£¬½ö×ö·¢·ÅÊÕÒæ  | 
|     playerID = curPlayer.GetPlayerID()  | 
|     GameWorld.DebugLog("¸ø¹Ò»úÊÕÒæ: awardSeconds=%s,exp=%s,moneyDict=%s,itemDict=%s" % (awardSeconds, exp, moneyDict, itemDict), playerID)  | 
|       | 
|     playerControl = PlayerControl.PlayerControl(curPlayer)  | 
|     playerControl.AddExp(exp, ShareDefine.Def_ViewExpType_Guaji)  | 
|       | 
|     for moneyType, moneyValue in moneyDict.items():  | 
|         PlayerControl.GiveMoney(curPlayer, moneyType, moneyValue, "Guaji")  | 
|           | 
|     # ·Ö±³°ü·ÅÈë  | 
|     packTypeItemDict = {}  | 
|     for itemID, itemCount in itemDict.items():  | 
|         itemData = GameWorld.GetGameData().GetItemByTypeID(itemID)  | 
|         if not itemData:  | 
|             continue  | 
|         packType = ChConfig.GetItemPackType(itemData)  | 
|         if packType not in packTypeItemDict:  | 
|             packTypeItemDict[packType] = []  | 
|         giveItemList = packTypeItemDict[packType]  | 
|         giveItemList.append([itemID, itemCount, 0])  | 
|           | 
|     for packType, giveItemList in packTypeItemDict.items():  | 
|         # À¬»ø·ÖÀà±³°üÖ±½Ó·ÅÈë  | 
|         if packType == ShareDefine.rptGarbage:  | 
|             for itemID, itemCount, isAuctionItem in giveItemList:  | 
|                 ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, [packType], event=["Guaji", False, {}])  | 
|         else:  | 
|             ItemControler.GivePlayerItemOrMail(curPlayer, giveItemList, event=["Guaji", False, {}])  | 
|               | 
|     Sync_GuajiAward(curPlayer, 1, awardSeconds, exp, moneyDict, itemDict)  | 
|     return  | 
|   | 
| def Sync_GuajiAward(curPlayer, awardType=0, awardSeconds=0, exp=0, moneyDict=None, itemDict=None):  | 
|     ## Í¬²½¹Ò»úÊÕÒæÐÅÏ¢  | 
|       | 
|     #  ÊÕÒæÀàÐÍ£º 0-ÒÑÀÛ¼ÆÔ¤ÀÀ£»1-ÁìÈ¡½áËã½á¹û£¨°üº¬³£¹æÁìÈ¡¸ú¿ìËÙÁìÈ¡£©  | 
|     if awardType == 0:  | 
|         awardSeconds, exp, moneyDict, itemDict = GetGuajiAwardInfoSave(curPlayer)  | 
|           | 
|     clientPack = ChPyNetSendPack.tagMCGuajiInfo()  | 
|     clientPack.QuickAwardCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GuajiQuickCount)  | 
|     clientPack.AwardType = awardType  | 
|     clientPack.AwardSeconds = awardSeconds  | 
|     clientPack.Exp = exp % ChConfig.Def_PerPointValue  | 
|     clientPack.ExpPoint = exp / ChConfig.Def_PerPointValue  | 
|       | 
|     clientPack.MoneyList = []  | 
|     if moneyDict:  | 
|         for moneyType, moneyValue in moneyDict.items():  | 
|             money = ChPyNetSendPack.tagMCGuajiMoney()  | 
|             money.MoneyType = moneyType  | 
|             money.MoneyValue = moneyValue  | 
|             clientPack.MoneyList.append(money)  | 
|     clientPack.MoneyLen = len(clientPack.MoneyList)  | 
|       | 
|     clientPack.ItemList = []  | 
|     if itemDict:  | 
|         for itemID, itemCount in itemDict.items():  | 
|             item = ChPyNetSendPack.tagMCGuajiItem()  | 
|             item.ItemID = itemID  | 
|             item.Count = itemCount  | 
|             clientPack.ItemList.append(item)  | 
|     clientPack.ItemLen = len(clientPack.ItemList)  | 
|       | 
|     NetPackCommon.SendFakePack(curPlayer, clientPack)  | 
|     return  | 
|   |