Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Рефактор химимплантов #724

Merged
merged 17 commits into from
Feb 21, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 14 additions & 15 deletions Content.Server/Implants/SubdermalImplantSystem.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using Content.Server.Actions;
using Content.Server.Chemistry.Containers.EntitySystems;
using Content.Server.Cuffs;
using Content.Server.Forensics;
Expand All @@ -16,12 +17,9 @@
using Content.Shared.Preferences;
using Robust.Shared.Audio.Systems;
using Robust.Shared.Map;
using Robust.Shared.Maths;
using Robust.Shared.Physics;
using Robust.Shared.Physics.Components;
using Robust.Shared.Random;
using System.Numerics;
using Content.Shared.SS220.ReagentImplanter;

namespace Content.Server.Implants;

Expand All @@ -38,7 +36,6 @@ public sealed class SubdermalImplantSystem : SharedSubdermalImplantSystem
[Dependency] private readonly SharedTransformSystem _xform = default!;
[Dependency] private readonly SolutionContainerSystem _solutionContainer = default!;
[Dependency] private readonly ForensicsSystem _forensicsSystem = default!;

private EntityQuery<PhysicsComponent> _physicsQuery;

public override void Initialize()
Expand All @@ -47,7 +44,7 @@ public override void Initialize()

_physicsQuery = GetEntityQuery<PhysicsComponent>();

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

}

private void OnReagentCapsuleImplant(EntityUid uid, SubdermalImplantComponent component, UseReagentCapsuleImplantEvent args)
// SS220 - chemical-implants start
private void OnChemicaImplant(EntityUid uid, SubdermalImplantComponent component, UseChemicalImplantEvent args)
{
if (!TryComp<SolutionContainerManagerComponent>(args.Performer, out var ownerSolutionContainerComp)
|| !TryComp<ReagentCapsuleComponent>(uid, out var reagentCapsule)
|| !TryComp<SolutionContainerManagerComponent>(uid, out var capsuleContainer))
if (component.ImplantedEntity is not { } ent)
return;

if (args.Handled || reagentCapsule.IsUsed)
if (!TryComp<SolutionContainerManagerComponent>(args.Performer, out var _performerSolutionComp)
|| !TryComp<SolutionContainerManagerComponent>(uid, out var _implantSolutionComp))
return;

if (!_solutionContainer.TryGetSolution(new(args.Performer, ownerSolutionContainerComp), "chemicals", out var chemicals))
if (!_solutionContainer.TryGetSolution(new(args.Performer, _performerSolutionComp), "chemicals", out var chemicalSolution))
return;

if (!_solutionContainer.TryGetSolution(new(uid, capsuleContainer), "beaker", out var beaker))
if (!_solutionContainer.TryGetSolution(new(uid, _implantSolutionComp), "beaker", out var beakerSolution))
return;

_solutionContainer.TryTransferSolution(chemicals.Value, beaker.Value.Comp.Solution, beaker.Value.Comp.Solution.Volume);
reagentCapsule.IsUsed = true;
_solutionContainer.TryTransferSolution(chemicalSolution.Value, beakerSolution.Value.Comp.Solution, beakerSolution.Value.Comp.Solution.Volume);

args.Handled = true;

QueueDel(uid);

}
// SS220 - chemical-implants end

private void OnStoreRelay(EntityUid uid, StoreComponent store, ImplantRelayEvent<AfterInteractUsingEvent> implantRelay)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public sealed partial class SubdermalImplantComponent : Component
public EntityWhitelist? Blacklist;
}

public sealed partial class UseReagentCapsuleImplantEvent : InstantActionEvent
public sealed partial class UseChemicalImplantEvent : InstantActionEvent
{

}
Expand Down
7 changes: 1 addition & 6 deletions Content.Shared/Implants/SharedImplanterSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
using Content.Shared.IdentityManagement;
using Content.Shared.Implants.Components;
using Content.Shared.Popups;
using Content.Shared.SS220.ReagentImplanter;
using Content.Shared.SS220.ChemicalImplant;
using Content.Shared.Whitelist;
using Robust.Shared.Containers;
using Robust.Shared.Serialization;
Expand Down Expand Up @@ -100,11 +100,6 @@ public bool CanImplant(
return false;
}

if(TryComp<ReagentCapsuleComponent>(implant, out var capsuleComp) && capsuleComp.IsUsed)
{
_popup.PopupEntity(Loc.GetString("implanter-inject-used-capsule"), target);
}

var ev = new AddImplantAttemptEvent(user, target, implant.Value, implanter);
RaiseLocalEvent(target, ev);
return !ev.Cancelled;
Expand Down
10 changes: 10 additions & 0 deletions Content.Shared/SS220/ChemicalImplant/ChemicalImplantComponent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using Robust.Shared.GameStates;

namespace Content.Shared.SS220.ChemicalImplant
{
[RegisterComponent, NetworkedComponent]
public sealed partial class ChemicalImplantComponent : Component
{
}

}
12 changes: 0 additions & 12 deletions Content.Shared/SS220/ReagentImplanter/ReagentCapsuleComponent.cs

This file was deleted.

11 changes: 11 additions & 0 deletions Resources/Locale/ru-RU/ss220/chemicalimplant/chemimplant.ftl
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
ent-EmptyChemicalImplant = Пустой химический имплант
.desc = Пустая белая капсула

ent-CombatChemicalImplant = Имплант с боевым стимулятором
.desc = Капсула с розовой смесью внутри

ent-DABChemicalImplant = Имплант с антирадом "DAB"
.desc = Капсула с тёмно-оранджевой смесью внутри

ent-SuicideChemicalImplant = Имплант с аматоксином
.desc = Капсула с белой смесью внутри
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
ent-ChemicalImplanter = Химический имплантер
.desc = Необычное устройство с иглой и съёмным контейнером

chemical-implant-action-name = Вскрыть
chemical-implant-action-desc = Выпускает в кровь содержимое химического импланта
11 changes: 11 additions & 0 deletions Resources/Locale/ru-RU/ss220/chemicalimplant/store.ftl
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
store-category-chemical-implants = Химические импланты

uplink-chemical-implanter-desc = Многоразовое средство имплантирования особых имплантов с препаратами внутрь тела

uplink-empty-chemical-implant-desc = Пустая капсула объёмом 30u для внедрения собственных смесей

uplink-combat-chemical-implant-desc = Содержит в себе препараты из боевого медипена

uplink-dab-chemical-implant-desc = Содержит препараты для лечения острой лучевой болезни

uplink-suicide-chemical-implant-desc = Содержит сильнейший яд, способный лишить цель жизни в течении нескольких секунд.
40 changes: 0 additions & 40 deletions Resources/Locale/ru-RU/ss220/reagentinjector/capsules.ftl

This file was deleted.

This file was deleted.

63 changes: 63 additions & 0 deletions Resources/Prototypes/SS220/ChemicalImplants/chemimplanters.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# Base
- type: entity
name: Chemical Implanter
id: BaseChemicalImplanter
parent: BaseItem
abstract: true
components:
- type: ItemSlots
- type: ContainerContainer
containers:
implanter_slot: !type:ContainerSlot { }
- type: Implanter
currentMode: Inject
implantOnly: true
implanterSlot:
name: Implant
locked: False
priority: 0
whitelist:
tags:
- ChemicalImplant
- type: Sprite
sprite: SS220/Objects/ChemicalImplants/implanters.rsi
state: implanter
- type: ItemMapper
sprite: SS220/Objects/ChemicalImplants/implanters.rsi
mapLayers:
implanter_full:
whitelist:
tags:
- ChemicalImplant
- type: Item
sprite: SS220/Objects/ChemicalImplants/implanters.rsi
heldPrefix: 0
- type: Appearance
- type: Tag
tags:
- ChemicalImplant

- type: entity
id: ChemicalImplanter
name: chemical implanter
description: chemical-implanter-desc
parent: BaseChemicalImplanter
components:
- type: Implanter
implant: EmptyChemicalImplant

- type: entity
id: ActionUseChemicalImplant
name: chemical-implant-action-name
description: chemical-implant-action-desc
noSpawn: true
components:
- type: InstantAction
charges: 1
checkCanInteract: false
itemIconStyle: BigAction
priority: -20
icon:
sprite: SS220/Objects/ChemicalImplants/implanters.rsi
state: icon_empty
event: !type:UseChemicalImplantEvent
101 changes: 101 additions & 0 deletions Resources/Prototypes/SS220/ChemicalImplants/chemimplants.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
# capsules
- type: entity
id: EmptyChemicalImplant
name: empty chemical implant
description: empty-chemical-implant-desc
components:
- type: ChemicalImplant
- type: SubdermalImplant
permanent: true
implantAction: ActionUseChemicalImplant
- type: Sprite
sprite: SS220/Objects/ChemicalImplants/implants.rsi
state: implant
- type: Item
sprite: SS220/Objects/ChemicalImplants/implants.rsi
size: Small
- type: SolutionContainerManager
solutions:
beaker:
maxVol: 30
canMix: false
canReact: false
- type: RefillableSolution
solution: beaker
- type: ExaminableSolution
solution: beaker
- type: InteractionOutline
- type: Clickable
- type: Appearance
- type: SolutionContainerVisuals
maxFillLevels: 1
changeColor: false
emptySpriteName: implant_used
- type: Tag
tags:
- ChemicalImplant

- type: entity
parent: EmptyChemicalImplant
id: CombatChemicalImplant
name: combat chemical implant
description: combat-chemical-implant-desc
components:
- type: Sprite
sprite: SS220/Objects/ChemicalImplants/implants.rsi
layers:
- state: combat
map: ["enum.SolutionContainerLayers.Fill"]
- type: SolutionContainerManager
solutions:
beaker:
maxVol: 30
reagents:
- ReagentId: Omnizine
Quantity: 25
- ReagentId: TranexamicAcid
Quantity: 5

- type: entity
parent: EmptyChemicalImplant
id: DABChemicalImplant
name: dab chemical implant
description: dab-chemical-implant-desc
components:
- type: Sprite
sprite: SS220/Objects/ChemicalImplants/implants.rsi
layers:
- state: dab
map: ["enum.SolutionContainerLayers.Fill"]
- type: SolutionContainerManager
solutions:
beaker:
maxVol: 30
reagents:
- ReagentId: Dylovene
Quantity: 10
- ReagentId: Arithrazine
Quantity: 10
- ReagentId: Bicaridine
Quantity: 10

- type: entity
parent: EmptyChemicalImplant
id: SuicideChemicalImplant
name: suicide chemical implant
description: suicide-chemical-implant-desc
components:
- type: SubdermalImplant
permanent: false
- type: Sprite
sprite: SS220/Objects/ChemicalImplants/implants.rsi
layers:
- state: dead
map: ["enum.SolutionContainerLayers.Fill"]
- type: SolutionContainerManager
solutions:
beaker:
maxVol: 10
reagents:
- ReagentId: Amatoxin
Quantity: 10
Loading
Loading