Skip to content

Commit 582b5b3

Browse files
authored
AddMechToClothing (#2265)
1 parent a8a4b67 commit 582b5b3

File tree

23 files changed

+457
-15
lines changed

23 files changed

+457
-15
lines changed

Content.Server/Mech/Equipment/EntitySystems/MechGrabberSystem.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,8 @@ private void OnInteract(EntityUid uid, MechGrabberComponent component, UserActiv
139139

140140
if (TryComp<PhysicsComponent>(target, out var physics) && physics.BodyType == BodyType.Static ||
141141
HasComp<WallMountComponent>(target) ||
142-
HasComp<MobStateComponent>(target))
142+
HasComp<MobStateComponent>(target) ||
143+
HasComp<MechComponent>(target)) //SS220 Ripley in ripley fix (AddMechToClothing)
143144
{
144145
return;
145146
}

Content.Server/Mech/Systems/MechEquipmentSystem.cs

+5-2
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,11 @@ private void OnUsed(EntityUid uid, MechEquipmentComponent component, AfterIntera
3636
if (mechComp.Broken)
3737
return;
3838

39-
if (args.User == mechComp.PilotSlot.ContainedEntity)
40-
return;
39+
//SS220-AddMechToClothing-start
40+
//Why does this check exist if it cannot be called?
41+
// if (args.User == mechComp.PilotSlot.ContainedEntity)
42+
// return;
43+
//SS220-AddMechToClothing-end
4144

4245
if (mechComp.EquipmentContainer.ContainedEntities.Count >= mechComp.MaxEquipmentAmount)
4346
return;

Content.Server/Mech/Systems/MechSystem.cs

+40-1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
using Robust.Shared.Containers;
2424
using Robust.Shared.Player;
2525
using Content.Shared.Whitelist;
26+
using Content.Shared.SS220.MechRobot; //SS220-AddMechToClothing
2627

2728
namespace Content.Server.Mech.Systems;
2829

@@ -50,6 +51,7 @@ public override void Initialize()
5051
SubscribeLocalEvent<MechComponent, MapInitEvent>(OnMapInit);
5152
SubscribeLocalEvent<MechComponent, GetVerbsEvent<AlternativeVerb>>(OnAlternativeVerb);
5253
SubscribeLocalEvent<MechComponent, MechOpenUiEvent>(OnOpenUi);
54+
SubscribeLocalEvent<MechComponent, MechClothingOpenUiEvent>(OnOpenClothingUi); //SS220-AddMechToClothing
5355
SubscribeLocalEvent<MechComponent, RemoveBatteryEvent>(OnRemoveBattery);
5456
SubscribeLocalEvent<MechComponent, MechEntryEvent>(OnMechEntry);
5557
SubscribeLocalEvent<MechComponent, MechExitEvent>(OnMechExit);
@@ -163,6 +165,14 @@ private void OnOpenUi(EntityUid uid, MechComponent component, MechOpenUiEvent ar
163165
ToggleMechUi(uid, component);
164166
}
165167

168+
//SS220-AddMechToClothing-start
169+
private void OnOpenClothingUi(Entity<MechComponent> ent, ref MechClothingOpenUiEvent args)
170+
{
171+
args.Handled = true;
172+
ToggleMechClothingUi(ent.Owner, args.Performer, ent.Comp);
173+
}
174+
//SS220-AddMechToClothing-end
175+
166176
private void OnToolUseAttempt(EntityUid uid, MechPilotComponent component, ref ToolUserAttemptUseEvent args)
167177
{
168178
if (args.Target == component.Mech)
@@ -174,6 +184,11 @@ private void OnAlternativeVerb(EntityUid uid, MechComponent component, GetVerbsE
174184
if (!args.CanAccess || !args.CanInteract || component.Broken)
175185
return;
176186

187+
//SS220-AddMechToClothing-start
188+
if (!TryComp<MechRobotComponent>(uid, out var _))
189+
return;
190+
//SS220-AddMechToClothing-end
191+
177192
if (CanInsert(uid, args.User, component))
178193
{
179194
var enterVerb = new AlternativeVerb
@@ -197,8 +212,13 @@ private void OnAlternativeVerb(EntityUid uid, MechComponent component, GetVerbsE
197212
args.Verbs.Add(enterVerb);
198213
args.Verbs.Add(openUiVerb);
199214
}
200-
else if (!IsEmpty(component))
215+
else if (!IsEmpty(component, uid)) //SS220-AddMechToClothing
201216
{
217+
//SS220-AddMechToClothing-start
218+
if (!TryComp<MechRobotComponent>(uid, out var _))
219+
return;
220+
//SS220-AddMechToClothing-end
221+
202222
var ejectVerb = new AlternativeVerb
203223
{
204224
Text = Loc.GetString("mech-verb-exit"),
@@ -229,6 +249,11 @@ private void OnMechEntry(EntityUid uid, MechComponent component, MechEntryEvent
229249
if (args.Cancelled || args.Handled)
230250
return;
231251

252+
//SS220-AddMechToClothing-start
253+
if (!TryComp<MechRobotComponent>(uid, out var _))
254+
return;
255+
//SS220-AddMechToClothing-end
256+
232257
if (_whitelistSystem.IsWhitelistFail(component.PilotWhitelist, args.User))
233258
{
234259
_popup.PopupEntity(Loc.GetString("mech-no-enter", ("item", uid)), args.User);
@@ -280,6 +305,20 @@ private void ToggleMechUi(EntityUid uid, MechComponent? component = null, Entity
280305
UpdateUserInterface(uid, component);
281306
}
282307

308+
//SS220-AddMechToClothing-start
309+
private void ToggleMechClothingUi(EntityUid entOwner, EntityUid argsPerformer, MechComponent? entComp = null)
310+
{
311+
if (!Resolve(entOwner, ref entComp))
312+
return;
313+
314+
if (!TryComp<ActorComponent>(argsPerformer, out var actor))
315+
return;
316+
317+
_ui.TryToggleUi(entOwner, MechUiKey.Key, actor.PlayerSession);
318+
UpdateUserInterface(entOwner, entComp);
319+
}
320+
//SS220-AddMechToClothing-end
321+
283322
private void ReceiveEquipmentUiMesssages<T>(EntityUid uid, MechComponent component, T args) where T : MechEquipmentUiMessage
284323
{
285324
var ev = new MechEquipmentUiMessageRelayEvent(args);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
// © SS220, An EULA/CLA with a hosting restriction, full text: https://raw.githubusercontent.com/SerbiaStrong-220/space-station-14/master/CLA.txt
2+
using Content.Server.Interaction;
3+
using Content.Server.Mech.Equipment.Components;
4+
using Content.Server.Mech.Systems;
5+
using Content.Server.Popups;
6+
using Content.Shared.DoAfter;
7+
using Content.Shared.Mech;
8+
using Content.Shared.Mech.Components;
9+
using Content.Shared.Mech.Equipment.Components;
10+
using Content.Shared.Mobs.Components;
11+
using Content.Shared.Wall;
12+
using Robust.Shared.Audio.Systems;
13+
using Robust.Shared.Containers;
14+
using Robust.Shared.Physics;
15+
using Robust.Shared.Physics.Components;
16+
using Content.Shared.SS220.MechClothing;
17+
18+
namespace Content.Server.SS220.MechClothing;
19+
20+
/// <summary>
21+
/// This handles placing containers in claw when the player uses an action, copies part of the logic MechGrabberSystem
22+
/// </summary>
23+
public sealed class MechClothingSystem : EntitySystem
24+
{
25+
[Dependency] private readonly InteractionSystem _interaction = default!;
26+
[Dependency] private readonly SharedAudioSystem _audio = default!;
27+
[Dependency] private readonly SharedDoAfterSystem _doAfter = default!;
28+
[Dependency] private readonly SharedContainerSystem _container = default!;
29+
[Dependency] private readonly MechSystem _mech = default!;
30+
[Dependency] private readonly PopupSystem _popup = default!;
31+
/// <inheritdoc/>
32+
public override void Initialize()
33+
{
34+
SubscribeLocalEvent<MechClothingComponent, MechClothingGrabEvent>(OnInteract);
35+
SubscribeLocalEvent<MechClothingComponent, ComponentStartup>(OnStartUp);
36+
SubscribeLocalEvent<MechClothingComponent, GrabberDoAfterEvent>(OnMechGrab);
37+
}
38+
39+
private void OnStartUp(Entity<MechClothingComponent> ent, ref ComponentStartup args)
40+
{
41+
ent.Comp.ItemContainer = _container.EnsureContainer<Container>(ent.Owner, "item-container");
42+
}
43+
44+
private void OnInteract(Entity<MechClothingComponent> ent, ref MechClothingGrabEvent args)
45+
{
46+
if (!ent.Comp.CurrentEquipmentUid.HasValue)
47+
{
48+
_popup.PopupEntity(Loc.GetString("mech-no-equipment-selected"),ent.Owner,ent.Owner);
49+
return;
50+
}
51+
52+
if (args.Handled)
53+
return;
54+
55+
if (args.Target == args.Performer || ent.Comp.DoAfter != null)
56+
return;
57+
58+
if (TryComp<PhysicsComponent>(args.Target, out var physics) && physics.BodyType == BodyType.Static ||
59+
HasComp<WallMountComponent>(args.Target) ||
60+
HasComp<MobStateComponent>(args.Target) ||
61+
HasComp<MechComponent>(args.Target))
62+
return;
63+
64+
if (Transform(args.Target).Anchored)
65+
return;
66+
67+
if (ent.Comp.ItemContainer.ContainedEntities.Count >= ent.Comp.MaxContents)
68+
return;
69+
70+
if (!TryComp<MechComponent>(ent.Comp.MechUid, out var mech))
71+
return;
72+
73+
if (mech.Energy + ent.Comp.GrabEnergyDelta < 0)
74+
{
75+
_popup.PopupEntity(Loc.GetString("mech-not-enough-energy"), ent.Owner, ent.Owner);
76+
return;
77+
}
78+
79+
if (!_interaction.InRangeUnobstructed(args.Performer, args.Target))
80+
return;
81+
82+
args.Handled = true;
83+
ent.Comp.AudioStream = _audio.PlayPvs(ent.Comp.GrabSound, ent.Owner)?.Entity;
84+
var doAfterArgs = new DoAfterArgs(
85+
EntityManager,
86+
args.Performer,
87+
ent.Comp.GrabDelay,
88+
new GrabberDoAfterEvent(),
89+
ent.Owner,
90+
target: args.Target,
91+
used: ent.Owner)
92+
{
93+
BreakOnMove = true
94+
};
95+
96+
_doAfter.TryStartDoAfter(doAfterArgs, out ent.Comp.DoAfter);
97+
}
98+
99+
private void OnMechGrab(Entity<MechClothingComponent> ent, ref GrabberDoAfterEvent args)
100+
{
101+
if (!TryComp<MechEquipmentComponent>(ent.Comp.CurrentEquipmentUid, out var equipmentComponent) ||
102+
equipmentComponent.EquipmentOwner == null)
103+
return;
104+
105+
ent.Comp.DoAfter = null;
106+
107+
if (args.Cancelled)
108+
{
109+
ent.Comp.AudioStream = _audio.Stop(ent.Comp.AudioStream);
110+
return;
111+
}
112+
113+
if (args.Handled || args.Args.Target == null)
114+
return;
115+
116+
if (!_mech.TryChangeEnergy(equipmentComponent.EquipmentOwner.Value, ent.Comp.GrabEnergyDelta))
117+
return;
118+
119+
if(!TryComp<MechGrabberComponent>(ent.Comp.CurrentEquipmentUid, out var mechGrabberComp))
120+
return;
121+
122+
_container.Insert(args.Args.Target.Value, mechGrabberComp.ItemContainer);
123+
_mech.UpdateUserInterface(equipmentComponent.EquipmentOwner.Value);
124+
125+
args.Handled = true;
126+
}
127+
}

Content.Shared/Mech/Components/MechComponent.cs

+7
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,10 @@ public sealed partial class MechComponent : Component
144144
public EntProtoId MechUiAction = "ActionMechOpenUI";
145145
[DataField]
146146
public EntProtoId MechEjectAction = "ActionMechEject";
147+
[DataField]
148+
public EntProtoId MechClothingUiAction= "ActionMechClothingOpenUI"; //SS220-AddMechToClothing
149+
[DataField]
150+
public EntProtoId MechClothingGrabAction= "ActionMechClothingGrab"; //SS220-AddMechToClothing
147151
#endregion
148152

149153
#region Visualizer States
@@ -158,4 +162,7 @@ public sealed partial class MechComponent : Component
158162
[DataField] public EntityUid? MechCycleActionEntity;
159163
[DataField] public EntityUid? MechUiActionEntity;
160164
[DataField] public EntityUid? MechEjectActionEntity;
165+
[DataField] public EntityUid? MechClothingUiActionEntity; //SS220-AddMechToClothing
166+
[DataField] public EntityUid? MechClothingGrabActionEntity; //SS220-AddMechToClothing
167+
161168
}

0 commit comments

Comments
 (0)