From ab4d62787cf6958470cecaaaf5758877e0a64c02 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 28 五月 2025 11:57:13 +0800
Subject: [PATCH] 54 【三国主界面】核心主体-服务端(仙树;增加货币41-战锤;42-结晶)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTree.py    |  206 +++++++++++++++++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini                  |   16 ++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py          |    8 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py          |  108 +++++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py      |   60 +++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py        |   29 +++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py      |    4 
 PySysDB/PySysDBPY.h                                                                         |   11 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py             |    6 
 10 files changed, 446 insertions(+), 4 deletions(-)

diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index 36eac91..4e8a348 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -3426,3 +3426,14 @@
 	DWORD		NeedQiyun;	//所需气运值
 	list		AwardItemList;	//奖励物品列表
 };
+
+//仙树等级表
+
+struct tagTreeLV
+{
+	BYTE		_TreeLV;	//仙树等级
+	DWORD		LVUPNeedMoney;	//升到下一级所需货币数
+	DWORD		LVUPNeedTime;	//升级下一级所需所需秒
+	list		EquipColorRateList;	//产出装备品质概率列表,[0品质万分率, 1品质万分率, ...]
+	list		ExAwardItemRateList;	//每次砍树概率额外产出道具饼图,[[万分率,[物品ID,个数]], ...]
+};
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
index d32fa65..e70362f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
@@ -2019,6 +2019,22 @@
 PacketSubCMD_2=0x11
 PacketCallFunc_2=OnMirrorFight
 
+;仙树
+[PlayerTree]
+ScriptName = Player\PlayerTree.py
+Writer = hxp
+Releaser = hxp
+RegType = 0
+RegisterPackCount = 2
+
+PacketCMD_1=0xB2
+PacketSubCMD_1=0x23
+PacketCallFunc_1=OnTreeLVUP
+
+PacketCMD_2=0xB2
+PacketSubCMD_2=0x24
+PacketCallFunc_2=OnUseTreeLVUPTimeItem
+
 ;福地
 [PlayerMineArea]
 ScriptName = Player\PlayerMineArea.py
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 9af8c62..c0ea223 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -4529,6 +4529,12 @@
 Def_PDict_CustomAwardCanGet = "CustomAwardCanGet_%s" # 是否可领取,参数(key编号)
 Def_PDict_CustomAwardGetState = "CustomAwardGetState_%s" # 是否已领取,参数(key编号)
 
+#仙树
+Def_PDict_TreeLV = "TreeLV" # 仙树等级,从1开始,代表1级
+Def_PDict_TreeLVUPState = "TreeLVUPState" # 仙树升级状态;0-未升级;1-升级中
+Def_PDict_TreeLVUPRemainTime = "TreeLVUPRemainTime" # 仙树升级剩余时间,秒
+Def_PDict_TreeLVUPRefreshTime = "TreeLVUPRefreshTime" # 仙树升级上次刷新时间戳
+
 #福地
 Def_PDict_MineWorkerCount = "MineWorkerCount" # 已雇佣工人数
 Def_PDict_MineWorkerEnergyUsed = "MineWorkerEnergyUsed" # 今日已消耗体力
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
index 6cefeb0..a8b7ed3 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -20967,6 +20967,114 @@
 
 
 #------------------------------------------------------
+# B2 23 仙树升级 #tagCMTreeLVUP
+
+class  tagCMTreeLVUP(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("Type", c_ubyte),    # 0-开始升级(请求扣除消耗,开始升级倒计时);1-执行升级(前端自行倒计时,时间到后发送该类型)
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xB2
+        self.SubCmd = 0x23
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.Cmd = 0xB2
+        self.SubCmd = 0x23
+        self.Type = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagCMTreeLVUP)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// B2 23 仙树升级 //tagCMTreeLVUP:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                Type:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.Type
+                                )
+        return DumpString
+
+
+m_NAtagCMTreeLVUP=tagCMTreeLVUP()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMTreeLVUP.Cmd,m_NAtagCMTreeLVUP.SubCmd))] = m_NAtagCMTreeLVUP
+
+
+#------------------------------------------------------
+# B2 24 使用仙树升级减时物品 #tagCMUseTreeLVUPTimeItem
+
+class  tagCMUseTreeLVUPTimeItem(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("UseCount", c_int),    # 使用个数
+                  ("IsAutoBuy", c_ubyte),    # 不足个数是否自动购买
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xB2
+        self.SubCmd = 0x24
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.Cmd = 0xB2
+        self.SubCmd = 0x24
+        self.UseCount = 0
+        self.IsAutoBuy = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagCMUseTreeLVUPTimeItem)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// B2 24 使用仙树升级减时物品 //tagCMUseTreeLVUPTimeItem:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                UseCount:%d,
+                                IsAutoBuy:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.UseCount,
+                                self.IsAutoBuy
+                                )
+        return DumpString
+
+
+m_NAtagCMUseTreeLVUPTimeItem=tagCMUseTreeLVUPTimeItem()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMUseTreeLVUPTimeItem.Cmd,m_NAtagCMUseTreeLVUPTimeItem.SubCmd))] = m_NAtagCMUseTreeLVUPTimeItem
+
+
+#------------------------------------------------------
 # B3 17 情戒解锁 #tagCMLoveRingUnlock
 
 class  tagCMLoveRingUnlock(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index e62228e..f520be2 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -56484,6 +56484,66 @@
 
 
 #------------------------------------------------------
+# B1 21 仙树信息 #tagMCTreeInfo
+
+class  tagMCTreeInfo(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("Cmd", c_ubyte),
+                  ("SubCmd", c_ubyte),
+                  ("TreeLV", c_ubyte),    # 当前仙树等级
+                  ("LVUPState", c_ubyte),    # 0-非升级中;1-升级中
+                  ("LVUPRemainTime", c_int),    # 升级剩余时间,秒;当升级中且倒计时为0时可发送B223执行升级包进行升级
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        self.Cmd = 0xB1
+        self.SubCmd = 0x21
+        return
+
+    def ReadData(self, stringData, _pos=0, _len=0):
+        self.Clear()
+        memmove(addressof(self), stringData[_pos:], self.GetLength())
+        return _pos + self.GetLength()
+
+    def Clear(self):
+        self.Cmd = 0xB1
+        self.SubCmd = 0x21
+        self.TreeLV = 0
+        self.LVUPState = 0
+        self.LVUPRemainTime = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCTreeInfo)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// B1 21 仙树信息 //tagMCTreeInfo:
+                                Cmd:%s,
+                                SubCmd:%s,
+                                TreeLV:%d,
+                                LVUPState:%d,
+                                LVUPRemainTime:%d
+                                '''\
+                                %(
+                                self.Cmd,
+                                self.SubCmd,
+                                self.TreeLV,
+                                self.LVUPState,
+                                self.LVUPRemainTime
+                                )
+        return DumpString
+
+
+m_NAtagMCTreeInfo=tagMCTreeInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCTreeInfo.Cmd,m_NAtagMCTreeInfo.SubCmd))] = m_NAtagMCTreeInfo
+
+
+#------------------------------------------------------
 # B1 16 累计消耗货币信息 #tagMCUseMoneyTotalInfo
 
 class  tagMCUseMoneyTotal(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index ce61680..0f88690 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -2639,6 +2639,14 @@
                         ("DWORD", "NeedQiyun", 0),
                         ("list", "AwardItemList", 0),
                         ),
+
+                "TreeLV":(
+                        ("BYTE", "TreeLV", 1),
+                        ("DWORD", "LVUPNeedMoney", 0),
+                        ("DWORD", "LVUPNeedTime", 0),
+                        ("list", "EquipColorRateList", 0),
+                        ("list", "ExAwardItemRateList", 0),
+                        ),
                 }
 
 
@@ -6606,6 +6614,19 @@
     def GetAwardIndex(self): return self.attrTuple[0] # 奖励索引 WORD
     def GetNeedQiyun(self): return self.attrTuple[1] # 所需气运值 DWORD
     def GetAwardItemList(self): return self.attrTuple[2] # 奖励物品列表 list
+
+# 仙树等级表
+class IPY_TreeLV():
+    
+    def __init__(self):
+        self.attrTuple = None
+        return
+        
+    def GetTreeLV(self): return self.attrTuple[0] # 仙树等级 BYTE
+    def GetLVUPNeedMoney(self): return self.attrTuple[1] # 升到下一级所需货币数 DWORD
+    def GetLVUPNeedTime(self): return self.attrTuple[2] # 升级下一级所需所需秒 DWORD
+    def GetEquipColorRateList(self): return self.attrTuple[3] # 产出装备品质概率列表,[0品质万分率, 1品质万分率, ...] list
+    def GetExAwardItemRateList(self): return self.attrTuple[4] # 每次砍树概率额外产出道具饼图,[[万分率,[物品ID,个数]], ...] list
 
 
 def Log(msg, playerID=0, par=0):
@@ -6934,6 +6955,7 @@
         self.__LoadFileData("Zhanling", onlyCheck)
         self.__LoadFileData("Xiangong", onlyCheck)
         self.__LoadFileData("TiandaoTree", onlyCheck)
+        self.__LoadFileData("TreeLV", onlyCheck)
         Log("IPY_DataMgr ReloadOK! onlyCheck=%s" % onlyCheck)
         return
     
@@ -9048,6 +9070,13 @@
     def GetTiandaoTreeByIndex(self, index):
         self.CheckLoadData("TiandaoTree")
         return self.ipyTiandaoTreeCache[index]
+
+    def GetTreeLVCount(self):
+        self.CheckLoadData("TreeLV")
+        return self.ipyTreeLVLen
+    def GetTreeLVByIndex(self, index):
+        self.CheckLoadData("TreeLV")
+        return self.ipyTreeLVCache[index]
 
 IPYData = IPY_DataMgr()
 def IPY_Data(): return IPYData
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
index 706101a..e5d973f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -154,7 +154,9 @@
 import PlayerShentong
 import PlayerCustomAward
 import PlayerZhanling
+import PlayerTree
 import PlayerLianTi
+#import PlayerTask
 import PlayerYinji
 import PlayerLove
 import GameObj
@@ -982,6 +984,8 @@
         PlayerGubao.OnPlayerLogin(curPlayer)
         PlayerShentong.OnPlayerLogin(curPlayer)
         PlayerZhanling.OnPlayerLogin(curPlayer)
+        #PlayerTask.OnPlayerLogin(curPlayer)
+        PlayerTree.OnPlayerLogin(curPlayer)
         PlayerMineArea.OnPlayerLogin(curPlayer)
         PlayerGuaji.OnPlayerLogin(curPlayer)
         PlayerActFamilyGCZ.OnPlayerLogin(curPlayer)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
index b8fffc1..3d2fbb1 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -3249,7 +3249,7 @@
                 GameWorld.Log("等价货币补足扣除: type_Price%s, price=%s, curCurrency=%s, lackPrice=%s, tagMoneyType=%s, tagMoneyValue=%s" 
                                    % (type_Price, price, curCurrency, lackPrice, tagMoneyType, tagMoneyValue), curPlayer.GetPlayerID())
             else:
-                #GameWorld.Log("没有等价货币,无法扣除")
+                GameWorld.DebugLog("货币不足! type_Price=%s,curCurrency=%s < %s" % (type_Price, curCurrency, price))
                 return False
         #有足够的钱支付
         SetPlayerCurrency(curPlayer, type_Price, curCurrency - lostMoney)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTree.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTree.py
new file mode 100644
index 0000000..906fea0
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTree.py
@@ -0,0 +1,206 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Player.PlayerTree
+#
+# @todo:仙树
+# @author hxp
+# @date 2025-05-28
+# @version 1.0
+#
+# 详细描述: 仙树
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2025-05-28 12:00"""
+#-------------------------------------------------------------------------------
+
+import GameWorld
+import ItemCommon
+import NetPackCommon
+import IpyGameDataPY
+import ChPyNetSendPack
+import PlayerControl
+import IPY_GameWorld
+#import PlayerTask
+import ChConfig
+
+import time
+
+def OnPlayerLogin(curPlayer):
+    treeLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLV)
+    if not treeLV:
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeLV, 1)
+    RefreshTreeLVUPTime(curPlayer)
+    SyncTreeInfo(curPlayer)
+    return
+
+#// B2 23 仙树升级 #tagCMTreeLVUP
+#
+#struct    tagCMTreeLVUP
+#{
+#    tagHead         Head;
+#    BYTE        Type;    // 0-开始升级(请求扣除消耗,开始升级倒计时);1-执行升级(倒计时时间到后发送该类型)
+#};
+def OnTreeLVUP(index, clientData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    upType = clientData.Type
+    if upType == 1:
+        if not DoTreeLVUP(curPlayer):
+            SyncTreeInfo(curPlayer)
+        return
+    
+    playerID = curPlayer.GetPlayerID()
+    lvupState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLVUPState)
+    if lvupState:
+        GameWorld.DebugLog("仙树已经在升级中! lvupState=%s" % lvupState, playerID)
+        return
+    
+    treeLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLV)
+    ipyData = IpyGameDataPY.GetIpyGameData("TreeLV", treeLV)
+    if not ipyData:
+        return
+    needMoney = ipyData.GetLVUPNeedMoney()
+    nextTreeLV = treeLV + 1
+    nextIpyData = IpyGameDataPY.GetIpyGameDataNotLog("TreeLV", nextTreeLV)
+    if needMoney <= 0 or not nextIpyData:
+        GameWorld.DebugLog("仙树已满级! treeLV=%s" % treeLV, playerID)
+        return
+    
+    moneyType = IpyGameDataPY.GetFuncCfg("TreeLVUP", 1)
+    if not PlayerControl.PayMoney(curPlayer, moneyType, needMoney, "TreeLVUP", {"treeLV":treeLV}):
+        return
+    needTime = ipyData.GetLVUPNeedTime()
+    
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeLVUPState, 1)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeLVUPRemainTime, needTime)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeLVUPRefreshTime, int(time.time()))
+    GameWorld.DebugLog("仙树请求开始升级! treeLV=%s,nextTreeLV=%s,needTime=%s" % (treeLV, nextTreeLV, needTime), playerID)
+    SyncTreeInfo(curPlayer)
+    return
+
+#// B2 24 使用仙树升级减时物品 #tagCMUseTreeLVUPTimeItem
+#
+#struct    tagCMUseTreeLVUPTimeItem
+#{
+#    tagHead         Head;
+#    DWORD        UseCount;    // 使用个数
+#    BYTE        IsAutoBuy;    // 不足个数是否自动购买
+#};
+def OnUseTreeLVUPTimeItem(index, clientData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    useCount = clientData.UseCount
+    isAutoBuy = clientData.IsAutoBuy
+    
+    playerID = curPlayer.GetPlayerID()
+    lvupState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLVUPState)
+    LVUPRemainTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLVUPRemainTime)
+    if not lvupState or not LVUPRemainTime:
+        GameWorld.DebugLog("仙树非升级中或剩余时间为0,不需要减少时间! lvupState=%s,LVUPRemainTime=%s" 
+                           % (lvupState, LVUPRemainTime), playerID)
+        return
+    
+    costItemID, reduceSeconds = IpyGameDataPY.GetFuncEvalCfg("TreeLVUP", 2)
+    GameWorld.DebugLog("使用仙树升级减时物品! costItemID=%s,reduceSeconds=%s,useCount=%s" % (costItemID, reduceSeconds, useCount), playerID)
+    if not costItemID or not useCount:
+        return
+    
+    costItemIndexList, bindCnt, unBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, costItemID, useCount)
+    lackCnt = useCount - bindCnt - unBindCnt
+    if lackCnt > 0 and not isAutoBuy:
+        GameWorld.DebugLog("消耗道具不足! costItemID=%s,useCount=%s,bindCnt=%s,unBindCnt=%s,lackCnt=%s" 
+                           % (costItemID, useCount, bindCnt, unBindCnt, lackCnt), playerID)
+        return
+    
+    delCnt = useCount
+    if lackCnt > 0:
+        moneyType = IPY_GameWorld.TYPE_Price_Gold_Money
+        lackCost = ItemCommon.GetAutoBuyItemNeedGold({costItemID:lackCnt})
+        if lackCost <= 0:
+            return
+        GameWorld.DebugLog("自动购买道具: lackCnt=%s,moneyType=%s,lackCost=%s" % (lackCnt, moneyType, lackCost), playerID)
+        infoDict = {ChConfig.Def_Cost_Reason_SonKey:costItemID}
+        if not PlayerControl.PayMoney(curPlayer, moneyType, lackCost, ChConfig.Def_Cost_BuyStoreItem, infoDict):
+            return
+        delCnt -= lackCnt
+        
+    # 扣除消耗
+    if delCnt:
+        ItemCommon.DelCostItemByBind(curPlayer, costItemIndexList, bindCnt, unBindCnt, delCnt, "TreeLVUPTimeItem")
+        
+    reduceTime = reduceSeconds * useCount
+    ReduceTreeLVUPTime(curPlayer, reduceTime)
+    return
+
+def RefreshTreeLVUPTime(curPlayer):
+    ## 刷新仙树升级剩余时间
+    lvupState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLVUPState)
+    LVUPRemainTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLVUPRemainTime)
+    if not lvupState or not LVUPRemainTime:
+        return
+    curTime = int(time.time())
+    lastRefreshTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLVUPRefreshTime)
+    if not lastRefreshTime:
+        lastRefreshTime = curTime
+    passSeconds = max(0, curTime - lastRefreshTime)
+    updLVUPRemainTime = max(0, LVUPRemainTime - passSeconds)
+    
+    treeLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLV)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeLVUPRemainTime, updLVUPRemainTime)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeLVUPRefreshTime, curTime)
+    GameWorld.DebugLog("刷新仙树升级剩余时间! updLVUPRemainTime=%s,treeLV=%s,LVUPRemainTime=%s,passSeconds=%s,lastRefreshTime=%s" 
+                       % (updLVUPRemainTime, treeLV, LVUPRemainTime, passSeconds, lastRefreshTime), curPlayer.GetPlayerID())
+    return
+
+def ReduceTreeLVUPTime(curPlayer, reduceTime):
+    ## 减少仙树升级剩余时间,可能是使用道具或其他功能等
+    RefreshTreeLVUPTime(curPlayer)
+    lvupState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLVUPState)
+    LVUPRemainTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLVUPRemainTime)
+    if not lvupState or not LVUPRemainTime:
+        GameWorld.DebugLog("仙树非升级中或剩余时间为0,不需要减少时间! lvupState=%s,LVUPRemainTime=%s" 
+                           % (lvupState, LVUPRemainTime), curPlayer.GetPlayerID())
+        return
+    updLVUPRemainTime = max(0, LVUPRemainTime - reduceTime)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeLVUPRemainTime, updLVUPRemainTime)
+    GameWorld.DebugLog("减少仙树升级剩余时间! updLVUPRemainTime=%s,LVUPRemainTime=%s,reduceTime=%s" 
+                       % (updLVUPRemainTime, LVUPRemainTime, reduceTime), curPlayer.GetPlayerID())
+    SyncTreeInfo(curPlayer)
+    return True
+
+def DoTreeLVUP(curPlayer):
+    ## 执行仙树升级
+    RefreshTreeLVUPTime(curPlayer)
+    playerID = curPlayer.GetPlayerID()
+    lvupState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLVUPState)
+    if not lvupState:
+        GameWorld.DebugLog("仙树非升级中,无法执行升级! lvupState=%s" % lvupState, playerID)
+        return
+    LVUPRemainTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLVUPRemainTime)
+    if LVUPRemainTime > 0:
+        GameWorld.DebugLog("仙树升级剩余时间未到,无法执行升级! LVUPRemainTime=%s" % LVUPRemainTime, playerID)
+        return
+    
+    treeLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLV)
+    updTreeLV = treeLV + 1
+    ipyData = IpyGameDataPY.GetIpyGameData("TreeLV", updTreeLV)
+    if not ipyData:
+        return
+    
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeLV, updTreeLV)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeLVUPState, 0)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeLVUPRemainTime, 0)
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreeLVUPRefreshTime, 0)
+    GameWorld.DebugLog("执行仙树升级! updTreeLV=%s" % updTreeLV, playerID)
+    SyncTreeInfo(curPlayer)
+    
+    #PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_TreeLV)
+    return True
+
+def SyncTreeInfo(curPlayer):
+    clientPack = ChPyNetSendPack.tagMCTreeInfo()
+    clientPack.TreeLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLV)
+    clientPack.LVUPState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLVUPState)
+    clientPack.LVUPRemainTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TreeLVUPRemainTime)
+    NetPackCommon.SendFakePack(curPlayer, clientPack)
+    return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index a2e5419..6f70ab5 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -1248,8 +1248,8 @@
 TYPE_Price_BTGMYuE = 38    # GM余额
 TYPE_Price_SuccessSocre = 39    # 成就积分
 TYPE_Price_FamilyFlagWarPoint = 40    # 万界积分
-TYPE_Price_Xiantao = 41    # 仙桃
-TYPE_Price_Lingyu = 42    # 灵玉
+TYPE_Price_Xiantao = 41    # 仙桃/战锤
+TYPE_Price_Lingyu = 42    # 灵玉/结晶
 TYPE_Price_BossTrial = 43    # boss历练凭证积分
 TYPE_Price_GatherSoul = 44    # 聚魂精华
 TYPE_Price_HorsePetTrainScore = 45    # 骑宠养成积分
@@ -1266,7 +1266,7 @@
                  1:"仙玉", 2:"绑玉", 3:"铜钱", 6:"战盟贡献度", 10:"战盟仓库积分", 13:"境界修行点", 14:"符印融合石", 15:"仙盟活跃令", 
                  16:"助战积分", 18:"荣誉", 19:"Boss积分", 23:"符印精华", 24:"符印碎片", 25:"寻宝积分", 26:"集市额度", 27:"丹精", 28:"魂尘", 
                  29:"聚魂碎片", 30:"核心环", 31:"功能特权令", 32:"环保值", 33:"GM令", 34:"古神币", 35:"功德点", 
-                 39:"成就积分", 40:"万界积分", 43:"凭证积分", 44:"聚魂精华", 45:"骑宠养成积分", 46:"古宝养成积分", 47:"天道果", 
+                 39:"成就积分", 40:"万界积分", 41:"战锤", 42:"结晶", 43:"凭证积分", 44:"聚魂精华", 45:"骑宠养成积分", 46:"古宝养成积分", 47:"天道果", 
                  49:"仙缘积分", 50:"幻境阁积分",
                  98:"代币时效", 99:"代币"
                  }
@@ -1302,6 +1302,8 @@
                            TYPE_Price_GuShenMoney:CDBPlayerRefresh_GuShenMoney,
                            TYPE_Price_GongdePoint:CDBPlayerRefresh_GongdePoint,
                            TYPE_Price_SuccessSocre:CDBPlayerRefresh_SuccessScore,
+                           TYPE_Price_Xiantao:CDBPlayerRefresh_Xiantao,
+                           TYPE_Price_Lingyu:CDBPlayerRefresh_Lingyu,
                            TYPE_Price_FamilyFlagWarPoint:CDBPlayerRefresh_FamilyFlagWarPoint,
                            TYPE_Price_BossTrial:CDBPlayerRefresh_BossTrial,
                            TYPE_Price_GatherSoul:CDBPlayerRefresh_GatherSoul,

--
Gitblit v1.8.0