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:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user