hxp
2025-08-11 4e2e843061cd07f6c3f6312e066498491d64b437
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPet.py
@@ -30,13 +30,10 @@
import ShareDefine
import SkillCommon
import PetControl
import EventShell
import GameWorld
import IpyGameDataPY
import PlayerAttrFruit
import GameMap
import OpenServerCampaign
import PlayerMagicWeapon
import PlayerWeekParty
import CalcNoLineEffect
import PassiveBuffEffMng
@@ -507,8 +504,7 @@
        return
    
    ItemCommon.ReduceItem(curPlayer, itemPack, itemList, needItemCnt, False, ChConfig.ItemDel_Pet)
    EventShell.EventRespons_OnActivatePet(curPlayer, petNPCID)
    sysMark = ipyData.GetUnlockSys() or 'GetPet'
    PlayerControl.WorldNotify(0, sysMark, [curPlayer.GetName(), petNPCID])
    rolePet = curPlayer.GetPetMgr().GetFightPet()
@@ -872,160 +868,162 @@
#  @param curPlayer 玩家
#  @return None
def CalcPetItemAddPlayerAttr(curPlayer):
    allAttrListPet = [{} for _ in range(4)]
    allAttrListPetSign = [{} for _ in range(4)] # 属性含 特殊的技能属性(因为签到技能属性成长,战力也是成长的,所以不能放技能中算战力,暂时放魂石中)
    allAttrListPetSoul = [{} for _ in range(4)]
    skillAttrList = [{} for _ in range(4)]
    allAttrListPetSkin = [{} for _ in range(4)]
    allAttrListTrain = [{} for _ in range(4)]
    allAttrListStar = [{} for _ in range(4)]
    customAttrDictPet = {}
    totalMinAtk, totalMaxAtk, qualityAttrInfo = GetPetAtkValue(curPlayer)
    customAttrDictPet["petQualityAttrInfo"] = qualityAttrInfo
    PlayerControl.CalcAttrDict_Type(ShareDefine.Def_Effect_PetMinAtk, totalMinAtk, allAttrListPet)
    PlayerControl.CalcAttrDict_Type(ShareDefine.Def_Effect_PetMaxAtk, totalMaxAtk, allAttrListPet)
    totalSignNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalSignNum) # 总签到天数
    # 果实给人物加属性, 魂石果实算附加属性层,单独计算
    fightPowerEx = PlayerAttrFruit.CalcAttrFruitAddAtrr(curPlayer, allAttrListPetSoul, ShareDefine.Def_AttrFruitFunc_Pet)
    PlayerControl.SetMFPExFightPower(curPlayer, ShareDefine.Def_MFPType_PetSoul, fightPowerEx)
    #灵兽技能给人物加的属性
    learnSkillList, passiveSkillList = GetPetLearnSkill(curPlayer)
    #GameWorld.DebugLog("1刷技能属性: %s" % allAttrList)
    for skillID in passiveSkillList:
        curSkill = GameWorld.GetGameData().GetSkillBySkillID(skillID)
        if not curSkill:
            continue
        # 灵宠签到技能特殊处理
        if curSkill.GetSkillTypeID() == ChConfig.Def_SkillID_PetSignDay:
            for effectIndex in xrange(curSkill.GetEffectCount()):
                curEffect = curSkill.GetEffect(effectIndex)
                effID = curEffect.GetEffectID()
                effValue = curEffect.GetEffectValue(0)
                PlayerControl.CalcAttrDict_Type(effID, effValue * totalSignNum, allAttrListPetSign)
            continue
        for effectIndex in xrange(curSkill.GetEffectCount()):
            curEffect = curSkill.GetEffect(effectIndex)
            if curEffect.GetEffectID() in ChConfig.Def_SkillEffs_Pet:
                # 给宠物加的不处理
                continue
            SkillShell.CalcBuffEffAttr(curPlayer, curEffect, skillAttrList)
    # 新培养属性
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    for index in xrange(ipyDataMgr.GetPetTrainCount()):
        trainIpyData = ipyDataMgr.GetPetTrainByIndex(index)
        trainType = trainIpyData.GetTrainType()
        dataTrainLV = trainIpyData.GetTrainLV()
        trainLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PetTrainLV % trainType)
        if dataTrainLV > trainLV:
            continue
        elif dataTrainLV == trainLV:
            trainItemCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PetTrainItemCount % trainType)
        else:
            trainItemCount = trainIpyData.GetEatCntTotal()
        # 等阶额外属性
        lvAttrTypeList = trainIpyData.GetLVAttrTypeList()
        lvAttrValueList = trainIpyData.GetLVAttrValueList()
        for i, attrID in enumerate(lvAttrTypeList):
            attrValue = lvAttrValueList[i]
            PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListTrain)
        # 培养丹增加属性
        eatCntEverytime = trainIpyData.GetEatCntEverytime()
        if trainItemCount and eatCntEverytime:
            eatItemAttrTypeList = trainIpyData.GetEatItemAttrTypeList()
            eatItemAttrValueList = trainIpyData.GetEatItemAttrValueList()
            attrMultiple = trainItemCount / eatCntEverytime
            for i, attrID in enumerate(eatItemAttrTypeList):
                attrValue = eatItemAttrValueList[i]
                PlayerControl.CalcAttrDict_Type(attrID, attrValue * attrMultiple, allAttrListTrain)
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PetTarin, allAttrListTrain)
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Pet, allAttrListPet, customAttrDict=customAttrDictPet)
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PetSoul, allAttrListPetSoul)
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PetSign, allAttrListPetSign)
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PetSkill, skillAttrList)
    #初始战力
    fpExTotal = 0
    petPackIndex = ShareDefine.rptPet
    petPack = curPlayer.GetItemManager().GetPack(petPackIndex)
    for i in range(petPack.GetCount()):
        petItem = petPack.GetAt(i)
        if petItem.IsEmpty():
            continue
        # 物品上的技能战力,主人上的另算
        for i in range(petItem.GetUserAttrCount(ShareDefine.Def_IudetPet_Skill)):
            skillID = petItem.GetUserAttrByIndex(ShareDefine.Def_IudetPet_Skill, i)
            curSkilData = GameWorld.GetGameData().GetSkillBySkillID(skillID)
            if not curSkilData:
                continue
            fpExTotal += curSkilData.GetFightPower()
        petItemNPCID = petItem.GetUserAttr(ShareDefine.Def_IudetPet_NPCID)
        petIpyData = GetPetIpydata(petItemNPCID)
        if not petIpyData:
            continue
        fpExTotal += petIpyData.GetInitFightPower() # 初始战力
        #觉醒战力
        skinData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorsePetSkinData % (2, petItemNPCID), 0)
        skinIpyData = IpyGameDataPY.GetIpyGameDataNotLog('HorsePetSkin', 2, petItemNPCID, skinData/100)
        if skinIpyData:
            for attrID, attrValue in skinIpyData.GetAttrInfo().items():
                PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListPetSkin)
        #星级
        curStar = petItem.GetUserAttr(ShareDefine.Def_IudetPet_Star)
        starIpyData = IpyGameDataPY.GetIpyGameDataNotLog("PetStarUp", petItemNPCID, curStar)
        if starIpyData:
            starAttrType = starIpyData.GetStarAttrType()
            starAttrValue = starIpyData.GetStarAttrValue()
            for i, attrID in enumerate(starAttrType):
                attrValue = starAttrValue[i]
                PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListStar)
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PetSkin, allAttrListPetSkin)
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PetStar, allAttrListStar)
    PlayerControl.SetMFPExFightPower(curPlayer, ShareDefine.Def_MFPType_Pet, fpExTotal)
#    GameWorld.DebugLog("宠物榜NPCID: %s, petDict=%s" % (billPetNPCID, str(billPetDict)))
    return
#    allAttrListPet = [{} for _ in range(4)]
#    allAttrListPetSign = [{} for _ in range(4)] # 属性含 特殊的技能属性(因为签到技能属性成长,战力也是成长的,所以不能放技能中算战力,暂时放魂石中)
#    allAttrListPetSoul = [{} for _ in range(4)]
#    skillAttrList = [{} for _ in range(4)]
#    allAttrListPetSkin = [{} for _ in range(4)]
#    allAttrListTrain = [{} for _ in range(4)]
#    allAttrListStar = [{} for _ in range(4)]
#    customAttrDictPet = {}
#    totalMinAtk, totalMaxAtk, qualityAttrInfo = GetPetAtkValue(curPlayer)
#    customAttrDictPet["petQualityAttrInfo"] = qualityAttrInfo
#    PlayerControl.CalcAttrDict_Type(ShareDefine.Def_Effect_PetMinAtk, totalMinAtk, allAttrListPet)
#    PlayerControl.CalcAttrDict_Type(ShareDefine.Def_Effect_PetMaxAtk, totalMaxAtk, allAttrListPet)
#    totalSignNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalSignNum) # 总签到天数
#    # 果实给人物加属性, 魂石果实算附加属性层,单独计算
#    fightPowerEx = PlayerAttrFruit.CalcAttrFruitAddAtrr(curPlayer, allAttrListPetSoul, ShareDefine.Def_AttrFruitFunc_Pet)
#    PlayerControl.SetMFPExFightPower(curPlayer, ShareDefine.Def_MFPType_PetSoul, fightPowerEx)
#
#    #灵兽技能给人物加的属性
#    learnSkillList, passiveSkillList = GetPetLearnSkill(curPlayer)
#    #GameWorld.DebugLog("1刷技能属性: %s" % allAttrList)
#    for skillID in passiveSkillList:
#        curSkill = GameWorld.GetGameData().GetSkillBySkillID(skillID)
#        if not curSkill:
#            continue
#        # 灵宠签到技能特殊处理
#        if curSkill.GetSkillTypeID() == ChConfig.Def_SkillID_PetSignDay:
#            for effectIndex in xrange(curSkill.GetEffectCount()):
#                curEffect = curSkill.GetEffect(effectIndex)
#                effID = curEffect.GetEffectID()
#                effValue = curEffect.GetEffectValue(0)
#                PlayerControl.CalcAttrDict_Type(effID, effValue * totalSignNum, allAttrListPetSign)
#
#            continue
#        for effectIndex in xrange(curSkill.GetEffectCount()):
#            curEffect = curSkill.GetEffect(effectIndex)
#            if curEffect.GetEffectID() in ChConfig.Def_SkillEffs_Pet:
#                # 给宠物加的不处理
#                continue
#            SkillShell.CalcBuffEffAttr(curPlayer, curEffect, skillAttrList)
#
#    # 新培养属性
#    ipyDataMgr = IpyGameDataPY.IPY_Data()
#    for index in xrange(ipyDataMgr.GetPetTrainCount()):
#        trainIpyData = ipyDataMgr.GetPetTrainByIndex(index)
#        trainType = trainIpyData.GetTrainType()
#        dataTrainLV = trainIpyData.GetTrainLV()
#        trainLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PetTrainLV % trainType)
#
#        if dataTrainLV > trainLV:
#            continue
#        elif dataTrainLV == trainLV:
#            trainItemCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PetTrainItemCount % trainType)
#        else:
#            trainItemCount = trainIpyData.GetEatCntTotal()
#
#        # 等阶额外属性
#        lvAttrTypeList = trainIpyData.GetLVAttrTypeList()
#        lvAttrValueList = trainIpyData.GetLVAttrValueList()
#        for i, attrID in enumerate(lvAttrTypeList):
#            attrValue = lvAttrValueList[i]
#            PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListTrain)
#
#        # 培养丹增加属性
#        eatCntEverytime = trainIpyData.GetEatCntEverytime()
#        if trainItemCount and eatCntEverytime:
#            eatItemAttrTypeList = trainIpyData.GetEatItemAttrTypeList()
#            eatItemAttrValueList = trainIpyData.GetEatItemAttrValueList()
#            attrMultiple = trainItemCount / eatCntEverytime
#            for i, attrID in enumerate(eatItemAttrTypeList):
#                attrValue = eatItemAttrValueList[i]
#                PlayerControl.CalcAttrDict_Type(attrID, attrValue * attrMultiple, allAttrListTrain)
#
#    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PetTarin, allAttrListTrain)
#
#    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Pet, allAttrListPet, customAttrDict=customAttrDictPet)
#    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PetSoul, allAttrListPetSoul)
#    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PetSign, allAttrListPetSign)
#
#    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PetSkill, skillAttrList)
#
#    #初始战力
#    fpExTotal = 0
#    petPackIndex = ShareDefine.rptPet
#    petPack = curPlayer.GetItemManager().GetPack(petPackIndex)
#    for i in range(petPack.GetCount()):
#        petItem = petPack.GetAt(i)
#        if petItem.IsEmpty():
#            continue
#        # 物品上的技能战力,主人上的另算
#        for i in range(petItem.GetUserAttrCount(ShareDefine.Def_IudetPet_Skill)):
#            skillID = petItem.GetUserAttrByIndex(ShareDefine.Def_IudetPet_Skill, i)
#            curSkilData = GameWorld.GetGameData().GetSkillBySkillID(skillID)
#            if not curSkilData:
#                continue
#            fpExTotal += curSkilData.GetFightPower()
#        petItemNPCID = petItem.GetUserAttr(ShareDefine.Def_IudetPet_NPCID)
#        petIpyData = GetPetIpydata(petItemNPCID)
#        if not petIpyData:
#            continue
#        fpExTotal += petIpyData.GetInitFightPower() # 初始战力
#        #觉醒战力
#        skinData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HorsePetSkinData % (2, petItemNPCID), 0)
#        skinIpyData = IpyGameDataPY.GetIpyGameDataNotLog('HorsePetSkin', 2, petItemNPCID, skinData/100)
#        if skinIpyData:
#            for attrID, attrValue in skinIpyData.GetAttrInfo().items():
#                PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListPetSkin)
#
#        #星级
#        curStar = petItem.GetUserAttr(ShareDefine.Def_IudetPet_Star)
#        starIpyData = IpyGameDataPY.GetIpyGameDataNotLog("PetStarUp", petItemNPCID, curStar)
#        if starIpyData:
#            starAttrType = starIpyData.GetStarAttrType()
#            starAttrValue = starIpyData.GetStarAttrValue()
#            for i, attrID in enumerate(starAttrType):
#                attrValue = starAttrValue[i]
#                PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrListStar)
#
#    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PetSkin, allAttrListPetSkin)
#    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PetStar, allAttrListStar)
#    PlayerControl.SetMFPExFightPower(curPlayer, ShareDefine.Def_MFPType_Pet, fpExTotal)
##    GameWorld.DebugLog("宠物榜NPCID: %s, petDict=%s" % (billPetNPCID, str(billPetDict)))
#    return
## 获取灵兽出战时的攻击力
def GetPetAtkValue(curPlayer):
    qualityAttrInfo = {}
    if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Pet):
        #GameWorld.DebugLog(' 宠物功能未开启')
        return 0, 0, qualityAttrInfo
    classAddAtk = 0
    petPackIndex = ShareDefine.rptPet
    petPack = curPlayer.GetItemManager().GetPack(petPackIndex)
    for i in range(petPack.GetCount()):
        packItem = petPack.GetAt(i)
        if packItem.IsEmpty():
            continue
        petItemNPCID = packItem.GetUserAttr(ShareDefine.Def_IudetPet_NPCID)
        classlv = packItem.GetUserAttr(ShareDefine.Def_IudetPet_ClassLV)
        classIpyData = IpyGameDataPY.GetIpyGameData("PetClassCost", petItemNPCID, classlv + 1)
        atkAdd = classIpyData.GetAtkAdd() if classIpyData else 0
        classAddAtk += atkAdd
        petIpyData = GetPetIpydata(petItemNPCID)
        if petIpyData:
            quality = petIpyData.GetQuality()
            if quality not in qualityAttrInfo:
                qualityAttrInfo[quality] = {}
            qualityAttrDict = qualityAttrInfo[quality]
            qualityAttrDict[ShareDefine.Def_Effect_PetAtk] = qualityAttrDict.get(ShareDefine.Def_Effect_PetAtk, 0) + atkAdd
    totalMinAtk = classAddAtk
    totalMaxAtk = classAddAtk
    return totalMinAtk, totalMaxAtk, qualityAttrInfo
    return 0, 0, qualityAttrInfo
#    if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Pet):
#        #GameWorld.DebugLog(' 宠物功能未开启')
#        return 0, 0, qualityAttrInfo
#
#    classAddAtk = 0
#    petPackIndex = ShareDefine.rptPet
#    petPack = curPlayer.GetItemManager().GetPack(petPackIndex)
#    for i in range(petPack.GetCount()):
#        packItem = petPack.GetAt(i)
#        if packItem.IsEmpty():
#            continue
#        petItemNPCID = packItem.GetUserAttr(ShareDefine.Def_IudetPet_NPCID)
#        classlv = packItem.GetUserAttr(ShareDefine.Def_IudetPet_ClassLV)
#        classIpyData = IpyGameDataPY.GetIpyGameData("PetClassCost", petItemNPCID, classlv + 1)
#        atkAdd = classIpyData.GetAtkAdd() if classIpyData else 0
#        classAddAtk += atkAdd
#
#        petIpyData = GetPetIpydata(petItemNPCID)
#        if petIpyData:
#            quality = petIpyData.GetQuality()
#            if quality not in qualityAttrInfo:
#                qualityAttrInfo[quality] = {}
#            qualityAttrDict = qualityAttrInfo[quality]
#            qualityAttrDict[ShareDefine.Def_Effect_PetAtk] = qualityAttrDict.get(ShareDefine.Def_Effect_PetAtk, 0) + atkAdd
#
#    totalMinAtk = classAddAtk
#    totalMaxAtk = classAddAtk
#    return totalMinAtk, totalMaxAtk, qualityAttrInfo
def OnPlayerPetLogin(curPlayer):
    ## 登录处理