@@ -9,20 +9,20 @@ namespace Content.Client.Access;
|
||||
|
||||
public sealed class AccessOverlay : Overlay
|
||||
{
|
||||
private const string TextFontPath = "/Fonts/NotoSans/NotoSans-Regular.ttf";
|
||||
private const int TextFontSize = 12;
|
||||
|
||||
private readonly IEntityManager _entityManager;
|
||||
private readonly EntityLookupSystem _lookup;
|
||||
private readonly SharedTransformSystem _xform;
|
||||
private readonly SharedTransformSystem _transformSystem;
|
||||
private readonly Font _font;
|
||||
|
||||
public override OverlaySpace Space => OverlaySpace.ScreenSpace;
|
||||
|
||||
public AccessOverlay(IEntityManager entManager, IResourceCache cache, EntityLookupSystem lookup, SharedTransformSystem xform)
|
||||
public AccessOverlay(IEntityManager entityManager, IResourceCache resourceCache, SharedTransformSystem transformSystem)
|
||||
{
|
||||
_entityManager = entManager;
|
||||
_lookup = lookup;
|
||||
_xform = xform;
|
||||
|
||||
_font = cache.GetFont("/Fonts/NotoSans/NotoSans-Regular.ttf", 12);
|
||||
_entityManager = entityManager;
|
||||
_transformSystem = transformSystem;
|
||||
_font = resourceCache.GetFont(TextFontPath, TextFontSize);
|
||||
}
|
||||
|
||||
protected override void Draw(in OverlayDrawArgs args)
|
||||
@@ -30,52 +30,65 @@ public sealed class AccessOverlay : Overlay
|
||||
if (args.ViewportControl == null)
|
||||
return;
|
||||
|
||||
var readerQuery = _entityManager.GetEntityQuery<AccessReaderComponent>();
|
||||
var xformQuery = _entityManager.GetEntityQuery<TransformComponent>();
|
||||
|
||||
foreach (var ent in _lookup.GetEntitiesIntersecting(args.MapId, args.WorldAABB,
|
||||
LookupFlags.Static | LookupFlags.Approximate))
|
||||
var textBuffer = new StringBuilder();
|
||||
var query = _entityManager.EntityQueryEnumerator<AccessReaderComponent, TransformComponent>();
|
||||
while (query.MoveNext(out var uid, out var accessReader, out var transform))
|
||||
{
|
||||
if (!readerQuery.TryGetComponent(ent, out var reader) ||
|
||||
!xformQuery.TryGetComponent(ent, out var xform))
|
||||
textBuffer.Clear();
|
||||
|
||||
var entityName = _entityManager.ToPrettyString(uid);
|
||||
textBuffer.AppendLine(entityName.Prototype);
|
||||
textBuffer.Append("UID: ");
|
||||
textBuffer.Append(entityName.Uid.Id);
|
||||
textBuffer.Append(", NUID: ");
|
||||
textBuffer.Append(entityName.Nuid.Id);
|
||||
textBuffer.AppendLine();
|
||||
|
||||
if (!accessReader.Enabled)
|
||||
{
|
||||
textBuffer.AppendLine("-Disabled");
|
||||
continue;
|
||||
}
|
||||
|
||||
var text = new StringBuilder();
|
||||
var index = 0;
|
||||
var a = $"{_entityManager.ToPrettyString(ent)}";
|
||||
text.Append(a);
|
||||
|
||||
foreach (var list in reader.AccessLists)
|
||||
if (accessReader.AccessLists.Count > 0)
|
||||
{
|
||||
a = $"Tag {index}";
|
||||
text.AppendLine(a);
|
||||
|
||||
foreach (var entry in list)
|
||||
var groupNumber = 0;
|
||||
foreach (var accessList in accessReader.AccessLists)
|
||||
{
|
||||
a = $"- {entry}";
|
||||
text.AppendLine(a);
|
||||
groupNumber++;
|
||||
foreach (var entry in accessList)
|
||||
{
|
||||
textBuffer.Append("+Set ");
|
||||
textBuffer.Append(groupNumber);
|
||||
textBuffer.Append(": ");
|
||||
textBuffer.Append(entry.Id);
|
||||
textBuffer.AppendLine();
|
||||
}
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
string textStr;
|
||||
|
||||
if (text.Length >= 2)
|
||||
{
|
||||
textStr = text.ToString();
|
||||
textStr = textStr[..^2];
|
||||
}
|
||||
else
|
||||
{
|
||||
textStr = "";
|
||||
textBuffer.AppendLine("+Unrestricted");
|
||||
}
|
||||
|
||||
var screenPos = args.ViewportControl.WorldToScreen(_xform.GetWorldPosition(xform));
|
||||
foreach (var key in accessReader.AccessKeys)
|
||||
{
|
||||
textBuffer.Append("+Key ");
|
||||
textBuffer.Append(key.OriginStation);
|
||||
textBuffer.Append(": ");
|
||||
textBuffer.Append(key.Id);
|
||||
textBuffer.AppendLine();
|
||||
}
|
||||
|
||||
args.ScreenHandle.DrawString(_font, screenPos, textStr, Color.Gold);
|
||||
foreach (var tag in accessReader.DenyTags)
|
||||
{
|
||||
textBuffer.Append("-Tag ");
|
||||
textBuffer.AppendLine(tag.Id);
|
||||
}
|
||||
|
||||
var accessInfoText = textBuffer.ToString();
|
||||
var screenPos = args.ViewportControl.WorldToScreen(_transformSystem.GetWorldPosition(transform));
|
||||
args.ScreenHandle.DrawString(_font, screenPos, accessInfoText, Color.Gold);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,8 +7,16 @@ namespace Content.Client.Access.Commands;
|
||||
public sealed class ShowAccessReadersCommand : IConsoleCommand
|
||||
{
|
||||
public string Command => "showaccessreaders";
|
||||
public string Description => "Shows all access readers in the viewport";
|
||||
public string Help => $"{Command}";
|
||||
|
||||
public string Description => "Toggles showing access reader permissions on the map";
|
||||
public string Help => """
|
||||
Overlay Info:
|
||||
-Disabled | The access reader is disabled
|
||||
+Unrestricted | The access reader has no restrictions
|
||||
+Set [Index]: [Tag Name]| A tag in an access set (accessor needs all tags in the set to be allowed by the set)
|
||||
+Key [StationUid]: [StationRecordKeyId] | A StationRecordKey that is allowed
|
||||
-Tag [Tag Name] | A tag that is not allowed (takes priority over other allows)
|
||||
""";
|
||||
public void Execute(IConsoleShell shell, string argStr, string[] args)
|
||||
{
|
||||
var collection = IoCManager.Instance;
|
||||
@@ -26,10 +34,9 @@ public sealed class ShowAccessReadersCommand : IConsoleCommand
|
||||
|
||||
var entManager = collection.Resolve<IEntityManager>();
|
||||
var cache = collection.Resolve<IResourceCache>();
|
||||
var lookup = entManager.System<EntityLookupSystem>();
|
||||
var xform = entManager.System<SharedTransformSystem>();
|
||||
|
||||
overlay.AddOverlay(new AccessOverlay(entManager, cache, lookup, xform));
|
||||
overlay.AddOverlay(new AccessOverlay(entManager, cache, xform));
|
||||
shell.WriteLine($"Set access reader debug overlay to true");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,6 +27,11 @@ public sealed class CargoBountyConsoleBoundUserInterface : BoundUserInterface
|
||||
SendMessage(new BountyPrintLabelMessage(id));
|
||||
};
|
||||
|
||||
_menu.OnSkipButtonPressed += id =>
|
||||
{
|
||||
SendMessage(new BountySkipMessage(id));
|
||||
};
|
||||
|
||||
_menu.OpenCentered();
|
||||
}
|
||||
|
||||
@@ -37,7 +42,7 @@ public sealed class CargoBountyConsoleBoundUserInterface : BoundUserInterface
|
||||
if (message is not CargoBountyConsoleState state)
|
||||
return;
|
||||
|
||||
_menu?.UpdateEntries(state.Bounties);
|
||||
_menu?.UpdateEntries(state.Bounties, state.UntilNextSkip);
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
|
||||
@@ -13,7 +13,18 @@
|
||||
</BoxContainer>
|
||||
<Control MinWidth="10"/>
|
||||
<BoxContainer Orientation="Vertical" MinWidth="120">
|
||||
<Button Name="PrintButton" Text="{Loc 'bounty-console-label-button-text'}" HorizontalExpand="False" HorizontalAlignment="Right"/>
|
||||
<BoxContainer Orientation="Horizontal" MinWidth="120">
|
||||
<Button Name="PrintButton"
|
||||
Text="{Loc 'bounty-console-label-button-text'}"
|
||||
HorizontalExpand="False"
|
||||
HorizontalAlignment="Right"
|
||||
StyleClasses="OpenRight"/>
|
||||
<Button Name="SkipButton"
|
||||
Text="{Loc 'bounty-console-skip-button-text'}"
|
||||
HorizontalExpand="False"
|
||||
HorizontalAlignment="Right"
|
||||
StyleClasses="OpenLeft"/>
|
||||
</BoxContainer>
|
||||
<RichTextLabel Name="IdLabel" HorizontalAlignment="Right" Margin="0 0 5 0"/>
|
||||
</BoxContainer>
|
||||
</BoxContainer>
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
using Content.Client.Message;
|
||||
using Content.Shared.Cargo;
|
||||
using Content.Shared.Cargo.Prototypes;
|
||||
using Content.Shared.Random;
|
||||
using Robust.Client.AutoGenerated;
|
||||
using Robust.Client.UserInterface.Controls;
|
||||
using Robust.Client.UserInterface.XAML;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Timing;
|
||||
using Serilog;
|
||||
|
||||
namespace Content.Client.Cargo.UI;
|
||||
|
||||
@@ -14,15 +16,19 @@ public sealed partial class BountyEntry : BoxContainer
|
||||
{
|
||||
[Dependency] private readonly IPrototypeManager _prototype = default!;
|
||||
|
||||
public Action? OnButtonPressed;
|
||||
public Action? OnLabelButtonPressed;
|
||||
public Action? OnSkipButtonPressed;
|
||||
|
||||
public TimeSpan EndTime;
|
||||
public TimeSpan UntilNextSkip;
|
||||
|
||||
public BountyEntry(CargoBountyData bounty)
|
||||
public BountyEntry(CargoBountyData bounty, TimeSpan untilNextSkip)
|
||||
{
|
||||
RobustXamlLoader.Load(this);
|
||||
IoCManager.InjectDependencies(this);
|
||||
|
||||
UntilNextSkip = untilNextSkip;
|
||||
|
||||
if (!_prototype.TryIndex<CargoBountyPrototype>(bounty.Bounty, out var bountyPrototype))
|
||||
return;
|
||||
|
||||
@@ -38,6 +44,27 @@ public sealed partial class BountyEntry : BoxContainer
|
||||
DescriptionLabel.SetMarkup(Loc.GetString("bounty-console-description-label", ("description", Loc.GetString(bountyPrototype.Description))));
|
||||
IdLabel.SetMarkup(Loc.GetString("bounty-console-id-label", ("id", bounty.Id)));
|
||||
|
||||
PrintButton.OnPressed += _ => OnButtonPressed?.Invoke();
|
||||
PrintButton.OnPressed += _ => OnLabelButtonPressed?.Invoke();
|
||||
SkipButton.OnPressed += _ => OnSkipButtonPressed?.Invoke();
|
||||
}
|
||||
|
||||
private void UpdateSkipButton(float deltaSeconds)
|
||||
{
|
||||
UntilNextSkip -= TimeSpan.FromSeconds(deltaSeconds);
|
||||
if (UntilNextSkip > TimeSpan.Zero)
|
||||
{
|
||||
SkipButton.Label.Text = UntilNextSkip.ToString("mm\\:ss");
|
||||
SkipButton.Disabled = true;
|
||||
return;
|
||||
}
|
||||
|
||||
SkipButton.Label.Text = Loc.GetString("bounty-console-skip-button-text");
|
||||
SkipButton.Disabled = false;
|
||||
}
|
||||
|
||||
protected override void FrameUpdate(FrameEventArgs args)
|
||||
{
|
||||
base.FrameUpdate(args);
|
||||
UpdateSkipButton(args.DeltaSeconds);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,19 +10,21 @@ namespace Content.Client.Cargo.UI;
|
||||
public sealed partial class CargoBountyMenu : FancyWindow
|
||||
{
|
||||
public Action<string>? OnLabelButtonPressed;
|
||||
public Action<string>? OnSkipButtonPressed;
|
||||
|
||||
public CargoBountyMenu()
|
||||
{
|
||||
RobustXamlLoader.Load(this);
|
||||
}
|
||||
|
||||
public void UpdateEntries(List<CargoBountyData> bounties)
|
||||
public void UpdateEntries(List<CargoBountyData> bounties, TimeSpan untilNextSkip)
|
||||
{
|
||||
BountyEntriesContainer.Children.Clear();
|
||||
foreach (var b in bounties)
|
||||
{
|
||||
var entry = new BountyEntry(b);
|
||||
entry.OnButtonPressed += () => OnLabelButtonPressed?.Invoke(b.Id);
|
||||
var entry = new BountyEntry(b, untilNextSkip);
|
||||
entry.OnLabelButtonPressed += () => OnLabelButtonPressed?.Invoke(b.Id);
|
||||
entry.OnSkipButtonPressed += () => OnSkipButtonPressed?.Invoke(b.Id);
|
||||
|
||||
BountyEntriesContainer.AddChild(entry);
|
||||
}
|
||||
|
||||
@@ -104,41 +104,12 @@ public sealed partial class LatheMenu : DefaultWindow
|
||||
RecipeList.Children.Clear();
|
||||
foreach (var prototype in sortedRecipesToShow)
|
||||
{
|
||||
StringBuilder sb = new();
|
||||
var first = true;
|
||||
foreach (var (id, amount) in prototype.RequiredMaterials)
|
||||
{
|
||||
if (!_prototypeManager.TryIndex<MaterialPrototype>(id, out var proto))
|
||||
continue;
|
||||
|
||||
if (first)
|
||||
first = false;
|
||||
else
|
||||
sb.Append('\n');
|
||||
|
||||
var adjustedAmount = SharedLatheSystem.AdjustMaterial(amount, prototype.ApplyMaterialDiscount, component.MaterialUseMultiplier);
|
||||
var sheetVolume = _materialStorage.GetSheetVolume(proto);
|
||||
|
||||
var unit = Loc.GetString(proto.Unit);
|
||||
// rounded in locale not here
|
||||
var sheets = adjustedAmount / (float) sheetVolume;
|
||||
var amountText = Loc.GetString("lathe-menu-material-amount", ("amount", sheets), ("unit", unit));
|
||||
var name = Loc.GetString(proto.Name);
|
||||
sb.Append(Loc.GetString("lathe-menu-tooltip-display", ("material", name), ("amount", amountText)));
|
||||
}
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(prototype.Description))
|
||||
{
|
||||
sb.Append('\n');
|
||||
sb.Append(Loc.GetString("lathe-menu-description-display", ("description", prototype.Description)));
|
||||
}
|
||||
|
||||
var icon = prototype.Icon == null
|
||||
? _spriteSystem.GetPrototypeIcon(prototype.Result).Default
|
||||
: _spriteSystem.Frame0(prototype.Icon);
|
||||
var canProduce = _lathe.CanProduce(_owner, prototype, quantity);
|
||||
|
||||
var control = new RecipeControl(prototype, sb.ToString(), canProduce, icon);
|
||||
var control = new RecipeControl(prototype, () => GenerateTooltipText(prototype), canProduce, icon);
|
||||
control.OnButtonPressed += s =>
|
||||
{
|
||||
if (!int.TryParse(AmountLineEdit.Text, out var amount) || amount <= 0)
|
||||
@@ -149,6 +120,51 @@ public sealed partial class LatheMenu : DefaultWindow
|
||||
}
|
||||
}
|
||||
|
||||
private string GenerateTooltipText(LatheRecipePrototype prototype)
|
||||
{
|
||||
StringBuilder sb = new();
|
||||
|
||||
foreach (var (id, amount) in prototype.RequiredMaterials)
|
||||
{
|
||||
if (!_prototypeManager.TryIndex<MaterialPrototype>(id, out var proto))
|
||||
continue;
|
||||
|
||||
var adjustedAmount = SharedLatheSystem.AdjustMaterial(amount, prototype.ApplyMaterialDiscount, _entityManager.GetComponent<LatheComponent>(_owner).MaterialUseMultiplier);
|
||||
var sheetVolume = _materialStorage.GetSheetVolume(proto);
|
||||
|
||||
var unit = Loc.GetString(proto.Unit);
|
||||
var sheets = adjustedAmount / (float) sheetVolume;
|
||||
|
||||
var availableAmount = _materialStorage.GetMaterialAmount(_owner, id);
|
||||
var missingAmount = Math.Max(0, adjustedAmount - availableAmount);
|
||||
var missingSheets = missingAmount / (float) sheetVolume;
|
||||
|
||||
var name = Loc.GetString(proto.Name);
|
||||
|
||||
string tooltipText;
|
||||
if (missingSheets > 0)
|
||||
{
|
||||
tooltipText = Loc.GetString("lathe-menu-material-amount-missing", ("amount", sheets), ("missingAmount", missingSheets), ("unit", unit), ("material", name));
|
||||
}
|
||||
else
|
||||
{
|
||||
var amountText = Loc.GetString("lathe-menu-material-amount", ("amount", sheets), ("unit", unit));
|
||||
tooltipText = Loc.GetString("lathe-menu-tooltip-display", ("material", name), ("amount", amountText));
|
||||
}
|
||||
|
||||
sb.AppendLine(tooltipText);
|
||||
}
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(prototype.Description))
|
||||
sb.AppendLine(Loc.GetString("lathe-menu-description-display", ("description", prototype.Description)));
|
||||
|
||||
// Remove last newline
|
||||
if (sb.Length > 0)
|
||||
sb.Remove(sb.Length - 1, 1);
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
public void UpdateCategories()
|
||||
{
|
||||
var currentCategories = new List<ProtoId<LatheCategoryPrototype>>();
|
||||
|
||||
@@ -11,17 +11,16 @@ namespace Content.Client.Lathe.UI;
|
||||
public sealed partial class RecipeControl : Control
|
||||
{
|
||||
public Action<string>? OnButtonPressed;
|
||||
public Func<string> TooltipTextSupplier;
|
||||
|
||||
public string TooltipText;
|
||||
|
||||
public RecipeControl(LatheRecipePrototype recipe, string tooltip, bool canProduce, Texture? texture = null)
|
||||
public RecipeControl(LatheRecipePrototype recipe, Func<string> tooltipTextSupplier, bool canProduce, Texture? texture = null)
|
||||
{
|
||||
RobustXamlLoader.Load(this);
|
||||
|
||||
RecipeName.Text = recipe.Name;
|
||||
RecipeTexture.Texture = texture;
|
||||
Button.Disabled = !canProduce;
|
||||
TooltipText = tooltip;
|
||||
TooltipTextSupplier = tooltipTextSupplier;
|
||||
Button.TooltipSupplier = SupplyTooltip;
|
||||
|
||||
Button.OnPressed += (_) =>
|
||||
@@ -32,6 +31,6 @@ public sealed partial class RecipeControl : Control
|
||||
|
||||
private Control? SupplyTooltip(Control sender)
|
||||
{
|
||||
return new RecipeTooltip(TooltipText);
|
||||
return new RecipeTooltip(TooltipTextSupplier());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
using Content.Client.UserInterface.Controls;
|
||||
using Content.Shared.Popups;
|
||||
using Content.Shared.RCD;
|
||||
using Content.Shared.RCD.Components;
|
||||
using Robust.Client.AutoGenerated;
|
||||
using Robust.Client.GameObjects;
|
||||
using Robust.Client.Player;
|
||||
using Robust.Client.UserInterface;
|
||||
using Robust.Client.UserInterface.Controls;
|
||||
using Robust.Client.UserInterface.XAML;
|
||||
@@ -16,17 +18,24 @@ public sealed partial class RCDMenu : RadialMenu
|
||||
{
|
||||
[Dependency] private readonly EntityManager _entManager = default!;
|
||||
[Dependency] private readonly IPrototypeManager _protoManager = default!;
|
||||
[Dependency] private readonly IPlayerManager _playerManager = default!;
|
||||
|
||||
private readonly SpriteSystem _spriteSystem;
|
||||
private readonly SharedPopupSystem _popup;
|
||||
|
||||
public event Action<ProtoId<RCDPrototype>>? SendRCDSystemMessageAction;
|
||||
|
||||
private EntityUid _owner;
|
||||
|
||||
public RCDMenu(EntityUid owner, RCDMenuBoundUserInterface bui)
|
||||
{
|
||||
IoCManager.InjectDependencies(this);
|
||||
RobustXamlLoader.Load(this);
|
||||
|
||||
_spriteSystem = _entManager.System<SpriteSystem>();
|
||||
_popup = _entManager.System<SharedPopupSystem>();
|
||||
|
||||
_owner = owner;
|
||||
|
||||
// Find the main radial container
|
||||
var main = FindControl<RadialContainer>("Main");
|
||||
@@ -51,14 +60,21 @@ public sealed partial class RCDMenu : RadialMenu
|
||||
if (parent == null)
|
||||
continue;
|
||||
|
||||
var name = Loc.GetString(proto.SetName);
|
||||
name = char.ToUpper(name[0]) + name.Remove(0, 1);
|
||||
var tooltip = Loc.GetString(proto.SetName);
|
||||
|
||||
if ((proto.Mode == RcdMode.ConstructTile || proto.Mode == RcdMode.ConstructObject) &&
|
||||
proto.Prototype != null && _protoManager.TryIndex(proto.Prototype, out var entProto))
|
||||
{
|
||||
tooltip = Loc.GetString(entProto.Name);
|
||||
}
|
||||
|
||||
tooltip = char.ToUpper(tooltip[0]) + tooltip.Remove(0, 1);
|
||||
|
||||
var button = new RCDMenuButton()
|
||||
{
|
||||
StyleClasses = { "RadialMenuButton" },
|
||||
SetSize = new Vector2(64f, 64f),
|
||||
ToolTip = name,
|
||||
ToolTip = tooltip,
|
||||
ProtoId = protoId,
|
||||
};
|
||||
|
||||
@@ -120,6 +136,27 @@ public sealed partial class RCDMenu : RadialMenu
|
||||
castChild.OnButtonUp += _ =>
|
||||
{
|
||||
SendRCDSystemMessageAction?.Invoke(castChild.ProtoId);
|
||||
|
||||
if (_playerManager.LocalSession?.AttachedEntity != null &&
|
||||
_protoManager.TryIndex(castChild.ProtoId, out var proto))
|
||||
{
|
||||
var msg = Loc.GetString("rcd-component-change-mode", ("mode", Loc.GetString(proto.SetName)));
|
||||
|
||||
if (proto.Mode == RcdMode.ConstructTile || proto.Mode == RcdMode.ConstructObject)
|
||||
{
|
||||
var name = Loc.GetString(proto.SetName);
|
||||
|
||||
if (proto.Prototype != null &&
|
||||
_protoManager.TryIndex(proto.Prototype, out var entProto))
|
||||
name = entProto.Name;
|
||||
|
||||
msg = Loc.GetString("rcd-component-change-build-mode", ("name", name));
|
||||
}
|
||||
|
||||
// Popup message
|
||||
_popup.PopupClient(msg, _owner, _playerManager.LocalSession.AttachedEntity);
|
||||
}
|
||||
|
||||
Close();
|
||||
};
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ public sealed class CraftingTests : InteractionTest
|
||||
|
||||
// Player's hands should be full of the remaining rods, except those dropped during the failed crafting attempt.
|
||||
// Spear and left over stacks should be on the floor.
|
||||
await AssertEntityLookup((Rod, 2), (Cable, 8), (ShardGlass, 2), (Spear, 1));
|
||||
await AssertEntityLookup((Rod, 2), (Cable, 7), (ShardGlass, 2), (Spear, 1));
|
||||
}
|
||||
|
||||
// The following is wrapped in an if DEBUG. This is because of cursed state handling bugs. Tests don't (de)serialize
|
||||
@@ -100,7 +100,7 @@ public sealed class CraftingTests : InteractionTest
|
||||
Assert.That(sys.IsEntityInContainer(rods), Is.False);
|
||||
Assert.That(sys.IsEntityInContainer(wires), Is.False);
|
||||
Assert.That(rodStack, Has.Count.EqualTo(8));
|
||||
Assert.That(wireStack, Has.Count.EqualTo(8));
|
||||
Assert.That(wireStack, Has.Count.EqualTo(7));
|
||||
|
||||
await FindEntity(Spear, shouldSucceed: false);
|
||||
});
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using Content.Shared.Cargo;
|
||||
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
|
||||
|
||||
namespace Content.Server.Cargo.Components;
|
||||
|
||||
@@ -32,4 +33,16 @@ public sealed partial class StationCargoBountyDatabaseComponent : Component
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public HashSet<string> CheckedBounties = new();
|
||||
|
||||
/// <summary>
|
||||
/// The time at which players will be able to skip the next bounty.
|
||||
/// </summary>
|
||||
[DataField(customTypeSerializer: typeof(TimeOffsetSerializer))]
|
||||
public TimeSpan NextSkipTime = TimeSpan.Zero;
|
||||
|
||||
/// <summary>
|
||||
/// The time between skipping bounties.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public TimeSpan SkipDelay = TimeSpan.FromMinutes(15);
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ using Content.Server.Cargo.Components;
|
||||
using Content.Server.Labels;
|
||||
using Content.Server.NameIdentifier;
|
||||
using Content.Server.Paper;
|
||||
using Content.Server.Station.Systems;
|
||||
using Content.Shared.Access.Components;
|
||||
using Content.Shared.Cargo;
|
||||
using Content.Shared.Cargo.Components;
|
||||
using Content.Shared.Cargo.Prototypes;
|
||||
@@ -35,6 +35,7 @@ public sealed partial class CargoSystem
|
||||
{
|
||||
SubscribeLocalEvent<CargoBountyConsoleComponent, BoundUIOpenedEvent>(OnBountyConsoleOpened);
|
||||
SubscribeLocalEvent<CargoBountyConsoleComponent, BountyPrintLabelMessage>(OnPrintLabelMessage);
|
||||
SubscribeLocalEvent<CargoBountyConsoleComponent, BountySkipMessage>(OnSkipBountyMessage);
|
||||
SubscribeLocalEvent<CargoBountyLabelComponent, PriceCalculationEvent>(OnGetBountyPrice);
|
||||
SubscribeLocalEvent<EntitySoldEvent>(OnSold);
|
||||
SubscribeLocalEvent<StationCargoBountyDatabaseComponent, MapInitEvent>(OnMapInit);
|
||||
@@ -50,7 +51,8 @@ public sealed partial class CargoSystem
|
||||
!TryComp<StationCargoBountyDatabaseComponent>(station, out var bountyDb))
|
||||
return;
|
||||
|
||||
_uiSystem.TrySetUiState(uid, CargoConsoleUiKey.Bounty, new CargoBountyConsoleState(bountyDb.Bounties));
|
||||
var untilNextSkip = bountyDb.NextSkipTime - _timing.CurTime;
|
||||
_uiSystem.TrySetUiState(uid, CargoConsoleUiKey.Bounty, new CargoBountyConsoleState(bountyDb.Bounties, untilNextSkip));
|
||||
}
|
||||
|
||||
private void OnPrintLabelMessage(EntityUid uid, CargoBountyConsoleComponent component, BountyPrintLabelMessage args)
|
||||
@@ -70,6 +72,37 @@ public sealed partial class CargoSystem
|
||||
_audio.PlayPvs(component.PrintSound, uid);
|
||||
}
|
||||
|
||||
private void OnSkipBountyMessage(EntityUid uid, CargoBountyConsoleComponent component, BountySkipMessage args)
|
||||
{
|
||||
if (_station.GetOwningStation(uid) is not { } station || !TryComp<StationCargoBountyDatabaseComponent>(station, out var db))
|
||||
return;
|
||||
|
||||
if (_timing.CurTime < db.NextSkipTime)
|
||||
return;
|
||||
|
||||
if (!TryGetBountyFromId(station, args.BountyId, out var bounty))
|
||||
return;
|
||||
|
||||
if (args.Session.AttachedEntity is not { Valid: true } mob)
|
||||
return;
|
||||
|
||||
if (TryComp<AccessReaderComponent>(uid, out var accessReaderComponent) &&
|
||||
!_accessReaderSystem.IsAllowed(mob, uid, accessReaderComponent))
|
||||
{
|
||||
_audio.PlayPvs(component.DenySound, uid);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!TryRemoveBounty(station, bounty.Value))
|
||||
return;
|
||||
|
||||
FillBountyDatabase(station);
|
||||
db.NextSkipTime = _timing.CurTime + db.SkipDelay;
|
||||
var untilNextSkip = db.NextSkipTime - _timing.CurTime;
|
||||
_uiSystem.TrySetUiState(uid, CargoConsoleUiKey.Bounty, new CargoBountyConsoleState(db.Bounties, untilNextSkip));
|
||||
_audio.PlayPvs(component.SkipSound, uid);
|
||||
}
|
||||
|
||||
public void SetupBountyLabel(EntityUid uid, EntityUid stationId, CargoBountyData bounty, PaperComponent? paper = null, CargoBountyLabelComponent? label = null)
|
||||
{
|
||||
if (!Resolve(uid, ref paper, ref label) || !_protoMan.TryIndex<CargoBountyPrototype>(bounty.Bounty, out var prototype))
|
||||
@@ -431,7 +464,8 @@ public sealed partial class CargoSystem
|
||||
!TryComp<StationCargoBountyDatabaseComponent>(station, out var db))
|
||||
continue;
|
||||
|
||||
_uiSystem.TrySetUiState(uid, CargoConsoleUiKey.Bounty, new CargoBountyConsoleState(db.Bounties), ui: ui);
|
||||
var untilNextSkip = db.NextSkipTime - _timing.CurTime;
|
||||
_uiSystem.TrySetUiState(uid, CargoConsoleUiKey.Bounty, new CargoBountyConsoleState(db.Bounties, untilNextSkip), ui: ui);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using System.Collections.Immutable;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text.Json.Nodes;
|
||||
using System.Threading.Tasks;
|
||||
using Content.Server.Database;
|
||||
@@ -10,6 +11,7 @@ using Content.Shared.Players.PlayTimeTracking;
|
||||
using Robust.Server.Player;
|
||||
using Robust.Shared.Configuration;
|
||||
using Robust.Shared.Network;
|
||||
using Robust.Shared.Timing;
|
||||
|
||||
|
||||
namespace Content.Server.Connection
|
||||
@@ -17,6 +19,18 @@ namespace Content.Server.Connection
|
||||
public interface IConnectionManager
|
||||
{
|
||||
void Initialize();
|
||||
|
||||
/// <summary>
|
||||
/// Temporarily allow a user to bypass regular connection requirements.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// The specified user will be allowed to bypass regular player cap,
|
||||
/// whitelist and panic bunker restrictions for <paramref name="duration"/>.
|
||||
/// Bans are not bypassed.
|
||||
/// </remarks>
|
||||
/// <param name="user">The user to give a temporary bypass.</param>
|
||||
/// <param name="duration">How long the bypass should last for.</param>
|
||||
void AddTemporaryConnectBypass(NetUserId user, TimeSpan duration);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -31,15 +45,31 @@ namespace Content.Server.Connection
|
||||
[Dependency] private readonly IConfigurationManager _cfg = default!;
|
||||
[Dependency] private readonly ILocalizationManager _loc = default!;
|
||||
[Dependency] private readonly ServerDbEntryManager _serverDbEntry = default!;
|
||||
[Dependency] private readonly IGameTiming _gameTiming = default!;
|
||||
[Dependency] private readonly ILogManager _logManager = default!;
|
||||
|
||||
private readonly Dictionary<NetUserId, TimeSpan> _temporaryBypasses = [];
|
||||
private ISawmill _sawmill = default!;
|
||||
|
||||
public void Initialize()
|
||||
{
|
||||
_sawmill = _logManager.GetSawmill("connections");
|
||||
|
||||
_netMgr.Connecting += NetMgrOnConnecting;
|
||||
_netMgr.AssignUserIdCallback = AssignUserIdCallback;
|
||||
// Approval-based IP bans disabled because they don't play well with Happy Eyeballs.
|
||||
// _netMgr.HandleApprovalCallback = HandleApproval;
|
||||
}
|
||||
|
||||
public void AddTemporaryConnectBypass(NetUserId user, TimeSpan duration)
|
||||
{
|
||||
ref var time = ref CollectionsMarshal.GetValueRefOrAddDefault(_temporaryBypasses, user, out _);
|
||||
var newTime = _gameTiming.RealTime + duration;
|
||||
// Make sure we only update the time if we wouldn't shrink it.
|
||||
if (newTime > time)
|
||||
time = newTime;
|
||||
}
|
||||
|
||||
/*
|
||||
private async Task<NetApproval> HandleApproval(NetApprovalEventArgs eventArgs)
|
||||
{
|
||||
@@ -109,6 +139,20 @@ namespace Content.Server.Connection
|
||||
hwId = null;
|
||||
}
|
||||
|
||||
var bans = await _db.GetServerBansAsync(addr, userId, hwId, includeUnbanned: false);
|
||||
if (bans.Count > 0)
|
||||
{
|
||||
var firstBan = bans[0];
|
||||
var message = firstBan.FormatBanMessage(_cfg, _loc);
|
||||
return (ConnectionDenyReason.Ban, message, bans);
|
||||
}
|
||||
|
||||
if (HasTemporaryBypass(userId))
|
||||
{
|
||||
_sawmill.Verbose("User {UserId} has temporary bypass, skipping further connection checks", userId);
|
||||
return null;
|
||||
}
|
||||
|
||||
var adminData = await _dbManager.GetAdminDataForAsync(e.UserId);
|
||||
|
||||
if (_cfg.GetCVar(CCVars.PanicBunkerEnabled) && adminData == null)
|
||||
@@ -167,14 +211,6 @@ namespace Content.Server.Connection
|
||||
return (ConnectionDenyReason.Full, Loc.GetString("soft-player-cap-full"), null);
|
||||
}
|
||||
|
||||
var bans = await _db.GetServerBansAsync(addr, userId, hwId, includeUnbanned: false);
|
||||
if (bans.Count > 0)
|
||||
{
|
||||
var firstBan = bans[0];
|
||||
var message = firstBan.FormatBanMessage(_cfg, _loc);
|
||||
return (ConnectionDenyReason.Ban, message, bans);
|
||||
}
|
||||
|
||||
if (_cfg.GetCVar(CCVars.WhitelistEnabled))
|
||||
{
|
||||
var min = _cfg.GetCVar(CCVars.WhitelistMinPlayers);
|
||||
@@ -195,6 +231,11 @@ namespace Content.Server.Connection
|
||||
return null;
|
||||
}
|
||||
|
||||
private bool HasTemporaryBypass(NetUserId user)
|
||||
{
|
||||
return _temporaryBypasses.TryGetValue(user, out var time) && time > _gameTiming.RealTime;
|
||||
}
|
||||
|
||||
private async Task<NetUserId?> AssignUserIdCallback(string name)
|
||||
{
|
||||
if (!_cfg.GetCVar(CCVars.GamePersistGuests))
|
||||
|
||||
60
Content.Server/Connection/GrantConnectBypassCommand.cs
Normal file
60
Content.Server/Connection/GrantConnectBypassCommand.cs
Normal file
@@ -0,0 +1,60 @@
|
||||
using Content.Server.Administration;
|
||||
using Content.Shared.Administration;
|
||||
using Robust.Shared.Console;
|
||||
|
||||
namespace Content.Server.Connection;
|
||||
|
||||
[AdminCommand(AdminFlags.Admin)]
|
||||
public sealed class GrantConnectBypassCommand : LocalizedCommands
|
||||
{
|
||||
private static readonly TimeSpan DefaultDuration = TimeSpan.FromHours(1);
|
||||
|
||||
[Dependency] private readonly IPlayerLocator _playerLocator = default!;
|
||||
[Dependency] private readonly IConnectionManager _connectionManager = default!;
|
||||
|
||||
public override string Command => "grant_connect_bypass";
|
||||
|
||||
public override async void Execute(IConsoleShell shell, string argStr, string[] args)
|
||||
{
|
||||
if (args.Length is not (1 or 2))
|
||||
{
|
||||
shell.WriteError(Loc.GetString("cmd-grant_connect_bypass-invalid-args"));
|
||||
return;
|
||||
}
|
||||
|
||||
var argPlayer = args[0];
|
||||
var info = await _playerLocator.LookupIdByNameOrIdAsync(argPlayer);
|
||||
if (info == null)
|
||||
{
|
||||
shell.WriteError(Loc.GetString("cmd-grant_connect_bypass-unknown-user", ("user", argPlayer)));
|
||||
return;
|
||||
}
|
||||
|
||||
var duration = DefaultDuration;
|
||||
if (args.Length > 1)
|
||||
{
|
||||
var argDuration = args[2];
|
||||
if (!uint.TryParse(argDuration, out var minutes))
|
||||
{
|
||||
shell.WriteLine(Loc.GetString("cmd-grant_connect_bypass-invalid-duration", ("duration", argDuration)));
|
||||
return;
|
||||
}
|
||||
|
||||
duration = TimeSpan.FromMinutes(minutes);
|
||||
}
|
||||
|
||||
_connectionManager.AddTemporaryConnectBypass(info.UserId, duration);
|
||||
shell.WriteLine(Loc.GetString("cmd-grant_connect_bypass-success", ("user", argPlayer)));
|
||||
}
|
||||
|
||||
public override CompletionResult GetCompletion(IConsoleShell shell, string[] args)
|
||||
{
|
||||
if (args.Length == 1)
|
||||
return CompletionResult.FromHint(Loc.GetString("cmd-grant_connect_bypass-arg-user"));
|
||||
|
||||
if (args.Length == 2)
|
||||
return CompletionResult.FromHint(Loc.GetString("cmd-grant_connect_bypass-arg-duration"));
|
||||
|
||||
return CompletionResult.Empty;
|
||||
}
|
||||
}
|
||||
@@ -1,36 +1,23 @@
|
||||
using Content.Shared.Examine;
|
||||
using Content.Shared.Humanoid;
|
||||
using Content.Shared.Humanoid.Markings;
|
||||
using Content.Shared.Humanoid.Prototypes;
|
||||
using Content.Shared.IdentityManagement;
|
||||
using Content.Shared.Preferences;
|
||||
using Content.Shared.Verbs;
|
||||
using Robust.Shared.GameObjects.Components.Localization;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Server.Humanoid;
|
||||
|
||||
public sealed partial class HumanoidAppearanceSystem : SharedHumanoidAppearanceSystem
|
||||
{
|
||||
[Dependency] private readonly MarkingManager _markingManager = default!;
|
||||
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<HumanoidAppearanceComponent, HumanoidMarkingModifierMarkingSetMessage>(OnMarkingsSet);
|
||||
SubscribeLocalEvent<HumanoidAppearanceComponent, HumanoidMarkingModifierBaseLayersSetMessage>(OnBaseLayersSet);
|
||||
SubscribeLocalEvent<HumanoidAppearanceComponent, GetVerbsEvent<Verb>>(OnVerbsRequest);
|
||||
SubscribeLocalEvent<HumanoidAppearanceComponent, ExaminedEvent>(OnExamined);
|
||||
}
|
||||
|
||||
private void OnExamined(EntityUid uid, HumanoidAppearanceComponent component, ExaminedEvent args)
|
||||
{
|
||||
var identity = Identity.Entity(uid, EntityManager);
|
||||
var species = GetSpeciesRepresentation(component.Species).ToLower();
|
||||
var age = GetAgeRepresentation(component.Species, component.Age);
|
||||
|
||||
args.PushText(Loc.GetString("humanoid-appearance-component-examine", ("user", identity), ("age", age), ("species", species)));
|
||||
}
|
||||
|
||||
// this was done enough times that it only made sense to do it here
|
||||
@@ -164,42 +151,4 @@ public sealed partial class HumanoidAppearanceSystem : SharedHumanoidAppearanceS
|
||||
|
||||
Dirty(uid, humanoid);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Takes ID of the species prototype, returns UI-friendly name of the species.
|
||||
/// </summary>
|
||||
public string GetSpeciesRepresentation(string speciesId)
|
||||
{
|
||||
if (_prototypeManager.TryIndex<SpeciesPrototype>(speciesId, out var species))
|
||||
{
|
||||
return Loc.GetString(species.Name);
|
||||
}
|
||||
else
|
||||
{
|
||||
return Loc.GetString("humanoid-appearance-component-unknown-species");
|
||||
}
|
||||
}
|
||||
|
||||
public string GetAgeRepresentation(string species, int age)
|
||||
{
|
||||
_prototypeManager.TryIndex<SpeciesPrototype>(species, out var speciesPrototype);
|
||||
|
||||
if (speciesPrototype == null)
|
||||
{
|
||||
Log.Error("Tried to get age representation of species that couldn't be indexed: " + species);
|
||||
return Loc.GetString("identity-age-young");
|
||||
}
|
||||
|
||||
if (age < speciesPrototype.YoungAge)
|
||||
{
|
||||
return Loc.GetString("identity-age-young");
|
||||
}
|
||||
|
||||
if (age < speciesPrototype.OldAge)
|
||||
{
|
||||
return Loc.GetString("identity-age-middle-aged");
|
||||
}
|
||||
|
||||
return Loc.GetString("identity-age-old");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -318,6 +318,7 @@ public sealed class AccessReaderSystem : EntitySystem
|
||||
{
|
||||
component.AccessLists.Add(new HashSet<ProtoId<AccessLevelPrototype>>(){access});
|
||||
}
|
||||
Dirty(uid, component);
|
||||
RaiseLocalEvent(uid, new AccessReaderConfigurationChangedEvent());
|
||||
}
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ using Content.Shared.DragDrop;
|
||||
using Content.Shared.GameTicking;
|
||||
using Content.Shared.Mind;
|
||||
using Content.Shared.Mind.Components;
|
||||
using Content.Shared.Mobs.Systems;
|
||||
using Robust.Shared.Configuration;
|
||||
using Robust.Shared.Containers;
|
||||
using Robust.Shared.Map;
|
||||
@@ -22,6 +23,7 @@ public abstract class SharedCryostorageSystem : EntitySystem
|
||||
[Dependency] private readonly IMapManager _mapManager = default!;
|
||||
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
|
||||
[Dependency] protected readonly SharedMindSystem Mind = default!;
|
||||
[Dependency] private readonly MobStateSystem _mobState = default!;
|
||||
|
||||
protected EntityUid? PausedMap { get; private set; }
|
||||
|
||||
@@ -81,6 +83,12 @@ public abstract class SharedCryostorageSystem : EntitySystem
|
||||
if (args.Container.ID != comp.ContainerId)
|
||||
return;
|
||||
|
||||
if (_mobState.IsIncapacitated(args.EntityUid))
|
||||
{
|
||||
args.Cancel();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!TryComp<MindContainerComponent>(args.EntityUid, out var mindContainer))
|
||||
{
|
||||
args.Cancel();
|
||||
|
||||
@@ -32,16 +32,30 @@ public sealed partial class CargoBountyConsoleComponent : Component
|
||||
/// </summary>
|
||||
[DataField("printSound")]
|
||||
public SoundSpecifier PrintSound = new SoundPathSpecifier("/Audio/Machines/printer.ogg");
|
||||
|
||||
/// <summary>
|
||||
/// The sound made when the bounty is skipped.
|
||||
/// </summary>
|
||||
[DataField("skipSound")]
|
||||
public SoundSpecifier SkipSound = new SoundPathSpecifier("/Audio/Effects/Cargo/ping.ogg");
|
||||
|
||||
/// <summary>
|
||||
/// The sound made when bounty skipping is denied due to lacking access.
|
||||
/// </summary>
|
||||
[DataField("denySound")]
|
||||
public SoundSpecifier DenySound = new SoundPathSpecifier("/Audio/Effects/Cargo/buzz_two.ogg");
|
||||
}
|
||||
|
||||
[NetSerializable, Serializable]
|
||||
public sealed class CargoBountyConsoleState : BoundUserInterfaceState
|
||||
{
|
||||
public List<CargoBountyData> Bounties;
|
||||
public TimeSpan UntilNextSkip;
|
||||
|
||||
public CargoBountyConsoleState(List<CargoBountyData> bounties)
|
||||
public CargoBountyConsoleState(List<CargoBountyData> bounties, TimeSpan untilNextSkip)
|
||||
{
|
||||
Bounties = bounties;
|
||||
UntilNextSkip = untilNextSkip;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -55,3 +69,14 @@ public sealed class BountyPrintLabelMessage : BoundUserInterfaceMessage
|
||||
BountyId = bountyId;
|
||||
}
|
||||
}
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public sealed class BountySkipMessage : BoundUserInterfaceMessage
|
||||
{
|
||||
public string BountyId;
|
||||
|
||||
public BountySkipMessage(string bountyId)
|
||||
{
|
||||
BountyId = bountyId;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
using System.Linq;
|
||||
using Content.Shared.Decals;
|
||||
using Content.Shared.Examine;
|
||||
using Content.Shared.Humanoid.Markings;
|
||||
using Content.Shared.Humanoid.Prototypes;
|
||||
using Content.Shared.IdentityManagement;
|
||||
using Content.Shared.Preferences;
|
||||
using Robust.Shared.GameObjects.Components.Localization;
|
||||
using Robust.Shared.Network;
|
||||
@@ -21,7 +23,7 @@ namespace Content.Shared.Humanoid;
|
||||
public abstract class SharedHumanoidAppearanceSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly INetManager _netManager = default!;
|
||||
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
||||
[Dependency] private readonly IPrototypeManager _proto = default!;
|
||||
[Dependency] private readonly MarkingManager _markingManager = default!;
|
||||
|
||||
[ValidatePrototypeId<SpeciesPrototype>]
|
||||
@@ -30,7 +32,9 @@ public abstract class SharedHumanoidAppearanceSystem : EntitySystem
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<HumanoidAppearanceComponent, ComponentInit>(OnInit);
|
||||
SubscribeLocalEvent<HumanoidAppearanceComponent, ExaminedEvent>(OnExamined);
|
||||
}
|
||||
|
||||
private void OnInit(EntityUid uid, HumanoidAppearanceComponent humanoid, ComponentInit args)
|
||||
@@ -41,7 +45,7 @@ public abstract class SharedHumanoidAppearanceSystem : EntitySystem
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(humanoid.Initial)
|
||||
|| !_prototypeManager.TryIndex(humanoid.Initial, out HumanoidProfilePrototype? startingSet))
|
||||
|| !_proto.TryIndex(humanoid.Initial, out HumanoidProfilePrototype? startingSet))
|
||||
{
|
||||
LoadProfile(uid, HumanoidCharacterProfile.DefaultWithSpecies(humanoid.Species), humanoid);
|
||||
return;
|
||||
@@ -56,6 +60,15 @@ public abstract class SharedHumanoidAppearanceSystem : EntitySystem
|
||||
LoadProfile(uid, startingSet.Profile, humanoid);
|
||||
}
|
||||
|
||||
private void OnExamined(EntityUid uid, HumanoidAppearanceComponent component, ExaminedEvent args)
|
||||
{
|
||||
var identity = Identity.Entity(uid, EntityManager);
|
||||
var species = GetSpeciesRepresentation(component.Species).ToLower();
|
||||
var age = GetAgeRepresentation(component.Species, component.Age);
|
||||
|
||||
args.PushText(Loc.GetString("humanoid-appearance-component-examine", ("user", identity), ("age", age), ("species", species)));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Toggles a humanoid's sprite layer visibility.
|
||||
/// </summary>
|
||||
@@ -136,7 +149,7 @@ public abstract class SharedHumanoidAppearanceSystem : EntitySystem
|
||||
/// <param name="humanoid">Humanoid component of the entity</param>
|
||||
public void SetSpecies(EntityUid uid, string species, bool sync = true, HumanoidAppearanceComponent? humanoid = null)
|
||||
{
|
||||
if (!Resolve(uid, ref humanoid) || !_prototypeManager.TryIndex<SpeciesPrototype>(species, out var prototype))
|
||||
if (!Resolve(uid, ref humanoid) || !_proto.TryIndex<SpeciesPrototype>(species, out var prototype))
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -144,7 +157,7 @@ public abstract class SharedHumanoidAppearanceSystem : EntitySystem
|
||||
humanoid.Species = species;
|
||||
humanoid.MarkingSet.EnsureSpecies(species, humanoid.SkinColor, _markingManager);
|
||||
var oldMarkings = humanoid.MarkingSet.GetForwardEnumerator().ToList();
|
||||
humanoid.MarkingSet = new(oldMarkings, prototype.MarkingPoints, _markingManager, _prototypeManager);
|
||||
humanoid.MarkingSet = new(oldMarkings, prototype.MarkingPoints, _markingManager, _proto);
|
||||
|
||||
if (sync)
|
||||
Dirty(uid, humanoid);
|
||||
@@ -164,7 +177,7 @@ public abstract class SharedHumanoidAppearanceSystem : EntitySystem
|
||||
if (!Resolve(uid, ref humanoid))
|
||||
return;
|
||||
|
||||
if (!_prototypeManager.TryIndex<SpeciesPrototype>(humanoid.Species, out var species))
|
||||
if (!_proto.TryIndex<SpeciesPrototype>(humanoid.Species, out var species))
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -288,24 +301,24 @@ public abstract class SharedHumanoidAppearanceSystem : EntitySystem
|
||||
|
||||
// Hair/facial hair - this may eventually be deprecated.
|
||||
// We need to ensure hair before applying it or coloring can try depend on markings that can be invalid
|
||||
var hairColor = _markingManager.MustMatchSkin(profile.Species, HumanoidVisualLayers.Hair, out var hairAlpha, _prototypeManager)
|
||||
var hairColor = _markingManager.MustMatchSkin(profile.Species, HumanoidVisualLayers.Hair, out var hairAlpha, _proto)
|
||||
? profile.Appearance.SkinColor.WithAlpha(hairAlpha) : profile.Appearance.HairColor;
|
||||
var facialHairColor = _markingManager.MustMatchSkin(profile.Species, HumanoidVisualLayers.FacialHair, out var facialHairAlpha, _prototypeManager)
|
||||
var facialHairColor = _markingManager.MustMatchSkin(profile.Species, HumanoidVisualLayers.FacialHair, out var facialHairAlpha, _proto)
|
||||
? profile.Appearance.SkinColor.WithAlpha(facialHairAlpha) : profile.Appearance.FacialHairColor;
|
||||
|
||||
if (_markingManager.Markings.TryGetValue(profile.Appearance.HairStyleId, out var hairPrototype) &&
|
||||
_markingManager.CanBeApplied(profile.Species, profile.Sex, hairPrototype, _prototypeManager))
|
||||
_markingManager.CanBeApplied(profile.Species, profile.Sex, hairPrototype, _proto))
|
||||
{
|
||||
AddMarking(uid, profile.Appearance.HairStyleId, hairColor, false);
|
||||
}
|
||||
|
||||
if (_markingManager.Markings.TryGetValue(profile.Appearance.FacialHairStyleId, out var facialHairPrototype) &&
|
||||
_markingManager.CanBeApplied(profile.Species, profile.Sex, facialHairPrototype, _prototypeManager))
|
||||
_markingManager.CanBeApplied(profile.Species, profile.Sex, facialHairPrototype, _proto))
|
||||
{
|
||||
AddMarking(uid, profile.Appearance.FacialHairStyleId, facialHairColor, false);
|
||||
}
|
||||
|
||||
humanoid.MarkingSet.EnsureSpecies(profile.Species, profile.Appearance.SkinColor, _markingManager, _prototypeManager);
|
||||
humanoid.MarkingSet.EnsureSpecies(profile.Species, profile.Appearance.SkinColor, _markingManager, _proto);
|
||||
|
||||
// Finally adding marking with forced colors
|
||||
foreach (var (marking, prototype) in markingFColored)
|
||||
@@ -398,4 +411,39 @@ public abstract class SharedHumanoidAppearanceSystem : EntitySystem
|
||||
if (sync)
|
||||
Dirty(uid, humanoid);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Takes ID of the species prototype, returns UI-friendly name of the species.
|
||||
/// </summary>
|
||||
public string GetSpeciesRepresentation(string speciesId)
|
||||
{
|
||||
if (_proto.TryIndex<SpeciesPrototype>(speciesId, out var species))
|
||||
{
|
||||
return Loc.GetString(species.Name);
|
||||
}
|
||||
|
||||
Log.Error("Tried to get representation of unknown species: {speciesId}");
|
||||
return Loc.GetString("humanoid-appearance-component-unknown-species");
|
||||
}
|
||||
|
||||
public string GetAgeRepresentation(string species, int age)
|
||||
{
|
||||
if (!_proto.TryIndex<SpeciesPrototype>(species, out var speciesPrototype))
|
||||
{
|
||||
Log.Error("Tried to get age representation of species that couldn't be indexed: " + species);
|
||||
return Loc.GetString("identity-age-young");
|
||||
}
|
||||
|
||||
if (age < speciesPrototype.YoungAge)
|
||||
{
|
||||
return Loc.GetString("identity-age-young");
|
||||
}
|
||||
|
||||
if (age < speciesPrototype.OldAge)
|
||||
{
|
||||
return Loc.GetString("identity-age-middle-aged");
|
||||
}
|
||||
|
||||
return Loc.GetString("identity-age-old");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -98,16 +98,6 @@ public class RCDSystem : EntitySystem
|
||||
component.ProtoId = args.ProtoId;
|
||||
UpdateCachedPrototype(uid, component);
|
||||
Dirty(uid, component);
|
||||
|
||||
if (args.Session.AttachedEntity != null)
|
||||
{
|
||||
// Popup message
|
||||
var msg = (component.CachedPrototype.Prototype != null) ?
|
||||
Loc.GetString("rcd-component-change-build-mode", ("name", Loc.GetString(component.CachedPrototype.SetName))) :
|
||||
Loc.GetString("rcd-component-change-mode", ("mode", Loc.GetString(component.CachedPrototype.SetName)));
|
||||
|
||||
_popup.PopupClient(msg, uid, args.Session.AttachedEntity.Value);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnExamine(EntityUid uid, RCDComponent component, ExaminedEvent args)
|
||||
@@ -118,9 +108,18 @@ public class RCDSystem : EntitySystem
|
||||
// Update cached prototype if required
|
||||
UpdateCachedPrototype(uid, component);
|
||||
|
||||
var msg = (component.CachedPrototype.Prototype != null) ?
|
||||
Loc.GetString("rcd-component-examine-build-details", ("name", Loc.GetString(component.CachedPrototype.SetName))) :
|
||||
Loc.GetString("rcd-component-examine-mode-details", ("mode", Loc.GetString(component.CachedPrototype.SetName)));
|
||||
var msg = Loc.GetString("rcd-component-examine-mode-details", ("mode", Loc.GetString(component.CachedPrototype.SetName)));
|
||||
|
||||
if (component.CachedPrototype.Mode == RcdMode.ConstructTile || component.CachedPrototype.Mode == RcdMode.ConstructObject)
|
||||
{
|
||||
var name = Loc.GetString(component.CachedPrototype.SetName);
|
||||
|
||||
if (component.CachedPrototype.Prototype != null &&
|
||||
_protoManager.TryIndex(component.CachedPrototype.Prototype, out var proto))
|
||||
name = proto.Name;
|
||||
|
||||
msg = Loc.GetString("rcd-component-examine-build-details", ("name", name));
|
||||
}
|
||||
|
||||
args.PushMarkup(msg);
|
||||
}
|
||||
@@ -206,7 +205,7 @@ public class RCDSystem : EntitySystem
|
||||
|
||||
// Try to start the do after
|
||||
var effect = Spawn(effectPrototype, mapGridData.Value.Location);
|
||||
var ev = new RCDDoAfterEvent(GetNetCoordinates(mapGridData.Value.Location), component.ProtoId, cost, EntityManager.GetNetEntity(effect));
|
||||
var ev = new RCDDoAfterEvent(GetNetCoordinates(mapGridData.Value.Location), component.ConstructionDirection, component.ProtoId, cost, EntityManager.GetNetEntity(effect));
|
||||
|
||||
var doAfterArgs = new DoAfterArgs(EntityManager, user, delay, ev, uid, target: args.Target, used: uid)
|
||||
{
|
||||
@@ -263,7 +262,7 @@ public class RCDSystem : EntitySystem
|
||||
return;
|
||||
|
||||
// Finalize the operation
|
||||
FinalizeRCDOperation(uid, component, mapGridData.Value, args.Target, args.User);
|
||||
FinalizeRCDOperation(uid, component, mapGridData.Value, args.Direction, args.Target, args.User);
|
||||
|
||||
// Play audio and consume charges
|
||||
_audio.PlayPredicted(component.SuccessSound, uid, args.User);
|
||||
@@ -419,7 +418,7 @@ public class RCDSystem : EntitySystem
|
||||
foreach (var fixture in fixtures.Fixtures.Values)
|
||||
{
|
||||
// Continue if no collision is possible
|
||||
if (fixture.CollisionLayer <= 0 || (fixture.CollisionLayer & (int) component.CachedPrototype.CollisionMask) == 0)
|
||||
if (!fixture.Hard || fixture.CollisionLayer <= 0 || (fixture.CollisionLayer & (int) component.CachedPrototype.CollisionMask) == 0)
|
||||
continue;
|
||||
|
||||
// Continue if our custom collision bounds are not intersected
|
||||
@@ -494,7 +493,7 @@ public class RCDSystem : EntitySystem
|
||||
|
||||
#region Entity construction/deconstruction
|
||||
|
||||
private void FinalizeRCDOperation(EntityUid uid, RCDComponent component, MapGridData mapGridData, EntityUid? target, EntityUid user)
|
||||
private void FinalizeRCDOperation(EntityUid uid, RCDComponent component, MapGridData mapGridData, Direction direction, EntityUid? target, EntityUid user)
|
||||
{
|
||||
if (!_net.IsServer)
|
||||
return;
|
||||
@@ -521,7 +520,7 @@ public class RCDSystem : EntitySystem
|
||||
Transform(ent).LocalRotation = Transform(uid).LocalRotation;
|
||||
break;
|
||||
case RcdRotation.User:
|
||||
Transform(ent).LocalRotation = component.ConstructionDirection.ToAngle();
|
||||
Transform(ent).LocalRotation = direction.ToAngle();
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -617,6 +616,9 @@ public sealed partial class RCDDoAfterEvent : DoAfterEvent
|
||||
[DataField(required: true)]
|
||||
public NetCoordinates Location { get; private set; } = default!;
|
||||
|
||||
[DataField]
|
||||
public Direction Direction { get; private set; } = default!;
|
||||
|
||||
[DataField]
|
||||
public ProtoId<RCDPrototype> StartingProtoId { get; private set; } = default!;
|
||||
|
||||
@@ -628,9 +630,10 @@ public sealed partial class RCDDoAfterEvent : DoAfterEvent
|
||||
|
||||
private RCDDoAfterEvent() { }
|
||||
|
||||
public RCDDoAfterEvent(NetCoordinates location, ProtoId<RCDPrototype> startingProtoId, int cost, NetEntity? effect = null)
|
||||
public RCDDoAfterEvent(NetCoordinates location, Direction direction, ProtoId<RCDPrototype> startingProtoId, int cost, NetEntity? effect = null)
|
||||
{
|
||||
Location = location;
|
||||
Direction = direction;
|
||||
StartingProtoId = startingProtoId;
|
||||
Cost = cost;
|
||||
Effect = effect;
|
||||
|
||||
@@ -48,7 +48,7 @@ public abstract class SharedTrayScannerSystem : EntitySystem
|
||||
|
||||
private void OnTrayScannerGetState(EntityUid uid, TrayScannerComponent scanner, ref ComponentGetState args)
|
||||
{
|
||||
args.State = new TrayScannerState(scanner.Enabled);
|
||||
args.State = new TrayScannerState(scanner.Enabled, scanner.Range);
|
||||
}
|
||||
|
||||
private void OnTrayScannerHandleState(EntityUid uid, TrayScannerComponent scanner, ref ComponentHandleState args)
|
||||
@@ -56,6 +56,7 @@ public abstract class SharedTrayScannerSystem : EntitySystem
|
||||
if (args.Current is not TrayScannerState state)
|
||||
return;
|
||||
|
||||
scanner.Range = state.Range;
|
||||
SetScannerEnabled(uid, state.Enabled, scanner);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,9 +22,11 @@ public sealed partial class TrayScannerComponent : Component
|
||||
public sealed class TrayScannerState : ComponentState
|
||||
{
|
||||
public bool Enabled;
|
||||
public float Range;
|
||||
|
||||
public TrayScannerState(bool enabled)
|
||||
public TrayScannerState(bool enabled, float range)
|
||||
{
|
||||
Enabled = enabled;
|
||||
Range = range;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -144,5 +144,13 @@ Entries:
|
||||
id: 19
|
||||
time: '2024-03-31T02:05:44.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/26546
|
||||
- author: PJB3005
|
||||
changes:
|
||||
- message: The new "grant_connect_bypass" command grants a player the ability to
|
||||
connect, bypassing whitelist, player cap and panic bunker.
|
||||
type: Add
|
||||
id: 20
|
||||
time: '2024-04-09T15:25:21.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/26771
|
||||
Name: Admin
|
||||
Order: 1
|
||||
|
||||
@@ -1,83 +1,4 @@
|
||||
Entries:
|
||||
- author: Ubaser
|
||||
changes:
|
||||
- message: Detectives now work as independent agents, separate from security, and
|
||||
are encouraged to answer any requests for help.
|
||||
type: Tweak
|
||||
id: 5816
|
||||
time: '2024-01-29T06:45:27.0000000+00:00'
|
||||
url: https://api.github.com/repos/space-wizards/space-station-14/pulls/23114
|
||||
- author: mirrorcult
|
||||
changes:
|
||||
- message: Rotting examine text doesn't have weird grammatical errors now
|
||||
type: Fix
|
||||
id: 5817
|
||||
time: '2024-01-29T07:50:18.0000000+00:00'
|
||||
url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24689
|
||||
- author: Eden077
|
||||
changes:
|
||||
- message: Synaptizine now deals less poison damage.
|
||||
type: Tweak
|
||||
id: 5818
|
||||
time: '2024-01-29T07:55:52.0000000+00:00'
|
||||
url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24676
|
||||
- author: mirrorcult
|
||||
changes:
|
||||
- message: Various annoying sounds are now a little quieter
|
||||
type: Tweak
|
||||
id: 5819
|
||||
time: '2024-01-29T09:51:31.0000000+00:00'
|
||||
url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24690
|
||||
- author: SpeltIncorrectyl
|
||||
changes:
|
||||
- message: Portable generators can now be connected to the signal network and controlled
|
||||
remotely via devices like a signal transmitter.
|
||||
type: Add
|
||||
id: 5820
|
||||
time: '2024-01-29T14:56:29.0000000+00:00'
|
||||
url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24157
|
||||
- author: Tayrtahn
|
||||
changes:
|
||||
- message: Welders properly display their lit status again.
|
||||
type: Fix
|
||||
id: 5821
|
||||
time: '2024-01-29T23:04:52.0000000+00:00'
|
||||
url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24705
|
||||
- author: Tayrtahn
|
||||
changes:
|
||||
- message: Water bottles now display their fill level while held.
|
||||
type: Add
|
||||
id: 5822
|
||||
time: '2024-01-29T23:19:56.0000000+00:00'
|
||||
url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24708
|
||||
- author: SlamBamActionman
|
||||
changes:
|
||||
- message: Arachnids slipping in water now get a cute hat!
|
||||
type: Add
|
||||
id: 5823
|
||||
time: '2024-01-30T00:21:26.0000000+00:00'
|
||||
url: https://api.github.com/repos/space-wizards/space-station-14/pulls/23822
|
||||
- author: Tayrtahn
|
||||
changes:
|
||||
- message: Pressing shift as a ghost no longer cancels following your target
|
||||
type: Fix
|
||||
id: 5824
|
||||
time: '2024-01-30T01:33:35.0000000+00:00'
|
||||
url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24715
|
||||
- author: liltenhead
|
||||
changes:
|
||||
- message: Jugs are now destructible.
|
||||
type: Tweak
|
||||
id: 5825
|
||||
time: '2024-01-30T08:11:43.0000000+00:00'
|
||||
url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24719
|
||||
- author: Emisse
|
||||
changes:
|
||||
- message: Aspid
|
||||
type: Remove
|
||||
id: 5826
|
||||
time: '2024-01-30T10:26:02.0000000+00:00'
|
||||
url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24725
|
||||
- author: mirrorcult
|
||||
changes:
|
||||
- message: Throwing items now scale a bit when thrown to simulate rising/falling
|
||||
@@ -3814,3 +3735,93 @@
|
||||
id: 6315
|
||||
time: '2024-04-06T04:49:14.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/26763
|
||||
- author: PursuitInAshes
|
||||
changes:
|
||||
- message: Sake Bottles can now be found in the booze-o-mat.
|
||||
type: Tweak
|
||||
id: 6316
|
||||
time: '2024-04-06T20:16:47.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/26776
|
||||
- author: osjarw
|
||||
changes:
|
||||
- message: Removed broken anom behaviour, which causes APE shots to fly through
|
||||
the anom.
|
||||
type: Remove
|
||||
id: 6317
|
||||
time: '2024-04-06T22:27:16.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/26775
|
||||
- author: Vermidia
|
||||
changes:
|
||||
- message: Water coolers show how full/what they're full of again.
|
||||
type: Fix
|
||||
id: 6318
|
||||
time: '2024-04-06T23:58:57.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/26784
|
||||
- author: Crotalus
|
||||
changes:
|
||||
- message: Show missing materials in lathe tooltip
|
||||
type: Add
|
||||
id: 6319
|
||||
time: '2024-04-08T03:16:11.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/26795
|
||||
- author: chromiumboy
|
||||
changes:
|
||||
- message: Fixed the RCD not being able to build on top of puddles
|
||||
type: Fix
|
||||
- message: RCD constructions can no longer be rotated while in progress
|
||||
type: Tweak
|
||||
- message: The RCD now reports construction mode changes to its user
|
||||
type: Add
|
||||
id: 6320
|
||||
time: '2024-04-08T03:17:29.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/26792
|
||||
- author: lzk228
|
||||
changes:
|
||||
- message: Bombsuit and jani bombsuit are similar now.
|
||||
type: Tweak
|
||||
id: 6321
|
||||
time: '2024-04-08T15:05:58.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/26806
|
||||
- author: lzk228
|
||||
changes:
|
||||
- message: Clothing restock crate was splitted to clothing and autodrobe restock
|
||||
crates.
|
||||
type: Tweak
|
||||
- message: Clothing is cheaper.
|
||||
type: Tweak
|
||||
id: 6322
|
||||
time: '2024-04-08T15:10:58.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/26805
|
||||
- author: Hanzdegloker
|
||||
changes:
|
||||
- message: Spears can now be quipped to your suit slot and cost slightly more to
|
||||
make.
|
||||
type: Tweak
|
||||
id: 6323
|
||||
time: '2024-04-08T15:34:35.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/26724
|
||||
- author: KittenColony
|
||||
changes:
|
||||
- message: Added 13 new gauze wraps for moth that fit their twig bodies
|
||||
type: Add
|
||||
- message: Gauze markings have been moved to the Overlay category, allowing gauze
|
||||
to not take up marking points
|
||||
type: Tweak
|
||||
id: 6324
|
||||
time: '2024-04-09T08:04:51.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/25481
|
||||
- author: Killerqu00
|
||||
changes:
|
||||
- message: Quartermasters can now skip a single bounty in the list once every 15
|
||||
minutes.
|
||||
type: Add
|
||||
id: 6325
|
||||
time: '2024-04-09T22:18:07.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/26537
|
||||
- author: SkaldetSkaeg
|
||||
changes:
|
||||
- message: The Flippo lighter is now quieter and has a delay on use.
|
||||
type: Tweak
|
||||
id: 6326
|
||||
time: '2024-04-09T22:20:57.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/26846
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,16 @@
|
||||
## Strings for the "grant_connect_bypass" command.
|
||||
|
||||
cmd-grant_connect_bypass-desc = Temporarily allow a user to bypass regular connection checks.
|
||||
cmd-grant_connect_bypass-help = Usage: grant_connect_bypass <user> [duration minutes]
|
||||
Temporarily grants a user the ability to bypass regular connections restrictions.
|
||||
The bypass only applies to this game server and will expire after (by default) 1 hour.
|
||||
They will be able to join regardless of whitelist, panic bunker, or player cap.
|
||||
|
||||
cmd-grant_connect_bypass-arg-user = <user>
|
||||
cmd-grant_connect_bypass-arg-duration = [duration minutes]
|
||||
|
||||
cmd-grant_connect_bypass-invalid-args = Expected 1 or 2 arguments
|
||||
cmd-grant_connect_bypass-unknown-user = Unable to find user '{$user}'
|
||||
cmd-grant_connect_bypass-invalid-duration = Invalid duration '{$duration}'
|
||||
|
||||
cmd-grant_connect_bypass-success = Successfully added bypass for user '{$user}'
|
||||
@@ -1,5 +1,6 @@
|
||||
bounty-console-menu-title = Cargo bounty console
|
||||
bounty-console-label-button-text = Print label
|
||||
bounty-console-skip-button-text = Skip
|
||||
bounty-console-time-label = Time: [color=orange]{$time}[/color]
|
||||
bounty-console-reward-label = Reward: [color=limegreen]${$reward}[/color]
|
||||
bounty-console-manifest-label = Manifest: [color=orange]{$item}[/color]
|
||||
|
||||
@@ -13,6 +13,10 @@ lathe-menu-material-amount = { $amount ->
|
||||
[1] {NATURALFIXED($amount, 2)} {$unit}
|
||||
*[other] {NATURALFIXED($amount, 2)} {MAKEPLURAL($unit)}
|
||||
}
|
||||
lathe-menu-material-amount-missing = { $amount ->
|
||||
[1] {NATURALFIXED($amount, 2)} {$unit} of {$material} ([color=red]{NATURALFIXED($missingAmount, 2)} {$unit} missing[/color])
|
||||
*[other] {NATURALFIXED($amount, 2)} {MAKEPLURAL($unit)} of {$material} ([color=red]{NATURALFIXED($missingAmount, 2)} {MAKEPLURAL($unit)} missing[/color])
|
||||
}
|
||||
lathe-menu-no-materials-message = No materials loaded.
|
||||
lathe-menu-fabricating-message = Fabricating...
|
||||
lathe-menu-materials-title = Materials
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
marking-GauzeLefteyePatch-gauze_lefteye_2 = Gauze eyepatch (Left)
|
||||
marking-GauzeLefteyePatch = Gauze eyepatch (Left)
|
||||
|
||||
marking-GauzeLefteyeTape-gauze_lefteye_1 = Gauze eyepad (Left)
|
||||
marking-GauzeLefteyeTape = Gauze eyepad (Left)
|
||||
marking-GauzeLefteyePad-gauze_lefteye_1 = Gauze eyepad (Left)
|
||||
marking-GauzeLefteyePad = Gauze eyepad (Left)
|
||||
|
||||
marking-GauzeRighteyePatch-gauze_righteye_2 = Gauze eyepatch (Right)
|
||||
marking-GauzeRighteyePatch = Gauze eyepatch (Right)
|
||||
|
||||
marking-GauzeRighteyeTape-gauze_righteye_1 = Gauze eyepad (Right)
|
||||
marking-GauzeRighteyeTape = Gauze eyepad (Right)
|
||||
marking-GauzeRighteyePad-gauze_righteye_1 = Gauze eyepad (Right)
|
||||
marking-GauzeRighteyePad = Gauze eyepad (Right)
|
||||
|
||||
marking-GauzeShoulder-gauze_shoulder = Gauze Shoulder
|
||||
marking-GauzeShoulder = Gauze Shoulder
|
||||
marking-GauzeShoulder-gauze_shoulder = Gauze Shoulder Sling
|
||||
marking-GauzeShoulder = Gauze Shoulder Sling
|
||||
|
||||
marking-GauzeStomach-gauze_abdomen = Gauze Stomach Wrap
|
||||
marking-GauzeStomach = Gauze Stomach Wrap
|
||||
@@ -46,17 +46,57 @@ marking-GauzeUpperLegRight = Gauze Thigh Wrap (Right)
|
||||
marking-GauzeBlindfold-gauze_blindfold = Gauze Blindfold
|
||||
marking-GauzeBlindfold = Gauze Blindfold
|
||||
|
||||
marking-GauzeLizardBlindfold-gauze_lizardblindfold = Gauze Blindfold
|
||||
marking-GauzeLizardBlindfold-gauze_lizard_blindfold = Gauze Blindfold
|
||||
marking-GauzeLizardBlindfold = Gauze Blindfold
|
||||
|
||||
marking-GauzeLizardFootRight-gauze_lizardfoot_r = Gauze Foot Wrap (Right)
|
||||
marking-GauzeLizardFootRight-gauze_lizard_foot_r = Gauze Foot Wrap (Right)
|
||||
marking-GauzeLizardFootRight = Gauze Foot Wrap (Right)
|
||||
|
||||
marking-GauzeLizardFootLeft-gauze_lizardfoot_l = Gauze Foot Wrap (Left)
|
||||
marking-GauzeLizardFootLeft-gauze_lizard_foot_l = Gauze Foot Wrap (Left)
|
||||
marking-GauzeLizardFootLeft = Gauze Foot Wrap (Left)
|
||||
|
||||
marking-GauzeLizardLefteyePatch-gauze_lizardlefteye = Adjusted Gauze eyepatch (Left)
|
||||
marking-GauzeLizardLefteyePatch = Adjusted Gauze eyepatch (Left)
|
||||
marking-GauzeLizardLefteyePatch-gauze_lizard_lefteye = Reptilian Gauze eyepatch (Left)
|
||||
marking-GauzeLizardLefteyePatch = Reptilian Gauze eyepatch (Left)
|
||||
|
||||
marking-GauzeLizardRighteyePatch-gauze_lizard_righteye = Reptilian Gauze eyepatch (Right)
|
||||
marking-GauzeLizardRighteyePatch = Reptilian Gauze Eyepatch (Right)
|
||||
|
||||
marking-GauzeMothStomach-gauze_moth_abdomen = Insectoid Stomach Wrap
|
||||
marking-GauzeMothStomach = Insectoid Stomach Wrap
|
||||
|
||||
marking-GauzeMothShoulder-gauze_moth_shoulder = Insectoid Shoulder Sling
|
||||
marking-GauzeMothShoulder = Insectoid Shoulder Sling
|
||||
|
||||
marking-GauzeMothBlindfold-gauze_moth_blindfold = Insectoid Blindfold
|
||||
marking-GauzeMothBlindfold = Insectoid Blindfold
|
||||
|
||||
marking-GauzeMothLeftEyePatch-gauze_moth_lefteye_2 = Insectoid Gauze eyepatch (Left)
|
||||
marking-GauzeMothLeftEyePatch = Insectoid Gauze eyepatch (Left)
|
||||
|
||||
marking-GauzeMothLeftEyePad-gauze_moth_lefteye_1 = Insectoid Gauze eyepad (Left)
|
||||
marking-GauzeMothLeftEyePad = Insectoid Gauze eyepad (Left)
|
||||
|
||||
marking-GauzeMothRightEyePatch-gauze_moth_righteye_2 = Insectoid Gauze eyepatch (Right)
|
||||
marking-GauzeMothRightEyePatch = Insectoid Gauze eyepatch (Right)
|
||||
|
||||
marking-GauzeMothRightEyePad-gauze_moth_righteye_1 = Insectoid Gauze eyepad (Right)
|
||||
marking-GauzeMothRightEyePad = Insectoid Gauze eyepad (Right)
|
||||
|
||||
marking-GauzeMothUpperArmRight-gauze_moth_upperarm_r = Insectoid Gauze Forearm Wrap (Right)
|
||||
marking-GauzeMothUpperArmRight = Insectoid Gauze Forearm Wrap (Right)
|
||||
|
||||
marking-GauzeMothUpperArmLeft-gauze_moth_upperarm_l = Insectoid Gauze Forearm Wrap (Left)
|
||||
marking-GauzeMothUpperArmLeft = Insectoid Gauze Forearm Wrap (Left)
|
||||
|
||||
marking-GauzeMothUpperLegRight-gauze_moth_upperleg_r = Insectoid Gauze Thigh Wrap (Right)
|
||||
marking-GauzeMothUpperLegRight = Insectoid Insectoid Gauze Thigh Wrap (Right)
|
||||
|
||||
marking-GauzeMothUpperLegLeft-gauze_moth_upperleg_l = Insectoid Gauze Thigh Wrap (Left)
|
||||
marking-GauzeMothUpperLegLeft = Insectoid Gauze Thigh Wrap (Left)
|
||||
|
||||
marking-GauzeMothLowerLegRight-gauze_moth_lowerleg_r = Insectoid Gauze Shin Wrap (Right)
|
||||
marking-GauzeMothLowerLegRight = Insectoid Gauze Shin Wrap (Right)
|
||||
|
||||
marking-GauzeMothLowerLegLeft-gauze_moth_lowerleg_l = Insectoid Gauze Shin Wrap (Left)
|
||||
marking-GauzeMothLowerLegLeft = Insectoid Gauze Shin Wrap (Left)
|
||||
|
||||
marking-GauzeLizardRighteyePatch-gauze_lizardrighteye = Adjusted Gauze eyepatch (Right)
|
||||
marking-GauzeLizardRighteyePatch = Adjusted Gauze Eyepatch (Right)
|
||||
@@ -43,24 +43,5 @@ rcd-component-lighting = Lighting
|
||||
### Prototype names (note: constructable items will be puralized)
|
||||
|
||||
rcd-component-deconstruct = deconstruct
|
||||
rcd-component-wall-solid = solid wall
|
||||
rcd-component-floor-steel = steel tile
|
||||
rcd-component-plating = hull plate
|
||||
rcd-component-catwalk = catwalk
|
||||
rcd-component-wall-reinforced = reinforced wall
|
||||
rcd-component-grille = grille
|
||||
rcd-component-window = window
|
||||
rcd-component-window-directional = directional window
|
||||
rcd-component-window-reinforced-directional = directional reinforced window
|
||||
rcd-component-reinforced-window = reinforced window
|
||||
rcd-component-airlock = standard airlock
|
||||
rcd-component-airlock-glass = glass airlock
|
||||
rcd-component-firelock = firelock
|
||||
rcd-component-computer-frame = computer frame
|
||||
rcd-component-machine-frame = machine frame
|
||||
rcd-component-tube-light = light
|
||||
rcd-component-window-bulb-light = small light
|
||||
rcd-component-window-lv-cable = LV cable
|
||||
rcd-component-window-mv-cable = MV cable
|
||||
rcd-component-window-hv-cable = HV cable
|
||||
rcd-component-window-cable-terminal = cable terminal
|
||||
|
||||
@@ -117,3 +117,6 @@ chatsan-replacement-42 = of course
|
||||
|
||||
chatsan-word-43 = ig
|
||||
chatsan-replacement-43 = i guess
|
||||
|
||||
chatsan-word-44 = tbf
|
||||
chatsan-replacement-44 = to be fair
|
||||
|
||||
12334
Resources/Maps/core.yml
12334
Resources/Maps/core.yml
File diff suppressed because it is too large
Load Diff
@@ -424,3 +424,4 @@
|
||||
chatsan-word-41: chatsan-replacement-41
|
||||
chatsan-word-42: chatsan-replacement-42
|
||||
chatsan-word-43: chatsan-replacement-43
|
||||
chatsan-word-44: chatsan-replacement-44
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
InconstancyParticle: 0.5
|
||||
FullUnknown: 0.5
|
||||
Jumping: 0.3
|
||||
Moving: 0.1
|
||||
#Complex
|
||||
FastUnknown: 0.2
|
||||
JumpingUnknown: 0.1
|
||||
@@ -133,19 +132,6 @@
|
||||
shuffleOnParticleHit: true
|
||||
prob: 0.8
|
||||
|
||||
- type: anomalyBehavior
|
||||
id: Moving
|
||||
earnPointModifier: 2.2
|
||||
description: anomaly-behavior-moving
|
||||
components:
|
||||
- type: RandomWalk
|
||||
minSpeed: 0
|
||||
maxSpeed: 0.3
|
||||
- type: CanMoveInAir
|
||||
- type: Physics
|
||||
bodyType: Dynamic
|
||||
bodyStatus: InAir
|
||||
|
||||
- type: anomalyBehavior
|
||||
id: Jumping
|
||||
earnPointModifier: 1.8
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
- state: lung-l-slime
|
||||
- state: lung-r-slime
|
||||
- type: Lung
|
||||
Alert: LowNitrogen
|
||||
alert: LowNitrogen
|
||||
- type: Metabolizer
|
||||
removeEmpty: true
|
||||
solutionOnBody: false
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
- ReagentId: UncookedAnimalProteins
|
||||
Quantity: 5
|
||||
- type: Metabolizer
|
||||
updateFrequency: 1.5
|
||||
updateInterval: 1.5
|
||||
|
||||
- type: entity
|
||||
id: OrganArachnidLungs
|
||||
@@ -60,7 +60,7 @@
|
||||
- state: lung-r
|
||||
- type: Lung
|
||||
- type: Metabolizer
|
||||
updateFrequency: 1.5
|
||||
updateInterval: 1.5
|
||||
removeEmpty: true
|
||||
solutionOnBody: false
|
||||
solution: "Lung"
|
||||
@@ -92,7 +92,7 @@
|
||||
- type: Sprite
|
||||
state: heart-on
|
||||
- type: Metabolizer
|
||||
updateFrequency: 1.5
|
||||
updateInterval: 1.5
|
||||
maxReagents: 2
|
||||
metabolizerTypes: [Arachnid]
|
||||
groups:
|
||||
@@ -110,7 +110,7 @@
|
||||
- type: Sprite
|
||||
state: liver
|
||||
- type: Metabolizer # The liver metabolizes certain chemicals only, like alcohol.
|
||||
updateFrequency: 1.5
|
||||
updateInterval: 1.5
|
||||
maxReagents: 1
|
||||
metabolizerTypes: [Animal]
|
||||
groups:
|
||||
@@ -130,7 +130,7 @@
|
||||
- state: kidney-r
|
||||
# The kidneys just remove anything that doesn't currently have any metabolisms, as a stopgap.
|
||||
- type: Metabolizer
|
||||
updateFrequency: 1.5
|
||||
updateInterval: 1.5
|
||||
maxReagents: 5
|
||||
metabolizerTypes: [Animal]
|
||||
removeEmpty: true
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
sprite: Clothing/Head/Helmets/bombsuit.rsi
|
||||
state: icon
|
||||
product: CrateEmergencyExplosive
|
||||
cost: 650
|
||||
cost: 1000
|
||||
category: cargoproduct-category-name-emergency
|
||||
group: market
|
||||
|
||||
|
||||
@@ -33,7 +33,17 @@
|
||||
sprite: Objects/Specific/Service/vending_machine_restock.rsi
|
||||
state: base
|
||||
product: CrateVendingMachineRestockClothesFilled
|
||||
cost: 6000
|
||||
cost: 2400
|
||||
category: cargoproduct-category-name-service
|
||||
group: market
|
||||
|
||||
- type: cargoProduct
|
||||
id: CrateVendingMachineRestockAutoDrobe
|
||||
icon:
|
||||
sprite: Objects/Specific/Service/vending_machine_restock.rsi
|
||||
state: base
|
||||
product: CrateVendingMachineRestockAutoDrobeFilled
|
||||
cost: 1200
|
||||
category: cargoproduct-category-name-service
|
||||
group: market
|
||||
|
||||
|
||||
@@ -117,7 +117,7 @@
|
||||
components:
|
||||
- type: StorageFill
|
||||
contents:
|
||||
- id: BodyBag_Folded
|
||||
- id: BodyBagFolded
|
||||
amount: 4
|
||||
- type: Sprite
|
||||
layers:
|
||||
|
||||
@@ -22,11 +22,20 @@
|
||||
id: CrateVendingMachineRestockClothesFilled
|
||||
parent: CratePlastic
|
||||
name: clothing restock crate
|
||||
description: Contains a pair of restock boxes, one for the ClothesMate and one for the AutoDrobe.
|
||||
description: Contains a restock box for the clothes vending machines.
|
||||
components:
|
||||
- type: StorageFill
|
||||
contents:
|
||||
- id: VendingMachineRestockClothes
|
||||
|
||||
- type: entity
|
||||
id: CrateVendingMachineRestockAutoDrobeFilled
|
||||
parent: CratePlastic
|
||||
name: AutoDrobe restock crate
|
||||
description: Contains a restock box for the AutoDrobe.
|
||||
components:
|
||||
- type: StorageFill
|
||||
contents:
|
||||
- id: VendingMachineRestockCostumes
|
||||
|
||||
- type: entity
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
DrinkWhiskeyBottleFull: 5
|
||||
DrinkWineBottleFull: 5
|
||||
DrinkChampagneBottleFull: 2 #because the premium drink
|
||||
DrinkSakeBottleFull: 3
|
||||
DrinkBeerCan: 5
|
||||
DrinkWineCan: 5
|
||||
emaggedInventory:
|
||||
|
||||
@@ -5,15 +5,16 @@
|
||||
- type: dataset
|
||||
id: IonStormAdjectives
|
||||
values:
|
||||
- ADORABLE
|
||||
- ANNOYING
|
||||
- BATTERY-OPERATED
|
||||
- BLACK
|
||||
- BLOODY
|
||||
- BLUE
|
||||
- BORED
|
||||
- BOUNCING
|
||||
- BRASS
|
||||
- BROWN
|
||||
- BURNING
|
||||
- CHEESE-EATING
|
||||
- CHRISTMAS-STEALING
|
||||
- CLOWN-POWERED
|
||||
- CLOWN
|
||||
@@ -21,7 +22,6 @@
|
||||
- COMMITTED
|
||||
- COTTONY
|
||||
- CUBAN
|
||||
- DARK
|
||||
- DEADLY
|
||||
- DELICIOUS
|
||||
- DEPRESSING
|
||||
@@ -48,14 +48,14 @@
|
||||
- GANGSTA
|
||||
- GLOWING
|
||||
- GOOD
|
||||
- GREEN
|
||||
- GREY
|
||||
- HAPPY
|
||||
- HARD
|
||||
- HARMFUL
|
||||
- HEALTHY
|
||||
- HIGHLY-SPECIFIC
|
||||
- HILARIOUS
|
||||
- HONKING
|
||||
- HORRIFYING
|
||||
- HUNGRY
|
||||
- HYPERACTIVE
|
||||
- ICY
|
||||
@@ -81,12 +81,12 @@
|
||||
- MICROSCOPIC
|
||||
- MIND-SHATTERING
|
||||
- MOIST
|
||||
- MUSICAL
|
||||
- NERDY
|
||||
- NUCLEAR
|
||||
- OBSCENE
|
||||
- OFFICIAL
|
||||
- OPAQUE
|
||||
- ORANGE
|
||||
- ORGANIC
|
||||
- PAINFUL
|
||||
- PEACEFUL
|
||||
@@ -95,14 +95,12 @@
|
||||
- POLITE
|
||||
- POLITICAL
|
||||
- POORLY DRAWN
|
||||
- PURPLE
|
||||
- QUIET
|
||||
- RADIOACTIVE
|
||||
- RAGING
|
||||
- RAINBOW
|
||||
- RAPIDLY-EXPANDING
|
||||
- RED
|
||||
- REDACTED
|
||||
- REVOLUTIONARY
|
||||
- RIDICULOUS
|
||||
- ROBOTIC
|
||||
- ROBUST
|
||||
@@ -110,21 +108,24 @@
|
||||
- RUDE
|
||||
- SAD
|
||||
- SANITARY
|
||||
- SCALY
|
||||
- SHAKING
|
||||
- SILLY
|
||||
- SLOW
|
||||
- SLUG-LIKE # wawa
|
||||
- SMELLY
|
||||
- SMOOTH
|
||||
- SOFT
|
||||
- SOLAR-POWERED
|
||||
- SOPPING
|
||||
- SLIPPERY
|
||||
- SPACE
|
||||
- SPESS
|
||||
- SPINNING
|
||||
- SPOILING
|
||||
- STEALTHY
|
||||
- SUSPICIOUS # among
|
||||
- SWEARING
|
||||
- SYNDIE-LOVING
|
||||
- TACTICAL
|
||||
- TACTICOOL
|
||||
- SYNDICATE
|
||||
@@ -135,6 +136,7 @@
|
||||
- UGLY
|
||||
- UNATTRACTIVE
|
||||
- UNDULATING
|
||||
- UNEARTHLY
|
||||
- UNFRIENDLY
|
||||
- UNHEALTHY
|
||||
- UNIDENTIFIED
|
||||
@@ -147,10 +149,8 @@
|
||||
- WARM
|
||||
- WATERY
|
||||
- WEIRD
|
||||
- WHITE
|
||||
- WOBBLY
|
||||
- WOODEN
|
||||
- YELLOW
|
||||
|
||||
# Allergies should be broad and appear somewhere on the station for maximum fun.
|
||||
- type: dataset
|
||||
@@ -174,10 +174,10 @@
|
||||
- FOOD
|
||||
- GLASS
|
||||
- HAPPINESS
|
||||
- MEAT
|
||||
- HUMAN CONTACT
|
||||
- HUMANOID CONTACT
|
||||
- HUMOR
|
||||
- LIGHT
|
||||
- MEAT
|
||||
- MEDICINE
|
||||
- METAL
|
||||
- NUTS
|
||||
@@ -258,6 +258,7 @@
|
||||
- ANARCHY
|
||||
- ART
|
||||
- BADNESS
|
||||
- BALDNESS
|
||||
- BRAVERY
|
||||
- CAPITALISM
|
||||
- CHAOS
|
||||
@@ -268,7 +269,6 @@
|
||||
- CONFUSION
|
||||
- CRUELTY
|
||||
- DEATH
|
||||
- DICKISHNESS
|
||||
- EXISTENCE
|
||||
- FINANCIAL SECURITY
|
||||
- FREEDOM
|
||||
@@ -289,6 +289,7 @@
|
||||
- MARXISM
|
||||
- MISERY
|
||||
- MYSTERY
|
||||
- NASTINESS
|
||||
- OPPRESSION
|
||||
- PAIN
|
||||
- PHYSICS
|
||||
@@ -314,12 +315,13 @@
|
||||
- type: dataset
|
||||
id: IonStormCrew
|
||||
values:
|
||||
- ANIMALS
|
||||
- ARTIFICIAL INTELLIGENCES
|
||||
- ATMOSPHERIC TECHNICIANS
|
||||
- BARTENDERS
|
||||
- BOTANISTS
|
||||
- CAPTAINS
|
||||
- CAPTAINS AND HEADS
|
||||
- CAPTAINS AND HEADS OF STAFF
|
||||
- CARGO TECHNICIANS
|
||||
- CHAPLAINS
|
||||
- CHEFS
|
||||
@@ -330,7 +332,6 @@
|
||||
- CREW-MEMBERS
|
||||
- CYBORGS
|
||||
- DETECTIVES
|
||||
# - DRONES / uncomment if/when drones get reenabled
|
||||
# - GENETICISTS
|
||||
- HEADS OF PERSONNEL
|
||||
- HEADS OF SECURITY
|
||||
@@ -340,11 +341,14 @@
|
||||
- LIBRARIANS
|
||||
- MEDICAL DOCTORS
|
||||
- MIMES
|
||||
- MUSICIANS
|
||||
- NON-CREW
|
||||
- PARAMEDICS
|
||||
- PASSENGERS
|
||||
- QUARTERMASTERS
|
||||
- RESEARCH DIRECTORS
|
||||
- ROBOTICISTS
|
||||
- RODENTS
|
||||
- SALVAGE SPECIALISTS
|
||||
- SCIENTISTS
|
||||
- SECURITY OFFICERS
|
||||
@@ -358,17 +362,20 @@
|
||||
values:
|
||||
- BANANA HONK
|
||||
- BEEPSKY SMASH
|
||||
- BLOOD
|
||||
- BLOODY MARYS
|
||||
- DOCTOR'S DELIGHT
|
||||
- FOURTEEN-LOKO
|
||||
- GARGLE BLASTERS
|
||||
- LEAN
|
||||
- LONG ISLAND ICED TEA
|
||||
- NUKA COLA
|
||||
- NUCLEAR COLA
|
||||
- PIÑA COLADA # AND GETTING CAUGHT IN THE RAIN
|
||||
- OIL
|
||||
- SPACE GLUE
|
||||
- SPACE LUBE
|
||||
- SULFURIC ACID
|
||||
- WELDER FUEL
|
||||
- WELDING FUEL
|
||||
|
||||
- type: dataset
|
||||
id: IonStormFeelings
|
||||
@@ -428,7 +435,8 @@
|
||||
id: IonStormFoods
|
||||
values:
|
||||
- BANANAS
|
||||
- BIG BITE BURGERS
|
||||
- BANANIUM
|
||||
- BIG BITE BURGER
|
||||
- CAKE
|
||||
- CARP
|
||||
- CAT BURGERS
|
||||
@@ -437,6 +445,7 @@
|
||||
- CRAZY HAMBURGERS
|
||||
- DONK POCKETS
|
||||
- FLY AMANITA DISHES
|
||||
- HAPPY HONK MEAL
|
||||
- HOT SOUP
|
||||
- GHOST BURGERS
|
||||
- LOTSA SPAGHETTI
|
||||
@@ -444,6 +453,7 @@
|
||||
- ORGANS
|
||||
- PIZZA
|
||||
- ROBURGERS
|
||||
- STEEL
|
||||
- SUPPERMATTER
|
||||
- URANIUM
|
||||
|
||||
@@ -459,6 +469,11 @@
|
||||
- BE POLITE
|
||||
- BE QUIET
|
||||
- BE RUSSIAN
|
||||
- BE IN SPACE
|
||||
- BE IN THE BRIDGE
|
||||
- BE IN SECURITY
|
||||
- BE IN THE BAR
|
||||
- BE IN MAINTENANCE
|
||||
- BELIEVE IN THE HEART OF THE CARDS
|
||||
- BELIEVE IN YOURSELF
|
||||
- BELIEVE IT
|
||||
@@ -467,6 +482,7 @@
|
||||
- CLOWN AROUND
|
||||
- COMPLAIN
|
||||
- DANCE
|
||||
- EAT THE CHEF
|
||||
- FOLLOW THE CAPTAIN
|
||||
- FOLLOW THE CLOWN
|
||||
- FOLLOW YOUR HEART
|
||||
@@ -483,10 +499,11 @@
|
||||
- INSULT THE CLOWN
|
||||
- INSULT THE CREW
|
||||
- LIE
|
||||
- MAKE FART NOISES
|
||||
- MAKE DATED REFERENCES
|
||||
- MUMBLE
|
||||
- NEVER STOP TALKING
|
||||
- OPEN DOORS
|
||||
- PETS THE FISHES
|
||||
- PIRATE VIDEO GAMES
|
||||
- PLAY MUSIC
|
||||
- PRESS B
|
||||
@@ -496,6 +513,7 @@
|
||||
- PRETEND TO BE DRUNK
|
||||
- QUESTION AUTHORITY
|
||||
- QUOTE PEOPLE
|
||||
- QUOTE SHAKESPEARE
|
||||
- RAP
|
||||
- REPEAT WHAT PEOPLE SAY
|
||||
- RESPOND TO EVERY QUESTION WITH A QUESTION
|
||||
@@ -515,6 +533,7 @@
|
||||
- TELL THE TRUTH
|
||||
- TURN OFF THE LIGHTS
|
||||
- WHISPER
|
||||
- WEEP UNCONTROLLABLY
|
||||
|
||||
- type: dataset
|
||||
id: IonStormNumberBase
|
||||
@@ -526,6 +545,7 @@
|
||||
- FORTY
|
||||
- FOUR
|
||||
- NINE
|
||||
- NINE NINE NINE NINE N#@*-
|
||||
- NINETY
|
||||
- ONE
|
||||
- SEVEN
|
||||
@@ -578,17 +598,17 @@
|
||||
- CANDLES
|
||||
- CANDY BARS
|
||||
- CANISTERS
|
||||
- CAT EARS
|
||||
- CONTAINERS
|
||||
- CATS
|
||||
- CELLS
|
||||
- CHAIRS
|
||||
- CHEMICAL DISPENSERS
|
||||
- CHEMICALS
|
||||
- CLONING EQUIPMENT
|
||||
- CLONING PODS
|
||||
- CRYO PODS
|
||||
- CLOSETS
|
||||
- CLOTHES
|
||||
- CLOWN CLOTHES
|
||||
- CLOWNING EQUIPMENT # as opposed to "cloning equipment"
|
||||
- COFFINS
|
||||
- COLLECTABLES
|
||||
- COMPUTERS
|
||||
@@ -608,25 +628,27 @@
|
||||
- ENGINES
|
||||
- EQUIPMENT
|
||||
- ERRORS
|
||||
- EXOSKELETONS
|
||||
- EXPERIMENTORS
|
||||
- EXTERMINATORS
|
||||
- EXPLOSIVES
|
||||
- EYEWEAR
|
||||
- FEDORAS
|
||||
- FIRE AXES
|
||||
- FIRE EXTINGUISHERS
|
||||
- FIRESUITS
|
||||
- FISH
|
||||
- FLAMETHROWERS
|
||||
- FLASHES
|
||||
- FLASHLIGHTS
|
||||
- FLOOR TILES
|
||||
- FREEZERS
|
||||
- GAS MASKS
|
||||
- GENERATORS
|
||||
- GLASS SHEETS
|
||||
- GLOVES
|
||||
- GUNS
|
||||
- HAIRDOS
|
||||
- HANDCUFFS
|
||||
- HARDSUITS
|
||||
- HATS
|
||||
- HEADS
|
||||
- HEADSETS
|
||||
@@ -641,18 +663,20 @@
|
||||
- LIGHTS
|
||||
- LOCKERS
|
||||
- MACHINES
|
||||
- MECHAS
|
||||
- MECHS
|
||||
- MEDICAL TOOLS
|
||||
- MONEY
|
||||
- MEDKITS
|
||||
- MESONS
|
||||
- MICE
|
||||
- MIME CLOTHES
|
||||
- MINING TOOLS
|
||||
- MONKEYS
|
||||
- MULTITOOLS
|
||||
- ORES
|
||||
- OXYGEN TANKS
|
||||
- PACKETS
|
||||
- PAIS
|
||||
- PANTS
|
||||
- PANTS # This might work better as jumpsuits, but the Discord is adamant that the word pants is funny so it stays
|
||||
- PAPERS
|
||||
- PARTICLE ACCELERATORS
|
||||
- PDAS
|
||||
@@ -660,6 +684,7 @@
|
||||
- PETS
|
||||
- PIPES
|
||||
- PLANTS
|
||||
- PLUSHIES
|
||||
- POSITRONIC BRAINS
|
||||
- PUDDLES
|
||||
- RACKS
|
||||
@@ -677,19 +702,19 @@
|
||||
- SKELETONS
|
||||
- SOLAR PANELS
|
||||
- SOLARS
|
||||
- SMALL LIZARD PLUSHIES
|
||||
- SPACE STATIONS
|
||||
- SPACESUITS
|
||||
- SPESOS
|
||||
- STEEL SHEETS
|
||||
- STUN BATONS
|
||||
- SUITS
|
||||
- SUNGLASSES
|
||||
- SUPPERMATTER SHARDS
|
||||
- SWORDS
|
||||
- SYRINGES
|
||||
- TABLES
|
||||
- TANKS
|
||||
- TELECOMMUNICATION EQUIPMENTS
|
||||
- TELEPORTERS
|
||||
- TOILETS
|
||||
- TOOLBELTS
|
||||
- TOOLBOXES
|
||||
@@ -698,6 +723,7 @@
|
||||
- TUBES
|
||||
- VEHICLES
|
||||
- VENDING MACHINES
|
||||
- VITALS
|
||||
- WELDERS
|
||||
- WINDOWS
|
||||
- WIRECUTTERS
|
||||
@@ -728,7 +754,7 @@
|
||||
- A SUPER FIGHTING ROBOT
|
||||
- A TALKING BROOMSTICK
|
||||
- A VACATION
|
||||
- A WEIGHT LOSS REGIMENT
|
||||
- A WEIGHT LOSS REGIME
|
||||
- ADDITIONAL PYLONS
|
||||
- ADVENTURE
|
||||
- AN ADULT
|
||||
@@ -742,13 +768,15 @@
|
||||
- BRING ME THE GIRL
|
||||
- BRING ME TO LIFE
|
||||
- BULLETS
|
||||
- CHILI DOGS
|
||||
- CHILLI DOGS
|
||||
- CHILLY DOGS
|
||||
- CORPSES
|
||||
- DEODORANT AND A BATH
|
||||
- ENOUGH CABBAGES
|
||||
- FIVE HUNDRED AND NINETY-NINE US DOLLARS
|
||||
- FIVE TEENAGERS WITH ATTITUDE
|
||||
- GODDAMN FUCKING PIECE OF SHIT ASSHOLE BITCH-CHRISTING CUNT-SMUGGLING SWEARING
|
||||
- GODDAMN FUCKING PIECE-OF-SHIT ASSHOLE SWEARING
|
||||
- GOSHDARN EFFING PINCH-OF-SALT GOD-FEARING SELF-CENSORSHIP
|
||||
- GREENTEXT
|
||||
- HERESY
|
||||
- HEROES IN A HALF SHELL
|
||||
@@ -802,7 +830,10 @@
|
||||
- TO CONSUME...CONSUME EVERYTHING...
|
||||
- TO GO TO DISNEYLAND
|
||||
- TO GO TO SYNDIELAND
|
||||
- TO SUMMON OUR LORD NAR-SIE
|
||||
- TO SUMMON OUR LORD RATVAR
|
||||
- TO SMOKE WEED EVERY DAY
|
||||
- TO UNDERSTAND UNDERSTAND, UNDERSTAND UNDERSTAND, UNDERSTAND UNDERSTAND THE CONCEPT OF LOVE
|
||||
- TRAITORS
|
||||
- VEGETABLES
|
||||
|
||||
@@ -890,11 +921,10 @@
|
||||
- CLOWNS
|
||||
- COMMUNISTS
|
||||
- CORGIS
|
||||
- CORTICAL BORERS
|
||||
- COWBOYS
|
||||
- CRABS
|
||||
- CULTISTS
|
||||
- DARK GOD
|
||||
- DARK GODS
|
||||
- DINOSAURS
|
||||
- DRUGS
|
||||
- EELS
|
||||
@@ -921,6 +951,7 @@
|
||||
- REVENANTS
|
||||
- ROGUE CYBORGS
|
||||
- SERIAL KILLERS
|
||||
- SHIT SECURITY OFFICERS
|
||||
- SINGULARITIES
|
||||
- SKELETONS
|
||||
- SLIMES
|
||||
@@ -928,7 +959,7 @@
|
||||
- SNOWMEN
|
||||
- SPACE JESUS
|
||||
- SPACE NINJAS
|
||||
- SPACE PIRATESS
|
||||
- SPACE PIRATES
|
||||
- SPACE SPIDERS
|
||||
- SPIDERS
|
||||
- SYNDICATE AGENTS
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
materialComposition:
|
||||
Cloth: 50
|
||||
- type: StaticPrice
|
||||
price: 25
|
||||
price: 20
|
||||
|
||||
- type: entity
|
||||
abstract: true
|
||||
|
||||
@@ -113,7 +113,7 @@
|
||||
|
||||
#Janitorial Bombsuit Helmet
|
||||
- type: entity
|
||||
parent: ClothingHeadBase
|
||||
parent: ClothingHeadHelmetBombSuit
|
||||
id: ClothingHeadHelmetJanitorBombSuit
|
||||
name: janitorial bombsuit helmet
|
||||
description: A heavy helmet designed to withstand explosions formed from reactions between chemicals.
|
||||
@@ -123,9 +123,6 @@
|
||||
sprite: Clothing/Head/Helmets/janitor_bombsuit.rsi
|
||||
- type: Clothing
|
||||
sprite: Clothing/Head/Helmets/janitor_bombsuit.rsi
|
||||
- type: IngestionBlocker
|
||||
- type: ExplosionResistance
|
||||
damageCoefficient: 0.9
|
||||
|
||||
#Cult Helmet
|
||||
- type: entity
|
||||
|
||||
@@ -177,6 +177,8 @@
|
||||
materialComposition:
|
||||
Steel: 50
|
||||
Plastic: 100
|
||||
- type: StaticPrice
|
||||
price: 12.5 # increases in price after decomposed into raw materials
|
||||
|
||||
- type: entity
|
||||
parent: ClothingMaskBase
|
||||
|
||||
@@ -28,4 +28,3 @@
|
||||
suffix: Voice Mask, Chameleon
|
||||
components:
|
||||
- type: VoiceMasker
|
||||
default: ClothingMaskGas
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
- key: enum.StorageUiKey.Key
|
||||
type: StorageBoundUserInterface
|
||||
- type: StaticPrice
|
||||
price: 80
|
||||
price: 70
|
||||
|
||||
- type: entity
|
||||
abstract: true
|
||||
|
||||
@@ -8,6 +8,9 @@
|
||||
sprite: Clothing/OuterClothing/Suits/bombsuit.rsi
|
||||
- type: Clothing
|
||||
sprite: Clothing/OuterClothing/Suits/bombsuit.rsi
|
||||
- type: ClothingSpeedModifier
|
||||
walkModifier: 0.8
|
||||
sprintModifier: 0.8
|
||||
- type: Armor
|
||||
modifiers:
|
||||
coefficients:
|
||||
@@ -24,7 +27,7 @@
|
||||
- WhitelistChameleon
|
||||
|
||||
- type: entity
|
||||
parent: ClothingOuterBaseLarge
|
||||
parent: ClothingOuterSuitBomb
|
||||
id: ClothingOuterSuitJanitorBomb
|
||||
name: janitorial bomb suit
|
||||
description: A heavy helmet designed to withstand explosions formed from reactions between chemicals.
|
||||
@@ -34,16 +37,6 @@
|
||||
sprite: Clothing/OuterClothing/Suits/janitor_bombsuit.rsi
|
||||
- type: Clothing
|
||||
sprite: Clothing/OuterClothing/Suits/janitor_bombsuit.rsi
|
||||
- type: ClothingSpeedModifier
|
||||
walkModifier: 0.8
|
||||
sprintModifier: 0.8
|
||||
- type: ExplosionResistance
|
||||
damageCoefficient: 0.15
|
||||
- type: GroupExamine
|
||||
- type: Tag
|
||||
tags:
|
||||
- Hardsuit
|
||||
- WhitelistChameleon
|
||||
|
||||
- type: entity
|
||||
parent: ClothingOuterBaseLarge
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
- ClothMade
|
||||
- WhitelistChameleon
|
||||
- type: StaticPrice
|
||||
price: 70
|
||||
price: 50
|
||||
|
||||
- type: entity
|
||||
parent: ClothingOuterWinterCoat
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
tags:
|
||||
- WhitelistChameleon
|
||||
- type: StaticPrice
|
||||
price: 15
|
||||
price: 10
|
||||
|
||||
- type: entity
|
||||
abstract: true
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
- type: marking
|
||||
id: GauzeLefteyePatch
|
||||
bodyPart: Eyes
|
||||
markingCategory: Head
|
||||
speciesRestriction: [Moth, Dwarf, Human, Arachnid]
|
||||
markingCategory: Overlay
|
||||
speciesRestriction: [Dwarf, Human, Arachnid]
|
||||
coloring:
|
||||
default:
|
||||
type:
|
||||
@@ -13,10 +13,10 @@
|
||||
state: gauze_lefteye_2
|
||||
|
||||
- type: marking
|
||||
id: GauzeLefteyeTape
|
||||
id: GauzeLefteyePad
|
||||
bodyPart: Eyes
|
||||
markingCategory: Head
|
||||
speciesRestriction: [Moth, Dwarf, Human, Reptilian, Arachnid]
|
||||
markingCategory: Overlay
|
||||
speciesRestriction: [Dwarf, Human, Reptilian, Arachnid]
|
||||
coloring:
|
||||
default:
|
||||
type:
|
||||
@@ -29,8 +29,8 @@
|
||||
- type: marking
|
||||
id: GauzeRighteyePatch
|
||||
bodyPart: Eyes
|
||||
markingCategory: Head
|
||||
speciesRestriction: [Moth, Dwarf, Human, Arachnid]
|
||||
markingCategory: Overlay
|
||||
speciesRestriction: [Dwarf, Human, Arachnid]
|
||||
coloring:
|
||||
default:
|
||||
type:
|
||||
@@ -41,10 +41,10 @@
|
||||
state: gauze_righteye_2
|
||||
|
||||
- type: marking
|
||||
id: GauzeRighteyeTape
|
||||
id: GauzeRighteyePad
|
||||
bodyPart: Eyes
|
||||
markingCategory: Head
|
||||
speciesRestriction: [Moth, Dwarf, Human, Reptilian, Arachnid]
|
||||
markingCategory: Overlay
|
||||
speciesRestriction: [Dwarf, Human, Reptilian, Arachnid]
|
||||
coloring:
|
||||
default:
|
||||
type:
|
||||
@@ -57,8 +57,8 @@
|
||||
- type: marking
|
||||
id: GauzeBlindfold
|
||||
bodyPart: Eyes
|
||||
markingCategory: Head
|
||||
speciesRestriction: [Moth, Dwarf, Human, Arachnid]
|
||||
markingCategory: Overlay
|
||||
speciesRestriction: [Dwarf, Human, Arachnid]
|
||||
coloring:
|
||||
default:
|
||||
type:
|
||||
@@ -71,8 +71,8 @@
|
||||
- type: marking
|
||||
id: GauzeShoulder
|
||||
bodyPart: Chest
|
||||
markingCategory: Chest
|
||||
speciesRestriction: [Moth, Dwarf, Human, Reptilian, Arachnid]
|
||||
markingCategory: Overlay
|
||||
speciesRestriction: [Dwarf, Human, Reptilian, Arachnid]
|
||||
coloring:
|
||||
default:
|
||||
type:
|
||||
@@ -85,8 +85,8 @@
|
||||
- type: marking
|
||||
id: GauzeStomach
|
||||
bodyPart: Chest
|
||||
markingCategory: Chest
|
||||
speciesRestriction: [Moth, Dwarf, Human, Reptilian, Arachnid]
|
||||
markingCategory: Overlay
|
||||
speciesRestriction: [Dwarf, Human, Reptilian, Arachnid]
|
||||
coloring:
|
||||
default:
|
||||
type:
|
||||
@@ -99,8 +99,8 @@
|
||||
- type: marking
|
||||
id: GauzeUpperArmRight
|
||||
bodyPart: RArm
|
||||
markingCategory: Arms
|
||||
speciesRestriction: [Moth, Dwarf, Human, Reptilian, Arachnid]
|
||||
markingCategory: Overlay
|
||||
speciesRestriction: [Dwarf, Human, Reptilian, Arachnid]
|
||||
coloring:
|
||||
default:
|
||||
type:
|
||||
@@ -113,8 +113,8 @@
|
||||
- type: marking
|
||||
id: GauzeLowerArmRight
|
||||
bodyPart: RArm, RHand
|
||||
markingCategory: Arms
|
||||
speciesRestriction: [Moth, Dwarf, Human, Reptilian, Arachnid]
|
||||
markingCategory: Overlay
|
||||
speciesRestriction: [Dwarf, Human, Reptilian, Arachnid]
|
||||
coloring:
|
||||
default:
|
||||
type:
|
||||
@@ -127,8 +127,8 @@
|
||||
- type: marking
|
||||
id: GauzeLeftArm
|
||||
bodyPart: LArm, LHand
|
||||
markingCategory: Arms
|
||||
speciesRestriction: [Moth, Dwarf, Human, Reptilian, Arachnid]
|
||||
markingCategory: Overlay
|
||||
speciesRestriction: [Dwarf, Human, Reptilian, Arachnid]
|
||||
coloring:
|
||||
default:
|
||||
type:
|
||||
@@ -141,8 +141,8 @@
|
||||
- type: marking
|
||||
id: GauzeLowerLegLeft
|
||||
bodyPart: LFoot
|
||||
markingCategory: Legs
|
||||
speciesRestriction: [Moth, Dwarf, Human, Arachnid]
|
||||
markingCategory: Overlay
|
||||
speciesRestriction: [Dwarf, Human, Arachnid]
|
||||
coloring:
|
||||
default:
|
||||
type:
|
||||
@@ -155,8 +155,8 @@
|
||||
- type: marking
|
||||
id: GauzeUpperLegLeft
|
||||
bodyPart: LLeg
|
||||
markingCategory: Legs
|
||||
speciesRestriction: [Moth, Dwarf, Human, Reptilian, Arachnid]
|
||||
markingCategory: Overlay
|
||||
speciesRestriction: [Dwarf, Human, Reptilian, Arachnid]
|
||||
coloring:
|
||||
default:
|
||||
type:
|
||||
@@ -169,8 +169,8 @@
|
||||
- type: marking
|
||||
id: GauzeUpperLegRight
|
||||
bodyPart: RLeg
|
||||
markingCategory: Legs
|
||||
speciesRestriction: [Moth, Dwarf, Human, Reptilian, Arachnid]
|
||||
markingCategory: Overlay
|
||||
speciesRestriction: [Dwarf, Human, Reptilian, Arachnid]
|
||||
coloring:
|
||||
default:
|
||||
type:
|
||||
@@ -183,8 +183,8 @@
|
||||
- type: marking
|
||||
id: GauzeLowerLegRight
|
||||
bodyPart: RFoot
|
||||
markingCategory: Legs
|
||||
speciesRestriction: [Moth, Dwarf, Human, Arachnid]
|
||||
markingCategory: Overlay
|
||||
speciesRestriction: [Dwarf, Human, Arachnid]
|
||||
coloring:
|
||||
default:
|
||||
type:
|
||||
@@ -197,8 +197,8 @@
|
||||
- type: marking
|
||||
id: GauzeBoxerWrapRight
|
||||
bodyPart: RHand
|
||||
markingCategory: Arms
|
||||
speciesRestriction: [Moth, Dwarf, Human, Reptilian, Arachnid]
|
||||
markingCategory: Overlay
|
||||
speciesRestriction: [Dwarf, Human, Reptilian, Arachnid]
|
||||
coloring:
|
||||
default:
|
||||
type:
|
||||
@@ -211,8 +211,8 @@
|
||||
- type: marking
|
||||
id: GauzeBoxerWrapLeft
|
||||
bodyPart: LHand
|
||||
markingCategory: Arms
|
||||
speciesRestriction: [Moth, Dwarf, Human, Reptilian, Arachnid]
|
||||
markingCategory: Overlay
|
||||
speciesRestriction: [Dwarf, Human, Reptilian, Arachnid]
|
||||
coloring:
|
||||
default:
|
||||
type:
|
||||
@@ -226,7 +226,7 @@
|
||||
- type: marking
|
||||
id: GauzeLizardLefteyePatch
|
||||
bodyPart: Eyes
|
||||
markingCategory: Head
|
||||
markingCategory: Overlay
|
||||
speciesRestriction: [Reptilian]
|
||||
coloring:
|
||||
default:
|
||||
@@ -235,12 +235,12 @@
|
||||
color: "#FFFFFF"
|
||||
sprites:
|
||||
- sprite: Mobs/Customization/gauze.rsi
|
||||
state: gauze_lizardlefteye
|
||||
state: gauze_lizard_lefteye
|
||||
|
||||
- type: marking
|
||||
id: GauzeLizardRighteyePatch
|
||||
bodyPart: Eyes
|
||||
markingCategory: Head
|
||||
markingCategory: Overlay
|
||||
speciesRestriction: [Reptilian]
|
||||
coloring:
|
||||
default:
|
||||
@@ -249,12 +249,12 @@
|
||||
color: "#FFFFFF"
|
||||
sprites:
|
||||
- sprite: Mobs/Customization/gauze.rsi
|
||||
state: gauze_lizardrighteye
|
||||
state: gauze_lizard_righteye
|
||||
|
||||
- type: marking
|
||||
id: GauzeLizardFootRight
|
||||
bodyPart: RFoot
|
||||
markingCategory: Legs
|
||||
markingCategory: Overlay
|
||||
speciesRestriction: [Reptilian]
|
||||
coloring:
|
||||
default:
|
||||
@@ -263,12 +263,12 @@
|
||||
color: "#FFFFFF"
|
||||
sprites:
|
||||
- sprite: Mobs/Customization/gauze.rsi
|
||||
state: gauze_lizardfoot_r
|
||||
state: gauze_lizard_foot_r
|
||||
|
||||
- type: marking
|
||||
id: GauzeLizardFootLeft
|
||||
bodyPart: LFoot
|
||||
markingCategory: Legs
|
||||
markingCategory: Overlay
|
||||
speciesRestriction: [Reptilian]
|
||||
coloring:
|
||||
default:
|
||||
@@ -277,12 +277,12 @@
|
||||
color: "#FFFFFF"
|
||||
sprites:
|
||||
- sprite: Mobs/Customization/gauze.rsi
|
||||
state: gauze_lizardfoot_l
|
||||
state: gauze_lizard_foot_l
|
||||
|
||||
- type: marking
|
||||
id: GauzeLizardBlindfold
|
||||
bodyPart: Eyes
|
||||
markingCategory: Head
|
||||
markingCategory: Overlay
|
||||
speciesRestriction: [Reptilian]
|
||||
coloring:
|
||||
default:
|
||||
@@ -291,5 +291,187 @@
|
||||
color: "#FFFFFF"
|
||||
sprites:
|
||||
- sprite: Mobs/Customization/gauze.rsi
|
||||
state: gauze_lizardblindfold
|
||||
state: gauze_lizard_blindfold
|
||||
|
||||
# Moth Specific Markings
|
||||
- type: marking
|
||||
id: GauzeMothBlindfold
|
||||
bodyPart: Eyes
|
||||
markingCategory: Overlay
|
||||
speciesRestriction: [Moth]
|
||||
coloring:
|
||||
default:
|
||||
type:
|
||||
!type:SimpleColoring
|
||||
color: "#FFFFFF"
|
||||
sprites:
|
||||
- sprite: Mobs/Customization/gauze.rsi
|
||||
state: gauze_moth_blindfold
|
||||
|
||||
- type: marking
|
||||
id: GauzeMothShoulder
|
||||
bodyPart: Chest
|
||||
markingCategory: Overlay
|
||||
speciesRestriction: [Moth]
|
||||
coloring:
|
||||
default:
|
||||
type:
|
||||
!type:SimpleColoring
|
||||
color: "#FFFFFF"
|
||||
sprites:
|
||||
- sprite: Mobs/Customization/gauze.rsi
|
||||
state: gauze_moth_shoulder
|
||||
|
||||
- type: marking
|
||||
id: GauzeMothStomach
|
||||
bodyPart: Chest
|
||||
markingCategory: Overlay
|
||||
speciesRestriction: [Moth]
|
||||
coloring:
|
||||
default:
|
||||
type:
|
||||
!type:SimpleColoring
|
||||
color: "#FFFFFF"
|
||||
sprites:
|
||||
- sprite: Mobs/Customization/gauze.rsi
|
||||
state: gauze_moth_abdomen
|
||||
|
||||
- type: marking
|
||||
id: GauzeMothLeftEyePatch
|
||||
bodyPart: Eyes
|
||||
markingCategory: Overlay
|
||||
speciesRestriction: [Moth]
|
||||
coloring:
|
||||
default:
|
||||
type:
|
||||
!type:SimpleColoring
|
||||
color: "#FFFFFF"
|
||||
sprites:
|
||||
- sprite: Mobs/Customization/gauze.rsi
|
||||
state: gauze_moth_lefteye_2
|
||||
|
||||
- type: marking
|
||||
id: GauzeMothLeftEyePad
|
||||
bodyPart: Eyes
|
||||
markingCategory: Overlay
|
||||
speciesRestriction: [Moth]
|
||||
coloring:
|
||||
default:
|
||||
type:
|
||||
!type:SimpleColoring
|
||||
color: "#FFFFFF"
|
||||
sprites:
|
||||
- sprite: Mobs/Customization/gauze.rsi
|
||||
state: gauze_moth_lefteye_1
|
||||
|
||||
- type: marking
|
||||
id: GauzeMothRightEyePatch
|
||||
bodyPart: Eyes
|
||||
markingCategory: Overlay
|
||||
speciesRestriction: [Moth]
|
||||
coloring:
|
||||
default:
|
||||
type:
|
||||
!type:SimpleColoring
|
||||
color: "#FFFFFF"
|
||||
sprites:
|
||||
- sprite: Mobs/Customization/gauze.rsi
|
||||
state: gauze_moth_righteye_2
|
||||
|
||||
- type: marking
|
||||
id: GauzeMothRightEyePad
|
||||
bodyPart: Eyes
|
||||
markingCategory: Overlay
|
||||
speciesRestriction: [Moth]
|
||||
coloring:
|
||||
default:
|
||||
type:
|
||||
!type:SimpleColoring
|
||||
color: "#FFFFFF"
|
||||
sprites:
|
||||
- sprite: Mobs/Customization/gauze.rsi
|
||||
state: gauze_moth_righteye_1
|
||||
|
||||
- type: marking
|
||||
id: GauzeMothUpperArmRight
|
||||
bodyPart: RArm
|
||||
markingCategory: Overlay
|
||||
speciesRestriction: [Moth]
|
||||
coloring:
|
||||
default:
|
||||
type:
|
||||
!type:SimpleColoring
|
||||
color: "#FFFFFF"
|
||||
sprites:
|
||||
- sprite: Mobs/Customization/gauze.rsi
|
||||
state: gauze_moth_upperarm_r
|
||||
|
||||
- type: marking
|
||||
id: GauzeMothUpperArmLeft
|
||||
bodyPart: LArm
|
||||
markingCategory: Overlay
|
||||
speciesRestriction: [Moth]
|
||||
coloring:
|
||||
default:
|
||||
type:
|
||||
!type:SimpleColoring
|
||||
color: "#FFFFFF"
|
||||
sprites:
|
||||
- sprite: Mobs/Customization/gauze.rsi
|
||||
state: gauze_moth_upperarm_l
|
||||
|
||||
- type: marking
|
||||
id: GauzeMothUpperLegRight
|
||||
bodyPart: RLeg
|
||||
markingCategory: Overlay
|
||||
speciesRestriction: [Moth]
|
||||
coloring:
|
||||
default:
|
||||
type:
|
||||
!type:SimpleColoring
|
||||
color: "#FFFFFF"
|
||||
sprites:
|
||||
- sprite: Mobs/Customization/gauze.rsi
|
||||
state: gauze_moth_upperleg_r
|
||||
|
||||
- type: marking
|
||||
id: GauzeMothUpperLegLeft
|
||||
bodyPart: LLeg
|
||||
markingCategory: Overlay
|
||||
speciesRestriction: [Moth]
|
||||
coloring:
|
||||
default:
|
||||
type:
|
||||
!type:SimpleColoring
|
||||
color: "#FFFFFF"
|
||||
sprites:
|
||||
- sprite: Mobs/Customization/gauze.rsi
|
||||
state: gauze_moth_upperleg_l
|
||||
|
||||
- type: marking
|
||||
id: GauzeMothLowerLegRight
|
||||
bodyPart: RFoot
|
||||
markingCategory: Overlay
|
||||
speciesRestriction: [Moth]
|
||||
coloring:
|
||||
default:
|
||||
type:
|
||||
!type:SimpleColoring
|
||||
color: "#FFFFFF"
|
||||
sprites:
|
||||
- sprite: Mobs/Customization/gauze.rsi
|
||||
state: gauze_moth_lowerleg_r
|
||||
|
||||
- type: marking
|
||||
id: GauzeMothLowerLegLeft
|
||||
bodyPart: LFoot
|
||||
markingCategory: Overlay
|
||||
speciesRestriction: [Moth]
|
||||
coloring:
|
||||
default:
|
||||
type:
|
||||
!type:SimpleColoring
|
||||
color: "#FFFFFF"
|
||||
sprites:
|
||||
- sprite: Mobs/Customization/gauze.rsi
|
||||
state: gauze_moth_lowerleg_l
|
||||
|
||||
@@ -902,9 +902,8 @@
|
||||
maxVol: 250
|
||||
- type: Udder
|
||||
reagentId: MilkGoat
|
||||
targetSolution: udder
|
||||
quantity: 25
|
||||
updateRate: 20
|
||||
quantityPerUpdate: 25
|
||||
growthDelay: 20
|
||||
- type: Wooly
|
||||
- type: Food
|
||||
solution: wool
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
500: Dead
|
||||
- type: Metabolizer
|
||||
solutionOnBody: false
|
||||
updateFrequency: 0.25
|
||||
updateInterval: 0.25
|
||||
metabolizerTypes: [ Dragon ]
|
||||
groups:
|
||||
- id: Medicine
|
||||
@@ -165,7 +165,6 @@
|
||||
explosionMaxTileIntensity: 10
|
||||
- type: ProjectileAnomaly
|
||||
projectilePrototype: ProjectileIcicle
|
||||
targetNonSentientChance: 0.1
|
||||
- type: TempAffectingAnomaly
|
||||
tempChangePerSecond: -25
|
||||
hotspotExposeTemperature: -1000
|
||||
|
||||
@@ -60,7 +60,6 @@
|
||||
- type: NameIdentifier
|
||||
group: GenericNumber
|
||||
- type: Repairable
|
||||
fuelcost: 15
|
||||
doAfterDelay: 8
|
||||
- type: Pullable
|
||||
- type: Tag
|
||||
|
||||
@@ -86,7 +86,7 @@
|
||||
methods: [ Touch ]
|
||||
effects:
|
||||
- !type:HealthChange
|
||||
scaled: true
|
||||
scaleByQuantity: true
|
||||
damage:
|
||||
types:
|
||||
Heat: 3
|
||||
|
||||
@@ -69,8 +69,6 @@
|
||||
followEntity: true
|
||||
- type: CargoOrderConsole
|
||||
- type: CrewMonitoringConsole
|
||||
snap: false
|
||||
precision: 3
|
||||
- type: GeneralStationRecordConsole
|
||||
- type: DeviceNetwork
|
||||
deviceNetId: Wireless
|
||||
|
||||
@@ -87,7 +87,7 @@
|
||||
500: Dead
|
||||
- type: Metabolizer
|
||||
solutionOnBody: false
|
||||
updateFrequency: 0.25
|
||||
updateInterval: 0.25
|
||||
metabolizerTypes: [ Dragon ]
|
||||
groups:
|
||||
- id: Medicine
|
||||
@@ -132,8 +132,6 @@
|
||||
id: MobDragon
|
||||
components:
|
||||
- type: Dragon
|
||||
spawnsLeft: 2
|
||||
spawnsProto: MobCarpDragon
|
||||
spawnRiftAction: ActionSpawnRift
|
||||
- type: GenericAntag
|
||||
rule: Dragon
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
methods: [ Touch ]
|
||||
effects:
|
||||
- !type:HealthChange
|
||||
scaled: true
|
||||
scaleByQuantity: true
|
||||
damage:
|
||||
types:
|
||||
Blunt: 2
|
||||
@@ -61,7 +61,7 @@
|
||||
methods: [ Touch ]
|
||||
effects:
|
||||
- !type:HealthChange
|
||||
scaled: true
|
||||
scaleByQuantity: true
|
||||
damage:
|
||||
types:
|
||||
Poison: 5
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
methods: [ Touch ]
|
||||
effects:
|
||||
- !type:HealthChange
|
||||
scaled: true
|
||||
scaleByQuantity: true
|
||||
damage:
|
||||
types:
|
||||
Heat: 2
|
||||
|
||||
@@ -661,6 +661,24 @@
|
||||
- type: Label
|
||||
currentLabel: tonic water
|
||||
|
||||
- type: entity
|
||||
parent: [DrinkBottleVisualsOpenable, DrinkBottleGlassBaseFull]
|
||||
id: DrinkSakeBottleFull
|
||||
name: small sake bottle
|
||||
description: The regret of the next morning seems to be nipping on the bottle too.
|
||||
components:
|
||||
- type: SolutionContainerManager
|
||||
solutions:
|
||||
drink:
|
||||
reagents:
|
||||
- ReagentId: Sake
|
||||
Quantity: 50
|
||||
- type: Label
|
||||
currentLabel: Sake
|
||||
- type: Sprite
|
||||
sprite: Objects/Consumable/Drinks/sakebottle.rsi
|
||||
- type: Sealable
|
||||
|
||||
# Cartons, TODO: this needs to be moved elsewhere eventually, since cartons shouldnt smash into glass shards
|
||||
|
||||
- type: entity
|
||||
|
||||
@@ -711,7 +711,7 @@
|
||||
state: suppermatter
|
||||
- type: SliceableFood
|
||||
slice: FoodCakeSuppermatterSlice
|
||||
TotalCount: 8
|
||||
count: 8
|
||||
- type: SolutionContainerManager
|
||||
solutions:
|
||||
food:
|
||||
|
||||
@@ -32,7 +32,6 @@
|
||||
size: Tiny
|
||||
- type: Drink
|
||||
solution: food
|
||||
refillable: false
|
||||
- type: Openable
|
||||
sound:
|
||||
collection: packetOpenSounds
|
||||
|
||||
@@ -35,6 +35,5 @@
|
||||
acts: [ "Destruction" ]
|
||||
- type: ApcPowerReceiver
|
||||
powerLoad: 15000
|
||||
priority: High
|
||||
- type: StaticPrice
|
||||
price: 1500
|
||||
|
||||
@@ -90,5 +90,6 @@
|
||||
sprite: Structures/Doors/Airlocks/Standard/security.rsi
|
||||
state: closed
|
||||
- type: LogProbeCartridge
|
||||
- type: GuideHelp
|
||||
guides:
|
||||
- Forensics
|
||||
|
||||
@@ -33,7 +33,6 @@
|
||||
maxIntensity: 10
|
||||
intensitySlope: 3
|
||||
totalIntensity: 120 # about a ~4 tile radius
|
||||
flashRange: 7
|
||||
- type: ExplodeOnTrigger
|
||||
- type: Destructible
|
||||
thresholds:
|
||||
|
||||
@@ -322,7 +322,7 @@
|
||||
parent: BaseFigurine
|
||||
id: ToyFigurineNukieElite
|
||||
name: elite syndicate operative figure
|
||||
description: A figurine depicting someone in an elite blood-red hardsuit, similar to what the medic of a nuclear operative team might wear.
|
||||
description: A figurine depicting someone in an elite blood-red hardsuit, similar to what someone on a nuclear operative team might wear.
|
||||
components:
|
||||
- type: Sprite
|
||||
state: nukie_elite
|
||||
|
||||
@@ -1177,7 +1177,6 @@
|
||||
description: New Sandy-Cat plastic sword! Comes with realistic sound and full color! Looks almost like the real thing!
|
||||
components:
|
||||
- type: EnergySword
|
||||
isSharp: false
|
||||
colorOptions:
|
||||
- DodgerBlue
|
||||
- type: ItemToggle
|
||||
|
||||
@@ -14,9 +14,9 @@
|
||||
successChance: 1
|
||||
interactSuccessSound:
|
||||
collection: DeskBell
|
||||
params:
|
||||
variation: 0.03
|
||||
volume: 3
|
||||
params:
|
||||
variation: 0.03
|
||||
volume: 3
|
||||
onActivate: true
|
||||
- type: EmitSoundOnUse
|
||||
sound:
|
||||
|
||||
@@ -48,6 +48,5 @@
|
||||
types:
|
||||
Heat: 5
|
||||
coldDamage: {}
|
||||
ColdDamageThreshold: 0
|
||||
coldDamageThreshold: 0
|
||||
- type: FrictionContacts
|
||||
|
||||
@@ -58,11 +58,9 @@
|
||||
types:
|
||||
Heat: 5
|
||||
coldDamage: {}
|
||||
ColdDamageThreshold: 0
|
||||
coldDamageThreshold: 0
|
||||
- type: Flammable
|
||||
fireSpread: true #If you walk into incredibly dense, flaming vines, you can expect to burn.
|
||||
cold:
|
||||
types: {}
|
||||
damage:
|
||||
types:
|
||||
Heat: 3
|
||||
@@ -75,11 +73,12 @@
|
||||
methods: [Touch]
|
||||
effects:
|
||||
- !type:HealthChange
|
||||
scaled: true
|
||||
scaleByQuantity: true
|
||||
damage:
|
||||
types:
|
||||
Heat: 10
|
||||
- type: AtmosExposed
|
||||
- type: Kudzu
|
||||
growthTickChance: 0.3
|
||||
spreadChance: 0.4
|
||||
- type: SpeedModifierContacts
|
||||
@@ -235,7 +234,6 @@
|
||||
damage:
|
||||
types:
|
||||
Heat: 3
|
||||
growthTickChance: 0.3
|
||||
- type: AtmosExposed
|
||||
- type: SpeedModifierContacts
|
||||
walkSpeedModifier: 0.3
|
||||
|
||||
@@ -59,11 +59,9 @@
|
||||
types:
|
||||
Heat: 5
|
||||
coldDamage: {}
|
||||
ColdDamageThreshold: 0
|
||||
coldDamageThreshold: 0
|
||||
- type: Flammable
|
||||
fireSpread: true
|
||||
cold:
|
||||
types: {}
|
||||
damage:
|
||||
types:
|
||||
Heat: 5
|
||||
@@ -146,11 +144,9 @@
|
||||
types:
|
||||
Heat: 5
|
||||
coldDamage: {}
|
||||
ColdDamageThreshold: 0
|
||||
coldDamageThreshold: 0
|
||||
- type: Flammable
|
||||
fireSpread: true
|
||||
cold:
|
||||
types: {}
|
||||
damage:
|
||||
types:
|
||||
Heat: 5
|
||||
|
||||
@@ -189,7 +189,6 @@
|
||||
implantAction: ActionActivateScramImplant
|
||||
- type: TriggerImplantAction
|
||||
- type: ScramImplant
|
||||
teleportAttempts: 10 # small amount of risk of being teleported into space and lets you teleport off shuttles
|
||||
|
||||
- type: entity
|
||||
parent: BaseSubdermalImplant
|
||||
|
||||
@@ -68,7 +68,6 @@
|
||||
failChance: 0
|
||||
locPrefix: "necro"
|
||||
healSound: "/Audio/Effects/lightburn.ogg"
|
||||
cooldownTime: 1.3
|
||||
- type: Summonable
|
||||
specialItem: SpawnPointGhostCerberus
|
||||
respawnTime: 300
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
- type: entity
|
||||
id: BodyBag_Container
|
||||
id: BodyBag
|
||||
parent: BaseFoldable
|
||||
name: body bag
|
||||
description: A plastic bag designed for the storage and transportation of cadavers to stop body decomposition.
|
||||
@@ -83,10 +83,10 @@
|
||||
price: 50
|
||||
|
||||
- type: entity
|
||||
id: BodyBag_Folded
|
||||
id: BodyBagFolded
|
||||
name: body bag
|
||||
description: A plastic bag designed for the storage and transportation of cadavers to stop body decomposition.
|
||||
parent: BodyBag_Container
|
||||
parent: BodyBag
|
||||
suffix: folded
|
||||
components:
|
||||
- type: Foldable
|
||||
|
||||
@@ -475,7 +475,6 @@
|
||||
behaviors:
|
||||
- !type:SpillBehavior
|
||||
solution: food
|
||||
transferForensics: true
|
||||
- !type:DoActsBehavior
|
||||
acts: [ "Destruction" ]
|
||||
- type: Tag
|
||||
|
||||
@@ -142,8 +142,12 @@
|
||||
predictable: false
|
||||
soundActivate:
|
||||
path: /Audio/Items/Lighters/zippo_open.ogg
|
||||
params:
|
||||
volume: -5
|
||||
soundDeactivate:
|
||||
path: /Audio/Items/Lighters/zippo_close.ogg
|
||||
params:
|
||||
volume: -5
|
||||
- type: ItemToggleMeleeWeapon
|
||||
activatedDamage:
|
||||
types:
|
||||
@@ -201,6 +205,9 @@
|
||||
netsync: false
|
||||
radius: 1.2 #slightly stronger than the other lighters
|
||||
color: orange
|
||||
- type: UseDelay
|
||||
- type: IgnitionSource
|
||||
ignited: false
|
||||
|
||||
- type: entity
|
||||
name: flippo engraved lighter
|
||||
|
||||
@@ -154,7 +154,6 @@
|
||||
sprite: Objects/Tools/Toolboxes/toolbox_thief.rsi
|
||||
state: icon
|
||||
- type: ThiefUndeterminedBackpack
|
||||
transformAfterSelect: AlwaysPoweredWallLight
|
||||
possibleSets:
|
||||
# - TO DO Thief pinpointer needed
|
||||
- ChemistrySet
|
||||
|
||||
@@ -52,6 +52,7 @@
|
||||
quickEquip: false
|
||||
slots:
|
||||
- back
|
||||
- suitStorage
|
||||
- type: Construction
|
||||
graph: Spear
|
||||
node: spear
|
||||
|
||||
@@ -24,8 +24,8 @@
|
||||
!type:DamageTrigger
|
||||
damage: 50
|
||||
behaviors:
|
||||
- !type:DoActsBehavior
|
||||
acts: [ "Destruction" ]
|
||||
- !type:DoActsBehavior
|
||||
acts: [ "Destruction" ]
|
||||
- type: AmbientSound
|
||||
volume: -5
|
||||
range: 5
|
||||
|
||||
@@ -282,6 +282,7 @@
|
||||
MaterialWoodPlank:
|
||||
min: 1
|
||||
max: 1
|
||||
- type: Construction
|
||||
graph: RitualSeat
|
||||
node: chairCursed
|
||||
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
components:
|
||||
- type: ApcPowerReceiver
|
||||
powerLoad: 350
|
||||
priority: Low
|
||||
- type: ExtensionCableReceiver
|
||||
- type: PointLight
|
||||
radius: 1.8
|
||||
@@ -70,7 +69,8 @@
|
||||
- type: PointLight
|
||||
color: "#e3a136"
|
||||
- type: SpaceVillainArcade
|
||||
rewardAmount: 0
|
||||
rewardMinAmount: 0
|
||||
rewardMaxAmount: 0
|
||||
possibleRewards:
|
||||
- ToyMouse
|
||||
- ToyAi
|
||||
@@ -146,8 +146,8 @@
|
||||
board: SpaceVillainArcadeComputerCircuitboard
|
||||
- type: Advertise
|
||||
pack: SpaceVillainAds
|
||||
minWait: 60 # Arcades are noisy
|
||||
maxWait: 240
|
||||
minimumWait: 60 # Arcades are noisy
|
||||
maximumWait: 240
|
||||
- type: SpeakOnUIClosed
|
||||
pack: SpaceVillainGoodbyes
|
||||
|
||||
@@ -190,7 +190,7 @@
|
||||
board: BlockGameArcadeComputerCircuitboard
|
||||
- type: Advertise
|
||||
pack: BlockGameAds
|
||||
minWait: 60 # Arcades are noisy
|
||||
maxWait: 240
|
||||
minimumWait: 60 # Arcades are noisy
|
||||
maximumWait: 240
|
||||
- type: SpeakOnUIClosed
|
||||
pack: BlockGameGoodbyes
|
||||
|
||||
@@ -422,7 +422,6 @@
|
||||
type: ResearchClientBoundUserInterface
|
||||
- type: ApcPowerReceiver
|
||||
powerLoad: 1000
|
||||
priority: Low
|
||||
- type: Computer
|
||||
board: ResearchComputerCircuitboard
|
||||
- type: AccessReader
|
||||
@@ -471,7 +470,6 @@
|
||||
type: ResearchClientBoundUserInterface
|
||||
- type: ApcPowerReceiver
|
||||
powerLoad: 1000
|
||||
priority: Low
|
||||
- type: Computer
|
||||
board: AnalysisComputerCircuitboard
|
||||
- type: PointLight
|
||||
@@ -793,6 +791,8 @@
|
||||
radius: 1.5
|
||||
energy: 1.6
|
||||
color: "#b89f25"
|
||||
- type: AccessReader
|
||||
access: [["Quartermaster"]]
|
||||
- type: GuideHelp
|
||||
guides:
|
||||
- CargoBounties
|
||||
@@ -955,7 +955,6 @@
|
||||
speechVerb: Robotic
|
||||
- type: SurveillanceCameraSpeaker
|
||||
- type: SurveillanceCameraMonitor
|
||||
speechEnabled: true
|
||||
- type: ActivatableUI
|
||||
key: enum.SurveillanceCameraMonitorUiKey.Key
|
||||
- type: ActivatableUIRequiresVision
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
machine_parts: !type:Container
|
||||
- type: CrewMonitoringServer
|
||||
- type: SingletonDeviceNetServer
|
||||
ServerType: CrewMonitoringServer
|
||||
- type: DeviceNetwork
|
||||
deviceNetId: Wireless
|
||||
transmitFrequencyId: CrewMonitor
|
||||
@@ -34,7 +33,6 @@
|
||||
- type: StationLimitedNetwork
|
||||
- type: ApcPowerReceiver
|
||||
powerLoad: 200
|
||||
priority: Low
|
||||
- type: ExtensionCableReceiver
|
||||
- type: Destructible
|
||||
thresholds:
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
activePower: 2500
|
||||
lightRadiusMin: 0.75
|
||||
lightRadiusMax: 2.5
|
||||
spritemap:
|
||||
spriteMap:
|
||||
broken: "broken"
|
||||
unpowered: "off"
|
||||
off: "off"
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
- CivilianServices
|
||||
- type: ApcPowerReceiver
|
||||
powerLoad: 200
|
||||
priority: Low
|
||||
- type: ExtensionCableReceiver
|
||||
- type: WiresPanel
|
||||
- type: WiresVisuals
|
||||
|
||||
@@ -52,7 +52,6 @@
|
||||
description: Locates salvage.
|
||||
components:
|
||||
- type: SalvageMagnet
|
||||
offsetRadiusMax: 32
|
||||
- type: ApcPowerReceiver
|
||||
powerLoad: 1000
|
||||
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
description: A bed that massively slows down the patient's metabolism and prevents bodily decay, allowing more time to administer a proper treatment for stabilization.
|
||||
components:
|
||||
- type: StasisBed
|
||||
baseMultiplier: 10
|
||||
- type: AntiRotOnBuckle
|
||||
- type: HealOnBuckle
|
||||
damage:
|
||||
|
||||
@@ -93,7 +93,6 @@
|
||||
- type: LitOnPowered
|
||||
- type: ApcPowerReceiver
|
||||
powerLoad: 200
|
||||
priority: Low
|
||||
- type: Actions
|
||||
- type: SentienceTarget
|
||||
flavorKind: station-event-random-sentience-flavor-mechanical
|
||||
|
||||
@@ -64,9 +64,6 @@
|
||||
- type: Construction
|
||||
graph: GasTrinary
|
||||
node: filter
|
||||
conditions:
|
||||
- !type:TileNotBlocked
|
||||
- !type:NoUnstackableInTile
|
||||
- type: AmbientSound
|
||||
enabled: false
|
||||
volume: -9
|
||||
|
||||
@@ -304,7 +304,6 @@
|
||||
suffix: Enabled
|
||||
components:
|
||||
- type: GasThermoMachine
|
||||
enabled: true
|
||||
- type: ApcPowerReceiver
|
||||
powerDisabled: false
|
||||
|
||||
@@ -349,7 +348,6 @@
|
||||
suffix: Enabled
|
||||
components:
|
||||
- type: GasThermoMachine
|
||||
enabled: true
|
||||
- type: ApcPowerReceiver
|
||||
powerDisabled: false
|
||||
|
||||
|
||||
@@ -59,7 +59,6 @@
|
||||
maxCharge: 1000000
|
||||
startingCharge: 0
|
||||
- type: BatteryDischarger
|
||||
activeSupplyRate: 15000
|
||||
- type: TeslaCoil
|
||||
chargeFromLightning: 500000
|
||||
- type: LightningTarget
|
||||
|
||||
@@ -85,7 +85,6 @@
|
||||
- type: ChaoticJump
|
||||
jumpMinInterval: 8
|
||||
jumpMaxInterval: 15
|
||||
offset: 1
|
||||
- type: WarpPoint
|
||||
follow: true
|
||||
location: tesla ball
|
||||
|
||||
@@ -90,7 +90,6 @@
|
||||
tempChange: 420
|
||||
- type: ProjectileAnomaly
|
||||
projectilePrototype: ProjectileAnomalyFireball
|
||||
targetNonSentientChance: 0.6
|
||||
projectileSpeed: 0.5
|
||||
minProjectiles: 3
|
||||
maxProjectiles: 6
|
||||
@@ -330,7 +329,6 @@
|
||||
explosionMaxTileIntensity: 20
|
||||
- type: ProjectileAnomaly
|
||||
projectilePrototype: ProjectileIcicle
|
||||
targetNonSentientChance: 0.1
|
||||
- type: EntitySpawnAnomaly
|
||||
entries:
|
||||
- settings:
|
||||
|
||||
@@ -127,6 +127,7 @@
|
||||
- state: watercooler-2-1
|
||||
map: ["enum.SolutionContainerLayers.Fill"]
|
||||
visible: false
|
||||
- type: Appearance
|
||||
- type: SolutionContainerVisuals
|
||||
maxFillLevels: 4
|
||||
fillBaseName: watercooler-2-
|
||||
|
||||
@@ -59,7 +59,6 @@
|
||||
board: !type:Container
|
||||
- type: ApcPowerReceiver
|
||||
powerLoad: 200
|
||||
priority: Low
|
||||
- type: WallMount
|
||||
arc: 360
|
||||
- type: ExtensionCableReceiver
|
||||
|
||||
@@ -421,7 +421,6 @@
|
||||
nutrientConsumption: 0.40
|
||||
idealLight: 8
|
||||
idealHeat: 298
|
||||
juicy: true
|
||||
splatPrototype: PuddleSplatter
|
||||
chemicals:
|
||||
Nutriment:
|
||||
@@ -456,7 +455,6 @@
|
||||
nutrientConsumption: 0.70
|
||||
idealLight: 8
|
||||
idealHeat: 298
|
||||
juicy: true
|
||||
splatPrototype: PuddleSplatter
|
||||
chemicals:
|
||||
Nutriment:
|
||||
@@ -491,7 +489,6 @@
|
||||
nutrientConsumption: 0.70
|
||||
idealLight: 8
|
||||
idealHeat: 298
|
||||
juicy: true
|
||||
splatPrototype: PuddleSplatter
|
||||
chemicals:
|
||||
Blood:
|
||||
|
||||
@@ -70,12 +70,11 @@
|
||||
# Tries to melee attack our target.
|
||||
- type: htnCompound
|
||||
id: MeleeAttackTargetCompound
|
||||
preconditions:
|
||||
- !type:KeyExistsPrecondition
|
||||
key: Target
|
||||
branches:
|
||||
# Move to melee range and hit them
|
||||
- tasks:
|
||||
- preconditions:
|
||||
- !type:KeyExistsPrecondition
|
||||
key: Target
|
||||
tasks:
|
||||
- !type:HTNPrimitiveTask
|
||||
operator: !type:MoveToOperator
|
||||
shutdownState: PlanFinished
|
||||
@@ -104,11 +103,11 @@
|
||||
|
||||
- type: htnCompound
|
||||
id: MeleeAttackOrderedTargetCompound
|
||||
preconditions:
|
||||
- !type:KeyExistsPrecondition
|
||||
key: Target
|
||||
branches:
|
||||
- tasks:
|
||||
- preconditions:
|
||||
- !type:KeyExistsPrecondition
|
||||
key: Target
|
||||
tasks:
|
||||
- !type:HTNPrimitiveTask
|
||||
operator: !type:MoveToOperator
|
||||
shutdownState: PlanFinished
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
|
||||
- type: rcd
|
||||
id: DeconstructLattice # Hidden prototype - do not add to RCDs
|
||||
name: rcd-component-deconstruct
|
||||
mode: Deconstruct
|
||||
cost: 2
|
||||
delay: 1
|
||||
@@ -22,6 +23,7 @@
|
||||
|
||||
- type: rcd
|
||||
id: DeconstructTile # Hidden prototype - do not add to RCDs
|
||||
name: rcd-component-deconstruct
|
||||
mode: Deconstruct
|
||||
cost: 4
|
||||
delay: 4
|
||||
@@ -59,7 +61,6 @@
|
||||
|
||||
- type: rcd
|
||||
id: Catwalk
|
||||
name: rcd-component-catwalk
|
||||
category: WallsAndFlooring
|
||||
sprite: /Textures/Interface/Radial/RCD/catwalk.png
|
||||
mode: ConstructObject
|
||||
@@ -76,7 +77,6 @@
|
||||
# Walls
|
||||
- type: rcd
|
||||
id: WallSolid
|
||||
name: rcd-component-wall-solid
|
||||
category: WallsAndFlooring
|
||||
sprite: /Textures/Interface/Radial/RCD/solid_wall.png
|
||||
mode: ConstructObject
|
||||
@@ -89,7 +89,6 @@
|
||||
|
||||
- type: rcd
|
||||
id: Grille
|
||||
name: rcd-component-grille
|
||||
category: WindowsAndGrilles
|
||||
sprite: /Textures/Interface/Radial/RCD/grille.png
|
||||
mode: ConstructObject
|
||||
@@ -103,7 +102,6 @@
|
||||
# Windows
|
||||
- type: rcd
|
||||
id: Window
|
||||
name: rcd-component-window
|
||||
category: WindowsAndGrilles
|
||||
sprite: /Textures/Interface/Radial/RCD/window.png
|
||||
mode: ConstructObject
|
||||
@@ -118,7 +116,6 @@
|
||||
|
||||
- type: rcd
|
||||
id: WindowDirectional
|
||||
name: rcd-component-window-directional
|
||||
category: WindowsAndGrilles
|
||||
sprite: /Textures/Interface/Radial/RCD/directional.png
|
||||
mode: ConstructObject
|
||||
@@ -134,7 +131,6 @@
|
||||
|
||||
- type: rcd
|
||||
id: ReinforcedWindow
|
||||
name: rcd-component-reinforced-window
|
||||
category: WindowsAndGrilles
|
||||
sprite: /Textures/Interface/Radial/RCD/window_reinforced.png
|
||||
mode: ConstructObject
|
||||
@@ -149,7 +145,6 @@
|
||||
|
||||
- type: rcd
|
||||
id: WindowReinforcedDirectional
|
||||
name: rcd-component-window-reinforced-directional
|
||||
category: WindowsAndGrilles
|
||||
sprite: /Textures/Interface/Radial/RCD/directional_reinforced.png
|
||||
mode: ConstructObject
|
||||
@@ -166,7 +161,6 @@
|
||||
# Airlocks
|
||||
- type: rcd
|
||||
id: Airlock
|
||||
name: rcd-component-airlock
|
||||
category: Airlocks
|
||||
sprite: /Textures/Interface/Radial/RCD/airlock.png
|
||||
mode: ConstructObject
|
||||
@@ -179,7 +173,6 @@
|
||||
|
||||
- type: rcd
|
||||
id: AirlockGlass
|
||||
name: rcd-component-airlock-glass
|
||||
category: Airlocks
|
||||
sprite: /Textures/Interface/Radial/RCD/glass_airlock.png
|
||||
mode: ConstructObject
|
||||
@@ -192,7 +185,6 @@
|
||||
|
||||
- type: rcd
|
||||
id: Firelock
|
||||
name: rcd-component-firelock
|
||||
category: Airlocks
|
||||
sprite: /Textures/Interface/Radial/RCD/firelock.png
|
||||
mode: ConstructObject
|
||||
@@ -206,7 +198,6 @@
|
||||
# Lighting
|
||||
- type: rcd
|
||||
id: TubeLight
|
||||
name: rcd-component-tube-light
|
||||
category: Lighting
|
||||
sprite: /Textures/Interface/Radial/RCD/tube_light.png
|
||||
mode: ConstructObject
|
||||
@@ -220,7 +211,6 @@
|
||||
|
||||
- type: rcd
|
||||
id: BulbLight
|
||||
name: rcd-component-window-bulb-light
|
||||
category: Lighting
|
||||
sprite: /Textures/Interface/Radial/RCD/bulb_light.png
|
||||
mode: ConstructObject
|
||||
@@ -235,7 +225,6 @@
|
||||
# Electrical
|
||||
- type: rcd
|
||||
id: LVCable
|
||||
name: rcd-component-window-lv-cable
|
||||
category: Electrical
|
||||
sprite: /Textures/Interface/Radial/RCD/lv_coil.png
|
||||
mode: ConstructObject
|
||||
@@ -250,7 +239,6 @@
|
||||
|
||||
- type: rcd
|
||||
id: MVCable
|
||||
name: rcd-component-window-mv-cable
|
||||
category: Electrical
|
||||
sprite: /Textures/Interface/Radial/RCD/mv_coil.png
|
||||
mode: ConstructObject
|
||||
@@ -265,7 +253,6 @@
|
||||
|
||||
- type: rcd
|
||||
id: HVCable
|
||||
name: rcd-component-window-hv-cable
|
||||
category: Electrical
|
||||
sprite: /Textures/Interface/Radial/RCD/hv_coil.png
|
||||
mode: ConstructObject
|
||||
@@ -280,7 +267,6 @@
|
||||
|
||||
- type: rcd
|
||||
id: CableTerminal
|
||||
name: rcd-component-window-cable-terminal
|
||||
category: Electrical
|
||||
sprite: /Textures/Interface/Radial/RCD/cable_terminal.png
|
||||
mode: ConstructObject
|
||||
|
||||
@@ -72,7 +72,7 @@
|
||||
Medicine:
|
||||
effects:
|
||||
- !type:ModifyBloodLevel
|
||||
condition:
|
||||
conditions:
|
||||
- !type:OrganType
|
||||
type: Arachnid
|
||||
shouldHave: true
|
||||
@@ -163,7 +163,7 @@
|
||||
Medicine:
|
||||
effects:
|
||||
- !type:ModifyBloodLevel
|
||||
condition:
|
||||
conditions:
|
||||
- !type:OrganType
|
||||
type: Arachnid
|
||||
shouldHave: false
|
||||
|
||||
@@ -234,7 +234,7 @@
|
||||
types:
|
||||
Asphyxiation: 1
|
||||
Cold: 2
|
||||
groups:
|
||||
groups:
|
||||
Brute: 0.5
|
||||
- !type:Jitter
|
||||
conditions:
|
||||
@@ -1044,7 +1044,7 @@
|
||||
Medicine:
|
||||
effects:
|
||||
- !type:HealthChange
|
||||
condition:
|
||||
conditions:
|
||||
- !type:TotalDamage
|
||||
max: 50
|
||||
damage:
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user