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();
InitializeEffect();
_overlayManager.AddOverlay(new MeleeWindupOverlay(EntityManager, _timing, _protoManager, _cache));
_overlayManager.AddOverlay(new MeleeWindupOverlay(EntityManager, _timing, _player, _protoManager, _cache));
SubscribeNetworkEvent<DamageEffectEvent>(OnDamageEffect);
SubscribeNetworkEvent<MeleeLungeEvent>(OnMeleeLunge);
}

View File

@@ -3,6 +3,7 @@ using Content.Client.Resources;
using Content.Shared.Weapons.Melee;
using Robust.Client.GameObjects;
using Robust.Client.Graphics;
using Robust.Client.Player;
using Robust.Client.ResourceManagement;
using Robust.Shared.Enums;
using Robust.Shared.Prototypes;
@@ -14,6 +15,8 @@ public sealed class MeleeWindupOverlay : Overlay
{
private readonly IEntityManager _entManager;
private readonly IGameTiming _timing;
private readonly IPlayerManager _player;
private readonly SharedMeleeWeaponSystem _melee;
private readonly SharedTransformSystem _transform;
public override OverlaySpace Space => OverlaySpace.WorldSpaceBelowFOV;
@@ -21,10 +24,12 @@ public sealed class MeleeWindupOverlay : Overlay
private readonly Texture _texture;
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;
_timing = timing;
_player = playerManager;
_melee = _entManager.EntitySysManager.GetEntitySystem<SharedMeleeWeaponSystem>();
_transform = _entManager.EntitySysManager.GetEntitySystem<SharedTransformSystem>();
_texture = cache.GetTexture("/Textures/Interface/Misc/progress_bar.rsi/icon.png");
_shader = protoManager.Index<ShaderPrototype>("unshaded").Instance();
@@ -32,12 +37,23 @@ public sealed class MeleeWindupOverlay : Overlay
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 rotation = args.Viewport.Eye?.Rotation ?? Angle.Zero;
var spriteQuery = _entManager.GetEntityQuery<SpriteComponent>();
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.
const float scale = 1f;
@@ -46,18 +62,16 @@ public sealed class MeleeWindupOverlay : Overlay
handle.UseShader(_shader);
var currentTime = _timing.CurTime;
foreach (var comp in _entManager.EntityQuery<MeleeWeaponComponent>(true))
{
if (comp.WindUpStart == null ||
comp.Attacking)
{
continue;
return;
}
if (!xformQuery.TryGetComponent(comp.Owner, out var xform) ||
xform.MapID != args.MapId)
{
continue;
return;
}
var worldPosition = _transform.GetWorldPosition(xform);
@@ -127,7 +141,6 @@ public sealed class MeleeWindupOverlay : Overlay
box = box.Translated(position);
handle.DrawRect(box, Color.White);
}
handle.UseShader(null);
handle.SetTransform(Matrix3.Identity);