From d42896d1fe05ba65cf3bf537075c3d00467dfbb8 Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期四, 11 七月 2019 11:38:48 +0800
Subject: [PATCH] 860312 混服或合服情况下需要指定修改的平台和服务器,Serverid不填写代表不改变只替换spid
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py | 104 +++++++++++++++++++++++++++++++++------------------
1 files changed, 67 insertions(+), 37 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 1b2f8a6..972f097 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Skill/SkillShell.py
@@ -41,13 +41,12 @@
import GameMap
import collections
import PassiveBuffEffMng
-import EffGetSet
+import ChEquip
import SkillShell
import FBCommon
import IpyGameDataPY
import PyGameData
import EventShell
-#import EquipZhuXian
#---------------------------------------------------------------------
GameWorld.ImportAll("Script\\Skill\\" , "GameSkills")
GameWorld.ImportAll("Script\\Skill\\" , "GameBuffs")
@@ -55,6 +54,7 @@
# 记录客户端伤害 {(objID, objType):[HurtHP, AttackType]}
g_ClientHurtDict = collections.OrderedDict()
+g_UseSkillPlayerID = 0 # 全服攻击为单线程 记录的是当前使用技能的玩家 用于判断g_ClientHurtDict的归属
#---------------------------------------------------------------------
##C++调用函数, 重新读取所有技能
@@ -92,6 +92,10 @@
def GetSkillFireAim(curSkill):
return curSkill.GetTag()%10
+# 当前释放主动技能的玩家
+def GetUseSkillPlayerID():
+ global g_UseSkillPlayerID
+ return g_UseSkillPlayerID
# 客户端伤血列表,修改了遍历对象和计算血量
def GetClientHurtDict():
@@ -100,7 +104,9 @@
def ClearClientHurtDict(curPlayer):
global g_ClientHurtDict
+ global g_UseSkillPlayerID
g_ClientHurtDict = collections.OrderedDict()
+ g_UseSkillPlayerID = 0
def GetClientHurtByObj(objID, objType):
@@ -122,6 +128,7 @@
# 技能开始初始化客户端伤血列表
def InitClientHurtDict(curPlayer, curSkill, hurtList):
global g_ClientHurtDict
+ global g_UseSkillPlayerID
ClearClientHurtDict(curPlayer)
#技能攻击最大数量
@@ -157,7 +164,8 @@
return False
g_ClientHurtDict[(hurobj.ObjID, hurobj.ObjType)] = [hurobj.HurtHP, hurobj.AttackType]
-
+
+ g_UseSkillPlayerID = curPlayer.GetID()
return True
#---------------------------------------------------------------------
# 非客户端玩家释放的技能
@@ -169,11 +177,16 @@
# 玩家普通也是技能,正常是不会走到这边
return False
+ if GetUseSkillPlayerID() != attacker.GetID():
+ # 非释放者
+ return False
+
useSkillData = attacker.GetUseSkill()
if useSkillData and curSkill.GetSkillTypeID() != useSkillData.GetSkillTypeID():
# 默认群攻附加触发buff的对象与攻击对象一致
if not SkillCommon.IsBuff(curSkill):
return False
+
if not GetClientHurtDict():
return False
@@ -1358,6 +1371,10 @@
if curPlayer.GetHP() <= 0:
return
+ if curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ClientCustomScene):
+ #GameWorld.DebugLog("自定义场景中,不检查!")
+ return True
+
#===========================================================================
# if curPlayer.IsMoving():
# GameWorld.DebugLog("移动中不可使用技能")
@@ -1854,11 +1871,8 @@
#升级技能CD直接冷却
curSkill.SetRemainTime(0)
- learnSkillNotifyDict = IpyGameDataPY.GetFuncEvalCfg("SPSkillType", 3, {})
if curSkill.GetFuncType() == ChConfig.Def_SkillFuncType_HorseSkill:
PlayerControl.WorldNotify(0, 'GetMountSkill', [curPlayer.GetName(), curSkillID])
- elif skillTypeID in learnSkillNotifyDict:
- PlayerControl.WorldNotify(0, learnSkillNotifyDict[skillTypeID], [curPlayer.GetName(), curSkillID])
else:
#通知技能已升级成功 GeRen_admin_31379
PlayerControl.NotifyCode(curPlayer, "GeRen_admin_31379", [curSkillID, curSkill.GetSkillLV()])
@@ -1899,10 +1913,6 @@
if upSkill.GetFuncType() == ChConfig.Def_SkillFuncType_GiftSkill:
if not PlayerGreatMaster.GetGreatMasterFreeSkillPoint(curPlayer):
return False
- #诛仙技能学习判断
- #if upSkill.GetFuncType() == ChConfig.Def_SkillFuncType_ZhuXian:
- # if not EquipZhuXian.CheckLearnZhuXianSkill(curPlayer, curSkillTypeID):
- # return False
#经验检测
skillLvUpNeedExp = upSkill.GetLVUpCostExp()
@@ -2069,6 +2079,7 @@
#{
# tagHead Head;
# DWORD SkillTypeID; // 专精技能ID
+# BYTE DoType; // 0-激活升级 1-使用
#};
def OnSelectSkillElement(index, clientData, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
@@ -2086,37 +2097,47 @@
if not mainSkill:
GameWorld.DebugLog('主技能未学习,无法选专精mainSkillID=%s'%mainSkillID)
return
+ doType = clientData.DoType
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:
+ 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 curElementSkillID == selectSkillID:
#正在使用的专精技能,则立即生效
isChangeSkill = True
- elif selectSkillID != curElementSkillID:
+ else: # 使用
+ if not activeSkillLV:
+ #未激活不能使用
+ return
+ if selectSkillID == curElementSkillID:
+ return
isChangeSkill = True
-
+
if isChangeSkill:
#更换专精
- if not RefreshElementSkill(curPlayer, selectSkillID):
+ 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)
+ ChEquip.ChangeEquipfacadeByLingGen(curPlayer)
+ if curElementSkillID and curElementSkillID != selectSkillID:
+ #原技能删除
+ skillManager.DeleteSkillBySkillTypeID(curElementSkillID)
# 重刷被动技能
@@ -2131,9 +2152,10 @@
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),
@@ -2153,15 +2175,16 @@
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
+ return isNotify, hasChangeLV
if updSkillLV == curSkillLV:
- return
+ return isNotify, hasChangeLV
elif updSkillLV < curSkillLV:
skillManager.DeleteSkillBySkillTypeID(skillTypeID)
for _ in xrange(updSkillLV):
@@ -2170,10 +2193,12 @@
ipyData = IpyGameDataPY.GetIpyGameData('SkillElement', skillTypeID)
mainSkillID = ipyData.GetMainSkillID()
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SkillElementID % mainSkillID, 0)
+ ChEquip.ChangeEquipfacadeByLingGen(curPlayer)
+ isNotify = True
else:
for _ in xrange(updSkillLV-curSkillLV):
skillManager.LVUpSkillBySkillTypeID(skillTypeID)
- return True
+ return isNotify, True
def RefreshElementSkillByAttr(curPlayer, attrIDList):
#加点、丹药、境界、洗点 会影响灵根点
@@ -2198,9 +2223,12 @@
needRefreshSkillIDDict[curElementSkillID] = curSelectSkillID == curElementSkillID
#GameWorld.DebugLog('属性点变更 刷新专精attrIDList=%s,needRefreshSkillIDList=%s'%(attrIDList,needRefreshSkillIDList))
- isRefresh = False
+ needNotify, isRefresh = False, False
for skillID, isChangeLV in needRefreshSkillIDDict.items():
- if RefreshElementSkill(curPlayer, skillID, isChangeLV):
+ isNotify, hasChangeLV = RefreshElementSkill(curPlayer, skillID, isChangeLV)
+ if isNotify:
+ needNotify = True
+ if hasChangeLV:
isRefresh = True
if isRefresh:
# 重刷被动技能
@@ -2209,7 +2237,8 @@
curControl = PlayerControl.PlayerControl(curPlayer)
curControl.RefreshAllSkill()
curControl.RefreshPlayerAttrState()
- NotifyElementSkillInfo(curPlayer)
+ if needNotify:
+ NotifyElementSkillInfo(curPlayer)
return
def GetElementSkillCnt(curPlayer, mainSkillIDList, activeLV, elementType=0):
@@ -3241,7 +3270,8 @@
#--- 1. 先取得触发技能---
#先检查数据库有没该类技能,如果最高等级不一样会找不到
- exSkill = GameWorld.GetGameData().FindSkillByType(skillEnhanceID, skillLV)
+ #exSkill = GameWorld.GetGameData().FindSkillByType(skillEnhanceID, skillLV)
+ exSkill = GameWorld.GetGameData().GetSkillBySkillID(skillEnhanceID)
#异常
if not exSkill:
GameWorld.ErrLog("对象 = %s, 找不到附加技能ID = %s, skillLv = %s"%(attacker.GetID() , skillEnhanceID , useSkill.GetSkillLV()))
@@ -3437,7 +3467,7 @@
#这个技能是Buff
if SkillCommon.IsBuff(curSkill):
- if ChConfig.Def_SkillType_LstPlsBuffAtk == curSkill.GetSkillType():
+ if curSkill.GetSkillType() in [ChConfig.Def_SkillType_LstPlsBuffAtk, ChConfig.Def_SkillType_PassiveLstPlsBuffAtk]:
defender = attacker
return __DoLogic_AddBuff(attacker, defender, curSkill, isEnhanceSkill, tick, tagRoundPosX, tagRoundPosY)
@@ -3721,11 +3751,11 @@
# 当技能类型为被动技能并且tag字段为0,则此技能为媒介用于触发技能 SkillEnhance1 SkillEnhance2
skill1 = GameWorld.GetGameData().GetSkillBySkillID(curSkill.GetSkillEnhance1())
- if skill1:
+ if skill1 and GameWorld.CanHappen(skill1.GetHappenRate(), ChConfig.Def_MaxRateValue):
result = True if UsePassiveTriggerSkill(attacker, skill1, target, tick, True) else result
skill2 = GameWorld.GetGameData().GetSkillBySkillID(curSkill.GetSkillEnhance2())
- if skill2:
+ if skill2 and GameWorld.CanHappen(skill2.GetHappenRate(), ChConfig.Def_MaxRateValue):
result = True if UsePassiveTriggerSkill(attacker, skill2, target, tick, True) else result
SkillCommon.SetSkillRemainTime(curSkill, PlayerControl.GetReduceSkillCDPer(attacker), tick, attacker)
@@ -3736,7 +3766,7 @@
GameWorld.DebugLog("释放被动触发技能 : %s- %s"%(skillAim, curSkill.GetSkillID()))
if skillAim == ChConfig.Def_UseSkillAim_None:
- if curSkill.GetSkillType() in ChConfig.Def_CanAttackSkill_List:
+ if curSkill.GetSkillType() in ChConfig.Def_CanAttackSkill_List and affectTag != ChConfig.Def_UseSkillTag_Self:
if target and target.GetGameObjType() == IPY_GameWorld.gotNPC and target.GetGameNPCObjType() == IPY_GameWorld.gnotSummon:
owner = NPCCommon.GetNpcObjOwnerDetail(target)
if owner and owner.GetID() == attacker.GetID():
--
Gitblit v1.8.0