From d8a8aa5c0df74e9c2b9a485695543d293cf9eb5a Mon Sep 17 00:00:00 2001
From: xdh <xiefantasy@qq.com>
Date: 星期二, 21 五月 2019 11:36:14 +0800
Subject: [PATCH] 6844 【2.0】【后端】缥缈仙域优化(奇遇掉落)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py | 283 +++++++++++++++++++++++++++++++++++++++----------------
1 files changed, 199 insertions(+), 84 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 8f260a8..d5d041e 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
@@ -1851,7 +1868,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 +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:
@@ -2027,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
#
@@ -2044,6 +2071,7 @@
#{
# tagHead Head;
# DWORD SkillTypeID; // 专精技能ID
+# BYTE DoType; // 0-激活升级 1-使用
#};
def OnSelectSkillElement(index, clientData, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
@@ -2052,37 +2080,73 @@
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()
+ 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),
@@ -2090,7 +2154,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
@@ -2100,64 +2164,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():
@@ -2180,30 +2276,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)
@@ -2672,6 +2775,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效果的计算模块文件后缀
@@ -2919,15 +3029,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]
@@ -3428,6 +3538,7 @@
# return True
if isEnhanceSkill:
+ BaseAttack.OnHurtTypeTriggerPassiveSkill(attacker, defender, curSkill, tick)
return True
#在这边调用避免群攻时多次扣除消耗
@@ -3435,16 +3546,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
@@ -3570,7 +3671,7 @@
return
#---------------------------------------------------------------------
-# 获得关联技能,0 全部 1是主动型技能(法宝,普攻) 其他技能ID
+# 获得关联技能,0 全部 1是主动型技能(法宝,普攻) 2 为人族法宝技能 3为普攻 其他技能ID
def GetConnectSkillID(curSkill):
return curSkill.GetExAttr1()
@@ -3709,6 +3810,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:总技能等级
@@ -3723,7 +3841,4 @@
continue
skillLV = curPlayerSkill.GetSkillLV()
allSkillLV += skillLV
-
return allSkillLV
-
-
--
Gitblit v1.8.0