Arcade machine improvements (#24200)
* Give 'em something to talk about * Wire panel visuals * Wire graphics tweak * More ads and thanks * More ads for a noisy arcade * New screen for space villain machines * Implement EmitSoundIntervalComponent and a bunch of arcade noises * Require power for sounds * Allow earlier startup intervals * Orange glow * Audio attributions * Include the PR link * Replace EmitSoundInterval with expanded SpamEmitSound * Remove pacman-themed arcade sounds * Documentation good. * Updated methods to use Entity<T> * Refactored SpamEmitSound to get rid of accumulator and chance. * Fixed prewarm logic * Moved stuff to Shared * Fix outdated YAML * Better prediction, auto pause handling * Make enable/disable reset the timer instead of trying to save it.
This commit is contained in:
44
Content.Shared/Sound/Components/SpamEmitSoundComponent.cs
Normal file
44
Content.Shared/Sound/Components/SpamEmitSoundComponent.cs
Normal file
@@ -0,0 +1,44 @@
|
||||
using Robust.Shared.GameStates;
|
||||
|
||||
namespace Content.Shared.Sound.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Repeatedly plays a sound with a randomized delay.
|
||||
/// </summary>
|
||||
[RegisterComponent, NetworkedComponent]
|
||||
[AutoGenerateComponentState, AutoGenerateComponentPause]
|
||||
public sealed partial class SpamEmitSoundComponent : BaseEmitSoundComponent
|
||||
{
|
||||
/// <summary>
|
||||
/// The time at which the next sound will play.
|
||||
/// </summary>
|
||||
[DataField, AutoPausedField, AutoNetworkedField]
|
||||
public TimeSpan NextSound;
|
||||
|
||||
/// <summary>
|
||||
/// The minimum time in seconds between playing the sound.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public TimeSpan MinInterval = TimeSpan.FromSeconds(2);
|
||||
|
||||
/// <summary>
|
||||
/// The maximum time in seconds between playing the sound.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public TimeSpan MaxInterval = TimeSpan.FromSeconds(2);
|
||||
|
||||
// Always Pvs.
|
||||
/// <summary>
|
||||
/// Content of a popup message to display whenever the sound plays.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public LocId? PopUp;
|
||||
|
||||
/// <summary>
|
||||
/// Whether the timer is currently running and sounds are being played.
|
||||
/// Do not set this directly, use <see cref="EmitSoundSystem.SetEnabled"/>
|
||||
/// </summary>
|
||||
[DataField, AutoNetworkedField]
|
||||
[Access(typeof(SharedEmitSoundSystem))]
|
||||
public bool Enabled = true;
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
namespace Content.Shared.Sound.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Enables or disables an SpamEmitSound component depending
|
||||
/// on the powered state of the entity.
|
||||
/// </summary>
|
||||
[RegisterComponent]
|
||||
public sealed partial class SpamEmitSoundRequirePowerComponent : Component
|
||||
{
|
||||
}
|
||||
@@ -24,7 +24,7 @@ namespace Content.Shared.Sound;
|
||||
[UsedImplicitly]
|
||||
public abstract class SharedEmitSoundSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly IGameTiming _timing = default!;
|
||||
[Dependency] protected readonly IGameTiming Timing = default!;
|
||||
[Dependency] private readonly INetManager _netMan = default!;
|
||||
[Dependency] private readonly ITileDefinitionManager _tileDefMan = default!;
|
||||
[Dependency] protected readonly IRobustRandom Random = default!;
|
||||
@@ -124,7 +124,7 @@ public abstract class SharedEmitSoundSystem : EntitySystem
|
||||
!args.OtherFixture.Hard ||
|
||||
!TryComp<PhysicsComponent>(uid, out var physics) ||
|
||||
physics.LinearVelocity.Length() < component.MinimumVelocity ||
|
||||
_timing.CurTime < component.NextSound ||
|
||||
Timing.CurTime < component.NextSound ||
|
||||
MetaData(uid).EntityPaused)
|
||||
{
|
||||
return;
|
||||
@@ -136,7 +136,7 @@ public abstract class SharedEmitSoundSystem : EntitySystem
|
||||
|
||||
var fraction = MathF.Min(1f, (physics.LinearVelocity.Length() - component.MinimumVelocity) / MaxVolumeVelocity);
|
||||
var volume = MinVolume + (MaxVolume - MinVolume) * fraction;
|
||||
component.NextSound = _timing.CurTime + EmitSoundOnCollideComponent.CollideCooldown;
|
||||
component.NextSound = Timing.CurTime + EmitSoundOnCollideComponent.CollideCooldown;
|
||||
var sound = component.Sound;
|
||||
|
||||
if (_netMan.IsServer && sound != null)
|
||||
@@ -144,4 +144,8 @@ public abstract class SharedEmitSoundSystem : EntitySystem
|
||||
_audioSystem.PlayPvs(_audioSystem.GetSound(sound), uid, AudioParams.Default.WithVolume(volume));
|
||||
}
|
||||
}
|
||||
|
||||
public virtual void SetEnabled(Entity<SpamEmitSoundComponent?> entity, bool enabled)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace Content.Shared.Sound;
|
||||
|
||||
public abstract partial class SharedSpamEmitSoundRequirePowerSystem : EntitySystem
|
||||
{
|
||||
[Dependency] protected readonly SharedEmitSoundSystem EmitSound = default!;
|
||||
}
|
||||
Reference in New Issue
Block a user