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