修复混战终局判断问题;添加更多治疗钩子

This commit is contained in:
milimoe 2026-01-17 01:25:35 +08:00
parent 44d5ffd3f7
commit 787b5a12e0
Signed by: milimoe
GPG Key ID: 9554D37E4B8991D0
3 changed files with 62 additions and 9 deletions

View File

@ -455,10 +455,10 @@ namespace Milimoe.FunGame.Core.Entity
/// <param name="character"></param>
/// <param name="hr"></param>
/// <param name="mr"></param>
/// <returns>返回 true 取消回复</returns>
/// <returns>返回 false 取消回复</returns>
public virtual bool BeforeApplyRecoveryAtTimeLapsing(Character character, ref double hr, ref double mr)
{
return false;
return true;
}
/// <summary>
@ -498,7 +498,20 @@ namespace Milimoe.FunGame.Core.Entity
}
/// <summary>
/// 在治疗结算前修改治疗值
/// 在治疗结算前触发
/// </summary>
/// <param name="actor"></param>
/// <param name="target"></param>
/// <param name="heal"></param>
/// <param name="canRespawn"></param>
/// <returns>返回 false 取消治疗</returns>
public virtual bool BeforeHealToTarget(Character actor, Character target, double heal, bool canRespawn)
{
return true;
}
/// <summary>
/// 在 <see cref="BeforeHealToTarget"/> 后、治疗结算前修改治疗值
/// </summary>
/// <param name="actor"></param>
/// <param name="target"></param>
@ -786,6 +799,19 @@ namespace Milimoe.FunGame.Core.Entity
return true;
}
/// <summary>
/// 当角色触发生命偷取前
/// </summary>
/// <param name="character"></param>
/// <param name="enemy"></param>
/// <param name="damage"></param>
/// <param name="steal"></param>
/// <returns>返回 false 取消生命偷取</returns>
public virtual bool BeforeLifesteal(Character character, Character enemy, double damage, double steal)
{
return true;
}
/// <summary>
/// 当角色触发生命偷取后
/// </summary>

View File

@ -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
/// <param name="assists"></param>
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<Effect> 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<Effect, double> totalHealBonus = [];
List<Effect> 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;

View File

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