From 787b5a12e0ae3a8fdab60816d6f7e93582d97ee3 Mon Sep 17 00:00:00 2001 From: milimoe Date: Sat, 17 Jan 2026 01:25:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=B7=B7=E6=88=98=E7=BB=88?= =?UTF-8?q?=E5=B1=80=E5=88=A4=E6=96=AD=E9=97=AE=E9=A2=98=EF=BC=9B=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=9B=B4=E5=A4=9A=E6=B2=BB=E7=96=97=E9=92=A9=E5=AD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Entity/Skill/Effect.cs | 32 +++++++++++++++++++++++++++++--- Model/GamingQueue.cs | 37 ++++++++++++++++++++++++++++++++----- Model/MixGamingQueue.cs | 2 +- 3 files changed, 62 insertions(+), 9 deletions(-) diff --git a/Entity/Skill/Effect.cs b/Entity/Skill/Effect.cs index 834d988..43befac 100644 --- a/Entity/Skill/Effect.cs +++ b/Entity/Skill/Effect.cs @@ -455,10 +455,10 @@ namespace Milimoe.FunGame.Core.Entity /// /// /// - /// 返回 true 取消回复 + /// 返回 false 取消回复 public virtual bool BeforeApplyRecoveryAtTimeLapsing(Character character, ref double hr, ref double mr) { - return false; + return true; } /// @@ -498,7 +498,20 @@ namespace Milimoe.FunGame.Core.Entity } /// - /// 在治疗结算前修改治疗值 + /// 在治疗结算前触发 + /// + /// + /// + /// + /// + /// 返回 false 取消治疗 + public virtual bool BeforeHealToTarget(Character actor, Character target, double heal, bool canRespawn) + { + return true; + } + + /// + /// 在 后、治疗结算前修改治疗值 /// /// /// @@ -786,6 +799,19 @@ namespace Milimoe.FunGame.Core.Entity return true; } + /// + /// 当角色触发生命偷取前 + /// + /// + /// + /// + /// + /// 返回 false 取消生命偷取 + public virtual bool BeforeLifesteal(Character character, Character enemy, double damage, double steal) + { + return true; + } + /// /// 当角色触发生命偷取后 /// diff --git a/Model/GamingQueue.cs b/Model/GamingQueue.cs index 0566b06..7d8c05c 100644 --- a/Model/GamingQueue.cs +++ b/Model/GamingQueue.cs @@ -787,7 +787,7 @@ namespace Milimoe.FunGame.Core.Model Effect[] effects = [.. character.Effects]; foreach (Effect effect in effects) { - if (effect.BeforeApplyRecoveryAtTimeLapsing(character, ref reallyReHP, ref reallyReMP)) + if (!effect.BeforeApplyRecoveryAtTimeLapsing(character, ref reallyReHP, ref reallyReMP)) { allowRecovery = false; } @@ -1979,7 +1979,7 @@ namespace Milimoe.FunGame.Core.Model /// protected virtual void AfterDeathCalculation(Character death, Character? killer, Character[] assists) { - if (!_queue.Any(c => c != killer && c.Master != killer && killer?.Master != c)) + if (!_queue.Any(c => c != killer && (c.Master is null || c.Master != killer))) { // 没有其他的角色了,游戏结束 if (killer != null) @@ -2358,11 +2358,23 @@ namespace Milimoe.FunGame.Core.Model // 生命偷取 double steal = actualDamage * actor.Lifesteal; - HealToTarget(actor, actor, steal, false, true); + bool allowSteal = true; effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()]; foreach (Effect effect in effects) { - effect.AfterLifesteal(actor, enemy, damage, steal); + if (!effect.BeforeLifesteal(actor, enemy, damage, steal)) + { + allowSteal = false; + } + } + if (allowSteal) + { + HealToTarget(actor, actor, steal, false, true); + effects = [.. characters.SelectMany(c => c.Effects.Where(e => e.IsInEffect)).Distinct()]; + foreach (Effect effect in effects) + { + effect.AfterLifesteal(actor, enemy, damage, steal); + } } // 造成伤害和受伤都可以获得能量。护盾抵消的伤害不算 @@ -2681,13 +2693,28 @@ namespace Milimoe.FunGame.Core.Model return; } + bool allowHealing = true; + List effects = [.. actor.Effects.Union(target.Effects).Distinct().Where(e => e.IsInEffect)]; + foreach (Effect effect in effects) + { + if (!effect.BeforeHealToTarget(actor, target, heal, canRespawn)) + { + allowHealing = false; + } + } + + if (!allowHealing) + { + return; + } + bool isDead = target.HP <= 0; string healString = $"【{heal:0.##}(基础)"; if (triggerEffects) { Dictionary totalHealBonus = []; - List effects = [.. actor.Effects.Union(target.Effects).Distinct().Where(e => e.IsInEffect)]; + effects = [.. actor.Effects.Union(target.Effects).Distinct().Where(e => e.IsInEffect)]; foreach (Effect effect in effects) { bool changeCanRespawn = false; diff --git a/Model/MixGamingQueue.cs b/Model/MixGamingQueue.cs index 3e496bb..37176e1 100644 --- a/Model/MixGamingQueue.cs +++ b/Model/MixGamingQueue.cs @@ -23,7 +23,7 @@ namespace Milimoe.FunGame.Core.Model .Select(kv => $"[ {kv.Key} ] {kv.Value.Kills} 分"))}\r\n剩余存活人数:{_queue.Count}"); } - if (!_queue.Any(c => c != killer && c.Master != killer && killer?.Master != c && killer?.Master != c.Master)) + if (!_queue.Any(c => c != killer && (c.Master is null || c.Master != killer))) { // 没有其他的角色了,游戏结束 EndGameInfo(killer);