110 【主界面】仙树升级-服务端(免费减时修改为充能减时;特权支持充能额外上限;广告奖励支持领取充能奖励;)
8个文件已修改
160 ■■■■ 已修改文件
PySysDB/PySysDBPY.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetTree.py 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGoldInvest.py 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTree.py 98 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/PySysDBPY.h
@@ -1099,6 +1099,7 @@
    BYTE        ADCntMax;    //每日次数
    list        ADAwardItemList;    //广告奖励物品列表
    DWORD        ADMapID;    //对应副本ID,默认给该副本1次次数
    BYTE        ADAwardType;    //其他奖励类型
};
//成就表
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3792,8 +3792,8 @@
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 + 秘笈等级
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -34818,8 +34818,8 @@
                  ("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):
@@ -34839,8 +34839,8 @@
        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):
@@ -34856,8 +34856,8 @@
                                TreeLV:%d,
                                LVUPState:%d,
                                LVUPRemainTime:%d,
                                FreeTimeCnt:%d,
                                FreeTimeLast:%d
                                Energy:%d,
                                EnergyTimeLast:%d
                                '''\
                                %(
                                self.Cmd,
@@ -34865,8 +34865,8 @@
                                self.TreeLV,
                                self.LVUPState,
                                self.LVUPRemainTime,
                                self.FreeTimeCnt,
                                self.FreeTimeLast
                                self.Energy,
                                self.EnergyTimeLast
                                )
        return DumpString
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetTree.py
@@ -31,9 +31,26 @@
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:
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -905,6 +905,7 @@
                        ("BYTE", "ADCntMax", 0),
                        ("list", "ADAwardItemList", 0),
                        ("DWORD", "ADMapID", 0),
                        ("BYTE", "ADAwardType", 0),
                        ),
                "Success":(
@@ -3503,7 +3504,8 @@
    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():
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -3219,7 +3219,7 @@
        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)
@@ -3377,14 +3377,15 @@
        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:
@@ -3393,6 +3394,9 @@
    if awardItemList:
        ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["ADAward", False, {}])
        
    # 领取祝福树充能奖励
    if adAwardType == 1:
        PlayerTree.GetTreeEnergyAward(curPlayer, False)
    return
def ADCntOnDay(curPlayer):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGoldInvest.py
@@ -215,6 +215,16 @@
        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
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTree.py
@@ -20,6 +20,7 @@
import NetPackCommon
import IpyGameDataPY
import ChPyNetSendPack
import PlayerGoldInvest
import PlayerControl
import IPY_GameWorld
import PlayerTask
@@ -30,13 +31,17 @@
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
@@ -174,34 +179,87 @@
        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):
@@ -238,7 +296,7 @@
    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