From 9ec66731c8a551035958aebe1fa974a140b99cf1 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 02 七月 2025 17:34:10 +0800
Subject: [PATCH] 129 【战斗】战斗系统-服务端(初版战斗,支持基础的三维属性战斗,支持简单的普攻技能、怒气技能、回血技能;主线章节关卡过关支持;阵容保存支持多阵容;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py |  314 +++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 282 insertions(+), 32 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py
index 715dbb1..06009e9 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameObj.py
@@ -18,6 +18,8 @@
 import IpyGameDataPY
 import SkillCommon
 import PlayerControl
+import ChNetSendPack
+import TurnAttack
 
 # 关于血量的函数这里只包装最简单的超DWORD处理
 
@@ -35,7 +37,6 @@
     if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
         if isNotify == None:
             isNotify = True
-        gameObj.SetHP(value % ShareDefine.Def_PerPointValue, value / ShareDefine.Def_PerPointValue, isNotify)
     else:
         if isNotify == None:
             isNotify = False
@@ -44,17 +45,28 @@
             if IpyGameDataPY.GetIpyGameDataNotLog("NPCTimeLostHP", npcID) and not isByTime and value not in [GetMaxHP(gameObj), 0]:
                 #GameWorld.DebugLog("不能设置按时间掉血的怪物血量! id=%s,npciD=%s,value=%s,isByTime=%s" % (gameObj.GetID(), gameObj.GetNPCID(), value, isByTime))
                 return
-        gameObj.SetHP(value % ShareDefine.Def_PerPointValue, value / ShareDefine.Def_PerPointValue, isNotify)
+            
+    gameObj.SetHP(value % ShareDefine.Def_PerPointValue, value / ShareDefine.Def_PerPointValue, False)
+    if isNotify:
+        NotifyObjInfoRefresh(gameObj, IPY_GameWorld.CDBPlayerRefresh_HP, value)             
     return
 
-def SetHPFull(gameObj):
-    SetHP(gameObj, GetMaxHP(gameObj))
+def SetHPFull(gameObj, isNotify=True):
+    SetHP(gameObj, GetMaxHP(gameObj), isNotify)
     return
 
 def SetBaseMaxHP(gameObj, value):
     gameObj.SetBaseMaxHP(value % ShareDefine.Def_PerPointValue, value / ShareDefine.Def_PerPointValue)
     return
-    
+
+def GetXP(gameObj): return gameObj.GetDictByKey(ChConfig.Def_PlayerKey_AttrXP)
+def SetXP(gameObj, value, isNotify=True):
+    ## XP值,用作怒气值
+    gameObj.SetDict(ChConfig.Def_PlayerKey_AttrXP, value)
+    if isNotify:
+        NotifyObjInfoRefresh(gameObj, IPY_GameWorld.CDBPlayerRefresh_XP, value)
+    return
+
 def GetAngryValue(curAngry):
     return curAngry.GetAngryValue() + curAngry.GetAngryValueEx() * ShareDefine.Def_PerPointValue
 def SetAngryValue(curAngry, value):
@@ -152,13 +164,6 @@
     gameObj.SetDict(ChConfig.Def_PlayerKey_CurState, 0)
     return
 
-def GetPetDamPer(gameObj): return gameObj.GetDictByKey(ChConfig.Def_PlayerKey_AttrPetDamPer)
-def SetPetDamPer(gameObj, value): 
-    gameObj.SetDict(ChConfig.Def_PlayerKey_AttrPetDamPer, value)
-    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
-        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_PetDamPer, value)
-    return
-
 def GetLastHurtValue(gameObj):
     ## 最后一击伤害值
     hurt = gameObj.GetDictByKey(ChConfig.Def_PlayerKey_LastHurtValue)
@@ -167,6 +172,17 @@
 def SetLastHurtValue(gameObj, value):
     gameObj.SetDict(ChConfig.Def_PlayerKey_LastHurtValue, value % ShareDefine.Def_PerPointValue)
     gameObj.SetDict(ChConfig.Def_PlayerKey_LastHurtValueEx, value / ShareDefine.Def_PerPointValue)
+    return
+
+def GetLastBeHurtValue(gameObj):
+    ## 最后一次受伤值
+    return 0
+    #hurt = gameObj.GetDictByKey(ChConfig.Def_PlayerKey_LastBeHurtValue)
+    #hurtEx = gameObj.GetDictByKey(ChConfig.Def_PlayerKey_LastBeHurtValueEx)
+    #return hurtEx * ShareDefine.Def_PerPointValue + hurt
+def SetLastBeHurtValue(gameObj, value):
+    #gameObj.SetDict(ChConfig.Def_PlayerKey_LastBeHurtValue, value % ShareDefine.Def_PerPointValue)
+    #gameObj.SetDict(ChConfig.Def_PlayerKey_LastBeHurtValueEx, value / ShareDefine.Def_PerPointValue)
     return
 
 def GetBloodShiledHurt(gameObj):
@@ -179,28 +195,262 @@
     gameObj.SetDict(ChConfig.Def_PlayerKey_BloodShiledHurtEx, value / ShareDefine.Def_PerPointValue)
     return
 
-def GetSuperHitHurtPer(gameObj): return 0
-def SetSuperHitHurtPer(gameObj, value): return
-def GetSuperHitHurtDefPer(gameObj): return 0
-def SetSuperHitHurtDefPer(gameObj, value): return
+## ---------------------------------------------------------
+def ClearBattleEffect(gameObj):
+    gameObj.ClearBattleEffect()
+    # 其他py层自定义战斗属性,由于EffGetSet中不是所有属性接口均通用,固这里先手动调用
+    SetPetDamPer(gameObj, 0)
+    SetFinalHurtPer(gameObj, 0)
+    SetFinalHurtReducePer(gameObj, 0)
+    SetAtkSpeed(gameObj, 0)
+    SetSuperHitRateReduce(gameObj, 0)
+    SetSuperHitReduce(gameObj, 0)
+    SetFaintRate(gameObj, 0)
+    SetFaintDefRate(gameObj, 0)
+    SetComboRate(gameObj, 0)
+    SetComboDefRate(gameObj, 0)
+    SetComboDamPer(gameObj, 0)
+    SetAtkBackRate(gameObj, 0)
+    SetAtkBackDefRate(gameObj, 0)
+    SetSuckHPPer(gameObj, 0)
+    SetSuckHPDefPer(gameObj, 0)
+    SetAtkBackHP(gameObj, 0)
+    SetCurePer(gameObj, 0)
+    SetCureDefPer(gameObj, 0)
+    SetPetStrengthenPer(gameObj, 0)
+    SetPetWeakenPer(gameObj, 0)
+    SetDamageBackRate(gameObj, 0)
+    SetSuperHitHurtPer(gameObj, 0)
+    SetSuperHitHurtDefPer(gameObj, 0)
+    return
 
-def GetComboDefRate(gameObj): return 0
-def SetComboDefRate(gameObj, value): return
+def GetPetDamPer(gameObj): return gameObj.GetDictByKey(ChConfig.Def_PlayerKey_AttrPetDamPer)
+def SetPetDamPer(gameObj, value): 
+    gameObj.SetDict(ChConfig.Def_PlayerKey_AttrPetDamPer, value)
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_PetDamPer, value)
+    return
 
-def GetAtkBackRate(gameObj): return 0
-def SetAtkBackRate(gameObj, value): return
-def GetAtkBackDefRate(gameObj): return 0
-def SetAtkBackDefRate(gameObj, value): return
+def GetFinalHurtPer(gameObj): return gameObj.GetDictByKey(ChConfig.Def_PlayerKey_FinalHurtPer)
+def SetFinalHurtPer(gameObj, value):
+    ## 最终伤害百分比
+    gameObj.SetDict(ChConfig.Def_PlayerKey_FinalHurtPer, value)
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_FinalHurtPer, value)
+    return
 
-def GetSuckHPPer(gameObj): return 0
-def SetSuckHPPer(gameObj, value): return
-def GetSuckHPDefPer(gameObj): return 0
-def SetSuckHPDefPer(gameObj, value): return
+def GetFinalHurtReducePer(gameObj): return gameObj.GetDictByKey(ChConfig.Def_PlayerKey_FinalHurtReducePer)
+def SetFinalHurtReducePer(gameObj, value):
+    ## 最终伤害减免百分比
+    gameObj.SetDict(ChConfig.Def_PlayerKey_FinalHurtReducePer, value)
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_FinalHurtReducePer, value)
+    return
 
-def GetCureDefPer(gameObj): return 0
-def SetCureDefPer(gameObj, value): return
+def GetFaction(gameObj):
+    faction = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_Faction)
+    if faction:
+        return faction
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        return gameObj.GetFaction()
+    return gameObj.GetCountry()
+def SetFaction(gameObj, value):
+    gameObj.SetDict(ChConfig.Def_Obj_Dict_Faction, value)
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        gameObj.SetFaction(value)
+    return
 
-def GetPetStrengthenPer(gameObj): return 0
-def SetPetStrengthenPer(gameObj, value): return
-def GetPetWeakenPer(gameObj): return 0
-def SetPetWeakenPer(gameObj, value): return
+def GetAtkSpeed(gameObj):
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        return gameObj.GetBattleValEx1()
+    return gameObj.GetDictByKey(ChConfig.AttrName_AtkSpeed)
+def SetAtkSpeed(gameObj, value):
+    ## 攻击速度
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        gameObj.SetBattleValEx1(value, True)
+    else:
+        gameObj.SetDict(ChConfig.AttrName_AtkSpeed, value)
+    return
+
+def GetMissRate(gameObj): return gameObj.GetMiss()
+def SetMissRate(gameObj, value):
+    ## 闪避概率
+    gameObj.SetMiss(value)
+    return
+def GetMissDefRate(gameObj): return gameObj.GetHit()
+def SetMissDefRate(gameObj, value):
+    ## 抗闪避率 = 命中
+    gameObj.SetHit(value)
+    return
+def GetSuperHitRate(gameObj): return gameObj.GetSuperHitRate()
+def SetSuperHitRate(gameObj, value):
+    ## 暴击概率
+    gameObj.SetSuperHitRate(value)
+    return
+def GetSuperHitRateReduce(gameObj): return gameObj.GetDictByKey(ChConfig.Def_PlayerKey_SuperHitRateReduce)
+def SetSuperHitRateReduce(gameObj, value): 
+    ## 抗暴击概率
+    gameObj.SetDict(ChConfig.Def_PlayerKey_SuperHitRateReduce, value)
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_SuperHitRateReduce, value)
+    return
+
+def GetSuperHitReduce(gameObj): return gameObj.GetDictByKey(ChConfig.Def_PlayerKey_SuperHitReduce)
+def SetSuperHitReduce(gameObj, value):
+    ## 暴击固定伤害减免 - 暴击时附加固定伤害减免,与 atkObj.GetSuperHit() 相对
+    gameObj.SetDict(ChConfig.Def_PlayerKey_SuperHitReduce, value)
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_SuperHitReduce, value)
+    return
+
+def GetSuperHitHurtPer(gameObj): return gameObj.GetDictByKey(ChConfig.AttrName_SuperHitHurtPer)
+def SetSuperHitHurtPer(gameObj, value):
+    ## 强化暴伤 - 暴击时的总伤害加成,与 SuperHitHurtDefPer 相对,注意与暴击固定伤害区分
+    gameObj.SetDict(ChConfig.AttrName_SuperHitHurtPer, value)
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_SuperHitHurtPer, value)
+    return
+def GetSuperHitHurtDefPer(gameObj): return gameObj.GetDictByKey(ChConfig.AttrName_SuperHitHurtDefPer)
+def SetSuperHitHurtDefPer(gameObj, value):
+    ## 弱化暴伤 - 暴击时的总伤害减免
+    gameObj.SetDict(ChConfig.AttrName_SuperHitHurtDefPer, value)
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_SuperHitHurtDefPer, value)
+    return
+
+
+def GetFaintRate(gameObj): return gameObj.GetDictByKey(ChConfig.Def_PlayerKey_AttrFaintRate)
+def SetFaintRate(gameObj, value):
+    ## 击晕概率
+    gameObj.SetDict(ChConfig.Def_PlayerKey_AttrFaintRate, value)
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_FaintRate, value)
+    return
+def GetFaintDefRate(gameObj): return gameObj.GetDictByKey(ChConfig.Def_PlayerKey_AttrFaintDefRate)
+def SetFaintDefRate(gameObj, value):
+    ## 抗击晕概率
+    gameObj.SetDict(ChConfig.Def_PlayerKey_AttrFaintDefRate, value)
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_FaintDefRate, value)
+    return
+
+def GetComboRate(gameObj): return gameObj.GetDictByKey(ChConfig.Def_PlayerKey_AttrComboRate)
+def SetComboRate(gameObj, value):
+    ## 连击概率
+    gameObj.SetDict(ChConfig.Def_PlayerKey_AttrComboRate, value)
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_ComboRate, value)
+    return
+def GetComboDefRate(gameObj): return gameObj.GetDictByKey(ChConfig.AttrName_ComboDefRate)
+def SetComboDefRate(gameObj, value):
+    ## 抗连击概率
+    gameObj.SetDict(ChConfig.AttrName_ComboDefRate, value)
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_ComboDefRate, value)
+    return
+def GetComboDamPer(gameObj): return gameObj.GetDictByKey(ChConfig.Def_PlayerKey_AttrComboDamPer)
+def SetComboDamPer(gameObj, value):
+    ## 连击伤害
+    gameObj.SetDict(ChConfig.Def_PlayerKey_AttrComboDamPer, value)
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_ComboDamPer, value)
+    return
+
+def GetAtkBackRate(gameObj): return gameObj.GetDictByKey(ChConfig.AttrName_AtkBackRate)
+def SetAtkBackRate(gameObj, value):
+    ## 反击概率
+    gameObj.SetDict(ChConfig.AttrName_AtkBackRate, value)
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_AtkBackRate, value)
+    return
+def GetAtkBackDefRate(gameObj): return gameObj.GetDictByKey(ChConfig.AttrName_AtkBackDefRate)
+def SetAtkBackDefRate(gameObj, value):
+    ## 抗反击概率
+    gameObj.SetDict(ChConfig.AttrName_AtkBackDefRate, value)
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_AtkBackDefRate, value)
+    return
+
+def GetSuckHPPer(gameObj): return gameObj.GetDictByKey(ChConfig.AttrName_SuckHPPer)
+def SetSuckHPPer(gameObj, value):
+    ## 吸血比率
+    gameObj.SetDict(ChConfig.AttrName_SuckHPPer, value)
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_SuckHPPer, value)
+    return
+def GetSuckHPDefPer(gameObj): return gameObj.GetDictByKey(ChConfig.AttrName_SuckHPDefPer)
+def SetSuckHPDefPer(gameObj, value):
+    ## 抗吸血比率
+    gameObj.SetDict(ChConfig.AttrName_SuckHPDefPer, value)
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_SuckHPDefPer, value)
+    return
+def GetAtkBackHP(gameObj):
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        return gameObj.GetBattleValEx2()
+    return gameObj.GetDictByKey(ChConfig.AttrName_AtkBackHP)
+def SetAtkBackHP(gameObj, value):
+    ## 吸血固定值
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        gameObj.SetBattleValEx2(value)
+    else:
+        gameObj.SetDict(ChConfig.AttrName_AtkBackHP, value)
+    return
+
+def GetCurePer(gameObj): return gameObj.GetDictByKey(ChConfig.AttrName_CurePer)
+def SetCurePer(gameObj, value):
+    ## 强化治疗
+    gameObj.SetDict(ChConfig.AttrName_CurePer, value)
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_CurePer, value)
+    return
+def GetCureDefPer(gameObj): return gameObj.GetDictByKey(ChConfig.AttrName_CureDefPer)
+def SetCureDefPer(gameObj, value):
+    ## 弱化治疗
+    gameObj.SetDict(ChConfig.AttrName_CureDefPer, value)
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_CureDefPer, value)
+    return
+
+def GetPetStrengthenPer(gameObj): return gameObj.GetDictByKey(ChConfig.AttrName_PetStrengthenPer)
+def SetPetStrengthenPer(gameObj, value):
+    ## 强化灵兽
+    gameObj.SetDict(ChConfig.AttrName_PetStrengthenPer, value)
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_PetStrengthenPer, value)
+    return
+def GetPetWeakenPer(gameObj): return gameObj.GetDictByKey(ChConfig.AttrName_PetWeakenPer)
+def SetPetWeakenPer(gameObj, value):
+    ## 弱化灵兽
+    gameObj.SetDict(ChConfig.AttrName_PetWeakenPer, value)
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        PlayerControl.SendPropertyRefresh(gameObj, ShareDefine.CDBPlayerRefresh_PetWeakenPer, value)
+    return
+
+def GetDamageBackRate(gameObj):
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        return gameObj.GetDamageBackRate()
+    return gameObj.GetDictByKey(ChConfig.AttrName_DamBackPer)
+def SetDamageBackRate(gameObj, value):
+    ## 反弹伤害
+    if gameObj.GetGameObjType() == IPY_GameWorld.gotPlayer:
+        gameObj.SetDamageBackRate(value)
+    else:
+        gameObj.SetDict(ChConfig.AttrName_DamBackPer, value)
+    return
+
+def NotifyObjInfoRefresh(gameObj, refreshType, value):
+    ##0418通知对象属性刷新
+    sendPack = ChNetSendPack.tagObjInfoRefresh()
+    sendPack.Clear()
+    sendPack.ObjID = gameObj.GetID()
+    sendPack.ObjType = gameObj.GetGameObjType()
+    sendPack.RefreshType = refreshType
+    sendPack.Value = value % ShareDefine.Def_PerPointValue
+    sendPack.ValueEx = value / ShareDefine.Def_PerPointValue
+    turnFight = TurnAttack.GetTurnFightMgr().getNPCTurnFight(gameObj.GetID())
+    if turnFight:
+        turnFight.addBatPack(sendPack)
+        return
+    gameObj.NotifyAll(sendPack.GetBuffer(), sendPack.GetLength())
+    return

--
Gitblit v1.8.0