#!/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
|