modsuit-demo (#3502)

Co-authored-by: darneya <darneya.git>
Co-authored-by: DerKurait <AlbarKabrt@yandex.ru>
This commit is contained in:
darneya 2025-12-25 21:23:14 +03:00 committed by GitHub
parent 713f58627d
commit 70df8c098b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
110 changed files with 2311 additions and 4 deletions

View 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);
}
}
}

View file

@ -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;
}
}

View file

@ -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;

View file

@ -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);

View file

@ -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
{
}

View file

@ -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;
}
}

View file

@ -0,0 +1,5 @@
using Content.Shared.Actions;
namespace Content.Shared.Clothing.EntitySystems;
public sealed partial class EjectionEvent : InstantActionEvent;

View file

@ -0,0 +1,5 @@
using Content.Shared.Actions;
namespace Content.Shared.Clothing.EntitySystems;
public sealed partial class InjectionEvent : InstantActionEvent;

View file

@ -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;

View file

@ -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;

View file

@ -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;
}

View 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;
}

View file

@ -0,0 +1,4 @@
namespace Content.Shared._Sunrise.HardsuitInjection.Components;
[RegisterComponent]
public sealed partial class InjectNeedComponent : Component;

View file

@ -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);
}
}

View file

@ -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
}

View file

@ -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;
}
}

View file

@ -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);
}
}

View 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
}

View 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;
}

View 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();
}
}

View file

@ -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;
}

View file

@ -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();
}
}

View file

@ -0,0 +1,7 @@
using Content.Shared.Actions;
namespace Content.Shared._Sunrise.PersonalBiocode;
public sealed partial class StoreDNAActionEvent : InstantActionEvent
{
}

View 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}

View file

@ -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

View file

@ -0,0 +1 @@
biocode-equip-failure = Your DNA is not recognized, access denied

View file

@ -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}

View file

@ -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 = Вам необходимо ядро для раскрытия скафандра Р.И.Г-а.

View file

@ -0,0 +1 @@
biocode-equip-failure = Ваша ДНК не распознана, в доступе отказано

View file

@ -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

View file

@ -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

View file

@ -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:

View file

@ -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

View file

@ -249,6 +249,7 @@
- type: Food
requiresSpecialDigestion: true
- type: CognizinFix
- type: InjectNeed
# Sunrise-End
- type: entity

View file

@ -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

View file

@ -222,6 +222,7 @@
- Instruments
- Equipment
# Sunrise-Start
- Modsuits
- PowerCages
- CargoSuit
- SurgeryDynamicSunrise

View file

@ -250,6 +250,7 @@
- CommonBackpack
- CommonSatchel
- CommonDuffel
- CommonModsuit #Sunrise-edit
- type: loadoutGroup
id: PassengerNeck

View file

@ -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

View file

@ -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

View file

@ -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

View 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

View file

@ -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

View file

@ -382,7 +382,7 @@
groups:
- NanoTrasenRepresentativeJumpsuit
- NanoTrasenRepresentativeOuterClothing
- CommonBackpack
- NanoTrasenRepresentativeBackpack
- Trinkets
- Survival
- GroupSpeciesBreathTool

View 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

View file

@ -39,3 +39,8 @@
- CellRechargerCircuitboard
- WeaponCapacitorRechargerCircuitboard
- FreezerElectronics
- type: latheRecipePack
id: Modsuits
recipes:
- ModsuitCore

View file

@ -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

View file

@ -109,3 +109,11 @@
Glass: 300
Plasma: 100
Silver: 50
- type: latheRecipe
id: Ampula
result: Ampula
completetime: 2
materials:
Glass: 200
Steel: 50

View file

@ -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

View 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

View file

@ -589,3 +589,7 @@
- type: Tag
id: NightVisionDevice
# Modsuit
- type: Tag
id: ModsuitCore

Binary file not shown.

After

Width:  |  Height:  |  Size: 492 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 258 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 259 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 B

View file

@ -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
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 624 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 486 B

View file

@ -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"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 801 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,015 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -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
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View file

@ -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
]
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -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
]
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -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
]
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -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
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 957 B

View file

@ -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
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 935 B

View file

@ -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
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 957 B

View file

@ -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
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 786 B

View file

@ -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
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 990 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 610 B

View file

@ -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
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 918 B

Some files were not shown because too many files have changed in this diff Show more