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);