From 02f8c83ffab335d63d18bdde30e61bd2233f1f87 Mon Sep 17 00:00:00 2001 From: xdh <xiefantasy@qq.com> Date: 星期四, 09 五月 2019 16:58:57 +0800 Subject: [PATCH] 6501 【后端】【2.0】仙盟任务(增加多个任务接口) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py | 190 +++++++++++++++++++++++++++++++++-------------- 1 files changed, 134 insertions(+), 56 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py index 16ce277..2fb69b6 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/GameSkills/SkillCommon.py @@ -99,6 +99,13 @@ coolDownTime = curSkill.GetCoolDownTime() remainTime = coolDownTime if isPassiveSkill(curSkill): + if curSkill.GetFuncType() == ChConfig.Def_SkillFuncType_GiftSkill: + # 天赋有减CD效果 + reduceSkillCDPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, None, curSkill, ChConfig.TriggerType_GiftReduceCD) + # 减CD比率 + if reduceSkillCDPer > 0: + remainTime = int(remainTime * max(0, ShareDefine.Def_MaxRateValue - reduceSkillCDPer) / ShareDefine.Def_MaxRateValue) + # 被动技能的处理和主动技能区分 curSkill.SetRemainTime(remainTime) return @@ -108,7 +115,6 @@ # remainTime = skillData.GetCoolDownTime() reduceSkillCDPer += PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(atkObj, None, curSkill, ChConfig.TriggerType_ReduceCD) - # 减CD比率 if reduceSkillCDPer > 0: remainTime = int(remainTime * max(0, ShareDefine.Def_MaxRateValue - reduceSkillCDPer) / ShareDefine.Def_MaxRateValue) @@ -214,11 +220,12 @@ def PlayerLoginMergeServerSkillLogic(curPlayer, tick): playerID = curPlayer.GetPlayerID() - if not GameWorld.IsMergeServer(): + if not GameWorld.IsCrossServer(): GameWorld.DebugLog("非跨服服务器上线不清除buff...", playerID) return - ClearBuffSkillTypeIDList = ReadChConfig.GetEvalChConfig("ClearBuffSkillTypeID") + #ClearBuffSkillTypeIDList = ReadChConfig.GetEvalChConfig("ClearBuffSkillTypeID") + ClearBuffSkillTypeIDList = [] # 跨服服务器上线清除增益/减益buff GameWorld.Log("跨服服务器上线清除buff...", playerID) clearBuffList = [] # 先汇总再清除,不然索引会变更 @@ -273,6 +280,15 @@ curSkill.SetRemainTime(0) GameWorld.DebugLog(" SetRemainTime 0 skillName=%s,skillTypeID=%s" % (curSkill.GetSkillName(), curSkill.GetSkillTypeID()), playerID) + return + +def ResetAllSkillCD(curPlayer): + skillManager = curPlayer.GetSkillManager() + for i in xrange(skillManager.GetSkillCount()): + skill = skillManager.GetSkillByIndex(i) + if skill.GetRemainTime() != 0: + skill.SetRemainTime(0) + skill.Sync_Skill() return ## 刷新玩家所有技能的剩余时间(上线) @@ -466,6 +482,8 @@ return int(value) + + ## 玩家召唤NPC(当前玩家,召唤技能,召唤兽ID,召唤兽属性列表, 召唤兽离自己的距离, 当前时间) # @param curPlayer 当前玩家 # @param curSkill 召唤技能 @@ -508,6 +526,8 @@ summonPos = GameMap.GetEmptyPlaceInArea(curPlayer.GetPosX(), curPlayer.GetPosY(), summonDist) summonNPC.Reborn(summonPos.GetPosX(), summonPos.GetPosY()) summonNPC.SetBornTime(tick) + # 继承技能等级 + SetSummonNPCSkillLV(summonNPC, curSkill) if curSkill: summonNPC.SetLastTime(curSkill.GetLastTime()) #----设置为无敌,在AI中解除无敌 @@ -515,6 +535,38 @@ summonNPC.SetCanAttack(False) return + +# 召唤兽技能继承,玩家释放技能的等级 +def SetSummonNPCSkillLV(summonNPC, curSkill): + if curSkill.GetEffect(0).GetEffectValue(1) == 0: + return + skillLV = curSkill.GetSkillLV() - 1 + if skillLV == 0: + return + + skillManager = summonNPC.GetSkillManager() + learnSkillIDList =[] + for index in range(0, skillManager.GetSkillCount()): + useSkill = skillManager.GetSkillByIndex(index) + #已经到尾部了 + if not useSkill or useSkill.GetSkillTypeID() == 0: + break + + useSkillTypeID = useSkill.GetSkillTypeID() + # 找到可学习的技能 + learnSkillID = useSkillTypeID + skillLV + findSkill = GameWorld.GetGameData().GetSkillBySkillID(learnSkillID) + if not findSkill: + continue + if findSkill.GetSkillTypeID() != useSkillTypeID: + # 不是同一个技能 + continue + learnSkillIDList.append(learnSkillID) + + for skillID in learnSkillIDList: + skillManager.LearnSkillByID(skillID, False) + return + ## 设置召唤兽属性 # @param curPlayer 当前玩家 @@ -1170,37 +1222,24 @@ return -## 获取哥布林功能NPC类型掉血值 -def GetGoblinLostHP(defender, hurtValue): - if not defender: - return hurtValue - - defObjType = defender.GetGameObjType() - if defObjType == IPY_GameWorld.gotNPC: - npcFuncType = defender.GetFunctionType() - if npcFuncType == ChConfig.Def_NPCFuncType_Goblin: - goblinHurtValue = int(ReadChConfig.GetEvalChConfig('GoblinHurtValue')) - hurtValue = min(hurtValue, goblinHurtValue) - - return hurtValue - -## 技能伤血 -# @param curObj 当前对象 -# @param skillTypeID 技能类型ID -# @param buffOwner buff拥有者 -# @param lostValue 丢失值 -# @param tick 当前时间 -# @param view 是否广播 -# @param reduce 是否扣血 -# @return None -# @remarks 函数详细说明. -def SkillLostHP(curObj, skillTypeID, buffOwner, lostValue, tick, view=True, reduceHP=True, - isDoAttackResult=True, hurtType=ChConfig.Def_HurtType_Normal): +## 直接扣血不走公式 +# view 是否广播客户端飘血 +# isDoAttackResult 是否立即处理结果,为False必须外层有处理 +# hurtType 飘血类型 +# skillAffect 默认True 会被各种技能BUFF盾等影响伤血数值 +# False代表一些特殊处理纯固定伤害飘字(如采集固定掉1点血) +def SkillLostHP(curObj, skillTypeID, buffOwner, lostValue, tick, view=True, + isDoAttackResult=True, hurtType=ChConfig.Def_HurtType_Normal, + skillAffect=True): if lostValue <= 0: GameWorld.Log('###技能伤害血量异常,数值错误 = %s,技能类型ID = %s' % (lostValue, skillTypeID)) return - #lostValue = GetGoblinLostHP(curObj, lostValue) + if not curObj.GetCanAttack(): + # 无敌不掉血 + ## 后续有其他情况也应考虑进来,如镖车是否某状态不掉血 + return + curObjType = curObj.GetGameObjType() curSkill = GameWorld.GetGameData().FindSkillByType(skillTypeID, 1) @@ -1211,29 +1250,32 @@ notifyLostValue = lostValue curObjHP_BeforeAttack = GameObj.GetHP(curObj) + if curObjHP_BeforeAttack == 0: + # 没有血量不能再触发 + return - if reduceHP : - # 血盾 - - lostValue = AttackCommon.CalcBloodShield(buffOwner, curObj, lostValue) - - #剩余血量 - remainHP = max(curObjHP_BeforeAttack - lostValue , 0) - - #NPC处理 - if curObjType == IPY_GameWorld.gotNPC: - #宠物特殊处理 - if curObj.GetGameNPCObjType() == IPY_GameWorld.gnotPet: - PetControl.SetPetHP(curObj, remainHP) - else: - GameObj.SetHP(curObj, remainHP) - if not view : # 已广播的不重复 - curObj.Notify_HPEx() - - #其他对象逻辑处理 + if skillAffect: + lostValue = AttackCommon.CalcHurtHPWithBuff(buffOwner, curObj, lostValue, curSkill, tick) + + #剩余血量 + remainHP = max(curObjHP_BeforeAttack - lostValue , 0) + + #NPC处理 + if curObjType == IPY_GameWorld.gotNPC: + #宠物特殊处理 + if curObj.GetGameNPCObjType() == IPY_GameWorld.gnotPet: + PetControl.SetPetHP(curObj, remainHP) else: - # 已广播的不重复 - GameObj.SetHP(curObj, remainHP, not view) + GameObj.SetHP(curObj, remainHP) + if not view : # 已广播的不重复 + curObj.Notify_HPEx() + + #其他对象逻辑处理 + else: + # 已广播的不重复 + GameObj.SetHP(curObj, remainHP, not view) + + AttackCommon.WriteHurtLog(buffOwner, curObj, curSkill, lostValue, hurtType, "持续掉血") if view: #广播伤血类型 @@ -1246,9 +1288,10 @@ #无法找到Buff拥有者 if not buffOwner: - AttackCommon.DoLogic_ObjDead(curObj) + AttackCommon.DoLogic_ObjDead(None, curObj, curSkill, tick) return + #NPC需要手动添加伤血和仇恨, 因为无调用DoAttack if curObjType == IPY_GameWorld.gotNPC: @@ -1625,11 +1668,13 @@ return True buffSkill = curObjBuff.GetSkill() - buffSkillLV = buffSkill.GetSkillLV() - #已存在更强大的效果 - if buffSkillLV > curSkillLV: - return + #buff根据情况可以叠加低级,或者低级覆盖高级 +# buffSkillLV = buffSkill.GetSkillLV() +# +# #已存在更强大的效果 +# if buffSkillLV > curSkillLV: +# return if not buffSkill.GetLastTime(): #GameWorld.DebugLog("无时间限制buff,只要存在buff,则无需重复添加") @@ -1702,6 +1747,35 @@ return returnInfo + +def FindBuffByOwner(gameObj, skillTypeID, ownerID, ownerType): + findSkill = GameWorld.GetGameData().GetSkillBySkillID(skillTypeID) + buffType = GetBuffType(findSkill) + buffTuple = GetBuffManagerByBuffType(gameObj, buffType) + if buffTuple == (): + return None + + buffManager = buffTuple[0] + for i in range(0, buffManager.GetBuffCount()): + curBuff = buffManager.GetBuff(i) + if not curBuff: + continue + + #判断是否拥有同一类型的技能 + if curBuff.GetSkill().GetSkillTypeID() != skillTypeID: + continue + + #判断是否拥有同一类型的技能 + if curBuff.GetOwnerID() != ownerID: + continue + + if curBuff.GetOwnerType() != ownerType: + continue + + return curBuff + + return None + #--------------------------------------------------------------------- ## 执行清空命令 参数:玩家, 保留技能类型列表 # @param curPlayer 玩家 @@ -1910,6 +1984,10 @@ # @return 返回值, 伤害数量 # @remarks 获得区域技能伤害对象数量 def GetSkillArea_Atk_Count(attacker, curSkill): + if attacker.GetGameObjType() == IPY_GameWorld.gotPlayer and attacker.GetAttackMode() == IPY_GameWorld.amContest: + # 单一目标锁定模式 + return 1 + #默认攻击最大数 hurtCount = 50 -- Gitblit v1.8.0