mirror of
https://github.com/WWhiteDreamProject/wwdpublic.git
synced 2026-04-17 21:48:58 +03:00
# Description
I made this entirely on a whim to prove a point in the middle of a
conversation. I have not tested this code, but I'm confident that it
will work as advertised.
This refactors the public KickCamera function so that it no longer:
Divides by 1, divides by 1 again, multiplies by 1, normalizes a
vector(turning its A value to 1), and then divides said vector by 1
again for good measure.
Instead 1 has been replaced by MassContest, wooh! I also got rid of
redundant steps. The effect of this is that characters with greater than
human-standard mass are slightly more resistant to all sources of camera
shake(Explosions, gravity generator turning off, gunfire, being hit by
flying objects, etc), while characters with less than standard human
mass experience a greater amount of camera shake.
You're welcome. Now go find a Felinid to shake vigorously.
# Changelog
🆑
- add: Camera Shake is now affected by character mass. Small characters
experience more camera shake. Large characters experience less.
55 lines
1.5 KiB
C#
55 lines
1.5 KiB
C#
using System.Numerics;
|
|
using Content.Shared.Camera;
|
|
using Content.Shared.CCVar;
|
|
using Content.Shared.Contests;
|
|
using Robust.Shared.Configuration;
|
|
|
|
namespace Content.Client.Camera;
|
|
|
|
public sealed class CameraRecoilSystem : SharedCameraRecoilSystem
|
|
{
|
|
[Dependency] private readonly IConfigurationManager _configManager = default!;
|
|
[Dependency] private readonly ContestsSystem _contests = default!;
|
|
|
|
private float _intensity;
|
|
|
|
public override void Initialize()
|
|
{
|
|
base.Initialize();
|
|
SubscribeNetworkEvent<CameraKickEvent>(OnCameraKick);
|
|
|
|
Subs.CVar(_configManager, CCVars.ScreenShakeIntensity, OnCvarChanged, true);
|
|
}
|
|
|
|
private void OnCvarChanged(float value)
|
|
{
|
|
_intensity = value;
|
|
}
|
|
|
|
private void OnCameraKick(CameraKickEvent ev)
|
|
{
|
|
KickCamera(GetEntity(ev.NetEntity), ev.Recoil);
|
|
}
|
|
|
|
public override void KickCamera(EntityUid uid, Vector2 recoil, CameraRecoilComponent? component = null)
|
|
{
|
|
if (_intensity == 0)
|
|
return;
|
|
|
|
if (!Resolve(uid, ref component, false))
|
|
return;
|
|
|
|
var massRatio = _contests.MassContest(uid);
|
|
var maxRecoil = KickMagnitudeMax / massRatio;
|
|
recoil *= _intensity / massRatio;
|
|
|
|
var existing = component.CurrentKick.Length();
|
|
component.CurrentKick += recoil * (1 - existing);
|
|
|
|
if (component.CurrentKick.Length() > maxRecoil)
|
|
component.CurrentKick = component.CurrentKick.Normalized() * maxRecoil;
|
|
|
|
component.LastKickTime = 0;
|
|
}
|
|
}
|