From bc5f3f1c88d225109fa39a85b209ef13f5fb52a9 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 06 二月 2026 21:28:13 +0800
Subject: [PATCH] 66 【公会】基础主体-服务端(跨服公会所有基本功能支持、跨服砍价支持;修改查看目标公会、查看目标玩家方式;)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py | 98 ++++++++++++++++++++++++++++++++++++++----------
1 files changed, 77 insertions(+), 21 deletions(-)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
index 0fc0d02..c72aff2 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BattleObj.py
@@ -32,6 +32,8 @@
def __init__(self, batObj):
self._batObj = batObj
self._objID = batObj.GetID() if batObj else 0
+ self._skillIDList = [] # 已有技能ID列表,获取被动中快速判断已学技能用
+ self.noDeadSkill = None # 不死技能效果,暂时只支持最多1个这种技能
# 技能
self._AffectSkillDict = {} # 被动技能 {(触发方式, 有效来源):{技能ID:[effID, ...], ...}, ...}
@@ -56,9 +58,9 @@
'''
effList = []
- # 额外子技能的一般是未学习的技能,直接加载自身的被动效果
+ # 触发自己未学习的技能,直接加载自身的被动效果,如额外子技能等
if connSkill and not isinstance(connSkill, IpyGameDataPY.IPY_Skill) and self._objID == connSkill.GetObjID() \
- and connSkill.GetBatType() == ChConfig.TurnBattleType_Enhance:
+ and connSkill.GetSkillID() not in self._skillIDList:
skillID = connSkill.GetSkillID()
if skillID not in self._affectSkillEnhanceDict:
effDict = {}
@@ -81,15 +83,17 @@
key = (tWay, tSrc)
if key not in effDict:
- effDict[key] = {}
- effList = effDict[key]
- if effectID not in effList:
- effList.append(effList)
+ effDict[key] = []
+ effIDList = effDict[key]
+ if effectID not in effIDList:
+ effIDList.append(effectID)
self._affectSkillEnhanceDict[skillID] = effDict
+ GameWorld.DebugLogEx("加载未学技能被动: objID=%s,skillID=%s,%s", self._objID, skillID, effDict)
+ key = (triggerWay, ChConfig.TriggerSrc_SkillSelf)
effDict = self._affectSkillEnhanceDict[skillID]
- if triggerWay in effDict:
- effList.append(["skill", skillID, 0, effDict[triggerWay]])
+ if key in effDict:
+ effList.append(["skill", skillID, 0, effDict[key]])
if triggerWay not in self._skillTriggerWayList and triggerWay not in self._buffTriggerWayList:
return effList
@@ -143,6 +147,10 @@
curSkill = skillManager.GetSkillByIndex(index)
if not curSkill:
continue
+ skillID = curSkill.GetSkillID()
+ # 附加添加已学技能,用于判断是否自身技能
+ if skillID not in self._skillIDList:
+ self._skillIDList.append(skillID)
for index in xrange(curSkill.GetEffectCount()):
curEffect = curSkill.GetEffect(index)
effectID = curEffect.GetEffectID()
@@ -182,6 +190,11 @@
effDict[skillID].append(effectID)
if triggerWay not in self._skillTriggerWayList:
self._skillTriggerWayList.append(triggerWay)
+
+ # 加载不死技能效果
+ if triggerWay == ChConfig.TriggerWay_NoDead:
+ self.noDeadSkill = curSkill
+
return
def RefreshBuffPassiveEffect(self):
@@ -502,7 +515,7 @@
return
def GetBuffCount(self): return len(self._buffList)
- def GetBuffByIndex(self, index): return self._buffList[index]
+ def GetBuffByIndex(self, index): return self._buffList[index] if len(self._buffList) > index else None
def AddBuff(self, skillID):
buff = None
@@ -657,6 +670,7 @@
self._hurtListEx = [] # 额外伤血列表,如平摊、溅射 [HurtObj, ...]
self._bySkill = None # 由哪个技能触发的
self._byBuff = None # 由哪个buff触发的
+ self._byBatObj = None # 由哪个战斗对象触发的
self._byTriggerWay = 0 # 由哪个被动方式触发的
self._afterLogicList = [] # 技能释放后需要处理逻辑 [[logicType, logicParams], ...]
self._energy = 0 # 技能能量,一般用于累计能量达到某种条件后做逻辑
@@ -683,6 +697,7 @@
self._effIgnoreObjIDList = []
self._bySkill = None
self._byBuff = None
+ self._byBatObj = None
self._byTriggerWay = 0
self._afterLogicList = []
self.ClearHurtObj()
@@ -735,6 +750,8 @@
def SetBySkill(self, bySkill): self._bySkill = bySkill
def GetByBuff(self): return self._byBuff
def SetByBuff(self, byBuff): self._byBuff = byBuff
+ def GetByBatObj(self): return self._byBatObj
+ def SetByBatObj(self, byBatObj): self._byBatObj = byBatObj
def GetByTriggerWay(self): return self._byTriggerWay
def SetByTriggerWay(self, byTriggerWay): self._byTriggerWay = byTriggerWay
def GetTagObjList(self): return self._tagObjList # 技能主要目标列表
@@ -865,6 +882,12 @@
curSkill = PySkill(ipyData, self._batObj.GetID())
self._skillDict[skillID] = curSkill
self._skillList.append(curSkill)
+
+ learnSkillExEff = curSkill.GetEffectByID(ChConfig.SkillEff_LearnSkillEx)
+ if learnSkillExEff:
+ skillIDEx = learnSkillExEff.GetEffectValue(0)
+ if skillIDEx:
+ self.LearnSkillByID(skillIDEx)
return curSkill
def __deleteSkill(self, curSkill):
@@ -877,10 +900,10 @@
class BatObj():
## 战斗实体对象数据,目前与某个NPCObj绑定
- def __init__(self):
+ def __init__(self, objID):
self.tfGUID = "" # 所属的某场回合战斗的guid
self.ownerID = 0 # 所属玩家ID,可能为0,0代表非玩家的战斗实体
- self.objID = 0
+ self.objID = objID
self.objName = ""
self.npcID = 0
self.heroID = 0
@@ -896,9 +919,11 @@
self.faction = 0 # 所属阵营,一般只有双方阵营, 1 或 2,发起方默认1
self.lineupNum = 1 # 阵容位置编号,一般多V多时有用,通常默认1
self.posNum = 0 # 所在阵容站位
+ self._batLineup = None # 所属战斗阵容对象
self._hp = 0 # 当前生命值
self._xp = 0 # 当前怒气值
self._isAlive = True # 是否活着
+ self._killer = None # 被谁击杀的
self._initAttrDict = {} # 初始化时的属性,固定不变,初始化时已经算好的属性 {attrID:value, ...}
self._batAttrDict = {} # 实际战斗属性,包含buff层级的实际属性 {attrID:+-value, ...} value可能是负值
self._skillTempAttrDict = {} # 某次技能释放中临时的属性增减 {attrID:+-value, ...} value可能是负值
@@ -980,10 +1005,12 @@
def GetTFGUID(self): return self.tfGUID # 所属的某场战斗
def SetTFGUID(self, tfGUID): self.tfGUID = tfGUID
def GetTurnFight(self): return TurnAttack.GetTurnFightMgr().getTurnFight(self.tfGUID)
- def GetBatLineup(self):
- turnFight = self.GetTurnFight()
- batFaction = turnFight.getBatFaction(self.faction)
- return batFaction.getBatlineup(self.lineupNum)
+ def GetTFBatLineup(self):
+ if not self._batLineup:
+ turnFight = self.GetTurnFight()
+ batFaction = turnFight.getBatFaction(self.faction)
+ self._batLineup = batFaction.getBatlineup(self.lineupNum)
+ return self._batLineup
def GetOwnerID(self): return self.ownerID # 如果是玩家战斗单位,则该值非0,为所属玩家ID
def SetOwnerID(self, ownerID): self.ownerID = ownerID
def GetID(self): return self.objID
@@ -1016,15 +1043,31 @@
def GetPosNum(self): return self.posNum
def GetFaction(self): return self.faction
def SetFaction(self, faction): self.faction = faction
+ def GetBatObjType(self):
+ ## 战斗对象实例类型
+ if 1 <= self.posNum <= ShareDefine.LineupObjMax:
+ return ChConfig.BatObjType_BatHero
+ if self.posNum == ChConfig.TFPosNum_Mingge:
+ return ChConfig.BatObjType_Mingge
+ if ChConfig.TFPosNum_Lingshou <= self.posNum:
+ return ChConfig.BatObjType_Lingshou
+ return 0
def GetFightPower(self): return self.fightPower
def SetFightPower(self, fightPower): self.fightPower = fightPower
def GetLV(self): return self.lv
def SetLV(self, lv): self.lv = lv
def GetStar(self): return self._star
def SetStar(self, star): self._star = star
- def GetDictByKey(self, key): return self._kvDict.get(key, 0)
- def SetDict(self, key, value): self._kvDict[key] = value
-
+ def GetDictByKey(self, key):
+ if key in self._kvDict:
+ return self._kvDict[key]
+ return 0
+ def SetDict(self, key, value):
+ if not value:
+ self._kvDict.pop(key, None)
+ else:
+ self._kvDict[key] = value
+
def GetSkillManager(self): return self._skillMgr
def GetBuffManager(self):return self._buffMgr
def GetPassiveEffManager(self):return self._passiveEffMgr
@@ -1072,6 +1115,17 @@
return False
return True
+ def CanNoDead(self):
+ '''是否还可触发不死效果
+ 暂定单个武将最多只支持配置1个不死效果,且单场战斗最多触发x次,即按技能cd判断即可
+ '''
+ noDeadSkill = self._passiveEffMgr.noDeadSkill # 固定有被动触发
+ if not noDeadSkill:
+ return
+ if noDeadSkill.GetRemainTime():
+ return
+ return True
+
def GetSneerTagObj(self):
## 获取被嘲讽的目标,如果存在则一定是活着的目标
buffIDList = self._buffMgr.GetStateBuffIDList(ChConfig.BatObjState_Sneer)
@@ -1089,12 +1143,15 @@
# 战斗属性
def IsAlive(self): return self._isAlive # 是否活着
- def SetDead(self):
+ def SetDead(self, killer=None):
+ self._killer = killer
self._isAlive = False
self._hp = 0
def SetRevive(self, hp):
+ self._killer = None
self._isAlive = True
self._hp = hp
+ def GetKiller(self): return self._killer
def GetMaxHP(self): return int(self._batAttrDict.get(ChConfig.AttrID_MaxHP, 0))
def SetMaxHP(self, maxHP, isNotify=False):
maxHP = int(maxHP)
@@ -1236,8 +1293,7 @@
newObjID = self.__getNewObjID()
if not newObjID:
return newBatObj
- newBatObj = BatObj()
- newBatObj.objID = newObjID
+ newBatObj = BatObj(newObjID)
self.batObjDict[newObjID] = newBatObj
GameWorld.DebugLogEx("添加战斗单位: objID=%s", newObjID)
if False:
--
Gitblit v1.8.0