From 05251cfca26ce5f044923793da7c97597413ed1b Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 13 八月 2025 19:18:54 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(主线掉落物品默认不堆叠;注:单个物品的个数可能大于1,单个战利品ID可能一次掉多个;)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py | 216 +++++++++--------------------------------------------
1 files changed, 38 insertions(+), 178 deletions(-)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
index 017176d..a6a329f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -129,12 +129,12 @@
return realmNPCIpyData.GetLV()
return curNPC.GetLV()
-def GetNPCDataEx(npcID):
- ## 获取NPC扩展数据表,可热更
- npcDataEx = IpyGameDataPY.GetIpyGameDataNotLog("NPCEx", npcID)
+def GetNPCDataPy(npcID):
+ ## 获取NPC数据表,py自定义的表,可热更
+ npcDataEx = IpyGameDataPY.GetIpyGameDataNotLog("NPC", npcID)
if not npcDataEx:
if False: # 不可能成立的条件,只为了 . 出代码提示
- npcDataEx = IpyGameDataPY.IPY_NPCEx()
+ npcDataEx = IpyGameDataPY.IPY_NPC()
return npcDataEx
return npcDataEx
@@ -142,11 +142,9 @@
def SetRealmLV(curNPC, realmLV): return curNPC.SetMAtkMin(realmLV) # NPC表中此字段含义改成境界等级
def GetIsLVSuppress(curNPC): return curNPC.GetWindDef() # 风防代表是否等级压制
def GetFightPowerLackAtkLimit(curNPC): # 战力不足限制攻击,默认不限制
- npcDataEx = GetNPCDataEx(curNPC.GetNPCID())
- return npcDataEx.GetFightPowerLackAtkLimit() if npcDataEx else 0
-def GetSuppressFightPower(curNPC):
- npcDataEx = GetNPCDataEx(curNPC.GetNPCID())
- return npcDataEx.GetSuppressFightPower() if npcDataEx else curNPC.GetThunderDef() # 雷防代表压制战力
+ return 0
+def GetSuppressFightPower(curNPC): # 压制战力
+ return 0
def SetSuppressFightPower(curNPC, value): return curNPC.SetThunderDef(min(value, ShareDefine.Def_UpperLimit_DWord))
def GetCommendFightPower(curNPC): return curNPC.GetFireDef() # 火防代表推荐战力
def GetDropOwnerType(curNPC): return curNPC.GetThunderAtk() # 雷攻代表掉落归属类型
@@ -232,7 +230,7 @@
if "LV" in npcFBAttrDict:
strengthenLV = npcFBAttrDict["LV"]
- attrDict = GetNPCStrengthenAttrDict(npcID, strengthenLV, strengthenPlayerCnt, strengthenIpyData)
+ attrDict = {} #GetNPCStrengthenAttrDict(npcID, strengthenLV, strengthenPlayerCnt, strengthenIpyData)
attrDict.update(npcFBAttrDict) # 如果副本有指定属性,则以副本为主
if not attrDict:
return
@@ -320,130 +318,6 @@
for skillID in skillIDList:
skillManager.LearnSkillByID(skillID)
return
-
-def GetNPCStrengthenAttrDict(npcID, strengthenLV=0, strengthenPlayerCnt=0, strengthenIpyData=None):
- if not strengthenLV and not strengthenPlayerCnt:
- return {}
- npcData = GameWorld.GetGameData().FindNPCDataByID(npcID)
- if not npcData:
- return {}
-
- attrStrengthenInfo = ReadChConfig.GetEvalChConfig("NPCAttrStrengthen")
- if not attrStrengthenInfo:
- return {}
-
- attrDict = {}
- paramDict = attrStrengthenInfo[NPCAttr_ParamDict] # 过程参数公式字典
- attrStrengthenDict = attrStrengthenInfo[NPCAttr_AttrStrengthenList] # 属性成长公式字典
- playerCntCoefficient = attrStrengthenInfo[NPCAttr_PlayerCntCoefficient] # 人数系数
- npcIDPlayerCntCoefficient = attrStrengthenInfo[NPCAttr_NPCPlayerCntCoefficient] # 特殊NPC人数系数
- baseMaxHP = GameObj.GetHP(npcData) # NPCData 没有提供Max接口,对应使用GetHP
-
- if strengthenLV:
- if not strengthenIpyData:
- strengthenIpyData = IpyGameDataPY.GetIpyGameDataNotLog("NPCStrengthen", npcID)
- if not strengthenIpyData:
- return {}
-
- playerCurLVIpyData = PlayerControl.GetPlayerLVIpyData(strengthenLV) # 取增强怪物等级对应此等级的玩家参考属性值
- if not playerCurLVIpyData:
- return {}
-
- # NPC表可用参数
- SkillAtkRate = GetSkillAtkRate(npcData) # 技能伤害
- FinalHurt = GetFinalHurt(npcData)
-
- # 参考玩家属性参数
- ReMaxHP = playerCurLVIpyData.GetReMaxHP() # 最大生命值
- ReAtk = playerCurLVIpyData.GetReAtk() # 攻击(最小、最大攻击)
- ReDef = playerCurLVIpyData.GetReDef() # 防御
- ReHit = playerCurLVIpyData.GetReHit() # 命中
- ReMiss = playerCurLVIpyData.GetReMiss() # 闪避
- ReAtkSpeed = playerCurLVIpyData.GetReAtkSpeed() # 攻击速度
- ReSkillAtkRate = playerCurLVIpyData.GetReSkillAtkRate() # 技能伤害比例
- ReDamagePer = playerCurLVIpyData.GetReDamagePer() # 增加伤害
- ReDamReduce = playerCurLVIpyData.GetReDamReduce() # 减少伤害
- ReIgnoreDefRate = playerCurLVIpyData.GetReIgnoreDefRate() # 无视防御比例
- ReLuckyHitRate = playerCurLVIpyData.GetReLuckyHitRate() # 会心一击率
- ReLuckyHit = playerCurLVIpyData.GetReLuckyHit() # 会心一击伤害
- ReBleedDamage = playerCurLVIpyData.GetReBleedDamage() # 流血伤害增加
- ReIceAtk = playerCurLVIpyData.GetReIceAtk() # 真实伤害
- ReIceDef = playerCurLVIpyData.GetReIceDef() # 真实抵御
- RePetAtk = playerCurLVIpyData.GetRePetAtk() # 灵宠攻击
- RePetSkillAtkRate = playerCurLVIpyData.GetRePetSkillAtkRate() # 灵宠技能
- RePetDamPer = playerCurLVIpyData.GetRePetDamPer() # 灵宠伤害增加
- ReFinalHurt = playerCurLVIpyData.GetReFinalHurt() # 固定伤害增加
- ReFinalHurtReduce = playerCurLVIpyData.GetReFinalHurtReduce() # 固定伤害减少
- RePotionReply = playerCurLVIpyData.GetRePotionReply() # 血瓶恢复量
- RePotionCD = playerCurLVIpyData.GetRePotionCD() # 血瓶CD
- ReFightPower = playerCurLVIpyData.GetReFightPower() # 战斗力
-
- # 增加NPC属性参数
- HitTime = strengthenIpyData.GetHitTime() # 怪物受击次数
- DefCoefficient = strengthenIpyData.GetDefCoefficient() # 人物防御系数
- AtkCoefficient = strengthenIpyData.GetAtkCoefficient() # 人物攻击系数
- AdjustCoefficient = strengthenIpyData.GetAdjustCoefficient() # 调整系数比例
- AtkInterval = strengthenIpyData.GetAtkInterval() # 怪物攻击间隔
- HitRate = strengthenIpyData.GetHitRate() # 对人物的命中率
- MissRate = strengthenIpyData.GetMissRate() # 对人物的闪避率
- MonterNum = strengthenIpyData.GetMonterNum() # 怪物数
- IceAtkCoefficient = strengthenIpyData.GetIceAtkCoefficient() # 元素攻击比例
- IceDefCoefficient = strengthenIpyData.GetIceDefCoefficient() # 元素抗性比例
- MaxEnduranceTime = strengthenIpyData.GetMaxEnduranceTime() # 玩家最大承受伤害时间
- FightPowerCoefficient = strengthenIpyData.GetFightPowerCoefficient() # 压制战斗力系数
-
- # 过程参数
- AtkReplyCoefficient = eval(FormulaControl.GetCompileFormula("NPCParam_AtkReplyCoefficient",
- paramDict["AtkReplyCoefficient"])) # 怪物攻击回复调整值
- MonterHurt = eval(FormulaControl.GetCompileFormula("NPCParam_MonterHurt", paramDict["MonterHurt"])) # 怪物固定伤害
- LostHPPerSecond = eval(FormulaControl.GetCompileFormula("NPCParam_LostHPPerSecond", paramDict["LostHPPerSecond"])) # 玩家每秒掉血量
- LVStrengthenMark = strengthenIpyData.GetLVStrengthenMark()
- attrStrengthenList = attrStrengthenDict.get(LVStrengthenMark, [])
- for attrKey, strengthenFormat in attrStrengthenList:
- strengthenValue = int(eval(FormulaControl.GetCompileFormula("NPCStrengthen_%s_%s" % (attrKey,LVStrengthenMark), strengthenFormat)))
- #GameWorld.DebugLog(" %s=%s" % (attrKey, strengthenValue))
- locals()[attrKey] = strengthenValue # 创建该属性局部变量作为参数提供给后面属性计算时用
- attrDict[attrKey] = strengthenValue
-
- # 当战力系数为0时,NPC战力默认为NPC表压制战力
- if FightPowerCoefficient:
- attrDict["FightPower"] = int(ReFightPower * FightPowerCoefficient / 10000.0)
-
- if strengthenPlayerCnt:
- mapID = GameWorld.GetMap().GetMapID()
- dataMapID = FBCommon.GetRecordMapID(mapID)
- formulaKey = "MapCoefficient_%s" % mapID
- playerCntAttrCoefficient = playerCntCoefficient.get(mapID, {})
- if not playerCntAttrCoefficient and dataMapID in playerCntCoefficient:
- playerCntAttrCoefficient = playerCntCoefficient[dataMapID]
- formulaKey = "MapCoefficient_%s" % dataMapID
- if npcID in npcIDPlayerCntCoefficient:
- playerCntAttrCoefficient = npcIDPlayerCntCoefficient[npcID]
- formulaKey = "NPCCoefficient_%s" % npcID
- for attrKey, coefficientDict in playerCntAttrCoefficient.items():
- if attrKey in attrDict:
- attrValue = attrDict[attrKey]
- elif attrKey == "MaxHP":
- attrValue = baseMaxHP
- else:
- attrFuncName = "Get%s" % attrKey
- if not hasattr(npcData, attrFuncName):
- continue
- attrValue = getattr(npcData, attrFuncName)()
- # 按字典配置
- if isinstance(coefficientDict, dict):
- coefficient = GameWorld.GetDictValueByRangeKey(coefficientDict, strengthenPlayerCnt, 1)
- # 按公式配置
- elif isinstance(coefficientDict, str):
- formulaKey = "%s_%s" % (formulaKey, attrKey)
- coefficient = eval(FormulaControl.GetCompileFormula(formulaKey, coefficientDict))
- else:
- coefficient = 1
- attrDict[attrKey] = int(attrValue * coefficient)
-
- #GameWorld.DebugLog("计算NPC属性成长: npcID=%s,strengthenLV=%s,strengthenPlayerCnt=%s,baseMaxHP=%s,attrDict=%s"
- # % (npcID, strengthenLV, strengthenPlayerCnt, baseMaxHP, attrDict))
- return attrDict
def GiveKillNPCDropPrize(curPlayer, mapID, npcCountDict, exp_rate=None, mailTypeKey=None, isMail=False,
extraItemList=[], prizeMultiple=1, dropItemMapInfo=[], curGrade=0, isVirtualDrop=False):
@@ -1248,19 +1122,18 @@
# C++设置npc死亡
notifyClient = True
- tfMgr = TurnAttack.GetTurnFightMgr()
- turnFight = tfMgr.getNPCTurnFight(objID)
- if turnFight:
- notifyClient = False # 回合制战斗的由py自己通知
- # //04 07 NPC消失#tagNPCDisappear 此处通知消失,与回合制死亡区分
- clientPack = ChNetSendPack.tagNPCDisappear()
- clientPack.NPCID = [objID]
- clientPack.Count = len(clientPack.NPCID)
- turnFight.addBatPack(clientPack)
+ #tfMgr = TurnAttack.GetTurnFightMgr()
+ #turnFight = tfMgr.getNPCTurnFight(objID)
+ #if turnFight:
+ # notifyClient = False # 回合制战斗的由py自己通知
+ # # //04 07 NPC消失#tagNPCDisappear 此处通知消失,与回合制死亡区分
+ # clientPack = ChNetSendPack.tagNPCDisappear()
+ # clientPack.NPCID = [objID]
+ # clientPack.Count = len(clientPack.NPCID)
+ # turnFight.addBatPack(clientPack)
curNPC.SetDead(curNPC.GetDictByKey(ChConfig.Def_NPCDead_Reason),
curNPC.GetDictByKey(ChConfig.Def_NPCDead_KillerType),
curNPC.GetDictByKey(ChConfig.Def_NPCDead_KillerID), notifyClient)
- tfMgr.delNPCGUID(objID)
return
def GameServer_KillGameWorldBoss(bossID, killPlayerName, hurtValue, isNotify=True, killerIDList=[]):
@@ -1836,8 +1709,8 @@
addAngry += useSkill.GetSkillAngry()
# 玩家攻击增加额外仇恨
- if objDetel.GetGameObjType() == IPY_GameWorld.gotPlayer:
- addAngry += PlayerControl.GetAddAngry(objDetel)
+ #if objDetel.GetGameObjType() == IPY_GameWorld.gotPlayer:
+ # addAngry += PlayerControl.GetAddAngry(objDetel)
self.AddObjToAngryList(objDetel, addAngry)
return
@@ -2568,13 +2441,13 @@
def __notifyAppear(self):
## //04 06 NPC出现#tagNPCAppear,可能也有 04 08 玩家召唤NPC出现#tagPlayerSummonNPCAppear,卡牌先简化,只使用0406
- curNPC = self.__Instance
- objID = curNPC.GetID()
- turnFight = TurnAttack.GetTurnFightMgr().getNPCTurnFight(objID)
- if not turnFight:
- # 非回合制怪保留原通知
- curNPC.NotifyAppear()
- return
+ #curNPC = self.__Instance
+ #objID = curNPC.GetID()
+ #turnFight = TurnAttack.GetTurnFightMgr().getNPCTurnFight(objID)
+ #if not turnFight:
+ # # 非回合制怪保留原通知
+ # curNPC.NotifyAppear()
+ # return
# 回合制怪不通知,统一由 // B4 24 回合战斗初始化 #tagSCTurnFightInit
return
@@ -2702,18 +2575,18 @@
heroAttrDict = {}
if lineupPlayerID:
heroAttrDict.update({
- ShareDefine.Def_Effect_Atk:500000000,
- ShareDefine.Def_Effect_Def:50000000,
- ShareDefine.Def_Effect_MaxHP:3000000000,
+ ChConfig.AttrID_Atk:500000000,
+ ChConfig.AttrID_Def:50000000,
+ ChConfig.AttrID_MaxHP:3000000000,
})
else:
- npcDataEx = GetNPCDataEx(curNPC.GetNPCID())
+ npcDataEx = GetNPCDataPy(curNPC.GetNPCID())
if not npcDataEx:
return
heroAttrDict.update({
- ShareDefine.Def_Effect_Atk:npcDataEx.GetAtk(),
- ShareDefine.Def_Effect_Def:npcDataEx.GetDef(),
- ShareDefine.Def_Effect_MaxHP:npcDataEx.GetMaxHP(),
+ ChConfig.AttrID_Atk:npcDataEx.GetAtk(),
+ ChConfig.AttrID_Def:npcDataEx.GetDef(),
+ ChConfig.AttrID_MaxHP:npcDataEx.GetMaxHP(),
})
GameWorld.DebugLog("heroAttrDict: ID:%s,NPCID:%s,%s" % (curNPC.GetID(), curNPC.GetNPCID(), heroAttrDict))
@@ -2722,23 +2595,10 @@
curNPC.ResetNPCBattleState()
# 设置属性
- curNPC.SetMinAtk(heroAttrDict.get(ShareDefine.Def_Effect_Atk, 1))
- curNPC.SetMaxAtk(heroAttrDict.get(ShareDefine.Def_Effect_Atk, 1))
- curNPC.SetDef(heroAttrDict.get(ShareDefine.Def_Effect_Def, 1))
- GameObj.SetMaxHP(curNPC, heroAttrDict.get(ShareDefine.Def_Effect_MaxHP, 1))
-
- #GameObj.SetMissRate(curNPC, npcDataEx.GetMissRate())
- #GameObj.SetMissDefRate(curNPC, npcDataEx.GetMissDefRate())
- #GameObj.SetSuperHitRate(curNPC, npcDataEx.GetSuperHitRate())
- #GameObj.SetSuperHitRateReduce(curNPC, npcDataEx.GetSuperHitRateReduce())
- #GameObj.SetFaintRate(curNPC, npcDataEx.GetFaintRate())
- #GameObj.SetFaintDefRate(curNPC, npcDataEx.GetFaintDefRate())
- #GameObj.SetComboRate(curNPC, npcDataEx.GetComboRate())
- #GameObj.SetComboDefRate(curNPC, npcDataEx.GetComboDefRate())
- #GameObj.SetAtkBackRate(curNPC, npcDataEx.GetAtkBackRate())
- #GameObj.SetAtkBackDefRate(curNPC, npcDataEx.GetAtkBackDefRate())
- #GameObj.SetSuckHPPer(curNPC, npcDataEx.GetSuckHPPer())
- #GameObj.SetSuckHPDefPer(curNPC, npcDataEx.GetSuckHPDefPer())
+ curNPC.SetMinAtk(heroAttrDict.get(ChConfig.AttrID_Atk, 1))
+ curNPC.SetMaxAtk(heroAttrDict.get(ChConfig.AttrID_Atk, 1))
+ curNPC.SetDef(heroAttrDict.get(ChConfig.AttrID_Def, 1))
+ GameObj.SetMaxHP(curNPC, heroAttrDict.get(ChConfig.AttrID_MaxHP, 1))
return
## 刷新NPC属性
@@ -3232,7 +3092,7 @@
PlayerVip.DoAddVIPKillLVExp(lastHurtPlayer, GetNPCLV(curNPC))
# SP值
- PlayerControl.AddZhenQiByKillNPC(lastHurtPlayer, curNPC.GetSP())
+ #PlayerControl.AddZhenQiByKillNPC(lastHurtPlayer, curNPC.GetSP())
return
#---------------------------------------------------------------------
--
Gitblit v1.8.0