using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controls;
using Robust.Shared.Timing;
+using ItemToggleComponent = Content.Shared.Item.ItemToggle.Components.ItemToggleComponent;
namespace Content.Client.Tools.UI;
+++ /dev/null
-using Content.Shared.Weapons.Reflect;
-
-namespace Content.Client.Weapons.Reflect;
-
-public sealed class ReflectSystem : SharedReflectSystem
-{
-}
using Robust.Shared.Map;
using Robust.Shared.Map.Components;
using Robust.Shared.Maths;
+using ItemToggleComponent = Content.Shared.Item.ItemToggle.Components.ItemToggleComponent;
namespace Content.IntegrationTests.Tests.Interaction;
using Content.Shared.Database;
using Content.Shared.Interaction;
using Content.Shared.Tools.Components;
+using ItemToggleComponent = Content.Shared.Item.ItemToggle.Components.ItemToggleComponent;
namespace Content.Server.Damage.Systems
{
using Content.Shared.Eye.Blinding.Systems;
using Content.Shared.Tools.Components;
using Content.Shared.Item.ItemToggle;
+using Content.Shared.Item.ItemToggle.Components;
namespace Content.Server.Eye.Blinding.EyeProtection
{
{
base.Initialize();
SubscribeLocalEvent<RequiresEyeProtectionComponent, ToolUseAttemptEvent>(OnUseAttempt);
- SubscribeLocalEvent<RequiresEyeProtectionComponent, ItemToggleDoneEvent>(OnWelderToggled);
+ SubscribeLocalEvent<RequiresEyeProtectionComponent, ItemToggledEvent>(OnWelderToggled);
SubscribeLocalEvent<EyeProtectionComponent, GetEyeProtectionEvent>(OnGetProtection);
SubscribeLocalEvent<EyeProtectionComponent, InventoryRelayedEvent<GetEyeProtectionEvent>>(OnGetRelayedProtection);
_statusEffectsSystem.TryAddStatusEffect(args.User, TemporaryBlindnessSystem.BlindingStatusEffect,
statusTimeSpan, false, TemporaryBlindnessSystem.BlindingStatusEffect);
}
- private void OnWelderToggled(EntityUid uid, RequiresEyeProtectionComponent component, ItemToggleDoneEvent args)
+ private void OnWelderToggled(EntityUid uid, RequiresEyeProtectionComponent component, ItemToggledEvent args)
{
component.Toggled = _itemToggle.IsActivated(uid);
}
using Content.Server.CombatMode.Disarm;
using Content.Server.Kitchen.Components;
using Content.Shared.Item.ItemToggle;
+using Content.Shared.Item.ItemToggle.Components;
+using ItemToggleComponent = Content.Shared.Item.ItemToggle.Components.ItemToggleComponent;
namespace Content.Server.Item;
{
base.Initialize();
- SubscribeLocalEvent<ItemToggleComponent, ItemToggleDoneEvent>(Toggle);
+ SubscribeLocalEvent<ItemToggleComponent, ItemToggledEvent>(Toggle);
}
- private void Toggle(EntityUid uid, ItemToggleComponent comp, ref ItemToggleDoneEvent args)
+ private void Toggle(EntityUid uid, ItemToggleComponent comp, ref ItemToggledEvent args)
{
if (args.Activated == true)
{
if (TryComp<ItemComponent>(ent, out var item))
{
- _item.SetHeldPrefix(ent, "unlit", item);
+ _item.SetHeldPrefix(ent, "unlit", component: item);
}
break;
{
if (TryComp<ItemComponent>(ent, out var item))
{
- _item.SetHeldPrefix(ent, "lit", item);
+ _item.SetHeldPrefix(ent, "lit", component: item);
}
component.CurrentState = ExpendableLightState.Lit;
{
if (TryComp<ItemComponent>(uid, out var item))
{
- _item.SetHeldPrefix(uid, "unlit", item);
+ _item.SetHeldPrefix(uid, "unlit", component: item);
}
component.CurrentState = ExpendableLightState.BrandNew;
switch (component.CurrentState)
{
case SmokableState.Lit:
- _item.SetHeldPrefix(uid, "lit", item);
+ _item.SetHeldPrefix(uid, "lit", component: item);
break;
default:
- _item.SetHeldPrefix(uid, "unlit", item);
+ _item.SetHeldPrefix(uid, "unlit", component: item);
break;
}
}
using Content.Shared.Examine;
using Content.Shared.Item;
using Content.Shared.Item.ItemToggle;
+using Content.Shared.Item.ItemToggle.Components;
using Content.Shared.Popups;
using Content.Shared.Stunnable;
SubscribeLocalEvent<StunbatonComponent, SolutionContainerChangedEvent>(OnSolutionChange);
SubscribeLocalEvent<StunbatonComponent, StaminaDamageOnHitAttemptEvent>(OnStaminaHitAttempt);
SubscribeLocalEvent<StunbatonComponent, ItemToggleActivateAttemptEvent>(TryTurnOn);
- SubscribeLocalEvent<StunbatonComponent, ItemToggleDoneEvent>(ToggleDone);
+ SubscribeLocalEvent<StunbatonComponent, ItemToggledEvent>(ToggleDone);
}
private void OnStaminaHitAttempt(Entity<StunbatonComponent> entity, ref StaminaDamageOnHitAttemptEvent args)
args.PushMarkup(chargeMessage);
}
- private void ToggleDone(Entity<StunbatonComponent> entity, ref ItemToggleDoneEvent args)
+ private void ToggleDone(Entity<StunbatonComponent> entity, ref ItemToggledEvent args)
{
if (!TryComp<ItemComponent>(entity, out var item))
return;
- _item.SetHeldPrefix(entity.Owner, args.Activated ? "on" : "off", item);
+ _item.SetHeldPrefix(entity.Owner, args.Activated ? "on" : "off", component: item);
}
private void TryTurnOn(Entity<StunbatonComponent> entity, ref ItemToggleActivateAttemptEvent args)
using Content.Shared.Tools.Components;
using Robust.Shared.GameStates;
using System.Linq;
+using Content.Shared.Item.ItemToggle.Components;
namespace Content.Server.Tools
{
+++ /dev/null
-using Content.Shared.Item;
-using Content.Shared.Weapons.Reflect;
-
-namespace Content.Server.Weapons.Reflect;
-
-public sealed class ReflectSystem : SharedReflectSystem
-{
- public override void Initialize()
- {
- base.Initialize();
-
- SubscribeLocalEvent<ReflectComponent, ItemToggleReflectUpdateEvent>(ToggleReflect);
- }
-
- private void ToggleReflect(EntityUid uid, ReflectComponent comp, ref ItemToggleReflectUpdateEvent args)
- {
- comp.Enabled = args.Activated;
- Dirty(uid, comp);
- }
-}
namespace Content.Shared.Clothing.Components;
-[RegisterComponent, NetworkedComponent]
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
public sealed partial class LoadoutComponent : Component
{
/// <summary>
if (TryComp<ItemComponent>(uid, out var item))
{
- _item.SetHeldPrefix(uid, magboots.On ? "on" : null, item);
+ _item.SetHeldPrefix(uid, magboots.On ? "on" : null, component: item);
_clothing.SetEquippedPrefix(uid, magboots.On ? "on" : null);
}
+using Robust.Shared.GameStates;
+
namespace Content.Shared.ContainerHeld;
-[RegisterComponent]
+[RegisterComponent, NetworkedComponent]
public sealed partial class ContainerHeldComponent: Component
{
/// <summary>
private void OnContainerModified(EntityUid uid, ContainerHeldComponent comp, ContainerModifiedMessage args)
{
- if (!(TryComp<StorageComponent>(uid, out var storage)
+ if (!(HasComp<StorageComponent>(uid)
&& TryComp<AppearanceComponent>(uid, out var appearance)
&& TryComp<ItemComponent>(uid, out var item)))
{
}
if (_storage.GetCumulativeItemAreas(uid) >= comp.Threshold)
{
- _item.SetHeldPrefix(uid, "full", item);
+ _item.SetHeldPrefix(uid, "full", component: item);
_appearance.SetData(uid, ToggleVisuals.Toggled, true, appearance);
}
else
{
- _item.SetHeldPrefix(uid, "empty", item);
+ _item.SetHeldPrefix(uid, "empty", component: item);
_appearance.SetData(uid, ToggleVisuals.Toggled, false, appearance);
}
}
/// </summary>
[RegisterComponent]
[NetworkedComponent]
-[Access(typeof(SharedItemSystem))]
+[Access(typeof(SharedItemSystem)), AutoGenerateComponentState(true)]
public sealed partial class ItemComponent : Component
{
- [DataField, ViewVariables(VVAccess.ReadWrite)]
+ [DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
[Access(typeof(SharedItemSystem))]
public ProtoId<ItemSizePrototype> Size = "Small";
[Access(typeof(SharedItemSystem))]
[ViewVariables(VVAccess.ReadWrite)]
- [DataField]
+ [DataField, AutoNetworkedField]
public string? HeldPrefix;
/// <summary>
public float StoredRotation = 0;
}
-[Serializable, NetSerializable]
-public sealed class ItemComponentState : ComponentState
-{
- public ProtoId<ItemSizePrototype> Size { get; }
- public string? HeldPrefix { get; }
-
- public ItemComponentState(ProtoId<ItemSizePrototype> size, string? heldPrefix)
- {
- Size = size;
- HeldPrefix = heldPrefix;
- }
-}
-
/// <summary>
/// Raised when an item's visual state is changed. The event is directed at the entity that contains this item, so
/// that it can properly update its hands or inventory sprites and GUI.
using Robust.Shared.Audio;
using Robust.Shared.GameStates;
-namespace Content.Shared.Item;
+namespace Content.Shared.Item.ItemToggle.Components;
/// <summary>
/// Handles the active sound being played continuously with some items that are activated (ie e-sword hum).
/// </summary>
-[RegisterComponent, NetworkedComponent]
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
public sealed partial class ItemToggleActiveSoundComponent : Component
{
/// <summary>
- /// The continuous noise this item makes when it's activated (like an e-sword's hum). This loops.
+ /// The continuous noise this item makes when it's activated (like an e-sword's hum).
/// </summary>
[ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField]
public SoundSpecifier? ActiveSound;
/// <summary>
/// Used when the item emits sound while active.
/// </summary>
- [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField]
+ [ViewVariables(VVAccess.ReadWrite), DataField]
public EntityUid? PlayingStream;
}
-
-/// <summary>
-/// Raised in order to effect changes upon the ActiveSound of the entity.
-/// </summary>
-[ByRefEvent]
-public record struct ItemToggleActiveSoundUpdateEvent(bool Activated, bool Predicted, EntityUid? User)
-{
- public bool Activated = Activated;
- public bool Predicted = Predicted;
- public EntityUid? User = User;
-}
using Robust.Shared.Audio;
using Robust.Shared.GameStates;
-namespace Content.Shared.Item;
+namespace Content.Shared.Item.ItemToggle.Components;
/// <summary>
/// Handles generic item toggles, like a welder turning on and off, or an e-sword.
public record struct ItemToggleActivateAttemptEvent(EntityUid? User)
{
public bool Cancelled = false;
- public EntityUid? User = User;
+ public readonly EntityUid? User = User;
}
/// <summary>
public record struct ItemToggleDeactivateAttemptEvent(EntityUid? User)
{
public bool Cancelled = false;
- public EntityUid? User = User;
+ public readonly EntityUid? User = User;
}
/// <summary>
/// Raised directed on an entity any sort of toggle is complete.
/// </summary>
[ByRefEvent]
-public record struct ItemToggleDoneEvent(bool Activated, EntityUid? User)
+public readonly record struct ItemToggledEvent(bool Predicted, bool Activated, EntityUid? User)
{
- public bool Activated = Activated;
- public EntityUid? User = User;
+ public readonly bool Predicted = Predicted;
+ public readonly bool Activated = Activated;
+ public readonly EntityUid? User = User;
}
/// <summary>
-/// Raised in order to play a toggle sound effect.
+/// Raised directed on an entity when an itemtoggle is activated.
/// </summary>
[ByRefEvent]
-public record struct ItemTogglePlayToggleSoundEvent(bool Activated, bool Predicted, EntityUid? User)
+public readonly record struct ItemToggleActivatedEvent(EntityUid? User)
{
- public bool Activated = Activated;
- public bool Predicted = Predicted;
- public EntityUid? User = User;
+ public readonly EntityUid? User = User;
}
/// <summary>
-/// Raised in order to play a failure to toggle sound effect.
+/// Raised directed on an entity when an itemtoggle is deactivated.
/// </summary>
[ByRefEvent]
-public record struct ItemTogglePlayFailSoundEvent(bool Predicted, EntityUid? User)
+public readonly record struct ItemToggleDeactivatedEvent(EntityUid? User)
{
- public bool Predicted = Predicted;
- public EntityUid? User = User;
-}
-
-/// <summary>
-/// Raised in order to effect changes upon the Light component of the entity.
-/// </summary>
-[ByRefEvent]
-public record struct ItemToggleLightUpdateEvent(bool Activated)
-{
- public bool Activated = Activated;
-}
-
-/// <summary>
-/// Raised in order to effect changes upon the Appearance component of the entity.
-/// </summary>
-[ByRefEvent]
-public record struct ItemToggleAppearanceUpdateEvent(bool Activated)
-{
- public bool Activated = Activated;
-}
-
-/// <summary>
-/// Raised in order to effect changes upon the Reflect component of the entity.
-/// </summary>
-[ByRefEvent]
-public record struct ItemToggleReflectUpdateEvent(bool Activated)
-{
- public bool Activated = Activated;
+ public readonly EntityUid? User = User;
}
using Robust.Shared.GameStates;
-namespace Content.Shared.Item;
+namespace Content.Shared.Item.ItemToggle.Components;
/// <summary>
-/// Handles whether the item is hot when toggled on.
+/// Handles whether the item is hot when toggled on.
/// </summary>
-[RegisterComponent, NetworkedComponent]
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
public sealed partial class ItemToggleHotComponent : Component
{
/// <summary>
-using Robust.Shared.GameStates;
-using Robust.Shared.Audio;
using Content.Shared.Damage;
+using Robust.Shared.Audio;
+using Robust.Shared.GameStates;
-namespace Content.Shared.Item;
+namespace Content.Shared.Item.ItemToggle.Components;
/// <summary>
-/// Handles the changes to the melee weapon component when the item is toggled.
+/// Handles the changes to the melee weapon component when the item is toggled.
/// </summary>
/// <remarks>
/// You can change the damage, sound on hit, on swing, as well as hidden status while activated.
/// </remarks>
-[RegisterComponent, NetworkedComponent]
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
public sealed partial class ItemToggleMeleeWeaponComponent : Component
{
/// <summary>
[ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField]
public bool DeactivatedSecret = false;
}
-
-/// <summary>
-/// Raised in order to effect changes upon the MeleeWeaponComponent of the entity.
-/// </summary>
-[ByRefEvent]
-public record struct ItemToggleMeleeWeaponUpdateEvent(bool Activated)
-{
- public bool Activated = Activated;
-}
-
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
-namespace Content.Shared.Item;
+namespace Content.Shared.Item.ItemToggle.Components;
/// <summary>
-/// Handles the changes to the item size when toggled.
+/// Handles the changes to the item size when toggled.
/// </summary>
/// <remarks>
/// You can change the size when activated or not. By default the sizes are copied from the item.
/// </remarks>
-[RegisterComponent, NetworkedComponent]
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
public sealed partial class ItemToggleSizeComponent : Component
{
/// <summary>
[ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField]
public ProtoId<ItemSizePrototype>? DeactivatedSize = null;
}
-
-/// <summary>
-/// Raised in order to effect changes upon the MeleeWeaponComponent of the entity.
-/// </summary>
-[ByRefEvent]
-public record struct ItemToggleSizeUpdateEvent(bool Activated)
-{
- public bool Activated = Activated;
-}
using Content.Shared.Interaction.Events;
-using Content.Shared.Toggleable;
+using Content.Shared.Item.ItemToggle.Components;
using Content.Shared.Temperature;
+using Content.Shared.Toggleable;
using Content.Shared.Wieldable;
-using Content.Shared.Wieldable.Components;
using Robust.Shared.Audio;
using Robust.Shared.Audio.Systems;
-using Robust.Shared.Prototypes;
using Robust.Shared.Network;
namespace Content.Shared.Item.ItemToggle;
SubscribeLocalEvent<ItemToggleComponent, ItemUnwieldedEvent>(TurnOffonUnwielded);
SubscribeLocalEvent<ItemToggleComponent, ItemWieldedEvent>(TurnOnonWielded);
SubscribeLocalEvent<ItemToggleComponent, UseInHandEvent>(OnUseInHand);
+
SubscribeLocalEvent<ItemToggleHotComponent, IsHotEvent>(OnIsHotEvent);
- SubscribeLocalEvent<ItemToggleActiveSoundComponent, ItemToggleActiveSoundUpdateEvent>(UpdateActiveSound);
- SubscribeLocalEvent<AppearanceComponent, ItemToggleAppearanceUpdateEvent>(UpdateAppearance);
- SubscribeLocalEvent<ItemToggleComponent, ItemToggleLightUpdateEvent>(UpdateLight);
- SubscribeLocalEvent<ItemToggleComponent, ItemTogglePlayToggleSoundEvent>(PlayToggleSound);
- SubscribeLocalEvent<ItemToggleComponent, ItemTogglePlayFailSoundEvent>(PlayFailToggleSound);
+
+ SubscribeLocalEvent<ItemToggleActiveSoundComponent, ItemToggledEvent>(UpdateActiveSound);
}
private void OnUseInHand(EntityUid uid, ItemToggleComponent itemToggle, UseInHandEvent args)
}
/// <summary>
- /// Used when an item is attempted to be toggled.
+ /// Used when an item is attempted to be toggled.
/// </summary>
public void Toggle(EntityUid uid, EntityUid? user = null, bool predicted = true, ItemToggleComponent? itemToggle = null)
{
if (attempt.Cancelled)
{
- //Raises the event to play the failure to activate noise.
- var evPlayFailToggleSound = new ItemTogglePlayFailSoundEvent(Predicted: predicted, user);
- RaiseLocalEvent(uid, ref evPlayFailToggleSound);
+ if (predicted)
+ _audio.PlayPredicted(itemToggle.SoundFailToActivate, uid, user);
+ else
+ _audio.PlayPvs(itemToggle.SoundFailToActivate, uid);
return false;
}
if (predicted == false && _netManager.IsClient)
return true;
- Activate(uid, itemToggle);
-
- var evPlayToggleSound = new ItemTogglePlayToggleSoundEvent(Activated: true, Predicted: predicted, user);
- RaiseLocalEvent(uid, ref evPlayToggleSound);
-
- var evActiveSound = new ItemToggleActiveSoundUpdateEvent(Activated: true, Predicted: predicted, user);
- RaiseLocalEvent(uid, ref evActiveSound);
-
- var toggleUsed = new ItemToggleDoneEvent(Activated: true, user);
- RaiseLocalEvent(uid, ref toggleUsed);
+ Activate(uid, itemToggle, predicted, user);
return true;
}
if (predicted == false && _netManager.IsClient)
return true;
- Deactivate(uid, itemToggle);
+ Deactivate(uid, itemToggle, predicted, user);
+ return true;
+ }
- var evPlayToggleSound = new ItemTogglePlayToggleSoundEvent(Activated: false, Predicted: predicted, user);
- RaiseLocalEvent(uid, ref evPlayToggleSound);
+ private void Activate(EntityUid uid, ItemToggleComponent itemToggle, bool predicted, EntityUid? user = null)
+ {
+ // TODO: Fix this hardcoding
+ TryComp(uid, out AppearanceComponent? appearance);
+ _appearance.SetData(uid, ToggleableLightVisuals.Enabled, true, appearance);
+ _appearance.SetData(uid, ToggleVisuals.Toggled, true, appearance);
- var evActiveSound = new ItemToggleActiveSoundUpdateEvent(Activated: false, Predicted: predicted, user);
- RaiseLocalEvent(uid, ref evActiveSound);
+ if (_light.TryGetLight(uid, out var light))
+ {
+ _light.SetEnabled(uid, true, light);
+ }
- var toggleUsed = new ItemToggleDoneEvent(Activated: false, user);
- RaiseLocalEvent(uid, ref toggleUsed);
+ SoundSpecifier? soundToPlay = itemToggle.SoundActivate;
- return true;
- }
+ if (soundToPlay == null)
+ return;
- /// <summary>
- /// Used to make the actual changes to the item's components on activation.
- /// </summary>
- private void Activate(EntityUid uid, ItemToggleComponent itemToggle)
- {
- UpdateComponents(uid, itemToggle.Activated = true);
+ if (predicted)
+ _audio.PlayPredicted(soundToPlay, uid, user);
+ else
+ _audio.PlayPvs(soundToPlay, uid);
+
+ // END FIX HARDCODING
+
+ var toggleUsed = new ItemToggledEvent(predicted, Activated: true, user);
+ RaiseLocalEvent(uid, ref toggleUsed);
+
+ var activev = new ItemToggleActivatedEvent(user);
+ RaiseLocalEvent(uid, ref activev);
+ itemToggle.Activated = true;
Dirty(uid, itemToggle);
}
/// <summary>
/// Used to make the actual changes to the item's components on deactivation.
/// </summary>
- private void Deactivate(EntityUid uid, ItemToggleComponent itemToggle)
+ private void Deactivate(EntityUid uid, ItemToggleComponent itemToggle, bool predicted, EntityUid? user = null)
{
- UpdateComponents(uid, itemToggle.Activated = false);
+ // TODO: Fix this hardcoding
+ TryComp(uid, out AppearanceComponent? appearance);
+ _appearance.SetData(uid, ToggleableLightVisuals.Enabled, false, appearance);
+ _appearance.SetData(uid, ToggleVisuals.Toggled, false, appearance);
- Dirty(uid, itemToggle);
- }
+ if (_light.TryGetLight(uid, out var light))
+ {
+ _light.SetEnabled(uid, false, light);
+ }
- /// <summary>
- /// Used to raise events to update components on toggle.
- /// </summary>
- private void UpdateComponents(EntityUid uid, bool activated)
- {
- var evSize = new ItemToggleSizeUpdateEvent(activated);
- RaiseLocalEvent(uid, ref evSize);
+ var soundToPlay = itemToggle.SoundDeactivate;
+
+ if (predicted)
+ _audio.PlayPredicted(soundToPlay, uid, user);
+ else
+ _audio.PlayPvs(soundToPlay, uid);
- var evMelee = new ItemToggleMeleeWeaponUpdateEvent(activated);
- RaiseLocalEvent(uid, ref evMelee);
+ // END FIX HARDCODING
- var evAppearance = new ItemToggleAppearanceUpdateEvent(activated);
- RaiseLocalEvent(uid, ref evAppearance);
+ var toggleUsed = new ItemToggledEvent(predicted, Activated: false, user);
+ RaiseLocalEvent(uid, ref toggleUsed);
- var evLight = new ItemToggleLightUpdateEvent(activated);
- RaiseLocalEvent(uid, ref evLight);
+ var activev = new ItemToggleDeactivatedEvent(user);
+ RaiseLocalEvent(uid, ref activev);
- var evReflect = new ItemToggleReflectUpdateEvent(activated);
- RaiseLocalEvent(uid, ref evReflect);
+ itemToggle.Activated = false;
+ Dirty(uid, itemToggle);
}
/// <summary>
args.IsHot = IsActivated(uid);
}
- /// <summary>
- /// Used to update item appearance.
- /// </summary>
- private void UpdateAppearance(EntityUid uid, AppearanceComponent appearance, ref ItemToggleAppearanceUpdateEvent args)
- {
- _appearance.SetData(uid, ToggleableLightVisuals.Enabled, args.Activated, appearance);
- _appearance.SetData(uid, ToggleVisuals.Toggled, args.Activated, appearance);
- }
-
- /// <summary>
- /// Used to update light settings.
- /// </summary>
- private void UpdateLight(EntityUid uid, ItemToggleComponent comp, ref ItemToggleLightUpdateEvent args)
- {
- if (!_light.TryGetLight(uid, out var light))
- return;
-
- _light.SetEnabled(uid, args.Activated, light);
- }
-
/// <summary>
/// Used to update the looping active sound linked to the entity.
/// </summary>
- private void UpdateActiveSound(EntityUid uid, ItemToggleActiveSoundComponent activeSound, ref ItemToggleActiveSoundUpdateEvent args)
+ private void UpdateActiveSound(EntityUid uid, ItemToggleActiveSoundComponent activeSound, ref ItemToggledEvent args)
{
if (args.Activated)
{
activeSound.PlayingStream = _audio.Stop(activeSound.PlayingStream);
}
}
-
- /// <summary>
- /// Used to play a toggle sound.
- /// </summary>
- private void PlayToggleSound(EntityUid uid, ItemToggleComponent itemToggle, ref ItemTogglePlayToggleSoundEvent args)
- {
- SoundSpecifier? soundToPlay;
- if (args.Activated)
- soundToPlay = itemToggle.SoundActivate;
- else
- soundToPlay = itemToggle.SoundDeactivate;
-
- if (soundToPlay == null)
- return;
-
- if (args.Predicted)
- _audio.PlayPredicted(soundToPlay, uid, args.User);
- else
- _audio.PlayPvs(soundToPlay, uid);
- }
-
- /// <summary>
- /// Used to play a failure to toggle sound.
- /// </summary>
- private void PlayFailToggleSound(EntityUid uid, ItemToggleComponent itemToggle, ref ItemTogglePlayFailSoundEvent args)
- {
- if (args.Predicted)
- _audio.PlayPredicted(itemToggle.SoundFailToActivate, uid, args.User);
- else
- _audio.PlayPvs(itemToggle.SoundFailToActivate, uid);
- }
}
using Content.Shared.Interaction;
using Content.Shared.Verbs;
using Content.Shared.Examine;
+using Content.Shared.Item.ItemToggle.Components;
using Content.Shared.Storage;
using JetBrains.Annotations;
using Robust.Shared.Containers;
{
base.Initialize();
SubscribeLocalEvent<ItemComponent, GetVerbsEvent<InteractionVerb>>(AddPickupVerb);
- SubscribeLocalEvent<ItemComponent, InteractHandEvent>(OnHandInteract, before: new []{typeof(SharedItemSystem)});
-
- SubscribeLocalEvent<ItemComponent, ComponentGetState>(OnGetState);
- SubscribeLocalEvent<ItemComponent, ComponentHandleState>(OnHandleState);
+ SubscribeLocalEvent<ItemComponent, InteractHandEvent>(OnHandInteract);
+ SubscribeLocalEvent<ItemComponent, AfterAutoHandleStateEvent>(OnItemAutoState);
SubscribeLocalEvent<ItemComponent, ExaminedEvent>(OnExamine);
- SubscribeLocalEvent<ItemToggleSizeComponent, ItemToggleSizeUpdateEvent>(OnItemToggle);
+ SubscribeLocalEvent<ItemToggleSizeComponent, ItemToggledEvent>(OnItemToggle);
+ }
+
+ private void OnItemAutoState(EntityUid uid, ItemComponent component, ref AfterAutoHandleStateEvent args)
+ {
+ SetHeldPrefix(uid, component.HeldPrefix, force: true, component);
}
#region Public API
Dirty(uid, component);
}
- public void SetHeldPrefix(EntityUid uid, string? heldPrefix, ItemComponent? component = null)
+ public void SetHeldPrefix(EntityUid uid, string? heldPrefix, bool force = false, ItemComponent? component = null)
{
if (!Resolve(uid, ref component, false))
return;
- if (component.HeldPrefix == heldPrefix)
+ if (!force && component.HeldPrefix == heldPrefix)
return;
component.HeldPrefix = heldPrefix;
args.Handled = _handsSystem.TryPickup(args.User, uid, animateUser: false);
}
- private void OnHandleState(EntityUid uid, ItemComponent component, ref ComponentHandleState args)
- {
- if (args.Current is not ItemComponentState state)
- return;
-
- component.Size = state.Size;
- SetHeldPrefix(uid, state.HeldPrefix, component);
- }
-
- private void OnGetState(EntityUid uid, ItemComponent component, ref ComponentGetState args)
- {
- args.State = new ItemComponentState(component.Size, component.HeldPrefix);
- }
-
private void AddPickupVerb(EntityUid uid, ItemComponent component, GetVerbsEvent<InteractionVerb> args)
{
if (args.Hands == null ||
/// <summary>
/// Used to update the Item component on item toggle (specifically size).
/// </summary>
- private void OnItemToggle(EntityUid uid, ItemToggleSizeComponent itemToggleSize, ItemToggleSizeUpdateEvent args)
+ private void OnItemToggle(EntityUid uid, ItemToggleSizeComponent itemToggleSize, ItemToggledEvent args)
{
if (!TryComp(uid, out ItemComponent? item))
return;
/// Component for ninja suit abilities and power consumption.
/// As an implementation detail, dashing with katana is a suit action which isn't ideal.
/// </summary>
-[RegisterComponent, NetworkedComponent, Access(typeof(SharedNinjaSuitSystem))]
+[RegisterComponent, NetworkedComponent, Access(typeof(SharedNinjaSuitSystem)), AutoGenerateComponentState]
public sealed partial class NinjaSuitComponent : Component
{
/// <summary>
/// Should be applied to any mob that you want to be able to produce any material with an action and the cost of hunger.
/// TODO: Probably adjust this to utilize organs?
/// </summary>
-[RegisterComponent, NetworkedComponent, Access(typeof(SharedSericultureSystem))]
+[RegisterComponent, NetworkedComponent, Access(typeof(SharedSericultureSystem)), AutoGenerateComponentState]
public sealed partial class SericultureComponent : Component
{
/// <summary>
/// Marks an entity as being a 'portal' which teleports entities sent through it to linked entities.
/// Relies on <see cref="LinkedEntityComponent"/> being set up.
/// </summary>
-[RegisterComponent, NetworkedComponent]
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
public sealed partial class PortalComponent : Component
{
/// <summary>
using Content.Shared.Interaction;
using Content.Shared.Inventory;
using Content.Shared.Item;
+using Content.Shared.Item.ItemToggle.Components;
using Content.Shared.Physics;
using Content.Shared.Popups;
using Content.Shared.Weapons.Melee.Components;
using Robust.Shared.Prototypes;
using Robust.Shared.Timing;
using Robust.Shared.Toolshed.Syntax;
+using ItemToggleMeleeWeaponComponent = Content.Shared.Item.ItemToggle.Components.ItemToggleMeleeWeaponComponent;
namespace Content.Shared.Weapons.Melee;
SubscribeLocalEvent<BonusMeleeDamageComponent, GetHeavyDamageModifierEvent>(OnGetBonusHeavyDamageModifier);
SubscribeLocalEvent<BonusMeleeAttackRateComponent, GetMeleeAttackRateEvent>(OnGetBonusMeleeAttackRate);
- SubscribeLocalEvent<ItemToggleMeleeWeaponComponent, ItemToggleMeleeWeaponUpdateEvent>(OnItemToggle);
+ SubscribeLocalEvent<ItemToggleMeleeWeaponComponent, ItemToggledEvent>(OnItemToggle);
SubscribeAllEvent<HeavyAttackEvent>(OnHeavyAttack);
SubscribeAllEvent<LightAttackEvent>(OnLightAttack);
/// <summary>
/// Used to update the MeleeWeapon component on item toggle.
/// </summary>
- private void OnItemToggle(EntityUid uid, ItemToggleMeleeWeaponComponent itemToggleMelee, ItemToggleMeleeWeaponUpdateEvent args)
+ private void OnItemToggle(EntityUid uid, ItemToggleMeleeWeaponComponent itemToggleMelee, ItemToggledEvent args)
{
if (!TryComp(uid, out MeleeWeaponComponent? meleeWeapon))
return;
using Content.Shared.Hands;
using Content.Shared.Inventory;
using Content.Shared.Inventory.Events;
+using Content.Shared.Item.ItemToggle.Components;
using Content.Shared.Popups;
using Content.Shared.Projectiles;
using Content.Shared.Weapons.Ranged.Components;
/// <summary>
/// This handles reflecting projectiles and hitscan shots.
/// </summary>
-public abstract class SharedReflectSystem : EntitySystem
+public sealed class ReflectSystem : EntitySystem
{
[Dependency] private readonly INetManager _netManager = default!;
[Dependency] private readonly IRobustRandom _random = default!;
SubscribeLocalEvent<ReflectComponent, ProjectileReflectAttemptEvent>(OnReflectCollide);
SubscribeLocalEvent<ReflectComponent, HitScanReflectAttemptEvent>(OnReflectHitscan);
- SubscribeLocalEvent<ReflectUserComponent, ProjectileReflectAttemptEvent>(OnReflectUserCollide);
- SubscribeLocalEvent<ReflectUserComponent, HitScanReflectAttemptEvent>(OnReflectUserHitscan);
-
SubscribeLocalEvent<ReflectComponent, GotEquippedEvent>(OnReflectEquipped);
SubscribeLocalEvent<ReflectComponent, GotUnequippedEvent>(OnReflectUnequipped);
SubscribeLocalEvent<ReflectComponent, GotEquippedHandEvent>(OnReflectHandEquipped);
SubscribeLocalEvent<ReflectComponent, GotUnequippedHandEvent>(OnReflectHandUnequipped);
+ SubscribeLocalEvent<ReflectComponent, ItemToggledEvent>(OnToggleReflect);
+
+ SubscribeLocalEvent<ReflectUserComponent, ProjectileReflectAttemptEvent>(OnReflectUserCollide);
+ SubscribeLocalEvent<ReflectUserComponent, HitScanReflectAttemptEvent>(OnReflectUserHitscan);
}
private void OnReflectUserHitscan(EntityUid uid, ReflectUserComponent component, ref HitScanReflectAttemptEvent args)
RefreshReflectUser(args.User);
}
+ private void OnToggleReflect(EntityUid uid, ReflectComponent comp, ref ItemToggledEvent args)
+ {
+ comp.Enabled = args.Activated;
+ Dirty(uid, comp);
+ }
+
/// <summary>
/// Refreshes whether someone has reflection potential so we can raise directed events on them.
/// </summary>
if (TryComp<ItemComponent>(used, out var item))
{
component.OldInhandPrefix = item.HeldPrefix;
- _itemSystem.SetHeldPrefix(used, component.WieldedInhandPrefix, item);
+ _itemSystem.SetHeldPrefix(used, component.WieldedInhandPrefix, component: item);
}
component.Wielded = true;
if (TryComp<ItemComponent>(uid, out var item))
{
- _itemSystem.SetHeldPrefix(uid, component.OldInhandPrefix, item);
+ _itemSystem.SetHeldPrefix(uid, component.OldInhandPrefix, component: item);
}
component.Wielded = false;