Make magical vision drain Mana (#1832)

* added generic Entity Effects status effect component

* added Magic Vision Statuseffect component

* renamed visionmask to Visibilitymask and added StatusEffectComponent notice comment

* added two event listeners on MagicVisonStatusEffect applied and removed

* moved changes to server side

* moved Component serverside

* removed Overlay Property

* Added magic vison status effect prototype and applying

* cleaned upnew lines

* added new prototype

* moved Magic vision status effect component to shared again

* fixed applying mask

* cleaned new lines

* Moved to components folder

* marked MagicVisionComponent obsolete and changed protoid name

* Added parent MobStatusEffectBase

* added mana cost to Magical vision spell

* removed unneeded constructor

* Added the system

* added statuseffect eventlistners for applied and removed also removed old event listners

* removed old magic vision component check

* Removed Data field attribute

* added back Data field attribute

* added access atribute

* moved Status effect update to server

* removed shared System moved all to server side

* Update Content.Shared/_CP14/StatusEffect/Components/CP14EntityEffectsStatusEffectComponent.cs

Co-authored-by: Red <96445749+TheShuEd@users.noreply.github.com>

* Fix typo in DataField attribute for Effects list

* Obliterated CP14MagicVisionComponent from existence

* Fix comment capitalization in CP14EntityEffectsStatusEffectComponent

* Fix summary capitalization in CP14EntityEffectsStatusEffectComponent

* Refactor CP14MagicVisionSystem.cs by removing blank lines

Removed unnecessary blank lines for cleaner code.

* Remove status effect event handlers

Removed event subscription and related methods for status effects.

* Remove empty line in OnExamined method

* Added a Spell toggle status effect

* fixed datfields shouldnt be static

* imlpemented status applying in yml

* cleaned white space :3

* changed toggle to has status effect

* fix leftover

* added check for firsttime predict so it doesnt get applied twice

* added getvismaskevent to statuseffect relay

* changed event lisnter to use CP14MagicVisionStatusEffectComponent to prevent future conflicts

* removed unneeded _status property

* added check for if its the last status effect on remove

* added check if Status effect is already present if applied

* changed check to component instead of entity

* changed ent target to player.localEntity

* fix: removed has effect check as it already has the effect when first apllied

* changed event to on player attached

* removed first time predicted check

* changed cooldown to 0.5 seconds

* made Spell mana change effect not save

* added status efect applied event listner back and moved apply and remove overlay to separete methods

* removed replaced action event

* added fix to let nextupdate catch up to CurTime

* fix: status effect not beeing removed when crit or dead

* fix: Action beeing able to be used while dead

* fix: added prediction check to applied back for double apply and remove bug

---------

Co-authored-by: Red <96445749+TheShuEd@users.noreply.github.com>
This commit is contained in:
kin98
2025-10-31 19:11:15 +01:00
committed by GitHub
parent ecd5bf3019
commit 0fdc56c796
12 changed files with 221 additions and 89 deletions

View File

@@ -1,6 +1,6 @@
using Content.Shared._CP14.MagicVision;
using Content.Shared.Eye;
using Robust.Shared.Timing;
using Content.Shared.StatusEffectNew;
namespace Content.Server._CP14.MagicVision;
@@ -13,26 +13,19 @@ public sealed class CP14MagicVisionSystem : CP14SharedMagicVisionSystem
{
base.Initialize();
SubscribeLocalEvent<MetaDataComponent, CP14MagicVisionToggleActionEvent>(OnMagicVisionToggle);
SubscribeLocalEvent<CP14MagicVisionComponent, GetVisMaskEvent>(OnGetVisMask);
SubscribeLocalEvent<CP14MagicVisionStatusEffectComponent, StatusEffectRelayedEvent<GetVisMaskEvent>>(OnGetVisMask);
SubscribeLocalEvent<CP14MagicVisionStatusEffectComponent, StatusEffectAppliedEvent>(OnApplied);
SubscribeLocalEvent<CP14MagicVisionStatusEffectComponent, StatusEffectRemovedEvent>(OnRemoved);
}
private void OnGetVisMask(Entity<CP14MagicVisionComponent> ent, ref GetVisMaskEvent args)
private void OnGetVisMask(Entity<CP14MagicVisionStatusEffectComponent> ent, ref StatusEffectRelayedEvent<GetVisMaskEvent> args)
{
args.VisibilityMask |= (int)VisibilityFlags.CP14MagicVision;
}
var appliedMask = (int)CP14MagicVisionStatusEffectComponent.VisibilityMask;
var newArgs = args.Args;
private void OnMagicVisionToggle(Entity<MetaDataComponent> ent, ref CP14MagicVisionToggleActionEvent args)
{
if (!HasComp<CP14MagicVisionComponent>(ent))
{
AddComp<CP14MagicVisionComponent>(ent);
}
else
{
RemComp<CP14MagicVisionComponent>(ent);
}
_eye.RefreshVisibilityMask(ent.Owner);
newArgs.VisibilityMask |= appliedMask;
args = args with { Args = newArgs };
}
public override void Update(float frameTime)
@@ -51,4 +44,14 @@ public sealed class CP14MagicVisionSystem : CP14SharedMagicVisionSystem
QueueDel(uid);
}
}
private void OnApplied(Entity<CP14MagicVisionStatusEffectComponent> ent, ref StatusEffectAppliedEvent args)
{
_eye.RefreshVisibilityMask(args.Target);
}
private void OnRemoved(Entity<CP14MagicVisionStatusEffectComponent> ent, ref StatusEffectRemovedEvent args)
{
_eye.RefreshVisibilityMask(args.Target);
}
}

View File

@@ -0,0 +1,38 @@
using Content.Shared._CP14.StatusEffect;
using Content.Shared.StatusEffectNew;
using Content.Shared.StatusEffectNew.Components;
using Robust.Shared.Timing;
namespace Content.Server._CP14.StatusEffect;
public sealed partial class CP14EntityEffectsStatusEffectSystem : EntitySystem
{
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly EntityManager _entityManager = default!;
public override void Update(float frameTime)
{
base.Update(frameTime);
var query = EntityQueryEnumerator<CP14EntityEffectsStatusEffectComponent, StatusEffectComponent>();
while (query.MoveNext(out var ent, out var entityEffect, out var statusEffect))
{
if (entityEffect.NextUpdateTime > _timing.CurTime)
continue;
if (statusEffect.AppliedTo is not EntityUid targetUid)
continue;
entityEffect.NextUpdateTime = _timing.CurTime + entityEffect.Frequency;
foreach (var effect in entityEffect.Effects)
{
//Apply Effect on target
effect.Effect(new(targetUid, _entityManager));
}
}
}
public override void Initialize()
{
base.Initialize();
}
}

View File

@@ -0,0 +1,29 @@
using Content.Shared.EntityEffects;
namespace Content.Server._CP14.StatusEffect;
/// <summary>
/// Applies Entity Effects at a given frequency
/// </summary>
[RegisterComponent, AutoGenerateComponentState, Access(typeof(CP14EntityEffectsStatusEffectSystem))]
public sealed partial class CP14EntityEffectsStatusEffectComponent : Component
{
/// <summary>
/// List of Effects that will be applied
/// </summary>
[DataField]
public List<EntityEffect> Effects = [];
/// <summary>
/// How often objects will try to apply <see cref="Effects"/>. In Seconds.
/// </summary>
[DataField]
public TimeSpan Frequency = TimeSpan.FromSeconds(5);
/// <summary>
/// The time of the next Effect trigger
/// </summary>
[DataField]
public TimeSpan NextUpdateTime { get; set; } = TimeSpan.Zero;
}