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