From 6fcf3513ccde191e067c8dfd8279cccedf95eb77 Mon Sep 17 00:00:00 2001 From: hch <305670599@qq.com> Date: 星期五, 17 五月 2019 19:22:25 +0800 Subject: [PATCH] 6603 【后端】【2.0】增加新版的sp和被动技能 - 新版 --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py | 288 ++++++++++++++++++++++++++++++++++++++------------------ 1 files changed, 194 insertions(+), 94 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py index 318083e..e28c623 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py @@ -102,9 +102,6 @@ global g_ClientHurtDict g_ClientHurtDict = collections.OrderedDict() - # 缓存单次技能攻击的最大伤害, 减少计算量 - curPlayer.SetDict(ChConfig.Def_PlayerKey_ClientMaxHurtValue, 0) - def GetClientHurtByObj(objID, objType): global g_ClientHurtDict @@ -129,9 +126,11 @@ #技能攻击最大数量 hurtCount = SkillCommon.GetSkillArea_Atk_Count(curPlayer, curSkill) - if len(hurtList) > hurtCount: - # 客户端目标过多 - return False + #=========================================================================== + # if len(hurtList) > hurtCount: + # # 客户端目标过多 + # return False + #=========================================================================== # mapType = GameWorld.GetMap().GetMapFBType() # 野外小怪或者其他指定的怪为了更及时的打击感,由客户端计算 @@ -720,9 +719,27 @@ continue npcObj.StopMove() npcObj.ChangePos(npcPos.PosX, npcPos.PosY) - + BeatBackMove(curPlayer, npcObj) return +# 针对NPC被推出远距离一直卡墙角问题,法宝挑战副本特殊处理为超过4米 NPC自动回退一些 +def BeatBackMove(curPlayer, npcObj): + if GameWorld.GetMap().GetMapID() != ChConfig.Def_FBMapID_MagicWeapon: + return + if npcObj.GetCurAction() == IPY_GameWorld.laNPCSkillWarning: + return + + posMap = npcObj.GetRefreshPosAt(npcObj.GetCurRefreshPointIndex()) + #范围校验 + posMapX = posMap.GetPosX() + posMapY = posMap.GetPosY() + if GameWorld.GetDist(npcObj.GetPosX(), npcObj.GetPosY(), posMapX, posMapY) < 8: + # 单次位移不超过5米 + return + npcControl = NPCCommon.NPCControl(npcObj) + moveDestX, moveDestY = npcControl.GetMoveNearPosEx(posMapX, posMapY, 5) + npcObj.Move(moveDestX, moveDestY) + return #=============================================================================== # //B4 03 吸引NPC仇恨 #tagNPCAttention @@ -1850,9 +1867,8 @@ #获得技能等级 curSkillLV = curSkill.GetSkillLV() - DataRecordPack.DR_LearnORUPSkill(curPlayer, curSkillID, curSkillLV) - + EventShell.EventRespons_SkillUp(curPlayer, curSkill.GetFuncType(), curSkillLV) GameWorld.Log("升级技能名 = %s 成功, 当前等级 = %s"%(curSkill.GetSkillName(), curSkill.GetSkillLV()), curPlayer.GetPlayerID()) return True @@ -2017,6 +2033,14 @@ return False #玩家属性点要求 + if not CheckLearnSkillNeedAttr(curPlayer, curSkill): + return False + + return True + +def CheckLearnSkillNeedAttr(curPlayer, curSkill): + #玩家属性点要求 + curSkillTypeID = curSkill.GetSkillTypeID() stateSkillLV = curSkill.GetStateSkillLV() #需要基础属性ID*100000+需要属性点 needBaseAttrID, needBaseAttrValue = GetSkillUpNeedAttr(stateSkillLV) if needBaseAttrID and needBaseAttrValue: @@ -2028,16 +2052,18 @@ ShareDefine.Def_Effect_Earth:PlayerControl.GetEarth(curPlayer), } if needBaseAttrID not in baseAttrDict: - GameWorld.ErrLog(' 天赋技能升级属性点条件配置错误,curSkillTypeID=%s,needBaseAttrID=%s'%(curSkillTypeID, needBaseAttrID)) + GameWorld.ErrLog(' 技能升级属性点条件配置错误,curSkillTypeID=%s,needBaseAttrID=%s'%(curSkillTypeID, needBaseAttrID)) return False curBaseAttrValue = baseAttrDict.get(needBaseAttrID, 0) if curBaseAttrValue < needBaseAttrValue: - GameWorld.DebugLog('升级技能%s需要属性点 %s达到%s, 当前点数=%s!'%(curSkillTypeID, needBaseAttrID, needBaseAttrValue, curBaseAttrValue)) + #GameWorld.DebugLog('升级技能%s需要属性点 %s达到%s, 当前点数=%s!'%(curSkillTypeID, needBaseAttrID, needBaseAttrValue, curBaseAttrValue)) return False - return True + ## 获取技能升级属性需求 rutrun attrID, attrvalue def GetSkillUpNeedAttr(stateSkillLV):return stateSkillLV /100000, stateSkillLV%100000 +## 获取技能专精类型 +def GetSkillElementType(curSkill): return curSkill.GetStateSkillLV() /100000 #// A5 16 选择技能五行专精 #tagCMSelectSkillElement # @@ -2053,37 +2079,64 @@ if not ipyData: return mainSkillID = ipyData.GetMainSkillID() - - curElementSkillID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SkillElementID % mainSkillID) - if selectSkillID == curElementSkillID: - GameWorld.DebugLog('已经是该专精技能!') + if curPlayer.GetLV() < ipyData.GetNeedLV(): + GameWorld.DebugLog('选择技能五行专精等级不足!') return + skillManager = curPlayer.GetSkillManager() mainSkill = skillManager.FindSkillBySkillTypeID(mainSkillID) if not mainSkill: GameWorld.DebugLog('主技能未学习,无法选专精mainSkillID=%s'%mainSkillID) return - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SkillElementID % mainSkillID, selectSkillID) - if curElementSkillID: - #原技能删除 - skillManager.DeleteSkillBySkillTypeID(curElementSkillID) - else: - EventShell.EventRespons_ElementSkill(curPlayer) - #更新新技能 - RefreshElementSkill(curPlayer, selectSkillID) - # 重刷被动技能 - PassiveBuffEffMng.GetPassiveEffManager().RegistPassiveEff(curPlayer) - # 重刷技能战力 - PlayerControl.PlayerControl(curPlayer).RefreshAllSkill() + curElementSkillID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SkillElementID % mainSkillID) + activeSkillLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SkillElementLV % selectSkillID) + #先判断是否可升级 + updSelectSkillLV = activeSkillLV + nextSkill = GameWorld.GetGameData().FindSkillByType(selectSkillID, activeSkillLV + 1) + if nextSkill: + if CheckLearnSkillNeedAttr(curPlayer, nextSkill): + updSelectSkillLV = activeSkillLV + 1 + skillElementType = GetSkillElementType(nextSkill) + isChangeSkill = False #是否变更生效的技能 + if updSelectSkillLV != activeSkillLV: + #可升级则激活升一级 + EventShell.EventRespons_ElementSkill(curPlayer, mainSkillID, skillElementType, updSelectSkillLV) + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SkillElementLV % selectSkillID, updSelectSkillLV) + if curElementSkillID == selectSkillID: + #正在使用的专精技能,则立即生效 + isChangeSkill = True + elif selectSkillID != curElementSkillID: + isChangeSkill = True + + if isChangeSkill: + #更换专精 + if not RefreshElementSkill(curPlayer, selectSkillID)[1]: + GameWorld.DebugLog('更换专精 不成功 selectSkillID=%s'%selectSkillID) + return + + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SkillElementID % mainSkillID, selectSkillID) + if curElementSkillID: + if curElementSkillID != selectSkillID: + #原技能删除 + skillManager.DeleteSkillBySkillTypeID(curElementSkillID) + - NotifyElementSkillInfo(curPlayer, mainSkillID) + # 重刷被动技能 + PassiveBuffEffMng.GetPassiveEffManager().RegistPassiveEff(curPlayer) + # 重刷技能战力 + curControl = PlayerControl.PlayerControl(curPlayer) + curControl.RefreshAllSkill() + curControl.RefreshPlayerAttrState() + + NotifyElementSkillInfo(curPlayer, mainSkillID, selectSkillID if updSelectSkillLV != activeSkillLV else 0) return -def RefreshElementSkill(curPlayer, skillTypeID): +def RefreshElementSkill(curPlayer, skillTypeID, isChangeLV=True): ##更新专精技能生效的等级 + isNotify, hasChangeLV = False, False __InitElementSkillInfo() if skillTypeID not in PyGameData.g_elemntSkillDict: - return + return isNotify, hasChangeLV baseAttrDict = { ShareDefine.Def_Effect_Metal:PlayerControl.GetMetal(curPlayer), ShareDefine.Def_Effect_Wood:PlayerControl.GetWood(curPlayer), @@ -2091,7 +2144,7 @@ ShareDefine.Def_Effect_Fire:PlayerControl.GetFire(curPlayer), ShareDefine.Def_Effect_Earth:PlayerControl.GetEarth(curPlayer), } - + activeSkillLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SkillElementLV % skillTypeID) limitInfoList = PyGameData.g_elemntSkillDict[skillTypeID] maxSkillLV = len(limitInfoList) updSkillLV = 0 @@ -2101,64 +2154,96 @@ if curAttrValue >= needAttrValue: updSkillLV = maxSkillLV - i break + if activeSkillLV > updSkillLV: + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SkillElementLV % skillTypeID, updSkillLV) + isNotify = True + updSkillLV = min(updSkillLV, activeSkillLV) #不可超过激活的等级 skillManager = curPlayer.GetSkillManager() curSkill = skillManager.FindSkillBySkillTypeID(skillTypeID) curSkillLV = curSkill.GetSkillLV() if curSkill else 0 - + #GameWorld.DebugLog('更新专精技能生效的等级 skillTypeID=%s,curSkillLV=%s,activeSkillLV=%s,updSkillLV=%s'%(skillTypeID, curSkillLV, activeSkillLV, updSkillLV)) + if not isChangeLV: + return isNotify, hasChangeLV if updSkillLV == curSkillLV: - return + return isNotify, hasChangeLV elif updSkillLV < curSkillLV: skillManager.DeleteSkillBySkillTypeID(skillTypeID) for _ in xrange(updSkillLV): skillManager.LVUpSkillBySkillTypeID(skillTypeID) + if updSkillLV == 0:#重置为未选状态 + ipyData = IpyGameDataPY.GetIpyGameData('SkillElement', skillTypeID) + mainSkillID = ipyData.GetMainSkillID() + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SkillElementID % mainSkillID, 0) + isNotify = True else: for _ in xrange(updSkillLV-curSkillLV): skillManager.LVUpSkillBySkillTypeID(skillTypeID) - return True + return isNotify, True def RefreshElementSkillByAttr(curPlayer, attrIDList): #加点、丹药、境界、洗点 会影响灵根点 __InitElementSkillInfo() - - isRefresh = False + + needRefreshSkillIDDict = {} #{skillid:是否变更技能等级} skillManager = curPlayer.GetSkillManager() for i in xrange(skillManager.GetSkillCount()): hasSkill = skillManager.GetSkillByIndex(i) hasSkillID = hasSkill.GetSkillTypeID() - ipyData = IpyGameDataPY.GetIpyGameDataByCondition('SkillElement', {'MainSkillID':hasSkillID}, False, False) - if not ipyData: + ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('SkillElement', {'MainSkillID':hasSkillID}, True, False) + if not ipyDataList: continue - curElementSkillID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SkillElementID % hasSkillID) - if not curElementSkillID: - continue - if curElementSkillID not in PyGameData.g_elemntSkillDict: - continue - attrID = GetSkillUpNeedAttr(PyGameData.g_elemntSkillDict[curElementSkillID][0])[0] - if attrID not in attrIDList: - continue - if RefreshElementSkill(curPlayer, curElementSkillID): + curSelectSkillID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SkillElementID % hasSkillID) + for ipyData in ipyDataList: + curElementSkillID = ipyData.GetElementSkillID() + if curElementSkillID not in PyGameData.g_elemntSkillDict: + continue + attrID = GetSkillUpNeedAttr(PyGameData.g_elemntSkillDict[curElementSkillID][0])[0] + if attrID not in attrIDList: + continue + needRefreshSkillIDDict[curElementSkillID] = curSelectSkillID == curElementSkillID + + #GameWorld.DebugLog('属性点变更 刷新专精attrIDList=%s,needRefreshSkillIDList=%s'%(attrIDList,needRefreshSkillIDList)) + needNotify, isRefresh = False, False + for skillID, isChangeLV in needRefreshSkillIDDict.items(): + isNotify, hasChangeLV = RefreshElementSkill(curPlayer, skillID, isChangeLV) + if isNotify: + needNotify = True + if hasChangeLV: isRefresh = True if isRefresh: # 重刷被动技能 PassiveBuffEffMng.GetPassiveEffManager().RegistPassiveEff(curPlayer) # 重刷技能战力 - PlayerControl.PlayerControl(curPlayer).RefreshAllSkill() + curControl = PlayerControl.PlayerControl(curPlayer) + curControl.RefreshAllSkill() + curControl.RefreshPlayerAttrState() + if needNotify: + NotifyElementSkillInfo(curPlayer) return -def GetElementSkillCnt(curPlayer): +def GetElementSkillCnt(curPlayer, mainSkillIDList, activeLV, elementType=0): ##获取已选择的专精技能数量 + # @param elementType: 专精类型,对应灵根ID + gameData = GameWorld.GetGameData() cnt = 0 skillManager = curPlayer.GetSkillManager() for i in xrange(skillManager.GetSkillCount()): hasSkill = skillManager.GetSkillByIndex(i) hasSkillID = hasSkill.GetSkillTypeID() - ipyData = IpyGameDataPY.GetIpyGameDataByCondition('SkillElement', {'MainSkillID':hasSkillID}, False, False) - if not ipyData: + if hasSkillID not in mainSkillIDList: continue - curElementSkillID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SkillElementID % hasSkillID) - if not curElementSkillID: + ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('SkillElement', {'MainSkillID':hasSkillID}, True, False) + if not ipyDataList: continue - cnt +=1 + for ipyData in ipyDataList: + elementSkillID = ipyData.GetElementSkillID() + if elementType: + elementSkillData = gameData.GetSkillBySkillID(elementSkillID) + if GetSkillElementType(elementSkillData) != elementType: + continue + curActiveLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SkillElementLV % elementSkillID) + if curActiveLV >= activeLV: + cnt += 1 return cnt def __InitElementSkillInfo(): @@ -2181,30 +2266,37 @@ PyGameData.g_elemntSkillDict[elementSkillID].append(curSkill.GetStateSkillLV()) return -def NotifyElementSkillInfo(curPlayer, mainSkillID=0): +def NotifyElementSkillInfo(curPlayer, mainSkillID=0, changeSkillID=0): ##通知五行专精信息 if not mainSkillID: - syncMainSkillList = [] + syncMainSkillDict = {} skillManager = curPlayer.GetSkillManager() for i in xrange(skillManager.GetSkillCount()): hasSkill = skillManager.GetSkillByIndex(i) hasSkillID = hasSkill.GetSkillTypeID() - ipyData = IpyGameDataPY.GetIpyGameDataByCondition('SkillElement', {'MainSkillID':hasSkillID}, False, False) - if not ipyData: + ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('SkillElement', {'MainSkillID':hasSkillID}, True, False) + if not ipyDataList: continue - syncMainSkillList.append(hasSkillID) - + syncMainSkillDict[hasSkillID] = [] + for ipyData in ipyDataList: + syncMainSkillDict[hasSkillID].append(ipyData.GetElementSkillID()) + else: - syncMainSkillList = [mainSkillID] + syncMainSkillDict = {mainSkillID:[changeSkillID]} if changeSkillID else {mainSkillID:[]} sendPack = ChPyNetSendPack.tagMCSkillElementInfo() sendPack.InfoList = [] - for mSkillID in syncMainSkillList: + for mSkillID, elementList in syncMainSkillDict.items(): curElementSkillID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SkillElementID % mSkillID) - if not curElementSkillID: - continue elementData = ChPyNetSendPack.tagMCSkillElementData() elementData.MainSkillID = mSkillID elementData.ElementSkillID = curElementSkillID + elementData.ActiveSkill = [] + for elementSkillID in elementList: + activeData = ChPyNetSendPack.tagMCSkillElementActiveData() + activeData.SkillID = elementSkillID + activeData.ActiveLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SkillElementLV % elementSkillID) + elementData.ActiveSkill.append(activeData) + elementData.SkillCnt = len(elementData.ActiveSkill) sendPack.InfoList.append(elementData) sendPack.Cnt = len(sendPack.InfoList) NetPackCommon.SendFakePack(curPlayer, sendPack) @@ -2673,6 +2765,13 @@ callFunc = GameWorld.GetExecFunc(GameBuffs, "Buff_%s.%s"%(moduleSuffix, "OnCalcBuffEx")) if callFunc: callFunc(objDetel, curEffect, allAttrList[index], curBuff) + + #是否持续性技能 + if curBuff and curBuff.GetSkill().GetSkillType() in ChConfig.Def_LstBuff_List: + # 持续性属性变化的buff,目前只有持续减益 + callFunc = GameWorld.GetExecFunc(GameBuffs, "BuffProcess_%s.%s"%(moduleSuffix, "OnCalcBuffEx")) + if callFunc: + callFunc(objDetel, curEffect, allAttrList[index], curBuff) return ## 获得buff效果的计算模块文件后缀 @@ -2920,15 +3019,15 @@ def CalcBuffers_Effect(curPlayer, allAttrList, calcEffectIDList=[]): for buffType in range(IPY_GameWorld.bfBuff, IPY_GameWorld.btBufMax): + #这些类型不影响玩家计算属性 + if buffType in [IPY_GameWorld.bfProcessBuff, #IPY_GameWorld.bfProcessDeBuff, + IPY_GameWorld.bfMapBuff, + IPY_GameWorld.bfEquipBuff]: + continue + buffTuple = SkillCommon.GetBuffManagerByBuffType(curPlayer, buffType) #通过类型获取目标的buff管理器为空,则跳出 if buffTuple == (): - continue - - #这些类型不影响玩家计算属性 - if buffType in [IPY_GameWorld.bfProcessBuff, - IPY_GameWorld.bfProcessDeBuff, IPY_GameWorld.bfMapBuff, - IPY_GameWorld.bfEquipBuff]: continue buffManager = buffTuple[0] @@ -3429,6 +3528,7 @@ # return True if isEnhanceSkill: + BaseAttack.OnHurtTypeTriggerPassiveSkill(attacker, defender, curSkill, tick) return True #在这边调用避免群攻时多次扣除消耗 @@ -3436,16 +3536,6 @@ BaseAttack.DoAttackSuccessEx(attacker, GameObj.GetHP(attacker), defender, curSkill, tick) return True - -#=============================================================================== -# Def_Effect_GoddessAddHP = 1300 # 加血 (压总值血量百分比) -# Def_Effect_AddHPValue_All = 1027 # 持续加血(压总值攻击) -# Def_Effect_LostHPValue_All = 1033 # 持续减血(压总值攻击) -# Def_Effect_LostAndAddHPValue_All = 1050 # 持续吸血(压总值攻击) -# Def_Effect_LostHPValue_Single = 1201 # 持续单次减血计算 攻击 -# Def_Effect_AddHPValue_Single = 1202 # 持续单次加血计算 攻击 -# Def_Effect_LostHP_MaxHP = 1089 # 持续减血(压总值, 血量百分比) -#=============================================================================== #waring: 此值影响了BUFF的替换规则,值大替换小的 ##添加BUFF前压入BUFF的值,这边只计算和攻击者相关,仅支持放在效果1的buff @@ -3571,7 +3661,7 @@ return #--------------------------------------------------------------------- -# 获得关联技能,0 全部 1是主动型技能(法宝,普攻) 其他技能ID +# 获得关联技能,0 全部 1是主动型技能(法宝,普攻) 2 为人族法宝技能 3为普攻 其他技能ID def GetConnectSkillID(curSkill): return curSkill.GetExAttr1() @@ -3710,25 +3800,35 @@ -## 获取技能总等级 +## 获取某类型技能达到X等级的个数 # @param curPlayer -# @return allSkillLV:总技能等级 -def GetAllSkillLV(curPlayer): - successSkillIDList = ReadChConfig.GetEvalChConfig("SuccessSkillIDList") - allSkillLV = 0 +# @return +def GetSkillCntByFunc(curPlayer, funcType, skilllv=0): + allSkillCnt = 0 skillManager = curPlayer.GetSkillManager() - for i in range(0 , skillManager.GetSkillCount()): + for i in xrange(skillManager.GetSkillCount()): curPlayerSkill = skillManager.GetSkillByIndex(i) if curPlayerSkill == None: continue - - skillTypeID = curPlayerSkill.GetSkillTypeID() - if skillTypeID not in successSkillIDList: + if curPlayerSkill.GetFuncType() != funcType: continue + if curPlayerSkill.GetSkillLV() >= skilllv: + allSkillCnt += 1 + return allSkillCnt + +## 获取技能总等级 +# @param curPlayer +# @return allSkillLV:总技能等级 +def GetAllSkillLV(curPlayer, funcType): + allSkillLV = 0 + skillManager = curPlayer.GetSkillManager() + for i in xrange(skillManager.GetSkillCount()): + curPlayerSkill = skillManager.GetSkillByIndex(i) + if curPlayerSkill == None: + continue + if curPlayerSkill.GetFuncType() != funcType: + continue skillLV = curPlayerSkill.GetSkillLV() allSkillLV += skillLV - return allSkillLV - - -- Gitblit v1.8.0