From 93591a53c1cdabb4e595fa4d5c36eb89998a6e6f Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期六, 25 五月 2019 18:50:56 +0800 Subject: [PATCH] 6805 【后端】【2.0】副本前端化(召唤木桩由玩家召唤兽改为普通NPC) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py | 266 ++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 191 insertions(+), 75 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 6dac2ad..44493b4 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 @@ -720,9 +717,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 @@ -1851,7 +1866,7 @@ #获得技能等级 curSkillLV = curSkill.GetSkillLV() DataRecordPack.DR_LearnORUPSkill(curPlayer, curSkillID, curSkillLV) - EventShell.EventRespons_SkillUp(curPlayer, curSkill.GetFuncType()) + EventShell.EventRespons_SkillUp(curPlayer, curSkill.GetFuncType(), curSkillLV) GameWorld.Log("升级技能名 = %s 成功, 当前等级 = %s"%(curSkill.GetSkillName(), curSkill.GetSkillLV()), curPlayer.GetPlayerID()) return True @@ -2016,6 +2031,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: @@ -2027,16 +2050,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 # @@ -2044,6 +2069,7 @@ #{ # tagHead Head; # DWORD SkillTypeID; // 专精技能ID +# BYTE DoType; // 0-激活升级 1-使用 #}; def OnSelectSkillElement(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) @@ -2055,37 +2081,70 @@ if curPlayer.GetLV() < ipyData.GetNeedLV(): GameWorld.DebugLog('选择技能五行专精等级不足!') return - - curElementSkillID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SkillElementID % mainSkillID) - if selectSkillID == curElementSkillID: - 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).RefreshPlayerAttrState() + doType = clientData.DoType + curElementSkillID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SkillElementID % mainSkillID) + activeSkillLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SkillElementLV % selectSkillID) + isChangeSkill = False #是否变更生效的技能 + updSelectSkillLV = activeSkillLV + #先判断是否可升级 + if doType is 0: + nextSkill = GameWorld.GetGameData().FindSkillByType(selectSkillID, activeSkillLV + 1) + if not nextSkill: + return + + if not CheckLearnSkillNeedAttr(curPlayer, nextSkill): + return + updSelectSkillLV = activeSkillLV + 1 + skillElementType = GetSkillElementType(nextSkill) + + #可升级则激活升一级 + EventShell.EventRespons_ElementSkill(curPlayer, mainSkillID, skillElementType, updSelectSkillLV) + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SkillElementLV % selectSkillID, updSelectSkillLV) + if not curElementSkillID or curElementSkillID == selectSkillID: + #正在使用的专精技能,则立即生效 + isChangeSkill = True + else: # 使用 + if not activeSkillLV: + #未激活不能使用 + return + if selectSkillID == curElementSkillID: + return + isChangeSkill = True - NotifyElementSkillInfo(curPlayer, mainSkillID) + 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 and curElementSkillID != selectSkillID: + #原技能删除 + skillManager.DeleteSkillBySkillTypeID(curElementSkillID) + + + # 重刷被动技能 + 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), @@ -2093,7 +2152,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 @@ -2103,68 +2162,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() - needRefreshSkillIDList = [] + 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 - needRefreshSkillIDList.append(curElementSkillID) - - isRefresh = False - for skillID in needRefreshSkillIDList: - if RefreshElementSkill(curPlayer, skillID): + 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).RefreshPlayerAttrState() + 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(): @@ -2187,30 +2274,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) @@ -2679,6 +2773,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效果的计算模块文件后缀 @@ -2926,15 +3027,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] @@ -3435,6 +3536,7 @@ # return True if isEnhanceSkill: + BaseAttack.OnHurtTypeTriggerPassiveSkill(attacker, defender, curSkill, tick) return True #在这边调用避免群攻时多次扣除消耗 @@ -3567,7 +3669,7 @@ return #--------------------------------------------------------------------- -# 获得关联技能,0 全部 1是主动型技能(法宝,普攻) 其他技能ID +# 获得关联技能,0 全部 1是主动型技能(法宝,普攻) 2 为人族法宝技能 3为普攻 其他技能ID def GetConnectSkillID(curSkill): return curSkill.GetExAttr1() @@ -3706,6 +3808,23 @@ +## 获取某类型技能达到X等级的个数 +# @param curPlayer +# @return +def GetSkillCntByFunc(curPlayer, funcType, skilllv=0): + allSkillCnt = 0 + skillManager = curPlayer.GetSkillManager() + for i in xrange(skillManager.GetSkillCount()): + curPlayerSkill = skillManager.GetSkillByIndex(i) + if curPlayerSkill == None: + continue + if curPlayerSkill.GetFuncType() != funcType: + continue + if curPlayerSkill.GetSkillLV() >= skilllv: + allSkillCnt += 1 + + return allSkillCnt + ## 获取技能总等级 # @param curPlayer # @return allSkillLV:总技能等级 @@ -3720,7 +3839,4 @@ continue skillLV = curPlayerSkill.GetSkillLV() allSkillLV += skillLV - return allSkillLV - - -- Gitblit v1.8.0