#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package Player.PlayerGoldInvest # # @todo:Ͷ×Ê # @author hxp # @date 2025-11-10 # @version 1.0 # # ÏêϸÃèÊö: Ͷ×Ê # #------------------------------------------------------------------------------- #"""Version = 2025-11-10 20:30""" #------------------------------------------------------------------------------- import GameWorld import IpyGameDataPY import NetPackCommon import ChPyNetSendPack import ItemControler import PlayerControl import PlayerMail import ChConfig import time def OnLogin(curPlayer): for investType in ChConfig.InvestTypeList: if not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_InvestTime % investType): # ÓÐͶ×ʹý¾Íͬ²½ continue Sync_InvestInfo(curPlayer, investType) return def OnDay(curPlayer): dayAwardDict = IpyGameDataPY.GetFuncEvalCfg("InvestDay", 3, {}) for investType in ChConfig.InvestTypeList: if not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_InvestTime % investType): continue # ÿÈÕÏàͬ½±ÀøµÄ if str(investType) in dayAwardDict: __GiveUnGetPerDayReward(curPlayer, investType, dayAwardDict[str(investType)]) Sync_InvestInfo(curPlayer, investType) return def __GiveUnGetPerDayReward(curPlayer, investType, dayAwardItemList): ## ²¹·¢Î´ÁìÈ¡µÄÿÈÕ½±Àø£¬Ò»°ãÓÃÓÚ Ã¿ÈÕ¿ÉÁìÈ¡µÄ¹Ì¶¨½±Àø£¬ÈçÓÀ¾Ã¿¨µÈ if not dayAwardItemList: return playerID = curPlayer.GetPlayerID() lastRewardTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_InvestRewardTime % investType) if not lastRewardTime: investTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_InvestTime % investType) if not investTime: return lastRewardTime = investTime - 3600 * 24 # Èü¤»îµ±ÌìÒ²¿ÉÒÔÁì #GameWorld.DebugLog("´ÓδÁì½±¹ý") curTime = int(time.time()) passDays = GameWorld.GetDiff_Day(curTime, lastRewardTime) #GameWorld.DebugLog("²¹·¢½±ÀøÊ±£¬¾àÀëÉÏ´ÎÁì½±ÒѹýÌìÊý: %s" % passDays, playerID) if not GetInvestState(curPlayer, investType): rewardDays = passDays endTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_InvestEndTime % investType) if not endTime: return rewardDayMax = GameWorld.GetDiff_Day(endTime, lastRewardTime) if rewardDayMax <= 0: return GameWorld.DebugLog("ÒѹýÆÚ: ×î´ó»¹¿É½±ÀøÌìÊý: %s" % rewardDayMax, playerID) if rewardDays > rewardDayMax: rewardDays = rewardDayMax GameWorld.DebugLog("ÐÞÕý×î´ó»¹¿É²¹·¢µÄ½±ÀøÌìÊý: %s" % rewardDays, playerID) else: rewardDays = passDays - 1 # # ÐèÒª²¹·¢µÄ½±ÀøÌìÊý£¬Ö»²¹µ½×òÌ죬²»Ëãµ±Ìì GameWorld.DebugLog("δ¹ýÆÚ: rewardDays=%s" % rewardDays, playerID) if rewardDays <= 0: GameWorld.DebugLog("²»Óò¹·¢Í¶×Ê¿¨Ã¿ÈÕ½±Àø: investType=%s,rewardDays=%s" % (investType, rewardDays), playerID) return updRewardTime = curTime - 3600 * 24 # ×îºóÒ»´ÎÁì½±Ç¿ÖÆÉèÖõ½×òÌì mailItemList = [] for itemInfo in dayAwardItemList: itemID = itemInfo[0] itemCount = itemInfo[1] mailItemList.append([itemID, itemCount * rewardDays]) GameWorld.DebugLog("Óʼþ²¹·¢Í¶×Ê¿¨Ã¿ÈÕ½±Àø! investType=%s, rewardDays=%s, updRewardTime=%s, mailItemList=%s" % (investType, rewardDays, updRewardTime, mailItemList), playerID) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_InvestRewardTime % investType, updRewardTime) PlayerMail.SendMailByKey("InvestDayReward_%s" % investType, playerID, mailItemList, [rewardDays]) return def __GetInvestPassDays(curPlayer, investType): ## »ñȡͶ×ÊÒѹýÌìÊý£¬Í¶×ʵ±ÌìΪµÚÒ»Ì죬¼´´Ó 1 ¿ªÊ¼£» 0´ú±íδͶ×Ê investTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_InvestTime % investType) if not investTime: return 0 curTime = int(time.time()) return max(0, GameWorld.GetDiff_Day(curTime, investTime) + 1) def GetInvestState(curPlayer, investType): ## »ñȡͶ×Ê¿¨×´Ì¬ 0-δͶ×Ê£»1-Ͷ×ÊÉúЧÖУ» investTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_InvestTime % investType) if not investTime: return 0 endTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_InvestEndTime % investType) if endTime: # Óе½ÆÚʱ¼äµÄ¼ì²éµ½ÆÚ expiredDays = GameWorld.GetDiff_Day(int(time.time()), endTime) if expiredDays > 0: # ÒѹýÆÚ return 0 return 1 #// A5 40 Ͷ×ÊÀí²Æ #tagCMGoldInvest # #struct tagCMGoldInvest #{ # tagHead Head; # BYTE InvestType; // Ͷ×ÊÀàÐÍ # DWORD InvestGold; // Ͷ×ʶî¶È #}; def OnGoldInvest(index, clientData, tick): #curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) #investType = clientData.InvestType return def InvestByCTG(curPlayer, ctgID): ## ³äÖµÖ±¹ºÍ¶×Ê ctgInvestDict = IpyGameDataPY.GetFuncEvalCfg("InvestCost", 1, {}) for investType, ctgIDList in ctgInvestDict.items(): if ctgID in ctgIDList: DoLogicInvest(curPlayer, int(investType)) break return def DoLogicInvest(curPlayer, investType): ## Ö´ÐÐͶ×ÊÂß¼­ buyDaysDict = IpyGameDataPY.GetFuncEvalCfg("InvestDay", 1, {}) # ¹ºÂòÌìÊý buyDays = buyDaysDict.get(str(investType), 0) curState = GetInvestState(curPlayer, investType) GameWorld.DebugLog("¹ºÂòͶ×Ê: investType=%s,buyDays=%s,curState=%s" % (investType, buyDays, curState)) curTime = int(time.time()) # ÒѹýÆÚµÄÖØÖÃͶ×ÊÏà¹ØÊý¾Ý if not curState: PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_InvestTime % investType, curTime) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_InvestEndTime % investType, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_InvestRewardTime % investType, 0) # Ö§³ÖÖØ¸´¹ºÂò£¬ÀÛ¼Óµ½ÆÚʱ¼ä # ÓÀ¾Ã if buyDays <= 0: updEndTime = 0 # ÓÐÌìÊýÏÞÖÆ elif buyDays > 0: endTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_InvestEndTime % investType) if endTime > curTime: updEndTime = endTime + buyDays * 24 * 3600 GameWorld.Log(" ÀÛ¼Óʱ³¤: investType=%s,endTime=%s,updEndTime=%s" % (investType, GameWorld.ChangeTimeNumToStr(endTime), GameWorld.ChangeTimeNumToStr(updEndTime))) else: updEndTime = GameWorld.GetEndTimeByZeroTime(curTime, buyDays) GameWorld.Log(" ÖØÐ¼¤»î: investType=%s,updEndTime=%s" % (investType, GameWorld.ChangeTimeNumToStr(updEndTime))) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_InvestEndTime % investType, updEndTime) GameWorld.DebugLog("Ͷ×ÊÀí²Æ³É¹¦: investType=%s" % (investType)) Sync_InvestInfo(curPlayer, investType) return def GetAddFBCnt(curPlayer, mapID): ## »ñÈ¡Ôö¼ÓµÄ¸±±¾Ãâ·Ñ´ÎÊýÉÏÏÞ addFBCnt = 0 return addFBCnt def GetAddFBBuyCnt(curPlayer, mapID): ## »ñÈ¡Ôö¼ÓµÄ¸±±¾¹ºÂò´ÎÊýÉÏÏÞ addFBBuyCnt = 0 addFBBuyCntDict = IpyGameDataPY.GetFuncEvalCfg("InvestPower", 1, {}) for investType, fbMapIDAddDict in addFBBuyCntDict.items(): addCnt = fbMapIDAddDict.get(str(mapID), 0) if not addCnt: continue if not GetInvestState(curPlayer, int(investType)): continue addFBBuyCnt += addCnt return addFBBuyCnt def IsFBCntBuyFree(curPlayer, mapID): ## ¸±±¾¸¶·Ñ´ÎÊý¹ºÂòÃâ·Ñ freeSweepDict = IpyGameDataPY.GetFuncEvalCfg("InvestPower", 2, {}) for investType, fbMapIDList in freeSweepDict.items(): if mapID not in fbMapIDList: continue if not GetInvestState(curPlayer, int(investType)): continue return True return False def GetArenaTicketMax(curPlayer): ## ÑÝÎ䳡ÃÅÆ±ÉÏÏÞ addMax = 0 arenaCntDict = IpyGameDataPY.GetFuncEvalCfg("InvestPower", 3, {}) for investType, addCnt in arenaCntDict.items(): if not GetInvestState(curPlayer, int(investType)): continue addMax += addCnt return addMax #// A5 41 ÁìȡͶ×ÊÀí²Æ»Ø±¨ #tagCMGetInvestReward # #struct tagCMGetInvestReward #{ # tagHead Head; # BYTE InvestType; // Ͷ×ÊÀàÐÍ # BYTE RewardIndex; // »Ø±¨Ë÷Òý #}; def OnGetInvestReward(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) investType = clientData.InvestType rewardIndex = clientData.RewardIndex GameWorld.DebugLog("ÁìȡͶ×ÊÀí²Æ»Ø±¨£ºinvestType=%s,rewardIndex=%s" % (investType, rewardIndex)) if investType not in ChConfig.InvestTypeList: #GameWorld.DebugLog("²»´æÔÚ¸ÃͶ×ÊÀàÐÍ!") return if GetInvestState(curPlayer, investType) != 1: GameWorld.DebugLog(" δͶ×Ê»òÒѹýÆÚ£¬ÎÞ·¨Áì½±!") return curTime = int(time.time()) rewardItemList = [] # °´Ã¿Ìì¹Ì¶¨½±ÀøµÄ if rewardIndex == 0: lastRewardTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_InvestRewardTime % investType) if lastRewardTime: if GameWorld.GetDiff_Day(curTime, lastRewardTime) == 0: GameWorld.DebugLog(" ÒÑÁìÈ¡¹ý¸ÃË÷Òý½±Àø! rewardIndex=%s" % rewardIndex) return dayAwardDict = IpyGameDataPY.GetFuncEvalCfg("InvestDay", 3, {}) if str(investType) in dayAwardDict: rewardItemList = dayAwardDict[str(investType)] if not rewardItemList: return if rewardIndex == 0: PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_InvestRewardTime % (investType), int(time.time())) GameWorld.DebugLog("¸üÐÂÁì½±£ºinvestType=%s,rewardItemList=%s" % (investType, rewardItemList)) Sync_InvestInfo(curPlayer, investType) ItemControler.GivePlayerItemOrMail(curPlayer, rewardItemList, event=["Invest", False, {}]) return def __todayAwardState(curPlayer, investType): lastRewardTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_InvestRewardTime % investType) if lastRewardTime: if GameWorld.GetDiff_Day(int(time.time()), lastRewardTime) == 0: return 1 return 0 def Sync_InvestInfo(curPlayer, investType): clientPack = ChPyNetSendPack.tagSCInvestInfo() clientPack.InvestType = investType clientPack.InvestBuyTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_InvestTime % investType) clientPack.InvestEndTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_InvestEndTime % investType) clientPack.AwardState = __todayAwardState(curPlayer, investType) NetPackCommon.SendFakePack(curPlayer, clientPack) return