hxp
2021-10-14 14c1220f82e00ffea6f2759e8ff11d99606220bb
9300 【BT5】【主干】【后端】新增:法器进阶
14个文件已修改
2个文件已添加
549 ■■■■■ 已修改文件
PySysDB/PySysDBPY.h 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/FaQi.py 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintFightPower.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameFuncComm.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFaQi.py 174 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/PySysDBPY.h
@@ -358,6 +358,19 @@
    DWORD        FamilyStoreItemScore;    //仙盟宝库积分
};
//法器升级表
struct tagFaQiLVUp
{
    BYTE        _FaQiLV;    //法器等级
    WORD        NeedEatCount;    //升级所需个数(非累计)
    list        LVAttrType;    //每级额外属性类型(非累积)
    list        LVAttrValue;    //每级额外属性值(非累积)
    list        UpItemAttrType;    //每x个培养丹增加属性类型,x=UpEatItemPerCount
    list        UpItemAttrValue;    //每x个培养丹增加属性值,x=UpEatItemPerCount
    DWORD        UpEatItemPerCount;    //每次培养消耗x个
};
//坐骑升级表
struct tagHorseLVUp
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
@@ -10172,6 +10172,62 @@
#------------------------------------------------------
# A5 32 法器升级 #tagCMFaQiLVUp
class  tagCMFaQiLVUp(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("UseItemCnt", c_ushort),    #消耗材料个数
                  ("IsAutoBuy", c_ubyte),    #是否自动购买
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA5
        self.SubCmd = 0x32
        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 = 0xA5
        self.SubCmd = 0x32
        self.UseItemCnt = 0
        self.IsAutoBuy = 0
        return
    def GetLength(self):
        return sizeof(tagCMFaQiLVUp)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A5 32 法器升级 //tagCMFaQiLVUp:
                                Cmd:%s,
                                SubCmd:%s,
                                UseItemCnt:%d,
                                IsAutoBuy:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.UseItemCnt,
                                self.IsAutoBuy
                                )
        return DumpString
m_NAtagCMFaQiLVUp=tagCMFaQiLVUp()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMFaQiLVUp.Cmd,m_NAtagCMFaQiLVUp.SubCmd))] = m_NAtagCMFaQiLVUp
#------------------------------------------------------
# A5 1C 聚魂合成 #tagCMGatherSoulCompound
class  tagCMGatherSoulCompound(Structure):
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -16345,6 +16345,62 @@
#------------------------------------------------------
# A3 54 法器信息 #tagMCFaQiInfo
class  tagMCFaQiInfo(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("LV", c_ubyte),    #等阶
                  ("EatItemCount", c_int),    #当前阶已吃丹个数
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA3
        self.SubCmd = 0x54
        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 = 0xA3
        self.SubCmd = 0x54
        self.LV = 0
        self.EatItemCount = 0
        return
    def GetLength(self):
        return sizeof(tagMCFaQiInfo)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A3 54 法器信息 //tagMCFaQiInfo:
                                Cmd:%s,
                                SubCmd:%s,
                                LV:%d,
                                EatItemCount:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.LV,
                                self.EatItemCount
                                )
        return DumpString
m_NAtagMCFaQiInfo=tagMCFaQiInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCFaQiInfo.Cmd,m_NAtagMCFaQiInfo.SubCmd))] = m_NAtagMCFaQiInfo
#------------------------------------------------------
#A3 0A 副本鼓舞信息通知 #tagMCFBEncourageInfo
class  tagMCFBEncourageCnt(Structure):
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -1064,6 +1064,7 @@
GameFuncID_SuperGift = 150      # 超值礼包
GameFuncID_ZhuXianBoss = 163    # 诛仙BOSS
GameFuncID_Arena = 195          # 竞技场
GameFuncID_FaQi = 199           # 法器
# 以下为暂时无用的
GameFuncID_Truck = 33           # 运镖
GameFuncID_RunDaily = 34        # 日常跑环
@@ -1377,6 +1378,7 @@
ClientServerMsg_CollectNPC = "CollectNPC"               # 采集NPC
ClientServerMsg_EnterFB = "EnterFB"                     # 请求进入跨服副本
ClientServerMsg_AddBuff = "AddBuff"                     # 添加BUFF
ClientServerMsg_LuckyCloudBuy = "LuckyCloudBuy"         # 幸运云购
#跨服广播类型定义
CrossNotify_CrossAct = "CrossAct"
@@ -1503,7 +1505,7 @@
Def_MFPType_MagicWeapon3, # 仙族法宝 17
Def_MFPType_PetSoul, # 灵宠魂石 18
Def_MFPType_HorseSoul, # 坐骑魂石 19
Def_MFPType_20,
Def_MFPType_FaQi, # 法器 20
Def_MFPType_Dogz, # 神兽 21
Def_MFPType_GatherSoul, # 聚魂 22
Def_MFPType_MagicWeapon4, # 王者法宝 23
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/PyNetPack.ini
@@ -34,6 +34,18 @@
PacketSubCMD_6=0x08
PacketCallFunc_6=OnItemTimeout
;法器
[PlayerFaQi]
ScriptName = Player\PlayerFaQi.py
Writer = hxp
Releaser = hxp
RegType = 0
RegisterPackCount = 1
PacketCMD_1=0xA5
PacketSubCMD_1=0x32
PacketCallFunc_1=OnFaQiLVUp
;坐骑培养
[PlayerHorse]
ScriptName = Player\PlayerHorse.py
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3940,6 +3940,10 @@
Def_PDict_OSC_RecordData = "OSCRecordData_%s"  # 开服活动记录数值, 参数(活动类型)
Def_PDict_OSC_EndMailState = "EndMailState"  # 开服活动结束发放邮件处理状态, 记录该状态的目的是防止开服活动版本变更导致旧号重复补发奖励;
# 法器
Def_PDict_FaQiLV = "FaQiLV"  # 法器等级
Def_PDict_FaQiEatItemCount = "FaQiEatItemCount"  # 当前阶已吃丹个数
# 坐骑
Def_PDict_HorserLV = "HorserLV"  # 坐骑等级
Def_PDict_HorserEatItemCount = "HorserEatItemCount"  # 当前阶已吃培养丹个数
@@ -4640,7 +4644,8 @@
Def_CalcAttrFunc_WingTarin, # 翅膀培养 45
Def_CalcAttrFunc_PeerlessWeaponTrain, # 灭世培养 46
Def_CalcAttrFunc_PeerlessWeapon2Train, # 噬魂培养 47
) = range(48)
Def_CalcAttrFunc_FaQi, # 法器 48
) = range(49)
# 技能功能点列表  - 默认不算战力,不享受百分比加成,技能功能点暂时配置,之后优化技能属性逻辑后可去掉
CalcAttrFuncSkillList = [Def_CalcAttrFunc_HorseSkill, Def_CalcAttrFunc_PetSkill, Def_CalcAttrFunc_DogzBattleSkill]
@@ -4662,6 +4667,7 @@
                            ShareDefine.Def_MFPType_PetSoul:[Def_CalcAttrFunc_PetSoul],
                            ShareDefine.Def_MFPType_Horse:[Def_CalcAttrFunc_Horse, Def_CalcAttrFunc_HorseSkill, Def_CalcAttrFunc_HorseSkin, Def_CalcAttrFunc_HorseTarin],
                            ShareDefine.Def_MFPType_HorseSoul:[Def_CalcAttrFunc_HorseSoul],
                            ShareDefine.Def_MFPType_FaQi:[Def_CalcAttrFunc_FaQi],
                            ShareDefine.Def_MFPType_Prestige:[Def_CalcAttrFunc_Prestige],
                            ShareDefine.Def_MFPType_GodWeapon:[Def_CalcAttrFunc_GodWeapon],
                            ShareDefine.Def_MFPType_Dienstgrad:[Def_CalcAttrFunc_Dienstgrad],
@@ -4881,6 +4887,7 @@
Def_Cost_BuyKillBossCnt, #购买boss次数
Def_Cost_EquipStar, #装备升星
Def_Cost_ActivityPlace, #活跃放置 50
Def_Cost_FaQi, # 法器
#-----------以下为暂时没用的,先不删除,如有新增消费点则放在这些之前------------
Def_Cost_RefreshArrestTask, # 刷新悬赏任务
Def_Cost_OffLineExp, # 兑换离线经验
@@ -4893,7 +4900,7 @@
Def_Cost_Trade, # 交易
Def_Cost_Rename, # 改名
Def_Cost_SkillLvUp, # 技能升级
) = range(2000, 2000 + 62)
) = range(2000, 2000 + 63)
Def_Cost_Reason_SonKey = "reason_name_son" # 消费点原因子类说明key
@@ -4977,6 +4984,7 @@
Def_Cost_BuyKillBossCnt:"BuyKillBossCnt",
Def_Cost_EquipStar:"EquipStar",
Def_Cost_ActivityPlace:"ActivityPlace",
Def_Cost_FaQi:"FaQi",
}
## -----------------------------------------------------
@@ -5149,7 +5157,8 @@
ItemDel_HorsePetAwake, # 骑宠觉醒 
ItemDel_ActivityPlace, # 活跃放置
ItemDel_AuctionHouse, # 拍卖
) = range(2000, 2000 + 44)
ItemDel_FaQi, # 法器
) = range(2000, 2000 + 45)
# 物品扣除类型对应信息 {类型:eventName, ...}
ItemDelTypeDict = {
@@ -5197,6 +5206,7 @@
                   ItemDel_HorsePetAwake:"HorsePetAwake",
                   ItemDel_ActivityPlace:"ActivityPlace",
                   ItemDel_AuctionHouse:"AuctionHouse",
                   ItemDel_FaQi:"FaQi",
                   }
##==================================================================================================
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -10172,6 +10172,62 @@
#------------------------------------------------------
# A5 32 法器升级 #tagCMFaQiLVUp
class  tagCMFaQiLVUp(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("UseItemCnt", c_ushort),    #消耗材料个数
                  ("IsAutoBuy", c_ubyte),    #是否自动购买
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA5
        self.SubCmd = 0x32
        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 = 0xA5
        self.SubCmd = 0x32
        self.UseItemCnt = 0
        self.IsAutoBuy = 0
        return
    def GetLength(self):
        return sizeof(tagCMFaQiLVUp)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A5 32 法器升级 //tagCMFaQiLVUp:
                                Cmd:%s,
                                SubCmd:%s,
                                UseItemCnt:%d,
                                IsAutoBuy:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.UseItemCnt,
                                self.IsAutoBuy
                                )
        return DumpString
m_NAtagCMFaQiLVUp=tagCMFaQiLVUp()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMFaQiLVUp.Cmd,m_NAtagCMFaQiLVUp.SubCmd))] = m_NAtagCMFaQiLVUp
#------------------------------------------------------
# A5 1C 聚魂合成 #tagCMGatherSoulCompound
class  tagCMGatherSoulCompound(Structure):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -16345,6 +16345,62 @@
#------------------------------------------------------
# A3 54 法器信息 #tagMCFaQiInfo
class  tagMCFaQiInfo(Structure):
    _pack_ = 1
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("LV", c_ubyte),    #等阶
                  ("EatItemCount", c_int),    #当前阶已吃丹个数
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA3
        self.SubCmd = 0x54
        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 = 0xA3
        self.SubCmd = 0x54
        self.LV = 0
        self.EatItemCount = 0
        return
    def GetLength(self):
        return sizeof(tagMCFaQiInfo)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''// A3 54 法器信息 //tagMCFaQiInfo:
                                Cmd:%s,
                                SubCmd:%s,
                                LV:%d,
                                EatItemCount:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.LV,
                                self.EatItemCount
                                )
        return DumpString
m_NAtagMCFaQiInfo=tagMCFaQiInfo()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagMCFaQiInfo.Cmd,m_NAtagMCFaQiInfo.SubCmd))] = m_NAtagMCFaQiInfo
#------------------------------------------------------
#A3 0A 副本鼓舞信息通知 #tagMCFBEncourageInfo
class  tagMCFBEncourageCnt(Structure):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/FaQi.py
New file
@@ -0,0 +1,58 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package GM.Commands.FaQi
#
# @todo:法器
# @author hxp
# @date 2021-10-14
# @version 1.0
#
# 详细描述: 法器
#
#-------------------------------------------------------------------------------
#"""Version = 2021-10-14 15:00"""
#-------------------------------------------------------------------------------
import ChConfig
import GameWorld
import PlayerControl
import PlayerFaQi
#---------------------------------------------------------------------
#逻辑实现
## GM命令执行入口
#  @param curPlayer 当前玩家
#  @param msgList 参数列表
#  @return None
#  @remarks 函数详细说明.
def OnExec(curPlayer, msgList):
    if not msgList:
        GameWorld.DebugAnswer(curPlayer, "重置法器: FaQi 0")
        GameWorld.DebugAnswer(curPlayer, "设置法器: FaQi 等阶 本阶已吃丹数")
        return
    if len(msgList) == 1:
        if msgList[0] == 0:
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FaQiLV, 1)
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FaQiEatItemCount, 0)
    elif len(msgList) == 2:
        lv, eatItemCount = msgList
        if lv < 1:
            GameWorld.DebugAnswer(curPlayer, "等级不能小于1")
            return
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FaQiLV, lv)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FaQiEatItemCount, eatItemCount)
    else:
        return
    PlayerFaQi.RefreshFaQiAttr(curPlayer)
    PlayerFaQi.PlayerFaQiLogin(curPlayer)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/PrintFightPower.py
@@ -50,6 +50,7 @@
                   ShareDefine.Def_MFPType_MagicWeapon4:"王者",
                   ShareDefine.Def_MFPType_PetSoul:"宠魂",
                   ShareDefine.Def_MFPType_HorseSoul:"骑魂",
                   ShareDefine.Def_MFPType_FaQi:"法器",
                   ShareDefine.Def_MFPType_Dogz:"神兽",
                   ShareDefine.Def_MFPType_Coat:"ʱװ",
                   ShareDefine.Def_MFPType_Other:"其他",
@@ -98,6 +99,7 @@
                     ChConfig.Def_CalcAttrFunc_WingTarin:"翅膀培养",
                     ChConfig.Def_CalcAttrFunc_PeerlessWeaponTrain:"灭世培养",
                     ChConfig.Def_CalcAttrFunc_PeerlessWeapon2Train:"噬魂培养",
                     ChConfig.Def_CalcAttrFunc_FaQi:"法器",
                     }
    
    GameWorld.DebugAnswer(curPlayer, "PrintFightPower 模块类型(可选)")
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -301,6 +301,16 @@
                        ("DWORD", "FamilyStoreItemScore", 0),
                        ),
                "FaQiLVUp":(
                        ("BYTE", "FaQiLV", 1),
                        ("WORD", "NeedEatCount", 0),
                        ("list", "LVAttrType", 0),
                        ("list", "LVAttrValue", 0),
                        ("list", "UpItemAttrType", 0),
                        ("list", "UpItemAttrValue", 0),
                        ("DWORD", "UpEatItemPerCount", 0),
                        ),
                "HorseLVUp":(
                        ("BYTE", "HorseLV", 1),
                        ("DWORD", "HorseSkinID", 0),
@@ -2460,6 +2470,27 @@
    def GetEquipClass(self): return self.EquipClass # 装备阶数
    def GetExp(self): return self.Exp # 获得灵兽升级经验
    def GetFamilyStoreItemScore(self): return self.FamilyStoreItemScore # 仙盟宝库积分
# 法器升级表
class IPY_FaQiLVUp():
    def __init__(self):
        self.FaQiLV = 0
        self.NeedEatCount = 0
        self.LVAttrType = []
        self.LVAttrValue = []
        self.UpItemAttrType = []
        self.UpItemAttrValue = []
        self.UpEatItemPerCount = 0
        return
    def GetFaQiLV(self): return self.FaQiLV # 法器等级
    def GetNeedEatCount(self): return self.NeedEatCount # 升级所需个数(非累计)
    def GetLVAttrType(self): return self.LVAttrType # 每级额外属性类型(非累积)
    def GetLVAttrValue(self): return self.LVAttrValue # 每级额外属性值(非累积)
    def GetUpItemAttrType(self): return self.UpItemAttrType # 每x个培养丹增加属性类型,x=UpEatItemPerCount
    def GetUpItemAttrValue(self): return self.UpItemAttrValue # 每x个培养丹增加属性值,x=UpEatItemPerCount
    def GetUpEatItemPerCount(self): return self.UpEatItemPerCount # 每次培养消耗x个
# 坐骑升级表
class IPY_HorseLVUp():
@@ -5889,6 +5920,8 @@
        self.ipyPetClassCostLen = len(self.ipyPetClassCostCache)
        self.ipyPetEatEquipCache = self.__LoadFileData("PetEatEquip", IPY_PetEatEquip)
        self.ipyPetEatEquipLen = len(self.ipyPetEatEquipCache)
        self.ipyFaQiLVUpCache = self.__LoadFileData("FaQiLVUp", IPY_FaQiLVUp)
        self.ipyFaQiLVUpLen = len(self.ipyFaQiLVUpCache)
        self.ipyHorseLVUpCache = self.__LoadFileData("HorseLVUp", IPY_HorseLVUp)
        self.ipyHorseLVUpLen = len(self.ipyHorseLVUpCache)
        self.ipyHorseTrainCache = self.__LoadFileData("HorseTrain", IPY_HorseTrain)
@@ -6439,6 +6472,8 @@
    def GetPetClassCostByIndex(self, index): return self.ipyPetClassCostCache[index]
    def GetPetEatEquipCount(self): return self.ipyPetEatEquipLen
    def GetPetEatEquipByIndex(self, index): return self.ipyPetEatEquipCache[index]
    def GetFaQiLVUpCount(self): return self.ipyFaQiLVUpLen
    def GetFaQiLVUpByIndex(self, index): return self.ipyFaQiLVUpCache[index]
    def GetHorseLVUpCount(self): return self.ipyHorseLVUpLen
    def GetHorseLVUpByIndex(self, index): return self.ipyHorseLVUpCache[index]
    def GetHorseTrainCount(self): return self.ipyHorseTrainLen
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -133,6 +133,7 @@
import PlayerDogz
import PlayerCoat
import PlayerFB
import PlayerFaQi
import SkillShell
import PlayerYinji
import GameObj
@@ -648,6 +649,9 @@
    # 坐骑相关通知
    PlayerHorse.PlayerHorseLogin(curPlayer)
    
    # 法器
    PlayerFaQi.PlayerFaQiLogin(curPlayer)
    PlayerTreasure.OnTreasureLogin(curPlayer)
    
    # 通知累计登陆礼
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/GameFuncComm.py
@@ -45,6 +45,7 @@
import ItemCommon
import ItemControler
import PlayerArena
import PlayerFaQi
import PlayerTJG
@@ -67,6 +68,7 @@
                     ShareDefine.GameFuncID_Talent:lambda curObj:PlayerGreatMaster.DoTalentOpen(curObj),
                     ShareDefine.GameFuncID_TJG:lambda curObj:PlayerTJG.DoTJGOpen(curObj),
                     ShareDefine.GameFuncID_Arena:lambda curObj:PlayerArena.DoArenaOpen(curObj),
                     ShareDefine.GameFuncID_FaQi:lambda curObj:PlayerFaQi.DoFaQiOpen(curObj),
                     #ShareDefine.GameFuncID_RunDaily:lambda curObj:FBCommon.DoFuncOpen_RunDaily(curObj),
                     #ShareDefine.GameFuncID_RunFamily:lambda curObj:FBCommon.DoFuncOpen_RunFamily(curObj),
                     #ShareDefine.GameFuncID_RefineExp:lambda curObj:Operate_PlayerBuyZhenQi.DoFuncOpen_RefineExp(curObj),
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -94,6 +94,7 @@
import PlayerState
import QuestCommon
import PlayerDogz
import PlayerFaQi
import ChPlayer
import GMShell
import GameObj
@@ -4512,6 +4513,7 @@
        PlayerDogz.RefreshDogzAttr(curPlayer)
        PlayerGatherSoul.RefreshGatherSoulAttr(curPlayer)
        PlayerCoat.CalcClothesCoatSkinAttr(curPlayer)
        PlayerFaQi.CalcFaQiAttr(curPlayer)
        self.RefreshAllState(isForce=True)
        GameWorld.DebugLog("End ReCalcAllState!!!")
        return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFaQi.py
New file
@@ -0,0 +1,174 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package Player.PlayerFaQi
#
# @todo:法器系统
# @author hxp
# @date 2021-10-13
# @version 1.0
#
# 详细描述: 法器系统
#
# 注: 与法宝系统没有关系
#-------------------------------------------------------------------------------
#"""Version = 2021-10-14 15:00"""
#-------------------------------------------------------------------------------
import GameWorld
import IPY_GameWorld
import PlayerControl
import ChPyNetSendPack
import NetPackCommon
import IpyGameDataPY
import ItemCommon
import ChConfig
def DoFaQiOpen(curPlayer):
    ## 功能开启
    faQiLV = 1
    ipyData = IpyGameDataPY.GetIpyGameData("FaQiLVUp", faQiLV)
    if not ipyData:
        return
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FaQiLV, faQiLV)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FaQiEatItemCount, 0)
    GameWorld.DebugLog("法器功能开启! faQiLV=%s" % faQiLV)
    Sync_FaQiLVInfo(curPlayer)
    RefreshFaQiAttr(curPlayer)
    return True
def PlayerFaQiLogin(curPlayer):
    if not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FaQiLV):
        return
    Sync_FaQiLVInfo(curPlayer)
    return
#// A5 32 法器升级 #tagCMFaQiLVUp
#
#struct    tagCMFaQiLVUp
#{
#    tagHead        Head;
#    WORD        UseItemCnt;        //消耗材料个数
#    BYTE        IsAutoBuy;        //是否自动购买
#};
def OnFaQiLVUp(index, curPackData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    costItemCount = curPackData.UseItemCnt # 消耗材料个数
    isAutoBuy = curPackData.IsAutoBuy # 是否自动购买
    faQiLV = max(1, curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FaQiLV))
    curEatItemCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FaQiEatItemCount)
    ipyData = IpyGameDataPY.GetIpyGameData("FaQiLVUp", faQiLV)
    if not ipyData:
        return
    needEatCount = ipyData.GetNeedEatCount()
    if not needEatCount:
        GameWorld.DebugLog("法器已满级!faQiLV=%s" % faQiLV)
        return
    costItemID = IpyGameDataPY.GetFuncCfg("FaQiUpItem", 1)
    if not costItemID or not costItemCount:
        return
    costItemIndexList, bindCnt, unBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, costItemID, costItemCount)
    lackCnt = costItemCount - bindCnt - unBindCnt
    if lackCnt > 0 and not isAutoBuy:
        GameWorld.DebugLog("消耗道具不足,无法升级法器!costItemID=%s,costItemCount=%s,bindCnt=%s,unBindCnt=%s,lackCnt=%s"
                           % (costItemID, costItemCount, bindCnt, unBindCnt, lackCnt))
        return
    delCnt = costItemCount
    if lackCnt > 0:
        autoBuyMoneyType = IPY_GameWorld.TYPE_Price_Gold_Money
        lackCost = ItemCommon.GetAutoBuyItemNeedGold({costItemID:lackCnt}, autoBuyMoneyType)
        if lackCost <= 0:
            return
        infoDict = {ChConfig.Def_Cost_Reason_SonKey:costItemID}
        if not PlayerControl.PayMoney(curPlayer, autoBuyMoneyType, lackCost, ChConfig.Def_Cost_FaQi, infoDict):
            return
        delCnt -= lackCnt
    # 扣除消耗
    if delCnt:
        ItemCommon.DelCostItemByBind(curPlayer, costItemIndexList, bindCnt, unBindCnt, delCnt, ChConfig.ItemDel_FaQi)
    updClassLV = faQiLV
    updEatItemCount = curEatItemCount + costItemCount
    GameWorld.DebugLog("法器培养: faQiLV=%s,curEatItemCount=%s,costItemCount=%s,updEatItemCount=%s,needEatCount=%s"
                       % (faQiLV, curEatItemCount, costItemCount, updEatItemCount, needEatCount))
    if updEatItemCount >= needEatCount:
        updClassLV += 1
        updEatItemCount -= needEatCount
        GameWorld.DebugLog("    升阶: updClassLV=%s,updEatItemCount=%s" % (updClassLV, updEatItemCount))
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FaQiLV, updClassLV)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FaQiEatItemCount, updEatItemCount)
    # 升阶
    if updClassLV > faQiLV:
        pass
    Sync_FaQiLVInfo(curPlayer)
    # 刷属性,更新排行榜
    RefreshFaQiAttr(curPlayer)
    return
def RefreshFaQiAttr(curPlayer):
    CalcFaQiAttr(curPlayer)
    PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
    return
def CalcFaQiAttr(curPlayer):
    faQiLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FaQiLV)
    if not faQiLV:
        return
    allAttrList = [{} for _ in range(4)]
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    for index in xrange(ipyDataMgr.GetFaQiLVUpCount()):
        lvupIpyData = ipyDataMgr.GetFaQiLVUpByIndex(index)
        dataLV = lvupIpyData.GetFaQiLV()
        if dataLV > faQiLV:
            break
        elif dataLV == faQiLV:
            upItemCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FaQiEatItemCount)
        else:
            upItemCount = lvupIpyData.GetNeedEatCount()
        # 等阶额外属性
        lvAttrTypeList = lvupIpyData.GetLVAttrType()
        lvAttrValueList = lvupIpyData.GetLVAttrValue()
        for i, attrID in enumerate(lvAttrTypeList):
            attrValue = lvAttrValueList[i]
            PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList)
        # 培养丹增加属性
        upItemPerCount = lvupIpyData.GetUpEatItemPerCount()
        if upItemCount and upItemPerCount:
            upItemAttrTypeList = lvupIpyData.GetUpItemAttrType()
            upItemAttrValueList = lvupIpyData.GetUpItemAttrValue()
            attrMultiple = upItemCount / upItemPerCount
            for i, attrID in enumerate(upItemAttrTypeList):
                attrValue = upItemAttrValueList[i]
                PlayerControl.CalcAttrDict_Type(attrID, attrValue * attrMultiple, allAttrList)
    # 保存计算值
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_FaQi, allAttrList)
    return
def Sync_FaQiLVInfo(curPlayer):
    clientPack = ChPyNetSendPack.tagMCFaQiInfo()
    clientPack.Clear()
    clientPack.LV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FaQiLV)
    clientPack.EatItemCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FaQiEatItemCount)
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -1064,6 +1064,7 @@
GameFuncID_SuperGift = 150      # 超值礼包
GameFuncID_ZhuXianBoss = 163    # 诛仙BOSS
GameFuncID_Arena = 195          # 竞技场
GameFuncID_FaQi = 199           # 法器
# 以下为暂时无用的
GameFuncID_Truck = 33           # 运镖
GameFuncID_RunDaily = 34        # 日常跑环
@@ -1503,7 +1504,7 @@
Def_MFPType_MagicWeapon3, # 仙族法宝 17
Def_MFPType_PetSoul, # 灵宠魂石 18
Def_MFPType_HorseSoul, # 坐骑魂石 19
Def_MFPType_20,
Def_MFPType_FaQi, # 法器 20
Def_MFPType_Dogz, # 神兽 21
Def_MFPType_GatherSoul, # 聚魂 22
Def_MFPType_MagicWeapon4, # 王者法宝 23