hxp
2019-12-17 3128b603606057b8b6ddbaf6a86e4493b4ce292a
8358 【主干】【后端】坐骑修改
23个文件已修改
1个文件已删除
1个文件已添加
1678 ■■■■■ 已修改文件
PySysDB/PySysDBPY.h 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py 103 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 103 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/QuestRunner.py 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ActiveHorse.py 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Cross.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Horse.py 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetSignDay.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/OperControlManager.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFeastWeekParty.py 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py 1044 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSignDay.py 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSuccess.py 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerWeekParty.py 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/Buff_510.py 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/Buff_511.py 49 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/Buff_521.py 43 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/PySysDBPY.h
@@ -348,6 +348,30 @@
    char        SysMark;    //广播提示
};
//坐骑升级表
struct tagHorseLVUp
{
    BYTE        _HorseLV;    //坐骑等级
    DWORD        HorseSkinID;    //外观物品ID
    WORD        NeedEatCount;    //升级所需个数(非累计)
    list        LVAttrType;    //每级额外属性类型(非累积)
    list        LVAttrValue;    //每级额外属性值(非累积)
};
//坐骑幻化表
struct tagHorseSkinPlus
{
    BYTE        _ID;    //幻化编号ID
    DWORD        HorseSkinPlusID;    //外观物品ID
    DWORD        UnlockItemID;    //解锁坐骑物品编号
    BYTE        UnlockItemCnt;    //解锁所需物品数量
    list        AttrType;    //激活加成属性类型
    list        AttrValue;    //激活加成属性值
    DWORD        InitFightPower;    //皮肤额外战力
};
//玩家等级表
struct tagPlayerLV
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetPack.py
@@ -7905,7 +7905,7 @@
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("HorseID", c_int),    #坐骑ID
                  ("HorseID", c_int),    #坐骑幻化ID
                  ]
    def __init__(self):
@@ -10444,7 +10444,6 @@
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("HorseID", c_int),    #坐骑ID
                  ("UseItemCnt", c_ubyte),    #消耗材料个数
                  ("IsAutoBuy", c_ubyte),    #是否自动购买
                  ]
@@ -10463,7 +10462,6 @@
    def Clear(self):
        self.Cmd = 0xA5
        self.SubCmd = 0x27
        self.HorseID = 0
        self.UseItemCnt = 0
        self.IsAutoBuy = 0
        return
@@ -10478,14 +10476,12 @@
        DumpString = '''// A5 27 坐骑提升 //tagCMHorseUp:
                                Cmd:%s,
                                SubCmd:%s,
                                HorseID:%d,
                                UseItemCnt:%d,
                                IsAutoBuy:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.HorseID,
                                self.UseItemCnt,
                                self.IsAutoBuy
                                )
@@ -10656,7 +10652,8 @@
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("Index", c_int),    #选择索引
                  ("ChooseType", c_ubyte),    # 1-按等阶,2-按幻化
                  ("LVID", c_ubyte),    # 阶等级或幻化ID
                  ]
    def __init__(self):
@@ -10673,7 +10670,8 @@
    def Clear(self):
        self.Cmd = 0xA5
        self.SubCmd = 0x02
        self.Index = 0
        self.ChooseType = 0
        self.LVID = 0
        return
    def GetLength(self):
@@ -10686,12 +10684,14 @@
        DumpString = '''//A5 02 坐骑选择 //tagPlayerChooseHorse:
                                Cmd:%s,
                                SubCmd:%s,
                                Index:%d
                                ChooseType:%d,
                                LVID:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.Index
                                self.ChooseType,
                                self.LVID
                                )
        return DumpString
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -19143,16 +19143,20 @@
#------------------------------------------------------
#A3 01 坐骑培养信息 #tagTrainHorseData
class  tagMCHorseInfo(Structure):
class  tagTrainHorseData(Structure):
    _pack_ = 1
    _fields_ = [
                  ("HorseID", c_int),    #ID
                  ("LV", c_ubyte),    #等级
                  ("Exp", c_int),    #经验
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("LV", c_ubyte),    #等阶
                  ("EatItemCount", c_ushort),    #当前阶已吃丹个数
                  ("SkinPlusState", c_int),    #幻化激活状态,按位存储是否激活,幻化编号ID对应位
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA3
        self.SubCmd = 0x01
        return
    def ReadData(self, stringData, _pos=0, _len=0):
@@ -19161,102 +19165,39 @@
        return _pos + self.GetLength()
    def Clear(self):
        self.HorseID = 0
        self.Cmd = 0xA3
        self.SubCmd = 0x01
        self.LV = 0
        self.Exp = 0
        self.EatItemCount = 0
        self.SkinPlusState = 0
        return
    def GetLength(self):
        return sizeof(tagMCHorseInfo)
        return sizeof(tagTrainHorseData)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''//A3 01 坐骑培养信息 //tagTrainHorseData:
                                HorseID:%d,
                                Cmd:%s,
                                SubCmd:%s,
                                LV:%d,
                                Exp:%d
                                EatItemCount:%d,
                                SkinPlusState:%d
                                '''\
                                %(
                                self.HorseID,
                                self.Cmd,
                                self.SubCmd,
                                self.LV,
                                self.Exp
                                )
        return DumpString
class  tagTrainHorseData(Structure):
    Head = tagHead()
    Multiple = 0    #(BYTE Multiple)//下次暴击倍数
    Num = 0    #(BYTE Num)//个数
    InfoList = list()    #(vector<tagMCHorseInfo> InfoList)// 坐骑数据列表
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xA3
        self.Head.SubCmd = 0x01
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.Multiple,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.Num,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.Num):
            temInfoList = tagMCHorseInfo()
            _pos = temInfoList.ReadData(_lpData, _pos)
            self.InfoList.append(temInfoList)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xA3
        self.Head.SubCmd = 0x01
        self.Multiple = 0
        self.Num = 0
        self.InfoList = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        length += 1
        for i in range(self.Num):
            length += self.InfoList[i].GetLength()
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteBYTE(data, self.Multiple)
        data = CommFunc.WriteBYTE(data, self.Num)
        for i in range(self.Num):
            data = CommFunc.WriteString(data, self.InfoList[i].GetLength(), self.InfoList[i].GetBuffer())
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                Multiple:%d,
                                Num:%d,
                                InfoList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.Multiple,
                                self.Num,
                                "..."
                                self.EatItemCount,
                                self.SkinPlusState
                                )
        return DumpString
m_NAtagTrainHorseData=tagTrainHorseData()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagTrainHorseData.Head.Cmd,m_NAtagTrainHorseData.Head.SubCmd))] = m_NAtagTrainHorseData
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagTrainHorseData.Cmd,m_NAtagTrainHorseData.SubCmd))] = m_NAtagTrainHorseData
#------------------------------------------------------
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3803,10 +3803,11 @@
Def_PDict_OSC_RecordData = "OSCRecordData_%s"  # 开服活动记录数值, 参数(活动类型)
Def_PDict_OSC_EndMailState = "EndMailState"  # 开服活动结束发放邮件处理状态, 记录该状态的目的是防止开服活动版本变更导致旧号重复补发奖励;
# 坐骑 Def_PDictType_Horse
Def_PDict_Horser_LV = "Horser_LV_%d"  # 坐骑等级 0代表未激活 1代表1级
Def_PDict_Horser_Exp = "Horser_Exp_%d"  # 坐骑经验
Def_PDict_Horser_Multiple = "Horser_Multiple"  # 坐骑下次升阶暴击倍数
# 坐骑
Def_PDict_HorserLV = "HorserLV"  # 坐骑等级
Def_PDict_HorserEatItemCount = "HorserEatItemCount"  # 当前阶已吃培养丹个数
Def_PDict_HorserSkinPlusState = "HorserSkinPlusState"  # 坐骑幻化皮肤激活状态,按二进制位存储,每位代表幻化ID是否已激活
#骑宠觉醒
Def_PDict_HorsePetSkinData = "HorsePetSkinData%d_%s"  #觉醒等级*100+外观索引  参数(类型,关联ID) 1-坐骑 2-灵宠
Def_PDict_HorsePetSkinExp = "HorsePetSkinExp%d_%s"  #经验  参数(类型,关联ID) 1-坐骑 2-灵宠
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetPack.py
@@ -7905,7 +7905,7 @@
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("HorseID", c_int),    #坐骑ID
                  ("HorseID", c_int),    #坐骑幻化ID
                  ]
    def __init__(self):
@@ -10444,7 +10444,6 @@
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("HorseID", c_int),    #坐骑ID
                  ("UseItemCnt", c_ubyte),    #消耗材料个数
                  ("IsAutoBuy", c_ubyte),    #是否自动购买
                  ]
@@ -10463,7 +10462,6 @@
    def Clear(self):
        self.Cmd = 0xA5
        self.SubCmd = 0x27
        self.HorseID = 0
        self.UseItemCnt = 0
        self.IsAutoBuy = 0
        return
@@ -10478,14 +10476,12 @@
        DumpString = '''// A5 27 坐骑提升 //tagCMHorseUp:
                                Cmd:%s,
                                SubCmd:%s,
                                HorseID:%d,
                                UseItemCnt:%d,
                                IsAutoBuy:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.HorseID,
                                self.UseItemCnt,
                                self.IsAutoBuy
                                )
@@ -10656,7 +10652,8 @@
    _fields_ = [
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("Index", c_int),    #选择索引
                  ("ChooseType", c_ubyte),    # 1-按等阶,2-按幻化
                  ("LVID", c_ubyte),    # 阶等级或幻化ID
                  ]
    def __init__(self):
@@ -10673,7 +10670,8 @@
    def Clear(self):
        self.Cmd = 0xA5
        self.SubCmd = 0x02
        self.Index = 0
        self.ChooseType = 0
        self.LVID = 0
        return
    def GetLength(self):
@@ -10686,12 +10684,14 @@
        DumpString = '''//A5 02 坐骑选择 //tagPlayerChooseHorse:
                                Cmd:%s,
                                SubCmd:%s,
                                Index:%d
                                ChooseType:%d,
                                LVID:%d
                                '''\
                                %(
                                self.Cmd,
                                self.SubCmd,
                                self.Index
                                self.ChooseType,
                                self.LVID
                                )
        return DumpString
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -19143,16 +19143,20 @@
#------------------------------------------------------
#A3 01 坐骑培养信息 #tagTrainHorseData
class  tagMCHorseInfo(Structure):
class  tagTrainHorseData(Structure):
    _pack_ = 1
    _fields_ = [
                  ("HorseID", c_int),    #ID
                  ("LV", c_ubyte),    #等级
                  ("Exp", c_int),    #经验
                  ("Cmd", c_ubyte),
                  ("SubCmd", c_ubyte),
                  ("LV", c_ubyte),    #等阶
                  ("EatItemCount", c_ushort),    #当前阶已吃丹个数
                  ("SkinPlusState", c_int),    #幻化激活状态,按位存储是否激活,幻化编号ID对应位
                  ]
    def __init__(self):
        self.Clear()
        self.Cmd = 0xA3
        self.SubCmd = 0x01
        return
    def ReadData(self, stringData, _pos=0, _len=0):
@@ -19161,102 +19165,39 @@
        return _pos + self.GetLength()
    def Clear(self):
        self.HorseID = 0
        self.Cmd = 0xA3
        self.SubCmd = 0x01
        self.LV = 0
        self.Exp = 0
        self.EatItemCount = 0
        self.SkinPlusState = 0
        return
    def GetLength(self):
        return sizeof(tagMCHorseInfo)
        return sizeof(tagTrainHorseData)
    def GetBuffer(self):
        return string_at(addressof(self), self.GetLength())
    def OutputString(self):
        DumpString = '''//A3 01 坐骑培养信息 //tagTrainHorseData:
                                HorseID:%d,
                                Cmd:%s,
                                SubCmd:%s,
                                LV:%d,
                                Exp:%d
                                EatItemCount:%d,
                                SkinPlusState:%d
                                '''\
                                %(
                                self.HorseID,
                                self.Cmd,
                                self.SubCmd,
                                self.LV,
                                self.Exp
                                )
        return DumpString
class  tagTrainHorseData(Structure):
    Head = tagHead()
    Multiple = 0    #(BYTE Multiple)//下次暴击倍数
    Num = 0    #(BYTE Num)//个数
    InfoList = list()    #(vector<tagMCHorseInfo> InfoList)// 坐骑数据列表
    data = None
    def __init__(self):
        self.Clear()
        self.Head.Cmd = 0xA3
        self.Head.SubCmd = 0x01
        return
    def ReadData(self, _lpData, _pos=0, _Len=0):
        self.Clear()
        _pos = self.Head.ReadData(_lpData, _pos)
        self.Multiple,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        self.Num,_pos = CommFunc.ReadBYTE(_lpData, _pos)
        for i in range(self.Num):
            temInfoList = tagMCHorseInfo()
            _pos = temInfoList.ReadData(_lpData, _pos)
            self.InfoList.append(temInfoList)
        return _pos
    def Clear(self):
        self.Head = tagHead()
        self.Head.Clear()
        self.Head.Cmd = 0xA3
        self.Head.SubCmd = 0x01
        self.Multiple = 0
        self.Num = 0
        self.InfoList = list()
        return
    def GetLength(self):
        length = 0
        length += self.Head.GetLength()
        length += 1
        length += 1
        for i in range(self.Num):
            length += self.InfoList[i].GetLength()
        return length
    def GetBuffer(self):
        data = ''
        data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
        data = CommFunc.WriteBYTE(data, self.Multiple)
        data = CommFunc.WriteBYTE(data, self.Num)
        for i in range(self.Num):
            data = CommFunc.WriteString(data, self.InfoList[i].GetLength(), self.InfoList[i].GetBuffer())
        return data
    def OutputString(self):
        DumpString = '''
                                Head:%s,
                                Multiple:%d,
                                Num:%d,
                                InfoList:%s
                                '''\
                                %(
                                self.Head.OutputString(),
                                self.Multiple,
                                self.Num,
                                "..."
                                self.EatItemCount,
                                self.SkinPlusState
                                )
        return DumpString
m_NAtagTrainHorseData=tagTrainHorseData()
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagTrainHorseData.Head.Cmd,m_NAtagTrainHorseData.Head.SubCmd))] = m_NAtagTrainHorseData
ChNetPackDict[eval("0x%02x%02x"%(m_NAtagTrainHorseData.Cmd,m_NAtagTrainHorseData.SubCmd))] = m_NAtagTrainHorseData
#------------------------------------------------------
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/QuestRunner.py
@@ -2481,12 +2481,6 @@
# @remarks <Check_HorseClasslv type="类型" value="值"/> 
def ConditionType_Check_Horseclasslv(curPlayer, curMission, curConditionNode):
    return False
#    conditionValue = GameWorld.ToIntDef(curConditionNode.GetAttribute("value"), 0)
#    conditionType = curConditionNode.GetAttribute("type")
#    curHorseClassLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Horser_LV,
#                                                 0, ChConfig.Def_PDictType_Horse)
#
#    return QuestRunnerValue.GetEval(conditionType,curHorseClassLV,conditionValue)
##坐骑是否达到多少阶多少星
# @param curPlayer 玩家实例
@@ -7053,7 +7047,7 @@
# @return None <Horselv value="坐骑等级"/>
def ConditionType_Horselv(curPlayer, curMission, curActionNode):
    horseLV = GameWorld.ToIntDef(curActionNode.GetAttribute("value"), 0)
    return PlayerHorse.GetHorseCurMaxLV(curPlayer) >= horseLV
    return PlayerHorse.GetHorseSumLV(curPlayer) >= horseLV
##是否已购买VIP礼包
# @param None
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/ActiveHorse.py
File was deleted
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Cross.py
@@ -12,11 +12,7 @@
# @note: 
#
#---------------------------------------------------------------------
import ShareDefine
import GameWorld
import OpenFunc
import PlayerHorse
#---------------------------------------------------------------------
#逻辑实现
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Horse.py
New file
@@ -0,0 +1,59 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package GM.Commands.Horse
#
# @todo:坐骑
# @author hxp
# @date 2019-12-17
# @version 1.0
#
# 详细描述: 坐骑
#
#-------------------------------------------------------------------------------
#"""Version = 2019-12-17 18:30"""
#-------------------------------------------------------------------------------
import GameWorld
import ChConfig
import PlayerControl
import PlayerHorse
#---------------------------------------------------------------------
#逻辑实现
## GM命令执行入口
#  @param curPlayer 当前玩家
#  @param msgList 参数列表
#  @return None
#  @remarks 函数详细说明.
def OnExec(curPlayer, msgList):
    if not msgList:
        GameWorld.DebugAnswer(curPlayer, "重置所有: Horse 0")
        GameWorld.DebugAnswer(curPlayer, "设置培养: Horse 等阶 丹数")
        return
    if len(msgList) == 1:
        if msgList[0] == 0:
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserLV, 1)
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserEatItemCount, 0)
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserSkinPlusState, 0)
    elif len(msgList) == 2:
        lv, eatItemCount = msgList
        if lv < 1:
            GameWorld.DebugAnswer(curPlayer, "等级不能小于1")
            return
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserLV, lv)
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserEatItemCount, eatItemCount)
    else:
        return
    PlayerHorse.RefreshHorseAttr(curPlayer)
    PlayerHorse.PlayerHorseLogin(curPlayer)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/SetSignDay.py
@@ -18,7 +18,6 @@
import PlayerControl
import PlayerSignDay
import PlayerMagicWeapon
import PlayerHorse
import GameWorld
import ChConfig
@@ -67,7 +66,6 @@
    
    PlayerMagicWeapon.CalcMagicWeaponAttr(curPlayer)
    PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
    PlayerHorse.RefreshHorseAttr(curPlayer)
    GameWorld.DebugAnswer(curPlayer, "设置已签次数:%s,可补次数:%s,是否次月:%s" % (signNum, canAddSignNum, isMulti))
    GameWorld.DebugAnswer(curPlayer, "本轮开始签到时间:%s" % (startTimeStr))
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -291,6 +291,24 @@
                        ("char", "SysMark", 0),
                        ),
                "HorseLVUp":(
                        ("BYTE", "HorseLV", 1),
                        ("DWORD", "HorseSkinID", 0),
                        ("WORD", "NeedEatCount", 0),
                        ("list", "LVAttrType", 0),
                        ("list", "LVAttrValue", 0),
                        ),
                "HorseSkinPlus":(
                        ("BYTE", "ID", 1),
                        ("DWORD", "HorseSkinPlusID", 0),
                        ("DWORD", "UnlockItemID", 0),
                        ("BYTE", "UnlockItemCnt", 0),
                        ("list", "AttrType", 0),
                        ("list", "AttrValue", 0),
                        ("DWORD", "InitFightPower", 0),
                        ),
                "PlayerLV":(
                        ("WORD", "LV", 1),
                        ("DWORD", "ExpPoint", 0),
@@ -2103,6 +2121,44 @@
    def GetAttrValue(self): return self.AttrValue # 激活加成属性值
    def GetSkillID(self): return self.SkillID # 可获得的技能ID
    def GetSysMark(self): return self.SysMark # 广播提示
# 坐骑升级表
class IPY_HorseLVUp():
    def __init__(self):
        self.HorseLV = 0
        self.HorseSkinID = 0
        self.NeedEatCount = 0
        self.LVAttrType = []
        self.LVAttrValue = []
        return
    def GetHorseLV(self): return self.HorseLV # 坐骑等级
    def GetHorseSkinID(self): return self.HorseSkinID # 外观物品ID
    def GetNeedEatCount(self): return self.NeedEatCount # 升级所需个数(非累计)
    def GetLVAttrType(self): return self.LVAttrType # 每级额外属性类型(非累积)
    def GetLVAttrValue(self): return self.LVAttrValue # 每级额外属性值(非累积)
# 坐骑幻化表
class IPY_HorseSkinPlus():
    def __init__(self):
        self.ID = 0
        self.HorseSkinPlusID = 0
        self.UnlockItemID = 0
        self.UnlockItemCnt = 0
        self.AttrType = []
        self.AttrValue = []
        self.InitFightPower = 0
        return
    def GetID(self): return self.ID # 幻化编号ID
    def GetHorseSkinPlusID(self): return self.HorseSkinPlusID # 外观物品ID
    def GetUnlockItemID(self): return self.UnlockItemID # 解锁坐骑物品编号
    def GetUnlockItemCnt(self): return self.UnlockItemCnt # 解锁所需物品数量
    def GetAttrType(self): return self.AttrType # 激活加成属性类型
    def GetAttrValue(self): return self.AttrValue # 激活加成属性值
    def GetInitFightPower(self): return self.InitFightPower # 皮肤额外战力
# 玩家等级表
class IPY_PlayerLV():
@@ -4842,6 +4898,10 @@
        self.ipyHorseLen = len(self.ipyHorseCache)
        self.ipyHorseUpCache = self.__LoadFileData("HorseUp", IPY_HorseUp)
        self.ipyHorseUpLen = len(self.ipyHorseUpCache)
        self.ipyHorseLVUpCache = self.__LoadFileData("HorseLVUp", IPY_HorseLVUp)
        self.ipyHorseLVUpLen = len(self.ipyHorseLVUpCache)
        self.ipyHorseSkinPlusCache = self.__LoadFileData("HorseSkinPlus", IPY_HorseSkinPlus)
        self.ipyHorseSkinPlusLen = len(self.ipyHorseSkinPlusCache)
        self.ipyPlayerLVCache = self.__LoadFileData("PlayerLV", IPY_PlayerLV)
        self.ipyPlayerLVLen = len(self.ipyPlayerLVCache)
        self.ipyGMAttrCache = self.__LoadFileData("GMAttr", IPY_GMAttr)
@@ -5318,6 +5378,10 @@
    def GetHorseByIndex(self, index): return self.ipyHorseCache[index]
    def GetHorseUpCount(self): return self.ipyHorseUpLen
    def GetHorseUpByIndex(self, index): return self.ipyHorseUpCache[index]
    def GetHorseLVUpCount(self): return self.ipyHorseLVUpLen
    def GetHorseLVUpByIndex(self, index): return self.ipyHorseLVUpCache[index]
    def GetHorseSkinPlusCount(self): return self.ipyHorseSkinPlusLen
    def GetHorseSkinPlusByIndex(self, index): return self.ipyHorseSkinPlusCache[index]
    def GetPlayerLVCount(self): return self.ipyPlayerLVLen
    def GetPlayerLVByIndex(self, index): return self.ipyPlayerLVCache[index]
    def GetGMAttrCount(self): return self.ipyGMAttrLen
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/UseItem/ItemCommon.py
@@ -1462,7 +1462,7 @@
def GetShopItemPrice(itemID, priceType):
    ''' 获取商城物品对应价格 '''
    # 系统固定商店类型: 仙玉(2-常用道具,3-成长变强),绑玉(4-绑玉商城)
    priceTypeShopTypeDict = {IPY_GameWorld.TYPE_Price_Gold_Money:[2, 3],
    priceTypeShopTypeDict = {IPY_GameWorld.TYPE_Price_Gold_Money:[1, 2, 3],
                             IPY_GameWorld.TYPE_Price_Gold_Paper:[5, 4],
                             }
    ipyData = None
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/OperControlManager.py
@@ -171,8 +171,6 @@
    #下马
    if not IsCanDoAction(curServerActionState, IPY_GameWorld.oalRide):
        #是否可以下马
        if PlayerHorse.CheckPlayerRideHorseDown(curObj) == True:
            PlayerHorse.PlayerRideHorseDown(curObj, True)
    
    if not IsCanDoAction(curServerActionState, IPY_GameWorld.oalTransmit):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -47,7 +47,6 @@
import PlayerFamily
import PlayerOnlinePrize
import NPCCustomRefresh
import PlayerHorse
import PlayerLoginDayAward
import NPCCommon
import FunctionNPCCommon
@@ -500,9 +499,6 @@
        PlayerLoginDayAward.NotePlayerLoginDayCnt(curPlayer)
        
        #------------------------------------------------------------------------------ 
        # 坐骑OnDay
        PlayerHorse.HorseOnDay(curPlayer)
        
        PlayerVip.VipOnDay(curPlayer)
        
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFeastWeekParty.py
@@ -221,14 +221,7 @@
def CheckFeastWeekPartyActionCnt(curPlayer):
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    for actionType in ChConfig.AheadFinishWPActList:
        if actionType == ChConfig.Def_WPAct_Horse:
            for i in xrange(ipyDataMgr.GetHorseCount()):
                ipyData = ipyDataMgr.GetHorseByIndex(i)
                index = ipyData.GetHorseID()
                lv = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Horser_LV % index, 0, ChConfig.Def_PDictType_Horse)
                if lv:
                    AddFeastWeekPartyActionCnt(curPlayer, actionType, index, False)
        elif actionType == ChConfig.Def_WPAct_Pet:
        if actionType == ChConfig.Def_WPAct_Pet:
            petDataPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptPet)
            for petDataIndex in range(petDataPack.GetCount()):
                petItem = petDataPack.GetAt(petDataIndex)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py
@@ -1,20 +1,20 @@
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package Player.PlayerHorse
#
# @todo:坐骑
# @author hxp
# @date 2019-12-17
# @version 1.0
#
# 详细描述: 坐骑
#
#-------------------------------------------------------------------------------
#"""Version = 2019-12-17 18:30"""
#-------------------------------------------------------------------------------
##@package PlayerHorse
# 骑马事件逻辑处理
#
# @author eggxp
# @date 2010-4-28
# @version 6.4
#
# 模块详细说明
# 修改时间 修改人 修改内容
# @change: "2016-11-29 15:30" hxp 技能战力算在功能上
# @change: "2017-08-11 21:30" xdh 手游版坐骑
#---------------------------------------------------------------------
#"""Version = 2017-08-11 21:30"""
#---------------------------------------------------------------------
import ChPyNetSendPack
import IPY_GameWorld
import GameWorld
@@ -34,69 +34,31 @@
import GameFuncComm
import EventShell
import IpyGameDataPY
import PlayerSuccess
import SkillShell
import SkillCommon
import PlayerMagicWeapon
import PassiveBuffEffMng
import CrossPlayerData
import PlayerWeekParty
import PlayerPet
#---------------------------------------------------------------------
#---------------------------------------------------------------------
#===============================================================================
# #玩家骑马, 要:
# #1.设置玩家为骑乘状态,
#
# #玩家下马, 要:
# #1.设置为空闲状态
#===============================================================================
############################################
    #如果玩家要上马:
    #1. 如果玩家不在空闲状态, 返回
    #2. 如果玩家没有装备马匹, 返回
    #3. 设定玩家进入准备状态(类似于挖宝准备)
    #4. 准备状态结束后, 调用这个模块的DoPlayerRideHorse函数, 刷新所有状态
############################################
################################################
#注意1:
#玩家在刷新所有状态的时候:
#如果玩家有装备马匹, 但是没有骑马, 不刷新马匹装备产生的buff
#注意2:
#玩家移动的时候, 如果玩家有马匹 , 则允许玩家移动
################################################
Def_HorseEquipIndex = 5
## 玩家骑马脚本(封包参数)
#  @param index 玩家索引
#  @param tick 当前时间
#  @return None
#  @remarks 函数详细说明.
#//03 09 玩家骑马#tagCRideHorse
#
#struct    tagCRideHorse
#{
#    tagHead        Head;
#    BYTE        Ride;        //1: 骑马 0: 下马
#};
def OnRideHorse(index, tick):
    GameWorld.GetPsycoFunc(__Func_OnRideHorse)(index, tick)
    return
## 玩家骑马脚本(封包参数)
#  @param index 玩家索引
#  @param tick 当前时间
#  @return None
#  @remarks 函数详细说明.
def __Func_OnRideHorse(index, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    # 判断玩家是否可以升级马匹
    if not CheckCanTrainHorse(curPlayer):
        return
    if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Horse):
        return False
    
    cdTime = ChConfig.TYPE_Player_Tick_Time[ChConfig.TYPE_Player_Tick_HorseChangState]
    # 判断时间是否超过间隔
    if tick - curPlayer.GetTickByType(ChConfig.TYPE_Player_Tick_HorseChangState) <= cdTime:
        #没有到刷新间隔
        return
    curPlayer.SetTickByType(ChConfig.TYPE_Player_Tick_HorseChangState, tick)
    
    pack = IPY_GameWorld.IPY_CRideHorse()
@@ -116,30 +78,12 @@
    
    #下马
    if curPlayerRideType == 0 :
        #是否可以下马
        if CheckPlayerRideHorseDown(curPlayer) != True :
            return
        PlayerRideHorseDown(curPlayer, True)
        
    #骑马   
    elif curPlayerRideType == 1:
        #是否可以骑马
        #if curPlayer.GetPlayerAction() not in [IPY_GameWorld.paNull, IPY_GameWorld.paAttack]:
            #CanNotRideHoreWrongState 对不起,您的当前状态,无法上马
        #    PlayerControl.NotifyCode(curPlayer, "CanNotRideHoreWrongState")
        #    return
        #移动中不执行此操作
        if not CheckPlayerRideHorseUp(curPlayer):
            return
        PlayerRideHorseUp(curPlayer, True)
        #此处不加PlayerRideHorseUp, 等待PlayerState调用 PlayerRideHorseUp
        #PlayerControl.Sync_PrepareBegin(curPlayer, ChConfig.Def_RidehorseTime, IPY_GameWorld.pstHorse)
    
    #if curPlayer.IsMoving():
    #    curPlayer.Move(curPlayer.GetDestPosX(), curPlayer.GetDestPosY())
    return
def CrossServer_RideHorse(curPlayer, dataList):
@@ -151,27 +95,11 @@
            
    return
#---------------------下马逻辑
## 是否可以下马
#  @param curPlayer 当前玩家
#  @return None or True
#  @remarks 函数详细说明.
def CheckPlayerRideHorseDown(curPlayer) :
def PlayerRideHorseDown(curPlayer, refreshState=True) :
    ## 玩家下马
    if curPlayer.GetPlayerVehicle() != IPY_GameWorld.pvHorse :
        #GameWorld.Log("不在骑马状态,无法下马")
        return
    
    #GameWorld.Log("玩家下马" , curPlayer.GetPlayerID())
    return True
## 玩家下马
#  @param curPlayer 当前玩家
#  @param refreshState: 是否需要刷新状态
#  @return None
#  @remarks 函数详细说明.
def PlayerRideHorseDown(curPlayer, refreshState=True) :
    #设置玩家无交通工具
    curPlayer.SetPlayerVehicle(IPY_GameWorld.pvNull)
    curPlayer.Sync_GetoffHorse()
    
@@ -179,64 +107,36 @@
    playerControl.RefreshPlayerAttrByBuff()
    return
#----------------------上马逻辑
def PlayerRideHorseUp(curPlayer, refreshState=True, isNotify=True) :
    ## 玩家上马
## 是否可以上马
#  @param curPlayer 当前玩家
#  @return None or True
#  @remarks 函数详细说明.
def CheckPlayerRideHorseUp(curPlayer):
    # 未加载成功骑乘会导致模型加载失败报错
    if not curPlayer.GetInitOK():
        return False
        return
    
    customMapID = PlayerControl.GetCustomMapID(curPlayer)
    if customMapID:
        ipyMapData = IpyGameDataPY.GetIpyGameData("ChinMap", customMapID)
        if not ipyMapData or not ipyMapData.GetCanRide():
            PlayerControl.NotifyCode(curPlayer, "RideLimit_lhs_0")
            return False
            return
    else:
        #地图不允许骑马 RideLimit_lhs_0
        if not GameWorld.GetMap().GetMapCanRide():
            PlayerControl.NotifyCode(curPlayer, "RideLimit_lhs_0")
            return False
            return
    
    #检查玩家状态,只有在空闲状态才能上马
    if curPlayer.GetPlayerVehicle() != IPY_GameWorld.pvNull :
        #GameWorld.Log("已经有交通工具,无法上马")
        return False
        return
    
    #检查是否装备指定ID物品
    playerEquip = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
    itemRideHorse = playerEquip.GetAt(Def_HorseEquipIndex)
    #无指定道具
    if itemRideHorse.IsEmpty():
        #PlayerControl.NotifyCode(curPlayer, "NotPrepareSteed")
        return False
    #无耐久也能上马
#===============================================================================
#    #无耐久,无法激活
#    if itemRideHorse.GetCurDurg() <= 0 :
#        GameWorld.Log("装备的马匹耐久为0,无法上马")
#        return
#===============================================================================
    #GameWorld.Log("玩家上马" , curPlayer.GetPlayerID())
    return True
## 玩家上马
#  @param curPlayer: 当前玩家
#  @param refreshState: 是否需要刷新状态
#  @return 上马是否成功
#  @remarks 函数详细说明.
def PlayerRideHorseUp(curPlayer, refreshState=True, isNotify=True) :
    if not CheckPlayerRideHorseUp(curPlayer):
        GameWorld.Log("Can not Ride Horse")
        return False
        return
    if curPlayer.GetPlayerAction() == IPY_GameWorld.paGameEvent:
        tick = GameWorld.GetGameWorld().GetTick()
@@ -254,131 +154,144 @@
    playerControl.RefreshPlayerAttrByBuff()
    return True
    
## 判断玩家是否可以升级马匹
#  @param curPlayer 玩家
#  @return 无意义
def CheckCanTrainHorse(curPlayer):
#=====================================================================
    
    if curPlayer.GetHP() <= 0 or curPlayer.GetPlayerAction() == IPY_GameWorld.paDie:
        return False
#//A5 01 坐骑激活 #tagPlayerActivateHorse
#
#struct    tagPlayerActivateHorse
#{
#    tagHead        Head;
#    DWORD        HorseID;        //坐骑幻化ID
#};
def ActivateHorseSkinItem(index, curPackData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    playerID = curPlayer.GetPlayerID()
    activateID = curPackData.HorseID
    
    if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Horse):
        #对应的任务限制未完成
        return False
    return True
## 通知客户端,培养情况
#  @param curPlayer
#  @return 无意义
def Sync_HorseTrainData(curPlayer):
    Sync_HorseClassData(curPlayer)
    return
#=====================================================================
    activateState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserSkinPlusState)
    if activateState & pow(2, activateID):
        GameWorld.DebugLog("该坐骑已幻化!activateState=%s,activateID=%s" % (activateState, activateID))
        return
    ipyData = IpyGameDataPY.GetIpyGameData("HorseSkinPlus", activateID)
    if not ipyData:
        return
    needItemID = ipyData.GetUnlockItemID()
    needItemCnt = ipyData.GetUnlockItemCnt()
    itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
    hasEnough, itemList = ItemCommon.GetItem_FromPack_ByID(needItemID, itemPack, needItemCnt)
    if not hasEnough:
        GameWorld.DebugLog("坐骑幻化道具不足! needItemID=%s,needItemCnt=%s" % (needItemID, needItemCnt))
        return
    ItemCommon.ReduceItem(curPlayer, itemPack, itemList, needItemCnt, False, ChConfig.ItemDel_Horse)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserSkinPlusState, activateState|pow(2, activateID))
    playerEquip = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
    itemRideHorse = playerEquip.GetAt(Def_HorseEquipIndex)
    #无指定道具
    if itemRideHorse.IsEmpty():
        DoChangeHorse(curPlayer, 2, activateID, tick)
    Sync_HorseClassData(curPlayer)
    GameWorld.Log("坐骑激活成功!activateID=%s" % (activateID), playerID)
    # 刷属性,更新排行榜
    RefreshHorseAttr(curPlayer)
    PlayerControl.WorldNotify(0, "GetMount", [curPlayer.GetName(), ipyData.GetHorseSkinPlusID()])
    return
#//A5 02 坐骑选择 #tagPlayerChooseHorse
#
#struct    tagPlayerChooseHorse
#{
#    tagHead        Head;
#    BYTE        Index;        //选择索引
#    BYTE        ChooseType;    // 1-按等阶,2-按幻化
#    BYTE        LVID;        // 阶等级或幻化ID
#};
#=====================================================================
## 玩家更换马匹
#  @param index 玩家索引
#  @param packData 封包数据
#  @param tick 时间戳
#  @return 无意义
def OnPlayerChangeHorse(index, packData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Horse):
        return
    #检查换装间隔
    if tick - curPlayer.GetLastChangeEquipTick() <= ChConfig.Def_MinChangeEquipTime:
        return
    curPlayer.SetLastChangeEquipTick(tick)
    
    # 判断玩家是否可以升级马匹
    if not CheckCanTrainHorse(curPlayer):
    chooseType = packData.ChooseType
    lvID = packData.LVID
    if not DoChangeHorse(curPlayer, chooseType, lvID, tick):
        return
    horseIndex = packData.Index
    DoChangeHorse(curPlayer, horseIndex, tick)
    if not GameWorld.IsCrossServer():
        dataList = [horseIndex]
        dataList = [chooseType, lvID]
        CrossPlayerData.SendDataToCrossServer(curPlayer, CrossPlayerData.CrossData_HorseChange, dataList)
    return
def CrossServer_ChangeHorse(curPlayer, dataList):
    ## 跨服处理 坐骑变更
    horseIndex = dataList[0]
    ipyData = IpyGameDataPY.GetIpyGameData("Horse", horseIndex)
    if not ipyData:
        return
    horseItemID = ipyData.GetItemID()
    if ItemCommon.FindItemInPackByItemID(curPlayer, horseItemID, IPY_GameWorld.rptEquip):
        return
    isOK = ItemControler.PutItemInTempSwap(curPlayer, horseItemID)
    if not isOK:
        return
    curHorse = ItemCommon.FindItemInPackByItemID(curPlayer, horseItemID, ShareDefine.rptTempSwap)
    if not curHorse:
        return
    isRideHorse = curPlayer.GetPlayerVehicle() == IPY_GameWorld.pvHorse
    if isRideHorse:
        PlayerRideHorseDown(curPlayer, False)
    #---执行玩家换装逻辑---
    chooseType, lvID = dataList
    tick = GameWorld.GetGameWorld().GetTick()
    if ChEquip.DoPlayerEquipItem(curPlayer, curHorse, ItemCommon.GetEquipPackIndex(curHorse), tick):
        if isRideHorse:
            PlayerRideHorseUp(curPlayer, False)
    DoChangeHorse(curPlayer, chooseType, lvID, tick)
    return
def DoChangeHorse(curPlayer, horseIndex, tick):
    ipyData = IpyGameDataPY.GetIpyGameData("Horse", horseIndex)
    if not ipyData:
def DoChangeHorse(curPlayer, chooseType, lvID, tick):
    ''' 坐骑选择
    @param chooseType: 1-按阶,2-按幻化
    @param lvID:  阶等级或幻化ID
    '''
    # 按阶
    if chooseType == 1:
        horseLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserLV)
        if horseLV < lvID:
            GameWorld.DebugLog("坐骑等级不足,无法使用该坐骑皮肤!  horseLV=%s,lvID=%s" % (horseLV, lvID))
        return
    
    horseItemID = ipyData.GetItemID()
        horseIpyData = IpyGameDataPY.GetIpyGameData("HorseLVUp", lvID)
        if not horseIpyData:
            return
        horseItemID = horseIpyData.GetHorseSkinID()
    # 按幻化
    elif chooseType == 2:
        activateState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserSkinPlusState)
        if not activateState & pow(2, lvID):
            GameWorld.DebugLog("坐骑幻化未激活,无法使用该坐骑皮肤!  activateState=%s,lvID=%s" % (activateState, lvID))
            return
        skinPlusIpyData = IpyGameDataPY.GetIpyGameData("HorseSkinPlus", lvID)
        if not skinPlusIpyData:
            return
        horseItemID = skinPlusIpyData.GetHorseSkinPlusID()
    else:
        return
    
    if not horseItemID:
        GameWorld.DebugLog("找不到选择的坐骑ID horseIndex=%s" % (horseIndex))
        return
    horseLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Horser_LV % horseIndex, 0, ChConfig.Def_PDictType_Horse)
    if horseLV < ipyData.GetUseNeedRank():
        GameWorld.DebugLog("%s阶坐骑才能切换外观  curLv=%s, horseIndex=%s" % (ipyData.GetUseNeedRank(), horseLV, horseIndex))
        GameWorld.DebugLog("找不到选择的坐骑ID! chooseType=%s,lvID=%s" % (chooseType, lvID))
        return
    
    if ItemCommon.FindItemInPackByItemID(curPlayer, horseItemID, IPY_GameWorld.rptEquip):
        GameWorld.DebugLog("OnPlayerChangeHorse() had equipped horse(%s)" % horseItemID)
        GameWorld.DebugLog("已经选择了该坐骑,无需重新选择! horseItemID=%s" % horseItemID)
        return
    
    isOK = ItemControler.PutItemInTempSwap(curPlayer, horseItemID)
    if not isOK:
        GameWorld.DebugLog("OnPlayerChangeHorse() horse(%s) put in pack(%s) fail" \
                           % (horseItemID, ShareDefine.rptTempSwap))
        return
    
    curHorse = ItemCommon.FindItemInPackByItemID(curPlayer, horseItemID, ShareDefine.rptTempSwap)
    if not curHorse:
        GameWorld.DebugLog("OnPlayerChangeHorse() pack(%s) no horse(%s) item" \
                           % (ShareDefine.rptTempSwap, horseItemID))
        return
    curHorse.SetUserAttr(ShareDefine.Def_IudetHorsePetSkinIndex, GetHorsePetSkinIndex(curPlayer, 1, horseIndex))
    #检查玩家状态是否可以换装
    if not ChEquip.CheckPlayerCanEquipItem(curPlayer):
        return
    isRideHorse = curPlayer.GetPlayerVehicle() == IPY_GameWorld.pvHorse
    
    # 如果骑乘状态,先下马,换装,再上马
@@ -389,640 +302,221 @@
    if ChEquip.DoPlayerEquipItem(curPlayer, curHorse, ItemCommon.GetEquipPackIndex(curHorse), tick):
        if isRideHorse:
            PlayerRideHorseUp(curPlayer, False)
        return
    
    return
## 马匹功能开启
def DoHorseOpen(curPlayer):
#    maxStarLV, maxClassLV, horsesList, npcList = ReadChConfig.GetEvalChConfig("HorseTrainUpgrade")
#    horseID = horsesList[0]
#
#    if ItemCommon.FindItemInPackByItemID(curPlayer, horseID, IPY_GameWorld.rptEquip):
#        return
#
#    isOK = ItemControler.PutItemInTempSwap(curPlayer, horseID)
#    if not isOK:
#        return
#
#    curHorse = ItemCommon.FindItemInPackByItemID(curPlayer, horseID, ShareDefine.rptTempSwap)
#    if not curHorse:
#        return
#
#    #---执行玩家换装逻辑---
#    tick = GameWorld.GetGameWorld().GetTick()
#    ChEquip.DoPlayerEquipItem(curPlayer, curHorse, Def_HorseEquipIndex, tick)
#
#    __HorseLearnSkill(curPlayer, 0)
#    # 计算属性 防止给第一只坐骑后,客户端坐骑战斗力为0
#    RefreshHorseAttr(curPlayer, False)
#
#    EventReport.WriteEvent_custom_mission_log(curPlayer, ChConfig.CME_Class_Horse, ChConfig.CME_Log_End, 1, cmeInfoEx="0")
    return True
def RefreshHorseAttr(curPlayer, isCheckOpen=True, isUpdateBill=True):
def DoHorseOpen(curPlayer):
    ## 马匹功能开启
    horseLV = 1
    ipyData = IpyGameDataPY.GetIpyGameData("HorseLVUp", horseLV)
    if not ipyData:
        return
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserLV, horseLV)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserEatItemCount, 0)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserSkinPlusState, 0)
    horseID = ipyData.GetHorseSkinID()
    if not ItemCommon.FindItemInPackByItemID(curPlayer, horseID, IPY_GameWorld.rptEquip):
        isOK = ItemControler.PutItemInTempSwap(curPlayer, horseID)
        if not isOK:
            return
        curHorse = ItemCommon.FindItemInPackByItemID(curPlayer, horseID, ShareDefine.rptTempSwap)
        if not curHorse:
            return
        #---执行玩家换装逻辑---
        tick = GameWorld.GetGameWorld().GetTick()
        ChEquip.DoPlayerEquipItem(curPlayer, curHorse, Def_HorseEquipIndex, tick)
    GameWorld.DebugLog("坐骑功能开启! horseLV=%s,horseID=%s" % (horseLV, horseID))
    Sync_HorseClassData(curPlayer)
    RefreshHorseAttr(curPlayer)
    return True
def RefreshHorseAttr(curPlayer, isUpdateBill=True):
    # 坐骑功能属性变更刷新
    CalcHorseAttrEx(curPlayer, isCheckOpen)
    CalcHorseAttrEx(curPlayer)
    # 需要更新坐骑榜、强制刷新属性
    PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState(billboardFunc=PlayerBillboard.UpdateHorseBillboard if isUpdateBill else None)
    return
################################################################################
## 成就
#  @param curPlayer 玩家实例
#  @param srcBackpack 背包类型
#  @param packIndex 背包索引
#  @param skillPackIndex 技能书背包索引
#  @return 物品实例
def __SetSuccess(curPlayer):
    #allLV = GetHorseSkillAllLV(curPlayer)
    # 成就
    #PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_HorseSkillBookLV, allLV)
def CalcHorseAttrEx(curPlayer):
    ## 计算马匹属性
    if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Horse):
    return
## 获取坐骑技能等级列表
#  @param curPlayer 玩家实例
#  @return
def GetHorseSkillInfo(curPlayer):
    horseSkillIDList = GetHorseSkillList()
    skillManager = curPlayer.GetSkillManager()
    skilllvList = []
    for skillresid in horseSkillIDList:
        Skill = skillManager.FindSkillBySkillTypeID(skillresid)
        #δѧϰ
        if Skill == None :
            skilllv = 0
        else:
            skilllv = Skill.GetSkillLV()
        skilllvList.append(skilllv)
    return skilllvList
## 获取坐骑技能ID
def GetHorseSkillList():
    horseSkillIDList = []
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    for i in xrange(ipyDataMgr.GetHorseUpCount()):
        ipyData = ipyDataMgr.GetHorseUpByIndex(i)
        skillIDList = ipyData.GetSkillID()
        if not skillIDList:
            continue
        for skillID in skillIDList:
            horseSkillIDList.append(skillID)
    return horseSkillIDList
## 检查是否可以学习坐骑技能
def CheckLearnHorseSkill(curPlayer, curSkillTypeID):
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    for i in xrange(ipyDataMgr.GetHorseUpCount()):
        ipyData = ipyDataMgr.GetHorseUpByIndex(i)
        skillIDList = ipyData.GetSkillID()
        if curSkillTypeID not in skillIDList:
            continue
        horseID = ipyData.GetHorseID()
        horseLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Horser_LV % horseID, 0, ChConfig.Def_PDictType_Horse)
        if horseLV < ipyData.GetLV():
            GameWorld.DebugLog('    该坐骑%s级才解锁此技能 curSkillTypeID=%s'%(ipyData.GetLV(), curSkillTypeID))
            return False
        return True
    #不是坐骑技能
    return True
## 计算马匹属性
#  @param curPlayer 玩家
#  @param allAttrList 属性列表
#  @return None
def CalcHorseAttrEx(curPlayer, isCheckOpen=True):
    allAttrList = [{} for _ in range(4)]
    allAttrListHorseSoul = [{} for _ in range(4)]
    skillAttrList = [{} for _ in range(4)]
    allAttrListSkin = [{} for _ in range(4)]
    # 判断玩家是否可以升级马匹
    if isCheckOpen and not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Horse):
        #对应的任务限制未完成
        return
    maxSpeed = 0 #坐骑最大移动速度
    
    # 坐骑技能添加属性百分比增加在buff中已转为固定属性,只对进阶属性有效不含 移动速度
    skillFPEx = __CalcHorseSkillAttr(curPlayer, skillAttrList)
    initFPAdd = 0 #初始战力
    horseSpeed = 0 # 坐骑功能增加的速度值,骑乘时才有效果
    horseLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserLV)
    # 等阶培养属性
    totalItemCount = 0
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    for i in xrange(ipyDataMgr.GetHorseCount()):
        ipyData = ipyDataMgr.GetHorseByIndex(i)
        horseID = ipyData.GetHorseID()
        horseLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Horser_LV % horseID, 0, ChConfig.Def_PDictType_Horse)
        if not horseLV:
            continue
        initFPAdd += ipyData.GetInitFightPower()
        horseUpData = IpyGameDataPY.GetIpyGameData("HorseUp", horseID, horseLV)
        if not horseUpData:
            continue
        attrTypeList = horseUpData.GetAttrType()
        attrValueList = horseUpData.GetAttrValue()
        for i, attrID in enumerate(attrTypeList):
    for index in xrange(ipyDataMgr.GetHorseLVUpCount()):
        horseIpyData = ipyDataMgr.GetHorseLVUpByIndex(index)
        if horseIpyData.GetHorseLV() >= horseLV:
            totalItemCount += curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserEatItemCount)
            break
        # 等阶额外属性
        totalItemCount += horseIpyData.GetNeedEatCount()
        lvAttrTypeList = horseIpyData.GetLVAttrType()
        lvAttrValueList = horseIpyData.GetLVAttrValue()
        for i, attrID in enumerate(lvAttrTypeList):
            attrValue = lvAttrValueList[i]
            if attrID == ShareDefine.Def_Effect_Speed:
                maxSpeed = max(maxSpeed, attrValueList[i])
                horseSpeed += attrValue
                continue
            PlayerControl.CalcAttrDict_Type(attrID, attrValueList[i], allAttrList)
        skinData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorsePetSkinData % (1, horseID), 0)
        skinIpyData = IpyGameDataPY.GetIpyGameDataNotLog('HorsePetSkin', 1, horseID, skinData/100)
        if skinIpyData:
            for attrID, attrValue in skinIpyData.GetAttrInfo().items():
            PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList)
    # 等阶培养丹累加个数属性
    eatItemAttrInfo = IpyGameDataPY.GetFuncCfg("HorseUpItem", 3)
    for attrID, attrValue in eatItemAttrInfo:
        PlayerControl.CalcAttrDict_Type(attrID, attrValue * totalItemCount, allAttrList)
    # 幻化属性
    initFPAdd = 0 #初始战力
    activateState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserSkinPlusState)
    for index in xrange(ipyDataMgr.GetHorseSkinPlusCount()):
        skinPlusIpyData = ipyDataMgr.GetHorseSkinPlusByIndex(index)
        skinPlusID = skinPlusIpyData.GetID()
        if not activateState & pow(2, skinPlusID):
            continue
        initFPAdd += skinPlusIpyData.GetInitFightPower()
        attrTypeList = skinPlusIpyData.GetAttrType()
        attrValueList = skinPlusIpyData.GetAttrValue()
        for i, attrID in enumerate(attrTypeList):
            attrValue = attrValueList[i]
            if attrID == ShareDefine.Def_Effect_Speed:
                horseSpeed += attrValue
                continue
                PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListSkin)
    
    curPlayer.SetDict(ChConfig.Def_PlayerKey_MFPEx % ShareDefine.Def_MFPType_Horse, skillFPEx+initFPAdd)
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_HorseSkill, skillAttrList)
    curPlayer.SetDict(ChConfig.Def_PlayerKey_MFPEx % ShareDefine.Def_MFPType_Horse, initFPAdd)
    #GameWorld.DebugLog("坐骑功能属性: horseLV=%s,horseSpeed=%s,totalItemCount=%s,initFPAdd=%s" % (horseLV, horseSpeed, totalItemCount, initFPAdd))
    
    # 先缓存值,骑乘状态时进行附加
    GameWorld.DebugLog('坐骑取最大移动速度,maxSpeed=%s' % maxSpeed)
    curPlayer.SetDict(ChConfig.Def_PlayerKey_SpeedHorse, maxSpeed)
    curPlayer.SetDict(ChConfig.Def_PlayerKey_SpeedHorse, horseSpeed)
    
    # 果实对坐骑的加成, 魂石果实算附加属性层,单独计算
    fightPowerEx = PlayerAttrFruit.CalcAttrFruitAddAtrr(curPlayer, allAttrListHorseSoul, ShareDefine.Def_AttrFruitFunc_Horse)
    curPlayer.SetDict(ChConfig.Def_PlayerKey_MFPEx % ShareDefine.Def_MFPType_HorseSoul, fightPowerEx)
    
    #PlayerControl.CalcFuncPackItem(curPlayer, ShareDefine.Def_Pack_Type_HorseSkill, allAttrList)
    # 保存计算值
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Horse, allAttrList)
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_HorseSoul, allAttrListHorseSoul)
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_HorseSkin, allAttrListSkin)
    return
def __CalcHorseSkillAttr(curPlayer, allAttrList):
    # 计算技能属性
    skillFPEx = 0
    skillManager = curPlayer.GetSkillManager()
    #GameWorld.DebugLog("1刷坐骑技能属性: %s" % allAttrList)
    for i in range(0 , skillManager.GetSkillCount()):
        curSkill = skillManager.GetSkillByIndex(i)
        if not curSkill:
            continue
        if curSkill.GetFuncType() != ChConfig.Def_SkillFuncType_HorseSkill:
            continue
        if not SkillCommon.isPassiveAttr(curSkill):
            continue
        for effectIndex in xrange(curSkill.GetEffectCount()):
            curEffect = curSkill.GetEffect(effectIndex)
            SkillShell.CalcBuffEffAttr(curPlayer, curEffect, allAttrList)
    #GameWorld.DebugLog("2刷坐骑技能属性: skillFPEx=%s, %s" % ( skillFPEx, allAttrList))
    return skillFPEx
## // A5 27 坐骑提升 #tagCMHorseUp
## 坐骑升阶
#  @param curPlayer
#  @return None
#// A5 27 坐骑提升 #tagCMHorseUp
#
#struct    tagCMHorseUp
#{
#    tagHead        Head;
#    BYTE        UseItemCnt;        //消耗材料个数
#    BYTE        IsAutoBuy;        //是否自动购买
#};
def OnHorseClassLVUP(index, curPackData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    costItemCount = curPackData.UseItemCnt # 消耗材料个数
    isAutoBuy = curPackData.IsAutoBuy # 是否自动购买
    horseID = curPackData.HorseID
    # 判断玩家是否可以升级马匹
    if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Horse):
        #对应的任务限制未完成
        GameWorld.DebugLog("HorseClassLVUP 坐骑未开启。。。")
        return
    horseLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Horser_LV % horseID, 0, ChConfig.Def_PDictType_Horse)
    if horseLV <= 0:
        GameWorld.DebugLog("坐骑提升 该坐骑未激活 horseID=%s" % horseID)
        GameWorld.DebugLog("坐骑未开启!")
        return
    
    horseIpyData = IpyGameDataPY.GetIpyGameData("Horse", horseID)
    horseLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserLV)
    curEatItemCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserEatItemCount)
    if horseLV <= 0:
        GameWorld.DebugLog("坐骑提升 该坐骑未激活 horseLV=%s" % horseLV)
        return
    horseIpyData = IpyGameDataPY.GetIpyGameData("HorseLVUp", horseLV)
    if not horseIpyData:
        return
    
    maxLV = horseIpyData.GetMaxLV()
    if horseLV >= maxLV:
        GameWorld.DebugLog("HorseClassLVUP 该坐骑已满级 horseID=%s" % horseID)
    needEatCount = horseIpyData.GetNeedEatCount()
    if not needEatCount:
        GameWorld.DebugLog("坐骑已满级!horseLV=%s" % horseLV)
        return
    
    horseUpIpyData = IpyGameDataPY.GetIpyGameData("HorseUp", horseID, horseLV)
    if not horseUpIpyData:
        return
    needExp = horseUpIpyData.GetNeedExp()
    if not needExp:
        return
    curExp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Horser_Exp % horseID,
                                                0,
                                                ChConfig.Def_PDictType_Horse)
    curItemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
    itemIndexList = []
    costItemIDList = IpyGameDataPY.GetFuncEvalCfg('HorseUpItem')
    #扣材料
    nowCnt = 0
    for itemID in costItemIDList:
        hasEnough, indexList, findItemIsBind, lackCnt = ItemCommon.GetItem_FromPack_ByID_ExEx(itemID, curItemPack, costItemCount - nowCnt)
        itemIndexList.extend(indexList)
        if hasEnough:
            #足够退出
            break
        if itemIndexList:
            nowCnt = 0
            for itemIndex in itemIndexList:
                curItem = curItemPack.GetAt(itemIndex)
                #检查物品
                if not ItemCommon.CheckItemCanUse(curItem):
                    continue
                itemCnt = curItem.GetCount()
                nowCnt += itemCnt
    if not hasEnough and not isAutoBuy:
        GameWorld.DebugLog("HorseClassLVUP 升阶道具不足。。。")
    costItemID = IpyGameDataPY.GetFuncCfg("HorseUpItem", 1)
    if not costItemID or not costItemCount:
        return
    
    autoBuyItemID = costItemIDList[0]
    if itemIndexList:
        curItem = curItemPack.GetAt(itemIndexList[0])
    else:
        curItem = GameWorld.GetGameData().GetItemByTypeID(autoBuyItemID)
    if not curItem:
    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
    
    if lackCnt > 0:
        if not isAutoBuy:
        lackCost = ItemCommon.GetAutoBuyItemNeedGold({costItemID:lackCnt})
        if lackCost <= 0:
            return
        itemGold = ItemCommon.GetShopItemPrice(curItem.GetItemTypeID(), IPY_GameWorld.TYPE_Price_Gold_Money)
        #lackCost = ItemCommon.GetAutoBuyItemNeedGold({autoBuyItemID:lackCnt})
        if itemGold <= 0:
        infoDict = {ChConfig.Def_Cost_Reason_SonKey:costItemID}
        if not PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, lackCost, ChConfig.Def_Cost_BuyStoreItem, infoDict):
            return
        costMoneyList = PlayerControl.HaveMoneyEx(curPlayer, ShareDefine.TYPE_Price_Gold_Paper_Money, itemGold*lackCnt)
        if not costMoneyList:
            return
        infoDict = {ChConfig.Def_Cost_Reason_SonKey:autoBuyItemID}
        for moneyType, moneyCnt in costMoneyList:
            if not PlayerControl.PayMoney(curPlayer, moneyType, moneyCnt,
                                          ChConfig.Def_Cost_BuyStoreItem, infoDict, lackCnt):
                return
    lastMultiple = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Horser_Multiple, 1, ChConfig.Def_PDictType_Horse)
    multiple = 1 if costItemCount == 1 else lastMultiple #本次倍数 (只用1个材料不能多倍)
        
    if multiple > 1:
        EventShell.EventRespons_HorseMultiple(curPlayer, multiple)
    playerName = curPlayer.GetName()
#    needSysHorseLVDict = IpyGameDataPY.GetFuncEvalCfg('NeedSysHorseLV')
#    needSysHorseLVList = needSysHorseLVDict.get(horseID, [])
    curEff = curItem.GetEffectByIndex(0)
    addExp = curEff.GetEffectValue(0) * costItemCount * multiple
    updExp = curExp + addExp
    # 扣除消耗
    delCnt = max(0, costItemCount - lackCnt) # 实际扣除的个数
    if delCnt:
        ItemCommon.DelCostItemByBind(curPlayer, costItemIndexList, bindCnt, unBindCnt, delCnt, ChConfig.ItemDel_Horse)
    updClassLV = horseLV
    for lv in range(horseLV, maxLV):
        ipyData = IpyGameDataPY.GetIpyGameData("HorseUp", horseID, lv)
        if not ipyData:
            break
        upNeedExp = ipyData.GetNeedExp()
        if updExp < upNeedExp:
            break
    updEatItemCount = curEatItemCount + costItemCount
    GameWorld.DebugLog("坐骑培养: horseLV=%s,curEatItemCount=%s,costItemCount=%s,updEatItemCount=%s,needEatCount=%s"
                       % (horseLV, curEatItemCount, costItemCount, updEatItemCount, needEatCount))
    if updEatItemCount >= needEatCount:
        updClassLV +=1
        upIpyData = IpyGameDataPY.GetIpyGameData("HorseUp", horseID, updClassLV)
        if not upIpyData:
            break
        updExp -= upNeedExp
        updEatItemCount -= needEatCount
        GameWorld.DebugLog("    升阶: updClassLV=%s,updEatItemCount=%s" % (updClassLV, updEatItemCount))
        
        #解锁技能
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserLV, updClassLV)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorserEatItemCount, updEatItemCount)
        
        skillIDList = upIpyData.GetSkillID()
        if skillIDList:
            sysMark = upIpyData.GetSysMark() or 'MountUpLv'
            for skillID in skillIDList:
                __GiveSkill(curPlayer, skillID, tick)
                PlayerControl.WorldNotify(0, sysMark, [playerName, horseID, updClassLV, skillID])
        if not skillIDList and updClassLV == maxLV:
            PlayerControl.WorldNotify(0, 'MountUpLvMax', [playerName, horseID])
        #X坐骑X等级成就
        PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_HorseAllLV, 1, [horseID, updClassLV])
    # 升阶
    if updClassLV > horseLV:
        EventShell.EventRespons_HorseLV(curPlayer, updClassLV)
        EventShell.EventRespons_HorseUp(curPlayer)
        # 玩家马匹进阶
        DataRecordPack.DR_NewHorseByClassUp(curPlayer, updClassLV, 0)
        # 记录开服活动马匹阶级
        OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_HorseLV, updClassLV)
        
    addLV = updClassLV - horseLV
    if addLV:
        __HorseClassLVUP(curPlayer, horseID, updClassLV)
    if updClassLV >= maxLV:
        updExp = 0
    #扣除物品
    delCnt = max(0, costItemCount - lackCnt) # 实际扣除的个数
    if itemIndexList:
        ItemCommon.ReduceItem(curPlayer, curItemPack, itemIndexList, delCnt, True, ChConfig.ItemDel_Horse)
    # 更新经验值
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Horser_Exp % horseID, updExp, ChConfig.Def_PDictType_Horse)
    # 下次暴击倍数
    horseSuperRateDict = IpyGameDataPY.GetFuncEvalCfg('HorseSuperRate')
    keyNO = 0 #默认0
    rateDict = horseSuperRateDict.get(keyNO, {})
    rateList = rateDict.get(multiple, [])
    nextMultiple = GameWorld.GetResultByRandomList(rateList, 1)
    if costItemCount != 1 or nextMultiple > lastMultiple:
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Horser_Multiple, nextMultiple, ChConfig.Def_PDictType_Horse)
    Sync_HorseClassData(curPlayer, horseID)
    # 活跃度
    #PlayerActivity.AddActivityFinishCnt(curPlayer, ShareDefine.ActivityNum_HorseUP)
    #EventReport.WriteEvent_horse_class(curPlayer, horseLV, curExp, delCnt, updClassLV, updExp)
    return
## 坐骑阶级提升
#  @param curPlayer
#  @param horseID: 坐骑id
#  @param updateClassLV: 更新的阶级
#  @return None
def __HorseClassLVUP(curPlayer, horseID, updateClassLV):
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Horser_LV%horseID, updateClassLV, ChConfig.Def_PDictType_Horse)
    #EventReport.WriteEvent_custom_mission_log(curPlayer, ChConfig.CME_Class_Horse, ChConfig.CME_Log_End, 1, cmeInfoEx=str(updateClassLV))
    sumLV = GetHorseSumLV(curPlayer)
    Sync_HorseClassData(curPlayer)
    # 刷属性,更新排行榜
    RefreshHorseAttr(curPlayer)
    # 玩家马匹进阶
    DataRecordPack.DR_NewHorseByClassUp(curPlayer, updateClassLV, horseID)
    # 记录开服活动马匹阶级
    OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_HorseLV, sumLV)
    return
## 给技能
#  @param curPlayer
#  @param skillResID 技能源ID
#  @param tick 时间戳
#  @return None
def __GiveSkill(curPlayer, skillResID, tick):
    skillData = GameWorld.GetGameData().FindSkillByType(skillResID, 1)
    if skillData == None:
        GameWorld.DebugLog("__GiveSkill() hasn't find skill(%s)" % skillResID)
        return
    if not SkillCommon.CheckSkillJob(curPlayer, skillData):
        return
    if not SkillShell.CheckLearnSkillCondition(curPlayer, skillData):
        GameWorld.DebugLog("__GiveSkill() learn skill(%s) condition isn't enough" % skillResID)
        return
    skillManager = curPlayer.GetSkillManager()
    if skillManager.FindSkillBySkillTypeID(skillResID):
        GameWorld.DebugLog("__GiveSkill() have learned skill(%s)" % skillResID)
        return
    GameWorld.DebugLog('     激活坐骑技能 skillResID=%s' % (skillResID))
    skillManager.LVUpSkillBySkillTypeID(skillResID)
    #PlayerControl.NotifyCode(curPlayer, "GetSkillInfo", [skillResID])
    if not SkillCommon.isPassiveAttr(skillData):
        PassiveBuffEffMng.GetPassiveEffManager().RegistPassiveEff(curPlayer, skillData.GetSkillID())
    DataRecordPack.DR_LearnORUPSkill(curPlayer, skillResID, 0)
    PlayerControl.PlayerControl(curPlayer).RefreshSkillFightPowerEx(skillResID, 0)
    return
##OnDay时处理
# @param curPlayer 玩家
# @return None
def HorseOnDay(curPlayer):
    return
##坐骑登录处理
# @param curPlayer 玩家
# @return None
def PlayerHorseLogin(curPlayer):
    ##坐骑登录处理
    if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Horse):
        return
    Sync_HorseClassData(curPlayer)
    SyncHorsePetSkinData(curPlayer)
    return
## 通知客户端,培养情况
#  @param curPlayer
#  @return 无意义
def Sync_HorseClassData(curPlayer, horseID= -1):
def Sync_HorseClassData(curPlayer):
    horseData = ChPyNetSendPack.tagTrainHorseData()
    horseData.Clear()
    horseData.InfoList = []
    if horseID == -1:
        ipyDataMgr = IpyGameDataPY.IPY_Data()
        for i in xrange(ipyDataMgr.GetHorseCount()):
            ipyData = ipyDataMgr.GetHorseByIndex(i)
            index = ipyData.GetHorseID()
            lv = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Horser_LV % index,
                                                       0, ChConfig.Def_PDictType_Horse)
            if not lv:
                continue
            skinInfo = ChPyNetSendPack.tagMCHorseInfo()
            skinInfo.Clear()
            skinInfo.HorseID = index
            skinInfo.LV = lv
            skinInfo.Exp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Horser_Exp % index,
                                                       0, ChConfig.Def_PDictType_Horse)
            horseData.InfoList.append(skinInfo)
    else:
        skinInfo = ChPyNetSendPack.tagMCHorseInfo()
        skinInfo.Clear()
        skinInfo.HorseID = horseID
        skinInfo.LV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Horser_LV % horseID,
                                                       0, ChConfig.Def_PDictType_Horse)
        skinInfo.Exp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Horser_Exp % horseID,
                                                       0, ChConfig.Def_PDictType_Horse)
        horseData.InfoList.append(skinInfo)
    horseData.Num = len(horseData.InfoList)
    horseData.Multiple = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Horser_Multiple, 1, ChConfig.Def_PDictType_Horse)
    horseData.LV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserLV)
    horseData.EatItemCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserEatItemCount)
    horseData.SkinPlusState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserSkinPlusState)
    NetPackCommon.SendFakePack(curPlayer, horseData)
    return
#------------------------------------------------------------------------
#//A5 01 坐骑激活 #tagPlayerActivateHorse
#
#struct    tagPlayerActivateHorse
#{
#    tagHead        Head;
#    BYTE        HorseID;        //坐骑ID
#};
## 激活坐骑
#  @param curPlayer
#  @return None
def ActivateHorseSkinItem(index, curPackData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    playerID = curPlayer.GetPlayerID()
    if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Horse):
        GameWorld.Log("坐骑功能未开启,无法激活坐骑!", playerID)
        return False
    horseID = curPackData.HorseID
    ipyData = IpyGameDataPY.GetIpyGameData('Horse', horseID)
    if not ipyData:
        GameWorld.ErrLog("坐骑幻化物品异常,无该幻化物品信息!检查tagHorse.txt! horseID=%s" % horseID, playerID)
        return False
    horseLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Horser_LV % horseID,
                                                       0, ChConfig.Def_PDictType_Horse)
    if horseLV > 0:
        GameWorld.DebugLog('该坐骑已激活 horseID=%s' % horseID)
        return
    needItemID = ipyData.GetUnlockItemID()
    needItemCnt = ipyData.GetUnlockItemCnt()
    itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
    hasEnough, itemList = ItemCommon.GetItem_FromPack_ByID(needItemID, itemPack, needItemCnt)
    if not hasEnough:
        GameWorld.DebugLog("ActivateHorseSkinItem() item(%s[%s]) isn't enough" % (needItemID, needItemCnt))
        return
    ItemCommon.ReduceItem(curPlayer, itemPack, itemList, needItemCnt, False, ChConfig.ItemDel_Horse)
    #设置初始等级
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Horser_LV % horseID, ipyData.GetInitLV(), ChConfig.Def_PDictType_Horse)
    for _ in xrange(ipyData.GetInitLV()):
        EventShell.EventRespons_HorseUp(curPlayer)
    # 记录开服活动马匹阶级
    sumLV = GetHorseSumLV(curPlayer)
    OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_HorseLV, sumLV)
    PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_Horse, horseID, False)
    playerEquip = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
    itemRideHorse = playerEquip.GetAt(Def_HorseEquipIndex)
    #无指定道具
    if itemRideHorse.IsEmpty():
        DoChangeHorse(curPlayer, horseID, tick)
#    curHorseSkin = None
#    horseItemID = ipyData.GetItemID()
#    isOK = ItemControler.PutItemInTempSwap(curPlayer, horseItemID)
#    if isOK:
#        curHorseSkin = ItemCommon.FindItemInPackByItemID(curPlayer, horseItemID, ShareDefine.rptTempSwap)
#    if curHorseSkin and not curHorseSkin.IsEmpty():
#        tick = GameWorld.GetGameWorld().GetTick()
#        PlayerRideHorseDown(curPlayer, False)
#        # 执行玩家换装逻辑
#        if ChEquip.DoPlayerEquipItem(curPlayer, curHorseSkin, Def_HorseEquipIndex, tick):
#            PlayerRideHorseUp(curPlayer, False)
    #GameWorld.DebugLog("给幻化坐骑物品giveOK=%s" % giveOK)
    Sync_HorseClassData(curPlayer, horseID)
    GameWorld.Log("坐骑激活成功!horseID=%s" % (horseID), playerID)
    # 刷属性,更新排行榜
    RefreshHorseAttr(curPlayer)
    sysMark = ipyData.GetUnlockSys() or 'GetMount'
    PlayerControl.WorldNotify(0, sysMark, [curPlayer.GetName(), ipyData.GetItemID()])
#
#    HorseSkinNotifyDict = ReadChConfig.GetEvalChConfig("HorseSkinNotify")
#    if horseSkinID in HorseSkinNotifyDict:
#        notifyMark = HorseSkinNotifyDict[horseSkinID]
#        PlayerControl.WorldNotify(0, notifyMark, [curPlayer.GetPlayerName(), horseSkinID])
    return True
def DoHorseActivate(curPlayer, index, classLV, classExp=None):
    '''GM命令测试用
    @param index: 第几只坐骑或坐骑ID
    '''
    ipyData = IpyGameDataPY.GetIpyGameDataNotLog('Horse', index)
    if not ipyData:
        ipyDataMgr = IpyGameDataPY.IPY_Data()
        if index > ipyDataMgr.GetHorseCount() or index < 1:
            GameWorld.DebugAnswer(curPlayer, '不存在本只坐骑')
            return
        horseID = ipyDataMgr.GetHorseByIndex(index-1).GetHorseID()
        ipyData = IpyGameDataPY.GetIpyGameData('Horse', horseID)
        if not ipyData:
            return
    else:
        horseID = index
    maxLV = ipyData.GetMaxLV()
    classLV = min(classLV, maxLV)
    befClassLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Horser_LV % horseID, 0, ChConfig.Def_PDictType_Horse)
    #设置初始等级
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Horser_LV % horseID, classLV, ChConfig.Def_PDictType_Horse)
    if classExp != None and type(classExp) == int:
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Horser_Exp % horseID, classExp, ChConfig.Def_PDictType_Horse)
    #处理技能
    tick = GameWorld.GetGameWorld().GetTick()
    playerSkillManager = curPlayer.GetSkillManager()
    for lv in xrange(1, maxLV + 1):
        upIpyData = IpyGameDataPY.GetIpyGameData("HorseUp", horseID, lv)
        if not upIpyData:
            break
        skillIDList = upIpyData.GetSkillID()
        if not skillIDList:
            continue
        if befClassLV >= lv and classLV < lv:
            for skillID in skillIDList:
                playerSkillManager.DeleteSkillBySkillTypeID(skillID)
        elif befClassLV < lv and classLV >= lv:
            for skillID in skillIDList:
                __GiveSkill(curPlayer, skillID, tick)
    pControl = PlayerControl.PlayerControl(curPlayer)
    pControl.RefreshAllSkill()
    Sync_HorseClassData(curPlayer, horseID)
    GameWorld.Log("坐骑激活成功!horseID=%s,befClassLV=%s,classLV=%s,classExp=%s"
                  % (horseID, befClassLV, classLV, classExp), curPlayer.GetPlayerID())
    # 刷属性,更新排行榜
    RefreshHorseAttr(curPlayer)
    return
# 坐骑总等级
def GetHorseSumLV(curPlayer):
    sumLV = 0
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    for i in xrange(ipyDataMgr.GetHorseCount()):
        ipyData = ipyDataMgr.GetHorseByIndex(i)
        horseID = ipyData.GetHorseID()
        horseLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Horser_LV % horseID, 0, ChConfig.Def_PDictType_Horse)
        if not horseLV:
            continue
        sumLV += horseLV
    return sumLV
def GetHorseCurMaxLV(curPlayer):
    ##获取坐骑当前最大等级
    maxLV = 0
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    for i in xrange(ipyDataMgr.GetHorseCount()):
        ipyData = ipyDataMgr.GetHorseByIndex(i)
        horseID = ipyData.GetHorseID()
        horseLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Horser_LV % horseID, 0, ChConfig.Def_PDictType_Horse)
        if horseLV > maxLV:
            maxLV = horseLV
    return maxLV
def IsHorseMaxLV(curPlayer, horseID):
    horseLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Horser_LV % horseID, 0, ChConfig.Def_PDictType_Horse)
    if horseLV <= 0:
        return
    horseIpyData = IpyGameDataPY.GetIpyGameData("Horse", horseID)
    if not horseIpyData:
        return
    maxLV = horseIpyData.GetMaxLV()
    return horseLV >= maxLV
    ## 坐骑总等级
    return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserLV)
#============================骑宠觉醒=============================
#// A5 29 骑宠觉醒 #tagCMHorsePetAwake
@@ -1042,9 +536,11 @@
    if not IpyGameDataPY.GetIpyGameDataByCondition('HorsePetSkin', {'Type':skintype, 'ID':horsePetID}):
        return
    if skintype == 1:
        if not IsHorseMaxLV(curPlayer, horsePetID):
            GameWorld.DebugLog('骑宠觉醒 对应骑宠未满级 horsePetID=%s'%horsePetID)
        #坐骑玩法修改,暂关闭坐骑觉醒
            return
#        if not IsHorseMaxLV(curPlayer, horsePetID):
#            GameWorld.DebugLog('骑宠觉醒 对应骑宠未满级 horsePetID=%s' % horsePetID)
#            return
    else:
        if not PlayerPet.IsPetMaxLV(curPlayer, horsePetID):
            GameWorld.DebugLog('骑宠觉醒 对应骑宠未满级 horsePetID=%s'%horsePetID)
@@ -1141,6 +637,8 @@
    ##骑宠觉醒外观更换
    ChEquip.ChangeEquipfacadeByHorsePetSkin(curPlayer, skinType, skinIndex)
    if skinType == 1:#坐骑
        # 坐骑功能修改,暂关闭觉醒
        return
        playerEquip = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
        itemRideHorse = playerEquip.GetAt(Def_HorseEquipIndex)
        #无指定道具
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSignDay.py
@@ -30,14 +30,12 @@
import ChPyNetSendPack
import PlayerMagicWeapon
import PlayerPet
import PlayerSuccess
import PlayerControl
import GameWorld
import ChConfig
import GameFuncComm
import IpyGameDataPY
import ItemCommon
import PlayerHorse
import time
#===============================================================================
@@ -166,7 +164,6 @@
    # 刷签到附加功能属性
    PlayerMagicWeapon.CalcMagicWeaponAttr(curPlayer)
    PlayerPet.CalcPetItemAddPlayerAttr(curPlayer)
    PlayerHorse.CalcHorseAttrEx(curPlayer)
    PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
    
    mwID = IpyGameDataPY.GetFuncCfg('MWSignDayAttr', 2)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSuccess.py
@@ -305,16 +305,6 @@
            for i in xrange(1, maxType + 1):
                weaponLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GodWeaponLV % i)
                UptateSuccessProgress(curPlayer, succType, weaponLV, [i])
        elif succType == ShareDefine.SuccType_HorseAllLV:
            ResetSuccessByType(curPlayer, succType)
            for i in xrange(ipyDataMgr.GetHorseCount()):
                ipyData = ipyDataMgr.GetHorseByIndex(i)
                index = ipyData.GetHorseID()
                lv = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Horser_LV % index, 0, ChConfig.Def_PDictType_Horse)
                if not lv:
                    continue
                for rlv in xrange(1, lv+1):
                    DoAddSuccessProgress(curPlayer, succType, 1, [index, rlv])
        elif succType == ShareDefine.SuccType_EquipPlusLV:
            ResetSuccessByType(curPlayer, succType)
            for pType, indexList in ChConfig.Pack_EquipPart_CanPlusStar.items():
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py
@@ -275,15 +275,11 @@
## 坐骑信息
def __GetHorseInfo(curPlayer):
    horseList = []
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    for i in xrange(ipyDataMgr.GetHorseCount()):
        ipyData = ipyDataMgr.GetHorseByIndex(i)
        horseID = ipyData.GetHorseID()
        horseLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Horser_LV % horseID, 0, ChConfig.Def_PDictType_Horse)
        if horseLV:
            horseList.append({"id":horseID, 'lv':horseLV})
    return horseList
    horseInfo = {"LV":curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserLV),
                 "EatItemCount":curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserEatItemCount),
                 "SkinPlusState":curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorserSkinPlusState),
                 }
    return horseInfo
## 神器信息
def __GetGodWeaponInfo(curPlayer):
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerWeekParty.py
@@ -224,14 +224,7 @@
def CheckWeekPartyActionCnt(curPlayer):
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    for actionType in ChConfig.AheadFinishWPActList:
        if actionType == ChConfig.Def_WPAct_Horse:
            for i in xrange(ipyDataMgr.GetHorseCount()):
                ipyData = ipyDataMgr.GetHorseByIndex(i)
                index = ipyData.GetHorseID()
                lv = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Horser_LV % index, 0, ChConfig.Def_PDictType_Horse)
                if lv:
                    AddWeekPartyActionCnt(curPlayer, actionType, index, False)
        elif actionType == ChConfig.Def_WPAct_Pet:
        if actionType == ChConfig.Def_WPAct_Pet:
            petDataPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptPet)
            for petDataIndex in range(petDataPack.GetCount()):
                petItem = petDataPack.GetAt(petDataIndex)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/Buff_510.py
@@ -47,17 +47,18 @@
    return ChConfig.TYPE_Linear
def GetHorseAttrByType(curPlayer, horseID, attrType):
    horseLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Horser_LV % horseID, 0, ChConfig.Def_PDictType_Horse)
    if not horseLV:
        return 0
    horseUpData = IpyGameDataPY.GetIpyGameData("HorseUp", horseID, horseLV)
    if not horseUpData:
        return 0
    attrTypeList = horseUpData.GetAttrType()
    attrValueList = horseUpData.GetAttrValue()
    if attrType not in attrTypeList:
        return 0
    return attrValueList[attrTypeList.index(attrType)]
#    horseLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Horser_LV % horseID, 0, ChConfig.Def_PDictType_Horse)
#    if not horseLV:
#        return 0
#    horseUpData = IpyGameDataPY.GetIpyGameData("HorseUp", horseID, horseLV)
#    if not horseUpData:
#        return 0
#    attrTypeList = horseUpData.GetAttrType()
#    attrValueList = horseUpData.GetAttrValue()
#    if attrType not in attrTypeList:
#        return 0
#
#    return attrValueList[attrTypeList.index(attrType)]
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/Buff_511.py
@@ -47,28 +47,29 @@
    return ChConfig.TYPE_Linear
def GetHorseAttrByQuality(curPlayer, quality, attrType):
    value = 0
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    for i in xrange(ipyDataMgr.GetHorseCount()):
        ipyData = ipyDataMgr.GetHorseByIndex(i)
        horseID = ipyData.GetHorseID()
        if ipyData.GetQuality() != quality:
            # 非此品质排除
            continue
        lv = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Horser_LV % horseID, 0, ChConfig.Def_PDictType_Horse)
        if not lv:
            continue
        horseUpData = IpyGameDataPY.GetIpyGameData("HorseUp", horseID, lv)
        if not horseUpData:
            continue
        attrTypeList = horseUpData.GetAttrType()
        attrValueList = horseUpData.GetAttrValue()
        if attrType not in attrTypeList:
            continue
        value += attrValueList[attrTypeList.index(attrType)]
    return value
    return 0
#    value = 0
#    ipyDataMgr = IpyGameDataPY.IPY_Data()
#    for i in xrange(ipyDataMgr.GetHorseCount()):
#        ipyData = ipyDataMgr.GetHorseByIndex(i)
#        horseID = ipyData.GetHorseID()
#        if ipyData.GetQuality() != quality:
#            # 非此品质排除
#            continue
#        lv = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Horser_LV % horseID, 0, ChConfig.Def_PDictType_Horse)
#        if not lv:
#            continue
#
#        horseUpData = IpyGameDataPY.GetIpyGameData("HorseUp", horseID, lv)
#        if not horseUpData:
#            continue
#
#        attrTypeList = horseUpData.GetAttrType()
#        attrValueList = horseUpData.GetAttrValue()
#        if attrType not in attrTypeList:
#            continue
#
#        value += attrValueList[attrTypeList.index(attrType)]
#
#    return value
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameBuffs/Buff_521.py
@@ -49,25 +49,26 @@
    return ChConfig.TYPE_Linear
def GetHorseAttrByQuality(curPlayer, attrType):
    value = 0
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    for i in xrange(ipyDataMgr.GetHorseCount()):
        ipyData = ipyDataMgr.GetHorseByIndex(i)
        horseID = ipyData.GetHorseID()
        lv = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Horser_LV % horseID, 0, ChConfig.Def_PDictType_Horse)
        if not lv:
            continue
        horseUpData = IpyGameDataPY.GetIpyGameData("HorseUp", horseID, lv)
        if not horseUpData:
            continue
        attrTypeList = horseUpData.GetAttrType()
        attrValueList = horseUpData.GetAttrValue()
        if attrType not in attrTypeList:
            continue
        value += attrValueList[attrTypeList.index(attrType)]
    return value
    return 0
#    value = 0
#    ipyDataMgr = IpyGameDataPY.IPY_Data()
#    for i in xrange(ipyDataMgr.GetHorseCount()):
#        ipyData = ipyDataMgr.GetHorseByIndex(i)
#        horseID = ipyData.GetHorseID()
#        lv = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_Horser_LV % horseID, 0, ChConfig.Def_PDictType_Horse)
#        if not lv:
#            continue
#
#        horseUpData = IpyGameDataPY.GetIpyGameData("HorseUp", horseID, lv)
#        if not horseUpData:
#            continue
#
#        attrTypeList = horseUpData.GetAttrType()
#        attrValueList = horseUpData.GetAttrValue()
#        if attrType not in attrTypeList:
#            continue
#
#        value += attrValueList[attrTypeList.index(attrType)]
#
#    return value
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py
@@ -1905,10 +1905,10 @@
    if not CheckLearnSkillCondition(curPlayer, upSkill):
        return False
    
    #坐骑技能学习判断
    if upSkill.GetFuncType() == ChConfig.Def_SkillFuncType_HorseSkill:
        if not PlayerHorse.CheckLearnHorseSkill(curPlayer, curSkillTypeID):
            return False
#    #坐骑技能学习判断
#    if upSkill.GetFuncType() == ChConfig.Def_SkillFuncType_HorseSkill:
#        if not PlayerHorse.CheckLearnHorseSkill(curPlayer, curSkillTypeID):
#            return False
    #天赋技学习点数判断
    if upSkill.GetFuncType() == ChConfig.Def_SkillFuncType_GiftSkill:
        if not PlayerGreatMaster.GetGreatMasterFreeSkillPoint(curPlayer):