Misc ItemToggleSystem changes (#26489)

* Minor ItemToggleSystem tweaks

* Update visuals on startup

* Remove SetIgnited

* Misc toggle fixes

* Update ItemToggleHotComponent.cs
This commit is contained in:
Leon Friedrich
2024-03-28 17:05:04 +13:00
committed by GitHub
parent 77e029d4ca
commit 8a6879bb1b
8 changed files with 114 additions and 134 deletions

View File

@@ -1,5 +1,6 @@
using Content.Shared.Interaction.Events;
using Content.Shared.Item.ItemToggle.Components;
using Content.Shared.Popups;
using Content.Shared.Temperature;
using Content.Shared.Toggleable;
using Content.Shared.Wieldable;
@@ -20,11 +21,13 @@ public abstract class SharedItemToggleSystem : EntitySystem
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
[Dependency] private readonly SharedPointLightSystem _light = default!;
[Dependency] private readonly INetManager _netManager = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<ItemToggleComponent, ComponentStartup>(OnStartup);
SubscribeLocalEvent<ItemToggleComponent, ItemUnwieldedEvent>(TurnOffonUnwielded);
SubscribeLocalEvent<ItemToggleComponent, ItemWieldedEvent>(TurnOnonWielded);
SubscribeLocalEvent<ItemToggleComponent, UseInHandEvent>(OnUseInHand);
@@ -34,6 +37,11 @@ public abstract class SharedItemToggleSystem : EntitySystem
SubscribeLocalEvent<ItemToggleActiveSoundComponent, ItemToggledEvent>(UpdateActiveSound);
}
private void OnStartup(Entity<ItemToggleComponent> ent, ref ComponentStartup args)
{
UpdateVisuals(ent);
}
private void OnUseInHand(EntityUid uid, ItemToggleComponent itemToggle, UseInHandEvent args)
{
if (args.Handled)
@@ -73,6 +81,9 @@ public abstract class SharedItemToggleSystem : EntitySystem
if (itemToggle.Activated)
return true;
if (!itemToggle.Predictable && _netManager.IsClient)
return true;
var attempt = new ItemToggleActivateAttemptEvent(user);
RaiseLocalEvent(uid, ref attempt);
@@ -83,12 +94,16 @@ public abstract class SharedItemToggleSystem : EntitySystem
else
_audio.PlayPvs(itemToggle.SoundFailToActivate, uid);
if (attempt.Popup != null && user != null)
{
if (predicted)
_popup.PopupClient(attempt.Popup, uid, user.Value);
else
_popup.PopupEntity(attempt.Popup, uid, user.Value);
}
return false;
}
// If the item's toggle is unpredictable because of something like requiring fuel or charge, then clients exit here.
// Otherwise you get stuff like an item activating client-side and then turning back off when it synchronizes with the server.
if (predicted == false && _netManager.IsClient)
return true;
Activate(uid, itemToggle, predicted, user);
@@ -103,6 +118,9 @@ public abstract class SharedItemToggleSystem : EntitySystem
if (!Resolve(uid, ref itemToggle))
return false;
if (!itemToggle.Predictable && _netManager.IsClient)
return true;
if (!itemToggle.Activated)
return true;
@@ -114,10 +132,6 @@ public abstract class SharedItemToggleSystem : EntitySystem
return false;
}
// If the item's toggle is unpredictable because of something like requiring fuel or charge, then clients exit here.
if (predicted == false && _netManager.IsClient)
return true;
Deactivate(uid, itemToggle, predicted, user);
return true;
}
@@ -135,7 +149,6 @@ public abstract class SharedItemToggleSystem : EntitySystem
}
var soundToPlay = itemToggle.SoundActivate;
if (predicted)
_audio.PlayPredicted(soundToPlay, uid, user);
else
@@ -146,10 +159,8 @@ public abstract class SharedItemToggleSystem : EntitySystem
var toggleUsed = new ItemToggledEvent(predicted, Activated: true, user);
RaiseLocalEvent(uid, ref toggleUsed);
var activev = new ItemToggleActivatedEvent(user);
RaiseLocalEvent(uid, ref activev);
itemToggle.Activated = true;
UpdateVisuals((uid, itemToggle));
Dirty(uid, itemToggle);
}
@@ -158,35 +169,38 @@ public abstract class SharedItemToggleSystem : EntitySystem
/// </summary>
private void Deactivate(EntityUid uid, ItemToggleComponent itemToggle, bool predicted, EntityUid? user = null)
{
// TODO: Fix this hardcoding
TryComp(uid, out AppearanceComponent? appearance);
_appearance.SetData(uid, ToggleableLightVisuals.Enabled, false, appearance);
_appearance.SetData(uid, ToggleVisuals.Toggled, false, appearance);
if (_light.TryGetLight(uid, out var light))
{
_light.SetEnabled(uid, false, light);
}
var soundToPlay = itemToggle.SoundDeactivate;
if (predicted)
_audio.PlayPredicted(soundToPlay, uid, user);
else
_audio.PlayPvs(soundToPlay, uid);
// END FIX HARDCODING
var toggleUsed = new ItemToggledEvent(predicted, Activated: false, user);
RaiseLocalEvent(uid, ref toggleUsed);
var activev = new ItemToggleDeactivatedEvent(user);
RaiseLocalEvent(uid, ref activev);
itemToggle.Activated = false;
UpdateVisuals((uid, itemToggle));
Dirty(uid, itemToggle);
}
private void UpdateVisuals(Entity<ItemToggleComponent> ent)
{
if (TryComp(ent, out AppearanceComponent? appearance))
{
_appearance.SetData(ent, ToggleVisuals.Toggled, ent.Comp.Activated, appearance);
if (ent.Comp.ToggleLight)
_appearance.SetData(ent, ToggleableLightVisuals.Enabled, ent.Comp.Activated, appearance);
}
if (!ent.Comp.ToggleLight)
return;
if (_light.TryGetLight(ent, out var light))
_light.SetEnabled(ent, ent.Comp.Activated, light);
}
/// <summary>
/// Used for items that require to be wielded in both hands to activate. For instance the dual energy sword will turn off if not wielded.
/// </summary>
@@ -218,8 +232,7 @@ public abstract class SharedItemToggleSystem : EntitySystem
/// </summary>
private void OnIsHotEvent(EntityUid uid, ItemToggleHotComponent itemToggleHot, IsHotEvent args)
{
if (itemToggleHot.IsHotWhenActivated)
args.IsHot = IsActivated(uid);
args.IsHot |= IsActivated(uid);
}
/// <summary>