From f4b8882a2edfc86e5a3defae48436d7061588c6a Mon Sep 17 00:00:00 2001 From: milimoe Date: Thu, 22 Jan 2026 01:38:04 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E5=8A=A8=E4=BD=9C?= =?UTF-8?q?=E7=BB=93=E6=9D=9F=E5=90=8E=E7=9A=84=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 | 63 ++++++++++++++++++++++++++++++++++---- Model/GamingQueue.cs | 68 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 124 insertions(+), 7 deletions(-) diff --git a/Entity/Skill/Effect.cs b/Entity/Skill/Effect.cs index b99565f..5ecaf53 100644 --- a/Entity/Skill/Effect.cs +++ b/Entity/Skill/Effect.cs @@ -947,7 +947,7 @@ namespace Milimoe.FunGame.Core.Entity } /// - /// 在角色行动后触发 + /// 在角色行动后触发,注意这个钩子是广播队列所有角色 /// /// /// @@ -978,6 +978,61 @@ namespace Milimoe.FunGame.Core.Entity } + /// + /// 角色完成移动后 + /// + /// + /// + public virtual void AfterCharacterMove(Character character, Grid target) + { + + } + + /// + /// 角色完成普通攻击后 + /// + /// + /// + /// + public virtual void AfterCharacterNormalAttack(Character character, NormalAttack normalAttack, List targets) + { + + } + + /// + /// 角色开始吟唱后 + /// + /// + /// + /// + public virtual void AfterCharacterStartCasting(Character character, Skill skill, List targets) + { + + } + + /// + /// 角色释放技能后 + /// + /// + /// + /// + public virtual void AfterCharacterCastSkill(Character character, Skill skill, List targets) + { + + } + + /// + /// 角色使用物品后 + /// + /// + /// + /// + /// + public virtual void AfterCharacterUseItem(Character character, Item item, Skill skill, List targets) + { + + } + /// /// 对敌人造成技能伤害 [ 强烈建议使用此方法造成伤害而不是自行调用 ] /// @@ -994,10 +1049,8 @@ namespace Milimoe.FunGame.Core.Entity int changeCount = 0; DamageResult result = DamageResult.Normal; double damage = expectedDamage; - options ??= new(actor) - { - Skill = Skill - }; + options ??= new(actor); + options.Skill = Skill; if (options.ExpectedDamage == 0) options.ExpectedDamage = expectedDamage; if (options.NeedCalculate && damageType != DamageType.True) { diff --git a/Model/GamingQueue.cs b/Model/GamingQueue.cs index e2c6d30..d444c89 100644 --- a/Model/GamingQueue.cs +++ b/Model/GamingQueue.cs @@ -1395,6 +1395,13 @@ namespace Milimoe.FunGame.Core.Model OnCharacterNormalAttackEvent(character, dp, targets); character.NormalAttack.Attack(this, character, null, targets); + + effects = [.. character.Effects.Where(e => e.IsInEffect)]; + foreach (Effect effect in effects) + { + effect.AfterCharacterNormalAttack(character, character.NormalAttack, targets); + } + baseTime += character.NormalAttack.RealHardnessTime; effects = [.. character.Effects.Where(e => e.IsInEffect)]; foreach (Effect effect in effects) @@ -1485,6 +1492,12 @@ namespace Milimoe.FunGame.Core.Model baseTime += skill.RealCastTime; isCheckProtected = false; skill.OnSkillCasting(this, character, targets, grids); + + effects = [.. character.Effects.Where(e => e.IsInEffect)]; + foreach (Effect effect in effects) + { + effect.AfterCharacterStartCasting(character, skill, targets); + } } else { @@ -1554,6 +1567,13 @@ namespace Milimoe.FunGame.Core.Model OnCharacterPreCastSkillEvent(character, dp, skillTarget); skill.OnSkillCasting(this, character, targets, grids); + + effects = [.. character.Effects.Where(e => e.IsInEffect)]; + foreach (Effect effect in effects) + { + effect.AfterCharacterStartCasting(character, skill, targets); + } + skill.BeforeSkillCasted(); character.EP -= cost; @@ -1566,6 +1586,13 @@ namespace Milimoe.FunGame.Core.Model OnCharacterCastSkillEvent(character, dp, skillTarget, cost); skill.OnSkillCasted(this, character, targets, grids); + + effects = [.. character.Effects.Where(e => e.IsInEffect)]; + foreach (Effect effect in effects) + { + effect.AfterCharacterCastSkill(character, skill, targets); + } + effects = [.. character.Effects.Where(e => e.IsInEffect)]; foreach (Effect effect in effects) { @@ -1636,6 +1663,12 @@ namespace Milimoe.FunGame.Core.Model skill.OnSkillCasted(this, character, targets, grids); + effects = [.. character.Effects.Where(e => e.IsInEffect)]; + foreach (Effect effect in effects) + { + effect.AfterCharacterCastSkill(character, skill, targets); + } + effects = [.. character.Effects.Where(e => e.IsInEffect)]; foreach (Effect effect in effects) { @@ -1702,6 +1735,12 @@ namespace Milimoe.FunGame.Core.Model skill.OnSkillCasted(this, character, targets, grids); + effects = [.. character.Effects.Where(e => e.IsInEffect)]; + foreach (Effect effect in effects) + { + effect.AfterCharacterCastSkill(character, skill, targets); + } + effects = [.. character.Effects.Where(e => e.IsInEffect)]; foreach (Effect effect in effects) { @@ -1825,7 +1864,7 @@ namespace Milimoe.FunGame.Core.Model OnCharacterActionTakenEvent(character, dp, type, LastRound); - effects = [.. character.Effects.Where(e => e.IsInEffect)]; + effects = [.. _queue.Union([character]).SelectMany(c => c.Effects).Where(e => e.IsInEffect).Distinct()]; foreach (Effect effect in effects) { effect.OnCharacterActionTaken(character, dp, type); @@ -2769,8 +2808,9 @@ namespace Milimoe.FunGame.Core.Model } healStrings.Add($" = {heal:0.##} 点生命值"); + string healString = ""; if (!IsDebug) healStrings.Clear(); - string healString = $"【{string.Join("", healStrings)}】"; + else healString = $"【{string.Join("", healStrings)}】"; if (target.HP > 0 || (isDead && canRespawn)) { @@ -3043,6 +3083,13 @@ namespace Milimoe.FunGame.Core.Model OnCharacterUseItemEvent(character, dp, item, targets); skill.OnSkillCasting(this, character, targets, grids); + + Effect[] effects = [.. character.Effects.Where(e => e.IsInEffect)]; + foreach (Effect effect in effects) + { + effect.AfterCharacterStartCasting(character, skill, targets); + } + skill.BeforeSkillCasted(); skill.CurrentCD = skill.RealCD; @@ -3071,6 +3118,18 @@ namespace Milimoe.FunGame.Core.Model OnCharacterCastItemSkillEvent(character, dp, item, skillTarget, costMP, costEP); skill.OnSkillCasted(this, character, targets, grids); + + effects = [.. character.Effects.Where(e => e.IsInEffect)]; + foreach (Effect effect in effects) + { + effect.AfterCharacterCastSkill(character, skill, targets); + } + + effects = [.. character.Effects.Where(e => e.IsInEffect)]; + foreach (Effect effect in effects) + { + effect.AfterCharacterUseItem(character, item, skill, targets); + } return true; } } @@ -4045,6 +4104,11 @@ namespace Milimoe.FunGame.Core.Model AddCharacter(character, newHardnessTime, false); skill.OnSkillCasting(this, character, [], []); + Effect[] effects = [.. character.Effects.Where(e => e.IsInEffect)]; + foreach (Effect effect in effects) + { + effect.AfterCharacterStartCasting(character, skill, []); + } OnQueueUpdatedEvent(_queue, character, dp, 0, QueueUpdatedReason.PreCastSuperSkill, "设置角色预释放爆发技的硬直时间。"); } }