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