#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package Player.PlayerActSingleRecharge # # @todo:µ¥±ÊÀÛ³ä»î¶¯ # @author hxp # @date 2021-04-07 # @version 1.0 # # ÏêϸÃèÊö: µ¥±ÊÀÛ³ä»î¶¯ # #------------------------------------------------------------------------------- #"""Version = 2021-04-07 17:30""" #------------------------------------------------------------------------------- import PyGameData import ShareDefine import PlayerControl import IpyGameDataPY import ItemControler import ChPyNetSendPack import IPY_GameWorld import NetPackCommon import GameWorld import ChConfig import CommFunc def GetTemplateID(cfgID, dayIndex): if not cfgID or dayIndex == None: return 0 ipyData = IpyGameDataPY.GetIpyGameData("ActSingleRecharge", 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_SingleRecharge, {}).values(): actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0) isReset = __CheckPlayerSingleRechargeAction(curPlayer, actNum) if not isReset: # »î¶¯ÖÐͬ²½»î¶¯ÐÅÏ¢ if actInfo.get(ShareDefine.ActKey_State): Sync_SingleRechargeActionInfo(curPlayer, actNum) Sync_SingleRechargePlayerInfo(curPlayer, actNum) return def RefreshSingleRechargeActionInfo(actNum): ## ÊÕµ½GameServerͬ²½µÄ»î¶¯ÐÅÏ¢£¬Ë¢Ð»ÐÅÏ¢ playerManager = GameWorld.GetPlayerManager() for index in xrange(playerManager.GetPlayerCount()): curPlayer = playerManager.GetPlayerByIndex(index) if curPlayer.GetID() == 0: continue __CheckPlayerSingleRechargeAction(curPlayer, actNum) return def __CheckPlayerSingleRechargeAction(curPlayer, actNum): ## ¼ì²éÍæ¼Ò»î¶¯Êý¾ÝÐÅÏ¢ playerID = curPlayer.GetPlayerID() actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_SingleRecharge, actNum) actID = actInfo.get(ShareDefine.ActKey_ID, 0) state = actInfo.get(ShareDefine.ActKey_State, 0) playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SingleRechargeID % actNum) # Íæ¼ÒÉíÉϵĻID playerTemplateID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SingleRechargeTemplateID % actNum) templateID = GetTemplateID(actInfo.get(ShareDefine.ActKey_CfgID, 0), actInfo.get(ShareDefine.ActKey_DayIndex, 0)) # »î¶¯ID ÏàͬµÄ»°²»´¦Àí if actID == playerActID: GameWorld.DebugLog("µ¥±ÊÀÛ³ä»î¶¯ID²»±ä£¬²»´¦Àí£¡actNum=%s,actID=%s" % (actNum, actID), playerID) if state and templateID and templateID != playerTemplateID: PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SingleRechargeTemplateID % actNum, templateID) Sync_SingleRechargeActionInfo(curPlayer, actNum) Sync_SingleRechargePlayerInfo(curPlayer, actNum) GameWorld.DebugLog(" »î¶¯ÖиüÐÂÄ£°åID: templateID=%s" % templateID, playerID) return actWorldLV = actInfo.get(ShareDefine.ActKey_WorldLV, 0) playerWorldLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SingleRechargeWorldLV % actNum) GameWorld.DebugLog("µ¥±ÊÀÛ³äÖØÖÃ! actNum=%s,actID=%s,playerActID=%s,state=%s,templateID=%s,playerTemplateID=%s" % (actNum, actID, playerActID, state, templateID, playerTemplateID), playerID) # δÁìÈ¡µÄ½±ÀøÓʼþ·¢·Å __SendSingleRechargeMail(curPlayer, playerTemplateID, playerWorldLV, actNum) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SingleRechargeID % actNum, actID) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SingleRechargeTemplateID % actNum, templateID) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SingleRechargeWorldLV % actNum, actWorldLV) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SingleRechargeValue % actNum, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SingleRechargeAward % actNum, 0) Sync_SingleRechargeActionInfo(curPlayer, actNum) Sync_SingleRechargePlayerInfo(curPlayer, actNum) return True def __SendSingleRechargeMail(curPlayer, playerTemplateID, playerWorldLV, actNum): # δÁìÈ¡µÄ½±ÀøÓʼþ·¢·Å if not playerTemplateID: return canAwardValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SingleRechargeValue % actNum) if not canAwardValue: return ipyDataList = IpyGameDataPY.GetIpyGameDataList("ActSingleRechargeAward", playerTemplateID) if not ipyDataList: return playerID = curPlayer.GetPlayerID() batchPlayerIDList, batchAddItemList, batchParamList = [], [], [] awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SingleRechargeAward % actNum) for ipyData in ipyDataList: awardIndex = ipyData.GetAwardIndex() if awardRecord & pow(2, awardIndex): #GameWorld.DebugLog("µ¥±ÊÀÛ³äÒÑ·¢·Å¹ý½±Àø£¡awardIndex=%s" % awardIndex) continue singleValue = ipyData.GetSingleRechargeValue() if not canAwardValue & pow(2, awardIndex): #GameWorld.DebugLog("µ¥±ÊÀ۳䲻ÄÜÁì½±£¡awardIndex=%s" % awardIndex) continue awardRecord |= pow(2, awardIndex) awardItemList = GameWorld.GetDictValueByRangeKey(ipyData.GetAwardItem(), playerWorldLV, []) batchPlayerIDList.append([playerID]) batchAddItemList.append(awardItemList) batchParamList.append([singleValue]) if batchPlayerIDList: PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SingleRechargeAward % actNum, awardRecord) PlayerControl.SendMailBatch("SingleRechargeMail%s" % actNum, batchPlayerIDList, batchAddItemList, batchParamList) return def UpdSingleRechargeValue(curPlayer, curRechargeValue, coinType): if curRechargeValue <= 0: return for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_SingleRecharge, {}).values(): actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0) if not actInfo.get(ShareDefine.ActKey_State): GameWorld.DebugLog("µ¥±ÊÀÛ³ä»î¶¯µ±Ç°Î´¿ªÆô! actNum=%s" % actNum) continue cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0) if not cfgID: continue ipyData = IpyGameDataPY.GetIpyGameData("ActSingleRecharge", cfgID) if not ipyData: continue ctgTypeEffValue = ipyData.GetCTGTypeEffValue() if not ctgTypeEffValue & pow(2, coinType): GameWorld.DebugLog("µ¥±ÊÀÛ³ä³äÖµ»î¶¯£¬³äÖµÀàÐͶԸûÎÞЧ! actNum=%s,coinType=%s,ctgTypeEffValue=%s" % (actNum, coinType, ctgTypeEffValue), curPlayer.GetPlayerID()) continue templateID = GetTemplateID(actInfo.get(ShareDefine.ActKey_CfgID, 0), actInfo.get(ShareDefine.ActKey_DayIndex, 0)) if not templateID: GameWorld.ErrLog("µ¥±ÊÀÛ³ä³äÖµ»î¶¯Êý¾ÝÒì³£!cfgID=%s,templateID=%s" % (cfgID, templateID), curPlayer.GetPlayerID()) continue awardIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActSingleRechargeAward", templateID) if not awardIpyDataList: continue canAwardChange = False canAwardValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SingleRechargeValue % actNum) awardRuleType = ipyData.GetAwardRuleType() GameWorld.DebugLog("µ¥±ÊÀÛ³ä³äÖµ»î¶¯£¬actNum=%s,awardRuleType=%s,canAwardValue=%s,curRechargeValue=%s" % (actNum, awardRuleType, canAwardValue, curRechargeValue)) # ÏòϼæÈÝËùÓеµ´Î if awardRuleType == 0: for awardIpyData in awardIpyDataList: awardIndex = awardIpyData.GetAwardIndex() singleValue = CommFunc.RMBToCoin(awardIpyData.GetSingleRechargeValue()) if canAwardValue & pow(2, awardIndex): #GameWorld.DebugLog(" ÒѾ­¿ÉÁì½±£¬²»´¦Àí£¡awardRuleType=%s,awardIndex=%s" % (awardRuleType, awardIndex)) continue if curRechargeValue < singleValue: #GameWorld.DebugLog(" δ´ïµ½µµ´Î¶î¶È£¬²»´¦Àí£¡awardRuleType=%s,awardIndex=%s,singleValue=%s" # % (awardRuleType, awardIndex, singleValue)) continue canAwardChange = True canAwardValue |= pow(2, awardIndex) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SingleRechargeValue % actNum, canAwardValue) GameWorld.DebugLog(" ÉèÖõµ´Î¿ÉÁìÈ¡£¡awardRuleType=%s,awardIndex=%s,singleValue=%s,canAwardValue=%s" % (awardRuleType, awardIndex, singleValue, canAwardValue)) # Æ¥Åä×î¸ßµµ´Î elif awardRuleType == 1: for awardIpyData in awardIpyDataList[::-1]: awardIndex = awardIpyData.GetAwardIndex() singleValue = CommFunc.RMBToCoin(awardIpyData.GetSingleRechargeValue()) if canAwardValue & pow(2, awardIndex): #GameWorld.DebugLog(" ÒѾ­¿ÉÁì½±£¬²»´¦Àí£¡awardRuleType=%s,awardIndex=%s" % (awardRuleType, awardIndex)) continue if curRechargeValue < singleValue: #GameWorld.DebugLog(" δ´ïµ½µµ´Î¶î¶È£¬²»´¦Àí£¡awardRuleType=%s,awardIndex=%s,singleValue=%s" # % (awardRuleType, awardIndex, singleValue)) continue canAwardChange = True canAwardValue |= pow(2, awardIndex) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SingleRechargeValue % actNum, canAwardValue) GameWorld.DebugLog(" ÉèÖÃ×î¸ßµµ´Î¿ÉÁìÈ¡£¡awardRuleType=%s,awardIndex=%s,singleValue=%s,canAwardValue=%s" % (awardRuleType, awardIndex, singleValue, canAwardValue)) break # ¾«È·Æ¥Åä¶ÔÓ¦µµ´Î elif awardRuleType == 2: for awardIpyData in awardIpyDataList: awardIndex = awardIpyData.GetAwardIndex() singleValue = CommFunc.RMBToCoin(awardIpyData.GetSingleRechargeValue()) if curRechargeValue != singleValue: #GameWorld.DebugLog(" ²»µÈÓÚµµ´Î¶î¶È£¬²»´¦Àí£¡awardRuleType=%s,awardIndex=%s,singleValue=%s" # % (awardRuleType, awardIndex, singleValue)) continue if canAwardValue & pow(2, awardIndex): #GameWorld.DebugLog(" ÒѾ­¿ÉÁì½±£¬²»´¦Àí£¡awardRuleType=%s,awardIndex=%s" % (awardRuleType, awardIndex)) break canAwardChange = True canAwardValue |= pow(2, awardIndex) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SingleRechargeValue % actNum, canAwardValue) GameWorld.DebugLog(" ÉèÖþ«È·µµ´Î¿ÉÁìÈ¡£¡awardRuleType=%s,awardIndex=%s,singleValue=%s,canAwardValue=%s" % (awardRuleType, awardIndex, singleValue, canAwardValue)) break else: continue if not canAwardChange: continue Sync_SingleRechargePlayerInfo(curPlayer, actNum) # ÏßÏ»£¬¼ì²é·¢·Å½±Àø if ipyData.GetIsOfflineAct(): playerWorldLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SingleRechargeWorldLV % actNum) __SendSingleRechargeMail(curPlayer, templateID, playerWorldLV, actNum) return def OnGetSingleRechargeAward(curPlayer, awardIndex, actNum): '''ÁìÈ¡½±Àø @param awardIndex: ½±ÀøË÷Òý @param actNum: »î¶¯±àºÅ£¬Èç11 »ò 12 ´ú±í²»Í¬µÄ»î¶¯ ''' actNum = GameWorld.ToIntDef(actNum, 0) if actNum <= 0: GameWorld.DebugLog("ûÓÐÖ¸¶¨ÁìÈ¡µÄ»î¶¯±àºÅ! actNum=%s" % actNum) return playerID = curPlayer.GetPlayerID() actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_SingleRecharge, actNum) 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 awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SingleRechargeAward % actNum) if awardRecord & pow(2, awardIndex): GameWorld.DebugLog("ÒѾ­ÁìÈ¡¹ý¸Ãµ¥±ÊÀÛ³ä»î¶¯½±Àø! actNum=%s,awardIndex=%s" % (actNum, awardIndex), playerID) return ipyDataList = IpyGameDataPY.GetIpyGameDataList("ActSingleRechargeAward", templateID) if not ipyDataList: return awardIpyData = None for ipyData in ipyDataList: if ipyData.GetAwardIndex() == awardIndex: awardIpyData = ipyData break if not awardIpyData: GameWorld.DebugLog("ÕÒ²»µ½¸Ãµ¥±ÊÀÛ³ä»î¶¯µµÎ»Ë÷Òý½±Àø!actNum=%s,templateID=%s,awardIndex=%s" % (actNum, templateID, awardIndex), playerID) return singleValue = awardIpyData.GetSingleRechargeValue() canAwardValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SingleRechargeValue % actNum) if not canAwardValue & pow(2, awardIndex): GameWorld.DebugLog("¸Ãµµ´Î½±ÀøÎÞ·¨ÁìÈ¡! templateID=%s,awardIndex=%s,singleValue=%s,canAwardValue%s" % (templateID, awardIndex, singleValue, canAwardValue), playerID) return actWorldLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SingleRechargeWorldLV % actNum) awardItemList = GameWorld.GetDictValueByRangeKey(ipyData.GetAwardItem(), actWorldLV, []) if not ItemControler.CheckPackSpaceEnough(curPlayer, awardItemList): return awardRecord |= pow(2, awardIndex) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SingleRechargeAward % actNum, awardRecord) Sync_SingleRechargePlayerInfo(curPlayer, actNum) GameWorld.DebugLog(" ÁìÈ¡³É¹¦! actNum=%s,templateID=%s,awardIndex=%s,singleValue=%s,awardRecord=%s" % (actNum, templateID, awardIndex, singleValue, awardRecord)) notifyKey = awardIpyData.GetNotifyKey() if notifyKey: PlayerControl.WorldNotify(0, notifyKey, [curPlayer.GetPlayerName(), str(awardIpyData.GetSingleRechargeValue())]) for itemID, itemCount, isAuctionItem in awardItemList: ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, [IPY_GameWorld.rptItem], event=["SingleRechargeAward", False, {}]) return def Sync_SingleRechargePlayerInfo(curPlayer, actNum): ## Í¨ÖªÍæ¼ÒÊý¾ÝÐÅÏ¢ actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_SingleRecharge, actNum) if not actInfo.get(ShareDefine.ActKey_State): return cfgID = actInfo.get(ShareDefine.ActKey_CfgID) if not cfgID: return ipyData = IpyGameDataPY.GetIpyGameData("ActSingleRecharge", cfgID) if not ipyData: return if ipyData.GetIsOfflineAct(): #ÏßÏ»²»Ï·¢ return playerActInfo = ChPyNetSendPack.tagMCActSingleRechargePlayerInfo() playerActInfo.ActNum = actNum playerActInfo.CanAwardValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SingleRechargeValue % actNum) playerActInfo.AwardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SingleRechargeAward % actNum) NetPackCommon.SendFakePack(curPlayer, playerActInfo) return def Sync_SingleRechargeActionInfo(curPlayer, actNum): ## ֪ͨ»î¶¯ÐÅÏ¢ actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_SingleRecharge, actNum) if not actInfo.get(ShareDefine.ActKey_State): return cfgID = actInfo.get(ShareDefine.ActKey_CfgID) if not cfgID: return ipyData = IpyGameDataPY.GetIpyGameData("ActSingleRecharge", cfgID) if not ipyData: return if ipyData.GetIsOfflineAct(): #ÏßÏ»²»Ï·¢ return templateID = GetTemplateID(actInfo.get(ShareDefine.ActKey_CfgID, 0), actInfo.get(ShareDefine.ActKey_DayIndex, 0)) if not templateID: return actWorldLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SingleRechargeWorldLV % actNum) startDateStr, endDateStr = GameWorld.GetOperationActionDateStr(ipyData) clientPack = ChPyNetSendPack.tagMCActSingleRechargeInfo() clientPack.ActNum = actNum clientPack.StartDate = startDateStr clientPack.EndtDate = endDateStr clientPack.IsDayReset = ipyData.GetIsDayReset() clientPack.LimitLV = ipyData.GetLVLimit() clientPack.AwardRuleType = ipyData.GetAwardRuleType() clientPack.AwardInfo = [] ipyDataList = IpyGameDataPY.GetIpyGameDataList("ActSingleRechargeAward", templateID) if ipyDataList: for awardIpyData in ipyDataList: awardInfo = ChPyNetSendPack.tagMCActSingleRechargeAward() awardInfo.AwardIndex = awardIpyData.GetAwardIndex() awardInfo.SingleRechargeValue = CommFunc.RMBToCoin(awardIpyData.GetSingleRechargeValue()) awardInfo.AwardItem = [] awardItemList = GameWorld.GetDictValueByRangeKey(awardIpyData.GetAwardItem(), actWorldLV, []) for itemID, itemCount, isBind in awardItemList: awardItem = ChPyNetSendPack.tagMCActSingleRechargeAwardItem() awardItem.ItemID = itemID awardItem.ItemCount = itemCount awardItem.IsBind = isBind awardInfo.AwardItem.append(awardItem) awardInfo.AwardItemCount = len(awardInfo.AwardItem) clientPack.AwardInfo.append(awardInfo) clientPack.AwardCount = len(clientPack.AwardInfo) NetPackCommon.SendFakePack(curPlayer, clientPack) return