hch
2019-07-22 5f18b0ab13594fe5a7e60af7f38c8c4443b553d7
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHorse.py
@@ -41,6 +41,7 @@
import PassiveBuffEffMng
import CrossPlayerData
import PlayerWeekParty
import PlayerPet
#---------------------------------------------------------------------
#---------------------------------------------------------------------
@@ -188,11 +189,18 @@
    # 未加载成功骑乘会导致模型加载失败报错
    if not curPlayer.GetInitOK():
        return False
    #地图不允许骑马 RideLimit_lhs_0
    if not GameWorld.GetMap().GetMapCanRide():
        PlayerControl.NotifyCode(curPlayer, "RideLimit_lhs_0")
        return False
    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
    else:
        #地图不允许骑马 RideLimit_lhs_0
        if not GameWorld.GetMap().GetMapCanRide():
            PlayerControl.NotifyCode(curPlayer, "RideLimit_lhs_0")
            return False
    
    #检查玩家状态,只有在空闲状态才能上马
    if curPlayer.GetPlayerVehicle() != IPY_GameWorld.pvNull :
@@ -366,7 +374,7 @@
        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
@@ -493,6 +501,7 @@
    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):
        #对应的任务限制未完成
@@ -520,6 +529,11 @@
                maxSpeed = max(maxSpeed, attrValueList[i])
                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, allAttrListSkin)
    
    curPlayer.SetDict(ChConfig.Def_PlayerKey_MFPEx % ShareDefine.Def_MFPType_Horse, skillFPEx+initFPAdd)
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_HorseSkill, skillAttrList)
@@ -537,6 +551,8 @@
    # 保存计算值
    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):
@@ -726,7 +742,6 @@
    #EventReport.WriteEvent_horse_class(curPlayer, horseLV, curExp, delCnt, updClassLV, updExp)
    return
## 坐骑阶级提升
#  @param curPlayer
#  @param horseID: 坐骑id
@@ -790,6 +805,7 @@
# @return None
def PlayerHorseLogin(curPlayer):
    Sync_HorseClassData(curPlayer)
    SyncHorsePetSkinData(curPlayer)
    return
@@ -995,4 +1011,184 @@
        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
#============================骑宠觉醒=============================
#// A5 29 骑宠觉醒 #tagCMHorsePetAwake
#
#struct    tagCMHorsePetAwake
#{
#    tagHead        Head;
#    WORD    Type;    // 1-坐骑 2-灵宠
#    DWORD    ID;    // 对应坐骑表灵宠表ID
#    DWORD    EatItemID;    // 吞噬的物品ID
#};
def OnHorsePetAwake(index, curPackData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    skintype = curPackData.Type
    horsePetID = curPackData.ID
    eatItemID = curPackData.EatItemID
    if not IpyGameDataPY.GetIpyGameDataByCondition('HorsePetSkin', {'Type':skintype, 'ID':horsePetID}):
        return
    if skintype == 1:
        if not IsHorseMaxLV(curPlayer, horsePetID):
            GameWorld.DebugLog('骑宠觉醒 对应骑宠未满级 horsePetID=%s'%horsePetID)
            return
    else:
        if not PlayerPet.IsPetMaxLV(curPlayer, horsePetID):
            GameWorld.DebugLog('骑宠觉醒 对应骑宠未满级 horsePetID=%s'%horsePetID)
            return
    skinData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorsePetSkinData % (skintype, horsePetID), 0)
    curSkinLV, curSkinIndex = skinData/100, skinData%100
    ipyData = IpyGameDataPY.GetIpyGameData('HorsePetSkin', skintype, horsePetID, curSkinLV)
    if not ipyData:
        return
    upNeedExp = ipyData.GetNeedExp()
    if not upNeedExp:
        GameWorld.DebugLog('骑宠觉醒 已满级')
        return
    curExp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorsePetSkinExp % (skintype, horsePetID), 0)
    curItem = GameWorld.GetGameData().GetItemByTypeID(eatItemID)
    if not curItem:
        return
    curEff = curItem.GetEffectByIndex(4)
    curEffID = curEff.GetEffectID()
    if curEffID != ChConfig.Def_Effect_HorsePetSkinExp:
        return
    addExp = curEff.GetEffectValue(0)
    if not addExp:
        return
    itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
    hasEnough, itemList = ItemCommon.GetItem_FromPack_ByID(eatItemID, itemPack, 1)
    if not hasEnough:
        GameWorld.DebugLog("OnHorsePetAwake() item(%s[%s]) isn't enough" % (eatItemID, 1))
        return
    ItemCommon.ReduceItem(curPlayer, itemPack, itemList, 1, False, ChConfig.ItemDel_HorsePetAwake)
    updExp = curExp + addExp
    updSkinLV = curSkinLV
    updSkinIndex = curSkinIndex
    if updExp >= upNeedExp:
        for _ in xrange(10):
            ipyData = IpyGameDataPY.GetIpyGameDataNotLog('HorsePetSkin', skintype, horsePetID, updSkinLV+1)
            if not ipyData:
                break
            if updExp < upNeedExp:
                break
            updExp -= upNeedExp
            updSkinLV += 1
            updSkinIndex = ipyData.GetSkinIndex()
            upNeedExp = ipyData.GetNeedExp()
    updSkinData = updSkinLV*100+updSkinIndex
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorsePetSkinData % (skintype, horsePetID), updSkinData)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorsePetSkinExp % (skintype, horsePetID), updExp)
    if curSkinIndex != updSkinIndex:
        __DoHorsePetSkinChange(curPlayer, skintype, horsePetID, updSkinIndex)
    if updSkinLV != curSkinLV:
        if skintype == 1:
            RefreshHorseAttr(curPlayer)
        else:
            PlayerPet.RefreshPetItemAddAttr(curPlayer, True)
    SyncHorsePetSkinData(curPlayer, [[skintype, horsePetID]])
    return
#// A5 30 骑宠外观选择 #tagCMHorsePetSkinSelect
#struct    tagCMHorsePetSkinSelect
#{
#    tagHead        Head;
#    WORD    Type;    // 1-坐骑 2-灵宠
#    DWORD    ID;    // 对应坐骑表灵宠表ID
#    BYTE    SkinIndex;    // 外观索引
#};
def OnHorsePetSkinSelect(index, curPackData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    skintype = curPackData.Type
    horsePetID = curPackData.ID
    skinIndex = curPackData.SkinIndex
    ipyData = IpyGameDataPY.GetIpyGameDataByCondition('HorsePetSkin', {'Type':skintype, 'ID':horsePetID, 'SkinIndex':skinIndex})
    if not ipyData:
        return
    skinData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorsePetSkinData % (skintype, horsePetID), 0)
    curSkinLV, curSkinIndex = skinData/100, skinData%100
    if skinIndex == curSkinIndex:
        return
    if curSkinLV < ipyData.GetSkinLV():
        return
    updSkinData = curSkinLV*100+skinIndex
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HorsePetSkinData % (skintype, horsePetID), updSkinData)
    __DoHorsePetSkinChange(curPlayer, skintype, horsePetID, skinIndex)
    SyncHorsePetSkinData(curPlayer, [[skintype, horsePetID]])
    return
def __DoHorsePetSkinChange(curPlayer, skinType, horsePetID, skinIndex):
    ##骑宠觉醒外观更换
    ChEquip.ChangeEquipfacadeByHorsePetSkin(curPlayer, skinType, skinIndex)
    if skinType == 1:#坐骑
        playerEquip = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
        itemRideHorse = playerEquip.GetAt(Def_HorseEquipIndex)
        #无指定道具
        if itemRideHorse.IsEmpty():
            return
        ipyData = IpyGameDataPY.GetIpyGameData("Horse", horsePetID)
        if not ipyData:
            return
        horseItemID = ipyData.GetItemID()
        if itemRideHorse.GetItemTypeID() != horseItemID:
            return
        itemRideHorse.SetUserAttr(ShareDefine.Def_IudetHorsePetSkinIndex, skinIndex)
    elif skinType == 2:#灵宠
        pass
    return
def GetHorsePetSkinIndex(curPlayer, skintype, horsePetID):
    # 获取骑宠觉醒外观索引
    skinData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorsePetSkinData % (skintype, horsePetID), 0)
    return skinData%100
def SyncHorsePetSkinData(curPlayer, skinList=None):
    if not skinList:
        skinList = []
        ipyMgr = IpyGameDataPY.IPY_Data()
        for i in xrange(ipyMgr.GetHorsePetSkinCount()):
            ipyData = ipyMgr.GetHorsePetSkinByIndex(i)
            if [ipyData.GetType(), ipyData.GetID()] not in skinList:
                skinList.append([ipyData.GetType(), ipyData.GetID()])
    packData = ChPyNetSendPack.tagMCHorsePetSkinData()
    packData.Clear()
    packData.InfoList = []
    for skintype, horsePetID in skinList:
        skinInfo = ChPyNetSendPack.tagMCHorsePetSkinInfo()
        skinInfo.Type = skintype
        skinInfo.ID = horsePetID
        curExp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorsePetSkinExp % (skintype, horsePetID), 0)
        skinData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorsePetSkinData % (skintype, horsePetID), 0)
        if not curExp and not skinData:
            continue
        curSkinLV, curSkinIndex = skinData/100, skinData%100
        skinInfo.Exp = curExp
        skinInfo.SkinLV = curSkinLV
        skinInfo.SkinIndex = curSkinIndex
        packData.InfoList.append(skinInfo)
    packData.Num = len(packData.InfoList)
    NetPackCommon.SendFakePack(curPlayer, packData)
    return