#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
#-------------------------------------------------------------------------------
|
#
|
##@package Player.PlayerGoldInvest
|
#
|
# @todo:Àí²ÆÍ¶×Ê
|
# @author xdh
|
# @date 2018-04-02
|
# @version 1.0
|
#
|
#
|
# ÏêϸÃèÊö: Àí²ÆÍ¶×Ê
|
#
|
#---------------------------------------------------------------------
|
#"""Version = 2018-04-02 10:30"""
|
#---------------------------------------------------------------------
|
|
import IpyGameDataPY
|
import NetPackCommon
|
import ChPyNetSendPack
|
import IPY_GameWorld
|
import PlayerControl
|
import GameWorld
|
import ChConfig
|
import ItemControler
|
import DataRecordPack
|
import PlayerFamilyRedPacket
|
|
import time
|
|
|
## »ñȡͶ×ÊÀí²ÆÍæ¼ÒÊý¾Ý¿â×ÖµäÐÅÏ¢Öµ
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @param key ×Öµäkey
|
# @param defaultValue ĬÈÏÖµ
|
# @return
|
def __GetPDictValue(curPlayer, key, defaultValue=0):
|
return curPlayer.NomalDictGetProperty(key, defaultValue, ChConfig.Def_PDictType_GoldInvest)
|
|
|
## ÉèÖÃͶ×ÊÀí²ÆÍæ¼ÒÊý¾Ý¿â×ÖµäÐÅÏ¢Öµ
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @param key ×Öµäkey
|
# @param value ÉèÖõÄÖµ
|
# @return
|
def __SetPDictValue(curPlayer, key, value):
|
PlayerControl.NomalDictSetProperty(curPlayer, key, value, ChConfig.Def_PDictType_GoldInvest)
|
return
|
|
|
## Ͷ×ÊÀí²ÆÍæ¼ÒµÇ¼´¦Àí
|
# @param curPlayer Íæ¼Ò
|
# @return
|
def OnLogin(curPlayer):
|
__CheckOldInvest(curPlayer)
|
for iType in ChConfig.GoldInvestTypeList:
|
Sync_GoldInvestInfo(curPlayer, iType)
|
return
|
|
|
## Ͷ×ÊÀí²ÆÍæ¼Ò¹ýÌì´¦Àí
|
# @param curPlayer Íæ¼Ò
|
# @return
|
def OnDay(curPlayer):
|
__CheckOldInvest(curPlayer)
|
#vipͶ×ʹýÁËÕû¸öÖÜÆÚÔòÖØÖÃ
|
__CheckInvestReset(curPlayer)
|
|
|
for iType in ChConfig.GoldInvestTypeList:
|
Sync_GoldInvestInfo(curPlayer, iType)
|
|
awardData = __GetInvestLVData(curPlayer)
|
__SetPDictValue(curPlayer, ChConfig.Def_PDict_GoldInvest_AwardData % ChConfig.GoldInvestType_VIP, awardData)
|
return
|
|
def __CheckInvestReset(curPlayer):
|
##¼ì²évipͶ×ÊÖØÖà ³¬¹ý28Ìì»ò28Ìì½±ÀøÒÑÁìÈ¡¿ÉÖØÖÃ
|
investType = ChConfig.GoldInvestType_VIP
|
investGoldRecord = __GetPDictValue(curPlayer, ChConfig.Def_PDict_GoldInvest_Gold % investType)
|
if not investGoldRecord:
|
return
|
curDay = __GetInvestCurDay(curPlayer, investType)
|
investMaxDayDict = IpyGameDataPY.GetFuncEvalCfg('InvestMaxDay')
|
maxDay = investMaxDayDict.get(str(investType), 0)
|
if curDay > maxDay or __GetPDictValue(curPlayer, ChConfig.Def_PDict_GoldInvest_GotRewardValue % (investType, maxDay)):
|
__SetPDictValue(curPlayer, ChConfig.Def_PDict_GoldInvest_Time % investType, 0)
|
__SetPDictValue(curPlayer, ChConfig.Def_PDict_GoldInvest_Gold % investType, 0)
|
for i in xrange(1, maxDay+1):
|
__SetPDictValue(curPlayer, ChConfig.Def_PDict_GoldInvest_GotRewardValue % (investType, i), 0)
|
Sync_GoldInvestInfo(curPlayer, investType, isForce=True)
|
return
|
|
def __CheckOldInvest(curPlayer):
|
#¾É°æ±¾Í¶×ʲ¹³¥
|
investType = ChConfig.GoldInvestType_VIP
|
investGoldRecord = __GetPDictValue(curPlayer, ChConfig.Def_PDict_GoldInvest_Gold % investType)
|
if investGoldRecord != 300:
|
return
|
maxDay = 28
|
curDay = __GetInvestCurDay(curPlayer, investType)
|
if curDay > maxDay:
|
return
|
if __GetPDictValue(curPlayer, ChConfig.Def_PDict_GoldInvest_GotRewardValue % (investType, curDay)):
|
sendDayList = range(curDay+1,maxDay+1)
|
else:
|
sendDayList = range(curDay, maxDay+1)
|
if sendDayList:
|
sendItemDict = {}
|
for day in sendDayList:
|
index = day%7
|
if index == 0:
|
index = 7
|
ipyData = IpyGameDataPY.GetIpyGameData('Invest', investType*100+index)
|
if not ipyData:
|
continue
|
itemList = ipyData.GetReward()['1']
|
for itemID, itemCnt, isBind in itemList:
|
sendItemDict[itemID] = sendItemDict.get(itemID, 0) + itemCnt
|
|
sendItemList = [(itemID, itemCnt, 1) for itemID, itemCnt in sendItemDict.items()]
|
PlayerControl.SendMailByKey('VIPInvest', [curPlayer.GetID()], sendItemList, [len(sendDayList)])
|
GameWorld.Log(' ¾É°æ±¾Í¶×ʲ¹³¥ sendDay=%s, sendItemList=%s'%(len(sendDayList), sendItemList), curPlayer.GetID())
|
|
__SetPDictValue(curPlayer, ChConfig.Def_PDict_GoldInvest_Time % investType, 0)
|
__SetPDictValue(curPlayer, ChConfig.Def_PDict_GoldInvest_Gold % investType, 0)
|
for i in xrange(1, maxDay+1):
|
__SetPDictValue(curPlayer, ChConfig.Def_PDict_GoldInvest_GotRewardValue % (investType, i), 0)
|
return
|
#// A5 40 Ͷ×ÊÀí²Æ #tagCMGoldInvest
|
#
|
#struct tagCMGoldInvest
|
#{
|
# tagHead Head;
|
# BYTE InvestType; // Ͷ×ÊÀàÐÍ
|
# DWORD InvestGold; // Ͷ×ʶî¶È
|
#};
|
## Ͷ×ÊÀí²Æ
|
# @param
|
# @return
|
def OnGoldInvest(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
investType = clientData.InvestType
|
investGold = clientData.InvestGold
|
|
GameWorld.DebugLog("Ͷ×ÊÀí²Æ£ºinvestType=%s,investGold=%s" % (investType, investGold))
|
investCostDict = IpyGameDataPY.GetFuncEvalCfg('InvestCost')
|
if str(investType) not in investCostDict:
|
return
|
costList = investCostDict[str(investType)]
|
if investGold not in costList:
|
GameWorld.DebugLog(' Ͷ×ÊÀí²Æ Ͷ×ʶî¶È²»´æÔÚ investGold=%s£¬ investType=%s'%(investGold, investType))
|
return
|
|
awardData = costList.index(investGold) + 1
|
if investType == ChConfig.GoldInvestType_VIP:
|
awardData = __GetInvestLVData(curPlayer)
|
needVIPLV = IpyGameDataPY.GetFuncCfg('VIPInvest', 2)
|
if curPlayer.GetVIPLv() < needVIPLV:
|
GameWorld.DebugLog(' Ͷ×ÊÀí²Æ ÐèÒªVIP%s'%(needVIPLV))
|
return
|
|
|
deductGold = investGold
|
investGoldRecord = __GetPDictValue(curPlayer, ChConfig.Def_PDict_GoldInvest_Gold % investType)
|
if investGoldRecord:
|
curDay = __GetInvestCurDay(curPlayer, investType)
|
#¿ÉÑ»·Í¶×Ê
|
if investType in ChConfig.CanRepeatInvestType:
|
# ÒÑͶ×ʹý£¬¼ì²éÌìÊýÊÇ·ñÒѽáÊø
|
investMaxDayDict = IpyGameDataPY.GetFuncEvalCfg('InvestMaxDay')
|
maxDay = investMaxDayDict.get(str(investType), 0)
|
if curDay < maxDay:
|
GameWorld.DebugLog(' »¹ÓÐͶ×ÊÌìÊýδÁìÈ¡£¡curDay=%s,maxDay=%s'%(curDay,maxDay))
|
return
|
if curDay == maxDay:
|
rewardRecord = __GetPDictValue(curPlayer, ChConfig.Def_PDict_GoldInvest_GotRewardValue % (investType, maxDay))
|
if not rewardRecord:
|
GameWorld.DebugLog(" »¹ÓÐδÁìÈ¡µÄͶ×ʻر¨£¬²»¿ÉͶ×Ê£¡investType=%s,rewardRecord=%s"
|
% (investType, rewardRecord))
|
return
|
|
|
# ²»¿ÉÑ»·Í¶×Ê£¬µ«¿É×·¼ÓͶ×Ê
|
elif investType in [ChConfig.GoldInvestType_Gold]:
|
if investGoldRecord >= investGold:
|
GameWorld.DebugLog(" ÒÑͶ×ʵµ´Î=%s >= ×·¼ÓͶ×ʵµ´Î=%s ,²»¿É×·¼ÓͶ×Ê£¡"
|
% (investGoldRecord, investGold))
|
return
|
|
deductGold = investGold - investGoldRecord # ×·¼ÓͶ×ÊÐèÒª¿Û³ýµÄ×êʯ
|
GameWorld.DebugLog(" ÒÑͶ×Ê=%s£¬×·¼ÓͶ×ÊÐè¿Û³ý=%s" % (investGoldRecord, deductGold))
|
else:
|
GameWorld.DebugLog(" investType = %s ÒÑͶ×ʹý£¬²»¿ÉÖØ¸´Í¶×Ê" % investType)
|
return
|
elif investType == ChConfig.GoldInvestType_Gold:
|
goldInvestLVLimit = IpyGameDataPY.GetFuncCfg('GoldInvestLVLimit')
|
if curPlayer.GetLV() > goldInvestLVLimit:
|
GameWorld.DebugLog(' ÏÉÓñͶ×ÊÀí²Æ µÈ¼¶²»ÄܸßÓÚ%s'%(goldInvestLVLimit))
|
return
|
|
__DoGoldInvest(curPlayer, investType, investGold, deductGold, awardData)
|
return
|
|
def __GetInvestCurDay(curPlayer, investType):
|
## »ñȡͶ×ʵ±Ç°µÚ¼¸Ìì
|
investTime = __GetPDictValue(curPlayer, ChConfig.Def_PDict_GoldInvest_Time % investType)
|
curTime = GameWorld.ChangeTimeStrToNum(GameWorld.GetCurrentDataTimeStr())
|
passTick = max(0, curTime - investTime)
|
return passTick / 3600 / 24 + 1
|
|
def __GetInvestLVData(curPlayer):
|
#vipͶ×Ê µ±Ç°ËùÊôµÈ¼¶·¶Î§
|
investLVDataDict = IpyGameDataPY.GetFuncEvalCfg('VIPInvest')
|
lv = curPlayer.GetLV()
|
for keyData, lvRange in investLVDataDict.items():
|
if lvRange[0] <=lv <= lvRange[1]:
|
return int(keyData)
|
return 0
|
|
## Ö´ÐÐͶ×ÊÀí²Æ
|
# @param
|
# @return
|
def __DoGoldInvest(curPlayer, investType, investGold, deductGold, awardData):
|
#¿Û×êʯ
|
infoDict = {"InvestType":investType, "DeductGold":deductGold, "InvestGold":investGold,
|
ChConfig.Def_Cost_Reason_SonKey:investType}
|
if not PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, deductGold,
|
ChConfig.Def_Cost_GoldInvest, infoDict):
|
return
|
#ºì°ü½±Àø
|
if investGold == deductGold:
|
redPacketID = IpyGameDataPY.GetFuncEvalCfg('InvestRedPackAward', 1, {}).get(investType, 0)
|
if redPacketID:
|
PlayerFamilyRedPacket.CreatRedPacketByID(curPlayer, redPacketID)
|
if investType == ChConfig.GoldInvestType_VIP:
|
PlayerControl.WorldNotify(0, 'VIPInvestmentRadio', [curPlayer.GetName()])
|
elif investType == ChConfig.GoldInvestType_Gold:
|
PlayerControl.WorldNotify(0, 'JadeInvestmentRadio', [curPlayer.GetName(), investGold])
|
|
# ¸üÐÂͶ×Êʱʱ¼ä£¬Í¶×ʽð¶î£¬ÖØÖûر¨¼Ç¼
|
curTime = GameWorld.GetCurrentTime()
|
curTimeNum = GameWorld.ChangeTimeStrToNum(str(curTime)[:10], ChConfig.TYPE_Time_Format_Day)
|
__SetPDictValue(curPlayer, ChConfig.Def_PDict_GoldInvest_Time % investType, curTimeNum)
|
__SetPDictValue(curPlayer, ChConfig.Def_PDict_GoldInvest_Gold % investType, investGold)
|
__SetPDictValue(curPlayer, ChConfig.Def_PDict_GoldInvest_AwardData % investType, awardData)
|
|
if investType in ChConfig.CanRepeatInvestType:
|
investMaxDayDict = IpyGameDataPY.GetFuncEvalCfg('InvestMaxDay')
|
maxDay = investMaxDayDict.get(str(investType), 0)
|
for i in xrange(1, maxDay+1):
|
__SetPDictValue(curPlayer, ChConfig.Def_PDict_GoldInvest_GotRewardValue % (investType, i), 0)
|
|
|
#EventShell.EventRespons_OnGoldInvest(curPlayer, investType)
|
# ͬ²½Í¶×ÊÐÅÏ¢
|
Sync_GoldInvestInfo(curPlayer, investType)
|
|
# Ͷ×ÊÈ«·þ¹ã²¥
|
|
GameWorld.DebugLog(" Ͷ×ʳɹ¦£¡¿Û³ý×êʯ=%s" % deductGold)
|
return
|
|
|
|
#// A5 41 ÁìȡͶ×ÊÀí²Æ»Ø±¨ #tagCMGetInvestReward
|
#
|
#struct tagCMGetInvestReward
|
#{
|
# tagHead Head;
|
# BYTE InvestType; // Ͷ×ÊÀàÐÍ
|
# BYTE RewardIndex; // »Ø±¨Ë÷Òý
|
#};
|
## ÁìȡͶ×ÊÀí²Æ»Ø±¨
|
# @param
|
# @return
|
def OnGetGoldInvestReward(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
investType = clientData.InvestType
|
rewardIndex = clientData.RewardIndex
|
ipyData = IpyGameDataPY.GetIpyGameData('Invest', investType*100+rewardIndex)
|
if not ipyData:
|
return
|
|
investGold = __GetPDictValue(curPlayer, ChConfig.Def_PDict_GoldInvest_Gold % investType)
|
|
GameWorld.DebugLog("ÁìȡͶ×ÊÀí²Æ»Ø±¨£ºinvestType=%s,investGold=%s,rewardIndex=%s"
|
% (investType, investGold, rewardIndex))
|
|
if not investGold:
|
GameWorld.DebugLog(" ¸ÃÀàÐÍûÓÐͶ×ʹý£¬ÎÞ·¨ÁìÈ¡»Ø±¨£¡investType=%s" % investType)
|
return
|
needLV = ipyData.GetNeedLV()
|
if curPlayer.GetLV() < needLV:
|
GameWorld.DebugLog(" µÈ¼¶²»¹»%s£¬ÎÞ·¨ÁìÈ¡»Ø±¨£¡investType=%s" % (needLV, investType))
|
return
|
|
needDay = ipyData.GetNeedDay()
|
if needDay:
|
curDay = __GetInvestCurDay(curPlayer, investType)
|
if needDay != curDay:
|
GameWorld.DebugLog(" ÎÞ·¨ÁìÈ¡»Ø±¨£¡ Ö»ÄÜÁìÈ¡µ±ÌìµÄ£¬curDay=%s£¬needDay=%s" % (curDay, needDay))
|
return
|
|
rewardDict = ipyData.GetReward()
|
awardData = __GetPDictValue(curPlayer, ChConfig.Def_PDict_GoldInvest_AwardData % investType, 1)
|
if str(awardData) not in rewardDict:
|
GameWorld.DebugLog(' ÁìȡͶ×ÊÀí²Æ»Ø±¨, rewardDict=%s, ûÓÐkey=%s'%(rewardDict, awardData))
|
return
|
rewardList = rewardDict[str(awardData)]
|
|
rewardItemList = rewardList # »Ø±¨ÎïÆ·Áбí
|
rewardValueKey = ChConfig.Def_PDict_GoldInvest_GotRewardValue % (investType, rewardIndex)
|
lastDayGotData = __GetPDictValue(curPlayer, rewardValueKey) # ÒÑÁìÈ¡Êý¾Ý
|
|
if lastDayGotData:
|
if investType == ChConfig.GoldInvestType_Gold:
|
if awardData > lastDayGotData:
|
lastGotAwardList = rewardDict[str(lastDayGotData)]
|
rewardItemList = []
|
for itemID, itemCnt, isBind in rewardList:
|
newCnt = itemCnt
|
for itemInfo in lastGotAwardList:
|
if itemID == itemInfo[0]:
|
newCnt = max(1,itemCnt - itemInfo[1])
|
break
|
rewardItemList.append([itemID, newCnt, isBind])
|
else:
|
GameWorld.DebugLog(' 11ÁìȡͶ×ÊÀí²Æ»Ø±¨, ÒÑÁìÈ¡¹ý£¡ investType=%s, rewardIndex=%s'%(investType, rewardIndex))
|
return
|
else:
|
GameWorld.DebugLog(' ÁìȡͶ×ÊÀí²Æ»Ø±¨, ÒÑÁìÈ¡¹ý£¡ investType=%s, rewardIndex=%s'%(investType, rewardIndex))
|
return
|
|
|
__SetPDictValue(curPlayer, rewardValueKey, awardData)
|
|
GameWorld.DebugLog(" ÁìȡͶ×ÊÀí²Æ»Ø±¨ rewardItemList=%s" % (rewardItemList))
|
if rewardItemList:
|
for itemID, itemCnt, isBind in rewardItemList:
|
ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, isBind, [IPY_GameWorld.rptItem, IPY_GameWorld.rptAnyWhere], True, showSysInfo=True)
|
|
__CheckInvestReset(curPlayer)
|
# ¼Ç¼Áìȡʼþ
|
DataRecordPack.DR_GetGoldInvestReward(curPlayer, investType, rewardIndex, rewardItemList)
|
|
Sync_GoldInvestInfo(curPlayer, investType, rewardIndex)
|
return
|
|
## ͬ²½Í¶×ÊÀí²ÆÐÅÏ¢
|
# @param
|
# @return
|
def Sync_GoldInvestInfo(curPlayer, investType, index=-1, isForce=False):
|
investGold = __GetPDictValue(curPlayer, ChConfig.Def_PDict_GoldInvest_Gold % investType)
|
if not isForce and not investGold:
|
return
|
investInfoPack = ChPyNetSendPack.tagMCGoldInvestInfo()
|
investInfoPack.Clear()
|
investInfoPack.InvestType = investType
|
investInfoPack.CurDay = __GetInvestCurDay(curPlayer, investType)
|
investInfoPack.InvestGold = investGold
|
investInfoPack.InvestRewardList = []
|
ipyGameDataList = IpyGameDataPY.GetIpyGameDataByCondition('Invest', {'Type':investType}, True)
|
|
if not ipyGameDataList:
|
return
|
for ipyData in ipyGameDataList:
|
rewardIndex = ipyData.GetID() % 100
|
if index !=-1 and rewardIndex != index:
|
continue
|
investReward = ChPyNetSendPack.tagMCInvestReward()
|
investReward.RewardIndex = rewardIndex
|
investReward.RewardValue = __GetPDictValue(curPlayer, ChConfig.Def_PDict_GoldInvest_GotRewardValue % (investType, rewardIndex))
|
investInfoPack.InvestRewardList.append(investReward)
|
investInfoPack.RewardRecordCnt = len(investInfoPack.InvestRewardList)
|
NetPackCommon.SendFakePack(curPlayer, investInfoPack)
|
return
|
|
|
|
|