+++ /dev/null
-using Content.Shared.Mech.Components;
-using Robust.Shared.GameStates;
-
-namespace Content.Client.Mech;
-
-/// <inheritdoc/>
-[RegisterComponent, NetworkedComponent]
-[ComponentReference(typeof(SharedMechComponent))]
-public sealed class MechComponent : SharedMechComponent
-{
-
-}
using Content.Shared.Mech;
+using Content.Shared.Mech.Components;
using Content.Shared.Mech.EntitySystems;
using Robust.Client.GameObjects;
using DrawDepth = Content.Shared.DrawDepth.DrawDepth;
using Content.Client.UserInterface.Fragments;
using Content.Shared.Mech;
+using Content.Shared.Mech.Components;
using JetBrains.Annotations;
using Robust.Client.GameObjects;
public void UpdateMechStats()
{
- if (!_ent.TryGetComponent<SharedMechComponent>(_mech, out var mechComp))
+ if (!_ent.TryGetComponent<MechComponent>(_mech, out var mechComp))
return;
var integrityPercent = mechComp.Integrity / mechComp.MaxIntegrity;
-using Content.Server.Mech.Components;
using Content.Server.Mech.Systems;
using Content.Server.Power.Components;
using Content.Shared.Construction;
+using Content.Shared.Mech.Components;
using JetBrains.Annotations;
using Robust.Server.Containers;
using Robust.Shared.Containers;
--- /dev/null
+using Content.Server.Atmos;
+
+namespace Content.Server.Mech.Components;
+
+[RegisterComponent]
+public sealed class MechAirComponent : Component
+{
+ //TODO: this doesn't support a tank implant for mechs or anything like that
+ [ViewVariables(VVAccess.ReadWrite)]
+ public GasMixture Air = new (GasMixVolume);
+ public const float GasMixVolume = 70f;
+}
+++ /dev/null
-using Content.Server.Atmos;
-using Content.Shared.Mech.Components;
-using Robust.Shared.GameStates;
-using Robust.Shared.Prototypes;
-using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
-using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List;
-
-namespace Content.Server.Mech.Components;
-
-/// <inheritdoc/>
-[RegisterComponent, NetworkedComponent]
-[ComponentReference(typeof(SharedMechComponent))]
-public sealed class MechComponent : SharedMechComponent
-{
- /// <summary>
- /// How long it takes to enter the mech.
- /// </summary>
- [DataField("entryDelay")]
- public float EntryDelay = 3;
-
- /// <summary>
- /// How long it takes to pull *another person*
- /// outside of the mech. You can exit instantly yourself.
- /// </summary>
- [DataField("exitDelay")]
- public float ExitDelay = 3;
-
- /// <summary>
- /// How long it takes to pull out the battery.
- /// </summary>
- [DataField("batteryRemovalDelay")]
- public float BatteryRemovalDelay = 2;
-
- /// <summary>
- /// Whether or not the mech is airtight.
- /// </summary>
- /// <remarks>
- /// This needs to be redone
- /// when mech internals are added
- /// </remarks>
- [DataField("airtight"), ViewVariables(VVAccess.ReadWrite)]
- public bool Airtight;
-
- /// <summary>
- /// The equipment that the mech initially has when it spawns.
- /// Good for things like nukie mechs that start with guns.
- /// </summary>
- [DataField("startingEquipment", customTypeSerializer: typeof(PrototypeIdListSerializer<EntityPrototype>))]
- public List<string> StartingEquipment = new();
-
- /// <summary>
- /// The battery the mech initially has when it spawns
- /// Good for admemes and nukie mechs.
- /// </summary>
- [DataField("startingBattery", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
- public string? StartingBattery;
-
- //TODO: this doesn't support a tank implant for mechs or anything like that
- [ViewVariables(VVAccess.ReadWrite)]
- public GasMixture Air = new (GasMixVolume);
- public const float GasMixVolume = 70f;
-}
-
-/// <summary>
-/// Event raised when a person successfully enters a mech
-/// </summary>
-public sealed class MechEntryFinishedEvent : EntityEventArgs
-{
- public EntityUid User;
-
- public MechEntryFinishedEvent(EntityUid user)
- {
- User = user;
- }
-}
-
-/// <summary>
-/// Event raised when a person fails to enter a mech
-/// </summary>
-public sealed class MechEntryCanclledEvent : EntityEventArgs
-{
-
-}
-
-/// <summary>
-/// Event raised when a person successfully removes someone from a mech
-/// </summary>
-public sealed class MechExitFinishedEvent : EntityEventArgs
-{
-
-}
-
-/// <summary>
-/// Event raised when a person fails to remove someone from a mech
-/// </summary>
-public sealed class MechExitCanclledEvent : EntityEventArgs
-{
-
-}
-
-/// <summary>
-/// Event raised when the battery is successfully removed from the mech
-/// </summary>
-public sealed class MechRemoveBatteryFinishedEvent : EntityEventArgs
-{
-
-}
-
-/// <summary>
-/// Event raised when the battery fails to be removed from the mech
-/// </summary>
-public sealed class MechRemoveBatteryCancelledEvent : EntityEventArgs
-{
-
-}
using System.Linq;
using Content.Server.Interaction;
-using Content.Server.Mech.Components;
using Content.Server.Mech.Equipment.Components;
using Content.Server.Mech.Systems;
using Content.Shared.DoAfter;
using Content.Shared.Interaction;
using Content.Shared.Mech;
+using Content.Shared.Mech.Components;
using Content.Shared.Mech.Equipment.Components;
using Content.Shared.Mobs.Components;
using Content.Shared.Wall;
-using Content.Server.Mech.Components;
-using Content.Server.Popups;
+using Content.Server.Popups;
using Content.Shared.DoAfter;
using Content.Shared.Interaction;
+using Content.Shared.Mech.Components;
using Content.Shared.Mech.Equipment.Components;
namespace Content.Server.Mech.Systems;
Dirty(component);
}
- private void OnRemoveEquipmentMessage(EntityUid uid, SharedMechComponent component, MechEquipmentRemoveMessage args)
+ private void OnRemoveEquipmentMessage(EntityUid uid, MechComponent component, MechEquipmentRemoveMessage args)
{
if (!Exists(args.Equipment) || Deleted(args.Equipment))
return;
args.Handled = true;
}
- private void OnDamageChanged(EntityUid uid, SharedMechComponent component, DamageChangedEvent args)
+ private void OnDamageChanged(EntityUid uid, MechComponent component, DamageChangedEvent args)
{
var integrity = component.MaxIntegrity - args.Damageable.TotalDamage;
SetIntegrity(uid, integrity, component);
}
}
- public override void UpdateUserInterface(EntityUid uid, SharedMechComponent? component = null)
+ public override void UpdateUserInterface(EntityUid uid, MechComponent? component = null)
{
if (!Resolve(uid, ref component))
return;
_ui.SetUiState(ui, state);
}
- public override bool TryInsert(EntityUid uid, EntityUid? toInsert, SharedMechComponent? component = null)
+ public override bool TryInsert(EntityUid uid, EntityUid? toInsert, MechComponent? component = null)
{
if (!Resolve(uid, ref component))
return false;
if (!base.TryInsert(uid, toInsert, component))
return false;
- var mech = (MechComponent) component;
-
- if (mech.Airtight)
+ if (component.Airtight && TryComp(uid, out MechAirComponent? mechAir))
{
var coordinates = Transform(uid).MapPosition;
if (_map.TryFindGridAt(coordinates, out var grid))
if (_atmosphere.GetTileMixture(tile.GridUid, null, tile.GridIndices, true) is {} environment)
{
- _atmosphere.Merge(mech.Air, environment.RemoveVolume(MechComponent.GasMixVolume));
+ _atmosphere.Merge(mechAir.Air, environment.RemoveVolume(MechAirComponent.GasMixVolume));
}
}
}
return true;
}
- public override bool TryEject(EntityUid uid, SharedMechComponent? component = null)
+ public override bool TryEject(EntityUid uid, MechComponent? component = null)
{
if (!Resolve(uid, ref component))
return false;
if (!base.TryEject(uid, component))
return false;
- var mech = (MechComponent) component;
-
- if (mech.Airtight)
+ if (component.Airtight && TryComp(uid, out MechAirComponent? mechAir))
{
var coordinates = Transform(uid).MapPosition;
if (_map.TryFindGridAt(coordinates, out var grid))
if (_atmosphere.GetTileMixture(tile.GridUid, null, tile.GridIndices, true) is {} environment)
{
- _atmosphere.Merge(environment, mech.Air);
- mech.Air.Clear();
+ _atmosphere.Merge(environment, mechAir.Air);
+ mechAir.Air.Clear();
}
}
}
return true;
}
- public override void BreakMech(EntityUid uid, SharedMechComponent? component = null)
+ public override void BreakMech(EntityUid uid, MechComponent? component = null)
{
base.BreakMech(uid, component);
_actionBlocker.UpdateCanMove(uid);
}
- public override bool TryChangeEnergy(EntityUid uid, FixedPoint2 delta, SharedMechComponent? component = null)
+ public override bool TryChangeEnergy(EntityUid uid, FixedPoint2 delta, MechComponent? component = null)
{
if (!Resolve(uid, ref component))
return false;
#region Atmos Handling
private void OnInhale(EntityUid uid, MechPilotComponent component, InhaleLocationEvent args)
{
- if (!TryComp<MechComponent>(component.Mech, out var mech))
+ if (!TryComp<MechComponent>(component.Mech, out var mech) ||
+ !TryComp<MechAirComponent>(component.Mech, out var mechAir))
+ {
return;
+ }
if (mech.Airtight)
- args.Gas = mech.Air;
+ args.Gas = mechAir.Air;
}
private void OnExhale(EntityUid uid, MechPilotComponent component, ExhaleLocationEvent args)
{
- if (!TryComp<MechComponent>(component.Mech, out var mech))
+ if (!TryComp<MechComponent>(component.Mech, out var mech) ||
+ !TryComp<MechAirComponent>(component.Mech, out var mechAir))
+ {
return;
+ }
if (mech.Airtight)
- args.Gas = mech.Air;
+ args.Gas = mechAir.Air;
}
private void OnExpose(EntityUid uid, MechPilotComponent component, ref AtmosExposedGetAirEvent args)
if (args.Handled)
return;
- if (!TryComp<MechComponent>(component.Mech, out var mech))
+ if (!TryComp<MechComponent>(component.Mech, out var mech) ||
+ !TryComp<MechAirComponent>(component.Mech, out var mechAir))
+ {
return;
+ }
- args.Gas = mech.Airtight ? mech.Air : _atmosphere.GetContainingMixture(component.Mech);
+ args.Gas = mech.Airtight ? mechAir.Air : _atmosphere.GetContainingMixture(component.Mech);
args.Handled = true;
}
using Content.Shared.FixedPoint;
using Content.Shared.Whitelist;
using Robust.Shared.Containers;
+using Robust.Shared.GameStates;
+using Robust.Shared.Prototypes;
using Robust.Shared.Serialization;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
+using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List;
namespace Content.Shared.Mech.Components;
/// A large, pilotable machine that has equipment that is
/// powered via an internal battery.
/// </summary>
-public abstract class SharedMechComponent : Component
+[RegisterComponent, NetworkedComponent]
+public sealed class MechComponent : Component
{
/// <summary>
/// How much "health" the mech has left.
[ViewVariables]
public readonly string EquipmentContainerId = "mech-equipment-container";
+ /// <summary>
+ /// How long it takes to enter the mech.
+ /// </summary>
+ [DataField("entryDelay")]
+ public float EntryDelay = 3;
+
+ /// <summary>
+ /// How long it takes to pull *another person*
+ /// outside of the mech. You can exit instantly yourself.
+ /// </summary>
+ [DataField("exitDelay")]
+ public float ExitDelay = 3;
+
+ /// <summary>
+ /// How long it takes to pull out the battery.
+ /// </summary>
+ [DataField("batteryRemovalDelay")]
+ public float BatteryRemovalDelay = 2;
+
+ /// <summary>
+ /// Whether or not the mech is airtight.
+ /// </summary>
+ /// <remarks>
+ /// This needs to be redone
+ /// when mech internals are added
+ /// </remarks>
+ [DataField("airtight"), ViewVariables(VVAccess.ReadWrite)]
+ public bool Airtight;
+
+ /// <summary>
+ /// The equipment that the mech initially has when it spawns.
+ /// Good for things like nukie mechs that start with guns.
+ /// </summary>
+ [DataField("startingEquipment", customTypeSerializer: typeof(PrototypeIdListSerializer<EntityPrototype>))]
+ public List<string> StartingEquipment = new();
+
+ /// <summary>
+ /// The battery the mech initially has when it spawns
+ /// Good for admemes and nukie mechs.
+ /// </summary>
+ [DataField("startingBattery", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
+ public string? StartingBattery;
+
#region Action Prototypes
[DataField("mechCycleAction", customTypeSerializer: typeof(PrototypeIdSerializer<InstantActionPrototype>))]
public string MechCycleAction = "MechCycleEquipment";
}
/// <summary>
-/// Contains network state for <see cref="SharedMechComponent"/>.
+/// Contains network state for <see cref="MechComponent"/>.
/// </summary>
[Serializable, NetSerializable]
public sealed class MechComponentState : ComponentState
namespace Content.Shared.Mech.Components;
/// <summary>
-/// Attached to entities piloting a <see cref="SharedMechComponent"/>
+/// Attached to entities piloting a <see cref="MechComponent"/>
/// </summary>
/// <remarks>
/// Get in the robot, Shinji
namespace Content.Shared.Mech.EntitySystems;
/// <summary>
-/// Handles all of the interactions, UI handling, and items shennanigans for <see cref="SharedMechComponent"/>
+/// Handles all of the interactions, UI handling, and items shennanigans for <see cref="MechComponent"/>
/// </summary>
public abstract class SharedMechSystem : EntitySystem
{
/// <inheritdoc/>
public override void Initialize()
{
- SubscribeLocalEvent<SharedMechComponent, ComponentGetState>(OnGetState);
- SubscribeLocalEvent<SharedMechComponent, ComponentHandleState>(OnHandleState);
+ SubscribeLocalEvent<MechComponent, ComponentGetState>(OnGetState);
+ SubscribeLocalEvent<MechComponent, ComponentHandleState>(OnHandleState);
SubscribeLocalEvent<MechPilotComponent, ComponentGetState>(OnPilotGetState);
SubscribeLocalEvent<MechPilotComponent, ComponentHandleState>(OnPilotHandleState);
- SubscribeLocalEvent<SharedMechComponent, MechToggleEquipmentEvent>(OnToggleEquipmentAction);
- SubscribeLocalEvent<SharedMechComponent, MechEjectPilotEvent>(OnEjectPilotEvent);
- SubscribeLocalEvent<SharedMechComponent, InteractNoHandEvent>(RelayInteractionEvent);
- SubscribeLocalEvent<SharedMechComponent, ComponentStartup>(OnStartup);
- SubscribeLocalEvent<SharedMechComponent, DestructionEventArgs>(OnDestruction);
- SubscribeLocalEvent<SharedMechComponent, GetAdditionalAccessEvent>(OnGetAdditionalAccess);
+ SubscribeLocalEvent<MechComponent, MechToggleEquipmentEvent>(OnToggleEquipmentAction);
+ SubscribeLocalEvent<MechComponent, MechEjectPilotEvent>(OnEjectPilotEvent);
+ SubscribeLocalEvent<MechComponent, InteractNoHandEvent>(RelayInteractionEvent);
+ SubscribeLocalEvent<MechComponent, ComponentStartup>(OnStartup);
+ SubscribeLocalEvent<MechComponent, DestructionEventArgs>(OnDestruction);
+ SubscribeLocalEvent<MechComponent, GetAdditionalAccessEvent>(OnGetAdditionalAccess);
SubscribeLocalEvent<MechPilotComponent, GetMeleeWeaponEvent>(OnGetMeleeWeapon);
SubscribeLocalEvent<MechPilotComponent, CanAttackFromContainerEvent>(OnCanAttackFromContainer);
#region State Handling
- private void OnGetState(EntityUid uid, SharedMechComponent component, ref ComponentGetState args)
+ private void OnGetState(EntityUid uid, MechComponent component, ref ComponentGetState args)
{
args.State = new MechComponentState
{
};
}
- private void OnHandleState(EntityUid uid, SharedMechComponent component, ref ComponentHandleState args)
+ private void OnHandleState(EntityUid uid, MechComponent component, ref ComponentHandleState args)
{
if (args.Current is not MechComponentState state)
return;
#endregion
- private void OnToggleEquipmentAction(EntityUid uid, SharedMechComponent component, MechToggleEquipmentEvent args)
+ private void OnToggleEquipmentAction(EntityUid uid, MechComponent component, MechToggleEquipmentEvent args)
{
if (args.Handled)
return;
CycleEquipment(uid);
}
- private void OnEjectPilotEvent(EntityUid uid, SharedMechComponent component, MechEjectPilotEvent args)
+ private void OnEjectPilotEvent(EntityUid uid, MechComponent component, MechEjectPilotEvent args)
{
if (args.Handled)
return;
TryEject(uid, component);
}
- private void RelayInteractionEvent(EntityUid uid, SharedMechComponent component, InteractNoHandEvent args)
+ private void RelayInteractionEvent(EntityUid uid, MechComponent component, InteractNoHandEvent args)
{
var pilot = component.PilotSlot.ContainedEntity;
if (pilot == null)
}
}
- private void OnStartup(EntityUid uid, SharedMechComponent component, ComponentStartup args)
+ private void OnStartup(EntityUid uid, MechComponent component, ComponentStartup args)
{
component.PilotSlot = _container.EnsureContainer<ContainerSlot>(uid, component.PilotSlotId);
component.EquipmentContainer = _container.EnsureContainer<Container>(uid, component.EquipmentContainerId);
UpdateAppearance(uid, component);
}
- private void OnDestruction(EntityUid uid, SharedMechComponent component, DestructionEventArgs args)
+ private void OnDestruction(EntityUid uid, MechComponent component, DestructionEventArgs args)
{
BreakMech(uid, component);
}
- private void OnGetAdditionalAccess(EntityUid uid, SharedMechComponent component, ref GetAdditionalAccessEvent args)
+ private void OnGetAdditionalAccess(EntityUid uid, MechComponent component, ref GetAdditionalAccessEvent args)
{
var pilot = component.PilotSlot.ContainedEntity;
if (pilot == null)
args.Entities.UnionWith(items);
}
- private void SetupUser(EntityUid mech, EntityUid pilot, SharedMechComponent? component = null)
+ private void SetupUser(EntityUid mech, EntityUid pilot, MechComponent? component = null)
{
if (!Resolve(mech, ref component))
return;
/// </summary>
/// <param name="uid"></param>
/// <param name="component"></param>
- public virtual void BreakMech(EntityUid uid, SharedMechComponent? component = null)
+ public virtual void BreakMech(EntityUid uid, MechComponent? component = null)
{
if (!Resolve(uid, ref component))
return;
/// </summary>
/// <param name="uid"></param>
/// <param name="component"></param>
- public void CycleEquipment(EntityUid uid, SharedMechComponent? component = null)
+ public void CycleEquipment(EntityUid uid, MechComponent? component = null)
{
if (!Resolve(uid, ref component))
return;
/// <param name="toInsert"></param>
/// <param name="component"></param>
/// <param name="equipmentComponent"></param>
- public void InsertEquipment(EntityUid uid, EntityUid toInsert, SharedMechComponent? component = null,
+ public void InsertEquipment(EntityUid uid, EntityUid toInsert, MechComponent? component = null,
MechEquipmentComponent? equipmentComponent = null)
{
if (!Resolve(uid, ref component))
/// <param name="component"></param>
/// <param name="equipmentComponent"></param>
/// <param name="forced">Whether or not the removal can be cancelled</param>
- public void RemoveEquipment(EntityUid uid, EntityUid toRemove, SharedMechComponent? component = null,
+ public void RemoveEquipment(EntityUid uid, EntityUid toRemove, MechComponent? component = null,
MechEquipmentComponent? equipmentComponent = null, bool forced = false)
{
if (!Resolve(uid, ref component))
/// <param name="delta">The change in energy</param>
/// <param name="component"></param>
/// <returns>If the energy was successfully changed.</returns>
- public virtual bool TryChangeEnergy(EntityUid uid, FixedPoint2 delta, SharedMechComponent? component = null)
+ public virtual bool TryChangeEnergy(EntityUid uid, FixedPoint2 delta, MechComponent? component = null)
{
if (!Resolve(uid, ref component))
return false;
/// <param name="uid">The mech itself</param>
/// <param name="value">The value the integrity will be set at</param>
/// <param name="component"></param>
- public void SetIntegrity(EntityUid uid, FixedPoint2 value, SharedMechComponent? component = null)
+ public void SetIntegrity(EntityUid uid, FixedPoint2 value, MechComponent? component = null)
{
if (!Resolve(uid, ref component))
return;
/// </summary>
/// <param name="component"></param>
/// <returns>Whether or not the pilot is present</returns>
- public bool IsEmpty(SharedMechComponent component)
+ public bool IsEmpty(MechComponent component)
{
return component.PilotSlot.ContainedEntity == null;
}
/// <param name="toInsert"></param>
/// <param name="component"></param>
/// <returns></returns>
- public bool CanInsert(EntityUid uid, EntityUid toInsert, SharedMechComponent? component = null)
+ public bool CanInsert(EntityUid uid, EntityUid toInsert, MechComponent? component = null)
{
if (!Resolve(uid, ref component))
return false;
/// <remarks>
/// This is defined here so that UI updates can be accessed from shared.
/// </remarks>
- public virtual void UpdateUserInterface(EntityUid uid, SharedMechComponent? component = null)
+ public virtual void UpdateUserInterface(EntityUid uid, MechComponent? component = null)
{
}
/// <param name="toInsert"></param>
/// <param name="component"></param>
/// <returns>Whether or not the entity was inserted</returns>
- public virtual bool TryInsert(EntityUid uid, EntityUid? toInsert, SharedMechComponent? component = null)
+ public virtual bool TryInsert(EntityUid uid, EntityUid? toInsert, MechComponent? component = null)
{
if (!Resolve(uid, ref component))
return false;
/// <param name="uid"></param>
/// <param name="component"></param>
/// <returns>Whether or not the pilot was ejected.</returns>
- public virtual bool TryEject(EntityUid uid, SharedMechComponent? component = null)
+ public virtual bool TryEject(EntityUid uid, MechComponent? component = null)
{
if (!Resolve(uid, ref component))
return false;
if (args.Handled)
return;
- if (!TryComp<SharedMechComponent>(component.Mech, out var mech))
+ if (!TryComp<MechComponent>(component.Mech, out var mech))
return;
var weapon = mech.CurrentSelectedEquipment ?? component.Mech;
args.Cancel();
}
- private void UpdateAppearance(EntityUid uid, SharedMechComponent? component = null,
+ private void UpdateAppearance(EntityUid uid, MechComponent? component = null,
AppearanceComponent? appearance = null)
{
if (!Resolve(uid, ref component, ref appearance, false))
-using System.Threading;
-using Content.Shared.DoAfter;
+using Content.Shared.DoAfter;
using Content.Shared.Mech.Components;
using Robust.Shared.Serialization;
namespace Content.Shared.Mech.Equipment.Components;
/// <summary>
-/// A piece of equipment that can be installed into <see cref="SharedMechComponent"/>
+/// A piece of equipment that can be installed into <see cref="MechComponent"/>
/// </summary>
[RegisterComponent]
public sealed class MechEquipmentComponent : Component
baseState: ripley
openState: ripley-open
brokenState: ripley-broken
+ - type: MechAir
- type: DoAfter
- type: Repairable
fuelCost: 25