using Continentis.MainGame; using Continentis.MainGame.Character; using SLSFramework.General; using UnityEngine; namespace Continentis.Mods.Basic.Buffs { public class Protecting : CharacterCombatBuffBase { public CharacterBase target; public Protected protectedBuff; public Protecting(CharacterBase target, int actionCount, Protected protectedBuff = null) { Initialize(BuffType.Neutral, BuffDispelLevel.DeathOnly, 100); this.target = target; this.protectedBuff = protectedBuff; if (this.protectedBuff == null) { Debug.LogError("Protecting buff requires a Protected buff on the target."); } this.contentSubmodule = new ContentSubmodule(this) .AddParameterGetter("Count", () => roundCountSubmodule.remainingCount.ToString()) .AddParameterGetter("Target", () => target.data.displayName);//TODO: 以后增加角色的ContentSubmodule this.iconSubmodule = new IconSubmodule(this).SetTextFunctions("Count"); this.roundCountSubmodule = new CountSubmodule(this, actionCount); this.eventSubmodule = new EventSubmodule(this); } public override bool OnBuffApply(out CharacterCombatBuffBase existingBuff) { MainGameManager.Instance.basePrefabs.GenerateInfoText(contentSubmodule.displayName, attachedCharacter.characterView); if (attachedCharacter.combatBuffSubmodule.TryGetBuff(out Protected conflictProtected)) { //如果目标已经有Protected Buff,则应当将其移除,以防止冲突. //使用移除所有保护者的方式来移除。 Debug.Log($"Conflicted Protected buff found, with {conflictProtected.protectingSources.Count} protecting sources. Removing all."); conflictProtected.protectingSources.For(ps => ps.Remove()); } if (FindExistingSameBuff(out existingBuff)) { Debug.Log("Existing same buff found."); Protecting existProtecting = existingBuff as Protecting; Debug.Log(existProtecting == null ? "Existing buff is not of type Protecting!" : "Existing Protecting buff found."); if (existProtecting.target == this.target) { existProtecting.roundCountSubmodule.AddCount(this.roundCountSubmodule.remainingCount); return false; } return true; //独立处理,直接返回true } this.protectedBuff ??= target.combatBuffSubmodule.GetBuff(); this.protectedBuff.protectingSources.Add(this); Debug.Log(protectedBuff.protectingSources.Count); return true; } public override void OnBuffRemove() { base.OnBuffRemove(); protectedBuff.protectingSources.Remove(this); if (protectedBuff.protectingSources.Count == 0) { protectedBuff.Remove(); } } } }