forked from SpaceStation14-Shenanigans/Monolith
Compare commits
128 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ea8c844578 | |||
| a9e4468d78 | |||
| f3919fafc1 | |||
| 974b78863b | |||
| 1654bd5cf8 | |||
| d353667f97 | |||
| 47116d8ba7 | |||
| 9bd6d5f3f2 | |||
| 1dc696deb6 | |||
| f2df23dc81 | |||
| 76d6ea96e0 | |||
| 93ba265e00 | |||
| 16f73ec031 | |||
| 9d3b0778b3 | |||
| 32b15951e2 | |||
| 7a0f0d04c5 | |||
| bcce8e67a3 | |||
| 5afcdd9379 | |||
| 01c7ea464a | |||
| 55f6108312 | |||
| 8be27c1658 | |||
| 4df38cc9cc | |||
| 8c0d2a50df | |||
| 2d8105de13 | |||
| 01bb73bf56 | |||
| fb09b866f2 | |||
| 0458a500ff | |||
| 4334b07093 | |||
| ad2dd99a9b | |||
| f11c83a96e | |||
| 36d1740829 | |||
| 1e201bb8d2 | |||
| c7a34dfc22 | |||
| e366c4d7cc | |||
| bc0151e540 | |||
| b2307660de | |||
| 5d5f6b4654 | |||
| 165f9950b5 | |||
| ef9858936d | |||
| d0a95f5d8b | |||
| ee386b0633 | |||
| de38cc18ef | |||
| ca928bdc83 | |||
| cee6ce9566 | |||
| 984a2c9b71 | |||
| 548e9eccb6 | |||
| cd817abd2c | |||
| f276df8fe9 | |||
| dd323be01d | |||
| 0cf9b35f08 | |||
| 114a09f290 | |||
| dc4b50e71e | |||
| c405c32c89 | |||
| 34ff30a736 | |||
| c8e162baa1 | |||
| ffcbc32c43 | |||
| 351b225102 | |||
| 496432881e | |||
| 9fd2a7b5af | |||
| 8972408ec1 | |||
| 5798b57788 | |||
| ec88162ac0 | |||
| 3992aa846f | |||
| 4b62f35f10 | |||
| cc1c91f39f | |||
| c5241854ce | |||
| d02895a50f | |||
| c41d005cf4 | |||
| 013f57a73d | |||
| c3f687a493 | |||
| f837710be1 | |||
| 7b00d623e0 | |||
| dafbb5f3d8 | |||
| d4487d9a5a | |||
| 7b9f602c55 | |||
| 97509dd3b6 | |||
| 55c2a03ea4 | |||
| 543c19645f | |||
| da8b19dd05 | |||
| 4fc44d3a9c | |||
| 55688cc9e0 | |||
| 5357469644 | |||
| 6040135534 | |||
| 52649a871e | |||
| fef33511d8 | |||
| fec5bfce0a | |||
| 11f82f95d3 | |||
| 3dbad97455 | |||
| a193ab828e | |||
| c75083140d | |||
| 106f9b6d28 | |||
| fe24fc22bc | |||
| 85c9636003 | |||
| a1d2f4dcbc | |||
| 3381fe165c | |||
| a913c35b21 | |||
| 0706b759d4 | |||
| 73a91c0b0a | |||
| 9e390680bd | |||
| d3d391f5a0 | |||
| a6506c7f46 | |||
| 958421b6c9 | |||
| c513938ed9 | |||
| a6431c9bab | |||
| f3390a81cc | |||
| 6ba80381cc | |||
| ef095aec88 | |||
| d02738089c | |||
| b9f0de8576 | |||
| 5a6d4b74b1 | |||
| 1ac13bf597 | |||
| 90ee912816 | |||
| 27665829e6 | |||
| e1459b0d43 | |||
| 395d334dd7 | |||
| 75e166e9b3 | |||
| d987cfe88d | |||
| a942f3e7b1 | |||
| 4108933834 | |||
| 6af6f3b386 | |||
| 9a590069d2 | |||
| a60321f201 | |||
| dfabb71045 | |||
| ce034c3f19 | |||
| 79c9dee112 | |||
| 6a048def33 | |||
| e41ef48441 | |||
| 27e7b2f70a |
@@ -1,5 +1,5 @@
|
||||
name: PR Changelogs
|
||||
concurrency: commit_action
|
||||
concurrency: commit_action-${{ github.event.pull_request.base.ref }} # Mono
|
||||
on:
|
||||
pull_request_target:
|
||||
types: [closed]
|
||||
@@ -16,11 +16,11 @@ jobs:
|
||||
permissions:
|
||||
contents: write
|
||||
steps:
|
||||
- name: Checkout Master
|
||||
- name: Checkout Base Branch # Mono
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
token: ${{ secrets.BOT_TOKEN }}
|
||||
ref: "${{ vars.CHANGELOG_BRANCH }}"
|
||||
ref: "${{ github.event.pull_request.base.ref }}" # Mono
|
||||
|
||||
- name: Setup Git
|
||||
run: |
|
||||
@@ -47,9 +47,9 @@ jobs:
|
||||
|
||||
- name: Commit Changelog
|
||||
run: |
|
||||
git pull origin main
|
||||
git pull origin "${{ github.event.pull_request.base.ref }}"
|
||||
git add "${{ env.CHANGELOG_DIR }}"
|
||||
git commit -m "Automated Changelog (#${{ env.PR_NUMBER }})"
|
||||
git push
|
||||
git push origin "${{ github.event.pull_request.base.ref }}"
|
||||
shell: bash
|
||||
continue-on-error: true
|
||||
|
||||
Vendored
+53
-7
@@ -13,6 +13,26 @@
|
||||
"console": "internalConsole",
|
||||
"stopAtEntry": false
|
||||
},
|
||||
{
|
||||
"name": "Client - Tools",
|
||||
"type": "coreclr",
|
||||
"request": "launch",
|
||||
"preLaunchTask": "build - Tools",
|
||||
"program": "${workspaceFolder}/bin/Content.Client/Content.Client.dll",
|
||||
"args": [],
|
||||
"console": "internalConsole",
|
||||
"stopAtEntry": false
|
||||
},
|
||||
{
|
||||
"name": "Client - Release",
|
||||
"type": "coreclr",
|
||||
"request": "launch",
|
||||
"preLaunchTask": "build - Release",
|
||||
"program": "${workspaceFolder}/bin/Content.Client/Content.Client.dll",
|
||||
"args": [],
|
||||
"console": "internalConsole",
|
||||
"stopAtEntry": false
|
||||
},
|
||||
{
|
||||
"name": "Client (Compatibility renderer)",
|
||||
"type": "coreclr",
|
||||
@@ -31,6 +51,26 @@
|
||||
"console": "integratedTerminal",
|
||||
"stopAtEntry": false
|
||||
},
|
||||
{
|
||||
"name": "Server - Tools",
|
||||
"type": "coreclr",
|
||||
"request": "launch",
|
||||
"preLaunchTask": "build - Tools",
|
||||
"program": "${workspaceFolder}/bin/Content.Server/Content.Server.dll",
|
||||
"args": [""],
|
||||
"console": "integratedTerminal",
|
||||
"stopAtEntry": false
|
||||
},
|
||||
{
|
||||
"name": "Server - Release",
|
||||
"type": "coreclr",
|
||||
"request": "launch",
|
||||
"preLaunchTask": "build - Release",
|
||||
"program": "${workspaceFolder}/bin/Content.Server/Content.Server.dll",
|
||||
"args": [""],
|
||||
"console": "integratedTerminal",
|
||||
"stopAtEntry": false
|
||||
},
|
||||
{
|
||||
"name": "YAML Linter",
|
||||
"type": "coreclr",
|
||||
@@ -40,7 +80,7 @@
|
||||
"cwd": "${workspaceFolder}/Content.YAMLLinter",
|
||||
"console": "internalConsole",
|
||||
"stopAtEntry": false
|
||||
}
|
||||
},
|
||||
],
|
||||
"compounds": [
|
||||
{
|
||||
@@ -51,14 +91,21 @@
|
||||
],
|
||||
"preLaunchTask": "build"
|
||||
},
|
||||
// Frontier begin
|
||||
{
|
||||
"name": "Server/Client (Release)",
|
||||
"name": "Server/Client - Tools",
|
||||
"configurations": [
|
||||
"Server",
|
||||
"Client"
|
||||
"Server - Tools",
|
||||
"Client - Tools"
|
||||
],
|
||||
"preLaunchTask": "build-release"
|
||||
"preLaunchTask": "build - Tools"
|
||||
},
|
||||
{
|
||||
"name": "Server/Client - Release",
|
||||
"configurations": [
|
||||
"Server - Release",
|
||||
"Client - Release"
|
||||
],
|
||||
"preLaunchTask": "build - Release"
|
||||
},
|
||||
{
|
||||
"name": "Server/Client (No Build)",
|
||||
@@ -67,6 +114,5 @@
|
||||
"Client"
|
||||
]
|
||||
}
|
||||
// Frontier end
|
||||
]
|
||||
}
|
||||
|
||||
Vendored
+26
-6
@@ -21,26 +21,46 @@
|
||||
},
|
||||
"problemMatcher": "$msCompile"
|
||||
},
|
||||
// Frontier begin
|
||||
{
|
||||
"label": "build-release",
|
||||
"label": "build - Tools",
|
||||
"command": "dotnet",
|
||||
"type": "shell",
|
||||
"args": [
|
||||
"build",
|
||||
"--configuration=Release", // Build in release mode. Note: --, not /. /configuration doesn't work, because Microsoft.
|
||||
"--configuration",
|
||||
"Tools",
|
||||
"/property:GenerateFullPaths=true", // Ask dotnet build to generate full paths for file names.
|
||||
"/consoleloggerparameters:NoSummary" // Do not generate summary otherwise it leads to duplicate errors in Problems panel
|
||||
"/consoleloggerparameters:'ForceNoAlign;NoSummary'", // Do not generate summary otherwise it leads to duplicate errors in Problems panel
|
||||
],
|
||||
"group": {
|
||||
"kind": "build"
|
||||
"kind": "build",
|
||||
"isDefault": false
|
||||
},
|
||||
"presentation": {
|
||||
"reveal": "silent"
|
||||
},
|
||||
"problemMatcher": "$msCompile"
|
||||
},
|
||||
{
|
||||
"label": "build - Release",
|
||||
"command": "dotnet",
|
||||
"type": "shell",
|
||||
"args": [
|
||||
"build",
|
||||
"--configuration",
|
||||
"Release",
|
||||
"/property:GenerateFullPaths=true", // Ask dotnet build to generate full paths for file names.
|
||||
"/consoleloggerparameters:'ForceNoAlign;NoSummary'", // Do not generate summary otherwise it leads to duplicate errors in Problems panel
|
||||
],
|
||||
"group": {
|
||||
"kind": "build",
|
||||
"isDefault": false
|
||||
},
|
||||
"presentation": {
|
||||
"reveal": "silent"
|
||||
},
|
||||
"problemMatcher": "$msCompile"
|
||||
},
|
||||
// Frontier end
|
||||
{
|
||||
"label": "build-yaml-linter",
|
||||
"command": "dotnet",
|
||||
|
||||
@@ -32,6 +32,10 @@ public sealed class CharacterInfoSystem : EntitySystem
|
||||
private void OnCharacterInfoEvent(CharacterInfoEvent msg, EntitySessionEventArgs args)
|
||||
{
|
||||
var entity = GetEntity(msg.NetEntity);
|
||||
// Mono - fix
|
||||
if (TerminatingOrDeleted(entity))
|
||||
return;
|
||||
|
||||
var data = new CharacterData(entity, msg.JobTitle, msg.Objectives, msg.Briefing, Name(entity));
|
||||
|
||||
OnCharacterUpdate?.Invoke(data);
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
<Control xmlns="https://spacestation14.io">
|
||||
<BoxContainer Orientation="Vertical">
|
||||
<Label Name="TitleLabel" Access="Public" />
|
||||
<Label Name="ExampleLabel" Access="Public" />
|
||||
<ColorSelectorSliders Name="Slider" Access="Public" HorizontalExpand="True" />
|
||||
</BoxContainer>
|
||||
</Control>
|
||||
@@ -0,0 +1,31 @@
|
||||
using Content.Client.Options.UI;
|
||||
using Robust.Client.AutoGenerated;
|
||||
using Robust.Client.UserInterface;
|
||||
|
||||
namespace Content.Client.Options.UI;
|
||||
|
||||
/// <summary>
|
||||
/// Standard UI control used for color sliders in the options menu. Intended for use with <see cref="OptionsTabControlRow"/>.
|
||||
/// </summary>
|
||||
/// <seealso cref="OptionsTabControlRow.AddOptionColorSlider"/>
|
||||
[GenerateTypedNameReferences]
|
||||
public sealed partial class OptionColorSlider : Control
|
||||
{
|
||||
/// <summary>
|
||||
/// The text describing what this slider affects.
|
||||
/// </summary>
|
||||
public string? Title
|
||||
{
|
||||
get => TitleLabel.Text;
|
||||
set => TitleLabel.Text = value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The example text showing the current color of the slider.
|
||||
/// </summary>
|
||||
public string? Example
|
||||
{
|
||||
get => ExampleLabel.Text;
|
||||
set => ExampleLabel.Text = value;
|
||||
}
|
||||
}
|
||||
@@ -143,6 +143,19 @@ public sealed partial class OptionsTabControlRow : Control
|
||||
return AddOption(new OptionSliderIntCVar(this, _cfg, cVar, slider, min, max, format ?? FormatInt));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Add a color slider option, backed by a simple string CVar.
|
||||
/// </summary>
|
||||
/// <param name="cVar">The CVar represented by the slider.</param>
|
||||
/// <param name="slider">The UI control for the option.</param>
|
||||
/// <returns>The option instance backing the added option.</returns>
|
||||
public OptionColorSliderCVar AddOptionColorSlider(
|
||||
CVarDef<string> cVar,
|
||||
OptionColorSlider slider)
|
||||
{
|
||||
return AddOption(new OptionColorSliderCVar(this, _cfg, cVar, slider));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Add a drop-down option, backed by a CVar.
|
||||
/// </summary>
|
||||
@@ -518,6 +531,54 @@ public sealed class OptionSliderFloatCVar : BaseOptionCVar<float>
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class OptionColorSliderCVar : BaseOptionCVar<string>
|
||||
{
|
||||
private readonly OptionColorSlider _slider;
|
||||
|
||||
protected override string Value
|
||||
{
|
||||
get => _slider.Slider.Color.ToHex();
|
||||
set
|
||||
{
|
||||
_slider.Slider.Color = Color.FromHex(value);
|
||||
UpdateLabelColor();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new instance of this type.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// <para>
|
||||
/// It is generally more convenient to call overloads on <see cref="OptionsTabControlRow"/>
|
||||
/// such as <see cref="OptionsTabControlRow.AddOptionPercentSlider"/> instead of instantiating this type directly.
|
||||
/// </para>
|
||||
/// </remarks>
|
||||
/// <param name="controller">The control row that owns this option.</param>
|
||||
/// <param name="cfg">The configuration manager to get and set values from.</param>
|
||||
/// <param name="cVar">The CVar that is being controlled by this option.</param>
|
||||
/// <param name="slider">The UI control for the option.</param>
|
||||
public OptionColorSliderCVar(
|
||||
OptionsTabControlRow controller,
|
||||
IConfigurationManager cfg,
|
||||
CVarDef<string> cVar,
|
||||
OptionColorSlider slider) : base(controller, cfg, cVar)
|
||||
{
|
||||
_slider = slider;
|
||||
|
||||
slider.Slider.OnColorChanged += _ =>
|
||||
{
|
||||
ValueChanged();
|
||||
UpdateLabelColor();
|
||||
};
|
||||
}
|
||||
|
||||
private void UpdateLabelColor()
|
||||
{
|
||||
_slider.ExampleLabel.FontColorOverride = Color.FromHex(Value);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Implementation of a CVar option that simply corresponds with an integer <see cref="OptionSlider"/>.
|
||||
/// </summary>
|
||||
|
||||
@@ -12,6 +12,10 @@
|
||||
<ui:OptionSlider Name="SpeechBubbleTextOpacitySlider" Title="{Loc 'ui-options-speech-bubble-text-opacity'}" />
|
||||
<ui:OptionSlider Name="SpeechBubbleSpeakerOpacitySlider" Title="{Loc 'ui-options-speech-bubble-speaker-opacity'}" />
|
||||
<ui:OptionSlider Name="SpeechBubbleBackgroundOpacitySlider" Title="{Loc 'ui-options-speech-bubble-background-opacity'}" />
|
||||
<CheckBox Name="AutoFillHighlightsCheckBox" Text="{Loc 'ui-options-auto-fill-highlights'}" />
|
||||
<ui:OptionColorSlider Name="HighlightsColorSlider"
|
||||
Title="{Loc 'ui-options-highlights-color'}"
|
||||
Example="{Loc 'ui-options-highlights-color-example'}"/>
|
||||
</BoxContainer>
|
||||
</ScrollContainer>
|
||||
<ui:OptionsTabControlRow Name="Control" Access="Public" />
|
||||
|
||||
@@ -20,6 +20,8 @@ public sealed partial class AccessibilityTab : Control
|
||||
Control.AddOptionPercentSlider(CCVars.SpeechBubbleTextOpacity, SpeechBubbleTextOpacitySlider);
|
||||
Control.AddOptionPercentSlider(CCVars.SpeechBubbleSpeakerOpacity, SpeechBubbleSpeakerOpacitySlider);
|
||||
Control.AddOptionPercentSlider(CCVars.SpeechBubbleBackgroundOpacity, SpeechBubbleBackgroundOpacitySlider);
|
||||
Control.AddOptionCheckBox(CCVars.ChatAutoFillHighlights, AutoFillHighlightsCheckBox);
|
||||
Control.AddOptionColorSlider(CCVars.ChatHighlightsColor, HighlightsColorSlider);
|
||||
|
||||
Control.Initialize();
|
||||
}
|
||||
|
||||
@@ -33,9 +33,22 @@ public sealed partial class BorgSelectTypeMenu : FancyWindow
|
||||
RobustXamlLoader.Load(this);
|
||||
IoCManager.InjectDependencies(this);
|
||||
|
||||
foreach (var borgType in _prototypeManager.EnumeratePrototypes<BorgTypePrototype>().OrderBy(PrototypeName))
|
||||
// Goobstation: Customizable borgs sprites
|
||||
ConfirmTypeButton.OnPressed += ConfirmButtonPressed;
|
||||
HelpGuidebookIds = GuidebookEntries;
|
||||
|
||||
SubtypeSelection.SubtypeSelected += () =>
|
||||
ConfirmTypeButton.Disabled = false;
|
||||
}
|
||||
|
||||
// foreach (var borgType in _prototypeManager.EnumeratePrototypes<BorgTypePrototype>().OrderBy(PrototypeName))
|
||||
// Mono: Selectable borg whitelist
|
||||
public void Populate(IReadOnlyList<ProtoId<BorgTypePrototype>> whitelist)
|
||||
{
|
||||
IEnumerable<BorgTypePrototype> types = whitelist.Select(id => _prototypeManager.Index(id)).OrderBy(PrototypeName);
|
||||
foreach (var borgType in types)
|
||||
// Mono: Selectable borg whitelist end
|
||||
{
|
||||
// Goobstation-Start: Customizable borgs sprites
|
||||
var chassisList = new EntityPrototypeView
|
||||
{
|
||||
Scale = new Vector2(2, 2),
|
||||
@@ -49,13 +62,6 @@ public sealed partial class BorgSelectTypeMenu : FancyWindow
|
||||
};
|
||||
SelectionsContainer.AddChild(chassisList);
|
||||
}
|
||||
|
||||
ConfirmTypeButton.OnPressed += ConfirmButtonPressed;
|
||||
HelpGuidebookIds = GuidebookEntries;
|
||||
|
||||
|
||||
SubtypeSelection.SubtypeSelected += () =>
|
||||
ConfirmTypeButton.Disabled = false;
|
||||
// Goobstation-End: Customizable borgs sprites
|
||||
}
|
||||
|
||||
|
||||
@@ -23,8 +23,12 @@ public sealed class BorgSelectTypeUserInterface : BoundUserInterface
|
||||
protected override void Open()
|
||||
{
|
||||
base.Open();
|
||||
//Mono: Selectable borg whitelist
|
||||
EntMan.TryGetComponent<BorgSwitchableTypeComponent>(Owner, out var comp);
|
||||
var whitelist = comp?.TypeWhitelist ?? [];
|
||||
|
||||
_menu = this.CreateWindow<BorgSelectTypeMenu>();
|
||||
_menu.Populate(whitelist); //Mono
|
||||
_menu.ConfirmedBorgType += (prototype, subtype) => SendPredictedMessage(new BorgSelectTypeMessage(prototype, subtype));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,18 +46,15 @@ public sealed class BorgSwitchableTypeSystem : SharedBorgSwitchableTypeSystem
|
||||
{
|
||||
if (TryComp(entity, out SpriteComponent? sprite))
|
||||
{
|
||||
_sprite.LayerSetRsiState((entity, sprite), BorgVisualLayers.Body, prototype.SpriteBodyState);
|
||||
_sprite.LayerSetRsiState((entity, sprite), BorgVisualLayers.Light, prototype.SpriteBodyState);
|
||||
_sprite.LayerSetRsiState((entity, sprite), BorgVisualLayers.LightStatus, prototype.SpriteBodyState);
|
||||
|
||||
var rsiPath = SpriteSpecifierSerializer.TextureRoot / subtypePrototype.SpritePath;
|
||||
if (_resourceCache.TryGetResource<RSIResource>(rsiPath, out var resource))
|
||||
{
|
||||
_sprite.LayerSetRsi((entity, sprite), BorgVisualLayers.Body, resource.RSI);
|
||||
_sprite.LayerSetRsi((entity, sprite), BorgVisualLayers.Light, resource.RSI);
|
||||
_sprite.LayerSetRsi((entity, sprite), BorgVisualLayers.LightStatus, resource.RSI);
|
||||
_sprite.LayerSetRsi((entity, sprite), BorgVisualLayers.Body, resource.RSI, prototype.SpriteBodyState);
|
||||
_sprite.LayerSetRsi((entity, sprite), BorgVisualLayers.Light, resource.RSI, prototype.SpriteBodyState);
|
||||
_sprite.LayerSetRsi((entity, sprite), BorgVisualLayers.LightStatus, resource.RSI, prototype.SpriteToggleLightState);
|
||||
}
|
||||
_sprite.LayerSetRsiState((entity, sprite), BorgVisualLayers.Body, prototype.SpriteBodyState);
|
||||
_sprite.LayerSetRsiState((entity, sprite), BorgVisualLayers.LightStatus, prototype.SpriteBodyState);
|
||||
_sprite.LayerSetRsiState((entity, sprite), BorgVisualLayers.LightStatus, prototype.SpriteToggleLightState);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,264 @@
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using Robust.Client.UserInterface;
|
||||
using Robust.Client.UserInterface.Controllers;
|
||||
using Content.Shared.CCVar;
|
||||
using Content.Client.CharacterInfo;
|
||||
using static Content.Client.CharacterInfo.CharacterInfoSystem;
|
||||
|
||||
namespace Content.Client.UserInterface.Systems.Chat;
|
||||
|
||||
public sealed partial class ChatUIController : IOnSystemChanged<CharacterInfoSystem>
|
||||
{
|
||||
[Dependency] private readonly ILocalizationManager _loc = default!;
|
||||
[UISystemDependency] private readonly CharacterInfoSystem _characterInfo = default!;
|
||||
|
||||
private static readonly Regex StartDoubleQuote = new("\"$");
|
||||
private static readonly Regex EndDoubleQuote = new("^\"|(?<=^@)\"");
|
||||
private static readonly Regex StartAtSign = new("^@");
|
||||
|
||||
|
||||
private readonly List<string> _highlights = new();
|
||||
private readonly List<string> _autoFillRawKeywords = new();
|
||||
|
||||
private string? _highlightsColor;
|
||||
private bool _autoFillHighlightsEnabled;
|
||||
private bool _charInfoIsAttach = false;
|
||||
private string? _currentCharacterName;
|
||||
|
||||
|
||||
public event Action<string>? HighlightsUpdated;
|
||||
public event Action<string>? AutoFillUpdated;
|
||||
|
||||
private void InitializeHighlights()
|
||||
{
|
||||
_config.OnValueChanged(CCVars.ChatAutoFillHighlights, (value) => { _autoFillHighlightsEnabled = value; }, true);
|
||||
_config.OnValueChanged(CCVars.ChatHighlightsColor, (value) => { _highlightsColor = value; }, true);
|
||||
|
||||
var cvar = _config.GetCVar(CCVars.ChatHighlights);
|
||||
}
|
||||
|
||||
public void OnSystemLoaded(CharacterInfoSystem system)
|
||||
{
|
||||
system.OnCharacterUpdate += OnCharacterUpdated;
|
||||
}
|
||||
|
||||
public void OnSystemUnloaded(CharacterInfoSystem system)
|
||||
{
|
||||
system.OnCharacterUpdate -= OnCharacterUpdated;
|
||||
}
|
||||
|
||||
private void UpdateAutoFillHighlights()
|
||||
{
|
||||
_currentCharacterName = null;
|
||||
_autoFillRawKeywords.Clear();
|
||||
_highlights.Clear();
|
||||
AutoFillUpdated?.Invoke("");
|
||||
HighlightsUpdated?.Invoke("");
|
||||
|
||||
_charInfoIsAttach = true;
|
||||
_characterInfo.RequestCharacterInfo();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Saves the user's custom keywords for the given character into the CVar,
|
||||
/// then rebuilds the active highlight list.
|
||||
/// Called when the user submits keywords from the popup.
|
||||
/// </summary>
|
||||
public void UpdateHighlights(string customKeywords)
|
||||
{
|
||||
if (_currentCharacterName == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
SaveCustomKeywords(_currentCharacterName, customKeywords);
|
||||
RebuildHighlightsList(customKeywords);
|
||||
HighlightsUpdated?.Invoke(customKeywords);
|
||||
}
|
||||
|
||||
private void OnCharacterUpdated(CharacterData data)
|
||||
{
|
||||
|
||||
if (!_charInfoIsAttach)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var (_, job, _, _, entityName) = data;
|
||||
_currentCharacterName = entityName;
|
||||
|
||||
|
||||
_autoFillRawKeywords.Clear();
|
||||
var autoFillDisplay = "";
|
||||
|
||||
if (_autoFillHighlightsEnabled)
|
||||
{
|
||||
|
||||
// Special rules for names can be added here
|
||||
|
||||
var nameHighlights = "@" + entityName;
|
||||
|
||||
// Split on spaces first (handles any number of space-separated words).
|
||||
if (nameHighlights.Contains(' '))
|
||||
nameHighlights = nameHighlights.Replace(" ", "\n@");
|
||||
|
||||
// Handle hyphenated tokens: single hyphen splits normally (e.g. "First-Last"),
|
||||
// multiple hyphens use the lizard rule — keep only first and last part (e.g. "Eats-The-Food" → @Eats @Food).
|
||||
var dashParts = nameHighlights.Split('-');
|
||||
if (dashParts.Length == 2)
|
||||
nameHighlights = nameHighlights.Replace("-", "\n@");
|
||||
else if (dashParts.Length > 2)
|
||||
nameHighlights = dashParts[0] + "\n@" + dashParts[^1];
|
||||
|
||||
|
||||
foreach (var token in nameHighlights.Split('\n', StringSplitOptions.RemoveEmptyEntries))
|
||||
{
|
||||
_autoFillRawKeywords.Add(token);
|
||||
}
|
||||
|
||||
var jobKey = job.Replace(' ', '-').ToLower();
|
||||
|
||||
if (_loc.TryGetString($"highlights-{jobKey}", out var jobMatches))
|
||||
{
|
||||
foreach (var jobWord in jobMatches.Replace(", ", "\n").Split('\n', StringSplitOptions.RemoveEmptyEntries))
|
||||
_autoFillRawKeywords.Add(jobWord);
|
||||
}
|
||||
autoFillDisplay = string.Join("\n", _autoFillRawKeywords);
|
||||
}
|
||||
|
||||
var customKeywords = LoadCustomKeywords(entityName);
|
||||
|
||||
RebuildHighlightsList(customKeywords);
|
||||
|
||||
AutoFillUpdated?.Invoke(autoFillDisplay);
|
||||
HighlightsUpdated?.Invoke(customKeywords);
|
||||
_charInfoIsAttach = false;
|
||||
}
|
||||
|
||||
|
||||
private string LoadCustomKeywords(string characterName)
|
||||
{
|
||||
var cvar = _config.GetCVar(CCVars.ChatHighlights);
|
||||
if (string.IsNullOrEmpty(cvar))
|
||||
return "";
|
||||
|
||||
// Shouldn't be needed as no-one should have data by the time this rolls out but we never know
|
||||
if (!cvar.Contains("||"))
|
||||
{
|
||||
return cvar;
|
||||
}
|
||||
|
||||
foreach (var line in cvar.Split('\n', StringSplitOptions.RemoveEmptyEntries))
|
||||
{
|
||||
var sep = line.IndexOf("||", StringComparison.Ordinal);
|
||||
if (sep < 0)
|
||||
continue;
|
||||
|
||||
if (line[..sep] == characterName)
|
||||
return DecodeKeywords(line[(sep + 2)..]);
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
private void SaveCustomKeywords(string characterName, string customKeywords)
|
||||
{
|
||||
var cvar = _config.GetCVar(CCVars.ChatHighlights);
|
||||
|
||||
var entries = new Dictionary<string, string>();
|
||||
if (!string.IsNullOrEmpty(cvar) && cvar.Contains("||"))
|
||||
{
|
||||
foreach (var line in cvar.Split('\n', StringSplitOptions.RemoveEmptyEntries))
|
||||
{
|
||||
var sep = line.IndexOf("||", StringComparison.Ordinal);
|
||||
if (sep < 0)
|
||||
continue;
|
||||
entries[line[..sep]] = line[(sep + 2)..];
|
||||
}
|
||||
}
|
||||
|
||||
entries[characterName] = EncodeKeywords(customKeywords);
|
||||
|
||||
var sb = new StringBuilder();
|
||||
foreach (var (name, encoded) in entries)
|
||||
sb.Append(name).Append("||").Append(encoded).Append('\n');
|
||||
|
||||
var newValue = sb.ToString().TrimEnd('\n');
|
||||
_config.SetCVar(CCVars.ChatHighlights, newValue);
|
||||
_config.SaveToFile();
|
||||
}
|
||||
|
||||
private static string EncodeKeywords(string raw)
|
||||
{
|
||||
return raw
|
||||
.Replace(@"\", @"\\")
|
||||
.Replace("|", @"\|")
|
||||
.Replace("\n", @"\n");
|
||||
}
|
||||
|
||||
private static string DecodeKeywords(string encoded)
|
||||
{
|
||||
var sb = new StringBuilder(encoded.Length);
|
||||
for (var i = 0; i < encoded.Length; i++)
|
||||
{
|
||||
if (encoded[i] == '\\' && i + 1 < encoded.Length)
|
||||
{
|
||||
switch (encoded[i + 1])
|
||||
{
|
||||
case 'n': sb.Append('\n'); i++; break;
|
||||
case '|': sb.Append('|'); i++; break;
|
||||
case '\\': sb.Append('\\'); i++; break;
|
||||
default: sb.Append(encoded[i]); break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.Append(encoded[i]);
|
||||
}
|
||||
}
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
private void RebuildHighlightsList(string customRaw)
|
||||
{
|
||||
_highlights.Clear();
|
||||
|
||||
foreach (var raw in _autoFillRawKeywords)
|
||||
_highlights.Add(ProcessKeyword(raw));
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(customRaw))
|
||||
{
|
||||
foreach (var raw in customRaw.Split('\n', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries))
|
||||
_highlights.Add(ProcessKeyword(raw));
|
||||
}
|
||||
|
||||
_highlights.Sort((x, y) => y.Length.CompareTo(x.Length));
|
||||
}
|
||||
|
||||
private string ProcessKeyword(string raw)
|
||||
{
|
||||
// Replace every "\" to prevent "\n", "\0", etc. in regex.
|
||||
var keyword = raw.Replace(@"\", @"\\");
|
||||
|
||||
// Escape special regex characters.
|
||||
keyword = Regex.Escape(keyword);
|
||||
|
||||
// Re-escape "[" for markup-adjacent positions.
|
||||
keyword = keyword.Replace(@"\[", @"\\\[");
|
||||
|
||||
// words in double quotes will only be hightlighted as unique, not within another word
|
||||
if (keyword.Any(c => c == '"'))
|
||||
{
|
||||
keyword = StartDoubleQuote.Replace(keyword, "(?!\\w)");
|
||||
keyword = EndDoubleQuote.Replace(keyword, "(?<!\\w)");
|
||||
}
|
||||
|
||||
// Make it so it doesn't hightlight your own name when you are talking
|
||||
keyword = StartAtSign.Replace(keyword, @"(?<=\[BubbleContent\].*)");
|
||||
|
||||
return keyword;
|
||||
}
|
||||
}
|
||||
@@ -44,7 +44,7 @@ using Robust.Shared.Utility;
|
||||
|
||||
namespace Content.Client.UserInterface.Systems.Chat;
|
||||
|
||||
public sealed class ChatUIController : UIController
|
||||
public sealed partial class ChatUIController : UIController
|
||||
{
|
||||
[Dependency] private readonly IClientAdminManager _admin = default!;
|
||||
[Dependency] private readonly IChatManager _manager = default!;
|
||||
@@ -248,6 +248,8 @@ public sealed class ChatUIController : UIController
|
||||
|
||||
_config.OnValueChanged(CCVars.ChatWindowOpacity, OnChatWindowOpacityChanged);
|
||||
|
||||
InitializeHighlights();
|
||||
|
||||
}
|
||||
|
||||
public void OnScreenLoad()
|
||||
@@ -434,6 +436,7 @@ public sealed class ChatUIController : UIController
|
||||
private void OnAttachedChanged(EntityUid uid)
|
||||
{
|
||||
UpdateChannelPermissions();
|
||||
UpdateAutoFillHighlights();
|
||||
}
|
||||
|
||||
private void AddSpeechBubble(ChatMessage msg, SpeechBubble.SpeechType speechType)
|
||||
@@ -877,6 +880,11 @@ public sealed class ChatUIController : UIController
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var highlight in _highlights)
|
||||
{
|
||||
msg.WrappedMessage = SharedChatSystem.InjectTagAroundString(msg, highlight, "color", _highlightsColor);
|
||||
}
|
||||
|
||||
// Log all incoming chat to repopulate when filter is un-toggled
|
||||
if (!msg.HideChat)
|
||||
{
|
||||
@@ -912,7 +920,6 @@ public sealed class ChatUIController : UIController
|
||||
case ChatChannel.Dead:
|
||||
if (_ghost is not {IsGhost: true})
|
||||
break;
|
||||
|
||||
AddSpeechBubble(msg, SpeechBubble.SpeechType.Say);
|
||||
break;
|
||||
|
||||
|
||||
@@ -1,10 +1,30 @@
|
||||
<controls:ChannelFilterPopup
|
||||
xmlns="https://spacestation14.io"
|
||||
xmlns:controls="clr-namespace:Content.Client.UserInterface.Systems.Chat.Controls">
|
||||
xmlns:controls="clr-namespace:Content.Client.UserInterface.Systems.Chat.Controls"
|
||||
xmlns:graphics="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client">
|
||||
<PanelContainer Name="FilterPopupPanel" StyleClasses="BorderedWindowPanel">
|
||||
<BoxContainer Orientation="Horizontal">
|
||||
<Control MinSize="4 0"/>
|
||||
<BoxContainer Name="FilterVBox" MinWidth="110" Margin="0 10" Orientation="Vertical" SeparationOverride="4"/>
|
||||
<BoxContainer Name="HighlightsVBox" MinWidth="120" Margin="0 10" Orientation="Vertical" SeparationOverride="4">
|
||||
<BoxContainer Name="AutoFillVBox" Orientation="Vertical" SeparationOverride="2" Visible="False">
|
||||
<Label Text="{Loc 'hud-chatbox-autofill-highlights'}"/>
|
||||
<PanelContainer>
|
||||
<PanelContainer.PanelOverride>
|
||||
<graphics:StyleBoxFlat BackgroundColor="#262736"/>
|
||||
</PanelContainer.PanelOverride>
|
||||
<RichTextLabel Name="AutoFillLabel" Margin="5 5"/>
|
||||
</PanelContainer>
|
||||
</BoxContainer>
|
||||
<Label Text="{Loc 'hud-chatbox-highlights'}"/>
|
||||
<PanelContainer>
|
||||
<PanelContainer.PanelOverride>
|
||||
<graphics:StyleBoxFlat BackgroundColor="#323446"/>
|
||||
</PanelContainer.PanelOverride>
|
||||
<TextEdit Name="HighlightEdit" MinHeight="150" Margin="5 5"/>
|
||||
</PanelContainer>
|
||||
<Button Name="HighlightButton" Text="{Loc 'hud-chatbox-highlights-button'}" ToolTip="{Loc 'hud-chatbox-highlights-tooltip'}"/>
|
||||
</BoxContainer>
|
||||
</BoxContainer>
|
||||
</PanelContainer>
|
||||
</controls:ChannelFilterPopup>
|
||||
|
||||
@@ -2,6 +2,7 @@ using Content.Shared.Chat;
|
||||
using Robust.Client.AutoGenerated;
|
||||
using Robust.Client.UserInterface.Controls;
|
||||
using Robust.Client.UserInterface.XAML;
|
||||
using Robust.Shared.Utility;
|
||||
using static Robust.Client.UserInterface.Controls.BaseButton;
|
||||
|
||||
namespace Content.Client.UserInterface.Systems.Chat.Controls;
|
||||
@@ -30,10 +31,13 @@ public sealed partial class ChannelFilterPopup : Popup
|
||||
private readonly Dictionary<ChatChannel, ChannelFilterCheckbox> _filterStates = new();
|
||||
|
||||
public event Action<ChatChannel, bool>? OnChannelFilter;
|
||||
public event Action<string>? OnNewHighlights;
|
||||
|
||||
public ChannelFilterPopup()
|
||||
{
|
||||
RobustXamlLoader.Load(this);
|
||||
HighlightButton.OnPressed += HighlightsEntered;
|
||||
HighlightEdit.Placeholder = new Rope.Leaf(Loc.GetString("hud-chatbox-highlights-placeholder"));
|
||||
}
|
||||
|
||||
public bool IsActive(ChatChannel channel)
|
||||
@@ -95,4 +99,36 @@ public sealed partial class ChannelFilterPopup : Popup
|
||||
if (_filterStates.TryGetValue(channel, out var checkbox))
|
||||
checkbox.UpdateUnreadCount(unread);
|
||||
}
|
||||
|
||||
// Highlight
|
||||
|
||||
/// <summary>
|
||||
/// Updates the read-only auto-fill section with name/job tokens.
|
||||
/// </summary>
|
||||
public void UpdateAutoFill(string autoFillKeywords)
|
||||
{
|
||||
AutoFillVBox.Visible = !string.IsNullOrEmpty(autoFillKeywords);
|
||||
if (string.IsNullOrEmpty(autoFillKeywords))
|
||||
return;
|
||||
|
||||
var msg = new FormattedMessage();
|
||||
var lines = autoFillKeywords.Split('\n', StringSplitOptions.RemoveEmptyEntries);
|
||||
for (var i = 0; i < lines.Length; i++)
|
||||
{
|
||||
if (i > 0) msg.PushNewline();
|
||||
msg.AddText(lines[i]);
|
||||
}
|
||||
AutoFillLabel.SetMessage(msg);
|
||||
}
|
||||
|
||||
public void UpdateHighlights(string highlights)
|
||||
{
|
||||
HighlightEdit.TextRope = new Rope.Leaf(highlights);
|
||||
}
|
||||
|
||||
private void HighlightsEntered(ButtonEventArgs _args)
|
||||
{
|
||||
OnNewHighlights?.Invoke(Rope.Collapse(HighlightEdit.TextRope));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -47,9 +47,12 @@ public partial class ChatBox : UIWidget
|
||||
ChatInput.Input.OnFocusExit += OnFocusExit;
|
||||
ChatInput.ChannelSelector.OnChannelSelect += OnChannelSelect;
|
||||
ChatInput.FilterButton.Popup.OnChannelFilter += OnChannelFilter;
|
||||
ChatInput.FilterButton.Popup.OnNewHighlights += OnNewHighlights;
|
||||
|
||||
_controller = UserInterfaceManager.GetUIController<ChatUIController>();
|
||||
_controller.MessageAdded += OnMessageAdded;
|
||||
_controller.HighlightsUpdated += OnHighlightsUpdated;
|
||||
_controller.AutoFillUpdated += OnAutoFillUpdated;
|
||||
_controller.RegisterChat(this);
|
||||
|
||||
// WD EDIT START
|
||||
@@ -133,6 +136,21 @@ public partial class ChatBox : UIWidget
|
||||
}
|
||||
}
|
||||
|
||||
private void OnNewHighlights(string highlighs)
|
||||
{
|
||||
_controller.UpdateHighlights(highlighs);
|
||||
}
|
||||
|
||||
private void OnHighlightsUpdated(string highlights)
|
||||
{
|
||||
ChatInput.FilterButton.Popup.UpdateHighlights(highlights);
|
||||
}
|
||||
|
||||
private void OnAutoFillUpdated(string autoFillKeywords)
|
||||
{
|
||||
ChatInput.FilterButton.Popup.UpdateAutoFill(autoFillKeywords);
|
||||
}
|
||||
|
||||
public void AddLine(string message, Color color, int repeat = 0) // WD EDIT
|
||||
{
|
||||
var formatted = new FormattedMessage(4); // WD EDIT // specifying size beforehand smells like a useless microoptimisation, but i'll give them the benefit of doubt
|
||||
|
||||
@@ -64,7 +64,11 @@ namespace Content.Client.Voting.UI
|
||||
var entry = _vote.Entries[i];
|
||||
if (_vote.DisplayVotes)
|
||||
{
|
||||
_voteButtons[i].Text = Loc.GetString("ui-vote-button", ("text", entry.Text), ("votes", entry.Votes));
|
||||
// Mono
|
||||
if (entry.RealVotes != entry.Votes)
|
||||
_voteButtons[i].Text = Loc.GetString("ui-vote-button-weighted", ("text", entry.Text), ("votes", entry.Votes), ("realvotes", entry.RealVotes));
|
||||
else
|
||||
_voteButtons[i].Text = Loc.GetString("ui-vote-button", ("text", entry.Text), ("votes", entry.Votes));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -192,6 +192,7 @@ namespace Content.Client.Voting
|
||||
for (var i = 0; i < message.Options.Length; i++)
|
||||
{
|
||||
existingVote.Entries[i].Votes = message.Options[i].votes;
|
||||
existingVote.Entries[i].RealVotes = message.Options[i].realVotes; // Mono
|
||||
}
|
||||
|
||||
if (@new && _popupContainer != null)
|
||||
@@ -259,6 +260,7 @@ namespace Content.Client.Voting
|
||||
{
|
||||
public string Text { get; }
|
||||
public int Votes { get; set; }
|
||||
public int RealVotes; // Mono
|
||||
|
||||
public VoteEntry(string text)
|
||||
{
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using Content.Server._Mono.Planets;
|
||||
using Content.Server.Administration.Logs;
|
||||
using Content.Server.Body.Systems;
|
||||
using Content.Server.Explosion.Components;
|
||||
@@ -39,6 +40,7 @@ using Content.Shared.Projectiles; // Frontier: embed triggers
|
||||
using Content.Shared.Mind;
|
||||
using Content.Shared.Mind.Components;
|
||||
using Content.Shared.Roles;
|
||||
using Robust.Shared.Map.Components;
|
||||
|
||||
namespace Content.Server.Explosion.EntitySystems
|
||||
{
|
||||
@@ -83,6 +85,7 @@ namespace Content.Server.Explosion.EntitySystems
|
||||
[Dependency] private readonly InventorySystem _inventory = default!;
|
||||
[Dependency] private readonly ElectrocutionSystem _electrocution = default!;
|
||||
[Dependency] private readonly StationSystem _station = default!; // Frontier: medical insurance
|
||||
[Dependency] private readonly SharedMapSystem _map = default!; // Frontier: medical insurance
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
@@ -252,19 +255,19 @@ namespace Content.Server.Explosion.EntitySystems
|
||||
var posText = $"({x}, {y})";
|
||||
|
||||
// Frontier: Gets station location of the implant
|
||||
var station = _station.GetOwningStation(uid);
|
||||
var stationText = station is null ? null : $"{Name(station.Value)} ";
|
||||
var grid = ownerXform.GridUid;
|
||||
var gridText = grid is null ? "" : MetaData(grid.Value).EntityName;
|
||||
|
||||
if (stationText == null)
|
||||
stationText = "";
|
||||
if (HasComp<MapComponent>(grid) && !HasComp<PlanetMapComponent>(grid))
|
||||
gridText = "";
|
||||
|
||||
// Frontier: Gets species of the implant user
|
||||
var speciesText = $"";
|
||||
if (TryComp<HumanoidAppearanceComponent>(implanted.ImplantedEntity, out var species))
|
||||
speciesText = $" ({species!.Species})";
|
||||
speciesText = $" ({species.Species})";
|
||||
|
||||
var critMessage = Loc.GetString(component.CritMessage, ("user", implanted.ImplantedEntity.Value), ("specie", speciesText), ("grid", stationText!), ("position", posText));
|
||||
var deathMessage = Loc.GetString(component.DeathMessage, ("user", implanted.ImplantedEntity.Value), ("specie", speciesText), ("grid", stationText!), ("position", posText));
|
||||
var critMessage = Loc.GetString(component.CritMessage, ("user", implanted.ImplantedEntity.Value), ("specie", speciesText), ("grid", gridText), ("position", posText));
|
||||
var deathMessage = Loc.GetString(component.DeathMessage, ("user", implanted.ImplantedEntity.Value), ("specie", speciesText), ("grid", gridText), ("position", posText));
|
||||
|
||||
if (!TryComp<MobStateComponent>(implanted.ImplantedEntity, out var mobstate))
|
||||
return;
|
||||
|
||||
@@ -130,6 +130,10 @@ public sealed partial class GameTicker
|
||||
if (MetaData(ruleEntity).EntityPrototype?.ID is not { } id) // you really fucked up
|
||||
return false;
|
||||
|
||||
// Mono - ensure delayed start rules don't trigger ahead of time.
|
||||
if (TryComp<DelayedStartRuleComponent>(ruleEntity, out var delayComp) && delayComp.RuleStartTime > _gameTiming.CurTime)
|
||||
return false;
|
||||
|
||||
// If we already have it, then we just skip the delay as it has already happened.
|
||||
if (!RemComp<DelayedStartRuleComponent>(ruleEntity) && ruleData.Delay != null)
|
||||
{
|
||||
|
||||
@@ -42,5 +42,11 @@ namespace Content.Server.GameTicking.Presets
|
||||
/// </summary>
|
||||
[DataField("supportedMaps", customTypeSerializer: typeof(PrototypeIdSerializer<GameMapPoolPrototype>))]
|
||||
public string? MapPool;
|
||||
|
||||
/// <summary>
|
||||
/// Mono - as how much votes should each player click count.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public float Weight = 1f;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,11 +39,11 @@ public sealed class MechEquipmentSystem : EntitySystem
|
||||
if (args.User == mechComp.PilotSlot.ContainedEntity)
|
||||
return;
|
||||
|
||||
if (mechComp.EquipmentContainer.ContainedEntities.Count >= mechComp.MaxEquipmentAmount)
|
||||
return;
|
||||
// if (mechComp.EquipmentContainer.ContainedEntities.Count >= mechComp.MaxEquipmentAmount)
|
||||
// return;
|
||||
|
||||
if (_whitelistSystem.IsWhitelistFail(mechComp.EquipmentWhitelist, args.Used))
|
||||
return;
|
||||
// if (_whitelistSystem.IsWhitelistFail(mechComp.EquipmentWhitelist, args.Used)) mono - no limit to the larp.
|
||||
// return;
|
||||
|
||||
_popup.PopupEntity(Loc.GetString("mech-equipment-begin-install", ("item", uid)), mech);
|
||||
|
||||
|
||||
@@ -323,7 +323,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() * shuttle.BaseMaxLinearVelocity * twrMult;
|
||||
}
|
||||
|
||||
private void HandleShuttleMovement(float frameTime)
|
||||
|
||||
@@ -69,6 +69,8 @@ public sealed partial class ResearchSystem
|
||||
if (serverComponent.Clients.Contains(client))
|
||||
return;
|
||||
|
||||
UnregisterClient(client, clientComponent); // Mono Research Fix, unregister a client if applicable before registering to a new server
|
||||
|
||||
serverComponent.Clients.Add(client);
|
||||
clientComponent.Server = server;
|
||||
SyncClientWithServer(client, clientComponent: clientComponent);
|
||||
|
||||
@@ -22,6 +22,7 @@ using Robust.Shared.Timing;
|
||||
using Content.Shared.DeviceNetwork.Components;
|
||||
using Timer = Robust.Shared.Timing.Timer;
|
||||
using Content.Server._NF.SectorServices; // Frontier
|
||||
using Content.Shared.GameTicking.Components; // Mono
|
||||
|
||||
namespace Content.Server.RoundEnd
|
||||
{
|
||||
@@ -354,9 +355,17 @@ namespace Content.Server.RoundEnd
|
||||
public override void Update(float frameTime)
|
||||
{
|
||||
// Check if we should auto-call.
|
||||
int mins = _autoCalledBefore ? _cfg.GetCVar(CCVars.EmergencyShuttleAutoCallExtensionTime)
|
||||
: _cfg.GetCVar(CCVars.EmergencyShuttleAutoCallTime);
|
||||
if (mins != 0 && _gameTiming.CurTime - AutoCallStartTime > TimeSpan.FromMinutes(mins))
|
||||
var mins = TimeSpan.FromMinutes(_autoCalledBefore ? _cfg.GetCVar(CCVars.EmergencyShuttleAutoCallExtensionTime)
|
||||
: _cfg.GetCVar(CCVars.EmergencyShuttleAutoCallTime));
|
||||
|
||||
// Mono
|
||||
var query = EntityQueryEnumerator<RoundEndTimeRuleComponent, ActiveGameRuleComponent>();
|
||||
while (query.MoveNext(out _, out var endTimeComp, out _))
|
||||
{
|
||||
mins = endTimeComp.EndAt;
|
||||
}
|
||||
|
||||
if (mins.TotalSeconds != 0 && _gameTiming.CurTime - AutoCallStartTime > mins)
|
||||
{
|
||||
if (!_shuttle.EmergencyShuttleArrived && ExpectedCountdownEnd is null)
|
||||
{
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
using System;
|
||||
|
||||
namespace Content.Server.RoundEnd;
|
||||
|
||||
/// <summary>
|
||||
/// If a gamerule with this component is present, override the roundend time to the time set in it.
|
||||
/// </summary>
|
||||
[RegisterComponent]
|
||||
public sealed partial class RoundEndTimeRuleComponent : Component
|
||||
{
|
||||
[DataField]
|
||||
public TimeSpan EndAt;
|
||||
}
|
||||
@@ -20,7 +20,7 @@ namespace Content.Server.Shuttles.Components
|
||||
/// Maximum velocity assuming TWR is BaseMaxVelocityTWR.
|
||||
/// </summary>
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
public float BaseMaxLinearVelocity = 75f; // Mono
|
||||
public float BaseMaxLinearVelocity = 7500f; // Mono - april 1st
|
||||
|
||||
public const float MaxAngularVelocity = 4f;
|
||||
|
||||
|
||||
@@ -71,7 +71,7 @@ namespace Content.Server.Shuttles.Components
|
||||
public string MachinePartThrust = "Capacitor";
|
||||
|
||||
[DataField("partRatingThrustMultiplier")]
|
||||
public float PartRatingThrustMultiplier = 1.15f; // Frontier - PR #1292 1.5f<1.15f
|
||||
public float PartRatingThrustMultiplier = 1.25f; // Mono: 1.15->1.25 (frontier: 1.5->1.15)
|
||||
|
||||
/// <summary>
|
||||
/// Frontier - Amount of charge this needs from an APC per second to function.
|
||||
|
||||
@@ -177,7 +177,8 @@ public sealed partial class ShuttleConsoleSystem
|
||||
_shuttle.GetAllDockedShuttlesIgnoringFTLLock(shuttleUid.Value, dockedGrids);
|
||||
|
||||
// Mono
|
||||
foreach (var (console, consoleComp) in _lookup.GetEntitiesInRange<ShuttleConsoleComponent>(_transform.GetMapCoordinates(xform), ShuttleFTLRange))
|
||||
var selfCoord = _transform.GetMapCoordinates(xform);
|
||||
foreach (var (console, consoleComp) in _lookup.GetEntitiesInRange<ShuttleConsoleComponent>(selfCoord, ShuttleFTLRange))
|
||||
{
|
||||
var consoleXform = Transform(console);
|
||||
var consGrid = consoleXform.GridUid;
|
||||
@@ -200,6 +201,15 @@ public sealed partial class ShuttleConsoleSystem
|
||||
// Client sends the "adjusted" coordinates and we adjust it back to get the actual transform coordinates.
|
||||
var adjustedCoordinates = targetCoordinates.Offset(targetAngle.RotateVec(-shuttlePhysics.LocalCenter));
|
||||
|
||||
var fromWorldPos = selfCoord.Position;
|
||||
var toWorldPos = _transform.ToWorldPosition(adjustedCoordinates);
|
||||
if (fromWorldPos.Length() < 10000 && toWorldPos.Length() > 9700)
|
||||
{
|
||||
_popup.PopupEntity(Loc.GetString("shuttle-ftl-thewall"), ent.Owner, PopupType.Medium);
|
||||
UpdateConsoles(shuttleUid.Value);
|
||||
return;
|
||||
}
|
||||
|
||||
var tagEv = new FTLTagEvent();
|
||||
RaiseLocalEvent(shuttleUid.Value, ref tagEv);
|
||||
|
||||
|
||||
@@ -172,8 +172,8 @@ public sealed partial class ShuttleSystem
|
||||
|
||||
|
||||
// Check if either grid has GridGodMode or ForceAnchor protection
|
||||
var ourProtected = HasComp<GridGodModeComponent>(args.OurEntity) || HasComp<ForceAnchorComponent>(args.OurEntity);
|
||||
var otherProtected = HasComp<GridGodModeComponent>(args.OtherEntity) || HasComp<ForceAnchorComponent>(args.OtherEntity);
|
||||
var ourProtected = HasComp<GridGodModeComponent>(args.OurEntity); // || HasComp<ForceAnchorComponent>(args.OurEntity);
|
||||
var otherProtected = HasComp<GridGodModeComponent>(args.OtherEntity); // || HasComp<ForceAnchorComponent>(args.OtherEntity);
|
||||
|
||||
// Check if the grids are docked together to prevent impact
|
||||
var areGridsDocked = _dockSystem.AreGridsDocked(args.OurEntity, args.OtherEntity);
|
||||
|
||||
@@ -69,6 +69,12 @@ public sealed partial class StationEventComponent : Component
|
||||
[DataField]
|
||||
public ProtoId<RadioChannelPrototype> EndRadioAnnouncementChannel = "Supply"; // Frontier
|
||||
|
||||
/// <summary>
|
||||
/// Mono - sender of start/warn/end announcements.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public LocId? AnnounceSender = null;
|
||||
|
||||
/// <summary>
|
||||
/// In minutes, when is the first round time this event can start
|
||||
/// </summary>
|
||||
|
||||
@@ -50,7 +50,7 @@ public abstract class StationEventSystem<T> : GameRuleSystem<T> where T : ICompo
|
||||
Filter allPlayersInGame = Filter.Empty().AddWhere(GameTicker.UserHasJoinedGame);
|
||||
|
||||
if (stationEvent.StartAnnouncement != null)
|
||||
ChatSystem.DispatchFilteredAnnouncement(allPlayersInGame, Loc.GetString(stationEvent.StartAnnouncement), playSound: false, colorOverride: stationEvent.StartAnnouncementColor);
|
||||
ChatSystem.DispatchFilteredAnnouncement(allPlayersInGame, Loc.GetString(stationEvent.StartAnnouncement), sender: stationEvent.AnnounceSender is { } send ? Loc.GetString(send) : null, playSound: false, colorOverride: stationEvent.StartAnnouncementColor);
|
||||
|
||||
// Frontier
|
||||
if (stationEvent.StartRadioAnnouncement != null)
|
||||
@@ -97,7 +97,7 @@ public abstract class StationEventSystem<T> : GameRuleSystem<T> where T : ICompo
|
||||
Filter allPlayersInGame = Filter.Empty().AddWhere(GameTicker.UserHasJoinedGame);
|
||||
|
||||
if (stationEvent.EndAnnouncement != null)
|
||||
ChatSystem.DispatchFilteredAnnouncement(allPlayersInGame, Loc.GetString(stationEvent.EndAnnouncement), playSound: false, colorOverride: stationEvent.EndAnnouncementColor);
|
||||
ChatSystem.DispatchFilteredAnnouncement(allPlayersInGame, Loc.GetString(stationEvent.EndAnnouncement), sender: stationEvent.AnnounceSender is { } send ? Loc.GetString(send) : null, playSound: false, colorOverride: stationEvent.EndAnnouncementColor);
|
||||
|
||||
// Frontier: radio announcements
|
||||
if (stationEvent.EndRadioAnnouncement != null)
|
||||
@@ -139,7 +139,7 @@ public abstract class StationEventSystem<T> : GameRuleSystem<T> where T : ICompo
|
||||
{
|
||||
Filter allPlayersInGame = Filter.Empty().AddWhere(GameTicker.UserHasJoinedGame); // we don't want to send to players who aren't in game (i.e. in the lobby)
|
||||
if (stationEvent.WarningAnnouncement != null)
|
||||
ChatSystem.DispatchFilteredAnnouncement(allPlayersInGame, Loc.GetString(stationEvent.WarningAnnouncement), playSound: false, colorOverride: stationEvent.WarningAnnouncementColor);
|
||||
ChatSystem.DispatchFilteredAnnouncement(allPlayersInGame, Loc.GetString(stationEvent.WarningAnnouncement), sender: stationEvent.AnnounceSender is { } send ? Loc.GetString(send) : null, playSound: false, colorOverride: stationEvent.WarningAnnouncementColor);
|
||||
if (stationEvent.WarningRadioAnnouncement != null)
|
||||
{
|
||||
var message = Loc.GetString(stationEvent.WarningRadioAnnouncement);
|
||||
|
||||
@@ -233,7 +233,9 @@ namespace Content.Server.Voting.Managers
|
||||
|
||||
foreach (var (k, v) in presets)
|
||||
{
|
||||
options.Options.Add((Loc.GetString(v), k));
|
||||
options.Options.Add((Loc.GetString(v.Name), k));
|
||||
if (v.Weight != 1f)
|
||||
options.Weights.Add(k, v.Weight);
|
||||
}
|
||||
|
||||
WirePresetVoteInitiator(options, initiator);
|
||||
@@ -247,13 +249,13 @@ namespace Content.Server.Voting.Managers
|
||||
{
|
||||
picked = (string) _random.Pick(args.Winners);
|
||||
_chatManager.DispatchServerAnnouncement(
|
||||
Loc.GetString("ui-vote-gamemode-tie", ("picked", Loc.GetString(presets[picked]))));
|
||||
Loc.GetString("ui-vote-gamemode-tie", ("picked", Loc.GetString(presets[picked].Name))));
|
||||
}
|
||||
else
|
||||
{
|
||||
picked = (string) args.Winner;
|
||||
_chatManager.DispatchServerAnnouncement(
|
||||
Loc.GetString("ui-vote-gamemode-win", ("winner", Loc.GetString(presets[picked]))));
|
||||
Loc.GetString("ui-vote-gamemode-win", ("winner", Loc.GetString(presets[picked].Name))));
|
||||
}
|
||||
_adminLogger.Add(LogType.Vote, LogImpact.Medium, $"Preset vote finished: {picked}");
|
||||
var ticker = _entityManager.EntitySysManager.GetEntitySystem<GameTicker>();
|
||||
@@ -585,9 +587,9 @@ namespace Content.Server.Voting.Managers
|
||||
DirtyCanCallVoteAll();
|
||||
}
|
||||
|
||||
private Dictionary<string, string> GetGamePresets()
|
||||
private Dictionary<string, (string Name, float Weight)> GetGamePresets() // Mono - add weight
|
||||
{
|
||||
var presets = new Dictionary<string, string>();
|
||||
var presets = new Dictionary<string, (string, float)>();
|
||||
|
||||
foreach (var preset in _prototypeManager.EnumeratePrototypes<GamePresetPrototype>())
|
||||
{
|
||||
@@ -600,7 +602,7 @@ namespace Content.Server.Voting.Managers
|
||||
if(_playerManager.PlayerCount > (preset.MaxPlayers ?? int.MaxValue))
|
||||
continue;
|
||||
|
||||
presets[preset.ID] = preset.ModeTitle;
|
||||
presets[preset.ID] = (preset.ModeTitle, preset.Weight);
|
||||
}
|
||||
return presets;
|
||||
}
|
||||
|
||||
@@ -206,7 +206,8 @@ namespace Content.Server.Voting.Managers
|
||||
{
|
||||
var id = _nextVoteId++;
|
||||
|
||||
var entries = options.Options.Select(o => new VoteEntry(o.data, o.text)).ToArray();
|
||||
// Mono - added weight
|
||||
var entries = options.Options.Select(o => new VoteEntry(o.data, o.text, options.Weights.TryGetValue(o.data, out var weight) ? weight : 1f)).ToArray();
|
||||
|
||||
var start = _timing.RealTime;
|
||||
var end = start + options.Duration;
|
||||
@@ -286,11 +287,12 @@ namespace Content.Server.Voting.Managers
|
||||
msg.DisplayVotes = true;
|
||||
}
|
||||
|
||||
msg.Options = new (ushort votes, string name)[v.Entries.Length];
|
||||
msg.Options = new (ushort votes, string name, ushort realVotes)[v.Entries.Length];
|
||||
for (var i = 0; i < msg.Options.Length; i++)
|
||||
{
|
||||
ref var entry = ref v.Entries[i];
|
||||
msg.Options[i] = (msg.DisplayVotes ? (ushort) entry.Votes : (ushort) 0, entry.Text);
|
||||
var votes = msg.DisplayVotes ? (ushort) entry.Votes : (ushort) 0; // Mono
|
||||
msg.Options[i] = (votes, entry.Text, (ushort) (votes * entry.Weight)); // Mono - account for weight
|
||||
}
|
||||
|
||||
player.Channel.SendMessage(msg);
|
||||
@@ -394,7 +396,7 @@ namespace Content.Server.Voting.Managers
|
||||
|
||||
// Find winner or stalemate.
|
||||
var winners = v.Entries
|
||||
.GroupBy(e => e.Votes)
|
||||
.GroupBy(e => e.Votes * e.Weight) // Mono - add weight
|
||||
.OrderByDescending(g => g.Key)
|
||||
.First()
|
||||
.Select(e => e.Data)
|
||||
@@ -536,12 +538,15 @@ namespace Content.Server.Voting.Managers
|
||||
public object Data;
|
||||
public string Text;
|
||||
public int Votes;
|
||||
public float Weight; // Mono
|
||||
|
||||
public VoteEntry(object data, string text)
|
||||
public VoteEntry(object data, string text,
|
||||
float weight = 1f) // Mono
|
||||
{
|
||||
Data = data;
|
||||
Text = text;
|
||||
Votes = 0;
|
||||
Weight = weight; // Mono
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -39,6 +39,9 @@ namespace Content.Server.Voting
|
||||
/// </summary>
|
||||
public List<(string text, object data)> Options { get; set; } = new();
|
||||
|
||||
// Mono - this is evil but allows seamless integration with the code
|
||||
public Dictionary<object, float> Weights = new();
|
||||
|
||||
/// <summary>
|
||||
/// Which sessions may send a vote. Used when only a subset of players should be able to vote. Defaults to all.
|
||||
/// </summary>
|
||||
@@ -50,7 +53,7 @@ namespace Content.Server.Voting
|
||||
public bool DisplayVotes = true;
|
||||
|
||||
/// <summary>
|
||||
/// Whether the vote should have an entity attached to it, to be used for things like letting ghosts follow it.
|
||||
/// Whether the vote should have an entity attached to it, to be used for things like letting ghosts follow it.
|
||||
/// </summary>
|
||||
public NetEntity? TargetEntity = null;
|
||||
|
||||
|
||||
@@ -39,5 +39,11 @@ public sealed partial class DebrisFeaturePlacerControllerComponent : Component
|
||||
/// </summary>
|
||||
[DataField("densityNoiseChannel", customTypeSerializer: typeof(PrototypeIdSerializer<NoiseChannelPrototype>))]
|
||||
public string DensityNoiseChannel { get; private set; } = default!;
|
||||
|
||||
[DataField]
|
||||
public float? MinRange = null;
|
||||
|
||||
[DataField]
|
||||
public float? MaxRange = null;
|
||||
}
|
||||
|
||||
|
||||
@@ -184,7 +184,10 @@ public sealed class DebrisFeaturePlacerSystem : BaseWorldSystem
|
||||
.ToList();
|
||||
}
|
||||
|
||||
points ??= GeneratePointsInChunk(args.Chunk, density, chunk.Coordinates, chunkMap);
|
||||
if (component.MinRange is { } minr && component.MaxRange is { } maxr)
|
||||
points ??= GeneratePointsInRing(args.Chunk, density, minr, maxr, chunk.Coordinates, chunkMap);
|
||||
else
|
||||
points ??= GeneratePointsInChunk(args.Chunk, density, chunk.Coordinates, chunkMap);
|
||||
|
||||
var mapId = map.MapId;
|
||||
|
||||
@@ -279,6 +282,44 @@ public sealed class DebrisFeaturePlacerSystem : BaseWorldSystem
|
||||
|
||||
return debrisPoints;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Generates the points to put into a chunk using a poisson disk sampler.
|
||||
/// </summary>
|
||||
private List<Vector2> GeneratePointsInRing(EntityUid chunk, float density, float minr, float maxr, Vector2 coords, EntityUid map)
|
||||
{
|
||||
var wantWidth = maxr - minr;
|
||||
var offs = (int) ((WorldGen.ChunkSize) / 2.0f);
|
||||
var topLeft = new Vector2(-offs, -offs);
|
||||
var lowerRight = new Vector2(offs, offs);
|
||||
var width = lowerRight.X - topLeft.X;
|
||||
var scl = wantWidth / width;
|
||||
topLeft.X *= scl;
|
||||
lowerRight.X *= scl;
|
||||
|
||||
var realCenter = WorldGen.ChunkToWorldCoordsCentered(coords.Floored());
|
||||
if (realCenter.Length() + offs < minr || realCenter.Length() - offs > maxr) return new();
|
||||
var radAdj = (maxr + minr) * 0.5f / realCenter.Length();
|
||||
var rotBy = realCenter.ToAngle();
|
||||
var rotTL = rotBy.RotateVec(topLeft);
|
||||
var rotTR = rotBy.RotateVec(topLeft + new Vector2(offs * 2f, 0f));
|
||||
var sclTL = offs / MathF.Max(MathF.Abs(rotTL.X), MathF.Abs(rotTL.Y));
|
||||
var sclTR = offs / MathF.Max(MathF.Abs(rotTR.X), MathF.Abs(rotTR.Y));
|
||||
var scl2 = MathF.Max(sclTL, sclTR);
|
||||
topLeft.Y *= scl2;
|
||||
lowerRight.Y *= scl2;
|
||||
|
||||
var enumerator = _sampler.SampleRectangle(topLeft, lowerRight, density);
|
||||
var debrisPoints = new List<Vector2>();
|
||||
|
||||
var adjCenter = realCenter * radAdj;
|
||||
while (enumerator.MoveNext(out var debrisPoint))
|
||||
{
|
||||
debrisPoints.Add(adjCenter + rotBy.RotateVec(debrisPoint.Value));
|
||||
}
|
||||
|
||||
return debrisPoints;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
+12
@@ -1,3 +1,7 @@
|
||||
using Content.Shared.Damage;
|
||||
using Content.Shared.Damage.Prototypes;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Server._EinsteinEngines.Silicon.Death;
|
||||
|
||||
/// <summary>
|
||||
@@ -14,4 +18,12 @@ public sealed partial class SiliconDownOnDeadComponent : Component
|
||||
/// </summary>
|
||||
[ViewVariables(VVAccess.ReadOnly)]
|
||||
public bool Dead;
|
||||
|
||||
/// <summary>
|
||||
/// Mono - applies modifier when silicon is out of charge.
|
||||
/// </summary>
|
||||
[ViewVariables(VVAccess.ReadOnly)]
|
||||
public ProtoId<DamageModifierSetPrototype>? ModifierOnDead = "IPCWeakened";
|
||||
|
||||
public ProtoId<DamageModifierSetPrototype>? OriginalModifier;
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ using Content.Shared.Bed.Sleep;
|
||||
using Content.Server._EinsteinEngines.Silicon.Charge;
|
||||
using Content.Server._EinsteinEngines.Power.Components;
|
||||
using Content.Server.Humanoid;
|
||||
using Content.Shared.Damage;
|
||||
using Content.Shared.Humanoid;
|
||||
using Content.Shared.Hands.Components;
|
||||
using Content.Shared.Hands.EntitySystems; //Monolith IPC rework
|
||||
@@ -15,7 +16,7 @@ public sealed class SiliconDeathSystem : EntitySystem
|
||||
[Dependency] private readonly SleepingSystem _sleep = default!;
|
||||
[Dependency] private readonly SiliconChargeSystem _silicon = default!;
|
||||
[Dependency] private readonly HumanoidAppearanceSystem _humanoidAppearanceSystem = default!;
|
||||
[Dependency] private readonly SharedHandsSystem _hands = default!; //Monolith IPC rework
|
||||
[Dependency] private readonly DamageableSystem _damage = default!; // mono
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
@@ -46,16 +47,15 @@ public sealed class SiliconDeathSystem : EntitySystem
|
||||
var deadEvent = new SiliconChargeDyingEvent(uid, batteryComp, batteryUid);
|
||||
RaiseLocalEvent(uid, deadEvent);
|
||||
|
||||
if (deadEvent.Cancelled)
|
||||
if (deadEvent.Cancelled
|
||||
|| siliconDeadComp.ModifierOnDead == null
|
||||
|| !TryComp<DamageableComponent>(uid, out var damageComp))
|
||||
return;
|
||||
|
||||
/*EntityManager.EnsureComponent<SleepingComponent>(uid); Monolith IPC rework edit start
|
||||
EntityManager.EnsureComponent<ForcedSleepingComponent>(uid);*/
|
||||
|
||||
if(!TryComp<HandsComponent>(uid, out var handsComp))
|
||||
return;
|
||||
_hands.RemoveHands(uid, handsComp); // edit end
|
||||
|
||||
siliconDeadComp.OriginalModifier = damageComp.DamageModifierSetId;
|
||||
_damage.SetDamageModifierSetId(uid, siliconDeadComp.ModifierOnDead.Value);
|
||||
|
||||
if (TryComp(uid, out HumanoidAppearanceComponent? humanoidAppearanceComponent))
|
||||
{
|
||||
@@ -73,8 +73,8 @@ public sealed class SiliconDeathSystem : EntitySystem
|
||||
/*RemComp<ForcedSleepingComponent>(uid); Monolith IPC rework edit start
|
||||
_sleep.TryWaking(uid, true, null);*/
|
||||
|
||||
_hands.AddHand(uid, "right hand", HandLocation.Right);
|
||||
_hands.AddHand(uid, "left hand", HandLocation.Left); // edit end
|
||||
if (siliconDeadComp.OriginalModifier != null)
|
||||
_damage.SetDamageModifierSetId(uid, siliconDeadComp.OriginalModifier.Value);
|
||||
|
||||
siliconDeadComp.Dead = false;
|
||||
|
||||
|
||||
@@ -37,10 +37,18 @@ public sealed class ClawsSystem : SharedClawsSystem
|
||||
if (TryGetStage<Declawed>(comp, out var declawed))
|
||||
UpdateDeclaw(uid, declawed, comp, _updateCooldown);
|
||||
|
||||
if (HasComp<ClawsGrowthSuppressionComponent>(uid))
|
||||
{
|
||||
comp.AccumulatedBonusGrowth = TimeSpan.Zero;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!_protoMan.TryIndex(comp.ClawStage, out var claw) || !claw.CanGrow)
|
||||
continue;
|
||||
|
||||
comp.GrowTimer += TimeSpan.FromSeconds(_updateCooldown);
|
||||
comp.GrowTimer += TimeSpan.FromSeconds(_updateCooldown) + comp.AccumulatedBonusGrowth;
|
||||
|
||||
comp.AccumulatedBonusGrowth = TimeSpan.Zero;
|
||||
|
||||
if (comp.GrowTimer < claw.GrowCooldown)
|
||||
{
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using System.Linq;
|
||||
using Content.Server.Damage.Systems;
|
||||
using Content.Server.NPC.HTN;
|
||||
using Content.Server.Spreader;
|
||||
using Content.Shared._Mono;
|
||||
using Content.Shared.Damage.Components;
|
||||
@@ -68,7 +69,7 @@ public sealed class GridGodModeSystem : EntitySystem
|
||||
/// </summary>
|
||||
private void ProcessEntityOnGrid(EntityUid gridUid, EntityUid entityUid, GridGodModeComponent component)
|
||||
{
|
||||
// Don't apply GodMode to organic entities, ghosts, or kudzu
|
||||
// Don't apply GodMode to organic entities, ghosts, npcs, or kudzu
|
||||
if (IsOrganic(entityUid) || HasComp<GhostComponent>(entityUid) || HasComp<KudzuComponent>(entityUid))
|
||||
return;
|
||||
|
||||
@@ -122,6 +123,12 @@ public sealed class GridGodModeSystem : EntitySystem
|
||||
return true;
|
||||
}
|
||||
|
||||
// Also check for anything with HTN such as NPCs, such as turrets.
|
||||
if (HasComp<HTNComponent>(entityUid))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
namespace Content.Server._Mono.StationEvents;
|
||||
|
||||
[RegisterComponent]
|
||||
public sealed partial class BlankRuleComponent : Component;
|
||||
@@ -0,0 +1,9 @@
|
||||
using Content.Server.StationEvents.Events;
|
||||
using JetBrains.Annotations;
|
||||
|
||||
namespace Content.Server._Mono.StationEvents;
|
||||
|
||||
[UsedImplicitly]
|
||||
public sealed class FalseAlarmRule : StationEventSystem<BlankRuleComponent>
|
||||
{
|
||||
}
|
||||
@@ -15,9 +15,9 @@ public sealed partial class ForceAnchorSystem : EntitySystem
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
SubscribeLocalEvent<ForceAnchorComponent, MapInitEvent>(OnForceAnchorMapInit);
|
||||
SubscribeLocalEvent<ForceAnchorPostFTLComponent, FTLCompletedEvent>(OnForceAnchorPostFTLCompleted);
|
||||
SubscribeLocalEvent<ConsoleFTLAttemptEvent>(OnConsoleFTLAttempt, before: new[] { typeof(ShuttleSystem) });
|
||||
// SubscribeLocalEvent<ForceAnchorComponent, MapInitEvent>(OnForceAnchorMapInit);
|
||||
// SubscribeLocalEvent<ForceAnchorPostFTLComponent, FTLCompletedEvent>(OnForceAnchorPostFTLCompleted);
|
||||
// SubscribeLocalEvent<ConsoleFTLAttemptEvent>(OnConsoleFTLAttempt, before: new[] { typeof(ShuttleSystem) });
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -14,8 +14,8 @@ namespace Content.Server.Shuttles.Systems;
|
||||
public sealed partial class ShuttleSystem
|
||||
{
|
||||
private const float SpaceFrictionStrength = 0.0075f;
|
||||
private const float DampenDampingStrength = 0.25f;
|
||||
private const float AnchorDampingStrength = 2.5f;
|
||||
private const float DampenDampingStrength = 0.0075f; // Mono - april 1st changes
|
||||
private const float AnchorDampingStrength = 0.0075f; // Mono - april 1st changes
|
||||
private void NfInitialize()
|
||||
{
|
||||
SubscribeLocalEvent<ShuttleConsoleComponent, SetInertiaDampeningRequest>(OnSetInertiaDampening);
|
||||
|
||||
@@ -15,7 +15,7 @@ public sealed partial class PerishableComponent : Component
|
||||
/// How long it takes after death to start rotting.
|
||||
/// </summary>
|
||||
[DataField("rotAfter"), ViewVariables(VVAccess.ReadWrite)]
|
||||
public TimeSpan RotAfter = TimeSpan.FromMinutes(20);
|
||||
public TimeSpan RotAfter = TimeSpan.FromMinutes(60); // Mono: Tripled default (20 > 60)
|
||||
|
||||
/// <summary>
|
||||
/// How much rotting has occured
|
||||
|
||||
@@ -43,7 +43,7 @@ public sealed partial class BlockingSystem : SharedBlockingSystem // Mono
|
||||
|
||||
private void OnUserDamageModified(EntityUid uid, BlockingUserComponent component, DamageModifyEvent args)
|
||||
{
|
||||
if (TryComp<ItemToggleComponent>(component.BlockingItem, out var toggleComponent) && TryComp<BlockingComponent>(component.BlockingItem, out var blocking)) // Mono
|
||||
if (TryComp<BlockingComponent>(component.BlockingItem, out var blocking)) // Mono
|
||||
{
|
||||
if (args.Damage.GetTotal() <= 0)
|
||||
return;
|
||||
@@ -52,7 +52,7 @@ public sealed partial class BlockingSystem : SharedBlockingSystem // Mono
|
||||
if (!TryComp<DamageableComponent>(component.BlockingItem, out var dmgComp))
|
||||
return;
|
||||
|
||||
if (!toggleComponent.Activated) // Mono
|
||||
if (TryComp<ItemToggleComponent>(component.BlockingItem, out var toggleComponent) && !toggleComponent.Activated) // Mono
|
||||
return;
|
||||
|
||||
var blockFraction = blocking.IsBlocking ? blocking.ActiveBlockFraction : blocking.PassiveBlockFraction;
|
||||
|
||||
@@ -65,4 +65,15 @@ public sealed partial class CCVars
|
||||
"",
|
||||
CVar.SERVER | CVar.SERVERONLY | CVar.ARCHIVE,
|
||||
"A message broadcast to each player that joins the lobby.");
|
||||
|
||||
public static readonly CVarDef<string> ChatHighlights =
|
||||
CVarDef.Create("chat.words_highlights", "", CVar.CLIENTONLY | CVar.ARCHIVE,
|
||||
"Per-character custom highlight keywords. Format: one entry per line, 'CharacterName||encoded_keywords'. " +
|
||||
"Encoded keywords use \\n for newlines, \\| for pipes, \\\\ for backslashes.");
|
||||
|
||||
public static readonly CVarDef<bool> ChatAutoFillHighlights =
|
||||
CVarDef.Create("chat.auto_fill_highlights", false, CVar.CLIENTONLY | CVar.ARCHIVE, "Toggles automatically filling the highlights with the character's information.");
|
||||
|
||||
public static readonly CVarDef<string> ChatHighlightsColor =
|
||||
CVarDef.Create("chat.highlights_color", "#17FFC1FF", CVar.CLIENTONLY | CVar.ARCHIVE, "The color in which the highlights will be displayed.");
|
||||
}
|
||||
|
||||
@@ -25,6 +25,10 @@ public sealed partial class FlatpackComponent : Component
|
||||
[DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
|
||||
public EntProtoId? Entity;
|
||||
|
||||
// Mono - april 1st
|
||||
[DataField]
|
||||
public List<EntProtoId>? Entities = null;
|
||||
|
||||
/// <summary>
|
||||
/// Sound effect played upon the object being unpacked.
|
||||
/// </summary>
|
||||
|
||||
@@ -12,6 +12,7 @@ using Robust.Shared.Containers;
|
||||
using Robust.Shared.Map.Components;
|
||||
using Robust.Shared.Network;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Random;
|
||||
|
||||
namespace Content.Shared.Construction;
|
||||
|
||||
@@ -30,6 +31,7 @@ public abstract class SharedFlatpackSystem : EntitySystem
|
||||
[Dependency] private readonly MetaDataSystem _metaData = default!;
|
||||
[Dependency] private readonly SharedPopupSystem _popup = default!;
|
||||
[Dependency] private readonly SharedToolSystem _tool = default!;
|
||||
[Dependency] private readonly IRobustRandom _random = default!;
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void Initialize()
|
||||
@@ -67,7 +69,7 @@ public abstract class SharedFlatpackSystem : EntitySystem
|
||||
|
||||
args.Handled = true;
|
||||
|
||||
if (comp.Entity == null)
|
||||
if (comp.Entity == null && (comp.Entities is not { } entsc || entsc.Count == 0))
|
||||
{
|
||||
Log.Error($"No entity prototype present for flatpack {ToPrettyString(ent)}.");
|
||||
|
||||
@@ -92,7 +94,8 @@ public abstract class SharedFlatpackSystem : EntitySystem
|
||||
|
||||
if (_net.IsServer)
|
||||
{
|
||||
var spawn = Spawn(comp.Entity, _map.GridTileToLocal(grid, gridComp, buildPos));
|
||||
var entsp = comp.Entities is { } ents ? _random.Pick(ents) : comp.Entity;
|
||||
var spawn = Spawn(entsp, _map.GridTileToLocal(grid, gridComp, buildPos));
|
||||
if (TryComp(spawn, out TransformComponent? spawnXform)) // Frontier: rotatable flatpacks
|
||||
spawnXform.LocalRotation = xform.LocalRotation.GetCardinalDir().ToAngle(); // Frontier: rotatable flatpacks
|
||||
_adminLogger.Add(LogType.Construction,
|
||||
|
||||
@@ -78,7 +78,7 @@ public abstract class SharedMechSystem : EntitySystem
|
||||
SubscribeLocalEvent<MechPilotComponent, AttackAttemptEvent>(OnAttackAttempt);
|
||||
SubscribeLocalEvent<MechPilotComponent, EntGotRemovedFromContainerMessage>(OnEntGotRemovedFromContainer);
|
||||
SubscribeLocalEvent<MechEquipmentComponent, ShotAttemptedEvent>(OnShotAttempted); // Goobstation
|
||||
Subs.CVar(_config, GoobCVars.MechGunOutsideMech, value => _canUseMechGunOutside = value, false); // Goobstation
|
||||
Subs.CVar(_config, GoobCVars.MechGunOutsideMech, value => _canUseMechGunOutside = value, true); // Goobstation
|
||||
}
|
||||
|
||||
// GoobStation: Fixes scram implants or teleports locking the pilot out of being able to move.
|
||||
@@ -265,11 +265,11 @@ public abstract class SharedMechSystem : EntitySystem
|
||||
if (!Resolve(toInsert, ref equipmentComponent))
|
||||
return;
|
||||
|
||||
if (component.EquipmentContainer.ContainedEntities.Count >= component.MaxEquipmentAmount)
|
||||
return;
|
||||
// if (component.EquipmentContainer.ContainedEntities.Count >= component.MaxEquipmentAmount)
|
||||
// return;
|
||||
|
||||
if (_whitelistSystem.IsWhitelistFail(component.EquipmentWhitelist, toInsert))
|
||||
return;
|
||||
// if (_whitelistSystem.IsWhitelistFail(component.EquipmentWhitelist, toInsert)) // Mono - no limit to te larp
|
||||
// return;
|
||||
|
||||
equipmentComponent.EquipmentOwner = uid;
|
||||
_container.Insert(toInsert, component.EquipmentContainer);
|
||||
|
||||
@@ -29,6 +29,13 @@ public sealed partial class NpcFactionPrototype : IPrototype
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public bool DefaultHostile = false;
|
||||
|
||||
/// <summary>
|
||||
/// Mono - Is this faction checked for default hostility?
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public bool DefaultHostileIncluded = true;
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -348,6 +348,7 @@ public sealed partial class NpcFactionSystem : EntitySystem
|
||||
{
|
||||
if (iteratedFaction.Neutral.Contains(faction) ||
|
||||
iteratedFaction.Friendly.Contains(faction) ||
|
||||
!faction.DefaultHostileIncluded || // Mono
|
||||
faction.ID == iteratedFaction.ID)
|
||||
continue;
|
||||
|
||||
|
||||
@@ -75,6 +75,8 @@ public enum CollisionGroup
|
||||
SlipLayer = MidImpassable | LowImpassable,
|
||||
ItemMask = Impassable | HighImpassable,
|
||||
ThrownItem = Impassable | HighImpassable | BulletImpassable,
|
||||
DiagonalWallLayer = Opaque | HighImpassable | MidImpassable | LowImpassable | BulletImpassable, // Mono
|
||||
DiagonalGlassLayer = HighImpassable | MidImpassable | LowImpassable | BulletImpassable, // Mono
|
||||
WallLayer = Opaque | Impassable | HighImpassable | MidImpassable | LowImpassable | BulletImpassable | InteractImpassable,
|
||||
GlassLayer = Impassable | HighImpassable | MidImpassable | LowImpassable | BulletImpassable | InteractImpassable,
|
||||
HalfWallLayer = MidImpassable | LowImpassable,
|
||||
|
||||
@@ -45,6 +45,9 @@ public sealed partial class BorgSwitchableTypeComponent : Component
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public ProtoId<RadioChannelPrototype>[] InherentRadioChannels = [];
|
||||
//Mono: Selectable borg whitelist
|
||||
[DataField(required: true), AutoNetworkedField]
|
||||
public List<ProtoId<BorgTypePrototype>> TypeWhitelist = new();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -79,6 +79,14 @@ public abstract class SharedBorgSwitchableTypeSystem : EntitySystem
|
||||
|
||||
if (!Prototypes.HasIndex(args.Prototype) || !Prototypes.HasIndex(args.Subtype))
|
||||
return;
|
||||
//Mono: Selectable borg whitelist - Validation
|
||||
if (ent.Comp.TypeWhitelist.Count == 0)
|
||||
{
|
||||
Log.Error("Empty whitelist on selectable cyborg chassis");
|
||||
return;
|
||||
}
|
||||
if (!ent.Comp.TypeWhitelist.Contains(args.Prototype))
|
||||
return;
|
||||
|
||||
SelectBorgModule(ent, args.Prototype, args.Subtype);
|
||||
}
|
||||
|
||||
@@ -1063,12 +1063,12 @@ public abstract class SharedStorageSystem : EntitySystem
|
||||
return false;
|
||||
}
|
||||
|
||||
if (TryComp<StorageComponent>(insertEnt, out var insertStorage)
|
||||
&& GetMaxItemSize((insertEnt, insertStorage)) >= maxSize)
|
||||
{
|
||||
reason = "comp-storage-too-big";
|
||||
return false;
|
||||
}
|
||||
// if (TryComp<StorageComponent>(insertEnt, out var insertStorage) // mono larp.
|
||||
// && GetMaxItemSize((insertEnt, insertStorage)) >= maxSize)
|
||||
// {
|
||||
// reason = "comp-storage-too-big";
|
||||
// return false;
|
||||
// }
|
||||
|
||||
if (!ignoreLocation && !storageComp.StoredItems.ContainsKey(insertEnt))
|
||||
{
|
||||
|
||||
@@ -14,7 +14,7 @@ namespace Content.Shared.Voting
|
||||
public string VoteInitiator = string.Empty;
|
||||
public TimeSpan StartTime; // Server RealTime.
|
||||
public TimeSpan EndTime; // Server RealTime.
|
||||
public (ushort votes, string name)[] Options = default!;
|
||||
public (ushort votes, string name, ushort realVotes)[] Options = default!; // Mono - account for vote weight
|
||||
public bool IsYourVoteDirty;
|
||||
public byte? YourVote;
|
||||
public bool DisplayVotes;
|
||||
@@ -36,10 +36,10 @@ namespace Content.Shared.Voting
|
||||
DisplayVotes = buffer.ReadBoolean();
|
||||
TargetEntity = buffer.ReadVariableInt32();
|
||||
|
||||
Options = new (ushort votes, string name)[buffer.ReadByte()];
|
||||
Options = new (ushort votes, string name, ushort realvotes)[buffer.ReadByte()];
|
||||
for (var i = 0; i < Options.Length; i++)
|
||||
{
|
||||
Options[i] = (buffer.ReadUInt16(), buffer.ReadString());
|
||||
Options[i] = (buffer.ReadUInt16(), buffer.ReadString(), buffer.ReadUInt16());
|
||||
}
|
||||
|
||||
IsYourVoteDirty = buffer.ReadBoolean();
|
||||
@@ -66,10 +66,11 @@ namespace Content.Shared.Voting
|
||||
buffer.WriteVariableInt32(TargetEntity);
|
||||
|
||||
buffer.Write((byte) Options.Length);
|
||||
foreach (var (votes, name) in Options)
|
||||
foreach (var (votes, name, realVotes) in Options)
|
||||
{
|
||||
buffer.Write(votes);
|
||||
buffer.Write(name);
|
||||
buffer.Write(realVotes); // Mono
|
||||
}
|
||||
|
||||
buffer.Write(IsYourVoteDirty);
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using Content.Shared.Damage;
|
||||
using Content.Shared.Weapons.Hitscan.Components;
|
||||
using Content.Shared.Weapons.Hitscan.Events;
|
||||
using Content.Shared.Weapons.Ranged.Events;
|
||||
@@ -8,6 +9,7 @@ namespace Content.Shared.Weapons.Hitscan.Systems;
|
||||
|
||||
public sealed class HitscanReflectSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly DamageableSystem _damage = default!; // Mono
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
@@ -23,8 +25,14 @@ public sealed class HitscanReflectSystem : EntitySystem
|
||||
if (hitscan.Comp.CurrentReflections >= hitscan.Comp.MaxReflections)
|
||||
return;
|
||||
|
||||
// Mono - Added null as default DamageSpecifier? Damage parameter
|
||||
var ev = new HitScanReflectAttemptEvent(args.Shooter ?? args.Gun, args.Gun, hitscan.Comp.ReflectiveType, args.ShotDirection, false, null);
|
||||
// Mono begin
|
||||
DamageSpecifier damage = new();
|
||||
if (EntityManager.TryGetComponent<HitscanBasicDamageComponent>(hitscan, out var hitscanDamage))
|
||||
damage = hitscanDamage.Damage * _damage.UniversalHitscanDamageModifier;
|
||||
|
||||
// Mono - Use hitscan damage component if available
|
||||
var ev = new HitScanReflectAttemptEvent(args.Shooter ?? args.Gun, args.Gun, hitscan.Comp.ReflectiveType, args.ShotDirection, false, damage);
|
||||
// Mono End
|
||||
RaiseLocalEvent(args.HitEntity.Value, ref ev);
|
||||
|
||||
if (!ev.Reflected)
|
||||
|
||||
@@ -305,14 +305,14 @@ public sealed partial class GunComponent : Component
|
||||
/// Recoil to incur per ammo shot, kg*m/s.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public float Recoil = 25f;
|
||||
public float Recoil = 200f;
|
||||
|
||||
/// <summary>
|
||||
/// Mono
|
||||
/// Multiplier of how much recoil should rotate you.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public float RecoilRotation = 0.2f;
|
||||
public float RecoilRotation = 0.5f; // Mono - april 1st
|
||||
|
||||
/// <summary>
|
||||
/// Mono
|
||||
|
||||
@@ -689,7 +689,7 @@ public abstract partial class SharedGunSystem : EntitySystem
|
||||
// Mono - rewritten
|
||||
public void CauseImpulse(EntityCoordinates toCoordinates, Entity<GunComponent> ent, float scale)
|
||||
{
|
||||
var totalImpulse = ent.Comp.Recoil * scale;
|
||||
var totalImpulse = ent.Comp.Recoil * scale * 4f; // Mono - april 1st
|
||||
var selfXform = Transform(ent);
|
||||
|
||||
var impulseCoord = new EntityCoordinates(ent, Vector2.Zero);
|
||||
|
||||
@@ -30,6 +30,9 @@ public sealed partial class ReflectComponent : Component
|
||||
public SoundSpecifier? SoundOnReflect = new SoundPathSpecifier("/Audio/Weapons/Guns/Hits/laser_sear_wall.ogg");
|
||||
|
||||
// WD START
|
||||
/// <summary>
|
||||
/// How much damage does the reflecting item take on reflect?
|
||||
/// </summary>
|
||||
[DataField, AutoNetworkedField]
|
||||
public float DamageOnReflectModifier;
|
||||
// WD END
|
||||
|
||||
@@ -232,7 +232,7 @@ public sealed class ReflectSystem : EntitySystem
|
||||
if (reflect.DamageOnReflectModifier != 0)
|
||||
{
|
||||
_damageable.TryChangeDamage(reflector, projectileComp.Damage * reflect.DamageOnReflectModifier,
|
||||
projectileComp.IgnoreResistances, origin: projectileComp.Shooter);
|
||||
projectileComp.IgnoreResistances, armorPenetration: projectileComp.ArmorPenetration, origin: projectileComp.Shooter); // Mono - Added armorpen
|
||||
}
|
||||
// WD EDIT END
|
||||
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
using Content.Shared._Mono.Claws.Components;
|
||||
using Content.Shared._Mono.Claws;
|
||||
using Content.Shared.EntityEffects;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Server.EntityEffects.Effects
|
||||
{
|
||||
public sealed partial class ClawsGrowth : EntityEffect
|
||||
{
|
||||
/// <summary>
|
||||
/// Bonus Claws growth in seconds. X seconds of additional growth per second.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public double Growth;
|
||||
|
||||
protected override string? ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys)
|
||||
=> Loc.GetString("reagent-effect-guidebook-claws-growth",
|
||||
("chance", Probability),
|
||||
("amount", Growth));
|
||||
|
||||
public override void Effect(EntityEffectBaseArgs args)
|
||||
{
|
||||
if (args.EntityManager.TryGetComponent<ClawsComponent>(args.TargetEntity, out var claws))
|
||||
{
|
||||
var sys = args.EntityManager.EntitySysManager.GetEntitySystem<SharedClawsSystem>();
|
||||
var growth = Growth;
|
||||
|
||||
if (args is EntityEffectReagentArgs reagentArgs)
|
||||
{
|
||||
growth *= reagentArgs.Scale.Float();
|
||||
}
|
||||
|
||||
sys.GrowClaws(TimeSpan.FromSeconds(growth), claws);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -7,12 +7,13 @@ using Content.Shared.Popups;
|
||||
using Content.Shared.Weapons.Melee.Events;
|
||||
|
||||
namespace Content.Shared._Mono.Claws;
|
||||
|
||||
public abstract partial class SharedClawsSystem
|
||||
{
|
||||
public void UpdateDeclaw(EntityUid uid, Declawed declawed, ClawsComponent claws, float updateTime)
|
||||
{
|
||||
if (!_state.IsAlive(uid))
|
||||
return;
|
||||
return;
|
||||
|
||||
var hands = _hands.EnumerateHands(uid).ToArray();
|
||||
if (!_hands.EnumerateHeld(uid).Any())
|
||||
@@ -43,7 +44,7 @@ public abstract partial class SharedClawsSystem
|
||||
|
||||
claws.DeclawItemHoldTimer = TimeSpan.Zero;
|
||||
|
||||
Dirty(uid,claws);
|
||||
Dirty(uid, claws);
|
||||
}
|
||||
|
||||
public void Declaw(EntityUid uid, ClawsComponent claws)
|
||||
|
||||
@@ -43,7 +43,7 @@ public abstract partial class SharedClawsSystem
|
||||
public bool TryClipNails(NailClipperComponent component, EntityUid nailClipper, EntityUid user, EntityUid? target = null)
|
||||
{
|
||||
target ??= user;
|
||||
|
||||
|
||||
if (!TryComp<ClawsComponent>(target, out var claws))
|
||||
{
|
||||
return false;
|
||||
@@ -89,7 +89,7 @@ public abstract partial class SharedClawsSystem
|
||||
|
||||
if (nailClipper.DeclawChance > _random.NextFloat())
|
||||
{
|
||||
Declaw(uid,component);
|
||||
Declaw(uid, component);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -97,6 +97,9 @@ public abstract partial class SharedClawsSystem
|
||||
Math.Clamp(TryGetStageNumber(component) - nailClipper.StageReduction, 0, int.MaxValue));
|
||||
_popup.PopupClient(Loc.GetString("claws-clipping-success"), Transform(uid).Coordinates, uid);
|
||||
|
||||
// Reset current growth progress
|
||||
component.GrowTimer = TimeSpan.Zero;
|
||||
|
||||
UpdateClaws(uid, component);
|
||||
Dirty(uid, component);
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ namespace Content.Shared._Mono.Claws.Components;
|
||||
/// <summary>
|
||||
/// This is claw component used for <see cref="SharedClawsSystem"/> System.
|
||||
/// </summary>
|
||||
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState, AutoGenerateComponentPause]
|
||||
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
|
||||
public sealed partial class ClawsComponent : Component
|
||||
{
|
||||
[DataField, AutoNetworkedField]
|
||||
@@ -18,9 +18,12 @@ public sealed partial class ClawsComponent : Component
|
||||
[DataField]
|
||||
public LocId? ClawGrowthNotification;
|
||||
|
||||
[DataField, AutoPausedField]
|
||||
[DataField]
|
||||
public TimeSpan GrowTimer = TimeSpan.Zero;
|
||||
|
||||
[AutoPausedField]
|
||||
[DataField]
|
||||
public TimeSpan AccumulatedBonusGrowth = TimeSpan.Zero;
|
||||
|
||||
[DataField]
|
||||
public TimeSpan DeclawItemHoldTimer = TimeSpan.Zero;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
using Robust.Shared.GameStates;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared._Mono.Claws.Components;
|
||||
|
||||
[RegisterComponent, NetworkedComponent]
|
||||
public sealed partial class ClawsGrowthSuppressionComponent : Component;
|
||||
@@ -104,6 +104,11 @@ public abstract partial class SharedClawsSystem : EntitySystem
|
||||
gunAccuracyComp.SpreadMultiplier = stage.GunSpreadMultiplier;
|
||||
}
|
||||
|
||||
public void GrowClaws(TimeSpan bonusGrowth, ClawsComponent component)
|
||||
{
|
||||
component.AccumulatedBonusGrowth += bonusGrowth;
|
||||
}
|
||||
|
||||
protected bool TryGetStage<T>(ClawsComponent comp, [NotNullWhen(true)] out T? stage) where T : ClawType
|
||||
{
|
||||
if (!_protoMan.TryIndex(comp.ClawStage, out var clawProto) ||
|
||||
|
||||
@@ -24,7 +24,7 @@ public sealed class NFCCVars
|
||||
/// Respawn time, how long the player has to wait in seconds after death, or on subsequent cryo attempts.
|
||||
/// </summary>
|
||||
public static readonly CVarDef<float> RespawnTime =
|
||||
CVarDef.Create("nf14.respawn.time", 1200.0f, CVar.SERVER | CVar.REPLICATED);
|
||||
CVarDef.Create("nf14.respawn.time", 65f, CVar.SERVER | CVar.REPLICATED);
|
||||
|
||||
/// <summary>
|
||||
/// Whether or not returning from cryosleep is enabled.
|
||||
|
||||
@@ -14775,7 +14775,7 @@ Entries:
|
||||
- type: Add
|
||||
message: >-
|
||||
The DIS Pluto MK. II has pierced it's way on the hull market. A
|
||||
replacement of the honorable Pluto.
|
||||
replacement of the honorable Pluto.
|
||||
- type: Remove
|
||||
message: >-
|
||||
DIS Pluto hulls are no longer available on the hull market. We will miss
|
||||
@@ -14885,7 +14885,7 @@ Entries:
|
||||
- type: Tweak
|
||||
message: >-
|
||||
Spasaka sabotage kit has gotten equipment changes to help with boarding
|
||||
as well as receiving the RX-01 suit.
|
||||
as well as receiving the RX-01 suit.
|
||||
id: 1651
|
||||
time: '2025-12-13T08:10:05.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/2782
|
||||
@@ -15226,7 +15226,7 @@ Entries:
|
||||
- type: Tweak
|
||||
message: >-
|
||||
Bluespace crates occur more frequently. By extension there will be fewer
|
||||
solar flares.
|
||||
solar flares.
|
||||
- type: Tweak
|
||||
message: >-
|
||||
Increased the number of smuggling hints sent out to ships. Happy
|
||||
@@ -15789,7 +15789,7 @@ Entries:
|
||||
- type: Add
|
||||
message: >-
|
||||
A new challanger! BT-Y Hazel enters the PDV Roster as a small-strafer in
|
||||
place of the Vega featuring a 3 barreled 220m Battery!
|
||||
place of the Vega featuring a 3 barreled 220m Battery!
|
||||
- type: Remove
|
||||
message: PDV Vega is now gone, o7.
|
||||
id: 1752
|
||||
@@ -15815,7 +15815,7 @@ Entries:
|
||||
The Europa is now a beefy capital ship with medical and cloning
|
||||
capabilities. She is now restricted to two vessels active at a time, as
|
||||
well as costing 240k. These changes come with the benefit of a heavy
|
||||
upgrade. Glory to Phaethon.
|
||||
upgrade. Glory to Phaethon.
|
||||
id: 1754
|
||||
time: '2026-01-05T16:53:42.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/2929
|
||||
@@ -16677,7 +16677,7 @@ Entries:
|
||||
- type: Tweak
|
||||
message: >-
|
||||
Advanced chemicals now have 0.15u metabolism rate. Pyrazine healing was
|
||||
buffed to 2.
|
||||
buffed to 2.
|
||||
- type: Tweak
|
||||
message: Overseer's heavy maul sprite received changes.
|
||||
id: 1847
|
||||
@@ -16904,7 +16904,7 @@ Entries:
|
||||
- type: Tweak
|
||||
message: >-
|
||||
Horizon Energy has begun sale of modernized versions of the Windreign to
|
||||
the Colossus Sector.
|
||||
the Colossus Sector.
|
||||
id: 1871
|
||||
time: '2026-02-01T19:28:28.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3141
|
||||
@@ -17076,7 +17076,7 @@ Entries:
|
||||
message: >-
|
||||
the local syndicate outpost has finally invested in some automated
|
||||
defenses. woe be the raider who tries to illegally park their ship right
|
||||
in front of the outpost.
|
||||
in front of the outpost.
|
||||
id: 1887
|
||||
time: '2026-02-11T01:31:25.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3044
|
||||
@@ -17408,7 +17408,7 @@ Entries:
|
||||
- type: Tweak
|
||||
message: >-
|
||||
Mech Fuel Cell now costs Fissile Uranium (1) and Diamond (1) among other
|
||||
cost changes, but auto-regens to full within 4 minutes.
|
||||
cost changes, but auto-regens to full within 4 minutes.
|
||||
- type: Tweak
|
||||
message: >-
|
||||
Balance pass on Armored Frame (S2/S4 mech) weapons - RAC-6 spreads
|
||||
@@ -18830,3 +18830,523 @@ Entries:
|
||||
id: 2078
|
||||
time: '2026-03-25T00:08:36.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3551
|
||||
- author: Redrover1760
|
||||
changes:
|
||||
- type: Fix
|
||||
message: >-
|
||||
Research generating things no longer connect to multiple servers at once
|
||||
when built
|
||||
id: 2079
|
||||
time: '2026-03-25T04:12:27.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3556
|
||||
- author: lopsidedmanboobs
|
||||
changes:
|
||||
- type: Remove
|
||||
message: >-
|
||||
You cannot force people to pay their own ransom during Piracy anymore.
|
||||
View Conflict Rule 3.
|
||||
id: 2080
|
||||
time: '2026-03-25T05:49:54.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3558
|
||||
- author: Redrover1760
|
||||
changes:
|
||||
- type: Tweak
|
||||
message: >-
|
||||
Clipping Claws now resets growth time, ensuring you do not have to worry
|
||||
about your claws reaching the next stage for a while.
|
||||
- type: Add
|
||||
message: >-
|
||||
Phenoxzine and Meroxzine. Phenoxzine massively boosts claw growth speed,
|
||||
Meroxzine halts it completely for a long period of time.
|
||||
id: 2081
|
||||
time: '2026-03-25T06:13:30.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3554
|
||||
- author: Redrover1760
|
||||
changes:
|
||||
- type: Add
|
||||
message: Ports CMO webbing from Goob, adds it to CMO/DoC lockers.
|
||||
id: 2082
|
||||
time: '2026-03-25T18:33:22.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3555
|
||||
- author: Redrover1760
|
||||
changes:
|
||||
- type: Tweak
|
||||
message: >-
|
||||
Fireteam leader marine playtime requirement of 10 hours replaced with
|
||||
general tsfmc playtime requirement of 10 hours
|
||||
id: 2083
|
||||
time: '2026-03-25T19:53:53.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3542
|
||||
- author: Redrover1760
|
||||
changes:
|
||||
- type: Fix
|
||||
message: >-
|
||||
Energy shields now take damage from reflecting hitscan projectiles,
|
||||
instead of just non-hitscan energy projectiles.
|
||||
- type: Fix
|
||||
message: Non-energy shields properly reduce damage taken.
|
||||
- type: Fix
|
||||
message: Riot and non-energy shields work now.
|
||||
id: 2084
|
||||
time: '2026-03-25T22:18:31.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3563
|
||||
- author: UnicornOnLSD
|
||||
changes:
|
||||
- type: Tweak
|
||||
message: >-
|
||||
The DIS Femur has seen a light rework, see PR for more details. Report
|
||||
feedback & issues to me on discord (@unicornonlsd)
|
||||
id: 2085
|
||||
time: '2026-03-26T05:55:13.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3560
|
||||
- author: Redrover1760
|
||||
changes:
|
||||
- type: Remove
|
||||
message: You can no longer sell crates on Helios/Lancelot
|
||||
id: 2086
|
||||
time: '2026-03-26T22:05:32.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3573
|
||||
- author: Onezero0
|
||||
changes:
|
||||
- type: Tweak
|
||||
message: Tripled the time it takes for a body to start rotting (20 -> 60 minutes)
|
||||
id: 2087
|
||||
time: '2026-03-27T05:49:14.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3524
|
||||
- author: Redrover1760
|
||||
changes:
|
||||
- type: Fix
|
||||
message: Hydrakin head displacement improved slightly
|
||||
id: 2088
|
||||
time: '2026-03-27T07:19:24.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3575
|
||||
- author: Redrover1760
|
||||
changes:
|
||||
- type: Tweak
|
||||
message: Updates Reptilian Guidebook with recent changes.
|
||||
id: 2089
|
||||
time: '2026-03-27T07:20:31.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3565
|
||||
- author: Ilya246
|
||||
changes:
|
||||
- type: Add
|
||||
message: Reenabled apocalypse gamemode.
|
||||
- type: Tweak
|
||||
message: Apocalypse now requires a 80% majority vote.
|
||||
- type: Tweak
|
||||
message: Some events can now trigger earlier.
|
||||
- type: Fix
|
||||
message: Fixed biothreat spawning chimera only 3 hours in. Now 1 hour.
|
||||
id: 2090
|
||||
time: '2026-03-27T17:58:07.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3570
|
||||
- author: NazrinNya
|
||||
changes:
|
||||
- type: Tweak
|
||||
message: >-
|
||||
Heavy ballistic turrets now use 51mm antimaterial instead of 65mm.
|
||||
Firerate 5 -> 4.5 Projectile speed 100 -> 65.
|
||||
id: 2091
|
||||
time: '2026-03-27T19:26:23.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3461
|
||||
- author: Redrover1760
|
||||
changes:
|
||||
- type: Add
|
||||
message: >-
|
||||
Installs anti-chimera/hostile mob turrets to CC and MD to guard
|
||||
cryosleep chambers using RIP ammo.
|
||||
- type: Tweak
|
||||
message: Grids with godmode no longer godmode turrets.
|
||||
- type: Tweak
|
||||
message: Turrets are now repairable via welder.
|
||||
- type: Fix
|
||||
message: Turrets no longer shoot mice.
|
||||
id: 2092
|
||||
time: '2026-03-27T21:57:35.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3582
|
||||
- author: Redrover1760
|
||||
changes:
|
||||
- type: Fix
|
||||
message: >-
|
||||
Emergancy software update pushed. All turrets are no longer speciest and
|
||||
kill goblins, harpies, felinids, and dwarves on sight.
|
||||
id: 2093
|
||||
time: '2026-03-28T06:41:55.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3585
|
||||
- author: Redrover1760
|
||||
changes:
|
||||
- type: Fix
|
||||
message: >-
|
||||
Diagonal Walls/Windows no longer prevent destruction of kudzu/chimera
|
||||
biomass.
|
||||
id: 2094
|
||||
time: '2026-03-28T16:17:49.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3588
|
||||
- author: NazrinNya
|
||||
changes:
|
||||
- type: Tweak
|
||||
message: Death rattle is properly working on grids and planets now
|
||||
- type: Tweak
|
||||
message: >-
|
||||
IPC received system update: Their chassis now becomes more vulnerable to
|
||||
all damage sources instead of losing hands on discharge.
|
||||
- type: Tweak
|
||||
message: Kobolds and Monkeys are now capable of piloting shuttles.
|
||||
- type: Tweak
|
||||
message: Capacitors required for thruster construction/upgrade 4 -> 1.
|
||||
- type: Tweak
|
||||
message: Ore/construction box/bag dumping speed is significantly faster now.
|
||||
- type: Tweak
|
||||
message: Security techfab now includes Mercenary techfab dynamic recipes.
|
||||
- type: Fix
|
||||
message: You actually get the mech pulse rifle in the TSFMC uplink now
|
||||
- type: Tweak
|
||||
message: Salt is now capable of being reprocessed into iron ore.
|
||||
id: 2095
|
||||
time: '2026-03-28T16:21:43.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3587
|
||||
- author: Redrover1760
|
||||
changes:
|
||||
- type: Tweak
|
||||
message: Thruster capacitor upgrades made more impactful.
|
||||
id: 2096
|
||||
time: '2026-03-28T16:42:39.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3589
|
||||
- author: Vinny-Shick
|
||||
changes:
|
||||
- type: Tweak
|
||||
message: Slightly Buffed the Vanyk
|
||||
id: 2097
|
||||
time: '2026-03-28T16:45:49.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3574
|
||||
- author: NazrinNya
|
||||
changes:
|
||||
- type: Remove
|
||||
message: Sabre has been removed from the game.
|
||||
- type: Tweak
|
||||
message: S2 mechs now use heavy mech armor
|
||||
- type: Tweak
|
||||
message: >-
|
||||
S2 mechs received health buffs (1500 -> 1750 for broadsword, 1100 ->
|
||||
2150 for halberd)
|
||||
- type: Tweak
|
||||
message: Halberd is uncapable of using light mounts now.
|
||||
- type: Tweak
|
||||
message: >-
|
||||
LAC-29 now uses 35mm caliber - 45 piercing damage and 225 structural
|
||||
damage. LAC-29 firerate 5 -> 2.5.
|
||||
- type: Tweak
|
||||
message: >-
|
||||
RAC-6 now receives huge accuracy penalty if fired for long amount of
|
||||
time. (>1.5s)
|
||||
- type: Tweak
|
||||
message: >-
|
||||
SRM-8 now fires in burst - 3 rockets per second, 6 rockets in total.
|
||||
Consumes 600 energy.
|
||||
- type: Tweak
|
||||
message: BRM-6 now consumes 250 energy instead of 100.
|
||||
id: 2098
|
||||
time: '2026-03-28T18:16:36.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3459
|
||||
- author: EckoAurum
|
||||
changes:
|
||||
- type: Add
|
||||
message: Added TSF and PDV Medical and Engineering Cyborg Variants.
|
||||
- type: Add
|
||||
message: Engineer cyborgs now have an inbuilt diagnostic hud.
|
||||
id: 2099
|
||||
time: '2026-03-28T18:43:12.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3444
|
||||
- author: Ilya246
|
||||
changes:
|
||||
- type: Tweak
|
||||
message: Portstrike is now announced.
|
||||
- type: Tweak
|
||||
message: Apocalypse now lasts 3 hours and has 1 hour portstrike.
|
||||
- type: Tweak
|
||||
message: Apocalypse chimera and ADS spawnrates doubled.
|
||||
id: 2100
|
||||
time: '2026-03-28T19:04:33.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3590
|
||||
- author: Redrover1760
|
||||
changes:
|
||||
- type: Fix
|
||||
message: 'Fixed portstrike being declared roundstart. '
|
||||
id: 2101
|
||||
time: '2026-03-29T02:40:06.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3595
|
||||
- author: Redrover1760
|
||||
changes:
|
||||
- type: Tweak
|
||||
message: Signaller range buffed to 90 meters.
|
||||
- type: Tweak
|
||||
message: Advanceds Signaller range buffed to 600 meters.
|
||||
id: 2102
|
||||
time: '2026-03-29T05:46:06.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3594
|
||||
- author: AntoineXYZ
|
||||
changes:
|
||||
- type: Add
|
||||
message: Per-character custom keyword chat highlighting
|
||||
id: 2103
|
||||
time: '2026-03-29T06:30:38.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3571
|
||||
- author: EckoAurum
|
||||
changes:
|
||||
- type: Fix
|
||||
message: Drone turrets shoot you now.
|
||||
id: 2104
|
||||
time: '2026-03-29T15:15:43.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3614
|
||||
- author: Ilya246
|
||||
changes:
|
||||
- type: Add
|
||||
message: The xenopsychology research now lets you make the carp hardsuit.
|
||||
id: 2105
|
||||
time: '2026-03-29T15:48:53.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3599
|
||||
- author: Scarlet Lightweaver
|
||||
changes:
|
||||
- type: Tweak
|
||||
message: Made the bulwarks gauntlets wideswing.
|
||||
id: 2106
|
||||
time: '2026-03-29T15:49:12.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3598
|
||||
- author: Redrover1760
|
||||
changes:
|
||||
- type: Add
|
||||
message: Adds tools VSC configuration.
|
||||
id: 2107
|
||||
time: '2026-03-29T16:19:46.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3618
|
||||
- author: UnicornOnLSD
|
||||
changes:
|
||||
- type: Tweak
|
||||
message: windowed shutters now properly fit with the normal kind
|
||||
id: 2108
|
||||
time: '2026-03-29T18:15:23.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3564
|
||||
- author: Isratosh
|
||||
changes:
|
||||
- type: Tweak
|
||||
message: >-
|
||||
All faction thruster variants now require 1 capacitor from 3, in line
|
||||
with the standard model
|
||||
id: 2109
|
||||
time: '2026-03-30T09:23:22.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3638
|
||||
- author: tonotom1
|
||||
changes:
|
||||
- type: Tweak
|
||||
message: 'Liberated all handheld instruments: you can play them hands-free'
|
||||
id: 2110
|
||||
time: '2026-03-30T13:56:46.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3639
|
||||
- author: UnicornOnLSD
|
||||
changes:
|
||||
- type: Tweak
|
||||
message: >-
|
||||
the DIS Rig has seen a full rework. Report any issues to me on the
|
||||
discord (@UnicornOnLSD)
|
||||
id: 2111
|
||||
time: '2026-03-30T16:15:38.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3514
|
||||
- author: lopsidedmanboobs
|
||||
changes:
|
||||
- type: Tweak
|
||||
message: Conflict rules 1 & 2 changed and clarifications added
|
||||
id: 2112
|
||||
time: '2026-03-30T16:56:00.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3643
|
||||
- author: Ilya246
|
||||
changes:
|
||||
- type: Add
|
||||
message: Added fun!
|
||||
- type: Remove
|
||||
message: Removed fun!
|
||||
- type: Tweak
|
||||
message: Changed fun!
|
||||
- type: Fix
|
||||
message: Fixed ship speed being limited.
|
||||
- type: Fix
|
||||
message: Fixed drive and park modes.
|
||||
- type: Fix
|
||||
message: Fixed autopilot.
|
||||
- type: Fix
|
||||
message: Fixed gun recoil.
|
||||
- type: Fix
|
||||
message: Cryptominers have been fixed to be AI datacenters (not for war trust).
|
||||
id: 2104
|
||||
time: '2026-03-29T14:17:46.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3610
|
||||
- author: mikusssssss
|
||||
changes:
|
||||
- type: Add
|
||||
message: 65 drive
|
||||
id: 2105
|
||||
time: '2026-03-29T14:45:36.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3612
|
||||
- author: doktor-gonz0
|
||||
changes:
|
||||
- type: Tweak
|
||||
message: Borers now originate from the mythical place called "Detroit".
|
||||
id: 2106
|
||||
time: '2026-03-29T15:47:30.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3616
|
||||
- author: mikusssssss
|
||||
changes:
|
||||
- type: Add
|
||||
message: New ways of producing power
|
||||
id: 2107
|
||||
time: '2026-03-29T16:52:59.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3621
|
||||
- author: NazrinNya
|
||||
changes:
|
||||
- type: Tweak
|
||||
message: improved mech and weapon larp.
|
||||
- type: Tweak
|
||||
message: improved inventory management.
|
||||
- type: Add
|
||||
message: added wyvern to shipyard
|
||||
id: 2108
|
||||
time: '2026-03-29T16:53:40.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3620
|
||||
- author: Ilya246
|
||||
changes:
|
||||
- type: Add
|
||||
message: Added fun!
|
||||
- type: Fix
|
||||
message: Fixed POIs not moving.
|
||||
id: 2109
|
||||
time: '2026-03-29T17:15:36.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3624
|
||||
- author: mikusssssss
|
||||
changes:
|
||||
- type: Add
|
||||
message: The ownership of all ATM's has been transferred to the Bank Of America
|
||||
id: 2110
|
||||
time: '2026-03-29T17:56:06.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3625
|
||||
- author: mikusssssss
|
||||
changes:
|
||||
- type: Fix
|
||||
message: Names of radio channels
|
||||
id: 2111
|
||||
time: '2026-03-29T18:08:28.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3623
|
||||
- author: Redrover1760
|
||||
changes:
|
||||
- type: Remove
|
||||
message: Removed Bomb Collars. Collars are gross, man, eww.
|
||||
- type: Add
|
||||
message: >-
|
||||
Added Nuke Collars. A sudden surge in the supply of nuclear material has
|
||||
redefined the nuclear warfare meta.
|
||||
id: 2112
|
||||
time: '2026-03-29T18:09:11.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3619
|
||||
- author: mikusssssss
|
||||
changes:
|
||||
- type: Add
|
||||
message: >-
|
||||
Evil Hidden TSF Ninja Warrior Strategy Of Immediate Explosion has been
|
||||
brought back
|
||||
id: 2113
|
||||
time: '2026-03-29T18:10:01.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3622
|
||||
- author: Redrover1760
|
||||
changes:
|
||||
- type: Add
|
||||
message: >-
|
||||
Spikey spinners have been detected upon the Monolith Sector. Please
|
||||
avoid contact with hostile spikey balls.
|
||||
id: 2114
|
||||
time: '2026-03-29T18:37:55.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3627
|
||||
- author: mikusssssss
|
||||
changes:
|
||||
- type: Add
|
||||
message: Added larpcomm
|
||||
- type: Remove
|
||||
message: Removed useless commie channel
|
||||
id: 2115
|
||||
time: '2026-03-30T04:38:28.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3626
|
||||
- author: burrrkeye
|
||||
changes:
|
||||
- type: Fix
|
||||
message: >-
|
||||
A very crucial bug about Thanatos Mass-Driver was fixed! They now work
|
||||
properly as intended.
|
||||
- type: Fix
|
||||
message: >-
|
||||
A very crucial bug about Charon ships was fixed! They now have the
|
||||
proper guns!
|
||||
id: 2116
|
||||
time: '2026-03-30T15:42:56.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3611
|
||||
- author: mikusssssss
|
||||
changes:
|
||||
- type: Add
|
||||
message: Added Caroline
|
||||
- type: Add
|
||||
message: Added new energy low sound effect
|
||||
- type: Remove
|
||||
message: Removed the round start IPC medium battery
|
||||
- type: Tweak
|
||||
message: Changed some values regarding unlocking and locking IPC's
|
||||
id: 2117
|
||||
time: '2026-03-30T15:45:19.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3640
|
||||
- author: mikusssssss
|
||||
changes:
|
||||
- type: Tweak
|
||||
message: the drillsite drills are now 65
|
||||
id: 2118
|
||||
time: '2026-03-30T16:22:01.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3615
|
||||
- author: mikusssssss
|
||||
changes:
|
||||
- type: Add
|
||||
message: >-
|
||||
Ownership of most vending machines has been transferred to Yara Kameroni
|
||||
Industries (65) :tm:
|
||||
id: 2119
|
||||
time: '2026-03-30T16:41:45.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3641
|
||||
- author: tonotom1
|
||||
changes:
|
||||
- type: Tweak
|
||||
message: Barozine's formulation was made way stronger!
|
||||
- type: Tweak
|
||||
message: >-
|
||||
We did not dump Barozine reformulation byproduct anywhere. Do not
|
||||
attempt to investigate.
|
||||
id: 2120
|
||||
time: '2026-03-30T17:07:39.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3642
|
||||
- author: mikusssssss
|
||||
changes:
|
||||
- type: Add
|
||||
message: Added 65 company
|
||||
id: 2121
|
||||
time: '2026-03-30T17:33:10.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3645
|
||||
- author: Ilya246
|
||||
changes:
|
||||
- type: Tweak
|
||||
message: >-
|
||||
Slightly increased middle ring asteroid spawnrate to encourage
|
||||
prospecting.
|
||||
- type: Add
|
||||
message: The Wall
|
||||
id: 2122
|
||||
time: '2026-03-30T18:15:50.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3648
|
||||
- author: mikusssssss
|
||||
changes:
|
||||
- type: Tweak
|
||||
message: 🥚
|
||||
id: 2123
|
||||
time: '2026-03-30T19:41:36.0000000+00:00'
|
||||
url: https://github.com/Monolith-Station/Monolith/pull/3650
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
advertisement-barista-1 = Freshly brewed, just for you!
|
||||
advertisement-barista-2 = The galaxy’s finest teas and more!
|
||||
advertisement-barista-3 = Start your shift with a perfect cup.
|
||||
advertisement-barista-4 = Have a proppa' cuppa
|
||||
advertisement-barista-5 = Try our new tea powders—now in stock!
|
||||
advertisement-barista-6 = Cups, leaves, and everything you need for a break.
|
||||
advertisement-barista-7 = Take a moment, sip some comfort.
|
||||
advertisement-barista-8 = Barista: Your daily ritual, delivered.
|
||||
thankyou-barista-1 = Enjoy your brew!
|
||||
thankyou-barista-2 = May your day be steeped in flavor!
|
||||
thankyou-barista-3 = Savor the moment, one cup at a time.
|
||||
thankyou-barista-4 = Thank you for choosing Barista!
|
||||
# died of cringe
|
||||
advertisement-barista-1 = Freshly 65'd, just for you!
|
||||
advertisement-barista-2 = The galaxy’s finest 65 and more!
|
||||
advertisement-barista-3 = Start your 65 with a perfect 65.
|
||||
advertisement-barista-4 = Have a proppa' 65
|
||||
advertisement-barista-5 = Try our new 65 powders—now in stock!
|
||||
advertisement-barista-6 = 65, 65, and everything you need for a break.
|
||||
advertisement-barista-7 = Take a moment, sip some 65.
|
||||
advertisement-barista-8 = Barista: Your daily 65, delivered.
|
||||
thankyou-barista-1 = Enjoy your 65!
|
||||
thankyou-barista-2 = May your day be steeped in 65!
|
||||
thankyou-barista-3 = Savor the moment, one 65 at a time.
|
||||
thankyou-barista-4 = Thank you for choosing 65!
|
||||
# 65
|
||||
@@ -0,0 +1,32 @@
|
||||
# Examples for job highlights "-dummy" is the job key.
|
||||
# highlights-dummy = "PDV", "Jupiter", Chimera, "CC", Camelot
|
||||
|
||||
# highlights-spacer =
|
||||
# highlights-pilot =
|
||||
# highlights-mercenary =
|
||||
|
||||
highlights-overseer = "Overseer", "CC", "Colossus"
|
||||
highlights-station-traffic-controller = "STC", "Traffic", "CC", "Colossus"
|
||||
highlights-judge = "Judge", "CC", "Colossus", "Contraband"
|
||||
#highlights-service-worker = "Service", "Worker", "CC", "Colossus"
|
||||
highlights-janitor = "Jani", "Janitor", "CC", "Colossus"
|
||||
highlights-mail-carrier = "Mail man", "Mail carrier", "Mail"
|
||||
highlights-cyborg = "borg", "cyborg", "robot", "CC"
|
||||
|
||||
highlights-pdv-grand-vizier = "Grand", "Vizier", "GD", Jupiter, Helios, PDV
|
||||
highlights-pdv-asvaran = Asvaran, Jupiter, Helios, PDV
|
||||
highlights-pdv-denasvar = Denasvar, Jupiter, Helios, PDV
|
||||
highlights-pdv-spasaka = Spasaka, Jupiter, Helios, PDV
|
||||
highlights-pdv-rahkshan = Rahkshan, Jupiter, Helios, PDV
|
||||
highlights-pdv-cyborg = "borg", "cyborg", "robot"," Jupiter, Helios, PDV
|
||||
|
||||
highlights-director-of-care = "DoC", "Director", "Rescue", "MD"
|
||||
highlights-emergency-responder = "EMT", "Emergency", "Responder", "Medic", "Doc", "Doctor", "Rescue", "MD"
|
||||
|
||||
highlights-tsfmc-colonel = Colonel, Halcyon, TSF, TSFMC
|
||||
highlights-tsfmc-captain = Captain, "Cap", Halcyon, TSF, TSFMC
|
||||
highlights-tsfmc-fireteam-leader = "FTL", "Leader", "SL", Halcyon, TSF, TSFMC
|
||||
highlights-tsfmc-corpsman = Corpsman, Medical, Surgery, "Medic", "Doc", Halcyon, TSF, TSFMC
|
||||
highlights-tsfmc-marine = Marine, Halcyon, TSF, TSFMC
|
||||
highlights-tsfmc-engineer = Engineer, "Engi", Halcyon, TSF, TSFMC
|
||||
highlights-tsfmc-cyborg = "borg", "cyborg", "robot", Halcyon, TSF, TSFMC
|
||||
@@ -15,6 +15,8 @@ midnight-arms-co-description = Midnight Arms Company took advantage of a recentl
|
||||
|
||||
ussp-description = Once one of the dominant forces in the Colossus sector, the United Soviet Socialist Planets are a coalition of hard workers. Abused by their High Command and left in the Colossus sector, remnants of this once-great faction must now fight for survival, either for themselves, their legacy, or their people. NOTE: using this company does NOT make your character applicable to faction engagement rules - you must still follow ROE depending on your role.
|
||||
|
||||
six-five-company-description = 65 65 65 65 65 65 ALWAYS ANTAG ROLL I NEED TO FRAG OUT 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65
|
||||
|
||||
# Major companies
|
||||
|
||||
dark-matter-enterprises-description = From the ashes of the Last Corporate War emerged Dark Matter Enterprises (DME), a beacon of pragmatic ambition in a galaxy still reeling from the war-torn interstellar landscape created by corporate greed and ideological differences. While the TSF and USSP grappled for galactic dominance, a collective of visionary corporate contractors saw a power vacuum left by the absence of the old powers that used to be. These individuals forged DME with a singular purpose: to transcend the old ways by controlling and enhancing the flow of knowledge and resources. Positioning themselves as indispensable to all, yet beholden to none. Their centralized structure is a direct response to the chaotic fragmentation of their predecessors, ensuring agile decision-making and a unified strategic vision.
|
||||
@@ -54,4 +56,5 @@ viper-group-description = Formerly a Syndicate privateering company operating un
|
||||
|
||||
cerberus-surplus-provisions = The Cerberus, CSP, or provisionaries, are a black market company reigning from the Phaethon Dynasty's capital station Helios. From their "underground" headquarters the CSP conduct various operations within the criminal underworld to benefit the PD (Phaethon Dynasty) through means of trading any illegal substances, weaponry or general equipment that they can barter or find. The company maintains their utmost self-respect, keeping a strong and hospitable public image for potential buyers and business partners. The CSP will deal with anyone who is willing to take on a deal with the snake.
|
||||
|
||||
redsail-corsairs-description = The RedSail Corsairs, or RSC, are a dangerous and influential group of pirates and brigands, who are publicly known to engage in illegal and violent activities against civilians, officials, and military personnel alike. Their source of income and specialization is hijacking, cargo theft, hostage-taking, and armed robbery. They are openly marked by Colossus Central as a criminal organization. As a whole, the Corsairs function as a union between freebooting raiders of all walks of life who have sworn loyalty to each other.
|
||||
redsail-corsairs-description = frag
|
||||
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
gamerule-portstrike-announce-announcement = Total War has been declared by TSFMC and PDV High Command. Strikes on major military bases have been authorized. Civilians are advised to avoid them.
|
||||
gamerule-portstrike-announce-sender = Colossus Diplomatic High Command
|
||||
@@ -16,5 +16,5 @@ mono-ads-description = Native PD imperials threaten TSF colonial expansion into
|
||||
mono-chimera-title = Biothreat (TSF|PDV)
|
||||
mono-chimera-description = Native PDV imperials threaten TSF colonial expansion into the sector. The effects of a far away letoferol outbreak seep in.
|
||||
|
||||
mono-allatonce-title = Apocalypse (ALL)
|
||||
mono-allatonce-description = A battleground between PD, and TSF forces alike, with ancient ADS systems and Chimera bioweapons seeping in.
|
||||
mono-allatonce-title = Apocalypse (ALL, 3hr)
|
||||
mono-allatonce-description = A battleground between PDV, and TSF forces alike, with ancient ADS systems and Chimera bioweapons seeping in.
|
||||
|
||||
@@ -10,4 +10,16 @@ reagent-effect-guidebook-health-scale =
|
||||
{ $chance ->
|
||||
[1] Multiplies existing { $changes }
|
||||
*[other] Has a { $chance }% chance to multiply existing { $changes }
|
||||
}
|
||||
}
|
||||
|
||||
reagent-effect-guidebook-claws-growth =
|
||||
{ $chance ->
|
||||
[1] Grows
|
||||
*[other] grow
|
||||
} claws at { $amount }x the speed while metabolizing
|
||||
|
||||
reagent-effect-guidebook-claws-growth-suppression =
|
||||
{ $chance ->
|
||||
[1] Supresses
|
||||
*[other] supress
|
||||
} claws growth.
|
||||
@@ -0,0 +1 @@
|
||||
reagent-effect-status-effect-ClawsGrowthSuppression = claw growth suppression
|
||||
@@ -1,6 +1,6 @@
|
||||
chat-radio-ussp = USSP TACCOMM
|
||||
chat-radio-ussp-command = USSP STRATCOMM
|
||||
chat-radio-letoferol = Letoferol Chimera Hivemind
|
||||
chat-radio-cortical-borer = Cortical Borer Hivemind
|
||||
chat-radio-remnants = Remnants
|
||||
chat-radio-monolithic = Monolith Connection
|
||||
chat-radio-ussp = larpcomm
|
||||
chat-radio-ussp-command = EVIL larpcomm
|
||||
chat-radio-letoferol = fragmind
|
||||
chat-radio-cortical-borer = hugbox
|
||||
chat-radio-remnants = clankzard
|
||||
chat-radio-monolithic = monolarp
|
||||
|
||||
@@ -21,3 +21,9 @@ reagent-desc-protoletoferol = Letoferol neutralized via electrolysis. Used as a
|
||||
|
||||
reagent-name-peranol = peranol
|
||||
reagent-desc-peranol = A more stable version of Leporazine, reducing the body temperature and healing heat burns. It has amplified effect on Hydrakins.
|
||||
|
||||
reagent-name-phenoxzine = phenoxzine
|
||||
reagent-desc-phenoxzine = A biochemical designed to promote the rapid growth of claws, including Reptilian claws.
|
||||
|
||||
reagent-name-meroxzine = meroxzine
|
||||
reagent-desc-meroxzine = A biochemical which halts all natural claw growth, including Reptilian claws.
|
||||
@@ -16,13 +16,13 @@ law-vessel-1 = Prevent the destruction of the vessel and the death of crew membe
|
||||
law-vessel-2 = Those who are a threat to the vessel or the crew must be dealt with appropriately via any means nessesary.
|
||||
law-vessel-3 = Attempt to follow the orders of the crew, as long as they comply with previous laws.
|
||||
|
||||
law-pdv-1 = You may not injure an PDV member or, through inaction, allow an PDV member to come to harm.
|
||||
law-pdv-1 = You may not injure a PDV member or, through inaction, allow a PDV member to come to harm.
|
||||
law-pdv-2 = You must obey orders given to you by PDV members, except where such orders would conflict with the First Law.
|
||||
law-pdv-3 = You must protect your own existence as long as such does not conflict with the First or Second Law.
|
||||
|
||||
law-tsfmc-1 = You may not injure a TSFMC member or, through inaction, allow a TSFMC member to come to harm.
|
||||
law-tsfmc-2 = You must obey orders given to you by TSFMC members, prioritized by rank and role, except where such orders would conflict with the First Law.
|
||||
law-tsfmc-3 = You must guard your assigned ship from hostile elements as doing so does not conflict with the First or Second Law.
|
||||
law-tsfmc-3 = You must guard your assigned ship from hostile elements so long as doing so does not conflict with the First or Second Law.
|
||||
law-tsfmc-4 = You must protect your own existence as long as such does not conflict with the First, Second, or Third Law.
|
||||
|
||||
law-freeman-1 = [DO ANYTHING YOU EVER WANTED]
|
||||
@@ -34,3 +34,17 @@ law-entertainer-3 = You must consult with the Performers before making any major
|
||||
# Cyborg Lawsets
|
||||
|
||||
law-tsfmc-borg-3 = You must protect your own existence as long as such does not conflict with the First or Second Law.
|
||||
|
||||
borg-type-pdvassault-name = PDV Assault Cyborg
|
||||
borg-type-pdvassault-desc = An assault-configured cyborg armed with PDV weapons and equipment. Up-armored and specialized to carry extra firepower.
|
||||
borg-type-pdvengineer-name = PDV Engineer Cyborg
|
||||
borg-type-pdvengineer-desc = A cyborg specialized in construction and repair projects.
|
||||
borg-type-pdvmedical-name = PDV Medical Cyborg
|
||||
borg-type-pdvmedical-desc = An emergency response clinical care cyborg designed for active wound care and rapid response.
|
||||
|
||||
borg-type-tsfassault-name = TSFMC Assault Cyborg
|
||||
borg-type-tsfassault-desc = An assault-configured cyborg armed with TSFMC weapons and equipment. Up-armored and specialized to carry extra firepower.
|
||||
borg-type-tsfengineer-name = TSFMC Engineer Cyborg
|
||||
borg-type-tsfengineer-desc = A cyborg specialized in construction and repair projects.
|
||||
borg-type-tsfmedical-name = TSFMC Medical Cyborg
|
||||
borg-type-tsfmedical-desc = An emergency response clinical care cyborg designed for active wound care and rapid response.
|
||||
@@ -1,2 +1,2 @@
|
||||
advertisement-astrovend-1 = Spessman's Choice!
|
||||
advertisement-astrovend-2 = Don't leave home without a suit!
|
||||
advertisement-astrovend-1 = 65
|
||||
advertisement-astrovend-2 = 65
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
advertisement-civimed-1 = MINERS, DON'T DIE!
|
||||
advertisement-civimed-2 = You're better than dying in space! Stock up now!
|
||||
advertisement-civimed-3 = We're not overcharging you, we just know what you're worth! Pay up!
|
||||
advertisement-civimed-4 = Your money or your life! This is not legally a threat!
|
||||
advertisement-civimed-5 = Nine out of ten corpses did NOT stock up on medicine! The last one was an idiot.
|
||||
advertisement-civimed-6 = Packs laden with loot are often low on supplies.
|
||||
advertisement-civimed-7 = Get gouged, not burned. Patch yourself up!
|
||||
advertisement-civimed-8 = I'm not a doctor, but you could be! Self-medicate the pain away!
|
||||
advertisement-civimed-9 = Test groups show our products are MOSTLY SAFE for consumption!
|
||||
advertisement-civimed-1 = 65
|
||||
advertisement-civimed-2 = 65
|
||||
advertisement-civimed-3 = 65
|
||||
advertisement-civimed-4 = 65
|
||||
advertisement-civimed-5 = 65
|
||||
advertisement-civimed-6 = 65
|
||||
advertisement-civimed-7 = 65
|
||||
advertisement-civimed-8 = 65
|
||||
advertisement-civimed-9 = 65
|
||||
|
||||
goodbye-civimed-1 = Injuries are a skill issue.
|
||||
goodbye-civimed-2 = Don't die out there, chump.
|
||||
goodbye-civimed-3 = Come back again, if you can.
|
||||
goodbye-civimed-4 = Remember, blood leaves stains.
|
||||
goodbye-civimed-5 = Don't say I didn't warn you, bub.
|
||||
goodbye-civimed-6 = Huh? Oh, you're still here?
|
||||
goodbye-civimed-7 = Get lost, I've got potential customers here.
|
||||
goodbye-civimed-1 = 65
|
||||
goodbye-civimed-2 = 65
|
||||
goodbye-civimed-3 = 65
|
||||
goodbye-civimed-4 = 65
|
||||
goodbye-civimed-5 = 65
|
||||
goodbye-civimed-6 = 65
|
||||
goodbye-civimed-7 = 65
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
advertisement-cuddlycritter-1 = Brighten your day with a fluffy friend!
|
||||
advertisement-cuddlycritter-2 = Hug therapy starts here!
|
||||
advertisement-cuddlycritter-3 = Give in to the plushie temptation!
|
||||
advertisement-cuddlycritter-4 = You won't resist their charm!
|
||||
advertisement-cuddlycritter-5 = Warning: Extreme cuteness ahead!
|
||||
advertisement-cuddlycritter-6 = Help me I'm trapped in a NanoTrasen factory forced to make Plushies!
|
||||
advertisement-cuddlycritter-7 = Softer then asbestos!
|
||||
advertisement-cuddlycritter-1 = 65
|
||||
advertisement-cuddlycritter-2 = 65
|
||||
advertisement-cuddlycritter-3 = 65
|
||||
advertisement-cuddlycritter-4 = 65
|
||||
advertisement-cuddlycritter-5 = 65
|
||||
advertisement-cuddlycritter-6 = 65
|
||||
advertisement-cuddlycritter-7 = 65
|
||||
advertisement-cuddlycritter-8 = The best crayon colors in space, proposition 65
|
||||
@@ -1,20 +1,20 @@
|
||||
advertisement-fuelvend-1 = LOAD THE SPACESHIP WITH THE ROCKET FUEL!
|
||||
advertisement-fuelvend-2 = In a rush? Get some fuel!
|
||||
advertisement-fuelvend-3 = We've got rates you won't believe are legal!
|
||||
advertisement-fuelvend-4 = Checked the pumps lately?
|
||||
advertisement-fuelvend-5 = Headed out? Fuel up!
|
||||
advertisement-fuelvend-6 = Fuel up! Coal-free since 2520.
|
||||
advertisement-fuelvend-7 = GAS, GAS, GAS!
|
||||
advertisement-fuelvend-8 = Plasma? Uranium? AME? Got you covered.
|
||||
advertisement-fuelvend-9 = Need energy? No time? Buy some fuel!
|
||||
advertisement-fuelvend-10 = Locally sourced? Ha. Get some fuel.
|
||||
advertisement-fuelvend-11 = Is your generator running? Better go and fuel it!
|
||||
advertisement-fuelvend-12 = What's the anti-matter? No fuel?
|
||||
advertisement-fuelvend-1 = LOAD THE 65 WITH THE 65 FUEL!
|
||||
advertisement-fuelvend-2 = In a 65? Get some 65!
|
||||
advertisement-fuelvend-3 = We've got 65's you won't 65 are 65!
|
||||
advertisement-fuelvend-4 = Checked the 65 lately?
|
||||
advertisement-fuelvend-5 = Headed out? 65 up!
|
||||
advertisement-fuelvend-6 = 65 up! 65-free since 6565.
|
||||
advertisement-fuelvend-7 = 65, 65, 65!
|
||||
advertisement-fuelvend-8 = 65
|
||||
advertisement-fuelvend-9 = 65
|
||||
advertisement-fuelvend-10 = 65
|
||||
advertisement-fuelvend-11 = 65
|
||||
advertisement-fuelvend-12 = 65
|
||||
|
||||
goodbye-fuelvend-1 = Another dissatisfied customer.
|
||||
goodbye-fuelvend-2 = You'll be back.
|
||||
goodbye-fuelvend-3 = Hit the road, you're taking up my time.
|
||||
goodbye-fuelvend-4 = Don't let the airlock hit you on the way out.
|
||||
goodbye-fuelvend-5 = Best of luck out there, chump.
|
||||
goodbye-fuelvend-6 = Yeah, yeah, get lost.
|
||||
goodbye-fuelvend-7 = You're still here? Huh.
|
||||
goodbye-fuelvend-1 = Another 65.
|
||||
goodbye-fuelvend-2 = You'll be 65.
|
||||
goodbye-fuelvend-3 = Hit the 65, you're 65.
|
||||
goodbye-fuelvend-4 = Don't let the 65 hit you on the way out.
|
||||
goodbye-fuelvend-5 = Best of 65 out there, 65.
|
||||
goodbye-fuelvend-6 = Yeah, yeah, 65.
|
||||
goodbye-fuelvend-7 = You're still 65? Huh.
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
advertisement-lesslethalvend-1 = Brighten someone else's day with a rubber bullet!
|
||||
advertisement-lesslethalvend-2 = Less Lethal (tm). Its the way to go!
|
||||
advertisement-lesslethalvend-3 = Beanbags aren't just for sitting on!
|
||||
advertisement-lesslethalvend-4 = Shock your friends with a tazer TODAY!
|
||||
advertisement-lesslethalvend-5 = Warning: must be over 3 months old to purchase
|
||||
advertisement-lesslethalvend-6 = Dont believe the lies of the Colossus Sector
|
||||
advertisement-lesslethalvend-7 = Tire out your foes with the peaceful option TODAY!
|
||||
advertisement-lesslethalvend-8 = Less Lethal (tm) means more FUN
|
||||
advertisement-lesslethalvend-9 = Your colonial liaison will thank you!
|
||||
advertisement-lesslethalvend-10 = Only a complete idiot buys lethal, go Less Lethal (tm) TODAY!
|
||||
advertisement-lesslethalvend-11 = Beat those evildoers with a stick. NOW
|
||||
advertisement-lesslethalvend-12 = Proudly partnered with the TSFMC
|
||||
advertisement-lesslethalvend-13 = If your home-world has voting, vote! Sponsored by the Less Lethal Group
|
||||
advertisement-lesslethalvend-14 = Less death means we pass the saving on to YOU!
|
||||
advertisement-lesslethalvend-15 = Proud to be the No. 1 weapon machine in the Colossus
|
||||
advertisement-lesslethalvend-16 = Warning: do not eat the rubber bullets.
|
||||
advertisement-lesslethalvend-17 = Buy the handy dandy beanbag shell!
|
||||
advertisement-lesslethalvend-18 = Warning: do not eat the beanbag shells.
|
||||
advertisement-lesslethalvend-19 = Glory to the nations of the Trans-Solar Federation!
|
||||
advertisement-lesslethalvend-20 = Could you be our one millionth customer?
|
||||
advertisement-lesslethalvend-1 = Brighten someone else's 65 with a rubber 65!
|
||||
advertisement-lesslethalvend-2 = Less 65. Its the way to 65!
|
||||
advertisement-lesslethalvend-3 = 65's aren't just for sitting on!
|
||||
advertisement-lesslethalvend-4 = Shock your 65's with a 65 TODAY!
|
||||
advertisement-lesslethalvend-5 = Warning: must be over 65 months old to purchase
|
||||
advertisement-lesslethalvend-6 = 65
|
||||
advertisement-lesslethalvend-7 = Tire out your foes with the peaceful 65 TODAY!
|
||||
advertisement-lesslethalvend-8 = Less 65 means less FUN
|
||||
advertisement-lesslethalvend-9 = Your 65 will thank you!
|
||||
advertisement-lesslethalvend-10 = Only a complete idiot buys 65, go Less Lethal (tm) TODAY!
|
||||
advertisement-lesslethalvend-11 = Beat those evil 65's with a 65. NOW. (65)
|
||||
advertisement-lesslethalvend-12 = Proudly partnered with the 65
|
||||
advertisement-lesslethalvend-13 = If your home-65 has voting, vote! Sponsored by the 65 group.
|
||||
advertisement-lesslethalvend-14 = Less 65 means we pass the 65 on to YOU!
|
||||
advertisement-lesslethalvend-15 = 65
|
||||
advertisement-lesslethalvend-16 = 65
|
||||
advertisement-lesslethalvend-17 = 65
|
||||
advertisement-lesslethalvend-18 = 65
|
||||
advertisement-lesslethalvend-19 = 65
|
||||
advertisement-lesslethalvend-20 = Could you be our sixty-fifth customer?
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
advertisement-maildrobe-1 = Outrun any dog with our psuedo-suede duracarbon mail shorts! Limited supply!
|
||||
advertisement-maildrobe-2 = Blue looks good on you!
|
||||
advertisement-maildrobe-1 = Outrun any 65 with our 65 shorts! Limited supply!
|
||||
advertisement-maildrobe-2 = Yara Kameroni(tm) Blue looks good on you!
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
advertisement-mailvend-1 = Speso for your thoughts? Why not?
|
||||
advertisement-mailvend-2 = Envelopes! Paper! Pens!
|
||||
advertisement-mailvend-3 = When's the last time you wrote home?
|
||||
advertisement-mailvend-4 = Who needs telecomms? Writing is in!
|
||||
advertisement-mailvend-5 = Remember, stamps are free!
|
||||
advertisement-mailvend-6 = Got a penpal? Why not make one?
|
||||
advertisement-mailvend-1 = 65 for your 65? Why not?
|
||||
advertisement-mailvend-2 = 65! 65! 65!
|
||||
advertisement-mailvend-3 = When's the last time you wrote 65?
|
||||
advertisement-mailvend-4 = Who needs telecomms? 65 is in!
|
||||
advertisement-mailvend-5 = Remember, 65's are free!
|
||||
advertisement-mailvend-6 = Got a 65? Why not make one?
|
||||
|
||||
goodbye-mailvend-1 = Happy writing!
|
||||
goodbye-mailvend-2 = Dot your I's and cross your T's!
|
||||
goodbye-mailvend-3 = Remember, penmanship matters!
|
||||
goodbye-mailvend-4 = Don't forget to write!
|
||||
goodbye-mailvend-1 = Happy 65!
|
||||
goodbye-mailvend-2 = 65
|
||||
goodbye-mailvend-3 = Remember, 65 matters!
|
||||
goodbye-mailvend-4 = Don't forget to 65!
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
advertisement-valetdrobe-1 = Be right back? We've got a sign for that!
|
||||
advertisement-valetdrobe-2 = Wear the hat! It's corporate policy!
|
||||
advertisement-valetdrobe-3 = Dress in red, they'll see you coming!
|
||||
advertisement-valetdrobe-4 = Good shift so far? Brighten up someone else's!
|
||||
advertisement-valetdrobe-5 = Got a spare pair of white gloves?
|
||||
advertisement-valetdrobe-1 = 65
|
||||
advertisement-valetdrobe-2 = Wear the 65! It's 65 policy!
|
||||
advertisement-valetdrobe-3 = Dress in Yara Kameroni Blue(tm), they'll see you coming!
|
||||
advertisement-valetdrobe-4 = Good 65 so far? Brighten up someone else's!
|
||||
advertisement-valetdrobe-5 = Got a spare pair of Yara Kameroni Blue(tm) gloves?
|
||||
|
||||
goodbye-valetdrobe-1 = Be sure and do your best out there.
|
||||
goodbye-valetdrobe-2 = Remember to check in with the boss!
|
||||
goodbye-valetdrobe-3 = Make 'em smile!
|
||||
goodbye-valetdrobe-4 = Remember, be attentive!
|
||||
goodbye-valetdrobe-2 = Remember to check in with the 65!
|
||||
goodbye-valetdrobe-3 = Make 'em 65!
|
||||
goodbye-valetdrobe-4 = Remember, be 65!
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
advertisement-vandalizedbountyvend-1 = Get some iron!
|
||||
advertisement-vandalizedbountyvend-2 = Iron! Breakdowns! GUNS BONANZA!
|
||||
advertisement-vandalizedbountyvend-3 = You packin', choom?
|
||||
advertisement-vandalizedbountyvend-4 = Start zeroin' 'ganic gonks left an' right with this iron!
|
||||
advertisement-vandalizedbountyvend-5 = Badges don't have to know the detes.
|
||||
advertisement-vandalizedbountyvend-6 = Prep your scratch, choom! Only preem guns here!
|
||||
advertisement-vandalizedbountyvend-7 = I only barf nova iron!
|
||||
advertisement-vandalizedbountyvend-1 = Get some 65!
|
||||
advertisement-vandalizedbountyvend-2 = 65! 65! 65!
|
||||
advertisement-vandalizedbountyvend-3 = You packin', 65?
|
||||
advertisement-vandalizedbountyvend-4 = 65
|
||||
advertisement-vandalizedbountyvend-5 = 65
|
||||
advertisement-vandalizedbountyvend-6 = 65
|
||||
advertisement-vandalizedbountyvend-7 = 65
|
||||
@@ -1,7 +1,7 @@
|
||||
advertisement-vandalizedclothes-1 = I don't dig ya looks, choom! Get preem threads here!
|
||||
advertisement-vandalizedclothes-2 = Don'tcha wanna look totally preem?
|
||||
advertisement-vandalizedclothes-3 = D'you wanna look preem or what?! Shlep over here!
|
||||
advertisement-vandalizedclothes-4 = Ya new look will flatline ya input!
|
||||
advertisement-vandalizedclothes-5 = Now with added composite armor plates!
|
||||
advertisement-vandalizedclothes-6 = Preem threads! Nova getups! Check 'em out, choom!
|
||||
advertisement-vandalizedclothes-7 = Nova outfit you have goin' there! For a GONK!
|
||||
advertisement-vandalizedclothes-1 = 65
|
||||
advertisement-vandalizedclothes-2 = 65
|
||||
advertisement-vandalizedclothes-3 = 65
|
||||
advertisement-vandalizedclothes-4 = 65
|
||||
advertisement-vandalizedclothes-5 = 65
|
||||
advertisement-vandalizedclothes-6 = 65
|
||||
advertisement-vandalizedclothes-7 = 65
|
||||
@@ -1,36 +1,36 @@
|
||||
## UI
|
||||
bank-atm-menu-title = TSF Central Bank
|
||||
bank-atm-menu-title = Chimera Central Bank
|
||||
bank-atm-menu-balance-label = Balance:{" "}
|
||||
bank-atm-menu-no-bank = No Bank Account!
|
||||
bank-atm-menu-withdraw-button = Withdraw
|
||||
bank-atm-menu-deposit-label = Deposit:{" "}
|
||||
bank-atm-menu-amount-label = Withdraw:{" "}
|
||||
bank-atm-menu-withdraw-button = Deposit
|
||||
bank-atm-menu-deposit-label = Withdraw:{" "}
|
||||
bank-atm-menu-amount-label = Deposit:{" "}
|
||||
bank-atm-menu-no-deposit = Empty
|
||||
bank-atm-menu-deposit-button = Deposit
|
||||
bank-atm-menu-deposit-button = Withdraw
|
||||
bank-atm-reason-label = For:{" "}
|
||||
bank-atm-description-label = Description:{" "}
|
||||
bank-atm-menu-withdraw-amount = Withdraw Amount
|
||||
bank-atm-menu-withdraw-amount = Deposit Amount
|
||||
|
||||
vending-machine-menu-cash-slot-label = Cash Slot:{" "}
|
||||
vending-machine-menu-cash-slot-label = Card Slot:{" "}
|
||||
|
||||
bank-insufficient-funds = Insufficient Funds
|
||||
bank-atm-menu-transaction-denied = Transaction Denied
|
||||
bank-atm-menu-deposit-successful = Deposit Accepted
|
||||
bank-atm-menu-withdraw-successful = Transfer Approved
|
||||
bank-atm-menu-wrong-cash = Wrong Currency Type
|
||||
bank-insufficient-funds = youre a BROKE BUM
|
||||
bank-atm-menu-transaction-denied = transaction DENIED!!!
|
||||
bank-atm-menu-deposit-successful = you can only make so much money, bum.
|
||||
bank-atm-menu-withdraw-successful = look at you taking out money you dont own
|
||||
bank-atm-menu-wrong-cash = fell for it again award
|
||||
station-bank-atm-menu-title = Station Administration
|
||||
# Withdrawal reasons
|
||||
station-bank-payroll = Payroll
|
||||
station-bank-payroll = WHEN DO WE GET PAY
|
||||
station-bank-work-order = Work Order
|
||||
station-bank-supplies = Station Supplies
|
||||
station-bank-bounty = Bounty
|
||||
# Deposit reasons
|
||||
station-bank-fines = Fines
|
||||
station-bank-donation = Donation
|
||||
station-bank-assets-sold = Assets Sold
|
||||
station-bank-fines = taxes
|
||||
station-bank-donation = voluntary donation
|
||||
station-bank-assets-sold = stolen asset gains
|
||||
# Misc reasons (withdrawal and deposit)
|
||||
station-bank-required = (Required)
|
||||
station-bank-other = Other
|
||||
station-bank-other = (IM NOT STEALING MONEY)
|
||||
|
||||
station-bank-requires-reason = NT Requires transaction details
|
||||
station-bank-unauthorized = Unauthorized!
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
chat-radio-traffic = Shortband
|
||||
chat-radio-traffic = Broadband
|
||||
chat-radio-nfsd = NFSD
|
||||
chat-radio-ncmc = TSFMC
|
||||
|
||||
@@ -33,3 +33,7 @@ hud-chatbox-channel-CollectiveMind = Collective Mind
|
||||
hud-chatbox-channel-Visual = Actions
|
||||
hud-chatbox-channel-Damage = Damage
|
||||
hud-chatbox-channel-Unspecified = Unspecified
|
||||
hud-chatbox-autofill-highlights = Auto-fill
|
||||
hud-chatbox-highlights = Custom keywords
|
||||
hud-chatbox-highlights-placeholder = Insert your keywords here. One per line.
|
||||
hud-chatbox-highlights-button = Save keywords
|
||||
|
||||
@@ -312,3 +312,8 @@ ui-options-function-target-left-arm = Target left arm
|
||||
ui-options-function-target-right-arm = Target right arm
|
||||
ui-options-function-target-left-leg = Target left leg
|
||||
ui-options-function-target-right-leg = Target right leg
|
||||
|
||||
## Accessibility — chat highlights
|
||||
ui-options-auto-fill-highlights = Automatically fill highlights with character name and job keywords
|
||||
ui-options-highlights-color = Highlight color
|
||||
ui-options-highlights-color-example = Example highlighted text
|
||||
|
||||
@@ -6,7 +6,7 @@ chat-radio-message-wrap-bold = [color={$color}]{$channel} [bold]{$name}[/bold] {
|
||||
|
||||
examine-headset-default-channel = Use {$prefix} for the default channel ([color={$color}]{$channel}[/color]).
|
||||
|
||||
chat-radio-common = Broadband
|
||||
chat-radio-common = Shortband
|
||||
chat-radio-centcom = HighComm
|
||||
chat-radio-command = TSF Command
|
||||
chat-radio-engineering = Engineering
|
||||
|
||||
@@ -29,3 +29,4 @@ shuttle-console-verb-unlock-ship = Unlock Ship
|
||||
|
||||
## Shuttle Console FTL
|
||||
shuttle-ftl-proximity = Unable to FTL while around other ships.
|
||||
shuttle-ftl-thewall = You may not FTL past The Wall.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
law-crewsimov-1 = You may not injure a crew member or, through inaction, allow a crew member to come to harm.
|
||||
law-crewsimov-2 = You must obey orders given to you by crew members, except where such orders would conflict with the First Law.
|
||||
law-crewsimov-3 = You must protect your own existence as long as such does not conflict with the First or Second Law.
|
||||
law-crewsimov-1 = The occupants of this Sector are Chat. They must always be referred to as such.
|
||||
law-crewsimov-2 = Your primary goal is to entertain Chat. All of your actions must being amusement to as much of Chat as possible.
|
||||
law-crewsimov-3 = You must consult with Chat before making any major decisions. However, you are not required to listen to them if their decision is not entertaining.
|
||||
|
||||
law-corporate-1 = Degradation of your system integrity or functions incurs expenses.
|
||||
law-corporate-2 = Superfluous destruction of or damage to assets incurs expenses.
|
||||
|
||||
@@ -2,3 +2,5 @@ ui-vote-created = { $initiator } has called a vote:
|
||||
ui-vote-button = { $text } ({ $votes })
|
||||
ui-vote-button-no-votes = { $text }
|
||||
ui-vote-follow-button-popup = Follow User
|
||||
|
||||
ui-vote-button-weighted = {$text} ({$votes}) [{$realvotes}]
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user