Skip to content

Commit 599d3ab

Browse files
Lazzi0706Lazzi0706
and
Lazzi0706
authored
Рефактор химимплантов (#724)
* new files stucture + renaming + code refactor * Implants are clickable now!! * another code refactor * i don't remember what is this * renamed sprites, some code refactor * final touches * now it's done * added migrations and locale fix * removed field "nospawn" * tests must live --------- Co-authored-by: Lazzi0706 <[email protected]>
1 parent f2e4d32 commit 599d3ab

36 files changed

+308
-416
lines changed

Content.Server/Implants/SubdermalImplantSystem.cs

+14-15
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using Content.Server.Actions;
12
using Content.Server.Chemistry.Containers.EntitySystems;
23
using Content.Server.Cuffs;
34
using Content.Server.Forensics;
@@ -16,12 +17,9 @@
1617
using Content.Shared.Preferences;
1718
using Robust.Shared.Audio.Systems;
1819
using Robust.Shared.Map;
19-
using Robust.Shared.Maths;
2020
using Robust.Shared.Physics;
2121
using Robust.Shared.Physics.Components;
2222
using Robust.Shared.Random;
23-
using System.Numerics;
24-
using Content.Shared.SS220.ReagentImplanter;
2523

2624
namespace Content.Server.Implants;
2725

@@ -38,7 +36,6 @@ public sealed class SubdermalImplantSystem : SharedSubdermalImplantSystem
3836
[Dependency] private readonly SharedTransformSystem _xform = default!;
3937
[Dependency] private readonly SolutionContainerSystem _solutionContainer = default!;
4038
[Dependency] private readonly ForensicsSystem _forensicsSystem = default!;
41-
4239
private EntityQuery<PhysicsComponent> _physicsQuery;
4340

4441
public override void Initialize()
@@ -47,7 +44,7 @@ public override void Initialize()
4744

4845
_physicsQuery = GetEntityQuery<PhysicsComponent>();
4946

50-
SubscribeLocalEvent<SubdermalImplantComponent, UseReagentCapsuleImplantEvent>(OnReagentCapsuleImplant);
47+
SubscribeLocalEvent<SubdermalImplantComponent, UseChemicalImplantEvent>(OnChemicaImplant); // SS220 - chemical-implants start
5148
SubscribeLocalEvent<SubdermalImplantComponent, UseFreedomImplantEvent>(OnFreedomImplant);
5249
SubscribeLocalEvent<StoreComponent, ImplantRelayEvent<AfterInteractUsingEvent>>(OnStoreRelay);
5350
SubscribeLocalEvent<SubdermalImplantComponent, ActivateImplantEvent>(OnActivateImplantEvent);
@@ -56,27 +53,29 @@ public override void Initialize()
5653

5754
}
5855

59-
private void OnReagentCapsuleImplant(EntityUid uid, SubdermalImplantComponent component, UseReagentCapsuleImplantEvent args)
56+
// SS220 - chemical-implants start
57+
private void OnChemicaImplant(EntityUid uid, SubdermalImplantComponent component, UseChemicalImplantEvent args)
6058
{
61-
if (!TryComp<SolutionContainerManagerComponent>(args.Performer, out var ownerSolutionContainerComp)
62-
|| !TryComp<ReagentCapsuleComponent>(uid, out var reagentCapsule)
63-
|| !TryComp<SolutionContainerManagerComponent>(uid, out var capsuleContainer))
59+
if (component.ImplantedEntity is not { } ent)
6460
return;
65-
66-
if (args.Handled || reagentCapsule.IsUsed)
61+
if (!TryComp<SolutionContainerManagerComponent>(args.Performer, out var _performerSolutionComp)
62+
|| !TryComp<SolutionContainerManagerComponent>(uid, out var _implantSolutionComp))
6763
return;
6864

69-
if (!_solutionContainer.TryGetSolution(new(args.Performer, ownerSolutionContainerComp), "chemicals", out var chemicals))
65+
if (!_solutionContainer.TryGetSolution(new(args.Performer, _performerSolutionComp), "chemicals", out var chemicalSolution))
7066
return;
7167

72-
if (!_solutionContainer.TryGetSolution(new(uid, capsuleContainer), "beaker", out var beaker))
68+
if (!_solutionContainer.TryGetSolution(new(uid, _implantSolutionComp), "beaker", out var beakerSolution))
7369
return;
7470

75-
_solutionContainer.TryTransferSolution(chemicals.Value, beaker.Value.Comp.Solution, beaker.Value.Comp.Solution.Volume);
76-
reagentCapsule.IsUsed = true;
71+
_solutionContainer.TryTransferSolution(chemicalSolution.Value, beakerSolution.Value.Comp.Solution, beakerSolution.Value.Comp.Solution.Volume);
72+
7773
args.Handled = true;
7874

75+
QueueDel(uid);
76+
7977
}
78+
// SS220 - chemical-implants end
8079

8180
private void OnStoreRelay(EntityUid uid, StoreComponent store, ImplantRelayEvent<AfterInteractUsingEvent> implantRelay)
8281
{

Content.Shared/Implants/Components/SubdermalImplantComponent.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public sealed partial class SubdermalImplantComponent : Component
5151
public EntityWhitelist? Blacklist;
5252
}
5353

54-
public sealed partial class UseReagentCapsuleImplantEvent : InstantActionEvent
54+
public sealed partial class UseChemicalImplantEvent : InstantActionEvent
5555
{
5656

5757
}

Content.Shared/Implants/SharedImplanterSystem.cs

+1-6
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
using Content.Shared.IdentityManagement;
88
using Content.Shared.Implants.Components;
99
using Content.Shared.Popups;
10-
using Content.Shared.SS220.ReagentImplanter;
10+
using Content.Shared.SS220.ChemicalImplant;
1111
using Content.Shared.Whitelist;
1212
using Robust.Shared.Containers;
1313
using Robust.Shared.Serialization;
@@ -100,11 +100,6 @@ public bool CanImplant(
100100
return false;
101101
}
102102

103-
if(TryComp<ReagentCapsuleComponent>(implant, out var capsuleComp) && capsuleComp.IsUsed)
104-
{
105-
_popup.PopupEntity(Loc.GetString("implanter-inject-used-capsule"), target);
106-
}
107-
108103
var ev = new AddImplantAttemptEvent(user, target, implant.Value, implanter);
109104
RaiseLocalEvent(target, ev);
110105
return !ev.Cancelled;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using Robust.Shared.GameStates;
2+
3+
namespace Content.Shared.SS220.ChemicalImplant
4+
{
5+
[RegisterComponent, NetworkedComponent]
6+
public sealed partial class ChemicalImplantComponent : Component
7+
{
8+
}
9+
10+
}

Content.Shared/SS220/ReagentImplanter/ReagentCapsuleComponent.cs

-12
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
ent-EmptyChemicalImplant = Пустой химический имплант
2+
.desc = Пустая белая капсула
3+
4+
ent-CombatChemicalImplant = Имплант с боевым стимулятором
5+
.desc = Капсула с розовой смесью внутри
6+
7+
ent-DABChemicalImplant = Имплант с антирадом "DAB"
8+
.desc = Капсула с тёмно-оранджевой смесью внутри
9+
10+
ent-SuicideChemicalImplant = Имплант с аматоксином
11+
.desc = Капсула с белой смесью внутри
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
ent-ChemicalImplanter = Химический имплантер
2+
.desc = Необычное устройство с иглой и съёмным контейнером
3+
4+
chemical-implant-action-name = Вскрыть
5+
chemical-implant-action-desc = Выпускает в кровь содержимое химического импланта
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
store-category-chemical-implants = Химические импланты
2+
3+
uplink-chemical-implanter-desc = Многоразовое средство имплантирования особых имплантов с препаратами внутрь тела
4+
5+
uplink-empty-chemical-implant-desc = Пустая капсула объёмом 30u для внедрения собственных смесей
6+
7+
uplink-combat-chemical-implant-desc = Содержит в себе препараты из боевого медипена
8+
9+
uplink-dab-chemical-implant-desc = Содержит препараты для лечения острой лучевой болезни
10+
11+
uplink-suicide-chemical-implant-desc = Содержит сильнейший яд, способный лишить цель жизни в течении нескольких секунд.

Resources/Locale/ru-RU/ss220/reagentinjector/capsules.ftl

-40
This file was deleted.

Resources/Locale/ru-RU/ss220/reagentinjector/reagents_implanter.ftl

-12
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
# Base
2+
- type: entity
3+
name: Chemical Implanter
4+
id: BaseChemicalImplanter
5+
parent: BaseItem
6+
abstract: true
7+
components:
8+
- type: ItemSlots
9+
- type: ContainerContainer
10+
containers:
11+
implanter_slot: !type:ContainerSlot { }
12+
- type: Implanter
13+
currentMode: Inject
14+
implantOnly: true
15+
implanterSlot:
16+
name: Implant
17+
locked: False
18+
priority: 0
19+
whitelist:
20+
tags:
21+
- ChemicalImplant
22+
- type: Sprite
23+
sprite: SS220/Objects/ChemicalImplants/implanters.rsi
24+
state: implanter
25+
- type: ItemMapper
26+
sprite: SS220/Objects/ChemicalImplants/implanters.rsi
27+
mapLayers:
28+
implanter_full:
29+
whitelist:
30+
tags:
31+
- ChemicalImplant
32+
- type: Item
33+
sprite: SS220/Objects/ChemicalImplants/implanters.rsi
34+
heldPrefix: 0
35+
- type: Appearance
36+
- type: Tag
37+
tags:
38+
- ChemicalImplant
39+
40+
- type: entity
41+
id: ChemicalImplanter
42+
name: chemical implanter
43+
description: chemical-implanter-desc
44+
parent: BaseChemicalImplanter
45+
components:
46+
- type: Implanter
47+
implant: EmptyChemicalImplant
48+
49+
- type: entity
50+
id: ActionUseChemicalImplant
51+
name: chemical-implant-action-name
52+
description: chemical-implant-action-desc
53+
noSpawn: true
54+
components:
55+
- type: InstantAction
56+
charges: 1
57+
checkCanInteract: false
58+
itemIconStyle: BigAction
59+
priority: -20
60+
icon:
61+
sprite: SS220/Objects/ChemicalImplants/implanters.rsi
62+
state: icon_empty
63+
event: !type:UseChemicalImplantEvent
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
# capsules
2+
- type: entity
3+
id: EmptyChemicalImplant
4+
name: empty chemical implant
5+
description: empty-chemical-implant-desc
6+
components:
7+
- type: ChemicalImplant
8+
- type: SubdermalImplant
9+
permanent: true
10+
implantAction: ActionUseChemicalImplant
11+
- type: Sprite
12+
sprite: SS220/Objects/ChemicalImplants/implants.rsi
13+
state: implant
14+
- type: Item
15+
sprite: SS220/Objects/ChemicalImplants/implants.rsi
16+
size: Small
17+
- type: SolutionContainerManager
18+
solutions:
19+
beaker:
20+
maxVol: 30
21+
canMix: false
22+
canReact: false
23+
- type: RefillableSolution
24+
solution: beaker
25+
- type: ExaminableSolution
26+
solution: beaker
27+
- type: InteractionOutline
28+
- type: Clickable
29+
- type: Appearance
30+
- type: SolutionContainerVisuals
31+
maxFillLevels: 1
32+
changeColor: false
33+
emptySpriteName: implant_used
34+
- type: Tag
35+
tags:
36+
- ChemicalImplant
37+
38+
- type: entity
39+
parent: EmptyChemicalImplant
40+
id: CombatChemicalImplant
41+
name: combat chemical implant
42+
description: combat-chemical-implant-desc
43+
components:
44+
- type: Sprite
45+
sprite: SS220/Objects/ChemicalImplants/implants.rsi
46+
layers:
47+
- state: combat
48+
map: ["enum.SolutionContainerLayers.Fill"]
49+
- type: SolutionContainerManager
50+
solutions:
51+
beaker:
52+
maxVol: 30
53+
reagents:
54+
- ReagentId: Omnizine
55+
Quantity: 25
56+
- ReagentId: TranexamicAcid
57+
Quantity: 5
58+
59+
- type: entity
60+
parent: EmptyChemicalImplant
61+
id: DABChemicalImplant
62+
name: dab chemical implant
63+
description: dab-chemical-implant-desc
64+
components:
65+
- type: Sprite
66+
sprite: SS220/Objects/ChemicalImplants/implants.rsi
67+
layers:
68+
- state: dab
69+
map: ["enum.SolutionContainerLayers.Fill"]
70+
- type: SolutionContainerManager
71+
solutions:
72+
beaker:
73+
maxVol: 30
74+
reagents:
75+
- ReagentId: Dylovene
76+
Quantity: 10
77+
- ReagentId: Arithrazine
78+
Quantity: 10
79+
- ReagentId: Bicaridine
80+
Quantity: 10
81+
82+
- type: entity
83+
parent: EmptyChemicalImplant
84+
id: SuicideChemicalImplant
85+
name: suicide chemical implant
86+
description: suicide-chemical-implant-desc
87+
components:
88+
- type: SubdermalImplant
89+
permanent: false
90+
- type: Sprite
91+
sprite: SS220/Objects/ChemicalImplants/implants.rsi
92+
layers:
93+
- state: dead
94+
map: ["enum.SolutionContainerLayers.Fill"]
95+
- type: SolutionContainerManager
96+
solutions:
97+
beaker:
98+
maxVol: 10
99+
reagents:
100+
- ReagentId: Amatoxin
101+
Quantity: 10

0 commit comments

Comments
 (0)