mirror of
https://github.com/WWhiteDreamProject/wwdpublic.git
synced 2026-04-17 13:37:47 +03:00
# Description Port of https://github.com/WWhiteDreamProject/wwdpublic/pull/2 And now also https://github.com/WWhiteDreamProject/wwdpublic/pull/8 Because Lying Down System is dependent on the Telescope System. # TODO - [x] Reconcile the code with core code, do code cleanup. I'll undraft this when I'm done. Probably not going to be tonight, because I will have to get some sleep soon to get up early for my calculus classes. # Changelog 🆑 Spatison (White Dream) - add: Added lying down system / Добавлена система лежания - tweak: Lying down now uses do-afters that are visible to other people to indicate what is going on. - add: Added telescope system / Добавлена система прицеливания - tweak: Now you can aim from Hristov / Теперь можно прицеливаться из Христова --------- Signed-off-by: VMSolidus <evilexecutive@gmail.com> Co-authored-by: Spatison <137375981+Spatison@users.noreply.github.com> Co-authored-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> # Conflicts: # Content.Client/Input/ContentContexts.cs # Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs # Content.Shared/Input/ContentKeyFunctions.cs # Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml # Resources/keybinds.yml
111 lines
3.4 KiB
C#
111 lines
3.4 KiB
C#
using System.Numerics;
|
|
using Content.Shared.Camera;
|
|
using Content.Shared.Hands;
|
|
using Content.Shared.Hands.Components;
|
|
using Content.Shared.Item;
|
|
using Robust.Shared.Serialization;
|
|
|
|
namespace Content.Shared.Telescope;
|
|
|
|
public abstract class SharedTelescopeSystem : EntitySystem
|
|
{
|
|
[Dependency] private readonly SharedEyeSystem _eye = default!;
|
|
|
|
public override void Initialize()
|
|
{
|
|
base.Initialize();
|
|
|
|
SubscribeAllEvent<EyeOffsetChangedEvent>(OnEyeOffsetChanged);
|
|
SubscribeLocalEvent<TelescopeComponent, GotUnequippedHandEvent>(OnUnequip);
|
|
SubscribeLocalEvent<TelescopeComponent, HandDeselectedEvent>(OnHandDeselected);
|
|
SubscribeLocalEvent<TelescopeComponent, ComponentShutdown>(OnShutdown);
|
|
}
|
|
|
|
private void OnShutdown(Entity<TelescopeComponent> ent, ref ComponentShutdown args)
|
|
{
|
|
if (!TryComp(ent.Comp.LastEntity, out EyeComponent? eye)
|
|
|| ent.Comp.LastEntity == ent && TerminatingOrDeleted(ent))
|
|
return;
|
|
|
|
SetOffset((ent.Comp.LastEntity.Value, eye), Vector2.Zero, ent);
|
|
}
|
|
|
|
private void OnHandDeselected(Entity<TelescopeComponent> ent, ref HandDeselectedEvent args)
|
|
{
|
|
if (!TryComp(args.User, out EyeComponent? eye))
|
|
return;
|
|
|
|
SetOffset((args.User, eye), Vector2.Zero, ent);
|
|
}
|
|
|
|
private void OnUnequip(Entity<TelescopeComponent> ent, ref GotUnequippedHandEvent args)
|
|
{
|
|
if (!TryComp(args.User, out EyeComponent? eye)
|
|
|| !HasComp<ItemComponent>(ent.Owner))
|
|
return;
|
|
|
|
SetOffset((args.User, eye), Vector2.Zero, ent);
|
|
}
|
|
|
|
public TelescopeComponent? GetRightTelescope(EntityUid? ent)
|
|
{
|
|
TelescopeComponent? telescope = null;
|
|
|
|
if (TryComp<HandsComponent>(ent, out var hands)
|
|
&& hands.ActiveHandEntity.HasValue
|
|
&& TryComp<TelescopeComponent>(hands.ActiveHandEntity, out var handTelescope))
|
|
telescope = handTelescope;
|
|
else if (TryComp<TelescopeComponent>(ent, out var entityTelescope))
|
|
telescope = entityTelescope;
|
|
|
|
return telescope;
|
|
}
|
|
|
|
private void OnEyeOffsetChanged(EyeOffsetChangedEvent msg, EntitySessionEventArgs args)
|
|
{
|
|
if (args.SenderSession.AttachedEntity is not { } ent
|
|
|| !TryComp<EyeComponent>(ent, out var eye))
|
|
return;
|
|
|
|
var telescope = GetRightTelescope(ent);
|
|
|
|
if (telescope == null)
|
|
return;
|
|
|
|
var offset = Vector2.Lerp(eye.Offset, msg.Offset, telescope.LerpAmount);
|
|
|
|
SetOffset((ent, eye), offset, telescope);
|
|
}
|
|
|
|
private void SetOffset(Entity<EyeComponent> ent, Vector2 offset, TelescopeComponent telescope)
|
|
{
|
|
telescope.LastEntity = ent;
|
|
|
|
if (TryComp(ent, out CameraRecoilComponent? recoil))
|
|
{
|
|
recoil.BaseOffset = offset;
|
|
_eye.SetOffset(ent, offset + recoil.CurrentKick, ent);
|
|
}
|
|
else
|
|
{
|
|
_eye.SetOffset(ent, offset, ent);
|
|
}
|
|
}
|
|
|
|
public void SetParameters(Entity<TelescopeComponent> ent, float? divisor = null, float? lerpAmount = null)
|
|
{
|
|
var telescope = ent.Comp;
|
|
|
|
telescope.Divisor = divisor ?? telescope.Divisor;
|
|
telescope.LerpAmount = lerpAmount ?? telescope.LerpAmount;
|
|
|
|
Dirty(ent.Owner, telescope);
|
|
}
|
|
}
|
|
|
|
[Serializable, NetSerializable]
|
|
public sealed class EyeOffsetChangedEvent : EntityEventArgs
|
|
{
|
|
public Vector2 Offset;
|
|
}
|