| | |
| | | import PlayerControl
|
| | | import NetPackCommon
|
| | | import ChPyNetSendPack
|
| | | import PlayerVip
|
| | | import AttackCommon
|
| | | import PyGameData
|
| | | import PlayerHorse
|
| | | import BaseAttack
|
| | | import NPCCommon
|
| | | import PetControl
|
| | | import ItemCommon
|
| | | import FBCommon
|
| | |
|
| | |
| | | def OnLoginGFPassive(curPlayer):
|
| | | #改为都生效,不需要设置
|
| | | return
|
| | | # # ---通知每页数据---
|
| | | # holeCnt = IpyGameDataPY.GetFuncCfg('PassSkillEquipLimit', 2)
|
| | | # pageCnt = IpyGameDataPY.GetFuncCfg('PassSkillEquipLimit', 3)
|
| | | # |
| | | # sendPack = ChPyNetSendPack.tagMCPassiveSet()
|
| | | # sendPack.PageCnt = pageCnt
|
| | | # sendPack.PassiveSkills = []
|
| | | # |
| | | # |
| | | # #tmpDict = IpyGameDataPY.GetFuncEvalCfg('PassSkillEquipLimit', 1)
|
| | | # |
| | | # # 剩余VIP时间
|
| | | # #haveVipTime = PlayerVip.GetCurVIPTime(curPlayer)
|
| | | # |
| | | # for i in xrange(pageCnt):
|
| | | # skills = ChPyNetSendPack.tagMCPassiveSkills()
|
| | | # skills.Count = holeCnt
|
| | | # skills.SkillIDList = []
|
| | | # for j in xrange(holeCnt):
|
| | | #
|
| | | # #===================================================================
|
| | | # # # 判断VIP过期的情况
|
| | | # # for key, value in tmpDict.get(j, {}).items():
|
| | | # # if key == "vipLv":
|
| | | # # if curPlayer.GetVIPLv() < value or haveVipTime <=0:
|
| | | # # PlayerControl.NomalDictSetProperty(curPlayer, |
| | | # # ChConfig.Def_PDict_GFPassiveIndex%(i, j), |
| | | # # 0,
|
| | | # # ChConfig.Def_PDictType_GFPassive)
|
| | | # #===================================================================
|
| | | # |
| | | # skillID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GFPassiveIndex%(i, j), 0,
|
| | | # ChConfig.Def_PDictType_GFPassive)
|
| | | # skills.SkillIDList.append(skillID)
|
| | | # |
| | | # sendPack.PassiveSkills.append(skills)
|
| | | # |
| | | # NetPackCommon.SendFakePack(curPlayer, sendPack)
|
| | | # |
| | | # # ---通知激活页---
|
| | | # page = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GFPassivePage, 0, ChConfig.Def_PDictType_GFPassive)
|
| | | # sendPack = ChPyNetSendPack.tagMCPassivePage()
|
| | | # sendPack.Page = page
|
| | | # NetPackCommon.SendFakePack(curPlayer, sendPack)
|
| | | # return
|
| | |
|
| | | # 切换地图
|
| | | def OnLoadMapGFPassive(curPlayer):
|
| | | # 被动技能
|
| | | GetPassiveEffManager().RegistPassiveEff(curPlayer)
|
| | |
|
| | | #tmpDict = IpyGameDataPY.GetFuncEvalCfg('PassSkillEquipLimit', 1)
|
| | | #holeCnt = IpyGameDataPY.GetFuncCfg('PassSkillEquipLimit', 2)
|
| | | |
| | | # 剩余VIP时间
|
| | | #haveVipTime = PlayerVip.GetCurVIPTime(curPlayer)
|
| | | |
| | | #当前使用页
|
| | | #page = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GFPassivePage, 0, ChConfig.Def_PDictType_GFPassive)
|
| | |
|
| | | #===============================================================================
|
| | | # for j in xrange(holeCnt):
|
| | | # |
| | | # # 判断VIP过期的情况
|
| | | # for key, value in tmpDict.get(j, {}).items():
|
| | | # if key != "vipLv":
|
| | | # continue
|
| | | # if curPlayer.GetVIPLv() < value or haveVipTime <= 0:
|
| | | # PlayerControl.NomalDictSetProperty(curPlayer, |
| | | # ChConfig.Def_PDict_GFPassiveIndex%(page, j), |
| | | # 0,
|
| | | # ChConfig.Def_PDictType_GFPassive)
|
| | | #===============================================================================
|
| | | |
| | | # 魔族法宝-被动技能页
|
| | | GetPassiveEffManager().RegistPassiveEffSet(curPlayer)
|
| | |
|
| | | GetPassiveEffManager().RegistPassiveBuff(curPlayer)
|
| | |
|
| | | # 助战神兽技能
|
| | | GetPassiveEffManager().RegistPassiveEffDogz(curPlayer)
|
| | |
|
| | | GetPassiveEffManager().RegistSuperEquipSkillDict(curPlayer)
|
| | |
|
| | |
| | | 4083:ChConfig.TriggerType_AddThumpHitPer, # 增加重击伤害百分比
|
| | | 4084:ChConfig.TriggerType_ThumpHit, # 对第一目标重击触发技能
|
| | | 4085:ChConfig.TriggerType_SkillSuccess, # 任何技能释放成功都可触发 76 加印记
|
| | | 4086:ChConfig.TriggerType_AttackAddSkillPerYinji, # 所有攻击伤害(SkillPer)增加,含普攻,计算时 为了飘字使用
|
| | | 4087:ChConfig.TriggerType_AttackAddSkillPerYinji, # 所有攻击伤害(SkillPer)增加,含普攻,计算时 为了飘字使用
|
| | | 4088:ChConfig.TriggerType_AttackAddSkillPerYinji, # 所有攻击伤害(SkillPer)增加,含普攻,计算时 为了飘字使用
|
| | | 4089:ChConfig.TriggerType_AttackAddSkillPerYinji, # 所有攻击伤害(SkillPer)增加,含普攻,计算时 为了飘字使用
|
| | | 4090:ChConfig.TriggerType_AttackOver, # 攻击(对敌技能)后被动技能被触发 4
|
| | | 4091:ChConfig.TriggerType_SkillOverNoAttack, # 技能释放后 与TriggerType_AttackOver相反19,
|
| | | 4092:ChConfig.TriggerType_SkillSuccessExpend, # 任何技能释放成功都可触发 76 减印记
|
| | |
| | | # 获得被动触发的 buff
|
| | | def GetBuffsByTriggerType(self, triggerType, useSkillID=0):
|
| | | return self.AffectBuffDict.get((triggerType, 0), {})
|
| | | |
| | | |
| | | # 重刷神兽助战技能
|
| | | def RefreshDogzBattleSkill(self):
|
| | | self.AffectDogzSkillDict = {}
|
| | | skills = FindDogzBattleSkills(self.gameObj)
|
| | | |
| | | for curSkill in skills:
|
| | | if not SkillCommon.isPassiveTriggerSkill(curSkill):
|
| | | continue
|
| | | |
| | | skillTypeID = curSkill.GetSkillTypeID()
|
| | | |
| | | connSkillID = SkillShell.GetConnectSkillID(curSkill) # 关联技能ID, 0代表不限技能
|
| | | for i in xrange(curSkill.GetEffectCount()):
|
| | | curEffect = curSkill.GetEffect(i)
|
| | | effectID = curEffect.GetEffectID()
|
| | | if effectID == 0:
|
| | | continue
|
| | | |
| | | triggerType = GetTriggerTypeByEffectID(effectID)
|
| | | if triggerType == -1:
|
| | | continue
|
| | | |
| | | key = (triggerType,connSkillID)
|
| | | if key not in self.AffectDogzSkillDict:
|
| | | self.AffectDogzSkillDict[key] = []
|
| | | |
| | | self.AffectDogzSkillDict[key].append((skillTypeID, effectID))
|
| | | |
| | | return self.AffectDogzSkillDict
|
| | | |
| | |
|
| | | # 重刷特殊装备技能
|
| | | def RefreshSuperEquipSkillDict(self):
|
| | |
| | | else:
|
| | | passiveEff.RefreshPassiveSkillSet(isCD)
|
| | | return
|
| | | |
| | | |
| | | # 人物需同步注册神兽技能
|
| | | def RegistPassiveEffDogz(self, gameObj):
|
| | | passiveEff = self.GetPassiveEff(gameObj)
|
| | | if not passiveEff:
|
| | | # 强制刷新所有被动技能
|
| | | passiveEff = PassiveEff(gameObj)
|
| | | if not passiveEff.RefreshDogzBattleSkill():
|
| | | return
|
| | | self.AddPassiveEff(gameObj, passiveEff)
|
| | | else:
|
| | | passiveEff.RefreshDogzBattleSkill()
|
| | | return
|
| | | |
| | | |
| | | |
| | | |
| | | # 人物需同步注册装备技能,技能目前为可触发的被动类,若有定义冲突则可用功能类型划分
|
| | | def RegistSuperEquipSkillDict(self, gameObj):
|
| | | passiveEff = self.GetPassiveEff(gameObj)
|
| | |
| | | # buff # 筛选buffType 否则NPC没有此接口会报错
|
| | | for buffType in [IPY_GameWorld.bfBuff, IPY_GameWorld.bfDeBuff, IPY_GameWorld.bfProcessBuff
|
| | | , IPY_GameWorld.btPassiveBuf, IPY_GameWorld.bfActionBuff, IPY_GameWorld.bfProcessDeBuff]:
|
| | | |
| | | if buffType == IPY_GameWorld.btPassiveBuf and gameObj.GetGameObjType() == IPY_GameWorld.gotNPC:
|
| | | # NPC只有宠物有被动BUFF
|
| | | if not PetControl.IsPet(gameObj):
|
| | | continue
|
| | |
|
| | | buffTuple = SkillCommon.GetBuffManagerByBuffType(gameObj, buffType)
|
| | | #通过类型获取目标的buff管理器为空,则跳出
|
| | |
| | | curValue += callFunc(attacker, defender, passiveEffect)
|
| | |
|
| | | return curValue
|
| | |
|
| | |
|
| | | # 因为要兼容低等级技能,所以技能只能是在助战的时候,先删除神兽技能再学习新的助战神兽技能
|
| | | def PlayerDogzSkill(curPlayer):
|
| | |
|
| | | dogzSkills = [] # 需要学习的技能
|
| | | ipyDataMgr = IpyGameDataPY.IPY_Data()
|
| | | for i in xrange(ipyDataMgr.GetDogzCount()):
|
| | | ipyData = ipyDataMgr.GetDogzByIndex(i)
|
| | | if not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_DogzFightState, i):
|
| | | continue
|
| | | |
| | | dogzSkills.extend(ipyData.GetHelpBattleSkills())
|
| | | |
| | | delDogzSkills = [] # 删除不在助战神兽队列的技能
|
| | | skillManager = curPlayer.GetSkillManager()
|
| | | for i in xrange(skillManager.GetSkillCount()):
|
| | | curSkill = skillManager.GetSkillByIndex(i)
|
| | | if curSkill.GetFuncType() != ChConfig.Def_SkillFuncType_Dogz:
|
| | | continue
|
| | | skillID = curSkill.GetSkillID()
|
| | | |
| | | delDogzSkills.append(skillID)
|
| | | |
| | | GameWorld.DebugLog("PlayerDogzSkill:%s - 删除%s"%(dogzSkills, delDogzSkills))
|
| | | |
| | | # 删除神兽技能
|
| | | for skillID in delDogzSkills:
|
| | | skillManager.DeleteSkillBySkillID(skillID, False)
|
| | | |
| | | # 添加助战技能,同类技能取最高
|
| | | dogzSkills.sort()
|
| | | for skillID in dogzSkills:
|
| | | skillData = GameWorld.GetGameData().GetSkillBySkillID(skillID)
|
| | | if not skillData:
|
| | | continue
|
| | | if skillData.GetSkillType() == ChConfig.Def_SkillType_AttrSkillNoLearn:
|
| | | # 同技能可多个叠加的技能不能学,算属性时直接取表
|
| | | continue
|
| | | |
| | | skillManager.LearnSkillByID(skillID, False)
|
| | | |
| | | # 刷被动效果
|
| | | GetPassiveEffManager().RegistPassiveEffDogz(curPlayer)
|
| | | return
|
| | |
|
| | |
|
| | | # 获取助战神兽的技能列表
|
| | | def FindDogzBattleSkills(gameObj):
|
| | | skills = []
|
| | | if gameObj.GetGameObjType() != IPY_GameWorld.gotPlayer:
|
| | | return skills
|
| | | |
| | | skillManager = gameObj.GetSkillManager()
|
| | | for i in xrange(skillManager.GetSkillCount()):
|
| | | curSkill = skillManager.GetSkillByIndex(i)
|
| | | if not curSkill:
|
| | | continue
|
| | | |
| | | if curSkill.GetFuncType() != ChConfig.Def_SkillFuncType_Dogz:
|
| | | continue
|
| | | skills.append(curSkill)
|
| | | |
| | | return skills
|
| | |
|
| | |
|
| | | # 遍历身上装备技能以及各自个数,装备技能不需要学习
|
| | | # 保证不同的装备技能不会有相同的效果, 效果数值的衰减是根据相同技能个数计算而不是效果个数 1-pow((1-初始值),相同技能个数)
|