modsuit-demo (#3502)
Co-authored-by: darneya <darneya.git> Co-authored-by: DerKurait <AlbarKabrt@yandex.ru>
72
Content.Server/_Sunrise/Modsuit/ModsuitSystem.cs
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
using Content.Shared.Hands.EntitySystems;
|
||||
using Content.Shared.Tag;
|
||||
using Robust.Shared.Containers;
|
||||
using Content.Shared.Containers.ItemSlots;
|
||||
using Content.Shared.Light.Components;
|
||||
using Content.Shared.Clothing.Components;
|
||||
using Content.Shared._Sunrise.PersonalBiocode;
|
||||
using Content.Shared.Inventory.Events;
|
||||
using Content.Shared.Forensics.Components;
|
||||
using Content.Shared._Sunrise.Modsuit;
|
||||
using Content.Server.Chat.Systems;
|
||||
using Content.Server.Popups;
|
||||
using Content.Shared.Popups;
|
||||
using Content.Shared.Clothing.EntitySystems;
|
||||
|
||||
namespace Content.Server._Sunrise.Modsuit;
|
||||
|
||||
public sealed class ModsuitSystem : SharedModsuitSystem
|
||||
{
|
||||
[Dependency] private readonly TagSystem _tag = default!;
|
||||
[Dependency] private readonly PopupSystem _popupSystem = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<ModsuitComponent, ContainerIsInsertingAttemptEvent>(OnSuitInsertAttempt);
|
||||
SubscribeLocalEvent<ModsuitComponent, GotEquippedEvent>(OnEquip);
|
||||
}
|
||||
|
||||
private void OnSuitInsertAttempt(EntityUid uid, ModsuitComponent comp, ContainerIsInsertingAttemptEvent args)
|
||||
{
|
||||
|
||||
if (comp.IsActivated == true)
|
||||
return;
|
||||
|
||||
if (args.Container.ID != "modsuit_core")
|
||||
return;
|
||||
|
||||
if (!TryComp<TagComponent>(args.EntityUid, out var itemSlots) || !_tag.HasTag(itemSlots, "ModsuitCore"))
|
||||
return;
|
||||
|
||||
comp.IsActivated = true;
|
||||
EntityManager.Dirty(uid, comp);
|
||||
|
||||
}
|
||||
|
||||
public void OnEquip(EntityUid uid, ModsuitComponent comp, GotEquippedEvent args)
|
||||
{
|
||||
if (comp.RoundStartBiocode == true)
|
||||
{
|
||||
if (!TryComp<DnaComponent>(args.Equipee, out var PersonDNA))
|
||||
return;
|
||||
|
||||
if (!TryComp(uid, out ToggleableClothingComponent? Toggleable))
|
||||
return;
|
||||
|
||||
if (!TryComp<PersonalBiocodeComponent>(Toggleable.ClothingUid, out var SuitBiocode))
|
||||
return;
|
||||
|
||||
if (PersonDNA.DNA != null)
|
||||
SuitBiocode.DNA = PersonDNA.DNA;
|
||||
|
||||
SuitBiocode.IsAuthorized = true;
|
||||
EntityManager.Dirty(SuitBiocode.Owner, SuitBiocode);
|
||||
|
||||
comp.RoundStartBiocode = false;
|
||||
EntityManager.Dirty(uid, comp);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,94 @@
|
|||
using Content.Shared.NPC.Components;
|
||||
using Content.Shared.Inventory.Events;
|
||||
using Content.Shared.Inventory;
|
||||
using Content.Server.Chat.Systems;
|
||||
using Content.Server.Popups;
|
||||
using Content.Shared.Popups;
|
||||
using Content.Server._Sunrise.PersonalBiocode;
|
||||
using Content.Shared._Sunrise.PersonalBiocode;
|
||||
using Content.Shared.Emag.Systems;
|
||||
using Content.Shared.Actions;
|
||||
using Content.Shared.Forensics.Components;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Content.Shared.Clothing.EntitySystems;
|
||||
|
||||
namespace Content.Server._Sunrise.PersonalBiocode;
|
||||
|
||||
public sealed class PersonalBiocodeSystem : SharedPersonalBiocodeSystem // Пока только для модсьюитов
|
||||
{
|
||||
[Dependency] private readonly ChatSystem _chat = default!;
|
||||
[Dependency] private readonly PopupSystem _popupSystem = default!;
|
||||
[Dependency] private readonly InventorySystem _inventory = default!;
|
||||
|
||||
private static readonly EntProtoId Action = "ActionSaveDNA";
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
SubscribeLocalEvent<PersonalBiocodeComponent, GetItemActionsEvent>(OnGetActions);
|
||||
SubscribeLocalEvent<PersonalBiocodeComponent, StoreDNAActionEvent>(OnDNAStored);
|
||||
SubscribeLocalEvent<PersonalBiocodeComponent, GotEquippedEvent>(OnEquip);
|
||||
SubscribeLocalEvent<PersonalBiocodeComponent, GotEmaggedEvent>(OnEmagged);
|
||||
}
|
||||
|
||||
private void OnGetActions(EntityUid uid, PersonalBiocodeComponent comp, GetItemActionsEvent args)
|
||||
{
|
||||
if (comp.IsAuthorized == false)
|
||||
{
|
||||
args.AddAction(ref comp.ActionEntity, Action);
|
||||
}
|
||||
}
|
||||
|
||||
public void OnDNAStored(EntityUid uid, PersonalBiocodeComponent comp, StoreDNAActionEvent args)
|
||||
{
|
||||
if (args.Handled)
|
||||
return;
|
||||
|
||||
if (comp.IsAuthorized == false)
|
||||
{
|
||||
if (TryComp<DnaComponent>(args.Performer, out var PersonDNA) && PersonDNA.DNA != null)
|
||||
{
|
||||
comp.DNA = PersonDNA.DNA;
|
||||
comp.IsAuthorized = true;
|
||||
EntityManager.Dirty(uid, comp);
|
||||
|
||||
_popupSystem.PopupEntity(Loc.GetString("person-dna-was-stored"), args.Performer, args.Performer);
|
||||
}
|
||||
else
|
||||
{
|
||||
_popupSystem.PopupEntity(Loc.GetString("person-dna-not-presented"), args.Performer, args.Performer);
|
||||
}
|
||||
|
||||
}
|
||||
args.Handled = true;
|
||||
}
|
||||
|
||||
public void OnEquip(EntityUid uid, PersonalBiocodeComponent comp, GotEquippedEvent args)
|
||||
{
|
||||
if (comp.IsAuthorized == true)
|
||||
{
|
||||
if (TryComp(args.Equipee, out DnaComponent? PersonNDA) && comp.DNA == PersonNDA.DNA)
|
||||
{
|
||||
_popupSystem.PopupClient("biocode-equip-failure", args.Equipee, args.Equipee, PopupType.MediumCaution);
|
||||
return;
|
||||
}
|
||||
|
||||
_inventory.TryUnequip(args.Equipee, "outerClothing", true, true);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void OnEmagged(EntityUid uid, PersonalBiocodeComponent comp, GotEmaggedEvent args)
|
||||
{
|
||||
if (args.Handled)
|
||||
return;
|
||||
|
||||
if (!comp.BreakAble)
|
||||
return;
|
||||
|
||||
EntityManager.RemoveComponent<PersonalBiocodeComponent>(uid);
|
||||
|
||||
//_popupSystem.PopupEntity(Loc.GetString("hardsuit-identification-on-emagged"), uid);
|
||||
|
||||
args.Handled = true;
|
||||
}
|
||||
}
|
||||
|
|
@ -21,6 +21,8 @@ using Robust.Shared.Prototypes;
|
|||
using Content.Shared.Chemistry.Reagent;
|
||||
using Content.Shared.DoAfter;
|
||||
using Robust.Shared.Utility;
|
||||
using Content.Shared.Inventory;
|
||||
using Content.Shared._Sunrise.HardsuitInjection.Components;
|
||||
// Sunrise-End
|
||||
|
||||
namespace Content.Shared.Chemistry.EntitySystems;
|
||||
|
|
@ -37,6 +39,7 @@ public sealed class HypospraySystem : EntitySystem
|
|||
// Sunrise-Start
|
||||
[Dependency] private readonly SharedDoAfterSystem _doAfter = default!;
|
||||
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
||||
[Dependency] private readonly InventorySystem _inventory = default!;
|
||||
// Sunrise-End
|
||||
|
||||
public override void Initialize()
|
||||
|
|
@ -154,6 +157,19 @@ public sealed class HypospraySystem : EntitySystem
|
|||
if (_useDelay.IsDelayed((uid, delayComp)))
|
||||
return false;
|
||||
}
|
||||
// Sunrise-Start
|
||||
if (_inventory.TryGetSlotEntity(target, "outerClothing", out var suit))
|
||||
{
|
||||
if (TryComp<InjectComponent>(suit, out var injectComp))
|
||||
{
|
||||
if (injectComp.Locked)
|
||||
{
|
||||
_popup.PopupEntity(Loc.GetString("hardsuitinjection-True"), target, user);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Sunrise-End
|
||||
|
||||
string? msgFormat = null;
|
||||
|
||||
|
|
|
|||
|
|
@ -13,6 +13,9 @@ using Robust.Shared.Network;
|
|||
using Robust.Shared.Serialization;
|
||||
using Robust.Shared.Timing;
|
||||
using Robust.Shared.Utility;
|
||||
using Content.Shared._Sunrise.Modsuit; //Sunrise-Edit
|
||||
using Content.Shared._Sunrise.PersonalBiocode;
|
||||
using Content.Shared.Forensics.Components;
|
||||
|
||||
namespace Content.Shared.Clothing.EntitySystems;
|
||||
|
||||
|
|
@ -238,7 +241,22 @@ public sealed class ToggleableClothingSystem : EntitySystem
|
|||
{
|
||||
if (component.Container == null || component.ClothingUid == null)
|
||||
return;
|
||||
//Sunrise-Start
|
||||
if (TryComp<ModsuitComponent>(target, out var modSuitComp) && !modSuitComp.IsActivated)
|
||||
{
|
||||
_popupSystem.PopupClient(Loc.GetString("modsuit-equip-failure"), user, user, PopupType.MediumCaution);
|
||||
return;
|
||||
}
|
||||
|
||||
if (modSuitComp != null && TryComp<PersonalBiocodeComponent>(component.ClothingUid, out var suitBiocodeComp) && suitBiocodeComp.IsAuthorized == true)
|
||||
{
|
||||
if (TryComp<DnaComponent>(user, out var PersonNDA) && suitBiocodeComp.DNA != PersonNDA.DNA)
|
||||
{
|
||||
_popupSystem.PopupClient(Loc.GetString("biocode-equip-failure"), user, user, PopupType.MediumCaution);
|
||||
return;
|
||||
}
|
||||
}
|
||||
//Sunrise-End
|
||||
var parent = Transform(target).ParentUid;
|
||||
if (component.Container.ContainedEntity == null)
|
||||
_inventorySystem.TryUnequip(user, parent, component.Slot, force: true);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,10 @@
|
|||
using Content.Shared.Clothing.EntitySystems;
|
||||
using Content.Shared._Sunrise.HardsuitInjection.EntitySystems;
|
||||
|
||||
namespace Content.Shared._Sunrise.HardsuitInjection.Components;
|
||||
|
||||
[Access(typeof(AmpulaSystem))]
|
||||
[RegisterComponent]
|
||||
public sealed partial class AmpulaComponent : Component
|
||||
{
|
||||
}
|
||||
|
|
@ -0,0 +1,60 @@
|
|||
using Content.Shared.Interaction;
|
||||
using Content.Shared.Clothing.Components;
|
||||
using Content.Shared.Inventory;
|
||||
using Content.Shared.Containers.ItemSlots;
|
||||
using Content.Shared.Hands.Components;
|
||||
using Content.Shared.Hands.EntitySystems;
|
||||
using Content.Shared._Sunrise.HardsuitInjection.Components;
|
||||
|
||||
namespace Content.Shared._Sunrise.HardsuitInjection.EntitySystems;
|
||||
|
||||
public sealed partial class AmpulaSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly SharedHandsSystem _handsSystem = default!;
|
||||
[Dependency] private readonly IEntityManager _entManager = default!;
|
||||
public override void Initialize()
|
||||
{
|
||||
SubscribeLocalEvent<AmpulaComponent, AfterInteractEvent>(OnAfterInteract);
|
||||
}
|
||||
private void OnAfterInteract(EntityUid uid, AmpulaComponent component, AfterInteractEvent args)
|
||||
{
|
||||
if (!args.CanReach)
|
||||
return;
|
||||
if (args.Handled)
|
||||
return;
|
||||
var target = args.Target;
|
||||
var user = args.User;
|
||||
var ampula = args.Used;
|
||||
var sys = _entManager.System<ItemSlotsSystem>();
|
||||
if (uid != ampula)
|
||||
return;
|
||||
if (!TryComp<InventoryComponent>(target, out var inventory))
|
||||
return;
|
||||
if (!_entManager.System<InventorySystem>().TryGetSlotEntity(target.Value, "outerClothing", out var slot, inventory))
|
||||
return;
|
||||
if (!TryComp<ItemSlotsComponent>(slot, out var itemslots))
|
||||
return;
|
||||
if (!TryComp<InjectComponent>(slot, out var containerlock))
|
||||
return;
|
||||
if (!sys.TryGetSlot(slot.Value, containerlock.ContainerId, out var itemslot, itemslots))
|
||||
return;
|
||||
if (!TryComp<HandsComponent>(user, out var handscomp))
|
||||
return;
|
||||
if (!itemslot.InsertOnInteract)
|
||||
return;
|
||||
|
||||
if (!sys.CanInsert(slot.Value, args.Used, args.User, itemslot, swap: itemslot.Swap))
|
||||
return;
|
||||
|
||||
// Drop the held item onto the floor. Return if the user cannot drop.
|
||||
if (!_handsSystem.TryDrop(args.User, args.Used))
|
||||
return;
|
||||
|
||||
if (itemslot.Item != null)
|
||||
_handsSystem.TryPickupAnyHand(args.User, itemslot.Item.Value, handsComp: handscomp);
|
||||
|
||||
sys.TryInsert(slot.Value, itemslot, args.Used, user);
|
||||
args.Handled = true;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
using Content.Shared.Actions;
|
||||
|
||||
namespace Content.Shared.Clothing.EntitySystems;
|
||||
|
||||
public sealed partial class EjectionEvent : InstantActionEvent;
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
using Content.Shared.Actions;
|
||||
|
||||
namespace Content.Shared.Clothing.EntitySystems;
|
||||
|
||||
public sealed partial class InjectionEvent : InstantActionEvent;
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
using Content.Shared.Actions;
|
||||
|
||||
namespace Content.Shared.Clothing.EntitySystems;
|
||||
|
||||
/// <summary>
|
||||
/// Event that triggers when switching the emergency compartment
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// EC - emergency compartment
|
||||
/// </remarks>
|
||||
public sealed partial class ToggleECEvent : InstantActionEvent;
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
using Content.Shared.DoAfter;
|
||||
using Robust.Shared.Serialization;
|
||||
|
||||
namespace Content.Shared.Clothing.EntitySystems;
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public sealed partial class ToggleSlotDoAfterEvent : SimpleDoAfterEvent;
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
using Content.Shared.Chemistry.Components;
|
||||
using Content.Shared.FixedPoint;
|
||||
using Robust.Shared.Serialization;
|
||||
|
||||
namespace Content.Shared.Clothing.EntitySystems;
|
||||
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public sealed class UpdateECEvent(NetEntity beakerUid, Solution solution, FixedPoint2 reagentTransfer) : EntityEventArgs
|
||||
{
|
||||
public NetEntity BeakerUid = beakerUid;
|
||||
public Solution Solution = solution;
|
||||
public FixedPoint2 ReagentTransfer = reagentTransfer;
|
||||
public Solution? RemovedReagentAmount = null;
|
||||
}
|
||||
77
Content.Shared/_Sunrise/HardsuitInjection/InjectComponent.cs
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
using Content.Shared._Sunrise.HardsuitInjection.EntitySystems;
|
||||
using Content.Shared.Inventory;
|
||||
using Robust.Shared.Audio;
|
||||
using Robust.Shared.Containers;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
|
||||
using System.Threading;
|
||||
|
||||
namespace Content.Shared._Sunrise.HardsuitInjection.Components;
|
||||
|
||||
|
||||
[Access(typeof(InjectSystem))]
|
||||
[RegisterComponent]
|
||||
public sealed partial class InjectComponent : Component
|
||||
{
|
||||
[DataField("toggleInjectionAction", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
|
||||
public string ToggleInjectionAction = "ActionToggleInjection";
|
||||
|
||||
[DataField("injectionAction", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
|
||||
public string InjectionAction = "ActionInjection";
|
||||
|
||||
|
||||
[DataField("requiredSlot")]
|
||||
public SlotFlags RequiredFlags = SlotFlags.OUTERCLOTHING;
|
||||
|
||||
[DataField("containerId")]
|
||||
public string ContainerId = "beakerSlot";
|
||||
|
||||
|
||||
[DataField("verbText")]
|
||||
public string VerbText = "hardsuitinjection-toggle";
|
||||
|
||||
|
||||
[DataField("delay")]
|
||||
public TimeSpan? Delay = TimeSpan.FromSeconds(30);
|
||||
|
||||
[DataField("stripDelay")]
|
||||
public TimeSpan? StripDelay = TimeSpan.FromSeconds(10);
|
||||
|
||||
|
||||
[DataField("injectSound")]
|
||||
public SoundSpecifier InjectSound = new SoundPathSpecifier("/Audio/Items/hypospray.ogg");
|
||||
|
||||
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
public EntityUid? ToggleInjectionActionEntity;
|
||||
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
public EntityUid? InjectionActionEntity;
|
||||
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
public ContainerSlot? Container;
|
||||
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
public bool Locked = true;
|
||||
|
||||
[DataField("openCloseDelay")]
|
||||
public TimeSpan OpenCloseDelay = TimeSpan.FromSeconds(3);
|
||||
|
||||
[DataField("canBeOpened")]
|
||||
public bool CanBeOpened = true;
|
||||
|
||||
[DataField("alwaysOpen")]
|
||||
public bool AlwaysOpen = false;
|
||||
|
||||
[DataField("autoClose")]
|
||||
public bool AutoClose = true;
|
||||
|
||||
[DataField("autoCloseDelay")]
|
||||
public TimeSpan AutoCloseDelay = TimeSpan.FromSeconds(10);
|
||||
|
||||
[ViewVariables]
|
||||
public TimeSpan LastOpenTime;
|
||||
|
||||
[ViewVariables]
|
||||
public CancellationTokenSource? AutoCloseCancelToken;
|
||||
}
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
namespace Content.Shared._Sunrise.HardsuitInjection.Components;
|
||||
|
||||
[RegisterComponent]
|
||||
public sealed partial class InjectNeedComponent : Component;
|
||||
|
|
@ -0,0 +1,77 @@
|
|||
|
||||
|
||||
using Content.Shared.Actions;
|
||||
using Content.Shared.Clothing.EntitySystems;
|
||||
using Content.Shared._Sunrise.HardsuitInjection.Components;
|
||||
using Content.Shared.DoAfter;
|
||||
using Robust.Shared.Timing;
|
||||
|
||||
namespace Content.Shared._Sunrise.HardsuitInjection.EntitySystems;
|
||||
|
||||
public sealed partial class InjectSystem
|
||||
{
|
||||
private void InitializeActionEvents()
|
||||
{
|
||||
SubscribeLocalEvent<InjectComponent, ToggleECEvent>(OnToggleEC);
|
||||
SubscribeLocalEvent<InjectComponent, InjectionEvent>(OnInjection);
|
||||
SubscribeLocalEvent<InjectComponent, GetItemActionsEvent>(OnGetItemAction);
|
||||
}
|
||||
|
||||
private void OnGetItemAction(EntityUid uid, InjectComponent component, GetItemActionsEvent args)
|
||||
{
|
||||
if (!_timing.IsFirstTimePredicted) return;
|
||||
if ((args.SlotFlags | component.RequiredFlags) != component.RequiredFlags) return;
|
||||
|
||||
args.AddAction(ref component.ToggleInjectionActionEntity, component.ToggleInjectionAction);
|
||||
args.AddAction(ref component.InjectionActionEntity, component.InjectionAction);
|
||||
}
|
||||
|
||||
private void OnToggleEC(EntityUid uid, InjectComponent component, ToggleECEvent args)
|
||||
{
|
||||
if (args.Handled) return;
|
||||
if (_netManager.IsClient) return;
|
||||
|
||||
if (!component.CanBeOpened)
|
||||
{
|
||||
args.Handled = true;
|
||||
return;
|
||||
}
|
||||
|
||||
if (component.AlwaysOpen)
|
||||
{
|
||||
component.Locked = false;
|
||||
args.Handled = true;
|
||||
component.ToggleInjectionActionEntity = args.Action;
|
||||
return;
|
||||
}
|
||||
|
||||
if (component.OpenCloseDelay > TimeSpan.Zero)
|
||||
{
|
||||
_doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, args.Performer, component.OpenCloseDelay, new ToggleSlotDoAfterEvent(), uid)
|
||||
{
|
||||
BreakOnDamage = true,
|
||||
BreakOnMove = true,
|
||||
DistanceThreshold = 2,
|
||||
});
|
||||
args.Handled = true;
|
||||
component.ToggleInjectionActionEntity = args.Action;
|
||||
return;
|
||||
}
|
||||
|
||||
component.Locked = false;
|
||||
args.Handled = true;
|
||||
component.ToggleInjectionActionEntity = args.Action;
|
||||
|
||||
}
|
||||
|
||||
private void OnInjection(EntityUid uid, InjectComponent component, InjectionEvent args)
|
||||
{
|
||||
if (args.Handled) return;
|
||||
if (_netManager.IsClient) return;
|
||||
|
||||
args.Handled = true;
|
||||
component.InjectionActionEntity = args.Action;
|
||||
|
||||
Inject(uid, uid);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,111 @@
|
|||
using Content.Shared.Actions;
|
||||
using Content.Shared.Containers.ItemSlots;
|
||||
using Content.Shared.Examine;
|
||||
using Content.Shared.Inventory;
|
||||
using Content.Shared.Popups;
|
||||
using Content.Shared.Verbs;
|
||||
using Robust.Shared.Containers;
|
||||
using Robust.Shared.Utility;
|
||||
using Content.Shared.Mobs.Components;
|
||||
using Content.Shared.Mobs;
|
||||
using Content.Shared._Sunrise.HardsuitInjection.Components;
|
||||
using Content.Shared.Clothing.EntitySystems;
|
||||
|
||||
namespace Content.Shared._Sunrise.HardsuitInjection.EntitySystems;
|
||||
|
||||
public sealed partial class InjectSystem
|
||||
{
|
||||
private void InitializeBaseEvents()
|
||||
{
|
||||
SubscribeLocalEvent<InjectComponent, ComponentInit>(OnInit);
|
||||
|
||||
SubscribeLocalEvent<InjectComponent, ExaminedEvent>(OnExamine);
|
||||
|
||||
SubscribeLocalEvent<InjectComponent, EjectionEvent>(OnEject);
|
||||
SubscribeLocalEvent<InjectComponent, InventoryRelayedEvent<GetVerbsEvent<EquipmentVerb>>>(OnGetRelayedVerbs);
|
||||
|
||||
SubscribeLocalEvent<AmpulaComponent, EntGotInsertedIntoContainerMessage>(OnInserted);
|
||||
SubscribeLocalEvent<InjectNeedComponent, MobStateChangedEvent>(OnStateChanged);
|
||||
}
|
||||
|
||||
private void OnInit(EntityUid uid, InjectComponent component, ComponentInit args)
|
||||
{
|
||||
component.Container = _containerSystem.EnsureContainer<ContainerSlot>(uid, component.ContainerId);
|
||||
|
||||
if (!TryComp<ItemSlotsComponent>(uid, out var comp)) return;
|
||||
|
||||
_itemSlotsSystem.SetLock(uid, component.ContainerId, component.Locked, comp);
|
||||
}
|
||||
|
||||
private void OnExamine(EntityUid uid, InjectComponent component, ExaminedEvent args)
|
||||
{
|
||||
args.PushMarkup(Loc.GetString("hardsuitinjection-" + component.Locked.ToString()));
|
||||
}
|
||||
|
||||
private void OnGetRelayedVerbs(EntityUid uid, InjectComponent component, InventoryRelayedEvent<GetVerbsEvent<EquipmentVerb>> args)
|
||||
{
|
||||
OnGetVerbs(uid, component, args.Args);
|
||||
}
|
||||
|
||||
private void OnEject(EntityUid uid, InjectComponent component, EjectionEvent args)
|
||||
{
|
||||
if (args.Handled) return;
|
||||
if (_netManager.IsClient) return;
|
||||
|
||||
if (!TryComp<ItemSlotsComponent>(args.Performer, out var itemslots)) return;
|
||||
if (!_itemSlotsSystem.TryGetSlot(args.Performer, component.ContainerId, out var slot, itemslots)) return;
|
||||
|
||||
if (slot.Locked)
|
||||
{
|
||||
_popupSystem.PopupEntity(Loc.GetString("hardsuitinjection-closed"), args.Performer, args.Performer);
|
||||
|
||||
return;
|
||||
}
|
||||
if (slot.ContainerSlot == null || slot.ContainerSlot.ContainedEntity == null)
|
||||
{
|
||||
_popupSystem.PopupEntity(Loc.GetString("hardsuitinjection-nobeaker"), args.Performer, args.Performer);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
_itemSlotsSystem.TryEjectToHands(args.Performer, slot, args.Performer);
|
||||
}
|
||||
|
||||
#region Crit
|
||||
|
||||
private void OnStateChanged(EntityUid uid, InjectNeedComponent component, MobStateChangedEvent args)
|
||||
{
|
||||
if (_netManager.IsClient) return;
|
||||
if (args.NewMobState != MobState.Critical) return;
|
||||
|
||||
if (!TryComp<InventoryComponent>(args.Target, out var inventory)) return;
|
||||
|
||||
if (!_inventorySystem.TryGetSlotEntity(args.Target, "outerClothing", out var slot, inventory)) return;
|
||||
|
||||
if (!TryComp<ItemSlotsComponent>(slot, out var _)) return;
|
||||
if (!TryComp<InjectComponent>(slot, out var _)) return;
|
||||
|
||||
_popupSystem.PopupEntity(Loc.GetString("hardsuitinjection-critical"), args.Target, PopupType.Medium);
|
||||
|
||||
Inject(slot.Value, slot.Value);
|
||||
}
|
||||
|
||||
private void OnInserted(EntityUid uid, AmpulaComponent component, EntGotInsertedIntoContainerMessage args)
|
||||
{
|
||||
if (!TryComp<InjectComponent>(args.Container.Owner, out var inject)) return;
|
||||
var action = _actionsSystem.GetAction(inject.ToggleInjectionActionEntity);
|
||||
|
||||
if (
|
||||
action == null ||
|
||||
action.Value.Comp.AttachedEntity == null
|
||||
) return;
|
||||
|
||||
if (!TryComp<MobStateComponent>(action.Value.Comp.AttachedEntity, out var state)) return;
|
||||
if (state.CurrentState == MobState.Invalid || state.CurrentState == MobState.Alive) return;
|
||||
|
||||
_popupSystem.PopupEntity(Loc.GetString("hardsuitinjection-critical"), args.Container.Owner, PopupType.Medium);
|
||||
Inject(args.Container.Owner, uid);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
|
@ -0,0 +1,87 @@
|
|||
|
||||
|
||||
using Content.Shared.Clothing.EntitySystems;
|
||||
using Content.Shared.Database;
|
||||
using Content.Shared.DoAfter;
|
||||
using Content.Shared.IdentityManagement;
|
||||
using Content.Shared._Sunrise.HardsuitInjection.Components;
|
||||
using Content.Shared.Popups;
|
||||
using Content.Shared.Verbs;
|
||||
using Robust.Shared.Utility;
|
||||
|
||||
namespace Content.Shared._Sunrise.HardsuitInjection.EntitySystems;
|
||||
|
||||
public sealed partial class InjectSystem
|
||||
{
|
||||
private void InitializeDoAfterEvents()
|
||||
{
|
||||
SubscribeLocalEvent<InjectComponent, GetVerbsEvent<EquipmentVerb>>(OnGetVerbs);
|
||||
SubscribeLocalEvent<InjectComponent, ToggleSlotDoAfterEvent>(OnDoAfterComplete);
|
||||
}
|
||||
|
||||
private void OnGetVerbs(EntityUid uid, InjectComponent component, GetVerbsEvent<EquipmentVerb> args)
|
||||
{
|
||||
if (!args.CanAccess || !args.CanInteract || component.Container == null) return;
|
||||
|
||||
var text = component.VerbText ?? (component.ToggleInjectionActionEntity == null ? null : Name(component.ToggleInjectionActionEntity.Value));
|
||||
|
||||
if (text == null) return;
|
||||
if (!_inventorySystem.InSlotWithFlags(uid, component.RequiredFlags)) return;
|
||||
|
||||
var wearer = Transform(uid).ParentUid;
|
||||
|
||||
if (args.User != wearer && component.StripDelay == null) return;
|
||||
|
||||
var verb = new EquipmentVerb()
|
||||
{
|
||||
Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/outfit.svg.192dpi.png")),
|
||||
Text = Loc.GetString(text),
|
||||
};
|
||||
|
||||
if (args.User == wearer)
|
||||
{
|
||||
verb.EventTarget = uid;
|
||||
verb.ExecutionEventArgs = new ToggleECEvent() { Performer = args.User };
|
||||
}
|
||||
else
|
||||
{
|
||||
verb.Act = () => StartDoAfter(args.User, uid, Transform(uid).ParentUid, component);
|
||||
}
|
||||
|
||||
args.Verbs.Add(verb);
|
||||
}
|
||||
|
||||
private void StartDoAfter(EntityUid user, EntityUid item, EntityUid wearer, InjectComponent component)
|
||||
{
|
||||
if (component.StripDelay == null) return;
|
||||
|
||||
var (time, stealth) = _strippable.GetStripTimeModifiers(user, wearer, null, component.StripDelay.Value);
|
||||
|
||||
var args = new DoAfterArgs(EntityManager, user, time, new ToggleSlotDoAfterEvent(), item, wearer, item)
|
||||
{
|
||||
BreakOnDamage = true,
|
||||
BreakOnMove = true,
|
||||
DistanceThreshold = 2,
|
||||
};
|
||||
|
||||
if (!_doAfter.TryStartDoAfter(args)) return;
|
||||
if (component.Locked)
|
||||
_sharedAdminLogSystem.Add(LogType.ForceFeed, $"{_entManager.ToPrettyString(user):user} is trying to open ES of {_entManager.ToPrettyString(wearer):wearer}");
|
||||
else
|
||||
_sharedAdminLogSystem.Add(LogType.ForceFeed, $"{_entManager.ToPrettyString(user):user} is trying to close ES of {_entManager.ToPrettyString(wearer):wearer}");
|
||||
|
||||
if (stealth) return;
|
||||
|
||||
var popup = Loc.GetString("strippable-component-alert-owner-interact", ("user", Identity.Entity(user, EntityManager)), ("item", item));
|
||||
_popupSystem.PopupEntity(popup, wearer, wearer, PopupType.Large);
|
||||
}
|
||||
|
||||
private void OnDoAfterComplete(EntityUid uid, InjectComponent component, ToggleSlotDoAfterEvent args)
|
||||
{
|
||||
if (args.Cancelled || args.Handled) return;
|
||||
if (_netManager.IsClient) return;
|
||||
|
||||
ToggleEC(uid, args.User);
|
||||
args.Handled = true;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,136 @@
|
|||
using Content.Shared.Chemistry;
|
||||
using Content.Shared.Chemistry.Components.SolutionManager;
|
||||
using Content.Shared.Chemistry.EntitySystems;
|
||||
using Content.Shared.Clothing.EntitySystems;
|
||||
using Content.Shared.Containers.ItemSlots;
|
||||
using Content.Shared.Database;
|
||||
using Content.Shared.FixedPoint;
|
||||
using Content.Shared._Sunrise.HardsuitInjection.Components;
|
||||
using Content.Shared.Popups;
|
||||
using System.Threading;
|
||||
|
||||
namespace Content.Shared._Sunrise.HardsuitInjection.EntitySystems;
|
||||
|
||||
public sealed partial class InjectSystem
|
||||
{
|
||||
/// <summary>
|
||||
/// Toggle EC on hardsuit
|
||||
/// </summary>
|
||||
/// <param name="uid">Hardsuit uid</param>
|
||||
/// <param name="user">The person who will be shown messages about the opening and closing of the EС</param>
|
||||
public void ToggleEC(EntityUid uid, EntityUid user)
|
||||
{
|
||||
if (!TryComp<InjectComponent>(uid, out var component)) return;
|
||||
if (!TryComp<ItemSlotsComponent>(uid, out var comp)) return;
|
||||
|
||||
if (component.Container == null) return;
|
||||
|
||||
component.Locked = !component.Locked;
|
||||
|
||||
_itemSlotsSystem.SetLock(uid, component.ContainerId, component.Locked, comp);
|
||||
|
||||
if (component.Locked)
|
||||
{
|
||||
_popupSystem.PopupEntity(Loc.GetString("hardsuitinjection-close"), user, user, PopupType.Medium);
|
||||
_sharedAdminLogSystem.Add(LogType.ForceFeed, $"{_entManager.ToPrettyString(user):user} closed EC of {_entManager.ToPrettyString(uid):wearer}");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
_popupSystem.PopupEntity(Loc.GetString("hardsuitinjection-open"), user, user, PopupType.Medium);
|
||||
_sharedAdminLogSystem.Add(LogType.ForceFeed, $"{_entManager.ToPrettyString(user):user} opened EC of {_entManager.ToPrettyString(uid):wearer}");
|
||||
|
||||
if (component.AutoClose)
|
||||
StartAutoClose(uid, component);
|
||||
}
|
||||
|
||||
private void StartAutoClose(EntityUid uid, InjectComponent component)
|
||||
{
|
||||
// Отменяем предыдущий таймер, если был
|
||||
component.AutoCloseCancelToken?.Cancel();
|
||||
component.AutoCloseCancelToken = new CancellationTokenSource();
|
||||
var token = component.AutoCloseCancelToken.Token;
|
||||
|
||||
Robust.Shared.Timing.Timer.Spawn(component.AutoCloseDelay, () =>
|
||||
{
|
||||
if (token.IsCancellationRequested)
|
||||
return;
|
||||
|
||||
if (!Deleted(uid) && TryComp<InjectComponent>(uid, out var comp) && !comp.Locked)
|
||||
{
|
||||
comp.Locked = true;
|
||||
// Оповещение (если нужно)
|
||||
_popupSystem.PopupEntity(Loc.GetString("hardsuitinjection-close"), uid, PopupType.Medium);
|
||||
}
|
||||
}, token);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Inject reagent from ampula from hardsuit
|
||||
/// </summary>
|
||||
/// <param name="uid">Hardsuit uid</param>
|
||||
/// <param name="performer">Initiator of injection (For admin log)</param>
|
||||
public void Inject(EntityUid uid, EntityUid performer)
|
||||
{
|
||||
if (!TryComp<InjectComponent>(uid, out var component)) return;
|
||||
var action = _actionsSystem.GetAction(component!.InjectionActionEntity);
|
||||
|
||||
if (action == null) return;
|
||||
if (action.Value.Comp.AttachedEntity == null) return;
|
||||
if (TryComp<ItemSlotsComponent>(action.Value.Comp.AttachedEntity, out var itemslots)) return;
|
||||
|
||||
var user = action.Value.Comp.AttachedEntity.Value;
|
||||
var beaker = _itemSlotsSystem.GetItemOrNull(uid, component.ContainerId, itemslots);
|
||||
|
||||
if (beaker == null)
|
||||
{
|
||||
_popupSystem.PopupEntity(Loc.GetString("hardsuitinjection-nobeaker"), user, user);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
var actualBeaker = beaker.Value;
|
||||
|
||||
if (!_solutions.TryGetSolution(actualBeaker, "beaker", out var solution)) return;
|
||||
if (!_solutions.TryGetInjectableSolution(
|
||||
(user, Comp<InjectableSolutionComponent>(user), Comp<SolutionContainerManagerComponent>(user)),
|
||||
out var targetSolutionEntity,
|
||||
out var targetSolution
|
||||
)) return;
|
||||
|
||||
if (solution.Value.Comp.Solution.Volume <= 0)
|
||||
{
|
||||
_popupSystem.PopupEntity(Loc.GetString("hardsuitinjection-empty"), user, user);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
var transferAmount = FixedPoint2.Min(solution.Value.Comp.Solution.Volume, targetSolution.AvailableVolume);
|
||||
if (transferAmount <= 0)
|
||||
{
|
||||
_popupSystem.PopupEntity(Loc.GetString("hardsuitinjection-full"), user, user);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
var ev = new UpdateECEvent(GetNetEntity(actualBeaker), solution.Value.Comp.Solution, transferAmount);
|
||||
RaiseLocalEvent(uid, ev);
|
||||
|
||||
if (ev.RemovedReagentAmount == null) return;
|
||||
|
||||
var removedSolution = ev.RemovedReagentAmount;
|
||||
if (!targetSolution.CanAddSolution(removedSolution)) return;
|
||||
|
||||
if (performer == uid)
|
||||
_sharedAdminLogSystem.Add(LogType.ForceFeed, $"{_entManager.ToPrettyString(user):user} injected his ES into yourself with a solution {SharedSolutionContainerSystem.ToPrettyString(removedSolution):removedSolution}");
|
||||
else
|
||||
_sharedAdminLogSystem.Add(LogType.ForceFeed, $"{_entManager.ToPrettyString(user):user} ES injected with a solution {SharedSolutionContainerSystem.ToPrettyString(removedSolution):removedSolution}");
|
||||
|
||||
_reactiveSystem.DoEntityReaction(user, removedSolution, ReactionMethod.Injection);
|
||||
_solutions.TryAddSolution(targetSolutionEntity.Value, removedSolution);
|
||||
|
||||
_audio.PlayPvs(component.InjectSound, user);
|
||||
_popupSystem.PopupEntity(Loc.GetString("hypospray-component-feel-prick-message"), user, user);
|
||||
}
|
||||
|
||||
}
|
||||
64
Content.Shared/_Sunrise/HardsuitInjection/InjectSystem.cs
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
using Content.Shared.Actions;
|
||||
using Content.Shared.Containers.ItemSlots;
|
||||
using Content.Shared.DoAfter;
|
||||
using Content.Shared.Inventory;
|
||||
using Content.Shared.Popups;
|
||||
using Content.Shared.Strip;
|
||||
using Robust.Shared.Containers;
|
||||
using Robust.Shared.Network;
|
||||
using Content.Shared.Chemistry.EntitySystems;
|
||||
using Content.Shared.Chemistry;
|
||||
using Content.Shared.Administration.Logs;
|
||||
using Robust.Shared.Audio.Systems;
|
||||
using Content.Shared.Chemistry.Components.SolutionManager;
|
||||
using Robust.Shared.Timing;
|
||||
using Content.Shared._Sunrise.HardsuitInjection.Components;
|
||||
using Content.Shared.Clothing.EntitySystems;
|
||||
|
||||
namespace Content.Shared._Sunrise.HardsuitInjection.EntitySystems;
|
||||
|
||||
public sealed partial class InjectSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly SharedContainerSystem _containerSystem = default!;
|
||||
[Dependency] private readonly SharedActionsSystem _actionsSystem = default!;
|
||||
[Dependency] private readonly InventorySystem _inventorySystem = default!;
|
||||
[Dependency] private readonly SharedPopupSystem _popupSystem = default!;
|
||||
[Dependency] private readonly SharedDoAfterSystem _doAfter = default!;
|
||||
[Dependency] private readonly SharedStrippableSystem _strippable = default!;
|
||||
[Dependency] private readonly IEntityManager _entManager = default!;
|
||||
[Dependency] private readonly INetManager _netManager = default!;
|
||||
[Dependency] private readonly SharedSolutionContainerSystem _solutions = default!;
|
||||
[Dependency] private readonly SharedAudioSystem _audio = default!;
|
||||
[Dependency] private readonly ReactiveSystem _reactiveSystem = default!;
|
||||
[Dependency] private readonly ISharedAdminLogManager _sharedAdminLogSystem = default!;
|
||||
[Dependency] private readonly IGameTiming _timing = default!;
|
||||
[Dependency] private readonly ItemSlotsSystem _itemSlotsSystem = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<InjectComponent, UpdateECEvent>(OnUpdateEC);
|
||||
|
||||
InitializeBaseEvents();
|
||||
InitializeActionEvents();
|
||||
InitializeDoAfterEvents();
|
||||
}
|
||||
|
||||
#region Own Events
|
||||
|
||||
private void OnUpdateEC(EntityUid uid, InjectComponent component, UpdateECEvent args)
|
||||
{
|
||||
var beakerUid = GetEntity(args.BeakerUid);
|
||||
|
||||
if (!TryComp<SolutionContainerManagerComponent>(beakerUid, out var solutionContainerComponent)) return;
|
||||
if (!_solutions.TryGetSolution((beakerUid, solutionContainerComponent), "beaker", out var solutionEntity, out var _)) return;
|
||||
|
||||
var removedSolution = _solutions.SplitSolution(solutionEntity.Value, args.ReagentTransfer.Value);
|
||||
args.RemovedReagentAmount = removedSolution;
|
||||
|
||||
_solutions.UpdateAppearance((solutionEntity.Value.Owner, solutionEntity.Value.Comp));
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
19
Content.Shared/_Sunrise/Modsuit/ModsuitComponent.cs
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
using Robust.Shared.GameStates;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Serialization;
|
||||
|
||||
namespace Content.Shared._Sunrise.Modsuit;
|
||||
|
||||
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
|
||||
//[Access(typeof(SharedModsuitSystem))]
|
||||
public sealed partial class ModsuitComponent : Component
|
||||
{
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
[DataField("isActivated"), AutoNetworkedField]
|
||||
public bool IsActivated = false;
|
||||
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
[DataField("roundStartBiocode"), AutoNetworkedField]
|
||||
public bool RoundStartBiocode = false;
|
||||
}
|
||||
|
||||
19
Content.Shared/_Sunrise/Modsuit/SharedModsuitSystem.cs
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
using Content.Shared._Sunrise.Modsuit;
|
||||
|
||||
namespace Content.Shared._Sunrise.Modsuit;
|
||||
|
||||
/// <summary>
|
||||
/// Handles power cell upgrading and actions.
|
||||
/// </summary>
|
||||
public abstract class SharedModsuitSystem : EntitySystem
|
||||
{
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
using Robust.Shared.GameStates;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Serialization;
|
||||
using Content.Shared.NPC.Prototypes;
|
||||
using Content.Shared.Actions;
|
||||
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Set;
|
||||
|
||||
|
||||
namespace Content.Shared._Sunrise.PersonalBiocode;
|
||||
|
||||
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
|
||||
public sealed partial class PersonalBiocodeComponent : Component // Пока только для модсьюитов
|
||||
{
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
[DataField("breakAble"), AutoNetworkedField]
|
||||
public bool BreakAble = true;
|
||||
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
[DataField("actionEntity"), AutoNetworkedField]
|
||||
public EntityUid? ActionEntity;
|
||||
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
[DataField("DNA"), AutoNetworkedField]
|
||||
public string DNA = "";
|
||||
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
[DataField("isAuthorized"), AutoNetworkedField]
|
||||
public bool IsAuthorized = false;
|
||||
}
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
using Content.Shared._Sunrise.PersonalBiocode;
|
||||
|
||||
namespace Content.Shared._Sunrise.PersonalBiocode;
|
||||
|
||||
/// <summary>
|
||||
/// Handles power cell upgrading and actions.
|
||||
/// </summary>
|
||||
public abstract class SharedPersonalBiocodeSystem : EntitySystem
|
||||
{
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
using Content.Shared.Actions;
|
||||
|
||||
namespace Content.Shared._Sunrise.PersonalBiocode;
|
||||
|
||||
public sealed partial class StoreDNAActionEvent : InstantActionEvent
|
||||
{
|
||||
}
|
||||
BIN
Resources/Audio/_Sunrise/Modsuit/modsuit_equipsound.ogg
Normal file
BIN
Resources/Audio/_Sunrise/Modsuit/modsuit_unequipsound.ogg
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
hardsuitinjection-True = The EC compartment on the spacesuit is closed
|
||||
hardsuitinjection-False = The EC compartment on the spacesuit is open
|
||||
hardsuitinjection-empty = The ampoule is empty
|
||||
hardsuitinjection-full = The body is overflowing
|
||||
hardsuitinjection-close = You are closing the EC compartment
|
||||
hardsuitinjection-open = You are open the EC compartment
|
||||
hardsuitinjection-closed = The EC compartment is closed
|
||||
hardsuitinjection-critical = The body is in a critical condition, and substances are being administered from the emergency compartment
|
||||
ent-Ampula = Ampula
|
||||
.desc = An ampoule used in the EC compartments of spacesuits
|
||||
hardsuitinjection-toggle = toggle the EC
|
||||
hardsuitinjection-toggledescription = The EC has been switched
|
||||
hardsuitinjection-injection = Injecting substances from the EC compartment
|
||||
hardsuitinjection-injectiondescription = Injects substances from an ampoule contained in the emergency compartment
|
||||
hardsuitinjection-nobeaker = The ampoule is not inserted into the EC compartment
|
||||
hardsuitinjection-eject = Remove the ampoule from the EC compartment
|
||||
ent-AmpulaTric = {ent-Ampula}
|
||||
.suffix = Tricordrazine
|
||||
.desc = {ent-Ampula.desc}
|
||||
ent-AmpulaBica = {ent-Ampula}
|
||||
.suffix = Bicaridine
|
||||
.desc = {ent-Ampula.desc}
|
||||
ent-AmpulaDerm = {ent-Ampula}
|
||||
.suffix = Dermaline
|
||||
.desc = {ent-Ampula.desc}
|
||||
ent-AmpulaDylo = {ent-Ampula}
|
||||
.suffix = Dylovene
|
||||
.desc = {ent-Ampula.desc}
|
||||
ent-AmpulaDexa = {ent-Ampula}
|
||||
.suffix = Dexalin
|
||||
.desc = {ent-Ampula.desc}
|
||||
ent-AmpulaHyro = {ent-Ampula}
|
||||
.suffix = Hyronalin
|
||||
.desc = {ent-Ampula.desc}
|
||||
|
|
@ -0,0 +1,48 @@
|
|||
research-technology-modsuits = Modsuit core
|
||||
|
||||
ent-ModsuitCore = Modsuit core
|
||||
.desc = A core designed for activation mod-costumes.
|
||||
|
||||
|
||||
ent-ClothingModsuitNanoTrasenRepresentative = NT representative modsuit
|
||||
.desc = Superior
|
||||
ent-ClothingBlueShieldModsuit = officer «blue shield» modsuit
|
||||
.desc = Superior
|
||||
ent-ClothingModsuitComMaid = com maid modsuit
|
||||
.desc = Superior.
|
||||
ent-ClothingCommonModsuit = passenger modsuit
|
||||
.desc = Superior.
|
||||
ent-ClothingModsuitERTJanitor = janitorERT modsuit
|
||||
.desc = Superior.
|
||||
ent-ClothingModsuitERTSecurity = securityERT modsuit
|
||||
.desc = Superior.
|
||||
ent-ClothingModsuitERTMedical = medicalERT modsuit
|
||||
.desc = Superior.
|
||||
ent-ClothingModsuitERTLeader = leaderERT modsuit
|
||||
.desc = Superior.
|
||||
ent-ClothingModsuitERTEngineer = engineerERT modsuit
|
||||
.desc = Superior.
|
||||
ent-ClothingModsuitERTChaplain = chaplainERT modsuit
|
||||
.desc = Superior.
|
||||
|
||||
|
||||
ent-ClothingHeadHelmetBlueshieldModsuit = blueshield hardsuit helmet
|
||||
.desc = A robust helmet for special operations.
|
||||
ent-ClothingHeadHelmetRepresentativeModsuit = representative hardsuit helmet
|
||||
.decs = A robust helmet for special operations.
|
||||
ent-ClothingHeadHelmetModsuitCommaid = commaid hardsuit helmet
|
||||
.desc = A robust helmet for special operations.
|
||||
ent-ClothingHeadHelmetCommonModsuit = passenger hardsuit helmet
|
||||
.desc = A robust helmet for special operations.
|
||||
|
||||
|
||||
ent-ClothingModsuitBlueshield = blueshield hardsuit
|
||||
.desc = An advanced hardsuit favored by commandos for use in special operations.
|
||||
ent-ClothingModsuitRepresentative = representative hardsuit
|
||||
.decs = An advanced hardsuit favored by commandos for use in special operations.
|
||||
ent-ClothingModsuitCommaid = commaid hardsuit
|
||||
.desc = An advanced hardsuit favored by commandos for use in special operations.
|
||||
ent-ClothingModsuitCommon = common hardsuit
|
||||
.desc = An advanced hardsuit favored by commandos for use in special operations.
|
||||
|
||||
modsuit-equip-failure = You need the modsuit core to expand hardsuit
|
||||
|
|
@ -0,0 +1 @@
|
|||
biocode-equip-failure = Your DNA is not recognized, access denied
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
hardsuitinjection-True = Отсек ЭП на скафандре закрыт
|
||||
hardsuitinjection-False = Отсек ЭП на скафандре открыт
|
||||
hardsuitinjection-empty = Ампула пуста
|
||||
hardsuitinjection-full = Организм переполнен
|
||||
hardsuitinjection-close = Вы закрываете отсек ЭП
|
||||
hardsuitinjection-open = Вы открываете отсек ЭП
|
||||
hardsuitinjection-closed = Отсек ЭП закрыт
|
||||
hardsuitinjection-critical = Организм в критическом состоянии, ввод веществ из отсека экстренной помощи
|
||||
ent-Ampula = ампула
|
||||
.desc = Ампула, использующаяся в отсеках ЭП скафандров
|
||||
hardsuitinjection-toggle = Переключить отсек ЭП
|
||||
hardsuitinjection-toggledescription = Переключает отсек экстренной помощи
|
||||
hardsuitinjection-injection = Ввод веществ из отсека ЭП
|
||||
hardsuitinjection-injectiondescription = Вводит вещества из ампулы содержащейся в отсеке экстренной помощи
|
||||
hardsuitinjection-nobeaker = Ампула не вставлена в отсек ЭП
|
||||
hardsuitinjection-eject = Извлечь ампулу из отсека ЭП
|
||||
ent-AmpulaTric = {ent-Ampula}
|
||||
.suffix = Трикордразин
|
||||
.desc = {ent-Ampula.desc}
|
||||
ent-AmpulaBica = {ent-Ampula}
|
||||
.suffix = Бикаридин
|
||||
.desc = {ent-Ampula.desc}
|
||||
ent-AmpulaDerm = {ent-Ampula}
|
||||
.suffix = Дермалин
|
||||
.desc = {ent-Ampula.desc}
|
||||
ent-AmpulaDylo = {ent-Ampula}
|
||||
.suffix = Диловен
|
||||
.desc = {ent-Ampula.desc}
|
||||
ent-AmpulaDexa = {ent-Ampula}
|
||||
.suffix = Дексалин
|
||||
.desc = {ent-Ampula.desc}
|
||||
ent-AmpulaHyro = {ent-Ampula}
|
||||
.suffix = Хироналин
|
||||
.desc = {ent-Ampula.desc}
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
research-technology-modsuits = Ядро Р.И.Г-а
|
||||
|
||||
ent-ModsuitCore = ядро Р.И.Г-а
|
||||
.desc = Предназначено для активации Р.И.Г-ов.
|
||||
|
||||
ent-ClothingModsuitNanoTrasenRepresentative = Р.И.Г. представителя
|
||||
.desc = Роскошный Р.И.Г, созданный специально под представителя корпорации на станции.
|
||||
ent-ClothingBlueShieldModsuit = Р.И.Г. офицера «Синий щит»
|
||||
.desc = Крепкий и надёжный Р.И.Г, как и его владелец
|
||||
ent-ClothingModsuitComMaid = Р.И.Г. горничной командования
|
||||
.desc = Базовый скафандр, воплощённый в виде Р.И.Г-а и украшенный для удовлетворения эстетических нужд командования.
|
||||
ent-ClothingCommonModsuit = пассажиский Р.И.Г.
|
||||
.desc = Базовый скафандр, воплощённый в виде Р.И.Г-а.
|
||||
ent-ClothingModsuitERTJanitor = Р.И.Г. уборщика ОБР
|
||||
.desc = Р.И.Г, произведённый для обеспечения защиты как в условиях боя, так и при критической загрязнённости станции.
|
||||
ent-ClothingModsuitERTSecurity = Р.И.Г. офицера ОБР
|
||||
.desc = Бронированный Р.И.Г ОБР. Обеспечивает защиту от большинства угроз, что можно встретить в открытом космосею, при этом почти не ограничивая движения.
|
||||
ent-ClothingModsuitERTMedical = Р.И.Г. медика ОБР
|
||||
.desc = Бронированный Р.И.Г ОБР. Обеспечивает защиту от большинства угроз, что можно встретить в открытом космосею, при этом почти не ограничивая движения.
|
||||
ent-ClothingModsuitERTLeader = Р.И.Г. лидера ОБР
|
||||
.desc = Бронированный Р.И.Г ОБР. Обеспечивает защиту от большинства угроз, что можно встретить в открытом космосею, при этом почти не ограничивая движения.
|
||||
ent-ClothingModsuitERTEngineer = Р.И.Г. инженера ОБР
|
||||
.desc = Бронированный Р.И.Г ОБР. Обеспечивает защиту от большинства угроз, что можно встретить в открытом космосею, при этом почти не ограничивая движения.
|
||||
ent-ClothingModsuitERTChaplain = Р.И.Г. священика ОБР
|
||||
.desc = Бронированный Р.И.Г ОБР. Обеспечивает защиту от большинства угроз, что можно встретить в открытом космосею, при этом почти не ограничивая движения.
|
||||
|
||||
|
||||
ent-ClothingHeadHelmetBlueshieldModsuit = шлем Р.И.Г-а офицера «Синий щит»
|
||||
.desc = Синий
|
||||
ent-ClothingHeadHelmetRepresentativeModsuit = шлем Р.И.Г-а представителя корпорации
|
||||
.decs = Шлем, призванный своим видом являть величие и значимость представителя корпорации
|
||||
ent-ClothingHeadHelmetModsuitCommaid = шлем Р.И.Г-а горничной командования
|
||||
.desc = Прочный шлем горничной, предназначенный для специальных операций.
|
||||
ent-ClothingHeadHelmetCommonModsuit = шлем пассажирского Р.И.Г-а
|
||||
.desc = Шлем базового скафандра, воплощённый в виде Р.И.Г-а.
|
||||
|
||||
ent-ClothingModsuitBlueshield = скафандр Р.И.Г-а офицера «Синий щит»
|
||||
.desc = Крепкий и надёжный, как и его владелец.
|
||||
ent-ClothingModsuitRepresentative = скафандр Р.И.Г-а представителя корпорации
|
||||
.decs = Призван своим видом являть величие и значимость представителя корпорации
|
||||
ent-ClothingModsuitCommaid = скафандр Р.И.Г-а горничной командования
|
||||
.desc = Прочный скафандр горничной, предназначенный для специальных операций.
|
||||
ent-ClothingModsuitCommon = скафандр пассажирского Р.И.Г-а
|
||||
.desc = Базовый скафандр, воплощённый в виде Р.И.Г-а
|
||||
|
||||
modsuit-equip-failure = Вам необходимо ядро для раскрытия скафандра Р.И.Г-а.
|
||||
|
|
@ -0,0 +1 @@
|
|||
biocode-equip-failure = Ваша ДНК не распознана, в доступе отказано
|
||||
|
|
@ -10,6 +10,8 @@
|
|||
- id: Ointment
|
||||
- id: Gauze
|
||||
- id: PillCanisterTricordrazine
|
||||
- id: AmpulaTric # Sunrise-Edit
|
||||
amount: 2 # Sunrise-Edit
|
||||
# see https://github.com/tgstation/blob/master/code/game/objects/items/storage/firstaid.dm for example contents
|
||||
|
||||
- type: entity
|
||||
|
|
@ -23,6 +25,8 @@
|
|||
amount: 2
|
||||
- id: PillCanisterKelotane
|
||||
- id: PillCanisterDermaline
|
||||
- id: AmpulaDerm # Sunrise-Edit
|
||||
amount: 2 # Sunrise-Edit
|
||||
|
||||
- type: entity
|
||||
id: MedkitBruteFilled
|
||||
|
|
@ -35,6 +39,8 @@
|
|||
- id: Gauze
|
||||
- id: PillCanisterIron
|
||||
- id: PillCanisterCopper
|
||||
- id: AmpulaBica # Sunrise-Edit
|
||||
amount: 2 # Sunrise-Edit
|
||||
|
||||
- type: entity
|
||||
id: MedkitToxinFilled
|
||||
|
|
@ -49,6 +55,8 @@
|
|||
- id: PillCanisterDylovene
|
||||
- id: PillCanisterCharcoal
|
||||
- id: CoalAutoInjector
|
||||
- id: AmpulaDylo # Sunrise-Edit
|
||||
amount: 2 # Sunrise-Edit
|
||||
|
||||
- type: entity
|
||||
id: MedkitOxygenFilled
|
||||
|
|
@ -62,6 +70,8 @@
|
|||
- id: EmergencyMedipen
|
||||
- id: SyringeInaprovaline
|
||||
- id: PillCanisterDexalin
|
||||
- id: AmpulaDexa # Sunrise-Edit
|
||||
amount: 2 # Sunrise-Edit
|
||||
|
||||
- type: entity
|
||||
id: MedkitRadiationFilled
|
||||
|
|
@ -74,6 +84,8 @@
|
|||
- id: RadAutoInjector
|
||||
- id: PillCanisterPotassiumIodide
|
||||
- id: PillCanisterHyronalin
|
||||
- id: AmpulaHyro # Sunrise-Edit
|
||||
amount: 2 # Sunrise-Edit
|
||||
|
||||
- type: entity
|
||||
id: MedkitAdvancedFilled
|
||||
|
|
@ -86,6 +98,10 @@
|
|||
- id: RegenerativeMesh
|
||||
- id: Bloodpack
|
||||
amount: 2
|
||||
- id: AmpulaBica # Sunrise-Edit
|
||||
amount: 1 # Sunrise-Edit
|
||||
- id: AmpulaDerm # Sunrise-Edit
|
||||
amount: 1 # Sunrise-Edit
|
||||
|
||||
- type: entity
|
||||
id: MedkitCombatFilled
|
||||
|
|
@ -121,5 +137,4 @@
|
|||
contents:
|
||||
- id: StimpackMiniNT
|
||||
amount: 6
|
||||
|
||||
#Sunrse-end
|
||||
|
|
|
|||
|
|
@ -70,6 +70,7 @@
|
|||
SyringeIpecac: 1
|
||||
ClothingEyesHudMedical: 2
|
||||
ClothingEyesEyepatchHudMedical: 2
|
||||
Ampula: 5 # Sunrise-Edit
|
||||
HyposprayMedical: 2 # Sunrise-Edit
|
||||
Dropper: 2 # Sunrise-Edit
|
||||
BaseChemistryEmptyVial: 2 # Sunrise-Edit
|
||||
|
|
|
|||
|
|
@ -168,6 +168,17 @@
|
|||
- type: ContainerContainer
|
||||
containers:
|
||||
toggleable-clothing: !type:ContainerSlot {}
|
||||
beakerSlot: !type:ContainerSlot # Sunrise-Start
|
||||
- type: Inject
|
||||
openCloseDelay: 1.5
|
||||
autoClose: true
|
||||
autoCloseDelay: 6
|
||||
- type: ItemSlots
|
||||
slots:
|
||||
beakerSlot:
|
||||
whitelist:
|
||||
tags:
|
||||
- FitsHardsuit # Sunrise-End
|
||||
- type: GroupExamine
|
||||
- type: Tag
|
||||
tags:
|
||||
|
|
|
|||
|
|
@ -242,6 +242,7 @@
|
|||
containers:
|
||||
cell_slot: !type:ContainerSlot
|
||||
toggleable-clothing: !type:ContainerSlot
|
||||
beakerSlot: !type:ContainerSlot #Sunrise-Edit
|
||||
- type: PowerCellSlot
|
||||
cellSlotId: cell_slot
|
||||
- type: ItemSlots
|
||||
|
|
@ -253,6 +254,10 @@
|
|||
tags:
|
||||
- PowerCell
|
||||
- PowerCellSmall
|
||||
beakerSlot: #Sunrise-Start
|
||||
whitelist:
|
||||
tags:
|
||||
- FitsHardsuit #Sunrise-End
|
||||
- type: EnergyDomeGenerator
|
||||
damageEnergyDraw: 6
|
||||
domePrototype: EnergyDomeSmallPink
|
||||
|
|
|
|||
|
|
@ -249,6 +249,7 @@
|
|||
- type: Food
|
||||
requiresSpecialDigestion: true
|
||||
- type: CognizinFix
|
||||
- type: InjectNeed
|
||||
# Sunrise-End
|
||||
|
||||
- type: entity
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@
|
|||
- type: Storage
|
||||
maxItemSize: Small
|
||||
grid:
|
||||
- 0,0,3,1
|
||||
- 0,0,5,1 # Sunrise-Edit
|
||||
- type: Item
|
||||
size: Large
|
||||
sprite: Objects/Specific/Medical/firstaidkits.rsi
|
||||
|
|
@ -96,6 +96,10 @@
|
|||
components:
|
||||
- type: Sprite
|
||||
state: blackkit
|
||||
- type: Storage # Sunrise-Edit
|
||||
maxItemSize: Small # Sunrise-Edit
|
||||
grid: # Sunrise-Edit
|
||||
- 0,0,3,1 # Sunrise-Edit
|
||||
- type: Item
|
||||
heldPrefix: blackkit
|
||||
size: Normal
|
||||
|
|
|
|||
|
|
@ -222,6 +222,7 @@
|
|||
- Instruments
|
||||
- Equipment
|
||||
# Sunrise-Start
|
||||
- Modsuits
|
||||
- PowerCages
|
||||
- CargoSuit
|
||||
- SurgeryDynamicSunrise
|
||||
|
|
|
|||
|
|
@ -250,6 +250,7 @@
|
|||
- CommonBackpack
|
||||
- CommonSatchel
|
||||
- CommonDuffel
|
||||
- CommonModsuit #Sunrise-edit
|
||||
|
||||
- type: loadoutGroup
|
||||
id: PassengerNeck
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@
|
|||
recipes:
|
||||
- Beaker
|
||||
- LargeBeaker
|
||||
- Ampula # Sunrise-Edit
|
||||
- Syringe
|
||||
- PillCanister
|
||||
- HandLabeler
|
||||
|
|
@ -97,10 +98,10 @@
|
|||
- CryostasisBeaker
|
||||
- SyringeCryostasis
|
||||
- BluespaceBeaker
|
||||
- BluespacePillPatchCanister # Sunrise-Add
|
||||
- SyringeBluespace
|
||||
- LauncherSyringe
|
||||
- MiniSyringe
|
||||
- BluespacePillPatchCanister # Sunrise-Add
|
||||
|
||||
- type: latheRecipePack
|
||||
id: MedicalBoards
|
||||
|
|
|
|||
|
|
@ -459,3 +459,70 @@
|
|||
tags:
|
||||
- CorgiWearable
|
||||
- WhitelistChameleon
|
||||
|
||||
##Modsuits
|
||||
#№Modsuit commaid
|
||||
- type: entity
|
||||
parent: ClothingHeadEVAHelmetBase
|
||||
id: ClothingHeadHelmetModsuitCommaid
|
||||
name: commaid hardsuit helmet
|
||||
description: A robust helmet for special operations.
|
||||
suffix: Modsuit
|
||||
components:
|
||||
- type: BreathMask
|
||||
- type: Sprite
|
||||
sprite: _Sunrise/Modsuits/Clothing/Head/Qillu/commaid.rsi
|
||||
- type: PressureProtection
|
||||
highPressureMultiplier: 0.08
|
||||
lowPressureMultiplier: 1000
|
||||
|
||||
#№Modsuit passenger
|
||||
- type: entity
|
||||
parent: ClothingHeadEVAHelmetBase
|
||||
id: ClothingHeadHelmetCommonModsuit
|
||||
name: passenger hardsuit helmet
|
||||
description: A robust helmet for special operations.
|
||||
suffix: Modsuit
|
||||
components:
|
||||
- type: BreathMask
|
||||
- type: Sprite
|
||||
sprite: _Sunrise/Modsuits/Clothing/Head/passenger.rsi
|
||||
- type: PressureProtection
|
||||
highPressureMultiplier: 0.08
|
||||
lowPressureMultiplier: 1000
|
||||
|
||||
#№Modsuit representative
|
||||
- type: entity
|
||||
parent: ClothingHeadEVAHelmetBase
|
||||
id: ClothingHeadHelmetRepresentativeModsuit
|
||||
name: representative hardsuit helmet
|
||||
description: A robust helmet for special operations.
|
||||
suffix: Modsuit
|
||||
components:
|
||||
- type: BreathMask
|
||||
- type: Sprite
|
||||
sprite: _Sunrise/Modsuits/Clothing/Head/Qillu/representative.rsi
|
||||
- type: PressureProtection
|
||||
highPressureMultiplier: 0.08
|
||||
lowPressureMultiplier: 1000
|
||||
|
||||
#№Modsuit blueshield
|
||||
- type: entity
|
||||
parent: ClothingHeadEVAHelmetBase
|
||||
id: ClothingHeadHelmetBlueshieldModsuit
|
||||
name: blueshield hardsuit helmet
|
||||
description: A robust helmet for special operations.
|
||||
suffix: Modsuit
|
||||
components:
|
||||
- type: BreathMask
|
||||
- type: Sprite
|
||||
sprite: _Sunrise/Modsuits/Clothing/Head/Qillu/blueshield.rsi
|
||||
- type: PressureProtection
|
||||
highPressureMultiplier: 0.45
|
||||
lowPressureMultiplier: 10000
|
||||
- type: Armor
|
||||
modifiers:
|
||||
coefficients:
|
||||
Blunt: 0.8
|
||||
Slash: 0.8
|
||||
Piercing: 0.8
|
||||
|
|
|
|||
|
|
@ -159,6 +159,7 @@
|
|||
containers:
|
||||
cell_slot: !type:ContainerSlot
|
||||
toggleable-clothing: !type:ContainerSlot
|
||||
beakerSlot: !type:ContainerSlot
|
||||
- type: PowerCellSlot
|
||||
cellSlotId: cell_slot
|
||||
- type: ItemSlots
|
||||
|
|
@ -169,6 +170,10 @@
|
|||
whitelist:
|
||||
tags:
|
||||
- PowerCell
|
||||
beakerSlot:
|
||||
whitelist:
|
||||
tags:
|
||||
- FitsHardsuit
|
||||
- type: EnergyDomeGenerator
|
||||
damageEnergyDraw: 4
|
||||
domePrototype: EnergyDomeSmallRed
|
||||
|
|
@ -653,3 +658,167 @@
|
|||
- CorgiWearable
|
||||
- Hardsuit
|
||||
- WhitelistChameleon
|
||||
|
||||
#Modsuits
|
||||
#Modsuit parent
|
||||
- type: entity
|
||||
abstract: true
|
||||
parent: [ ClothingOuterBase, AllowSuitStorageClothing ]
|
||||
id: ClothingOuterModsuitBase
|
||||
name: modsuit base
|
||||
components:
|
||||
- type: Clothing
|
||||
equipSound: /Audio/_Sunrise/Modsuit/modsuit_equipsound.ogg
|
||||
unequipSound: /Audio/_Sunrise/Modsuit/modsuit_unequipsound.ogg
|
||||
- type: PressureProtection
|
||||
highPressureMultiplier: 0.5
|
||||
lowPressureMultiplier: 1000
|
||||
- type: TemperatureProtection
|
||||
heatingCoefficient: 0.01
|
||||
coolingCoefficient: 0.01
|
||||
- type: ClothingSpeedModifier
|
||||
walkModifier: 0.9
|
||||
sprintModifier: 0.9
|
||||
- type: Item
|
||||
size: Huge
|
||||
- type: ProtectedFromStepTriggers
|
||||
slots: WITHOUT_POCKET
|
||||
- type: DamageOnInteractProtection
|
||||
damageProtection:
|
||||
flatReductions:
|
||||
Heat: 10
|
||||
slots: OUTERCLOTHING
|
||||
- type: Tag
|
||||
tags:
|
||||
- FullBodyOuter
|
||||
- WhitelistChameleon
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
beakerSlot: !type:ContainerSlot
|
||||
- type: Inject
|
||||
openCloseDelay: 1.5
|
||||
autoClose: true
|
||||
autoCloseDelay: 6
|
||||
- type: ItemSlots
|
||||
slots:
|
||||
beakerSlot:
|
||||
whitelist:
|
||||
tags:
|
||||
- FitsHardsuit
|
||||
- type: PersonalBiocode
|
||||
breakAble: false
|
||||
- type: UnpoweredFlashlight
|
||||
- type: PointLight
|
||||
enabled: false
|
||||
radius: 8.7
|
||||
falloff: 3
|
||||
softness: 5
|
||||
autoRot: true
|
||||
|
||||
##Modsuit commaid
|
||||
- type: entity
|
||||
parent: ClothingOuterModsuitBase
|
||||
id: ClothingModsuitCommaid
|
||||
name: commaid hardsuit
|
||||
description: An advanced hardsuit favored by commandos for use in special operations.
|
||||
suffix: Modsuit
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: _Sunrise/Modsuits/Clothing/Hardsuits/Qillu/commaid.rsi
|
||||
- type: ToggleableClothing
|
||||
clothingPrototype: ClothingHeadHelmetModsuitCommaid
|
||||
- type: PointLight
|
||||
color: "pink"
|
||||
- type: Pierceable
|
||||
level: Wood
|
||||
- type: Armor
|
||||
modifiers:
|
||||
coefficients:
|
||||
Blunt: 0.9
|
||||
Slash: 0.9
|
||||
Piercing: 0.9
|
||||
Caustic: 0.8
|
||||
|
||||
##Modsuit passenger
|
||||
- type: entity
|
||||
parent: ClothingOuterModsuitBase
|
||||
id: ClothingModsuitCommon
|
||||
name: common hardsuit
|
||||
description: An advanced hardsuit favored by commandos for use in special operations.
|
||||
suffix: Modsuit
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: _Sunrise/Modsuits/Clothing/Hardsuits/passenger.rsi
|
||||
- type: ToggleableClothing
|
||||
clothingPrototype: ClothingHeadHelmetCommonModsuit
|
||||
- type: Pierceable
|
||||
level: Wood
|
||||
- type: Armor
|
||||
modifiers:
|
||||
coefficients:
|
||||
Blunt: 0.9
|
||||
Slash: 0.9
|
||||
Piercing: 0.9
|
||||
Caustic: 0.8
|
||||
|
||||
##Modsuit representative
|
||||
- type: entity
|
||||
parent: ClothingOuterModsuitBase
|
||||
id: ClothingModsuitRepresentative
|
||||
name: representative hardsuit
|
||||
description: An advanced hardsuit favored by commandos for use in special operations.
|
||||
suffix: Modsuit
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: _Sunrise/Modsuits/Clothing/Hardsuits/Qillu/representative.rsi
|
||||
- type: ToggleableClothing
|
||||
clothingPrototype: ClothingHeadHelmetRepresentativeModsuit
|
||||
- type: PointLight
|
||||
color: "gold"
|
||||
- type: ExplosionResistance
|
||||
damageCoefficient: 0.4
|
||||
- type: Pierceable
|
||||
level: Metal
|
||||
- type: ClothingSpeedModifier
|
||||
walkModifier: 0.8
|
||||
sprintModifier: 0.8
|
||||
- type: Armor
|
||||
modifiers:
|
||||
coefficients:
|
||||
Blunt: 0.6
|
||||
Slash: 0.6
|
||||
Piercing: 0.6
|
||||
Heat: 0.8
|
||||
Caustic: 0.7
|
||||
|
||||
##Modsuit blueshield
|
||||
- type: entity
|
||||
parent: ClothingOuterModsuitBase
|
||||
id: ClothingModsuitBlueshield
|
||||
name: blueshield hardsuit
|
||||
description: An advanced hardsuit favored by commandos for use in special operations.
|
||||
suffix: Modsuit
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: _Sunrise/Modsuits/Clothing/Hardsuits/Qillu/blueshield.rsi
|
||||
- type: ToggleableClothing
|
||||
clothingPrototype: ClothingHeadHelmetBlueshieldModsuit
|
||||
- type: PointLight
|
||||
color: "blue"
|
||||
- type: PressureProtection
|
||||
highPressureMultiplier: 0.525
|
||||
lowPressureMultiplier: 10000
|
||||
- type: ClothingSpeedModifier
|
||||
walkModifier: 0.9
|
||||
sprintModifier: 0.9
|
||||
- type: Armor
|
||||
modifiers:
|
||||
coefficients:
|
||||
Blunt: 0.45
|
||||
Slash: 0.45
|
||||
Piercing: 0.45
|
||||
Heat: 0.45
|
||||
Radiation: 0.20
|
||||
Caustic: 0.4
|
||||
- type: ExplosionResistance
|
||||
damageCoefficient: 0.5
|
||||
|
|
|
|||
138
Resources/Prototypes/_Sunrise/Hardsuitinject/prototypes.yml
Normal file
|
|
@ -0,0 +1,138 @@
|
|||
- type: Tag
|
||||
id: FitsHardsuit
|
||||
|
||||
- type: entity
|
||||
parent: BaseBeaker
|
||||
name: Ampula
|
||||
id: Ampula
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: _Sunrise/HardsuitInjection/ampula.rsi
|
||||
layers:
|
||||
- state: beaker
|
||||
- state: beaker1
|
||||
map: ["enum.SolutionContainerLayers.Fill"]
|
||||
visible: false
|
||||
- type: Item
|
||||
sprite: _Sunrise/HardsuitInjection/ampula.rsi
|
||||
size: Small
|
||||
- type: SolutionContainerManager
|
||||
solutions:
|
||||
beaker:
|
||||
maxVol: 20
|
||||
- type: Ampula
|
||||
- type: Tag
|
||||
tags:
|
||||
- FitsHardsuit
|
||||
|
||||
- type: entity
|
||||
id: ActionToggleInjection
|
||||
name: hardsuitinjection-toggle
|
||||
description: hardsuitinjection-toggledescription
|
||||
components:
|
||||
- type: Action
|
||||
itemIconStyle: NoItem
|
||||
useDelay: 1 # equip noise spam.
|
||||
icon:
|
||||
sprite: _Sunrise/HardsuitInjection/main.rsi
|
||||
state: closeopen
|
||||
- type: InstantAction
|
||||
event: !type:ToggleECEvent
|
||||
|
||||
- type: entity
|
||||
id: ActionInjection
|
||||
name: hardsuitinjection-injection
|
||||
description: hardsuitinjection-injectiondescription
|
||||
components:
|
||||
- type: Action
|
||||
itemIconStyle: NoItem
|
||||
useDelay: 1 # equip noise spam.
|
||||
icon:
|
||||
sprite: _Sunrise/HardsuitInjection/main.rsi
|
||||
state: inject
|
||||
- type: InstantAction
|
||||
event: !type:InjectionEvent
|
||||
|
||||
- type: entity
|
||||
parent: Ampula
|
||||
name: Ampula
|
||||
id: AmpulaTric
|
||||
suffix: Tricordrazine
|
||||
components:
|
||||
- type: SolutionContainerManager
|
||||
solutions:
|
||||
beaker:
|
||||
maxVol: 20
|
||||
reagents:
|
||||
- ReagentId: Tricordrazine
|
||||
Quantity: 20
|
||||
|
||||
- type: entity
|
||||
parent: Ampula
|
||||
name: Ampula
|
||||
id: AmpulaBica
|
||||
suffix: Bicaridine
|
||||
components:
|
||||
- type: SolutionContainerManager
|
||||
solutions:
|
||||
beaker:
|
||||
maxVol: 20
|
||||
reagents:
|
||||
- ReagentId: Bicaridine
|
||||
Quantity: 15
|
||||
|
||||
- type: entity
|
||||
parent: Ampula
|
||||
name: Ampula
|
||||
id: AmpulaDerm
|
||||
suffix: Dermaline
|
||||
components:
|
||||
- type: SolutionContainerManager
|
||||
solutions:
|
||||
beaker:
|
||||
maxVol: 20
|
||||
reagents:
|
||||
- ReagentId: Dermaline
|
||||
Quantity: 10
|
||||
|
||||
- type: entity
|
||||
parent: Ampula
|
||||
name: Ampula
|
||||
id: AmpulaDylo
|
||||
suffix: Dylovene
|
||||
components:
|
||||
- type: SolutionContainerManager
|
||||
solutions:
|
||||
beaker:
|
||||
maxVol: 20
|
||||
reagents:
|
||||
- ReagentId: Dylovene
|
||||
Quantity: 20
|
||||
|
||||
- type: entity
|
||||
parent: Ampula
|
||||
name: Ampula
|
||||
id: AmpulaDexa
|
||||
suffix: Dexalin
|
||||
components:
|
||||
- type: SolutionContainerManager
|
||||
solutions:
|
||||
beaker:
|
||||
maxVol: 20
|
||||
reagents:
|
||||
- ReagentId: Dexalin
|
||||
Quantity: 20
|
||||
|
||||
- type: entity
|
||||
parent: Ampula
|
||||
name: Ampula
|
||||
id: AmpulaHyro
|
||||
suffix: Hyronalin
|
||||
components:
|
||||
- type: SolutionContainerManager
|
||||
solutions:
|
||||
beaker:
|
||||
maxVol: 20
|
||||
reagents:
|
||||
- ReagentId: Hyronalin
|
||||
Quantity: 20
|
||||
|
|
@ -117,6 +117,17 @@
|
|||
- NanoTrasenRepresentativeCoat
|
||||
- NanoTrasenRepresentativeCoatOpen
|
||||
|
||||
- type: loadoutGroup
|
||||
id: NanoTrasenRepresentativeBackpack
|
||||
name: loadout-group-hop-backpack
|
||||
minLimit: 1
|
||||
maxLimit: 1
|
||||
loadouts:
|
||||
- CommonBackpack
|
||||
- CommonSatchel
|
||||
- CommonDuffel
|
||||
- NanoTrasenRepresentativeModsuit
|
||||
|
||||
- type: loadoutGroup
|
||||
id: BlueShieldBackpack
|
||||
name: loadout-group-blueshield-backpack
|
||||
|
|
@ -124,6 +135,7 @@
|
|||
- BlueShieldBackpack
|
||||
- BlueShieldSatchel
|
||||
- BlueShieldDuffel
|
||||
- BlueShieldModsuit
|
||||
|
||||
- type: loadoutGroup
|
||||
id: BlueShieldJumpsuit
|
||||
|
|
@ -1317,6 +1329,7 @@
|
|||
name: loadout-group-commaid-backpack
|
||||
loadouts:
|
||||
- ComMaidBackpackSatchelLeather
|
||||
- ComMaidModsuit
|
||||
|
||||
- type: loadoutGroup
|
||||
id: ComMaidNeck
|
||||
|
|
|
|||
|
|
@ -382,7 +382,7 @@
|
|||
groups:
|
||||
- NanoTrasenRepresentativeJumpsuit
|
||||
- NanoTrasenRepresentativeOuterClothing
|
||||
- CommonBackpack
|
||||
- NanoTrasenRepresentativeBackpack
|
||||
- Trinkets
|
||||
- Survival
|
||||
- GroupSpeciesBreathTool
|
||||
|
|
|
|||
13
Resources/Prototypes/_Sunrise/PersonalBiocode/action.yml
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
- type: entity
|
||||
parent: BaseAction
|
||||
id: ActionSaveDNA
|
||||
name: Toggle Suit Piece
|
||||
description: Remember to equip the important pieces of your suit before going into action.
|
||||
components:
|
||||
- type: Action
|
||||
icon:
|
||||
sprite: _Sunrise/Actions/Pets/radials.rsi
|
||||
state: settings
|
||||
useDelay: 10
|
||||
- type: InstantAction
|
||||
event: !type:StoreDNAActionEvent
|
||||
|
|
@ -39,3 +39,8 @@
|
|||
- CellRechargerCircuitboard
|
||||
- WeaponCapacitorRechargerCircuitboard
|
||||
- FreezerElectronics
|
||||
|
||||
- type: latheRecipePack
|
||||
id: Modsuits
|
||||
recipes:
|
||||
- ModsuitCore
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
#Комплект улучшения
|
||||
- type: entity
|
||||
name: modsuit core
|
||||
parent: BaseItem
|
||||
id: ModsuitCore
|
||||
description: A core designed for activation mod-costumes.
|
||||
suffix: Modsuit
|
||||
components:
|
||||
- type: Item
|
||||
size: Normal
|
||||
- type: Sprite
|
||||
sprite: _Sunrise/Modsuits/Other/core.rsi
|
||||
state: icon
|
||||
- type: Tag
|
||||
tags:
|
||||
- ModsuitCore
|
||||
|
||||
#Рецепт
|
||||
- type: latheRecipe
|
||||
id: ModsuitCore
|
||||
result: ModsuitCore
|
||||
completetime: 5
|
||||
materials:
|
||||
Steel: 2000
|
||||
Plasma: 1500
|
||||
|
|
@ -109,3 +109,11 @@
|
|||
Glass: 300
|
||||
Plasma: 100
|
||||
Silver: 50
|
||||
|
||||
- type: latheRecipe
|
||||
id: Ampula
|
||||
result: Ampula
|
||||
completetime: 2
|
||||
materials:
|
||||
Glass: 200
|
||||
Steel: 50
|
||||
|
|
|
|||
|
|
@ -93,3 +93,15 @@
|
|||
cost: 9000
|
||||
recipeUnlocks:
|
||||
- BasicThermals
|
||||
|
||||
- type: technology
|
||||
id: Modsuits
|
||||
name: research-technology-modsuits
|
||||
icon:
|
||||
sprite: _Sunrise/Modsuits/Backpack/Qillu/blueshield.rsi
|
||||
state: icon
|
||||
discipline: Industrial
|
||||
tier: 3
|
||||
cost: 15000
|
||||
recipeUnlocks:
|
||||
- ModsuitCore
|
||||
226
Resources/Prototypes/_Sunrise/backpackmodsuit.yml
Normal file
|
|
@ -0,0 +1,226 @@
|
|||
#parent modsuit
|
||||
- type: entity
|
||||
abstract: true
|
||||
parent: [BackpackSounds, Clothing, ContentsExplosionResistanceBase] # Sunrise edit
|
||||
id: ClothingModsuitBackpack
|
||||
name: backpack
|
||||
description: You wear this on your back and put items into it.
|
||||
components:
|
||||
- type: ContainerInteractionAnimation # Sunrise added
|
||||
- type: Sprite
|
||||
sprite: Clothing/Back/Backpacks/backpack.rsi
|
||||
state: icon
|
||||
- type: Item
|
||||
size: Huge
|
||||
- type: Clothing
|
||||
quickEquip: false
|
||||
slots:
|
||||
- back
|
||||
- type: Storage
|
||||
grid:
|
||||
- 0,0,6,5
|
||||
maxItemSize: Huge
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
storagebase: !type:Container
|
||||
ents: []
|
||||
toggleable-clothing: !type:ContainerSlot
|
||||
- type: UserInterface
|
||||
interfaces:
|
||||
enum.StorageUiKey.Key:
|
||||
type: StorageBoundUserInterface
|
||||
# to prevent bag open/honk spam
|
||||
- type: UseDelay
|
||||
delay: 0.5
|
||||
- type: ExplosionResistance
|
||||
damageCoefficient: 0.9
|
||||
- type: Tag
|
||||
tags:
|
||||
- WhitelistChameleon
|
||||
- Backpack
|
||||
- type: ItemSlots
|
||||
slots:
|
||||
modsuit_core:
|
||||
name: power-cell-slot-component-slot-name-default
|
||||
disableEject: true
|
||||
swap: false
|
||||
whitelist:
|
||||
tags:
|
||||
- ModsuitCore
|
||||
- type: Modsuit
|
||||
roundStartBiocode: true
|
||||
|
||||
#Синего Щита
|
||||
- type: loadout
|
||||
id: BlueShieldModsuit
|
||||
sponsorOnly: true
|
||||
equipment:
|
||||
back: ClothingBlueShieldModsuit
|
||||
|
||||
- type: entity
|
||||
parent: ClothingModsuitBackpack
|
||||
id: ClothingBlueShieldModsuit
|
||||
name: blueshield modsuit
|
||||
description: Superior.
|
||||
suffix: Modsuit
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: _Sunrise/Modsuits/Backpack/Qillu/blueshield.rsi
|
||||
- type: ToggleableClothing
|
||||
clothingPrototype: ClothingModsuitBlueshield
|
||||
requiredSlot: back
|
||||
slot: outerClothing
|
||||
|
||||
|
||||
#Представителя NT/Qillu
|
||||
- type: loadoutEffectGroup
|
||||
id: NTModsuit
|
||||
effects:
|
||||
- !type:JobRequirementLoadoutEffect
|
||||
requirement:
|
||||
!type:RoleTimeRequirement
|
||||
role: JobNanoTrasenRepresentative
|
||||
time: 100h
|
||||
|
||||
- type: loadout
|
||||
id: NanoTrasenRepresentativeModsuit
|
||||
equipment:
|
||||
back: ClothingModsuitNanoTrasenRepresentative
|
||||
effects:
|
||||
- !type:GroupLoadoutEffect
|
||||
proto: NTModsuit
|
||||
|
||||
- type: entity
|
||||
parent: ClothingModsuitBackpack
|
||||
id: ClothingModsuitNanoTrasenRepresentative
|
||||
name: NT modsuit
|
||||
description: Superior.
|
||||
suffix: Modsuit
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: _Sunrise/Modsuits/Backpack/Qillu/representative.rsi
|
||||
- type: ToggleableClothing
|
||||
clothingPrototype: ClothingModsuitRepresentative
|
||||
requiredSlot: back
|
||||
slot: outerClothing
|
||||
|
||||
#Горничной Командования
|
||||
- type: loadout
|
||||
id: ComMaidModsuit
|
||||
sponsorOnly: true
|
||||
equipment:
|
||||
back: ClothingModsuitComMaid
|
||||
|
||||
- type: entity
|
||||
parent: ClothingModsuitBackpack
|
||||
id: ClothingModsuitComMaid
|
||||
name: com maid modsuit
|
||||
description: Superior.
|
||||
suffix: Modsuit
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: _Sunrise/Modsuits/Backpack/Qillu/commaid.rsi
|
||||
- type: ToggleableClothing
|
||||
clothingPrototype: ClothingModsuitCommaid
|
||||
requiredSlot: back
|
||||
slot: outerClothing
|
||||
|
||||
#Пассажира
|
||||
- type: loadout
|
||||
id: CommonModsuit
|
||||
sponsorOnly: true
|
||||
equipment:
|
||||
back: ClothingCommonModsuit
|
||||
|
||||
- type: entity
|
||||
parent: ClothingModsuitBackpack
|
||||
id: ClothingCommonModsuit
|
||||
name: passenger modsuit
|
||||
description: Superior.
|
||||
suffix: Modsuit
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: _Sunrise/Modsuits/Backpack/passenger.rsi
|
||||
- type: ToggleableClothing
|
||||
clothingPrototype: ClothingModsuitCommon
|
||||
requiredSlot: back
|
||||
slot: outerClothing
|
||||
|
||||
###ОТРЯДЫ БЫСТРОГО РЕАГИРОВАНИЯ
|
||||
#ОБР уборщик
|
||||
- type: entity
|
||||
parent: ClothingBackpackERTJanitor
|
||||
id: ClothingModsuitERTJanitor
|
||||
name: janitorERT modsuit
|
||||
description: Superior.
|
||||
suffix: Modsuit
|
||||
components:
|
||||
- type: ToggleableClothing
|
||||
clothingPrototype: ClothingOuterHardsuitERTJanitor
|
||||
requiredSlot: back
|
||||
slot: outerClothing
|
||||
|
||||
#ОБР охрана
|
||||
- type: entity
|
||||
parent: ClothingBackpackERTSecurity
|
||||
id: ClothingModsuitERTSecurity
|
||||
name: securityERT modsuit
|
||||
description: Superior.
|
||||
suffix: Modsuit
|
||||
components:
|
||||
- type: ToggleableClothing
|
||||
clothingPrototype: ClothingOuterHardsuitERTSecurity
|
||||
requiredSlot: back
|
||||
slot: outerClothing
|
||||
|
||||
#ОБР медик
|
||||
- type: entity
|
||||
parent: ClothingBackpackERTMedical
|
||||
id: ClothingModsuitERTMedical
|
||||
name: medicalERT modsuit
|
||||
description: Superior.
|
||||
suffix: Modsuit
|
||||
components:
|
||||
- type: ToggleableClothing
|
||||
clothingPrototype: ClothingOuterHardsuitERTMedical
|
||||
requiredSlot: back
|
||||
slot: outerClothing
|
||||
|
||||
#ОБР лидер
|
||||
- type: entity
|
||||
parent: ClothingBackpackERTLeader
|
||||
id: ClothingModsuitERTLeader
|
||||
name: leaderERT modsuit
|
||||
description: Superior.
|
||||
suffix: Modsuit
|
||||
components:
|
||||
- type: ToggleableClothing
|
||||
clothingPrototype: ClothingOuterHardsuitERTLeader
|
||||
requiredSlot: back
|
||||
slot: outerClothing
|
||||
|
||||
#ОБР инженер
|
||||
- type: entity
|
||||
parent: ClothingBackpackERTEngineer
|
||||
id: ClothingModsuitERTEngineer
|
||||
name: engineerERT modsuit
|
||||
description: Superior.
|
||||
suffix: Modsuit
|
||||
components:
|
||||
- type: ToggleableClothing
|
||||
clothingPrototype: ClothingOuterHardsuitERTEngineer
|
||||
requiredSlot: back
|
||||
slot: outerClothing
|
||||
|
||||
#ОБР священник
|
||||
- type: entity
|
||||
parent: ClothingBackpackERTChaplain
|
||||
id: ClothingModsuitERTChaplain
|
||||
name: chaplainERT modsuit
|
||||
description: Superior.
|
||||
suffix: Modsuit
|
||||
components:
|
||||
- type: ToggleableClothing
|
||||
clothingPrototype: ClothingOuterHardsuitERTChaplain
|
||||
requiredSlot: back
|
||||
slot: outerClothing
|
||||
|
|
@ -589,3 +589,7 @@
|
|||
|
||||
- type: Tag
|
||||
id: NightVisionDevice
|
||||
|
||||
# Modsuit
|
||||
- type: Tag
|
||||
id: ModsuitCore
|
||||
|
|
|
|||
|
After Width: | Height: | Size: 492 B |
|
After Width: | Height: | Size: 238 B |
|
After Width: | Height: | Size: 262 B |
|
After Width: | Height: | Size: 274 B |
|
After Width: | Height: | Size: 278 B |
|
After Width: | Height: | Size: 274 B |
|
After Width: | Height: | Size: 262 B |
|
After Width: | Height: | Size: 177 B |
|
After Width: | Height: | Size: 258 B |
|
After Width: | Height: | Size: 259 B |
|
After Width: | Height: | Size: 196 B |
|
|
@ -0,0 +1,47 @@
|
|||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-SA-3.0",
|
||||
"copyright": "Taken from cev-eris at https://github.com/discordia-space/CEV-Eris/commit/740ff31a81313086cf16761f3677cf1e2ab46c93",
|
||||
"size": {
|
||||
"x": 32,
|
||||
"y": 32
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "beaker"
|
||||
},
|
||||
{
|
||||
"name": "lid_beaker"
|
||||
},
|
||||
{
|
||||
"name": "inhand-left",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "inhand-right",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "beaker1"
|
||||
},
|
||||
{
|
||||
"name": "beaker2"
|
||||
},
|
||||
{
|
||||
"name": "beaker3"
|
||||
},
|
||||
{
|
||||
"name": "beaker4"
|
||||
},
|
||||
{
|
||||
"name": "beaker5"
|
||||
},
|
||||
{
|
||||
"name": "beaker6"
|
||||
},
|
||||
{
|
||||
"name": "equipped-BELT",
|
||||
"directions": 4
|
||||
}
|
||||
]
|
||||
}
|
||||
|
After Width: | Height: | Size: 624 B |
|
After Width: | Height: | Size: 486 B |
|
|
@ -0,0 +1,17 @@
|
|||
{
|
||||
"version": 1,
|
||||
"size": {
|
||||
"x": 32,
|
||||
"y": 32
|
||||
},
|
||||
"license": "CC-BY-SA-3.0",
|
||||
"copyright": "Made by mnogo_znal (discord)",
|
||||
"states": [
|
||||
{
|
||||
"name": "closeopen"
|
||||
},
|
||||
{
|
||||
"name": "inject"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
After Width: | Height: | Size: 801 B |
|
After Width: | Height: | Size: 1,015 B |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
|
@ -0,0 +1,48 @@
|
|||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-SA-3.0",
|
||||
"copyright": "",
|
||||
"size": {
|
||||
"x": 32,
|
||||
"y": 32
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "icon",
|
||||
"delays": [
|
||||
[
|
||||
0.25,
|
||||
0.25,
|
||||
0.25,
|
||||
0.25
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "icon-ver2",
|
||||
"delays": [
|
||||
[
|
||||
0.25,
|
||||
0.25,
|
||||
0.25,
|
||||
0.25
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "icon-ver3",
|
||||
"delays": [
|
||||
[
|
||||
0.25,
|
||||
0.25,
|
||||
0.25,
|
||||
0.25
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "equipped-BACKPACK",
|
||||
"directions": 4
|
||||
}
|
||||
]
|
||||
}
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 1.8 KiB |
|
|
@ -0,0 +1,59 @@
|
|||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-SA-3.0",
|
||||
"copyright": "",
|
||||
"size": {
|
||||
"x": 32,
|
||||
"y": 32
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "icon",
|
||||
"delays": [
|
||||
[
|
||||
0.15,
|
||||
0.15,
|
||||
0.15,
|
||||
0.15,
|
||||
0.15,
|
||||
0.15,
|
||||
0.15
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "equipped-BACKPACK",
|
||||
"directions": 4,
|
||||
"delays": [
|
||||
[
|
||||
0.2,
|
||||
0.2,
|
||||
0.2,
|
||||
0.2,
|
||||
0.2
|
||||
],
|
||||
[
|
||||
0.2,
|
||||
0.2,
|
||||
0.2,
|
||||
0.2,
|
||||
0.2
|
||||
],
|
||||
[
|
||||
0.2,
|
||||
0.2,
|
||||
0.2,
|
||||
0.2,
|
||||
0.2
|
||||
],
|
||||
[
|
||||
0.2,
|
||||
0.2,
|
||||
0.2,
|
||||
0.2,
|
||||
0.2
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 1.2 KiB |
|
|
@ -0,0 +1,52 @@
|
|||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-SA-3.0",
|
||||
"copyright": "",
|
||||
"size": {
|
||||
"x": 32,
|
||||
"y": 32
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "icon",
|
||||
"delays": [
|
||||
[
|
||||
0.15,
|
||||
0.15,
|
||||
0.15,
|
||||
0.15
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "equipped-BACKPACK",
|
||||
"directions": 4,
|
||||
"delays": [
|
||||
[
|
||||
0.2,
|
||||
0.2,
|
||||
0.2,
|
||||
0.2
|
||||
],
|
||||
[
|
||||
0.2,
|
||||
0.2,
|
||||
0.2,
|
||||
0.2
|
||||
],
|
||||
[
|
||||
0.2,
|
||||
0.2,
|
||||
0.2,
|
||||
0.2
|
||||
],
|
||||
[
|
||||
0.2,
|
||||
0.2,
|
||||
0.2,
|
||||
0.2
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
After Width: | Height: | Size: 1 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
|
@ -0,0 +1,56 @@
|
|||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-SA-3.0",
|
||||
"copyright": "",
|
||||
"size": {
|
||||
"x": 32,
|
||||
"y": 32
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "icon",
|
||||
"delays": [
|
||||
[
|
||||
0.15,
|
||||
0.15,
|
||||
0.15,
|
||||
0.15,
|
||||
0.15,
|
||||
0.15,
|
||||
0.15,
|
||||
0.15
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "equipped-BACKPACK",
|
||||
"directions": 4,
|
||||
"delays": [
|
||||
[
|
||||
0.2,
|
||||
0.2,
|
||||
0.2,
|
||||
0.2
|
||||
],
|
||||
[
|
||||
0.2,
|
||||
0.2,
|
||||
0.2,
|
||||
0.2
|
||||
],
|
||||
[
|
||||
0.2,
|
||||
0.2,
|
||||
0.2,
|
||||
0.2
|
||||
],
|
||||
[
|
||||
0.2,
|
||||
0.2,
|
||||
0.2,
|
||||
0.2
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-SA-3.0",
|
||||
"copyright": "",
|
||||
"size": {
|
||||
"x": 32,
|
||||
"y": 32
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "icon"
|
||||
},
|
||||
{
|
||||
"name": "equipped-OUTERCLOTHING",
|
||||
"directions": 4
|
||||
}
|
||||
]
|
||||
}
|
||||
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 957 B |
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-SA-3.0",
|
||||
"copyright": "",
|
||||
"size": {
|
||||
"x": 32,
|
||||
"y": 32
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "icon"
|
||||
},
|
||||
{
|
||||
"name": "equipped-OUTERCLOTHING",
|
||||
"directions": 4
|
||||
}
|
||||
]
|
||||
}
|
||||
|
After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 935 B |
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-SA-3.0",
|
||||
"copyright": "",
|
||||
"size": {
|
||||
"x": 32,
|
||||
"y": 32
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "icon"
|
||||
},
|
||||
{
|
||||
"name": "equipped-OUTERCLOTHING",
|
||||
"directions": 4
|
||||
}
|
||||
]
|
||||
}
|
||||
|
After Width: | Height: | Size: 2.3 KiB |
BIN
Resources/Textures/_Sunrise/Modsuits/Clothing/Hardsuits/icon.png
Normal file
|
After Width: | Height: | Size: 957 B |
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-SA-3.0",
|
||||
"copyright": "",
|
||||
"size": {
|
||||
"x": 32,
|
||||
"y": 32
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "icon"
|
||||
},
|
||||
{
|
||||
"name": "equipped-OUTERCLOTHING",
|
||||
"directions": 4
|
||||
}
|
||||
]
|
||||
}
|
||||
|
After Width: | Height: | Size: 1.8 KiB |
|
After Width: | Height: | Size: 786 B |
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-SA-3.0",
|
||||
"copyright": "",
|
||||
"size": {
|
||||
"x": 32,
|
||||
"y": 32
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "icon"
|
||||
},
|
||||
{
|
||||
"name": "equipped-OUTERCLOTHING",
|
||||
"directions": 4
|
||||
}
|
||||
]
|
||||
}
|
||||
|
After Width: | Height: | Size: 990 B |
|
After Width: | Height: | Size: 610 B |
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-SA-3.0",
|
||||
"copyright": "",
|
||||
"size": {
|
||||
"x": 32,
|
||||
"y": 32
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "icon"
|
||||
},
|
||||
{
|
||||
"name": "equipped-HELMET",
|
||||
"directions": 4
|
||||
}
|
||||
]
|
||||
}
|
||||
|
After Width: | Height: | Size: 918 B |