Only show melee windup for yourself (#11626)

This commit is contained in:
metalgearsloth
2022-10-04 12:58:37 +11:00
committed by GitHub
parent 1943009292
commit 4de17892f1
2 changed files with 97 additions and 84 deletions

View File

@@ -40,7 +40,7 @@ public sealed partial class MeleeWeaponSystem : SharedMeleeWeaponSystem
{ {
base.Initialize(); base.Initialize();
InitializeEffect(); InitializeEffect();
_overlayManager.AddOverlay(new MeleeWindupOverlay(EntityManager, _timing, _protoManager, _cache)); _overlayManager.AddOverlay(new MeleeWindupOverlay(EntityManager, _timing, _player, _protoManager, _cache));
SubscribeNetworkEvent<DamageEffectEvent>(OnDamageEffect); SubscribeNetworkEvent<DamageEffectEvent>(OnDamageEffect);
SubscribeNetworkEvent<MeleeLungeEvent>(OnMeleeLunge); SubscribeNetworkEvent<MeleeLungeEvent>(OnMeleeLunge);
} }

View File

@@ -3,6 +3,7 @@ using Content.Client.Resources;
using Content.Shared.Weapons.Melee; using Content.Shared.Weapons.Melee;
using Robust.Client.GameObjects; using Robust.Client.GameObjects;
using Robust.Client.Graphics; using Robust.Client.Graphics;
using Robust.Client.Player;
using Robust.Client.ResourceManagement; using Robust.Client.ResourceManagement;
using Robust.Shared.Enums; using Robust.Shared.Enums;
using Robust.Shared.Prototypes; using Robust.Shared.Prototypes;
@@ -14,6 +15,8 @@ public sealed class MeleeWindupOverlay : Overlay
{ {
private readonly IEntityManager _entManager; private readonly IEntityManager _entManager;
private readonly IGameTiming _timing; private readonly IGameTiming _timing;
private readonly IPlayerManager _player;
private readonly SharedMeleeWeaponSystem _melee;
private readonly SharedTransformSystem _transform; private readonly SharedTransformSystem _transform;
public override OverlaySpace Space => OverlaySpace.WorldSpaceBelowFOV; public override OverlaySpace Space => OverlaySpace.WorldSpaceBelowFOV;
@@ -21,10 +24,12 @@ public sealed class MeleeWindupOverlay : Overlay
private readonly Texture _texture; private readonly Texture _texture;
private readonly ShaderInstance _shader; private readonly ShaderInstance _shader;
public MeleeWindupOverlay(IEntityManager entManager, IGameTiming timing, IPrototypeManager protoManager, IResourceCache cache) public MeleeWindupOverlay(IEntityManager entManager, IGameTiming timing, IPlayerManager playerManager, IPrototypeManager protoManager, IResourceCache cache)
{ {
_entManager = entManager; _entManager = entManager;
_timing = timing; _timing = timing;
_player = playerManager;
_melee = _entManager.EntitySysManager.GetEntitySystem<SharedMeleeWeaponSystem>();
_transform = _entManager.EntitySysManager.GetEntitySystem<SharedTransformSystem>(); _transform = _entManager.EntitySysManager.GetEntitySystem<SharedTransformSystem>();
_texture = cache.GetTexture("/Textures/Interface/Misc/progress_bar.rsi/icon.png"); _texture = cache.GetTexture("/Textures/Interface/Misc/progress_bar.rsi/icon.png");
_shader = protoManager.Index<ShaderPrototype>("unshaded").Instance(); _shader = protoManager.Index<ShaderPrototype>("unshaded").Instance();
@@ -32,12 +37,23 @@ public sealed class MeleeWindupOverlay : Overlay
protected override void Draw(in OverlayDrawArgs args) protected override void Draw(in OverlayDrawArgs args)
{ {
var owner = _player.LocalPlayer?.ControlledEntity;
if (!_entManager.TryGetComponent<TransformComponent>(owner, out var ownerXform) ||
ownerXform.MapID != args.MapId)
{
return;
}
var comp = _melee.GetWeapon(owner.Value);
if (comp == null)
return;
var handle = args.WorldHandle; var handle = args.WorldHandle;
var rotation = args.Viewport.Eye?.Rotation ?? Angle.Zero; var rotation = args.Viewport.Eye?.Rotation ?? Angle.Zero;
var spriteQuery = _entManager.GetEntityQuery<SpriteComponent>(); var spriteQuery = _entManager.GetEntityQuery<SpriteComponent>();
var xformQuery = _entManager.GetEntityQuery<TransformComponent>(); var xformQuery = _entManager.GetEntityQuery<TransformComponent>();
var tickTime = (float) _timing.TickPeriod.TotalSeconds;
var tickFraction = _timing.TickFraction / (float) ushort.MaxValue * tickTime;
// If you use the display UI scale then need to set max(1f, displayscale) because 0 is valid. // If you use the display UI scale then need to set max(1f, displayscale) because 0 is valid.
const float scale = 1f; const float scale = 1f;
@@ -46,18 +62,16 @@ public sealed class MeleeWindupOverlay : Overlay
handle.UseShader(_shader); handle.UseShader(_shader);
var currentTime = _timing.CurTime; var currentTime = _timing.CurTime;
foreach (var comp in _entManager.EntityQuery<MeleeWeaponComponent>(true))
{
if (comp.WindUpStart == null || if (comp.WindUpStart == null ||
comp.Attacking) comp.Attacking)
{ {
continue; return;
} }
if (!xformQuery.TryGetComponent(comp.Owner, out var xform) || if (!xformQuery.TryGetComponent(comp.Owner, out var xform) ||
xform.MapID != args.MapId) xform.MapID != args.MapId)
{ {
continue; return;
} }
var worldPosition = _transform.GetWorldPosition(xform); var worldPosition = _transform.GetWorldPosition(xform);
@@ -127,7 +141,6 @@ public sealed class MeleeWindupOverlay : Overlay
box = box.Translated(position); box = box.Translated(position);
handle.DrawRect(box, Color.White); handle.DrawRect(box, Color.White);
}
handle.UseShader(null); handle.UseShader(null);
handle.SetTransform(Matrix3.Identity); handle.SetTransform(Matrix3.Identity);