Figures can now be activated remotely (#32769)

* First commit

* I'm silly

* weh

* will this work?

* Better design

* Fixes!

* rider :(

* L rider
This commit is contained in:
beck-thompson
2024-12-16 10:52:09 -08:00
committed by GitHub
parent 001b0edc7e
commit 74e9576e66
5 changed files with 114 additions and 105 deletions

View File

@@ -0,0 +1,17 @@
using Content.Shared.Dataset;
using Robust.Shared.Prototypes;
namespace Content.Server.Chat;
/// <summary>
/// Makes the entity speak when triggered. If the item has UseDelay component, the system will respect that cooldown.
/// </summary>
[RegisterComponent]
public sealed partial class SpeakOnTriggerComponent : Component
{
/// <summary>
/// The identifier for the dataset prototype containing messages to be spoken by this entity.
/// </summary>
[DataField(required: true)]
public ProtoId<LocalizedDatasetPrototype> Pack = string.Empty;
}

View File

@@ -1,18 +0,0 @@
using Content.Shared.Dataset;
using Robust.Shared.Prototypes;
namespace Content.Server.Chat;
/// <summary>
/// Entity will say the things when activated
/// </summary>
[RegisterComponent]
public sealed partial class SpeakOnUseComponent : Component
{
/// <summary>
/// The identifier for the dataset prototype containing messages to be spoken by this entity.
/// </summary>
[DataField(required: true)]
public ProtoId<LocalizedDatasetPrototype> Pack { get; private set; }
}

View File

@@ -0,0 +1,42 @@
using Content.Server.Explosion.EntitySystems;
using Content.Shared.Timing;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
namespace Content.Server.Chat.Systems;
public sealed class SpeakOnTriggerSystem : EntitySystem
{
[Dependency] private readonly UseDelaySystem _useDelay = default!;
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly ChatSystem _chat = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<SpeakOnTriggerComponent, TriggerEvent>(OnTrigger);
}
private void OnTrigger(Entity<SpeakOnTriggerComponent> ent, ref TriggerEvent args)
{
TrySpeak(ent);
args.Handled = true;
}
private void TrySpeak(Entity<SpeakOnTriggerComponent> ent)
{
// If it doesn't have the use delay component, still send the message.
if (TryComp<UseDelayComponent>(ent.Owner, out var useDelay) && _useDelay.IsDelayed((ent.Owner, useDelay)))
return;
if (!_prototypeManager.TryIndex(ent.Comp.Pack, out var messagePack))
return;
var message = Loc.GetString(_random.Pick(messagePack.Values));
_chat.TrySendInGameICMessage(ent.Owner, message, InGameICChatType.Speak, true);
if (useDelay != null)
_useDelay.TryResetDelay((ent.Owner, useDelay));
}
}

View File

@@ -1,42 +0,0 @@
using Content.Server.Chat;
using Content.Shared.Dataset;
using Content.Shared.Interaction.Events;
using Content.Shared.Timing;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
namespace Content.Server.Chat.Systems;
/// <summary>
/// Handles the speech on activating an entity
/// </summary>
public sealed partial class SpeakOnUIClosedSystem : EntitySystem
{
[Dependency] private readonly UseDelaySystem _useDelay = default!;
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly ChatSystem _chat = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<SpeakOnUseComponent, UseInHandEvent>(OnUseInHand);
}
public void OnUseInHand(EntityUid uid, SpeakOnUseComponent? component, UseInHandEvent args)
{
if (!Resolve(uid, ref component))
return;
// Yes it won't work without UseDelayComponent, but we don't want any kind of spam
if (!TryComp(uid, out UseDelayComponent? useDelay) || _useDelay.IsDelayed((uid, useDelay)))
return;
if (!_prototypeManager.TryIndex(component.Pack, out var messagePack))
return;
var message = Loc.GetString(_random.Pick(messagePack.Values));
_chat.TrySendInGameICMessage(uid, message, InGameICChatType.Speak, true);
_useDelay.TryResetDelay((uid, useDelay));
}
}

View File

@@ -19,8 +19,18 @@
- Figurine - Figurine
- type: UseDelay - type: UseDelay
delay: 10 delay: 10
- type: TriggerOnActivate
- type: TriggerOnSignal
- type: Speech - type: Speech
speechSounds: Pai # it just sounds better speechSounds: Pai # it just sounds better
- type: DeviceNetwork
deviceNetId: Wireless
receiveFrequencyId: BasicDevice
- type: WirelessNetworkConnection
range: 200
- type: DeviceLinkSink
ports:
- Trigger
- type: entity - type: entity
parent: BaseFigurine parent: BaseFigurine
@@ -30,7 +40,7 @@
components: components:
- type: Sprite - type: Sprite
state: hop state: hop
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesHoP pack: FigurinesHoP
- type: entity - type: entity
@@ -41,7 +51,7 @@
components: components:
- type: Sprite - type: Sprite
state: passenger state: passenger
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesPassenger pack: FigurinesPassenger
- type: entity - type: entity
@@ -52,7 +62,7 @@
components: components:
- type: Sprite - type: Sprite
state: passenger_greytide state: passenger_greytide
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesGreytider pack: FigurinesGreytider
- type: entity - type: entity
@@ -63,7 +73,7 @@
components: components:
- type: Sprite - type: Sprite
state: clown state: clown
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesClown pack: FigurinesClown
- type: entity - type: entity
@@ -74,7 +84,7 @@
components: components:
- type: Sprite - type: Sprite
state: holoclown state: holoclown
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesHoloClown pack: FigurinesHoloClown
- type: entity - type: entity
@@ -85,7 +95,7 @@
components: components:
- type: Sprite - type: Sprite
state: mime state: mime
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesMime pack: FigurinesMime
- type: entity - type: entity
@@ -96,7 +106,7 @@
components: components:
- type: Sprite - type: Sprite
state: musician state: musician
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesMusician pack: FigurinesMusician
- type: entity - type: entity
@@ -107,7 +117,7 @@
components: components:
- type: Sprite - type: Sprite
state: boxer state: boxer
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesBoxer pack: FigurinesBoxer
- type: entity - type: entity
@@ -118,7 +128,7 @@
components: components:
- type: Sprite - type: Sprite
state: captain state: captain
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesCaptain pack: FigurinesCaptain
- type: entity - type: entity
@@ -129,7 +139,7 @@
components: components:
- type: Sprite - type: Sprite
state: hos state: hos
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesHoS pack: FigurinesHoS
- type: entity - type: entity
@@ -140,7 +150,7 @@
components: components:
- type: Sprite - type: Sprite
state: warden state: warden
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesWarden pack: FigurinesWarden
- type: entity - type: entity
@@ -151,7 +161,7 @@
components: components:
- type: Sprite - type: Sprite
state: detective state: detective
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesDetective pack: FigurinesDetective
- type: entity - type: entity
@@ -162,7 +172,7 @@
components: components:
- type: Sprite - type: Sprite
state: security state: security
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesSecurity pack: FigurinesSecurity
- type: entity - type: entity
@@ -173,7 +183,7 @@
components: components:
- type: Sprite - type: Sprite
state: lawyer state: lawyer
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesLawyer pack: FigurinesLawyer
- type: entity - type: entity
@@ -184,7 +194,7 @@
components: components:
- type: Sprite - type: Sprite
state: cargotech state: cargotech
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesCargoTech pack: FigurinesCargoTech
- type: entity - type: entity
@@ -195,7 +205,7 @@
components: components:
- type: Sprite - type: Sprite
state: salvage state: salvage
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesSalvage pack: FigurinesSalvage
- type: entity - type: entity
@@ -206,7 +216,7 @@
components: components:
- type: Sprite - type: Sprite
state: qm state: qm
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesQM pack: FigurinesQM
- type: entity - type: entity
@@ -217,7 +227,7 @@
components: components:
- type: Sprite - type: Sprite
state: ce state: ce
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesCE pack: FigurinesCE
- type: entity - type: entity
@@ -228,7 +238,7 @@
components: components:
- type: Sprite - type: Sprite
state: engineer state: engineer
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesEngineer pack: FigurinesEngineer
- type: entity - type: entity
@@ -239,7 +249,7 @@
components: components:
- type: Sprite - type: Sprite
state: atmos state: atmos
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesAtmosTech pack: FigurinesAtmosTech
- type: entity - type: entity
@@ -250,7 +260,7 @@
components: components:
- type: Sprite - type: Sprite
state: rd state: rd
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesRD pack: FigurinesRD
- type: entity - type: entity
@@ -261,7 +271,7 @@
components: components:
- type: Sprite - type: Sprite
state: scientist state: scientist
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesScientist pack: FigurinesScientist
- type: entity - type: entity
@@ -272,7 +282,7 @@
components: components:
- type: Sprite - type: Sprite
state: cmo state: cmo
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesCMO pack: FigurinesCMO
- type: entity - type: entity
@@ -283,7 +293,7 @@
components: components:
- type: Sprite - type: Sprite
state: chemist state: chemist
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesChemist pack: FigurinesChemist
- type: entity - type: entity
@@ -294,7 +304,7 @@
components: components:
- type: Sprite - type: Sprite
state: paramedic state: paramedic
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesParamedic pack: FigurinesParamedic
- type: entity - type: entity
@@ -305,7 +315,7 @@
components: components:
- type: Sprite - type: Sprite
state: medical state: medical
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesDoctor pack: FigurinesDoctor
- type: entity - type: entity
@@ -316,7 +326,7 @@
components: components:
- type: Sprite - type: Sprite
state: librarian state: librarian
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesLibrarian pack: FigurinesLibrarian
- type: entity - type: entity
@@ -327,7 +337,7 @@
components: components:
- type: Sprite - type: Sprite
state: chaplain state: chaplain
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesChaplain pack: FigurinesChaplain
- type: entity - type: entity
@@ -338,7 +348,7 @@
components: components:
- type: Sprite - type: Sprite
state: chef state: chef
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesChef pack: FigurinesChef
- type: entity - type: entity
@@ -349,7 +359,7 @@
components: components:
- type: Sprite - type: Sprite
state: bartender state: bartender
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesBartender pack: FigurinesBartender
- type: entity - type: entity
@@ -360,7 +370,7 @@
components: components:
- type: Sprite - type: Sprite
state: botanist state: botanist
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesBotanist pack: FigurinesBotanist
- type: entity - type: entity
@@ -371,7 +381,7 @@
components: components:
- type: Sprite - type: Sprite
state: janitor state: janitor
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesJanitor pack: FigurinesJanitor
- type: entity - type: entity
@@ -382,7 +392,7 @@
components: components:
- type: Sprite - type: Sprite
state: nukie state: nukie
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesNukie pack: FigurinesNukie
- type: entity - type: entity
@@ -393,7 +403,7 @@
components: components:
- type: Sprite - type: Sprite
state: nukie_elite state: nukie_elite
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesNukieElite pack: FigurinesNukieElite
- type: entity - type: entity
@@ -404,7 +414,7 @@
components: components:
- type: Sprite - type: Sprite
state: nukie_commander state: nukie_commander
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesNukieCommander pack: FigurinesNukieCommander
- type: entity - type: entity
@@ -415,7 +425,7 @@
components: components:
- type: Sprite - type: Sprite
state: footsoldier state: footsoldier
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesFootsoldier pack: FigurinesFootsoldier
- type: entity - type: entity
@@ -426,7 +436,7 @@
components: components:
- type: Sprite - type: Sprite
state: wizard state: wizard
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesWizard pack: FigurinesWizard
- type: entity - type: entity
@@ -437,7 +447,7 @@
components: components:
- type: Sprite - type: Sprite
state: wizard_fake state: wizard_fake
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesWizard pack: FigurinesWizard
#Nonhuman Figurines #Nonhuman Figurines
@@ -450,7 +460,7 @@
components: components:
- type: Sprite - type: Sprite
state: spacedragon state: spacedragon
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesSpaceDragon pack: FigurinesSpaceDragon
- type: entity - type: entity
@@ -461,7 +471,7 @@
components: components:
- type: Sprite - type: Sprite
state: queen state: queen
# - type: SpeakOnUse # TODO add something # - type: SpeakOnTrigger # TODO add something
# pack: FigurinesQueen # pack: FigurinesQueen
- type: entity - type: entity
@@ -472,7 +482,7 @@
components: components:
- type: Sprite - type: Sprite
state: ratking state: ratking
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesRatKing pack: FigurinesRatKing
- type: entity - type: entity
@@ -483,7 +493,7 @@
components: components:
- type: Sprite - type: Sprite
state: ratservant state: ratservant
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesRatServant pack: FigurinesRatServant
- type: entity - type: entity
@@ -494,7 +504,7 @@
components: components:
- type: Sprite - type: Sprite
state: mouse state: mouse
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesMouse pack: FigurinesMouse
- type: entity - type: entity
@@ -505,7 +515,7 @@
components: components:
- type: Sprite - type: Sprite
state: slime state: slime
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesSlime pack: FigurinesSlime
- type: entity - type: entity
@@ -516,7 +526,7 @@
components: components:
- type: Sprite - type: Sprite
state: hamlet state: hamlet
- type: SpeakOnUse - type: SpeakOnTrigger
pack: FigurinesHamlet pack: FigurinesHamlet
#TODO: Convert these to the new figurine sprite template and rename their sprite name. #TODO: Convert these to the new figurine sprite template and rename their sprite name.