#!/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 not GameWorld.IsNormalPlayer(curPlayer): 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) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GarbageGJSeconds % 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 def OnGetGuajiAwardItemDict(curPlayer, awardSeconds, useUnsecond): ## »ñÈ¡¹Ò»úÊÕÒæ dropItemCountDict = {} guajiAwardSet = IpyGameDataPY.GetFuncEvalCfg("GarbageSorting", 3) # ¹Ò»úÊÕÒæÉèÖà xÃë|x´ÎÖ´ÐÐÊýÖµ4 if not guajiAwardSet: return dropItemCountDict doSeconds, doCount = guajiAwardSet dropRateList = IpyGameDataPY.GetFuncEvalCfg("GarbageSorting", 4) # ¹Ò»úÊÕÒæ¸ÅÂʱýͼ [[¸ÅÂÊ, [ÎïÆ·ID,¸öÊý,ÊÇ·ñÅÄÆ·]], ...] 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): continue if useUnsecond: unSeconds = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GarbageGJSeconds % (actNum)) awardSeconds += unSeconds canDoCount = awardSeconds / doSeconds killCount = canDoCount * doCount updUnSeconds = awardSeconds % doSeconds PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GarbageGJSeconds % (actNum), updUnSeconds) GameWorld.DebugLog(" ¹Ò»úÀ¬»ø·ÖÀà: actNum=%s,awardSeconds=%s,canDoCount=%s,killCount=%s,unSeconds=%s,updUnSeconds=%s" % (actNum, awardSeconds, canDoCount, killCount, unSeconds, updUnSeconds)) else: canDoCount = awardSeconds / doSeconds killCount = canDoCount * doCount GameWorld.DebugLog(" ¹Ò»úÀ¬»ø·ÖÀà: actNum=%s,awardSeconds=%s,canDoCount=%s,killCount=%s" % (actNum, awardSeconds, canDoCount, killCount)) if killCount <= 0: continue preRate = 0 maxRate = dropRateList[-1][0] for rateInfo in dropRateList: rate, dropItemInfo = rateInfo curRate = rate - preRate if not curRate: break preRate = rate if not dropItemInfo: continue totalRate = curRate * killCount # ×ܸÅÂÊ dropCount = totalRate / maxRate # ¿ÉµôÂäÊý rateEx = totalRate % maxRate # Ê£Óà¸ÅÂÊ if GameWorld.CanHappen(rateEx, maxRate): dropCount += 1 if not dropCount: continue dropItemID, itemCount, _ = dropItemInfo dropItemCount = itemCount * dropCount dropItemCountDict[dropItemID] = dropItemCountDict.get(dropItemID, 0) + dropItemCount GameWorld.DebugLog(" ¹Ò»úÀ¬»ø·ÖÀà²ú³ö: actNum=%s,dropItemID=%s,dropCount=%s,dropItemCount=%s,curRate=%s,totalRate=%s" % (actNum, dropItemID, dropCount, dropItemCount, curRate, totalRate)) return dropItemCountDict #// 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