Merge remote-tracking branch 'refs/remotes/upstream/master' into upstream-sync
# Conflicts: # Content.Shared/Preferences/Loadouts/Effects/GroupLoadoutEffect.cs # Content.Shared/Preferences/Loadouts/Effects/JobRequirementLoadoutEffect.cs # Content.Shared/Preferences/Loadouts/Effects/LoadoutEffect.cs # Content.Shared/Preferences/Loadouts/Effects/PointsCostLoadoutEffect.cs # Content.Shared/Preferences/Loadouts/Effects/SpeciesLoadoutEffect.cs # Resources/Prototypes/GameRules/events.yml # Resources/Textures/Objects/Devices/nuke.rsi/meta.json
|
|
@ -47,6 +47,7 @@ namespace Content.Benchmarks
|
|||
|
||||
var componentFactory = new Mock<IComponentFactory>();
|
||||
componentFactory.Setup(p => p.GetComponent<DummyComponent>()).Returns(new DummyComponent());
|
||||
componentFactory.Setup(m => m.GetIndex(typeof(DummyComponent))).Returns(CompIdx.Index<DummyComponent>());
|
||||
componentFactory.Setup(p => p.GetRegistration(It.IsAny<DummyComponent>())).Returns(dummyReg);
|
||||
componentFactory.Setup(p => p.GetAllRegistrations()).Returns(new[] { dummyReg });
|
||||
componentFactory.Setup(p => p.GetAllRefTypes()).Returns(new[] { CompIdx.Index<DummyComponent>() });
|
||||
|
|
|
|||
|
|
@ -75,7 +75,7 @@ namespace Content.Client.Administration.UI.Bwoink
|
|||
if (info.Antag && info.ActiveThisRound)
|
||||
sb.Append(new Rune(0x1F5E1)); // 🗡
|
||||
|
||||
if (info.OverallPlaytime <= TimeSpan.FromSeconds(_cfg.GetCVar(CCVars.NewPlayerThreshold)))
|
||||
if (info.OverallPlaytime <= TimeSpan.FromMinutes(_cfg.GetCVar(CCVars.NewPlayerThreshold)))
|
||||
sb.Append(new Rune(0x23F2)); // ⏲
|
||||
|
||||
sb.AppendFormat("\"{0}\"", text);
|
||||
|
|
@ -226,7 +226,7 @@ namespace Content.Client.Administration.UI.Bwoink
|
|||
if (pl.Antag)
|
||||
sb.Append(new Rune(0x1F5E1)); // 🗡
|
||||
|
||||
if (pl.OverallPlaytime <= TimeSpan.FromSeconds(_cfg.GetCVar(CCVars.NewPlayerThreshold)))
|
||||
if (pl.OverallPlaytime <= TimeSpan.FromMinutes(_cfg.GetCVar(CCVars.NewPlayerThreshold)))
|
||||
sb.Append(new Rune(0x23F2)); // ⏲
|
||||
|
||||
sb.AppendFormat("\"{0}\"", pl.CharacterName);
|
||||
|
|
|
|||
|
|
@ -1,8 +0,0 @@
|
|||
using Content.Shared.Clothing;
|
||||
|
||||
namespace Content.Client.Clothing;
|
||||
|
||||
public sealed class MagbootsSystem : SharedMagbootsSystem
|
||||
{
|
||||
|
||||
}
|
||||
|
|
@ -295,7 +295,7 @@ public sealed partial class LobbyUIController : UIController, IOnStateEntered<Lo
|
|||
|
||||
if (_prototypeManager.HasIndex<RoleLoadoutPrototype>(LoadoutSystem.GetJobPrototype(job.ID)))
|
||||
{
|
||||
var loadout = profile.GetLoadoutOrDefault(LoadoutSystem.GetJobPrototype(job.ID), profile.Species, EntityManager, _prototypeManager);
|
||||
var loadout = profile.GetLoadoutOrDefault(LoadoutSystem.GetJobPrototype(job.ID), _playerManager.LocalSession, profile.Species, EntityManager, _prototypeManager);
|
||||
GiveDummyLoadout(dummy, loadout);
|
||||
}
|
||||
}
|
||||
|
|
@ -415,7 +415,7 @@ public sealed partial class LobbyUIController : UIController, IOnStateEntered<Lo
|
|||
|
||||
if (_prototypeManager.HasIndex<RoleLoadoutPrototype>(LoadoutSystem.GetJobPrototype(job.ID)))
|
||||
{
|
||||
var loadout = humanoid.GetLoadoutOrDefault(LoadoutSystem.GetJobPrototype(job.ID), humanoid.Species, EntityManager, _prototypeManager);
|
||||
var loadout = humanoid.GetLoadoutOrDefault(LoadoutSystem.GetJobPrototype(job.ID), _playerManager.LocalSession, humanoid.Species, EntityManager, _prototypeManager);
|
||||
GiveDummyLoadout(dummyEnt, loadout);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -960,7 +960,7 @@ namespace Content.Client.Lobby.UI
|
|||
if (loadout == null)
|
||||
{
|
||||
loadout = new RoleLoadout(roleLoadoutProto.ID);
|
||||
loadout.SetDefault(_prototypeManager);
|
||||
loadout.SetDefault(Profile, _playerManager.LocalSession, _prototypeManager);
|
||||
}
|
||||
|
||||
OpenLoadout(job, loadout, roleLoadoutProto);
|
||||
|
|
|
|||
|
|
@ -1,12 +1,10 @@
|
|||
using Content.Client.Gameplay;
|
||||
using Content.Client.Info;
|
||||
using Content.Shared.CCVar;
|
||||
using Content.Shared.Guidebook;
|
||||
using Content.Shared.Info;
|
||||
using Robust.Client.Console;
|
||||
using Robust.Client.UserInterface.Controllers;
|
||||
using Robust.Client.UserInterface.Controls;
|
||||
using Robust.Shared.Configuration;
|
||||
using Robust.Shared.Network;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
|
|
@ -14,21 +12,27 @@ namespace Content.Client.UserInterface.Systems.Info;
|
|||
|
||||
public sealed class InfoUIController : UIController, IOnStateExited<GameplayState>
|
||||
{
|
||||
[Dependency] private readonly IConfigurationManager _cfg = default!;
|
||||
[Dependency] private readonly IClientConsoleHost _consoleHost = default!;
|
||||
[Dependency] private readonly INetManager _netManager = default!;
|
||||
[Dependency] private readonly IPrototypeManager _prototype = default!;
|
||||
[Dependency] private readonly ILogManager _logMan = default!;
|
||||
|
||||
private RulesPopup? _rulesPopup;
|
||||
private RulesAndInfoWindow? _infoWindow;
|
||||
private ISawmill _sawmill = default!;
|
||||
|
||||
[ValidatePrototypeId<GuideEntryPrototype>]
|
||||
private const string DefaultRuleset = "DefaultRuleset";
|
||||
|
||||
public ProtoId<GuideEntryPrototype> RulesEntryId = DefaultRuleset;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
|
||||
_sawmill = _logMan.GetSawmill("rules");
|
||||
_netManager.RegisterNetMessage<RulesAcceptedMessage>();
|
||||
_netManager.RegisterNetMessage<ShowRulesPopupMessage>(OnShowRulesPopupMessage);
|
||||
_netManager.RegisterNetMessage<SendRulesInformationMessage>(OnRulesInformationMessage);
|
||||
|
||||
_consoleHost.RegisterCommand("fuckrules",
|
||||
"",
|
||||
|
|
@ -39,9 +43,12 @@ public sealed class InfoUIController : UIController, IOnStateExited<GameplayStat
|
|||
});
|
||||
}
|
||||
|
||||
private void OnShowRulesPopupMessage(ShowRulesPopupMessage message)
|
||||
private void OnRulesInformationMessage(SendRulesInformationMessage message)
|
||||
{
|
||||
ShowRules(message.PopupTime);
|
||||
RulesEntryId = message.CoreRules;
|
||||
|
||||
if (message.ShouldShowRules)
|
||||
ShowRules(message.PopupTime);
|
||||
}
|
||||
|
||||
public void OnStateExited(GameplayState state)
|
||||
|
|
@ -84,8 +91,13 @@ public sealed class InfoUIController : UIController, IOnStateExited<GameplayStat
|
|||
|
||||
public GuideEntryPrototype GetCoreRuleEntry()
|
||||
{
|
||||
var guide = _cfg.GetCVar(CCVars.RulesFile);
|
||||
var guideEntryPrototype = _prototype.Index<GuideEntryPrototype>(guide);
|
||||
if (!_prototype.TryIndex(RulesEntryId, out var guideEntryPrototype))
|
||||
{
|
||||
guideEntryPrototype = _prototype.Index<GuideEntryPrototype>(DefaultRuleset);
|
||||
_sawmill.Error($"Couldn't find the following prototype: {RulesEntryId}. Falling back to {DefaultRuleset}, please check that the server has the rules set up correctly");
|
||||
return guideEntryPrototype;
|
||||
}
|
||||
|
||||
return guideEntryPrototype;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ using Content.Shared.Database;
|
|||
using Content.Shared.Popups;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Random;
|
||||
using Content.Server.Kitchen.EntitySystems;
|
||||
|
||||
namespace Content.Server.Access.Systems;
|
||||
|
||||
|
|
@ -18,6 +19,7 @@ public sealed class IdCardSystem : SharedIdCardSystem
|
|||
[Dependency] private readonly IRobustRandom _random = default!;
|
||||
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
||||
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
|
||||
[Dependency] private readonly MicrowaveSystem _microwave = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
|
|
@ -27,12 +29,13 @@ public sealed class IdCardSystem : SharedIdCardSystem
|
|||
|
||||
private void OnMicrowaved(EntityUid uid, IdCardComponent component, BeingMicrowavedEvent args)
|
||||
{
|
||||
if (!component.CanMicrowave)
|
||||
return;
|
||||
if (!component.CanMicrowave || !TryComp<MicrowaveComponent>(args.Microwave, out var micro) || micro.Broken)
|
||||
return;
|
||||
|
||||
if (TryComp<AccessComponent>(uid, out var access))
|
||||
{
|
||||
float randomPick = _random.NextFloat();
|
||||
|
||||
// if really unlucky, burn card
|
||||
if (randomPick <= 0.15f)
|
||||
{
|
||||
|
|
@ -49,6 +52,14 @@ public sealed class IdCardSystem : SharedIdCardSystem
|
|||
EntityManager.QueueDeleteEntity(uid);
|
||||
return;
|
||||
}
|
||||
|
||||
//Explode if the microwave can't handle it
|
||||
if (!micro.CanMicrowaveIdsSafely)
|
||||
{
|
||||
_microwave.Explode((args.Microwave, micro));
|
||||
return;
|
||||
}
|
||||
|
||||
// If they're unlucky, brick their ID
|
||||
if (randomPick <= 0.25f)
|
||||
{
|
||||
|
|
@ -73,6 +84,7 @@ public sealed class IdCardSystem : SharedIdCardSystem
|
|||
|
||||
_adminLogger.Add(LogType.Action, LogImpact.Medium,
|
||||
$"{ToPrettyString(args.Microwave)} added {random.ID} access to {ToPrettyString(uid):entity}");
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,31 +0,0 @@
|
|||
namespace Content.Server.Atmos.Components
|
||||
{
|
||||
// Unfortunately can't be friends yet due to magboots.
|
||||
[RegisterComponent]
|
||||
public sealed partial class MovedByPressureComponent : Component
|
||||
{
|
||||
public const float MoveForcePushRatio = 1f;
|
||||
public const float MoveForceForcePushRatio = 1f;
|
||||
public const float ProbabilityOffset = 25f;
|
||||
public const float ProbabilityBasePercent = 10f;
|
||||
public const float ThrowForce = 100f;
|
||||
|
||||
/// <summary>
|
||||
/// Accumulates time when yeeted by high pressure deltas.
|
||||
/// </summary>
|
||||
[DataField("accumulator")]
|
||||
public float Accumulator = 0f;
|
||||
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
[DataField("enabled")]
|
||||
public bool Enabled { get; set; } = true;
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
[DataField("pressureResistance")]
|
||||
public float PressureResistance { get; set; } = 1f;
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
[DataField("moveResist")]
|
||||
public float MoveResist { get; set; } = 100f;
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
public int LastHighPressureMovementAirCycle { get; set; } = 0;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
using Content.Server.Atmos.Components;
|
||||
using Content.Shared.Atmos;
|
||||
using Content.Shared.Atmos.Components;
|
||||
using Content.Shared.Mobs.Components;
|
||||
using Content.Shared.Physics;
|
||||
using Robust.Shared.Audio;
|
||||
|
|
|
|||
|
|
@ -46,7 +46,9 @@ namespace Content.Server.Chemistry.ReactionEffects
|
|||
public override bool ShouldLog => true;
|
||||
|
||||
protected override string ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys)
|
||||
=> Loc.GetString("reagent-effect-guidebook-missing");
|
||||
=> Loc.GetString("reagent-effect-guidebook-area-reaction",
|
||||
("duration", _duration)
|
||||
);
|
||||
|
||||
public override LogImpact LogImpact => LogImpact.High;
|
||||
|
||||
|
|
|
|||
|
|
@ -26,6 +26,6 @@ namespace Content.Server.Chemistry.ReagentEffects
|
|||
}
|
||||
|
||||
protected override string? ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys) =>
|
||||
Loc.GetString("reagent-effect-guidebook-missing", ("chance", Probability));
|
||||
Loc.GetString("reagent-effect-guidebook-add-to-solution-reaction", ("chance", Probability));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,49 +0,0 @@
|
|||
using Content.Server.Atmos.Components;
|
||||
using Content.Shared.Alert;
|
||||
using Content.Shared.Clothing;
|
||||
|
||||
namespace Content.Server.Clothing;
|
||||
|
||||
public sealed class MagbootsSystem : SharedMagbootsSystem
|
||||
{
|
||||
[Dependency] private readonly AlertsSystem _alerts = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<MagbootsComponent, ClothingGotEquippedEvent>(OnGotEquipped);
|
||||
SubscribeLocalEvent<MagbootsComponent, ClothingGotUnequippedEvent>(OnGotUnequipped);
|
||||
}
|
||||
|
||||
protected override void UpdateMagbootEffects(EntityUid parent, EntityUid uid, bool state, MagbootsComponent? component)
|
||||
{
|
||||
if (!Resolve(uid, ref component))
|
||||
return;
|
||||
state = state && component.On;
|
||||
|
||||
if (TryComp(parent, out MovedByPressureComponent? movedByPressure))
|
||||
{
|
||||
movedByPressure.Enabled = !state;
|
||||
}
|
||||
|
||||
if (state)
|
||||
{
|
||||
_alerts.ShowAlert(parent, component.MagbootsAlert);
|
||||
}
|
||||
else
|
||||
{
|
||||
_alerts.ClearAlert(parent, component.MagbootsAlert);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnGotUnequipped(EntityUid uid, MagbootsComponent component, ref ClothingGotUnequippedEvent args)
|
||||
{
|
||||
UpdateMagbootEffects(args.Wearer, uid, false, component);
|
||||
}
|
||||
|
||||
private void OnGotEquipped(EntityUid uid, MagbootsComponent component, ref ClothingGotEquippedEvent args)
|
||||
{
|
||||
UpdateMagbootEffects(args.Wearer, uid, true, component);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
using Content.Server.Atmos.Components;
|
||||
using Content.Shared.Atmos.Components;
|
||||
using Content.Shared.Damage.Components;
|
||||
using Content.Shared.Damage.Systems;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
using System.Diagnostics.CodeAnalysis;
|
||||
using Content.Server.Administration.Logs;
|
||||
using Content.Server.Atmos.EntitySystems;
|
||||
using Content.Server.Body.Systems;
|
||||
|
|
@ -90,6 +91,16 @@ namespace Content.Server.Destructible
|
|||
}
|
||||
}
|
||||
|
||||
public bool TryGetDestroyedAt(Entity<DestructibleComponent?> ent, [NotNullWhen(true)] out FixedPoint2? destroyedAt)
|
||||
{
|
||||
destroyedAt = null;
|
||||
if (!Resolve(ent, ref ent.Comp, false))
|
||||
return false;
|
||||
|
||||
destroyedAt = DestroyedAt(ent, ent.Comp);
|
||||
return true;
|
||||
}
|
||||
|
||||
// FFS this shouldn't be this hard. Maybe this should just be a field of the destructible component. Its not
|
||||
// like there is currently any entity that is NOT just destroyed upon reaching a total-damage value.
|
||||
/// <summary>
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
using Content.Shared.Gravity;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Shared.Map.Components;
|
||||
using Robust.Shared.Utility;
|
||||
|
||||
namespace Content.Server.Gravity
|
||||
{
|
||||
|
|
|
|||
|
|
@ -18,22 +18,25 @@ public sealed class RulesManager
|
|||
public void Initialize()
|
||||
{
|
||||
_netManager.Connected += OnConnected;
|
||||
_netManager.RegisterNetMessage<ShowRulesPopupMessage>();
|
||||
_netManager.RegisterNetMessage<SendRulesInformationMessage>();
|
||||
_netManager.RegisterNetMessage<RulesAcceptedMessage>(OnRulesAccepted);
|
||||
}
|
||||
|
||||
private async void OnConnected(object? sender, NetChannelArgs e)
|
||||
{
|
||||
if (IPAddress.IsLoopback(e.Channel.RemoteEndPoint.Address) && _cfg.GetCVar(CCVars.RulesExemptLocal))
|
||||
return;
|
||||
var isLocalhost = IPAddress.IsLoopback(e.Channel.RemoteEndPoint.Address) &&
|
||||
_cfg.GetCVar(CCVars.RulesExemptLocal);
|
||||
|
||||
var lastRead = await _dbManager.GetLastReadRules(e.Channel.UserId);
|
||||
if (lastRead > LastValidReadTime)
|
||||
return;
|
||||
var hasCooldown = lastRead > LastValidReadTime;
|
||||
|
||||
var message = new ShowRulesPopupMessage();
|
||||
message.PopupTime = _cfg.GetCVar(CCVars.RulesWaitTime);
|
||||
_netManager.ServerSendMessage(message, e.Channel);
|
||||
var showRulesMessage = new SendRulesInformationMessage
|
||||
{
|
||||
PopupTime = _cfg.GetCVar(CCVars.RulesWaitTime),
|
||||
CoreRules = _cfg.GetCVar(CCVars.RulesFile),
|
||||
ShouldShowRules = !isLocalhost && !hasCooldown
|
||||
};
|
||||
_netManager.ServerSendMessage(showRulesMessage, e.Channel);
|
||||
}
|
||||
|
||||
private async void OnRulesAccepted(RulesAcceptedMessage message)
|
||||
|
|
|
|||
|
|
@ -12,6 +12,10 @@ namespace Content.Server.Info;
|
|||
[AdminCommand(AdminFlags.Admin)]
|
||||
public sealed class ShowRulesCommand : IConsoleCommand
|
||||
{
|
||||
[Dependency] private readonly INetManager _net = default!;
|
||||
[Dependency] private readonly IConfigurationManager _configuration = default!;
|
||||
[Dependency] private readonly IPlayerManager _player = default!;
|
||||
|
||||
public string Command => "showrules";
|
||||
public string Description => "Opens the rules popup for the specified player.";
|
||||
public string Help => "showrules <username> [seconds]";
|
||||
|
|
@ -25,8 +29,7 @@ public sealed class ShowRulesCommand : IConsoleCommand
|
|||
case 1:
|
||||
{
|
||||
target = args[0];
|
||||
var configurationManager = IoCManager.Resolve<IConfigurationManager>();
|
||||
seconds = configurationManager.GetCVar(CCVars.RulesWaitTime);
|
||||
seconds = _configuration.GetCVar(CCVars.RulesWaitTime);
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
|
|
@ -48,15 +51,14 @@ public sealed class ShowRulesCommand : IConsoleCommand
|
|||
}
|
||||
|
||||
|
||||
var message = new ShowRulesPopupMessage { PopupTime = seconds };
|
||||
|
||||
if (!IoCManager.Resolve<IPlayerManager>().TryGetSessionByUsername(target, out var player))
|
||||
if (!_player.TryGetSessionByUsername(target, out var player))
|
||||
{
|
||||
shell.WriteError("Unable to find a player with that name.");
|
||||
return;
|
||||
}
|
||||
|
||||
var netManager = IoCManager.Resolve<INetManager>();
|
||||
netManager.ServerSendMessage(message, player.Channel);
|
||||
var coreRules = _configuration.GetCVar(CCVars.RulesFile);
|
||||
var message = new SendRulesInformationMessage { PopupTime = seconds, CoreRules = coreRules, ShouldShowRules = true};
|
||||
_net.ServerSendMessage(message, player.Channel);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -101,6 +101,12 @@ namespace Content.Server.Kitchen.Components
|
|||
/// Chance of lightning occurring when we microwave a metallic object
|
||||
[DataField, ViewVariables(VVAccess.ReadWrite)]
|
||||
public float LightningChance = .75f;
|
||||
|
||||
/// <summary>
|
||||
/// If this microwave can give ids accesses without exploding
|
||||
/// </summary>
|
||||
[DataField, ViewVariables(VVAccess.ReadWrite)]
|
||||
public bool CanMicrowaveIdsSafely = true;
|
||||
}
|
||||
|
||||
public sealed class BeingMicrowavedEvent : HandledEntityEventArgs
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
using Content.Server.Administration.Logs;
|
||||
using Content.Server.Body.Systems;
|
||||
using Content.Server.Chemistry.Containers.EntitySystems;
|
||||
using Content.Server.Construction;
|
||||
|
|
@ -15,6 +16,7 @@ using Content.Shared.Body.Part;
|
|||
using Content.Shared.Chemistry.Components.SolutionManager;
|
||||
using Content.Shared.Chemistry.EntitySystems;
|
||||
using Content.Shared.Construction.EntitySystems;
|
||||
using Content.Shared.Database;
|
||||
using Content.Shared.Destructible;
|
||||
using Content.Shared.FixedPoint;
|
||||
using Content.Shared.Interaction;
|
||||
|
|
@ -36,6 +38,7 @@ using System.Linq;
|
|||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Timing;
|
||||
using Content.Shared.Stacks;
|
||||
using Content.Server.Construction.Components;
|
||||
|
||||
namespace Content.Server.Kitchen.EntitySystems
|
||||
{
|
||||
|
|
@ -61,6 +64,7 @@ namespace Content.Server.Kitchen.EntitySystems
|
|||
[Dependency] private readonly SharedItemSystem _item = default!;
|
||||
[Dependency] private readonly SharedStackSystem _stack = default!;
|
||||
[Dependency] private readonly IPrototypeManager _prototype = default!;
|
||||
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
|
||||
|
||||
[ValidatePrototypeId<EntityPrototype>]
|
||||
private const string MalfunctionSpark = "Spark";
|
||||
|
|
@ -408,6 +412,23 @@ namespace Content.Server.Kitchen.EntitySystems
|
|||
return component.Storage.ContainedEntities.Any();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Explodes the microwave internally, turning it into a broken state, destroying its board, and spitting out its machine parts
|
||||
/// </summary>
|
||||
/// <param name="ent"></param>
|
||||
public void Explode(Entity<MicrowaveComponent> ent)
|
||||
{
|
||||
ent.Comp.Broken = true; // Make broken so we stop processing stuff
|
||||
_explosion.TriggerExplosive(ent);
|
||||
if (TryComp<MachineComponent>(ent, out var machine))
|
||||
{
|
||||
_container.CleanContainer(machine.BoardContainer);
|
||||
_container.EmptyContainer(machine.PartContainer);
|
||||
}
|
||||
|
||||
_adminLogger.Add(LogType.Action, LogImpact.Medium,
|
||||
$"{ToPrettyString(ent)} exploded from unsafe cooking!");
|
||||
}
|
||||
/// <summary>
|
||||
/// Handles the attempted cooking of unsafe objects
|
||||
/// </summary>
|
||||
|
|
@ -425,7 +446,7 @@ namespace Content.Server.Kitchen.EntitySystems
|
|||
ent.Comp1.MalfunctionTime = _gameTiming.CurTime + TimeSpan.FromSeconds(ent.Comp2.MalfunctionInterval);
|
||||
if (_random.Prob(ent.Comp2.ExplosionChance))
|
||||
{
|
||||
_explosion.TriggerExplosive(ent);
|
||||
Explode((ent, ent.Comp2));
|
||||
return; // microwave is fucked, stop the cooking.
|
||||
}
|
||||
|
||||
|
|
@ -532,7 +553,8 @@ namespace Content.Server.Kitchen.EntitySystems
|
|||
activeComp.CookTimeRemaining = component.CurrentCookTimerTime * component.CookTimeMultiplier;
|
||||
activeComp.TotalTime = component.CurrentCookTimerTime; //this doesn't scale so that we can have the "actual" time
|
||||
activeComp.PortionedRecipe = portionedRecipe;
|
||||
component.CurrentCookTimeEnd = _gameTiming.CurTime + TimeSpan.FromSeconds(component.CurrentCookTimerTime);
|
||||
//Scale tiems with cook times
|
||||
component.CurrentCookTimeEnd = _gameTiming.CurTime + TimeSpan.FromSeconds(component.CurrentCookTimerTime * component.CookTimeMultiplier);
|
||||
if (malfunctioning)
|
||||
activeComp.MalfunctionTime = _gameTiming.CurTime + TimeSpan.FromSeconds(component.MalfunctionInterval);
|
||||
UpdateUserInterfaceState(uid, component);
|
||||
|
|
|
|||
25
Content.Server/Mining/MeteorComponent.cs
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
using Content.Shared.Damage;
|
||||
|
||||
namespace Content.Server.Mining;
|
||||
|
||||
/// <summary>
|
||||
/// This is used for meteors which hit objects, dealing damage to destroy/kill the object and dealing equal damage back to itself.
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(MeteorSystem))]
|
||||
public sealed partial class MeteorComponent : Component
|
||||
{
|
||||
/// <summary>
|
||||
/// Damage specifier that is multiplied against the calculated damage amount to determine what damage is applied to the colliding entity.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// The values of this should add up to 1 or else the damage will be scaled.
|
||||
/// </remarks>
|
||||
[DataField]
|
||||
public DamageSpecifier DamageTypes = new();
|
||||
|
||||
/// <summary>
|
||||
/// A list of entities that this meteor has collided with. used to ensure no double collisions occur.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public HashSet<EntityUid> HitList = new();
|
||||
}
|
||||
65
Content.Server/Mining/MeteorSystem.cs
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
using Content.Server.Administration.Logs;
|
||||
using Content.Server.Destructible;
|
||||
using Content.Shared.Damage;
|
||||
using Content.Shared.Database;
|
||||
using Content.Shared.FixedPoint;
|
||||
using Content.Shared.Mobs.Systems;
|
||||
using Robust.Shared.Physics.Events;
|
||||
using Robust.Shared.Player;
|
||||
|
||||
namespace Content.Server.Mining;
|
||||
|
||||
public sealed class MeteorSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly IAdminLogManager _adminLog = default!;
|
||||
[Dependency] private readonly DamageableSystem _damageable = default!;
|
||||
[Dependency] private readonly DestructibleSystem _destructible = default!;
|
||||
[Dependency] private readonly MobThresholdSystem _mobThreshold = default!;
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void Initialize()
|
||||
{
|
||||
SubscribeLocalEvent<MeteorComponent, StartCollideEvent>(OnCollide);
|
||||
}
|
||||
|
||||
private void OnCollide(EntityUid uid, MeteorComponent component, ref StartCollideEvent args)
|
||||
{
|
||||
if (TerminatingOrDeleted(args.OtherEntity) || TerminatingOrDeleted(uid))
|
||||
return;
|
||||
|
||||
if (component.HitList.Contains(args.OtherEntity))
|
||||
return;
|
||||
|
||||
FixedPoint2 threshold;
|
||||
if (_mobThreshold.TryGetDeadThreshold(args.OtherEntity, out var mobThreshold))
|
||||
{
|
||||
threshold = mobThreshold.Value;
|
||||
if (HasComp<ActorComponent>(args.OtherEntity))
|
||||
_adminLog.Add(LogType.Action, LogImpact.Extreme, $"{ToPrettyString(args.OtherEntity):player} was struck by meteor {ToPrettyString(uid):ent} and killed instantly.");
|
||||
}
|
||||
else if (_destructible.TryGetDestroyedAt(args.OtherEntity, out var destroyThreshold))
|
||||
{
|
||||
threshold = destroyThreshold.Value;
|
||||
}
|
||||
else
|
||||
{
|
||||
threshold = FixedPoint2.MaxValue;
|
||||
}
|
||||
var otherEntDamage = CompOrNull<DamageableComponent>(args.OtherEntity)?.TotalDamage ?? FixedPoint2.Zero;
|
||||
// account for the damage that the other entity has already taken: don't overkill
|
||||
threshold -= otherEntDamage;
|
||||
|
||||
// The max amount of damage our meteor can take before breaking.
|
||||
var maxMeteorDamage = _destructible.DestroyedAt(uid) - CompOrNull<DamageableComponent>(uid)?.TotalDamage ?? FixedPoint2.Zero;
|
||||
|
||||
// Cap damage so we don't overkill the meteor
|
||||
var trueDamage = FixedPoint2.Min(maxMeteorDamage, threshold);
|
||||
|
||||
var damage = component.DamageTypes * trueDamage;
|
||||
_damageable.TryChangeDamage(args.OtherEntity, damage, true, origin: uid);
|
||||
_damageable.TryChangeDamage(uid, damage);
|
||||
|
||||
if (!TerminatingOrDeleted(args.OtherEntity))
|
||||
component.HitList.Add(args.OtherEntity);
|
||||
}
|
||||
}
|
||||
|
|
@ -274,6 +274,25 @@ public sealed partial class BorgSystem
|
|||
return false;
|
||||
}
|
||||
|
||||
if (TryComp<ItemBorgModuleComponent>(module, out var itemModuleComp))
|
||||
{
|
||||
foreach (var containedModuleUid in component.ModuleContainer.ContainedEntities)
|
||||
{
|
||||
if (!TryComp<ItemBorgModuleComponent>(containedModuleUid, out var containedItemModuleComp))
|
||||
continue;
|
||||
|
||||
for (int i = 0; i < itemModuleComp.Items.Count; i++)
|
||||
{
|
||||
if (itemModuleComp.Items[i] != containedItemModuleComp.Items[i])
|
||||
continue;
|
||||
}
|
||||
|
||||
if (user != null)
|
||||
Popup.PopupEntity(Loc.GetString("borg-module-duplicate"), uid, user.Value);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
using System.Numerics;
|
||||
using Content.Server.Atmos.Components;
|
||||
using Content.Server.Singularity.Components;
|
||||
using Content.Shared.Atmos.Components;
|
||||
using Content.Shared.Ghost;
|
||||
using Content.Shared.Singularity.EntitySystems;
|
||||
using Robust.Shared.Map;
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ using Content.Shared.StatusIcon;
|
|||
using JetBrains.Annotations;
|
||||
using Robust.Shared.Configuration;
|
||||
using Robust.Shared.Map;
|
||||
using Robust.Shared.Player;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Random;
|
||||
using Robust.Shared.Utility;
|
||||
|
|
@ -39,18 +40,18 @@ namespace Content.Server.Station.Systems;
|
|||
[PublicAPI]
|
||||
public sealed class StationSpawningSystem : SharedStationSpawningSystem
|
||||
{
|
||||
[Dependency] private readonly IConfigurationManager _configurationManager = default!;
|
||||
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
||||
[Dependency] private readonly IRobustRandom _random = default!;
|
||||
[Dependency] private readonly IConfigurationManager _configurationManager = default!;
|
||||
[Dependency] private readonly HumanoidAppearanceSystem _humanoidSystem = default!;
|
||||
[Dependency] private readonly IdCardSystem _cardSystem = default!;
|
||||
[Dependency] private readonly PdaSystem _pdaSystem = default!;
|
||||
[Dependency] private readonly SharedAccessSystem _accessSystem = default!;
|
||||
[Dependency] private readonly IdentitySystem _identity = default!;
|
||||
[Dependency] private readonly MetaDataSystem _metaSystem = default!;
|
||||
|
||||
[Dependency] private readonly ActorSystem _actors = default!;
|
||||
[Dependency] private readonly ArrivalsSystem _arrivalsSystem = default!;
|
||||
[Dependency] private readonly ContainerSpawnPointSystem _containerSpawnPointSystem = default!;
|
||||
[Dependency] private readonly HumanoidAppearanceSystem _humanoidSystem = default!;
|
||||
[Dependency] private readonly IdCardSystem _cardSystem = default!;
|
||||
[Dependency] private readonly IdentitySystem _identity = default!;
|
||||
[Dependency] private readonly MetaDataSystem _metaSystem = default!;
|
||||
[Dependency] private readonly PdaSystem _pdaSystem = default!;
|
||||
[Dependency] private readonly SharedAccessSystem _accessSystem = default!;
|
||||
|
||||
private bool _randomizeCharacters;
|
||||
|
||||
|
|
@ -198,7 +199,7 @@ public sealed class StationSpawningSystem : SharedStationSpawningSystem
|
|||
if (loadout == null)
|
||||
{
|
||||
loadout = new RoleLoadout(jobLoadout);
|
||||
loadout.SetDefault(_prototypeManager);
|
||||
loadout.SetDefault(profile, _actors.GetSession(entity), _prototypeManager);
|
||||
}
|
||||
|
||||
EquipRoleLoadout(entity.Value, loadout, roleProto);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,35 @@
|
|||
using Content.Shared.Random;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Server.StationEvents.Components;
|
||||
|
||||
/// <summary>
|
||||
/// This is used for running meteor swarm events at regular intervals.
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(MeteorSchedulerSystem)), AutoGenerateComponentPause]
|
||||
public sealed partial class MeteorSchedulerComponent : Component
|
||||
{
|
||||
/// <summary>
|
||||
/// The weights for which swarms will be selected.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public ProtoId<WeightedRandomEntityPrototype> Config = "DefaultConfig";
|
||||
|
||||
/// <summary>
|
||||
/// The time at which the next swarm occurs.
|
||||
/// </summary>
|
||||
[DataField, AutoPausedField]
|
||||
public TimeSpan NextSwarmTime = TimeSpan.Zero;
|
||||
|
||||
/// <summary>
|
||||
/// The minimum time between swarms
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public TimeSpan MinSwarmDelay = TimeSpan.FromMinutes(7.5f);
|
||||
|
||||
/// <summary>
|
||||
/// The maximum time between swarms
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public TimeSpan MaxSwarmDelay = TimeSpan.FromMinutes(12.5f);
|
||||
}
|
||||
|
|
@ -0,0 +1,58 @@
|
|||
using Content.Server.StationEvents.Events;
|
||||
using Content.Shared.Destructible.Thresholds;
|
||||
using Robust.Shared.Audio;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Server.StationEvents.Components;
|
||||
|
||||
[RegisterComponent, Access(typeof(MeteorSwarmSystem)), AutoGenerateComponentPause]
|
||||
public sealed partial class MeteorSwarmComponent : Component
|
||||
{
|
||||
[DataField, AutoPausedField]
|
||||
public TimeSpan NextWaveTime;
|
||||
|
||||
/// <summary>
|
||||
/// We'll send a specific amount of waves of meteors towards the station per ending rather than using a timer.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public int WaveCounter;
|
||||
|
||||
[DataField]
|
||||
public float MeteorVelocity = 10f;
|
||||
|
||||
/// <summary>
|
||||
/// If true, meteors will be thrown from all angles instead of from a singular source
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public bool NonDirectional;
|
||||
|
||||
/// <summary>
|
||||
/// The announcement played when a meteor swarm begins.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public LocId? Announcement = "station-event-meteor-swarm-start-announcement";
|
||||
|
||||
[DataField]
|
||||
public SoundSpecifier? AnnouncementSound = new SoundPathSpecifier("/Audio/Announcements/meteors.ogg")
|
||||
{
|
||||
Params = new()
|
||||
{
|
||||
Volume = -4
|
||||
}
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// Each meteor entity prototype and their corresponding weight in being picked.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public Dictionary<EntProtoId, float> Meteors = new();
|
||||
|
||||
[DataField]
|
||||
public MinMax Waves = new(3, 3);
|
||||
|
||||
[DataField]
|
||||
public MinMax MeteorsPerWave = new(3, 4);
|
||||
|
||||
[DataField]
|
||||
public MinMax WaveCooldown = new (10, 60);
|
||||
}
|
||||
|
|
@ -1,40 +0,0 @@
|
|||
using Content.Server.StationEvents.Events;
|
||||
|
||||
namespace Content.Server.StationEvents.Components;
|
||||
|
||||
[RegisterComponent, Access(typeof(MeteorSwarmRule))]
|
||||
public sealed partial class MeteorSwarmRuleComponent : Component
|
||||
{
|
||||
[DataField("cooldown")]
|
||||
public float Cooldown;
|
||||
|
||||
/// <summary>
|
||||
/// We'll send a specific amount of waves of meteors towards the station per ending rather than using a timer.
|
||||
/// </summary>
|
||||
[DataField("waveCounter")]
|
||||
public int WaveCounter;
|
||||
|
||||
[DataField("minimumWaves")]
|
||||
public int MinimumWaves = 3;
|
||||
|
||||
[DataField("maximumWaves")]
|
||||
public int MaximumWaves = 8;
|
||||
|
||||
[DataField("minimumCooldown")]
|
||||
public float MinimumCooldown = 10f;
|
||||
|
||||
[DataField("maximumCooldown")]
|
||||
public float MaximumCooldown = 60f;
|
||||
|
||||
[DataField("meteorsPerWave")]
|
||||
public int MeteorsPerWave = 5;
|
||||
|
||||
[DataField("meteorVelocity")]
|
||||
public float MeteorVelocity = 10f;
|
||||
|
||||
[DataField("maxAngularVelocity")]
|
||||
public float MaxAngularVelocity = 0.25f;
|
||||
|
||||
[DataField("minAngularVelocity")]
|
||||
public float MinAngularVelocity = -0.25f;
|
||||
}
|
||||
|
|
@ -1,85 +0,0 @@
|
|||
using System.Numerics;
|
||||
using Content.Server.GameTicking.Rules.Components;
|
||||
using Content.Server.StationEvents.Components;
|
||||
using Content.Shared.GameTicking.Components;
|
||||
using Robust.Shared.Map;
|
||||
using Robust.Shared.Map.Components;
|
||||
using Robust.Shared.Physics.Components;
|
||||
using Robust.Shared.Physics.Systems;
|
||||
using Robust.Shared.Spawners;
|
||||
|
||||
namespace Content.Server.StationEvents.Events
|
||||
{
|
||||
public sealed class MeteorSwarmRule : StationEventSystem<MeteorSwarmRuleComponent>
|
||||
{
|
||||
[Dependency] private readonly SharedPhysicsSystem _physics = default!;
|
||||
|
||||
protected override void Started(EntityUid uid, MeteorSwarmRuleComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args)
|
||||
{
|
||||
base.Started(uid, component, gameRule, args);
|
||||
|
||||
component.WaveCounter = RobustRandom.Next(component.MinimumWaves, component.MaximumWaves);
|
||||
}
|
||||
|
||||
protected override void ActiveTick(EntityUid uid, MeteorSwarmRuleComponent component, GameRuleComponent gameRule, float frameTime)
|
||||
{
|
||||
if (component.WaveCounter <= 0)
|
||||
{
|
||||
ForceEndSelf(uid, gameRule);
|
||||
return;
|
||||
}
|
||||
|
||||
component.Cooldown -= frameTime;
|
||||
|
||||
if (component.Cooldown > 0f)
|
||||
return;
|
||||
|
||||
component.WaveCounter--;
|
||||
|
||||
component.Cooldown += (component.MaximumCooldown - component.MinimumCooldown) * RobustRandom.NextFloat() + component.MinimumCooldown;
|
||||
|
||||
Box2? playableArea = null;
|
||||
var mapId = GameTicker.DefaultMap;
|
||||
|
||||
var query = AllEntityQuery<MapGridComponent, TransformComponent>();
|
||||
while (query.MoveNext(out var gridId, out _, out var xform))
|
||||
{
|
||||
if (xform.MapID != mapId)
|
||||
continue;
|
||||
|
||||
var aabb = _physics.GetWorldAABB(gridId);
|
||||
playableArea = playableArea?.Union(aabb) ?? aabb;
|
||||
}
|
||||
|
||||
if (playableArea == null)
|
||||
{
|
||||
ForceEndSelf(uid, gameRule);
|
||||
return;
|
||||
}
|
||||
|
||||
var minimumDistance = (playableArea.Value.TopRight - playableArea.Value.Center).Length() + 50f;
|
||||
var maximumDistance = minimumDistance + 100f;
|
||||
|
||||
var center = playableArea.Value.Center;
|
||||
|
||||
for (var i = 0; i < component.MeteorsPerWave; i++)
|
||||
{
|
||||
var angle = new Angle(RobustRandom.NextFloat() * MathF.Tau);
|
||||
var offset = angle.RotateVec(new Vector2((maximumDistance - minimumDistance) * RobustRandom.NextFloat() + minimumDistance, 0));
|
||||
var spawnPosition = new MapCoordinates(center + offset, mapId);
|
||||
var meteor = Spawn("MeteorLarge", spawnPosition);
|
||||
var physics = EntityManager.GetComponent<PhysicsComponent>(meteor);
|
||||
_physics.SetBodyStatus(meteor, physics, BodyStatus.InAir);
|
||||
_physics.SetLinearDamping(meteor, physics, 0f);
|
||||
_physics.SetAngularDamping(meteor, physics, 0f);
|
||||
_physics.ApplyLinearImpulse(meteor, -offset.Normalized() * component.MeteorVelocity * physics.Mass, body: physics);
|
||||
_physics.ApplyAngularImpulse(
|
||||
meteor,
|
||||
physics.Mass * ((component.MaxAngularVelocity - component.MinAngularVelocity) * RobustRandom.NextFloat() + component.MinAngularVelocity),
|
||||
body: physics);
|
||||
|
||||
EnsureComp<TimedDespawnComponent>(meteor).Lifetime = 120f;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
82
Content.Server/StationEvents/Events/MeteorSwarmSystem.cs
Normal file
|
|
@ -0,0 +1,82 @@
|
|||
using System.Numerics;
|
||||
using Content.Server.Chat.Systems;
|
||||
using Content.Server.GameTicking.Rules;
|
||||
using Content.Server.Station.Components;
|
||||
using Content.Server.Station.Systems;
|
||||
using Content.Server.StationEvents.Components;
|
||||
using Content.Shared.GameTicking.Components;
|
||||
using Content.Shared.Random.Helpers;
|
||||
using Robust.Server.Audio;
|
||||
using Robust.Shared.Map;
|
||||
using Robust.Shared.Physics.Components;
|
||||
using Robust.Shared.Physics.Systems;
|
||||
using Robust.Shared.Player;
|
||||
using Robust.Shared.Random;
|
||||
|
||||
namespace Content.Server.StationEvents.Events;
|
||||
|
||||
public sealed class MeteorSwarmSystem : GameRuleSystem<MeteorSwarmComponent>
|
||||
{
|
||||
[Dependency] private readonly SharedPhysicsSystem _physics = default!;
|
||||
[Dependency] private readonly AudioSystem _audio = default!;
|
||||
[Dependency] private readonly ChatSystem _chat = default!;
|
||||
[Dependency] private readonly StationSystem _station = default!;
|
||||
|
||||
protected override void Added(EntityUid uid, MeteorSwarmComponent component, GameRuleComponent gameRule, GameRuleAddedEvent args)
|
||||
{
|
||||
base.Added(uid, component, gameRule, args);
|
||||
|
||||
component.WaveCounter = component.Waves.Next(RobustRandom);
|
||||
|
||||
if (component.Announcement is { } locId)
|
||||
_chat.DispatchGlobalAnnouncement(Loc.GetString(locId), playSound: false, colorOverride: Color.Yellow);
|
||||
_audio.PlayGlobal(component.AnnouncementSound, Filter.Broadcast(), true);
|
||||
}
|
||||
|
||||
protected override void ActiveTick(EntityUid uid, MeteorSwarmComponent component, GameRuleComponent gameRule, float frameTime)
|
||||
{
|
||||
if (Timing.CurTime < component.NextWaveTime)
|
||||
return;
|
||||
|
||||
component.NextWaveTime += TimeSpan.FromSeconds(component.WaveCooldown.Next(RobustRandom));
|
||||
|
||||
|
||||
if (_station.GetStations().Count == 0)
|
||||
return;
|
||||
|
||||
var station = RobustRandom.Pick(_station.GetStations());
|
||||
if (_station.GetLargestGrid(Comp<StationDataComponent>(station)) is not { } grid)
|
||||
return;
|
||||
|
||||
var mapId = Transform(grid).MapID;
|
||||
var playableArea = _physics.GetWorldAABB(grid);
|
||||
|
||||
var minimumDistance = (playableArea.TopRight - playableArea.Center).Length() + 50f;
|
||||
var maximumDistance = minimumDistance + 100f;
|
||||
|
||||
var center = playableArea.Center;
|
||||
|
||||
var meteorsToSpawn = component.MeteorsPerWave.Next(RobustRandom);
|
||||
for (var i = 0; i < meteorsToSpawn; i++)
|
||||
{
|
||||
var spawnProto = RobustRandom.Pick(component.Meteors);
|
||||
|
||||
var angle = component.NonDirectional
|
||||
? RobustRandom.NextAngle()
|
||||
: new Random(uid.Id).NextAngle();
|
||||
|
||||
var offset = angle.RotateVec(new Vector2((maximumDistance - minimumDistance) * RobustRandom.NextFloat() + minimumDistance, 0));
|
||||
var subOffset = RobustRandom.NextAngle().RotateVec(new Vector2( (playableArea.TopRight - playableArea.Center).Length() / 2 * RobustRandom.NextFloat(), 0));
|
||||
var spawnPosition = new MapCoordinates(center + offset + subOffset, mapId);
|
||||
var meteor = Spawn(spawnProto, spawnPosition);
|
||||
var physics = Comp<PhysicsComponent>(meteor);
|
||||
_physics.ApplyLinearImpulse(meteor, -offset.Normalized() * component.MeteorVelocity * physics.Mass, body: physics);
|
||||
}
|
||||
|
||||
component.WaveCounter--;
|
||||
if (component.WaveCounter <= 0)
|
||||
{
|
||||
ForceEndSelf(uid, gameRule);
|
||||
}
|
||||
}
|
||||
}
|
||||
39
Content.Server/StationEvents/MeteorSchedulerSystem.cs
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
using Content.Server.GameTicking.Rules;
|
||||
using Content.Server.StationEvents.Components;
|
||||
using Content.Shared.GameTicking.Components;
|
||||
using Content.Shared.Random.Helpers;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Server.StationEvents;
|
||||
|
||||
/// <summary>
|
||||
/// This handles scheduling and launching meteors at a station at regular intervals.
|
||||
/// TODO: there is 100% a world in which this is genericized and can be used for lots of basic event scheduling
|
||||
/// </summary>
|
||||
public sealed class MeteorSchedulerSystem : GameRuleSystem<MeteorSchedulerComponent>
|
||||
{
|
||||
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
||||
|
||||
protected override void Started(EntityUid uid, MeteorSchedulerComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args)
|
||||
{
|
||||
base.Started(uid, component, gameRule, args);
|
||||
|
||||
component.NextSwarmTime = Timing.CurTime + RobustRandom.Next(component.MinSwarmDelay, component.MaxSwarmDelay);
|
||||
}
|
||||
|
||||
protected override void ActiveTick(EntityUid uid, MeteorSchedulerComponent component, GameRuleComponent gameRule, float frameTime)
|
||||
{
|
||||
base.ActiveTick(uid, component, gameRule, frameTime);
|
||||
|
||||
if (Timing.CurTime < component.NextSwarmTime)
|
||||
return;
|
||||
RunSwarm((uid, component));
|
||||
component.NextSwarmTime += RobustRandom.Next(component.MinSwarmDelay, component.MaxSwarmDelay);
|
||||
}
|
||||
|
||||
private void RunSwarm(Entity<MeteorSchedulerComponent> ent)
|
||||
{
|
||||
var swarmWeights = _prototypeManager.Index(ent.Comp.Config);
|
||||
GameTicker.StartGameRule(swarmWeights.Pick(RobustRandom));
|
||||
}
|
||||
}
|
||||
|
|
@ -50,7 +50,7 @@ namespace Content.Server.VendingMachines
|
|||
SubscribeLocalEvent<VendingMachineComponent, PowerChangedEvent>(OnPowerChanged);
|
||||
SubscribeLocalEvent<VendingMachineComponent, BreakageEventArgs>(OnBreak);
|
||||
SubscribeLocalEvent<VendingMachineComponent, GotEmaggedEvent>(OnEmagged);
|
||||
SubscribeLocalEvent<VendingMachineComponent, DamageChangedEvent>(OnDamage);
|
||||
SubscribeLocalEvent<VendingMachineComponent, DamageChangedEvent>(OnDamageChanged);
|
||||
SubscribeLocalEvent<VendingMachineComponent, PriceCalculationEvent>(OnVendingPrice);
|
||||
SubscribeLocalEvent<VendingMachineComponent, EmpPulseEvent>(OnEmpPulse);
|
||||
|
||||
|
|
@ -149,8 +149,15 @@ namespace Content.Server.VendingMachines
|
|||
args.Handled = component.EmaggedInventory.Count > 0;
|
||||
}
|
||||
|
||||
private void OnDamage(EntityUid uid, VendingMachineComponent component, DamageChangedEvent args)
|
||||
private void OnDamageChanged(EntityUid uid, VendingMachineComponent component, DamageChangedEvent args)
|
||||
{
|
||||
if (!args.DamageIncreased && component.Broken)
|
||||
{
|
||||
component.Broken = false;
|
||||
TryUpdateVisualState(uid, component);
|
||||
return;
|
||||
}
|
||||
|
||||
if (component.Broken || component.DispenseOnHitCoolingDown ||
|
||||
component.DispenseOnHitChance == null || args.DamageDelta == null)
|
||||
return;
|
||||
|
|
|
|||
31
Content.Shared/Atmos/Components/MovedByPressureComponent.cs
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
namespace Content.Shared.Atmos.Components;
|
||||
|
||||
// Unfortunately can't be friends yet due to magboots.
|
||||
[RegisterComponent]
|
||||
public sealed partial class MovedByPressureComponent : Component
|
||||
{
|
||||
public const float MoveForcePushRatio = 1f;
|
||||
public const float MoveForceForcePushRatio = 1f;
|
||||
public const float ProbabilityOffset = 25f;
|
||||
public const float ProbabilityBasePercent = 10f;
|
||||
public const float ThrowForce = 100f;
|
||||
|
||||
/// <summary>
|
||||
/// Accumulates time when yeeted by high pressure deltas.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public float Accumulator;
|
||||
|
||||
[DataField]
|
||||
public bool Enabled { get; set; } = true;
|
||||
|
||||
[DataField]
|
||||
public float PressureResistance { get; set; } = 1f;
|
||||
|
||||
[DataField]
|
||||
public float MoveResist { get; set; } = 100f;
|
||||
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
public int LastHighPressureMovementAirCycle { get; set; } = 0;
|
||||
}
|
||||
|
||||
|
|
@ -1856,7 +1856,7 @@ namespace Content.Shared.CCVar
|
|||
/// Don't show rules to localhost/loopback interface.
|
||||
/// </summary>
|
||||
public static readonly CVarDef<bool> RulesExemptLocal =
|
||||
CVarDef.Create("rules.exempt_local", false, CVar.SERVERONLY);
|
||||
CVarDef.Create("rules.exempt_local", true, CVar.SERVERONLY);
|
||||
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -193,7 +193,7 @@ public sealed class SolutionTransferSystem : EntitySystem
|
|||
var actualAmount = FixedPoint2.Min(amount, FixedPoint2.Min(sourceSolution.Volume, targetSolution.AvailableVolume));
|
||||
|
||||
var solution = _solution.SplitSolution(source, actualAmount);
|
||||
_solution.Refill(targetEntity, target, solution);
|
||||
_solution.AddSolution(target, solution);
|
||||
|
||||
_adminLogger.Add(LogType.Action, LogImpact.Medium,
|
||||
$"{ToPrettyString(user):player} transferred {SharedSolutionContainerSystem.ToPrettyString(solution)} to {ToPrettyString(targetEntity):target}, which now contains {SharedSolutionContainerSystem.ToPrettyString(targetSolution)}");
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
using System.Linq;
|
||||
using System.Linq;
|
||||
using System.Text.Json.Serialization;
|
||||
using Content.Shared.Chemistry.Components;
|
||||
using Content.Shared.Database;
|
||||
|
|
@ -28,7 +28,7 @@ namespace Content.Shared.Chemistry.Reagent
|
|||
|
||||
public virtual string ReagentEffectFormat => "guidebook-reagent-effect-description";
|
||||
|
||||
protected abstract string? ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys); // => Loc.GetString("reagent-effect-guidebook-missing", ("chance", Probability));
|
||||
protected abstract string? ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys);
|
||||
|
||||
/// <summary>
|
||||
/// What's the chance, from 0 to 1, that this effect will occur?
|
||||
|
|
|
|||
|
|
@ -0,0 +1,9 @@
|
|||
using Robust.Shared.GameStates;
|
||||
|
||||
namespace Content.Shared.Clothing.Components;
|
||||
|
||||
/// <summary>
|
||||
/// This is used for clothing that makes an entity weightless when worn.
|
||||
/// </summary>
|
||||
[RegisterComponent, NetworkedComponent]
|
||||
public sealed partial class AntiGravityClothingComponent : Component;
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
using Content.Shared.Clothing.Components;
|
||||
using Content.Shared.Gravity;
|
||||
using Content.Shared.Inventory;
|
||||
|
||||
namespace Content.Shared.Clothing.EntitySystems;
|
||||
|
||||
public sealed class AntiGravityClothingSystem : EntitySystem
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public override void Initialize()
|
||||
{
|
||||
SubscribeLocalEvent<AntiGravityClothingComponent, InventoryRelayedEvent<IsWeightlessEvent>>(OnIsWeightless);
|
||||
}
|
||||
|
||||
private void OnIsWeightless(Entity<AntiGravityClothingComponent> ent, ref InventoryRelayedEvent<IsWeightlessEvent> args)
|
||||
{
|
||||
if (args.Args.Handled)
|
||||
return;
|
||||
|
||||
args.Args.Handled = true;
|
||||
args.Args.IsWeightless = true;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,8 +1,11 @@
|
|||
using System.Linq;
|
||||
using Content.Shared.Clothing.Components;
|
||||
using Content.Shared.Humanoid;
|
||||
using Content.Shared.Preferences;
|
||||
using Content.Shared.Preferences.Loadouts;
|
||||
using Content.Shared.Roles;
|
||||
using Content.Shared.Station;
|
||||
using Robust.Shared.Player;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Random;
|
||||
|
||||
|
|
@ -15,6 +18,7 @@ public sealed class LoadoutSystem : EntitySystem
|
|||
{
|
||||
// Shared so we can predict it for placement manager.
|
||||
|
||||
[Dependency] private readonly ActorSystem _actors = default!;
|
||||
[Dependency] private readonly SharedStationSpawningSystem _station = default!;
|
||||
[Dependency] private readonly IPrototypeManager _protoMan = default!;
|
||||
[Dependency] private readonly IRobustRandom _random = default!;
|
||||
|
|
@ -125,7 +129,17 @@ public sealed class LoadoutSystem : EntitySystem
|
|||
var id = _random.Pick(component.RoleLoadout);
|
||||
var proto = _protoMan.Index(id);
|
||||
var loadout = new RoleLoadout(id);
|
||||
loadout.SetDefault(_protoMan, true);
|
||||
loadout.SetDefault(GetProfile(uid), _actors.GetSession(uid), _protoMan, true);
|
||||
_station.EquipRoleLoadout(uid, loadout, proto);
|
||||
}
|
||||
|
||||
public HumanoidCharacterProfile GetProfile(EntityUid? uid)
|
||||
{
|
||||
if (TryComp(uid, out HumanoidAppearanceComponent? appearance))
|
||||
{
|
||||
return HumanoidCharacterProfile.DefaultWithSpecies(appearance.Species);
|
||||
}
|
||||
|
||||
return HumanoidCharacterProfile.Random();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,8 @@
|
|||
using Content.Shared.Actions;
|
||||
using Content.Shared.Alert;
|
||||
using Content.Shared.Atmos.Components;
|
||||
using Content.Shared.Clothing.EntitySystems;
|
||||
using Content.Shared.Gravity;
|
||||
using Content.Shared.Inventory;
|
||||
using Content.Shared.Item;
|
||||
using Content.Shared.Slippery;
|
||||
|
|
@ -9,8 +12,9 @@ using Robust.Shared.Containers;
|
|||
|
||||
namespace Content.Shared.Clothing;
|
||||
|
||||
public abstract class SharedMagbootsSystem : EntitySystem
|
||||
public sealed class SharedMagbootsSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly AlertsSystem _alerts = default!;
|
||||
[Dependency] private readonly ClothingSpeedModifierSystem _clothingSpeedModifier = default!;
|
||||
[Dependency] private readonly ClothingSystem _clothing = default!;
|
||||
[Dependency] private readonly InventorySystem _inventory = default!;
|
||||
|
|
@ -29,6 +33,11 @@ public abstract class SharedMagbootsSystem : EntitySystem
|
|||
SubscribeLocalEvent<MagbootsComponent, GetItemActionsEvent>(OnGetActions);
|
||||
SubscribeLocalEvent<MagbootsComponent, ToggleMagbootsEvent>(OnToggleMagboots);
|
||||
SubscribeLocalEvent<MagbootsComponent, MapInitEvent>(OnMapInit);
|
||||
|
||||
SubscribeLocalEvent<MagbootsComponent, ClothingGotEquippedEvent>(OnGotEquipped);
|
||||
SubscribeLocalEvent<MagbootsComponent, ClothingGotUnequippedEvent>(OnGotUnequipped);
|
||||
|
||||
SubscribeLocalEvent<MagbootsComponent, InventoryRelayedEvent<IsWeightlessEvent>>(OnIsWeightless);
|
||||
}
|
||||
|
||||
private void OnMapInit(EntityUid uid, MagbootsComponent component, MapInitEvent args)
|
||||
|
|
@ -37,6 +46,16 @@ public abstract class SharedMagbootsSystem : EntitySystem
|
|||
Dirty(uid, component);
|
||||
}
|
||||
|
||||
private void OnGotUnequipped(EntityUid uid, MagbootsComponent component, ref ClothingGotUnequippedEvent args)
|
||||
{
|
||||
UpdateMagbootEffects(args.Wearer, uid, false, component);
|
||||
}
|
||||
|
||||
private void OnGotEquipped(EntityUid uid, MagbootsComponent component, ref ClothingGotEquippedEvent args)
|
||||
{
|
||||
UpdateMagbootEffects(args.Wearer, uid, true, component);
|
||||
}
|
||||
|
||||
private void OnToggleMagboots(EntityUid uid, MagbootsComponent component, ToggleMagbootsEvent args)
|
||||
{
|
||||
if (args.Handled)
|
||||
|
|
@ -51,9 +70,11 @@ public abstract class SharedMagbootsSystem : EntitySystem
|
|||
{
|
||||
magboots.On = !magboots.On;
|
||||
|
||||
if (_sharedContainer.TryGetContainingContainer(uid, out var container) &&
|
||||
if (_sharedContainer.TryGetContainingContainer((uid, Transform(uid)), out var container) &&
|
||||
_inventory.TryGetSlotEntity(container.Owner, "shoes", out var entityUid) && entityUid == uid)
|
||||
{
|
||||
UpdateMagbootEffects(container.Owner, uid, true, magboots);
|
||||
}
|
||||
|
||||
if (TryComp<ItemComponent>(uid, out var item))
|
||||
{
|
||||
|
|
@ -66,9 +87,28 @@ public abstract class SharedMagbootsSystem : EntitySystem
|
|||
Dirty(uid, magboots);
|
||||
}
|
||||
|
||||
protected virtual void UpdateMagbootEffects(EntityUid parent, EntityUid uid, bool state, MagbootsComponent? component) { }
|
||||
public void UpdateMagbootEffects(EntityUid parent, EntityUid uid, bool state, MagbootsComponent? component)
|
||||
{
|
||||
if (!Resolve(uid, ref component))
|
||||
return;
|
||||
state = state && component.On;
|
||||
|
||||
protected void OnChanged(EntityUid uid, MagbootsComponent component)
|
||||
if (TryComp(parent, out MovedByPressureComponent? movedByPressure))
|
||||
{
|
||||
movedByPressure.Enabled = !state;
|
||||
}
|
||||
|
||||
if (state)
|
||||
{
|
||||
_alerts.ShowAlert(parent, component.MagbootsAlert);
|
||||
}
|
||||
else
|
||||
{
|
||||
_alerts.ClearAlert(parent, component.MagbootsAlert);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnChanged(EntityUid uid, MagbootsComponent component)
|
||||
{
|
||||
_sharedActions.SetToggled(component.ToggleActionEntity, component.On);
|
||||
_clothingSpeedModifier.SetClothingSpeedModifierEnabled(uid, component.On);
|
||||
|
|
@ -79,10 +119,12 @@ public abstract class SharedMagbootsSystem : EntitySystem
|
|||
if (!args.CanAccess || !args.CanInteract)
|
||||
return;
|
||||
|
||||
ActivationVerb verb = new();
|
||||
verb.Text = Loc.GetString("toggle-magboots-verb-get-data-text");
|
||||
verb.Act = () => ToggleMagboots(uid, component);
|
||||
// TODO VERB ICON add toggle icon? maybe a computer on/off symbol?
|
||||
ActivationVerb verb = new()
|
||||
{
|
||||
Text = Loc.GetString("toggle-magboots-verb-get-data-text"),
|
||||
Act = () => ToggleMagboots(uid, component),
|
||||
// TODO VERB ICON add toggle icon? maybe a computer on/off symbol?
|
||||
};
|
||||
args.Verbs.Add(verb);
|
||||
}
|
||||
|
||||
|
|
@ -96,6 +138,18 @@ public abstract class SharedMagbootsSystem : EntitySystem
|
|||
{
|
||||
args.AddAction(ref component.ToggleActionEntity, component.ToggleAction);
|
||||
}
|
||||
|
||||
private void OnIsWeightless(Entity<MagbootsComponent> ent, ref InventoryRelayedEvent<IsWeightlessEvent> args)
|
||||
{
|
||||
if (args.Args.Handled)
|
||||
return;
|
||||
|
||||
if (!ent.Comp.On)
|
||||
return;
|
||||
|
||||
args.Args.IsWeightless = false;
|
||||
args.Args.Handled = true;
|
||||
}
|
||||
}
|
||||
|
||||
public sealed partial class ToggleMagbootsEvent : InstantActionEvent {}
|
||||
public sealed partial class ToggleMagbootsEvent : InstantActionEvent;
|
||||
|
|
|
|||
|
|
@ -105,3 +105,9 @@ public record struct UncuffAttemptEvent(EntityUid User, EntityUid Target)
|
|||
public readonly EntityUid Target = Target;
|
||||
public bool Cancelled = false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Event raised on an entity being uncuffed to determine any modifiers to the amount of time it takes to uncuff them.
|
||||
/// </summary>
|
||||
[ByRefEvent]
|
||||
public record struct ModifyUncuffDurationEvent(EntityUid User, EntityUid Target, float Duration);
|
||||
|
|
|
|||
|
|
@ -561,7 +561,10 @@ namespace Content.Shared.Cuffs
|
|||
return;
|
||||
}
|
||||
|
||||
var uncuffTime = isOwner ? cuff.BreakoutTime : cuff.UncuffTime;
|
||||
|
||||
var ev = new ModifyUncuffDurationEvent(user, target, isOwner ? cuff.BreakoutTime : cuff.UncuffTime);
|
||||
RaiseLocalEvent(user, ref ev);
|
||||
var uncuffTime = ev.Duration;
|
||||
|
||||
if (isOwner)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,9 +1,7 @@
|
|||
using Content.Shared.Alert;
|
||||
using Content.Shared.Clothing;
|
||||
using Content.Shared.Inventory;
|
||||
using Content.Shared.Movement.Components;
|
||||
using Robust.Shared.GameStates;
|
||||
using Robust.Shared.Map;
|
||||
using Robust.Shared.Physics;
|
||||
using Robust.Shared.Physics.Components;
|
||||
using Robust.Shared.Serialization;
|
||||
|
|
@ -15,7 +13,6 @@ namespace Content.Shared.Gravity
|
|||
{
|
||||
[Dependency] protected readonly IGameTiming Timing = default!;
|
||||
[Dependency] private readonly AlertsSystem _alerts = default!;
|
||||
[Dependency] private readonly InventorySystem _inventory = default!;
|
||||
|
||||
[ValidatePrototypeId<AlertPrototype>]
|
||||
public const string WeightlessAlert = "Weightless";
|
||||
|
|
@ -30,6 +27,11 @@ namespace Content.Shared.Gravity
|
|||
if (TryComp<MovementIgnoreGravityComponent>(uid, out var ignoreGravityComponent))
|
||||
return ignoreGravityComponent.Weightless;
|
||||
|
||||
var ev = new IsWeightlessEvent(uid);
|
||||
RaiseLocalEvent(uid, ref ev);
|
||||
if (ev.Handled)
|
||||
return ev.IsWeightless;
|
||||
|
||||
if (!Resolve(uid, ref xform))
|
||||
return true;
|
||||
|
||||
|
|
@ -40,18 +42,6 @@ namespace Content.Shared.Gravity
|
|||
return false;
|
||||
}
|
||||
|
||||
var hasGrav = gravity != null || mapGravity != null;
|
||||
|
||||
// Check for something holding us down
|
||||
// If the planet has gravity component and no gravity it will still give gravity
|
||||
// If there's no gravity comp at all (i.e. space) then they don't work.
|
||||
if (hasGrav && _inventory.TryGetSlotEntity(uid, "shoes", out var ent))
|
||||
{
|
||||
// TODO this should just be a event that gets relayed instead of a specific slot & component check.
|
||||
if (TryComp<MagbootsComponent>(ent, out var boots) && boots.On)
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -74,9 +64,11 @@ namespace Content.Shared.Gravity
|
|||
|
||||
private void OnHandleState(EntityUid uid, GravityComponent component, ref ComponentHandleState args)
|
||||
{
|
||||
if (args.Current is not GravityComponentState state) return;
|
||||
if (args.Current is not GravityComponentState state)
|
||||
return;
|
||||
|
||||
if (component.EnabledVV == state.Enabled) return;
|
||||
if (component.EnabledVV == state.Enabled)
|
||||
return;
|
||||
component.EnabledVV = state.Enabled;
|
||||
var ev = new GravityChangedEvent(uid, component.EnabledVV);
|
||||
RaiseLocalEvent(uid, ref ev, true);
|
||||
|
|
@ -90,9 +82,10 @@ namespace Content.Shared.Gravity
|
|||
private void OnGravityChange(ref GravityChangedEvent ev)
|
||||
{
|
||||
var alerts = AllEntityQuery<AlertsComponent, TransformComponent>();
|
||||
while(alerts.MoveNext(out var uid, out var comp, out var xform))
|
||||
while(alerts.MoveNext(out var uid, out _, out var xform))
|
||||
{
|
||||
if (xform.GridUid != ev.ChangedGridIndex) continue;
|
||||
if (xform.GridUid != ev.ChangedGridIndex)
|
||||
continue;
|
||||
|
||||
if (!ev.HasGravity)
|
||||
{
|
||||
|
|
@ -145,4 +138,10 @@ namespace Content.Shared.Gravity
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
[ByRefEvent]
|
||||
public record struct IsWeightlessEvent(EntityUid Entity, bool IsWeightless = false, bool Handled = false) : IInventoryRelayEvent
|
||||
{
|
||||
SlotFlags IInventoryRelayEvent.TargetSlots => ~SlotFlags.POCKET;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,22 +5,28 @@ using Robust.Shared.Serialization;
|
|||
namespace Content.Shared.Info;
|
||||
|
||||
/// <summary>
|
||||
/// Sent by the server to show the rules to the client instantly.
|
||||
/// Sent by the server when the client connects to sync the client rules and displaying a popup with them if necessitated.
|
||||
/// </summary>
|
||||
public sealed class ShowRulesPopupMessage : NetMessage
|
||||
public sealed class SendRulesInformationMessage : NetMessage
|
||||
{
|
||||
public override MsgGroups MsgGroup => MsgGroups.Command;
|
||||
|
||||
public float PopupTime { get; set; }
|
||||
public string CoreRules { get; set; } = string.Empty;
|
||||
public bool ShouldShowRules { get; set; }
|
||||
|
||||
public override void ReadFromBuffer(NetIncomingMessage buffer, IRobustSerializer serializer)
|
||||
{
|
||||
PopupTime = buffer.ReadFloat();
|
||||
CoreRules = buffer.ReadString();
|
||||
ShouldShowRules = buffer.ReadBoolean();
|
||||
}
|
||||
|
||||
public override void WriteToBuffer(NetOutgoingMessage buffer, IRobustSerializer serializer)
|
||||
{
|
||||
buffer.Write(PopupTime);
|
||||
buffer.Write(CoreRules);
|
||||
buffer.Write(ShouldShowRules);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ using Content.Shared.Damage;
|
|||
using Content.Shared.Electrocution;
|
||||
using Content.Shared.Explosion;
|
||||
using Content.Shared.Eye.Blinding.Systems;
|
||||
using Content.Shared.Gravity;
|
||||
using Content.Shared.IdentityManagement.Components;
|
||||
using Content.Shared.Inventory.Events;
|
||||
using Content.Shared.Movement.Systems;
|
||||
|
|
@ -30,6 +31,7 @@ public partial class InventorySystem
|
|||
|
||||
// by-ref events
|
||||
SubscribeLocalEvent<InventoryComponent, GetExplosionResistanceEvent>(RefRelayInventoryEvent);
|
||||
SubscribeLocalEvent<InventoryComponent, IsWeightlessEvent>(RefRelayInventoryEvent);
|
||||
|
||||
// Eye/vision events
|
||||
SubscribeLocalEvent<InventoryComponent, CanSeeAttemptEvent>(RelayInventoryEvent);
|
||||
|
|
|
|||
|
|
@ -212,7 +212,7 @@ public sealed class MobThresholdSystem : EntitySystem
|
|||
MobThresholdsComponent? thresholdComponent = null)
|
||||
{
|
||||
threshold = null;
|
||||
if (!Resolve(target, ref thresholdComponent))
|
||||
if (!Resolve(target, ref thresholdComponent, false))
|
||||
return false;
|
||||
|
||||
return TryGetThresholdForState(target, MobState.Dead, out threshold, thresholdComponent);
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ using Content.Shared.ActionBlocker;
|
|||
using Content.Shared.Administration.Logs;
|
||||
using Content.Shared.Alert;
|
||||
using Content.Shared.Buckle.Components;
|
||||
using Content.Shared.Cuffs.Components;
|
||||
using Content.Shared.Database;
|
||||
using Content.Shared.Hands;
|
||||
using Content.Shared.Hands.EntitySystems;
|
||||
|
|
@ -12,6 +13,7 @@ using Content.Shared.Movement.Events;
|
|||
using Content.Shared.Movement.Pulling.Components;
|
||||
using Content.Shared.Movement.Pulling.Events;
|
||||
using Content.Shared.Movement.Systems;
|
||||
using Content.Shared.Popups;
|
||||
using Content.Shared.Pulling.Events;
|
||||
using Content.Shared.Standing;
|
||||
using Content.Shared.Throwing;
|
||||
|
|
@ -43,6 +45,7 @@ public sealed class PullingSystem : EntitySystem
|
|||
[Dependency] private readonly SharedHandsSystem _handsSystem = default!;
|
||||
[Dependency] private readonly SharedInteractionSystem _interaction = default!;
|
||||
[Dependency] private readonly SharedPhysicsSystem _physics = default!;
|
||||
[Dependency] private readonly SharedPopupSystem _popup = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
|
|
@ -56,6 +59,7 @@ public sealed class PullingSystem : EntitySystem
|
|||
SubscribeLocalEvent<PullableComponent, JointRemovedEvent>(OnJointRemoved);
|
||||
SubscribeLocalEvent<PullableComponent, GetVerbsEvent<Verb>>(AddPullVerbs);
|
||||
SubscribeLocalEvent<PullableComponent, EntGotInsertedIntoContainerMessage>(OnPullableContainerInsert);
|
||||
SubscribeLocalEvent<PullableComponent, ModifyUncuffDurationEvent>(OnModifyUncuffDuration);
|
||||
|
||||
SubscribeLocalEvent<PullerComponent, EntGotInsertedIntoContainerMessage>(OnPullerContainerInsert);
|
||||
SubscribeLocalEvent<PullerComponent, EntityUnpausedEvent>(OnPullerUnpaused);
|
||||
|
|
@ -94,6 +98,18 @@ public sealed class PullingSystem : EntitySystem
|
|||
TryStopPull(ent.Owner, ent.Comp);
|
||||
}
|
||||
|
||||
private void OnModifyUncuffDuration(Entity<PullableComponent> ent, ref ModifyUncuffDurationEvent args)
|
||||
{
|
||||
if (!ent.Comp.BeingPulled)
|
||||
return;
|
||||
|
||||
// We don't care if the person is being uncuffed by someone else
|
||||
if (args.User != args.Target)
|
||||
return;
|
||||
|
||||
args.Duration *= 2;
|
||||
}
|
||||
|
||||
public override void Shutdown()
|
||||
{
|
||||
base.Shutdown();
|
||||
|
|
|
|||
|
|
@ -62,7 +62,7 @@ public sealed partial class OpenableSystem : EntitySystem
|
|||
if (args.Handled || !ent.Comp.OpenableByHand)
|
||||
return;
|
||||
|
||||
args.Handled = TryToggle(ent, args.User);
|
||||
args.Handled = TryOpen(ent, ent, args.User);
|
||||
}
|
||||
|
||||
private void OnActivated(Entity<OpenableComponent> ent, ref ActivateInWorldEvent args)
|
||||
|
|
|
|||
|
|
@ -733,15 +733,15 @@ namespace Content.Shared.Preferences
|
|||
return profile;
|
||||
}
|
||||
|
||||
public RoleLoadout GetLoadoutOrDefault(string id, ProtoId<SpeciesPrototype>? species, IEntityManager entManager, IPrototypeManager protoManager)
|
||||
public RoleLoadout GetLoadoutOrDefault(string id, ICommonSession? session, ProtoId<SpeciesPrototype>? species, IEntityManager entManager, IPrototypeManager protoManager)
|
||||
{
|
||||
if (!_loadouts.TryGetValue(id, out var loadout))
|
||||
{
|
||||
loadout = new RoleLoadout(id);
|
||||
loadout.SetDefault(protoManager, force: true);
|
||||
loadout.SetDefault(this, session, protoManager, force: true);
|
||||
}
|
||||
|
||||
loadout.SetDefault(protoManager);
|
||||
loadout.SetDefault(this, session, protoManager);
|
||||
return loadout;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -13,17 +13,20 @@ public sealed partial class GroupLoadoutEffect : LoadoutEffect
|
|||
[DataField(required: true)]
|
||||
public ProtoId<LoadoutEffectGroupPrototype> Proto;
|
||||
|
||||
public override bool Validate(HumanoidCharacterProfile profile, RoleLoadout loadout, LoadoutPrototype proto, ICommonSession session, IDependencyCollection collection, [NotNullWhen(false)] out FormattedMessage? reason) // Corvax-Sponsors
|
||||
public override bool Validate(HumanoidCharacterProfile profile, RoleLoadout loadout, LoadoutPrototype proto, ICommonSession? session, IDependencyCollection collection, [NotNullWhen(false)] out FormattedMessage? reason) // Corvax-Sponsors
|
||||
{
|
||||
var effectsProto = collection.Resolve<IPrototypeManager>().Index(Proto);
|
||||
|
||||
var reasons = new List<string>();
|
||||
foreach (var effect in effectsProto.Effects)
|
||||
{
|
||||
if (!effect.Validate(profile, loadout, proto, session, collection, out reason))
|
||||
return false;
|
||||
if (effect.Validate(profile, loadout, proto, session, collection, out reason))
|
||||
continue;
|
||||
|
||||
reasons.Add(reason.ToMarkup());
|
||||
}
|
||||
|
||||
reason = null;
|
||||
return true;
|
||||
reason = reasons.Count == 0 ? null : FormattedMessage.FromMarkup(string.Join('\n', reasons));
|
||||
return reason == null;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,8 +15,14 @@ public sealed partial class JobRequirementLoadoutEffect : LoadoutEffect
|
|||
[DataField(required: true)]
|
||||
public JobRequirement Requirement = default!;
|
||||
|
||||
public override bool Validate(HumanoidCharacterProfile profile, RoleLoadout loadout, LoadoutPrototype proto, ICommonSession session, IDependencyCollection collection, [NotNullWhen(false)] out FormattedMessage? reason)
|
||||
public override bool Validate(HumanoidCharacterProfile profile, RoleLoadout loadout, LoadoutPrototype proto, ICommonSession? session, IDependencyCollection collection, [NotNullWhen(false)] out FormattedMessage? reason)
|
||||
{
|
||||
if (session == null)
|
||||
{
|
||||
reason = FormattedMessage.Empty;
|
||||
return true;
|
||||
}
|
||||
|
||||
var manager = collection.Resolve<ISharedPlaytimeManager>();
|
||||
var playtimes = manager.GetPlayTimes(session);
|
||||
return JobRequirements.TryRequirementMet(Requirement, playtimes, out reason,
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ public abstract partial class LoadoutEffect
|
|||
HumanoidCharacterProfile profile,
|
||||
RoleLoadout loadout,
|
||||
LoadoutPrototype proto, // Corvax-Sponsors
|
||||
ICommonSession session,
|
||||
ICommonSession? session,
|
||||
IDependencyCollection collection,
|
||||
[NotNullWhen(false)] out FormattedMessage? reason);
|
||||
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ public sealed partial class PointsCostLoadoutEffect : LoadoutEffect
|
|||
HumanoidCharacterProfile profile,
|
||||
RoleLoadout loadout,
|
||||
LoadoutPrototype proto, // Corvax-Sponsors
|
||||
ICommonSession session,
|
||||
ICommonSession? session,
|
||||
IDependencyCollection collection,
|
||||
[NotNullWhen(false)] out FormattedMessage? reason)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ public sealed partial class SpeciesLoadoutEffect : LoadoutEffect
|
|||
[DataField(required: true)]
|
||||
public List<ProtoId<SpeciesPrototype>> Species = new();
|
||||
|
||||
public override bool Validate(HumanoidCharacterProfile profile, RoleLoadout loadout, LoadoutPrototype proto, ICommonSession session, IDependencyCollection collection, // Corvax-Sponsors
|
||||
public override bool Validate(HumanoidCharacterProfile profile, RoleLoadout loadout, LoadoutPrototype proto, ICommonSession? session, IDependencyCollection collection, // Corvax-Sponsors
|
||||
[NotNullWhen(false)] out FormattedMessage? reason)
|
||||
{
|
||||
if (Species.Contains(profile.Species))
|
||||
|
|
|
|||
|
|
@ -7,8 +7,25 @@ namespace Content.Shared.Preferences.Loadouts;
|
|||
/// Specifies the selected prototype and custom data for a loadout.
|
||||
/// </summary>
|
||||
[Serializable, NetSerializable, DataDefinition]
|
||||
public sealed partial class Loadout
|
||||
public sealed partial class Loadout : IEquatable<Loadout>
|
||||
{
|
||||
[DataField]
|
||||
public ProtoId<LoadoutPrototype> Prototype;
|
||||
|
||||
public bool Equals(Loadout? other)
|
||||
{
|
||||
if (ReferenceEquals(null, other)) return false;
|
||||
if (ReferenceEquals(this, other)) return true;
|
||||
return Prototype.Equals(other.Prototype);
|
||||
}
|
||||
|
||||
public override bool Equals(object? obj)
|
||||
{
|
||||
return ReferenceEquals(this, obj) || obj is Loadout other && Equals(other);
|
||||
}
|
||||
|
||||
public override int GetHashCode()
|
||||
{
|
||||
return Prototype.GetHashCode();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -187,12 +187,15 @@ public sealed partial class RoleLoadout : IEquatable<RoleLoadout>
|
|||
/// <summary>
|
||||
/// Resets the selected loadouts to default if no data is present.
|
||||
/// </summary>
|
||||
/// <param name="force">Clear existing data first</param>
|
||||
public void SetDefault(IPrototypeManager protoManager, bool force = false)
|
||||
public void SetDefault(HumanoidCharacterProfile? profile, ICommonSession? session, IPrototypeManager protoManager, bool force = false)
|
||||
{
|
||||
if (profile == null)
|
||||
return;
|
||||
|
||||
if (force)
|
||||
SelectedLoadouts.Clear();
|
||||
|
||||
var collection = IoCManager.Instance!;
|
||||
var roleProto = protoManager.Index(Role);
|
||||
|
||||
for (var i = roleProto.Groups.Count - 1; i >= 0; i--)
|
||||
|
|
@ -205,14 +208,28 @@ public sealed partial class RoleLoadout : IEquatable<RoleLoadout>
|
|||
if (SelectedLoadouts.ContainsKey(group))
|
||||
continue;
|
||||
|
||||
SelectedLoadouts[group] = new List<Loadout>();
|
||||
var loadouts = new List<Loadout>();
|
||||
SelectedLoadouts[group] = loadouts;
|
||||
|
||||
if (groupProto.MinLimit > 0)
|
||||
{
|
||||
// Apply any loadouts we can.
|
||||
for (var j = 0; j < Math.Min(groupProto.MinLimit, groupProto.Loadouts.Count); j++)
|
||||
{
|
||||
AddLoadout(group, groupProto.Loadouts[j], protoManager);
|
||||
if (!protoManager.TryIndex(groupProto.Loadouts[j], out var loadoutProto))
|
||||
continue;
|
||||
|
||||
var defaultLoadout = new Loadout()
|
||||
{
|
||||
Prototype = loadoutProto.ID,
|
||||
};
|
||||
|
||||
// Not valid so don't default to it anyway.
|
||||
if (!IsValid(profile, session, defaultLoadout.Prototype, collection, out _))
|
||||
continue;
|
||||
|
||||
loadouts.Add(defaultLoadout);
|
||||
Apply(loadoutProto);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -221,7 +238,7 @@ public sealed partial class RoleLoadout : IEquatable<RoleLoadout>
|
|||
/// <summary>
|
||||
/// Returns whether a loadout is valid or not.
|
||||
/// </summary>
|
||||
public bool IsValid(HumanoidCharacterProfile profile, ICommonSession session, ProtoId<LoadoutPrototype> loadout, IDependencyCollection collection, [NotNullWhen(false)] out FormattedMessage? reason)
|
||||
public bool IsValid(HumanoidCharacterProfile profile, ICommonSession? session, ProtoId<LoadoutPrototype> loadout, IDependencyCollection collection, [NotNullWhen(false)] out FormattedMessage? reason)
|
||||
{
|
||||
reason = null;
|
||||
|
||||
|
|
@ -316,7 +333,25 @@ public sealed partial class RoleLoadout : IEquatable<RoleLoadout>
|
|||
{
|
||||
if (ReferenceEquals(null, other)) return false;
|
||||
if (ReferenceEquals(this, other)) return true;
|
||||
return Role.Equals(other.Role) && SelectedLoadouts.SequenceEqual(other.SelectedLoadouts) && Points == other.Points;
|
||||
|
||||
if (!Role.Equals(other.Role) ||
|
||||
SelectedLoadouts.Count != other.SelectedLoadouts.Count ||
|
||||
Points != other.Points)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// Tried using SequenceEqual but it stinky so.
|
||||
foreach (var (key, value) in SelectedLoadouts)
|
||||
{
|
||||
if (!other.SelectedLoadouts.TryGetValue(key, out var otherValue) ||
|
||||
!otherValue.SequenceEqual(value))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override bool Equals(object? obj)
|
||||
|
|
|
|||
|
|
@ -1,120 +1,4 @@
|
|||
Entries:
|
||||
- author: Simyon
|
||||
changes:
|
||||
- message: All implants are now unable to be implanted more than once.
|
||||
type: Tweak
|
||||
id: 6231
|
||||
time: '2024-03-26T00:16:19.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/26250
|
||||
- author: EmoGarbage404
|
||||
changes:
|
||||
- message: Ninjas no longer wipe all technologies when using their gloves on a research
|
||||
server.
|
||||
type: Tweak
|
||||
id: 6232
|
||||
time: '2024-03-26T00:52:27.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/26421
|
||||
- author: Dutch-VanDerLinde
|
||||
changes:
|
||||
- message: The chest rig is now available for purchase in the syndicate uplink.
|
||||
type: Add
|
||||
id: 6233
|
||||
time: '2024-03-26T04:05:35.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/26427
|
||||
- author: ElectroJr
|
||||
changes:
|
||||
- message: Fixed an atmos bug, which was (probably) causing atmospherics on the
|
||||
station to behave incorrectly.
|
||||
type: Fix
|
||||
id: 6234
|
||||
time: '2024-03-26T04:44:56.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/26441
|
||||
- author: nikthechampiongr
|
||||
changes:
|
||||
- message: Handcuffs will no longer try to uncuff themselves when they stop being
|
||||
dragged.
|
||||
type: Fix
|
||||
id: 6235
|
||||
time: '2024-03-26T19:15:08.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/26434
|
||||
- author: Nairodian
|
||||
changes:
|
||||
- message: Added disablers to every security officer locker.
|
||||
type: Add
|
||||
- message: Any way to obtain rubber bullets has been removed.
|
||||
type: Remove
|
||||
id: 6236
|
||||
time: '2024-03-27T15:11:13.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/26470
|
||||
- author: Ghagliiarghii
|
||||
changes:
|
||||
- message: Removed Donk Pocket Bounty from Cargo
|
||||
type: Remove
|
||||
- message: Removed Box of Hugs Bounty from Cargo
|
||||
type: Remove
|
||||
id: 6237
|
||||
time: '2024-03-27T21:50:35.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/26481
|
||||
- author: Vermidia
|
||||
changes:
|
||||
- message: Artifact node IDs are now only 3-digits long
|
||||
type: Tweak
|
||||
id: 6238
|
||||
time: '2024-03-27T23:26:26.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/26482
|
||||
- author: Jake Huxell
|
||||
changes:
|
||||
- message: Fixed late join menu scrolling to the top whenever a new player joins
|
||||
the round.
|
||||
type: Fix
|
||||
id: 6239
|
||||
time: '2024-03-28T01:43:55.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/26483
|
||||
- author: blueDev2
|
||||
changes:
|
||||
- message: Generalized bounties to allow selling them off-station
|
||||
type: Tweak
|
||||
id: 6240
|
||||
time: '2024-03-28T04:06:00.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/26469
|
||||
- author: Simyon
|
||||
changes:
|
||||
- message: The space dragon can now open doors by bumping into them!
|
||||
type: Tweak
|
||||
id: 6241
|
||||
time: '2024-03-28T05:41:57.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/26490
|
||||
- author: EmoGarbage404
|
||||
changes:
|
||||
- message: Various announcements now announce location on the map (near Medical,
|
||||
etc.) instead of simply displaying coordinates.
|
||||
type: Tweak
|
||||
id: 6242
|
||||
time: '2024-03-28T05:53:18.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/26437
|
||||
- author: Tayrtahn
|
||||
changes:
|
||||
- message: Arcade machines now advertise and make noise to bring in players.
|
||||
type: Add
|
||||
- message: Space Villain arcade machines have a new screen animation.
|
||||
type: Tweak
|
||||
id: 6243
|
||||
time: '2024-03-28T06:28:45.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/24200
|
||||
- author: EmoGarbage404
|
||||
changes:
|
||||
- message: The revenant essence alert now displays the exact amount of essence.
|
||||
type: Add
|
||||
id: 6244
|
||||
time: '2024-03-28T06:32:56.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/25452
|
||||
- author: deltanedas
|
||||
changes:
|
||||
- message: Voicemasks can now mimic speech verbs, like flutters or growls.
|
||||
type: Tweak
|
||||
id: 6245
|
||||
time: '2024-03-28T06:36:43.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/25768
|
||||
- author: EmoGarbage404
|
||||
changes:
|
||||
- message: Electrocution damage is no longer based on the power supplied and is
|
||||
|
|
@ -3846,3 +3730,131 @@
|
|||
id: 6730
|
||||
time: '2024-06-14T15:24:40.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/28985
|
||||
- author: Aquif
|
||||
changes:
|
||||
- message: '"Space Drugs" have been renamed to "Space Mirage"'
|
||||
type: Tweak
|
||||
- message: '"Stimulants" have been renamed to "Hyperzine"'
|
||||
type: Tweak
|
||||
id: 6731
|
||||
time: '2024-06-14T16:53:49.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/28989
|
||||
- author: PJB3005
|
||||
changes:
|
||||
- message: Added pride month.
|
||||
type: Add
|
||||
- message: Made the nuke gay.
|
||||
type: Add
|
||||
id: 6732
|
||||
time: '2024-06-14T17:22:01.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/28992
|
||||
- author: Aeshus
|
||||
changes:
|
||||
- message: Loadouts now display all requirements.
|
||||
type: Fix
|
||||
id: 6733
|
||||
time: '2024-06-14T20:32:39.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/28994
|
||||
- author: Vermidia
|
||||
changes:
|
||||
- message: allies callable by radio in the uplink now have unique icons
|
||||
type: Tweak
|
||||
id: 6734
|
||||
time: '2024-06-14T21:44:23.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/28954
|
||||
- author: K-Dynamic
|
||||
changes:
|
||||
- message: Added witch robes and witch hat to the AutoDrobe.
|
||||
type: Add
|
||||
id: 6735
|
||||
time: '2024-06-15T02:19:08.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/28965
|
||||
- author: Plykiya
|
||||
changes:
|
||||
- message: You can no longer insert duplicates of the same module into a cyborg.
|
||||
type: Tweak
|
||||
id: 6736
|
||||
time: '2024-06-15T02:58:30.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/28943
|
||||
- author: Vermidia
|
||||
changes:
|
||||
- message: Nukie planet now has an improved Donk co. microwave, which cooks twice
|
||||
as fast but is more likely to explode. It can't handle id cards without exploding.
|
||||
type: Add
|
||||
- message: Made microwave explosions destroy the machine board and spit out the
|
||||
machine parts.
|
||||
type: Tweak
|
||||
id: 6737
|
||||
time: '2024-06-15T03:00:00.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/28951
|
||||
- author: robertGN
|
||||
changes:
|
||||
- message: Using a welder on vending machines now correctly repairs the vending
|
||||
machine.
|
||||
type: Fix
|
||||
id: 6738
|
||||
time: '2024-06-15T03:13:53.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/28920
|
||||
- author: Brandon-Huu
|
||||
changes:
|
||||
- message: Removed the six Handheld GPS devices from the syndicate deathrattle implant
|
||||
box.
|
||||
type: Remove
|
||||
id: 6739
|
||||
time: '2024-06-15T03:23:42.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/28999
|
||||
- author: EmoGarbage404
|
||||
changes:
|
||||
- message: Revamped meteors. Meteors now crash through several walls before exploding.
|
||||
They can still come in a weaker "space dust" form where they don't break through
|
||||
structures.
|
||||
type: Add
|
||||
- message: Meteor and space dust events now occur on regular intervals during a
|
||||
round rather than being tied to station events. Expect to see more of them during
|
||||
a round.
|
||||
type: Add
|
||||
id: 6740
|
||||
time: '2024-06-15T03:38:43.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/28974
|
||||
- author: EmoGarbage404
|
||||
changes:
|
||||
- message: Added Moon Boots! This science research item allows you to move like
|
||||
you're in zero-gravity.
|
||||
type: Add
|
||||
id: 6741
|
||||
time: '2024-06-15T03:43:24.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/29009
|
||||
- author: EmoGarbage404
|
||||
changes:
|
||||
- message: Attempting to uncuff oneself while being pulled will now take twice as
|
||||
long.
|
||||
type: Tweak
|
||||
- message: Reduced cooldown after attempting to uncuff oneself back to previous
|
||||
values.
|
||||
type: Tweak
|
||||
id: 6742
|
||||
time: '2024-06-15T04:01:22.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/29008
|
||||
- author: EmoGarbage404
|
||||
changes:
|
||||
- message: Fixed bottles, when used inhand, not being drank from but instead repeatedly
|
||||
opening and closing.
|
||||
type: Fix
|
||||
id: 6743
|
||||
time: '2024-06-15T05:20:43.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/29010
|
||||
- author: Flareguy
|
||||
changes:
|
||||
- message: Replaced RelayStation with a more fair ruin.
|
||||
type: Remove
|
||||
id: 6744
|
||||
time: '2024-06-15T06:02:56.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/28971
|
||||
- author: metalgearsloth
|
||||
changes:
|
||||
- message: Fix the character profile sometimes thinking there's changes to save
|
||||
even if the loadouts haven't changed.
|
||||
type: Fix
|
||||
id: 6745
|
||||
time: '2024-06-15T06:52:49.0000000+00:00'
|
||||
url: https://github.com/space-wizards/space-station-14/pull/28737
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
borg-player-not-allowed = The brain doesn't fit!
|
||||
borg-player-not-allowed = The brain doesn't fit!
|
||||
borg-player-not-allowed-eject = The brain was expelled from the chassis!
|
||||
|
||||
borg-panel-not-open = The cyborg's panel isn't open...
|
||||
|
|
@ -7,6 +7,7 @@ borg-mind-added = {CAPITALIZE($name)} powered on!
|
|||
borg-mind-removed = {CAPITALIZE($name)} shut off!
|
||||
|
||||
borg-module-too-many = There's not enough room for another module...
|
||||
borg-module-duplicate = This module is already installed in this cyborg.
|
||||
borg-module-whitelist-deny = This module doesn't fit in this type of cyborg...
|
||||
|
||||
borg-construction-guide-string = The cyborg limbs and torso must be attached to the endoskeleton.
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
-create-3rd-person =
|
||||
-create-3rd-person =
|
||||
{ $chance ->
|
||||
[1] Creates
|
||||
*[other] create
|
||||
|
|
@ -345,11 +345,17 @@ reagent-effect-guidebook-reduce-rotting =
|
|||
*[other] regenerate
|
||||
} {NATURALFIXED($time, 3)} {MANY("second", $time)} of rotting
|
||||
|
||||
reagent-effect-guidebook-missing =
|
||||
reagent-effect-guidebook-area-reaction =
|
||||
{ $chance ->
|
||||
[1] Causes
|
||||
*[other] cause
|
||||
} an unknown effect as nobody has written this effect yet
|
||||
} a smoke or foam reaction for {NATURALFIXED($duration, 3)} {MANY("second", $duration)}
|
||||
|
||||
reagent-effect-guidebook-add-to-solution-reaction =
|
||||
{ $chance ->
|
||||
[1] Causes
|
||||
*[other] cause
|
||||
} chemicals applied to an object to be added to its internal solution container
|
||||
|
||||
reagent-effect-guidebook-plant-attribute =
|
||||
{ $chance ->
|
||||
|
|
|
|||
|
|
@ -69,6 +69,7 @@ holiday-name-festive-season = Festive Season
|
|||
holiday-name-boxing-day = Boxing Day
|
||||
holiday-name-friday-thirteenth = Friday the 13th
|
||||
holiday-name-national-coming-out-day = National Coming Out Day
|
||||
holiday-name-pride-month = Pride Month
|
||||
|
||||
## Custom congrats
|
||||
|
||||
|
|
|
|||
|
|
@ -4,11 +4,11 @@ reagent-desc-desoxyephedrine = A more effective ephedrine, with more active down
|
|||
reagent-name-ephedrine = ephedrine
|
||||
reagent-desc-ephedrine = A caffeinated adrenaline stimulator chemical that makes you faster and harder to knock down. Also helps combat narcolepsy at dosages over thirty, at the cost of severe nerval stress.
|
||||
|
||||
reagent-name-stimulants = stimulants
|
||||
reagent-name-stimulants = hyperzine
|
||||
reagent-desc-stimulants = A chemical cocktail developed by Donk Co. that allows agents to recover from stuns faster, move more quickly, and grants a small heal while close to critical condition. Due to the complex nature of the chemical, it is much harder for the body to purge naturally.
|
||||
|
||||
reagent-name-experimental-stimulants = experimental stimulants
|
||||
reagent-desc-experimental-stimulants = A prototype version of the stimulant chemical mixture. Usage grants virtual immunity to stun weaponry, rapid tissue regeneration, extreme running speed by reducing lactic acid buildup, and a general feeling of euphoria. Side effects may include extreme levels of anticoagulation, tunnel vision, extreme toxin buildup in the bloodstream, and rapid liver death. Do not give to animals.
|
||||
reagent-desc-experimental-stimulants = A prototype version of hyperzine. Usage grants virtual immunity to stun weaponry, rapid tissue regeneration, extreme running speed by reducing lactic acid buildup, and a general feeling of euphoria. Side effects may include extreme levels of anticoagulation, tunnel vision, extreme toxin buildup in the bloodstream, and rapid liver death. Do not give to animals.
|
||||
|
||||
reagent-name-thc = THC
|
||||
reagent-desc-thc = The main psychoactive compound in cannabis.
|
||||
|
|
@ -22,7 +22,7 @@ reagent-desc-nicotine = Dangerous and highly addictive, but that's what the prop
|
|||
reagent-name-impedrezene = impedrezene
|
||||
reagent-desc-impedrezene = A narcotic that impedes one's ability by slowing down the higher brain cell functions.
|
||||
|
||||
reagent-name-space-drugs = space drugs
|
||||
reagent-name-space-drugs = space mirage
|
||||
reagent-desc-space-drugs = An illegal compound which induces a number of effects such as loss of balance and visual artefacts.
|
||||
|
||||
reagent-name-nocturine = nocturine
|
||||
|
|
|
|||
|
|
@ -1,2 +1,5 @@
|
|||
station-event-meteor-swarm-start-announcement = Meteors are on a collision course with the station. Brace for impact.
|
||||
station-event-meteor-swarm-start-announcement = Meteors have been detected on collision course with the station.
|
||||
station-event-meteor-swarm-end-announcement = The meteor swarm has passed. Please return to your stations.
|
||||
|
||||
station-event-space-dust-start-announcement = The station is passing through a debris cloud, expect minor damage to external fittings and fixtures.
|
||||
station-event-meteor-urist-start-announcement = The station is colliding with an unidentified swarm of debris. Please stay calm and do not listen to them.
|
||||
|
|
|
|||
|
|
@ -355,11 +355,11 @@ uplink-combat-medipen-desc = A single-use medipen containing chemicals that rege
|
|||
uplink-nocturine-chemistry-bottle-name = Nocturine Bottle
|
||||
uplink-nocturine-chemistry-bottle-desc = A chemical that makes it very hard for your target to stand up.
|
||||
|
||||
uplink-stimpack-name = Stimpack
|
||||
uplink-stimpack-name = Hyperzine Injector
|
||||
uplink-stimpack-desc = The legendary chemical produced by Donk Co. for the Syndicate. Injecting yourself with this will increase your run speed and let you recover from stuns faster for 30 seconds.
|
||||
|
||||
uplink-stimkit-name = Stimkit
|
||||
uplink-stimkit-desc = A medkit containing 6 stimulant microinjectors, which each inject you with enough stimulants to last for 15 seconds.
|
||||
uplink-stimkit-name = Hyperzine Injector Kit
|
||||
uplink-stimkit-desc = A medkit containing 6 hyperzine microinjectors, which each inject you with enough hyperzine to last for 15 seconds.
|
||||
|
||||
uplink-syndicate-segway-crate-name = Syndicate Segway
|
||||
uplink-syndicate-segway-crate-desc = Be an enemy of the corporation, in style!
|
||||
|
|
|
|||
|
|
@ -10994,7 +10994,7 @@ entities:
|
|||
- type: Transform
|
||||
pos: 18.918644,6.663283
|
||||
parent: 104
|
||||
- proto: KitchenMicrowave
|
||||
- proto: SyndicateMicrowave
|
||||
entities:
|
||||
- uid: 10
|
||||
components:
|
||||
|
|
|
|||
217
Resources/Maps/Ruins/chunked_tcomms.yml
Normal file
|
|
@ -0,0 +1,217 @@
|
|||
meta:
|
||||
format: 6
|
||||
postmapinit: false
|
||||
tilemap:
|
||||
0: Space
|
||||
128: Lattice
|
||||
129: Plating
|
||||
1: PlatingDamaged
|
||||
entities:
|
||||
- proto: ""
|
||||
entities:
|
||||
- uid: 1
|
||||
components:
|
||||
- type: MetaData
|
||||
name: grid
|
||||
- type: Transform
|
||||
pos: -0.4375,0.984375
|
||||
parent: invalid
|
||||
- type: MapGrid
|
||||
chunks:
|
||||
0,0:
|
||||
ind: 0,0
|
||||
tiles: gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
version: 6
|
||||
0,-1:
|
||||
ind: 0,-1
|
||||
tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAQAAAAABAQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAQAAAAABAQAAAAACAQAAAAAAAQAAAAACgAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAAQAAAAAAgQAAAAAAAQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAABgAAAAAAAgAAAAAAAgAAAAAAAAQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAQAAAAACgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAABAQAAAAAAgAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
version: 6
|
||||
-1,-1:
|
||||
ind: -1,-1
|
||||
tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAA
|
||||
version: 6
|
||||
- type: Broadphase
|
||||
- type: Physics
|
||||
bodyStatus: InAir
|
||||
angularDamping: 0.05
|
||||
linearDamping: 0.05
|
||||
fixedRotation: False
|
||||
bodyType: Dynamic
|
||||
- type: Fixtures
|
||||
fixtures: {}
|
||||
- type: OccluderTree
|
||||
- type: SpreaderGrid
|
||||
- type: Shuttle
|
||||
- type: GridPathfinding
|
||||
- type: Gravity
|
||||
gravityShakeSound: !type:SoundPathSpecifier
|
||||
path: /Audio/Effects/alert.ogg
|
||||
- type: DecalGrid
|
||||
chunkCollection:
|
||||
version: 2
|
||||
nodes:
|
||||
- node:
|
||||
cleanable: True
|
||||
color: '#FFFFFFFF'
|
||||
id: Remains
|
||||
decals:
|
||||
0: 7,-2
|
||||
- type: GridAtmosphere
|
||||
version: 2
|
||||
data:
|
||||
chunkSize: 4
|
||||
- type: GasTileOverlay
|
||||
- type: RadiationGridResistance
|
||||
- proto: ClothingHeadsetGrey
|
||||
entities:
|
||||
- uid: 27
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 4.4739795,-2.5042162
|
||||
parent: 1
|
||||
- proto: LootSpawnerEncryptionKey
|
||||
entities:
|
||||
- uid: 21
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 6.5,-4.5
|
||||
parent: 1
|
||||
- proto: LootSpawnerIndustrial
|
||||
entities:
|
||||
- uid: 25
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 8.5,2.5
|
||||
parent: 1
|
||||
- proto: MachineFrame
|
||||
entities:
|
||||
- uid: 19
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 8.5,-3.5
|
||||
parent: 1
|
||||
- uid: 22
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 8.5,-4.5
|
||||
parent: 1
|
||||
- proto: MachineFrameDestroyed
|
||||
entities:
|
||||
- uid: 20
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 6.5,-3.5
|
||||
parent: 1
|
||||
- proto: PosterLegitHereForYourSafety
|
||||
entities:
|
||||
- uid: 24
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 7.5,-0.5
|
||||
parent: 1
|
||||
- proto: ReinforcedGirder
|
||||
entities:
|
||||
- uid: 9
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 1.5,-0.5
|
||||
parent: 1
|
||||
- uid: 10
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 2.5,-0.5
|
||||
parent: 1
|
||||
- uid: 17
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 10.5,-6.5
|
||||
parent: 1
|
||||
- proto: SheetPlasteel1
|
||||
entities:
|
||||
- uid: 26
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 2.5,-1.5
|
||||
parent: 1
|
||||
- proto: TelecomServer
|
||||
entities:
|
||||
- uid: 23
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 8.5,-2.5
|
||||
parent: 1
|
||||
- proto: UnfinishedMachineFrame
|
||||
entities:
|
||||
- uid: 18
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 6.5,-2.5
|
||||
parent: 1
|
||||
- proto: WallReinforced
|
||||
entities:
|
||||
- uid: 2
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 4.5,-0.5
|
||||
parent: 1
|
||||
- uid: 3
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 5.5,-0.5
|
||||
parent: 1
|
||||
- uid: 4
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 6.5,-0.5
|
||||
parent: 1
|
||||
- uid: 5
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 7.5,-0.5
|
||||
parent: 1
|
||||
- uid: 6
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 8.5,-0.5
|
||||
parent: 1
|
||||
- uid: 7
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 10.5,-0.5
|
||||
parent: 1
|
||||
- uid: 8
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 9.5,-0.5
|
||||
parent: 1
|
||||
- uid: 11
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 3.5,-0.5
|
||||
parent: 1
|
||||
- uid: 12
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 10.5,-1.5
|
||||
parent: 1
|
||||
- uid: 13
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 10.5,-2.5
|
||||
parent: 1
|
||||
- uid: 14
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 10.5,-4.5
|
||||
parent: 1
|
||||
- uid: 15
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 10.5,-5.5
|
||||
parent: 1
|
||||
- uid: 16
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 10.5,-3.5
|
||||
parent: 1
|
||||
...
|
||||
13115
Resources/Maps/Ruins/empty_flagship.yml
Normal file
|
|
@ -1,760 +0,0 @@
|
|||
meta:
|
||||
format: 6
|
||||
postmapinit: false
|
||||
tilemap:
|
||||
0: Space
|
||||
29: FloorDark
|
||||
54: FloorGreenCircuit
|
||||
120: Lattice
|
||||
121: Plating
|
||||
entities:
|
||||
- proto: ""
|
||||
entities:
|
||||
- uid: 2
|
||||
components:
|
||||
- type: MetaData
|
||||
- type: Transform
|
||||
parent: invalid
|
||||
- type: MapGrid
|
||||
chunks:
|
||||
-1,-1:
|
||||
ind: -1,-1
|
||||
tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAHQAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAHQAAAAAANgAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAHQAAAAAANgAAAAAAHQAAAAAA
|
||||
version: 6
|
||||
-1,0:
|
||||
ind: -1,0
|
||||
tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAHQAAAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
version: 6
|
||||
0,0:
|
||||
ind: 0,0
|
||||
tiles: HQAAAAAAHQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAHQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
version: 6
|
||||
0,-1:
|
||||
ind: 0,-1
|
||||
tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAHQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANgAAAAAAHQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANgAAAAAAHQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
version: 6
|
||||
- type: Broadphase
|
||||
- type: Physics
|
||||
bodyStatus: InAir
|
||||
angularDamping: 0.05
|
||||
linearDamping: 0.05
|
||||
fixedRotation: False
|
||||
bodyType: Dynamic
|
||||
- type: Fixtures
|
||||
fixtures: {}
|
||||
- type: BecomesStation
|
||||
id: Empty
|
||||
- type: OccluderTree
|
||||
- type: Shuttle
|
||||
- type: GridPathfinding
|
||||
- type: Gravity
|
||||
gravityShakeSound: !type:SoundPathSpecifier
|
||||
path: /Audio/Effects/alert.ogg
|
||||
- type: DecalGrid
|
||||
chunkCollection:
|
||||
version: 2
|
||||
nodes:
|
||||
- node:
|
||||
color: '#FFFFFFFF'
|
||||
id: WarnLineN
|
||||
decals:
|
||||
0: 0,0
|
||||
1: -2,0
|
||||
- node:
|
||||
color: '#FFFFFFFF'
|
||||
id: WarnLineW
|
||||
decals:
|
||||
2: -2,-3
|
||||
3: 0,-3
|
||||
- type: SpreaderGrid
|
||||
- type: GridAtmosphere
|
||||
version: 2
|
||||
data:
|
||||
tiles:
|
||||
-1,-1:
|
||||
0: 65535
|
||||
-1,0:
|
||||
0: 65535
|
||||
0,0:
|
||||
0: 65535
|
||||
0,-1:
|
||||
0: 65527
|
||||
-2,-1:
|
||||
0: 34944
|
||||
-1,-2:
|
||||
0: 65514
|
||||
-1,-3:
|
||||
0: 32768
|
||||
-2,0:
|
||||
0: 34952
|
||||
-2,1:
|
||||
0: 8
|
||||
-1,1:
|
||||
0: 18090
|
||||
-1,2:
|
||||
0: 34956
|
||||
0,1:
|
||||
0: 4906
|
||||
0,2:
|
||||
0: 1
|
||||
0,-2:
|
||||
0: 30514
|
||||
uniqueMixes:
|
||||
- volume: 2500
|
||||
temperature: 293.15
|
||||
moles:
|
||||
- 21.824879
|
||||
- 82.10312
|
||||
- 0
|
||||
- 0
|
||||
- 0
|
||||
- 0
|
||||
- 0
|
||||
- 0
|
||||
- 0
|
||||
- 0
|
||||
- 0
|
||||
- 0
|
||||
chunkSize: 4
|
||||
- type: GasTileOverlay
|
||||
- type: RadiationGridResistance
|
||||
- proto: AirlockExternalGlassLocked
|
||||
entities:
|
||||
- uid: 35
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -0.5,-6.5
|
||||
parent: 2
|
||||
- type: DeviceLinkSink
|
||||
links:
|
||||
- 34
|
||||
- type: DeviceLinkSource
|
||||
linkedPorts:
|
||||
34:
|
||||
- DoorStatus: DoorBolt
|
||||
- proto: AirlockExternalLocked
|
||||
entities:
|
||||
- uid: 34
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -0.5,-4.5
|
||||
parent: 2
|
||||
- type: DeviceLinkSink
|
||||
links:
|
||||
- 35
|
||||
- type: DeviceLinkSource
|
||||
linkedPorts:
|
||||
35:
|
||||
- DoorStatus: DoorBolt
|
||||
- proto: APCBasic
|
||||
entities:
|
||||
- uid: 64
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 2.5,1.5
|
||||
parent: 2
|
||||
- proto: BaseComputer
|
||||
entities:
|
||||
- uid: 89
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -0.5,2.5
|
||||
parent: 2
|
||||
- proto: CableApcExtension
|
||||
entities:
|
||||
- uid: 65
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 2.5,1.5
|
||||
parent: 2
|
||||
- uid: 66
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 2.5,0.5
|
||||
parent: 2
|
||||
- uid: 67
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 1.5,0.5
|
||||
parent: 2
|
||||
- uid: 68
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 0.5,0.5
|
||||
parent: 2
|
||||
- uid: 69
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -0.5,0.5
|
||||
parent: 2
|
||||
- uid: 70
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -0.5,-0.5
|
||||
parent: 2
|
||||
- uid: 71
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -0.5,-1.5
|
||||
parent: 2
|
||||
- uid: 72
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -0.5,-2.5
|
||||
parent: 2
|
||||
- uid: 73
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -0.5,-3.5
|
||||
parent: 2
|
||||
- uid: 74
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -0.5,-4.5
|
||||
parent: 2
|
||||
- uid: 75
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -0.5,-5.5
|
||||
parent: 2
|
||||
- uid: 76
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -1.5,0.5
|
||||
parent: 2
|
||||
- proto: CableHV
|
||||
entities:
|
||||
- uid: 46
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -3.5,-1.5
|
||||
parent: 2
|
||||
- uid: 47
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -3.5,-0.5
|
||||
parent: 2
|
||||
- uid: 48
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -3.5,0.5
|
||||
parent: 2
|
||||
- uid: 51
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -2.5,0.5
|
||||
parent: 2
|
||||
- uid: 52
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -1.5,0.5
|
||||
parent: 2
|
||||
- uid: 53
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -0.5,0.5
|
||||
parent: 2
|
||||
- uid: 54
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 0.5,0.5
|
||||
parent: 2
|
||||
- uid: 55
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 1.5,0.5
|
||||
parent: 2
|
||||
- uid: 56
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 2.5,0.5
|
||||
parent: 2
|
||||
- uid: 58
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 2.5,-0.5
|
||||
parent: 2
|
||||
- uid: 59
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 2.5,-1.5
|
||||
parent: 2
|
||||
- proto: CableMV
|
||||
entities:
|
||||
- uid: 60
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 2.5,-1.5
|
||||
parent: 2
|
||||
- uid: 61
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 2.5,-0.5
|
||||
parent: 2
|
||||
- uid: 62
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 2.5,0.5
|
||||
parent: 2
|
||||
- uid: 63
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 2.5,1.5
|
||||
parent: 2
|
||||
- proto: CableTerminal
|
||||
entities:
|
||||
- uid: 49
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 3.141592653589793 rad
|
||||
pos: -3.5,-0.5
|
||||
parent: 2
|
||||
- proto: Catwalk
|
||||
entities:
|
||||
- uid: 77
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 2.5,-0.5
|
||||
parent: 2
|
||||
- uid: 78
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 2.5,0.5
|
||||
parent: 2
|
||||
- proto: ChairOfficeDark
|
||||
entities:
|
||||
- uid: 95
|
||||
components:
|
||||
- type: Transform
|
||||
rot: -1.5707963267948966 rad
|
||||
pos: -0.5,1.5
|
||||
parent: 2
|
||||
- proto: EncryptionKeyCargo
|
||||
entities:
|
||||
- uid: 82
|
||||
components:
|
||||
- type: Transform
|
||||
parent: 81
|
||||
- type: Physics
|
||||
canCollide: False
|
||||
- proto: EncryptionKeyCommand
|
||||
entities:
|
||||
- uid: 86
|
||||
components:
|
||||
- type: Transform
|
||||
parent: 85
|
||||
- type: Physics
|
||||
canCollide: False
|
||||
- proto: EncryptionKeyEngineering
|
||||
entities:
|
||||
- uid: 80
|
||||
components:
|
||||
- type: Transform
|
||||
parent: 79
|
||||
- type: Physics
|
||||
canCollide: False
|
||||
- proto: EncryptionKeySecurity
|
||||
entities:
|
||||
- uid: 84
|
||||
components:
|
||||
- type: Transform
|
||||
parent: 83
|
||||
- type: Physics
|
||||
canCollide: False
|
||||
- proto: FaxMachineBase
|
||||
entities:
|
||||
- uid: 99
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -1.5,2.5
|
||||
parent: 2
|
||||
- type: FaxMachine
|
||||
name: Relay Station
|
||||
- proto: GeneratorBasic
|
||||
entities:
|
||||
- uid: 45
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -3.5,-1.5
|
||||
parent: 2
|
||||
- proto: Grille
|
||||
entities:
|
||||
- uid: 39
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 0.5,-6.5
|
||||
parent: 2
|
||||
- uid: 40
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 0.5,-5.5
|
||||
parent: 2
|
||||
- uid: 41
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -1.5,-6.5
|
||||
parent: 2
|
||||
- uid: 42
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -1.5,-5.5
|
||||
parent: 2
|
||||
- proto: PosterLegitNanotrasenLogo
|
||||
entities:
|
||||
- uid: 96
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -2.5,2.5
|
||||
parent: 2
|
||||
- proto: PottedPlantBioluminscent
|
||||
entities:
|
||||
- uid: 87
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -2.5,0.5
|
||||
parent: 2
|
||||
- proto: PowerDrill
|
||||
entities:
|
||||
- uid: 100
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 0.53125,2.5
|
||||
parent: 2
|
||||
- proto: Poweredlight
|
||||
entities:
|
||||
- uid: 92
|
||||
components:
|
||||
- type: Transform
|
||||
rot: -1.5707963267948966 rad
|
||||
pos: 2.5,-0.5
|
||||
parent: 2
|
||||
- uid: 97
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 1.5707963267948966 rad
|
||||
pos: -3.5,-0.5
|
||||
parent: 2
|
||||
- proto: ReinforcedWindow
|
||||
entities:
|
||||
- uid: 29
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -1.5,-5.5
|
||||
parent: 2
|
||||
- uid: 30
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -1.5,-6.5
|
||||
parent: 2
|
||||
- uid: 36
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 0.5,-6.5
|
||||
parent: 2
|
||||
- uid: 37
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 0.5,-5.5
|
||||
parent: 2
|
||||
- proto: SalvageLootSpawner
|
||||
entities:
|
||||
- uid: 98
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 1.5,1.5
|
||||
parent: 2
|
||||
- proto: SignSpace
|
||||
entities:
|
||||
- uid: 43
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -1.5,-4.5
|
||||
parent: 2
|
||||
- proto: SignTelecomms
|
||||
entities:
|
||||
- uid: 44
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 0.5,-4.5
|
||||
parent: 2
|
||||
- proto: SMESBasic
|
||||
entities:
|
||||
- uid: 50
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -3.5,0.5
|
||||
parent: 2
|
||||
- proto: SubstationBasic
|
||||
entities:
|
||||
- uid: 57
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 2.5,-1.5
|
||||
parent: 2
|
||||
- proto: TableReinforced
|
||||
entities:
|
||||
- uid: 88
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -1.5,2.5
|
||||
parent: 2
|
||||
- uid: 90
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 0.5,2.5
|
||||
parent: 2
|
||||
- uid: 91
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 0.5,2.5
|
||||
parent: 2
|
||||
- uid: 93
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -2.5,1.5
|
||||
parent: 2
|
||||
- uid: 94
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 1.5,1.5
|
||||
parent: 2
|
||||
- proto: TelecomServer
|
||||
entities:
|
||||
- uid: 79
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -1.5,-1.5
|
||||
parent: 2
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
key_slots: !type:Container
|
||||
showEnts: False
|
||||
occludes: True
|
||||
ents:
|
||||
- 80
|
||||
machine_board: !type:Container
|
||||
showEnts: False
|
||||
occludes: True
|
||||
ents: []
|
||||
machine_parts: !type:Container
|
||||
showEnts: False
|
||||
occludes: True
|
||||
ents: []
|
||||
- uid: 81
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -1.5,-0.5
|
||||
parent: 2
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
key_slots: !type:Container
|
||||
showEnts: False
|
||||
occludes: True
|
||||
ents:
|
||||
- 82
|
||||
machine_board: !type:Container
|
||||
showEnts: False
|
||||
occludes: True
|
||||
ents: []
|
||||
machine_parts: !type:Container
|
||||
showEnts: False
|
||||
occludes: True
|
||||
ents: []
|
||||
- uid: 83
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 0.5,-1.5
|
||||
parent: 2
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
key_slots: !type:Container
|
||||
showEnts: False
|
||||
occludes: True
|
||||
ents:
|
||||
- 84
|
||||
machine_board: !type:Container
|
||||
showEnts: False
|
||||
occludes: True
|
||||
ents: []
|
||||
machine_parts: !type:Container
|
||||
showEnts: False
|
||||
occludes: True
|
||||
ents: []
|
||||
- uid: 85
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 0.5,-0.5
|
||||
parent: 2
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
key_slots: !type:Container
|
||||
showEnts: False
|
||||
occludes: True
|
||||
ents:
|
||||
- 86
|
||||
machine_board: !type:Container
|
||||
showEnts: False
|
||||
occludes: True
|
||||
ents: []
|
||||
machine_parts: !type:Container
|
||||
showEnts: False
|
||||
occludes: True
|
||||
ents: []
|
||||
- proto: WallRiveted
|
||||
entities:
|
||||
- uid: 1
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 2.5,-3.5
|
||||
parent: 2
|
||||
- uid: 3
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 2.5,-2.5
|
||||
parent: 2
|
||||
- uid: 4
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 3.5,-2.5
|
||||
parent: 2
|
||||
- uid: 5
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 3.5,-1.5
|
||||
parent: 2
|
||||
- uid: 6
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 3.5,-0.5
|
||||
parent: 2
|
||||
- uid: 7
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 3.5,0.5
|
||||
parent: 2
|
||||
- uid: 8
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 3.5,1.5
|
||||
parent: 2
|
||||
- uid: 9
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 2.5,1.5
|
||||
parent: 2
|
||||
- uid: 10
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 2.5,2.5
|
||||
parent: 2
|
||||
- uid: 11
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 1.5,2.5
|
||||
parent: 2
|
||||
- uid: 12
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 1.5,3.5
|
||||
parent: 2
|
||||
- uid: 13
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 0.5,3.5
|
||||
parent: 2
|
||||
- uid: 14
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -0.5,3.5
|
||||
parent: 2
|
||||
- uid: 15
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -1.5,3.5
|
||||
parent: 2
|
||||
- uid: 16
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -2.5,3.5
|
||||
parent: 2
|
||||
- uid: 17
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -2.5,2.5
|
||||
parent: 2
|
||||
- uid: 18
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -3.5,2.5
|
||||
parent: 2
|
||||
- uid: 19
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -3.5,1.5
|
||||
parent: 2
|
||||
- uid: 20
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -4.5,1.5
|
||||
parent: 2
|
||||
- uid: 21
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -4.5,0.5
|
||||
parent: 2
|
||||
- uid: 22
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -4.5,-0.5
|
||||
parent: 2
|
||||
- uid: 23
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -4.5,-1.5
|
||||
parent: 2
|
||||
- uid: 24
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -4.5,-2.5
|
||||
parent: 2
|
||||
- uid: 25
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -3.5,-2.5
|
||||
parent: 2
|
||||
- uid: 26
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -3.5,-3.5
|
||||
parent: 2
|
||||
- uid: 27
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -2.5,-3.5
|
||||
parent: 2
|
||||
- uid: 28
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -2.5,-4.5
|
||||
parent: 2
|
||||
- uid: 31
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -1.5,-4.5
|
||||
parent: 2
|
||||
- uid: 32
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 1.5,-4.5
|
||||
parent: 2
|
||||
- uid: 33
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 1.5,-3.5
|
||||
parent: 2
|
||||
- uid: 38
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 0.5,-4.5
|
||||
parent: 2
|
||||
...
|
||||
|
|
@ -3607,7 +3607,7 @@ entities:
|
|||
- type: Transform
|
||||
pos: 3.5,-3.5
|
||||
parent: 1
|
||||
- proto: KitchenMicrowave
|
||||
- proto: SyndicateMicrowave
|
||||
entities:
|
||||
- uid: 497
|
||||
components:
|
||||
|
|
|
|||
|
|
@ -772,7 +772,8 @@ entities:
|
|||
6,6:
|
||||
2: 35049
|
||||
7,5:
|
||||
0: 36063
|
||||
0: 35999
|
||||
3: 64
|
||||
2: 4096
|
||||
7,6:
|
||||
2: 53196
|
||||
|
|
@ -783,7 +784,7 @@ entities:
|
|||
2: 57344
|
||||
8,5:
|
||||
0: 272
|
||||
3: 17472
|
||||
4: 17472
|
||||
8,6:
|
||||
2: 65345
|
||||
8,7:
|
||||
|
|
@ -824,10 +825,10 @@ entities:
|
|||
0: 53759
|
||||
11,2:
|
||||
0: 4319
|
||||
4: 49152
|
||||
5: 49152
|
||||
11,3:
|
||||
0: 61457
|
||||
4: 204
|
||||
5: 204
|
||||
11,-1:
|
||||
0: 30583
|
||||
11,4:
|
||||
|
|
@ -839,9 +840,9 @@ entities:
|
|||
0: 28791
|
||||
12,2:
|
||||
0: 119
|
||||
4: 28672
|
||||
5: 28672
|
||||
12,3:
|
||||
4: 119
|
||||
5: 119
|
||||
0: 61440
|
||||
12,-1:
|
||||
0: 29311
|
||||
|
|
@ -1259,17 +1260,17 @@ entities:
|
|||
8,8:
|
||||
2: 65534
|
||||
9,5:
|
||||
5: 4368
|
||||
4: 17472
|
||||
6: 4368
|
||||
5: 17472
|
||||
9,6:
|
||||
2: 7936
|
||||
10,5:
|
||||
4: 4368
|
||||
6: 17472
|
||||
5: 4368
|
||||
7: 17472
|
||||
10,6:
|
||||
2: 3840
|
||||
11,5:
|
||||
4: 21840
|
||||
5: 21840
|
||||
11,6:
|
||||
2: 3856
|
||||
12,5:
|
||||
|
|
@ -1425,6 +1426,21 @@ entities:
|
|||
- 0
|
||||
- 0
|
||||
- 0
|
||||
- volume: 2500
|
||||
temperature: 293.15
|
||||
moles:
|
||||
- 23.57087
|
||||
- 88.67137
|
||||
- 0
|
||||
- 0
|
||||
- 0
|
||||
- 0
|
||||
- 0
|
||||
- 0
|
||||
- 0
|
||||
- 0
|
||||
- 0
|
||||
- 0
|
||||
- volume: 2500
|
||||
temperature: 293.15
|
||||
moles:
|
||||
|
|
@ -14253,6 +14269,11 @@ entities:
|
|||
- type: Transform
|
||||
pos: 33.5,-17.5
|
||||
parent: 31
|
||||
- uid: 9867
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 48.5,19.5
|
||||
parent: 31
|
||||
- uid: 9927
|
||||
components:
|
||||
- type: Transform
|
||||
|
|
@ -15333,6 +15354,11 @@ entities:
|
|||
- type: Transform
|
||||
pos: -27.5,-18.5
|
||||
parent: 31
|
||||
- uid: 11305
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 48.5,20.5
|
||||
parent: 31
|
||||
- uid: 11328
|
||||
components:
|
||||
- type: Transform
|
||||
|
|
@ -15368,6 +15394,11 @@ entities:
|
|||
- type: Transform
|
||||
pos: 17.5,11.5
|
||||
parent: 31
|
||||
- uid: 11384
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 48.5,21.5
|
||||
parent: 31
|
||||
- uid: 11415
|
||||
components:
|
||||
- type: Transform
|
||||
|
|
@ -15433,6 +15464,66 @@ entities:
|
|||
- type: Transform
|
||||
pos: -25.5,-3.5
|
||||
parent: 31
|
||||
- uid: 11454
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 48.5,22.5
|
||||
parent: 31
|
||||
- uid: 11455
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 48.5,23.5
|
||||
parent: 31
|
||||
- uid: 11456
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 48.5,24.5
|
||||
parent: 31
|
||||
- uid: 11457
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 49.5,24.5
|
||||
parent: 31
|
||||
- uid: 11458
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 50.5,24.5
|
||||
parent: 31
|
||||
- uid: 11459
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 51.5,24.5
|
||||
parent: 31
|
||||
- uid: 11460
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 52.5,24.5
|
||||
parent: 31
|
||||
- uid: 11461
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 52.5,23.5
|
||||
parent: 31
|
||||
- uid: 11462
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 52.5,22.5
|
||||
parent: 31
|
||||
- uid: 11463
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 52.5,21.5
|
||||
parent: 31
|
||||
- uid: 11464
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 52.5,20.5
|
||||
parent: 31
|
||||
- uid: 11465
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 52.5,19.5
|
||||
parent: 31
|
||||
- proto: CableApcStack
|
||||
entities:
|
||||
- uid: 94
|
||||
|
|
@ -28356,46 +28447,6 @@ entities:
|
|||
- type: Transform
|
||||
pos: 16.5,-29.5
|
||||
parent: 31
|
||||
- proto: CrateEngineeringSecure
|
||||
entities:
|
||||
- uid: 11305
|
||||
components:
|
||||
- type: MetaData
|
||||
desc: Stores logic gates that control the salvage-atmos airlocks.
|
||||
name: logic gate crate
|
||||
- type: Transform
|
||||
pos: 30.5,21.5
|
||||
parent: 31
|
||||
- type: EntityStorage
|
||||
air:
|
||||
volume: 200
|
||||
immutable: False
|
||||
temperature: 293.1496
|
||||
moles:
|
||||
- 1.7459903
|
||||
- 6.568249
|
||||
- 0
|
||||
- 0
|
||||
- 0
|
||||
- 0
|
||||
- 0
|
||||
- 0
|
||||
- 0
|
||||
- 0
|
||||
- 0
|
||||
- 0
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
entity_storage: !type:Container
|
||||
showEnts: False
|
||||
occludes: True
|
||||
ents:
|
||||
- 11306
|
||||
- 11307
|
||||
paper_label: !type:ContainerSlot
|
||||
showEnts: False
|
||||
occludes: True
|
||||
ent: null
|
||||
- proto: CrateEngineeringSingularityContainment
|
||||
entities:
|
||||
- uid: 6437
|
||||
|
|
@ -49183,7 +49234,9 @@ entities:
|
|||
- uid: 11306
|
||||
components:
|
||||
- type: Transform
|
||||
parent: 11305
|
||||
anchored: True
|
||||
pos: 31.5,20.5
|
||||
parent: 31
|
||||
- type: DeviceLinkSink
|
||||
links:
|
||||
- 9067
|
||||
|
|
@ -49196,11 +49249,13 @@ entities:
|
|||
- Output: DoorBolt
|
||||
- type: Physics
|
||||
canCollide: False
|
||||
- type: InsideEntityStorage
|
||||
bodyType: Static
|
||||
- uid: 11307
|
||||
components:
|
||||
- type: Transform
|
||||
parent: 11305
|
||||
anchored: True
|
||||
pos: 31.5,21.5
|
||||
parent: 31
|
||||
- type: DeviceLinkSink
|
||||
links:
|
||||
- 6522
|
||||
|
|
@ -49213,7 +49268,7 @@ entities:
|
|||
- Output: DoorBolt
|
||||
- type: Physics
|
||||
canCollide: False
|
||||
- type: InsideEntityStorage
|
||||
bodyType: Static
|
||||
- proto: MachineAnomalyGenerator
|
||||
entities:
|
||||
- uid: 6098
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@
|
|||
sprite: Objects/Specific/Service/vending_machine_restock.rsi
|
||||
state: base
|
||||
product: CrateVendingMachineRestockAutoDrobeFilled
|
||||
cost: 1200
|
||||
cost: 1300
|
||||
category: cargoproduct-category-name-service
|
||||
group: market
|
||||
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@
|
|||
name: deathrattle implant box
|
||||
parent: BoxCardboard
|
||||
id: BoxDeathRattleImplants
|
||||
description: Six deathrattle implants and handheld GPS devices for the whole squad.
|
||||
description: Six deathrattle implants for the whole squad.
|
||||
components:
|
||||
- type: Sprite
|
||||
layers:
|
||||
|
|
@ -67,5 +67,3 @@
|
|||
contents:
|
||||
- id: DeathRattleImplanter
|
||||
amount: 6
|
||||
- id: HandheldGPSBasic
|
||||
amount: 6
|
||||
|
|
|
|||
|
|
@ -29,6 +29,8 @@
|
|||
ClothingHeadHatShrineMaidenWig: 2
|
||||
ClothingOuterSuitShrineMaiden: 2
|
||||
Gohei: 2
|
||||
ClothingOuterSuitWitchRobes: 2
|
||||
ClothingHeadHatWitch1: 2
|
||||
ClothingHeadHatRedRacoon: 2
|
||||
ClothingOuterRedRacoon: 2
|
||||
ClothingHeadPaperSack: 2
|
||||
|
|
|
|||
|
|
@ -904,7 +904,7 @@
|
|||
name: uplink-reinforcement-radio-name
|
||||
description: uplink-reinforcement-radio-desc
|
||||
productEntity: ReinforcementRadioSyndicate
|
||||
icon: { sprite: Objects/Devices/communication.rsi, state: old-radio }
|
||||
icon: { sprite: Objects/Devices/communication.rsi, state: old-radio-urist }
|
||||
cost:
|
||||
Telecrystal: 16
|
||||
categories:
|
||||
|
|
@ -920,7 +920,7 @@
|
|||
name: uplink-reinforcement-radio-name
|
||||
description: uplink-reinforcement-radio-desc
|
||||
productEntity: ReinforcementRadioSyndicateNukeops
|
||||
icon: { sprite: Objects/Devices/communication.rsi, state: old-radio }
|
||||
icon: { sprite: Objects/Devices/communication.rsi, state: old-radio-urist }
|
||||
cost:
|
||||
Telecrystal: 16
|
||||
categories:
|
||||
|
|
@ -936,7 +936,7 @@
|
|||
name: uplink-reinforcement-radio-cyborg-assault-name
|
||||
description: uplink-reinforcement-radio-cyborg-assault-desc
|
||||
productEntity: ReinforcementRadioSyndicateCyborgAssault
|
||||
icon: { sprite: Mobs/Silicon/chassis.rsi, state: synd_sec }
|
||||
icon: { sprite: Objects/Devices/communication.rsi, state: old-radio-borg-assault }
|
||||
cost:
|
||||
Telecrystal: 65
|
||||
categories:
|
||||
|
|
@ -952,7 +952,7 @@
|
|||
name: uplink-reinforcement-radio-ancestor-name
|
||||
description: uplink-reinforcement-radio-ancestor-desc
|
||||
productEntity: ReinforcementRadioSyndicateAncestor
|
||||
icon: { sprite: Objects/Devices/communication.rsi, state: old-radio }
|
||||
icon: { sprite: Objects/Devices/communication.rsi, state: old-radio-ancestor }
|
||||
cost:
|
||||
Telecrystal: 6
|
||||
categories:
|
||||
|
|
@ -968,7 +968,7 @@
|
|||
name: uplink-reinforcement-radio-ancestor-name
|
||||
description: uplink-reinforcement-radio-ancestor-desc
|
||||
productEntity: ReinforcementRadioSyndicateAncestorNukeops
|
||||
icon: { sprite: Objects/Devices/communication.rsi, state: old-radio }
|
||||
icon: { sprite: Objects/Devices/communication.rsi, state: old-radio-ancestor }
|
||||
cost:
|
||||
Telecrystal: 6
|
||||
categories:
|
||||
|
|
@ -998,7 +998,7 @@
|
|||
id: UplinkMobCatMicrobomb
|
||||
name: uplink-mobcat-microbomb-name
|
||||
description: uplink-mobcat-microbomb-desc
|
||||
icon: { sprite: /Textures/Mobs/Pets/cat.rsi, state: syndicat }
|
||||
icon: { sprite: Objects/Devices/communication.rsi, state: old-radio-syndicat }
|
||||
productEntity: ReinforcementRadioSyndicateSyndiCat
|
||||
cost:
|
||||
Telecrystal: 6
|
||||
|
|
|
|||
|
|
@ -190,6 +190,17 @@
|
|||
- type: Clothing
|
||||
sprite: Clothing/OuterClothing/Suits/shrine-maiden.rsi
|
||||
|
||||
- type: entity
|
||||
parent: ClothingOuterBase
|
||||
id: ClothingOuterSuitWitchRobes
|
||||
name: witch robes
|
||||
description: Magic is all about the spell power, ZE!
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: Clothing/OuterClothing/Suits/witchrobe.rsi
|
||||
- type: Clothing
|
||||
sprite: Clothing/OuterClothing/Suits/witchrobe.rsi
|
||||
|
||||
- type: entity
|
||||
parent: ClothingOuterBase
|
||||
id: ClothingOuterSuitMonkey
|
||||
|
|
|
|||
|
|
@ -134,3 +134,21 @@
|
|||
event: !type:ToggleClothingSpeedEvent
|
||||
icon: { sprite: Clothing/Shoes/Boots/speedboots.rsi, state: icon }
|
||||
iconOn: { sprite: Clothing/Shoes/Boots/speedboots.rsi, state: icon-on }
|
||||
|
||||
- type: entity
|
||||
parent: ClothingShoesBase
|
||||
id: ClothingShoesBootsMoon
|
||||
name: moon boots
|
||||
description: Special anti-gravity boots developed with a speciality blend of lunar rock gel. Shipped from the Netherlands.
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: Clothing/Shoes/Boots/moonboots.rsi
|
||||
layers:
|
||||
- state: icon
|
||||
- type: Clothing
|
||||
sprite: Clothing/Shoes/Boots/moonboots.rsi
|
||||
- type: AntiGravityClothing
|
||||
- type: StaticPrice
|
||||
price: 75
|
||||
- type: Tag
|
||||
tags: [ ]
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@
|
|||
guides:
|
||||
- Security
|
||||
- type: UseDelay
|
||||
delay: 30
|
||||
delay: 3
|
||||
|
||||
- type: entity
|
||||
name: makeshift handcuffs
|
||||
|
|
|
|||
|
|
@ -571,7 +571,7 @@
|
|||
amount: 5
|
||||
|
||||
- type: entity
|
||||
name: space drugs
|
||||
name: space mirage
|
||||
parent: Pill
|
||||
id: PillSpaceDrugs
|
||||
components:
|
||||
|
|
@ -958,7 +958,7 @@
|
|||
Quantity: 15
|
||||
|
||||
- type: entity
|
||||
name: stimulants syringe
|
||||
name: hyperzine syringe
|
||||
parent: PrefilledSyringe
|
||||
id: SyringeStimulants
|
||||
components:
|
||||
|
|
|
|||
|
|
@ -318,10 +318,10 @@
|
|||
tags: []
|
||||
|
||||
- type: entity
|
||||
name: stimulant injector
|
||||
name: hyperzine injector
|
||||
parent: ChemicalMedipen
|
||||
id: Stimpack
|
||||
description: Contains enough stimulants for you to have the chemical's effect for 30 seconds. Use it when you're sure you're ready to throw down.
|
||||
description: Contains enough hyperzine for you to have the chemical's effect for 30 seconds. Use it when you're sure you're ready to throw down.
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: Objects/Specific/Medical/medipen.rsi
|
||||
|
|
@ -350,10 +350,10 @@
|
|||
tags: []
|
||||
|
||||
- type: entity
|
||||
name: stimulant microinjector
|
||||
name: hyperzine microinjector
|
||||
parent: ChemicalMedipen
|
||||
id: StimpackMini
|
||||
description: A microinjector of stimulants that give you about fifteen seconds of the chemical's effects.
|
||||
description: A microinjector of hyperzine that give you about fifteen seconds of the chemical's effects.
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: Objects/Specific/Medical/medipen.rsi
|
||||
|
|
|
|||
|
|
@ -361,7 +361,7 @@
|
|||
whitelist:
|
||||
tags:
|
||||
- CartridgeRocket
|
||||
proto: MeteorLarge
|
||||
proto: MeteorMedium
|
||||
|
||||
- type: entity
|
||||
name: immovable rod launcher
|
||||
|
|
|
|||
|
|
@ -1,40 +1,206 @@
|
|||
- type: entity
|
||||
id: MeteorLarge
|
||||
id: BaseMeteor
|
||||
name: meteor
|
||||
noSpawn: true
|
||||
description: You prefer them when they're burning up in the atmosphere.
|
||||
abstract: true
|
||||
components:
|
||||
- type: Sprite
|
||||
noRot: false
|
||||
sprite: Objects/Weapons/Guns/Projectiles/meteor.rsi
|
||||
scale: 4,4
|
||||
layers:
|
||||
- state: large
|
||||
shader: unshaded
|
||||
- type: ExplodeOnTrigger
|
||||
- type: DeleteOnTrigger
|
||||
- type: TriggerOnCollide
|
||||
fixtureID: projectile
|
||||
sprite: Objects/Misc/meteor.rsi
|
||||
- type: Projectile
|
||||
damage: {}
|
||||
deleteOnCollide: false
|
||||
- type: Explosive
|
||||
explosionType: Default
|
||||
totalIntensity: 600.0
|
||||
intensitySlope: 30
|
||||
maxIntensity: 45
|
||||
- type: Meteor
|
||||
damageTypes:
|
||||
types:
|
||||
Blunt: 1
|
||||
- type: TimedDespawn
|
||||
lifetime: 120
|
||||
- type: Clickable
|
||||
- type: Physics
|
||||
bodyType: Dynamic
|
||||
bodyStatus: InAir
|
||||
angularDamping: 0
|
||||
linearDamping: 0
|
||||
- type: Fixtures
|
||||
fixtures:
|
||||
projectile:
|
||||
shape:
|
||||
!type:PhysShapeCircle
|
||||
radius: 0.8
|
||||
radius: 0.4
|
||||
density: 100
|
||||
hard: true
|
||||
# Didn't use MapGridComponent for now as the bounds are stuffed.
|
||||
hard: false
|
||||
layer:
|
||||
- LargeMobLayer
|
||||
mask:
|
||||
- Impassable
|
||||
- BulletImpassable
|
||||
- type: Damageable
|
||||
damageContainer: Inorganic
|
||||
- type: Explosive
|
||||
explosionType: Default
|
||||
intensitySlope: 4
|
||||
maxIntensity: 100
|
||||
|
||||
- type: entity
|
||||
parent: BaseMeteor
|
||||
id: MeteorSpaceDust
|
||||
name: space dust
|
||||
description: Makes a station sneeze.
|
||||
components:
|
||||
- type: Sprite
|
||||
state: space_dust
|
||||
- type: Fixtures
|
||||
fixtures:
|
||||
projectile:
|
||||
shape:
|
||||
!type:PhysShapeCircle
|
||||
radius: 0.45
|
||||
density: 100
|
||||
hard: false
|
||||
layer:
|
||||
- LargeMobLayer
|
||||
mask:
|
||||
- Impassable
|
||||
- BulletImpassable
|
||||
- type: Explosive
|
||||
totalIntensity: 25
|
||||
- type: Destructible
|
||||
thresholds:
|
||||
- trigger:
|
||||
!type:DamageTrigger
|
||||
damage: 100
|
||||
behaviors:
|
||||
- !type:DoActsBehavior
|
||||
acts: [ "Destruction" ]
|
||||
- !type:PlaySoundBehavior
|
||||
sound:
|
||||
collection: MetalBreak
|
||||
- !type:ExplodeBehavior
|
||||
|
||||
- type: entity
|
||||
parent: BaseMeteor
|
||||
id: MeteorSmall
|
||||
suffix: Small
|
||||
components:
|
||||
- type: Sprite
|
||||
state: small
|
||||
- type: Fixtures
|
||||
fixtures:
|
||||
projectile:
|
||||
shape:
|
||||
!type:PhysShapeCircle
|
||||
radius: 0.25
|
||||
density: 100
|
||||
hard: false
|
||||
layer:
|
||||
- LargeMobLayer
|
||||
mask:
|
||||
- Impassable
|
||||
- BulletImpassable
|
||||
- type: Explosive
|
||||
totalIntensity: 100
|
||||
- type: Destructible
|
||||
thresholds:
|
||||
- trigger:
|
||||
!type:DamageTrigger
|
||||
damage: 1250
|
||||
behaviors:
|
||||
- !type:DoActsBehavior
|
||||
acts: [ "Destruction" ]
|
||||
- !type:PlaySoundBehavior
|
||||
sound:
|
||||
collection: MetalBreak
|
||||
- !type:ExplodeBehavior
|
||||
|
||||
- type: entity
|
||||
parent: BaseMeteor
|
||||
id: MeteorMedium
|
||||
suffix: Medium
|
||||
components:
|
||||
- type: Sprite
|
||||
state: medium
|
||||
- type: Fixtures
|
||||
fixtures:
|
||||
projectile:
|
||||
shape:
|
||||
!type:PhysShapeCircle
|
||||
radius: 0.3
|
||||
density: 100
|
||||
hard: false
|
||||
layer:
|
||||
- LargeMobLayer
|
||||
mask:
|
||||
- Impassable
|
||||
- BulletImpassable
|
||||
- type: Explosive
|
||||
totalIntensity: 200
|
||||
- type: Destructible
|
||||
thresholds:
|
||||
- trigger:
|
||||
!type:DamageTrigger
|
||||
damage: 1750
|
||||
behaviors:
|
||||
- !type:DoActsBehavior
|
||||
acts: [ "Destruction" ]
|
||||
- !type:PlaySoundBehavior
|
||||
sound:
|
||||
collection: MetalBreak
|
||||
- !type:ExplodeBehavior
|
||||
|
||||
- type: entity
|
||||
parent: BaseMeteor
|
||||
id: MeteorLarge
|
||||
suffix: Large
|
||||
components:
|
||||
- type: Sprite
|
||||
state: big
|
||||
- type: Explosive
|
||||
totalIntensity: 300
|
||||
- type: Destructible
|
||||
thresholds:
|
||||
- trigger:
|
||||
!type:DamageTrigger
|
||||
damage: 2500
|
||||
behaviors:
|
||||
- !type:DoActsBehavior
|
||||
acts: [ "Destruction" ]
|
||||
- !type:PlaySoundBehavior
|
||||
sound:
|
||||
collection: MetalBreak
|
||||
- !type:ExplodeBehavior
|
||||
|
||||
- type: entity
|
||||
parent: BaseMeteor
|
||||
id: MeteorUrist
|
||||
name: Urist McMeteor
|
||||
description: As a successful member of society with a stable unflinching psyche and limitless drive, natural affinity for finance and domination, you have been selected, no, you have been effortlessly guided by divine (biological) trauma towards this moment. The gates of destiny fling open, and once again you're left standing on pulsating nothingness. A strobing headache of the soul.
|
||||
suffix: Meteor
|
||||
components:
|
||||
- type: Sprite
|
||||
state: human_pixel
|
||||
- type: SolutionContainerManager
|
||||
solutions:
|
||||
blood:
|
||||
maxVol: 1000
|
||||
reagents:
|
||||
- ReagentId: Blood
|
||||
Quantity: 1000
|
||||
- type: Explosive
|
||||
totalIntensity: 25
|
||||
- type: Destructible
|
||||
thresholds:
|
||||
- trigger:
|
||||
!type:DamageTrigger
|
||||
damage: 3000
|
||||
behaviors:
|
||||
- !type:DoActsBehavior
|
||||
acts: [ "Destruction" ]
|
||||
- !type:PlaySoundBehavior
|
||||
sound:
|
||||
collection: MaleScreams
|
||||
params:
|
||||
volume: 10
|
||||
- !type:SpillBehavior
|
||||
solution: blood
|
||||
- !type:ExplodeBehavior
|
||||
|
|
|
|||
|
|
@ -69,11 +69,12 @@
|
|||
maxCount: 2
|
||||
stationGrid: false
|
||||
paths:
|
||||
- /Maps/Ruins/chunked_tcomms.yml
|
||||
- /Maps/Ruins/biodome_satellite.yml
|
||||
- /Maps/Ruins/derelict.yml
|
||||
- /Maps/Ruins/djstation.yml
|
||||
- /Maps/Ruins/empty_flagship.yml
|
||||
- /Maps/Ruins/old_ai_sat.yml
|
||||
- /Maps/Ruins/relaystation.yml
|
||||
- /Maps/Ruins/syndicate_dropship.yml
|
||||
- /Maps/Ruins/whiteship_ancient.yml
|
||||
- /Maps/Ruins/whiteship_bluespacejumper.yml
|
||||
|
|
|
|||
|
|
@ -208,7 +208,7 @@
|
|||
- MagazineBoxRifle
|
||||
- MagazineLightRifle
|
||||
- MagazineLightRifleEmpty
|
||||
- MagazinePistol
|
||||
- MagazinePistol
|
||||
- MagazinePistolEmpty
|
||||
- MagazinePistolSubMachineGun
|
||||
- MagazinePistolSubMachineGunEmpty
|
||||
|
|
@ -308,6 +308,7 @@
|
|||
- WeaponGauntletGorilla
|
||||
- SynthesizerInstrument
|
||||
- ClothingShoesBootsMagSci
|
||||
- ClothingShoesBootsMoon
|
||||
- ClothingShoesBootsSpeed
|
||||
- NodeScanner
|
||||
- HolofanProjector
|
||||
|
|
@ -708,7 +709,7 @@
|
|||
staticRecipes:
|
||||
- BoxLethalshot
|
||||
- BoxShotgunFlare
|
||||
- BoxShotgunPractice
|
||||
- BoxShotgunPractice
|
||||
- BoxShotgunSlug
|
||||
- ClothingEyesHudSecurity
|
||||
- CombatKnife
|
||||
|
|
@ -725,7 +726,7 @@
|
|||
- MagazineBoxRiflePractice
|
||||
- MagazineLightRifle
|
||||
- MagazineLightRifleEmpty
|
||||
- MagazinePistol
|
||||
- MagazinePistol
|
||||
- MagazinePistolEmpty
|
||||
- MagazinePistolSubMachineGun
|
||||
- MagazinePistolSubMachineGunEmpty
|
||||
|
|
@ -838,8 +839,8 @@
|
|||
- MagazineBoxRifle
|
||||
- MagazineLightRifle
|
||||
- MagazineLightRifleEmpty
|
||||
- MagazinePistol
|
||||
- MagazinePistolEmpty
|
||||
- MagazinePistol
|
||||
- MagazinePistolEmpty
|
||||
- MagazineRifle
|
||||
- MagazineRifleEmpty
|
||||
- MagazineShotgun
|
||||
|
|
|
|||
|
|
@ -105,3 +105,21 @@
|
|||
- type: GuideHelp
|
||||
guides:
|
||||
- Chef
|
||||
|
||||
- type: entity
|
||||
id: SyndicateMicrowave
|
||||
parent: KitchenMicrowave
|
||||
name: donk co. microwave
|
||||
description: So advanced, it can cook donk-pockets in a mere 2.5 seconds!
|
||||
components:
|
||||
- type: Microwave
|
||||
cookTimeMultiplier: 0.5
|
||||
capacity: 10
|
||||
canMicrowaveIdsSafely: false
|
||||
explosionChance: 0.3
|
||||
- type: Sprite
|
||||
sprite: Structures/Machines/microwave_syndie.rsi
|
||||
drawdepth: SmallObjects
|
||||
snapCardinals: true
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -16,6 +16,9 @@
|
|||
map: ["enum.NukeVisualLayers.Unlit"]
|
||||
shader: unshaded
|
||||
visible: false
|
||||
- state: nuclearbomb_gay
|
||||
map: ["pride"]
|
||||
visible: false
|
||||
- state: nukefestive
|
||||
map: ["christmas"]
|
||||
visible: false
|
||||
|
|
@ -24,11 +27,15 @@
|
|||
holidays:
|
||||
festive:
|
||||
- FestiveSeason
|
||||
pride:
|
||||
- PrideMonth
|
||||
- type: GenericVisualizer
|
||||
visuals:
|
||||
enum.HolidayVisuals.Holiday:
|
||||
christmas:
|
||||
festive: { visible: true }
|
||||
pride:
|
||||
pride: { visible: true }
|
||||
enum.NukeVisuals.Deployed:
|
||||
enum.NukeVisualLayers.Base:
|
||||
False: { state: nuclearbomb_base }
|
||||
|
|
@ -129,16 +136,23 @@
|
|||
- state: nukefestive
|
||||
map: ["christmas"]
|
||||
visible: false
|
||||
- state: nuclearbomb_gay
|
||||
map: [ "pride" ]
|
||||
visible: false
|
||||
- type: Appearance
|
||||
- type: HolidayVisuals
|
||||
holidays:
|
||||
festive:
|
||||
- FestiveSeason
|
||||
pride:
|
||||
- PrideMonth
|
||||
- type: GenericVisualizer
|
||||
visuals:
|
||||
enum.HolidayVisuals.Holiday:
|
||||
christmas:
|
||||
festive: { visible: true }
|
||||
pride:
|
||||
pride: { visible: true }
|
||||
- type: Physics
|
||||
bodyType: Dynamic
|
||||
- type: Fixtures
|
||||
|
|
|
|||
|
|
@ -124,6 +124,7 @@
|
|||
shader: unshaded
|
||||
- state: paper
|
||||
sprite: Structures/Storage/Crates/labels.rsi
|
||||
offset: "-0.5,0"
|
||||
map: ["enum.PaperLabelVisuals.Layer"]
|
||||
- type: Damageable
|
||||
damageContainer: StructuralInorganic
|
||||
|
|
|
|||
|
|
@ -206,27 +206,6 @@
|
|||
duration: 240
|
||||
- type: KudzuGrowthRule
|
||||
|
||||
- type: entity
|
||||
id: MeteorSwarm
|
||||
parent: BaseStationEventLongDelay
|
||||
components:
|
||||
- type: StationEvent
|
||||
earliestStart: 30
|
||||
weight: 7.5
|
||||
minimumPlayers: 10 #Enough to hopefully have at least one engineering guy
|
||||
startAnnouncement: station-event-meteor-swarm-start-announcement
|
||||
endAnnouncement: station-event-meteor-swarm-end-announcement
|
||||
startAudio:
|
||||
path: /Audio/Announcements/meteors_start.ogg
|
||||
params:
|
||||
volume: -4
|
||||
endAudio:
|
||||
path: /Audio/Announcements/meteors_end.ogg # Corvax-Announcements
|
||||
params:
|
||||
volume: -4
|
||||
duration: null #ending is handled by MeteorSwarmRule
|
||||
- type: MeteorSwarmRule
|
||||
|
||||
- type: entity
|
||||
id: MouseMigration
|
||||
parent: BaseStationEventShortDelay
|
||||
|
|
|
|||
104
Resources/Prototypes/GameRules/meteorswarms.yml
Normal file
|
|
@ -0,0 +1,104 @@
|
|||
- type: entity
|
||||
parent: BaseGameRule
|
||||
id: GameRuleMeteorScheduler
|
||||
components:
|
||||
- type: GameRule
|
||||
minPlayers: 25
|
||||
- type: MeteorScheduler
|
||||
|
||||
- type: weightedRandomEntity
|
||||
id: DefaultConfig
|
||||
weights:
|
||||
GameRuleSpaceDustMinor: 44
|
||||
GameRuleSpaceDustMajor: 22
|
||||
GameRuleMeteorSwarmSmall: 18
|
||||
GameRuleMeteorSwarmMedium: 10
|
||||
GameRuleMeteorSwarmLarge: 5
|
||||
GameRuleUristSwarm: 0.05
|
||||
|
||||
- type: entity
|
||||
parent: BaseGameRule
|
||||
id: GameRuleMeteorSwarm
|
||||
abstract: true
|
||||
components:
|
||||
- type: GameRule
|
||||
- type: MeteorSwarm
|
||||
|
||||
- type: entity
|
||||
parent: GameRuleMeteorSwarm
|
||||
id: GameRuleSpaceDustMinor
|
||||
components:
|
||||
- type: MeteorSwarm
|
||||
announcement: null
|
||||
announcementSound: null
|
||||
nonDirectional: true
|
||||
meteors:
|
||||
MeteorSpaceDust: 1
|
||||
waves:
|
||||
min: 2
|
||||
max: 3
|
||||
meteorsPerWave:
|
||||
min: 3
|
||||
max: 5
|
||||
|
||||
- type: entity
|
||||
parent: GameRuleMeteorSwarm
|
||||
id: GameRuleSpaceDustMajor
|
||||
components:
|
||||
- type: MeteorSwarm
|
||||
announcement: station-event-space-dust-start-announcement
|
||||
announcementSound: /Audio/Announcements/attention.ogg
|
||||
nonDirectional: true
|
||||
meteors:
|
||||
MeteorSpaceDust: 1
|
||||
waves:
|
||||
min: 2
|
||||
max: 3
|
||||
meteorsPerWave:
|
||||
min: 8
|
||||
max: 12
|
||||
|
||||
- type: entity
|
||||
parent: GameRuleMeteorSwarm
|
||||
id: GameRuleMeteorSwarmSmall
|
||||
components:
|
||||
- type: MeteorSwarm
|
||||
meteors:
|
||||
MeteorSmall: 7
|
||||
MeteorMedium: 3
|
||||
|
||||
- type: entity
|
||||
parent: GameRuleMeteorSwarm
|
||||
id: GameRuleMeteorSwarmMedium
|
||||
components:
|
||||
- type: MeteorSwarm
|
||||
meteors:
|
||||
MeteorSmall: 3
|
||||
MeteorMedium: 6
|
||||
MeteorLarge: 1
|
||||
|
||||
- type: entity
|
||||
parent: GameRuleMeteorSwarm
|
||||
id: GameRuleMeteorSwarmLarge
|
||||
components:
|
||||
- type: MeteorSwarm
|
||||
meteors:
|
||||
MeteorSmall: 2
|
||||
MeteorMedium: 4
|
||||
MeteorLarge: 4
|
||||
|
||||
- type: entity
|
||||
parent: GameRuleMeteorSwarm
|
||||
id: GameRuleUristSwarm
|
||||
components:
|
||||
- type: MeteorSwarm
|
||||
announcement: station-event-meteor-urist-start-announcement
|
||||
announcementSound: /Audio/Announcements/attention.ogg
|
||||
meteors:
|
||||
MeteorUrist: 1
|
||||
waves:
|
||||
min: 3
|
||||
max: 3
|
||||
meteorsPerWave:
|
||||
min: 10
|
||||
max: 10
|
||||
|
|
@ -126,6 +126,13 @@
|
|||
Steel: 1000
|
||||
Plastic: 500
|
||||
|
||||
- type: latheRecipe
|
||||
id: ClothingShoesBootsMoon
|
||||
result: ClothingShoesBootsMoon
|
||||
completetime: 2
|
||||
materials:
|
||||
Steel: 600
|
||||
|
||||
- type: latheRecipe
|
||||
id: ClothingShoesBootsSpeed
|
||||
result: ClothingShoesBootsSpeed
|
||||
|
|
|
|||
|
|
@ -68,6 +68,7 @@
|
|||
cost: 7500
|
||||
recipeUnlocks:
|
||||
- ClothingShoesBootsMagSci
|
||||
- ClothingShoesBootsMoon
|
||||
|
||||
- type: technology
|
||||
id: AnomalyCoreHarnessing
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@
|
|||
description: extended-description
|
||||
rules:
|
||||
- BasicStationEventScheduler
|
||||
- GameRuleMeteorScheduler
|
||||
- BasicRoundstartVariation
|
||||
|
||||
- type: gamePreset
|
||||
|
|
@ -64,6 +65,7 @@
|
|||
description: secret-description
|
||||
rules:
|
||||
- BasicStationEventScheduler
|
||||
- GameRuleMeteorScheduler
|
||||
|
||||
- type: gamePreset
|
||||
id: SecretGreenshift #For Admin Use: Runs Greenshift but shows "Secret" in lobby.
|
||||
|
|
@ -95,6 +97,7 @@
|
|||
- Traitor
|
||||
- SubGamemodesRule
|
||||
- BasicStationEventScheduler
|
||||
- GameRuleMeteorScheduler
|
||||
- BasicRoundstartVariation
|
||||
|
||||
- type: gamePreset
|
||||
|
|
@ -121,6 +124,7 @@
|
|||
- Nukeops
|
||||
- SubGamemodesRule
|
||||
- BasicStationEventScheduler
|
||||
- GameRuleMeteorScheduler
|
||||
- BasicRoundstartVariation
|
||||
|
||||
- type: gamePreset
|
||||
|
|
@ -136,6 +140,7 @@
|
|||
- Revolutionary
|
||||
- SubGamemodesRule
|
||||
- BasicStationEventScheduler
|
||||
- GameRuleMeteorScheduler
|
||||
- BasicRoundstartVariation
|
||||
|
||||
- type: gamePreset
|
||||
|
|
@ -152,4 +157,5 @@
|
|||
rules:
|
||||
- Zombie
|
||||
- BasicStationEventScheduler
|
||||
- GameRuleMeteorScheduler
|
||||
- BasicRoundstartVariation
|
||||
|
|
|
|||
|
|
@ -437,3 +437,10 @@
|
|||
name: holiday-name-friday-thirteenth
|
||||
shouldCelebrate:
|
||||
!type:FridayThirteenth { }
|
||||
|
||||
- type: holiday
|
||||
id: PrideMonth
|
||||
name: holiday-name-pride-month
|
||||
beginDay: 1
|
||||
endDay: 31
|
||||
beginMonth: June
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
<Document>
|
||||
<Document>
|
||||
# Space Law: Controlled Substances
|
||||
- \[Chemists/Science\] Explosive and pyrotechnic compounds excluding welding fuel contained in welders or welding fuel storage vessels
|
||||
- \[Science\] Toxins
|
||||
|
|
@ -9,6 +9,6 @@
|
|||
- \[None\] Nocturine
|
||||
- \[None\] Norepinephirc acid
|
||||
- \[None\] Romerol
|
||||
- \[None\] Space drugs
|
||||
- \[None\] Space Mirage
|
||||
- \[None\] Stimulants, excluding Desoxyephedrine and Ephedrine
|
||||
</Document>
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
<Document>
|
||||
<Document>
|
||||
# Space Law: Crime Listing
|
||||
Crime codes are organized by a Category Code (_-xx) which is a collection of non-stackable crimes on a row, prefixed
|
||||
by the Severity Number (X-__).
|
||||
|
|
@ -321,7 +321,7 @@
|
|||
<ColorBox>
|
||||
<Box HorizontalAlignment="Left" VerticalAlignment="Stretch" Margin="2">
|
||||
Combat enhancing drugs are those that benefit stun times, or movement speed, and are restricted. Poisons are
|
||||
restricted. Substances such as Ephedrine, Desoxyephedrine, and stimulants are restricted. The captain or highest
|
||||
restricted. Substances such as Ephedrine, Desoxyephedrine, and Hyperzine are restricted. The captain or highest
|
||||
standing command staff may publicly restrict other harmful substances.
|
||||
</Box>
|
||||
</ColorBox>
|
||||
|
|
|
|||
|
After Width: | Height: | Size: 612 B |
|
After Width: | Height: | Size: 330 B |
|
After Width: | Height: | Size: 725 B |
|
After Width: | Height: | Size: 730 B |
|
|
@ -0,0 +1,26 @@
|
|||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-SA-3.0",
|
||||
"copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/pull/36039/commits/b3bd70ae925ecbe7c625f70c4c3d09d3ed2ed32a . Inhands were made for SS14 and available under the same license",
|
||||
"size": {
|
||||
"x": 32,
|
||||
"y": 32
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "icon"
|
||||
},
|
||||
{
|
||||
"name": "equipped-OUTERCLOTHING",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "inhand-left",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "inhand-right",
|
||||
"directions": 4
|
||||
}
|
||||
]
|
||||
}
|
||||
|
After Width: | Height: | Size: 412 B |
|
After Width: | Height: | Size: 316 B |
BIN
Resources/Textures/Clothing/Shoes/Boots/moonboots.rsi/icon.png
Normal file
|
After Width: | Height: | Size: 340 B |