Entity Tables (EntitySpawnEntry replacement) (#30579)
* Entity table code * entity table examples * fix dat shit * access * tests tests tests * sloth review
This commit is contained in:
@@ -0,0 +1,30 @@
|
|||||||
|
using Content.Server.Spawners.EntitySystems;
|
||||||
|
using Content.Shared.EntityTable.EntitySelectors;
|
||||||
|
using Robust.Shared.Prototypes;
|
||||||
|
|
||||||
|
namespace Content.Server.Spawners.Components;
|
||||||
|
|
||||||
|
[RegisterComponent, EntityCategory("Spawner"), Access(typeof(ConditionalSpawnerSystem))]
|
||||||
|
public sealed partial class EntityTableSpawnerComponent : Component
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Table that determines what gets spawned.
|
||||||
|
/// </summary>
|
||||||
|
[DataField(required: true)]
|
||||||
|
public EntityTableSelector Table = default!;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Scatter of entity spawn coordinates
|
||||||
|
/// </summary>
|
||||||
|
[DataField]
|
||||||
|
public float Offset = 0.2f;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A variable meaning whether the spawn will
|
||||||
|
/// be able to be used again or whether
|
||||||
|
/// it will be destroyed after the first use
|
||||||
|
/// </summary>
|
||||||
|
[DataField]
|
||||||
|
public bool DeleteSpawnerAfterSpawn = true;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1,9 +1,10 @@
|
|||||||
using System.Numerics;
|
using System.Numerics;
|
||||||
using Content.Server.GameTicking;
|
using Content.Server.GameTicking;
|
||||||
using Content.Server.GameTicking.Rules.Components;
|
|
||||||
using Content.Server.Spawners.Components;
|
using Content.Server.Spawners.Components;
|
||||||
|
using Content.Shared.EntityTable;
|
||||||
using Content.Shared.GameTicking.Components;
|
using Content.Shared.GameTicking.Components;
|
||||||
using JetBrains.Annotations;
|
using JetBrains.Annotations;
|
||||||
|
using Robust.Shared.Map;
|
||||||
using Robust.Shared.Random;
|
using Robust.Shared.Random;
|
||||||
|
|
||||||
namespace Content.Server.Spawners.EntitySystems
|
namespace Content.Server.Spawners.EntitySystems
|
||||||
@@ -13,6 +14,7 @@ namespace Content.Server.Spawners.EntitySystems
|
|||||||
{
|
{
|
||||||
[Dependency] private readonly IRobustRandom _robustRandom = default!;
|
[Dependency] private readonly IRobustRandom _robustRandom = default!;
|
||||||
[Dependency] private readonly GameTicker _ticker = default!;
|
[Dependency] private readonly GameTicker _ticker = default!;
|
||||||
|
[Dependency] private readonly EntityTableSystem _entityTable = default!;
|
||||||
|
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
@@ -21,6 +23,7 @@ namespace Content.Server.Spawners.EntitySystems
|
|||||||
SubscribeLocalEvent<GameRuleStartedEvent>(OnRuleStarted);
|
SubscribeLocalEvent<GameRuleStartedEvent>(OnRuleStarted);
|
||||||
SubscribeLocalEvent<ConditionalSpawnerComponent, MapInitEvent>(OnCondSpawnMapInit);
|
SubscribeLocalEvent<ConditionalSpawnerComponent, MapInitEvent>(OnCondSpawnMapInit);
|
||||||
SubscribeLocalEvent<RandomSpawnerComponent, MapInitEvent>(OnRandSpawnMapInit);
|
SubscribeLocalEvent<RandomSpawnerComponent, MapInitEvent>(OnRandSpawnMapInit);
|
||||||
|
SubscribeLocalEvent<EntityTableSpawnerComponent, MapInitEvent>(OnEntityTableSpawnMapInit);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnCondSpawnMapInit(EntityUid uid, ConditionalSpawnerComponent component, MapInitEvent args)
|
private void OnCondSpawnMapInit(EntityUid uid, ConditionalSpawnerComponent component, MapInitEvent args)
|
||||||
@@ -35,6 +38,13 @@ namespace Content.Server.Spawners.EntitySystems
|
|||||||
QueueDel(uid);
|
QueueDel(uid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnEntityTableSpawnMapInit(Entity<EntityTableSpawnerComponent> ent, ref MapInitEvent args)
|
||||||
|
{
|
||||||
|
Spawn(ent);
|
||||||
|
if (ent.Comp.DeleteSpawnerAfterSpawn && !TerminatingOrDeleted(ent) && Exists(ent))
|
||||||
|
QueueDel(ent);
|
||||||
|
}
|
||||||
|
|
||||||
private void OnRuleStarted(ref GameRuleStartedEvent args)
|
private void OnRuleStarted(ref GameRuleStartedEvent args)
|
||||||
{
|
{
|
||||||
var query = EntityQueryEnumerator<ConditionalSpawnerComponent>();
|
var query = EntityQueryEnumerator<ConditionalSpawnerComponent>();
|
||||||
@@ -110,5 +120,23 @@ namespace Content.Server.Spawners.EntitySystems
|
|||||||
|
|
||||||
EntityManager.SpawnEntity(_robustRandom.Pick(component.Prototypes), coordinates);
|
EntityManager.SpawnEntity(_robustRandom.Pick(component.Prototypes), coordinates);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void Spawn(Entity<EntityTableSpawnerComponent> ent)
|
||||||
|
{
|
||||||
|
if (TerminatingOrDeleted(ent) || !Exists(ent))
|
||||||
|
return;
|
||||||
|
|
||||||
|
var coords = Transform(ent).Coordinates;
|
||||||
|
|
||||||
|
var spawns = _entityTable.GetSpawns(ent.Comp.Table);
|
||||||
|
foreach (var proto in spawns)
|
||||||
|
{
|
||||||
|
var xOffset = _robustRandom.NextFloat(-ent.Comp.Offset, ent.Comp.Offset);
|
||||||
|
var yOffset = _robustRandom.NextFloat(-ent.Comp.Offset, ent.Comp.Offset);
|
||||||
|
var trueCoords = coords.Offset(new Vector2(xOffset, yOffset));
|
||||||
|
|
||||||
|
Spawn(proto, trueCoords);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System.Numerics;
|
using System.Numerics;
|
||||||
|
using Content.Shared.EntityTable;
|
||||||
using Robust.Shared.Containers;
|
using Robust.Shared.Containers;
|
||||||
using Robust.Shared.Map;
|
using Robust.Shared.Map;
|
||||||
|
|
||||||
@@ -7,11 +8,14 @@ namespace Content.Shared.Containers;
|
|||||||
public sealed class ContainerFillSystem : EntitySystem
|
public sealed class ContainerFillSystem : EntitySystem
|
||||||
{
|
{
|
||||||
[Dependency] private readonly SharedContainerSystem _containerSystem = default!;
|
[Dependency] private readonly SharedContainerSystem _containerSystem = default!;
|
||||||
|
[Dependency] private readonly EntityTableSystem _entityTable = default!;
|
||||||
|
[Dependency] private readonly SharedTransformSystem _transform = default!;
|
||||||
|
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
base.Initialize();
|
base.Initialize();
|
||||||
SubscribeLocalEvent<ContainerFillComponent, MapInitEvent>(OnMapInit);
|
SubscribeLocalEvent<ContainerFillComponent, MapInitEvent>(OnMapInit);
|
||||||
|
SubscribeLocalEvent<EntityTableContainerFillComponent, MapInitEvent>(OnTableMapInit);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnMapInit(EntityUid uid, ContainerFillComponent component, MapInitEvent args)
|
private void OnMapInit(EntityUid uid, ContainerFillComponent component, MapInitEvent args)
|
||||||
@@ -42,4 +46,37 @@ public sealed class ContainerFillSystem : EntitySystem
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnTableMapInit(Entity<EntityTableContainerFillComponent> ent, ref MapInitEvent args)
|
||||||
|
{
|
||||||
|
if (!TryComp(ent, out ContainerManagerComponent? containerComp))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (TerminatingOrDeleted(ent) || !Exists(ent))
|
||||||
|
return;
|
||||||
|
|
||||||
|
var xform = Transform(ent);
|
||||||
|
var coords = new EntityCoordinates(ent, Vector2.Zero);
|
||||||
|
|
||||||
|
foreach (var (containerId, table) in ent.Comp.Containers)
|
||||||
|
{
|
||||||
|
if (!_containerSystem.TryGetContainer(ent, containerId, out var container, containerComp))
|
||||||
|
{
|
||||||
|
Log.Error($"Entity {ToPrettyString(ent)} with a {nameof(EntityTableContainerFillComponent)} is missing a container ({containerId}).");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var spawns = _entityTable.GetSpawns(table);
|
||||||
|
foreach (var proto in spawns)
|
||||||
|
{
|
||||||
|
var spawn = Spawn(proto, coords);
|
||||||
|
if (!_containerSystem.Insert(spawn, container, containerXform: xform))
|
||||||
|
{
|
||||||
|
Log.Error($"Entity {ToPrettyString(ent)} with a {nameof(EntityTableContainerFillComponent)} failed to insert an entity: {ToPrettyString(spawn)}.");
|
||||||
|
_transform.AttachToGridOrMap(spawn);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
using Content.Shared.EntityTable.EntitySelectors;
|
||||||
|
|
||||||
|
namespace Content.Shared.Containers;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Version of <see cref="ContainerFillComponent"/> that utilizes <see cref="EntityTableSelector"/>
|
||||||
|
/// </summary>
|
||||||
|
[RegisterComponent, Access(typeof(ContainerFillSystem))]
|
||||||
|
public sealed partial class EntityTableContainerFillComponent : Component
|
||||||
|
{
|
||||||
|
[DataField]
|
||||||
|
public Dictionary<string, EntityTableSelector> Containers = new();
|
||||||
|
}
|
||||||
25
Content.Shared/EntityTable/EntitySelectors/AllSelector.cs
Normal file
25
Content.Shared/EntityTable/EntitySelectors/AllSelector.cs
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
using Robust.Shared.Prototypes;
|
||||||
|
|
||||||
|
namespace Content.Shared.EntityTable.EntitySelectors;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets spawns from all of the child selectors
|
||||||
|
/// </summary>
|
||||||
|
public sealed partial class AllSelector : EntityTableSelector
|
||||||
|
{
|
||||||
|
[DataField(required: true)]
|
||||||
|
public List<EntityTableSelector> Children;
|
||||||
|
|
||||||
|
protected override IEnumerable<EntProtoId> GetSpawnsImplementation(System.Random rand,
|
||||||
|
IEntityManager entMan,
|
||||||
|
IPrototypeManager proto)
|
||||||
|
{
|
||||||
|
foreach (var child in Children)
|
||||||
|
{
|
||||||
|
foreach (var spawn in child.GetSpawns(rand, entMan, proto))
|
||||||
|
{
|
||||||
|
yield return spawn;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
27
Content.Shared/EntityTable/EntitySelectors/EntSelector.cs
Normal file
27
Content.Shared/EntityTable/EntitySelectors/EntSelector.cs
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
using Content.Shared.EntityTable.ValueSelector;
|
||||||
|
using Robust.Shared.Prototypes;
|
||||||
|
|
||||||
|
namespace Content.Shared.EntityTable.EntitySelectors;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the spawn for the entity prototype specified at whatever count specified.
|
||||||
|
/// </summary>
|
||||||
|
public sealed partial class EntSelector : EntityTableSelector
|
||||||
|
{
|
||||||
|
[DataField(required: true)]
|
||||||
|
public EntProtoId Id;
|
||||||
|
|
||||||
|
[DataField]
|
||||||
|
public NumberSelector Amount = new ConstantNumberSelector(1);
|
||||||
|
|
||||||
|
protected override IEnumerable<EntProtoId> GetSpawnsImplementation(System.Random rand,
|
||||||
|
IEntityManager entMan,
|
||||||
|
IPrototypeManager proto)
|
||||||
|
{
|
||||||
|
var num = (int) Math.Round(Amount.Get(rand, entMan, proto));
|
||||||
|
for (var i = 0; i < num; i++)
|
||||||
|
{
|
||||||
|
yield return Id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
using Content.Shared.EntityTable.ValueSelector;
|
||||||
|
using JetBrains.Annotations;
|
||||||
|
using Robust.Shared.Prototypes;
|
||||||
|
using Robust.Shared.Random;
|
||||||
|
|
||||||
|
namespace Content.Shared.EntityTable.EntitySelectors;
|
||||||
|
|
||||||
|
[ImplicitDataDefinitionForInheritors, UsedImplicitly(ImplicitUseTargetFlags.WithInheritors)]
|
||||||
|
public abstract partial class EntityTableSelector
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The number of times this selector is run
|
||||||
|
/// </summary>
|
||||||
|
[DataField]
|
||||||
|
public NumberSelector Rolls = new ConstantNumberSelector(1);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A weight used to pick between selectors.
|
||||||
|
/// </summary>
|
||||||
|
[DataField]
|
||||||
|
public float Weight = 1;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A simple chance that the selector will run.
|
||||||
|
/// </summary>
|
||||||
|
[DataField]
|
||||||
|
public double Prob = 1;
|
||||||
|
|
||||||
|
public IEnumerable<EntProtoId> GetSpawns(System.Random rand,
|
||||||
|
IEntityManager entMan,
|
||||||
|
IPrototypeManager proto)
|
||||||
|
{
|
||||||
|
var rolls = Rolls.Get(rand, entMan, proto);
|
||||||
|
for (var i = 0; i < rolls; i++)
|
||||||
|
{
|
||||||
|
if (!rand.Prob(Prob))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
foreach (var spawn in GetSpawnsImplementation(rand, entMan, proto))
|
||||||
|
{
|
||||||
|
yield return spawn;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract IEnumerable<EntProtoId> GetSpawnsImplementation(System.Random rand,
|
||||||
|
IEntityManager entMan,
|
||||||
|
IPrototypeManager proto);
|
||||||
|
}
|
||||||
28
Content.Shared/EntityTable/EntitySelectors/GroupSelector.cs
Normal file
28
Content.Shared/EntityTable/EntitySelectors/GroupSelector.cs
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
using Content.Shared.Random.Helpers;
|
||||||
|
using Robust.Shared.Prototypes;
|
||||||
|
|
||||||
|
namespace Content.Shared.EntityTable.EntitySelectors;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the spawns from one of the child selectors, based on the weight of the children
|
||||||
|
/// </summary>
|
||||||
|
public sealed partial class GroupSelector : EntityTableSelector
|
||||||
|
{
|
||||||
|
[DataField(required: true)]
|
||||||
|
public List<EntityTableSelector> Children = new();
|
||||||
|
|
||||||
|
protected override IEnumerable<EntProtoId> GetSpawnsImplementation(System.Random rand,
|
||||||
|
IEntityManager entMan,
|
||||||
|
IPrototypeManager proto)
|
||||||
|
{
|
||||||
|
var children = new Dictionary<EntityTableSelector, float>(Children.Count);
|
||||||
|
foreach (var child in Children)
|
||||||
|
{
|
||||||
|
children.Add(child, child.Weight);
|
||||||
|
}
|
||||||
|
|
||||||
|
var pick = SharedRandomExtensions.Pick(children, rand);
|
||||||
|
|
||||||
|
return pick.GetSpawns(rand, entMan, proto);
|
||||||
|
}
|
||||||
|
}
|
||||||
20
Content.Shared/EntityTable/EntitySelectors/NestedSelector.cs
Normal file
20
Content.Shared/EntityTable/EntitySelectors/NestedSelector.cs
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
using Robust.Shared.Prototypes;
|
||||||
|
|
||||||
|
namespace Content.Shared.EntityTable.EntitySelectors;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the spawns from the entity table prototype specified.
|
||||||
|
/// Can be used to reuse common tables.
|
||||||
|
/// </summary>
|
||||||
|
public sealed partial class NestedSelector : EntityTableSelector
|
||||||
|
{
|
||||||
|
[DataField(required: true)]
|
||||||
|
public ProtoId<EntityTablePrototype> TableId;
|
||||||
|
|
||||||
|
protected override IEnumerable<EntProtoId> GetSpawnsImplementation(System.Random rand,
|
||||||
|
IEntityManager entMan,
|
||||||
|
IPrototypeManager proto)
|
||||||
|
{
|
||||||
|
return proto.Index(TableId).Table.GetSpawns(rand, entMan, proto);
|
||||||
|
}
|
||||||
|
}
|
||||||
16
Content.Shared/EntityTable/EntitySelectors/NoneSelector.cs
Normal file
16
Content.Shared/EntityTable/EntitySelectors/NoneSelector.cs
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
using Robust.Shared.Prototypes;
|
||||||
|
|
||||||
|
namespace Content.Shared.EntityTable.EntitySelectors;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Selects nothing.
|
||||||
|
/// </summary>
|
||||||
|
public sealed partial class NoneSelector : EntityTableSelector
|
||||||
|
{
|
||||||
|
protected override IEnumerable<EntProtoId> GetSpawnsImplementation(System.Random rand,
|
||||||
|
IEntityManager entMan,
|
||||||
|
IPrototypeManager proto)
|
||||||
|
{
|
||||||
|
yield break;
|
||||||
|
}
|
||||||
|
}
|
||||||
18
Content.Shared/EntityTable/EntityTablePrototype.cs
Normal file
18
Content.Shared/EntityTable/EntityTablePrototype.cs
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
using Content.Shared.EntityTable.EntitySelectors;
|
||||||
|
using Robust.Shared.Prototypes;
|
||||||
|
|
||||||
|
namespace Content.Shared.EntityTable;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// This is a prototype for...
|
||||||
|
/// </summary>
|
||||||
|
[Prototype]
|
||||||
|
public sealed partial class EntityTablePrototype : IPrototype
|
||||||
|
{
|
||||||
|
/// <inheritdoc/>
|
||||||
|
[IdDataField]
|
||||||
|
public string ID { get; } = default!;
|
||||||
|
|
||||||
|
[DataField(required: true)]
|
||||||
|
public EntityTableSelector Table = default!;
|
||||||
|
}
|
||||||
20
Content.Shared/EntityTable/EntityTableSystem.cs
Normal file
20
Content.Shared/EntityTable/EntityTableSystem.cs
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
using Content.Shared.EntityTable.EntitySelectors;
|
||||||
|
using Robust.Shared.Prototypes;
|
||||||
|
using Robust.Shared.Random;
|
||||||
|
|
||||||
|
namespace Content.Shared.EntityTable;
|
||||||
|
|
||||||
|
public sealed class EntityTableSystem : EntitySystem
|
||||||
|
{
|
||||||
|
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
||||||
|
[Dependency] private readonly IRobustRandom _random = default!;
|
||||||
|
|
||||||
|
public IEnumerable<EntProtoId> GetSpawns(EntityTableSelector? table, System.Random? rand = null)
|
||||||
|
{
|
||||||
|
if (table == null)
|
||||||
|
return new List<EntProtoId>();
|
||||||
|
|
||||||
|
rand ??= _random.GetRandom();
|
||||||
|
return table.GetSpawns(rand, EntityManager, _prototypeManager);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
using Robust.Shared.Prototypes;
|
||||||
|
|
||||||
|
namespace Content.Shared.EntityTable.ValueSelector;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gives a constant value.
|
||||||
|
/// </summary>
|
||||||
|
public sealed partial class ConstantNumberSelector : NumberSelector
|
||||||
|
{
|
||||||
|
[DataField]
|
||||||
|
public float Value = 1;
|
||||||
|
|
||||||
|
public ConstantNumberSelector(float value)
|
||||||
|
{
|
||||||
|
Value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override float Get(System.Random rand, IEntityManager entMan, IPrototypeManager proto)
|
||||||
|
{
|
||||||
|
return Value;
|
||||||
|
}
|
||||||
|
}
|
||||||
16
Content.Shared/EntityTable/ValueSelector/NumberSelector.cs
Normal file
16
Content.Shared/EntityTable/ValueSelector/NumberSelector.cs
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
using Content.Shared.EntityTable.EntitySelectors;
|
||||||
|
using JetBrains.Annotations;
|
||||||
|
using Robust.Shared.Prototypes;
|
||||||
|
|
||||||
|
namespace Content.Shared.EntityTable.ValueSelector;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Used for implementing custom value selection for <see cref="EntityTableSelector"/>
|
||||||
|
/// </summary>
|
||||||
|
[ImplicitDataDefinitionForInheritors, UsedImplicitly(ImplicitUseTargetFlags.WithInheritors)]
|
||||||
|
public abstract partial class NumberSelector
|
||||||
|
{
|
||||||
|
public abstract float Get(System.Random rand,
|
||||||
|
IEntityManager entMan,
|
||||||
|
IPrototypeManager proto);
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
using System.Numerics;
|
||||||
|
using Robust.Shared.Prototypes;
|
||||||
|
using Robust.Shared.Random;
|
||||||
|
|
||||||
|
namespace Content.Shared.EntityTable.ValueSelector;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gives a value between the two numbers specified, inclusive.
|
||||||
|
/// </summary>
|
||||||
|
public sealed partial class RangeNumberSelector : NumberSelector
|
||||||
|
{
|
||||||
|
[DataField]
|
||||||
|
public Vector2 Range = new(1, 1);
|
||||||
|
|
||||||
|
public override float Get(System.Random rand, IEntityManager entMan, IPrototypeManager proto)
|
||||||
|
{
|
||||||
|
return rand.NextFloat(Range.X, Range.Y + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -108,6 +108,27 @@ namespace Content.Shared.Random.Helpers
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static T Pick<T>(Dictionary<T, float> weights, System.Random random)
|
||||||
|
where T : notnull
|
||||||
|
{
|
||||||
|
var sum = weights.Values.Sum();
|
||||||
|
var accumulated = 0f;
|
||||||
|
|
||||||
|
var rand = random.NextFloat() * sum;
|
||||||
|
|
||||||
|
foreach (var (key, weight) in weights)
|
||||||
|
{
|
||||||
|
accumulated += weight;
|
||||||
|
|
||||||
|
if (accumulated >= rand)
|
||||||
|
{
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new InvalidOperationException("Invalid weighted pick");
|
||||||
|
}
|
||||||
|
|
||||||
public static (string reagent, FixedPoint2 quantity) Pick(this WeightedRandomFillSolutionPrototype prototype, IRobustRandom? random = null)
|
public static (string reagent, FixedPoint2 quantity) Pick(this WeightedRandomFillSolutionPrototype prototype, IRobustRandom? random = null)
|
||||||
{
|
{
|
||||||
var randomFill = prototype.PickRandomFill(random);
|
var randomFill = prototype.PickRandomFill(random);
|
||||||
|
|||||||
@@ -1,33 +1,81 @@
|
|||||||
|
- type: entityTable
|
||||||
|
id: AllPlushiesTable
|
||||||
|
table: !type:GroupSelector
|
||||||
|
children:
|
||||||
|
- !type:EntSelector
|
||||||
|
id: PlushieBee
|
||||||
|
- !type:EntSelector
|
||||||
|
id: PlushieNar
|
||||||
|
weight: 0.5
|
||||||
|
- !type:EntSelector
|
||||||
|
id: PlushieRatvar
|
||||||
|
weight: 0.5
|
||||||
|
- !type:EntSelector
|
||||||
|
id: PlushieNuke
|
||||||
|
- !type:EntSelector
|
||||||
|
id: PlushieSlime
|
||||||
|
- !type:EntSelector
|
||||||
|
id: PlushieSnake
|
||||||
|
- !type:GroupSelector
|
||||||
|
children:
|
||||||
|
- !type:EntSelector
|
||||||
|
id: PlushieLizard
|
||||||
|
weight: 9
|
||||||
|
- !type:EntSelector
|
||||||
|
id: PlushieSpaceLizard
|
||||||
|
weight: 1
|
||||||
|
- !type:GroupSelector
|
||||||
|
children:
|
||||||
|
- !type:EntSelector
|
||||||
|
id: PlushieCarp
|
||||||
|
- !type:EntSelector
|
||||||
|
id: PlushieHolocarp
|
||||||
|
weight: 0.25
|
||||||
|
- !type:EntSelector
|
||||||
|
id: PlushieMagicarp
|
||||||
|
weight: 0.25
|
||||||
|
- !type:EntSelector
|
||||||
|
id: PlushieRainbowCarp
|
||||||
|
weight: 0.15
|
||||||
|
- !type:EntSelector
|
||||||
|
id: PlushieVox
|
||||||
|
- !type:EntSelector
|
||||||
|
id: PlushieRouny
|
||||||
|
- !type:GroupSelector
|
||||||
|
children:
|
||||||
|
- !type:EntSelector
|
||||||
|
id: PlushieSharkBlue
|
||||||
|
- !type:EntSelector
|
||||||
|
id: PlushieSharkGrey
|
||||||
|
- !type:EntSelector
|
||||||
|
id: PlushieSharkPink
|
||||||
|
- !type:EntSelector
|
||||||
|
id: PlushieAtmosian
|
||||||
|
- !type:EntSelector
|
||||||
|
id: PlushieDiona
|
||||||
|
- !type:EntSelector
|
||||||
|
id: PlushieXeno
|
||||||
|
- !type:EntSelector
|
||||||
|
id: PlushieHampter
|
||||||
|
- !type:EntSelector
|
||||||
|
id: PlushieMoth
|
||||||
|
- !type:EntSelector
|
||||||
|
id: PlushieArachind
|
||||||
|
- !type:EntSelector
|
||||||
|
id: PlushiePenguin
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: CrateFunPlushie
|
id: CrateFunPlushie
|
||||||
parent: CrateGenericSteel
|
parent: CrateGenericSteel
|
||||||
name: plushie crate
|
name: plushie crate
|
||||||
description: A buncha soft plushies. Throw them around and then wonder how you're gonna explain this purchase to NT.
|
description: A buncha soft plushies. Throw them around and then wonder how you're gonna explain this purchase to NT.
|
||||||
components:
|
components:
|
||||||
- type: StorageFill
|
- type: EntityTableContainerFill
|
||||||
contents:
|
containers:
|
||||||
- id: PlushieBee
|
entity_storage: !type:NestedSelector
|
||||||
- id: PlushieNar
|
tableId: AllPlushiesTable
|
||||||
- id: PlushieCarp
|
rolls: !type:ConstantNumberSelector
|
||||||
- id: PlushieNuke
|
value: 10
|
||||||
- id: PlushieSlime
|
|
||||||
- id: PlushieSnake
|
|
||||||
- id: PlushieLizard
|
|
||||||
- id: PlushieSpaceLizard
|
|
||||||
- id: PlushieVox
|
|
||||||
- id: PlushieRouny
|
|
||||||
- id: PlushieRatvar
|
|
||||||
- id: PlushieSharkBlue
|
|
||||||
orGroup: PlushieShark
|
|
||||||
- id: PlushieSharkGrey
|
|
||||||
orGroup: PlushieShark
|
|
||||||
- id: PlushieAtmosian
|
|
||||||
- id: PlushieDiona
|
|
||||||
- id: PlushieXeno
|
|
||||||
- id: PlushieHampter
|
|
||||||
- id: PlushieMoth
|
|
||||||
- id: PlushieArachind
|
|
||||||
- id: PlushiePenguin
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: CrateFunLizardPlushieBulk
|
id: CrateFunLizardPlushieBulk
|
||||||
@@ -35,12 +83,18 @@
|
|||||||
name: bulk lizard plushie crate
|
name: bulk lizard plushie crate
|
||||||
description: A buncha soft lizard plushies. Throw them around and then wonder how you're gonna explain this purchase to NT.
|
description: A buncha soft lizard plushies. Throw them around and then wonder how you're gonna explain this purchase to NT.
|
||||||
components:
|
components:
|
||||||
- type: StorageFill
|
- type: EntityTableContainerFill
|
||||||
contents:
|
containers:
|
||||||
- id: PlushieLizard
|
entity_storage: !type:AllSelector
|
||||||
amount: 3
|
children:
|
||||||
- id: PlushieSpaceLizard
|
- !type:EntSelector
|
||||||
amount: 2
|
id: PlushieLizard
|
||||||
|
amount: !type:ConstantNumberSelector
|
||||||
|
value: 3
|
||||||
|
- !type:EntSelector
|
||||||
|
id: PlushieSpaceLizard
|
||||||
|
amount: !type:ConstantNumberSelector
|
||||||
|
value: 3
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: CrateFunInstrumentsVariety
|
id: CrateFunInstrumentsVariety
|
||||||
|
|||||||
@@ -3,338 +3,218 @@
|
|||||||
suffix: Filled
|
suffix: Filled
|
||||||
parent: LockerSyndicatePersonal
|
parent: LockerSyndicatePersonal
|
||||||
components:
|
components:
|
||||||
- type: StorageFill
|
- type: EntityTableContainerFill
|
||||||
contents:
|
containers:
|
||||||
- id: ClothingBeltMilitaryWebbing
|
entity_storage: !type:AllSelector
|
||||||
- id: ClothingHandsGlovesCombat
|
children:
|
||||||
- id: JetpackBlackFilled
|
- !type:EntSelector
|
||||||
- id: ClothingUniformJumpsuitOperative
|
id: ClothingBeltMilitaryWebbing
|
||||||
- id: ClothingUniformJumpskirtOperative
|
- !type:EntSelector
|
||||||
- id: ClothingHeadsetAltSyndicate
|
id: ClothingHandsGlovesCombat
|
||||||
- id: ClothingEyesHudSyndicate
|
- !type:EntSelector
|
||||||
|
id: JetpackBlackFilled
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingUniformJumpsuitOperative
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingUniformJumpskirtOperative
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingHeadsetAltSyndicate
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingEyesHudSyndicate
|
||||||
|
|
||||||
|
- type: entityTable
|
||||||
|
id: FillLockerEmergencyStandard
|
||||||
|
table: !type:AllSelector
|
||||||
|
children:
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingMaskBreath
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingOuterSuitEmergency
|
||||||
|
- !type:GroupSelector
|
||||||
|
children:
|
||||||
|
- !type:EntSelector
|
||||||
|
id: EmergencyOxygenTankFilled
|
||||||
|
- !type:EntSelector
|
||||||
|
id: OxygenTankFilled
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ToolboxEmergencyFilled
|
||||||
|
prob: 0.5
|
||||||
|
- !type:EntSelector
|
||||||
|
id: MedkitOxygenFilled
|
||||||
|
prob: 0.2
|
||||||
|
- !type:EntSelector
|
||||||
|
id: WeaponFlareGun
|
||||||
|
prob: 0.05
|
||||||
|
- !type:EntSelector
|
||||||
|
id: BoxMRE
|
||||||
|
prob: 0.1
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: ClosetEmergencyFilledRandom
|
id: ClosetEmergencyFilledRandom
|
||||||
parent: ClosetEmergency
|
parent: ClosetEmergency
|
||||||
suffix: Filled, Random
|
suffix: Filled, Random
|
||||||
components:
|
components:
|
||||||
- type: StorageFill
|
- type: EntityTableContainerFill
|
||||||
contents:
|
containers:
|
||||||
- id: ClothingMaskBreath
|
entity_storage: !type:NestedSelector
|
||||||
- id: ClothingOuterSuitEmergency
|
tableId: FillLockerEmergencyStandard
|
||||||
- id: EmergencyOxygenTankFilled
|
|
||||||
prob: 0.5
|
|
||||||
orGroup: OxygenTank
|
|
||||||
- id: OxygenTankFilled
|
|
||||||
prob: 0.5
|
|
||||||
orGroup: OxygenTank
|
|
||||||
- id: ToolboxEmergencyFilled
|
|
||||||
prob: 0.5
|
|
||||||
- id: MedkitOxygenFilled
|
|
||||||
prob: 0.2
|
|
||||||
- id: WeaponFlareGun
|
|
||||||
prob: 0.05
|
|
||||||
- id: BoxMRE
|
|
||||||
prob: 0.1
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: ClosetWallEmergencyFilledRandom
|
id: ClosetWallEmergencyFilledRandom
|
||||||
parent: ClosetWallEmergency
|
parent: ClosetWallEmergency
|
||||||
suffix: Filled, Random
|
suffix: Filled, Random
|
||||||
components:
|
components:
|
||||||
- type: StorageFill
|
- type: EntityTableContainerFill
|
||||||
contents:
|
containers:
|
||||||
- id: ClothingMaskBreath
|
entity_storage: !type:NestedSelector
|
||||||
- id: ClothingOuterSuitEmergency
|
tableId: FillLockerEmergencyStandard
|
||||||
- id: EmergencyOxygenTankFilled
|
|
||||||
prob: 0.5
|
|
||||||
orGroup: OxygenTank
|
|
||||||
- id: OxygenTankFilled
|
|
||||||
prob: 0.5
|
|
||||||
orGroup: OxygenTank
|
|
||||||
- id: ToolboxEmergencyFilled
|
|
||||||
prob: 0.5
|
|
||||||
- id: MedkitOxygenFilled
|
|
||||||
prob: 0.2
|
|
||||||
- id: WeaponFlareGun
|
|
||||||
prob: 0.05
|
|
||||||
- id: BoxMRE
|
|
||||||
prob: 0.1
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: ClosetEmergencyN2FilledRandom
|
id: ClosetEmergencyN2FilledRandom
|
||||||
parent: ClosetEmergencyN2
|
parent: ClosetEmergencyN2
|
||||||
suffix: Filled, Random
|
suffix: Filled, Random
|
||||||
components:
|
components:
|
||||||
- type: StorageFill
|
- type: EntityTableContainerFill
|
||||||
contents:
|
containers:
|
||||||
- id: ClothingMaskBreath
|
entity_storage: !type:AllSelector
|
||||||
- id: ClothingOuterSuitEmergency
|
children:
|
||||||
- id: EmergencyNitrogenTankFilled
|
- !type:EntSelector
|
||||||
prob: 0.5
|
id: ClothingMaskBreath
|
||||||
orGroup: NitrogenTank
|
- !type:EntSelector
|
||||||
- id: NitrogenTankFilled
|
id: ClothingOuterSuitEmergency
|
||||||
prob: 0.5
|
- !type:GroupSelector
|
||||||
orGroup: NitrogenTank
|
children:
|
||||||
|
- !type:EntSelector
|
||||||
|
id: EmergencyNitrogenTankFilled
|
||||||
|
- !type:EntSelector
|
||||||
|
id: NitrogenTankFilled
|
||||||
|
|
||||||
|
- type: entityTable
|
||||||
|
id: FillLockerFireStandard
|
||||||
|
table: !type:AllSelector
|
||||||
|
children:
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingOuterSuitFire
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingHeadHelmetFire
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingMaskGas
|
||||||
|
- !type:GroupSelector
|
||||||
|
children:
|
||||||
|
- !type:EntSelector
|
||||||
|
id: EmergencyOxygenTankFilled
|
||||||
|
- !type:EntSelector
|
||||||
|
id: OxygenTankFilled
|
||||||
|
- !type:EntSelector
|
||||||
|
id: CrowbarRed
|
||||||
|
- !type:GroupSelector
|
||||||
|
children:
|
||||||
|
- !type:EntSelector
|
||||||
|
id: FireExtinguisher
|
||||||
|
weight: 98
|
||||||
|
- !type:EntSelector
|
||||||
|
id: SprayBottleWater #It's just budget cut after budget cut man
|
||||||
|
weight: 2
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: ClosetFireFilled
|
id: ClosetFireFilled
|
||||||
parent: ClosetFire
|
parent: ClosetFire
|
||||||
suffix: Filled
|
suffix: Filled
|
||||||
components:
|
components:
|
||||||
- type: StorageFill
|
- type: EntityTableContainerFill
|
||||||
contents:
|
containers:
|
||||||
- id: ClothingOuterSuitFire
|
entity_storage: !type:NestedSelector
|
||||||
- id: ClothingHeadHelmetFire
|
tableId: FillLockerFireStandard
|
||||||
- id: ClothingMaskGas
|
|
||||||
- id: EmergencyOxygenTankFilled
|
|
||||||
prob: 0.5
|
|
||||||
orGroup: OxygenTank
|
|
||||||
- id: OxygenTankFilled
|
|
||||||
prob: 0.5
|
|
||||||
orGroup: OxygenTank
|
|
||||||
- id: CrowbarRed
|
|
||||||
- id: FireExtinguisher
|
|
||||||
prob: 0.98
|
|
||||||
orGroup: FireExtinguisher
|
|
||||||
- id: SprayBottleWater #It's just budget cut after budget cut man
|
|
||||||
prob: 0.02
|
|
||||||
orGroup: FireExtinguisher
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: ClosetWallFireFilledRandom
|
id: ClosetWallFireFilledRandom
|
||||||
parent: ClosetWallFire
|
parent: ClosetWallFire
|
||||||
suffix: Filled
|
suffix: Filled
|
||||||
components:
|
components:
|
||||||
- type: StorageFill
|
- type: EntityTableContainerFill
|
||||||
contents:
|
containers:
|
||||||
- id: ClothingOuterSuitFire
|
entity_storage: !type:NestedSelector
|
||||||
- id: ClothingHeadHelmetFire
|
tableId: FillLockerFireStandard
|
||||||
- id: ClothingMaskGas
|
|
||||||
- id: EmergencyOxygenTankFilled
|
- type: entityTable
|
||||||
prob: 0.5
|
id: SyndieMaintLoot
|
||||||
orGroup: OxygenTank
|
table: !type:GroupSelector
|
||||||
- id: OxygenTankFilled
|
children:
|
||||||
prob: 0.5
|
- !type:GroupSelector
|
||||||
orGroup: OxygenTank
|
children:
|
||||||
- id: CrowbarRed
|
- !type:EntSelector
|
||||||
- id: FireExtinguisher
|
id: ClothingUniformJumpsuitOperative
|
||||||
prob: 0.98
|
- !type:EntSelector
|
||||||
orGroup: FireExtinguisher
|
id: ClothingUniformJumpskirtOperative
|
||||||
- id: SprayBottleWater #It's just budget cut after budget cut man
|
- !type:EntSelector
|
||||||
prob: 0.02
|
id: ClothingBackpackDuffelSyndicate
|
||||||
orGroup: FireExtinguisher
|
- !type:EntSelector
|
||||||
|
id: CyberPen
|
||||||
|
- !type:EntSelector
|
||||||
|
id: CigPackSyndicate
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingBackpackDuffelSyndicatePyjamaBundle
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingBeltMilitaryWebbing
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingShoesBootsCombatFilled
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ToolboxSyndicateFilled
|
||||||
|
- !type:EntSelector
|
||||||
|
id: BalloonSyn
|
||||||
|
- !type:EntSelector
|
||||||
|
id: WeaponSniperMosin
|
||||||
|
weight: 2
|
||||||
|
|
||||||
|
- type: entityTable
|
||||||
|
id: MaintenanceLockerLoot
|
||||||
|
table: !type:AllSelector
|
||||||
|
children:
|
||||||
|
- !type:EntSelector
|
||||||
|
id: StrangePill
|
||||||
|
prob: 0.20
|
||||||
|
# Tools
|
||||||
|
- !type:NestedSelector
|
||||||
|
tableId: MaintToolsTable
|
||||||
|
rolls: !type:RangeNumberSelector
|
||||||
|
range: 1, 5
|
||||||
|
# Fluff
|
||||||
|
- !type:NestedSelector
|
||||||
|
tableId: MaintFluffTable
|
||||||
|
prob: 0.33
|
||||||
|
rolls: !type:RangeNumberSelector
|
||||||
|
range: 0, 2
|
||||||
|
# Plushies
|
||||||
|
- !type:NestedSelector
|
||||||
|
tableId: AllPlushiesTable
|
||||||
|
prob: 0.10
|
||||||
|
rolls: !type:RangeNumberSelector
|
||||||
|
range: 1, 2
|
||||||
|
# Weapons
|
||||||
|
- !type:NestedSelector
|
||||||
|
tableId: MaintWeaponTable
|
||||||
|
prob: 0.075
|
||||||
|
# Syndie Loot
|
||||||
|
- !type:NestedSelector
|
||||||
|
tableId: SyndieMaintLoot
|
||||||
|
prob: 0.05
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: ClosetMaintenanceFilledRandom
|
id: ClosetMaintenanceFilledRandom
|
||||||
suffix: Filled, Random
|
suffix: Filled, Random
|
||||||
parent: ClosetMaintenance
|
parent: ClosetMaintenance
|
||||||
components:
|
components:
|
||||||
- type: StorageFill
|
- type: EntityTableContainerFill
|
||||||
contents:
|
containers:
|
||||||
- id: Lantern
|
entity_storage: !type:NestedSelector
|
||||||
prob: 0.50
|
tableId: MaintenanceLockerLoot
|
||||||
- id: Wirecutter
|
|
||||||
prob: 0.33
|
|
||||||
- id: Screwdriver
|
|
||||||
prob: 0.33
|
|
||||||
- id: Wrench
|
|
||||||
prob: 0.33
|
|
||||||
- id: Crowbar
|
|
||||||
prob: 0.50
|
|
||||||
- id: Welder
|
|
||||||
prob: 0.33
|
|
||||||
- id: Multitool
|
|
||||||
prob: 0.10
|
|
||||||
- id: Soap
|
|
||||||
prob: 0.44
|
|
||||||
- id: null
|
|
||||||
prob: 0.67
|
|
||||||
orGroup: carp
|
|
||||||
- id: PlushieCarp
|
|
||||||
prob: 0.2
|
|
||||||
orGroup: carp
|
|
||||||
- id: PlushieHolocarp
|
|
||||||
prob: 0.05
|
|
||||||
orGroup: carp
|
|
||||||
- id: PlushieMagicarp
|
|
||||||
prob: 0.05
|
|
||||||
orGroup: carp
|
|
||||||
- id: PlushieRainbowCarp
|
|
||||||
prob: 0.03
|
|
||||||
orGroup: carp
|
|
||||||
- id: PlushieSlime
|
|
||||||
prob: 0.2
|
|
||||||
- id: PlushieSnake
|
|
||||||
prob: 0.2
|
|
||||||
- id: ClothingShoesSkates
|
|
||||||
prob: 0.1
|
|
||||||
- id: ClothingHandsGlovesColorYellow
|
|
||||||
prob: 0.05
|
|
||||||
- id: ClothingHandsGlovesFingerlessInsulated
|
|
||||||
prob: 0.07
|
|
||||||
- id: ClothingBeltUtility
|
|
||||||
prob: 0.10
|
|
||||||
- id: ClothingHeadHatCone
|
|
||||||
prob: 0.2
|
|
||||||
- id: WeaponFlareGun
|
|
||||||
prob: 0.1
|
|
||||||
- id: ClothingHandsGlovesColorYellowBudget
|
|
||||||
prob: 0.25
|
|
||||||
- id: StrangePill
|
|
||||||
prob: 0.20
|
|
||||||
- id: DrinkMopwataBottleRandom
|
|
||||||
prob: 0.20
|
|
||||||
- id: ModularReceiver
|
|
||||||
prob: 0.1
|
|
||||||
- id: DrinkSpaceGlue
|
|
||||||
prob: 0.20
|
|
||||||
- id: DrinkSpaceLube
|
|
||||||
prob: 0.20
|
|
||||||
- id: BarberScissors
|
|
||||||
prob: 0.05
|
|
||||||
- id: Wristwatch
|
|
||||||
prob: 0.05
|
|
||||||
- id: BookRandomStory
|
|
||||||
prob: 0.1
|
|
||||||
# Syndicate loot
|
|
||||||
- id: null
|
|
||||||
prob: 0.95
|
|
||||||
orGroup: syndiemaintloot
|
|
||||||
- id: ClothingUniformJumpskirtOperative
|
|
||||||
prob: 0.005
|
|
||||||
orGroup: syndiemaintloot
|
|
||||||
- id: ClothingUniformJumpsuitOperative
|
|
||||||
prob: 0.005
|
|
||||||
orGroup: syndiemaintloot
|
|
||||||
- id: ClothingBackpackDuffelSyndicate
|
|
||||||
prob: 0.005
|
|
||||||
orGroup: syndiemaintloot
|
|
||||||
- id: CyberPen
|
|
||||||
prob: 0.005
|
|
||||||
orGroup: syndiemaintloot
|
|
||||||
- id: CigPackSyndicate
|
|
||||||
prob: 0.005
|
|
||||||
orGroup: syndiemaintloot
|
|
||||||
- id: ClothingBackpackDuffelSyndicatePyjamaBundle
|
|
||||||
prob: 0.005
|
|
||||||
orGroup: syndiemaintloot
|
|
||||||
- id: ClothingBeltMilitaryWebbing
|
|
||||||
prob: 0.005
|
|
||||||
orGroup: syndiemaintloot
|
|
||||||
- id: ClothingShoesBootsCombatFilled
|
|
||||||
prob: 0.005
|
|
||||||
orGroup: syndiemaintloot
|
|
||||||
- id: ToolboxSyndicateFilled
|
|
||||||
prob: 0.005
|
|
||||||
orGroup: syndiemaintloot
|
|
||||||
- id: BalloonSyn
|
|
||||||
prob: 0.005
|
|
||||||
orGroup: syndiemaintloot
|
|
||||||
- id: WeaponSniperMosin
|
|
||||||
prob: 0.0010
|
|
||||||
orGroup: syndiemaintloot
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: ClosetWallMaintenanceFilledRandom
|
id: ClosetWallMaintenanceFilledRandom
|
||||||
parent: ClosetWall
|
parent: ClosetWall
|
||||||
suffix: Filled, Random
|
suffix: Filled, Random
|
||||||
components:
|
components:
|
||||||
- type: StorageFill
|
- type: EntityTableContainerFill
|
||||||
contents:
|
containers:
|
||||||
- id: Lantern
|
entity_storage: !type:NestedSelector
|
||||||
prob: 0.50
|
tableId: MaintenanceLockerLoot
|
||||||
- id: Wirecutter
|
|
||||||
prob: 0.33
|
|
||||||
- id: Screwdriver
|
|
||||||
prob: 0.33
|
|
||||||
- id: Wrench
|
|
||||||
prob: 0.33
|
|
||||||
- id: Crowbar
|
|
||||||
prob: 0.50
|
|
||||||
- id: Welder
|
|
||||||
prob: 0.33
|
|
||||||
- id: Multitool
|
|
||||||
prob: 0.10
|
|
||||||
- id: Soap
|
|
||||||
prob: 0.44
|
|
||||||
- id: null
|
|
||||||
prob: 0.67
|
|
||||||
orGroup: carp
|
|
||||||
- id: PlushieCarp
|
|
||||||
prob: 0.2
|
|
||||||
orGroup: carp
|
|
||||||
- id: PlushieHolocarp
|
|
||||||
prob: 0.05
|
|
||||||
orGroup: carp
|
|
||||||
- id: PlushieMagicarp
|
|
||||||
prob: 0.05
|
|
||||||
orGroup: carp
|
|
||||||
- id: PlushieRainbowCarp
|
|
||||||
prob: 0.03
|
|
||||||
orGroup: carp
|
|
||||||
- id: PlushieSlime
|
|
||||||
prob: 0.2
|
|
||||||
- id: PlushieSnake
|
|
||||||
prob: 0.2
|
|
||||||
- id: ClothingHandsGlovesColorYellow
|
|
||||||
prob: 0.05
|
|
||||||
- id: ClothingBeltQuiver
|
|
||||||
prob: 0.02
|
|
||||||
- id: ClothingBeltUtility
|
|
||||||
prob: 0.10
|
|
||||||
- id: ClothingHeadHatCone
|
|
||||||
prob: 0.2
|
|
||||||
- id: WeaponFlareGun
|
|
||||||
prob: 0.1
|
|
||||||
- id: ClothingHandsGlovesColorYellowBudget
|
|
||||||
prob: 0.25
|
|
||||||
- id: StrangePill
|
|
||||||
prob: 0.20
|
|
||||||
- id: DrinkSpaceGlue
|
|
||||||
prob: 0.20
|
|
||||||
- id: ModularReceiver
|
|
||||||
prob: 0.1
|
|
||||||
# Syndicate loot
|
|
||||||
- id: null
|
|
||||||
prob: 0.95
|
|
||||||
orGroup: syndiemaintloot
|
|
||||||
- id: ClothingUniformJumpskirtOperative
|
|
||||||
prob: 0.005
|
|
||||||
orGroup: syndiemaintloot
|
|
||||||
- id: ClothingUniformJumpsuitOperative
|
|
||||||
prob: 0.005
|
|
||||||
orGroup: syndiemaintloot
|
|
||||||
- id: ClothingBackpackDuffelSyndicate
|
|
||||||
prob: 0.005
|
|
||||||
orGroup: syndiemaintloot
|
|
||||||
- id: CyberPen
|
|
||||||
prob: 0.005
|
|
||||||
orGroup: syndiemaintloot
|
|
||||||
- id: ClothingHeadHatOutlawHat
|
|
||||||
prob: 0.005
|
|
||||||
orGroup: syndiemaintloot
|
|
||||||
- id: ClothingEyesGlassesOutlawGlasses
|
|
||||||
prob: 0.005
|
|
||||||
orGroup: syndiemaintloot
|
|
||||||
- id: CigPackSyndicate
|
|
||||||
prob: 0.005
|
|
||||||
orGroup: syndiemaintloot
|
|
||||||
- id: ClothingBackpackDuffelSyndicatePyjamaBundle
|
|
||||||
prob: 0.005
|
|
||||||
orGroup: syndiemaintloot
|
|
||||||
- id: ClothingBeltMilitaryWebbing
|
|
||||||
prob: 0.005
|
|
||||||
orGroup: syndiemaintloot
|
|
||||||
- id: ClothingShoesBootsCombatFilled
|
|
||||||
prob: 0.005
|
|
||||||
orGroup: syndiemaintloot
|
|
||||||
- id: ToolboxSyndicateFilled
|
|
||||||
prob: 0.005
|
|
||||||
orGroup: syndiemaintloot
|
|
||||||
- id: BalloonSyn
|
|
||||||
prob: 0.005
|
|
||||||
orGroup: syndiemaintloot
|
|
||||||
- id: WeaponSniperMosin
|
|
||||||
prob: 0.0010
|
|
||||||
orGroup: syndiemaintloot
|
|
||||||
|
|||||||
@@ -1,3 +1,285 @@
|
|||||||
|
- type: entityTable
|
||||||
|
id: MaintFluffTable
|
||||||
|
table: !type:GroupSelector
|
||||||
|
children:
|
||||||
|
# Common Group
|
||||||
|
- !type:GroupSelector
|
||||||
|
weight: 75
|
||||||
|
children:
|
||||||
|
# Smoker's specialty
|
||||||
|
- !type:AllSelector
|
||||||
|
children:
|
||||||
|
- !type:EntSelector
|
||||||
|
id: Lighter
|
||||||
|
- !type:EntSelector
|
||||||
|
id: CigCartonBlue
|
||||||
|
# Gar glasses
|
||||||
|
- !type:GroupSelector
|
||||||
|
children:
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingEyesGlassesGar
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingEyesGlassesGarOrange
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingEyesGlassesGarGiga
|
||||||
|
- !type:EntSelector
|
||||||
|
id: Wristwatch
|
||||||
|
weight: 0.5
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingHeadHatCake
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingHeadHatSkub
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingHeadHatCone
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingNeckBling
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingHeadHelmetCosmonaut
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingHeadHelmetBasic
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingShoeSlippersDuck
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingUnderSocksBee
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingUnderSocksCoder
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingHeadHatSquid
|
||||||
|
# Animal Masks
|
||||||
|
- !type:GroupSelector
|
||||||
|
children:
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingMaskRat
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingMaskFox
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingMaskBee
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingMaskBear
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingMaskRaven
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingMaskJackal
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingMaskBat
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingBeltSuspenders
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingEyesEyepatch
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingEyesGlasses
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingHandsGlovesLatex
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingHandsGlovesFingerless
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingHandsGlovesColorBlack
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingHeadHatBeret
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingHeadHatBowlerHat
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingHeadHatFedoraBrown
|
||||||
|
weight: 0.5
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingHeadHatFedoraGrey
|
||||||
|
weight: 0.5
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingHeadHatFez
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingHeadHatPaper
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingHeadHatPirate
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingMaskSterile
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingNeckHeadphones
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingNeckTieRed
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingOuterCoatGentle
|
||||||
|
- !type:AllSelector
|
||||||
|
children:
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingOuterCoatJensen
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingEyesGlassesJensen
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingOuterCoatLab
|
||||||
|
- !type:AllSelector
|
||||||
|
children:
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingOuterCoatPirate
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingHeadHatPirateTricord
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingHeadHatTophat
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingOuterHoodieBlack
|
||||||
|
weight: 0.5
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingOuterHoodieGrey
|
||||||
|
weight: 0.5
|
||||||
|
- !type:GroupSelector
|
||||||
|
children:
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingOuterFlannelRed
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingOuterFlannelBlue
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingOuterFlannelGreen
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingOuterVestHazard
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingShoesBootsJack
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingShoesHighheelBoots
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingShoesBootsLaceup
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingShoesLeather
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingShoesBootsSalvage
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingShoesBootsWork
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingShoesTourist
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingUniformJumpsuitLoungewear
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingHeadHatCowboyRed
|
||||||
|
# Uncommon Group
|
||||||
|
- !type:GroupSelector
|
||||||
|
weight: 23
|
||||||
|
children:
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingNeckCloakHerald
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingHeadHelmetTemplar
|
||||||
|
# Cloaks
|
||||||
|
- !type:GroupSelector
|
||||||
|
children:
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingNeckCloakTrans
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingNeckCloakAdmin
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingNeckCloakMoth
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingNeckCloakVoid
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingNeckCloakGoliathCloak
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingNeckCloakAce
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingNeckCloakAro
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingNeckCloakBi
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingNeckCloakIntersex
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingNeckCloakLesbian
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingNeckCloakGay
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingNeckCloakEnby
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingNeckCloakPan
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ToySkeleton
|
||||||
|
- !type:EntSelector
|
||||||
|
id: Basketball
|
||||||
|
- !type:EntSelector
|
||||||
|
id: Football
|
||||||
|
- !type:EntSelector
|
||||||
|
id: BalloonNT
|
||||||
|
- !type:EntSelector
|
||||||
|
id: BalloonCorgi
|
||||||
|
- !type:EntSelector
|
||||||
|
id: MysteryFigureBox
|
||||||
|
# Cult
|
||||||
|
- !type:AllSelector
|
||||||
|
children:
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingOuterRobesCult
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingShoesCult
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingHandsGlovesMercFingerless
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingHandsGlovesNitrile
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingHandsGlovesPowerglove
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingHeadHatAnimalHeadslime
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingHeadHatBeretMerc
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingHeadHatOutlawHat
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingHeadHatUshanka
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingHeadHatBunny
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingMaskNeckGaiter
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingNeckScarfStripedZebra
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingOuterGhostSheet
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingUniformJumpsuitAncient
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingUniformJumpsuitPirate
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingShoesBootsCowboyFancy
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingHeadHatCowboyBountyHunter
|
||||||
|
# Pins
|
||||||
|
- !type:GroupSelector
|
||||||
|
children:
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingNeckLGBTPin
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingNeckAromanticPin
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingNeckAsexualPin
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingNeckBisexualPin
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingNeckIntersexPin
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingNeckLesbianPin
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingNeckNonBinaryPin
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingNeckPansexualPin
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingNeckTransPin
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingNeckAutismPin
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingNeckGoldAutismPin
|
||||||
|
# Rare Group
|
||||||
|
- !type:GroupSelector
|
||||||
|
weight: 2
|
||||||
|
children:
|
||||||
|
- !type:EntSelector
|
||||||
|
id: Skub
|
||||||
|
- !type:EntSelector
|
||||||
|
id: PonderingOrb
|
||||||
|
- !type:EntSelector
|
||||||
|
id: CluwneHorn
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingShoesSkates
|
||||||
|
- !type:EntSelector
|
||||||
|
id: DrinkMugDog
|
||||||
|
- !type:EntSelector
|
||||||
|
id: CigarGold
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingUniformJumpsuitFamilyGuy
|
||||||
|
- !type:EntSelector
|
||||||
|
id: WristwatchGold
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
name: Maint Loot Spawner
|
name: Maint Loot Spawner
|
||||||
suffix: Fluff+Clothes
|
suffix: Fluff+Clothes
|
||||||
@@ -9,130 +291,188 @@
|
|||||||
- state: red
|
- state: red
|
||||||
- sprite: Clothing/Eyes/Glasses/gar.rsi
|
- sprite: Clothing/Eyes/Glasses/gar.rsi
|
||||||
state: icon-super
|
state: icon-super
|
||||||
- type: RandomSpawner
|
- type: EntityTableSpawner
|
||||||
rarePrototypes:
|
table: !type:NestedSelector
|
||||||
- ClothingUniformJumpsuitFamilyGuy
|
tableId: MaintFluffTable
|
||||||
- CigarGold
|
prob: 0.6
|
||||||
- ClothingNeckCloakHerald
|
|
||||||
- ClothingHeadHelmetTemplar
|
|
||||||
- ClothingNeckCloakTrans
|
|
||||||
- ClothingNeckCloakAdmin
|
|
||||||
- ClothingNeckCloakMoth
|
|
||||||
- ClothingNeckCloakVoid
|
|
||||||
- ClothingNeckCloakGoliathCloak
|
|
||||||
- ClothingNeckCloakAce
|
|
||||||
- ClothingNeckCloakAro
|
|
||||||
- ClothingNeckCloakBi
|
|
||||||
- ClothingNeckCloakIntersex
|
|
||||||
- ClothingNeckCloakLesbian
|
|
||||||
- ClothingNeckCloakGay
|
|
||||||
- ClothingNeckCloakEnby
|
|
||||||
- ClothingNeckCloakPan
|
|
||||||
- ToySkeleton
|
|
||||||
- Basketball
|
|
||||||
- Football
|
|
||||||
- BalloonCorgi
|
|
||||||
- BalloonNT
|
|
||||||
- PonderingOrb
|
|
||||||
- Skub
|
|
||||||
- DrinkMugDog
|
|
||||||
- ClothingNeckLGBTPin
|
|
||||||
- ClothingNeckAromanticPin
|
|
||||||
- ClothingNeckAsexualPin
|
|
||||||
- ClothingNeckBisexualPin
|
|
||||||
- ClothingNeckIntersexPin
|
|
||||||
- ClothingNeckLesbianPin
|
|
||||||
- ClothingNeckNonBinaryPin
|
|
||||||
- ClothingNeckPansexualPin
|
|
||||||
- ClothingNeckTransPin
|
|
||||||
- CluwneHorn
|
|
||||||
- ClothingMaskRat
|
|
||||||
- MysteryFigureBox
|
|
||||||
- ClothingHandsGlovesMercFingerless
|
|
||||||
- ClothingHandsGlovesNitrile
|
|
||||||
- ClothingHandsGlovesPowerglove
|
|
||||||
- ClothingHeadHatAnimalHeadslime
|
|
||||||
- ClothingHeadHatBeretMerc
|
|
||||||
- ClothingHeadHatOutlawHat
|
|
||||||
- ClothingHeadHatUshanka
|
|
||||||
- ClothingHeadHatBunny
|
|
||||||
- ClothingMaskNeckGaiter
|
|
||||||
- ClothingNeckScarfStripedZebra
|
|
||||||
- ClothingOuterRobesCult
|
|
||||||
- ClothingOuterGhostSheet
|
|
||||||
- ClothingShoesCult
|
|
||||||
- ClothingUniformJumpsuitAncient
|
|
||||||
- ClothingUniformJumpsuitPirate
|
|
||||||
- ClothingShoesBootsCowboyFancy
|
|
||||||
- ClothingHeadHatCowboyBountyHunter
|
|
||||||
- ClothingNeckAutismPin
|
|
||||||
- ClothingNeckGoldAutismPin
|
|
||||||
- WristwatchGold
|
|
||||||
rareChance: 0.01
|
|
||||||
prototypes:
|
|
||||||
- Lighter
|
|
||||||
- CigCartonBlue
|
|
||||||
- ClothingEyesGlassesGarGiga
|
|
||||||
- ClothingEyesGlassesGarOrange
|
|
||||||
- ClothingEyesGlassesGar
|
|
||||||
- ClothingHeadHatCake
|
|
||||||
- ClothingHeadHatSkub
|
|
||||||
- ClothingHeadHatCone
|
|
||||||
- ClothingNeckBling
|
|
||||||
- ClothingHeadHelmetCosmonaut
|
|
||||||
- ClothingHeadHelmetBasic
|
|
||||||
- ClothingShoeSlippersDuck
|
|
||||||
- ClothingUnderSocksBee
|
|
||||||
- ClothingUnderSocksCoder
|
|
||||||
- ClothingHeadHatSquid
|
|
||||||
- ClothingMaskFox
|
|
||||||
- ClothingMaskBee
|
|
||||||
- ClothingMaskBear
|
|
||||||
- ClothingMaskRaven
|
|
||||||
- ClothingMaskJackal
|
|
||||||
- ClothingMaskBat
|
|
||||||
- ClothingBeltSuspenders
|
|
||||||
- ClothingEyesEyepatch
|
|
||||||
- ClothingEyesGlasses
|
|
||||||
- ClothingHandsGlovesLatex
|
|
||||||
- ClothingHandsGlovesFingerless
|
|
||||||
- ClothingHandsGlovesColorBlack
|
|
||||||
- ClothingHeadHatBeret
|
|
||||||
- ClothingHeadHatBowlerHat
|
|
||||||
- ClothingHeadHatFedoraBrown
|
|
||||||
- ClothingHeadHatFedoraGrey
|
|
||||||
- ClothingHeadHatFez
|
|
||||||
- ClothingHeadHatPaper
|
|
||||||
- ClothingHeadHatPirate
|
|
||||||
- ClothingHeadHatPirateTricord
|
|
||||||
- ClothingHeadHatTophat
|
|
||||||
- ClothingMaskSterile
|
|
||||||
- ClothingNeckHeadphones
|
|
||||||
- ClothingNeckTieRed
|
|
||||||
- ClothingOuterCoatGentle
|
|
||||||
- ClothingOuterCoatJensen
|
|
||||||
- ClothingEyesGlassesJensen
|
|
||||||
- ClothingOuterCoatLab
|
|
||||||
- ClothingOuterCoatPirate
|
|
||||||
- ClothingOuterHoodieBlack
|
|
||||||
- ClothingOuterHoodieGrey
|
|
||||||
- ClothingOuterFlannelRed
|
|
||||||
- ClothingOuterFlannelBlue
|
|
||||||
- ClothingOuterFlannelGreen
|
|
||||||
- ClothingOuterVestHazard
|
|
||||||
- ClothingShoesBootsJack
|
|
||||||
- ClothingShoesHighheelBoots
|
|
||||||
- ClothingShoesBootsLaceup
|
|
||||||
- ClothingShoesLeather
|
|
||||||
- ClothingShoesBootsSalvage
|
|
||||||
- ClothingShoesBootsWork
|
|
||||||
- ClothingShoesTourist
|
|
||||||
- ClothingUniformJumpsuitLoungewear
|
|
||||||
- ClothingHeadHatCowboyRed
|
|
||||||
- Wristwatch
|
|
||||||
chance: 0.6
|
|
||||||
offset: 0.0
|
|
||||||
|
|
||||||
|
- type: entityTable
|
||||||
|
id: MaintToolsTable
|
||||||
|
table: !type:GroupSelector
|
||||||
|
children:
|
||||||
|
# Common Group
|
||||||
|
- !type:GroupSelector
|
||||||
|
weight: 75
|
||||||
|
children:
|
||||||
|
- !type:EntSelector
|
||||||
|
id: FlashlightLantern
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ToolboxEmergencyFilled
|
||||||
|
- !type:GroupSelector
|
||||||
|
children:
|
||||||
|
- !type:EntSelector
|
||||||
|
id: OxygenTankFilled
|
||||||
|
- !type:EntSelector
|
||||||
|
id: DoubleEmergencyOxygenTankFilled
|
||||||
|
- !type:GroupSelector
|
||||||
|
children:
|
||||||
|
- !type:EntSelector
|
||||||
|
id: NitrogenTankFilled
|
||||||
|
- !type:EntSelector
|
||||||
|
id: DoubleEmergencyNitrogenTankFilled
|
||||||
|
- !type:EntSelector
|
||||||
|
id: EmergencyFunnyOxygenTankFilled
|
||||||
|
weight: 0.5
|
||||||
|
- !type:GroupSelector
|
||||||
|
weight: 3
|
||||||
|
children:
|
||||||
|
- !type:EntSelector
|
||||||
|
id: SheetSteel10
|
||||||
|
- !type:EntSelector
|
||||||
|
id: SheetPlastic10
|
||||||
|
- !type:EntSelector
|
||||||
|
id: SheetGlass10
|
||||||
|
- !type:EntSelector
|
||||||
|
id: PartRodMetal10
|
||||||
|
- !type:EntSelector
|
||||||
|
id: MaterialCardboard10
|
||||||
|
weight: 0.25
|
||||||
|
- !type:EntSelector
|
||||||
|
id: MaterialCloth10
|
||||||
|
weight: 0.25
|
||||||
|
- !type:EntSelector
|
||||||
|
id: MaterialWoodPlank10
|
||||||
|
weight: 0.25
|
||||||
|
- !type:EntSelector
|
||||||
|
id: Plunger
|
||||||
|
- !type:EntSelector
|
||||||
|
id: PowerCellMedium
|
||||||
|
- !type:EntSelector
|
||||||
|
id: PowerCellSmall
|
||||||
|
- !type:EntSelector
|
||||||
|
id: Soap
|
||||||
|
- !type:EntSelector
|
||||||
|
id: Wirecutter
|
||||||
|
- !type:EntSelector
|
||||||
|
id: Screwdriver
|
||||||
|
- !type:EntSelector
|
||||||
|
id: Wrench
|
||||||
|
- !type:EntSelector
|
||||||
|
id: Crowbar
|
||||||
|
- !type:EntSelector
|
||||||
|
id: Multitool
|
||||||
|
- !type:EntSelector
|
||||||
|
id: Shovel
|
||||||
|
- !type:EntSelector
|
||||||
|
id: Welder
|
||||||
|
- !type:EntSelector
|
||||||
|
id: GasAnalyzer
|
||||||
|
- !type:EntSelector
|
||||||
|
id: SprayPainter
|
||||||
|
- !type:EntSelector
|
||||||
|
id: Flare
|
||||||
|
- !type:EntSelector
|
||||||
|
id: Beaker
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingMaskGas
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingMaskBreath
|
||||||
|
- !type:EntSelector
|
||||||
|
id: DoorElectronics
|
||||||
|
- !type:EntSelector
|
||||||
|
id: APCElectronics
|
||||||
|
- !type:EntSelector
|
||||||
|
id: InflatableWallStack5
|
||||||
|
- !type:EntSelector
|
||||||
|
id: CableHVStack10
|
||||||
|
- !type:EntSelector
|
||||||
|
id: CableMVStack10
|
||||||
|
- !type:EntSelector
|
||||||
|
id: CableApcStack10
|
||||||
|
- !type:GroupSelector
|
||||||
|
children:
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingHandsGlovesColorYellowBudget
|
||||||
|
weight: 5
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingHandsGlovesFingerlessInsulated
|
||||||
|
weight: 0.5
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingHandsGlovesColorYellow
|
||||||
|
weight: 1
|
||||||
|
# Uncommon Group
|
||||||
|
- !type:GroupSelector
|
||||||
|
weight: 23
|
||||||
|
children:
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingHeadHatCone
|
||||||
|
weight: 2
|
||||||
|
- !type:EntSelector
|
||||||
|
id: BookRandomStory
|
||||||
|
weight: 0.25
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ToolboxElectricalFilled
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ToolboxMechanicalFilled
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingBeltUtility
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ToolboxArtisticFilled
|
||||||
|
- !type:EntSelector
|
||||||
|
id: GeigerCounter
|
||||||
|
- !type:EntSelector
|
||||||
|
id: trayScanner
|
||||||
|
- !type:EntSelector
|
||||||
|
id: HandheldGPSBasic
|
||||||
|
- !type:EntSelector
|
||||||
|
id: HandLabeler
|
||||||
|
- !type:EntSelector
|
||||||
|
id: GlowstickBase
|
||||||
|
- !type:EntSelector
|
||||||
|
id: Bucket
|
||||||
|
- !type:EntSelector
|
||||||
|
id: RadioHandheld
|
||||||
|
- !type:EntSelector
|
||||||
|
id: AppraisalTool
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ModularReceiver
|
||||||
|
- !type:EntSelector
|
||||||
|
id: WeaponFlareGun
|
||||||
|
- !type:EntSelector
|
||||||
|
id: BarberScissors
|
||||||
|
- !type:GroupSelector
|
||||||
|
children:
|
||||||
|
- !type:EntSelector
|
||||||
|
id: DrinkSpaceGlue
|
||||||
|
- !type:EntSelector
|
||||||
|
id: DrinkSpaceLube
|
||||||
|
# Rare Group
|
||||||
|
- !type:GroupSelector
|
||||||
|
weight: 2
|
||||||
|
children:
|
||||||
|
- !type:EntSelector
|
||||||
|
id: LanternFlash
|
||||||
|
- !type:EntSelector
|
||||||
|
id: PowerCellHigh
|
||||||
|
- !type:EntSelector
|
||||||
|
id: NetProbeCartridge
|
||||||
|
- !type:EntSelector
|
||||||
|
id: WelderIndustrial
|
||||||
|
- !type:EntSelector
|
||||||
|
id: SheetPlasteel10
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ClothingMaskGasExplorer
|
||||||
|
- !type:EntSelector
|
||||||
|
id: TechnologyDisk
|
||||||
|
- !type:EntSelector
|
||||||
|
id: ResearchDisk5000
|
||||||
|
- !type:EntSelector
|
||||||
|
id: PetCarrier
|
||||||
|
- !type:EntSelector
|
||||||
|
id: DrinkMopwataBottleRandom
|
||||||
|
- !type:EntSelector
|
||||||
|
id: LidSalami
|
||||||
|
weight: 0.05
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
name: Maint Loot Spawner
|
name: Maint Loot Spawner
|
||||||
@@ -145,70 +485,75 @@
|
|||||||
- state: red
|
- state: red
|
||||||
- sprite: Objects/Power/power_cells.rsi
|
- sprite: Objects/Power/power_cells.rsi
|
||||||
state: high
|
state: high
|
||||||
- type: RandomSpawner
|
- type: EntityTableSpawner
|
||||||
rarePrototypes:
|
table: !type:NestedSelector
|
||||||
- LanternFlash
|
tableId: MaintToolsTable
|
||||||
- PowerCellHigh
|
prob: 0.6
|
||||||
- NetProbeCartridge
|
|
||||||
- WelderIndustrial
|
- type: entityTable
|
||||||
- SheetPlasteel10
|
id: MaintWeaponTable
|
||||||
- ClothingMaskGasExplorer
|
table: !type:GroupSelector
|
||||||
rareChance: 0.08
|
children:
|
||||||
prototypes:
|
# Common Group
|
||||||
- FlashlightLantern
|
- !type:GroupSelector
|
||||||
- OxygenTankFilled
|
weight: 95
|
||||||
- DoubleEmergencyOxygenTankFilled
|
children:
|
||||||
- ToolboxEmergencyFilled
|
- !type:EntSelector
|
||||||
- ToolboxArtisticFilled
|
id: Machete
|
||||||
- NitrogenTankFilled
|
- !type:EntSelector
|
||||||
- DoubleEmergencyNitrogenTankFilled
|
id: BaseBallBat
|
||||||
- EmergencyFunnyOxygenTankFilled
|
- !type:EntSelector
|
||||||
- ToolboxElectricalFilled
|
id: CombatKnife
|
||||||
- ToolboxMechanicalFilled
|
- !type:EntSelector
|
||||||
- ClothingBeltUtility
|
id: Spear
|
||||||
- Shovel
|
- !type:EntSelector
|
||||||
- Welder
|
id: RifleStock
|
||||||
- WeaponFlareGun
|
- !type:EntSelector
|
||||||
- SheetSteel10
|
id: ModularReceiver
|
||||||
- SheetPlastic10
|
- !type:EntSelector
|
||||||
- SheetGlass10
|
id: HydroponicsToolScythe
|
||||||
- PartRodMetal10
|
# Rare Group
|
||||||
- MaterialCardboard10
|
- !type:GroupSelector
|
||||||
- MaterialCloth10
|
weight: 5
|
||||||
- MaterialWoodPlank10
|
children:
|
||||||
- ResearchDisk
|
- !type:EntSelector
|
||||||
- Plunger
|
id: Lighter
|
||||||
- TechnologyDisk
|
- !type:EntSelector
|
||||||
- PowerCellMedium
|
id: Matchbox
|
||||||
- PowerCellSmall
|
- !type:EntSelector
|
||||||
- Wirecutter
|
id: ClothingEyesBlindfold
|
||||||
- Screwdriver
|
- !type:EntSelector
|
||||||
- Wrench
|
id: ClothingMaskMuzzle
|
||||||
- Crowbar
|
- !type:EntSelector
|
||||||
- NetworkConfigurator
|
id: ClothingMaskGasSecurity
|
||||||
- trayScanner
|
- !type:EntSelector
|
||||||
- GasAnalyzer
|
id: ShardGlass
|
||||||
- SprayPainter
|
weight: 2
|
||||||
- AppraisalTool
|
- !type:EntSelector
|
||||||
- Flare
|
id: Syringe
|
||||||
- HandheldGPSBasic
|
- !type:EntSelector
|
||||||
- HandLabeler
|
id: Mousetrap
|
||||||
- GlowstickBase
|
- !type:GroupSelector
|
||||||
- Bucket
|
weight: 2
|
||||||
- RadioHandheld
|
children:
|
||||||
- GeigerCounter
|
- !type:EntSelector
|
||||||
- Beaker
|
id: Brutepack1
|
||||||
- ClothingMaskGas
|
- !type:EntSelector
|
||||||
- ClothingMaskBreath
|
id: Ointment1
|
||||||
- DoorElectronics
|
- !type:EntSelector
|
||||||
- APCElectronics
|
id: Gauze1
|
||||||
- InflatableWallStack5
|
- !type:EntSelector
|
||||||
- CableHVStack10
|
id: Bola
|
||||||
- CableMVStack10
|
- !type:EntSelector
|
||||||
- CableApcStack10
|
id: SurvivalKnife
|
||||||
- PetCarrier
|
- !type:EntSelector
|
||||||
chance: 0.6
|
id: ScalpelShiv
|
||||||
offset: 0.0
|
- !type:EntSelector
|
||||||
|
id: Shiv
|
||||||
|
- !type:EntSelector
|
||||||
|
id: SawImprov
|
||||||
|
- !type:EntSelector
|
||||||
|
id: HydroponicsToolMiniHoe
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
name: Maint Loot Spawner
|
name: Maint Loot Spawner
|
||||||
@@ -221,46 +566,10 @@
|
|||||||
- state: red
|
- state: red
|
||||||
- sprite: Objects/Weapons/Melee/machete.rsi
|
- sprite: Objects/Weapons/Melee/machete.rsi
|
||||||
state: icon
|
state: icon
|
||||||
- type: RandomSpawner
|
- type: EntityTableSpawner
|
||||||
rarePrototypes:
|
table: !type:NestedSelector
|
||||||
- Machete
|
tableId: MaintWeaponTable
|
||||||
- BaseBallBat
|
prob: 0.6
|
||||||
- CombatKnife
|
|
||||||
- Spear
|
|
||||||
- RifleStock
|
|
||||||
- ModularReceiver
|
|
||||||
- HydroponicsToolScythe
|
|
||||||
rareChance: 0.05
|
|
||||||
prototypes:
|
|
||||||
- FlashlightLantern
|
|
||||||
- OxygenTankFilled
|
|
||||||
- DoubleEmergencyOxygenTankFilled
|
|
||||||
- NitrogenTankFilled
|
|
||||||
- DoubleEmergencyNitrogenTankFilled
|
|
||||||
- Lighter
|
|
||||||
- Matchbox
|
|
||||||
- Crowbar
|
|
||||||
- Shovel
|
|
||||||
- Welder
|
|
||||||
- WeaponFlareGun
|
|
||||||
- LidSalami
|
|
||||||
- ClothingEyesBlindfold
|
|
||||||
- ClothingMaskMuzzle
|
|
||||||
- ClothingMaskGasSecurity
|
|
||||||
- ShardGlass
|
|
||||||
- Syringe
|
|
||||||
- Mousetrap
|
|
||||||
- Brutepack1
|
|
||||||
- Ointment1
|
|
||||||
- Gauze1
|
|
||||||
- Bola
|
|
||||||
- SurvivalKnife
|
|
||||||
- ScalpelShiv
|
|
||||||
- Shiv
|
|
||||||
- SawImprov
|
|
||||||
- HydroponicsToolMiniHoe
|
|
||||||
chance: 0.6
|
|
||||||
offset: 0.0
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
name: Maint Loot Spawner
|
name: Maint Loot Spawner
|
||||||
|
|||||||
Reference in New Issue
Block a user