| | |
| | | import IpyGameDataPY
|
| | | import PlayerAttrFruit
|
| | | import GameMap
|
| | | import OpenServerCampaign
|
| | | import PlayerMagicWeapon
|
| | | import PassiveBuffEffMng
|
| | | import PlayerWeekParty
|
| | | import CalcNoLineEffect
|
| | | import CrossPlayerData
|
| | | import CalcLineEffect
|
| | | import PlayerActivity
|
| | | import PlayerHorse
|
| | |
|
| | | import random
|
| | | import math
|
| | |
| | | if not newPetItem:
|
| | | return
|
| | |
|
| | | newPetItem.SetIsBind(True)
|
| | | newPetItem.SetUserAttr(ShareDefine.Def_IudetPet_NPCID, petNPCID)
|
| | | newPetItem.SetUserAttr(ShareDefine.Def_IudetPet_State, ShareDefine.Def_PetState_Null)
|
| | |
|
| | |
| | |
|
| | | # 当前状态处理
|
| | | if curState == ShareDefine.Def_PetState_Fight:
|
| | | curPet = curPlayer.GetPetMgr().GetFightPet()
|
| | | if curPet:
|
| | | #已是出战状态, C++召唤坐标和人重叠
|
| | | resultPos = GameMap.GetEmptyPlaceInArea(curPlayer.GetPosX(), curPlayer.GetPosY(), ChConfig.Def_SummonAppearDist)
|
| | | curPet.ResetPos(resultPos.GetPosX(), resultPos.GetPosY())
|
| | | PassiveBuffEffMng.GetPassiveEffManager().RegistPassiveEff(curPet)
|
| | | PassiveBuffEffMng.GetPassiveEffManager().RegistPassiveBuff(curPet)
|
| | | return
|
| | | #PetControl.ReCallFightPet(curPlayer)
|
| | | # curPet = curPlayer.GetPetMgr().GetFightPet()
|
| | | # if curPet:
|
| | | # #已是出战状态, C++召唤坐标和人重叠
|
| | | # resultPos = GameMap.GetEmptyPlaceInArea(curPlayer.GetPosX(), curPlayer.GetPosY(), ChConfig.Def_SummonAppearDist)
|
| | | # curPet.ResetPos(resultPos.GetPosX(), resultPos.GetPosY())
|
| | | # PassiveBuffEffMng.GetPassiveEffManager().RegistPassiveEff(curPet)
|
| | | # PassiveBuffEffMng.GetPassiveEffManager().RegistPassiveBuff(curPet)
|
| | | # return
|
| | | #18/10/15 因为某种未知原因宠物物品的状态是出战(实际场景中未出战),导致该宠物无法出战,故再次发包出战时,此处不拦!
|
| | | PetControl.ReCallFightPet(curPlayer)
|
| | |
|
| | | else:
|
| | | pass
|
| | |
| | | # petItem.SetUserAttr(ShareDefine.Def_IudetPet_State, tagState)
|
| | | # GameWorld.DebugLog("切换宠物状态异常防范! curState=%s,tagState=%s" % (curState, tagState))
|
| | |
|
| | | if not GameWorld.IsCrossServer():
|
| | | dataList = [petNPCID, curClasslv, tagState]
|
| | | CrossPlayerData.SendDataToCrossServer(curPlayer, CrossPlayerData.CrossData_PetState, dataList)
|
| | | |
| | | return
|
| | |
|
| | | def CrossServer_DoChangePetState(curPlayer, dataList):
|
| | | ## 跨服处理 宠物战斗状态变更
|
| | | petNPCID, curClasslv, tagState = dataList
|
| | | petItem = GetPetDataItemByNPCID(curPlayer, petNPCID)
|
| | | if not petItem:
|
| | | newPetItem = GetNewPetDataItem(curPlayer, petNPCID)
|
| | | if not newPetItem:
|
| | | return
|
| | | if not ItemControler.PlayerItemControler(curPlayer).PutInItem(ShareDefine.rptPet, newPetItem):
|
| | | return
|
| | | petItem = GetPetDataItemByNPCID(curPlayer, petNPCID)
|
| | | if not petItem:
|
| | | return
|
| | | |
| | | curItemClasslv = petItem.GetUserAttr(ShareDefine.Def_IudetPet_ClassLV)
|
| | | # 处理技能问题,暂不处理
|
| | | if curClasslv > curItemClasslv:
|
| | | pass
|
| | | |
| | | curState = petItem.GetUserAttr(ShareDefine.Def_IudetPet_State) # 当前状态
|
| | | if curState == ShareDefine.Def_PetState_Fight:
|
| | | PetControl.ReCallFightPet(curPlayer)
|
| | | |
| | | if tagState == ShareDefine.Def_PetState_Fight:
|
| | | __DoPetGoOutToFight(curPlayer, petItem)
|
| | | |
| | | return
|
| | |
|
| | |
|
| | | ## 执行宠物出战逻辑
|
| | |
| | | petID = petStruct.PetID
|
| | | petStruct.BindType = petItem.GetIsBind()
|
| | | petStruct.Name = str(petStruct.PetID)#petNpcData.GetName() 配表不是UTF8会导致报错,默认用ID当名字
|
| | | petStruct.DailyTrainCnt = PlayerHorse.GetHorsePetSkinIndex(curPlayer, 2, npcID)
|
| | | # 宠物lv 改为 阶级 用于客户端显示名字颜色用
|
| | | # classLV = petItem.GetUserAttr(ShareDefine.Def_IudetPet_ClassLV)
|
| | | # rolePet.SetLV(classLV)
|
| | |
| | | PetControl.SetPetHP(rolePet, rolePet.GetMaxHP(), False)
|
| | |
|
| | | #---通知客户端---
|
| | | rolePet.Sync_PetInfo()
|
| | | #rolePet.Sync_PetInfo()
|
| | | #刷新技能栏
|
| | | rolePet.Sync_SkillList()
|
| | | #rolePet.Sync_SkillList()
|
| | |
|
| | | #---收到"宠物出战"请求---
|
| | | #检查是否可出战
|
| | |
| | |
|
| | | #记录出战的宠物索引 默认+1 0则代表没有
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FightPetIndex, petItemIndex + 1)
|
| | | rolePet.SetSightLevel(curPlayer.GetSightLevel())
|
| | | return True
|
| | |
|
| | | def AutoSummonPet(curPlayer):
|
| | |
| | | if not ItemControler.PlayerItemControler(curPlayer).PutInItem(petPackIndex, newPetItem):
|
| | | return
|
| | |
|
| | | PlayerMagicWeapon.SetMWPrivilegeData(curPlayer, ChConfig.MWPrivilege_Pet, len(GetActivePetID(curPlayer)))
|
| | | ItemCommon.ReduceItem(curPlayer, itemPack, itemList, needItemCnt, False, ChConfig.ItemDel_Pet)
|
| | |
|
| | | EventShell.EventRespons_OnActivatePet(curPlayer, petNPCID)
|
| | |
| | | PetControl.DoLogic_PlayerPetLearnSkillList(rolePet, learnSkillList)
|
| | | RefreshPetItemAddAttr(curPlayer, True)
|
| | | SetPetSkillFightPower(curPlayer) # 技能战力重算
|
| | | |
| | | # 开服活动数据
|
| | | OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_PetLV, GetTotalPetLV(curPlayer))
|
| | | PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_Pet, petNPCID, False)
|
| | | return True
|
| | |
|
| | |
|
| | |
| | |
|
| | | if not ItemControler.PlayerItemControler(curPlayer).PutInItem(petPackIndex, newPetItem):
|
| | | return
|
| | | PlayerMagicWeapon.SetMWPrivilegeData(curPlayer, ChConfig.MWPrivilege_Pet, len(GetActivePetID(curPlayer)))
|
| | | SetPetSkillFightPower(curPlayer) # 技能战力重算
|
| | | petItemIndex = GetPetDataItemIndexByNPCID(curPlayer, petNPCID)
|
| | | DoChangePetState(curPlayer, petItemIndex, ShareDefine.Def_PetState_Fight)
|
| | |
| | | #广播
|
| | | sysMark = sysMarkList[i] if i < len(sysMarkList) else 'PetUpLv'
|
| | | PlayerControl.WorldNotify(0, sysMark, [playerName, petNPCID, limitPetClassLV, skillid])
|
| | |
|
| | | #增加升级活跃点效果
|
| | | PlayerActivity.AddActivityByLVOnLearnSkill(curPlayer, skillid)
|
| | | |
| | | if not learnSkillList and updClassLV + 1 == maxClassLV:
|
| | | PlayerControl.WorldNotify(0, 'PetUpLvMax', [playerName, petNPCID])
|
| | | # 如果是当前出战的宠物, 则该宠物学习技能
|
| | |
| | |
|
| | | SetPetSkillFightPower(curPlayer) # 技能战力重算
|
| | | RefreshPetItemAddAttr(curPlayer, True)
|
| | |
|
| | | |
| | | # 开服活动数据
|
| | | OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_PetLV, GetTotalPetLV(curPlayer))
|
| | | |
| | | PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_PetClassLV, 1, [petNPCID, updClassLV + 1])
|
| | | extraInfoDict = {"petItemIndex":PetItemIndex, "petNPCID":petNPCID}
|
| | | extraInfoDict.update(eval(petDataItem.GetUserData()))
|
| | | DataRecordPack.DR_ClassUpSystem(curPlayer, "PetClassUp", updClassLV, extraInfoDict)
|
| | |
|
| | | #EventReport.WriteEvent_pet_class(curPlayer, petNpcData.GetName(), classLV, petClassExp, updClassLV, newClassExp)
|
| | | |
| | | return
|
| | |
|
| | | def GetTotalPetLV(curPlayer):
|
| | | totalPetLV = 0
|
| | | petPackIndex = ShareDefine.rptPet
|
| | | petPack = curPlayer.GetItemManager().GetPack(petPackIndex)
|
| | | for i in range(petPack.GetCount()):
|
| | | petItem = petPack.GetAt(i)
|
| | | if petItem.IsEmpty():
|
| | | continue |
| | | petItemNPCID = petItem.GetUserAttr(ShareDefine.Def_IudetPet_NPCID)
|
| | | classLV = petItem.GetUserAttr(ShareDefine.Def_IudetPet_ClassLV) + 1
|
| | | petIpyData = GetPetIpydata(petItemNPCID)
|
| | | if not petIpyData:
|
| | | continue
|
| | | totalPetLV += classLV
|
| | | return totalPetLV
|
| | |
|
| | | def IsPetMaxLV(curPlayer, petNPCID):
|
| | | petItem = GetPetDataItemByNPCID(curPlayer, petNPCID)
|
| | | if not petItem:
|
| | | return
|
| | | petNPCID = petItem.GetUserAttr(ShareDefine.Def_IudetPet_NPCID)
|
| | | classLV = petItem.GetUserAttr(ShareDefine.Def_IudetPet_ClassLV)
|
| | | petIpyData = GetPetIpydata(petNPCID)
|
| | | if not petIpyData:
|
| | | return
|
| | | maxClassLV = petIpyData.GetMaxRank()
|
| | | return classLV + 2 > maxClassLV
|
| | |
|
| | | ## 刷新宠物数据物品增加的属性
|
| | | def RefreshPetItemAddAttr(curPlayer, isUpdBillboard):
|
| | |
| | | allAttrListPetSign = [{} for _ in range(4)] # 属性含 特殊的技能属性(因为签到技能属性成长,战力也是成长的,所以不能放技能中算战力,暂时放魂石中)
|
| | | allAttrListPetSoul = [{} for _ in range(4)]
|
| | | skillAttrList = [{} for _ in range(4)]
|
| | | |
| | | allAttrListPetSkin = [{} for _ in range(4)]
|
| | | totalMinAtk, totalMaxAtk = GetPetAtkValue(curPlayer)
|
| | | 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) # 总签到天数
|
| | | # 果实给人物加属性, 魂石果实算附加属性层,单独计算
|
| | | PlayerAttrFruit.CalcAttrFruitAddAtrr(curPlayer, allAttrListPetSoul, ShareDefine.Def_AttrFruitFunc_Pet)
|
| | | fightPowerEx = PlayerAttrFruit.CalcAttrFruitAddAtrr(curPlayer, allAttrListPetSoul, ShareDefine.Def_AttrFruitFunc_Pet)
|
| | | curPlayer.SetDict(ChConfig.Def_PlayerKey_MFPEx % ShareDefine.Def_MFPType_PetSoul, fightPowerEx)
|
| | |
|
| | | #灵兽技能给人物加的属性
|
| | | learnSkillList, passiveSkillList = GetPetLearnSkill(curPlayer)
|
| | |
| | | continue
|
| | | SkillShell.CalcBuffEffAttr(curPlayer, curEffect, skillAttrList)
|
| | |
|
| | | |
| | | PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_Pet, allAttrListPet)
|
| | | PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PetSoul, allAttrListPetSoul)
|
| | | PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PetSign, allAttrListPetSign)
|
| | |
| | | if not petIpyData:
|
| | | continue
|
| | | initFPAdd += 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)
|
| | | PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PetSkin, allAttrListPetSkin)
|
| | | curPlayer.SetDict(ChConfig.Def_PlayerKey_MFPEx % ShareDefine.Def_MFPType_Pet, initFPAdd)
|
| | | # GameWorld.DebugLog("宠物榜NPCID: %s, petDict=%s" % (billPetNPCID, str(billPetDict)))
|
| | | return
|