From 40673d6fac17bdead316b5aae223f7861d8d6eb7 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期五, 12 七月 2024 16:23:22 +0800 Subject: [PATCH] 10202 【越南】【香港】【主干】【砍树】聚魂 --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetItemCount.py | 64 ++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py | 47 + ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py | 16 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py | 56 ++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py | 283 +++++++++++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py | 83 ++- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGatherTheSoul.py | 334 +++++++++++++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py | 1 ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py | 56 ++ ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py | 283 +++++++++++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGubao.py | 10 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini | 12 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py | 6 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py | 107 +++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/GatherSoul.py | 64 ++ ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py | 2 PySysDB/PySysDBPY.h | 35 + ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py | 16 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py | 2 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py | 19 20 files changed, 1,451 insertions(+), 45 deletions(-) diff --git a/PySysDB/PySysDBPY.h b/PySysDB/PySysDBPY.h index 4eb4dbe..49d68ff 100644 --- a/PySysDB/PySysDBPY.h +++ b/PySysDB/PySysDBPY.h @@ -1619,6 +1619,7 @@ BYTE _TreasureType; //寻宝类型 WORD MinLV; //最小等级 dict GridItemInfo; //格子编号对应物品信息 {"编号":[物品ID, 个数], ...} + dict GridLibInfo; //格子编号对应库ID {"编号":物品库ID, ...} list JobItemList; //职业物品组列表 [[职业1物品, 职业2物品, ...], ...] list GridItemRateListFree; //免费产出格子编号饼图 [[概率, 格子编号], ...] list FreeGridItemRateList2; //免费每满x次保底产出格子编号饼图 [[概率, 格子编号], ...] @@ -1627,6 +1628,16 @@ list GridItemRateList2; //每满x次保底产出格子编号饼图 [[概率, 格子编号], ...] dict GridItemRateList3; //第x次必出产出格子编号饼图 {次数:[[概率, 格子编号], ...], ...} BYTE LuckyGridNum; //幸运加成格子编号 +}; + +//寻宝物品库 + +struct tagTreasureItemLib +{ + WORD _LibID; //库ID + DWORD ItemID; //物品ID + DWORD ItemCount; //物品个数 + DWORD ItemWeight; //物品权重 }; //极品白拿表 @@ -2327,6 +2338,30 @@ WORD PosY; //坐标Y }; +//聚魂新表 + +struct tagGatherTheSoul +{ + DWORD _SoulID; //聚魂ID + DWORD PieceItemID; //碎片物品ID + BYTE HoleNum; //孔编号 + BYTE SoulColor; //品质 + DWORD SoulSkillTypeID; //技能TypeID + list SoulSkillLVList; //技能等级所需魂等级列表 +}; + +//聚魂新升级表 + +struct tagGatherTheSoulLV +{ + DWORD _SoulID; //聚魂ID + WORD _SoulLV; //魂等级 + WORD NeedPiece; //该级所需碎片 + DWORD NeedSoulValue; //所需聚魂精华 + list LVAttrTypeList; //累计总属性类型 + list LVAttrValueList; //累计总属性值 +}; + //聚魂表 struct tagGatherSoul diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py index f396f18..cb3d74e 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py @@ -18709,6 +18709,62 @@ #------------------------------------------------------ +# B2 25 新聚魂操作 #tagCMGatherTheSoulOP + +class tagCMGatherTheSoulOP(Structure): + _pack_ = 1 + _fields_ = [ + ("Cmd", c_ubyte), + ("SubCmd", c_ubyte), + ("OpType", c_ubyte), # 0-激活升级; 1-穿戴替换; 2-卸下 + ("SoulID", c_int), # 聚魂ID;当操作升级时,如果为0代表一键升级所有可升级的 + ] + + def __init__(self): + self.Clear() + self.Cmd = 0xB2 + self.SubCmd = 0x25 + 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 = 0x25 + self.OpType = 0 + self.SoulID = 0 + return + + def GetLength(self): + return sizeof(tagCMGatherTheSoulOP) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// B2 25 新聚魂操作 //tagCMGatherTheSoulOP: + Cmd:%s, + SubCmd:%s, + OpType:%d, + SoulID:%d + '''\ + %( + self.Cmd, + self.SubCmd, + self.OpType, + self.SoulID + ) + return DumpString + + +m_NAtagCMGatherTheSoulOP=tagCMGatherTheSoulOP() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMGatherTheSoulOP.Cmd,m_NAtagCMGatherTheSoulOP.SubCmd))] = m_NAtagCMGatherTheSoulOP + + +#------------------------------------------------------ # B2 12 领取功能系统特权奖励 #tagCMGetFuncSysPrivilegeAward class tagCMGetFuncSysPrivilegeAward(Structure): diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py index 6cd4165..1e534a0 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py @@ -18886,6 +18886,114 @@ #------------------------------------------------------ +# A2 06 自动转化为对应物品ID个数刷新 #tagMCAutoItemCountRefresh + +class tagMCAutoItemCount(Structure): + _pack_ = 1 + _fields_ = [ + ("ItemID", c_int), + ("ItemCount", c_int), + ] + + 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.ItemID = 0 + self.ItemCount = 0 + return + + def GetLength(self): + return sizeof(tagMCAutoItemCount) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// A2 06 自动转化为对应物品ID个数刷新 //tagMCAutoItemCountRefresh: + ItemID:%d, + ItemCount:%d + '''\ + %( + self.ItemID, + self.ItemCount + ) + return DumpString + + +class tagMCAutoItemCountRefresh(Structure): + Head = tagHead() + Count = 0 #(WORD Count)// 刷新个数 + ItemCountList = list() #(vector<tagMCAutoItemCount> ItemCountList)// 物品信息列表 + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xA2 + self.Head.SubCmd = 0x06 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.Count,_pos = CommFunc.ReadWORD(_lpData, _pos) + for i in range(self.Count): + temItemCountList = tagMCAutoItemCount() + _pos = temItemCountList.ReadData(_lpData, _pos) + self.ItemCountList.append(temItemCountList) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xA2 + self.Head.SubCmd = 0x06 + self.Count = 0 + self.ItemCountList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 2 + for i in range(self.Count): + length += self.ItemCountList[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteWORD(data, self.Count) + for i in range(self.Count): + data = CommFunc.WriteString(data, self.ItemCountList[i].GetLength(), self.ItemCountList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + Count:%d, + ItemCountList:%s + '''\ + %( + self.Head.OutputString(), + self.Count, + "..." + ) + return DumpString + + +m_NAtagMCAutoItemCountRefresh=tagMCAutoItemCountRefresh() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCAutoItemCountRefresh.Head.Cmd,m_NAtagMCAutoItemCountRefresh.Head.SubCmd))] = m_NAtagMCAutoItemCountRefresh + + +#------------------------------------------------------ # A2 03 最后一次背包开格的在线时间 #tagMCOnlineTimeLastOpenPack class tagMCOnlineTimeLastOpenPack(Structure): @@ -22209,6 +22317,181 @@ #------------------------------------------------------ +# A3 61 新聚魂孔信息 #tagMCGatherTheSoulHoleInfo + +class tagMCGatherTheSoulHoleInfo(Structure): + Head = tagHead() + Count = 0 #(BYTE Count)// 孔数 + HoleSoulList = list() #(vector<DWORD> HoleSoulList)// 孔聚魂ID列表 + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xA3 + self.Head.SubCmd = 0x61 + 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): + value,_pos=CommFunc.ReadDWORD(_lpData,_pos) + self.HoleSoulList.append(value) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xA3 + self.Head.SubCmd = 0x61 + self.Count = 0 + self.HoleSoulList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 1 + length += 4 * self.Count + + 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.WriteDWORD(data, self.HoleSoulList[i]) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + Count:%d, + HoleSoulList:%s + '''\ + %( + self.Head.OutputString(), + self.Count, + "..." + ) + return DumpString + + +m_NAtagMCGatherTheSoulHoleInfo=tagMCGatherTheSoulHoleInfo() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCGatherTheSoulHoleInfo.Head.Cmd,m_NAtagMCGatherTheSoulHoleInfo.Head.SubCmd))] = m_NAtagMCGatherTheSoulHoleInfo + + +#------------------------------------------------------ +# A3 60 新聚魂信息 #tagMCGatherTheSoulInfo + +class tagMCGatherTheSoul(Structure): + _pack_ = 1 + _fields_ = [ + ("SoulID", c_int), + ("LV", c_ushort), + ] + + 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.SoulID = 0 + self.LV = 0 + return + + def GetLength(self): + return sizeof(tagMCGatherTheSoul) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// A3 60 新聚魂信息 //tagMCGatherTheSoulInfo: + SoulID:%d, + LV:%d + '''\ + %( + self.SoulID, + self.LV + ) + return DumpString + + +class tagMCGatherTheSoulInfo(Structure): + Head = tagHead() + Count = 0 #(BYTE Count)// 信息个数 + SoulList = list() #(vector<tagMCGatherTheSoul> SoulList)// 信息列表 + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xA3 + self.Head.SubCmd = 0x60 + 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): + temSoulList = tagMCGatherTheSoul() + _pos = temSoulList.ReadData(_lpData, _pos) + self.SoulList.append(temSoulList) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xA3 + self.Head.SubCmd = 0x60 + self.Count = 0 + self.SoulList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 1 + for i in range(self.Count): + length += self.SoulList[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.SoulList[i].GetLength(), self.SoulList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + Count:%d, + SoulList:%s + '''\ + %( + self.Head.OutputString(), + self.Count, + "..." + ) + return DumpString + + +m_NAtagMCGatherTheSoulInfo=tagMCGatherTheSoulInfo() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCGatherTheSoulInfo.Head.Cmd,m_NAtagMCGatherTheSoulInfo.Head.SubCmd))] = m_NAtagMCGatherTheSoulInfo + + +#------------------------------------------------------ # A3 1D 神兵等级信息 #tagMCGodWeaponLVList class tagMCGodWeaponLVInfo(Structure): diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py index cd646e4..e3fa8c6 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py @@ -1109,7 +1109,8 @@ CDBPlayerRefresh_SuperHitHurtDefPer, # 弱化暴伤 260 CDBPlayerRefresh_Lingyu, # 灵玉 261 CDBPlayerRefresh_BossTrial, # 凭证积分 262 -) = range(146, 263) +CDBPlayerRefresh_GatherSoul, # 聚魂精华 263 +) = range(146, 264) TYPE_Price_Gold_Paper_Money = 5 # 金钱类型,(先用礼券,再用金子) TYPE_Price_Family_Contribution = 6 # 战盟贡献度(活跃度转换得来) @@ -1141,6 +1142,7 @@ TYPE_Price_Xiantao = 41 # 仙桃 TYPE_Price_Lingyu = 42 # 灵玉 TYPE_Price_BossTrial = 43 # boss历练凭证积分 +TYPE_Price_GatherSoul = 44 # 聚魂精华 TYPE_Price_PayCoin = 99 # 代币 #key可用于遍历所有货币,value仅GM相关会用到 @@ -1148,7 +1150,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:"凭证积分", 99:"代币" + 39:"成就积分", 40:"万界积分", 43:"凭证积分", 44:"聚魂精华", 99:"代币" } #以下是旧的金钱类型 @@ -1181,6 +1183,7 @@ TYPE_Price_SuccessSocre:CDBPlayerRefresh_SuccessScore, TYPE_Price_FamilyFlagWarPoint:CDBPlayerRefresh_FamilyFlagWarPoint, TYPE_Price_BossTrial:CDBPlayerRefresh_BossTrial, + TYPE_Price_GatherSoul:CDBPlayerRefresh_GatherSoul, } # 支持负值的货币及对应0418刷新类型 @@ -1707,7 +1710,7 @@ )=range(5) # 战斗力模块类型 -Def_MFPType_Max = 33 +Def_MFPType_Max = 34 ModuleFightPowerTypeList = ( Def_MFPType_Role, # 角色 0 Def_MFPType_Equip, # 装备(装备本身) 1 @@ -1741,6 +1744,7 @@ Def_MFPType_Gubao, # 古宝 29 Def_MFPType_Shentong, # 神通 30 Def_MFPType_FamilyZhenfa, # 阵法 31 +Def_MFPType_GatherTheSoul, # 聚魂新 32 Def_MFPType_Other, # 其他 ) = range(Def_MFPType_Max) @@ -2038,7 +2042,10 @@ SuccType_EquipWashTotal, # 全身洗炼总等级X级 175 SuccType_CrossPK, # 跨服PK x次 176 SuccType_FamilyZhenfaExp, # 仙盟阵法捐献累计经验 177 -) = range(1, 178) +SuccType_PassAdventure, #通关冒险 178 +SuccType_GatherTheSoulColor, #聚魂激活x品质x个 179 +SuccType_GatherTheSoulLV, #聚魂总等级x 180 +) = range(1, 181) # 节日红包成就类型 FeastRedPackSuccessTypeList = range(SuccType_FeastRedPack_TalkWorld, SuccType_FeastRedPack_FBSweep + 1) @@ -2072,6 +2079,7 @@ SuccType_EquipStarClass:[0], # 阶不向下适配 SuccType_EquipStoneClass:[0], # 阶不向下适配 SuccType_EquipWashClass:[0], # 阶不向下适配 + SuccType_GatherTheSoulColor:[0], # 品质不向下适配 } #传进来的条件满足配置的条件列表中的一个就行的成就类型 diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini index 5b602f4..497e379 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini @@ -1645,6 +1645,18 @@ PacketSubCMD_1=0x09 PacketCallFunc_1=OnActCollectWordsExchange +;新聚魂 +[PlayerGatherTheSoul] +ScriptName = Player\PlayerGatherTheSoul.py +Writer = hxp +Releaser = hxp +RegType = 0 +RegisterPackCount = 1 + +PacketCMD_1=0xB2 +PacketSubCMD_1=0x25 +PacketCallFunc_1=OnGatherTheSoulOP + ;聚魂 [PlayerGatherSoul] ScriptName = Player\PlayerGatherSoul.py diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py index 00c8a65..1c4247d 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py @@ -507,6 +507,7 @@ Def_Effect_AddArenaBattleCount = 257 #增加竞技场挑战次数,A值为增加次数 Def_Effect_ItemGiveMoney = 264 #通用给货币道具,A值数量,B值货币类型 Def_Effect_GuajiAward = 266 #直接给挂机收益,A值分钟 +Def_Effect_ItemCount = 267 #自动转化为对应物品ID的个数,不存背包 Def_Effect_GubaoPiece = 270 #古宝碎片效果ID, A值-古宝ID #----以下未使用或代码依然存在的--- Def_Effect_ItemGiveGongXun = 1920 #使用道具给予功勋 @@ -3853,6 +3854,9 @@ #虚拟背包物品数据 Def_PDict_VPackItem = "VPackItem_%s_%s" # 虚拟背包物品数据, 参数(背包类型, 位置索引) +#物品个数 +Def_PDict_ItemCount = "ItemCount_%s" # 存储不放在背包的物品个数, 参数(物品ID) + #一次性最大充值 Def_Player_RechargeOnce_Coin = "RechargeOnce_Coin" @@ -4165,6 +4169,10 @@ # 聚魂 Def_PDict_GatherSoulHoleData = "GatherSoulHoleData_%s" # 聚魂镶嵌数据, 参数(第几孔) + +# 新聚魂 +Def_PDict_GatherTheSoulHoleID = "GatherTheSoulHoleID_%s" # 聚魂镶嵌ID, 参数(孔编号) +Def_PDict_GatherTheSoulLV = "GatherTheSoulLV_%s" # 聚魂等级, 参数(聚魂ID) # 副本 Def_PDictType_FB Def_PDict_LastEnterFBPropertyID = "LastEnterFBPropertyID_%s" # 上次进入副本的propertyID%s副本id @@ -4957,7 +4965,8 @@ Def_CalcAttrFunc_PetStar, # 灵宠星级 58 Def_CalcAttrFunc_TitleStar, # 称号星级 59 Def_CalcAttrFunc_FamilyZhenfa, # 仙盟阵法 60 -) = range(61) +Def_CalcAttrFunc_GatherTheSoul, # 聚魂新 61 +) = range(62) # 技能功能点列表 - 默认不算战力,不享受百分比加成,技能功能点暂时配置,之后优化技能属性逻辑后可去掉 CalcAttrFuncSkillList = [Def_CalcAttrFunc_HorseSkill, Def_CalcAttrFunc_PetSkill, Def_CalcAttrFunc_DogzBattleSkill] @@ -4996,6 +5005,7 @@ ShareDefine.Def_MFPType_MagicWeapon4:[Def_CalcAttrFunc_MagicWeapon4], ShareDefine.Def_MFPType_StoveYao:[Def_CalcAttrFunc_StoveYao], ShareDefine.Def_MFPType_GatherSoul:[Def_CalcAttrFunc_GatherSoul], + ShareDefine.Def_MFPType_GatherTheSoul:[Def_CalcAttrFunc_GatherTheSoul], ShareDefine.Def_MFPType_Coat:[Def_CalcAttrFunc_Coat], ShareDefine.Def_MFPType_Dogz:[Def_CalcAttrFunc_Dogz, Def_CalcAttrFunc_DogzEquip, Def_CalcAttrFunc_DogzEquipPlus, Def_CalcAttrFunc_DogzBattleSkill], ShareDefine.Def_MFPType_FamilyZhenfa:[Def_CalcAttrFunc_FamilyZhenfa], @@ -5010,7 +5020,7 @@ ShareDefine.Def_MFPType_PetSoul:"宠魂", ShareDefine.Def_MFPType_HorseSoul:"骑魂", ShareDefine.Def_MFPType_FaQi:"法器", ShareDefine.Def_MFPType_Dogz:"神兽", ShareDefine.Def_MFPType_Coat:"时装", ShareDefine.Def_MFPType_Love:"情缘", ShareDefine.Def_MFPType_Charm:"魅力", ShareDefine.Def_MFPType_LianTi:"炼体", ShareDefine.Def_MFPType_Enchant:"附魔", ShareDefine.Def_MFPType_Gubao:"古宝", ShareDefine.Def_MFPType_Shentong:"神通", ShareDefine.Def_MFPType_FamilyZhenfa:"阵法", - ShareDefine.Def_MFPType_Other:"其他", + ShareDefine.Def_MFPType_GatherTheSoul:"聚魂新", ShareDefine.Def_MFPType_Other:"其他", } FuncIndexName = { @@ -5029,6 +5039,7 @@ Def_CalcAttrFunc_LoveRing:"情戒基础", Def_CalcAttrFunc_LoveRingCouple:"情戒仙侣", Def_CalcAttrFunc_Charm:"魅力", Def_CalcAttrFunc_LianTi:"炼体", Def_CalcAttrFunc_Enchant:"附魔", Def_CalcAttrFunc_LingQiEnchant:"灵器附魔", Def_CalcAttrFunc_Gubao:"古宝", Def_CalcAttrFunc_Shentong:"神通", Def_CalcAttrFunc_HorseStar:"坐骑星级", Def_CalcAttrFunc_PetStar:"宠物星级", Def_CalcAttrFunc_TitleStar:"称号星级", Def_CalcAttrFunc_FamilyZhenfa:"阵法", + Def_CalcAttrFunc_GatherTheSoul:"聚魂新", } #------------------------------------------------------------------------------- @@ -5756,7 +5767,9 @@ Def_SkillFuncType_EquipPassiveSkill, #18 装备被动技能 Def_SkillFuncType_LianTiSkill, #19 炼体技能 Def_SkillFuncType_ShentongSkill, #20 神通技能 -) = range(21) +Def_SkillFuncType_ElfSkill, #21 精怪技能 +Def_SkillFuncType_GatherTheSoul, #22 聚魂技能 +) = range(23) # 受技能效果完全影响的怪, 对应 Def_BattleRelationType_CommNoBoss Def_SkillAttack_NPCIsBoss = [ Def_NPCType_Ogre_Normal , #平凡小怪 0 # c++ 定义为普通NPC视野刷新 diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py index f396f18..cb3d74e 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py @@ -18709,6 +18709,62 @@ #------------------------------------------------------ +# B2 25 新聚魂操作 #tagCMGatherTheSoulOP + +class tagCMGatherTheSoulOP(Structure): + _pack_ = 1 + _fields_ = [ + ("Cmd", c_ubyte), + ("SubCmd", c_ubyte), + ("OpType", c_ubyte), # 0-激活升级; 1-穿戴替换; 2-卸下 + ("SoulID", c_int), # 聚魂ID;当操作升级时,如果为0代表一键升级所有可升级的 + ] + + def __init__(self): + self.Clear() + self.Cmd = 0xB2 + self.SubCmd = 0x25 + 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 = 0x25 + self.OpType = 0 + self.SoulID = 0 + return + + def GetLength(self): + return sizeof(tagCMGatherTheSoulOP) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// B2 25 新聚魂操作 //tagCMGatherTheSoulOP: + Cmd:%s, + SubCmd:%s, + OpType:%d, + SoulID:%d + '''\ + %( + self.Cmd, + self.SubCmd, + self.OpType, + self.SoulID + ) + return DumpString + + +m_NAtagCMGatherTheSoulOP=tagCMGatherTheSoulOP() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMGatherTheSoulOP.Cmd,m_NAtagCMGatherTheSoulOP.SubCmd))] = m_NAtagCMGatherTheSoulOP + + +#------------------------------------------------------ # B2 12 领取功能系统特权奖励 #tagCMGetFuncSysPrivilegeAward class tagCMGetFuncSysPrivilegeAward(Structure): diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py index 6cd4165..1e534a0 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py @@ -18886,6 +18886,114 @@ #------------------------------------------------------ +# A2 06 自动转化为对应物品ID个数刷新 #tagMCAutoItemCountRefresh + +class tagMCAutoItemCount(Structure): + _pack_ = 1 + _fields_ = [ + ("ItemID", c_int), + ("ItemCount", c_int), + ] + + 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.ItemID = 0 + self.ItemCount = 0 + return + + def GetLength(self): + return sizeof(tagMCAutoItemCount) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// A2 06 自动转化为对应物品ID个数刷新 //tagMCAutoItemCountRefresh: + ItemID:%d, + ItemCount:%d + '''\ + %( + self.ItemID, + self.ItemCount + ) + return DumpString + + +class tagMCAutoItemCountRefresh(Structure): + Head = tagHead() + Count = 0 #(WORD Count)// 刷新个数 + ItemCountList = list() #(vector<tagMCAutoItemCount> ItemCountList)// 物品信息列表 + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xA2 + self.Head.SubCmd = 0x06 + return + + def ReadData(self, _lpData, _pos=0, _Len=0): + self.Clear() + _pos = self.Head.ReadData(_lpData, _pos) + self.Count,_pos = CommFunc.ReadWORD(_lpData, _pos) + for i in range(self.Count): + temItemCountList = tagMCAutoItemCount() + _pos = temItemCountList.ReadData(_lpData, _pos) + self.ItemCountList.append(temItemCountList) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xA2 + self.Head.SubCmd = 0x06 + self.Count = 0 + self.ItemCountList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 2 + for i in range(self.Count): + length += self.ItemCountList[i].GetLength() + + return length + + def GetBuffer(self): + data = '' + data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer()) + data = CommFunc.WriteWORD(data, self.Count) + for i in range(self.Count): + data = CommFunc.WriteString(data, self.ItemCountList[i].GetLength(), self.ItemCountList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + Count:%d, + ItemCountList:%s + '''\ + %( + self.Head.OutputString(), + self.Count, + "..." + ) + return DumpString + + +m_NAtagMCAutoItemCountRefresh=tagMCAutoItemCountRefresh() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCAutoItemCountRefresh.Head.Cmd,m_NAtagMCAutoItemCountRefresh.Head.SubCmd))] = m_NAtagMCAutoItemCountRefresh + + +#------------------------------------------------------ # A2 03 最后一次背包开格的在线时间 #tagMCOnlineTimeLastOpenPack class tagMCOnlineTimeLastOpenPack(Structure): @@ -22209,6 +22317,181 @@ #------------------------------------------------------ +# A3 61 新聚魂孔信息 #tagMCGatherTheSoulHoleInfo + +class tagMCGatherTheSoulHoleInfo(Structure): + Head = tagHead() + Count = 0 #(BYTE Count)// 孔数 + HoleSoulList = list() #(vector<DWORD> HoleSoulList)// 孔聚魂ID列表 + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xA3 + self.Head.SubCmd = 0x61 + 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): + value,_pos=CommFunc.ReadDWORD(_lpData,_pos) + self.HoleSoulList.append(value) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xA3 + self.Head.SubCmd = 0x61 + self.Count = 0 + self.HoleSoulList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 1 + length += 4 * self.Count + + 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.WriteDWORD(data, self.HoleSoulList[i]) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + Count:%d, + HoleSoulList:%s + '''\ + %( + self.Head.OutputString(), + self.Count, + "..." + ) + return DumpString + + +m_NAtagMCGatherTheSoulHoleInfo=tagMCGatherTheSoulHoleInfo() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCGatherTheSoulHoleInfo.Head.Cmd,m_NAtagMCGatherTheSoulHoleInfo.Head.SubCmd))] = m_NAtagMCGatherTheSoulHoleInfo + + +#------------------------------------------------------ +# A3 60 新聚魂信息 #tagMCGatherTheSoulInfo + +class tagMCGatherTheSoul(Structure): + _pack_ = 1 + _fields_ = [ + ("SoulID", c_int), + ("LV", c_ushort), + ] + + 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.SoulID = 0 + self.LV = 0 + return + + def GetLength(self): + return sizeof(tagMCGatherTheSoul) + + def GetBuffer(self): + return string_at(addressof(self), self.GetLength()) + + def OutputString(self): + DumpString = '''// A3 60 新聚魂信息 //tagMCGatherTheSoulInfo: + SoulID:%d, + LV:%d + '''\ + %( + self.SoulID, + self.LV + ) + return DumpString + + +class tagMCGatherTheSoulInfo(Structure): + Head = tagHead() + Count = 0 #(BYTE Count)// 信息个数 + SoulList = list() #(vector<tagMCGatherTheSoul> SoulList)// 信息列表 + data = None + + def __init__(self): + self.Clear() + self.Head.Cmd = 0xA3 + self.Head.SubCmd = 0x60 + 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): + temSoulList = tagMCGatherTheSoul() + _pos = temSoulList.ReadData(_lpData, _pos) + self.SoulList.append(temSoulList) + return _pos + + def Clear(self): + self.Head = tagHead() + self.Head.Clear() + self.Head.Cmd = 0xA3 + self.Head.SubCmd = 0x60 + self.Count = 0 + self.SoulList = list() + return + + def GetLength(self): + length = 0 + length += self.Head.GetLength() + length += 1 + for i in range(self.Count): + length += self.SoulList[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.SoulList[i].GetLength(), self.SoulList[i].GetBuffer()) + return data + + def OutputString(self): + DumpString = ''' + Head:%s, + Count:%d, + SoulList:%s + '''\ + %( + self.Head.OutputString(), + self.Count, + "..." + ) + return DumpString + + +m_NAtagMCGatherTheSoulInfo=tagMCGatherTheSoulInfo() +ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCGatherTheSoulInfo.Head.Cmd,m_NAtagMCGatherTheSoulInfo.Head.SubCmd))] = m_NAtagMCGatherTheSoulInfo + + +#------------------------------------------------------ # A3 1D 神兵等级信息 #tagMCGodWeaponLVList class tagMCGodWeaponLVInfo(Structure): diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/GatherSoul.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/GatherSoul.py new file mode 100644 index 0000000..f858c6f --- /dev/null +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/GatherSoul.py @@ -0,0 +1,64 @@ +#!/usr/bin/python +# -*- coding: GBK -*- +#------------------------------------------------------------------------------- +# +##@package GM.Commands.GatherSoul +# +# @todo:设置聚魂新 +# @author hxp +# @date 2024-07-12 +# @version 1.0 +# +# 详细描述: 设置聚魂新 +# +#------------------------------------------------------------------------------- +#"""Version = 2024-07-12 16:30""" +#------------------------------------------------------------------------------- + +import GameWorld +import ChConfig +import IpyGameDataPY +import PlayerGatherTheSoul +import PlayerControl + +#--------------------------------------------------------------------- +#逻辑实现 +## GM命令执行入口 +# @param curPlayer 当前玩家 +# @param paramList 参数列表 [index,1True] +# @return None +# @remarks 函数详细说明. +def OnExec(curPlayer, paramList): + if not paramList: + GameWorld.DebugAnswer(curPlayer, "重置所有聚魂: GahterSoul 0") + GameWorld.DebugAnswer(curPlayer, "设置聚魂等级: GahterSoul 聚魂ID 等级") + return + + value1 = paramList[0] + if value1 == 0: + # 卸下所有镶嵌 + for holeNum in range(1, 1 + IpyGameDataPY.GetFuncCfg("GatherTheSoulHole", 1)): + soulID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GatherTheSoulHoleID % holeNum) + if soulID: + PlayerGatherTheSoul.OnGatherTheSoulTakeoff(curPlayer, soulID) + + # 重置所有等级 + resetSoulIDList = [] + ipyDataMgr = IpyGameDataPY.IPY_Data() + for index in range(ipyDataMgr.GetGatherTheSoulCount()): + ipyData = ipyDataMgr.GetGatherTheSoulByIndex(index) + soulID = ipyData.GetSoulID() + if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GatherTheSoulLV % soulID): + resetSoulIDList.append(soulID) + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GatherTheSoulLV % soulID, 0) + + PlayerGatherTheSoul.Sync_SoulInfo(curPlayer, resetSoulIDList) + PlayerGatherTheSoul.RefreshGatherTheSoulAttr(curPlayer, True) + + else: + soulID = value1 + soulLV = paramList[1] if len(paramList) > 1 else 1 + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GatherTheSoulLV % soulID, soulLV) + PlayerGatherTheSoul.Sync_SoulInfo(curPlayer, [soulID]) + PlayerGatherTheSoul.RefreshGatherTheSoulAttr(curPlayer, True) + return diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetItemCount.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetItemCount.py new file mode 100644 index 0000000..dfbb1e6 --- /dev/null +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetItemCount.py @@ -0,0 +1,64 @@ +#!/usr/bin/python +# -*- coding: GBK -*- +#------------------------------------------------------------------------------- +# +##@package GM.Commands.SetItemCount +# +# @todo:设置物品个数 +# @author hxp +# @date 2024-07-12 +# @version 1.0 +# +# 详细描述: 设置物品个数 +# +#------------------------------------------------------------------------------- +#"""Version = 2024-07-12 16:30""" +#------------------------------------------------------------------------------- + +import GameWorld +import ItemControler +import PyGameData +import ChConfig + +#--------------------------------------------------------------------- +#逻辑实现 +## GM命令执行入口 +# @param curPlayer 当前玩家 +# @param paramList 参数列表 [index,1True] +# @return None +# @remarks 函数详细说明. +def OnExec(curPlayer, paramList): + if not paramList: + GameWorld.DebugAnswer(curPlayer, "清空所有个数: SetItemCount 0") + GameWorld.DebugAnswer(curPlayer, "设置指定个数: SetItemCount itemID 个数") + return + + value1 = paramList[0] + if value1 == 0: + for itemID in PyGameData.AutoTransformCountItemIDList: + if ItemControler.GetItemCountByID(curPlayer, itemID): + ItemControler.SetItemCountByID(curPlayer, itemID, 0) + elif value1 == "print": + for itemID in PyGameData.AutoTransformCountItemIDList: + itemCount = ItemControler.GetItemCountByID(curPlayer, itemID) + if itemCount: + GameWorld.DebugAnswer(curPlayer, "ID:%s, 个数:%s" % (itemID, itemCount)) + else: + itemID = value1 + if len(paramList) <= 1: + itemCount = ItemControler.GetItemCountByID(curPlayer, itemID) + GameWorld.DebugAnswer(curPlayer, "ID:%s, 个数:%s" % (itemID, itemCount)) + return + itemCount = paramList[1] + itemData = GameWorld.GetGameData().GetItemByTypeID(itemID) + if not itemData: + GameWorld.DebugAnswer(curPlayer, "物品不存在!itemID:%s" % itemID) + return + effID = itemData.GetEffectByIndex(0).GetEffectID() + #物品碎片 + if effID != ChConfig.Def_Effect_ItemCount: + GameWorld.DebugAnswer(curPlayer, "该物品ID不可直接设置个数:%s,需配置效果ID:%s" % (itemID, ChConfig.Def_Effect_ItemCount)) + return + ItemControler.SetItemCountByID(curPlayer, itemID, itemCount) + + return diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py index 24fdd7d..5fe1aa7 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py @@ -1290,6 +1290,7 @@ ("BYTE", "TreasureType", 1), ("WORD", "MinLV", 0), ("dict", "GridItemInfo", 0), + ("dict", "GridLibInfo", 0), ("list", "JobItemList", 0), ("list", "GridItemRateListFree", 0), ("list", "FreeGridItemRateList2", 0), @@ -1298,6 +1299,13 @@ ("list", "GridItemRateList2", 0), ("dict", "GridItemRateList3", 0), ("BYTE", "LuckyGridNum", 0), + ), + + "TreasureItemLib":( + ("WORD", "LibID", 1), + ("DWORD", "ItemID", 0), + ("DWORD", "ItemCount", 0), + ("DWORD", "ItemWeight", 0), ), "FreeGoods":( @@ -1818,6 +1826,24 @@ ("BYTE", "CopyMapID", 1), ("WORD", "PosX", 0), ("WORD", "PosY", 0), + ), + + "GatherTheSoul":( + ("DWORD", "SoulID", 1), + ("DWORD", "PieceItemID", 0), + ("BYTE", "HoleNum", 0), + ("BYTE", "SoulColor", 0), + ("DWORD", "SoulSkillTypeID", 0), + ("list", "SoulSkillLVList", 0), + ), + + "GatherTheSoulLV":( + ("DWORD", "SoulID", 1), + ("WORD", "SoulLV", 1), + ("WORD", "NeedPiece", 0), + ("DWORD", "NeedSoulValue", 0), + ("list", "LVAttrTypeList", 0), + ("list", "LVAttrValueList", 0), ), "GatherSoul":( @@ -4162,14 +4188,27 @@ def GetTreasureType(self): return self.attrTuple[0] # 寻宝类型 BYTE def GetMinLV(self): return self.attrTuple[1] # 最小等级 WORD def GetGridItemInfo(self): return self.attrTuple[2] # 格子编号对应物品信息 {"编号":[物品ID, 个数], ...} dict - def GetJobItemList(self): return self.attrTuple[3] # 职业物品组列表 [[职业1物品, 职业2物品, ...], ...] list - def GetGridItemRateListFree(self): return self.attrTuple[4] # 免费产出格子编号饼图 [[概率, 格子编号], ...] list - def GetFreeGridItemRateList2(self): return self.attrTuple[5] # 免费每满x次保底产出格子编号饼图 [[概率, 格子编号], ...] list - def GetFreeGridItemRateList3(self): return self.attrTuple[6] # 免费第x次必出产出格子编号饼图 {次数:[[概率, 格子编号], ...], ...} dict - def GetGridItemRateList1(self): return self.attrTuple[7] # 常规产出格子编号饼图 [[概率, 格子编号], ...] list - def GetGridItemRateList2(self): return self.attrTuple[8] # 每满x次保底产出格子编号饼图 [[概率, 格子编号], ...] list - def GetGridItemRateList3(self): return self.attrTuple[9] # 第x次必出产出格子编号饼图 {次数:[[概率, 格子编号], ...], ...} dict - def GetLuckyGridNum(self): return self.attrTuple[10] # 幸运加成格子编号 BYTE + def GetGridLibInfo(self): return self.attrTuple[3] # 格子编号对应库ID {"编号":物品库ID, ...} dict + def GetJobItemList(self): return self.attrTuple[4] # 职业物品组列表 [[职业1物品, 职业2物品, ...], ...] list + def GetGridItemRateListFree(self): return self.attrTuple[5] # 免费产出格子编号饼图 [[概率, 格子编号], ...] list + def GetFreeGridItemRateList2(self): return self.attrTuple[6] # 免费每满x次保底产出格子编号饼图 [[概率, 格子编号], ...] list + def GetFreeGridItemRateList3(self): return self.attrTuple[7] # 免费第x次必出产出格子编号饼图 {次数:[[概率, 格子编号], ...], ...} dict + def GetGridItemRateList1(self): return self.attrTuple[8] # 常规产出格子编号饼图 [[概率, 格子编号], ...] list + def GetGridItemRateList2(self): return self.attrTuple[9] # 每满x次保底产出格子编号饼图 [[概率, 格子编号], ...] list + def GetGridItemRateList3(self): return self.attrTuple[10] # 第x次必出产出格子编号饼图 {次数:[[概率, 格子编号], ...], ...} dict + def GetLuckyGridNum(self): return self.attrTuple[11] # 幸运加成格子编号 BYTE + +# 寻宝物品库 +class IPY_TreasureItemLib(): + + def __init__(self): + self.attrTuple = None + return + + def GetLibID(self): return self.attrTuple[0] # 库ID WORD + def GetItemID(self): return self.attrTuple[1] # 物品ID DWORD + def GetItemCount(self): return self.attrTuple[2] # 物品个数 DWORD + def GetItemWeight(self): return self.attrTuple[3] # 物品权重 DWORD # 极品白拿表 class IPY_FreeGoods(): @@ -4985,6 +5024,34 @@ def GetCopyMapID(self): return self.attrTuple[3] # 虚拟线路ID BYTE def GetPosX(self): return self.attrTuple[4] # 坐标X WORD def GetPosY(self): return self.attrTuple[5] # 坐标Y WORD + +# 聚魂新表 +class IPY_GatherTheSoul(): + + def __init__(self): + self.attrTuple = None + return + + def GetSoulID(self): return self.attrTuple[0] # 聚魂ID DWORD + def GetPieceItemID(self): return self.attrTuple[1] # 碎片物品ID DWORD + def GetHoleNum(self): return self.attrTuple[2] # 孔编号 BYTE + def GetSoulColor(self): return self.attrTuple[3] # 品质 BYTE + def GetSoulSkillTypeID(self): return self.attrTuple[4] # 技能TypeID DWORD + def GetSoulSkillLVList(self): return self.attrTuple[5] # 技能等级所需魂等级列表 list + +# 聚魂新升级表 +class IPY_GatherTheSoulLV(): + + def __init__(self): + self.attrTuple = None + return + + def GetSoulID(self): return self.attrTuple[0] # 聚魂ID DWORD + def GetSoulLV(self): return self.attrTuple[1] # 魂等级 WORD + def GetNeedPiece(self): return self.attrTuple[2] # 该级所需碎片 WORD + def GetNeedSoulValue(self): return self.attrTuple[3] # 所需聚魂精华 DWORD + def GetLVAttrTypeList(self): return self.attrTuple[4] # 累计总属性类型 list + def GetLVAttrValueList(self): return self.attrTuple[5] # 累计总属性值 list # 聚魂表 class IPY_GatherSoul(): @@ -5960,6 +6027,7 @@ self.__LoadFileData("Invest", onlyCheck) self.__LoadFileData("XBXZ", onlyCheck) self.__LoadFileData("TreasureHouse", onlyCheck) + self.__LoadFileData("TreasureItemLib", onlyCheck) self.__LoadFileData("FreeGoods", onlyCheck) self.__LoadFileData("ActFlashGiftbag", onlyCheck) self.__LoadFileData("FlashGiftbag", onlyCheck) @@ -6019,6 +6087,8 @@ self.__LoadFileData("CrossPenglaiZoneMap", onlyCheck) self.__LoadFileData("CrossDemonLandZoneMap", onlyCheck) self.__LoadFileData("CrossFamilyFlagwarZoneMap", onlyCheck) + self.__LoadFileData("GatherTheSoul", onlyCheck) + self.__LoadFileData("GatherTheSoulLV", onlyCheck) self.__LoadFileData("GatherSoul", onlyCheck) self.__LoadFileData("GatherSoulCompound", onlyCheck) self.__LoadFileData("GatherSoulAttr", onlyCheck) @@ -7104,6 +7174,13 @@ self.CheckLoadData("TreasureHouse") return self.ipyTreasureHouseCache[index] + def GetTreasureItemLibCount(self): + self.CheckLoadData("TreasureItemLib") + return self.ipyTreasureItemLibLen + def GetTreasureItemLibByIndex(self, index): + self.CheckLoadData("TreasureItemLib") + return self.ipyTreasureItemLibCache[index] + def GetFreeGoodsCount(self): self.CheckLoadData("FreeGoods") return self.ipyFreeGoodsLen @@ -7517,6 +7594,20 @@ self.CheckLoadData("CrossFamilyFlagwarZoneMap") return self.ipyCrossFamilyFlagwarZoneMapCache[index] + def GetGatherTheSoulCount(self): + self.CheckLoadData("GatherTheSoul") + return self.ipyGatherTheSoulLen + def GetGatherTheSoulByIndex(self, index): + self.CheckLoadData("GatherTheSoul") + return self.ipyGatherTheSoulCache[index] + + def GetGatherTheSoulLVCount(self): + self.CheckLoadData("GatherTheSoulLV") + return self.ipyGatherTheSoulLVLen + def GetGatherTheSoulLVByIndex(self, index): + self.CheckLoadData("GatherTheSoulLV") + return self.ipyGatherTheSoulLVCache[index] + def GetGatherSoulCount(self): self.CheckLoadData("GatherSoul") return self.ipyGatherSoulLen diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py index e4d03be..65c90c3 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py @@ -37,6 +37,7 @@ import IpyGameDataPY import DataRecordPack import PlayerGubao +import PyGameData import EventShell import PlayerVip import ChEquip @@ -1125,6 +1126,11 @@ tagItem.Clear() return True itemEff = tagItem.GetEffectByIndex(0) + #物品碎片 + if itemEff.GetEffectID() == ChConfig.Def_Effect_ItemCount: + SetItemCountByID(curPlayer, itemID, GetItemCountByID(curPlayer, itemID) + tagItemCount) + tagItem.Clear() + return True #古宝碎片 if itemEff.GetEffectID() == ChConfig.Def_Effect_GubaoPiece: gubaoID = itemEff.GetEffectValue(0) @@ -1456,6 +1462,35 @@ vpackClear.ItemPlaceList = placeList vpackClear.Count = len(vpackClear.ItemPlaceList) NetPackCommon.SendFakePack(curPlayer, vpackClear) + return + +def Sync_AutoItemCount(curPlayer, itemIDList=None): + ## 通知自动转化为物品个数的物品个数信息 + if not itemIDList: + force = False + itemIDList = PyGameData.AutoTransformCountItemIDList + else: + force = True # 指定ID的强制通知 + + itemCountList = [] + for itemID in itemIDList: + itemCount = GetItemCountByID(curPlayer, itemID) + if not itemCount and not force: + continue + countInfo = ChPyNetSendPack.tagMCAutoItemCount() + countInfo.Clear() + countInfo.ItemID = itemID + countInfo.ItemCount = itemCount + itemCountList.append(countInfo) + + if not itemCountList: + return + + clientPack = ChPyNetSendPack.tagMCAutoItemCountRefresh() + clientPack.Clear() + clientPack.ItemCountList = itemCountList + clientPack.Count = len(clientPack.ItemCountList) + NetPackCommon.SendFakePack(curPlayer, clientPack) return #// A3 09 转移物品到其他背包 #tagCMDropItemToOtherPack @@ -1999,6 +2034,7 @@ #============================================================================== def OnPlayerLogin(curPlayer): __CheckTransferItemPack(curPlayer) + Sync_AutoItemCount(curPlayer) return def __CheckTransferItemPack(curPlayer): @@ -2340,6 +2376,15 @@ return +def GetItemCountByID(curPlayer, itemID): + return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ItemCount % itemID) +def SetItemCountByID(curPlayer, itemID, itemCount, isSync=True): + itemCount = max(0, min(itemCount, ChConfig.Def_UpperLimit_DWord)) + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ItemCount % itemID, itemCount) + if isSync: + Sync_AutoItemCount(curPlayer, [itemID]) + return itemCount + ## 设置物品数量 # @param item 物品实例 # @param cnt 数量 @@ -2387,6 +2432,8 @@ if itemData.GetItemTypeID() in ChConfig.Def_TransformItemIDList or itemData.GetType() == ChConfig.Def_ItemType_AutoUseMoney: return True itemEff = itemData.GetEffectByIndex(0) + if itemEff.GetEffectID() == ChConfig.Def_Effect_ItemCount: + return True if itemEff.GetEffectID() == ChConfig.Def_Effect_GubaoPiece: gubaoID = itemEff.GetEffectValue(0) if gubaoID: diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py index 43a07fe..bc58be7 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py @@ -61,6 +61,7 @@ PyGameData.EquipItemSkillIDList = [] PyGameData.DailyUseCountLimitItemIDList = [] + PyGameData.AutoTransformCountItemIDList = [] gameData = GameWorld.GetGameData() for i in range(0, gameData.GetItemCount()): @@ -75,6 +76,8 @@ stoneEffType = itemEff.GetEffectValue(0) stoneLevel = itemEff.GetEffectValue(1) PyGameData.g_stoneLevelIDDict[(stoneEffType, stoneLevel)] = itemID + elif curEffID == ChConfig.Def_Effect_ItemCount: + PyGameData.AutoTransformCountItemIDList.append(itemID) if GetIsEquip(findItemData): for skillIndex in xrange(findItemData.GetAddSkillCount()): @@ -90,6 +93,9 @@ if PyGameData.EquipItemSkillIDList: GameWorld.Log("装备技能ID列表: %s" % PyGameData.EquipItemSkillIDList) + if PyGameData.AutoTransformCountItemIDList: + GameWorld.Log("自动转化为物品个数的物品ID列表: %s" % PyGameData.AutoTransformCountItemIDList) + PyGameData.InitPyItem = True return 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 ee4775a..e86d140 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py @@ -71,6 +71,7 @@ import PlayerEquipDecompose import PlayerGreatMaster import PlayerGatherSoul +import PlayerGatherTheSoul import PlayerFairyDomain import PlayerCrossRealmPK import PlayerCrossChampionship @@ -921,6 +922,7 @@ FBHelpBattle.DoPlayerLogin(curPlayer) # 聚魂 PlayerGatherSoul.PlayerLogin(curPlayer) + PlayerGatherTheSoul.OnPlayerLogin(curPlayer) #缥缈仙域 PlayerFairyDomain.OnLogin(curPlayer) PlayerFB.OnLogin(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 3a054f0..857e7dc 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py @@ -60,6 +60,7 @@ import PlayerGameEvent import EventReport import PlayerGatherSoul +import PlayerGatherTheSoul import PlayerSuccess import PlayerPet import PlayerGreatMaster @@ -4613,6 +4614,7 @@ PlayerEquipDecompose.RefreshEDAttr(curPlayer) PlayerDogz.RefreshDogzAttr(curPlayer) PlayerGatherSoul.RefreshGatherSoulAttr(curPlayer) + PlayerGatherTheSoul.CalcSoulAttr(curPlayer) PlayerCoat.CalcClothesCoatSkinAttr(curPlayer) PlayerFaQi.CalcFaQiAttr(curPlayer) PlayerLove.CalcLoveAttr(curPlayer) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGatherTheSoul.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGatherTheSoul.py new file mode 100644 index 0000000..fe0f05a --- /dev/null +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGatherTheSoul.py @@ -0,0 +1,334 @@ +#!/usr/bin/python +# -*- coding: GBK -*- +#------------------------------------------------------------------------------- +# +##@package Player.PlayerGatherTheSoul +# +# @todo:聚魂新 +# @author hxp +# @date 2024-07-12 +# @version 1.0 +# +# 详细描述: 聚魂新 +# +#------------------------------------------------------------------------------- +#"""Version = 2024-07-12 16:30""" +#------------------------------------------------------------------------------- + +import GameWorld +import ShareDefine +import IpyGameDataPY +import ItemControler +import ChPyNetSendPack +import PassiveBuffEffMng +import PlayerSuccess +import PlayerControl +import NetPackCommon +import ChConfig + + +def OnPlayerLogin(curPlayer): + if Sync_SoulInfo(curPlayer): + Sync_SoulHoleInfo(curPlayer) + return + +#// B2 25 新聚魂操作 #tagCMGatherTheSoulOP +# +#struct tagCMGatherTheSoulOP +#{ +# tagHead Head; +# BYTE OpType; // 0-激活升级; 1-穿戴替换; 2-卸下 +# DWORD SoulID; // 聚魂ID;当操作升级时,如果为0代表一键升级所有可升级的 +#}; +def OnGatherTheSoulOP(index, clientData, tick): + curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) + OpType = clientData.OpType + soulID = clientData.SoulID + if OpType == 0: + OnGatherTheSoulUp(curPlayer, soulID) + elif OpType == 1: + OnGatherTheSoulPuton(curPlayer, soulID) + elif OpType == 2: + OnGatherTheSoulTakeoff(curPlayer, soulID) + return + +def OnGatherTheSoulUp(curPlayer, upSoulID): + ## 聚魂激活升级 + # @param upSoulID: 没有指定ID时则批量处理升级 + if not upSoulID: + soulIpyDataList = [] + ipyDataMgr = IpyGameDataPY.IPY_Data() + for index in range(ipyDataMgr.GetGatherTheSoulCount()): + soulIpyDataList.append(ipyDataMgr.GetGatherTheSoulByIndex(index)) + else: + soulIpyDataList = [IpyGameDataPY.GetIpyGameData("GatherTheSoul", upSoulID)] + + holeSoulChange = False + updSoulIDList = [] + playerID = curPlayer.GetPlayerID() + for ipyData in soulIpyDataList: + if not ipyData: + continue + soulID = ipyData.GetSoulID() + soulLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GatherTheSoulLV % soulID) + nextLV = soulLV + 1 + nextLVIpyData = IpyGameDataPY.GetIpyGameDataNotLog("GatherTheSoulLV", soulID, nextLV) + if not nextLVIpyData: + if soulLV: + GameWorld.DebugLog("聚魂已满级! soulID=%s,soulLV=%s" % (soulID, soulLV), playerID) + continue + + pieceItemID = ipyData.GetPieceItemID() + holeNum = ipyData.GetHoleNum() + needPieceCount = nextLVIpyData.GetNeedPiece() + needSoulValue = nextLVIpyData.GetNeedSoulValue() + playerPieceCount = ItemControler.GetItemCountByID(curPlayer, pieceItemID) + if playerPieceCount < needPieceCount: + GameWorld.DebugLog("聚魂碎片不足,无法升级! soulID=%s,nextLV=%s,pieceItemID=%s,playerPieceCount=%s < %s" + % (soulID, nextLV, pieceItemID, playerPieceCount, needPieceCount), playerID) + continue + + if needSoulValue and not PlayerControl.HaveMoney(curPlayer, ShareDefine.TYPE_Price_GatherSoul, needSoulValue, False): + GameWorld.DebugLog("聚魂精华不足,无法升级! soulID=%s,nextLV=%s,needSoulValue=%s" % (soulID, nextLV, needSoulValue), playerID) + continue + + GameWorld.DebugLog("聚魂升级: soulID=%s,nextLV=%s,pieceItemID=%s" % (soulID, nextLV, pieceItemID), playerID) + ItemControler.SetItemCountByID(curPlayer, pieceItemID, playerPieceCount - needPieceCount) + if needSoulValue: + PlayerControl.PayMoney(curPlayer, ShareDefine.TYPE_Price_GatherSoul, needSoulValue, "GatherTheSoulUp", {"soulID":soulID, "nextLV":nextLV}) + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GatherTheSoulLV % soulID, nextLV) + + # 激活额外处理 + if nextLV == 1: + pass + + updSoulIDList.append(soulID) + if soulID == curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GatherTheSoulHoleID % holeNum): + holeSoulChange = True + + if not updSoulIDList: + GameWorld.DebugLog("没有可升级的聚魂!", playerID) + return + + # 成就 + colorCountDict = {} + totalSoulLV = 0 + ipyDataMgr = IpyGameDataPY.IPY_Data() + for index in range(ipyDataMgr.GetGatherTheSoulCount()): + ipyData = ipyDataMgr.GetGatherTheSoulByIndex(index) + soulID = ipyData.GetSoulID() + soulLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GatherTheSoulLV % soulID) + if not soulLV: + continue + totalSoulLV += soulLV + soulColor = ipyData.GetSoulColor() + colorCountDict[soulColor] = colorCountDict.get(soulColor, 0) + 1 + + for soulColor, soulCount in colorCountDict.items(): + PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_GatherTheSoulColor, soulCount, [soulColor]) + PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_GatherTheSoulLV, totalSoulLV) + + Sync_SoulInfo(curPlayer, updSoulIDList) + RefreshGatherTheSoulAttr(curPlayer, holeSoulChange) + return + +def OnGatherTheSoulPuton(curPlayer, soulID): + ## 聚魂穿戴替换 + playerID = curPlayer.GetPlayerID() + soulLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GatherTheSoulLV % soulID) + if not soulLV: + GameWorld.DebugLog("未激活无法穿戴! soulID=%s" % soulID, playerID) + return + ipyData = IpyGameDataPY.GetIpyGameData("GatherTheSoul", soulID) + if not ipyData: + return + holeNum = ipyData.GetHoleNum() + holeSoulID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GatherTheSoulHoleID % holeNum) + GameWorld.DebugLog("聚魂穿戴替换! soulID=%s,holeNum=%s,holeSoulID=%s" % (soulID, holeNum, holeSoulID), playerID) + if holeSoulID == soulID: + return + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GatherTheSoulHoleID % holeNum, soulID) + Sync_SoulHoleInfo(curPlayer) + RefreshGatherTheSoulAttr(curPlayer, True) + return + +def OnGatherTheSoulTakeoff(curPlayer, soulID): + ## 聚魂卸下 + playerID = curPlayer.GetPlayerID() + ipyData = IpyGameDataPY.GetIpyGameData("GatherTheSoul", soulID) + if not ipyData: + return + holeNum = ipyData.GetHoleNum() + holeSoulID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GatherTheSoulHoleID % holeNum) + if holeSoulID != soulID: + GameWorld.DebugLog("该孔没有穿戴该聚魂,无法卸下! soulID=%s,holeNum=%s,holeSoulID=%s" % (soulID, holeNum, holeSoulID), playerID) + return + GameWorld.DebugLog("聚魂卸下! soulID=%s,holeNum=%s" % (soulID, holeNum), playerID) + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GatherTheSoulHoleID % holeNum, 0) + Sync_SoulHoleInfo(curPlayer) + RefreshGatherTheSoulAttr(curPlayer, True) + return + +def GetHoleSoulColorCount(curPlayer, soulColor, isDownward): + ## 获取镶嵌聚魂品质个数 + colorCount = 0 + for holeNum in range(1, 1 + IpyGameDataPY.GetFuncCfg("GatherTheSoulHole", 1)): + soulID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GatherTheSoulHoleID % holeNum) + if not soulID: + continue + ipyData = IpyGameDataPY.GetIpyGameData("GatherTheSoul", soulID) + if not ipyData: + continue + # 向下兼容品质 + if isDownward: + if ipyData.GetSoulColor() < soulColor: + continue + else: + if ipyData.GetSoulColor() != soulColor: + continue + colorCount += 1 + + return colorCount + +def RefreshGatherTheSoulSkill(curPlayer): + ## 刷新穿戴的聚魂技能信息 + + playerID = curPlayer.GetPlayerID() + + soulSkillLVDict = {} + for holeNum in range(1, 1 + IpyGameDataPY.GetFuncCfg("GatherTheSoulHole", 1)): + soulID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GatherTheSoulHoleID % holeNum) + if not soulID: + continue + soulLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GatherTheSoulLV % soulID) + ipyData = IpyGameDataPY.GetIpyGameData("GatherTheSoul", soulID) + if not ipyData: + continue + skillTypeID = ipyData.GetSoulSkillTypeID() + if not skillTypeID: + continue + skillLVList = ipyData.GetSoulSkillLVList() + for skillLV, needSoulLV in enumerate(skillLVList, 1): + if soulLV >= needSoulLV: + soulSkillLVDict[skillTypeID] = skillLV + else: + break + + #GameWorld.DebugLog("刷新聚魂技能: %s" % soulSkillLVDict, playerID) + skillChange = False + playerCtl = PlayerControl.PlayerControl(curPlayer) + skillManager = curPlayer.GetSkillManager() + ipyDataMgr = IpyGameDataPY.IPY_Data() + for index in range(ipyDataMgr.GetGatherTheSoulCount()): + ipyData = ipyDataMgr.GetGatherTheSoulByIndex(index) + holeNum = ipyData.GetHoleNum() + skillTypeID = ipyData.GetSoulSkillTypeID() + if not skillTypeID: + continue + + delSkill = None + if skillTypeID in soulSkillLVDict: + curSkill = skillManager.FindSkillBySkillTypeID(skillTypeID) + if curSkill: + if curSkill.GetSkillLV() != soulSkillLVDict[skillTypeID]: + delSkill = curSkill + else: + # 技能相同不用处理 + continue + else: + delSkill = skillManager.FindSkillBySkillTypeID(skillTypeID) + + # 先删后加 + if delSkill: + skillChange = True + skillID = delSkill.GetSkillID() + GameWorld.DebugLog("删除聚魂技能: holeNum=%s,skillID=%s" % (holeNum, skillID), playerID) + skillManager.DeleteSkillBySkillID(skillID) + playerCtl.RefreshSkillFightPowerByDel(skillID, False) + + if skillTypeID in soulSkillLVDict: + skillLV = soulSkillLVDict[skillTypeID] + skillData = GameWorld.GetGameData().FindSkillByType(skillTypeID, skillLV) + if not skillData: + continue + skillChange = True + skillID = skillData.GetSkillID() + GameWorld.DebugLog("更新聚魂技能: holeNum=%s,skillID=%s" % (holeNum, skillID), playerID) + skillManager.LearnSkillByID(skillID) + playerCtl.RefreshSkillFightPowerEx(skillID, 0, False) + + if skillChange: + PassiveBuffEffMng.GetPassiveEffManager().RegistPassiveEff(curPlayer) + return + +def RefreshGatherTheSoulAttr(curPlayer, refreshSkill=False): + if refreshSkill: + RefreshGatherTheSoulSkill(curPlayer) + CalcSoulAttr(curPlayer) + PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState() + return + +def CalcSoulAttr(curPlayer): + + allAttrListSoul = [{} for _ in range(4)] # 激活的都算属性 + + ipyDataMgr = IpyGameDataPY.IPY_Data() + for index in range(ipyDataMgr.GetGatherTheSoulCount()): + ipyData = ipyDataMgr.GetGatherTheSoulByIndex(index) + soulID = ipyData.GetSoulID() + soulLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GatherTheSoulLV % soulID) + if not soulLV: + continue + lvIpyData = IpyGameDataPY.GetIpyGameData("GatherTheSoulLV", soulID, soulLV) + if not lvIpyData: + continue + LVAttrTypeList = lvIpyData.GetLVAttrTypeList() + LVAttrValueList = lvIpyData.GetLVAttrValueList() + for i, attrID in enumerate(LVAttrTypeList): + attrValue = LVAttrValueList[i] + PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListSoul) + + #GameWorld.DebugLog("聚魂新属性: %s" % allAttrListSoul) + PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_GatherTheSoul, allAttrListSoul) + return + +def Sync_SoulInfo(curPlayer, soulIDList=None): + if not soulIDList: + isForce = False + soulIDList = [] + ipyDataMgr = IpyGameDataPY.IPY_Data() + for index in range(ipyDataMgr.GetGatherTheSoulCount()): + ipyData = ipyDataMgr.GetGatherTheSoulByIndex(index) + soulIDList.append(ipyData.GetSoulID()) + else: + isForce = True + + soulList = [] + for soulID in soulIDList: + soulLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GatherTheSoulLV % soulID) + if not soulLV and not isForce: + continue + soulInfo = ChPyNetSendPack.tagMCGatherTheSoul() + soulInfo.SoulID = soulID + soulInfo.LV = soulLV + soulList.append(soulInfo) + + if not soulList: + return + + clientPack = ChPyNetSendPack.tagMCGatherTheSoulInfo() + clientPack.SoulList = soulList + clientPack.Count = len(clientPack.SoulList) + NetPackCommon.SendFakePack(curPlayer, clientPack) + return True + +def Sync_SoulHoleInfo(curPlayer): + holeSoulList = [] + for holeNum in range(1, 1 + IpyGameDataPY.GetFuncCfg("GatherTheSoulHole", 1)): + soulID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GatherTheSoulHoleID % holeNum) + holeSoulList.append(soulID) + clientPack = ChPyNetSendPack.tagMCGatherTheSoulHoleInfo() + clientPack.HoleSoulList = holeSoulList + clientPack.Count = len(clientPack.HoleSoulList) + NetPackCommon.SendFakePack(curPlayer, clientPack) + return 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 1fcf0e1..c9e5643 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGubao.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGubao.py @@ -30,6 +30,7 @@ import ChConfig import ItemControler import PlayerDienstgrad +import PlayerGatherTheSoul import PlayerCoat GubaoEffType_FamilyWar = 48 # 参与仙盟联赛每X次+XXX属性 x次 @@ -657,6 +658,15 @@ if attrID > 0 and addAttrValue > 0: effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue + #53 镶嵌x品质聚魂每x个+xx属性 x品质 x个 + elif effType == 53: + soulColor = effCond + colorCount = PlayerGatherTheSoul.GetHoleSoulColorCount(curPlayer, soulColor, True) + addAttrValue = int(colorCount / effCond2 * effAttrValue) + #GameWorld.DebugLog(" effID=%s,effType=%s,soulColor=%s,colorCount=%s,effCond2=%s,attrID=%s,addAttrValue=%s" % (effID, effType, soulColor, colorCount, effCond2, attrID, addAttrValue)) + if attrID > 0 and addAttrValue > 0: + effAttrInfo[attrID] = effAttrInfo.get(attrID, 0) + addAttrValue + return def __addStarEffFuncAttr(ipyData, effAttrInfo, funcAttrInfo, effAttrValue): diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py index 6e8e5bf..2ba1cad 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerTreasure.py @@ -36,6 +36,13 @@ import random import time +TreasureTypeList = ( +TreasureType_Jipin, # 极品寻宝 1 +TreasureType_Rune, # 符印寻宝 2 +TreasureType_Jueshi, # 绝世君宝 3 +TreasureType_GatherTheSoul, # 聚魂猎魔 4 +) = range(1, 1 + 4) + def DoTreasureOpen(curPlayer): ## 寻宝开启 @@ -93,6 +100,8 @@ packType = ShareDefine.rptTreasure #if treasureType == 2: # packType = ShareDefine.rptRune + if treasureType in [TreasureType_GatherTheSoul]: + packType = IPY_GameWorld.rptItem if not ItemCommon.CheckPackHasSpace(curPlayer, packType, True): GameWorld.DebugLog("对应寻宝背包没有空格子!packType=%s" % packType, playerID) @@ -274,37 +283,57 @@ isBind = 0 # 暂时默认不绑定 job = curPlayer.GetJob() gridItemInfoDict = ipyData.GetGridItemInfo() # 格子对应物品信息 {"格子编号":[物品ID, 数量], ...} + gridLibInfoDict = ipyData.GetGridLibInfo() # 格子对应物品信息 {"格子编号":[物品ID, 数量], ...} jobItemList = ipyData.GetJobItemList() treasureResult = [] randItemIDDict = IpyGameDataPY.GetFuncEvalCfg("TreasureSet", 2) for gridNum in getGridResult: gridNum = str(gridNum) - if gridNum not in gridItemInfoDict: + if gridNum in gridItemInfoDict: + itemID, itemCount = gridItemInfoDict[gridNum] + itemID = GetJobItem(job, itemID, jobItemList) + if not itemID: + GameWorld.ErrLog("寻宝格子物品ID异常!treasureType=%s,gridNum=%s" % (treasureType, gridNum), playerID) + return + + # 随机产出物品 + if itemID in randItemIDDict: + canRandItemList = [] + randItemIDList = randItemIDDict[itemID] + for randItemID in randItemIDList: + itemData = GameWorld.GetGameData().GetItemByTypeID(randItemID) + if itemData.GetType() == ChConfig.Def_ItemType_Rune and not PlayerRune.GetIsOpenByRuneID(curPlayer, randItemID): + GameWorld.DebugLog("未解锁的符印不产出!itemID=%s,randItemID=%s" % (itemID, randItemID), playerID) + continue + canRandItemList.append(randItemID) + if not canRandItemList: + GameWorld.ErrLog("寻宝随机格子没有可随机的物品!treasureType=%s,treasureIndex=%s,gridNum=%s,itemID=%s" + % (treasureType, treasureIndex, gridNum, itemID), playerID) + return + itemID = random.choice(canRandItemList) + # 根据物品库来随机 + elif gridNum in gridLibInfoDict: + libID = gridLibInfoDict[gridNum] + libItemList = IpyGameDataPY.GetIpyGameDataList("TreasureItemLib", libID) + if not libItemList: + return + itemWeightList = [] + for libItem in libItemList: + itemWeight, itemID, itemCount = libItem.GetItemWeight(), libItem.GetItemID(), libItem.GetItemCount() + itemData = GameWorld.GetGameData().GetItemByTypeID(itemID) + if not itemData: + continue + itemWeightList.append([itemWeight, [itemID, itemCount]]) + if not itemWeightList: + GameWorld.ErrLog("寻宝随机格子没有可随机的物品!treasureType=%s,treasureIndex=%s,gridNum=%s,libID=%s" + % (treasureType, treasureIndex, gridNum, libID), playerID) + return + itemID, itemCount = GameWorld.GetResultByWeightList(itemWeightList) + else: GameWorld.ErrLog("寻宝格子不存在!treasureType=%s,gridNum=%s" % (treasureType, gridNum), playerID) return - itemID, itemCount = gridItemInfoDict[gridNum] - itemID = GetJobItem(job, itemID, jobItemList) - if not itemID: - GameWorld.ErrLog("寻宝格子物品ID异常!treasureType=%s,gridNum=%s" % (treasureType, gridNum), playerID) - return - # 随机产出物品 - if itemID in randItemIDDict: - canRandItemList = [] - randItemIDList = randItemIDDict[itemID] - for randItemID in randItemIDList: - itemData = GameWorld.GetGameData().GetItemByTypeID(randItemID) - if itemData.GetType() == ChConfig.Def_ItemType_Rune and not PlayerRune.GetIsOpenByRuneID(curPlayer, randItemID): - GameWorld.DebugLog("未解锁的符印不产出!itemID=%s,randItemID=%s" % (itemID, randItemID), playerID) - continue - canRandItemList.append(randItemID) - if not canRandItemList: - GameWorld.ErrLog("寻宝随机格子没有可随机的物品!treasureType=%s,treasureIndex=%s,gridNum=%s,itemID=%s" - % (treasureType, treasureIndex, gridNum, itemID), playerID) - return - itemID = random.choice(canRandItemList) - treasureResult.append([gridNum, itemID, itemCount, isBind]) # 扣消耗 @@ -329,19 +358,21 @@ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TreasureLuck % (treasureType), updLuck) PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_TreasureScore, addScore) - if treasureType == 2: + if treasureType == TreasureType_Rune: PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_RuneTreasure, treasureCount) PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_RuneTreasure, treasureCount) PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_RuneTreasure, treasureCount) - elif treasureType == 1: + elif treasureType == TreasureType_Jipin: PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_Treasure, treasureCount) PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_Treasure, treasureCount) PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_Treasure, treasureCount) - elif treasureType == 3: + elif treasureType == TreasureType_Jueshi: PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_JSTreasure, treasureCount) PlayerFeastTravel.AddFeastTravelTaskValue(curPlayer, ChConfig.Def_FeastTravel_JSTreasure, treasureCount) PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_JSTreasure, treasureCount) - + elif treasureType == TreasureType_GatherTheSoul: + pass + # 给物品 mailItemList = [] itemControl = ItemControler.PlayerItemControler(curPlayer) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py index 9b17246..80a5b73 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/PyGameData.py @@ -26,6 +26,7 @@ InitPyItem = False # 是否加载过物品表所需要的Py数据, 每张地图只在启动时执行一次 DailyUseCountLimitItemIDList = [] # 每日有使用个数限制的物品ID列表 EquipItemSkillIDList = [] # 装备技能ID列表 +AutoTransformCountItemIDList = [] # 自动转化为对应物品个数的物品ID列表 g_stoneLevelIDDict = {} # 宝石类型等级对应物品ID {(stoneEffType, stoneLevel):itemID, ...} g_refreshAttrBillboardFunc = [] # 刷属性后需要触发的同步排行榜函数列表 diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py index cd646e4..e3fa8c6 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py @@ -1109,7 +1109,8 @@ CDBPlayerRefresh_SuperHitHurtDefPer, # 弱化暴伤 260 CDBPlayerRefresh_Lingyu, # 灵玉 261 CDBPlayerRefresh_BossTrial, # 凭证积分 262 -) = range(146, 263) +CDBPlayerRefresh_GatherSoul, # 聚魂精华 263 +) = range(146, 264) TYPE_Price_Gold_Paper_Money = 5 # 金钱类型,(先用礼券,再用金子) TYPE_Price_Family_Contribution = 6 # 战盟贡献度(活跃度转换得来) @@ -1141,6 +1142,7 @@ TYPE_Price_Xiantao = 41 # 仙桃 TYPE_Price_Lingyu = 42 # 灵玉 TYPE_Price_BossTrial = 43 # boss历练凭证积分 +TYPE_Price_GatherSoul = 44 # 聚魂精华 TYPE_Price_PayCoin = 99 # 代币 #key可用于遍历所有货币,value仅GM相关会用到 @@ -1148,7 +1150,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:"凭证积分", 99:"代币" + 39:"成就积分", 40:"万界积分", 43:"凭证积分", 44:"聚魂精华", 99:"代币" } #以下是旧的金钱类型 @@ -1181,6 +1183,7 @@ TYPE_Price_SuccessSocre:CDBPlayerRefresh_SuccessScore, TYPE_Price_FamilyFlagWarPoint:CDBPlayerRefresh_FamilyFlagWarPoint, TYPE_Price_BossTrial:CDBPlayerRefresh_BossTrial, + TYPE_Price_GatherSoul:CDBPlayerRefresh_GatherSoul, } # 支持负值的货币及对应0418刷新类型 @@ -1707,7 +1710,7 @@ )=range(5) # 战斗力模块类型 -Def_MFPType_Max = 33 +Def_MFPType_Max = 34 ModuleFightPowerTypeList = ( Def_MFPType_Role, # 角色 0 Def_MFPType_Equip, # 装备(装备本身) 1 @@ -1741,6 +1744,7 @@ Def_MFPType_Gubao, # 古宝 29 Def_MFPType_Shentong, # 神通 30 Def_MFPType_FamilyZhenfa, # 阵法 31 +Def_MFPType_GatherTheSoul, # 聚魂新 32 Def_MFPType_Other, # 其他 ) = range(Def_MFPType_Max) @@ -2038,7 +2042,10 @@ SuccType_EquipWashTotal, # 全身洗炼总等级X级 175 SuccType_CrossPK, # 跨服PK x次 176 SuccType_FamilyZhenfaExp, # 仙盟阵法捐献累计经验 177 -) = range(1, 178) +SuccType_PassAdventure, #通关冒险 178 +SuccType_GatherTheSoulColor, #聚魂激活x品质x个 179 +SuccType_GatherTheSoulLV, #聚魂总等级x 180 +) = range(1, 181) # 节日红包成就类型 FeastRedPackSuccessTypeList = range(SuccType_FeastRedPack_TalkWorld, SuccType_FeastRedPack_FBSweep + 1) @@ -2072,6 +2079,7 @@ SuccType_EquipStarClass:[0], # 阶不向下适配 SuccType_EquipStoneClass:[0], # 阶不向下适配 SuccType_EquipWashClass:[0], # 阶不向下适配 + SuccType_GatherTheSoulColor:[0], # 品质不向下适配 } #传进来的条件满足配置的条件列表中的一个就行的成就类型 -- Gitblit v1.8.0