110 【主界面】仙树升级-服务端(免费减时修改为充能减时;特权支持充能额外上限;广告奖励支持领取充能奖励;)
| | |
| | | BYTE ADCntMax; //每日次数
|
| | | list ADAwardItemList; //广告奖励物品列表
|
| | | DWORD ADMapID; //对应副本ID,默认给该副本1次次数
|
| | | BYTE ADAwardType; //其他奖励类型
|
| | | };
|
| | |
|
| | | //成就表
|
| | |
| | | Def_PDict_TreeLVUPState = "TreeLVUPState" # 仙树升级状态;0-未升级;1-升级中
|
| | | Def_PDict_TreeLVUPRemainTime = "TreeLVUPRemainTime" # 仙树升级剩余时间,秒
|
| | | Def_PDict_TreeLVUPRefreshTime = "TreeLVUPRefreshTime" # 仙树升级上次刷新时间戳
|
| | | Def_PDict_TreeFreeTimeCnt = "TreeFreeTimeCnt" # 今日已领取免费减时次数,过天重置
|
| | | Def_PDict_TreeFreeTimeLast = "TreeFreeTimeLast" # 今日上次领取免费减时时间戳,过天重置
|
| | | Def_PDict_TreeEnergy = "TreeEnergy" # 当前可用充能次数
|
| | | Def_PDict_TreeEnergyTimeLast = "TreeEnergyTimeLast" # 上次获得免费充能次数时间戳
|
| | |
|
| | | #历练秘笈
|
| | | Def_PDict_LLMJLVInfo = "LLMJLVInfo" # 秘笈等级,消耗战锤*100 + 秘笈等级
|
| | |
| | | ("TreeLV", c_ubyte), # 当前仙树等级
|
| | | ("LVUPState", c_ubyte), # 0-非升级中;1-升级中
|
| | | ("LVUPRemainTime", c_int), # 升级剩余时间,秒;当升级中且倒计时为0时可发送B223执行升级包进行升级
|
| | | ("FreeTimeCnt", c_ubyte), # 今日已免费减时次数
|
| | | ("FreeTimeLast", c_int), # 上次免费减时时间戳
|
| | | ("Energy", c_ubyte), # 当前累计充能次数
|
| | | ("EnergyTimeLast", c_int), # 上次获得充能次数时间戳
|
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | |
| | | self.TreeLV = 0
|
| | | self.LVUPState = 0
|
| | | self.LVUPRemainTime = 0
|
| | | self.FreeTimeCnt = 0
|
| | | self.FreeTimeLast = 0
|
| | | self.Energy = 0
|
| | | self.EnergyTimeLast = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | |
| | | TreeLV:%d,
|
| | | LVUPState:%d,
|
| | | LVUPRemainTime:%d,
|
| | | FreeTimeCnt:%d,
|
| | | FreeTimeLast:%d
|
| | | Energy:%d,
|
| | | EnergyTimeLast:%d
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | |
| | | self.TreeLV,
|
| | | self.LVUPState,
|
| | | self.LVUPRemainTime,
|
| | | self.FreeTimeCnt,
|
| | | self.FreeTimeLast
|
| | | self.Energy,
|
| | | self.EnergyTimeLast
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
| | | def OnExec(curPlayer, cmdList):
|
| | | if not cmdList:
|
| | | GameWorld.DebugAnswer(curPlayer, "设置仙树: SetTree 等级 剩余时间秒")
|
| | | GameWorld.DebugAnswer(curPlayer, "充能次数: SetTree e 次数 [已累计分钟]")
|
| | | return
|
| | |
|
| | | treeLV = cmdList[0]
|
| | | if treeLV == "e":
|
| | | energy = cmdList[1] if len(cmdList) > 1 else 0
|
| | | energyTime = cmdList[2] if len(cmdList) > 2 else 0
|
| | | energyTime *= 60
|
| | | energyMax = PlayerTree.GetTreeEnergyMax(curPlayer)
|
| | | if energy >= energyMax:
|
| | | energy = energyMax
|
| | | timeLast = 0
|
| | | else:
|
| | | timeLast = int(time.time()) - energyTime
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeEnergy, energy)
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeEnergyTimeLast, timeLast)
|
| | | GameWorld.DebugAnswer(curPlayer, "充能次数:%s/%s,累计秒:%s" % (energy, energyMax, energyTime))
|
| | | PlayerTree.SyncTreeInfo(curPlayer)
|
| | | return
|
| | | |
| | | remainTime = cmdList[1] if len(cmdList) > 1 else 0
|
| | | ipyData = IpyGameDataPY.GetIpyGameData("TreeLV", treeLV)
|
| | | if not ipyData:
|
| | |
| | | ("BYTE", "ADCntMax", 0),
|
| | | ("list", "ADAwardItemList", 0),
|
| | | ("DWORD", "ADMapID", 0),
|
| | | ("BYTE", "ADAwardType", 0),
|
| | | ),
|
| | |
|
| | | "Success":(
|
| | |
| | | def GetADID(self): return self.attrTuple[0] # DWORD
|
| | | def GetADCntMax(self): return self.attrTuple[1] # 每日次数 BYTE
|
| | | def GetADAwardItemList(self): return self.attrTuple[2] # 广告奖励物品列表 list
|
| | | def GetADMapID(self): return self.attrTuple[3] # 对应副本ID,默认给该副本1次次数 DWORD |
| | | def GetADMapID(self): return self.attrTuple[3] # 对应副本ID,默认给该副本1次次数 DWORD
|
| | | def GetADAwardType(self): return self.attrTuple[4] # 其他奖励类型 BYTE |
| | | |
| | | # 成就表 |
| | | class IPY_Success(): |
| | |
| | | PlayerSuccess.GetSuccessAward(curPlayer, dataEx)
|
| | | # 仙树免费减时
|
| | | elif rewardType == ChConfig.Def_RewardType_TreeFreeTime:
|
| | | PlayerTree.FreeReduceTreeLVTime(curPlayer)
|
| | | PlayerTree.FreeReduceTreeLVTime(curPlayer, dataEx)
|
| | | # 广告奖励
|
| | | elif rewardType == ChConfig.Def_RewardType_ADAward:
|
| | | OnGetADAward(curPlayer, dataEx)
|
| | |
| | | return
|
| | | adCntMax = ipyData.GetADCntMax()
|
| | | adCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ADCnt % adID)
|
| | | if adCnt >= adCntMax:
|
| | | if adCntMax and adCnt >= adCntMax:
|
| | | GameWorld.DebugLog("今日该广告奖励已达上限! adID=%s,adCnt=%s > %s" % (adID, adCnt, adCntMax))
|
| | | return
|
| | | adCnt += 1
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ADCnt % adID, adCnt)
|
| | | awardItemList = ipyData.GetADAwardItemList()
|
| | | adMapID = ipyData.GetADMapID()
|
| | | GameWorld.DebugLog("领取广告奖励! adID=%s,adCnt=%s,adMapID=%s,awardItemList=%s" % (adID, adCnt, adMapID, awardItemList))
|
| | | adAwardType = ipyData.GetADAwardType()
|
| | | GameWorld.DebugLog("领取广告奖励! adID=%s,adCnt=%s,adMapID=%s,adAwardType=%s,awardItemList=%s" % (adID, adCnt, adMapID, adAwardType, awardItemList))
|
| | | SyncADCntInfo(curPlayer, [adID])
|
| | |
|
| | | if adMapID:
|
| | |
| | | if awardItemList:
|
| | | ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["ADAward", False, {}])
|
| | |
|
| | | # 领取祝福树充能奖励
|
| | | if adAwardType == 1:
|
| | | PlayerTree.GetTreeEnergyAward(curPlayer, False)
|
| | | return
|
| | |
|
| | | def ADCntOnDay(curPlayer):
|
| | |
| | | addMax += addCnt
|
| | | return addMax
|
| | |
|
| | | def GetTreeEnergyAdd(curPlayer):
|
| | | ## 祝福树能量额外上限
|
| | | addMax = 0
|
| | | arenaCntDict = IpyGameDataPY.GetFuncEvalCfg("InvestPower", 4, {})
|
| | | for investType, addCnt in arenaCntDict.items():
|
| | | if not GetInvestState(curPlayer, int(investType)):
|
| | | continue
|
| | | addMax += addCnt
|
| | | return addMax
|
| | |
|
| | | #// A5 41 领取投资理财回报 #tagCMGetInvestReward
|
| | | #
|
| | | #struct tagCMGetInvestReward
|
| | |
| | | import NetPackCommon
|
| | | import IpyGameDataPY
|
| | | import ChPyNetSendPack
|
| | | import PlayerGoldInvest
|
| | | import PlayerControl
|
| | | import IPY_GameWorld
|
| | | import PlayerTask
|
| | |
| | | def OnPlayerLogin(curPlayer):
|
| | | treeLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLV)
|
| | | if not treeLV:
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeLV, 1)
|
| | | treeLV = 1
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeLV, treeLV)
|
| | | energyInit = IpyGameDataPY.GetFuncCfg("TreeEnergy", 1)
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeEnergy, energyInit)
|
| | | GameWorld.DebugLog("初始仙树等级: treeLV=%s,energyInit=%s" % (treeLV, energyInit))
|
| | | RefreshTreeEnergyTime(curPlayer)
|
| | | RefreshTreeLVUPTime(curPlayer)
|
| | | SyncTreeInfo(curPlayer)
|
| | | return
|
| | |
|
| | | def PlayerOnDay(curPlayer):
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeFreeTimeCnt, 0)
|
| | | SyncTreeInfo(curPlayer)
|
| | | return
|
| | |
|
| | |
| | | SyncTreeInfo(curPlayer)
|
| | | return True
|
| | |
|
| | | def FreeReduceTreeLVTime(curPlayer):
|
| | | ## 仙树免费减时
|
| | | dailyFreeCntMax = IpyGameDataPY.GetFuncCfg("TreeLVUP", 3)
|
| | | freeCDSeconds = IpyGameDataPY.GetFuncCfg("TreeLVUP", 4) * 60 # 免费CD,秒
|
| | | |
| | | freeTimeCntToday = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeFreeTimeCnt)
|
| | | freeTimeLast = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeFreeTimeLast)
|
| | | |
| | | if dailyFreeCntMax and freeTimeCntToday >= dailyFreeCntMax:
|
| | | GameWorld.DebugLog("已达今日免费仙树减时次数! freeTimeCntToday=%s >= %s" % (freeTimeCntToday, dailyFreeCntMax))
|
| | | def GetTreeEnergyMax(curPlayer):
|
| | | energyMax = IpyGameDataPY.GetFuncCfg("TreeEnergy", 2)
|
| | | energyMax += PlayerGoldInvest.GetTreeEnergyAdd(curPlayer)
|
| | | return energyMax
|
| | |
|
| | | def RefreshTreeEnergyTime(curPlayer):
|
| | | ## 刷新充能时间
|
| | | energy = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeEnergy)
|
| | | energyMax = GetTreeEnergyMax(curPlayer)
|
| | | if energy >= energyMax:
|
| | | return
|
| | | energyTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeEnergyTimeLast)
|
| | | updEnergy = energy
|
| | | updEnergyTime = energyTime
|
| | |
|
| | | curTime = int(time.time())
|
| | | if freeCDSeconds and freeTimeLast and (curTime - freeTimeLast) < freeCDSeconds:
|
| | | GameWorld.DebugLog("免费仙树减时CD未到! passSeconds=%s < %s" % (curTime - freeTimeLast, freeCDSeconds))
|
| | | if not updEnergyTime:
|
| | | updEnergyTime = curTime
|
| | | |
| | | passSeconds = max(0, curTime - updEnergyTime)
|
| | | energyCDSeconds = IpyGameDataPY.GetFuncCfg("TreeEnergy", 3) * 60 # 免费CD,秒
|
| | | addEnergy = passSeconds / energyCDSeconds
|
| | | if addEnergy > 0:
|
| | | updEnergy += addEnergy
|
| | | if updEnergy >= energyMax:
|
| | | updEnergy = energyMax
|
| | | updEnergyTime = 0
|
| | | else:
|
| | | updEnergyTime = curTime - passSeconds % energyCDSeconds
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeEnergy, updEnergy)
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeEnergyTimeLast, updEnergyTime)
|
| | | GameWorld.DebugLog("仙树充能时间刷新! energy=%s,energyTime=%s,addEnergy=%s,updEnergy=%s/%s,updEnergyTime=%s" |
| | | % (energy, energyTime, addEnergy, updEnergy, energyMax, updEnergyTime), curPlayer.GetPlayerID())
|
| | | return
|
| | |
|
| | | def GetTreeEnergyAward(curPlayer, useMoney=False):
|
| | | ## 领取充能奖励,可消耗货币或广告
|
| | | |
| | | GameWorld.DebugLog("领取祝福树充能奖励! useMoney=%s" % useMoney)
|
| | | |
| | | energy = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeEnergy)
|
| | | if energy <= 0:
|
| | | GameWorld.DebugLog("没有充能减时次数!")
|
| | | return
|
| | |
|
| | | reduceTime = IpyGameDataPY.GetFuncCfg("TreeLVUP", 5) * 60
|
| | | reduceTime = IpyGameDataPY.GetFuncCfg("TreeEnergy", 4) * 60
|
| | | if reduceTime <= 0:
|
| | | return
|
| | |
|
| | | if useMoney:
|
| | | moneyType, moneyValue = IpyGameDataPY.GetFuncEvalCfg("TreeEnergy", 5)
|
| | | if not PlayerControl.HaveMoney(curPlayer, moneyType, moneyValue):
|
| | | return
|
| | | |
| | | if not ReduceTreeLVUPTime(curPlayer, reduceTime, False):
|
| | | return
|
| | |
|
| | | freeTimeCntToday += 1
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeFreeTimeCnt, freeTimeCntToday)
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeFreeTimeLast, curTime)
|
| | | if useMoney:
|
| | | if not PlayerControl.PayMoney(curPlayer, moneyType, moneyValue, "TreeEnergy"):
|
| | | return
|
| | | |
| | | energyMax = GetTreeEnergyMax(curPlayer)
|
| | | if energy == energyMax:
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeEnergyTimeLast, int(time.time()))
|
| | | GameWorld.DebugLog("重新开始充能倒计时!")
|
| | | |
| | | energy -= 1
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeEnergy, energy)
|
| | | GameWorld.DebugLog("领取能量OK剩余能量: %s/%s" % (energy, energyMax))
|
| | | SyncTreeInfo(curPlayer)
|
| | | return
|
| | |
|
| | | def FreeReduceTreeLVTime(curPlayer, opType=1):
|
| | | ## 仙树领取充能减时
|
| | | |
| | | # 刷新累计充能次数
|
| | | if opType == 1:
|
| | | RefreshTreeEnergyTime(curPlayer)
|
| | | SyncTreeInfo(curPlayer)
|
| | | return
|
| | | GetTreeEnergyAward(curPlayer, True)
|
| | | return
|
| | |
|
| | | def DoTreeLVUP(curPlayer):
|
| | |
| | | clientPack.TreeLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLV)
|
| | | clientPack.LVUPState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLVUPState)
|
| | | clientPack.LVUPRemainTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLVUPRemainTime)
|
| | | clientPack.FreeTimeCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeFreeTimeCnt)
|
| | | clientPack.FreeTimeLast = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeFreeTimeLast)
|
| | | clientPack.Energy = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeEnergy)
|
| | | clientPack.EnergyTimeLast = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeEnergyTimeLast)
|
| | | NetPackCommon.SendFakePack(curPlayer, clientPack)
|
| | | return
|