From 063c37a60dfad1fad8e31ee235e0d69c3ae35481 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期四, 12 一月 2023 17:12:08 +0800 Subject: [PATCH] 9762 【BT8】【后端】藏宝阁(古宝特殊效果属性支持) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipWash.py | 3 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPet.py | 38 ++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGubao.py | 620 +++++++++++++++++++++++++++----------------- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py | 67 ++++ PySysDB/生成IpyGameDataPY/config.ini | 2 PySysDB/PySysDBPY.h | 25 + ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py | 26 + 7 files changed, 527 insertions(+), 254 deletions(-) diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h index bb6085d..56e744d 100644 --- a/PySysDB/PySysDBPY.h +++ b/PySysDB/PySysDBPY.h @@ -429,6 +429,15 @@ DWORD SkinValidTime; //有效时长秒 }; +//坐骑表 + +struct tagHorse +{ + DWORD _HorseID; //坐骑ID + DWORD HorseSkinID; //外观物品ID + BYTE Quality; //坐骑品质 +}; + //古宝表 struct tagGubao @@ -446,8 +455,20 @@ WORD _GubaoID; //古宝ID BYTE _GubaoStar; //古宝星级 list StarUPNeedItemInfo; //升星所需物品 [[物品ID,个数], ...] - list StarAttrTypeList; //星级属性类型列表 - list StarAttrValueList; //星级属性值列表 + list StarEffIDList; //星级特殊效果ID列表 +}; + +//古宝特殊效果表 + +struct tagGubaoEffAttr +{ + DWORD _GubaoEffID; //古宝特殊效果ID + BYTE GubaoEffType; //效果类型 + DWORD EffCond; //条件 + BYTE IsPer; //是否百分比提升 + list EffFuncAttrIDList; //提升指定功能属性ID列表 + DWORD EffAttrID; //直接增加属性类型 + DWORD EffAttrValue; //提升属性值 }; //古宝品质升级表 diff --git "a/PySysDB/\347\224\237\346\210\220IpyGameDataPY/config.ini" "b/PySysDB/\347\224\237\346\210\220IpyGameDataPY/config.ini" index b28f90d..6cab450 100644 --- "a/PySysDB/\347\224\237\346\210\220IpyGameDataPY/config.ini" +++ "b/PySysDB/\347\224\237\346\210\220IpyGameDataPY/config.ini" @@ -1,5 +1,5 @@ [config] ; 项目根路径 -CodeProjectPath = E:\Git\SnxxServerCode\ServerPython +CodeProjectPath = E:\SnxxServerCode\ServerPython diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipWash.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipWash.py index 6b8aa6a..033278a 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipWash.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipWash.py @@ -454,7 +454,7 @@ playControl.RefreshPlayerAttrState() return -def CalcAttr_EquipWash(curPlayer, equipIndex, equipPlace, allAttrList): +def CalcAttr_EquipWash(curPlayer, equipIndex, equipPlace, baseAttrDictWash, allAttrList): ## 装备位洗练属性 washLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipWashLV % equipIndex) maxWashLV = GetEquipWashMaxLV(curPlayer, equipIndex, equipPlace) @@ -474,6 +474,7 @@ #GameWorld.DebugLog(" attrNum=%s,attrID=%s, attrValue=%s" % (attrNum, attrID, attrValue)) if attrValue: PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList) + baseAttrDictWash[attrID] = baseAttrDictWash.get(attrID, 0) + attrValue return def EquipWashSuccess(curPlayer, classLV): diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py index 81a1658..60009ac 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py @@ -357,6 +357,12 @@ ("DWORD", "SkinValidTime", 0), ), + "Horse":( + ("DWORD", "HorseID", 1), + ("DWORD", "HorseSkinID", 0), + ("BYTE", "Quality", 0), + ), + "Gubao":( ("WORD", "GubaoID", 1), ("BYTE", "GubaoQuality", 0), @@ -368,8 +374,17 @@ ("WORD", "GubaoID", 1), ("BYTE", "GubaoStar", 1), ("list", "StarUPNeedItemInfo", 0), - ("list", "StarAttrTypeList", 0), - ("list", "StarAttrValueList", 0), + ("list", "StarEffIDList", 0), + ), + + "GubaoEffAttr":( + ("DWORD", "GubaoEffID", 1), + ("BYTE", "GubaoEffType", 0), + ("DWORD", "EffCond", 0), + ("BYTE", "IsPer", 0), + ("list", "EffFuncAttrIDList", 0), + ("DWORD", "EffAttrID", 0), + ("DWORD", "EffAttrValue", 0), ), "GubaoLV":( @@ -2759,6 +2774,19 @@ def GetHorseID(self): return self.HorseID # 对应坐骑ID def GetSkinValidTime(self): return self.SkinValidTime # 有效时长秒 +# 坐骑表 +class IPY_Horse(): + + def __init__(self): + self.HorseID = 0 + self.HorseSkinID = 0 + self.Quality = 0 + return + + def GetHorseID(self): return self.HorseID # 坐骑ID + def GetHorseSkinID(self): return self.HorseSkinID # 外观物品ID + def GetQuality(self): return self.Quality # 坐骑品质 + # 古宝表 class IPY_Gubao(): @@ -2781,15 +2809,34 @@ self.GubaoID = 0 self.GubaoStar = 0 self.StarUPNeedItemInfo = [] - self.StarAttrTypeList = [] - self.StarAttrValueList = [] + self.StarEffIDList = [] 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 # 星级属性值列表 + def GetStarEffIDList(self): return self.StarEffIDList # 星级特殊效果ID列表 + +# 古宝特殊效果表 +class IPY_GubaoEffAttr(): + + def __init__(self): + self.GubaoEffID = 0 + self.GubaoEffType = 0 + self.EffCond = 0 + self.IsPer = 0 + self.EffFuncAttrIDList = [] + self.EffAttrID = 0 + self.EffAttrValue = 0 + return + + def GetGubaoEffID(self): return self.GubaoEffID # 古宝特殊效果ID + def GetGubaoEffType(self): return self.GubaoEffType # 效果类型 + def GetEffCond(self): return self.EffCond # 条件 + def GetIsPer(self): return self.IsPer # 是否百分比提升 + def GetEffFuncAttrIDList(self): return self.EffFuncAttrIDList # 提升指定功能属性ID列表 + def GetEffAttrID(self): return self.EffAttrID # 直接增加属性类型 + def GetEffAttrValue(self): return self.EffAttrValue # 提升属性值 # 古宝品质升级表 class IPY_GubaoLV(): @@ -6461,10 +6508,14 @@ self.ipyHorseTrainLen = len(self.ipyHorseTrainCache) self.ipyHorseSkinPlusCache = self.__LoadFileData("HorseSkinPlus", IPY_HorseSkinPlus) self.ipyHorseSkinPlusLen = len(self.ipyHorseSkinPlusCache) + self.ipyHorseCache = self.__LoadFileData("Horse", IPY_Horse) + self.ipyHorseLen = len(self.ipyHorseCache) 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.ipyGubaoEffAttrCache = self.__LoadFileData("GubaoEffAttr", IPY_GubaoEffAttr) + self.ipyGubaoEffAttrLen = len(self.ipyGubaoEffAttrCache) self.ipyGubaoLVCache = self.__LoadFileData("GubaoLV", IPY_GubaoLV) self.ipyGubaoLVLen = len(self.ipyGubaoLVCache) self.ipyShentongCache = self.__LoadFileData("Shentong", IPY_Shentong) @@ -7049,10 +7100,14 @@ def GetHorseTrainByIndex(self, index): return self.ipyHorseTrainCache[index] def GetHorseSkinPlusCount(self): return self.ipyHorseSkinPlusLen def GetHorseSkinPlusByIndex(self, index): return self.ipyHorseSkinPlusCache[index] + def GetHorseCount(self): return self.ipyHorseLen + def GetHorseByIndex(self, index): return self.ipyHorseCache[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 GetGubaoEffAttrCount(self): return self.ipyGubaoEffAttrLen + def GetGubaoEffAttrByIndex(self, index): return self.ipyGubaoEffAttrCache[index] def GetGubaoLVCount(self): return self.ipyGubaoLVLen def GetGubaoLVByIndex(self, index): return self.ipyGubaoLVCache[index] def GetShentongCount(self): return self.ipyShentongLen diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGubao.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGubao.py index 7204832..160fea1 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGubao.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGubao.py @@ -1,238 +1,382 @@ -#!/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 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) - - 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 +#!/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 PlayerControl +import IpyGameDataPY +import ChPyNetSendPack +import NetPackCommon +import IPY_GameWorld +import PlayerHorse +import PlayerDogz +import PlayerPet +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) + + 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: + starEffIDList = starIpyData.GetStarEffIDList() + effAttrInfo = {} + #GameWorld.DebugLog("GubaoStar属性: gubaoID=%s,star=%s,starEffIDList=%s" % (gubaoID, star, starEffIDList)) + for effID in starEffIDList: + __calcStarEffAttrByID(curPlayer, effID, effAttrInfo) + #GameWorld.DebugLog(" effID=%s,effAttrInfo=%s" % (effID, effAttrInfo)) + for attrID, attrValue in effAttrInfo.items(): + PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList) + + # 保存计算值 + #GameWorld.DebugLog("古宝属性: %s" % allAttrList) + PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Gubao, allAttrList) + return + +def __calcStarEffAttrByID(curPlayer, effID, effAttrInfo): + ''' 计算古宝特殊效果ID对应提升属性 + ''' + ipyData = IpyGameDataPY.GetIpyGameData("GubaoEffAttr", effID) + if not ipyData: + return + effType = ipyData.GetGubaoEffType() + effCond = ipyData.GetEffCond() + attrID = ipyData.GetEffAttrID() + effAttrValue = ipyData.GetEffAttrValue() + if effAttrValue <= 0: + return + #效果类型 类型说明 条件 + # 10 x品质灵宠攻击属性提升x% x品质 + if effType == 10: + customAttrDictPet = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Pet)[2] + petQualityAttrInfo = customAttrDictPet.get("petQualityAttrInfo", {}) + quality = effCond + #GameWorld.DebugLog(" effID=%s,effType=%s,quality=%s,petQualityAttrInfo=%s" % (effID, effType, quality, petQualityAttrInfo)) + if quality not in petQualityAttrInfo: + return + __addStarEffFuncAttr(ipyData, effAttrInfo, petQualityAttrInfo[quality], effAttrValue) + + # 11 灵宠总等级每x级+xx属性 x级 + elif effType == 11: + totalPetLV = PlayerPet.GetTotalPetLV(curPlayer) + addAttrValue = int(totalPetLV / effCond * effAttrValue) + #GameWorld.DebugLog(" effID=%s,effType=%s,effCond=%s,totalPetLV=%s,attrID=%s,addAttrValue=%s" % (effID, effType, effCond, totalPetLV, attrID, addAttrValue)) + if attrID > 0 and addAttrValue > 0: + effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue + + # 12 灵宠每激活x只+xx属性 x只 + elif effType == 12: + totalPetCount = PlayerPet.GetTotalPetCount(curPlayer) + addAttrValue = int(totalPetCount / effCond * effAttrValue) + #GameWorld.DebugLog(" effID=%s,effType=%s,effCond=%s,totalPetCount=%s,attrID=%s,addAttrValue=%s" % (effID, effType, effCond, totalPetCount, attrID, addAttrValue)) + if attrID > 0 and addAttrValue > 0: + effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue + + # 13 x品质坐骑幻化属性提升x% x品质 + elif effType == 13: + customAttrDictSkin = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_HorseSkin)[2] + horseSkinQualityAttrInfo = customAttrDictSkin.get("horseSkinQualityAttrInfo", {}) + quality = effCond + #GameWorld.DebugLog(" effID=%s,effType=%s,quality=%s,horseSkinQualityAttrInfo=%s" % (effID, effType, quality, horseSkinQualityAttrInfo)) + if quality not in horseSkinQualityAttrInfo: + return + __addStarEffFuncAttr(ipyData, effAttrInfo, horseSkinQualityAttrInfo[quality], effAttrValue) + + # 14 坐骑幻化激活x只+xx属性 x只 + elif effType == 14: + horseSkinActCount = PlayerHorse.GetHorseSkinActCount(curPlayer) + addAttrValue = int(horseSkinActCount / effCond * effAttrValue) + #GameWorld.DebugLog(" effID=%s,effType=%s,effCond=%s,horseSkinActCount=%s,attrID=%s,addAttrValue=%s" % (effID, effType, effCond, horseSkinActCount, attrID, addAttrValue)) + if attrID > 0 and addAttrValue > 0: + effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue + + # 15 每培养坐骑x次+xx属性 x次 + elif effType == 15: + pass + + #16 x阶装备强化属性提升x% x阶 + elif effType == 16: + customAttrDictPlus = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Plus)[2] + classBaseAttrDictPlus = customAttrDictPlus.get("classBaseAttrDictPlus", {}) + classLV = effCond + #GameWorld.DebugLog(" effID=%s,effType=%s,classLV=%s,classBaseAttrDictPlus=%s" % (effID, effType, classLV, classBaseAttrDictPlus)) + if classLV not in classBaseAttrDictPlus: + return + __addStarEffFuncAttr(ipyData, effAttrInfo, classBaseAttrDictPlus[classLV], effAttrValue) + + #17 x阶装备宝石属性提升x% x阶 + elif effType == 17: + customAttrDictStone = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Stone)[2] + classBaseAttrDictStone = customAttrDictStone.get("classBaseAttrDictStone", {}) + classLV = effCond + #GameWorld.DebugLog(" effID=%s,effType=%s,classLV=%s,classBaseAttrDictStone=%s" % (effID, effType, classLV, classBaseAttrDictStone)) + if classLV not in classBaseAttrDictStone: + return + __addStarEffFuncAttr(ipyData, effAttrInfo, classBaseAttrDictStone[classLV], effAttrValue) + + #18 x阶装备升星属性提升x% x阶 + elif effType == 18: + customAttrDictStar = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Star)[2] + classBaseAttrDictStar = customAttrDictStar.get("classBaseAttrDictStar", {}) + classLV = effCond + #GameWorld.DebugLog(" effID=%s,effType=%s,classLV=%s,classBaseAttrDictStar=%s" % (effID, effType, classLV, classBaseAttrDictStar)) + if classLV not in classBaseAttrDictStar: + return + __addStarEffFuncAttr(ipyData, effAttrInfo, classBaseAttrDictStar[classLV], effAttrValue) + + #19 x阶装备洗炼属性提升x% x阶 + elif effType == 19: + customAttrDictWash = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Wash)[2] + classBaseAttrDictWash = customAttrDictWash.get("classBaseAttrDictWash", {}) + classLV = effCond + #GameWorld.DebugLog(" effID=%s,effType=%s,classLV=%s,classBaseAttrDictWash=%s" % (effID, effType, classLV, classBaseAttrDictWash)) + if classLV not in classBaseAttrDictWash: + return + __addStarEffFuncAttr(ipyData, effAttrInfo, classBaseAttrDictWash[classLV], effAttrValue) + + #20 x阶装备附魔属性提升x% x阶 + elif effType == 20: + customAttrDictEnchant = PlayerControl.GetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Enchant)[2] + classBaseAttrDictEnchant = customAttrDictEnchant.get("classBaseAttrDictEnchant", {}) + classLV = effCond + #GameWorld.DebugLog(" effID=%s,effType=%s,classLV=%s,classBaseAttrDictEnchant=%s" % (effID, effType, classLV, classBaseAttrDictEnchant)) + if classLV not in classBaseAttrDictEnchant: + return + __addStarEffFuncAttr(ipyData, effAttrInfo, classBaseAttrDictEnchant[classLV], effAttrValue) + + #21 出战神兽装备强化每x级+xx属性 x级 + elif effType == 21: + fightDogzTotalPlusLv = PlayerDogz.GetFightDogzTotalPlusLv(curPlayer) + addAttrValue = int(fightDogzTotalPlusLv / effCond * effAttrValue) + #GameWorld.DebugLog(" effID=%s,effType=%s,effCond=%s,fightDogzTotalPlusLv=%s,attrID=%s,addAttrValue=%s" % (effID, effType, effCond, fightDogzTotalPlusLv, attrID, addAttrValue)) + if attrID > 0 and addAttrValue > 0: + effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue + + return + +def __addStarEffFuncAttr(ipyData, effAttrInfo, funcAttrInfo, effAttrValue): + if not funcAttrInfo or effAttrValue <= 0: + return + isPer = ipyData.GetIsPer() + effAttrIDList = ipyData.GetEffFuncAttrIDList() # 提升指定功能属性ID列表 + for attrID, attrValue in funcAttrInfo.items(): + if effAttrIDList and attrID not in effAttrIDList: + continue + if isPer: + addAttrValue = int(attrValue * effAttrValue / 100.0) + else: + addAttrValue = effAttrValue + if attrID > 0 and addAttrValue > 0: + effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue + 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 diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py index 926e4fd..ca0e5b0 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py @@ -404,6 +404,8 @@ allAttrListSkin = [{} for _ in range(4)] allAttrListTrain = [{} for _ in range(4)] + customAttrDictSkin = {} + horseSpeed = 0 # 坐骑功能增加的速度值,骑乘时才有效果 horseLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserLV) # 等阶培养属性 @@ -436,6 +438,7 @@ # 幻化属性 initFPAdd = 0 #初始战力 + horseSkinQualityAttrInfo = {} for index in xrange(ipyDataMgr.GetHorseSkinPlusCount()): skinPlusIpyData = ipyDataMgr.GetHorseSkinPlusByIndex(index) if not CheckHorseSkinState(curPlayer, skinPlusIpyData): @@ -459,6 +462,17 @@ for attrID, attrValue in skinIpyData.GetAttrInfo().items(): PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListSkin) + hIpyData = IpyGameDataPY.GetIpyGameData("Horse", horseID) + if hIpyData: + quality = hIpyData.GetQuality() + if quality not in horseSkinQualityAttrInfo: + horseSkinQualityAttrInfo[quality] = {} + qualityAttrDict = horseSkinQualityAttrInfo[quality] + for i, attrID in enumerate(attrTypeList): + attrValue = attrValueList[i] + qualityAttrDict[attrID] = qualityAttrDict.get(attrID, 0) + attrValue + customAttrDictSkin["horseSkinQualityAttrInfo"] = horseSkinQualityAttrInfo + # 新培养属性 for index in xrange(ipyDataMgr.GetHorseTrainCount()): trainIpyData = ipyDataMgr.GetHorseTrainByIndex(index) @@ -507,10 +521,20 @@ # 保存计算值 PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Horse, allAttrList) PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_HorseSoul, allAttrListHorseSoul) - PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_HorseSkin, allAttrListSkin) + PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_HorseSkin, allAttrListSkin, customAttrDict=customAttrDictSkin) PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_HorseTarin, allAttrListTrain) return +def GetHorseSkinActCount(curPlayer): + horseSkinActCount = 0 + ipyDataMgr = IpyGameDataPY.IPY_Data() + for index in xrange(ipyDataMgr.GetHorseSkinPlusCount()): + skinPlusIpyData = ipyDataMgr.GetHorseSkinPlusByIndex(index) + if not CheckHorseSkinState(curPlayer, skinPlusIpyData): + continue + horseSkinActCount += 1 + return horseSkinActCount + #// A5 27 坐骑提升 #tagCMHorseUp # #struct tagCMHorseUp diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPet.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPet.py index e027e7a..bb6fab2 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPet.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPet.py @@ -787,6 +787,21 @@ totalPetLV += classLV return totalPetLV +def GetTotalPetCount(curPlayer): + totalPetCount = 0 + petPackIndex = ShareDefine.rptPet + petPack = curPlayer.GetItemManager().GetPack(petPackIndex) + for i in range(petPack.GetCount()): + petItem = petPack.GetAt(i) + if petItem.IsEmpty(): + continue + petItemNPCID = petItem.GetUserAttr(ShareDefine.Def_IudetPet_NPCID) + petIpyData = GetPetIpydata(petItemNPCID) + if not petIpyData: + continue + totalPetCount += 1 + return totalPetCount + def IsPetMaxLV(curPlayer, petNPCID): petItem = GetPetDataItemByNPCID(curPlayer, petNPCID) if not petItem: @@ -858,7 +873,9 @@ skillAttrList = [{} for _ in range(4)] allAttrListPetSkin = [{} for _ in range(4)] allAttrListTrain = [{} for _ in range(4)] - totalMinAtk, totalMaxAtk = GetPetAtkValue(curPlayer) + customAttrDictPet = {} + totalMinAtk, totalMaxAtk, qualityAttrInfo = GetPetAtkValue(curPlayer) + customAttrDictPet["petQualityAttrInfo"] = qualityAttrInfo PlayerControl.CalcAttrDict_Type(ShareDefine.Def_Effect_PetMinAtk, totalMinAtk, allAttrListPet) PlayerControl.CalcAttrDict_Type(ShareDefine.Def_Effect_PetMaxAtk, totalMaxAtk, allAttrListPet) totalSignNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalSignNum) # 总签到天数 @@ -923,7 +940,7 @@ PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PetTarin, allAttrListTrain) - PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Pet, allAttrListPet) + PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Pet, allAttrListPet, customAttrDict=customAttrDictPet) PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PetSoul, allAttrListPetSoul) PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PetSign, allAttrListPetSign) @@ -962,9 +979,10 @@ ## 获取灵兽出战时的攻击力 def GetPetAtkValue(curPlayer): + qualityAttrInfo = {} if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Pet): #GameWorld.DebugLog(' 宠物功能未开启') - return 0, 0 + return 0, 0, qualityAttrInfo classAddAtk = 0 petPackIndex = ShareDefine.rptPet @@ -976,10 +994,20 @@ petItemNPCID = packItem.GetUserAttr(ShareDefine.Def_IudetPet_NPCID) classlv = packItem.GetUserAttr(ShareDefine.Def_IudetPet_ClassLV) classIpyData = IpyGameDataPY.GetIpyGameData("PetClassCost", petItemNPCID, classlv + 1) - classAddAtk += (classIpyData.GetAtkAdd() if classIpyData else 0) + atkAdd = classIpyData.GetAtkAdd() if classIpyData else 0 + classAddAtk += atkAdd + + petIpyData = GetPetIpydata(petItemNPCID) + if petIpyData: + quality = petIpyData.GetQuality() + if quality not in qualityAttrInfo: + qualityAttrInfo[quality] = {} + qualityAttrDict = qualityAttrInfo[quality] + qualityAttrDict[ShareDefine.Def_Effect_PetAtk] = qualityAttrDict.get(ShareDefine.Def_Effect_PetAtk, 0) + atkAdd + totalMinAtk = classAddAtk totalMaxAtk = classAddAtk - return totalMinAtk, totalMaxAtk + return totalMinAtk, totalMaxAtk, qualityAttrInfo def OnPlayerPetLogin(curPlayer): ## 登录处理 -- Gitblit v1.8.0