From dc0b92c1e2fe9f3d24c183b325dad54d088735c1 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期四, 10 七月 2025 17:01:24 +0800 Subject: [PATCH] Merge branch 'master' of http://192.168.1.20:10010/r/Project_SG_ServerCode --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py | 199 +++++++++++++++++++++++++++++-------------------- 1 files changed, 116 insertions(+), 83 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py index 848d310..cc94e04 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/BaseAttack.py @@ -29,7 +29,6 @@ import BuffSkill import FBLogic import SkillShell -import EventShell import PetControl import random import OperControlManager @@ -40,8 +39,8 @@ import ChNetSendPack import NetPackCommon import PassiveBuffEffMng -import PlayerGeTui import IpyGameDataPY +import TurnAttack #--------------------------------------------------------------------- g_skillHurtList = IPY_GameWorld.IPY_HurtList() @@ -154,9 +153,6 @@ else: result = "NormalNPC" - elif npcObjType == IPY_GameWorld.gnotTruck: #骠车 - result = "Truck" - elif npcObjType == IPY_GameWorld.gnotPet: #宠物 result = "Pet" @@ -343,6 +339,8 @@ return False DoLogic_AttackResult(attacker, defender, useSkill, tick) + + TurnAttack.OnTurnfightAttackResult(attacker, defender, useSkill) return True #--------------------------------------------------------------------- @@ -363,7 +361,6 @@ if GameObj.GetHP(defender) <= 0: defender.SetDict(ChConfig.Def_NPCDead_KillerType, attacker.GetGameObjType()) defender.SetDict(ChConfig.Def_NPCDead_KillerID, attacker.GetID()) - #PlayerGeTui.TJGDead(defender, attacker.GetName()) if defender.GetGameObjType() == IPY_GameWorld.gotNPC: skillID = 0 if not useSkill else useSkill.GetSkillID() # 记录死亡原因 @@ -669,7 +666,7 @@ OnHurtTypeTriggerPassiveSkill(attacker, defender, curSkill, tick) DoLogic_AttackResult(attacker, defender, curSkill, tick) - + TurnAttack.OnTurnfightAttackResult(attacker, defender, curSkill) return True @@ -880,8 +877,9 @@ continue DoLogic_AttackResult(attacker, defObj, curSkill, tick) - - + + TurnAttack.OnTurnfightAttackResult(attacker, defender, curSkill) + return ## 执行群攻攻击 # @param attacker 攻击者实例 @@ -1371,6 +1369,9 @@ # @return None # @remarks 函数详细说明. def __Sync_AttackResult(attacker, defender, curSkill): + battleType = AttackCommon.GetBattleType(attacker, curSkill) + turnBattleType = attacker.GetDictByKey(ChConfig.Def_Obj_Dict_TurnBattleType) + battleType = turnBattleType * 10 + battleType # 通知的battle修改: 回合攻击战斗类型*10+原战斗类型 #普通攻击 if not curSkill: #GameWorld.Log("玩家普通攻击成功") @@ -1380,10 +1381,8 @@ g_skillHurtList.GetHurtCount())) else: curHurt = g_skillHurtList.GetHurtAt(0) - attacker.BaseAttack(curHurt.GetObjID(), curHurt.GetObjType(), - AttackCommon.GetBattleType(attacker, curSkill), - curHurt.GetAttackType(), curHurt.GetHurtHP(), curHurt.GetHurtHPEx(), curHurt.GetCurHP(), curHurt.GetCurHPEx()) - + PYView_BaseAttack(attacker, curHurt, battleType) + #//返回值无意义 return @@ -1392,7 +1391,7 @@ changeSkillID = PassiveBuffEffMng.GetPassiveSkillValueByTriggerTypeEx(attacker, None, curSkill, ChConfig.TriggerType_ChangeSkillEff) if changeSkillID: skillID = changeSkillID - battleType = AttackCommon.GetBattleType(attacker, curSkill) + #无目标类技能 if not defender: #玩家处理 @@ -1441,7 +1440,7 @@ # 为了客户端表现特殊处理,冲锋通知地板坐标而不是敌方坐标 if curSkill.GetAtkType() == 9: useSkillPosX, useSkillPosY = attacker.GetUseSkillPosX(), attacker.GetUseSkillPosY() - PYView_UseSkillPos(attacker, skillID, battleType, useSkillPosX, useSkillPosY, g_skillHurtList, False) + PYView_UseSkillPos(attacker, skillID, battleType, useSkillPosX, useSkillPosY, g_skillHurtList, False, defender) PYView_UseSkillPos_NotifySelf(attacker, skillID, battleType, useSkillPosX, useSkillPosY, g_skillHurtList) else: if attacker.GetDictByKey(ChConfig.Def_NPC_Dict_AtkMovePosX): @@ -1449,7 +1448,7 @@ useSkillPosY = attacker.GetDictByKey(ChConfig.Def_NPC_Dict_AtkMovePosY) # NPC没有C++View_UseSkillPos接口 - PYView_UseSkillPos(attacker, skillID, battleType, useSkillPosX, useSkillPosY, g_skillHurtList, False) + PYView_UseSkillPos(attacker, skillID, battleType, useSkillPosX, useSkillPosY, g_skillHurtList, False, defender) return @@ -1539,8 +1538,6 @@ if not IsSkipSkillCD(curPlayer, target, curSkill, tick): #设置玩家所学技能冷却CD SkillCommon.SetSkillRemainTime(curPlayerSkill, PlayerControl.GetReduceSkillCDPer(curPlayer), tick, curPlayer) - #调用任务触发器 - #EventShell.EventRespons_UseSkillOK(curPlayer, skillTypeID) #执行连环被动技能处理 #__DealWithPassivitySkill( curPlayer, target, curPlayerSkill, tick ) #执行被动buff @@ -1678,7 +1675,8 @@ if not curSkill or (curSkill.GetSkillType() == ChConfig.Def_SkillType_Atk and\ curSkill.GetFuncType() in [ChConfig.Def_SkillFuncType_FbSkill, ChConfig.Def_SkillFuncType_PetSkill, - ChConfig.Def_SkillFuncType_NormalAttack]): + ChConfig.Def_SkillFuncType_NormalAttack, + ChConfig.Def_SkillFuncType_TurnNormaAttack]): # 攻击减层级 优先处理,因为同个技能触发buff后,会再处理层级,导致立即减层级 PassiveBuffEffMng.OnPassiveBuffTrigger(attacker, defender, curSkill, ChConfig.TriggerType_Buff_AttackSubLayer, tick) @@ -1703,28 +1701,32 @@ # 属性击晕 def AttackFaintRate(attacker, defender, curSkill, tick): - if attacker.GetGameObjType() != IPY_GameWorld.gotPlayer: - return + #if attacker.GetGameObjType() != IPY_GameWorld.gotPlayer: + # return - faintRate = PlayerControl.GetFaintRate(attacker) + faintRate = GameObj.GetFaintRate(attacker) if not faintRate: #GameWorld.DebugLog("没有击晕概率!", attacker.GetID()) return - if curSkill: - useSkillData = attacker.GetUseSkill() - # 非主动性技能不触发 - if not useSkillData: - return - if useSkillData.GetSkillID() != curSkill.GetSkillID(): - return - - if not defender: - useSkillTagID = attacker.GetUseSkillTagID() - useSkillTagType = attacker.GetUseSkillTagType() - defender = GameWorld.GetObj(useSkillTagID, useSkillTagType) + if attacker.GetGameObjType() == IPY_GameWorld.gotPlayer: + if curSkill: + useSkillData = attacker.GetUseSkill() + # 非主动性技能不触发 + if not useSkillData: + return + if useSkillData.GetSkillID() != curSkill.GetSkillID(): + return + if not defender: - return + useSkillTagID = attacker.GetUseSkillTagID() + useSkillTagType = attacker.GetUseSkillTagType() + defender = GameWorld.GetObj(useSkillTagID, useSkillTagType) + if not defender: + return + + if not defender: + return if attacker.GetID() == defender.GetID(): return @@ -1732,11 +1734,11 @@ if GameObj.GetHP(defender) <= 0: return - tagFaintRate = PlayerControl.GetFaintDefRate(defender) if defender.GetGameObjType() == IPY_GameWorld.gotPlayer else 0 - + tagFaintDefRate = GameObj.GetFaintDefRate(defender) + # 添加最高60%击晕效果 maxRate = IpyGameDataPY.GetFuncCfg("PassiveSkillFaint", 1) - rate = min(max(faintRate - tagFaintRate, 0), maxRate) + rate = min(max(faintRate - tagFaintDefRate, 0), maxRate) if not GameWorld.CanHappen(rate): return @@ -1745,12 +1747,11 @@ lastTick = attacker.GetDictByKey(ChConfig.Def_PlayerKey_AttrFaintCD) remainTick = faintCD - (tick - lastTick) if remainTick > 0: - GameWorld.DebugLog("击晕CD中! rate=%s,剩余tick=%s" % (rate, remainTick), attacker.GetID()) + GameWorld.DebugLog(" 击晕CD中! rate=%s,剩余tick=%s,atkID=%s" % (rate, remainTick, attacker.GetID())) return attacker.SetDict(ChConfig.Def_PlayerKey_AttrFaintCD, tick) - GameWorld.DebugLog("触发击晕! rate=%s" % rate, attacker.GetID()) - - SkillCommon.AddBuffBySkillType(defender, ChConfig.Def_SkillID_AtkerFaint, tick) + GameWorld.DebugLog(" 可触发击晕! rate=%s,atkID=%s,defID=%s" % (rate, attacker.GetID(), defender.GetID())) + SkillCommon.AddBuffBySkillType(defender, ChConfig.Def_SkillID_AtkerFaint, tick, buffOwner=attacker) return @@ -1804,7 +1805,7 @@ # @param tick 当前时间 # @return None # @remarks 设置玩家属性消耗,如魔法,XP点,HP -def SetSkillLostAttr(curPlayer, curSkill, tick): +def SetSkillLostAttr(curObj, curSkill, tick): #=========================================================================== # #-----------扣魔法 # lostMPValue = curSkill.GetMP() @@ -1819,31 +1820,22 @@ # #自动回魔 # PlayerControl.PlayerAutoRestoreMP(curPlayer, tick) # - # #----------扣XP点 - # lostXPValue = curSkill.GetXP() - # curPlayerXP = curPlayer.GetXP() - # - # if curPlayerXP < lostXPValue: - # GameWorld.ErrLog('释放技能 = %s异常, XP点 = %s不足 = %s' % ( - # curSkill.GetSkillTypeID(), curPlayerXP, lostXPValue)) - # - # if lostXPValue > 0: - # remain = curPlayer.GetXP() - lostXPValue - # remain = max(0, remain) - # curPlayer.SetDict(ChConfig.Def_PlayerKey_RecordXPValue, remain) - # curPlayer.SetXP(remain) #=========================================================================== - + + #----------扣XP点 + #if SkillCommon.isXPSkill(curSkill): + # GameObj.SetXP(curObj, 0) + #----------扣HP点 - lostHPValue = curSkill.GetHP() - curPlayerHP = GameObj.GetHP(curPlayer) - - if curPlayerHP < lostHPValue: - GameWorld.ErrLog('释放技能 = %s异常, HP点 = %s不足 = %s' % ( - curSkill.GetSkillTypeID(), curPlayerHP, lostHPValue)) - - if lostHPValue > 0: - GameObj.SetHP(curPlayer, GameObj.GetHP(curPlayer) - lostHPValue) + #lostHPValue = curSkill.GetHP() + #curPlayerHP = GameObj.GetHP(curObj) + # + #if curPlayerHP < lostHPValue: + # GameWorld.ErrLog('释放技能 = %s异常, HP点 = %s不足 = %s' % ( + # curSkill.GetSkillTypeID(), curPlayerHP, lostHPValue)) + # + #if lostHPValue > 0: + # GameObj.SetHP(curObj, GameObj.GetHP(curObj) - lostHPValue) return @@ -1890,9 +1882,14 @@ #通知客户端攻击结果 __Sync_AttackResult(curNPC, target, curSkill) + TurnAttack.OnTurnfightAttackSuccess(curNPC, target, curSkill) + #技能使用成功 if curSkill: skillTypeID = curSkill.GetSkillTypeID() + + #扣属性,如魔法,XP点 + SetSkillLostAttr(curNPC, curSkill, tick) #技能使用成功 curNPCSkill = curNPC.GetSkillManager().FindSkillBySkillTypeID(skillTypeID) @@ -1930,9 +1927,7 @@ if curPlayer != None and GameObj.GetHP(curPlayer) > 0: if curSkill == None or curSkill.GetSkillType() not in ChConfig.Def_NoBattleState_List: AttackCommon.SetPlayerBattleState(curPlayer, tick) - - FBLogic.DoOverNPCAttackSuccess(curNPC, target, tick) - + # 灵为玩家的替身需要走此逻辑 UseSkillOver(curNPC, target, curSkill, tick) return True @@ -1996,10 +1991,6 @@ if GameObj.GetHP(curNPC) <= 0: return - #排除镖车 - if curNPC.GetGameNPCObjType() == IPY_GameWorld.gnotTruck: - return - #排除鹿 if curNPC.GetType() == IPY_GameWorld.ntDeer: return @@ -2060,10 +2051,6 @@ #攻击对象 curTag = GameWorld.GetObj(objID, curObjType) if not curTag: - continue - - #链式攻击不能对镖车释放 - if curObjType == IPY_GameWorld.gotNPC and curTag.GetGameNPCObjType() == IPY_GameWorld.gnotTruck: continue #具体判定对象是否可攻击 @@ -2244,10 +2231,6 @@ #攻击对象 curTag = GameWorld.GetObj(curObj.GetID(), curObjType) if not curTag: - continue - - #链式攻击不能对镖车释放 - if curObjType == IPY_GameWorld.gotNPC and curTag.GetGameNPCObjType() == IPY_GameWorld.gnotTruck: continue if __IsAlreadyAttack(curTag, resultList): @@ -2687,7 +2670,8 @@ continue DoLogic_AttackResult(attacker, defObj, curSkill, tick) - + + TurnAttack.OnTurnfightAttackResult(attacker, None, curSkill) return True @@ -2780,9 +2764,32 @@ PlayerControl.PyNotifyAll(curPlayer, sendPack, notifySelf=True, notifyCnt=-1) return +def PYView_BaseAttack(attacker, curHurt, battleType): + #attacker.BaseAttack(curHurt.GetObjID(), curHurt.GetObjType(), + # battleType, + # curHurt.GetAttackType(), curHurt.GetHurtHP(), curHurt.GetHurtHPEx(), curHurt.GetCurHP(), curHurt.GetCurHPEx()) + #ChangeAction(laNPCAttack); + sendPack = ChNetSendPack.tagObjBaseAttack() + sendPack.Clear() + sendPack.AttackerID = attacker.GetID() + sendPack.AttackerObjType = attacker.GetGameObjType() + sendPack.ObjID = curHurt.GetObjID() + sendPack.ObjType = curHurt.GetObjType() + sendPack.BattleType = battleType + sendPack.AttackType = curHurt.GetAttackType() + sendPack.Value = curHurt.GetHurtHP() + sendPack.ValueEx = curHurt.GetHurtHPEx() + sendPack.RemainHP = curHurt.GetCurHP() + sendPack.RemainHPEx = curHurt.GetCurHPEx() + turnFight = TurnAttack.GetTurnFightMgr().getNPCTurnFight(attacker.GetID()) + if turnFight: + turnFight.addBatPack(sendPack) + return + attacker.NotifyAll(sendPack.GetBuffer(), sendPack.GetLength()) + return # py重现View_UseSkillPos效果,对地通知,只用于玩家 -def PYView_UseSkillPos(attacker, skillID, battleType, useSkillPosX, useSkillPosY, skillHurtList, notifySelf): +def PYView_UseSkillPos(attacker, skillID, battleType, useSkillPosX, useSkillPosY, skillHurtList, notifySelf, defender=None): #=========================================================================== # C++ 此处代码PY已处理,暂不加入 # SetAttackTick(GetGameWorldManager()->GetTick()); @@ -2790,6 +2797,32 @@ # m_LastBattleTick = GetGameWorldManager()->GetTick(); #=========================================================================== + turnFight = TurnAttack.GetTurnFightMgr().getNPCTurnFight(attacker.GetID()) + if turnFight: + sendPack = ChNetSendPack.tagUseSkillAttack() + sendPack.ObjID = attacker.GetID() + sendPack.ObjType = attacker.GetGameObjType() + sendPack.BattleType = battleType + sendPack.SkillID = skillID + sendPack.AttackID = defender.GetID() if defender else 0 # 主攻击目标 + sendPack.AttackObjType = defender.GetGameObjType() if defender else 0 + + for i in range(skillHurtList.GetHurtCount()): + hurtObj = skillHurtList.GetHurtAt(i) + hurtList = ChNetSendPack.tagSkillHurtObj() + hurtList.ObjType = hurtObj.GetObjType() + hurtList.ObjID = hurtObj.GetObjID() + hurtList.AttackType = hurtObj.GetAttackType() + hurtList.HurtHP = hurtObj.GetHurtHP() + hurtList.HurtHPEx = hurtObj.GetHurtHPEx() + hurtList.CurHP = hurtObj.GetCurHP() + hurtList.CurHPEx = hurtObj.GetCurHPEx() + + sendPack.HurtList.append(hurtList) + sendPack.HurtCount = len(sendPack.HurtList) + turnFight.addBatPack(sendPack) + return + sendPack = ChNetSendPack.tagUseSkillPos() sendPack.Clear() sendPack.ObjID = attacker.GetID() -- Gitblit v1.8.0