Add entity prototype save test (#10274)
This commit is contained in:
@@ -21,6 +21,7 @@ namespace Content.IntegrationTests.Tests
|
||||
public async Task SpawnTest()
|
||||
{
|
||||
//TODO: Run this test in a for loop, and figure out why garbage is ending up in the Entities list on cleanup.
|
||||
//If this gets fixed, see also UninitializedSaveTest.
|
||||
await using var pairTracker = await PoolManager.GetServerClient(new PoolSettings{NoClient = true, Dirty = true, Destructive = true});
|
||||
var server = pairTracker.Pair.Server;
|
||||
|
||||
|
||||
350
Content.IntegrationTests/Tests/PrototypeSaveTest.cs
Normal file
350
Content.IntegrationTests/Tests/PrototypeSaveTest.cs
Normal file
@@ -0,0 +1,350 @@
|
||||
#nullable enable
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Content.Shared.Coordinates;
|
||||
using NUnit.Framework;
|
||||
using Robust.Shared.GameObjects;
|
||||
using Robust.Shared.IoC;
|
||||
using Robust.Shared.Map;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Serialization.Manager;
|
||||
using Robust.Shared.Serialization.Markdown;
|
||||
using Robust.Shared.Serialization.Markdown.Mapping;
|
||||
using Robust.Shared.Serialization.Markdown.Validation;
|
||||
using Robust.Shared.Serialization.Markdown.Value;
|
||||
using Robust.Shared.Serialization.TypeSerializers.Interfaces;
|
||||
|
||||
namespace Content.IntegrationTests.Tests;
|
||||
|
||||
/// <summary>
|
||||
/// This test ensure that when an entity prototype is spawned into an un-initialized map, its component data is not
|
||||
/// modified during init. I.e., when the entity is saved to the map, its data is simply the default prototype data (ignoring transform component).
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// If you are here becaus your test is failing, one easy way of figuring out how to fix the prototype is to just
|
||||
/// spawn it into a new empty map and seeing what the map yml looks like.
|
||||
/// </remarks>
|
||||
[TestFixture]
|
||||
public sealed class PrototypeSaveTest
|
||||
{
|
||||
private readonly HashSet<string> _ignoredPrototypes = new()
|
||||
{
|
||||
"Singularity", // physics collision uses "AllMask" (-1). The flag serializer currently fails to save this because this features un-named bits.
|
||||
"constructionghost",
|
||||
|
||||
// TODO fix more prototypes
|
||||
// The rest of these prototypes (probably) shouldn't be getting ignored.
|
||||
// There should be an issue up tracking all of these prototypes, indicating that still need to get fixed.
|
||||
"C4",
|
||||
"WeaponProtoKineticAccelerator",
|
||||
"WeaponStaffHealing",
|
||||
"WeaponStaffPolymorphDoor",
|
||||
"WeaponWandPolymorphCarp",
|
||||
"WeaponWandPolymorphMonkey",
|
||||
"WeaponWandFireball",
|
||||
"WeaponWandDeath",
|
||||
"WeaponWandPolymorphDoor",
|
||||
"GlowstickBase",
|
||||
"GlowstickRed",
|
||||
"GlowstickPurple",
|
||||
"GlowstickYellow",
|
||||
"GlowstickBlue",
|
||||
"Thruster",
|
||||
"Gyroscope",
|
||||
"RemoteSignaller",
|
||||
"filingCabinet",
|
||||
"filingCabinetTall",
|
||||
"filingCabinetDrawer",
|
||||
"WeaponLauncherChinaLake",
|
||||
"WeaponLauncherRocket",
|
||||
"WeaponLauncherMultipleRocket",
|
||||
"Crematorium",
|
||||
"JawsOfLife",
|
||||
"SyndicateJawsOfLife",
|
||||
"LightReplacer",
|
||||
"ComputerCloningConsole",
|
||||
"PowerDrill",
|
||||
"Omnitool",
|
||||
"GasPressurePump",
|
||||
"GasVolumePump",
|
||||
"GasDualPortVentPump",
|
||||
"PortableScrubber",
|
||||
"ParticleAcceleratorControlBox",
|
||||
"GasFilter",
|
||||
"GasFilterFlipped",
|
||||
"GasMixer",
|
||||
"GasMixerFlipped",
|
||||
"HospitalCurtainsOpen",
|
||||
"CargoPallet",
|
||||
"DisposalHolder",
|
||||
"ParticlesProjectile",
|
||||
"AMEController",
|
||||
"AMEControllerUnanchored",
|
||||
"MopBucket",
|
||||
"JanitorialTrolley",
|
||||
"FloorDrain",
|
||||
"OrganHumanLungs",
|
||||
"SprayBottle",
|
||||
"OrganRatLungs",
|
||||
"SentientSlimeCore",
|
||||
"OrganSlimeLungs",
|
||||
"OrganVoxLungs",
|
||||
"OrganAnimalLungs",
|
||||
"Floodlight",
|
||||
"EmergencyMedipen",
|
||||
"AntiPoisonMedipen",
|
||||
"SpaceMedipen",
|
||||
"HolosignWetFloor",
|
||||
"HeadSkeleton",
|
||||
"PoweredlightEmpty",
|
||||
"Poweredlight",
|
||||
"PoweredlightLED",
|
||||
"PoweredlightExterior",
|
||||
"PoweredlightSodium",
|
||||
"PoweredSmallLightEmpty",
|
||||
"PoweredSmallLight",
|
||||
"PoweredLightPostSmallEmpty",
|
||||
"PoweredLightPostSmall",
|
||||
"DeployableBarrier",
|
||||
"CrateArtifactContainer",
|
||||
"CloningPod",
|
||||
"DrinkColaCan",
|
||||
"FoodBowlBig",
|
||||
"FoodBowlFancy",
|
||||
"MachineFrame",
|
||||
"WeaponImprovisedPneumaticCannon",
|
||||
"LauncherCreamPie",
|
||||
"GravityGenerator",
|
||||
"GravityGeneratorMini",
|
||||
"FoodCondimentPacket",
|
||||
"FoodCondimentBottle",
|
||||
"FoodCondimentBottleSmall",
|
||||
"Autolathe",
|
||||
"Protolathe",
|
||||
"CircuitImprinter",
|
||||
"SecurityTechFab",
|
||||
"MedicalTechFab",
|
||||
"UniformPrinter",
|
||||
"OreProcessor",
|
||||
"MedicalScanner",
|
||||
"KitchenMicrowave",
|
||||
"MagazinePistolSubMachineGunTopMounted",
|
||||
"Recycler",
|
||||
"EpinephrineChemistryBottle",
|
||||
"RobustHarvestChemistryBottle",
|
||||
"NocturineChemistryBottle",
|
||||
"EphedrineChemistryBottle",
|
||||
"OmnizineChemistryBottle",
|
||||
"Beaker",
|
||||
"LargeBeaker",
|
||||
"CryostasisBeaker",
|
||||
"BluespaceBeaker",
|
||||
"Syringe",
|
||||
"ClusterBang",
|
||||
"ClusterBangFull",
|
||||
"CargoTelepad",
|
||||
"ClothingHeadHatHardhatBlue",
|
||||
"ClothingHeadHatHardhatOrange",
|
||||
"ClothingHeadHatHardhatRed",
|
||||
"ClothingHeadHatHardhatWhite",
|
||||
"ClothingHeadHatHardhatYellow",
|
||||
"Vaccinator",
|
||||
"AirlockExternalShuttleLocked",
|
||||
"AirlockExternalGlassShuttleLocked",
|
||||
"AirlockExternalGlassShuttleEmergencyLocked",
|
||||
"ConveyorBelt",
|
||||
"ClothingHeadHatChef",
|
||||
"ClothingHeadHelmetFire",
|
||||
"ClothingHeadHelmetAtmosFire",
|
||||
"Bucket",
|
||||
"CableTerminal",
|
||||
"AirlockShuttle",
|
||||
"AirlockGlassShuttle"
|
||||
};
|
||||
|
||||
[Test]
|
||||
public async Task UninitializedSaveTest()
|
||||
{
|
||||
// Apparently SpawnTest fails to clean up properly. Due to the similarities, I'll assume this also fails.
|
||||
await using var pairTracker = await PoolManager.GetServerClient(new PoolSettings { NoClient = true, Dirty = true, Destructive = true });
|
||||
var server = pairTracker.Pair.Server;
|
||||
|
||||
var mapManager = server.ResolveDependency<IMapManager>();
|
||||
var entityMan = server.ResolveDependency<IEntityManager>();
|
||||
var prototypeMan = server.ResolveDependency<IPrototypeManager>();
|
||||
var tileDefinitionManager = server.ResolveDependency<ITileDefinitionManager>();
|
||||
var seriMan = server.ResolveDependency<ISerializationManager>();
|
||||
var compFact = server.ResolveDependency<IComponentFactory>();
|
||||
|
||||
var prototypes = new List<EntityPrototype>();
|
||||
IMapGrid grid = default!;
|
||||
EntityUid uid;
|
||||
MapId mapId = default;
|
||||
|
||||
//Build up test environment
|
||||
await server.WaitPost(() =>
|
||||
{
|
||||
// Create a one tile grid to stave off the grid 0 monsters
|
||||
mapId = mapManager.CreateMap();
|
||||
|
||||
mapManager.AddUninitializedMap(mapId);
|
||||
|
||||
grid = mapManager.CreateGrid(mapId);
|
||||
|
||||
var tileDefinition = tileDefinitionManager["UnderPlating"];
|
||||
var tile = new Tile(tileDefinition.TileId);
|
||||
var coordinates = grid.ToCoordinates();
|
||||
|
||||
grid.SetTile(coordinates, tile);
|
||||
});
|
||||
|
||||
await server.WaitRunTicks(5);
|
||||
|
||||
//Generate list of non-abstract prototypes to test
|
||||
foreach (var prototype in prototypeMan.EnumeratePrototypes<EntityPrototype>())
|
||||
{
|
||||
if (prototype.Abstract)
|
||||
continue;
|
||||
|
||||
// Currently mobs and such can't be serialized, but they aren't flagged as serializable anyways.
|
||||
if (!prototype.MapSavable)
|
||||
continue;
|
||||
|
||||
if (_ignoredPrototypes.Contains(prototype.ID))
|
||||
continue;
|
||||
|
||||
if (prototype.SetSuffix == "DEBUG")
|
||||
continue;
|
||||
|
||||
prototypes.Add(prototype);
|
||||
}
|
||||
|
||||
var context = new TestEntityUidContext();
|
||||
|
||||
await server.WaitAssertion(() =>
|
||||
{
|
||||
Assert.That(!mapManager.IsMapInitialized(mapId));
|
||||
var testLocation = grid.ToCoordinates();
|
||||
|
||||
Assert.Multiple(() =>
|
||||
{
|
||||
//Iterate list of prototypes to spawn
|
||||
foreach (var prototype in prototypes)
|
||||
{
|
||||
uid = entityMan.SpawnEntity(prototype.ID, testLocation);
|
||||
server.RunTicks(1);
|
||||
|
||||
// get default prototype data
|
||||
Dictionary<string, MappingDataNode> protoData = new();
|
||||
try
|
||||
{
|
||||
foreach (var (compType, comp) in prototype.Components)
|
||||
{
|
||||
protoData.Add(compType, seriMan.WriteValueAs<MappingDataNode>(comp.Component.GetType(), comp.Component, context: context));
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Assert.Fail($"Failed to convert prototype {prototype.ID} into yaml. Exception: {e.Message}");
|
||||
continue;
|
||||
}
|
||||
|
||||
var comps = new HashSet<IComponent>(entityMan.GetComponents(uid));
|
||||
var compNames = new HashSet<string>(comps.Count);
|
||||
foreach (var component in comps)
|
||||
{
|
||||
var compType = component.GetType();
|
||||
var compName = compFact.GetComponentName(compType);
|
||||
compNames.Add(compName);
|
||||
|
||||
if (compType == typeof(MetaDataComponent) || compType == typeof(TransformComponent))
|
||||
continue;
|
||||
|
||||
MappingDataNode compMapping;
|
||||
try
|
||||
{
|
||||
compMapping = seriMan.WriteValueAs<MappingDataNode>(compType, component, context: context);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Assert.Fail($"Failed to serialize {compName} component of entity prototype {prototype.ID}. Exception: {e.Message}");
|
||||
continue;
|
||||
}
|
||||
|
||||
if (protoData.TryGetValue(compName, out var protoMapping))
|
||||
{
|
||||
var diff = compMapping.Except(protoMapping);
|
||||
|
||||
if (diff != null && diff.Children.Count != 0)
|
||||
{
|
||||
var modComps = string.Join(",", diff.Keys.Select(x => x.ToString()));
|
||||
Assert.Fail($"Prototype {prototype.ID} modifies component on spawn: {compName}. Modified fields: {modComps}");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Assert.Fail($"Prototype {prototype.ID} gains a component on spawn: {compName}");
|
||||
}
|
||||
}
|
||||
|
||||
// An entity may also remove components on init -> check no components are missing.
|
||||
foreach (var (compType, comp) in prototype.Components)
|
||||
{
|
||||
Assert.That(compNames.Contains(compType), $"Prototype {prototype.ID} removes component {compType} on spawn.");
|
||||
}
|
||||
|
||||
if (!entityMan.Deleted(uid))
|
||||
entityMan.DeleteEntity(uid);
|
||||
}
|
||||
});
|
||||
});
|
||||
await pairTracker.CleanReturnAsync();
|
||||
}
|
||||
|
||||
private sealed class TestEntityUidContext : ISerializationContext,
|
||||
ITypeSerializer<EntityUid, ValueDataNode>,
|
||||
ITypeReaderWriter<EntityUid, ValueDataNode>
|
||||
{
|
||||
public Dictionary<(Type, Type), object> TypeReaders { get; }
|
||||
public Dictionary<Type, object> TypeWriters { get; }
|
||||
public Dictionary<Type, object> TypeCopiers => TypeWriters;
|
||||
public Dictionary<(Type, Type), object> TypeValidators => TypeReaders;
|
||||
|
||||
public TestEntityUidContext()
|
||||
{
|
||||
TypeReaders = new() { { (typeof(EntityUid), typeof(ValueDataNode)), this } };
|
||||
TypeWriters = new() { { typeof(EntityUid), this } };
|
||||
}
|
||||
|
||||
ValidationNode ITypeValidator<EntityUid, ValueDataNode>.Validate(ISerializationManager serializationManager,
|
||||
ValueDataNode node, IDependencyCollection dependencies, ISerializationContext? context)
|
||||
{
|
||||
return new ValidatedValueNode(node);
|
||||
}
|
||||
|
||||
public DataNode Write(ISerializationManager serializationManager, EntityUid value, bool alwaysWrite = false,
|
||||
ISerializationContext? context = null)
|
||||
{
|
||||
// EntityUids should be nullable and have no initial value.
|
||||
throw new InvalidOperationException("Serializing prototypes should not attempt to write entity Uids");
|
||||
}
|
||||
|
||||
EntityUid ITypeReader<EntityUid, ValueDataNode>.Read(ISerializationManager serializationManager,
|
||||
ValueDataNode node,
|
||||
IDependencyCollection dependencies,
|
||||
bool skipHook,
|
||||
ISerializationContext? context, EntityUid _)
|
||||
{
|
||||
return EntityUid.Invalid;
|
||||
}
|
||||
|
||||
public EntityUid Copy(ISerializationManager serializationManager, EntityUid source, EntityUid target,
|
||||
bool skipHook,
|
||||
ISerializationContext? context = null)
|
||||
{
|
||||
return new((int) source);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,3 @@
|
||||
using Content.Shared.Hands.Components;
|
||||
using Content.Shared.Inventory;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Linq;
|
||||
using Content.Server.Administration.Logs;
|
||||
using Content.Server.Kitchen.Components;
|
||||
using Content.Server.Popups;
|
||||
@@ -9,11 +5,11 @@ using Content.Shared.Access;
|
||||
using Content.Shared.Access.Components;
|
||||
using Content.Shared.Access.Systems;
|
||||
using Content.Shared.Database;
|
||||
using Content.Shared.PDA;
|
||||
using Content.Shared.Popups;
|
||||
using Robust.Shared.Player;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Random;
|
||||
using System.Linq;
|
||||
|
||||
namespace Content.Server.Access.Systems
|
||||
{
|
||||
@@ -27,13 +23,15 @@ namespace Content.Server.Access.Systems
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
SubscribeLocalEvent<IdCardComponent, ComponentInit>(OnInit);
|
||||
SubscribeLocalEvent<IdCardComponent, MapInitEvent>(OnMapInit);
|
||||
SubscribeLocalEvent<IdCardComponent, BeingMicrowavedEvent>(OnMicrowaved);
|
||||
}
|
||||
|
||||
private void OnInit(EntityUid uid, IdCardComponent id, ComponentInit args)
|
||||
private void OnMapInit(EntityUid uid, IdCardComponent id, MapInitEvent args)
|
||||
{
|
||||
id.OriginalOwnerName ??= EntityManager.GetComponent<MetaDataComponent>(id.Owner).EntityName;
|
||||
// On one hand, these prototypes should default to having the correct name. On the other hand, id cards are
|
||||
// rarely ever spawned in on their own without an owner, so this is fine.
|
||||
id.OriginalEntityName ??= EntityManager.GetComponent<MetaDataComponent>(id.Owner).EntityName;
|
||||
UpdateEntityName(uid, id);
|
||||
}
|
||||
|
||||
@@ -139,7 +137,7 @@ namespace Content.Server.Access.Systems
|
||||
|
||||
if (string.IsNullOrWhiteSpace(id.FullName) && string.IsNullOrWhiteSpace(id.JobTitle))
|
||||
{
|
||||
EntityManager.GetComponent<MetaDataComponent>(id.Owner).EntityName = id.OriginalOwnerName;
|
||||
EntityManager.GetComponent<MetaDataComponent>(id.Owner).EntityName = id.OriginalEntityName;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -147,7 +145,7 @@ namespace Content.Server.Access.Systems
|
||||
|
||||
var val = string.IsNullOrWhiteSpace(id.FullName)
|
||||
? Loc.GetString("access-id-card-component-owner-name-job-title-text",
|
||||
("originalOwnerName", id.OriginalOwnerName),
|
||||
("originalOwnerName", id.OriginalEntityName),
|
||||
("jobSuffix", jobSuffix))
|
||||
: Loc.GetString("access-id-card-component-owner-full-name-job-title-text",
|
||||
("fullName", id.FullName),
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using Content.Server.Access.Components;
|
||||
using Content.Server.Access.Components;
|
||||
using Content.Shared.Access.Components;
|
||||
using Content.Shared.Examine;
|
||||
using Content.Shared.Inventory;
|
||||
@@ -66,7 +66,7 @@ public sealed class IdExaminableSystem : EntitySystem
|
||||
|
||||
var val = string.IsNullOrWhiteSpace(id.FullName)
|
||||
? Loc.GetString("access-id-card-component-owner-name-job-title-text",
|
||||
("originalOwnerName", id.OriginalOwnerName),
|
||||
("originalOwnerName", id.OriginalEntityName),
|
||||
("jobSuffix", jobSuffix))
|
||||
: Loc.GetString("access-id-card-component-owner-full-name-job-title-text",
|
||||
("fullName", id.FullName),
|
||||
|
||||
@@ -33,11 +33,11 @@ namespace Content.Server.Body.Components
|
||||
mechanism.Owner.RandomOffset(0.25f);
|
||||
}
|
||||
|
||||
protected override void Initialize()
|
||||
public void MapInitialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
_mechanismContainer = Owner.EnsureContainer<Container>($"{Name}-{nameof(BodyPartComponent)}");
|
||||
_mechanismContainer = Owner.EnsureContainer<Container>(ContainerId);
|
||||
|
||||
// This is ran in Startup as entities spawned in Initialize
|
||||
// are not synced to the client since they are assumed to be
|
||||
|
||||
@@ -21,6 +21,7 @@ namespace Content.Server.Body.Systems
|
||||
SubscribeLocalEvent<BodyComponent, MoveInputEvent>(OnRelayMoveInput);
|
||||
SubscribeLocalEvent<BodyComponent, ApplyMetabolicMultiplierEvent>(OnApplyMetabolicMultiplier);
|
||||
SubscribeLocalEvent<BodyComponent, BeingMicrowavedEvent>(OnBeingMicrowaved);
|
||||
SubscribeLocalEvent<BodyPartComponent, MapInitEvent>((_, c, _) => c.MapInitialize());
|
||||
}
|
||||
|
||||
private void OnRelayMoveInput(EntityUid uid, BodyComponent component, ref MoveInputEvent args)
|
||||
|
||||
@@ -12,6 +12,8 @@ namespace Content.Server.Disposal.Tube.Components
|
||||
{
|
||||
public abstract class DisposalTubeComponent : Component, IDisposalTubeComponent
|
||||
{
|
||||
public const string ContainerId = "disposal-tube";
|
||||
|
||||
[Dependency] private readonly IEntityManager _entMan = default!;
|
||||
|
||||
public static readonly TimeSpan ClangDelay = TimeSpan.FromSeconds(0.5);
|
||||
@@ -135,7 +137,7 @@ namespace Content.Server.Disposal.Tube.Components
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
Contents = ContainerHelpers.EnsureContainer<Container>(Owner, Name);
|
||||
Contents = ContainerHelpers.EnsureContainer<Container>(Owner, ContainerId);
|
||||
Owner.EnsureComponent<AnchorableComponent>();
|
||||
}
|
||||
|
||||
|
||||
@@ -46,6 +46,7 @@ namespace Content.Server.Disposal.Unit.EntitySystems
|
||||
[Dependency] private readonly SharedHandsSystem _handsSystem = default!;
|
||||
[Dependency] private readonly DumpableSystem _dumpableSystem = default!;
|
||||
[Dependency] private readonly TransformSystem _transformSystem = default!;
|
||||
[Dependency] private readonly SharedContainerSystem _containerSystem = default!;
|
||||
|
||||
private readonly List<DisposalUnitComponent> _activeDisposals = new();
|
||||
|
||||
@@ -293,7 +294,7 @@ namespace Content.Server.Disposal.Unit.EntitySystems
|
||||
|
||||
private void HandleDisposalInit(EntityUid uid, DisposalUnitComponent component, ComponentInit args)
|
||||
{
|
||||
component.Container = component.Owner.EnsureContainer<Container>(component.Name);
|
||||
component.Container = _containerSystem.EnsureContainer<Container>(uid, SharedDisposalUnitComponent.ContainerId);
|
||||
|
||||
UpdateInterface(component, component.Powered);
|
||||
|
||||
|
||||
@@ -62,7 +62,7 @@ public sealed class RenameCommand : IConsoleCommand
|
||||
{
|
||||
foreach (var idCardComponent in entMan.EntityQuery<IdCardComponent>())
|
||||
{
|
||||
if (idCardComponent.OriginalOwnerName != oldName)
|
||||
if (idCardComponent.OriginalEntityName != oldName)
|
||||
continue;
|
||||
idCardSystem.TryChangeFullName(idCardComponent.Owner, name, idCardComponent);
|
||||
}
|
||||
|
||||
@@ -182,9 +182,11 @@ namespace Content.Server.Nutrition.EntitySystems
|
||||
|
||||
UpdateAppearance(component);
|
||||
|
||||
// Synchronize solution in drink
|
||||
EnsureComp<RefillableSolutionComponent>(uid).Solution = component.SolutionName;
|
||||
EnsureComp<DrainableSolutionComponent>(uid).Solution = component.SolutionName;
|
||||
if (TryComp(uid, out RefillableSolutionComponent? refillComp))
|
||||
refillComp.Solution = component.SolutionName;
|
||||
|
||||
if (TryComp(uid, out DrainableSolutionComponent? drainComp))
|
||||
drainComp.Solution = component.SolutionName;
|
||||
}
|
||||
|
||||
private void OnSolutionChange(EntityUid uid, DrinkComponent component, SolutionChangedEvent args)
|
||||
|
||||
@@ -30,8 +30,6 @@ namespace Content.Server.Nutrition.EntitySystems
|
||||
|
||||
public void CheckSolutions(TrashOnEmptyComponent component)
|
||||
{
|
||||
EntityManager.EnsureComponent<TagComponent>(component.Owner);
|
||||
|
||||
if (!EntityManager.HasComponent<SolutionContainerManagerComponent>((component).Owner))
|
||||
return;
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ namespace Content.Server.PDA.Ringer
|
||||
base.Initialize();
|
||||
|
||||
// General Event Subscriptions
|
||||
SubscribeLocalEvent<RingerComponent, ComponentInit>(RandomizeRingtone);
|
||||
SubscribeLocalEvent<RingerComponent, MapInitEvent>(RandomizeRingtone);
|
||||
// RingerBoundUserInterface Subscriptions
|
||||
SubscribeLocalEvent<RingerComponent, RingerSetRingtoneMessage>(OnSetRingtone);
|
||||
SubscribeLocalEvent<RingerComponent, RingerPlayRingtoneMessage>(RingerPlayRingtone);
|
||||
@@ -46,7 +46,7 @@ namespace Content.Server.PDA.Ringer
|
||||
UpdateRingerRingtone(ringer, args.Ringtone);
|
||||
}
|
||||
|
||||
public void RandomizeRingtone(EntityUid uid, RingerComponent ringer, ComponentInit args)
|
||||
public void RandomizeRingtone(EntityUid uid, RingerComponent ringer, MapInitEvent args)
|
||||
{
|
||||
// Default to using C pentatonic so it at least sounds not terrible.
|
||||
var notes = new[]
|
||||
|
||||
@@ -50,7 +50,7 @@ public sealed class EntityStorageSystem : EntitySystem
|
||||
component.Contents.OccludesLight = component.OccludesLight;
|
||||
|
||||
if (TryComp<ConstructionComponent>(uid, out var construction))
|
||||
_construction.AddContainer(uid, nameof(EntityStorageComponent), construction);
|
||||
_construction.AddContainer(uid, ContainerName, construction);
|
||||
|
||||
if (TryComp<PlaceableSurfaceComponent>(uid, out var placeable))
|
||||
_placeableSurface.SetPlaceable(uid, component.Open, placeable);
|
||||
|
||||
@@ -13,6 +13,7 @@ namespace Content.Server.Storage.EntitySystems
|
||||
{
|
||||
[Dependency] private readonly PopupSystem _popupSystem = default!;
|
||||
[Dependency] private readonly SharedHandsSystem _handsSystem = default!;
|
||||
[Dependency] private readonly SharedContainerSystem _containerSystem = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
@@ -31,7 +32,7 @@ namespace Content.Server.Storage.EntitySystems
|
||||
component.SecretPartName = entityName;
|
||||
}
|
||||
|
||||
component.ItemContainer = ContainerHelpers.EnsureContainer<ContainerSlot>(uid, "stash", out _);
|
||||
component.ItemContainer = _containerSystem.EnsureContainer<ContainerSlot>(uid, "stash", out _);
|
||||
}
|
||||
|
||||
private void OnDestroyed(EntityUid uid, SecretStashComponent component, DestructionEventArgs args)
|
||||
|
||||
@@ -14,7 +14,10 @@ namespace Content.Shared.Access.Components
|
||||
[Access(typeof(AccessSystem), Other = AccessPermissions.ReadExecute)] // FIXME Friends
|
||||
public HashSet<string> Tags = new();
|
||||
|
||||
[DataField("groups", customTypeSerializer: typeof(PrototypeIdHashSetSerializer<AccessGroupPrototype>))]
|
||||
public HashSet<string> Groups = new();
|
||||
/// <summary>
|
||||
/// Access Groups. These are added to the tags during map init. After map init this will have no effect.
|
||||
/// </summary>
|
||||
[DataField("groups", readOnly: true, customTypeSerializer: typeof(PrototypeIdHashSetSerializer<AccessGroupPrototype>))]
|
||||
public readonly HashSet<string> Groups = new();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,8 +9,8 @@ namespace Content.Shared.Access.Components
|
||||
[Access(typeof(SharedIdCardSystem), typeof(SharedPDASystem), typeof(SharedAgentIdCardSystem))]
|
||||
public sealed class IdCardComponent : Component
|
||||
{
|
||||
[DataField("originalOwnerName")]
|
||||
public string OriginalOwnerName = default!;
|
||||
[DataField("originalEntityName")]
|
||||
public string OriginalEntityName = string.Empty;
|
||||
|
||||
[DataField("fullName")]
|
||||
[Access(typeof(SharedIdCardSystem), typeof(SharedPDASystem), typeof(SharedAgentIdCardSystem),
|
||||
|
||||
@@ -12,10 +12,10 @@ namespace Content.Shared.Access.Systems
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<AccessComponent, ComponentInit>(OnAccessInit);
|
||||
SubscribeLocalEvent<AccessComponent, MapInitEvent>(OnAccessInit);
|
||||
}
|
||||
|
||||
private void OnAccessInit(EntityUid uid, AccessComponent component, ComponentInit args)
|
||||
private void OnAccessInit(EntityUid uid, AccessComponent component, MapInitEvent args)
|
||||
{
|
||||
// Add all tags in groups to the list of tags.
|
||||
foreach (var group in component.Groups)
|
||||
|
||||
@@ -11,6 +11,8 @@ namespace Content.Shared.Body.Components
|
||||
[NetworkedComponent()]
|
||||
public abstract class SharedBodyPartComponent : Component
|
||||
{
|
||||
public const string ContainerId = "bodypart";
|
||||
|
||||
[Dependency] private readonly IEntityManager _entMan = default!;
|
||||
private SharedBodyComponent? _body;
|
||||
|
||||
|
||||
@@ -6,6 +6,8 @@ namespace Content.Shared.Disposal.Components
|
||||
[NetworkedComponent]
|
||||
public abstract class SharedDisposalUnitComponent : Component
|
||||
{
|
||||
public const string ContainerId = "disposal-unit";
|
||||
|
||||
// TODO: Could maybe turn the contact off instead far more cheaply as farseer (though not box2d) had support for it?
|
||||
// Need to suss it out.
|
||||
/// <summary>
|
||||
|
||||
@@ -16,6 +16,7 @@ public abstract partial class SharedGunSystem
|
||||
protected virtual void InitializeBallistic()
|
||||
{
|
||||
SubscribeLocalEvent<BallisticAmmoProviderComponent, ComponentInit>(OnBallisticInit);
|
||||
SubscribeLocalEvent<BallisticAmmoProviderComponent, MapInitEvent>(OnBallisticMapInit);
|
||||
SubscribeLocalEvent<BallisticAmmoProviderComponent, TakeAmmoEvent>(OnBallisticTakeAmmo);
|
||||
SubscribeLocalEvent<BallisticAmmoProviderComponent, GetAmmoCountEvent>(OnBallisticAmmoCount);
|
||||
SubscribeLocalEvent<BallisticAmmoProviderComponent, ComponentGetState>(OnBallisticGetState);
|
||||
@@ -122,16 +123,12 @@ public abstract partial class SharedGunSystem
|
||||
private void OnBallisticInit(EntityUid uid, BallisticAmmoProviderComponent component, ComponentInit args)
|
||||
{
|
||||
component.Container = Containers.EnsureContainer<Container>(uid, "ballistic-ammo");
|
||||
component.UnspawnedCount = component.Capacity;
|
||||
}
|
||||
|
||||
private void OnBallisticMapInit(EntityUid uid, BallisticAmmoProviderComponent component, MapInitEvent args)
|
||||
{
|
||||
if (component.FillProto != null)
|
||||
{
|
||||
component.UnspawnedCount -= Math.Min(component.UnspawnedCount, component.Container.ContainedEntities.Count);
|
||||
}
|
||||
else
|
||||
{
|
||||
component.UnspawnedCount = 0;
|
||||
}
|
||||
}
|
||||
|
||||
protected int GetBallisticShots(BallisticAmmoProviderComponent component)
|
||||
|
||||
@@ -10,6 +10,11 @@
|
||||
components:
|
||||
- type: Damageable
|
||||
damageContainer: Biological
|
||||
- type: BodyPart
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
bodypart: !type:Container
|
||||
ents: []
|
||||
|
||||
# For primates mainly
|
||||
- type: entity
|
||||
|
||||
@@ -8,6 +8,11 @@
|
||||
components:
|
||||
- type: Damageable
|
||||
damageContainer: Biological
|
||||
- type: BodyPart
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
bodypart: !type:Container
|
||||
ents: []
|
||||
|
||||
- type: entity
|
||||
id: TorsoHuman
|
||||
|
||||
@@ -8,6 +8,11 @@
|
||||
components:
|
||||
- type: Damageable
|
||||
damageContainer: Biological
|
||||
- type: BodyPart
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
bodypart: !type:Container
|
||||
ents: []
|
||||
|
||||
- type: entity
|
||||
id: TorsoReptilian
|
||||
|
||||
@@ -6,6 +6,11 @@
|
||||
components:
|
||||
- type: Damageable
|
||||
damageContainer: Inorganic
|
||||
- type: BodyPart
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
bodypart: !type:Container
|
||||
ents: []
|
||||
|
||||
- type: entity
|
||||
id: LeftArmBorg
|
||||
|
||||
@@ -7,6 +7,11 @@
|
||||
components:
|
||||
- type: Damageable
|
||||
damageContainer: Biological
|
||||
- type: BodyPart
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
bodypart: !type:Container
|
||||
ents: []
|
||||
|
||||
- type: entity
|
||||
id: TorsoSkeleton
|
||||
|
||||
@@ -7,6 +7,11 @@
|
||||
components:
|
||||
- type: Damageable
|
||||
damageContainer: Biological
|
||||
- type: BodyPart
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
bodypart: !type:Container
|
||||
ents: []
|
||||
|
||||
- type: entity
|
||||
id: TorsoSlime
|
||||
|
||||
@@ -8,6 +8,11 @@
|
||||
components:
|
||||
- type: Damageable
|
||||
damageContainer: Biological
|
||||
- type: BodyPart
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
bodypart: !type:Container
|
||||
ents: []
|
||||
|
||||
- type: entity
|
||||
id: TorsoVox
|
||||
|
||||
@@ -367,10 +367,22 @@
|
||||
- id: MagazineShotgunIncendiary
|
||||
amount: 6
|
||||
|
||||
# base BallisticAmmoProvider boxes
|
||||
- type: entity
|
||||
parent: BoxCardboard
|
||||
id: BoxAmmoProvider
|
||||
abstract: true
|
||||
components:
|
||||
- type: BallisticAmmoProvider
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
ballistic-ammo: !type:Container
|
||||
storagebase: !type:Container
|
||||
|
||||
# Shotgun Shells
|
||||
- type: entity
|
||||
name: box of shotgun beanbag cartridges
|
||||
parent: BoxCardboard
|
||||
parent: BoxAmmoProvider
|
||||
id: BoxBeanbag
|
||||
description: A box full of beanbag shots, designed for riot shotguns.
|
||||
components:
|
||||
@@ -384,7 +396,7 @@
|
||||
|
||||
- type: entity
|
||||
name: box of shotgun lethal cartridges
|
||||
parent: BoxCardboard
|
||||
parent: BoxAmmoProvider
|
||||
id: BoxLethalshot
|
||||
description: A box full of lethal pellet shots, designed for riot shotguns.
|
||||
components:
|
||||
@@ -398,7 +410,7 @@
|
||||
|
||||
- type: entity
|
||||
name: box of shotgun slug cartridges
|
||||
parent: BoxCardboard
|
||||
parent: BoxAmmoProvider
|
||||
id: BoxShotgunSlug
|
||||
description: A box full of shotgun slugs, designed for riot shotguns.
|
||||
components:
|
||||
@@ -412,7 +424,7 @@
|
||||
|
||||
- type: entity
|
||||
name: box of shotgun flare cartridges
|
||||
parent: BoxCardboard
|
||||
parent: BoxAmmoProvider
|
||||
id: BoxShotgunFlare
|
||||
description: A box full of shotgun flare cartridges, designed for riot shotguns.
|
||||
components:
|
||||
@@ -426,7 +438,7 @@
|
||||
|
||||
- type: entity
|
||||
name: box of shotgun incendiary cartridges
|
||||
parent: BoxCardboard
|
||||
parent: BoxAmmoProvider
|
||||
id: BoxShotgunIncendiary
|
||||
description: A box full of shotgun incendiary cartridges, designed for riot shotguns.
|
||||
components:
|
||||
@@ -440,7 +452,7 @@
|
||||
|
||||
- type: entity
|
||||
name: box of shotgun practice cartridges
|
||||
parent: BoxCardboard
|
||||
parent: BoxAmmoProvider
|
||||
id: BoxShotgunPractice
|
||||
description: A box full of shotgun practice cartridges, designed for riot shotguns.
|
||||
components:
|
||||
@@ -454,7 +466,7 @@
|
||||
|
||||
- type: entity
|
||||
name: box of tranquilizer cartridges
|
||||
parent: BoxCardboard
|
||||
parent: BoxAmmoProvider
|
||||
id: BoxShellTranquilizer
|
||||
description: A box full of tranquilizer cartridges, designed for riot shotguns.
|
||||
components:
|
||||
|
||||
@@ -15,6 +15,10 @@
|
||||
- back
|
||||
- type: Storage
|
||||
capacity: 100
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
storagebase: !type:Container
|
||||
ents: []
|
||||
- type: UserInterface
|
||||
interfaces:
|
||||
- key: enum.StorageUiKey.Key
|
||||
|
||||
@@ -15,6 +15,10 @@
|
||||
- back
|
||||
- type: Storage
|
||||
capacity: 120
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
storagebase: !type:Container
|
||||
ents: []
|
||||
- type: ClothingSpeedModifier
|
||||
walkModifier: 1
|
||||
sprintModifier: 0.9
|
||||
|
||||
@@ -15,6 +15,10 @@
|
||||
- back
|
||||
- type: Storage
|
||||
capacity: 100
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
storagebase: !type:Container
|
||||
ents: []
|
||||
- type: UserInterface
|
||||
interfaces:
|
||||
- key: enum.StorageUiKey.Key
|
||||
|
||||
@@ -20,6 +20,10 @@
|
||||
capacity: 40
|
||||
equipSound:
|
||||
path: /Audio/Items/belt_equip.ogg
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
storagebase: !type:Container
|
||||
ents: []
|
||||
- type: UserInterface
|
||||
interfaces:
|
||||
- key: enum.StorageUiKey.Key
|
||||
|
||||
@@ -221,6 +221,10 @@
|
||||
Heat: 0.65
|
||||
Radiation: 1
|
||||
- type: IdentityBlocker
|
||||
- type: ItemSlots
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
cell_slot: !type:ContainerSlot {}
|
||||
|
||||
- type: entity
|
||||
parent: ClothingHeadLightBase
|
||||
|
||||
@@ -30,6 +30,10 @@
|
||||
components:
|
||||
- type: Storage
|
||||
capacity: 10
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
storagebase: !type:Container
|
||||
ents: []
|
||||
- type: UserInterface
|
||||
interfaces:
|
||||
- key: enum.StorageUiKey.Key
|
||||
@@ -62,6 +66,9 @@
|
||||
- type: DiseaseProtection
|
||||
protection: 0.05
|
||||
- type: ToggleableClothing
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
toggleable-clothing: !type:ContainerSlot {}
|
||||
|
||||
- type: entity
|
||||
abstract: true
|
||||
|
||||
@@ -35,6 +35,9 @@
|
||||
coefficient: 0.5
|
||||
- type: ToggleableClothing
|
||||
clothingPrototype: ClothingHeadHelmetEVA
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
toggleable-clothing: !type:ContainerSlot {}
|
||||
|
||||
- type: entity
|
||||
parent: ClothingOuterBaseLarge
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
- type: Sprite
|
||||
drawdepth: FloorObjects
|
||||
- type: SolutionContainerManager
|
||||
solutions:
|
||||
puddle: {}
|
||||
- type: Puddle
|
||||
spillSound:
|
||||
path: /Audio/Effects/Fluids/splat.ogg
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
- state: blue
|
||||
- texture: Mobs/Species/Human/parts.rsi/full.png
|
||||
- state: ai
|
||||
- type: Timer
|
||||
- type: TimedSpawner
|
||||
prototypes:
|
||||
- MobSpirate
|
||||
@@ -27,6 +28,7 @@
|
||||
- state: blue
|
||||
- texture: Mobs/Aliens/Xenos/burrower.rsi/crit.png
|
||||
- state: ai
|
||||
- type: Timer
|
||||
- type: TimedSpawner
|
||||
prototypes:
|
||||
- MobXeno
|
||||
@@ -45,6 +47,7 @@
|
||||
- state: blue
|
||||
- texture: Mobs/Animals/mouse.rsi/icon-2.png
|
||||
- state: timed
|
||||
- type: Timer
|
||||
- type: TimedSpawner
|
||||
prototypes:
|
||||
- MobMouse
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
- type: entity
|
||||
parent: BaseMobHuman
|
||||
suffix: Dead
|
||||
save: true
|
||||
save: false # mobs are currently not saveable.
|
||||
id: SalvageHumanCorpse
|
||||
name: unidentified human
|
||||
description: We barely knew ye.
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
name: GuardianBase
|
||||
id: MobGuardianBase
|
||||
description: guardian
|
||||
save: false
|
||||
components:
|
||||
- type: GhostTakeoverAvailable
|
||||
makeSentient: true
|
||||
|
||||
@@ -22,6 +22,8 @@
|
||||
solution: drink
|
||||
- type: RefillableSolution
|
||||
solution: drink
|
||||
- type: DrainableSolution
|
||||
solution: drink
|
||||
- type: UserInterface
|
||||
interfaces:
|
||||
- key: enum.TransferAmountUiKey.Key
|
||||
|
||||
@@ -27,6 +27,12 @@
|
||||
- state: icon
|
||||
map: ["enum.DrinkCanVisualLayers.Icon"]
|
||||
netsync: false
|
||||
- type: FitsInDispenser
|
||||
solution: drink
|
||||
- type: DrawableSolution
|
||||
solution: drink
|
||||
- type: RefillableSolution
|
||||
solution: drink
|
||||
- type: DrainableSolution
|
||||
solution: drink
|
||||
- type: Appearance
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
solution: drink
|
||||
- type: RefillableSolution
|
||||
solution: drink
|
||||
- type: DrainableSolution
|
||||
solution: drink
|
||||
- type: SolutionTransfer
|
||||
canChangeTransferAmount: true
|
||||
maxTransferAmount: 10
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
solution: drink
|
||||
- type: RefillableSolution
|
||||
solution: drink
|
||||
- type: DrainableSolution
|
||||
solution: drink
|
||||
- type: SolutionTransfer
|
||||
canChangeTransferAmount: true
|
||||
- type: Spillable
|
||||
|
||||
@@ -19,6 +19,14 @@
|
||||
isOpen: true
|
||||
- type: Spillable
|
||||
solution: drink
|
||||
- type: FitsInDispenser
|
||||
solution: drink
|
||||
- type: DrawableSolution
|
||||
solution: drink
|
||||
- type: RefillableSolution
|
||||
solution: drink
|
||||
- type: DrainableSolution
|
||||
solution: drink
|
||||
- type: UserInterface
|
||||
interfaces:
|
||||
- key: enum.TransferAmountUiKey.Key
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
components:
|
||||
- type: Drink
|
||||
solution: food
|
||||
refillable: false
|
||||
openSounds:
|
||||
collection: packetOpenSounds
|
||||
- type: DrawableSolution
|
||||
@@ -19,7 +20,9 @@
|
||||
solution: food
|
||||
- type: DrainableSolution
|
||||
solution: food
|
||||
# Note NOT refillable
|
||||
# Note NOT refillable.
|
||||
# It be a shame if it turned out ALL drinks were ALWAYS refillable.... ffs.
|
||||
# Well its fixed now, but I want to share my pain.
|
||||
- type: SolutionContainerManager
|
||||
solutions:
|
||||
food:
|
||||
@@ -331,6 +334,10 @@
|
||||
solution: food
|
||||
openSounds:
|
||||
collection: pop
|
||||
- type: RefillableSolution
|
||||
solution: food
|
||||
- type: DrainableSolution
|
||||
solution: food
|
||||
- type: SolutionContainerManager
|
||||
solutions:
|
||||
food:
|
||||
@@ -478,6 +485,10 @@
|
||||
solution: food
|
||||
openSounds:
|
||||
collection: pop
|
||||
- type: RefillableSolution
|
||||
solution: food
|
||||
- type: DrainableSolution
|
||||
solution: food
|
||||
- type: SolutionContainerManager
|
||||
solutions:
|
||||
food:
|
||||
|
||||
@@ -8,6 +8,10 @@
|
||||
- type: ItemCooldown
|
||||
- type: UseDelay
|
||||
delay: 1.0
|
||||
- type: ItemSlots
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
cell_slot: !type:ContainerSlot {}
|
||||
- type: PowerCellSlot
|
||||
cellSlot:
|
||||
startingItem: PowerCellMedium
|
||||
|
||||
@@ -48,6 +48,10 @@
|
||||
- type: StaticPrice
|
||||
price: 50000 # YOU STOLE A NUCLEAR FISSION EXPLOSIVE?!
|
||||
- type: CargoSellBlacklist
|
||||
- type: ItemSlots
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
Nuke: !type:ContainerSlot
|
||||
|
||||
- type: entity
|
||||
parent: NuclearBomb
|
||||
|
||||
@@ -76,6 +76,11 @@
|
||||
enum.ChemicalPayloadFilledSlots.Left: payload-chemical-left
|
||||
enum.ChemicalPayloadFilledSlots.Right: payload-chemical-right
|
||||
enum.ChemicalPayloadFilledSlots.Both: payload-chemical-armed
|
||||
- type: ItemSlots
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
BeakerSlotA: !type:ContainerSlot
|
||||
BeakerSlotB: !type:ContainerSlot
|
||||
|
||||
- type: entity
|
||||
name: flash payload
|
||||
|
||||
@@ -17,6 +17,11 @@
|
||||
state: pda
|
||||
- type: Item
|
||||
size: 10
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
PDA-id: !type:ContainerSlot {}
|
||||
PDA-pen: !type:ContainerSlot {}
|
||||
- type: ItemSlots
|
||||
- type: Clothing
|
||||
quickEquip: false
|
||||
slots:
|
||||
|
||||
@@ -147,7 +147,7 @@
|
||||
state: toms
|
||||
|
||||
- type: entity
|
||||
parent: BasePlaceableInstrument
|
||||
parent: [ BasePlaceableInstrument, ConstructibleMachine]
|
||||
id: DawInstrument
|
||||
name: digital audio workstation
|
||||
description: Cutting edge music technology, straight from the 90s.
|
||||
@@ -161,9 +161,6 @@
|
||||
map: ["enum.WiresVisualLayers.MaintenancePanel"]
|
||||
- type: Appearance
|
||||
- type: WiresVisuals
|
||||
- type: Construction
|
||||
graph: Machine
|
||||
node: machine
|
||||
- type: Wires
|
||||
BoardName: "DawInstrument"
|
||||
LayoutId: DawInstrument
|
||||
|
||||
@@ -491,6 +491,10 @@
|
||||
capacity: 1
|
||||
soundInsert:
|
||||
path: /Audio/Weapons/drawbow2.ogg
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
ballistic-ammo: !type:Container
|
||||
ents: []
|
||||
|
||||
- type: entity
|
||||
parent: BaseItem
|
||||
@@ -530,6 +534,10 @@
|
||||
autoCycle: true
|
||||
soundInsert:
|
||||
path: /Audio/Weapons/Guns/MagIn/revolver_magin.ogg
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
ballistic-ammo: !type:Container
|
||||
ents: []
|
||||
|
||||
- type: entity
|
||||
parent: BaseItem
|
||||
|
||||
@@ -12,3 +12,6 @@
|
||||
- type: Storage
|
||||
capacity: 30
|
||||
size: 10
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
storagebase: !type:Container
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
- type: HandheldLight
|
||||
addPrefix: true
|
||||
- type: PowerCellSlot
|
||||
- type: ItemSlots
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
cell_slot: !type:ContainerSlot
|
||||
@@ -16,6 +17,7 @@
|
||||
- type: Item
|
||||
sprite: Objects/Misc/Lights/lights.rsi
|
||||
size: 20
|
||||
heldPrefix: off
|
||||
- type: PointLight
|
||||
netsync: false
|
||||
enabled: false
|
||||
|
||||
@@ -67,6 +67,11 @@
|
||||
False: {visible: false}
|
||||
- type: Pullable
|
||||
- type: AntiRottingContainer
|
||||
- type: ItemSlots
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
entity_storage: !type:Container
|
||||
paper_label: !type:ContainerSlot
|
||||
|
||||
- type: entity
|
||||
id: BodyBag_Folded
|
||||
|
||||
@@ -67,3 +67,8 @@
|
||||
- type: StorageVisualizer
|
||||
state_open: artifact_container_open
|
||||
state_closed: artifact_container_door
|
||||
- type: ItemSlots
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
entity_storage: !type:Container
|
||||
paper_label: !type:ContainerSlot
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
cell_slot: !type:ContainerSlot
|
||||
- type: ItemSlots
|
||||
- type: Sprite
|
||||
sprite: Objects/Tools/flashlight.rsi
|
||||
netsync: false
|
||||
|
||||
@@ -30,6 +30,10 @@
|
||||
- type: PowerCellSlot
|
||||
cellSlot:
|
||||
startingItem: PowerCellMedium
|
||||
- type: ItemSlots
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
cell_slot: !type:ContainerSlot {}
|
||||
|
||||
- type: entity
|
||||
name: extra-bright lantern
|
||||
|
||||
@@ -19,3 +19,7 @@
|
||||
steps: 2
|
||||
zeroVisible: false
|
||||
- type: Appearance
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
ballistic-ammo: !type:Container
|
||||
ents: []
|
||||
|
||||
@@ -11,6 +11,10 @@
|
||||
capacity: 30
|
||||
- type: Sprite
|
||||
netsync: false
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
ballistic-ammo: !type:Container
|
||||
ents: []
|
||||
|
||||
# Boxes
|
||||
- type: entity
|
||||
|
||||
@@ -11,6 +11,10 @@
|
||||
capacity: 6
|
||||
- type: Sprite
|
||||
netsync: false
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
ballistic-ammo: !type:Container
|
||||
ents: []
|
||||
|
||||
- type: entity
|
||||
id: SpeedLoaderMagnum
|
||||
|
||||
@@ -12,6 +12,10 @@
|
||||
- type: Sprite
|
||||
netsync: false
|
||||
sprite: Objects/Weapons/Guns/Ammunition/SpeedLoaders/Pistol/pistol_speed_loader.rsi
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
ballistic-ammo: !type:Container
|
||||
ents: []
|
||||
|
||||
- type: entity
|
||||
id: SpeedLoaderPistol
|
||||
|
||||
@@ -22,3 +22,7 @@
|
||||
steps: 6
|
||||
zeroVisible: false
|
||||
- type: Appearance
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
ballistic-ammo: !type:Container
|
||||
ents: []
|
||||
|
||||
@@ -21,6 +21,10 @@
|
||||
steps: 7
|
||||
zeroVisible: false
|
||||
- type: Appearance
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
ballistic-ammo: !type:Container
|
||||
ents: []
|
||||
|
||||
- type: entity
|
||||
id: SpeedLoaderCap
|
||||
|
||||
@@ -44,3 +44,7 @@
|
||||
steps: 4
|
||||
zeroVisible: true
|
||||
- type: Appearance
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
ballistic-ammo: !type:Container
|
||||
ents: []
|
||||
|
||||
@@ -37,14 +37,24 @@
|
||||
angularDamping: 0
|
||||
- type: Fixtures
|
||||
fixtures:
|
||||
- shape:
|
||||
- id: projectile
|
||||
shape:
|
||||
!type:PhysShapeAabb
|
||||
bounds: "-0.1,-0.1,0.1,0.1"
|
||||
hard: false
|
||||
id: projectile
|
||||
mask:
|
||||
- Impassable
|
||||
- BulletImpassable
|
||||
- &flybyfixture
|
||||
id: fly-by
|
||||
shape: !type:PhysShapeCircle
|
||||
radius: 1.5
|
||||
layer:
|
||||
- Impassable
|
||||
- MidImpassable
|
||||
- HighImpassable
|
||||
- LowImpassable
|
||||
hard: False
|
||||
- type: Projectile
|
||||
impactEffect: BulletImpactEffect
|
||||
damage:
|
||||
@@ -76,6 +86,7 @@
|
||||
mask:
|
||||
- Impassable
|
||||
- BulletImpassable
|
||||
- *flybyfixture
|
||||
|
||||
- type: entity
|
||||
id: BaseBulletHighVelocity
|
||||
@@ -142,6 +153,7 @@
|
||||
mask:
|
||||
- Impassable
|
||||
- BulletImpassable
|
||||
- *flybyfixture
|
||||
- type: Ammo
|
||||
- type: StaminaDamageOnCollide
|
||||
damage: 30
|
||||
@@ -178,6 +190,7 @@
|
||||
mask:
|
||||
- Impassable
|
||||
- Opaque
|
||||
- *flybyfixture
|
||||
- type: Projectile
|
||||
# soundHit: Waiting on serv3
|
||||
damage:
|
||||
|
||||
@@ -17,12 +17,17 @@
|
||||
- SemiAuto
|
||||
soundGunshot:
|
||||
path: /Audio/Weapons/Guns/Gunshots/revolver.ogg
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
revolver-ammo: !type:Container
|
||||
- type: RevolverAmmoProvider
|
||||
whitelist:
|
||||
tags:
|
||||
- CartridgeMagnum
|
||||
proto: CartridgeMagnum
|
||||
capacity: 7
|
||||
chambers: [ True, True, True, True, True, True, True ]
|
||||
ammoSlots: [ null, null, null, null, null, null, null ]
|
||||
soundEject:
|
||||
path: /Audio/Weapons/Guns/MagOut/revolver_magout.ogg
|
||||
soundInsert:
|
||||
@@ -46,6 +51,8 @@
|
||||
sprite: Objects/Weapons/Guns/Revolvers/deckard.rsi
|
||||
- type: RevolverAmmoProvider
|
||||
capacity: 5
|
||||
chambers: [ True, True, True, True, True ]
|
||||
ammoSlots: [ null, null, null, null, null ]
|
||||
- type: MagazineVisuals
|
||||
magState: mag
|
||||
steps: 4
|
||||
@@ -64,6 +71,8 @@
|
||||
sprite: Objects/Weapons/Guns/Revolvers/inspector.rsi
|
||||
- type: RevolverAmmoProvider
|
||||
capacity: 6
|
||||
chambers: [ True, True, True, True, True, True ]
|
||||
ammoSlots: [ null, null, null, null, null, null ]
|
||||
|
||||
- type: entity
|
||||
name: Mateba
|
||||
@@ -75,8 +84,6 @@
|
||||
sprite: Objects/Weapons/Guns/Revolvers/mateba.rsi
|
||||
- type: Item
|
||||
sprite: Objects/Weapons/Guns/Revolvers/mateba.rsi
|
||||
- type: RevolverAmmoProvider
|
||||
capacity: 7
|
||||
- type: Gun
|
||||
soundGunshot:
|
||||
path: /Audio/Weapons/Guns/Gunshots/mateba.ogg
|
||||
@@ -104,5 +111,10 @@
|
||||
sprite: Objects/Weapons/Guns/Revolvers/pirate_revolver.rsi
|
||||
- type: Gun
|
||||
fireRate: 1
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
revolver-ammo: !type:Container
|
||||
- type: RevolverAmmoProvider
|
||||
capacity: 5
|
||||
chambers: [ True, True, True, True, True ]
|
||||
ammoSlots: [ null, null, null, null, null ]
|
||||
|
||||
@@ -31,6 +31,10 @@
|
||||
proto: ShellShotgun
|
||||
soundInsert:
|
||||
path: /Audio/Weapons/Guns/MagIn/shotgun_insert.ogg
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
ballistic-ammo: !type:Container
|
||||
ents: []
|
||||
|
||||
- type: entity
|
||||
name: Bulldog
|
||||
|
||||
@@ -27,6 +27,10 @@
|
||||
whitelist:
|
||||
tags:
|
||||
- CartridgeLightRifle
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
ballistic-ammo: !type:Container
|
||||
ents: []
|
||||
|
||||
- type: entity
|
||||
name: Kardashev-Mosin
|
||||
|
||||
@@ -27,3 +27,7 @@
|
||||
capacity: 1
|
||||
soundInsert:
|
||||
path: /Audio/Weapons/Guns/MagIn/shotgun_insert.ogg
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
ballistic-ammo: !type:Container
|
||||
ents: []
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
- type: Physics
|
||||
bodyType: Dynamic
|
||||
fixedRotation: false
|
||||
canCollide: false # most entities start asleep.
|
||||
- type: Fixtures
|
||||
fixtures:
|
||||
- shape:
|
||||
@@ -48,4 +49,8 @@
|
||||
interfaces:
|
||||
- key: enum.StorageUiKey.Key
|
||||
type: StorageBoundUserInterface
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
storagebase: !type:Container
|
||||
ents: []
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
- type: entity
|
||||
abstract: true
|
||||
id: ReagentDispenserBase
|
||||
parent: ConstructibleMachine
|
||||
placement:
|
||||
mode: SnapgridCenter
|
||||
components:
|
||||
@@ -52,3 +53,9 @@
|
||||
whitelist:
|
||||
components:
|
||||
- FitsInDispenser
|
||||
- type: ItemSlots
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
machine_board: !type:Container
|
||||
machine_parts: !type:Container
|
||||
ReagentDispenser-beaker: !type:ContainerSlot
|
||||
|
||||
@@ -12,9 +12,6 @@
|
||||
emagPack: ChemDispenserEmaggedInventory
|
||||
- type: ApcPowerReceiver
|
||||
- type: ExtensionCableReceiver
|
||||
- type: Construction
|
||||
graph: Machine
|
||||
node: machine
|
||||
- type: Destructible
|
||||
thresholds:
|
||||
- trigger:
|
||||
|
||||
@@ -85,10 +85,14 @@
|
||||
interfaces:
|
||||
- key: enum.WiresUiKey.Key
|
||||
type: WiresBoundUserInterface
|
||||
- type: Physics
|
||||
canCollide: false
|
||||
- type: Airtight
|
||||
fixVacuum: true
|
||||
airBlocked: false
|
||||
noAirWhenFullyAirBlocked: true
|
||||
- type: Occluder
|
||||
enabled: false
|
||||
- type: Construction
|
||||
graph: Firelock
|
||||
node: Firelock
|
||||
@@ -126,6 +130,7 @@
|
||||
sprite: Structures/Doors/edge_door_hazard.rsi
|
||||
- type: Airtight
|
||||
fixVacuum: true
|
||||
airBlocked: false
|
||||
noAirWhenFullyAirBlocked: false
|
||||
airBlockedDirection:
|
||||
- South
|
||||
@@ -143,3 +148,5 @@
|
||||
enabled: false
|
||||
- type: Door
|
||||
occludes: false
|
||||
- type: Physics
|
||||
canCollide: false
|
||||
|
||||
@@ -33,3 +33,9 @@
|
||||
components:
|
||||
- type: Door
|
||||
state: Open
|
||||
- type: Occluder
|
||||
enabled: false
|
||||
- type: Physics
|
||||
canCollide: false
|
||||
- type: Airtight
|
||||
airBlocked: false
|
||||
|
||||
@@ -66,6 +66,11 @@
|
||||
key: walls
|
||||
mode: NoSprite
|
||||
- type: DoorSignalControl
|
||||
- type: SignalReceiver
|
||||
inputs:
|
||||
Open: []
|
||||
Close: []
|
||||
Toggle: []
|
||||
- type: InteractionPopup
|
||||
interactSuccessString: comp-window-knock
|
||||
messagePerceivedByOthers: comp-window-knock
|
||||
@@ -127,6 +132,12 @@
|
||||
- type: Construction
|
||||
graph: Shutters
|
||||
node: ShuttersRadiation
|
||||
- type: Occluder
|
||||
enabled: false
|
||||
- type: Physics
|
||||
canCollide: false
|
||||
- type: Airtight
|
||||
airBlocked: false
|
||||
|
||||
- type: entity
|
||||
id: ShuttersWindow
|
||||
@@ -154,6 +165,10 @@
|
||||
- type: Construction
|
||||
graph: Shutters
|
||||
node: ShuttersWindow
|
||||
- type: Physics
|
||||
canCollide: false
|
||||
- type: Airtight
|
||||
airBlocked: false
|
||||
|
||||
# Frame for construction
|
||||
- type: entity
|
||||
|
||||
@@ -25,6 +25,9 @@
|
||||
- type: PottedPlantHide
|
||||
- type: SecretStash
|
||||
secretPartName: the plant
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
stash: !type:ContainerSlot {}
|
||||
- type: Pullable
|
||||
- type: Damageable
|
||||
damageContainer: Inorganic # The pot. Not the plant. Or is it plastic?
|
||||
|
||||
@@ -18,6 +18,9 @@
|
||||
- type: Toilet
|
||||
- type: SecretStash
|
||||
secretPartName: the toilet cistern
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
stash: !type:ContainerSlot {}
|
||||
- type: SolutionContainerManager
|
||||
solutions:
|
||||
toilet:
|
||||
@@ -28,6 +31,7 @@
|
||||
graph: Toilet
|
||||
node: toilet
|
||||
- type: Appearance
|
||||
|
||||
- type: entity
|
||||
id: ToiletDirtyWater
|
||||
parent: ToiletEmpty
|
||||
|
||||
@@ -49,3 +49,7 @@
|
||||
- type: EmitSoundOnUIOpen
|
||||
sound:
|
||||
collection: Keyboard
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
board: !type:Container
|
||||
ents: []
|
||||
|
||||
@@ -382,6 +382,12 @@
|
||||
- type: Tag
|
||||
tags:
|
||||
- EmagImmune
|
||||
- type: ItemSlots
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
board: !type:Container
|
||||
IdCardConsole-privilegedId: !type:ContainerSlot
|
||||
IdCardConsole-targetId: !type:ContainerSlot
|
||||
|
||||
- type: entity
|
||||
parent: BaseComputer
|
||||
|
||||
@@ -43,3 +43,19 @@
|
||||
- type: ApcPowerReceiver
|
||||
powerLoad: 1000
|
||||
- type: ExtensionCableReceiver
|
||||
|
||||
- type: entity
|
||||
abstract: true
|
||||
id: ConstructibleMachine
|
||||
components:
|
||||
- type: Machine
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
machine_board: !type:Container
|
||||
machine_parts: !type:Container
|
||||
- type: Construction
|
||||
graph: Machine
|
||||
node: machine
|
||||
containers:
|
||||
- machine_parts
|
||||
- machine_board
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
- type: entity
|
||||
id: chem_master
|
||||
parent: BaseMachinePowered
|
||||
parent: [ BaseMachinePowered, ConstructibleMachine ]
|
||||
name: ChemMaster 4000
|
||||
description: An industrial grade chemical manipulator with pill and bottle production included.
|
||||
placement:
|
||||
@@ -60,7 +60,12 @@
|
||||
- type: Machine
|
||||
board: ChemMasterMachineCircuitboard
|
||||
- type: MaterialStorage
|
||||
- type: Construction
|
||||
graph: Machine
|
||||
node: machine
|
||||
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
machine_board: !type:Container
|
||||
machine_parts: !type:Container
|
||||
ChemMaster-beaker: !type:ContainerSlot
|
||||
- type: ItemSlots
|
||||
- type: SolutionContainerManager
|
||||
solutions:
|
||||
buffer: {}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
- type: entity
|
||||
id: CloningPod
|
||||
parent: BaseMachinePowered
|
||||
parent: [ BaseMachinePowered, ConstructibleMachine ]
|
||||
name: cloning pod
|
||||
description: A Cloning Pod. 50% reliable.
|
||||
components:
|
||||
@@ -25,9 +25,6 @@
|
||||
- MachineMask
|
||||
layer:
|
||||
- MachineLayer
|
||||
- type: Construction
|
||||
graph: Machine
|
||||
node: machine
|
||||
- type: Destructible
|
||||
thresholds:
|
||||
- trigger:
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
- type: entity
|
||||
parent: BaseMachinePowered
|
||||
parent: [ BaseMachinePowered, ConstructibleMachine ]
|
||||
id: Autolathe
|
||||
name: autolathe
|
||||
description: It produces items using metal and glass.
|
||||
@@ -34,9 +34,6 @@
|
||||
- MachineMask
|
||||
layer:
|
||||
- MachineLayer
|
||||
- type: Construction
|
||||
graph: Machine
|
||||
node: machine
|
||||
- type: Destructible
|
||||
thresholds:
|
||||
- trigger:
|
||||
@@ -86,7 +83,7 @@
|
||||
- Ingot
|
||||
|
||||
- type: entity
|
||||
parent: BaseMachinePowered
|
||||
parent: [ BaseMachinePowered, ConstructibleMachine ]
|
||||
id: Protolathe
|
||||
name: protolathe
|
||||
description: Converts raw materials into useful objects.
|
||||
@@ -122,9 +119,6 @@
|
||||
layer:
|
||||
- MachineLayer
|
||||
- type: ResearchClient
|
||||
- type: Construction
|
||||
graph: Machine
|
||||
node: machine
|
||||
- type: Destructible
|
||||
thresholds:
|
||||
- trigger:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
- type: entity
|
||||
id: MedicalScanner
|
||||
parent: BaseMachinePowered
|
||||
parent: [ BaseMachinePowered, ConstructibleMachine ]
|
||||
name: medical scanner
|
||||
description: A bulky medical scanner.
|
||||
components:
|
||||
@@ -28,9 +28,6 @@
|
||||
- MachineMask
|
||||
layer:
|
||||
- MachineLayer
|
||||
- type: Construction
|
||||
graph: Machine
|
||||
node: machine
|
||||
- type: Destructible
|
||||
thresholds:
|
||||
- trigger:
|
||||
|
||||
@@ -42,3 +42,8 @@
|
||||
drawdepth: SmallObjects
|
||||
- type: ApcPowerReceiver
|
||||
powerLoad: 300
|
||||
- type: ItemSlots
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
ReagentGrinder-reagentContainerContainer: !type:ContainerSlot
|
||||
ReagentGrinder-entityContainerContainer: !type:Container
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
- type: entity
|
||||
abstract: true
|
||||
parent: BaseMachinePowered
|
||||
parent: [ BaseMachinePowered, ConstructibleMachine ]
|
||||
id: SurveillanceCameraRouterBase
|
||||
name: camera router
|
||||
description: A surveillance camera router. It routes. Perhaps.
|
||||
@@ -14,9 +14,6 @@
|
||||
interfaces:
|
||||
- key: enum.SurveillanceCameraSetupUiKey.Router
|
||||
type: SurveillanceCameraSetupBoundUi
|
||||
- type: Construction
|
||||
graph: Machine
|
||||
node: machine
|
||||
- type: Machine
|
||||
board: SurveillanceCameraRouterCircuitboard
|
||||
- type: Sprite
|
||||
@@ -105,7 +102,7 @@
|
||||
subnetFrequency: SurveillanceCameraGeneral
|
||||
|
||||
- type: entity
|
||||
parent: BaseMachinePowered
|
||||
parent: [ BaseMachinePowered, ConstructibleMachine ]
|
||||
id: SurveillanceCameraWirelessRouterBase
|
||||
name: wireless camera router
|
||||
description: A wireless surveillance camera router. It routes. Perhaps.
|
||||
@@ -120,9 +117,6 @@
|
||||
interfaces:
|
||||
- key: enum.SurveillanceCameraSetupUiKey.Router
|
||||
type: SurveillanceCameraSetupBoundUi
|
||||
- type: Construction
|
||||
graph: Machine
|
||||
node: machine
|
||||
- type: Machine
|
||||
board: SurveillanceCameraWirelessRouterCircuitboard
|
||||
- type: Sprite
|
||||
|
||||
@@ -1,13 +1,10 @@
|
||||
- type: entity
|
||||
abstract: true
|
||||
parent: BaseStructureDynamic
|
||||
parent: [ BaseStructureDynamic, ConstructibleMachine ]
|
||||
id: SurveillanceWirelessCameraBase
|
||||
name: wireless camera
|
||||
description: A camera. It's watching you. Kinda.
|
||||
components:
|
||||
- type: Construction
|
||||
graph: Machine
|
||||
node: machine
|
||||
- type: InteractionOutline
|
||||
- type: Eye
|
||||
- type: WirelessNetworkConnection
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
- type: Clickable
|
||||
- type: InteractionOutline
|
||||
- type: Physics
|
||||
- type: Fixtures
|
||||
- type: Transform
|
||||
anchored: true
|
||||
- type: Damageable
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
damageContainer: Inorganic
|
||||
damageModifierSet: Metallic
|
||||
- type: SubFloorHide
|
||||
- type: CollideOnAnchor
|
||||
- type: PipeAppearance
|
||||
- type: Anchorable
|
||||
- type: Rotatable
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
!type:PipeNode
|
||||
nodeGroupID: Pipe
|
||||
pipeDirection: South
|
||||
- type: CollideOnAnchor
|
||||
|
||||
- type: entity
|
||||
parent: GasUnaryBase
|
||||
@@ -184,7 +185,7 @@
|
||||
- enum.LightLayers.Unshaded
|
||||
|
||||
- type: entity
|
||||
parent: BaseMachinePowered
|
||||
parent: [ BaseMachinePowered, ConstructibleMachine ]
|
||||
id: BaseGasThermoMachine
|
||||
name: thermomachine
|
||||
abstract: true
|
||||
@@ -207,9 +208,6 @@
|
||||
- type: ActivatableUI
|
||||
inHandsOnly: false
|
||||
key: enum.ThermomachineUiKey.Key
|
||||
- type: Construction
|
||||
graph: Machine
|
||||
node: machine
|
||||
- type: Wires
|
||||
BoardName: "Thermomachine"
|
||||
LayoutId: Thermomachine
|
||||
@@ -244,10 +242,6 @@
|
||||
mode: Freezer
|
||||
- type: Machine
|
||||
board: ThermomachineFreezerMachineCircuitBoard
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
machine_parts: !type:Container
|
||||
machine_board: !type:Container
|
||||
|
||||
- type: entity
|
||||
parent: BaseGasThermoMachine
|
||||
@@ -273,7 +267,3 @@
|
||||
mode: Heater
|
||||
- type: Machine
|
||||
board: ThermomachineHeaterMachineCircuitBoard
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
machine_parts: !type:Container
|
||||
machine_board: !type:Container
|
||||
|
||||
@@ -49,6 +49,11 @@
|
||||
node: broken
|
||||
- type: Rotatable
|
||||
- type: Pullable
|
||||
- type: CollideOnAnchor
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
disposal-tube: !type:Container
|
||||
ents: []
|
||||
|
||||
- type: entity
|
||||
id: DisposalHolder
|
||||
|
||||
@@ -70,6 +70,10 @@
|
||||
interfaces:
|
||||
- key: enum.DisposalUnitUiKey.Key
|
||||
type: DisposalUnitBoundUserInterface
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
disposal-unit: !type:Container
|
||||
ents: []
|
||||
|
||||
- type: entity
|
||||
id: DisposalUnit
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
- type: entity
|
||||
id: Emitter
|
||||
name: emitter
|
||||
parent: ConstructibleMachine
|
||||
description: A heavy duty industrial laser. Shoots non-stop when turned on.
|
||||
placement:
|
||||
mode: SnapgridCenter
|
||||
@@ -70,8 +71,5 @@
|
||||
locked: false
|
||||
- type: AccessReader
|
||||
access: [[ "Engineering" ]]
|
||||
- type: Construction
|
||||
graph: Machine
|
||||
node: machine
|
||||
- type: Machine
|
||||
board: EmitterCircuitboard
|
||||
|
||||
@@ -151,7 +151,7 @@
|
||||
supplyRate: 3000
|
||||
|
||||
- type: entity
|
||||
parent: BaseGenerator
|
||||
parent: [ BaseGenerator, ConstructibleMachine ]
|
||||
id: GeneratorPlasma
|
||||
suffix: Plasma, 5kW
|
||||
components:
|
||||
@@ -160,21 +160,14 @@
|
||||
- type: Sprite
|
||||
sprite: Structures/Power/Generation/portable_generator.rsi
|
||||
state: portgen0_1
|
||||
- type: Construction
|
||||
graph: Machine
|
||||
node: machine
|
||||
- type: Wires
|
||||
BoardName: "GeneratorPlasma"
|
||||
LayoutId: GeneratorPlasma
|
||||
- type: Machine
|
||||
board: GeneratorPlasmaMachineCircuitboard
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
machine_parts: !type:Container
|
||||
machine_board: !type:Container
|
||||
|
||||
- type: entity
|
||||
parent: BaseGenerator
|
||||
parent: [ BaseGenerator, ConstructibleMachine ]
|
||||
id: GeneratorUranium
|
||||
suffix: Uranium, 15kW
|
||||
components:
|
||||
@@ -183,18 +176,11 @@
|
||||
- type: Sprite
|
||||
sprite: Structures/Power/Generation/portable_generator.rsi
|
||||
state: portgen1_1
|
||||
- type: Construction
|
||||
graph: Machine
|
||||
node: machine
|
||||
- type: Wires
|
||||
BoardName: "GeneratorUranium"
|
||||
LayoutId: GeneratorUranium
|
||||
- type: Machine
|
||||
board: GeneratorUraniumMachineCircuitboard
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
machine_parts: !type:Container
|
||||
machine_board: !type:Container
|
||||
|
||||
- type: entity
|
||||
parent: BaseGeneratorWallmount
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
- !type:DoActsBehavior
|
||||
acts: ["Destruction"]
|
||||
- type: SubFloorHide
|
||||
- type: CollideOnAnchor
|
||||
- type: AmbientSound
|
||||
enabled: false # Leaving as false because 90% of them are set to this.
|
||||
- type: Appearance
|
||||
|
||||
@@ -38,6 +38,10 @@
|
||||
- MachineMask
|
||||
layer:
|
||||
- HighImpassable
|
||||
- type: ItemSlots
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
charger-slot: !type:ContainerSlot
|
||||
|
||||
- type: entity
|
||||
name: recharger
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
- type: entity
|
||||
abstract: true
|
||||
id: BaseSMES
|
||||
parent: BaseMachine
|
||||
parent: [ BaseMachine, ConstructibleMachine ]
|
||||
name: SMES
|
||||
description: A high-capacity superconducting magnetic energy storage (SMES) unit.
|
||||
placement:
|
||||
@@ -51,18 +51,11 @@
|
||||
energy: 1.6
|
||||
color: "#c9c042"
|
||||
castShadows: false
|
||||
- type: Construction
|
||||
graph: Machine
|
||||
node: machine
|
||||
- type: Wires
|
||||
BoardName: "SMES"
|
||||
LayoutId: SMES
|
||||
- type: Machine
|
||||
board: SMESMachineCircuitboard
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
machine_parts: !type:Container
|
||||
machine_board: !type:Container
|
||||
- type: StationInfiniteBatteryTarget
|
||||
|
||||
# SMES' in use
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
- type: entity
|
||||
abstract: true
|
||||
id: BaseSubstation
|
||||
parent: BaseMachine
|
||||
parent: [ BaseMachine, ConstructibleMachine ]
|
||||
name: substation
|
||||
description: Reduces the voltage of electricity put into it.
|
||||
placement:
|
||||
@@ -43,9 +43,6 @@
|
||||
maxChargeRate: 5000
|
||||
supplyRampTolerance: 5000
|
||||
supplyRampRate: 1000
|
||||
- type: Construction
|
||||
graph: Machine
|
||||
node: machine
|
||||
- type: Destructible
|
||||
thresholds:
|
||||
- trigger:
|
||||
@@ -73,10 +70,6 @@
|
||||
LayoutId: Substation
|
||||
- type: Machine
|
||||
board: SubstationMachineCircuitboard
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
machine_parts: !type:Container
|
||||
machine_board: !type:Container
|
||||
- type: StationInfiniteBatteryTarget
|
||||
|
||||
# Compact Wall Substation Base
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
capacity: 500
|
||||
- type: Weldable
|
||||
- type: PlaceableSurface
|
||||
isPlaceable: false # defaults to closed.
|
||||
- type: Damageable
|
||||
damageContainer: Inorganic
|
||||
damageModifierSet: Metallic
|
||||
@@ -61,6 +62,7 @@
|
||||
containers:
|
||||
entity_storage: !type:Container
|
||||
paper_label: !type:ContainerSlot
|
||||
- type: ItemSlots
|
||||
|
||||
- type: entity
|
||||
id: CrateBaseSecure
|
||||
@@ -97,6 +99,7 @@
|
||||
capacity: 500
|
||||
- type: Weldable
|
||||
- type: PlaceableSurface
|
||||
isPlaceable: false # defaults to closed.
|
||||
- type: Damageable
|
||||
damageContainer: Inorganic
|
||||
damageModifierSet: StrongMetallic
|
||||
@@ -123,3 +126,10 @@
|
||||
- type: Construction
|
||||
graph: CrateSecure
|
||||
node: cratesecure
|
||||
containers:
|
||||
- entity_storage
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
entity_storage: !type:Container
|
||||
paper_label: !type:ContainerSlot
|
||||
- type: ItemSlots
|
||||
|
||||
@@ -23,7 +23,8 @@
|
||||
- type: Construction
|
||||
graph: CrateGenericSteel
|
||||
node: crategenericsteel
|
||||
|
||||
containers:
|
||||
- entity_storage
|
||||
|
||||
- type: entity
|
||||
id: CratePlastic
|
||||
@@ -50,6 +51,8 @@
|
||||
- type: Construction
|
||||
graph: CratePlastic
|
||||
node: crateplastic
|
||||
containers:
|
||||
- entity_storage
|
||||
|
||||
- type: entity
|
||||
id: CrateFreezer
|
||||
@@ -76,6 +79,8 @@
|
||||
- type: Construction
|
||||
graph: CrateGenericSteel
|
||||
node: crategenericsteel
|
||||
containers:
|
||||
- entity_storage
|
||||
- type: AntiRottingContainer
|
||||
|
||||
- type: entity
|
||||
@@ -103,6 +108,8 @@
|
||||
- type: Construction
|
||||
graph: CrateGenericSteel
|
||||
node: crategenericsteel
|
||||
containers:
|
||||
- entity_storage
|
||||
|
||||
- type: entity
|
||||
id: CrateMedical
|
||||
@@ -129,6 +136,8 @@
|
||||
- type: Construction
|
||||
graph: CrateGenericSteel
|
||||
node: crategenericsteel
|
||||
containers:
|
||||
- entity_storage
|
||||
|
||||
- type: entity
|
||||
id: CrateRadiation
|
||||
@@ -156,6 +165,8 @@
|
||||
- type: Construction
|
||||
graph: CrateGenericSteel
|
||||
node: crategenericsteel
|
||||
containers:
|
||||
- entity_storage
|
||||
|
||||
- type: entity
|
||||
id: CrateInternals
|
||||
@@ -182,6 +193,8 @@
|
||||
- type: Construction
|
||||
graph: CrateGenericSteel
|
||||
node: crategenericsteel
|
||||
containers:
|
||||
- entity_storage
|
||||
|
||||
- type: entity
|
||||
id: CrateElectrical
|
||||
@@ -208,6 +221,8 @@
|
||||
- type: Construction
|
||||
graph: CrateGenericSteel
|
||||
node: crategenericsteel
|
||||
containers:
|
||||
- entity_storage
|
||||
|
||||
- type: entity
|
||||
id: CrateEngineering
|
||||
@@ -234,6 +249,8 @@
|
||||
- type: Construction
|
||||
graph: CrateGenericSteel
|
||||
node: crategenericsteel
|
||||
containers:
|
||||
- entity_storage
|
||||
|
||||
- type: entity
|
||||
id: CrateScience
|
||||
@@ -260,6 +277,8 @@
|
||||
- type: Construction
|
||||
graph: CrateGenericSteel
|
||||
node: crategenericsteel
|
||||
containers:
|
||||
- entity_storage
|
||||
|
||||
- type: entity
|
||||
id: CrateSurgery
|
||||
@@ -286,6 +305,8 @@
|
||||
- type: Construction
|
||||
graph: CrateGenericSteel
|
||||
node: crategenericsteel
|
||||
containers:
|
||||
- entity_storage
|
||||
|
||||
# Secure Crates
|
||||
|
||||
@@ -629,4 +650,6 @@
|
||||
- type: Construction
|
||||
graph: CrateLivestock
|
||||
node: cratelivestock
|
||||
containers:
|
||||
- entity_storage
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user