using Content.Shared.Containers.ItemSlots;
using Content.Shared.Coordinates.Helpers;
using Content.Shared.DoAfter;
+using Content.Shared.Examine;
using Content.Shared.Maps;
using Content.Shared.Nuke;
using Content.Shared.Popups;
[Dependency] private readonly SharedTransformSystem _transform = default!;
[Dependency] private readonly StationSystem _station = default!;
[Dependency] private readonly UserInterfaceSystem _ui = default!;
+ [Dependency] private readonly AppearanceSystem _appearance = default!;
/// <summary>
/// Used to calculate when the nuke song should start playing for maximum kino with the nuke sfx
SubscribeLocalEvent<NukeComponent, MapInitEvent>(OnMapInit);
SubscribeLocalEvent<NukeComponent, EntInsertedIntoContainerMessage>(OnItemSlotChanged);
SubscribeLocalEvent<NukeComponent, EntRemovedFromContainerMessage>(OnItemSlotChanged);
+ SubscribeLocalEvent<NukeComponent, ExaminedEvent>(OnExaminedEvent);
// Shouldn't need re-anchoring.
SubscribeLocalEvent<NukeComponent, AnchorStateChangedEvent>(OnAnchorChanged);
// without the doafter. but that takes some effort, and it won't allow you to disarm a nuke that can't be disarmed by the doafter.
DisarmBomb(uid, component);
}
+
+ UpdateAppearance(uid, component);
}
#endregion
_sound.PlayGlobalOnStation(uid, _audio.GetSound(nuke.AlertSound), new AudioParams{Volume = -5f});
_sound.StopStationEventMusic(uid, StationEventMusicType.Nuke);
nuke.PlayedAlertSound = true;
+ UpdateAppearance(uid, nuke);
}
if (nuke.RemainingTime <= 0)
component.Status = NukeStatus.ARMED;
UpdateUserInterface(uid, component);
+ UpdateAppearance(uid, component);
}
/// <summary>
component.CooldownTime = component.Cooldown;
UpdateUserInterface(uid, component);
+ UpdateAppearance(uid, component);
}
/// <summary>
_popups.PopupEntity(Loc.GetString("nuke-component-doafter-warning"), user,
user, PopupType.LargeCaution);
}
+
+ private void UpdateAppearance(EntityUid uid, NukeComponent nuke)
+ {
+ var xform = Transform(uid);
+
+ _appearance.SetData(uid, NukeVisuals.Deployed, xform.Anchored);
+
+ NukeVisualState state;
+ if (nuke.PlayedAlertSound)
+ state = NukeVisualState.YoureFucked;
+ else if (nuke.Status == NukeStatus.ARMED)
+ state = NukeVisualState.Armed;
+ else
+ state = NukeVisualState.Idle;
+
+ _appearance.SetData(uid, NukeVisuals.State, state);
+ }
+
+ private void OnExaminedEvent(EntityUid uid, NukeComponent component, ExaminedEvent args)
+ {
+ if (component.PlayedAlertSound)
+ args.PushMarkup(Loc.GetString("nuke-examine-exploding"));
+ else if (component.Status == NukeStatus.ARMED)
+ args.PushMarkup(Loc.GetString("nuke-examine-armed"));
+
+ if (Transform(uid).Anchored)
+ args.PushMarkup(Loc.GetString("examinable-anchored"));
+ else
+ args.PushMarkup(Loc.GetString("examinable-unanchored"));
+ }
}
public sealed class NukeExplodedEvent : EntityEventArgs
noRot: true
layers:
- state: nuclearbomb_base
+ map: ["enum.NukeVisualLayers.Base"]
+ - state: nuclearbomb_deployed_unlit
+ map: ["enum.NukeVisualLayers.Unlit"]
+ shader: unshaded
+ visible: false
- state: nukefestive
map: ["christmas"]
visible: false
enum.HolidayVisuals.Holiday:
christmas:
festive: { visible: true }
+ enum.NukeVisuals.Deployed:
+ enum.NukeVisualLayers.Base:
+ False: { state: nuclearbomb_base }
+ True: { state: nuclearbomb_deployed }
+ enum.NukeVisualLayers.Unlit:
+ True: { visible: true }
+ False: { visible: false }
+ enum.NukeVisuals.State:
+ enum.NukeVisualLayers.Unlit:
+ Idle: { state: nuclearbomb_deployed_unlit }
+ Armed: { state: nuclearbomb_timing }
+ YoureFucked: { state: nuclearbomb_exploding }
- type: Physics
bodyType: Static
- type: Fixtures