#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package Player.PlayerCostRebate # # @todo:Ïû·Ñ·µÀû»î¶¯ # @author hxp # @date 2018-7-16 # @version 1.0 # # ÏêϸÃèÊö: Ïû·Ñ·µÀû»î¶¯ # #------------------------------------------------------------------------------- #"""Version = 2018-7-16 12:00""" #------------------------------------------------------------------------------- import PyGameData import ShareDefine import PlayerControl import IpyGameDataPY import ItemControler import ChPyNetSendPack import DataRecordPack import IPY_GameWorld import NetPackCommon import GameWorld import ChConfig def GetTemplateID(cfgID, dayIndex): if cfgID == None or dayIndex == None: return 0 ipyData = IpyGameDataPY.GetIpyGameData("ActCostRebate", cfgID) if not ipyData: return 0 templateIDList = ipyData.GetTemplateIDList() templateID = templateIDList[-1] if dayIndex >= len(templateIDList) else templateIDList[dayIndex] return templateID def OnPlayerLogin(curPlayer): for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_CostRebate, {}).values(): actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0) isReset = __CheckPlayerCostRebateAction(curPlayer, actNum) if not isReset: # »î¶¯ÖÐͬ²½»î¶¯ÐÅÏ¢ if actInfo.get(ShareDefine.ActKey_State): Sync_CostRebateActionInfo(curPlayer, actNum) Sync_CostRebateInfo(curPlayer, actNum) return def RefreshCostRebateActionInfo(actNum): ## ÊÕµ½GameServerͬ²½µÄ»î¶¯ÐÅÏ¢£¬Ë¢Ð»ÐÅÏ¢ playerManager = GameWorld.GetPlayerManager() for index in xrange(playerManager.GetPlayerCount()): curPlayer = playerManager.GetPlayerByIndex(index) if not GameWorld.IsNormalPlayer(curPlayer): continue __CheckPlayerCostRebateAction(curPlayer, actNum) return def __CheckPlayerCostRebateAction(curPlayer, actNum): ## ¼ì²éÍæ¼ÒÏû·Ñ·µÀû»î¶¯Êý¾ÝÐÅÏ¢ playerID = curPlayer.GetPlayerID() actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_CostRebate, actNum) actID = actInfo.get(ShareDefine.ActKey_ID, 0) state = actInfo.get(ShareDefine.ActKey_State, 0) playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateID % actNum) # Íæ¼ÒÉíÉϵĻID # »î¶¯ID ÏàͬµÄ»°²»´¦Àí if actID == playerActID: GameWorld.DebugLog("Ïû·Ñ·µÀû»î¶¯ID²»±ä£¬²»´¦Àí£¡actNum=%s,actID=%s" % (actNum, actID), curPlayer.GetPlayerID()) return actWorldLV = actInfo.get(ShareDefine.ActKey_WorldLV, 0) playerWorldLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateWorldLV % actNum) templateID = GetTemplateID(actInfo.get(ShareDefine.ActKey_CfgID, 0), actInfo.get(ShareDefine.ActKey_DayIndex, 0)) playerTemplateID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateTemplateID % actNum) GameWorld.DebugLog("Ïû·Ñ·µÀûÖØÖÃ! actNum=%s,actID=%s,playerActID=%s,state=%s,templateID=%s,playerTemplateID=%s" % (actNum, actID, playerActID, state, templateID, playerTemplateID), playerID) # δÁìÈ¡µÄ½±ÀøÓʼþ·¢·Å __SendCostRebateMail(curPlayer, playerTemplateID, playerWorldLV, actNum) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateID % actNum, actID) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateTemplateID % actNum, templateID) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateWorldLV % actNum, actWorldLV) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateGold % actNum, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateAwardRecord % actNum, 0) Sync_CostRebateActionInfo(curPlayer, actNum) Sync_CostRebateInfo(curPlayer, actNum) return True def __SendCostRebateMail(curPlayer, playerTemplateID, playerWorldLV, actNum): # δÁìÈ¡µÄ½±ÀøÓʼþ·¢·Å if not playerTemplateID: return costGold = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateGold % actNum) if not costGold: return ipyDataList = IpyGameDataPY.GetIpyGameDataList("CostRebateTemplate", playerTemplateID) if not ipyDataList: return job = curPlayer.GetJob() playerID = curPlayer.GetPlayerID() batchPlayerIDList, batchAddItemList, batchParamList = [], [], [] awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateAwardRecord % actNum) for ipyData in ipyDataList: awardIndex = ipyData.GetAwardIndex() if awardRecord & pow(2, awardIndex): continue needCostGold = ipyData.GetNeedCostGold() if costGold < needCostGold: continue awardRecord |= pow(2, awardIndex) awardItemList = __GetItemList(ipyData.GetAwardItemList(), job, playerWorldLV) batchPlayerIDList.append([playerID]) batchAddItemList.append(awardItemList) batchParamList.append([needCostGold]) if batchPlayerIDList: PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateAwardRecord % actNum, awardRecord) PlayerControl.SendMailBatch("ConsumptionRebateMail", batchPlayerIDList, batchAddItemList, batchParamList) return def __GetItemList(itemDict, job, worldLV): #{ÊÀ½çµÈ¼¶·¶Î§:[(ÎïÆ·ID,¸öÊý,ÊÇ·ñ°ó¶¨), ...]},ÈôÎïÆ·ID񻂿·ÖÖ°ÒµÔòÅä{ÊÀ½çµÈ¼¶·¶Î§:[({Ö°Òµ:ÎïÆ·ID,..},¸öÊý,ÊÇ·ñ°ó¶¨), ...]} itemList = [] itemInfoList = GameWorld.GetDictValueByRangeKey(itemDict, worldLV, []) for itemInfo in itemInfoList: if type(itemInfo[0]) == dict: itemID = itemInfo[0].get(job) if not itemID: GameWorld.ErrLog('ÀۼƳäÖµ½±ÀøÎ´ÅäÖøÃÖ°ÒµitemDict=%s,job=%s'%(itemDict, job)) continue else: itemID = itemInfo[0] itemList.append([itemID, itemInfo[1], itemInfo[2]]) return itemList def AddCostRebateGold(curPlayer, costType, costGold, infoDict): if costGold <= 0: return if costType in ChConfig.CostRebate_DisableType: GameWorld.DebugLog("²»¼ÆÈëÏû·Ñ·µÀûµÄÏû·ÑÀàÐÍ!costType=%s" % costType, curPlayer.GetPlayerID()) return for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_CostRebate, {}).values(): actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0) if not actInfo.get(ShareDefine.ActKey_State): GameWorld.DebugLog("Ïû·Ñ·µÀû»î¶¯µ±Ç°Î´¿ªÆô!actNum=%s" % actNum) continue actID = actInfo.get(ShareDefine.ActKey_ID) templateID = GetTemplateID(actInfo.get(ShareDefine.ActKey_CfgID, 0), actInfo.get(ShareDefine.ActKey_DayIndex, 0)) if not actID or not templateID: GameWorld.ErrLog("Ïû·Ñ·µÀû»î¶¯Êý¾ÝÒì³£!actNum=%s,actID=%s,templateID=%s" % (actNum, actID, templateID), curPlayer.GetPlayerID()) continue PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateID % actNum, actID) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateTemplateID % actNum, templateID) curCostGold = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateGold % actNum) updCostGold = curCostGold + costGold PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateGold % actNum, updCostGold) Sync_CostRebateInfo(curPlayer, actNum) GameWorld.DebugLog("Íæ¼ÒÏû·Ñ·µÀû»î¶¯: actNum=%s,actID=%s,templateID=%s,curCostGold=%s,costGold=%s,updCostGold=%s" % (actNum, actID, templateID, curCostGold, costGold, updCostGold), curPlayer.GetPlayerID()) return def OnGetCostRebateAward(curPlayer, awardIndex, actNum): ## ÁìÈ¡Ïû·Ñ·µÀû½±Àø actNum = GameWorld.ToIntDef(actNum, 0) if actNum <= 0: GameWorld.DebugLog("ûÓиû±àºÅ! actNum=%s" % actNum) return playerID = curPlayer.GetPlayerID() actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_CostRebate, actNum) costRebateID = actInfo.get(ShareDefine.ActKey_ID, 0) state = actInfo.get(ShareDefine.ActKey_State, 0) templateID = GetTemplateID(actInfo.get(ShareDefine.ActKey_CfgID, 0), actInfo.get(ShareDefine.ActKey_DayIndex, 0)) if not state or not templateID: GameWorld.DebugLog("ûÓÐÏû·Ñ·µÀû»î¶¯£¬ÎÞ·¨Áì½±£¡actNum=%s,state=%s,templateID=%s" % (actNum, state, templateID), playerID) return playerCostRebateID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateID % actNum) # Íæ¼ÒÉíÉϵĻID if costRebateID != playerCostRebateID: return awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateAwardRecord % actNum) if awardRecord & pow(2, awardIndex): GameWorld.DebugLog("ÒѾ­ÁìÈ¡¹ý¸ÃÏû·Ñ·µÀû»î¶¯½±Àø!actNum=%s,awardIndex=%s,awardRecord=%s" % (actNum, awardIndex, awardRecord), playerID) return ipyDataList = IpyGameDataPY.GetIpyGameDataList("CostRebateTemplate", templateID) if not ipyDataList: return awardIpyData = None for ipyData in ipyDataList: if ipyData.GetAwardIndex() == awardIndex: awardIpyData = ipyData break if not awardIpyData: GameWorld.DebugLog("ÕÒ²»µ½¸Ã·µÀû»î¶¯µµÎ»Ë÷Òý½±Àø!templateID=%s,awardIndex=%s" % (templateID, awardIndex), playerID) return needCostGold = awardIpyData.GetNeedCostGold() actWorldLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateWorldLV % actNum) awardItemList = __GetItemList(awardIpyData.GetAwardItemList(), curPlayer.GetJob(), actWorldLV) curCostGold = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateGold % actNum) if curCostGold < needCostGold: GameWorld.DebugLog("ËùÐèÏû·ÑÏÉÓñÊý²»×㣬ÎÞ·¨ÁìÈ¡!templateID=%s,awardIndex=%s,needCostGold=%s,curCostGold=%s" % (templateID, awardIndex, needCostGold, curCostGold), playerID) return if not ItemControler.CheckPackSpaceEnough(curPlayer, awardItemList): return awardRecord |= pow(2, awardIndex) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CostRebateAwardRecord % actNum, awardRecord) Sync_CostRebateInfo(curPlayer, actNum) notifyKey = awardIpyData.GetNotifyKey() if notifyKey: PlayerControl.WorldNotify(0, notifyKey, [curPlayer.GetPlayerName(), needCostGold]) for itemID, itemCount, _ in awardItemList: ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, 0, [IPY_GameWorld.rptItem]) addDataDict = {"TemplateID":templateID, "NeedCostGold":needCostGold, "AwardIndex":awardIndex, "ItemList":str(awardItemList), "ActNum":actNum} DataRecordPack.DR_FuncGiveItem(curPlayer, "CostRebateAward", addDataDict) return def Sync_CostRebateInfo(curPlayer, actNum): ## ֪ͨÏû·Ñ·µÀûÍæ¼ÒÊý¾ÝÐÅÏ¢ playerActInfo = ChPyNetSendPack.tagMCCostRebatePlayerInfo() playerActInfo.ActNum = actNum playerActInfo.CostGoldTotal = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateGold % actNum) playerActInfo.AwardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateAwardRecord % actNum) NetPackCommon.SendFakePack(curPlayer, playerActInfo) return def Sync_CostRebateActionInfo(curPlayer, actNum): ## ֪ͨÏû·Ñ·µÀû»î¶¯ÐÅÏ¢ actCostRebateInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_CostRebate, actNum) if not actCostRebateInfo: return if not actCostRebateInfo.get(ShareDefine.ActKey_State): return cfgID = actCostRebateInfo.get(ShareDefine.ActKey_CfgID) ipyData = IpyGameDataPY.GetIpyGameData("ActCostRebate", cfgID) if not ipyData: return templateIDList = ipyData.GetTemplateIDList() if not templateIDList: return job = curPlayer.GetJob() actWorldLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CostRebateWorldLV % actNum) startDateStr, endDateStr = GameWorld.GetOperationActionDateStr(ipyData) startDateSync = actCostRebateInfo.get(ShareDefine.ActKey_StartDateSync, startDateStr) actInfo = ChPyNetSendPack.tagMCCostRebateInfo() actInfo.ActNum = actNum actInfo.StartDate = startDateSync actInfo.EndtDate = endDateStr actInfo.LimitLV = ipyData.GetLVLimit() actInfo.IsDayReset = ipyData.GetIsDayReset() actInfo.AwardDayInfo = [] for templateID in templateIDList: ipyDataList = IpyGameDataPY.GetIpyGameDataList("CostRebateTemplate", templateID) if not ipyDataList: continue dayInfo = ChPyNetSendPack.tagMCCostRebateAwardDay() dayInfo.AwardInfo = [] for ipyData in ipyDataList: awardInfo = ChPyNetSendPack.tagMCCostRebateAward() awardInfo.AwardIndex = ipyData.GetAwardIndex() awardInfo.NeedGold = ipyData.GetNeedCostGold() awardInfo.AwardItem = [] for itemID, itemCount, isBind in __GetItemList(ipyData.GetAwardItemList(), job, actWorldLV): awardItem = ChPyNetSendPack.tagMCCostRebateAwardItem() awardItem.ItemID = itemID awardItem.ItemCount = itemCount awardItem.IsBind = isBind awardInfo.AwardItem.append(awardItem) awardInfo.AwardItemCount = len(awardInfo.AwardItem) dayInfo.AwardInfo.append(awardInfo) dayInfo.AwardCount = len(dayInfo.AwardInfo) actInfo.AwardDayInfo.append(dayInfo) actInfo.AwardDays = len(actInfo.AwardDayInfo) NetPackCommon.SendFakePack(curPlayer, actInfo) return