From 180eab3510f793ed008e9504976c3b3063f7ca6d Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 18 十一月 2025 18:21:52 +0800
Subject: [PATCH] 110 【主界面】仙树升级-服务端(免费减时修改为充能减时;特权支持充能额外上限;广告奖励支持领取充能奖励;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTree.py |  106 ++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 101 insertions(+), 5 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTree.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTree.py
index 906fea0..24f9521 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTree.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTree.py
@@ -20,9 +20,10 @@
 import NetPackCommon
 import IpyGameDataPY
 import ChPyNetSendPack
+import PlayerGoldInvest
 import PlayerControl
 import IPY_GameWorld
-#import PlayerTask
+import PlayerTask
 import ChConfig
 
 import time
@@ -30,8 +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):
     SyncTreeInfo(curPlayer)
     return
 
@@ -152,7 +162,7 @@
                        % (updLVUPRemainTime, treeLV, LVUPRemainTime, passSeconds, lastRefreshTime), curPlayer.GetPlayerID())
     return
 
-def ReduceTreeLVUPTime(curPlayer, reduceTime):
+def ReduceTreeLVUPTime(curPlayer, reduceTime, isNotify=True):
     ## 减少仙树升级剩余时间,可能是使用道具或其他功能等
     RefreshTreeLVUPTime(curPlayer)
     lvupState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLVUPState)
@@ -165,8 +175,92 @@
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeLVUPRemainTime, updLVUPRemainTime)
     GameWorld.DebugLog("减少仙树升级剩余时间! updLVUPRemainTime=%s,LVUPRemainTime=%s,reduceTime=%s" 
                        % (updLVUPRemainTime, LVUPRemainTime, reduceTime), curPlayer.GetPlayerID())
-    SyncTreeInfo(curPlayer)
+    if isNotify:
+        SyncTreeInfo(curPlayer)
     return True
+
+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 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("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
+    
+    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):
     ## 执行仙树升级
@@ -194,7 +288,7 @@
     GameWorld.DebugLog("执行仙树升级! updTreeLV=%s" % updTreeLV, playerID)
     SyncTreeInfo(curPlayer)
     
-    #PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_TreeLV)
+    PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_TreeLV)
     return True
 
 def SyncTreeInfo(curPlayer):
@@ -202,5 +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.Energy = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeEnergy)
+    clientPack.EnergyTimeLast = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeEnergyTimeLast)
     NetPackCommon.SendFakePack(curPlayer, clientPack)
     return

--
Gitblit v1.8.0