Files
crystall-punk-14/Content.Client/_CP14/MagicVision/CP14MagicVisionOverlay.cs
kin98 0fdc56c796 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>
2025-10-31 21:11:15 +03:00

83 lines
2.8 KiB
C#

using Content.Shared._CP14.MagicVision;
using Content.Shared.CCVar;
using Robust.Client.Graphics;
using Robust.Client.Player;
using Robust.Shared.Configuration;
using Robust.Shared.Enums;
using Robust.Shared.Prototypes;
using Robust.Shared.Timing;
namespace Content.Client._CP14.MagicVision;
public sealed class CP14MagicVisionOverlay : Overlay
{
[Dependency] private readonly IConfigurationManager _config = default!;
[Dependency] private readonly IEntityManager _entityManager = default!;
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly IPlayerManager _playerManager = default!;
[Dependency] private readonly IGameTiming _timing = default!;
public override OverlaySpace Space => OverlaySpace.WorldSpace;
public override bool RequestScreenTexture => true;
private readonly ShaderInstance _drowsinessShader;
public float CurrentPower = 10.0f;
public TimeSpan StartOverlay = TimeSpan.Zero; // when the overlay started
private const float PowerDivisor = 250.0f;
private float _intensity = 0.2f; // for adjusting the visual scale
private float _visualScale = 0; // between 0 and 1
public CP14MagicVisionOverlay()
{
IoCManager.InjectDependencies(this);
_drowsinessShader = _prototypeManager.Index<ShaderPrototype>("Drowsiness").InstanceUnique();
_config.OnValueChanged(CCVars.ReducedMotion, OnReducedMotionChanged, invokeImmediately: true);
}
protected override void FrameUpdate(FrameEventArgs args)
{
var playerEntity = _playerManager.LocalEntity;
if (playerEntity == null)
return;
var curTime = _timing.CurTime;
var timeLeft = (float)(curTime - StartOverlay).TotalSeconds;
CurrentPower = Math.Min(150f, 150f / Math.Max((float)timeLeft * 1.8f, 1.0f));
}
protected override bool BeforeDraw(in OverlayDrawArgs args)
{
if (!_entityManager.TryGetComponent(_playerManager.LocalEntity, out EyeComponent? eyeComp))
return false;
if (args.Viewport.Eye != eyeComp.Eye)
return false;
_visualScale = Math.Clamp(CurrentPower / PowerDivisor, 0.0f, 1.0f);
return _visualScale >= 0;
}
private void OnReducedMotionChanged(bool reducedMotion)
{
_intensity = reducedMotion ? 0f : 0.2f;
}
protected override void Draw(in OverlayDrawArgs args)
{
if (ScreenTexture == null)
return;
var handle = args.WorldHandle;
_drowsinessShader.SetParameter("SCREEN_TEXTURE", ScreenTexture);
_drowsinessShader.SetParameter("Strength", _visualScale * _intensity);
handle.UseShader(_drowsinessShader);
handle.DrawRect(args.WorldBounds, Color.White);
handle.UseShader(null);
}
}