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 |   98 +++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 78 insertions(+), 20 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 ae4a7e6..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,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

--
Gitblit v1.8.0