forked from SpaceStation14-Shenanigans/Monolith
Compare commits
101 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e0bfb59950 | |||
| 8f8e7ed084 | |||
| 8cd2379f25 | |||
| a68c0d48ba | |||
| ec2c5a521d | |||
| 39efe6f747 | |||
| 0816b4457c | |||
| 6c87da3dc3 | |||
| 05d4b2eebd | |||
| 6ee1e7d8f3 | |||
| f097148d99 | |||
| ef2ce6565d | |||
| 98ad67497b | |||
| 67644068b6 | |||
| 1b64380dbb | |||
| 465006f16b | |||
| e1ec12fb3e | |||
| d62e3a42d0 | |||
| 02be1ef282 | |||
| 85c4a0c9ec | |||
| baeb53ee82 | |||
| 933dc75c33 | |||
| fc45f016ee | |||
| 6a719f7c39 | |||
| d83db373fe | |||
| ccec7894c6 | |||
| 3319b5f0d3 | |||
| 81d9ae37e3 | |||
| 1990f2a272 | |||
| 3665639420 | |||
| 20e2ceb0db | |||
| 84a116fd27 | |||
| c3c402d380 | |||
| 92e8677e82 | |||
| 65365135e3 | |||
| 62e372c9d2 | |||
| 4279c1977d | |||
| 6406a7cf4f | |||
| 806e22e8b4 | |||
| c2934d0bd7 | |||
| 5316f1fdd9 | |||
| 66fed8d2a2 | |||
| 28e3584a67 | |||
| 78c94ddbc4 | |||
| cef95a03bf | |||
| bd3a35ee64 | |||
| 0b50c919e4 | |||
| afcf994545 | |||
| 5aaee26a09 | |||
| fb3c49bd09 | |||
| 2c381cbcd0 | |||
| f4e3ac2478 | |||
| 31de4af5e2 | |||
| 5e67e63032 | |||
| f3919fafc1 | |||
| 974b78863b | |||
| 1654bd5cf8 | |||
| d353667f97 | |||
| 47116d8ba7 | |||
| 9bd6d5f3f2 | |||
| 1dc696deb6 | |||
| f2df23dc81 | |||
| 76d6ea96e0 | |||
| 93ba265e00 | |||
| 16f73ec031 | |||
| 7a0f0d04c5 | |||
| bcce8e67a3 | |||
| 5afcdd9379 | |||
| 01c7ea464a | |||
| 4df38cc9cc | |||
| 8c0d2a50df | |||
| 2d8105de13 | |||
| 01bb73bf56 | |||
| f11c83a96e | |||
| 36d1740829 | |||
| c7a34dfc22 | |||
| e366c4d7cc | |||
| 5d5f6b4654 | |||
| 165f9950b5 | |||
| ef9858936d | |||
| d0a95f5d8b | |||
| ee386b0633 | |||
| de38cc18ef | |||
| ca928bdc83 | |||
| cee6ce9566 | |||
| 984a2c9b71 | |||
| 548e9eccb6 | |||
| cd817abd2c | |||
| f276df8fe9 | |||
| dd323be01d | |||
| 0cf9b35f08 | |||
| 351b225102 | |||
| 496432881e | |||
| 5798b57788 | |||
| ec88162ac0 | |||
| 3992aa846f | |||
| 4b62f35f10 | |||
| c5241854ce | |||
| c3f687a493 | |||
| 7b00d623e0 | |||
| dafbb5f3d8 |
@@ -77,6 +77,16 @@ public sealed partial class RoboticsConsoleWindow : FancyWindow
|
||||
if (_selected is {} selected && !_cyborgs.ContainsKey(selected))
|
||||
_selected = null;
|
||||
|
||||
// Corvax-Next-AiRemoteControl-Start
|
||||
var isAiControllable = false;
|
||||
|
||||
if (_selected != null)
|
||||
{
|
||||
_cyborgs.TryGetValue(_selected, out var data);
|
||||
isAiControllable = data.IsAiControllable;
|
||||
}
|
||||
// Corvax-Next-AiRemoteControl-End
|
||||
|
||||
var hasCyborgs = _cyborgs.Count > 0;
|
||||
NoCyborgs.Visible = !hasCyborgs;
|
||||
CyborgsContainer.Visible = hasCyborgs;
|
||||
|
||||
@@ -76,7 +76,7 @@ public sealed class DamageOverlayUiController : UIController
|
||||
{
|
||||
if (mobState == null && !EntityManager.TryGetComponent(entity, out mobState) ||
|
||||
thresholds == null && !EntityManager.TryGetComponent(entity, out thresholds) ||
|
||||
damageable == null && !EntityManager.TryGetComponent(entity, out damageable))
|
||||
damageable == null && !EntityManager.TryGetComponent(entity, out damageable))
|
||||
return;
|
||||
|
||||
if (!_mobThresholdSystem.TryGetIncapThreshold(entity, out var foundThreshold, thresholds))
|
||||
@@ -94,47 +94,48 @@ public sealed class DamageOverlayUiController : UIController
|
||||
switch (mobState.CurrentState)
|
||||
{
|
||||
case MobState.Alive:
|
||||
{
|
||||
if (EntityManager.HasComponent<PainNumbnessComponent>(entity))
|
||||
{
|
||||
_overlay.BruteLevel = 0;
|
||||
}
|
||||
else if (damageable.DamagePerGroup.TryGetValue("Brute", out var bruteDamage))
|
||||
{
|
||||
_overlay.BruteLevel = FixedPoint2.Min(1f, bruteDamage / critThreshold).Float();
|
||||
}
|
||||
if (!EntityManager.HasComponent<PainNumbnessComponent>(entity)) // Mono - makes this look better
|
||||
{
|
||||
if (damageable.DamagePerGroup.TryGetValue("Brute", out var bruteDamage))
|
||||
_overlay.BruteLevel = FixedPoint2.Min(1f, bruteDamage / critThreshold).Float();
|
||||
if (damageable.DamagePerGroup.TryGetValue("Burn", out var burnDamage)) // Adds burn damage to pain overlay - Mono
|
||||
_overlay.BruteLevel = FixedPoint2.Min(1f, _overlay.BruteLevel + (burnDamage / critThreshold)).Float();
|
||||
}
|
||||
else
|
||||
_overlay.BruteLevel = 0;
|
||||
|
||||
if (damageable.DamagePerGroup.TryGetValue("Airloss", out var oxyDamage))
|
||||
{
|
||||
_overlay.OxygenLevel = FixedPoint2.Min(1f, oxyDamage / critThreshold).Float();
|
||||
}
|
||||
if (damageable.DamagePerGroup.TryGetValue("Airloss", out var oxyDamage))
|
||||
{
|
||||
_overlay.OxygenLevel = FixedPoint2.Min(1f, oxyDamage / critThreshold).Float();
|
||||
}
|
||||
|
||||
if (_overlay.BruteLevel < 0.05f) // Don't show damage overlay if they're near enough to max.
|
||||
{
|
||||
_overlay.BruteLevel = 0;
|
||||
}
|
||||
if (_overlay.BruteLevel < 0.05f) // Don't show damage overlay if they're near enough to max.
|
||||
{
|
||||
_overlay.BruteLevel = 0;
|
||||
}
|
||||
|
||||
_overlay.CritLevel = 0;
|
||||
_overlay.DeadLevel = 0;
|
||||
break;
|
||||
}
|
||||
_overlay.CritLevel = 0;
|
||||
_overlay.DeadLevel = 0;
|
||||
break;
|
||||
}
|
||||
case MobState.Critical:
|
||||
{
|
||||
if (!_mobThresholdSystem.TryGetDeadPercentage(entity,
|
||||
FixedPoint2.Max(0.0, damageable.TotalDamage), out var critLevel))
|
||||
return;
|
||||
_overlay.CritLevel = critLevel.Value.Float();
|
||||
{
|
||||
if (!_mobThresholdSystem.TryGetDeadPercentage(entity,
|
||||
FixedPoint2.Max(0.0, damageable.TotalDamage), out var critLevel))
|
||||
return;
|
||||
_overlay.CritLevel = critLevel.Value.Float();
|
||||
|
||||
_overlay.BruteLevel = 0;
|
||||
_overlay.DeadLevel = 0;
|
||||
break;
|
||||
}
|
||||
_overlay.BruteLevel = 0;
|
||||
_overlay.DeadLevel = 0;
|
||||
break;
|
||||
}
|
||||
case MobState.Dead:
|
||||
{
|
||||
_overlay.BruteLevel = 0;
|
||||
_overlay.CritLevel = 0;
|
||||
break;
|
||||
}
|
||||
{
|
||||
_overlay.BruteLevel = 0;
|
||||
_overlay.CritLevel = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -82,7 +82,7 @@ namespace Content.Client.VendingMachines.UI
|
||||
/// Populates the list of available items on the vending machine interface
|
||||
/// and sets icons based on their prototypes
|
||||
/// </summary>
|
||||
public void Populate(List<VendingMachineInventoryEntry> inventory, float priceModifier, int balance, int? cashSlotBalance) // Frontier: add balance, cashSlotBalance
|
||||
public void Populate(List<VendingMachineInventoryEntry> inventory, float priceModifier, int balance, int? cashSlotBalance, bool requiresCash) // Frontier: add balance, cashSlotBalance
|
||||
{
|
||||
UpdateBalance(balance); // Frontier
|
||||
UpdateCashSlotBalance(cashSlotBalance); // Frontier
|
||||
@@ -124,84 +124,11 @@ namespace Content.Client.VendingMachines.UI
|
||||
_dummies.Add(entry.ID, dummy);
|
||||
}
|
||||
|
||||
// Frontier: item pricing
|
||||
// ok so we dont really have access to the pricing system so we are doing a quick price check
|
||||
// based on prototype info since the items inside a vending machine dont actually exist as entities
|
||||
// until they are spawned. So this little alg does the following:
|
||||
// first, checks for a staticprice component, and if it has one, checks to make sure its not 0 since
|
||||
// stacks and other items have 0 cost.
|
||||
// If the price is 0, then we check for both a stack price and a stack component, since if it has one
|
||||
// it should have the other too, and then calculates the price based on that.
|
||||
// If the price is still 0 or non-existant (this is the case for food and containers since their value is
|
||||
// determined dynamically by their contents/inventory), it then falls back to the default mystery
|
||||
// hardcoded value of 20xMarketModifier.
|
||||
var cost = 20;
|
||||
if (prototype != null && prototype.TryGetComponent<StaticPriceComponent>(out var priceComponent, _entityManager.ComponentFactory))
|
||||
{
|
||||
if (priceComponent.Price != 0)
|
||||
{
|
||||
var price = (float)priceComponent.Price;
|
||||
cost = (int)(price * priceModifier);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (prototype.TryGetComponent<StackPriceComponent>(out var stackPrice, _entityManager.ComponentFactory)
|
||||
&& prototype.TryGetComponent<StackComponent>(out var stack, _entityManager.ComponentFactory))
|
||||
{
|
||||
var price = stackPrice.Price * stack.Count;
|
||||
cost = (int)(price * priceModifier);
|
||||
}
|
||||
else
|
||||
cost = (int)(cost * priceModifier);
|
||||
}
|
||||
}
|
||||
else
|
||||
cost = (int)(cost * priceModifier);
|
||||
|
||||
if (prototype != null && prototype.TryGetComponent<SolutionContainerManagerComponent>(out var priceSolutions, _entityManager.ComponentFactory))
|
||||
{
|
||||
if (priceSolutions.Solutions != null)
|
||||
{
|
||||
foreach (var solution in priceSolutions.Solutions.Values)
|
||||
{
|
||||
foreach (var (reagent, quantity) in solution.Contents)
|
||||
{
|
||||
if (!_prototypeManager.TryIndex<ReagentPrototype>(reagent.Prototype,
|
||||
out var reagentProto))
|
||||
continue;
|
||||
|
||||
// TODO check ReagentData for price information?
|
||||
var costReagent = quantity.Float() * reagentProto.PricePerUnit;
|
||||
cost += (int)(costReagent * priceModifier);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// End Frontier: item pricing
|
||||
|
||||
// Frontier: calculate vending price (this duplicates Content.Server.PricingSystem.GetVendPrice - this should be moved to Content.Shared if possible)
|
||||
if (prototype != null)
|
||||
{
|
||||
var price = 0.0;
|
||||
|
||||
if (prototype.TryGetComponent<StaticPriceComponent>(out var staticComp, _entityManager.ComponentFactory) && staticComp.VendPrice > 0.0)
|
||||
{
|
||||
price += staticComp.VendPrice;
|
||||
}
|
||||
else if (prototype.TryGetComponent<StackPriceComponent>(out var stackComp, _entityManager.ComponentFactory) && stackComp.VendPrice > 0.0)
|
||||
{
|
||||
price += stackComp.VendPrice;
|
||||
}
|
||||
|
||||
// If there is anything that explicitly sets vending price - higher OR lower, override the base.
|
||||
if (price > 0.0)
|
||||
{
|
||||
cost = (int)price;
|
||||
}
|
||||
}
|
||||
// End Frontier
|
||||
|
||||
var itemName = Identity.Name(dummy, _entityManager);
|
||||
var cost = 0; // mono
|
||||
if (requiresCash) // frontier
|
||||
cost = GetPrice(entry, prototype, priceModifier);
|
||||
|
||||
string itemText;
|
||||
|
||||
// Frontier: unlimited vending
|
||||
@@ -211,7 +138,6 @@ namespace Content.Client.VendingMachines.UI
|
||||
itemText = $"[{BankSystemExtensions.ToSpesoString(cost)}] {itemName}";
|
||||
// End Frontier: unlimited vending
|
||||
|
||||
|
||||
if (itemText.Length > longestEntry.Length)
|
||||
longestEntry = itemText;
|
||||
|
||||
@@ -223,6 +149,88 @@ namespace Content.Client.VendingMachines.UI
|
||||
SetSizeAfterUpdate(longestEntry.Length, inventory.Count);
|
||||
}
|
||||
|
||||
// Mono: Moved out frontier pricing logic to the separate method
|
||||
private int GetPrice(VendingMachineInventoryEntry entry, EntityPrototype? prototype, float priceModifier){
|
||||
// Frontier: item pricing
|
||||
// ok so we dont really have access to the pricing system so we are doing a quick price check
|
||||
// based on prototype info since the items inside a vending machine dont actually exist as entities
|
||||
// until they are spawned. So this little alg does the following:
|
||||
// first, checks for a staticprice component, and if it has one, checks to make sure its not 0 since
|
||||
// stacks and other items have 0 cost.
|
||||
// If the price is 0, then we check for both a stack price and a stack component, since if it has one
|
||||
// it should have the other too, and then calculates the price based on that.
|
||||
// If the price is still 0 or non-existant (this is the case for food and containers since their value is
|
||||
// determined dynamically by their contents/inventory), it then falls back to the default mystery
|
||||
// hardcoded value of 20xMarketModifier.
|
||||
var cost = 20;
|
||||
if (prototype != null && prototype.TryGetComponent<StaticPriceComponent>(out var priceComponent, _entityManager.ComponentFactory))
|
||||
{
|
||||
if (priceComponent.Price != 0)
|
||||
{
|
||||
var price = (float)priceComponent.Price;
|
||||
cost = (int)(price * priceModifier);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (prototype.TryGetComponent<StackPriceComponent>(out var stackPrice, _entityManager.ComponentFactory)
|
||||
&& prototype.TryGetComponent<StackComponent>(out var stack, _entityManager.ComponentFactory))
|
||||
{
|
||||
var price = stackPrice.Price * stack.Count;
|
||||
cost = (int)(price * priceModifier);
|
||||
}
|
||||
else
|
||||
cost = (int)(cost * priceModifier);
|
||||
}
|
||||
}
|
||||
else
|
||||
cost = (int)(cost * priceModifier);
|
||||
|
||||
if (prototype != null && prototype.TryGetComponent<SolutionContainerManagerComponent>(out var priceSolutions, _entityManager.ComponentFactory))
|
||||
{
|
||||
if (priceSolutions.Solutions != null)
|
||||
{
|
||||
foreach (var solution in priceSolutions.Solutions.Values)
|
||||
{
|
||||
foreach (var (reagent, quantity) in solution.Contents)
|
||||
{
|
||||
if (!_prototypeManager.TryIndex<ReagentPrototype>(reagent.Prototype,
|
||||
out var reagentProto))
|
||||
continue;
|
||||
|
||||
// TODO check ReagentData for price information?
|
||||
var costReagent = quantity.Float() * reagentProto.PricePerUnit;
|
||||
cost += (int)(costReagent * priceModifier);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// End Frontier: item pricing
|
||||
|
||||
// Frontier: calculate vending price (this duplicates Content.Server.PricingSystem.GetVendPrice - this should be moved to Content.Shared if possible)
|
||||
if (prototype != null)
|
||||
{
|
||||
var price = 0.0;
|
||||
|
||||
if (prototype.TryGetComponent<StaticPriceComponent>(out var staticComp, _entityManager.ComponentFactory) && staticComp.VendPrice > 0.0)
|
||||
{
|
||||
price += staticComp.VendPrice;
|
||||
}
|
||||
else if (prototype.TryGetComponent<StackPriceComponent>(out var stackComp, _entityManager.ComponentFactory) && stackComp.VendPrice > 0.0)
|
||||
{
|
||||
price += stackComp.VendPrice;
|
||||
}
|
||||
|
||||
// If there is anything that explicitly sets vending price - higher OR lower, override the base.
|
||||
if (price > 0.0)
|
||||
{
|
||||
cost = (int)price;
|
||||
}
|
||||
}
|
||||
|
||||
return cost;
|
||||
// End Frontier
|
||||
}
|
||||
|
||||
// Frontier
|
||||
public void UpdateBalance(int balance)
|
||||
{
|
||||
|
||||
@@ -30,6 +30,8 @@ namespace Content.Client.VendingMachines
|
||||
[ViewVariables]
|
||||
private int _cashSlotBalance = 0;
|
||||
// End Frontier
|
||||
[ViewVariables]
|
||||
private bool _requiresCash; // mono
|
||||
|
||||
public VendingMachineBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey)
|
||||
{
|
||||
@@ -74,6 +76,7 @@ namespace Content.Client.VendingMachines
|
||||
if (EntMan.TryGetComponent<VendingMachineComponent>(Owner, out var vendingMachine))
|
||||
{
|
||||
_cashSlotBalance = vendingMachine.CashSlotBalance;
|
||||
_requiresCash = vendingMachine.RequiresCash; // mono
|
||||
if (vendingMachine.CashSlotName != null)
|
||||
cashSlotValue = _cashSlotBalance;
|
||||
}
|
||||
@@ -83,7 +86,7 @@ namespace Content.Client.VendingMachines
|
||||
}
|
||||
// End Frontier
|
||||
|
||||
_menu?.Populate(_cachedInventory, _mod, _balance, cashSlotValue); // Frontier: add _balance
|
||||
_menu?.Populate(_cachedInventory, _mod, _balance, cashSlotValue, _requiresCash); // Frontier: add _balance, mono: add _requiresCash
|
||||
}
|
||||
|
||||
private void OnItemSelected(GUIBoundKeyEventArgs args, ListData data)
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
// SPDX-FileCopyrightText: 2025 GoobBot <uristmchands@proton.me>
|
||||
// SPDX-FileCopyrightText: 2025 ImHoks <imhokzzzz@gmail.com>
|
||||
// SPDX-FileCopyrightText: 2025 KillanGenifer <killangenifer@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
using Content.Shared._CorvaxNext.Silicons.Borgs;
|
||||
|
||||
namespace Content.Client._CorvaxNext.Silicons.Borgs;
|
||||
|
||||
public sealed partial class AiRemoteControlSystem : SharedAiRemoteControlSystem
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
<Control xmlns="https://spacestation14.io"
|
||||
xmlns:customControls="clr-namespace:Content.Client.Administration.UI.CustomControls"
|
||||
Margin="0 0 0 10">
|
||||
<PanelContainer VerticalExpand="True" StyleClasses="BackgroundDark">
|
||||
<BoxContainer Orientation="Vertical"
|
||||
HorizontalExpand="True"
|
||||
VerticalExpand="True"
|
||||
Margin="5 5 5 5">
|
||||
<customControls:HSeparator Margin="0 5 0 5"/>
|
||||
<RichTextLabel Name="DeviceName"/>
|
||||
<BoxContainer Name="RemoteControlButtons" Orientation="Horizontal" HorizontalExpand="True" Margin="0 5 0 0">
|
||||
<Button Name="MoveButton" StyleClasses="chatSelectorOptionButton" Text="{Loc ai-remote-ui-menu-moveto}"/>
|
||||
<Control Margin="2 0 0 0"/>
|
||||
<Button Name="TakeControlButton" StyleClasses="chatSelectorOptionButton" Text="{Loc ai-remote-control}"/>
|
||||
</BoxContainer>
|
||||
</BoxContainer>
|
||||
</PanelContainer>
|
||||
</Control>
|
||||
@@ -0,0 +1,39 @@
|
||||
// SPDX-FileCopyrightText: 2025 GoobBot <uristmchands@proton.me>
|
||||
// SPDX-FileCopyrightText: 2025 ImHoks <imhokzzzz@gmail.com>
|
||||
// SPDX-FileCopyrightText: 2025 KillanGenifer <killangenifer@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
using Robust.Client.UserInterface;
|
||||
using Robust.Client.AutoGenerated;
|
||||
using Robust.Client.UserInterface.XAML;
|
||||
using Content.Shared._CorvaxNext.Silicons.Borgs.Components;
|
||||
|
||||
namespace Content.Client._CorvaxNext.Silicons.Laws.Ui;
|
||||
|
||||
[GenerateTypedNameReferences]
|
||||
public sealed partial class RemoteDeviceDisplay : Control
|
||||
{
|
||||
public event Action<RemoteDeviceActionEvent>? OnRemoteDeviceAction;
|
||||
|
||||
public RemoteDeviceDisplay(NetEntity netEntityUid, string displayName)
|
||||
{
|
||||
RobustXamlLoader.Load(this);
|
||||
|
||||
DeviceName.SetMessage(displayName);
|
||||
|
||||
MoveButton.OnPressed += _ =>
|
||||
{
|
||||
OnRemoteDeviceAction?.Invoke(new RemoteDeviceActionEvent(
|
||||
RemoteDeviceActionEvent.RemoteDeviceActionType.MoveToDevice,
|
||||
netEntityUid));
|
||||
};
|
||||
|
||||
TakeControlButton.OnPressed += _ =>
|
||||
{
|
||||
OnRemoteDeviceAction?.Invoke(new RemoteDeviceActionEvent(
|
||||
RemoteDeviceActionEvent.RemoteDeviceActionType.TakeControl,
|
||||
netEntityUid));
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
// SPDX-FileCopyrightText: 2025 GoobBot <uristmchands@proton.me>
|
||||
// SPDX-FileCopyrightText: 2025 ImHoks <imhokzzzz@gmail.com>
|
||||
// SPDX-FileCopyrightText: 2025 KillanGenifer <killangenifer@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
using Content.Shared._CorvaxNext.Silicons.Borgs.Components;
|
||||
using Robust.Client.UserInterface;
|
||||
using static Content.Shared._CorvaxNext.Silicons.Borgs.Components.AiRemoteControllerComponent;
|
||||
|
||||
namespace Content.Client._CorvaxNext.Silicons.Laws.Ui;
|
||||
|
||||
public sealed class RemoteDevicesBoundUserInterface : BoundUserInterface
|
||||
{
|
||||
private RemoteDevicesMenu? _menu;
|
||||
private EntityUid _owner;
|
||||
|
||||
public RemoteDevicesBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey)
|
||||
{
|
||||
_owner = owner;
|
||||
}
|
||||
|
||||
protected override void Open()
|
||||
{
|
||||
base.Open();
|
||||
|
||||
_menu = this.CreateWindow<RemoteDevicesMenu>();
|
||||
_menu.OnRemoteDeviceAction += SendAction;
|
||||
}
|
||||
|
||||
protected override void UpdateState(BoundUserInterfaceState state)
|
||||
{
|
||||
base.UpdateState(state);
|
||||
|
||||
if (state is not RemoteDevicesBuiState msg)
|
||||
return;
|
||||
|
||||
_menu?.Update(_owner, msg);
|
||||
}
|
||||
|
||||
public void SendAction(RemoteDeviceActionEvent action)
|
||||
{
|
||||
SendMessage(new RemoteDeviceActionMessage(action));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
<controls:FancyWindow xmlns="https://spacestation14.io"
|
||||
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
|
||||
xmlns:gfx="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client"
|
||||
Title="{Loc ai-remote-ui-menu-title}"
|
||||
MinSize="355 100"
|
||||
SetSize="355 415">
|
||||
<BoxContainer Orientation="Vertical"
|
||||
HorizontalExpand="True"
|
||||
VerticalExpand="True">
|
||||
<PanelContainer VerticalExpand="True" Margin="10 10 10 10">
|
||||
<PanelContainer.PanelOverride>
|
||||
<gfx:StyleBoxFlat BackgroundColor="#1B1B1E"/>
|
||||
</PanelContainer.PanelOverride>
|
||||
<ScrollContainer
|
||||
HScrollEnabled="False"
|
||||
HorizontalExpand="True"
|
||||
VerticalExpand="True">
|
||||
<BoxContainer
|
||||
Name="RemoteDevicesDisplayContainer"
|
||||
Orientation="Vertical"
|
||||
VerticalExpand="True"
|
||||
Margin="10 10 10 0">
|
||||
</BoxContainer>
|
||||
</ScrollContainer>
|
||||
</PanelContainer>
|
||||
</BoxContainer>
|
||||
</controls:FancyWindow>
|
||||
@@ -0,0 +1,43 @@
|
||||
// SPDX-FileCopyrightText: 2025 GoobBot <uristmchands@proton.me>
|
||||
// SPDX-FileCopyrightText: 2025 ImHoks <imhokzzzz@gmail.com>
|
||||
// SPDX-FileCopyrightText: 2025 KillanGenifer <killangenifer@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
using Robust.Client.UserInterface.XAML;
|
||||
using FancyWindow = Content.Client.UserInterface.Controls.FancyWindow;
|
||||
using Robust.Client.AutoGenerated;
|
||||
using Content.Shared._CorvaxNext.Silicons.Borgs.Components;
|
||||
|
||||
namespace Content.Client._CorvaxNext.Silicons.Laws.Ui;
|
||||
|
||||
[GenerateTypedNameReferences]
|
||||
public sealed partial class RemoteDevicesMenu : FancyWindow
|
||||
{
|
||||
public event Action<RemoteDeviceActionEvent>? OnRemoteDeviceAction;
|
||||
|
||||
public RemoteDevicesMenu()
|
||||
{
|
||||
RobustXamlLoader.Load(this);
|
||||
}
|
||||
|
||||
public void Update(EntityUid uid, RemoteDevicesBuiState state)
|
||||
{
|
||||
RemoteDevicesDisplayContainer.Children.Clear();
|
||||
|
||||
if (state.DeviceList == null)
|
||||
return;
|
||||
|
||||
foreach (var device in state.DeviceList)
|
||||
{
|
||||
var control = new RemoteDeviceDisplay(device.NetEntityUid, device.DisplayName);
|
||||
|
||||
control.OnRemoteDeviceAction += action =>
|
||||
{
|
||||
OnRemoteDeviceAction?.Invoke(action);
|
||||
};
|
||||
|
||||
RemoteDevicesDisplayContainer.AddChild(control);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -121,8 +121,14 @@ public sealed partial class MechSystem : SharedMechSystem
|
||||
if (!TryComp<BatteryComponent>(ent.Comp.BatterySlot.ContainedEntity, out var battery))
|
||||
return;
|
||||
|
||||
ent.Comp.CriticalPowerState = battery.CurrentCharge / battery.MaxCharge <= 0.05f;
|
||||
//ent.Comp.CriticalPowerState = battery.CurrentCharge / battery.MaxCharge <= 0.05f;
|
||||
// Mono
|
||||
var criticalState = battery.CurrentCharge / battery.MaxCharge <= 0.05f;
|
||||
if (criticalState == ent.Comp.CriticalPowerState)
|
||||
return;
|
||||
|
||||
ent.Comp.CriticalPowerState = criticalState;
|
||||
// End Mono
|
||||
Dirty(ent);
|
||||
_movementSpeed.RefreshMovementSpeedModifiers(ent);
|
||||
}
|
||||
|
||||
@@ -35,12 +35,13 @@ public sealed class JetpackSystem : SharedJetpackSystem
|
||||
/// </summary>
|
||||
private void OnJetpackActivated(EntityUid uid, ActiveJetpackComponent component, ComponentStartup args)
|
||||
{
|
||||
if (TryComp<JetpackComponent>(uid, out var jetpack) && jetpack.Stealth == false)
|
||||
if (TryComp<JetpackComponent>(uid, out var jetpack) && jetpack.DetectionRange > 0)
|
||||
{
|
||||
var blip = EnsureComp<RadarBlipComponent>(uid);
|
||||
blip.Config.Color = Color.Cyan;
|
||||
blip.Config.Bounds = new(-0.25f, -0.25f, 0.25f, 0.25f);
|
||||
blip.VisibleFromOtherGrids = true;
|
||||
blip.MaxDistance = jetpack.DetectionRange;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -273,12 +273,20 @@ public sealed class MoverController : SharedMoverController
|
||||
// Mono: all below code handling shuttle movement has been heavily modified by Monolith
|
||||
//
|
||||
|
||||
/// <summary>
|
||||
/// Get a shuttle's torque.
|
||||
/// </summary>
|
||||
public float GetTorque(ShuttleComponent shuttle)
|
||||
{
|
||||
return shuttle.AngularThrust * shuttle.AngularMultiplier;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get a shuttle's angular acceleration.
|
||||
/// </summary>
|
||||
public float GetAngularAcceleration(ShuttleComponent shuttle, PhysicsComponent body)
|
||||
{
|
||||
return shuttle.AngularThrust * body.InvI;
|
||||
return GetTorque(shuttle) * body.InvI;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -302,7 +310,7 @@ public sealed class MoverController : SharedMoverController
|
||||
// prevent NaNs
|
||||
dir *= dir.X == 0 ? vertScale : dir.Y == 0 ? horizScale : MathF.Min(horizScale, vertScale);
|
||||
|
||||
return dir;
|
||||
return dir * shuttle.AccelerationMultiplier;
|
||||
}
|
||||
|
||||
public Vector2 GetDirectionAccel(Vector2 dir, ShuttleComponent shuttle, PhysicsComponent body)
|
||||
@@ -323,7 +331,7 @@ public sealed class MoverController : SharedMoverController
|
||||
var twr = thrust.Length() / body.Mass;
|
||||
var twrMult = MathF.Pow(twr / shuttle.BaseMaxVelocityTWR, shuttle.MaxVelocityScalingExponent);
|
||||
|
||||
return vel.Normalized() * MathF.Min(shuttle.BaseMaxLinearVelocity * twrMult, MathF.Min(shuttle.UpperMaxVelocity, shuttle.SetMaxVelocity));
|
||||
return vel.Normalized() * MathF.Min(shuttle.BaseMaxLinearVelocity * twrMult * shuttle.MaxVelMultiplier, MathF.Min(shuttle.UpperMaxVelocity, shuttle.SetMaxVelocity));
|
||||
}
|
||||
|
||||
private void HandleShuttleMovement(float frameTime)
|
||||
@@ -335,6 +343,9 @@ public sealed class MoverController : SharedMoverController
|
||||
// query all our pilots for input
|
||||
var toRemove = new List<EntityUid>();
|
||||
|
||||
var angularMul = 0f;
|
||||
var accelMul = 0f;
|
||||
var maxVelMul = 0f;
|
||||
foreach (var pilot in piloted.InputSources)
|
||||
{
|
||||
var inputsEv = new GetShuttleInputsEvent(frameTime, uid);
|
||||
@@ -343,7 +354,12 @@ public sealed class MoverController : SharedMoverController
|
||||
if (!inputsEv.GotInput)
|
||||
toRemove.Add(pilot);
|
||||
else if (inputsEv.Input != null)
|
||||
{
|
||||
inputs.Add(inputsEv.Input.Value);
|
||||
angularMul += inputsEv.AngularMul;
|
||||
accelMul += inputsEv.AccelMul;
|
||||
maxVelMul += inputsEv.MaxVelMul;
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var remUid in toRemove)
|
||||
@@ -359,6 +375,7 @@ public sealed class MoverController : SharedMoverController
|
||||
{
|
||||
_thruster.DisableLinearThrusters(shuttle);
|
||||
PhysicsSystem.SetSleepingAllowed(uid, body, true);
|
||||
shuttle.AngularMultiplier = shuttle.AccelerationMultiplier = shuttle.MaxVelMultiplier = 1f;
|
||||
continue;
|
||||
}
|
||||
PhysicsSystem.SetSleepingAllowed(uid, body, false);
|
||||
@@ -377,6 +394,13 @@ public sealed class MoverController : SharedMoverController
|
||||
angularInput /= count;
|
||||
brakeInput /= count;
|
||||
|
||||
angularMul /= count;
|
||||
accelMul /= count;
|
||||
maxVelMul /= count;
|
||||
shuttle.AngularMultiplier = angularMul;
|
||||
shuttle.AccelerationMultiplier = accelMul;
|
||||
shuttle.MaxVelMultiplier = maxVelMul;
|
||||
|
||||
var shuttleNorthAngle = _xformSystem.GetWorldRotation(uid);
|
||||
|
||||
// handle movement: brake
|
||||
@@ -524,7 +548,7 @@ public sealed class MoverController : SharedMoverController
|
||||
}
|
||||
else
|
||||
{
|
||||
var torque = shuttle.AngularThrust * -angularInput;
|
||||
var torque = GetTorque(shuttle) * -angularInput;
|
||||
|
||||
// Need to cap the velocity if 1 tick of input brings us over cap so we don't continuously
|
||||
// edge onto the cap over and over.
|
||||
|
||||
@@ -9,9 +9,10 @@ public record struct ShuttleInput(Vector2 Strafe, float Rotation, float Brakes);
|
||||
/// <summary>
|
||||
/// Raised on pilots to get inputs given to a shuttle.
|
||||
/// If GotInput is false, this piloted is removed from input sources.
|
||||
/// Also queries for multipliers to acceleration and max speed.
|
||||
/// </summary>
|
||||
[ByRefEvent]
|
||||
public record struct GetShuttleInputsEvent(float FrameTime, EntityUid ShuttleUid, ShuttleInput? Input = null, bool GotInput = false);
|
||||
public record struct GetShuttleInputsEvent(float FrameTime, EntityUid ShuttleUid, ShuttleInput? Input = null, bool GotInput = false, float AngularMul = 1f, float AccelMul = 1f, float MaxVelMul = 1f);
|
||||
|
||||
[ByRefEvent]
|
||||
public record struct PilotedShuttleRelayedEvent<TEvent>(TEvent Args);
|
||||
|
||||
@@ -105,6 +105,24 @@ namespace Content.Server.Shuttles.Components
|
||||
/// </summar>
|
||||
[DataField]
|
||||
public Vector2 LastThrust = Vector2.Zero;
|
||||
|
||||
/// <summary>
|
||||
/// Multiplier to angular thrust. Set depending on pilot.
|
||||
/// </summary
|
||||
[ViewVariables]
|
||||
public float AngularMultiplier = 1f;
|
||||
|
||||
/// <summary>
|
||||
/// Multiplier to linear thrust. Set depending on pilot.
|
||||
/// </summary
|
||||
[ViewVariables]
|
||||
public float AccelerationMultiplier = 1f;
|
||||
|
||||
/// <summary>
|
||||
/// Multiplier to max velocity. Set depending on pilot.
|
||||
/// </summary
|
||||
[ViewVariables]
|
||||
public float MaxVelMultiplier = 1f;
|
||||
// </Mono>
|
||||
}
|
||||
}
|
||||
|
||||
@@ -225,16 +225,19 @@ public sealed partial class ShuttleSystem
|
||||
var inelasticVel = totalInertia / (ourMass + otherMass);
|
||||
|
||||
// Mono Edit - partial credit to https://github.com/Sector-Crescent/Hullrot/pull/692
|
||||
//ShipShieldedComp is removed when shields are broken, only reduces energy delivered when shields are active. ShipShieldsSystem ln 256.
|
||||
//ShipShieldedComp is removed when shields are broken, reduces both energies when shields are active. ShipShieldsSystem ln 256.
|
||||
float shieldFactor = 1f;
|
||||
if (TryComp<ShipShieldedComponent>(args.OurEntity, out var ShipShieldedComponent) //Our ship collision resistance
|
||||
&& TryComp<ShipShieldEmitterComponent>(ShipShieldedComponent.Source, out var ShipShieldEmitterComponent)
|
||||
)
|
||||
toUsEnergy *= ShipShieldEmitterComponent.CollisionResistanceMultiplier;
|
||||
shieldFactor *= ShipShieldEmitterComponent.CollisionResistanceMultiplier;
|
||||
|
||||
if (TryComp<ShipShieldedComponent>(args.OtherEntity, out var OtherShipShieldedComponent) //Other ship collision resistance
|
||||
&& TryComp<ShipShieldEmitterComponent>(OtherShipShieldedComponent.Source, out var OtherShipShieldEmitterComponent)
|
||||
)
|
||||
toOtherEnergy *= OtherShipShieldEmitterComponent.CollisionResistanceMultiplier;
|
||||
shieldFactor *= OtherShipShieldEmitterComponent.CollisionResistanceMultiplier;
|
||||
toUsEnergy *= shieldFactor;
|
||||
toOtherEnergy *= shieldFactor;
|
||||
// Mono Edit end
|
||||
|
||||
DoGridImpact((args.OurEntity, ourGrid, ourXform, ourBody), args.OurFixture, inelasticVel, ourVelocity, ourTile, ourTiles, toUsEnergy);
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using Content.Server.Inventory;
|
||||
using Content.Server.Radio.Components;
|
||||
using Content.Shared._CorvaxNext.Silicons.Borgs.Components;
|
||||
using Content.Shared.Inventory;
|
||||
using Content.Shared.Silicons.Borgs;
|
||||
using Content.Shared.Silicons.Borgs.Components;
|
||||
@@ -28,6 +29,23 @@ public sealed class BorgSwitchableTypeSystem : SharedBorgSwitchableTypeSystem
|
||||
if (TryComp(ent, out ActiveRadioComponent? activeRadio))
|
||||
activeRadio.Channels = [.. radioChannels];
|
||||
|
||||
// Corvax-Next-AiRemoteControl-Start
|
||||
if (TryComp(ent, out AiRemoteControllerComponent? aiRemoteComp))
|
||||
{
|
||||
if (TryComp(aiRemoteComp.AiHolder, out IntrinsicRadioTransmitterComponent? stationAiTransmitter) && transmitter != null)
|
||||
{
|
||||
aiRemoteComp.PreviouslyTransmitterChannels = [.. radioChannels];
|
||||
transmitter.Channels = [.. stationAiTransmitter.Channels];
|
||||
}
|
||||
|
||||
if (TryComp(aiRemoteComp.AiHolder, out ActiveRadioComponent? stationAiActiveRadio) && activeRadio != null)
|
||||
{
|
||||
aiRemoteComp.PreviouslyActiveRadioChannels = [.. radioChannels];
|
||||
activeRadio.Channels = [.. stationAiActiveRadio.Channels];
|
||||
}
|
||||
}
|
||||
// Corvax-Next-AiRemoteControl-End
|
||||
|
||||
// Borg transponder for the robotics console
|
||||
if (TryComp(ent, out BorgTransponderComponent? transponder))
|
||||
{
|
||||
|
||||
@@ -6,7 +6,9 @@ using Content.Shared.Silicons.Borgs.Components;
|
||||
using Content.Shared.DeviceNetwork.Components;
|
||||
using Content.Shared.DeviceNetwork.Events;
|
||||
using Content.Shared.Emag.Systems;
|
||||
using Robust.Shared.Player;
|
||||
using Robust.Shared.Utility;
|
||||
using Content.Shared._CorvaxNext.Silicons.Borgs.Components; // Corvax-Next-AiRemoteControl
|
||||
|
||||
namespace Content.Server.Silicons.Borgs;
|
||||
|
||||
@@ -47,7 +49,8 @@ public sealed partial class BorgSystem
|
||||
charge,
|
||||
chassis.ModuleCount,
|
||||
hasBrain,
|
||||
canDisable);
|
||||
canDisable,
|
||||
HasComp<AiRemoteControllerComponent>(uid)); // Corvax-Next-AiRemoteControl
|
||||
|
||||
var payload = new NetworkPayload()
|
||||
{
|
||||
|
||||
@@ -5,6 +5,7 @@ using Content.Server.DeviceNetwork.Systems;
|
||||
using Content.Server.Explosion.EntitySystems;
|
||||
using Content.Server.Hands.Systems;
|
||||
using Content.Server.PowerCell;
|
||||
using Content.Shared._CorvaxNext.Silicons.Borgs.Components;
|
||||
using Content.Shared.UserInterface;
|
||||
using Content.Shared.Access;
|
||||
using Content.Shared.Access.Components;
|
||||
@@ -25,6 +26,8 @@ using Content.Shared.PowerCell.Components;
|
||||
using Content.Shared.Roles;
|
||||
using Content.Shared.Silicons.Borgs;
|
||||
using Content.Shared.Silicons.Borgs.Components;
|
||||
using Content.Shared.Silicons.StationAi;
|
||||
using Content.Shared.StationAi;
|
||||
using Content.Shared.Throwing;
|
||||
using Content.Shared.Whitelist;
|
||||
using Content.Shared.Wires;
|
||||
@@ -144,6 +147,21 @@ public sealed partial class BorgSystem : SharedBorgSystem
|
||||
args.Handled = true;
|
||||
UpdateUI(uid, component);
|
||||
}
|
||||
|
||||
// Corvax-Next-AiRemoteControl-Start
|
||||
if (component.BrainEntity == null && HasComp<AiRemoteBrainComponent>(used) &&
|
||||
_whitelistSystem.IsWhitelistPassOrNull(component.BrainWhitelist, used))
|
||||
{
|
||||
EnsureComp<AiRemoteControllerComponent>(uid);
|
||||
_container.Insert(used, component.BrainContainer);
|
||||
_adminLog.Add(LogType.Action, LogImpact.Medium,
|
||||
$"{ToPrettyString(args.User):player} installed ai remote brain {ToPrettyString(used)} into borg {ToPrettyString(uid)}");
|
||||
args.Handled = true;
|
||||
BorgActivate(uid, component);
|
||||
|
||||
UpdateUI(uid, component);
|
||||
}
|
||||
// Corvax-Next-AiRemoteControl-End
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -178,6 +196,15 @@ public sealed partial class BorgSystem : SharedBorgSystem
|
||||
{
|
||||
_mind.TransferTo(mindId, args.Entity, mind: mind);
|
||||
}
|
||||
|
||||
// Corvax-Next-AiRemoteControl-Start
|
||||
if (HasComp<AiRemoteBrainComponent>(args.Entity))
|
||||
{
|
||||
BorgDeactivate(uid, component);
|
||||
RemComp<AiRemoteControllerComponent>(uid);
|
||||
RemComp<StationAiVisionComponent>(uid);
|
||||
}
|
||||
// Corvax-Next-AiRemoteControl-End
|
||||
}
|
||||
|
||||
private void OnMindAdded(EntityUid uid, BorgChassisComponent component, MindAddedMessage args)
|
||||
|
||||
@@ -4,6 +4,7 @@ using Content.Server.Chat.Managers;
|
||||
using Content.Server.Radio.Components;
|
||||
using Content.Server.Roles;
|
||||
using Content.Server.Station.Systems;
|
||||
using Content.Shared._CorvaxNext.Silicons.Borgs.Components; // Corvax-Next-AiRemoteControl
|
||||
using Content.Shared.Administration;
|
||||
using Content.Shared.Chat;
|
||||
using Content.Shared.Emag.Systems;
|
||||
@@ -13,6 +14,9 @@ using Content.Shared.Mind.Components;
|
||||
using Content.Shared.Roles;
|
||||
using Content.Shared.Silicons.Laws;
|
||||
using Content.Shared.Silicons.Laws.Components;
|
||||
using Content.Shared.Silicons.StationAi; // Corvax-Next-AiRemoteControl
|
||||
using Content.Shared.Tag; // Corvax-Next-AiRemoteControl
|
||||
using Content.Shared.Wires;
|
||||
using Robust.Server.GameObjects;
|
||||
using Robust.Shared.Audio;
|
||||
using Robust.Shared.Containers;
|
||||
@@ -33,6 +37,7 @@ public sealed class SiliconLawSystem : SharedSiliconLawSystem
|
||||
[Dependency] private readonly StationSystem _station = default!;
|
||||
[Dependency] private readonly UserInterfaceSystem _userInterface = default!;
|
||||
[Dependency] private readonly EmagSystem _emag = default!;
|
||||
[Dependency] private readonly TagSystem _tagSystem = default!; // Corvax-Next-AiRemoteControl
|
||||
[Dependency] private readonly IMapManager _map = default!; // Mono - Law update is grid-only now.
|
||||
|
||||
/// <inheritdoc/>
|
||||
@@ -63,6 +68,12 @@ public sealed class SiliconLawSystem : SharedSiliconLawSystem
|
||||
if (!TryComp<ActorComponent>(uid, out var actor))
|
||||
return;
|
||||
|
||||
// Corvax-Next-AiRemoteControl-Start
|
||||
if (HasComp<AiRemoteControllerComponent>(uid)
|
||||
|| _tagSystem.HasTag(uid, "StationAi")) // skip a law's notification for remotable and AI
|
||||
return;
|
||||
// Corvax-Next-AiRemoteControl-End
|
||||
|
||||
var msg = Loc.GetString("laws-notify");
|
||||
var wrappedMessage = Loc.GetString("chat-manager-server-wrap-message", ("message", msg));
|
||||
_chatManager.ChatMessageToOne(ChatChannel.Server, msg, wrappedMessage, default, false, actor.PlayerSession.Channel, colorOverride: Color.FromHex("#5ed7aa"));
|
||||
@@ -155,6 +166,11 @@ public sealed class SiliconLawSystem : SharedSiliconLawSystem
|
||||
if (component.Lawset == null)
|
||||
component.Lawset = GetLawset(component.Laws);
|
||||
|
||||
// Corvax-Next-AiRemoteControl-Start
|
||||
if (HasComp<AiRemoteControllerComponent>(uid)) // You can't emag controllable entities
|
||||
return;
|
||||
// Corvax-Next-AiRemoteControl-End
|
||||
|
||||
// Show the silicon has been subverted.
|
||||
component.Subverted = true;
|
||||
|
||||
@@ -281,7 +297,7 @@ public sealed class SiliconLawSystem : SharedSiliconLawSystem
|
||||
/// <summary>
|
||||
/// Set the laws of a silicon entity while notifying the player.
|
||||
/// </summary>
|
||||
public void SetLaws(List<SiliconLaw> newLaws, EntityUid target, SoundSpecifier? cue = null)
|
||||
public void SetLaws(List<SiliconLaw> newLaws, EntityUid target, SoundSpecifier? cue = null, bool silent = false) // AiRemoteControl - silent
|
||||
{
|
||||
if (!TryComp<SiliconLawProviderComponent>(target, out var component))
|
||||
return;
|
||||
@@ -290,7 +306,8 @@ public sealed class SiliconLawSystem : SharedSiliconLawSystem
|
||||
component.Lawset = new SiliconLawset();
|
||||
|
||||
component.Lawset.Laws = newLaws;
|
||||
NotifyLawsChanged(target, cue);
|
||||
if (!silent) // AiRemoteControl - silent
|
||||
NotifyLawsChanged(target, cue);
|
||||
}
|
||||
|
||||
protected override void OnUpdaterInsert(Entity<SiliconLawUpdaterComponent> ent, ref EntInsertedIntoContainerMessage args)
|
||||
@@ -312,8 +329,16 @@ public sealed class SiliconLawSystem : SharedSiliconLawSystem
|
||||
continue;
|
||||
|
||||
SetLaws(lawset, update, provider.LawUploadSound);
|
||||
// Mono edit end
|
||||
// Corvax-Next-AiRemoteControl-Start
|
||||
if (TryComp<StationAiHeldComponent>(update, out var stationAiHeldComp)
|
||||
&& stationAiHeldComp.CurrentConnectedEntity != null
|
||||
&& HasComp<SiliconLawProviderComponent>(stationAiHeldComp.CurrentConnectedEntity))
|
||||
{
|
||||
SetLaws(lawset, stationAiHeldComp.CurrentConnectedEntity.Value, provider.LawUploadSound);
|
||||
}
|
||||
// Corvax-Next-AiRemoteControl-End
|
||||
}
|
||||
// Mono edit end
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -346,11 +346,11 @@ namespace Content.Server.VendingMachines
|
||||
if (TryComp<MarketModifierComponent>(component.Owner, out var modifier))
|
||||
price *= modifier.Mod;
|
||||
|
||||
var totalPrice = (int) price;
|
||||
var totalPrice = component.RequiresCash ? (int) price : 0;
|
||||
|
||||
// If any price has a vendor price, explicitly use its value - higher OR lower, over others.
|
||||
var priceVend = _pricing.GetEstimatedVendPrice(proto);
|
||||
if (priceVend > 0.0) // if vending price exists, overwrite it.
|
||||
if (priceVend > 0.0 && component.RequiresCash) // if vending price exists, overwrite it.
|
||||
totalPrice = (int) priceVend;
|
||||
|
||||
if (IsAuthorized(uid, sender, component))
|
||||
|
||||
@@ -0,0 +1,208 @@
|
||||
// SPDX-FileCopyrightText: 2025 GoobBot <uristmchands@proton.me>
|
||||
// SPDX-FileCopyrightText: 2025 ImHoks <142083149+ImHoks@users.noreply.github.com>
|
||||
// SPDX-FileCopyrightText: 2025 ImHoks <imhokzzzz@gmail.com>
|
||||
// SPDX-FileCopyrightText: 2025 KillanGenifer <killangenifer@gmail.com>
|
||||
// SPDX-FileCopyrightText: 2025 gluesniffler <159397573+gluesniffler@users.noreply.github.com>
|
||||
//
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
using Content.Server.Radio.Components;
|
||||
using Content.Server.Silicons.Laws;
|
||||
using Content.Shared._CorvaxNext.Silicons.Borgs;
|
||||
using Content.Shared._CorvaxNext.Silicons.Borgs.Components;
|
||||
using Content.Shared.Actions;
|
||||
using Content.Shared.Mind;
|
||||
using Content.Shared.Silicons.Laws.Components;
|
||||
using Content.Shared.Silicons.StationAi;
|
||||
using Content.Shared.StationAi;
|
||||
using Content.Shared.Verbs;
|
||||
using Robust.Shared.Map; // Mono
|
||||
using Robust.Server.GameObjects;
|
||||
using Robust.Shared.Player;
|
||||
using System.Threading.Tasks.Dataflow;
|
||||
|
||||
namespace Content.Server._CorvaxNext.Silicons.Borgs;
|
||||
|
||||
public sealed class AiRemoteControlSystem : SharedAiRemoteControlSystem
|
||||
{
|
||||
[Dependency] private readonly SharedActionsSystem _actions = default!;
|
||||
[Dependency] private readonly SiliconLawSystem _lawSystem = default!;
|
||||
[Dependency] private readonly SharedStationAiSystem _stationAiSystem = default!;
|
||||
[Dependency] private readonly SharedMindSystem _mind = default!;
|
||||
[Dependency] private readonly UserInterfaceSystem _userInterface = default!;
|
||||
[Dependency] private readonly SharedTransformSystem _xformSystem = default!;
|
||||
|
||||
[Dependency] private readonly IMapManager _map = default!; // Mono
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<AiRemoteControllerComponent, ReturnMindIntoAiEvent>(OnReturnMindIntoAi);
|
||||
SubscribeLocalEvent<AiRemoteControllerComponent, MapInitEvent>(OnMapInit);
|
||||
SubscribeLocalEvent<AiRemoteControllerComponent, ComponentShutdown>(OnShutdown);
|
||||
SubscribeLocalEvent<AiRemoteControllerComponent, GetVerbsEvent<AlternativeVerb>>(OnGetVerbs);
|
||||
SubscribeLocalEvent<StationAiHeldComponent, AiRemoteControllerComponent.RemoteDeviceActionMessage>(OnUiRemoteAction);
|
||||
SubscribeLocalEvent<StationAiHeldComponent, ToggleRemoteDevicesScreenEvent>(OnToggleRemoteDevicesScreen);
|
||||
}
|
||||
|
||||
private void OnMapInit(Entity<AiRemoteControllerComponent> entity, ref MapInitEvent args)
|
||||
{
|
||||
var visionComp = EnsureComp<StationAiVisionComponent>(entity.Owner);
|
||||
EntityUid? actionEnt = null;
|
||||
|
||||
_actions.AddAction(entity.Owner, ref actionEnt, entity.Comp.BackToAiAction);
|
||||
|
||||
if (actionEnt != null)
|
||||
entity.Comp.BackToAiActionEntity = actionEnt.Value;
|
||||
}
|
||||
|
||||
private void OnShutdown(Entity<AiRemoteControllerComponent> entity, ref ComponentShutdown args)
|
||||
{
|
||||
_actions.RemoveAction(entity.Owner, entity.Comp.BackToAiActionEntity);
|
||||
|
||||
var backArgs = new ReturnMindIntoAiEvent();
|
||||
backArgs.Performer = entity;
|
||||
|
||||
if (TryComp(entity, out IntrinsicRadioTransmitterComponent? transmitter)
|
||||
&& entity.Comp.PreviouslyTransmitterChannels != null)
|
||||
transmitter.Channels = [.. entity.Comp.PreviouslyTransmitterChannels];
|
||||
|
||||
if (TryComp(entity, out ActiveRadioComponent? activeRadio)
|
||||
&& entity.Comp.PreviouslyActiveRadioChannels != null)
|
||||
activeRadio.Channels = [.. entity.Comp.PreviouslyActiveRadioChannels];
|
||||
|
||||
ReturnMindIntoAi(entity);
|
||||
}
|
||||
|
||||
private void OnGetVerbs(Entity<AiRemoteControllerComponent> entity, ref GetVerbsEvent<AlternativeVerb> args)
|
||||
{
|
||||
var user = args.User;
|
||||
|
||||
if (!TryComp<StationAiHeldComponent>(user, out var stationAiHeldComp))
|
||||
return;
|
||||
|
||||
var verb = new AlternativeVerb
|
||||
{
|
||||
Text = Loc.GetString("ai-remote-control"),
|
||||
Act = () => AiTakeControl(user, entity)
|
||||
};
|
||||
args.Verbs.Add(verb);
|
||||
}
|
||||
|
||||
private void OnReturnMindIntoAi(Entity<AiRemoteControllerComponent> entity, ref ReturnMindIntoAiEvent args) =>
|
||||
ReturnMindIntoAi(entity);
|
||||
|
||||
public void AiTakeControl(EntityUid ai, EntityUid entity)
|
||||
{
|
||||
if (!_mind.TryGetMind(ai, out var mindId, out var mind))
|
||||
return;
|
||||
|
||||
if (!TryComp<StationAiHeldComponent>(ai, out var stationAiHeldComp))
|
||||
return;
|
||||
|
||||
if (!TryComp<AiRemoteControllerComponent>(entity, out var aiRemoteComp))
|
||||
return;
|
||||
|
||||
if (!_map.TryFindGridAt(Transform(ai).MapPosition, out var grid, out var _) || Transform(entity).GridUid != grid)
|
||||
return; // Mono no controlling borgs outside the ai's grid.
|
||||
|
||||
if (TryComp(entity, out IntrinsicRadioTransmitterComponent? transmitter))
|
||||
{
|
||||
aiRemoteComp.PreviouslyTransmitterChannels = [.. transmitter.Channels];
|
||||
|
||||
if (TryComp(ai, out IntrinsicRadioTransmitterComponent? stationAiTransmitter))
|
||||
transmitter.Channels = [.. stationAiTransmitter.Channels];
|
||||
}
|
||||
|
||||
if (TryComp(entity, out ActiveRadioComponent? activeRadio))
|
||||
{
|
||||
aiRemoteComp.PreviouslyActiveRadioChannels = [.. activeRadio.Channels];
|
||||
|
||||
if (TryComp(ai, out ActiveRadioComponent? stationAiActiveRadio))
|
||||
activeRadio.Channels = [.. stationAiActiveRadio.Channels];
|
||||
}
|
||||
|
||||
_mind.ControlMob(ai, entity);
|
||||
aiRemoteComp.AiHolder = ai;
|
||||
aiRemoteComp.LinkedMind = mindId;
|
||||
|
||||
stationAiHeldComp.CurrentConnectedEntity = entity;
|
||||
|
||||
if (!_stationAiSystem.TryGetCore(ai, out var stationAiCore))
|
||||
return;
|
||||
|
||||
_stationAiSystem.SwitchRemoteEntityMode(stationAiCore, false);
|
||||
|
||||
RewriteLaws(ai, entity);
|
||||
}
|
||||
|
||||
private void OnToggleRemoteDevicesScreen(EntityUid uid, StationAiHeldComponent component, ToggleRemoteDevicesScreenEvent args)
|
||||
{
|
||||
if (args.Handled || !TryComp<ActorComponent>(uid, out var actor))
|
||||
return;
|
||||
args.Handled = true;
|
||||
|
||||
_userInterface.TryToggleUi(uid, RemoteDeviceUiKey.Key, actor.PlayerSession);
|
||||
|
||||
var aiGrid = Transform(uid).GridUid; // Mono
|
||||
var query = EntityManager.EntityQueryEnumerator<AiRemoteControllerComponent>();
|
||||
var remoteDevices = new List<RemoteDevicesData>();
|
||||
|
||||
while (query.MoveNext(out var queryUid, out var comp))
|
||||
{
|
||||
if (Transform(queryUid).GridUid != aiGrid)
|
||||
continue;
|
||||
var data = new RemoteDevicesData
|
||||
{
|
||||
NetEntityUid = GetNetEntity(queryUid),
|
||||
DisplayName = Comp<MetaDataComponent>(queryUid).EntityName
|
||||
};
|
||||
|
||||
remoteDevices.Add(data);
|
||||
}
|
||||
|
||||
var state = new RemoteDevicesBuiState(remoteDevices);
|
||||
_userInterface.SetUiState(uid, RemoteDeviceUiKey.Key, state);
|
||||
}
|
||||
|
||||
private void OnUiRemoteAction(EntityUid uid, StationAiHeldComponent component, AiRemoteControllerComponent.RemoteDeviceActionMessage msg)
|
||||
{
|
||||
if (msg.RemoteAction == null)
|
||||
return;
|
||||
|
||||
var target = GetEntity(msg.RemoteAction?.Target);
|
||||
|
||||
if (!HasComp<AiRemoteControllerComponent>(target))
|
||||
return;
|
||||
|
||||
switch (msg.RemoteAction?.ActionType)
|
||||
{
|
||||
case RemoteDeviceActionEvent.RemoteDeviceActionType.MoveToDevice:
|
||||
if (!_stationAiSystem.TryGetCore(uid, out var stationAiCore)
|
||||
|| stationAiCore.Comp?.RemoteEntity == null)
|
||||
return;
|
||||
_xformSystem.SetCoordinates(stationAiCore.Comp.RemoteEntity.Value, Transform(target.Value).Coordinates);
|
||||
break;
|
||||
|
||||
case RemoteDeviceActionEvent.RemoteDeviceActionType.TakeControl:
|
||||
AiTakeControl(uid, target.Value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void RewriteLaws(EntityUid from, EntityUid to)
|
||||
{
|
||||
if (!TryComp<SiliconLawProviderComponent>(from, out var fromLawsComp))
|
||||
return;
|
||||
|
||||
if (!TryComp<SiliconLawProviderComponent>(to, out var toLawsComp))
|
||||
return;
|
||||
|
||||
if (fromLawsComp.Lawset == null)
|
||||
return;
|
||||
|
||||
var fromLaws = _lawSystem.GetLaws(from);
|
||||
_lawSystem.SetLaws(fromLaws.Laws, to, silent: true);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
using System.Linq;
|
||||
using Content.Server._Mono.Grid;
|
||||
using Content.Server.Administration;
|
||||
using Content.Shared._Mono.Grid;
|
||||
using Content.Shared.Administration;
|
||||
using Robust.Shared.Console;
|
||||
using Robust.Shared.Map.Components;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Server._Mono.Administration.Commands;
|
||||
|
||||
/// <summary>
|
||||
/// Command that allows you to apply grid modifiers to existing grids
|
||||
/// </summary>
|
||||
[AdminCommand(AdminFlags.Admin)]
|
||||
public sealed class AddGridModifier : IConsoleCommand
|
||||
{
|
||||
[Dependency] private readonly IEntityManager _entManager = default!;
|
||||
|
||||
public string Command => "addgridmodifier";
|
||||
public string Description => "Applies grid modification to chosen grid.";
|
||||
public string Help => $"Usage: {Command} <gridUid> <modification...>";
|
||||
public void Execute(IConsoleShell shell, string argStr, string[] args)
|
||||
{
|
||||
|
||||
if (args.Length < 2)
|
||||
shell.WriteLine($"Not enough arguments.\n{Help}");
|
||||
|
||||
if (!NetEntity.TryParse(args[0], out var uidNet) || !_entManager.TryGetEntity(uidNet, out var uid))
|
||||
{
|
||||
shell.WriteLine($"Invalid entity id.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!_entManager.TryGetComponent(uid, out MapGridComponent? map))
|
||||
{
|
||||
shell.WriteLine($"Entity is not a grid.");
|
||||
return;
|
||||
}
|
||||
|
||||
List<ProtoId<GridModificationPrototype>> modifiers = [];
|
||||
var gridMod = _entManager.System<GridModifierSystem>();
|
||||
|
||||
foreach (var mod in args.Skip(1))
|
||||
{
|
||||
modifiers.Add(mod);
|
||||
}
|
||||
|
||||
gridMod.ModifyGrid(uid.Value, modifiers);
|
||||
}
|
||||
}
|
||||
@@ -9,7 +9,6 @@ using Content.Shared.Weapons.Ranged.Components;
|
||||
using Content.Shared.Weapons.Ranged.Systems;
|
||||
using Robust.Shared.Map.Components;
|
||||
using Robust.Shared.Timing;
|
||||
using System;
|
||||
|
||||
namespace Content.Server._Mono.Detection;
|
||||
|
||||
@@ -21,18 +20,22 @@ public sealed class ThermalSignatureSystem : EntitySystem
|
||||
[Dependency] private readonly SharedPowerReceiverSystem _power = default!;
|
||||
[Dependency] private readonly IGameTiming _timing = default!;
|
||||
|
||||
private float _updateInterval = 0.5f;
|
||||
private float _updateAccumulator = 0f;
|
||||
private EntityQuery<MapGridComponent> _gridQuery;
|
||||
private const float UpdateIntervalSeconds = 1f;
|
||||
private static readonly TimeSpan UpdateInterval = TimeSpan.FromSeconds(UpdateIntervalSeconds);
|
||||
private TimeSpan _nextUpdateTime;
|
||||
|
||||
private const float HeatChangeThreshold = 1.02f;
|
||||
|
||||
private EntityQuery<ThermalSignatureComponent> _sigQuery;
|
||||
private EntityQuery<GunComponent> _gunQuery;
|
||||
|
||||
private Dictionary<EntityUid, ThermalSignatureComponent> _gridCompMap = new();
|
||||
private EntityQuery<MapGridComponent> _mapGridQuery;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<GridInitializeEvent>(OnGridInitialized);
|
||||
|
||||
// some of this could also be handled in shared but there's no point since PVS is a thing
|
||||
SubscribeLocalEvent<MachineThermalSignatureComponent, GetThermalSignatureEvent>(OnMachineGetSignature);
|
||||
SubscribeLocalEvent<PassiveThermalSignatureComponent, GetThermalSignatureEvent>(OnPassiveGetSignature);
|
||||
@@ -42,9 +45,14 @@ public sealed class ThermalSignatureSystem : EntitySystem
|
||||
SubscribeLocalEvent<ThrusterComponent, GetThermalSignatureEvent>(OnThrusterGetSignature);
|
||||
SubscribeLocalEvent<FTLDriveComponent, GetThermalSignatureEvent>(OnFTLGetSignature);
|
||||
|
||||
_gridQuery = GetEntityQuery<MapGridComponent>();
|
||||
_sigQuery = GetEntityQuery<ThermalSignatureComponent>();
|
||||
_gunQuery = GetEntityQuery<GunComponent>();
|
||||
_mapGridQuery = GetEntityQuery<MapGridComponent>();
|
||||
}
|
||||
|
||||
private void OnGridInitialized(GridInitializeEvent args)
|
||||
{
|
||||
EnsureComp<ThermalSignatureComponent>(args.EntityUid);
|
||||
}
|
||||
|
||||
private void OnGunShot(Entity<ThermalSignatureComponent> ent, ref GunShotEvent args)
|
||||
@@ -87,48 +95,45 @@ public sealed class ThermalSignatureSystem : EntitySystem
|
||||
|
||||
public override void Update(float frameTime)
|
||||
{
|
||||
_updateAccumulator += frameTime;
|
||||
if (_updateAccumulator < _updateInterval)
|
||||
if (_timing.CurTime < _nextUpdateTime)
|
||||
return;
|
||||
_updateAccumulator -= _updateInterval;
|
||||
|
||||
var interval = _updateInterval;
|
||||
_nextUpdateTime = _timing.CurTime + UpdateInterval;
|
||||
|
||||
_gridCompMap.Clear();
|
||||
|
||||
var gridQuery = EntityQueryEnumerator<MapGridComponent>();
|
||||
while (gridQuery.MoveNext(out var uid, out _))
|
||||
var gridQuery = EntityQueryEnumerator<MapGridComponent, ThermalSignatureComponent>();
|
||||
while (gridQuery.MoveNext(out _, out _, out var gridSigComp))
|
||||
{
|
||||
if (!_sigQuery.TryComp(uid, out var sigComp))
|
||||
sigComp = EnsureComp<ThermalSignatureComponent>(uid);
|
||||
|
||||
sigComp.TotalHeat = 0f;
|
||||
_gridCompMap.Add(uid, sigComp);
|
||||
gridSigComp.TotalHeat = 0f;
|
||||
}
|
||||
|
||||
var query = EntityQueryEnumerator<ThermalSignatureComponent>();
|
||||
while (query.MoveNext(out var uid, out var sigComp))
|
||||
{
|
||||
var ev = new GetThermalSignatureEvent(interval);
|
||||
var ev = new GetThermalSignatureEvent();
|
||||
RaiseLocalEvent(uid, ref ev);
|
||||
sigComp.StoredHeat += ev.Signature * interval;
|
||||
sigComp.StoredHeat *= MathF.Pow(sigComp.HeatDissipation, interval);
|
||||
if (_gridCompMap.ContainsKey(uid))
|
||||
|
||||
sigComp.StoredHeat += ev.Signature * UpdateIntervalSeconds;
|
||||
sigComp.StoredHeat *= MathF.Pow(sigComp.HeatDissipation, UpdateIntervalSeconds);
|
||||
|
||||
if (_mapGridQuery.HasComp(uid))
|
||||
{
|
||||
sigComp.TotalHeat += sigComp.StoredHeat;
|
||||
|
||||
// don't sync it if it didn't change heat much since last time, we don't need to sync 500 cold asteroids every system update
|
||||
if (sigComp.TotalHeat <= sigComp.LastUpdateHeat * HeatChangeThreshold
|
||||
&& sigComp.TotalHeat >= sigComp.LastUpdateHeat / HeatChangeThreshold)
|
||||
continue;
|
||||
|
||||
sigComp.LastUpdateHeat = sigComp.TotalHeat;
|
||||
Dirty(uid, sigComp);
|
||||
}
|
||||
else
|
||||
{
|
||||
var xform = Transform(uid);
|
||||
sigComp.TotalHeat = sigComp.StoredHeat;
|
||||
if (xform.GridUid != null && _gridCompMap.TryGetValue(xform.GridUid.Value, out var gridSig))
|
||||
if (xform.GridUid != null && _sigQuery.TryGetComponent(xform.GridUid.Value, out var gridSig))
|
||||
gridSig.TotalHeat += sigComp.StoredHeat;
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var (uid, sigComp) in _gridCompMap)
|
||||
{
|
||||
Dirty(uid, sigComp); // sync to client
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
using Content.Shared._Mono.Grid;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Server._Mono.Grid;
|
||||
|
||||
[RegisterComponent]
|
||||
public sealed partial class GridModifierComponent : Component
|
||||
{
|
||||
[DataField]
|
||||
public List<ProtoId<GridModificationPrototype>> Modifications = [];
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
using Content.Shared._Mono.Grid;
|
||||
using Content.Shared._Mono.ShipRepair;
|
||||
using Robust.Shared.Map.Components;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Server._Mono.Grid;
|
||||
|
||||
/// <summary>
|
||||
/// This handles grid modification on initialization.
|
||||
/// </summary>
|
||||
public sealed class GridModifierSystem : SharedGridModifierSystem
|
||||
{
|
||||
[Dependency] private readonly IPrototypeManager _protoMan = default!;
|
||||
[Dependency] private readonly IComponentFactory _factory = default!;
|
||||
[Dependency] private readonly SharedShipRepairSystem _repair = default!;
|
||||
|
||||
private List<EntityUid> _snapQueue = [];
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
SubscribeLocalEvent<GridModifierComponent, MapInitEvent>(OnInit);
|
||||
}
|
||||
|
||||
public override void Update(float frameTime)
|
||||
{
|
||||
foreach (var uid in _snapQueue)
|
||||
{
|
||||
_repair.GenerateRepairData(uid);
|
||||
}
|
||||
_snapQueue.Clear();
|
||||
}
|
||||
|
||||
private void OnInit(EntityUid uid, GridModifierComponent component, MapInitEvent args)
|
||||
{
|
||||
ModifyGrid(uid, component.Modifications);
|
||||
}
|
||||
|
||||
public void ModifyGrid(EntityUid uid, List<ProtoId<GridModificationPrototype>> modifiers)
|
||||
{
|
||||
if (!HasComp<MapGridComponent>(uid))
|
||||
return;
|
||||
|
||||
foreach (var modProto in modifiers)
|
||||
{
|
||||
if (!_protoMan.TryIndex(modProto, out var mod))
|
||||
continue;
|
||||
|
||||
foreach (var modifier in mod.Modifiers)
|
||||
{
|
||||
modifier.Modify(uid, EntityManager, _factory);
|
||||
}
|
||||
}
|
||||
|
||||
_snapQueue.Add(uid);
|
||||
}
|
||||
}
|
||||
@@ -107,7 +107,8 @@ public sealed partial class RadarBlipSystem : EntitySystem
|
||||
if (blipGrid != null)
|
||||
{
|
||||
var gridXform = Transform(blipGrid.Value);
|
||||
blipVelocity -= _physics.GetLinearVelocity(blipGrid.Value, coord.Position);
|
||||
if (TryComp<PhysicsComponent>(blipGrid.Value, out var gridBody)) // prevent log spam
|
||||
blipVelocity -= _physics.GetLinearVelocity(blipGrid.Value, coord.Position, gridBody);
|
||||
// it's local-frame velocity so rotate it too
|
||||
blipVelocity = (-gridXform.LocalRotation).RotateVec(blipVelocity);
|
||||
// and also offset the rotation
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
namespace Content.Server._Mono.Shuttles.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Modifies how shuttles piloted by this entity drive.
|
||||
/// </summary>
|
||||
[RegisterComponent]
|
||||
public sealed partial class ShuttleBoostingPilotComponent : Component
|
||||
{
|
||||
[DataField]
|
||||
public float AngularMultiplier = 1f;
|
||||
|
||||
[DataField]
|
||||
public float AccelerationMultiplier = 1f;
|
||||
|
||||
[DataField]
|
||||
public float MaxVelMultiplier = 1f;
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
using Content.Server._Mono.Shuttles.Components;
|
||||
using Content.Server.Physics.Controllers;
|
||||
|
||||
namespace Content.Server._Mono.Shuttles.Systems;
|
||||
|
||||
public sealed partial class ShuttleBoostingPilotSystem : EntitySystem
|
||||
{
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<ShuttleBoostingPilotComponent, GetShuttleInputsEvent>(OnGetInputs);
|
||||
}
|
||||
|
||||
private void OnGetInputs(Entity<ShuttleBoostingPilotComponent> ent, ref GetShuttleInputsEvent args)
|
||||
{
|
||||
args.AngularMul *= ent.Comp.AngularMultiplier;
|
||||
args.AccelMul *= ent.Comp.AccelerationMultiplier;
|
||||
args.MaxVelMul *= ent.Comp.MaxVelMultiplier;
|
||||
}
|
||||
}
|
||||
@@ -16,7 +16,7 @@ public sealed partial class GridSpawnerComponent : Component
|
||||
[DataField]
|
||||
public ProtoId<LocalizedDatasetPrototype>? NameDataset = null;
|
||||
|
||||
[DataField]
|
||||
[DataField, AlwaysPushInheritance]
|
||||
public ComponentRegistry AddComponents = new();
|
||||
|
||||
[DataField]
|
||||
|
||||
@@ -38,7 +38,6 @@ public sealed class VendingMachinePurchaseSystem : EntitySystem
|
||||
var purchaseComponent = AddComp<VendingMachinePurchaseComponent>(purchasedEntity);
|
||||
purchaseComponent.PurchaseGrid = vendingTransform.GridUid.Value;
|
||||
purchaseComponent.OriginalPurchasePrice = purchasePrice;
|
||||
purchaseComponent.VendingMachine = vendingMachine;
|
||||
|
||||
Dirty(purchasedEntity, purchaseComponent);
|
||||
}
|
||||
|
||||
@@ -177,7 +177,7 @@ public sealed class LinkedLifecycleGridSystem : EntitySystem
|
||||
// Deletes a grid, reparenting every humanoid and player character that's on it.
|
||||
public void UnparentPlayersFromGrid(EntityUid grid, bool deleteGrid, bool ignoreLifeStage = false)
|
||||
{
|
||||
if (!ignoreLifeStage && MetaData(grid).EntityLifeStage >= EntityLifeStage.Terminating)
|
||||
if (!ignoreLifeStage && TerminatingOrDeleted(grid))
|
||||
return;
|
||||
|
||||
var reparentEntities = GetEntitiesToReparent(grid);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using Robust.Shared.GameStates;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
|
||||
using Content.Shared._Mono.Radar;
|
||||
|
||||
namespace Content.Shared.Movement.Components;
|
||||
|
||||
@@ -27,8 +28,8 @@ public sealed partial class JetpackComponent : Component
|
||||
public float WeightlessModifier = 1.2f;
|
||||
|
||||
/// <summary>
|
||||
/// Mono - Determines whether a jetpack shows up on blip radar.
|
||||
/// Mono - Determines the range that a jetpack shows up on blip radar.
|
||||
/// </summary>
|
||||
[ViewVariables(VVAccess.ReadWrite), DataField("stealth")]
|
||||
public bool Stealth = false;
|
||||
[ViewVariables(VVAccess.ReadWrite), DataField]
|
||||
public float DetectionRange = 256f;
|
||||
}
|
||||
|
||||
@@ -131,6 +131,10 @@ namespace Content.Shared.Movement.Systems
|
||||
|
||||
private void OnMoverGetState(Entity<InputMoverComponent> entity, ref ComponentGetState args)
|
||||
{
|
||||
// Mono
|
||||
if (TerminatingOrDeleted(entity.Comp.RelativeEntity))
|
||||
entity.Comp.RelativeEntity = null;
|
||||
|
||||
args.State = new InputMoverComponentState()
|
||||
{
|
||||
CanMove = entity.Comp.CanMove,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Serialization;
|
||||
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
|
||||
using Robust.Shared.Utility;
|
||||
@@ -111,7 +111,12 @@ public partial record struct CyborgControlData
|
||||
[DataField(customTypeSerializer: typeof(TimeOffsetSerializer))]
|
||||
public TimeSpan Timeout = TimeSpan.Zero;
|
||||
|
||||
public CyborgControlData(SpriteSpecifier? chassisSprite, string chassisName, string name, float charge, int moduleCount, bool hasBrain, bool canDisable)
|
||||
// Corvax-Next-AiRemoteControl-Start
|
||||
[DataField]
|
||||
public bool IsAiControllable;
|
||||
// Corvax-Next-AiRemoteControl-End
|
||||
|
||||
public CyborgControlData(SpriteSpecifier? chassisSprite, string chassisName, string name, float charge, int moduleCount, bool hasBrain, bool canDisable, bool isAiControllable) // Corvax-Next-AiRemoteControl
|
||||
{
|
||||
ChassisSprite = chassisSprite;
|
||||
ChassisName = chassisName;
|
||||
@@ -120,6 +125,7 @@ public partial record struct CyborgControlData
|
||||
ModuleCount = moduleCount;
|
||||
HasBrain = hasBrain;
|
||||
CanDisable = canDisable;
|
||||
IsAiControllable = isAiControllable; // Corvax-Next-AiRemoteControl
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
using Content.Shared.Emag.Systems;
|
||||
using Content.Shared.Emag.Systems;
|
||||
using Content.Shared.Mind;
|
||||
using Content.Shared.Popups;
|
||||
using Content.Shared.Silicons.Laws.Components;
|
||||
using Content.Shared.Stunnable;
|
||||
using Content.Shared.Wires;
|
||||
using Robust.Shared.Audio;
|
||||
using Content.Shared._CorvaxNext.Silicons.Borgs.Components;
|
||||
|
||||
namespace Content.Shared.Silicons.Laws;
|
||||
|
||||
@@ -35,6 +36,11 @@ public abstract partial class SharedSiliconLawSystem : EntitySystem
|
||||
if (_emag.CheckFlag(uid, EmagType.Interaction))
|
||||
return;
|
||||
|
||||
// Corvax-Next-AiRemoteControl-Start
|
||||
if (HasComp<AiRemoteControllerComponent>(uid))
|
||||
return;
|
||||
// Corvax-Next-AiRemoteControl-End
|
||||
|
||||
// prevent self-emagging
|
||||
if (uid == args.UserUid)
|
||||
{
|
||||
|
||||
@@ -28,6 +28,7 @@ using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Serialization;
|
||||
using Robust.Shared.Timing;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using Content.Shared._CorvaxNext.Silicons.Borgs;
|
||||
|
||||
namespace Content.Shared.Silicons.StationAi;
|
||||
|
||||
@@ -57,6 +58,8 @@ public abstract partial class SharedStationAiSystem : EntitySystem
|
||||
[Dependency] private readonly SharedUserInterfaceSystem _uiSystem = default!;
|
||||
[Dependency] private readonly StationAiVisionSystem _vision = default!;
|
||||
|
||||
[Dependency] private readonly SharedAiRemoteControlSystem _remoteSystem = default!; // Corvax-Next-AiRemoteControl
|
||||
|
||||
// StationAiHeld is added to anything inside of an AI core.
|
||||
// StationAiHolder indicates it can hold an AI positronic brain (e.g. holocard / core).
|
||||
// StationAiCore holds functionality related to the core itself.
|
||||
@@ -231,6 +234,13 @@ public abstract partial class SharedStationAiSystem : EntitySystem
|
||||
// Try to insert our thing into them
|
||||
if (_slots.CanEject(ent.Owner, args.User, ent.Comp.Slot))
|
||||
{
|
||||
// Corvax-Next-AiRemoteControl-Start
|
||||
if (ent.Comp.Slot.Item != null
|
||||
&& TryComp<StationAiHeldComponent>(ent.Comp.Slot.Item, out var stationAiHeldComp))
|
||||
if (stationAiHeldComp.CurrentConnectedEntity != null)
|
||||
_remoteSystem.ReturnMindIntoAi(stationAiHeldComp.CurrentConnectedEntity.Value);
|
||||
// Corvax-Next-AiRemoteControl-End
|
||||
|
||||
if (!_slots.TryInsert(args.Args.Target.Value, targetHolder.Slot, ent.Comp.Slot.Item!.Value, args.User, excludeUserAudio: true))
|
||||
{
|
||||
return;
|
||||
@@ -289,6 +299,12 @@ public abstract partial class SharedStationAiSystem : EntitySystem
|
||||
AnnounceIntellicardUsage(held, intelliComp.WarningSound);
|
||||
}
|
||||
|
||||
// Corvax-Next-AiRemoteControl-Start
|
||||
if (TryComp<StationAiHeldComponent>(held, out var heldComp))
|
||||
if (heldComp.CurrentConnectedEntity != null)
|
||||
AnnounceIntellicardUsage(heldComp.CurrentConnectedEntity.Value, intelliComp.WarningSound);
|
||||
// Corvax-Next-AiRemoteControl-End
|
||||
|
||||
var doAfterArgs = new DoAfterArgs(EntityManager, args.User, cardHasAi ? intelliComp.UploadTime : intelliComp.DownloadTime, new IntellicardDoAfterEvent(), args.Target, ent.Owner)
|
||||
{
|
||||
BreakOnDamage = true,
|
||||
|
||||
@@ -6,4 +6,10 @@ namespace Content.Shared.Silicons.StationAi;
|
||||
/// Indicates this entity is currently held inside of a station AI core.
|
||||
/// </summary>
|
||||
[RegisterComponent, NetworkedComponent]
|
||||
public sealed partial class StationAiHeldComponent : Component;
|
||||
// Corvax-Next-AiRemoteControl-Start
|
||||
public sealed partial class StationAiHeldComponent : Component
|
||||
{
|
||||
[DataField]
|
||||
public EntityUid? CurrentConnectedEntity;
|
||||
}
|
||||
// Corvax-Next-AiRemoteControl-End
|
||||
|
||||
@@ -247,6 +247,12 @@ namespace Content.Shared.VendingMachines
|
||||
[DataField]
|
||||
public double? LastPurchasePrice;
|
||||
// End Frontier: taxes, cash slot
|
||||
|
||||
/// <summary>
|
||||
/// Mono: Makes all positions in vending machines free if set false
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public bool RequiresCash = false;
|
||||
}
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
// SPDX-FileCopyrightText: 2025 GoobBot <uristmchands@proton.me>
|
||||
// SPDX-FileCopyrightText: 2025 ImHoks <imhokzzzz@gmail.com>
|
||||
// SPDX-FileCopyrightText: 2025 KillanGenifer <killangenifer@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
namespace Content.Shared._CorvaxNext.Silicons.Borgs.Components;
|
||||
|
||||
[RegisterComponent]
|
||||
public sealed partial class AiRemoteBrainComponent : Component
|
||||
{
|
||||
}
|
||||
+69
@@ -0,0 +1,69 @@
|
||||
// SPDX-FileCopyrightText: 2025 GoobBot <uristmchands@proton.me>
|
||||
// SPDX-FileCopyrightText: 2025 ImHoks <imhokzzzz@gmail.com>
|
||||
// SPDX-FileCopyrightText: 2025 KillanGenifer <killangenifer@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Serialization;
|
||||
|
||||
namespace Content.Shared._CorvaxNext.Silicons.Borgs.Components;
|
||||
|
||||
[RegisterComponent]
|
||||
public sealed partial class AiRemoteControllerComponent : Component
|
||||
{
|
||||
[DataField] public EntityUid? AiHolder;
|
||||
[DataField] public EntityUid? LinkedMind;
|
||||
|
||||
[DataField] public string[]? PreviouslyTransmitterChannels;
|
||||
[DataField] public string[]? PreviouslyActiveRadioChannels;
|
||||
|
||||
[DataField] public EntProtoId BackToAiAction = "ActionBackToAi";
|
||||
[DataField] public EntityUid? BackToAiActionEntity;
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public sealed class RemoteDeviceActionMessage : BoundUserInterfaceMessage
|
||||
{
|
||||
public readonly RemoteDeviceActionEvent? RemoteAction;
|
||||
public RemoteDeviceActionMessage(RemoteDeviceActionEvent remoteDeviceAction)
|
||||
{
|
||||
RemoteAction = remoteDeviceAction;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public sealed class RemoteDeviceActionEvent : EntityEventArgs
|
||||
{
|
||||
public enum RemoteDeviceActionType
|
||||
{
|
||||
MoveToDevice,
|
||||
TakeControl
|
||||
}
|
||||
public RemoteDeviceActionType ActionType;
|
||||
public NetEntity Target;
|
||||
|
||||
public RemoteDeviceActionEvent(RemoteDeviceActionType actionType, NetEntity target)
|
||||
{
|
||||
ActionType = actionType;
|
||||
Target = target;
|
||||
}
|
||||
}
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public record struct RemoteDevicesData()
|
||||
{
|
||||
public string DisplayName = string.Empty;
|
||||
public NetEntity NetEntityUid = NetEntity.Invalid;
|
||||
}
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public sealed class RemoteDevicesBuiState : BoundUserInterfaceState
|
||||
{
|
||||
public List<RemoteDevicesData> DeviceList;
|
||||
|
||||
public RemoteDevicesBuiState(List<RemoteDevicesData> deviceList)
|
||||
{
|
||||
DeviceList = deviceList;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
// SPDX-FileCopyrightText: 2025 GoobBot <uristmchands@proton.me>
|
||||
// SPDX-FileCopyrightText: 2025 ImHoks <142083149+ImHoks@users.noreply.github.com>
|
||||
// SPDX-FileCopyrightText: 2025 ImHoks <imhokzzzz@gmail.com>
|
||||
// SPDX-FileCopyrightText: 2025 KillanGenifer <killangenifer@gmail.com>
|
||||
// SPDX-FileCopyrightText: 2025 gluesniffler <159397573+gluesniffler@users.noreply.github.com>
|
||||
//
|
||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
using Content.Shared._CorvaxNext.Silicons.Borgs.Components;
|
||||
using Content.Shared.Actions;
|
||||
using Content.Shared.Mind;
|
||||
using Content.Shared.Silicons.StationAi;
|
||||
using Robust.Shared.Serialization;
|
||||
|
||||
namespace Content.Shared._CorvaxNext.Silicons.Borgs;
|
||||
|
||||
public abstract class SharedAiRemoteControlSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly SharedStationAiSystem _stationAiSystem = default!;
|
||||
[Dependency] private readonly SharedTransformSystem _xformSystem = default!;
|
||||
[Dependency] private readonly SharedMindSystem _mind = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
}
|
||||
|
||||
public void ReturnMindIntoAi(EntityUid entity)
|
||||
{
|
||||
if (!TryComp<AiRemoteControllerComponent>(entity, out var remoteComp))
|
||||
return;
|
||||
|
||||
if (remoteComp?.AiHolder == null
|
||||
|| !_stationAiSystem.TryGetCore(remoteComp.AiHolder.Value, out var stationAiCore)
|
||||
|| stationAiCore.Comp?.RemoteEntity == null)
|
||||
return;
|
||||
|
||||
if (remoteComp.LinkedMind == null)
|
||||
return;
|
||||
|
||||
if (!TryComp<StationAiHeldComponent>(remoteComp.AiHolder.Value, out var stationAiHeldComp))
|
||||
return;
|
||||
|
||||
stationAiHeldComp.CurrentConnectedEntity = null;
|
||||
|
||||
_mind.TransferTo(remoteComp.LinkedMind.Value, remoteComp.AiHolder);
|
||||
|
||||
_stationAiSystem.SwitchRemoteEntityMode(stationAiCore, true);
|
||||
remoteComp.AiHolder = null;
|
||||
remoteComp.LinkedMind = null;
|
||||
|
||||
_xformSystem.SetCoordinates(stationAiCore.Comp.RemoteEntity.Value, Transform(entity).Coordinates);
|
||||
}
|
||||
}
|
||||
|
||||
public sealed partial class ReturnMindIntoAiEvent : InstantActionEvent
|
||||
{
|
||||
}
|
||||
|
||||
public sealed partial class ToggleRemoteDevicesScreenEvent : InstantActionEvent
|
||||
{
|
||||
}
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public enum RemoteDeviceUiKey : byte
|
||||
{
|
||||
Key
|
||||
}
|
||||
@@ -82,7 +82,7 @@ public sealed partial class ShipShieldEmitterComponent : Component
|
||||
public SoundSpecifier PowerDownSound = new SoundPathSpecifier("/Audio/Effects/teleport_departure.ogg");
|
||||
|
||||
/// <summary>
|
||||
/// While shield is active, reduces impact energy from grid collisions by this much.
|
||||
/// While shield is active, multiplies impact energy to both grids from grid collisions by this much.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public float CollisionResistanceMultiplier = 1.0f;
|
||||
|
||||
@@ -9,6 +9,9 @@ namespace Content.Shared._Mono.Detection;
|
||||
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
|
||||
public sealed partial class ThermalSignatureComponent : Component
|
||||
{
|
||||
[ViewVariables(VVAccess.ReadOnly)]
|
||||
public float LastUpdateHeat = 0f;
|
||||
|
||||
[DataField]
|
||||
public float StoredHeat = 0f;
|
||||
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared._Mono.Grid;
|
||||
|
||||
/// <summary>
|
||||
/// This prototypes stores all grid modifiers to process them.
|
||||
/// </summary>
|
||||
[Prototype("gridModifier")]
|
||||
public sealed partial class GridModificationPrototype : IPrototype
|
||||
{
|
||||
[IdDataField]
|
||||
public string ID { get; private set; } = default!;
|
||||
|
||||
[DataField]
|
||||
public List<GridModifier> Modifiers = [];
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
using JetBrains.Annotations;
|
||||
|
||||
namespace Content.Shared._Mono.Grid;
|
||||
|
||||
[ImplicitDataDefinitionForInheritors]
|
||||
[MeansImplicitUse]
|
||||
public abstract partial class GridModifier
|
||||
{
|
||||
protected string _id => GetType().Name;
|
||||
|
||||
[DataField]
|
||||
public string Comp = "Transform";
|
||||
|
||||
public abstract void Modify(EntityUid gridUid, EntityManager system, IComponentFactory? factory = null);
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
using Content.Shared.Whitelist;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Random;
|
||||
|
||||
namespace Content.Shared._Mono.Grid.Modifiers;
|
||||
|
||||
[UsedImplicitly]
|
||||
public sealed partial class GridModEntityReplace : GridModifier
|
||||
{
|
||||
[DataField(required: true)]
|
||||
public List<ReplaceData> Data = [];
|
||||
|
||||
[Dependency] private readonly IRobustRandom _random = new RobustRandom();
|
||||
|
||||
public override void Modify(EntityUid gridUid, EntityManager system, IComponentFactory? factory = null)
|
||||
{
|
||||
if (factory == null)
|
||||
return;
|
||||
|
||||
var whitelistSystem = system.System<EntityWhitelistSystem>();
|
||||
var gridModSystem = system.System<SharedGridModifierSystem>();
|
||||
|
||||
var comp = factory.GetComponent(Comp);
|
||||
var ents = new HashSet<Entity<IComponent>>();
|
||||
|
||||
gridModSystem.GetGridEntities(gridUid, ents, comp.GetType());
|
||||
|
||||
foreach (var ent in ents)
|
||||
{
|
||||
var meta = system.MetaQuery.GetComponent(ent);
|
||||
var xform = system.TransformQuery.GetComponent(ent);
|
||||
|
||||
if (meta.EntityPrototype == null)
|
||||
continue;
|
||||
|
||||
foreach (var rD in Data)
|
||||
{
|
||||
if (whitelistSystem.IsWhitelistFailOrNull(rD.Whitelist, ent) && meta.EntityPrototype.ID != rD.ToReplace)
|
||||
continue;
|
||||
|
||||
if (!_random.Prob(rD.Chance))
|
||||
continue;
|
||||
|
||||
var pos = xform.Coordinates;
|
||||
|
||||
system.QueueDeleteEntity(ent);
|
||||
system.SpawnAtPosition(rD.ReplaceWith, pos);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
[DataDefinition]
|
||||
[Serializable]
|
||||
public sealed partial class ReplaceData
|
||||
{
|
||||
[DataField]
|
||||
public EntityWhitelist? Whitelist;
|
||||
|
||||
[DataField]
|
||||
public EntProtoId? ToReplace;
|
||||
|
||||
[DataField(required: true)]
|
||||
public EntProtoId ReplaceWith;
|
||||
|
||||
[DataField]
|
||||
public float Chance = 0.2f;
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
namespace Content.Shared._Mono.Grid;
|
||||
|
||||
/// <summary>
|
||||
/// Methods required from this system to be used in GridModifiers logic.
|
||||
/// </summary>
|
||||
public abstract class SharedGridModifierSystem : EntitySystem
|
||||
{
|
||||
public void GetGridEntities(EntityUid gridUid, HashSet<Entity<IComponent>> entities, Type compType)
|
||||
{
|
||||
foreach (var (uid, comp) in EntityManager.GetAllComponents(compType, true))
|
||||
{
|
||||
|
||||
var xform = Transform(uid);
|
||||
|
||||
if (xform.GridUid != gridUid)
|
||||
continue;
|
||||
|
||||
entities.Add((uid, comp));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -22,11 +22,4 @@ public sealed partial class VendingMachinePurchaseComponent : Component
|
||||
/// </summary>
|
||||
[DataField, AutoNetworkedField]
|
||||
public double OriginalPurchasePrice;
|
||||
|
||||
/// <summary>
|
||||
/// The entity ID of the vending machine this was purchased from.
|
||||
/// Stored for reference and potential future features.
|
||||
/// </summary>
|
||||
[DataField, AutoNetworkedField]
|
||||
public EntityUid VendingMachine;
|
||||
}
|
||||
|
||||
@@ -137,7 +137,6 @@ public sealed partial class HandPlaceholderSystem : EntitySystem
|
||||
return;
|
||||
|
||||
SetPlaceholder(target, ent);
|
||||
SetEnabled(target, true);
|
||||
|
||||
SetEnabled(ent, false); // allow inserting into the source container
|
||||
|
||||
@@ -153,6 +152,7 @@ public sealed partial class HandPlaceholderSystem : EntitySystem
|
||||
}
|
||||
|
||||
_hands.DoPickup(user, hand, target, hands); // Force pickup - empty hands are not okay
|
||||
SetEnabled(target, true);
|
||||
_interaction.DoContactInteraction(user, target); // allow for forensics and other systems to work (why does hands system not do this???)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19158,3 +19158,200 @@ Entries:
|
||||
id: 2112
|
||||
time: '2026-03-30T16:56:00.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3643
|
||||
- author: Redrover1760
|
||||
changes:
|
||||
- type: Tweak
|
||||
message: Biomass spread rate, health, and slowdown reduced.
|
||||
id: 2113
|
||||
time: '2026-04-01T16:22:03.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3635
|
||||
- author: UnicornOnLSD
|
||||
changes:
|
||||
- type: Add
|
||||
message: Management has sent an ore box to the DIS Rig after customer complaints.
|
||||
id: 2114
|
||||
time: '2026-04-01T22:08:49.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3672
|
||||
- author: Ilya246
|
||||
changes:
|
||||
- type: Add
|
||||
message: >-
|
||||
Added new drone to the far reaches, specially for those who liked the
|
||||
dodging sniper drone.
|
||||
- type: Tweak
|
||||
message: Far reaches 3 now contains slightly more medium drones by proportion.
|
||||
- type: Tweak
|
||||
message: Far reach drones now display their names.
|
||||
id: 2115
|
||||
time: '2026-04-02T17:25:02.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3559
|
||||
- author: Ilya246
|
||||
changes:
|
||||
- type: Add
|
||||
message: Added Far Reaches IV and a new drone to find in it.
|
||||
- type: Tweak
|
||||
message: >-
|
||||
Reduced overall drone spawnrate, but increased proportion of more
|
||||
advanced drones further out.
|
||||
id: 2116
|
||||
time: '2026-04-02T18:52:53.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3677
|
||||
- author: Ilya246
|
||||
changes:
|
||||
- type: Tweak
|
||||
message: Shield ram damage reduction now applies to both colliding grids.
|
||||
id: 2117
|
||||
time: '2026-04-03T09:04:09.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3678
|
||||
- author: EckoAurum
|
||||
changes:
|
||||
- type: Fix
|
||||
message: Fixed Cyborgs obtaining non-whitelisted hands.
|
||||
id: 2118
|
||||
time: '2026-04-03T09:50:59.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3679
|
||||
- author: NazrinNya
|
||||
changes:
|
||||
- type: Tweak
|
||||
message: Most of non-poi vend catalogs are completely free now.
|
||||
id: 2119
|
||||
time: '2026-04-03T11:08:39.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3195
|
||||
- author: NazrinNya
|
||||
changes:
|
||||
- type: Add
|
||||
message: Added Hullmods, currently admin-only.
|
||||
id: 2120
|
||||
time: '2026-04-03T11:08:54.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3285
|
||||
- author: Redrover1760
|
||||
changes:
|
||||
- type: Tweak
|
||||
message: Faction datafarms now produce 200 science per second instead of 35.
|
||||
- type: Tweak
|
||||
message: >-
|
||||
Normal research datafarms now produce 20 science per second instead of
|
||||
10.
|
||||
id: 2121
|
||||
time: '2026-04-03T17:42:36.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3681
|
||||
- author: chuga-git
|
||||
changes:
|
||||
- type: Add
|
||||
message: >-
|
||||
ASM-220 "Trident" 500mm torpedo rack and GPOB-L Light Munitions Bay are
|
||||
now anchorable.
|
||||
- type: Add
|
||||
message: ASM-220 HE and ECM torpedos are now significantly faster.
|
||||
id: 2122
|
||||
time: '2026-04-03T17:45:12.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3673
|
||||
- author: Kiithnaras
|
||||
changes:
|
||||
- type: Tweak
|
||||
message: >-
|
||||
Improvements to capacity and firing mechanics of many common Laser and
|
||||
Energy weapons.
|
||||
id: 2123
|
||||
time: '2026-04-03T17:46:11.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3636
|
||||
- author: EldritchPineapple
|
||||
changes:
|
||||
- type: Tweak
|
||||
message: >-
|
||||
recipes in the med assembler have been changed to make regenerative
|
||||
meshes and medicated sutures easier to craft
|
||||
id: 2124
|
||||
time: '2026-04-03T18:25:56.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3680
|
||||
- author: Redrover1760
|
||||
changes:
|
||||
- type: Tweak
|
||||
message: Increased TSF Mech Blip visibility
|
||||
id: 2125
|
||||
time: '2026-04-03T18:26:26.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3667
|
||||
- author: Ilya246
|
||||
changes:
|
||||
- type: Add
|
||||
message: >-
|
||||
ADCs now get piloting boosts (bonus acceleration, turn, max speed) to
|
||||
give them an advantage over ADMs.
|
||||
id: 2126
|
||||
time: '2026-04-03T18:28:23.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3602
|
||||
- author: Redrover1760
|
||||
changes:
|
||||
- type: Tweak
|
||||
message: >-
|
||||
Civilian/Merc borg HP buffed 150->200, civ/merc borg burn damage
|
||||
modifier reduced from 1.5 to 1.
|
||||
id: 2127
|
||||
time: '2026-04-03T18:29:10.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3578
|
||||
- author: Redrover1760
|
||||
changes:
|
||||
- type: Tweak
|
||||
message: Burn damage is now added to the red damage overlay
|
||||
id: 2128
|
||||
time: '2026-04-04T00:37:54.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3682
|
||||
- author: Redrover1760
|
||||
changes:
|
||||
- type: Fix
|
||||
message: Datafarm point generation in descriptions updated.
|
||||
- type: Fix
|
||||
message: >-
|
||||
Factions now use the correct datafarm entity and thus produce 200 points
|
||||
now.
|
||||
id: 2129
|
||||
time: '2026-04-04T03:50:20.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3685
|
||||
- author: TheScienceOfKSP
|
||||
changes:
|
||||
- type: Add
|
||||
message: Added the Pacem, a new ship for Judges.
|
||||
id: 2130
|
||||
time: '2026-04-04T11:14:40.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3332
|
||||
- author: EckoAurum
|
||||
changes:
|
||||
- type: Fix
|
||||
message: Possibly fixed mech lag.
|
||||
id: 2131
|
||||
time: '2026-04-04T13:44:14.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3686
|
||||
- author: EckoAurum
|
||||
changes:
|
||||
- type: Add
|
||||
message: AI-Cyborg Network Device, allowing AI's to control cyborgs remotely.
|
||||
id: 2132
|
||||
time: '2026-04-04T19:53:42.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3658
|
||||
- author: Ghost581X
|
||||
changes:
|
||||
- type: Add
|
||||
message: The vipers make their nest at Camelot.
|
||||
id: 2133
|
||||
time: '2026-04-04T20:49:50.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3535
|
||||
- author: Redrover1760
|
||||
changes:
|
||||
- type: Tweak
|
||||
message: Jetpacks aren't detected by radar outside of 256 meters.
|
||||
- type: Tweak
|
||||
message: >-
|
||||
Pre-fracture stealth jetpacks aren't detected outside of 16 meters,
|
||||
description updated.
|
||||
id: 2134
|
||||
time: '2026-04-04T21:38:13.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3592
|
||||
- author: Mrrpip
|
||||
changes:
|
||||
- type: Tweak
|
||||
message: >-
|
||||
Tweaks the names and descriptions of missile class weapons, allowing the
|
||||
ammo to be seen in the GCS UI.
|
||||
id: 2135
|
||||
time: '2026-04-04T21:44:56.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3521
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
research-discipline-viper-group = Viper Group
|
||||
|
||||
# T1 VG
|
||||
research-technology-viper-group-apparel = Viper Group Apparel
|
||||
|
||||
# T2 VG
|
||||
research-technology-viper-group-basic = Viper Group Basic Hardsuits
|
||||
|
||||
# T3 VG
|
||||
research-technology-viper-group-juggernaut = Viper Group Juggernaut Hardsuit
|
||||
@@ -0,0 +1,4 @@
|
||||
# UI
|
||||
ai-remote-ui-menu-title = Available devices
|
||||
ai-remote-ui-menu-moveto = Move to
|
||||
ai-remote-control = Take control
|
||||
@@ -5,7 +5,7 @@ meta:
|
||||
forkId: ""
|
||||
forkVersion: ""
|
||||
time: 03/27/2026 19:43:44
|
||||
entityCount: 10732
|
||||
entityCount: 10733
|
||||
maps:
|
||||
- 1
|
||||
grids:
|
||||
@@ -14998,6 +14998,13 @@ entities:
|
||||
- type: Transform
|
||||
pos: -24.5489,50.522743
|
||||
parent: 2
|
||||
- proto: BiomeSourceFarReachesIV
|
||||
entities:
|
||||
- uid: 12345
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -24.5489,50.522743
|
||||
parent: 2
|
||||
- proto: BiomeSourceInnerRing
|
||||
entities:
|
||||
- uid: 999
|
||||
|
||||
@@ -9193,7 +9193,7 @@ entities:
|
||||
- type: Transform
|
||||
pos: 1.5,67.5
|
||||
parent: 1
|
||||
- proto: BaseResearchAndDevelopmentPointSource
|
||||
- proto: DatafarmResearchFaction
|
||||
entities:
|
||||
- uid: 316
|
||||
components:
|
||||
|
||||
@@ -10974,15 +10974,13 @@ entities:
|
||||
rot: 3.141592653589793 rad
|
||||
pos: 24.5,-13.5
|
||||
parent: 1
|
||||
- proto: BaseResearchAndDevelopmentPointSource
|
||||
- proto: DatafarmResearchFaction
|
||||
entities:
|
||||
- uid: 1217
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -3.5,9.5
|
||||
parent: 1
|
||||
missingComponents:
|
||||
- Anchorable
|
||||
- proto: Bed
|
||||
entities:
|
||||
- uid: 1218
|
||||
|
||||
@@ -9118,7 +9118,7 @@ entities:
|
||||
- type: Transform
|
||||
pos: 63.5,60.5
|
||||
parent: 1
|
||||
- proto: BaseResearchAndDevelopmentPointSource
|
||||
- proto: DatafarmResearchFaction
|
||||
entities:
|
||||
- uid: 716
|
||||
components:
|
||||
|
||||
@@ -0,0 +1,870 @@
|
||||
meta:
|
||||
format: 7
|
||||
category: Grid
|
||||
engineVersion: 271.2.0
|
||||
forkId: ""
|
||||
forkVersion: ""
|
||||
time: 03/25/2026 17:21:49
|
||||
entityCount: 134
|
||||
maps: []
|
||||
grids:
|
||||
- 1
|
||||
orphans:
|
||||
- 1
|
||||
nullspace: []
|
||||
tilemap:
|
||||
6: Space
|
||||
0: FloorBlueCircuit
|
||||
3: FloorHullReinforced
|
||||
4: Lattice
|
||||
12: LatticeCornerNE
|
||||
7: LatticeCornerNW
|
||||
10: LatticeCornerSE
|
||||
13: LatticeCornerSW
|
||||
1: Plating
|
||||
11: PlatingCornerNE
|
||||
5: PlatingCornerNW
|
||||
8: PlatingCornerSE
|
||||
9: PlatingCornerSW
|
||||
2: PlatingDamaged
|
||||
entities:
|
||||
- proto: ""
|
||||
entities:
|
||||
- uid: 1
|
||||
components:
|
||||
- type: MetaData
|
||||
name: grid
|
||||
- type: Transform
|
||||
parent: invalid
|
||||
- type: MapGrid
|
||||
chunks:
|
||||
0,0:
|
||||
ind: 0,0
|
||||
tiles: AAAAAAAAAAEAAAAAAAACAAAAAAAAAwAAAAAAAAQAAAAAAAADAAAAAAAABQAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAADAAAAAAAAAwAAAAAAAAMAAAAAAAAHAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAABAAAAAAAAAwAAAAAAAAEAAAAAAAABAAAAAAAAAwAAAAAAAAMAAAAAAAADAAAAAAAABAAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAIAAAAAAAAAQAAAAAAAAQAAAAAAAABAAAAAAAAAQAAAAAAAAkAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAKAAAAAAAAAQAAAAAAAAkAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAA==
|
||||
version: 7
|
||||
0,-1:
|
||||
ind: 0,-1
|
||||
tiles: BgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAACAAAAAAAABQAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAAAAAAAAAAAAIAAAAAAAADAAAAAAAABwAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAA==
|
||||
version: 7
|
||||
-1,0:
|
||||
ind: -1,0
|
||||
tiles: BgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAsAAAAAAAADAAAAAAAABAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAwAAAAAAAADAAAAAAAAAwAAAAAAAAMAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAEAAAAAAAAAwAAAAAAAAMAAAAAAAADAAAAAAAAAQAAAAAAAAEAAAAAAAADAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAACAAAAAAAAAEAAAAAAAABAAAAAAAABAAAAAAAAAEAAAAAAAAJAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAIAAAAAAAAAQAAAAAAAA0AAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAA==
|
||||
version: 7
|
||||
-1,-1:
|
||||
ind: -1,-1
|
||||
tiles: BgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAALAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAAABgAAAAAAAAwAAAAAAAADAAAAAAAAAgAAAAAAAA==
|
||||
version: 7
|
||||
- type: Broadphase
|
||||
- type: Physics
|
||||
bodyStatus: InAir
|
||||
fixedRotation: False
|
||||
bodyType: Dynamic
|
||||
- type: Fixtures
|
||||
fixtures: {}
|
||||
- type: OccluderTree
|
||||
- type: SpreaderGrid
|
||||
spreadQueues:
|
||||
Kudzu: []
|
||||
Smoke: []
|
||||
MetalFoam: []
|
||||
Puddle: []
|
||||
- type: Shuttle
|
||||
dampingModifier: 0.25
|
||||
- type: GridPathfinding
|
||||
- type: Gravity
|
||||
gravityShakeSound: !type:SoundPathSpecifier
|
||||
path: /Audio/Effects/alert.ogg
|
||||
- type: DecalGrid
|
||||
chunkCollection:
|
||||
version: 2
|
||||
nodes: []
|
||||
- type: GridAtmosphere
|
||||
version: 2
|
||||
data:
|
||||
chunkSize: 4
|
||||
- type: GasTileOverlay
|
||||
- type: RadiationGridResistance
|
||||
- proto: APCBasic
|
||||
entities:
|
||||
- uid: 62
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 1.5,0.5
|
||||
parent: 1
|
||||
- proto: CableApcExtension
|
||||
entities:
|
||||
- uid: 73
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 1.5,0.5
|
||||
parent: 1
|
||||
- uid: 74
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 0.5,0.5
|
||||
parent: 1
|
||||
- uid: 75
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -0.5,0.5
|
||||
parent: 1
|
||||
- uid: 76
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -1.5,0.5
|
||||
parent: 1
|
||||
- uid: 77
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -2.5,0.5
|
||||
parent: 1
|
||||
- uid: 78
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -3.5,0.5
|
||||
parent: 1
|
||||
- uid: 79
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -3.5,1.5
|
||||
parent: 1
|
||||
- uid: 80
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 2.5,0.5
|
||||
parent: 1
|
||||
- uid: 81
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 4.5,0.5
|
||||
parent: 1
|
||||
- uid: 82
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 3.5,0.5
|
||||
parent: 1
|
||||
- uid: 83
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 4.5,1.5
|
||||
parent: 1
|
||||
- uid: 84
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -4.5,1.5
|
||||
parent: 1
|
||||
- uid: 85
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 5.5,1.5
|
||||
parent: 1
|
||||
- proto: CableHV
|
||||
entities:
|
||||
- uid: 63
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -1.5,0.5
|
||||
parent: 1
|
||||
- uid: 64
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -0.5,0.5
|
||||
parent: 1
|
||||
- uid: 65
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 0.5,-0.5
|
||||
parent: 1
|
||||
- uid: 66
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 1.5,-0.5
|
||||
parent: 1
|
||||
- uid: 67
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -0.5,-0.5
|
||||
parent: 1
|
||||
- uid: 68
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 1.5,0.5
|
||||
parent: 1
|
||||
- uid: 69
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 2.5,0.5
|
||||
parent: 1
|
||||
- uid: 91
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 3.5,0.5
|
||||
parent: 1
|
||||
- uid: 131
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 3.5,1.5
|
||||
parent: 1
|
||||
- proto: CableMV
|
||||
entities:
|
||||
- uid: 70
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -0.5,0.5
|
||||
parent: 1
|
||||
- uid: 71
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 1.5,0.5
|
||||
parent: 1
|
||||
- uid: 72
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 0.5,0.5
|
||||
parent: 1
|
||||
- uid: 132
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 3.5,1.5
|
||||
parent: 1
|
||||
- uid: 133
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 3.5,0.5
|
||||
parent: 1
|
||||
- uid: 134
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 2.5,0.5
|
||||
parent: 1
|
||||
- proto: ClothingBackpackDroneLootT22
|
||||
entities:
|
||||
- uid: 98
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 0.22172669,0.18755352
|
||||
parent: 1
|
||||
- proto: GeneratorRTG
|
||||
entities:
|
||||
- uid: 56
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -0.5,-0.5
|
||||
parent: 1
|
||||
- uid: 57
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 0.5,-0.5
|
||||
parent: 1
|
||||
- uid: 58
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 1.5,-0.5
|
||||
parent: 1
|
||||
- uid: 59
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -1.5,0.5
|
||||
parent: 1
|
||||
- uid: 60
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 2.5,0.5
|
||||
parent: 1
|
||||
- proto: Grille
|
||||
entities:
|
||||
- uid: 20
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 3.141592653589793 rad
|
||||
pos: -6.5,2.5
|
||||
parent: 1
|
||||
- uid: 21
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 3.141592653589793 rad
|
||||
pos: -3.5,0.5
|
||||
parent: 1
|
||||
- uid: 22
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 3.141592653589793 rad
|
||||
pos: -3.5,3.5
|
||||
parent: 1
|
||||
- uid: 24
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 3.141592653589793 rad
|
||||
pos: 4.5,0.5
|
||||
parent: 1
|
||||
- uid: 26
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 3.141592653589793 rad
|
||||
pos: 4.5,3.5
|
||||
parent: 1
|
||||
- uid: 29
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 3.141592653589793 rad
|
||||
pos: 7.5,2.5
|
||||
parent: 1
|
||||
- proto: GrilleDiagonal
|
||||
entities:
|
||||
- uid: 30
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 1.5707963267948966 rad
|
||||
pos: -6.5,1.5
|
||||
parent: 1
|
||||
- uid: 31
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 3.141592653589793 rad
|
||||
pos: 7.5,1.5
|
||||
parent: 1
|
||||
- uid: 32
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 3.141592653589793 rad
|
||||
pos: 3.5,-0.5
|
||||
parent: 1
|
||||
- uid: 33
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 1.5707963267948966 rad
|
||||
pos: -2.5,-0.5
|
||||
parent: 1
|
||||
- uid: 129
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 3.141592653589793 rad
|
||||
pos: 1.5,-1.5
|
||||
parent: 1
|
||||
- uid: 130
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 1.5707963267948966 rad
|
||||
pos: -0.5,-1.5
|
||||
parent: 1
|
||||
- proto: PlasmaReinforcedWindowDirectional
|
||||
entities:
|
||||
- uid: 86
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 3.141592653589793 rad
|
||||
pos: -4.5,0.5
|
||||
parent: 1
|
||||
- uid: 88
|
||||
components:
|
||||
- type: Transform
|
||||
rot: -1.5707963267948966 rad
|
||||
pos: 5.5,1.5
|
||||
parent: 1
|
||||
- uid: 89
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 3.141592653589793 rad
|
||||
pos: 4.5,1.5
|
||||
parent: 1
|
||||
- uid: 90
|
||||
components:
|
||||
- type: Transform
|
||||
rot: -1.5707963267948966 rad
|
||||
pos: 5.5,2.5
|
||||
parent: 1
|
||||
- uid: 92
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 1.5707963267948966 rad
|
||||
pos: -4.5,1.5
|
||||
parent: 1
|
||||
- uid: 93
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 1.5707963267948966 rad
|
||||
pos: -4.5,2.5
|
||||
parent: 1
|
||||
- uid: 94
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 3.141592653589793 rad
|
||||
pos: 5.5,0.5
|
||||
parent: 1
|
||||
- uid: 95
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 3.141592653589793 rad
|
||||
pos: -3.5,1.5
|
||||
parent: 1
|
||||
- uid: 96
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 1.5707963267948966 rad
|
||||
pos: -2.5,0.5
|
||||
parent: 1
|
||||
- uid: 97
|
||||
components:
|
||||
- type: Transform
|
||||
rot: -1.5707963267948966 rad
|
||||
pos: 3.5,0.5
|
||||
parent: 1
|
||||
- proto: RadarEdgeMarkerCenter
|
||||
entities:
|
||||
- uid: 123
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 3.141592653589793 rad
|
||||
pos: 0.5,2.5
|
||||
parent: 1
|
||||
- uid: 124
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 3.141592653589793 rad
|
||||
pos: 0.5,1.5
|
||||
parent: 1
|
||||
- proto: RadarEdgeMarkerDiagonal
|
||||
entities:
|
||||
- uid: 101
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 5.5,1.5
|
||||
parent: 1
|
||||
- uid: 115
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 1.5707963267948966 rad
|
||||
pos: -1.5,2.5
|
||||
parent: 1
|
||||
- uid: 116
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 2.5,2.5
|
||||
parent: 1
|
||||
- uid: 119
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 1.5707963267948966 rad
|
||||
pos: -4.5,1.5
|
||||
parent: 1
|
||||
- proto: RadarEdgeMarkerHalftiltLeft
|
||||
entities:
|
||||
- uid: 118
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 1.5707963267948966 rad
|
||||
pos: 5.5,2.5
|
||||
parent: 1
|
||||
- uid: 126
|
||||
components:
|
||||
- type: Transform
|
||||
rot: -1.5707963267948966 rad
|
||||
pos: 5.5,3.5
|
||||
parent: 1
|
||||
- proto: RadarEdgeMarkerHalftiltRight
|
||||
entities:
|
||||
- uid: 8
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 1.5707963267948966 rad
|
||||
pos: -4.5,3.5
|
||||
parent: 1
|
||||
- uid: 36
|
||||
components:
|
||||
- type: Transform
|
||||
rot: -1.5707963267948966 rad
|
||||
pos: -4.5,2.5
|
||||
parent: 1
|
||||
- proto: RadarEdgeMarkerStraight
|
||||
entities:
|
||||
- uid: 99
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 3.5,0.5
|
||||
parent: 1
|
||||
- uid: 100
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 1.5707963267948966 rad
|
||||
pos: -1.5,0.5
|
||||
parent: 1
|
||||
- uid: 102
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 1.5707963267948966 rad
|
||||
pos: -0.5,0.5
|
||||
parent: 1
|
||||
- uid: 103
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 1.5707963267948966 rad
|
||||
pos: 0.5,0.5
|
||||
parent: 1
|
||||
- uid: 104
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 1.5707963267948966 rad
|
||||
pos: 1.5,0.5
|
||||
parent: 1
|
||||
- uid: 105
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 1.5707963267948966 rad
|
||||
pos: 2.5,0.5
|
||||
parent: 1
|
||||
- uid: 106
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 3.141592653589793 rad
|
||||
pos: -2.5,0.5
|
||||
parent: 1
|
||||
- uid: 107
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 1.5707963267948966 rad
|
||||
pos: -2.5,0.5
|
||||
parent: 1
|
||||
- uid: 108
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 1.5707963267948966 rad
|
||||
pos: -5.5,3.5
|
||||
parent: 1
|
||||
- uid: 109
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 1.5707963267948966 rad
|
||||
pos: -3.5,1.5
|
||||
parent: 1
|
||||
- uid: 110
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -3.5,1.5
|
||||
parent: 1
|
||||
- uid: 111
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 3.141592653589793 rad
|
||||
pos: -4.5,0.5
|
||||
parent: 1
|
||||
- uid: 112
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 1.5707963267948966 rad
|
||||
pos: 6.5,3.5
|
||||
parent: 1
|
||||
- uid: 113
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 1.5707963267948966 rad
|
||||
pos: 4.5,1.5
|
||||
parent: 1
|
||||
- uid: 114
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 5.5,0.5
|
||||
parent: 1
|
||||
- uid: 117
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 1.5707963267948966 rad
|
||||
pos: -2.5,1.5
|
||||
parent: 1
|
||||
- uid: 121
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 3.5,1.5
|
||||
parent: 1
|
||||
- uid: 122
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 1.5707963267948966 rad
|
||||
pos: 3.5,1.5
|
||||
parent: 1
|
||||
- uid: 127
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 1.5707963267948966 rad
|
||||
pos: 3.5,0.5
|
||||
parent: 1
|
||||
- proto: SmallGyroscope
|
||||
entities:
|
||||
- uid: 9
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 0.5,-1.5
|
||||
parent: 1
|
||||
- proto: SmallThruster
|
||||
entities:
|
||||
- uid: 28
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 4.5,2.5
|
||||
parent: 1
|
||||
- uid: 54
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -3.5,2.5
|
||||
parent: 1
|
||||
- proto: SpawnMobAttackerCoreStaticSmart
|
||||
entities:
|
||||
- uid: 10
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 0.5,0.5
|
||||
parent: 1
|
||||
- proto: SubstationBasic
|
||||
entities:
|
||||
- uid: 55
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -0.5,0.5
|
||||
parent: 1
|
||||
- proto: SubstationWallBasic
|
||||
entities:
|
||||
- uid: 2
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 3.5,1.5
|
||||
parent: 1
|
||||
- proto: Thruster
|
||||
entities:
|
||||
- uid: 12
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 3.141592653589793 rad
|
||||
pos: -4.5,0.5
|
||||
parent: 1
|
||||
- uid: 13
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 3.141592653589793 rad
|
||||
pos: -3.5,1.5
|
||||
parent: 1
|
||||
- uid: 14
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 3.141592653589793 rad
|
||||
pos: 5.5,0.5
|
||||
parent: 1
|
||||
- uid: 15
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 3.141592653589793 rad
|
||||
pos: 4.5,1.5
|
||||
parent: 1
|
||||
- uid: 16
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 3.141592653589793 rad
|
||||
pos: -2.5,0.5
|
||||
parent: 1
|
||||
- uid: 17
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 3.141592653589793 rad
|
||||
pos: -1.5,-0.5
|
||||
parent: 1
|
||||
- uid: 18
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 3.141592653589793 rad
|
||||
pos: 3.5,0.5
|
||||
parent: 1
|
||||
- uid: 19
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 3.141592653589793 rad
|
||||
pos: 2.5,-0.5
|
||||
parent: 1
|
||||
- proto: ThrusterLarge
|
||||
entities:
|
||||
- uid: 5
|
||||
components:
|
||||
- type: Transform
|
||||
rot: -1.5707963267948966 rad
|
||||
pos: 6.5,2.5
|
||||
parent: 1
|
||||
- uid: 120
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 1.5707963267948966 rad
|
||||
pos: -5.5,1.5
|
||||
parent: 1
|
||||
- proto: WallReinforced
|
||||
entities:
|
||||
- uid: 6
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 1.5707963267948966 rad
|
||||
pos: -2.5,2.5
|
||||
parent: 1
|
||||
- uid: 7
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 1.5707963267948966 rad
|
||||
pos: 3.5,2.5
|
||||
parent: 1
|
||||
- uid: 11
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 1.5707963267948966 rad
|
||||
pos: 5.5,3.5
|
||||
parent: 1
|
||||
- uid: 23
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 1.5707963267948966 rad
|
||||
pos: -4.5,4.5
|
||||
parent: 1
|
||||
- uid: 25
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 1.5707963267948966 rad
|
||||
pos: 5.5,4.5
|
||||
parent: 1
|
||||
- uid: 27
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 1.5707963267948966 rad
|
||||
pos: 3.5,3.5
|
||||
parent: 1
|
||||
- uid: 37
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 6.5,3.5
|
||||
parent: 1
|
||||
- uid: 38
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -1.5,2.5
|
||||
parent: 1
|
||||
- uid: 39
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 2.5,2.5
|
||||
parent: 1
|
||||
- uid: 40
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 0.5,2.5
|
||||
parent: 1
|
||||
- uid: 45
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -2.5,1.5
|
||||
parent: 1
|
||||
- uid: 46
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -1.5,1.5
|
||||
parent: 1
|
||||
- uid: 47
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 0.5,1.5
|
||||
parent: 1
|
||||
- uid: 48
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 2.5,1.5
|
||||
parent: 1
|
||||
- uid: 49
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 3.5,1.5
|
||||
parent: 1
|
||||
- uid: 50
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -0.5,1.5
|
||||
parent: 1
|
||||
- uid: 51
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 1.5,1.5
|
||||
parent: 1
|
||||
- uid: 61
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 1.5,0.5
|
||||
parent: 1
|
||||
- uid: 87
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 1.5707963267948966 rad
|
||||
pos: -4.5,3.5
|
||||
parent: 1
|
||||
- uid: 125
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -5.5,3.5
|
||||
parent: 1
|
||||
- uid: 128
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 1.5707963267948966 rad
|
||||
pos: -2.5,3.5
|
||||
parent: 1
|
||||
- proto: WallReinforcedDiagonal
|
||||
entities:
|
||||
- uid: 34
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -6.5,3.5
|
||||
parent: 1
|
||||
- uid: 35
|
||||
components:
|
||||
- type: Transform
|
||||
pos: -5.5,4.5
|
||||
parent: 1
|
||||
- uid: 41
|
||||
components:
|
||||
- type: Transform
|
||||
rot: -1.5707963267948966 rad
|
||||
pos: -1.5,3.5
|
||||
parent: 1
|
||||
- uid: 42
|
||||
components:
|
||||
- type: Transform
|
||||
rot: -1.5707963267948966 rad
|
||||
pos: 6.5,4.5
|
||||
parent: 1
|
||||
- uid: 43
|
||||
components:
|
||||
- type: Transform
|
||||
rot: -1.5707963267948966 rad
|
||||
pos: 7.5,3.5
|
||||
parent: 1
|
||||
- uid: 44
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 2.5,3.5
|
||||
parent: 1
|
||||
- uid: 52
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 1.5707963267948966 rad
|
||||
pos: -5.5,0.5
|
||||
parent: 1
|
||||
- uid: 53
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 3.141592653589793 rad
|
||||
pos: 6.5,0.5
|
||||
parent: 1
|
||||
- proto: WeaponTurretPinhole
|
||||
entities:
|
||||
- uid: 3
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 3.141592653589793 rad
|
||||
pos: -0.5,2.5
|
||||
parent: 1
|
||||
- uid: 4
|
||||
components:
|
||||
- type: Transform
|
||||
rot: 3.141592653589793 rad
|
||||
pos: 1.5,2.5
|
||||
parent: 1
|
||||
...
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -4,8 +4,8 @@ meta:
|
||||
engineVersion: 271.2.0
|
||||
forkId: ""
|
||||
forkVersion: ""
|
||||
time: 03/29/2026 13:24:50
|
||||
entityCount: 860
|
||||
time: 04/01/2026 21:50:52
|
||||
entityCount: 861
|
||||
maps: []
|
||||
grids:
|
||||
- 1
|
||||
@@ -101,10 +101,10 @@ entities:
|
||||
- type: OccluderTree
|
||||
- type: SpreaderGrid
|
||||
spreadQueues:
|
||||
Kudzu: []
|
||||
Smoke: []
|
||||
Puddle: []
|
||||
MetalFoam: []
|
||||
Smoke: []
|
||||
Kudzu: []
|
||||
- type: Shuttle
|
||||
dampingModifier: 0.25
|
||||
- type: GridPathfinding
|
||||
@@ -598,6 +598,7 @@ entities:
|
||||
- type: Roof
|
||||
data:
|
||||
0,2: 0
|
||||
- type: ThermalSignature
|
||||
- proto: AirAlarm
|
||||
entities:
|
||||
- uid: 10
|
||||
@@ -3404,6 +3405,13 @@ entities:
|
||||
- type: Transform
|
||||
pos: -3.5,-0.5
|
||||
parent: 1
|
||||
- proto: OreBox
|
||||
entities:
|
||||
- uid: 418
|
||||
components:
|
||||
- type: Transform
|
||||
pos: 0.5,21.5
|
||||
parent: 1
|
||||
- proto: OreProcessor
|
||||
entities:
|
||||
- uid: 336
|
||||
|
||||
@@ -1900,7 +1900,7 @@ entities:
|
||||
- type: Transform
|
||||
pos: -9.5,6.5
|
||||
parent: 2
|
||||
- proto: BaseResearchAndDevelopmentPointSource
|
||||
- proto: DatafarmResearchFaction
|
||||
entities:
|
||||
- uid: 82
|
||||
components:
|
||||
|
||||
@@ -47,8 +47,8 @@
|
||||
- type: MobThresholds
|
||||
thresholds:
|
||||
0: Alive
|
||||
150: Critical # Monolith
|
||||
250: Dead # Monolith
|
||||
200: Critical # Monolith
|
||||
300: Dead # Monolith
|
||||
stateAlertDict:
|
||||
Alive: BorgHealth
|
||||
Critical: BorgCrit
|
||||
@@ -191,7 +191,7 @@
|
||||
thresholds:
|
||||
- trigger:
|
||||
!type:DamageTrigger
|
||||
damage: 75
|
||||
damage: 100 # Monolith
|
||||
behaviors:
|
||||
- !type:PlaySoundBehavior
|
||||
sound:
|
||||
@@ -200,7 +200,7 @@
|
||||
volume: 5
|
||||
- trigger:
|
||||
!type:DamageTrigger
|
||||
damage: 350 # Monolith
|
||||
damage: 400 # Monolith
|
||||
behaviors:
|
||||
- !type:PlaySoundBehavior
|
||||
sound:
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
- ActionJumpToCore
|
||||
- ActionSurvCameraLights
|
||||
- ActionAIViewLaws
|
||||
- ActionOpenRemoteDevicesMenu # Corvax-Next-AiRemoteControl
|
||||
- type: UserInterface
|
||||
interfaces:
|
||||
enum.RadarConsoleUiKey.Key:
|
||||
@@ -50,6 +51,8 @@
|
||||
type: SiliconLawBoundUserInterface
|
||||
enum.CommunicationsConsoleUiKey.Key:
|
||||
type: CommunicationsConsoleBoundUserInterface
|
||||
enum.RemoteDeviceUiKey.Key: # Corvax-Next-AiRemoteControl
|
||||
type: RemoteDevicesBoundUserInterface
|
||||
- type: IntrinsicUI
|
||||
uis:
|
||||
enum.RadarConsoleUiKey.Key:
|
||||
@@ -116,6 +119,7 @@
|
||||
whitelist:
|
||||
tags:
|
||||
- StationAi
|
||||
- CanPilot # Mono
|
||||
- type: ContainerContainer
|
||||
containers:
|
||||
station_ai_mind_slot: !type:ContainerSlot
|
||||
@@ -508,6 +512,7 @@
|
||||
- HideContextMenu
|
||||
- StationAi
|
||||
- NoConsoleSound
|
||||
- CanPilot #Mono
|
||||
- type: StartingMindRole
|
||||
mindRole: "MindRoleSiliconBrain"
|
||||
silent: true
|
||||
|
||||
@@ -22,8 +22,8 @@
|
||||
soundGunshot:
|
||||
path: /Audio/Weapons/Guns/Gunshots/laser.ogg
|
||||
- type: Battery
|
||||
maxCharge: 1000
|
||||
startingCharge: 1000
|
||||
maxCharge: 1500 # Mono: 1k >> 1.5k
|
||||
startingCharge: 1500 # Mono: 1k >> 1.5k
|
||||
- type: StaticPrice
|
||||
price: 500
|
||||
- type: Cautery # Shitmed
|
||||
@@ -68,7 +68,7 @@
|
||||
path: /Audio/Weapons/Guns/Gunshots/laser.ogg
|
||||
- type: HitscanBatteryAmmoProvider
|
||||
proto: RedLightLaser
|
||||
fireCost: 50
|
||||
fireCost: 20 # Mono: pistol lasers shoot efficiently
|
||||
- type: PowerCellSlot
|
||||
cellSlotId: gun_magazine
|
||||
- type: ItemSlots
|
||||
@@ -107,6 +107,9 @@
|
||||
- type: Tag
|
||||
tags:
|
||||
- Sidearm
|
||||
- type: Battery # Mono: Keeps charge for smaller energy weapons
|
||||
maxCharge: 1000
|
||||
startingCharge: 1000
|
||||
- type: Clothing
|
||||
sprite: Objects/Weapons/Guns/Battery/taser.rsi
|
||||
quickEquip: false
|
||||
@@ -146,6 +149,14 @@
|
||||
shader: unshaded
|
||||
- type: Item
|
||||
sprite: Objects/Weapons/Guns/Battery/svalinn.rsi
|
||||
- type: Gun
|
||||
burstCooldown: 0.75
|
||||
burstFireRate: 3
|
||||
shotsPerBurst: 3
|
||||
selectedMode: SemiAuto
|
||||
availableModes:
|
||||
- SemiAuto
|
||||
- Burst
|
||||
- type: MagazineVisuals
|
||||
magState: mag
|
||||
steps: 5
|
||||
@@ -169,7 +180,7 @@
|
||||
shader: unshaded
|
||||
- type: HitscanBatteryAmmoProvider
|
||||
proto: RedMediumLaser
|
||||
fireCost: 83.3
|
||||
fireCost: 33.3 # Mono: 83.3 >> 33.3
|
||||
- type: MagazineVisuals
|
||||
magState: mag
|
||||
steps: 5
|
||||
@@ -201,7 +212,7 @@
|
||||
sprite: Objects/Weapons/Guns/Battery/makeshift.rsi
|
||||
- type: HitscanBatteryAmmoProvider
|
||||
proto: RedLaser
|
||||
fireCost: 62.5
|
||||
fireCost: 35 # Mono: 62.5 >> 35
|
||||
- type: Battery
|
||||
maxCharge: 500
|
||||
startingCharge: 500
|
||||
@@ -262,7 +273,7 @@
|
||||
- SemiAuto
|
||||
- type: HitscanBatteryAmmoProvider
|
||||
proto: RedLaserPractice
|
||||
fireCost: 35 #Mono: 62.5 >> 35
|
||||
fireCost: 30 #Mono: 62.5 >> 30
|
||||
- type: StaticPrice
|
||||
price: 300
|
||||
|
||||
@@ -276,9 +287,14 @@
|
||||
price: 500
|
||||
- type: HitscanBatteryAmmoProvider
|
||||
proto: RedMediumLaser #Mono: RedLaser >> RedMediumLaser
|
||||
fireCost: 35 #Mono: 62.5 >> 35
|
||||
fireCost: 30 #Mono: 62.5 >> 30
|
||||
- type: PirateBountyItem # Mono
|
||||
id: StandardFactionLongarm
|
||||
- type: Gun
|
||||
selectedMode: SemiAuto
|
||||
availableModes:
|
||||
- SemiAuto
|
||||
- FullAuto
|
||||
|
||||
- type: entity
|
||||
name: LWC pulse pistol
|
||||
@@ -495,7 +511,7 @@
|
||||
path: /Audio/Weapons/Guns/Gunshots/laser_cannon.ogg
|
||||
- type: HitscanBatteryAmmoProvider
|
||||
proto: RedHeavyLaser
|
||||
fireCost: 250
|
||||
fireCost: 160
|
||||
- type: Battery
|
||||
maxCharge: 4000
|
||||
startingCharge: 4000
|
||||
@@ -555,7 +571,7 @@
|
||||
path: /Audio/Weapons/Guns/Gunshots/laser3.ogg
|
||||
- type: HitscanBatteryAmmoProvider
|
||||
proto: XrayLaser
|
||||
fireCost: 200
|
||||
fireCost: 133.3
|
||||
- type: MagazineVisuals
|
||||
magState: mag
|
||||
steps: 5
|
||||
@@ -727,7 +743,7 @@
|
||||
path: /Audio/Weapons/Guns/Gunshots/laser_cannon.ogg
|
||||
- type: HitscanBatteryAmmoProvider
|
||||
proto: RedMediumLaser
|
||||
fireCost: 100
|
||||
fireCost: 50 # Mono: 100 >> 50
|
||||
- type: BatterySelfRecharger
|
||||
autoRecharge: true
|
||||
autoRechargeRate: 40
|
||||
@@ -774,10 +790,10 @@
|
||||
path: /Audio/Weapons/Guns/Gunshots/laser_cannon.ogg
|
||||
- type: HitscanBatteryAmmoProvider
|
||||
proto: RedMediumLaser
|
||||
fireCost: 100
|
||||
fireCost: 50 # Mono: 100 >> 50
|
||||
- type: BatterySelfRecharger
|
||||
autoRecharge: true
|
||||
autoRechargeRate: 30
|
||||
autoRechargeRate: 20 # Mono 30 >> 20
|
||||
- type: MagazineVisuals
|
||||
magState: mag
|
||||
steps: 5
|
||||
|
||||
@@ -510,6 +510,7 @@
|
||||
- MonoRogueWeaponsDynamicRanged
|
||||
- MonoRogueMiscDynamic
|
||||
- MonoUSSPMiscDynamic
|
||||
- MonoViperGroupDynamic
|
||||
- MonoUSSPWeaponsDynamicRanged
|
||||
- UniversalShellAmmo
|
||||
- ResearchedExplosives
|
||||
|
||||
@@ -65,15 +65,17 @@
|
||||
- Science
|
||||
|
||||
- type: entity
|
||||
abstract: true # Mono: Abstract
|
||||
id: BaseResearchAndDevelopmentPointSource
|
||||
parent: DatafarmResearchFaction # Mono: Changed to parent off of new research generation servers to replace existing mapped generators
|
||||
name: bolted data farm (Research) # Mono
|
||||
description: A power-hungry server dedicated towards scraping data from... somewhere. This one generates research points at a rate of 35 per second. It seems to be bolted to the floor. # Mono
|
||||
suffix: Unused
|
||||
description: A power-hungry server dedicated towards scraping data from... somewhere. This one generates research points at a rate of 125 per second. It seems to be bolted to the floor. # Mono
|
||||
# We should make this abstract once there are actual point sources.
|
||||
components:
|
||||
- type: ResearchClient
|
||||
- type: ResearchPointSource
|
||||
pointsPerSecond: 35
|
||||
pointsPerSecond: 125
|
||||
active: true
|
||||
- type: PointLight
|
||||
radius: 1.5
|
||||
|
||||
@@ -202,7 +202,7 @@
|
||||
# mask: # Frontier
|
||||
# - FullTileMask # Frontier
|
||||
layer:
|
||||
- GlassLayer # Frontier: WallLayer<GlassLayer
|
||||
- DiagonalGlassLayer # Mono: WallLayer<DiagonalGlassLayer
|
||||
- type: Construction
|
||||
graph: GrilleDiagonal
|
||||
node: grilleDiagonal
|
||||
@@ -240,7 +240,7 @@
|
||||
# mask: # Frontier
|
||||
# - FullTileMask # Frontier
|
||||
layer:
|
||||
- GlassLayer # Frontier: WallLayer<GlassLayer
|
||||
- DiagonalGlassLayer # Mono: WallLayer<DiagonalGlassLayer
|
||||
- type: Construction
|
||||
graph: GrilleDiagonal
|
||||
node: clockworkGrilleDiagonal
|
||||
|
||||
@@ -352,6 +352,10 @@
|
||||
- type: Construction # Mono
|
||||
graph: Girder
|
||||
node: plastitaniumWall
|
||||
- type: Tag # Mono
|
||||
tags:
|
||||
- Wall
|
||||
- WallT3
|
||||
|
||||
- type: entity
|
||||
parent: [ WallPlastitaniumDiagonalIndestructible, BaseWallTierTwo ] # Mono
|
||||
|
||||
@@ -15,7 +15,6 @@
|
||||
time: 10
|
||||
group: Medicinal
|
||||
solids:
|
||||
FoodPoppy: 1
|
||||
Brutepack: 1
|
||||
MaterialCloth1: 1
|
||||
reagents:
|
||||
@@ -30,10 +29,9 @@
|
||||
time: 10
|
||||
group: Medicinal
|
||||
solids:
|
||||
FoodAloe: 1
|
||||
Ointment: 1
|
||||
MaterialCloth1: 1
|
||||
reagents:
|
||||
Sigynate: 20
|
||||
Leporazine: 20
|
||||
Dermaline: 20
|
||||
recipeType: MedicalAssembler # Frontier
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
- PositronicBrain
|
||||
- SciFlash
|
||||
- CyborgEndoskeleton
|
||||
- AiRemoteBrain
|
||||
|
||||
- type: latheRecipePack
|
||||
id: BorgModulesStatic
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
# SPDX-FileCopyrightText: 2025 GoobBot <uristmchands@proton.me>
|
||||
# SPDX-FileCopyrightText: 2025 KillanGenifer <killangenifer@gmail.com>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
- type: entity
|
||||
id: ActionBackToAi
|
||||
name: Back to Ai
|
||||
description: Sends your mind back to the core.
|
||||
components:
|
||||
- type: InstantAction
|
||||
checkConsciousness: false
|
||||
checkCanInteract: false
|
||||
priority: -9
|
||||
itemIconStyle: BigAction
|
||||
icon:
|
||||
sprite: Interface/Actions/actions_ai.rsi
|
||||
state: ai_core
|
||||
event: !type:ReturnMindIntoAiEvent
|
||||
|
||||
- type: entity
|
||||
id: ActionOpenRemoteDevicesMenu
|
||||
name: Open list of remote devices
|
||||
description: Opens a menu with available remote devices.
|
||||
components:
|
||||
- type: InstantAction
|
||||
checkConsciousness: false
|
||||
checkCanInteract: false
|
||||
priority: -9
|
||||
itemIconStyle: BigAction
|
||||
event: !type:ToggleRemoteDevicesScreenEvent
|
||||
icon:
|
||||
sprite: Mobs/Silicon/chassis.rsi
|
||||
state: robot
|
||||
@@ -0,0 +1,20 @@
|
||||
# SPDX-FileCopyrightText: 2025 GoobBot <uristmchands@proton.me>
|
||||
# SPDX-FileCopyrightText: 2025 KillanGenifer <killangenifer@gmail.com>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
- type: entity
|
||||
parent: BaseItem
|
||||
id: AiRemoteBrain
|
||||
name: "AI-Cyborg Network Device"
|
||||
description: Artificial Intelligence cyborg control board.
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: Objects/Misc/module.rsi
|
||||
state: boris
|
||||
- type: Examiner
|
||||
- type: AiRemoteBrain
|
||||
- type: Actions
|
||||
- type: Tag
|
||||
tags:
|
||||
- CannotSuicide
|
||||
@@ -39,6 +39,16 @@
|
||||
# priority: 2500 #should not matter, but big enough to override all the rest
|
||||
|
||||
|
||||
- type: entity
|
||||
id: BiomeSourceFarReachesIV
|
||||
parent: BaseBiomeSource
|
||||
name: far reaches IV biome source
|
||||
components:
|
||||
- type: SpaceBiomeSource
|
||||
id: BiomeFarReachesIV
|
||||
swapDistance: 50000 # fallback
|
||||
priority: 125
|
||||
|
||||
- type: entity
|
||||
id: BiomeSourceFarReachesIII
|
||||
parent: BaseBiomeSource
|
||||
@@ -46,7 +56,7 @@
|
||||
components:
|
||||
- type: SpaceBiomeSource
|
||||
id: BiomeFarReachesIII
|
||||
swapDistance: 28000 #beyond this is fallback
|
||||
swapDistance: 30000
|
||||
priority: 250
|
||||
|
||||
- type: entity
|
||||
|
||||
@@ -17,6 +17,11 @@
|
||||
|
||||
#far reaches
|
||||
|
||||
- type: ambientSpaceBiome
|
||||
id: BiomeFarReachesIV
|
||||
name: Far Reaches IV
|
||||
description: "Is it really worth it?"
|
||||
|
||||
- type: ambientSpaceBiome
|
||||
id: BiomeFarReachesIII
|
||||
name: Far Reaches III
|
||||
|
||||
@@ -112,6 +112,12 @@
|
||||
|
||||
### BIOME AMBIENT
|
||||
|
||||
# far reaches III
|
||||
- type: ambientMusic
|
||||
id: BiomeFarReachesIV
|
||||
sound:
|
||||
collection: BiomeFarReachesIII
|
||||
|
||||
# far reaches III
|
||||
- type: ambientMusic
|
||||
id: BiomeFarReachesIII
|
||||
|
||||
@@ -26,20 +26,27 @@
|
||||
path: /Audio/_DV/Weapons/Guns/Gunshots/laser.ogg
|
||||
soundEmpty:
|
||||
path: /Audio/_DV/Weapons/Guns/Empty/dry_fire.ogg
|
||||
burstFireRate: 4 # Mono burstfire and modeswitching
|
||||
shotsPerBurst: 3
|
||||
burstCooldown: 0.75
|
||||
selectedMode: SemiAuto
|
||||
availableModes:
|
||||
- SemiAuto
|
||||
- Burst
|
||||
- type: Battery
|
||||
maxCharge: 2250 # Mono 2000->2250
|
||||
startingCharge: 2250 # Mono 2000->2250
|
||||
- type: ProjectileBatteryAmmoProvider
|
||||
proto: BulletDisabler
|
||||
fireCost: 75 # 100->75
|
||||
fireCost: 45 # 100->45
|
||||
- type: EnergyGun
|
||||
fireModes:
|
||||
- proto: BulletDisabler
|
||||
fireCost: 75 # 100->75
|
||||
fireCost: 45 # Mono 100->45
|
||||
name: disable
|
||||
state: disabler
|
||||
- proto: BulletEnergyGunLaser
|
||||
fireCost: 150 # 200->150
|
||||
fireCost: 75 # Mono 200->75
|
||||
name: kill
|
||||
state: lethal
|
||||
- type: MagazineVisuals
|
||||
@@ -86,6 +93,13 @@
|
||||
path: /Audio/_DV/Weapons/Guns/Gunshots/laser.ogg
|
||||
soundEmpty:
|
||||
path: /Audio/_DV/Weapons/Guns/Empty/dry_fire.ogg
|
||||
burstFireRate: 4 # Mono burstfire and modeswitching
|
||||
shotsPerBurst: 3
|
||||
burstCooldown: 0.75
|
||||
selectedMode: SemiAuto
|
||||
availableModes:
|
||||
- SemiAuto
|
||||
- Burst
|
||||
- type: Battery
|
||||
maxCharge: 2250 # Mono 2000->2250
|
||||
startingCharge: 2250 # Mono 2000->2250
|
||||
@@ -94,15 +108,15 @@
|
||||
autoRechargeRate: 25
|
||||
- type: ProjectileBatteryAmmoProvider
|
||||
proto: BulletDisabler
|
||||
fireCost: 75 # 100->75
|
||||
fireCost: 45 # 100->45
|
||||
- type: EnergyGun
|
||||
fireModes:
|
||||
- proto: BulletDisabler
|
||||
fireCost: 75 # 100->75
|
||||
fireCost: 45 # Mono 100->45
|
||||
name: disable
|
||||
state: disabler
|
||||
- proto: BulletEnergyGunLaser
|
||||
fireCost: 150 # 200->150
|
||||
fireCost: 75 # Mono 200->75
|
||||
name: kill
|
||||
state: lethal
|
||||
- type: MagazineVisuals
|
||||
@@ -144,24 +158,31 @@
|
||||
sprite: _DV/Objects/Weapons/Guns/Battery/multiphase_energygun.rsi
|
||||
- type: Gun
|
||||
fireRate: 2.5
|
||||
shotsPerBurst: 3
|
||||
burstCooldown: 0.5
|
||||
burstFireRate: 6
|
||||
selectedMode: SemiAuto
|
||||
availableModes:
|
||||
- SemiAuto
|
||||
- Burst
|
||||
soundGunshot:
|
||||
path: /Audio/_DV/Weapons/Guns/Gunshots/laser.ogg
|
||||
soundEmpty:
|
||||
path: /Audio/_DV/Weapons/Guns/Empty/dry_fire.ogg
|
||||
- type: Battery
|
||||
maxCharge: 3750 # Mono 2000->3750
|
||||
startingCharge: 3750 # Mono 2000->3750
|
||||
maxCharge: 3600 # Mono 2000->3600
|
||||
startingCharge: 3600 # Mono 2000->3600
|
||||
- type: ProjectileBatteryAmmoProvider
|
||||
proto: BulletDisabler
|
||||
fireCost: 75 # Mono 100 -> 75
|
||||
fireCost: 60 # Mono 100 -> 60
|
||||
- type: EnergyGun
|
||||
fireModes:
|
||||
- proto: BulletDisabler
|
||||
fireCost: 75 # Mono 100 -> 75
|
||||
fireCost: 60 # Mono 100 -> 60
|
||||
name: disable
|
||||
state: disabler
|
||||
- proto: BulletEnergyGunLaser
|
||||
fireCost: 150 # Mono 200 -> 150
|
||||
fireCost: 90 # Mono 200 -> 90
|
||||
name: lethal
|
||||
state: lethal
|
||||
# - proto: BulletEnergyGunIon
|
||||
|
||||
@@ -1,3 +1,8 @@
|
||||
# SPDX-FileCopyrightText: 2025 GoobBot <uristmchands@proton.me>
|
||||
# SPDX-FileCopyrightText: 2025 ImHoks <imhokzzzz@gmail.com>
|
||||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
- type: latheRecipe
|
||||
id: ModsuitChestplate
|
||||
result: ModsuitChestplate
|
||||
@@ -50,3 +55,14 @@
|
||||
materials:
|
||||
Glass: 550
|
||||
Plasma: 250
|
||||
|
||||
# AI
|
||||
- type: latheRecipe
|
||||
id: AiRemoteBrain
|
||||
result: AiRemoteBrain
|
||||
completetime: 4
|
||||
materials:
|
||||
Steel: 300
|
||||
Glass: 400
|
||||
Gold: 400
|
||||
Silver: 200
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
- type: entity
|
||||
parent: CrateAmmoSecureMercenary
|
||||
id: CrateAmmoBoxVanyk
|
||||
name: ASM-302 Vanyk HEAT missile box
|
||||
name: ASM-150 Vanyk HEAT missile box
|
||||
description: Contains 60 missles. 2 full loads.
|
||||
components:
|
||||
- type: StorageFill
|
||||
@@ -73,7 +73,7 @@
|
||||
- type: entity
|
||||
parent: CrateAmmoSecureMercenary
|
||||
id: CrateAmmoBoxVespera
|
||||
name: ASM-417 Vespera HE missile box
|
||||
name: ADMP-50 Vespera HE missile box
|
||||
description: Contains 12 bursts of 13 missiles. 2 full loads.
|
||||
components:
|
||||
- type: StorageFill
|
||||
@@ -84,7 +84,7 @@
|
||||
- type: entity
|
||||
parent: CrateAmmoSecureMercenary
|
||||
id: CrateAmmoBoxTovek
|
||||
name: ASM-557 Tovek EMPHE missile box
|
||||
name: ASM-250 Tovek EMPHE missile box
|
||||
description: Contains 4 missiles, 2 loads worth.
|
||||
components:
|
||||
- type: StorageFill
|
||||
|
||||
@@ -10,12 +10,24 @@
|
||||
Slash: 0.9
|
||||
Piercing: 0.9
|
||||
|
||||
# Chimera
|
||||
|
||||
- type: damageModifierSet
|
||||
id: Chimera
|
||||
coefficients:
|
||||
Heat: 1.4
|
||||
Cold: 0.6
|
||||
Radiation: 1.55
|
||||
Shock: 1.2
|
||||
Blunt: 0.2
|
||||
Slash: 0.6
|
||||
|
||||
# Cyborgs
|
||||
|
||||
- type: damageModifierSet # Mono
|
||||
id: BaseBorgChassis
|
||||
coefficients:
|
||||
Heat: 1.5
|
||||
Heat: 1
|
||||
Cold: 0
|
||||
Shock: 2.5
|
||||
Blunt: 0.6
|
||||
@@ -141,6 +153,7 @@
|
||||
Piercing: 6
|
||||
Heat: 5
|
||||
|
||||
|
||||
# IPC
|
||||
|
||||
- type: damageModifierSet
|
||||
|
||||
@@ -331,6 +331,41 @@
|
||||
- state: equipped-decor-shoulder-patch
|
||||
color: "#cd6b6b"
|
||||
|
||||
#Viper Group
|
||||
- type: entity
|
||||
parent: ClothingUniformBase
|
||||
id: ClothingUniformJumpsuitViperGroupUniform
|
||||
name: viper group uniform
|
||||
description: A uniform bearing the colours of the vipers.
|
||||
components:
|
||||
- type: StaticPrice
|
||||
price: 700
|
||||
vendPrice: 1150
|
||||
- type: Sprite
|
||||
sprite: _Mono/Clothing/Uniforms/Jumpsuit/viper_group_uniform.rsi
|
||||
- type: Clothing
|
||||
sprite: _Mono/Clothing/Uniforms/Jumpsuit/viper_group_uniform.rsi
|
||||
- type: SuitSensor
|
||||
randomMode: false
|
||||
mode: SensorVitals
|
||||
|
||||
- type: entity
|
||||
parent: ClothingUniformBase
|
||||
id: ClothingUniformJumpsuitViperGroupTurtleneck
|
||||
name: viper group turtleneck
|
||||
description: A turtleneck bearing the colours of the vipers.
|
||||
components:
|
||||
- type: StaticPrice
|
||||
price: 700
|
||||
vendPrice: 1150
|
||||
- type: Sprite
|
||||
sprite: _Mono/Clothing/Uniforms/Jumpsuit/viper_group_turtleneck.rsi
|
||||
- type: Clothing
|
||||
sprite: _Mono/Clothing/Uniforms/Jumpsuit/viper_group_turtleneck.rsi
|
||||
- type: SuitSensor
|
||||
randomMode: false
|
||||
mode: SensorVitals
|
||||
|
||||
#PMC camo suits
|
||||
- type: entity
|
||||
parent: ClothingUniformBase
|
||||
|
||||
@@ -43,6 +43,21 @@
|
||||
- type: Clothing
|
||||
sprite: _Mono/Clothing/Neck/Misc/heavyovercoat.rsi
|
||||
|
||||
# Viper Group
|
||||
|
||||
- type: entity
|
||||
parent: ClothingNeckBase
|
||||
id: ClothingNeckViperGroupMantle
|
||||
name: viper group mantle
|
||||
description: A mantle bearing the colours and mark of a viper.
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: _Mono/Clothing/Neck/Misc/viper_group_mantle.rsi
|
||||
- type: Clothing
|
||||
sprite: _Mono/Clothing/Neck/Misc/viper_group_mantle.rsi
|
||||
- type: Item
|
||||
size: Normal
|
||||
|
||||
# Bomb Collars
|
||||
|
||||
- type: entity
|
||||
|
||||
+1
-1
@@ -133,7 +133,7 @@
|
||||
- type: Sprite
|
||||
sprite: _Mono/Clothing/OuterClothing/Armor/bulletproof_stabproof.rsi
|
||||
- type: Clothing
|
||||
sprite: _Mono/Clothing/OuterClothing/Armor/bulletproof_stabprooft.rsi
|
||||
sprite: _Mono/Clothing/OuterClothing/Armor/bulletproof_stabproof.rsi
|
||||
- type: Armor
|
||||
modifiers:
|
||||
coefficients:
|
||||
|
||||
+2
-2
@@ -121,8 +121,8 @@
|
||||
- type: StaminaDamageResistance # Mono - Stamres
|
||||
coefficient: 0.34
|
||||
- type: ClothingSpeedModifier
|
||||
walkModifier: 0.67
|
||||
sprintModifier: 0.67
|
||||
walkModifier: 0.75
|
||||
sprintModifier: 0.75
|
||||
- type: HeldSpeedModifier
|
||||
- type: ToggleableClothing # Goobstation - Modsuits change - Mono - this is a solution for helmet attachment/cover to not fit on hardsuits
|
||||
requiredSlot: outerclothing
|
||||
|
||||
@@ -34,21 +34,21 @@
|
||||
thresholds:
|
||||
- trigger:
|
||||
!type:DamageTrigger
|
||||
damage: 40
|
||||
damage: 30
|
||||
behaviors:
|
||||
- !type:DoActsBehavior
|
||||
acts: [ "Destruction" ]
|
||||
- type: TrayScanReveal
|
||||
- type: Kudzu
|
||||
growthTickChance: 0.2
|
||||
spreadChance: 0.5
|
||||
spreadChance: 0.35
|
||||
# Heals each time it manages to do a growth tick:
|
||||
damageRecovery:
|
||||
types:
|
||||
Slash: -1.25
|
||||
Heat: -1.25
|
||||
Cold: -1.25
|
||||
Blunt: -1.5
|
||||
Slash: -1
|
||||
Heat: -1
|
||||
Cold: -1
|
||||
Blunt: -1.25
|
||||
- type: Flammable
|
||||
fireSpread: true
|
||||
alwaysCombustible: true
|
||||
@@ -58,8 +58,8 @@
|
||||
Heat: 9
|
||||
- type: AtmosExposed
|
||||
- type: SpeedModifierContacts
|
||||
walkSpeedModifier: 0.25
|
||||
sprintSpeedModifier: 0.25
|
||||
walkSpeedModifier: 0.45
|
||||
sprintSpeedModifier: 0.45
|
||||
ignoreWhitelist:
|
||||
tags:
|
||||
- Chimera
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
- type: damageModifierSet
|
||||
id: Chimera
|
||||
coefficients:
|
||||
Heat: 1.4
|
||||
Cold: 0.6
|
||||
Radiation: 1.55
|
||||
Shock: 1.2
|
||||
Blunt: 0.2
|
||||
Slash: 0.6
|
||||
Piercing: 1
|
||||
@@ -94,12 +94,15 @@
|
||||
- ActionJumpToCore
|
||||
- ActionSurvCameraLights
|
||||
- ActionAIViewLaws
|
||||
- ActionOpenRemoteDevicesMenu # Corvax-Next-AiRemoteControl
|
||||
- type: UserInterface
|
||||
interfaces:
|
||||
enum.RadarConsoleUiKey.Key:
|
||||
type: RadarConsoleBoundUserInterface
|
||||
enum.SiliconLawsUiKey.Key:
|
||||
type: SiliconLawBoundUserInterface
|
||||
enum.RemoteDeviceUiKey.Key: # Corvax-Next-AiRemoteControl
|
||||
type: RemoteDevicesBoundUserInterface
|
||||
- type: IntrinsicUI
|
||||
uis:
|
||||
enum.RadarConsoleUiKey.Key:
|
||||
@@ -115,9 +118,6 @@
|
||||
- sprite: Mobs/Silicon/station_ai.rsi
|
||||
state: default
|
||||
- type: ShowJobIcons
|
||||
- type: Tag
|
||||
tags:
|
||||
- CanPilot
|
||||
- type: AdvancedPilot # can use both gunnery and shuttle console even on capitals
|
||||
|
||||
- type: entity
|
||||
@@ -374,6 +374,10 @@
|
||||
- MonoRemnantCoreTitle
|
||||
- MonoRemnantAdjective
|
||||
- MonoRemnantNoun
|
||||
- type: ShuttleBoostingPilot
|
||||
angularMultiplier: 1.5
|
||||
accelerationMultiplier: 1.4
|
||||
maxVelMultiplier: 1.1
|
||||
|
||||
- type: entity
|
||||
id: AiHeldRedacted
|
||||
|
||||
@@ -198,7 +198,7 @@
|
||||
- type: Battery
|
||||
maxCharge: 500
|
||||
- type: ProjectileBatteryAmmoProvider
|
||||
proto: ShipMissileASM302
|
||||
proto: ShipMissileASM150
|
||||
fireCost: 300
|
||||
- type: Appearance
|
||||
- type: AmmoCounter
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
openState: tsfgygax-open
|
||||
brokenState: tsfgygax-broken
|
||||
- type: RadarBlip # Mono
|
||||
radarColor: "#047ABD"
|
||||
radarColor: "#028EDE"
|
||||
scale: 1.5
|
||||
requireNoGrid: true
|
||||
shape: square
|
||||
@@ -134,7 +134,7 @@
|
||||
openState: tsfdurand-open
|
||||
brokenState: tsfdurand-broken
|
||||
- type: RadarBlip # Mono
|
||||
radarColor: "#047ABD"
|
||||
radarColor: "#028EDE"
|
||||
scale: 1.5
|
||||
requireNoGrid: true
|
||||
shape: square
|
||||
@@ -297,7 +297,7 @@
|
||||
openState: tsfbroadsword-open
|
||||
brokenState: tsfbroadsword-broken
|
||||
- type: RadarBlip
|
||||
radarColor: "#047ABD"
|
||||
radarColor: "#028EDE"
|
||||
scale: 3
|
||||
requireNoGrid: true
|
||||
shape: square
|
||||
@@ -380,7 +380,7 @@
|
||||
openState: tsfbroadsword-open
|
||||
brokenState: tsfbroadsword-broken
|
||||
- type: RadarBlip
|
||||
radarColor: "#047ABD"
|
||||
radarColor: "#028EDE"
|
||||
scale: 3
|
||||
requireNoGrid: true
|
||||
shape: square
|
||||
@@ -525,7 +525,7 @@
|
||||
openState: tsfflail-open
|
||||
brokenState: tsfflail-broken
|
||||
- type: RadarBlip
|
||||
radarColor: "#047ABD"
|
||||
radarColor: "#028EDE"
|
||||
scale: 3
|
||||
requireNoGrid: true
|
||||
shape: square
|
||||
@@ -616,7 +616,7 @@
|
||||
openState: tsfflail-open
|
||||
brokenState: tsfflail-broken
|
||||
- type: RadarBlip
|
||||
radarColor: "#047ABD"
|
||||
radarColor: "#028EDE"
|
||||
scale: 3
|
||||
requireNoGrid: true
|
||||
shape: square
|
||||
@@ -691,7 +691,7 @@
|
||||
openState: tsfflail-open
|
||||
brokenState: tsfflail-broken
|
||||
- type: RadarBlip
|
||||
radarColor: "#047ABD"
|
||||
radarColor: "#028EDE"
|
||||
scale: 3
|
||||
requireNoGrid: true
|
||||
shape: square
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
id: JetpackADM
|
||||
parent: BaseJetpack
|
||||
name: pre-fracture jetpack
|
||||
description: An exotic, pre-fracture jetpack which is not detected by modern scanners.
|
||||
description: An exotic, pre-fracture stealth jetpack, rated to be invisible to radar beyond 16 meters.
|
||||
suffix: Empty
|
||||
components:
|
||||
- type: Item
|
||||
@@ -13,7 +13,7 @@
|
||||
- type: Clothing
|
||||
sprite: _Mono/Objects/Tanks/Jetpacks/purple.rsi
|
||||
- type: Jetpack
|
||||
stealth: true
|
||||
detectionRange: 16
|
||||
|
||||
#Filled ADM
|
||||
- type: entity
|
||||
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
- type: entity
|
||||
id: TovekCartridge
|
||||
name: 250mm EMPHE missile
|
||||
description: An individual ASM-557 EMPHE missile for a Tovek launcher.
|
||||
description: An individual ASM-250 EMPHE missile for a Tovek launcher.
|
||||
parent: BaseGrenade
|
||||
components:
|
||||
- type: Tag
|
||||
@@ -10,7 +10,7 @@
|
||||
- type: Item
|
||||
size: Huge
|
||||
- type: CartridgeAmmo
|
||||
proto: ShipMissileASM557
|
||||
proto: ShipMissileASM250
|
||||
deleteOnSpawn: true
|
||||
- type: Sprite
|
||||
sprite: _Mono/Objects/SpaceArtillery/hybrid_missile.rsi
|
||||
|
||||
+8
-8
@@ -73,11 +73,11 @@
|
||||
- type: MiningGatheringSoft
|
||||
- type: MiningGatheringHard
|
||||
- type: TargetSeeking
|
||||
acceleration: 20
|
||||
acceleration: 30
|
||||
detectionRange: 750
|
||||
scanArc: 75
|
||||
launchSpeed: 25
|
||||
maxSpeed: 70
|
||||
launchSpeed: 60
|
||||
maxSpeed: 150
|
||||
trackDelay: 3
|
||||
# destructible components below
|
||||
- type: Damageable
|
||||
@@ -179,8 +179,8 @@
|
||||
acceleration: 70
|
||||
detectionRange: 750
|
||||
scanArc: 15
|
||||
launchSpeed: 45
|
||||
maxSpeed: 250
|
||||
launchSpeed: 60
|
||||
maxSpeed: 275
|
||||
trackDelay: 1
|
||||
- type: Explosive
|
||||
explosionType: Default
|
||||
@@ -303,11 +303,11 @@
|
||||
- type: MiningGatheringSoft
|
||||
- type: MiningGatheringHard
|
||||
- type: TargetSeeking
|
||||
acceleration: 20
|
||||
acceleration: 25
|
||||
detectionRange: 750
|
||||
scanArc: 45
|
||||
launchSpeed: 25
|
||||
maxSpeed: 70
|
||||
launchSpeed: 50
|
||||
maxSpeed: 140
|
||||
trackDelay: 3
|
||||
- type: EmpOnTrigger
|
||||
range: 7
|
||||
|
||||
+2
-2
@@ -34,7 +34,7 @@
|
||||
- type: entity
|
||||
id: VanykCartridge
|
||||
name: 150mm HEAT missile
|
||||
description: An individual ASM-302 HEAT missile used in the Vanyk.
|
||||
description: An individual ASM-150 HEAT missile used in the Vanyk.
|
||||
parent: BaseGrenade
|
||||
components:
|
||||
- type: Tag
|
||||
@@ -44,7 +44,7 @@
|
||||
- type: Item
|
||||
size: Huge
|
||||
- type: CartridgeAmmo
|
||||
proto: ShipMissileASM302
|
||||
proto: ShipMissileASM150
|
||||
deleteOnSpawn: true
|
||||
- type: Sprite
|
||||
sprite: _Mono/Objects/Weapons/Guns/Ammunition/Explosives/generic_cartridges.rsi
|
||||
|
||||
+2
-2
@@ -34,7 +34,7 @@
|
||||
- type: entity
|
||||
id: VesperaCartridge
|
||||
name: 50mm HE missile
|
||||
description: An individual ASM-417 HE missile for the Vespera.
|
||||
description: An individual ADMP-50 HE missile for the Vespera.
|
||||
parent: BaseGrenade
|
||||
components:
|
||||
- type: Tag
|
||||
@@ -43,7 +43,7 @@
|
||||
- type: Item
|
||||
size: Huge
|
||||
- type: CartridgeAmmo
|
||||
proto: ShipMissileASM417
|
||||
proto: ShipMissileASM50
|
||||
deleteOnSpawn: true
|
||||
- type: Sprite
|
||||
sprite: _Mono/Objects/SpaceArtillery/mini_rocket.rsi
|
||||
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
- type: entity
|
||||
id: WeaponTurretLightMunitionsBay
|
||||
name: GPOB-L Light Munitions Bay
|
||||
parent: BallisticArtilleryUnanchorableCartridge
|
||||
parent: BallisticArtilleryCartridge
|
||||
description: A relatively small, armored munitions bay capable of holding up to two lightweight ordinance packages. Typically found on light spacecraft, particularly bombers, and provide a limited use method of damaging targets far above the user's weight class.
|
||||
components:
|
||||
- type: StaticPrice
|
||||
@@ -16,7 +16,7 @@
|
||||
range: 700
|
||||
- type: GunSignalControl
|
||||
- type: Gun
|
||||
projectileSpeed: 10
|
||||
projectileSpeed: 50
|
||||
fireRate: 0.8
|
||||
recoil: 5
|
||||
shootThermalSignature: 8000000 # ~2.8km
|
||||
|
||||
+7
-7
@@ -1,8 +1,8 @@
|
||||
# VESPERA
|
||||
|
||||
- type: entity
|
||||
id: ShipMissileASM417
|
||||
name: ASM-417 50mm Mini Missile
|
||||
id: ShipMissileASM50
|
||||
name: ASM-50 50mm Mini Missile
|
||||
parent: BaseBulletTrigger
|
||||
categories: [ HideSpawnMenu ]
|
||||
components:
|
||||
@@ -46,11 +46,11 @@
|
||||
maxSpeed: 180
|
||||
trackDelay: 0.1
|
||||
|
||||
# ASM-302
|
||||
# VANYK
|
||||
|
||||
- type: entity
|
||||
id: ShipMissileASM302
|
||||
name: ASM-302 150mm missile
|
||||
id: ShipMissileASM150
|
||||
name: ASM-150 150mm missile
|
||||
parent: BaseBulletTrigger
|
||||
categories: [ HideSpawnMenu ]
|
||||
components:
|
||||
@@ -97,8 +97,8 @@
|
||||
# TOVEK
|
||||
|
||||
- type: entity
|
||||
id: ShipMissileASM557
|
||||
name: ASM-557 Hybrid EMP Missile
|
||||
id: ShipMissileASM250
|
||||
name: ASM-250 Hybrid EMP Missile
|
||||
parent: BaseBulletTrigger
|
||||
categories: [ HideSpawnMenu ]
|
||||
components:
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
- type: entity
|
||||
id: WeaponTurretTovek
|
||||
name: ADMX-23 TOVEK 250mm Missile Pod
|
||||
name: ADMX-250 TOVEK Missile Pod
|
||||
parent: BallisticArtilleryCartridge
|
||||
description: A 250mm missile pod created by Aetherion Dynamics. Fires 250mm warheads to devastate enemy ships at long range. Can be remotely activated or linked to a GCS.
|
||||
components:
|
||||
|
||||
+2
-2
@@ -1,8 +1,8 @@
|
||||
- type: entity
|
||||
id: WeaponTurretASM220
|
||||
name: ASM-220 "Trident" 500mm torpedo rack
|
||||
name: ASM-220 "Trident" Torpedo Rack
|
||||
parent: BallisticArtilleryUnanchorableCartridge
|
||||
description: A heavy built-in torpedo rack for cruisers which relies on manual loading, usually done at harbor. Despite this, it has the largest missiles in the sector.
|
||||
description: A heavy built-in torpedo rack for cruisers which relies on manual loading, usually done at harbor. Despite this, it has the largest missiles in the sector at 550mm.
|
||||
components:
|
||||
- type: StaticPrice
|
||||
price: 10000
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
- type: entity
|
||||
id: WeaponTurretVanyk
|
||||
name: ASM-302 "Vanyk" 150mm missile pod
|
||||
name: ASM-150 "Vanyk" Missile Pod
|
||||
parent: BallisticArtilleryMagazine
|
||||
description: An escort missile pod manufactured by Aetherion Dynamics. Launches 150mm guided missiles for basic ship-to-ship combat and area denial. Uses a built-in autoloader instead of a rack, increasing capacity but reducing rate of fire. Can be remotely activated or linked to a GCS.
|
||||
components:
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
- type: entity
|
||||
id: WeaponTurretVespera
|
||||
name: ADMP-27 VESPERA 50mm Rapid-Fire Missile Rack
|
||||
name: ADMP-50 VESPERA Missile Rack
|
||||
parent: BallisticArtilleryMagazine
|
||||
description: A rapid-fire swarm missile rack manufactured by Aetherion Dynamics. Saturates targets with guided warheads to overwhelm defenses. Limited ammo, but deadly. Can be remotely activated or linked to a GCS.
|
||||
components:
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user