From d62c2e3c0866e07a52de9166dfd63f9aef6fe9ac Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 12 一月 2023 16:49:00 +0800
Subject: [PATCH] 9762 【BT8】【后端】藏宝阁

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGubao.py |  242 ++++++++++++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini                |   20 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py    |  112 +++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py      |   87 +++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py    |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Gubao.py  |   77 ++++++
 PySysDB/PySysDBPY.h                                                                       |   33 ++
 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py                         |  112 +++++++++
 8 files changed, 685 insertions(+), 0 deletions(-)

diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h
index d4c9c66..8619b3e 100644
--- a/PySysDB/PySysDBPY.h
+++ b/PySysDB/PySysDBPY.h
@@ -429,6 +429,39 @@
 	DWORD		SkinValidTime;	//有效时长秒
 };
 
+//古宝表
+
+struct tagGubao
+{
+	WORD		_GubaoID;	//古宝ID
+	BYTE		GubaoQuality;	//古宝品质
+	DWORD		UnlockItemID;	//解锁所需物品ID
+	BYTE		UnlockItemCnt;	//解锁所需物品数量
+	list		GiveSkillIDInfo;	//获得职业技能ID
+};
+
+//古宝升星表
+
+struct tagGubaoStar
+{
+	WORD		_GubaoID;	//古宝ID
+	BYTE		_GubaoStar;	//古宝星级
+	list		StarUPNeedItemInfo;	//升星所需物品 [[物品ID,个数], ...]
+	list		StarAttrTypeList;	//星级属性类型列表
+	list		StarAttrValueList;	//星级属性值列表
+};
+
+//古宝品质升级表
+
+struct tagGubaoLV
+{
+	BYTE		_GubaoQuality;	//古宝品质
+	BYTE		_GubaoLV;	//古宝等级
+	list		LVUPNeedItemInfo;	//升级所需物品 [[物品ID,个数], ...]
+	list		LVAttrTypeList;	//等级属性类型列表
+	list		LVAttrValueList;	//等级属性值列表
+};
+
 //玩家等级表
 
 struct tagPlayerLV
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
index f7d12aa..c0c0ffb 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -20745,6 +20745,118 @@
 
 
 #------------------------------------------------------
+# A3 C7 古宝信息 #tagMCGubaoInfo
+
+class  tagMCGubao(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("GubaoID", c_ushort),    
+                  ("GubaoStar", c_ubyte),    
+                  ("GubaoLV", c_ubyte),    
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        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.GubaoID = 0
+        self.GubaoStar = 0
+        self.GubaoLV = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCGubao)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// A3 C7 古宝信息 //tagMCGubaoInfo:
+                                GubaoID:%d,
+                                GubaoStar:%d,
+                                GubaoLV:%d
+                                '''\
+                                %(
+                                self.GubaoID,
+                                self.GubaoStar,
+                                self.GubaoLV
+                                )
+        return DumpString
+
+
+class  tagMCGubaoInfo(Structure):
+    Head = tagHead()
+    Count = 0    #(BYTE Count)
+    GubaoInfoList = list()    #(vector<tagMCGubao> GubaoInfoList)
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xA3
+        self.Head.SubCmd = 0xC7
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.Count):
+            temGubaoInfoList = tagMCGubao()
+            _pos = temGubaoInfoList.ReadData(_lpData, _pos)
+            self.GubaoInfoList.append(temGubaoInfoList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xA3
+        self.Head.SubCmd = 0xC7
+        self.Count = 0
+        self.GubaoInfoList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        for i in range(self.Count):
+            length += self.GubaoInfoList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.Count)
+        for i in range(self.Count):
+            data = CommFunc.WriteString(data, self.GubaoInfoList[i].GetLength(), self.GubaoInfoList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                Count:%d,
+                                GubaoInfoList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.Count,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCGubaoInfo=tagMCGubaoInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCGubaoInfo.Head.Cmd,m_NAtagMCGubaoInfo.Head.SubCmd))] = m_NAtagMCGubaoInfo
+
+
+#------------------------------------------------------
 # A3 28 历史累积充值奖励领取记录 #tagMCHistoryReChargeAwardRecord
 
 class  tagMCHistoryReChargeAwardRecord(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
index 3999fca..6a46b12 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
@@ -1757,6 +1757,26 @@
 PacketSubCMD_7=0x18
 PacketCallFunc_7=OnLoveRingUp
 
+;古宝
+[PlayerGubao]
+ScriptName = Player\PlayerGubao.py
+Writer = hxp
+Releaser = hxp
+RegType = 0
+RegisterPackCount = 3
+
+PacketCMD_1=0xB2
+PacketSubCMD_1=0x16
+PacketCallFunc_1=OnGubaoActivate
+
+PacketCMD_2=0xB2
+PacketSubCMD_2=0x17
+PacketCallFunc_2=OnGubaoStarUp
+
+PacketCMD_3=0xB2
+PacketSubCMD_3=0x18
+PacketCallFunc_3=OnGubaoLVUp
+
 ;缥缈仙域
 [PlayerFairyDomain]
 ScriptName = Player\PlayerFairyDomain.py
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
index f7d12aa..c0c0ffb 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -20745,6 +20745,118 @@
 
 
 #------------------------------------------------------
+# A3 C7 古宝信息 #tagMCGubaoInfo
+
+class  tagMCGubao(Structure):
+    _pack_ = 1
+    _fields_ = [
+                  ("GubaoID", c_ushort),    
+                  ("GubaoStar", c_ubyte),    
+                  ("GubaoLV", c_ubyte),    
+                  ]
+
+    def __init__(self):
+        self.Clear()
+        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.GubaoID = 0
+        self.GubaoStar = 0
+        self.GubaoLV = 0
+        return
+
+    def GetLength(self):
+        return sizeof(tagMCGubao)
+
+    def GetBuffer(self):
+        return string_at(addressof(self), self.GetLength())
+
+    def OutputString(self):
+        DumpString = '''// A3 C7 古宝信息 //tagMCGubaoInfo:
+                                GubaoID:%d,
+                                GubaoStar:%d,
+                                GubaoLV:%d
+                                '''\
+                                %(
+                                self.GubaoID,
+                                self.GubaoStar,
+                                self.GubaoLV
+                                )
+        return DumpString
+
+
+class  tagMCGubaoInfo(Structure):
+    Head = tagHead()
+    Count = 0    #(BYTE Count)
+    GubaoInfoList = list()    #(vector<tagMCGubao> GubaoInfoList)
+    data = None
+
+    def __init__(self):
+        self.Clear()
+        self.Head.Cmd = 0xA3
+        self.Head.SubCmd = 0xC7
+        return
+
+    def ReadData(self, _lpData, _pos=0, _Len=0):
+        self.Clear()
+        _pos = self.Head.ReadData(_lpData, _pos)
+        self.Count,_pos = CommFunc.ReadBYTE(_lpData, _pos)
+        for i in range(self.Count):
+            temGubaoInfoList = tagMCGubao()
+            _pos = temGubaoInfoList.ReadData(_lpData, _pos)
+            self.GubaoInfoList.append(temGubaoInfoList)
+        return _pos
+
+    def Clear(self):
+        self.Head = tagHead()
+        self.Head.Clear()
+        self.Head.Cmd = 0xA3
+        self.Head.SubCmd = 0xC7
+        self.Count = 0
+        self.GubaoInfoList = list()
+        return
+
+    def GetLength(self):
+        length = 0
+        length += self.Head.GetLength()
+        length += 1
+        for i in range(self.Count):
+            length += self.GubaoInfoList[i].GetLength()
+
+        return length
+
+    def GetBuffer(self):
+        data = ''
+        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
+        data = CommFunc.WriteBYTE(data, self.Count)
+        for i in range(self.Count):
+            data = CommFunc.WriteString(data, self.GubaoInfoList[i].GetLength(), self.GubaoInfoList[i].GetBuffer())
+        return data
+
+    def OutputString(self):
+        DumpString = '''
+                                Head:%s,
+                                Count:%d,
+                                GubaoInfoList:%s
+                                '''\
+                                %(
+                                self.Head.OutputString(),
+                                self.Count,
+                                "..."
+                                )
+        return DumpString
+
+
+m_NAtagMCGubaoInfo=tagMCGubaoInfo()
+ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCGubaoInfo.Head.Cmd,m_NAtagMCGubaoInfo.Head.SubCmd))] = m_NAtagMCGubaoInfo
+
+
+#------------------------------------------------------
 # A3 28 历史累积充值奖励领取记录 #tagMCHistoryReChargeAwardRecord
 
 class  tagMCHistoryReChargeAwardRecord(Structure):
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Gubao.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Gubao.py
new file mode 100644
index 0000000..99d6be2
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Gubao.py
@@ -0,0 +1,77 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package GM.Commands.Gubao
+#
+# @todo:古宝
+# @author hxp
+# @date 2023-01-5
+# @version 1.0
+#
+# 详细描述: 古宝
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2023-01-5 15:30"""
+#-------------------------------------------------------------------------------
+
+import GameWorld
+import IpyGameDataPY
+import PlayerGubao
+
+#---------------------------------------------------------------------
+#逻辑实现
+
+## GM命令执行入口
+#  @param curPlayer 当前玩家
+#  @param msgList 参数列表
+#  @return None
+#  @remarks 函数详细说明.
+def OnExec(curPlayer, msgList):
+    
+    if not msgList:
+        GameWorld.DebugAnswer(curPlayer, "重置古宝: Gubao 0")
+        GameWorld.DebugAnswer(curPlayer, "设置古宝: Gubao 古宝ID 等级 星级")
+        return
+    
+    gubaoIDList = []
+    
+    if len(msgList) == 1:
+        if msgList[0] == 0:
+            ipyDataMgr = IpyGameDataPY.IPY_Data()
+            for index in range(ipyDataMgr.GetGubaoCount()):
+                ipyData = ipyDataMgr.GetGubaoByIndex(index)
+                gubaoID = ipyData.GetGubaoID()
+                _, star = PlayerGubao.GetGubaoLVInfo(curPlayer, gubaoID)
+                if not star:
+                    continue
+                gubaoIDList.append(gubaoID)
+                PlayerGubao.SetGubaoLVInfo(curPlayer, gubaoID, 0, 0)
+            GameWorld.DebugAnswer(curPlayer, "重置古宝OK")
+            
+    elif len(msgList) == 3:
+        gubaoID, lv, star = msgList
+        ipyData = IpyGameDataPY.GetIpyGameData("Gubao", gubaoID)
+        if not ipyData:
+            GameWorld.DebugAnswer(curPlayer, "不存在该古宝!gubaoID=%s" % gubaoID)
+            return
+        starIpyData = IpyGameDataPY.GetIpyGameData("GubaoStar", gubaoID, star)
+        if not starIpyData:
+            GameWorld.DebugAnswer(curPlayer, "不存在该古宝星级!gubaoID=%s,star=%s" % (gubaoID, star))
+            return
+        quality = ipyData.GetGubaoQuality()
+        lvIpyData = IpyGameDataPY.GetIpyGameData("GubaoLV", quality, lv)
+        if not lvIpyData:
+            GameWorld.DebugAnswer(curPlayer, "不存在该古宝品质等级!gubaoID=%s,quality=%s,lv=%s" % (gubaoID, quality, lv))
+            return
+        GameWorld.DebugAnswer(curPlayer, "设置古宝:%s,等级(%s),星(%s)" % (gubaoID, lv, star))
+        PlayerGubao.SetGubaoLVInfo(curPlayer, gubaoID, lv, star)
+        gubaoIDList.append(gubaoID)
+    else:
+        return
+    
+    PlayerGubao.RefreshGubaoAttr(curPlayer)
+    PlayerGubao.Sync_GubaoInfo(curPlayer, gubaoIDList)
+    return
+
+
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
index 118aaf8..224c57c 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -357,6 +357,30 @@
                         ("DWORD", "SkinValidTime", 0),
                         ),
 
+                "Gubao":(
+                        ("WORD", "GubaoID", 1),
+                        ("BYTE", "GubaoQuality", 0),
+                        ("DWORD", "UnlockItemID", 0),
+                        ("BYTE", "UnlockItemCnt", 0),
+                        ("list", "GiveSkillIDInfo", 0),
+                        ),
+
+                "GubaoStar":(
+                        ("WORD", "GubaoID", 1),
+                        ("BYTE", "GubaoStar", 1),
+                        ("list", "StarUPNeedItemInfo", 0),
+                        ("list", "StarAttrTypeList", 0),
+                        ("list", "StarAttrValueList", 0),
+                        ),
+
+                "GubaoLV":(
+                        ("BYTE", "GubaoQuality", 1),
+                        ("BYTE", "GubaoLV", 1),
+                        ("list", "LVUPNeedItemInfo", 0),
+                        ("list", "LVAttrTypeList", 0),
+                        ("list", "LVAttrValueList", 0),
+                        ),
+
                 "PlayerLV":(
                         ("WORD", "LV", 1),
                         ("DWORD", "ExpPoint", 0),
@@ -2719,6 +2743,57 @@
     def GetInitFightPower(self): return self.InitFightPower # 皮肤额外战力
     def GetHorseID(self): return self.HorseID # 对应坐骑ID
     def GetSkinValidTime(self): return self.SkinValidTime # 有效时长秒
+
+# 古宝表
+class IPY_Gubao():
+    
+    def __init__(self):
+        self.GubaoID = 0
+        self.GubaoQuality = 0
+        self.UnlockItemID = 0
+        self.UnlockItemCnt = 0
+        self.GiveSkillIDInfo = []
+        return
+        
+    def GetGubaoID(self): return self.GubaoID # 古宝ID
+    def GetGubaoQuality(self): return self.GubaoQuality # 古宝品质
+    def GetUnlockItemID(self): return self.UnlockItemID # 解锁所需物品ID
+    def GetUnlockItemCnt(self): return self.UnlockItemCnt # 解锁所需物品数量
+    def GetGiveSkillIDInfo(self): return self.GiveSkillIDInfo # 获得职业技能ID
+
+# 古宝升星表
+class IPY_GubaoStar():
+    
+    def __init__(self):
+        self.GubaoID = 0
+        self.GubaoStar = 0
+        self.StarUPNeedItemInfo = []
+        self.StarAttrTypeList = []
+        self.StarAttrValueList = []
+        return
+        
+    def GetGubaoID(self): return self.GubaoID # 古宝ID
+    def GetGubaoStar(self): return self.GubaoStar # 古宝星级
+    def GetStarUPNeedItemInfo(self): return self.StarUPNeedItemInfo # 升星所需物品 [[物品ID,个数], ...]
+    def GetStarAttrTypeList(self): return self.StarAttrTypeList # 星级属性类型列表
+    def GetStarAttrValueList(self): return self.StarAttrValueList # 星级属性值列表
+
+# 古宝品质升级表
+class IPY_GubaoLV():
+    
+    def __init__(self):
+        self.GubaoQuality = 0
+        self.GubaoLV = 0
+        self.LVUPNeedItemInfo = []
+        self.LVAttrTypeList = []
+        self.LVAttrValueList = []
+        return
+        
+    def GetGubaoQuality(self): return self.GubaoQuality # 古宝品质
+    def GetGubaoLV(self): return self.GubaoLV # 古宝等级
+    def GetLVUPNeedItemInfo(self): return self.LVUPNeedItemInfo # 升级所需物品 [[物品ID,个数], ...]
+    def GetLVAttrTypeList(self): return self.LVAttrTypeList # 等级属性类型列表
+    def GetLVAttrValueList(self): return self.LVAttrValueList # 等级属性值列表
 
 # 玩家等级表
 class IPY_PlayerLV():
@@ -6339,6 +6414,12 @@
         self.ipyHorseTrainLen = len(self.ipyHorseTrainCache)
         self.ipyHorseSkinPlusCache = self.__LoadFileData("HorseSkinPlus", IPY_HorseSkinPlus)
         self.ipyHorseSkinPlusLen = len(self.ipyHorseSkinPlusCache)
+        self.ipyGubaoCache = self.__LoadFileData("Gubao", IPY_Gubao)
+        self.ipyGubaoLen = len(self.ipyGubaoCache)
+        self.ipyGubaoStarCache = self.__LoadFileData("GubaoStar", IPY_GubaoStar)
+        self.ipyGubaoStarLen = len(self.ipyGubaoStarCache)
+        self.ipyGubaoLVCache = self.__LoadFileData("GubaoLV", IPY_GubaoLV)
+        self.ipyGubaoLVLen = len(self.ipyGubaoLVCache)
         self.ipyPlayerLVCache = self.__LoadFileData("PlayerLV", IPY_PlayerLV)
         self.ipyPlayerLVLen = len(self.ipyPlayerLVCache)
         self.ipySpecMapPlayerAttrFormatCache = self.__LoadFileData("SpecMapPlayerAttrFormat", IPY_SpecMapPlayerAttrFormat)
@@ -6917,6 +6998,12 @@
     def GetHorseTrainByIndex(self, index): return self.ipyHorseTrainCache[index]
     def GetHorseSkinPlusCount(self): return self.ipyHorseSkinPlusLen
     def GetHorseSkinPlusByIndex(self, index): return self.ipyHorseSkinPlusCache[index]
+    def GetGubaoCount(self): return self.ipyGubaoLen
+    def GetGubaoByIndex(self, index): return self.ipyGubaoCache[index]
+    def GetGubaoStarCount(self): return self.ipyGubaoStarLen
+    def GetGubaoStarByIndex(self, index): return self.ipyGubaoStarCache[index]
+    def GetGubaoLVCount(self): return self.ipyGubaoLVLen
+    def GetGubaoLVByIndex(self, index): return self.ipyGubaoLVCache[index]
     def GetPlayerLVCount(self): return self.ipyPlayerLVLen
     def GetPlayerLVByIndex(self, index): return self.ipyPlayerLVCache[index]
     def GetSpecMapPlayerAttrFormatCount(self): return self.ipySpecMapPlayerAttrFormatLen
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 b19df79..711c996 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -144,6 +144,7 @@
 import PlayerFB
 import PlayerFaQi
 import SkillShell
+import PlayerGubao
 import PlayerLianTi
 import PlayerYinji
 import PlayerLove
@@ -910,6 +911,7 @@
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_RealLoginOK, 1)
     GameWorld.Log("MapServer->DoPlayerRealLoginOK", curPlayer.GetPlayerID())
     
+    PlayerGubao.OnPlayerLogin(curPlayer)
     # 上线查询一次充值订单
     curPlayer.SendDBQueryRecharge()
     
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGubao.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGubao.py
new file mode 100644
index 0000000..9e4e3c8
--- /dev/null
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGubao.py
@@ -0,0 +1,242 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package Player.PlayerGubao
+#
+# @todo:古宝系统
+# @author hxp
+# @date 2023-01-05
+# @version 1.0
+#
+# 详细描述: 古宝系统
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2023-01-05 15:30"""
+#-------------------------------------------------------------------------------
+
+import GameWorld
+import ItemCommon
+import SkillCommon
+import PlayerControl
+import IpyGameDataPY
+import ChPyNetSendPack
+import NetPackCommon
+import IPY_GameWorld
+import ChConfig
+
+def GetGubaoLVInfo(curPlayer, gubaoID):
+    lvInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoLVInfo % gubaoID)
+    lv = lvInfo / 100
+    star = lvInfo % 100
+    return lv, star
+def SetGubaoLVInfo(curPlayer, gubaoID, lv, star):
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GubaoLVInfo % gubaoID, lv * 100 + star)
+    return
+
+def OnPlayerLogin(curPlayer):
+    Sync_GubaoInfo(curPlayer)
+    return
+
+#// B2 16 古宝激活 #tagCMGubaoActivate
+#
+#struct    tagCMGubaoActivate
+#{
+#    tagHead         Head;
+#    WORD        GubaoID;    
+#};
+def OnGubaoActivate(index, curPackData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    playerID = curPlayer.GetPlayerID()
+    gubaoID = curPackData.GubaoID
+    ipyData = IpyGameDataPY.GetIpyGameData("Gubao", gubaoID)
+    if not ipyData:
+        return
+    needItemID = ipyData.GetUnlockItemID()
+    needItemCnt = ipyData.GetUnlockItemCnt()
+    if not needItemID or not needItemCnt:
+        return
+    
+    lv, star = GetGubaoLVInfo(curPlayer, gubaoID)
+    if lv or star:
+        GameWorld.DebugLog("古宝已经激活过! gubaoID=%s" % gubaoID, playerID)
+        return
+    
+    itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
+    hasEnough, itemList = ItemCommon.GetItem_FromPack_ByID(needItemID, itemPack, needItemCnt)
+    if not hasEnough:
+        GameWorld.DebugLog("激活古宝道具不足! needItemID=%s,needItemCnt=%s" % (needItemID, needItemCnt), playerID)
+        return
+    ItemCommon.ReduceItem(curPlayer, itemPack, itemList, needItemCnt, False, "Gubao")
+    
+    lv, star = 1, 1
+    SetGubaoLVInfo(curPlayer, gubaoID, lv, star)
+    GameWorld.Log("古宝激活成功! gubaoID=%s" % gubaoID, playerID)
+    giveSkillIDInfo = ipyData.GetGiveSkillIDInfo()
+    if giveSkillIDInfo:
+        SkillCommon.GivePlayerSkillByJobSkill(curPlayer, giveSkillIDInfo)
+        
+    RefreshGubaoAttr(curPlayer)
+    Sync_GubaoInfo(curPlayer, [gubaoID])
+    return
+
+#// B2 17 古宝升星 #tagCMGubaoStarUp
+#
+#struct    tagCMGubaoStarUp
+#{
+#    tagHead         Head;
+#    WORD        GubaoID;    
+#};
+def OnGubaoStarUp(index, curPackData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    playerID = curPlayer.GetPlayerID()
+    gubaoID = curPackData.GubaoID
+    
+    lv, star = GetGubaoLVInfo(curPlayer, gubaoID)
+    if not star:
+        GameWorld.DebugLog("古宝未激活,无法升星! gubaoID=%s" % gubaoID, playerID)
+        return
+    
+    if not IpyGameDataPY.GetIpyGameDataNotLog("GubaoStar", gubaoID, star + 1):
+        GameWorld.DebugLog("古宝已满星! gubaoID=%s,star=%s" % (gubaoID, star), playerID)
+        return
+    
+    ipyData = IpyGameDataPY.GetIpyGameData("GubaoStar", gubaoID, star)
+    if not ipyData:
+        return
+    needItemList = ipyData.GetStarUPNeedItemInfo()
+    if not needItemList:
+        return
+    
+    itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
+    lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(needItemList, itemPack)
+    if lackItemDict:
+        GameWorld.DebugLog("古宝升星所需物品不足! star=%s,needItemList=%s,lackItemDict=%s" % (star, needItemList, lackItemDict), playerID)
+        return
+    #扣消耗
+    ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, "Gubao")
+    
+    updStar = star + 1
+    SetGubaoLVInfo(curPlayer, gubaoID, lv, updStar)
+    GameWorld.Log("古宝升星: gubaoID=%s,updStar=%s" % (gubaoID, updStar), playerID)
+    RefreshGubaoAttr(curPlayer)
+    Sync_GubaoInfo(curPlayer, [gubaoID])
+    return
+
+#// B2 18 古宝升级 #tagCMGubaoLVUp
+#
+#struct    tagCMGubaoLVUp
+#{
+#    tagHead         Head;
+#    WORD        GubaoID;    
+#};
+def OnGubaoLVUp(index, curPackData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    playerID = curPlayer.GetPlayerID()
+    gubaoID = curPackData.GubaoID
+    
+    lv, star = GetGubaoLVInfo(curPlayer, gubaoID)
+    if not star:
+        GameWorld.DebugLog("古宝未激活,无法升级! gubaoID=%s" % gubaoID, playerID)
+        return
+    
+    ipyData = IpyGameDataPY.GetIpyGameData("Gubao", gubaoID)
+    if not ipyData:
+        return
+    quality = ipyData.GetGubaoQuality()
+    
+    if not IpyGameDataPY.GetIpyGameDataNotLog("GubaoLV", quality, lv + 1):
+        GameWorld.DebugLog("古宝已满级! gubaoID=%s,quality=%s,lv=%s" % (gubaoID, quality, lv), playerID)
+        return
+    
+    lvIpyData = IpyGameDataPY.GetIpyGameData("GubaoLV", quality, lv)
+    if not lvIpyData:
+        return
+    needItemList = lvIpyData.GetLVUPNeedItemInfo()
+    if not needItemList:
+        return
+    
+    itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
+    lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(needItemList, itemPack)
+    if lackItemDict:
+        GameWorld.DebugLog("古宝升级所需物品不足! quality=%s,lv=%s,needItemList=%s,lackItemDict=%s" 
+                           % (quality, lv, needItemList, lackItemDict), playerID)
+        return
+    #扣消耗
+    ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, "Gubao")
+    
+    updLV = lv + 1
+    SetGubaoLVInfo(curPlayer, gubaoID, updLV, star)
+    GameWorld.Log("古宝升级: gubaoID=%s,quality=%s,updLV=%s" % (gubaoID, quality, updLV), playerID)
+    RefreshGubaoAttr(curPlayer)
+    Sync_GubaoInfo(curPlayer, [gubaoID])
+    return
+
+def RefreshGubaoAttr(curPlayer):
+    CalcGubaoAttr(curPlayer)
+    PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
+    return
+
+def CalcGubaoAttr(curPlayer):
+    
+    allAttrList = [{} for _ in range(4)]
+    
+    ipyDataMgr = IpyGameDataPY.IPY_Data()
+    for index in xrange(ipyDataMgr.GetGubaoCount()):
+        ipyData = ipyDataMgr.GetGubaoByIndex(index)
+        gubaoID = ipyData.GetGubaoID()
+        lv, star = GetGubaoLVInfo(curPlayer, gubaoID)
+        if not star:
+            continue
+        
+        quality = ipyData.GetGubaoQuality()
+        lvIpyData = IpyGameDataPY.GetIpyGameData("GubaoLV", quality, lv)
+        if lvIpyData:
+            lvAttrTypeList = lvIpyData.GetLVAttrTypeList()
+            lvAttrValueList = lvIpyData.GetLVAttrValueList()
+            for i, attrID in enumerate(lvAttrTypeList):
+                attrValue = lvAttrValueList[i]
+                PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList)
+                
+        starIpyData = IpyGameDataPY.GetIpyGameData("GubaoStar", gubaoID, star)
+        if starIpyData:
+            starAttrTypeList = starIpyData.GetStarAttrTypeList()
+            starAttrValueList = starIpyData.GetStarAttrValueList()
+            for i, attrID in enumerate(starAttrTypeList):
+                attrValue = starAttrValueList[i]
+                PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList)
+                
+    # 保存计算值
+    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Gubao, allAttrList)
+    return
+
+def Sync_GubaoInfo(curPlayer, gubaoIDList=None):
+    if gubaoIDList == None:
+        syncIDList = []
+        ipyDataMgr = IpyGameDataPY.IPY_Data()
+        for index in range(ipyDataMgr.GetGubaoCount()):
+            ipyData = ipyDataMgr.GetGubaoByIndex(index)
+            syncIDList.append(ipyData.GetGubaoID())
+    else:
+        syncIDList = gubaoIDList
+        
+    gubaoInfoList = []
+    for gubaoID in syncIDList:
+        lv, star = GetGubaoLVInfo(curPlayer, gubaoID)
+        if not lv and not star and gubaoIDList == None:
+            # 没有指定时只同步激活的
+            continue
+        gubao = ChPyNetSendPack.tagMCGubao()
+        gubao.GubaoID = gubaoID
+        gubao.GubaoLV = lv
+        gubao.GubaoStar = star
+        gubaoInfoList.append(gubao)
+        
+    if not gubaoInfoList:
+        return
+    
+    clientPack = ChPyNetSendPack.tagMCGubaoInfo()
+    clientPack.GubaoInfoList = gubaoInfoList
+    clientPack.Count = len(clientPack.GubaoInfoList)
+    NetPackCommon.SendFakePack(curPlayer, clientPack)
+    return

--
Gitblit v1.8.0