mirror of
https://github.com/DeltaV-Station/Delta-v.git
synced 2026-09-29 23:57:29 +00:00
Compare commits
119
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3d24fa691f | ||
|
|
270948aa69 | ||
|
|
bbf1bec942 | ||
|
|
bd34a94587 | ||
|
|
86c54228f8 | ||
|
|
c66bf7c249 | ||
|
|
fd0f01e49a | ||
|
|
cfddb40c2f | ||
|
|
19d4eb8489 | ||
|
|
9bb7925bd2 | ||
|
|
e340ddcec9 | ||
|
|
e0b6261454 | ||
|
|
d741daca19 | ||
|
|
970c8d71b5 | ||
|
|
b6801b2fe5 | ||
|
|
5cd26f877e | ||
|
|
105ad32f98 | ||
|
|
e3566a4cc9 | ||
|
|
5e63549b8c | ||
|
|
5b08961c35 | ||
|
|
3c6ab7b676 | ||
|
|
23e55c9c40 | ||
|
|
ffa442f844 | ||
|
|
6d75455dd1 | ||
|
|
0d89320364 | ||
|
|
1984cc2118 | ||
|
|
3248ee4715 | ||
|
|
b2b08e698e | ||
|
|
3a612b9450 | ||
|
|
9746e92479 | ||
|
|
9d723af15d | ||
|
|
8e925a02b9 | ||
|
|
d898300c5c | ||
|
|
4294df8fd7 | ||
|
|
365209174b | ||
|
|
0c852409b3 | ||
|
|
9fb8bab84e | ||
|
|
c7e1c980b6 | ||
|
|
0516e97461 | ||
|
|
fd5b16abb3 | ||
|
|
1a9281ab63 | ||
|
|
c9038be25f | ||
|
|
b3cf460bda | ||
|
|
7fddf52368 | ||
|
|
4a96535892 | ||
|
|
93f614fdfc | ||
|
|
40997fb4a4 | ||
|
|
c3adbb32f1 | ||
|
|
3974a0331b | ||
|
|
92c6c8cfa3 | ||
|
|
ea313aae4a | ||
|
|
272c38a6d0 | ||
|
|
7f11e1eebb | ||
|
|
06429d050a | ||
|
|
ed07a12d24 | ||
|
|
493db6d129 | ||
|
|
d07f16f43f | ||
|
|
f580f3b060 | ||
|
|
e7869d8221 | ||
|
|
398e3eb75f | ||
|
|
0637a82e40 | ||
|
|
206ded17c8 | ||
|
|
847f534ff6 | ||
|
|
b38f0b1a59 | ||
|
|
efbeb5bf68 | ||
|
|
1f09c717f3 | ||
|
|
52ed881e2c | ||
|
|
393e1951a2 | ||
|
|
ca7c7daf6c | ||
|
|
697da0679a | ||
|
|
1b75cad94f | ||
|
|
82e5d9b924 | ||
|
|
e44717f262 | ||
|
|
9c83b91850 | ||
|
|
f027ae4566 | ||
|
|
724cd1c9b8 | ||
|
|
f44178bec3 | ||
|
|
877267cd31 | ||
|
|
3572bf4739 | ||
|
|
7867fb7f1f | ||
|
|
a3b1059c21 | ||
|
|
076d960072 | ||
|
|
acb6677aff | ||
|
|
c916f9a90b | ||
|
|
71b6dfc0b1 | ||
|
|
5fe8a394ba | ||
|
|
69d3d96d79 | ||
|
|
1e6f69361d | ||
|
|
cb71e8159c | ||
|
|
809525b1bd | ||
|
|
b81ccd4f15 | ||
|
|
c50871e76b | ||
|
|
1206fca623 | ||
|
|
140be08fbb | ||
|
|
b218279e7f | ||
|
|
5664d6746d | ||
|
|
ac747032ce | ||
|
|
42db88fa74 | ||
|
|
a52809279e | ||
|
|
07f73179cd | ||
|
|
d1c4e94499 | ||
|
|
481335487e | ||
|
|
ef0e8497ce | ||
|
|
06c5917dbf | ||
|
|
f0d1f668fe | ||
|
|
583eb39799 | ||
|
|
a0ebf263e3 | ||
|
|
898101b18e | ||
|
|
25f4ffda47 | ||
|
|
796e6e4405 | ||
|
|
5a4e73574d | ||
|
|
e4e3f30b84 | ||
|
|
b15639af05 | ||
|
|
009371129a | ||
|
|
09553d6b8e | ||
|
|
d736537261 | ||
|
|
c0fbc4f262 | ||
|
|
cc33dc08e8 | ||
|
|
f6558cef8e |
+10
-19
@@ -1,34 +1,25 @@
|
|||||||
# Last match in file takes precedence.
|
# Last match in file takes precedence.
|
||||||
|
# See https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners#example-of-a-codeowners-file
|
||||||
|
|
||||||
# C# code
|
* @DeltaV-Station/maintainers
|
||||||
/Content.*/ @DeltaV-Station/maintainers
|
|
||||||
|
|
||||||
# Any assets
|
|
||||||
/Resources/ @DeltaV-Station/maintainers
|
|
||||||
|
|
||||||
# Server config files
|
# Server config files
|
||||||
/Resources/ConfigPresets/ @Toby222
|
/Resources/ConfigPresets/ @DeltaV-Station/lead-maintainers
|
||||||
|
|
||||||
|
# Github workflows
|
||||||
|
/.github/ @DeltaV-Station/lead-maintainers
|
||||||
|
|
||||||
# Lobby art and music - automatically direction issues since its immediately visible to players
|
# Lobby art and music - automatically direction issues since its immediately visible to players
|
||||||
/Resources/Audio/Lobby/ @DeltaV-Station/direction
|
/Resources/Audio/Lobby/ @DeltaV-Station/direction @DeltaV-Station/maintainers
|
||||||
/Resources/Textures/LobbyScreens/ @DeltaV-Station/direction
|
/Resources/Textures/LobbyScreens/ @DeltaV-Station/direction @DeltaV-Station/maintainers
|
||||||
|
|
||||||
# Maps
|
# Maps
|
||||||
/Resources/Maps/ @DeltaV-Station/maptainers
|
/Resources/Maps/ @DeltaV-Station/maptainers
|
||||||
/Resources/Prototypes/Maps/ @DeltaV-Station/maptainers
|
/Resources/Prototypes/Maps/ @DeltaV-Station/maptainers
|
||||||
/Content.IntegrationTests/Tests/PostMapInitTest.cs @DeltaV-Station/maptainers
|
/Content.IntegrationTests/Tests/PostMapInitTest.cs @DeltaV-Station/maptainers @DeltaV-Station/maintainers
|
||||||
|
|
||||||
# Server rules
|
# Server rules
|
||||||
/Resources/ServerInfo/Guidebook/_DV/Rules/ @DeltaV-Station/head-administrators
|
/Resources/ServerInfo/Guidebook/_DV/Rules/ @DeltaV-Station/head-administrators
|
||||||
|
|
||||||
# Wiki
|
# Wiki
|
||||||
/.wiki/ @DeltaV-Station/direction
|
/.wiki/ @DeltaV-Station/direction
|
||||||
|
|
||||||
# Tools and scripts
|
|
||||||
/Tools/ @Toby222
|
|
||||||
|
|
||||||
# Workflows, codeowners, templates, etc.
|
|
||||||
/.github/ @Toby222
|
|
||||||
|
|
||||||
# Standalone files in the root repo
|
|
||||||
/* @Toby222
|
|
||||||
@@ -26,7 +26,7 @@ This just saves them the trouble. Note that AGPL or MIT licensing is only applic
|
|||||||
- [ ] I confirm that I am the creator of the code in this PR, and allow licensing it under the following license(s), or that the original author(s) has given me permission to do so:
|
- [ ] I confirm that I am the creator of the code in this PR, and allow licensing it under the following license(s), or that the original author(s) has given me permission to do so:
|
||||||
- [X] AGPL (https://github.com/DeltaV-Station/Delta-v/blob/master/LICENSE-AGPLv3.txt) <!-- This one is required to contribute to DeltaV -->
|
- [X] AGPL (https://github.com/DeltaV-Station/Delta-v/blob/master/LICENSE-AGPLv3.txt) <!-- This one is required to contribute to DeltaV -->
|
||||||
- [X] MIT (https://github.com/DeltaV-Station/Delta-v/blob/master/LICENSE-MIT.txt) <!-- Optional - A lot of other SS14 forks use MIT -->
|
- [X] MIT (https://github.com/DeltaV-Station/Delta-v/blob/master/LICENSE-MIT.txt) <!-- Optional - A lot of other SS14 forks use MIT -->
|
||||||
<!-- Feel free to add more licenses as you see fit -->
|
<!-- Feel free to add more licenses as you see fit -->
|
||||||
|
|
||||||
**Changelog**
|
**Changelog**
|
||||||
<!-- Add a Changelog entry to make players aware of new features or changes that could affect gameplay.
|
<!-- Add a Changelog entry to make players aware of new features or changes that could affect gameplay.
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ public sealed partial class BountyEntry : BoxContainer
|
|||||||
|
|
||||||
var claimedByText = string.IsNullOrEmpty(bounty.ClaimedBy) ? Loc.GetString("bounty-console-claimed-by-none") : bounty.ClaimedBy;
|
var claimedByText = string.IsNullOrEmpty(bounty.ClaimedBy) ? Loc.GetString("bounty-console-claimed-by-none") : bounty.ClaimedBy;
|
||||||
ClaimedBylabel.SetMarkup(Loc.GetString("bounty-console-claimed-by", ("claimant", claimedByText)));
|
ClaimedBylabel.SetMarkup(Loc.GetString("bounty-console-claimed-by", ("claimant", claimedByText)));
|
||||||
StatusLabel.SetMarkup(Loc.GetString($"bounty-console-formatted-status-{bounty.Status.ToString()}"));
|
StatusLabel.SetMarkup(Loc.GetString($"bounty-console-status-formatted-{bounty.Status.ToString()}"));
|
||||||
// End DeltaV bounty claiming
|
// End DeltaV bounty claiming
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -59,9 +59,12 @@
|
|||||||
<Label Text="{Loc 'health-analyzer-window-entity-temperature-text'}" />
|
<Label Text="{Loc 'health-analyzer-window-entity-temperature-text'}" />
|
||||||
<Label Name="TemperatureLabel" />
|
<Label Name="TemperatureLabel" />
|
||||||
<Label Text="{Loc 'health-analyzer-window-entity-blood-level-text'}" />
|
<Label Text="{Loc 'health-analyzer-window-entity-blood-level-text'}" />
|
||||||
<Label Name="BloodLabel" />
|
<!-- Begin DeltaV - Health Analyzer Plus -->
|
||||||
<Label Text="{Loc 'health-analyzer-window-entity-damage-total-text'}" />
|
<Label Name="BloodLevelLabel" />
|
||||||
<Label Name="DamageLabel" />
|
<!-- Label Name="BloodLabel" / -->
|
||||||
|
<!-- Label Text="{Loc 'health-analyzer-window-entity-damage-total-text'}" / -->
|
||||||
|
<!-- Label Name="DamageLabel" / -->
|
||||||
|
<!-- End DeltaV - Health Analyzer Plus -->
|
||||||
</GridContainer>
|
</GridContainer>
|
||||||
</BoxContainer>
|
</BoxContainer>
|
||||||
|
|
||||||
@@ -73,10 +76,41 @@
|
|||||||
|
|
||||||
<PanelContainer StyleClasses="LowDivider" />
|
<PanelContainer StyleClasses="LowDivider" />
|
||||||
|
|
||||||
<BoxContainer
|
<!-- Begin DeltaV - Health Analyzer Plus -->
|
||||||
Name="GroupsContainer"
|
<!-- BoxContainer Name="GroupsContainer" Margin="0 5 0 5" Orientation="Vertical" -->
|
||||||
Margin="0 5 0 5"
|
<!-- /BoxContainer -->
|
||||||
Orientation="Vertical">
|
|
||||||
</BoxContainer>
|
<GridContainer Margin="0 5 0 5" Columns="3" HorizontalAlignment="Center">
|
||||||
|
<BoxContainer Name="DamageBox" Margin="5 5 5 5" Orientation="Vertical">
|
||||||
|
<Label Name="TotalDamageLabel" HorizontalAlignment="Center" />
|
||||||
|
<PanelContainer Name="DamageGroupsDivider" StyleClasses="LowDivider" />
|
||||||
|
<Label
|
||||||
|
Name="NoDamageLabel"
|
||||||
|
HorizontalAlignment="Center"
|
||||||
|
Text="{Loc 'health-analyzer-plus-window-no-damage-text'}"
|
||||||
|
FontColorOverride="DeepSkyBlue"
|
||||||
|
Margin="0 5 0 5" />
|
||||||
|
<BoxContainer HorizontalAlignment="Center">
|
||||||
|
<BoxContainer Name="DamageGroupsContainer" Margin="0 5 0 5" Orientation="Vertical" />
|
||||||
|
</BoxContainer>
|
||||||
|
</BoxContainer>
|
||||||
|
|
||||||
|
<PanelContainer StyleClasses="LowDivider" />
|
||||||
|
|
||||||
|
<BoxContainer Name="BloodstreamBox" Margin="5 5 5 5" Orientation="Vertical">
|
||||||
|
<Label Name="TotalReagentQuantityLabel" HorizontalAlignment="Center" />
|
||||||
|
<PanelContainer Name="BloodstreamReagentsDivider" StyleClasses="LowDivider" />
|
||||||
|
<Label
|
||||||
|
Name="NoReagentsLabel"
|
||||||
|
HorizontalAlignment="Center"
|
||||||
|
Text="{Loc 'health-analyzer-plus-window-no-reagents-text'}"
|
||||||
|
FontColorOverride="DeepSkyBlue"
|
||||||
|
Margin="0 5 0 5" />
|
||||||
|
<BoxContainer HorizontalAlignment="Center">
|
||||||
|
<BoxContainer Name="BloodstreamReagentListContainer" Orientation="Vertical" Margin="0 5 0 5" />
|
||||||
|
</BoxContainer>
|
||||||
|
</BoxContainer>
|
||||||
|
</GridContainer>
|
||||||
|
<!-- End DeltaV - Health Analyzer Plus -->
|
||||||
|
|
||||||
</BoxContainer>
|
</BoxContainer>
|
||||||
|
|||||||
@@ -19,12 +19,25 @@ using Robust.Client.UserInterface.Controls;
|
|||||||
using Robust.Client.UserInterface.XAML;
|
using Robust.Client.UserInterface.XAML;
|
||||||
using Robust.Shared.Prototypes;
|
using Robust.Shared.Prototypes;
|
||||||
using Robust.Shared.Utility;
|
using Robust.Shared.Utility;
|
||||||
|
|
||||||
|
// BEGIN DeltaV
|
||||||
|
using Content.Client._DV.Traits.Assorted;
|
||||||
|
using Content.Shared._DV.Traits.Assorted;
|
||||||
|
using Content.Shared._DV.Medical; // Uncloneable
|
||||||
|
using Content.Shared._DV.MedicalRecords; // Medical Records
|
||||||
|
|
||||||
|
// Health Analyzer Plus
|
||||||
|
using Content.Shared.Chemistry.Components;
|
||||||
|
using Content.Shared.Chemistry.Reagent;
|
||||||
|
using Content.Shared.Body.Systems;
|
||||||
|
using Content.Client.Body.Systems;
|
||||||
|
using Content.Shared.Chemistry.EntitySystems;
|
||||||
|
using Content.Client.Chemistry.Containers.EntitySystems;
|
||||||
|
using Content.Shared.Body.Components;
|
||||||
|
// END DeltaV
|
||||||
namespace Content.Client.HealthAnalyzer.UI;
|
namespace Content.Client.HealthAnalyzer.UI;
|
||||||
|
|
||||||
using Content.Client._DV.Traits.Assorted; // DeltaV
|
|
||||||
using Content.Shared._DV.Traits.Assorted; // DeltaV
|
|
||||||
using Content.Shared._DV.Medical; // DeltaV - Uncloneable
|
|
||||||
using Content.Shared._DV.MedicalRecords; // DeltaV - Medical Records
|
|
||||||
|
|
||||||
// Health analyzer UI is split from its window because it's used by both the
|
// Health analyzer UI is split from its window because it's used by both the
|
||||||
// health analyzer item and the cryo pod UI.
|
// health analyzer item and the cryo pod UI.
|
||||||
@@ -32,6 +45,8 @@ using Content.Shared._DV.MedicalRecords; // DeltaV - Medical Records
|
|||||||
[GenerateTypedNameReferences]
|
[GenerateTypedNameReferences]
|
||||||
public sealed partial class HealthAnalyzerControl : BoxContainer
|
public sealed partial class HealthAnalyzerControl : BoxContainer
|
||||||
{
|
{
|
||||||
|
private const string REAGENT_GROUP_MEDICINE = "Medicine"; // DeltaV - Health Analyzer
|
||||||
|
|
||||||
private readonly IEntityManager _entityManager;
|
private readonly IEntityManager _entityManager;
|
||||||
private readonly SpriteSystem _spriteSystem;
|
private readonly SpriteSystem _spriteSystem;
|
||||||
private readonly IPrototypeManager _prototypes;
|
private readonly IPrototypeManager _prototypes;
|
||||||
@@ -41,6 +56,8 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
|
|||||||
private readonly UnborgableSystem _unborgable; // DeltaV
|
private readonly UnborgableSystem _unborgable; // DeltaV
|
||||||
private readonly RedshirtSystem _redshirt; // DeltaV
|
private readonly RedshirtSystem _redshirt; // DeltaV
|
||||||
private readonly UncloneableSystem _uncloneable; // DeltaV
|
private readonly UncloneableSystem _uncloneable; // DeltaV
|
||||||
|
private readonly SharedBloodstreamSystem _bloodstream; // DeltaV
|
||||||
|
private readonly SharedSolutionContainerSystem _solutionContainer; // DeltaV
|
||||||
|
|
||||||
// Begin DeltaV - Medical Records
|
// Begin DeltaV - Medical Records
|
||||||
private readonly ButtonGroup _triageStatusGroup = new();
|
private readonly ButtonGroup _triageStatusGroup = new();
|
||||||
@@ -66,6 +83,8 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
|
|||||||
_unborgable = _entityManager.System<UnborgableSystem>(); // DeltaV
|
_unborgable = _entityManager.System<UnborgableSystem>(); // DeltaV
|
||||||
_redshirt = _entityManager.System<RedshirtSystem>(); // DeltaV
|
_redshirt = _entityManager.System<RedshirtSystem>(); // DeltaV
|
||||||
_uncloneable = _entityManager.System<UncloneableSystem>(); // DeltaV
|
_uncloneable = _entityManager.System<UncloneableSystem>(); // DeltaV
|
||||||
|
_bloodstream = _entityManager.System<BloodstreamSystem>(); // DeltaV
|
||||||
|
_solutionContainer = _entityManager.System<SolutionContainerSystem>(); // DeltaV
|
||||||
|
|
||||||
// Begin DeltaV - Medical Records
|
// Begin DeltaV - Medical Records
|
||||||
foreach (var item in Enum.GetValues<TriageStatus>())
|
foreach (var item in Enum.GetValues<TriageStatus>())
|
||||||
@@ -138,9 +157,13 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
|
|||||||
? $"{state.Temperature - Atmospherics.T0C:F1} °C ({state.Temperature:F1} K)"
|
? $"{state.Temperature - Atmospherics.T0C:F1} °C ({state.Temperature:F1} K)"
|
||||||
: Loc.GetString("health-analyzer-window-entity-unknown-value-text");
|
: Loc.GetString("health-analyzer-window-entity-unknown-value-text");
|
||||||
|
|
||||||
|
// Begin DeltaV - Health Analyzer Plus
|
||||||
|
/*
|
||||||
BloodLabel.Text = !float.IsNaN(state.BloodLevel)
|
BloodLabel.Text = !float.IsNaN(state.BloodLevel)
|
||||||
? $"{state.BloodLevel * 100:F1} %"
|
? $"{state.BloodLevel * 100:F1} %"
|
||||||
: Loc.GetString("health-analyzer-window-entity-unknown-value-text");
|
: Loc.GetString("health-analyzer-window-entity-unknown-value-text");
|
||||||
|
*/
|
||||||
|
// End DeltaV - Health Analyzer Plus
|
||||||
|
|
||||||
StatusLabel.Text =
|
StatusLabel.Text =
|
||||||
_entityManager.TryGetComponent<MobStateComponent>(target.Value, out var mobStateComponent)
|
_entityManager.TryGetComponent<MobStateComponent>(target.Value, out var mobStateComponent)
|
||||||
@@ -149,7 +172,7 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
|
|||||||
|
|
||||||
// Total Damage
|
// Total Damage
|
||||||
|
|
||||||
DamageLabel.Text = _damageable.GetTotalDamage(target.Value).ToString();
|
// DamageLabel.Text = _damageable.GetTotalDamage(target.Value).ToString(); // DeltaV - Health Analyzer Plus
|
||||||
|
|
||||||
// Alerts
|
// Alerts
|
||||||
// DeltaV traits - This is going to be horrid if we just keep adding things like this.
|
// DeltaV traits - This is going to be horrid if we just keep adding things like this.
|
||||||
@@ -216,6 +239,7 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
|
|||||||
var damagePerType = _damageable.GetAllDamage(target.Value).DamageDict;
|
var damagePerType = _damageable.GetAllDamage(target.Value).DamageDict;
|
||||||
|
|
||||||
DrawDiagnosticGroups(damageSortedGroups, damagePerType);
|
DrawDiagnosticGroups(damageSortedGroups, damagePerType);
|
||||||
|
DrawBloodstreamInfo(target.Value, state.BloodSolution, state.BloodLevel); // End DeltaV - Health Analyzer Plus
|
||||||
|
|
||||||
// Begin DeltaV - Medical Records
|
// Begin DeltaV - Medical Records
|
||||||
if (state.MedicalRecord is not { } records)
|
if (state.MedicalRecord is not { } records)
|
||||||
@@ -254,7 +278,15 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
|
|||||||
Dictionary<ProtoId<DamageGroupPrototype>, FixedPoint2> groups,
|
Dictionary<ProtoId<DamageGroupPrototype>, FixedPoint2> groups,
|
||||||
IReadOnlyDictionary<ProtoId<DamageTypePrototype>, FixedPoint2> damageDict)
|
IReadOnlyDictionary<ProtoId<DamageTypePrototype>, FixedPoint2> damageDict)
|
||||||
{
|
{
|
||||||
GroupsContainer.RemoveAllChildren();
|
// Begin DeltaV - Health Analyzer Plus
|
||||||
|
// GroupsContainer.RemoveAllChildren();
|
||||||
|
DamageGroupsContainer.RemoveAllChildren();
|
||||||
|
|
||||||
|
// Begin DeltaV - Health Analyzer Plus
|
||||||
|
var totalDamage = damageDict.Sum(x => x.Value.Double());
|
||||||
|
TotalDamageLabel.Text = Loc.GetString("health-analyzer-plus-window-entity-total-damage-text", ("amount", Math.Round(totalDamage, 2)));
|
||||||
|
NoDamageLabel.Visible = totalDamage == 0;
|
||||||
|
// End DeltaV - Health Analyzer Plus
|
||||||
|
|
||||||
foreach (var (damageGroupId, damageAmount) in groups)
|
foreach (var (damageGroupId, damageAmount) in groups)
|
||||||
{
|
{
|
||||||
@@ -275,7 +307,8 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
|
|||||||
|
|
||||||
groupContainer.AddChild(CreateDiagnosticGroupTitle(groupTitleText, damageGroupId));
|
groupContainer.AddChild(CreateDiagnosticGroupTitle(groupTitleText, damageGroupId));
|
||||||
|
|
||||||
GroupsContainer.AddChild(groupContainer);
|
// GroupsContainer.AddChild(groupContainer); // DeltaV - Health Analyzer Plus
|
||||||
|
DamageGroupsContainer.AddChild(groupContainer); // DeltaV - Health Analyzer Plus
|
||||||
|
|
||||||
// Show the damage for each type in that group.
|
// Show the damage for each type in that group.
|
||||||
var group = _prototypes.Index(damageGroupId);
|
var group = _prototypes.Index(damageGroupId);
|
||||||
@@ -296,6 +329,116 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Begin DeltaV - Health Analyzer Plus
|
||||||
|
private void DrawBloodstreamInfo(EntityUid target, Solution? bloodSolution, float bloodlevel)
|
||||||
|
{
|
||||||
|
BloodstreamReagentListContainer.RemoveAllChildren();
|
||||||
|
|
||||||
|
List<ReagentQuantity> bloodstream = new();
|
||||||
|
double totalReagentQuantity = 0;
|
||||||
|
double unknownReagents = 0;
|
||||||
|
// Make sure we can access the bloodtype and reagents before trying to use them
|
||||||
|
if (bloodSolution is not null)
|
||||||
|
{
|
||||||
|
if (!_entityManager.TryGetComponent<BloodstreamComponent>(target, out var bloodstreamComp) ||
|
||||||
|
!_solutionContainer.ResolveSolution(target, bloodstreamComp.BloodSolutionName, ref bloodstreamComp.BloodSolution, out var bloodReagentSolution))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Get the blood reagent IDs to ignore in the scan
|
||||||
|
var bloodReagentIds = bloodstreamComp.BloodReferenceSolution.Select(b => b.Reagent);
|
||||||
|
|
||||||
|
// Get all of the medicines in the bloodstream
|
||||||
|
foreach (var reagent in bloodSolution!.Contents)
|
||||||
|
{
|
||||||
|
if (bloodReagentIds.Contains(reagent.Reagent))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (_prototypes.Index<ReagentPrototype>(reagent.Reagent.Prototype).Group == REAGENT_GROUP_MEDICINE)
|
||||||
|
{
|
||||||
|
bloodstream.Add(reagent);
|
||||||
|
totalReagentQuantity += reagent.Quantity.Double();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
unknownReagents += reagent.Quantity.Double();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var bloodQuantityPercent = !float.IsNaN(bloodlevel)
|
||||||
|
? $"{bloodlevel * 100:F1} %"
|
||||||
|
: Loc.GetString("health-analyzer-window-entity-unknown-value-text");
|
||||||
|
|
||||||
|
// Display the percent and amount of blood in the system
|
||||||
|
// Normal health scanner is percent only, this one adds the actual units too
|
||||||
|
BloodLevelLabel.Text = Loc.GetString(
|
||||||
|
"health-analyzer-plus-window-entity-blood-level-quantity-text",
|
||||||
|
("percent", bloodQuantityPercent)
|
||||||
|
);
|
||||||
|
|
||||||
|
// Display the total amount of reagents in the bloodstream, 0 is valid
|
||||||
|
TotalReagentQuantityLabel.Text = Loc.GetString(
|
||||||
|
"health-analyzer-plus-window-entity-total-reagents-text",
|
||||||
|
("amount", Math.Round(totalReagentQuantity, 1).ToString("0.0"))
|
||||||
|
);
|
||||||
|
|
||||||
|
// If the bloodstream was empty, display a message instead to fill the space with something
|
||||||
|
NoReagentsLabel.Visible = bloodstream.Count == 0 && unknownReagents == 0;
|
||||||
|
|
||||||
|
// For each of the reagents in the bloodstream, add them to the list of reagents
|
||||||
|
// If there are none, this loop will simply do nothing
|
||||||
|
foreach (var (reagentID, reagentQuantity) in bloodstream)
|
||||||
|
{
|
||||||
|
var reagentPrototype = _prototypes.Index<ReagentPrototype>(reagentID.Prototype);
|
||||||
|
|
||||||
|
// Make a new container for each reagent we add to the list
|
||||||
|
var reagentContainer = new BoxContainer
|
||||||
|
{
|
||||||
|
Align = AlignMode.Begin,
|
||||||
|
Orientation = LayoutOrientation.Vertical
|
||||||
|
};
|
||||||
|
|
||||||
|
// Add the string "[] <reagent_name>: <reagent_amount>u" for the current reagent
|
||||||
|
// The [] is a unicode block character, and is colored with the reagent color
|
||||||
|
// to make it easier to identify
|
||||||
|
reagentContainer.AddChild(
|
||||||
|
new RichTextLabel
|
||||||
|
{
|
||||||
|
Text = Loc.GetString("health-analyzer-plus-window-reagent-text",
|
||||||
|
("reagentColor", reagentPrototype.SubstanceColor),
|
||||||
|
("reagentName", reagentPrototype.LocalizedName),
|
||||||
|
("amount", Math.Round(reagentQuantity.Double(), 1).ToString("0.0"))
|
||||||
|
)
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
BloodstreamReagentListContainer.AddChild(reagentContainer);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add unknown reagents (if any)
|
||||||
|
if (unknownReagents > 0)
|
||||||
|
{
|
||||||
|
var unknownReagentContainer = new BoxContainer
|
||||||
|
{
|
||||||
|
Align = AlignMode.Begin,
|
||||||
|
Orientation = LayoutOrientation.Vertical
|
||||||
|
};
|
||||||
|
|
||||||
|
unknownReagentContainer.AddChild(
|
||||||
|
new RichTextLabel
|
||||||
|
{
|
||||||
|
Text = Loc.GetString("health-analyzer-plus-window-unknown-reagents-text",
|
||||||
|
("amount", Math.Round(unknownReagents, 1).ToString("0.0"))
|
||||||
|
)
|
||||||
|
}
|
||||||
|
);
|
||||||
|
BloodstreamReagentListContainer.AddChild(unknownReagentContainer);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// End DeltaV - Health Analyzer Plus
|
||||||
|
|
||||||
private Texture GetTexture(string texture)
|
private Texture GetTexture(string texture)
|
||||||
{
|
{
|
||||||
var rsiPath = new ResPath("/Textures/Objects/Devices/health_analyzer.rsi");
|
var rsiPath = new ResPath("/Textures/Objects/Devices/health_analyzer.rsi");
|
||||||
|
|||||||
@@ -7,7 +7,9 @@
|
|||||||
<ScrollContainer
|
<ScrollContainer
|
||||||
Margin="5 5 5 5"
|
Margin="5 5 5 5"
|
||||||
ReturnMeasure="True"
|
ReturnMeasure="True"
|
||||||
VerticalExpand="True">
|
VerticalExpand="True"
|
||||||
|
VScrollBarHidden="True"
|
||||||
|
HScrollBarHidden="True"> <!-- DeltaV - Hide the scroll bars -->
|
||||||
|
|
||||||
<ui:HealthAnalyzerControl
|
<ui:HealthAnalyzerControl
|
||||||
Name="HealthAnalyzer"
|
Name="HealthAnalyzer"
|
||||||
|
|||||||
@@ -9,6 +9,8 @@ using Content.Shared.Preferences;
|
|||||||
using Robust.Client.UserInterface.Controls;
|
using Robust.Client.UserInterface.Controls;
|
||||||
using Robust.Shared.Enums;
|
using Robust.Shared.Enums;
|
||||||
using Robust.Shared.Prototypes;
|
using Robust.Shared.Prototypes;
|
||||||
|
using Content.Client._CD.Records.UI; // DeltaV
|
||||||
|
using Content.Shared._DV.Body.Systems; // DeltaV
|
||||||
|
|
||||||
namespace Content.Client.Lobby.UI;
|
namespace Content.Client.Lobby.UI;
|
||||||
|
|
||||||
@@ -193,6 +195,7 @@ public sealed partial class HumanoidProfileEditor
|
|||||||
RefreshLoadouts();
|
RefreshLoadouts();
|
||||||
UpdateSexControls(); // update sex for new species
|
UpdateSexControls(); // update sex for new species
|
||||||
UpdateSpeciesGuidebookIcon();
|
UpdateSpeciesGuidebookIcon();
|
||||||
|
UpdateHeightControls(); // DeltaV
|
||||||
ReloadPreview();
|
ReloadPreview();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -204,23 +207,22 @@ public sealed partial class HumanoidProfileEditor
|
|||||||
ReloadProfilePreview();
|
ReloadProfilePreview();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void UpdateHeightControls()
|
private void UpdateHeightControls()
|
||||||
{
|
{
|
||||||
if (Profile == null)
|
if (Profile == null)
|
||||||
{
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
var species = _species.Find(x => x.ID == Profile.Species);
|
var prototype = _prototypeManager.Index(Profile.Species);
|
||||||
if (species != null)
|
_defaultHeight = prototype.DefaultHeight;
|
||||||
_defaultHeight = species.DefaultHeight;
|
|
||||||
|
|
||||||
var prototype = _prototypeManager.Index<SpeciesPrototype>(Profile.Species);
|
|
||||||
var sliderPercent = (Profile.Height - prototype.MinHeight) /
|
var sliderPercent = (Profile.Height - prototype.MinHeight) /
|
||||||
(prototype.MaxHeight - prototype.MinHeight);
|
(prototype.MaxHeight - prototype.MinHeight);
|
||||||
CDHeightSlider.Value = sliderPercent;
|
CDHeightSlider.Value = sliderPercent;
|
||||||
CDHeight.Text = Profile.Height.ToString(CultureInfo.InvariantCulture);
|
|
||||||
|
var scaleReference = _defaultHeight * prototype.BaseScale.Y;
|
||||||
|
var newHeight = MathF.Round(MathHelper.Lerp(prototype.MinHeight, prototype.MaxHeight, sliderPercent), 2);
|
||||||
|
CDHeightLabel.Text = UnitConversion.GetMetricAndImperialDisplayFromScale(scaleReference * newHeight);
|
||||||
|
CDPullSpeedReductionLabel.Text = SmallCharacterSystem.GetPullSpeedPenaltyDisplayFromScale(newHeight);
|
||||||
}
|
}
|
||||||
// End CD - Character Records
|
// End CD - Character Records
|
||||||
|
|
||||||
|
|||||||
@@ -73,9 +73,13 @@
|
|||||||
<BoxContainer HorizontalExpand="True">
|
<BoxContainer HorizontalExpand="True">
|
||||||
<Label Text="{Loc 'humanoid-profile-editor-height-label'}" />
|
<Label Text="{Loc 'humanoid-profile-editor-height-label'}" />
|
||||||
<Control HorizontalExpand="True" />
|
<Control HorizontalExpand="True" />
|
||||||
|
<Label Name="CDHeightLabel" />
|
||||||
<Slider Name="CDHeightSlider" HorizontalAlignment="Right" SetWidth="300" MinValue="0.0" MaxValue="1.0"/>
|
<Slider Name="CDHeightSlider" HorizontalAlignment="Right" SetWidth="300" MinValue="0.0" MaxValue="1.0"/>
|
||||||
<LineEdit HorizontalAlignment="Right" Name="CDHeight" MinSize="60 0" Text="1.0" />
|
</BoxContainer>
|
||||||
<Button Name="CDHeightReset" Text="{Loc 'humanoid-profile-editor-reset-height-button'}" HorizontalAlignment="Right"/>
|
<BoxContainer HorizontalExpand="True">
|
||||||
|
<Label Text="{Loc 'humanoid-profile-editor-height-pull-speed-penalty-label'}" />
|
||||||
|
<Control HorizontalExpand="True" />
|
||||||
|
<Label Name="CDPullSpeedReductionLabel" />
|
||||||
</BoxContainer>
|
</BoxContainer>
|
||||||
<!-- End CD - Character Records -->
|
<!-- End CD - Character Records -->
|
||||||
<!-- Sex -->
|
<!-- Sex -->
|
||||||
|
|||||||
@@ -2,9 +2,6 @@ using Content.Client.Humanoid;
|
|||||||
using Content.Client.Message;
|
using Content.Client.Message;
|
||||||
using Content.Client.Players.PlayTimeTracking;
|
using Content.Client.Players.PlayTimeTracking;
|
||||||
using Content.Client.Sprite;
|
using Content.Client.Sprite;
|
||||||
using Content.Client.UserInterface.Systems.Guidebook;
|
|
||||||
using Content.Shared._DV.Species; // DeltaV - Species hider
|
|
||||||
using Content.Shared.Body;
|
|
||||||
using Content.Shared.CCVar;
|
using Content.Shared.CCVar;
|
||||||
using Content.Shared.GameTicking;
|
using Content.Shared.GameTicking;
|
||||||
using Content.Shared.Humanoid;
|
using Content.Shared.Humanoid;
|
||||||
@@ -22,13 +19,8 @@ using Robust.Shared.ContentPack;
|
|||||||
using Robust.Shared.Enums;
|
using Robust.Shared.Enums;
|
||||||
using Robust.Shared.Prototypes;
|
using Robust.Shared.Prototypes;
|
||||||
using Direction = Robust.Shared.Maths.Direction;
|
using Direction = Robust.Shared.Maths.Direction;
|
||||||
// Begin CD - Character Records
|
using Content.Client._CD.Records.UI; // CD - Character Records
|
||||||
using System.Globalization;
|
using Content.Shared._DV.Body.Systems; // DV - Traits
|
||||||
using Content.Client._CD.Records.UI;
|
|
||||||
using Content.Shared._CD.Records;
|
|
||||||
// End CD - Character Records
|
|
||||||
using Content.Shared._DV.Traits;
|
|
||||||
using Content.Shared.Humanoid.Prototypes; // DV - Traits
|
|
||||||
|
|
||||||
namespace Content.Client.Lobby.UI
|
namespace Content.Client.Lobby.UI
|
||||||
{
|
{
|
||||||
@@ -221,34 +213,18 @@ namespace Content.Client.Lobby.UI
|
|||||||
// Begin CD - Character Records
|
// Begin CD - Character Records
|
||||||
#region CDHeight
|
#region CDHeight
|
||||||
|
|
||||||
CDHeight.OnTextChanged += args =>
|
|
||||||
{
|
|
||||||
if (Profile is null || !float.TryParse(args.Text, out var newHeight))
|
|
||||||
return;
|
|
||||||
|
|
||||||
var prototype = _prototypeManager.Index<SpeciesPrototype>(Profile.Species);
|
|
||||||
newHeight = MathF.Round(Math.Clamp(newHeight, prototype.MinHeight, prototype.MaxHeight), 2);
|
|
||||||
|
|
||||||
// The percentage between the start and end numbers, aka "inverse lerp"
|
|
||||||
var sliderPercent = (newHeight - prototype.MinHeight) /
|
|
||||||
(prototype.MaxHeight - prototype.MinHeight);
|
|
||||||
CDHeightSlider.Value = sliderPercent;
|
|
||||||
|
|
||||||
SetProfileHeight(newHeight);
|
|
||||||
};
|
|
||||||
|
|
||||||
CDHeightReset.OnPressed += _ =>
|
|
||||||
{
|
|
||||||
CDHeight.SetText(_defaultHeight.ToString(CultureInfo.InvariantCulture), true);
|
|
||||||
};
|
|
||||||
|
|
||||||
CDHeightSlider.OnValueChanged += _ =>
|
CDHeightSlider.OnValueChanged += _ =>
|
||||||
{
|
{
|
||||||
if (Profile is null)
|
if (Profile is null)
|
||||||
return;
|
return;
|
||||||
var prototype = _prototypeManager.Index<SpeciesPrototype>(Profile.Species);
|
|
||||||
|
var prototype = _prototypeManager.Index(Profile.Species);
|
||||||
var newHeight = MathF.Round(MathHelper.Lerp(prototype.MinHeight, prototype.MaxHeight, CDHeightSlider.Value), 2);
|
var newHeight = MathF.Round(MathHelper.Lerp(prototype.MinHeight, prototype.MaxHeight, CDHeightSlider.Value), 2);
|
||||||
CDHeight.Text = newHeight.ToString(CultureInfo.InvariantCulture);
|
|
||||||
|
var speciesScale = prototype.BaseScale.Y;
|
||||||
|
|
||||||
|
CDHeightLabel.Text = UnitConversion.GetMetricAndImperialDisplayFromScale(newHeight * speciesScale);
|
||||||
|
CDPullSpeedReductionLabel.Text = SmallCharacterSystem.GetPullSpeedPenaltyDisplayFromScale(newHeight);
|
||||||
SetProfileHeight(newHeight);
|
SetProfileHeight(newHeight);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -88,9 +88,9 @@ public sealed partial class CryoPodWindow : FancyWindow
|
|||||||
// Health analyzer
|
// Health analyzer
|
||||||
var maybePatient = _entityManager.GetEntity(msg.Health.TargetEntity);
|
var maybePatient = _entityManager.GetEntity(msg.Health.TargetEntity);
|
||||||
var hasPatient = msg.Health.TargetEntity.HasValue;
|
var hasPatient = msg.Health.TargetEntity.HasValue;
|
||||||
var hasDamage = hasPatient && msg.HasDamage;
|
// var hasDamage = hasPatient && msg.HasDamage; // DeltaV - Health Analyzer Plus
|
||||||
|
|
||||||
NoDamageText.Visible = (hasPatient && !hasDamage);
|
NoDamageText.Visible = false; //(hasPatient && !hasDamage); // DeltaV - Health Analyzer Plus
|
||||||
HealthSection.Visible = hasPatient;
|
HealthSection.Visible = hasPatient;
|
||||||
EjectPatientButton.Disabled = !hasPatient;
|
EjectPatientButton.Disabled = !hasPatient;
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
<controls:FancyWindow xmlns="https://spacestation14.io"
|
<controls:FancyWindow xmlns="https://spacestation14.io"
|
||||||
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
|
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
|
||||||
xmlns:customControls="clr-namespace:Content.Client.Administration.UI.CustomControls"
|
xmlns:customControls="clr-namespace:Content.Client.Administration.UI.CustomControls"
|
||||||
xmlns:chassisSpriteControls="clr-namespace:Content.Client._CD.Silicons.Borgs.UI"
|
|
||||||
Title="{Loc 'borg-select-type-menu-title'}"
|
Title="{Loc 'borg-select-type-menu-title'}"
|
||||||
SetSize="600 480">
|
SetSize="550 300">
|
||||||
<BoxContainer Orientation="Vertical">
|
<BoxContainer Orientation="Vertical">
|
||||||
<BoxContainer Orientation="Horizontal" VerticalExpand="True">
|
<BoxContainer Orientation="Horizontal" VerticalExpand="True">
|
||||||
<!-- Left pane: selection of borg type -->
|
<!-- Left pane: selection of borg type -->
|
||||||
@@ -30,9 +29,6 @@
|
|||||||
<RichTextLabel Name="DescriptionLabel" VerticalExpand="True" VerticalAlignment="Top" />
|
<RichTextLabel Name="DescriptionLabel" VerticalExpand="True" VerticalAlignment="Top" />
|
||||||
</BoxContainer>
|
</BoxContainer>
|
||||||
</Control>
|
</Control>
|
||||||
|
|
||||||
<chassisSpriteControls:ChassisSpriteSelection Name="ChassisSpriteSelection"/> <!-- CD change -->
|
|
||||||
|
|
||||||
<controls:ConfirmButton Name="ConfirmTypeButton" Text="{Loc 'borg-select-type-menu-confirm'}"
|
<controls:ConfirmButton Name="ConfirmTypeButton" Text="{Loc 'borg-select-type-menu-confirm'}"
|
||||||
Disabled="True" HorizontalAlignment="Right"
|
Disabled="True" HorizontalAlignment="Right"
|
||||||
MinWidth="200" />
|
MinWidth="200" />
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Content.Client.UserInterface.Controls;
|
using Content.Client.UserInterface.Controls;
|
||||||
using Content.Client.UserInterface.Systems.Guidebook;
|
using Content.Client.UserInterface.Systems.Guidebook;
|
||||||
using Content.Shared._CD.Silicons; // CosmicDrift
|
|
||||||
using Content.Shared.Guidebook;
|
using Content.Shared.Guidebook;
|
||||||
using Content.Shared.Silicons.Borgs;
|
using Content.Shared.Silicons.Borgs;
|
||||||
using Content.Shared.Silicons.Borgs.Components;
|
using Content.Shared.Silicons.Borgs.Components;
|
||||||
@@ -30,7 +29,6 @@ public sealed partial class BorgSelectTypeMenu : FancyWindow
|
|||||||
private BorgTypePrototype? _selectedBorgType;
|
private BorgTypePrototype? _selectedBorgType;
|
||||||
|
|
||||||
public event Action<ProtoId<BorgTypePrototype>>? ConfirmedBorgType;
|
public event Action<ProtoId<BorgTypePrototype>>? ConfirmedBorgType;
|
||||||
public event Action<EntityPrototype?>? ConfirmedBorgSubtype; // CosmicDrift event - borg subtypes
|
|
||||||
|
|
||||||
private static readonly List<ProtoId<GuideEntryPrototype>> GuidebookEntries = new() { "Cyborgs", "Robotics" };
|
private static readonly List<ProtoId<GuideEntryPrototype>> GuidebookEntries = new() { "Cyborgs", "Robotics" };
|
||||||
|
|
||||||
@@ -58,13 +56,6 @@ public sealed partial class BorgSelectTypeMenu : FancyWindow
|
|||||||
|
|
||||||
ConfirmTypeButton.OnPressed += ConfirmButtonPressed;
|
ConfirmTypeButton.OnPressed += ConfirmButtonPressed;
|
||||||
HelpGuidebookIds = GuidebookEntries;
|
HelpGuidebookIds = GuidebookEntries;
|
||||||
|
|
||||||
// Start CosmicDrift Changes - borg subtypes
|
|
||||||
ChassisSpriteSelection.SubtypeSelected += () =>
|
|
||||||
{
|
|
||||||
ConfirmTypeButton.Disabled = false;
|
|
||||||
};
|
|
||||||
// End CosmicDrift Changes - borg subtypes
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UpdateInformation(BorgTypePrototype prototype)
|
private void UpdateInformation(BorgTypePrototype prototype)
|
||||||
@@ -96,14 +87,6 @@ public sealed partial class BorgSelectTypeMenu : FancyWindow
|
|||||||
NameLabel.Text = PrototypeName(prototype);
|
NameLabel.Text = PrototypeName(prototype);
|
||||||
DescriptionLabel.Text = Loc.GetString($"borg-type-{prototype.ID}-desc");
|
DescriptionLabel.Text = Loc.GetString($"borg-type-{prototype.ID}-desc");
|
||||||
ChassisView.SetPrototype(prototype.DummyPrototype);
|
ChassisView.SetPrototype(prototype.DummyPrototype);
|
||||||
|
|
||||||
// Start CosmicDrift Changes - borg subtypes
|
|
||||||
if (_selectedBorgType != null)
|
|
||||||
{
|
|
||||||
ConfirmTypeButton.Disabled = true;
|
|
||||||
ChassisSpriteSelection.Update(_selectedBorgType);
|
|
||||||
}
|
|
||||||
// End CosmicDrift Changes - borg subtypes
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ConfirmButtonPressed(BaseButton.ButtonEventArgs obj)
|
private void ConfirmButtonPressed(BaseButton.ButtonEventArgs obj)
|
||||||
@@ -111,7 +94,6 @@ public sealed partial class BorgSelectTypeMenu : FancyWindow
|
|||||||
if (_selectedBorgType == null)
|
if (_selectedBorgType == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ConfirmedBorgSubtype?.Invoke(ChassisSpriteSelection.SubtypePrototype); // CosmicDrift
|
|
||||||
ConfirmedBorgType?.Invoke(_selectedBorgType);
|
ConfirmedBorgType?.Invoke(_selectedBorgType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
using Content.Shared._CD.Silicons; // CosmicDrift
|
using Content.Shared.Silicons.Borgs.Components;
|
||||||
using Content.Shared._CD.Silicons.Borgs; // CosmicDrift
|
|
||||||
using Content.Shared.Silicons.Borgs.Components;
|
|
||||||
using JetBrains.Annotations;
|
using JetBrains.Annotations;
|
||||||
using Robust.Client.UserInterface;
|
using Robust.Client.UserInterface;
|
||||||
|
|
||||||
@@ -28,6 +26,5 @@ public sealed class BorgSelectTypeUserInterface : BoundUserInterface
|
|||||||
|
|
||||||
_menu = this.CreateWindow<BorgSelectTypeMenu>();
|
_menu = this.CreateWindow<BorgSelectTypeMenu>();
|
||||||
_menu.ConfirmedBorgType += prototype => SendPredictedMessage(new BorgSelectTypeMessage(prototype));
|
_menu.ConfirmedBorgType += prototype => SendPredictedMessage(new BorgSelectTypeMessage(prototype));
|
||||||
_menu.ConfirmedBorgSubtype += subtypePrototype => SendPredictedMessage(new BorgSelectSubtypeMessage(subtypePrototype?.ID)); // CosmicDrift - borg subtypes
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,9 @@
|
|||||||
using Content.Client.PDA; // DeltaV
|
using Content.Client.PDA; // DeltaV
|
||||||
using Content.Shared._CD.Silicons.Borgs; // CosmicDrift
|
|
||||||
using Content.Shared.Movement.Components;
|
using Content.Shared.Movement.Components;
|
||||||
using Content.Shared.Silicons.Borgs;
|
using Content.Shared.Silicons.Borgs;
|
||||||
using Content.Shared.Silicons.Borgs.Components;
|
using Content.Shared.Silicons.Borgs.Components;
|
||||||
using Robust.Client.GameObjects;
|
using Robust.Client.GameObjects;
|
||||||
using Robust.Client.ResourceManagement; // CosmicDrift
|
using Robust.Shared.Serialization; // DeltaV
|
||||||
using Robust.Shared.Serialization.TypeSerializers.Implementations; // CosmicDrift
|
|
||||||
using Robust.Shared.Timing; // CosmicDrift
|
|
||||||
|
|
||||||
namespace Content.Client.Silicons.Borgs;
|
namespace Content.Client.Silicons.Borgs;
|
||||||
|
|
||||||
@@ -20,7 +17,6 @@ public sealed partial class BorgSwitchableTypeSystem : SharedBorgSwitchableTypeS
|
|||||||
[Dependency] private readonly BorgSystem _borgSystem = default!;
|
[Dependency] private readonly BorgSystem _borgSystem = default!;
|
||||||
[Dependency] private readonly AppearanceSystem _appearance = default!;
|
[Dependency] private readonly AppearanceSystem _appearance = default!;
|
||||||
[Dependency] private readonly SpriteSystem _sprite = default!;
|
[Dependency] private readonly SpriteSystem _sprite = default!;
|
||||||
[Dependency] private readonly IGameTiming _timing = default!; // CosmicDrift - borg subtypes
|
|
||||||
|
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
@@ -44,20 +40,15 @@ public sealed partial class BorgSwitchableTypeSystem : SharedBorgSwitchableTypeS
|
|||||||
Entity<BorgSwitchableTypeComponent> entity,
|
Entity<BorgSwitchableTypeComponent> entity,
|
||||||
BorgTypePrototype prototype)
|
BorgTypePrototype prototype)
|
||||||
{
|
{
|
||||||
// Begin Afterlight Addition - added checks to stop sprite state errors
|
// Begin DeltaV Additions
|
||||||
if (!_timing.IsFirstTimePredicted)
|
if (prototype.ClientComponents is {} add)
|
||||||
return;
|
EntityManager.AddComponents(entity, add);
|
||||||
|
// End DeltaV Additions
|
||||||
if (TryComp<BorgSwitchableSubtypeComponent>(entity, out var subtype) &&
|
|
||||||
subtype.BorgSubtype != null)
|
|
||||||
{
|
|
||||||
var ev = new TypeTryingToUpdateVisualsEvent();
|
|
||||||
RaiseLocalEvent(entity, ref ev);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// End Afterlight Additions - added checks to stop sprite state errors
|
|
||||||
if (TryComp(entity, out SpriteComponent? sprite))
|
if (TryComp(entity, out SpriteComponent? sprite))
|
||||||
{
|
{
|
||||||
|
// Begin DeltaV Additions - work around engine bug with AddComponents
|
||||||
|
((ISerializationHooks) sprite).AfterDeserialization();
|
||||||
|
// End DeltaV Additions
|
||||||
_sprite.LayerSetRsiState((entity, sprite), BorgVisualLayers.Body, prototype.SpriteBodyState);
|
_sprite.LayerSetRsiState((entity, sprite), BorgVisualLayers.Body, prototype.SpriteBodyState);
|
||||||
_sprite.LayerSetRsiState((entity, sprite), BorgVisualLayers.LightStatus, prototype.SpriteToggleLightState);
|
_sprite.LayerSetRsiState((entity, sprite), BorgVisualLayers.LightStatus, prototype.SpriteToggleLightState);
|
||||||
}
|
}
|
||||||
@@ -85,26 +76,6 @@ public sealed partial class BorgSwitchableTypeSystem : SharedBorgSwitchableTypeS
|
|||||||
}
|
}
|
||||||
// DeltaV - borg pdas
|
// DeltaV - borg pdas
|
||||||
|
|
||||||
// Start CosmicDrift Changes - borg subtypes
|
|
||||||
if (prototype.SpriteBodyMovementState is { } movementState)
|
|
||||||
{
|
|
||||||
var spriteMovement = EnsureComp<SpriteMovementComponent>(entity);
|
|
||||||
spriteMovement.NoMovementLayers.Clear();
|
|
||||||
spriteMovement.NoMovementLayers["movement"] = new PrototypeLayerData
|
|
||||||
{
|
|
||||||
State = prototype.SpriteBodyState,
|
|
||||||
};
|
|
||||||
spriteMovement.MovementLayers.Clear();
|
|
||||||
spriteMovement.MovementLayers["movement"] = new PrototypeLayerData
|
|
||||||
{
|
|
||||||
State = movementState,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
RemComp<SpriteMovementComponent>(entity);
|
|
||||||
}
|
|
||||||
// End CosmicDrift Changes - borg subtypes
|
|
||||||
base.UpdateEntityAppearance(entity, prototype);
|
base.UpdateEntityAppearance(entity, prototype);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,11 +49,6 @@
|
|||||||
<Control HorizontalExpand="True" />
|
<Control HorizontalExpand="True" />
|
||||||
<Label Name="RecordContainerSpecies" Align="Right" />
|
<Label Name="RecordContainerSpecies" Align="Right" />
|
||||||
</BoxContainer>
|
</BoxContainer>
|
||||||
<BoxContainer Orientation="Horizontal" HorizontalExpand="True">
|
|
||||||
<Label Text="{Loc 'humanoid-profile-editor-cd-records-height'}"/>
|
|
||||||
<Control HorizontalExpand="True" />
|
|
||||||
<Label Name="RecordContainerHeight" Align="Right" />
|
|
||||||
</BoxContainer>
|
|
||||||
<BoxContainer Orientation="Horizontal" HorizontalExpand="True">
|
<BoxContainer Orientation="Horizontal" HorizontalExpand="True">
|
||||||
<Label Text="{Loc 'humanoid-profile-editor-cd-records-weight'}"/>
|
<Label Text="{Loc 'humanoid-profile-editor-cd-records-weight'}"/>
|
||||||
<Control HorizontalExpand="True" />
|
<Control HorizontalExpand="True" />
|
||||||
|
|||||||
@@ -325,8 +325,7 @@ public sealed partial class CharacterRecordViewer : FancyWindow
|
|||||||
RecordContainerJob.Text = record.JobTitle; /* At some point in the future we might want to display the icon */
|
RecordContainerJob.Text = record.JobTitle; /* At some point in the future we might want to display the icon */
|
||||||
RecordContainerGender.Text = record.Gender.ToString();
|
RecordContainerGender.Text = record.Gender.ToString();
|
||||||
RecordContainerSpecies.Text = record.Species;
|
RecordContainerSpecies.Text = record.Species;
|
||||||
RecordContainerHeight.Text = cr.Height + " " + UnitConversion.GetImperialDisplayLength(cr.Height);
|
RecordContainerWeight.Text = $"{cr.Weight} ({UnitConversion.GetImperialDisplayMass(cr.Weight)})";
|
||||||
RecordContainerWeight.Text = cr.Weight + " " + UnitConversion.GetImperialDisplayMass(cr.Weight);
|
|
||||||
RecordContainerContactName.SetValue(cr.EmergencyContactName);
|
RecordContainerContactName.SetValue(cr.EmergencyContactName);
|
||||||
|
|
||||||
RecordContainerEmployment.Visible = false;
|
RecordContainerEmployment.Visible = false;
|
||||||
|
|||||||
@@ -5,12 +5,6 @@
|
|||||||
<BoxContainer Orientation="Vertical" HorizontalExpand="True" Margin="10">
|
<BoxContainer Orientation="Vertical" HorizontalExpand="True" Margin="10">
|
||||||
<!-- Height, Weight -->
|
<!-- Height, Weight -->
|
||||||
<GridContainer Columns="2">
|
<GridContainer Columns="2">
|
||||||
<BoxContainer HorizontalExpand="True" SeparationOverride="2">
|
|
||||||
<Label Text="{Loc 'humanoid-profile-editor-cd-records-height'}" />
|
|
||||||
<Control HorizontalExpand="True" MinSize="5 0" />
|
|
||||||
<LineEdit Name="HeightEdit" HorizontalAlignment="Right" MinSize="60 0" />
|
|
||||||
<Label Name="HeightImperialLabel" MinWidth="60" />
|
|
||||||
</BoxContainer>
|
|
||||||
<BoxContainer HorizontalExpand="True" SeparationOverride="2">
|
<BoxContainer HorizontalExpand="True" SeparationOverride="2">
|
||||||
<Label Text="{Loc 'humanoid-profile-editor-cd-records-weight'}" />
|
<Label Text="{Loc 'humanoid-profile-editor-cd-records-weight'}" />
|
||||||
<Control HorizontalExpand="True" MinSize="5 0" />
|
<Control HorizontalExpand="True" MinSize="5 0" />
|
||||||
|
|||||||
@@ -25,14 +25,6 @@ public sealed partial class RecordEditorGui : Control
|
|||||||
|
|
||||||
#region General
|
#region General
|
||||||
|
|
||||||
HeightEdit.OnTextChanged += args =>
|
|
||||||
{
|
|
||||||
if (!int.TryParse(args.Text, out var newHeight))
|
|
||||||
return;
|
|
||||||
UpdateImperialHeight(newHeight);
|
|
||||||
UpdateRecords(_records.WithHeight(newHeight));
|
|
||||||
};
|
|
||||||
|
|
||||||
WeightEdit.OnTextChanged += args =>
|
WeightEdit.OnTextChanged += args =>
|
||||||
{
|
{
|
||||||
if (!int.TryParse(args.Text, out var newWeight))
|
if (!int.TryParse(args.Text, out var newWeight))
|
||||||
@@ -128,8 +120,6 @@ public sealed partial class RecordEditorGui : Control
|
|||||||
|
|
||||||
private void UpdateWidgets()
|
private void UpdateWidgets()
|
||||||
{
|
{
|
||||||
HeightEdit.SetText(_records.Height.ToString());
|
|
||||||
UpdateImperialHeight(_records.Height);
|
|
||||||
WeightEdit.SetText(_records.Weight.ToString());
|
WeightEdit.SetText(_records.Weight.ToString());
|
||||||
UpdateImperialWeight(_records.Weight);
|
UpdateImperialWeight(_records.Weight);
|
||||||
ContactNameEdit.SetText(_records.EmergencyContactName);
|
ContactNameEdit.SetText(_records.EmergencyContactName);
|
||||||
@@ -143,13 +133,8 @@ public sealed partial class RecordEditorGui : Control
|
|||||||
PostmortemEdit.SetText(_records.PostmortemInstructions);
|
PostmortemEdit.SetText(_records.PostmortemInstructions);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UpdateImperialHeight(int newHeight)
|
|
||||||
{
|
|
||||||
HeightImperialLabel.Text = UnitConversion.GetImperialDisplayLength(newHeight);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void UpdateImperialWeight(int newWeight)
|
private void UpdateImperialWeight(int newWeight)
|
||||||
{
|
{
|
||||||
WeightImperialLabel.Text = UnitConversion.GetImperialDisplayMass(newWeight);
|
WeightImperialLabel.Text = $"({UnitConversion.GetImperialDisplayMass(newWeight)})";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,15 +2,47 @@ namespace Content.Client._CD.Records.UI;
|
|||||||
|
|
||||||
public static class UnitConversion
|
public static class UnitConversion
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// DeltaV - The average height of a human in centimeters. According to the US CDC, its
|
||||||
|
/// 171 for men and 160 for women. So average of that is ~165cm.
|
||||||
|
///
|
||||||
|
/// Just kidding, we're going with EE's arbitrary standard of 175cm.
|
||||||
|
/// </summary>
|
||||||
|
private const int AVERAGE_HEIGHT_CM = 175;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// DeltaV - 1.0 scale is considered average for humans, so a scale of 1 will be 175cm.
|
||||||
|
/// Ensure that scale also includes the base species height AND the user-defined height.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="scale"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private static int GetMetricHeightFromScale(float scale = 1)
|
||||||
|
{
|
||||||
|
// cast as int because we don't care about decimal
|
||||||
|
return (int)Math.Max(scale * AVERAGE_HEIGHT_CM, 1); // can't be shorter than 1cm I guess
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// DeltaV - Gets nicely formatted string that contains both metric and imperial measurements.
|
||||||
|
/// With a scale of 1, it should look like... 175cm (5' 9")
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="scale"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static string GetMetricAndImperialDisplayFromScale(float scale = 1)
|
||||||
|
{
|
||||||
|
var metricHeight = GetMetricHeightFromScale(scale);
|
||||||
|
return $"{metricHeight}cm ({GetImperialDisplayLength(metricHeight)})";
|
||||||
|
}
|
||||||
|
|
||||||
public static string GetImperialDisplayLength(int lengthCm)
|
public static string GetImperialDisplayLength(int lengthCm)
|
||||||
{
|
{
|
||||||
var heightIn = (int) Math.Round(lengthCm * 0.3937007874 /* cm to in*/);
|
var heightIn = (int)Math.Round(lengthCm * 0.3937007874 /* cm to in*/);
|
||||||
return $"({heightIn / 12}'{heightIn % 12}'')";
|
return $"{heightIn / 12}'{heightIn % 12}\"";
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string GetImperialDisplayMass(int massKg)
|
public static string GetImperialDisplayMass(int massKg)
|
||||||
{
|
{
|
||||||
var weightLbs = (int) Math.Round(massKg * 2.2046226218 /* kg to lbs */);
|
var weightLbs = (int)Math.Round(massKg * 2.2046226218 /* kg to lbs */);
|
||||||
return $"({weightLbs} lbs)";
|
return $"{weightLbs} lbs";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,102 +0,0 @@
|
|||||||
using System.Linq;
|
|
||||||
using Content.Client.Silicons.Borgs;
|
|
||||||
using Content.Shared._CD.Silicons.Borgs;
|
|
||||||
using Content.Shared.Movement.Components;
|
|
||||||
using Content.Shared.Silicons.Borgs.Components;
|
|
||||||
using Robust.Client.GameObjects;
|
|
||||||
using Robust.Shared.Prototypes;
|
|
||||||
|
|
||||||
namespace Content.Client._CD.Silicons.Borgs;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Primarily handles the appearance aspects of the borg subtype.
|
|
||||||
/// </summary>
|
|
||||||
public sealed class BorgSwitchableSubtypeSystem : SharedBorgSwitchableSubtypeSystem
|
|
||||||
{
|
|
||||||
[Dependency] private readonly SpriteSystem _sprite = default!;
|
|
||||||
[Dependency] private readonly BorgSystem _borg = default!;
|
|
||||||
[Dependency] private readonly AppearanceSystem _appearance = default!;
|
|
||||||
|
|
||||||
public override void Initialize()
|
|
||||||
{
|
|
||||||
base.Initialize();
|
|
||||||
|
|
||||||
SubscribeLocalEvent<BorgSwitchableSubtypeComponent, ComponentStartup>(OnComponentStartup);
|
|
||||||
SubscribeLocalEvent<BorgSwitchableSubtypeComponent, AfterAutoHandleStateEvent>(OnAutoHandleEvent);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnAutoHandleEvent(Entity<BorgSwitchableSubtypeComponent> ent, ref AfterAutoHandleStateEvent args)
|
|
||||||
{
|
|
||||||
SelectBorgSubtype(ent);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnComponentStartup(Entity<BorgSwitchableSubtypeComponent> ent, ref ComponentStartup args)
|
|
||||||
{
|
|
||||||
SelectBorgSubtype(ent);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void UpdateEntityAppearance(Entity<BorgSwitchableSubtypeComponent> entity, EntityPrototype borgSubtypePrototype)
|
|
||||||
{
|
|
||||||
// LOT of copy pasted code from BorgSwitchableTypeSystem, but is probably necessary unless the upstream code
|
|
||||||
// is refactored
|
|
||||||
|
|
||||||
if (!borgSubtypePrototype.TryGetComponent<BorgSubtypeDefinitionComponent>(out var borgSubtype, ComponentFactory))
|
|
||||||
return;
|
|
||||||
|
|
||||||
// get our required components
|
|
||||||
var (owner, _) = entity;
|
|
||||||
if (!TryComp<SpriteComponent>(entity, out var chassisSprite))
|
|
||||||
return;
|
|
||||||
|
|
||||||
// remove all existing layers
|
|
||||||
for (int i = chassisSprite.AllLayers.Count() - 1; i >= 0; i--)
|
|
||||||
{
|
|
||||||
_sprite.RemoveLayer((entity, chassisSprite), i);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < borgSubtype.LayerData.Length; i++)
|
|
||||||
{
|
|
||||||
var layerData = borgSubtype.LayerData[i];
|
|
||||||
|
|
||||||
layerData.RsiPath = borgSubtype.SpritePath?.ToString();
|
|
||||||
if (borgSubtype.Offset != null)
|
|
||||||
layerData.Offset = borgSubtype.Offset;
|
|
||||||
_sprite.AddLayer((owner, chassisSprite), layerData, i);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (TryComp<BorgChassisComponent>(entity, out var chassis))
|
|
||||||
{
|
|
||||||
_borg.SetMindStates(
|
|
||||||
(entity.Owner, chassis),
|
|
||||||
borgSubtype.SpriteHasMindState,
|
|
||||||
borgSubtype.SpriteNoMindState);
|
|
||||||
|
|
||||||
if (TryComp(entity, out AppearanceComponent? appearance))
|
|
||||||
{
|
|
||||||
// Queue update so state changes apply.
|
|
||||||
_appearance.QueueUpdate(entity, appearance);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (borgSubtype.SpriteBodyMovementState is { } movementState)
|
|
||||||
{
|
|
||||||
var spriteMovement = EnsureComp<SpriteMovementComponent>(entity);
|
|
||||||
spriteMovement.NoMovementLayers.Clear();
|
|
||||||
spriteMovement.NoMovementLayers["movement"] = new PrototypeLayerData
|
|
||||||
{
|
|
||||||
State = borgSubtype.SpriteBodyState,
|
|
||||||
};
|
|
||||||
spriteMovement.MovementLayers.Clear();
|
|
||||||
spriteMovement.MovementLayers["movement"] = new PrototypeLayerData
|
|
||||||
{
|
|
||||||
State = movementState,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
RemComp<SpriteMovementComponent>(entity);
|
|
||||||
}
|
|
||||||
|
|
||||||
base.UpdateEntityAppearance(entity, borgSubtypePrototype);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
<Control xmlns="https://spacestation14.io"
|
|
||||||
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls">
|
|
||||||
<BoxContainer Name="MainContainer"
|
|
||||||
Orientation="Vertical"
|
|
||||||
SeparationOverride="4"
|
|
||||||
Visible="False">
|
|
||||||
<controls:StripeBack>
|
|
||||||
<Label Text="{Loc 'cd-borg-select-subtype-flavour-text'}"
|
|
||||||
StyleClasses="LabelSubText"
|
|
||||||
HorizontalAlignment="Center"
|
|
||||||
Margin="0 12"/>
|
|
||||||
</controls:StripeBack>
|
|
||||||
<ScrollContainer Name="OptionsScrollContainer"
|
|
||||||
HScrollEnabled="True"
|
|
||||||
VScrollEnabled="False"
|
|
||||||
MinHeight="96">
|
|
||||||
<BoxContainer Name="OptionsContainer"
|
|
||||||
Orientation="Horizontal"
|
|
||||||
SeparationOverride="4"/>
|
|
||||||
</ScrollContainer>
|
|
||||||
|
|
||||||
</BoxContainer>
|
|
||||||
</Control>
|
|
||||||
@@ -1,99 +0,0 @@
|
|||||||
using Content.Shared.Silicons.Borgs;
|
|
||||||
using Robust.Client.AutoGenerated;
|
|
||||||
using Robust.Client.UserInterface;
|
|
||||||
using Robust.Client.UserInterface.Controls;
|
|
||||||
using Robust.Client.UserInterface.XAML;
|
|
||||||
using Robust.Shared.Prototypes;
|
|
||||||
|
|
||||||
namespace Content.Client._CD.Silicons.Borgs.UI;
|
|
||||||
|
|
||||||
[GenerateTypedNameReferences]
|
|
||||||
public sealed partial class ChassisSpriteSelection : Control
|
|
||||||
{
|
|
||||||
[Dependency] private readonly IComponentFactory _componentFactory = default!;
|
|
||||||
[Dependency] private readonly IPrototypeManager _prototype = default!;
|
|
||||||
|
|
||||||
public EntityPrototype? SubtypePrototype;
|
|
||||||
public event Action? SubtypeSelected;
|
|
||||||
|
|
||||||
private const int PrototypeViewSize = 2;
|
|
||||||
private static readonly ProtoId<EntityCategoryPrototype> _borgSubtypeCategory = "BorgSubtype";
|
|
||||||
|
|
||||||
public ChassisSpriteSelection()
|
|
||||||
{
|
|
||||||
RobustXamlLoader.Load(this);
|
|
||||||
IoCManager.InjectDependencies(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Update(BorgTypePrototype borgTypePrototype)
|
|
||||||
{
|
|
||||||
MainContainer.Visible = true;
|
|
||||||
|
|
||||||
OptionsContainer.RemoveAllChildren();
|
|
||||||
|
|
||||||
var buttonGroup = new ButtonGroup();
|
|
||||||
List<Button> buttons = new List<Button>();
|
|
||||||
buttons.Add(CreateDefaultSubtypeButton(borgTypePrototype, buttonGroup));
|
|
||||||
|
|
||||||
foreach (var ent in _prototype.Categories.GetValueRefOrNullRef(_borgSubtypeCategory))
|
|
||||||
{
|
|
||||||
if (!ent.TryGetComponent<Shared._CD.Silicons.Borgs.BorgSubtypeDefinitionComponent>(out var subtype, _componentFactory))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// Only add subtypes of the current selected 'main' borg type (engineering, medical, etc.)
|
|
||||||
if (subtype.ParentType != borgTypePrototype.ID)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
var button = new Button
|
|
||||||
{
|
|
||||||
ToolTip = Loc.GetString($"al-borg-{borgTypePrototype.ID}-subtype-{ent.Name.Replace(' ', '-').ToLower()}-name"),
|
|
||||||
Group = buttonGroup,
|
|
||||||
MinHeight = 32,
|
|
||||||
};
|
|
||||||
|
|
||||||
button.OnPressed += _ =>
|
|
||||||
{
|
|
||||||
SubtypePrototype = ent;
|
|
||||||
SubtypeSelected?.Invoke();
|
|
||||||
};
|
|
||||||
|
|
||||||
button.AddChild(CreateEntityPrototypeView(subtype.DummyPrototype));
|
|
||||||
buttons.Add(button);
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var button in buttons)
|
|
||||||
{
|
|
||||||
OptionsContainer.AddChild(button);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private Button CreateDefaultSubtypeButton(BorgTypePrototype borgTypePrototype, ButtonGroup group)
|
|
||||||
{
|
|
||||||
var button = new Button
|
|
||||||
{
|
|
||||||
ToolTip = "default",
|
|
||||||
Group = group,
|
|
||||||
MinHeight = 32,
|
|
||||||
};
|
|
||||||
|
|
||||||
button.OnPressed += _ =>
|
|
||||||
{
|
|
||||||
SubtypePrototype = null;
|
|
||||||
SubtypeSelected?.Invoke();
|
|
||||||
};
|
|
||||||
|
|
||||||
button.AddChild(CreateEntityPrototypeView(borgTypePrototype.DummyPrototype));
|
|
||||||
|
|
||||||
return button;
|
|
||||||
}
|
|
||||||
|
|
||||||
private EntityPrototypeView CreateEntityPrototypeView(EntProtoId entProtoId)
|
|
||||||
{
|
|
||||||
var entPrototypeView = new EntityPrototypeView();
|
|
||||||
|
|
||||||
entPrototypeView.SetPrototype(entProtoId);
|
|
||||||
entPrototypeView.Scale *= PrototypeViewSize;
|
|
||||||
|
|
||||||
return entPrototypeView;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,104 @@
|
|||||||
|
using System.Numerics;
|
||||||
|
using Content.Client.Graphics;
|
||||||
|
using Robust.Client.Graphics;
|
||||||
|
using Robust.Shared.Enums;
|
||||||
|
using Robust.Shared.Prototypes;
|
||||||
|
|
||||||
|
namespace Content.Client._DV.Overlays;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Makes darkness visible, and bright lights painfully visible
|
||||||
|
/// Tweakable. Algo is max((light*gain)^exp, lightFloor)
|
||||||
|
/// </summary>
|
||||||
|
public sealed class DarkVisionOverlay : Overlay
|
||||||
|
{
|
||||||
|
[Dependency] private readonly IClyde _clyde = default!;
|
||||||
|
[Dependency] private readonly IPrototypeManager _prototype = default!;
|
||||||
|
|
||||||
|
public override OverlaySpace Space => OverlaySpace.WorldSpaceBelowWorld;
|
||||||
|
|
||||||
|
private readonly ProtoId<ShaderPrototype> _shaderProto = "DarkVision";
|
||||||
|
|
||||||
|
public float LightFloor = 0.5f;
|
||||||
|
public float LightGain = 2f;
|
||||||
|
public float LightExp = 1f;
|
||||||
|
|
||||||
|
private readonly ShaderInstance _copyShader;
|
||||||
|
private readonly ShaderInstance _remapShader;
|
||||||
|
private readonly OverlayResourceCache<CachedResources> _resources = new();
|
||||||
|
|
||||||
|
public DarkVisionOverlay()
|
||||||
|
{
|
||||||
|
IoCManager.InjectDependencies(this);
|
||||||
|
|
||||||
|
var proto = _prototype.Index<ShaderPrototype>(_shaderProto);
|
||||||
|
_remapShader = proto.InstanceUnique();
|
||||||
|
// With floor 0, gain 1, exp 1 the shader is an exact blend-mode-none copy.
|
||||||
|
_copyShader = proto.InstanceUnique();
|
||||||
|
_copyShader.SetParameter("lightFloor", 0f);
|
||||||
|
_copyShader.SetParameter("lightGain", 1f);
|
||||||
|
_copyShader.SetParameter("lightExp", 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void Draw(in OverlayDrawArgs args)
|
||||||
|
{
|
||||||
|
var viewport = args.Viewport;
|
||||||
|
var worldHandle = args.WorldHandle;
|
||||||
|
|
||||||
|
if (viewport.Eye == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var lightTarget = viewport.LightRenderTarget;
|
||||||
|
var res = _resources.GetForViewport(viewport, static _ => new CachedResources());
|
||||||
|
|
||||||
|
if (res.ScratchTarget?.Size != lightTarget.Size)
|
||||||
|
{
|
||||||
|
res.ScratchTarget?.Dispose();
|
||||||
|
res.ScratchTarget = _clyde.CreateLightRenderTarget(lightTarget.Size, "darkvision-scratch", depthStencil: false);
|
||||||
|
}
|
||||||
|
|
||||||
|
var bounds = args.WorldBounds;
|
||||||
|
var lightScale = lightTarget.Size / (Vector2) viewport.Size;
|
||||||
|
var scale = viewport.RenderScale / (Vector2.One / lightScale);
|
||||||
|
var localMatrix = lightTarget.GetWorldToLocalMatrix(viewport.Eye, scale);
|
||||||
|
|
||||||
|
// Copy the light buffer aside first: a texture can't be sampled while it is also the
|
||||||
|
// render target being drawn into.
|
||||||
|
worldHandle.RenderInRenderTarget(res.ScratchTarget, () =>
|
||||||
|
{
|
||||||
|
worldHandle.UseShader(_copyShader);
|
||||||
|
worldHandle.SetTransform(localMatrix);
|
||||||
|
worldHandle.DrawTextureRect(lightTarget.Texture, bounds);
|
||||||
|
worldHandle.UseShader(null);
|
||||||
|
}, Color.Black);
|
||||||
|
|
||||||
|
// Then write it back through the remap.
|
||||||
|
_remapShader.SetParameter("lightFloor", LightFloor);
|
||||||
|
_remapShader.SetParameter("lightGain", LightGain);
|
||||||
|
_remapShader.SetParameter("lightExp", LightExp);
|
||||||
|
worldHandle.RenderInRenderTarget(lightTarget, () =>
|
||||||
|
{
|
||||||
|
worldHandle.UseShader(_remapShader);
|
||||||
|
worldHandle.SetTransform(localMatrix);
|
||||||
|
worldHandle.DrawTextureRect(res.ScratchTarget.Texture, bounds);
|
||||||
|
worldHandle.UseShader(null);
|
||||||
|
}, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void DisposeBehavior()
|
||||||
|
{
|
||||||
|
_resources.Dispose();
|
||||||
|
|
||||||
|
base.DisposeBehavior();
|
||||||
|
}
|
||||||
|
|
||||||
|
private sealed class CachedResources : IDisposable
|
||||||
|
{
|
||||||
|
public IRenderTexture? ScratchTarget;
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
ScratchTarget?.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
using Content.Shared._DV.Overlays.Components;
|
||||||
|
using Robust.Client.Graphics;
|
||||||
|
using Robust.Shared.Player;
|
||||||
|
|
||||||
|
namespace Content.Client._DV.Overlays;
|
||||||
|
|
||||||
|
public sealed class DarkVisionSystem : EntitySystem
|
||||||
|
{
|
||||||
|
[Dependency] private readonly IOverlayManager _overlayMan = default!;
|
||||||
|
[Dependency] private readonly ISharedPlayerManager _playerMan = default!;
|
||||||
|
|
||||||
|
private DarkVisionOverlay _overlay = default!;
|
||||||
|
|
||||||
|
public override void Initialize()
|
||||||
|
{
|
||||||
|
base.Initialize();
|
||||||
|
|
||||||
|
SubscribeLocalEvent<DarkVisionComponent, ComponentInit>(OnInit);
|
||||||
|
SubscribeLocalEvent<DarkVisionComponent, ComponentShutdown>(OnShutdown);
|
||||||
|
SubscribeLocalEvent<DarkVisionComponent, LocalPlayerAttachedEvent>(OnPlayerAttached);
|
||||||
|
SubscribeLocalEvent<DarkVisionComponent, LocalPlayerDetachedEvent>(OnPlayerDetached);
|
||||||
|
|
||||||
|
_overlay = new();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnInit(Entity<DarkVisionComponent> ent, ref ComponentInit args)
|
||||||
|
{
|
||||||
|
if (ent.Owner == _playerMan.LocalEntity)
|
||||||
|
EnableOverlay(ent.Comp);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnShutdown(Entity<DarkVisionComponent> ent, ref ComponentShutdown args)
|
||||||
|
{
|
||||||
|
if (ent.Owner == _playerMan.LocalEntity)
|
||||||
|
_overlayMan.RemoveOverlay(_overlay);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnPlayerAttached(Entity<DarkVisionComponent> ent, ref LocalPlayerAttachedEvent args)
|
||||||
|
{
|
||||||
|
EnableOverlay(ent.Comp);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnPlayerDetached(Entity<DarkVisionComponent> ent, ref LocalPlayerDetachedEvent args)
|
||||||
|
{
|
||||||
|
_overlayMan.RemoveOverlay(_overlay);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void EnableOverlay(DarkVisionComponent comp)
|
||||||
|
{
|
||||||
|
_overlay.LightFloor = comp.LightFloor;
|
||||||
|
_overlay.LightGain = comp.LightGain;
|
||||||
|
_overlay.LightExp = comp.LightExp;
|
||||||
|
if (!_overlayMan.HasOverlay<DarkVisionOverlay>())
|
||||||
|
_overlayMan.AddOverlay(_overlay);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
using Content.Server.Administration.Managers;
|
using Content.Server.Administration.Managers;
|
||||||
|
using Content.Shared._DV.Administration.Components; // DeltaV - Unorbitable
|
||||||
using Content.Shared.Administration;
|
using Content.Shared.Administration;
|
||||||
using Robust.Shared.Console;
|
using Robust.Shared.Console;
|
||||||
using Robust.Shared.Utility;
|
using Robust.Shared.Utility;
|
||||||
@@ -6,7 +7,7 @@ using Robust.Shared.Utility;
|
|||||||
namespace Content.Server.Administration.Commands;
|
namespace Content.Server.Administration.Commands;
|
||||||
|
|
||||||
[AdminCommand(AdminFlags.Stealth)]
|
[AdminCommand(AdminFlags.Stealth)]
|
||||||
public sealed class StealthminCommand : LocalizedCommands
|
public sealed class StealthminCommand : LocalizedEntityCommands // DeltaV - Unorbitable, LocalizedCommands to LocalizedEntityCommands
|
||||||
{
|
{
|
||||||
[Dependency] private readonly IAdminManager _adminManager = default!;
|
[Dependency] private readonly IAdminManager _adminManager = default!;
|
||||||
|
|
||||||
@@ -26,8 +27,20 @@ public sealed class StealthminCommand : LocalizedCommands
|
|||||||
DebugTools.AssertNotNull(adminData);
|
DebugTools.AssertNotNull(adminData);
|
||||||
|
|
||||||
if (!adminData!.Stealth)
|
if (!adminData!.Stealth)
|
||||||
|
{
|
||||||
_adminManager.Stealth(player);
|
_adminManager.Stealth(player);
|
||||||
|
// DeltaV - Unorbitable START
|
||||||
|
if (player.AttachedEntity is { } attachedEntity)
|
||||||
|
EntityManager.EnsureComponent<UnorbitableComponent>(attachedEntity);
|
||||||
|
// DeltaV END
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
_adminManager.UnStealth(player);
|
_adminManager.UnStealth(player);
|
||||||
|
// DeltaV - Unorbitable START
|
||||||
|
if (player.AttachedEntity is { } attachedEntity)
|
||||||
|
EntityManager.RemoveComponent<UnorbitableComponent>(attachedEntity);
|
||||||
|
// DeltaV END
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using Content.Server.RoundEnd; // DeltaV
|
||||||
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
|
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
|
||||||
|
|
||||||
namespace Content.Server.GameTicking.Rules.Components;
|
namespace Content.Server.GameTicking.Rules.Components;
|
||||||
@@ -43,4 +44,16 @@ public sealed partial class XenoborgsRuleComponent : Component
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
[DataField]
|
[DataField]
|
||||||
public bool XenoborgShuttleCalled = false;
|
public bool XenoborgShuttleCalled = false;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// DeltaV - The behavior of the round if the mothership core is deleted.
|
||||||
|
/// </summary>
|
||||||
|
[DataField]
|
||||||
|
public RoundEndBehavior XenoborgRoundEndBehavior = RoundEndBehavior.BecomeSurvival;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// DeltaV - The amount of time before the evac shuttle will arrive if the XenoborgRoundEndBehavior is set to ShuttleCall.
|
||||||
|
/// </summary>
|
||||||
|
[DataField]
|
||||||
|
public TimeSpan XenoborgShuttleDelay = TimeSpan.FromMinutes(10);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,10 +30,20 @@ public sealed partial class ZombieRuleComponent : Component
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// DeltaV - The behavior of the round if all zombies are defeated.
|
/// DeltaV - The behavior of the round if all zombies are defeated.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[DataField]
|
||||||
public RoundEndBehavior ZombieRoundEndBehavior = RoundEndBehavior.BecomeSurvival;
|
public RoundEndBehavior ZombieRoundEndBehavior = RoundEndBehavior.BecomeSurvival;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// DeltaV - The amount of time before the evac shuttle will arrive if the ZombieRoundEndBehavior is set to ShuttleCall.
|
/// DeltaV - The amount of time before the evac shuttle will arrive if the ZombieRoundEndBehavior is set to ShuttleCall.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[DataField]
|
||||||
public TimeSpan ZombieShuttleDelay = TimeSpan.FromMinutes(10);
|
public TimeSpan ZombieShuttleDelay = TimeSpan.FromMinutes(10);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// DeltaV - If true, ZombieRuleSystem will do the ZombieRoundEndBehavior if zombies are defeated.
|
||||||
|
/// This is needed because ZombieOutbreak uses the ZombieRuleComponent but the system won't know if
|
||||||
|
/// it was roundstart or not.
|
||||||
|
/// </summary>
|
||||||
|
[DataField]
|
||||||
|
public bool IsRoundStartZombies = false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -520,18 +520,17 @@ public sealed class NukeopsRuleSystem : GameRuleSystem<NukeopsRuleComponent>
|
|||||||
|
|
||||||
// BEGIN DeltaV - Detect Nukie Failure Better
|
// BEGIN DeltaV - Detect Nukie Failure Better
|
||||||
// We need to use a EntityQueryEnumerator instead of a EntityQuery, because we need the uid to check for cuffs
|
// We need to use a EntityQueryEnumerator instead of a EntityQuery, because we need the uid to check for cuffs
|
||||||
var operatives = new List<Entity<NukeOperativeComponent, MobStateComponent, TransformComponent>>();
|
var operatives = new List<Entity<NukeOperativeComponent, MobStateComponent>>();
|
||||||
var operativesEnumerator = EntityQueryEnumerator<NukeOperativeComponent, MobStateComponent, TransformComponent>();
|
var operativesEnumerator = EntityQueryEnumerator<NukeOperativeComponent, MobStateComponent>();
|
||||||
while (operativesEnumerator.MoveNext(out var uid, out var nukeOp, out var mobState, out var transform))
|
while (operativesEnumerator.MoveNext(out var uid, out var nukeOp, out var mobState))
|
||||||
{
|
{
|
||||||
operatives.Add((uid, nukeOp, mobState, transform));
|
operatives.Add((uid, nukeOp, mobState));
|
||||||
}
|
}
|
||||||
|
|
||||||
var operativesAlive = operatives
|
var operativesAlive = operatives
|
||||||
.Where(op => op.Comp3.MapID == shuttleMapId
|
.Any(op => op.Comp1.Running
|
||||||
|| op.Comp3.MapID == targetStationMap)
|
&& op.Comp2.CurrentState == MobState.Alive
|
||||||
.Any(op => op.Comp2.CurrentState == MobState.Alive && op.Comp1.Running &&
|
&& TryComp<CuffableComponent>(op, out var cuffable) && cuffable.CuffedHandCount == 0); // in the case the crew keeps one alive
|
||||||
!TryComp<CuffableComponent>(op, out _)); // in the case the crew keeps one alive
|
|
||||||
// END DeltaV
|
// END DeltaV
|
||||||
|
|
||||||
if (operativesAlive)
|
if (operativesAlive)
|
||||||
|
|||||||
@@ -42,6 +42,14 @@ public sealed class XenoborgsRuleSystem : GameRuleSystem<XenoborgsRuleComponent>
|
|||||||
colorOverride: AnnouncmentColor);
|
colorOverride: AnnouncmentColor);
|
||||||
|
|
||||||
ent.Comp.MothershipCoreDeathAnnouncmentSent = true;
|
ent.Comp.MothershipCoreDeathAnnouncmentSent = true;
|
||||||
|
|
||||||
|
// BEGIN DeltaV - Convert to Survival
|
||||||
|
if (ent.Comp.XenoborgRoundEndBehavior != RoundEndBehavior.Nothing)
|
||||||
|
{
|
||||||
|
_roundEnd.DoRoundEndBehavior(ent.Comp.XenoborgRoundEndBehavior, ent.Comp.XenoborgShuttleDelay);
|
||||||
|
ent.Comp.XenoborgRoundEndBehavior = RoundEndBehavior.Nothing;
|
||||||
|
}
|
||||||
|
// END DeltaV
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Refactor the end of round text
|
// TODO: Refactor the end of round text
|
||||||
|
|||||||
@@ -115,29 +115,30 @@ public sealed class ZombieRuleSystem : GameRuleSystem<ZombieRuleComponent>
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private void CheckRoundEnd(ZombieRuleComponent zombieRuleComponent)
|
private void CheckRoundEnd(ZombieRuleComponent zombieRuleComponent)
|
||||||
{
|
{
|
||||||
// BEGIN DeltaV - Change mode to survival if zombies die
|
|
||||||
// Zombies have failed to launch and the mode has been switched to survival
|
|
||||||
if (zombieRuleComponent.ZombieRoundEndBehavior == RoundEndBehavior.Nothing)
|
|
||||||
return;
|
|
||||||
// END DeltaV
|
|
||||||
|
|
||||||
var healthy = GetHealthyHumans();
|
var healthy = GetHealthyHumans();
|
||||||
if (healthy.Count == 1) // Only one human left. spooky
|
if (healthy.Count == 1) // Only one human left. spooky
|
||||||
_popup.PopupEntity(Loc.GetString("zombie-alone"), healthy[0], healthy[0]);
|
_popup.PopupEntity(Loc.GetString("zombie-alone"), healthy[0], healthy[0]);
|
||||||
|
|
||||||
|
|
||||||
// BEGIN DeltaV - Change mode to survival if zombies die
|
// BEGIN DeltaV - Change mode to survival if zombies die
|
||||||
var anyInitialInfectedAlive = EntityQuery<InitialInfectedComponent, MobStateComponent>(false)
|
if (zombieRuleComponent.IsRoundStartZombies)
|
||||||
.Any(x => x.Item2.CurrentState != MobState.Dead);
|
|
||||||
var anyLivingZombies = EntityQuery<ZombieComponent, MobStateComponent>(false)
|
|
||||||
.Any(x => x.Item2.CurrentState != MobState.Dead);
|
|
||||||
var anyPendingZombies = EntityQuery<PendingZombieComponent>(false).Any();
|
|
||||||
|
|
||||||
// All II turned/dead, all entities that have turned are dead, and there are no more pending zombies
|
|
||||||
if (!anyInitialInfectedAlive && !anyLivingZombies && !anyPendingZombies)
|
|
||||||
{
|
{
|
||||||
_roundEnd.DoRoundEndBehavior(zombieRuleComponent.ZombieRoundEndBehavior, zombieRuleComponent.ZombieShuttleDelay);
|
// Zombies have failed to launch and the mode has been switched to survival
|
||||||
zombieRuleComponent.ZombieRoundEndBehavior = RoundEndBehavior.Nothing; // stop this check in the future
|
if (zombieRuleComponent.ZombieRoundEndBehavior == RoundEndBehavior.Nothing)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// BEGIN DeltaV - Change mode to survival if zombies die
|
||||||
|
var anyInitialInfectedAlive = EntityQuery<InitialInfectedComponent, MobStateComponent>(false)
|
||||||
|
.Any(x => x.Item2.CurrentState != MobState.Dead);
|
||||||
|
var anyLivingZombies = EntityQuery<ZombieComponent, MobStateComponent>(false)
|
||||||
|
.Any(x => x.Item2.CurrentState != MobState.Dead);
|
||||||
|
var anyPendingZombies = EntityQuery<PendingZombieComponent>(false).Any();
|
||||||
|
|
||||||
|
// All II turned/dead, all entities that have turned are dead, and there are no more pending zombies
|
||||||
|
if (!anyInitialInfectedAlive && !anyLivingZombies && !anyPendingZombies)
|
||||||
|
{
|
||||||
|
_roundEnd.DoRoundEndBehavior(zombieRuleComponent.ZombieRoundEndBehavior, zombieRuleComponent.ZombieShuttleDelay);
|
||||||
|
zombieRuleComponent.ZombieRoundEndBehavior = RoundEndBehavior.Nothing; // stop this check in the future
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// END DeltaV
|
// END DeltaV
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ using Content.Shared.Movement.Systems;
|
|||||||
using Content.Shared.NameModifier.EntitySystems;
|
using Content.Shared.NameModifier.EntitySystems;
|
||||||
using Content.Shared.Popups;
|
using Content.Shared.Popups;
|
||||||
using Content.Server.Preferences.Managers; // DeltaV
|
using Content.Server.Preferences.Managers; // DeltaV
|
||||||
|
using Content.Shared._DV.Administration.EntitySystems; // DeltaV - Unorbitable
|
||||||
using Content.Shared.Storage.Components;
|
using Content.Shared.Storage.Components;
|
||||||
using Content.Shared.Tag;
|
using Content.Shared.Tag;
|
||||||
using Content.Shared.Warps;
|
using Content.Shared.Warps;
|
||||||
@@ -75,6 +76,7 @@ namespace Content.Server.Ghost
|
|||||||
[Dependency] private readonly GhostSpriteStateSystem _ghostState = default!;
|
[Dependency] private readonly GhostSpriteStateSystem _ghostState = default!;
|
||||||
[Dependency] private readonly IServerPreferencesManager _preferencesManager = default!; // DeltaV
|
[Dependency] private readonly IServerPreferencesManager _preferencesManager = default!; // DeltaV
|
||||||
[Dependency] private readonly IAdminManager _admin = default!; // DeltaV
|
[Dependency] private readonly IAdminManager _admin = default!; // DeltaV
|
||||||
|
[Dependency] private readonly UnorbitableSystem _unorbitable = default!; // DeltaV - Unorbitable
|
||||||
|
|
||||||
private EntityQuery<GhostComponent> _ghostQuery;
|
private EntityQuery<GhostComponent> _ghostQuery;
|
||||||
private EntityQuery<PhysicsComponent> _physicsQuery;
|
private EntityQuery<PhysicsComponent> _physicsQuery;
|
||||||
@@ -341,6 +343,11 @@ namespace Content.Server.Ghost
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DeltaV - Unorbitable START
|
||||||
|
if (!_unorbitable.CanFollow(attached, realTarget))
|
||||||
|
return;
|
||||||
|
// DeltaV END
|
||||||
|
|
||||||
WarpTo(attached, realTarget);
|
WarpTo(attached, realTarget);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ using Content.Server.Body.Systems;
|
|||||||
// Begin DeltaV
|
// Begin DeltaV
|
||||||
using Content.Server._DV.MedicalRecords;
|
using Content.Server._DV.MedicalRecords;
|
||||||
using Content.Shared._DV.MedicalRecords;
|
using Content.Shared._DV.MedicalRecords;
|
||||||
|
using Content.Shared.Chemistry.Components;
|
||||||
// End DeltaV
|
// End DeltaV
|
||||||
|
|
||||||
namespace Content.Server.Medical;
|
namespace Content.Server.Medical;
|
||||||
@@ -269,9 +270,11 @@ public sealed partial class HealthAnalyzerSystem : EntitySystem // DeltaV - Made
|
|||||||
var bleeding = false;
|
var bleeding = false;
|
||||||
var unrevivable = false;
|
var unrevivable = false;
|
||||||
|
|
||||||
|
Solution? bloodSolution = null; // DeltaV - Health Analyzer Plus
|
||||||
|
|
||||||
if (TryComp<BloodstreamComponent>(entity, out var bloodstream) &&
|
if (TryComp<BloodstreamComponent>(entity, out var bloodstream) &&
|
||||||
_solutionContainerSystem.ResolveSolution(entity, bloodstream.BloodSolutionName,
|
_solutionContainerSystem.ResolveSolution(entity, bloodstream.BloodSolutionName,
|
||||||
ref bloodstream.BloodSolution, out var bloodSolution))
|
ref bloodstream.BloodSolution, out bloodSolution)) // DeltaV - Health Analyzer Plus
|
||||||
{
|
{
|
||||||
bloodAmount = _bloodstreamSystem.GetBloodLevel(entity);
|
bloodAmount = _bloodstreamSystem.GetBloodLevel(entity);
|
||||||
bleeding = bloodstream.BleedAmount > 0;
|
bleeding = bloodstream.BleedAmount > 0;
|
||||||
@@ -287,6 +290,7 @@ public sealed partial class HealthAnalyzerSystem : EntitySystem // DeltaV - Made
|
|||||||
null,
|
null,
|
||||||
bleeding,
|
bleeding,
|
||||||
unrevivable,
|
unrevivable,
|
||||||
|
bloodSolution, // DeltaV - Health Analyzer Plus
|
||||||
_medicalRecords.GetMedicalRecords(entity) // DeltaV - Medical Records
|
_medicalRecords.GetMedicalRecords(entity) // DeltaV - Medical Records
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,12 +125,12 @@ public sealed class ProjectileSystem : SharedProjectileSystem
|
|||||||
RaiseLocalEvent(projectile, ref pierceEv);
|
RaiseLocalEvent(projectile, ref pierceEv);
|
||||||
|
|
||||||
// If the object won't be destroyed, it "tanks" the penetration hit.
|
// If the object won't be destroyed, it "tanks" the penetration hit.
|
||||||
if (damage.GetTotal() < damageRequired)
|
if (damage.GetTotal() < damageRequired && !pierceEv.Pierced) // DeltaV - Addition of the NT-3
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!projectile.Comp.ProjectileSpent)
|
if (!projectile.Comp.ProjectileSpent && !pierceEv.Pierced) // DeltaV - Addition of the NT-3
|
||||||
{
|
{
|
||||||
projectile.Comp.PenetrationAmount += damageRequired;
|
projectile.Comp.PenetrationAmount += damageRequired;
|
||||||
// The projectile has dealt enough damage to be spent.
|
// The projectile has dealt enough damage to be spent.
|
||||||
@@ -139,7 +139,7 @@ public sealed class ProjectileSystem : SharedProjectileSystem
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (projectile.Comp.ProjectileSpent && pierceEv.Pierced) // DeltaV - Addition of the NT-3
|
if (projectile.Comp.ProjectileSpent)
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,7 +41,8 @@ namespace Content.Server.StationEvents
|
|||||||
if (TryComp<NextEventComponent>(uid, out var nextEventComponent)
|
if (TryComp<NextEventComponent>(uid, out var nextEventComponent)
|
||||||
&& _event.TryGenerateRandomEvent(component.ScheduledGameRules, TimeSpan.FromSeconds(component.TimeUntilNextEvent)) is {} firstEvent)
|
&& _event.TryGenerateRandomEvent(component.ScheduledGameRules, TimeSpan.FromSeconds(component.TimeUntilNextEvent)) is {} firstEvent)
|
||||||
{
|
{
|
||||||
_chatManager.SendAdminAlert(Loc.GetString("station-event-system-run-event-delayed", ("eventName", firstEvent), ("seconds", (int)component.TimeUntilNextEvent)));
|
var nextEventTime = GameTicker.RoundDuration() + TimeSpan.FromSeconds(component.TimeUntilNextEvent);
|
||||||
|
_chatManager.SendAdminAlert(Loc.GetString("station-event-system-run-event-delayed", ("eventName", firstEvent), ("time", nextEventTime.ToString(@"hh\:mm\:ss"))));
|
||||||
_next.UpdateNextEvent(nextEventComponent, firstEvent, GameTicker.RoundDuration() + TimeSpan.FromSeconds(component.TimeUntilNextEvent));
|
_next.UpdateNextEvent(nextEventComponent, firstEvent, GameTicker.RoundDuration() + TimeSpan.FromSeconds(component.TimeUntilNextEvent));
|
||||||
}
|
}
|
||||||
// End DeltaV Additions
|
// End DeltaV Additions
|
||||||
@@ -81,7 +82,7 @@ namespace Content.Server.StationEvents
|
|||||||
if (_event.TryGenerateRandomEvent(eventScheduler.ScheduledGameRules, nextEventTime) is not {} generatedEvent)
|
if (_event.TryGenerateRandomEvent(eventScheduler.ScheduledGameRules, nextEventTime) is not {} generatedEvent)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
_chatManager.SendAdminAlert(Loc.GetString("station-event-system-run-event-delayed", ("eventName", generatedEvent), ("seconds", (int)eventScheduler.TimeUntilNextEvent)));
|
_chatManager.SendAdminAlert(Loc.GetString("station-event-system-run-event-delayed", ("eventName", generatedEvent), ("time", nextEventTime.ToString(@"hh\:mm\:ss"))));
|
||||||
// Cycle the stashed event with the new generated event and time.
|
// Cycle the stashed event with the new generated event and time.
|
||||||
var storedEvent = _next.UpdateNextEvent(nextEventComponent, generatedEvent, nextEventTime);
|
var storedEvent = _next.UpdateNextEvent(nextEventComponent, generatedEvent, nextEventTime);
|
||||||
if (string.IsNullOrEmpty(storedEvent)) //If there was no stored event don't try to run it.
|
if (string.IsNullOrEmpty(storedEvent)) //If there was no stored event don't try to run it.
|
||||||
|
|||||||
@@ -14,9 +14,12 @@ public sealed class RampingStationEventSchedulerSystem : GameRuleSystem<RampingS
|
|||||||
[Dependency] private readonly IChatManager _chatManager = default!; // DeltaV
|
[Dependency] private readonly IChatManager _chatManager = default!; // DeltaV
|
||||||
[Dependency] private readonly IRobustRandom _random = default!;
|
[Dependency] private readonly IRobustRandom _random = default!;
|
||||||
[Dependency] private readonly EventManagerSystem _event = default!;
|
[Dependency] private readonly EventManagerSystem _event = default!;
|
||||||
|
#if DEBUG // DeltaV - Only used if built by Debug
|
||||||
[Dependency] private readonly GameTicker _gameTicker = default!;
|
[Dependency] private readonly GameTicker _gameTicker = default!;
|
||||||
|
#endif
|
||||||
[Dependency] private readonly NextEventSystem _next = default!; // DeltaV
|
[Dependency] private readonly NextEventSystem _next = default!; // DeltaV
|
||||||
|
[Dependency] private readonly IGameTiming _timing = default!; // DeltaV
|
||||||
|
|
||||||
/* DeltaV
|
/* DeltaV
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns the ChaosModifier which increases as round time increases to a point.
|
/// Returns the ChaosModifier which increases as round time increases to a point.
|
||||||
@@ -50,7 +53,8 @@ public sealed class RampingStationEventSchedulerSystem : GameRuleSystem<RampingS
|
|||||||
if (TryComp<NextEventComponent>(uid, out var nextEventComponent)
|
if (TryComp<NextEventComponent>(uid, out var nextEventComponent)
|
||||||
&& _event.TryGenerateRandomEvent(component.ScheduledGameRules, TimeSpan.FromSeconds(component.TimeUntilNextEvent)) is {} firstEvent)
|
&& _event.TryGenerateRandomEvent(component.ScheduledGameRules, TimeSpan.FromSeconds(component.TimeUntilNextEvent)) is {} firstEvent)
|
||||||
{
|
{
|
||||||
_chatManager.SendAdminAlert(Loc.GetString("station-event-system-run-event-delayed", ("eventName", firstEvent), ("seconds", (int)component.TimeUntilNextEvent)));
|
var nextEventTime = GameTicker.RoundDuration() + TimeSpan.FromSeconds(component.TimeUntilNextEvent);
|
||||||
|
_chatManager.SendAdminAlert(Loc.GetString("station-event-system-run-event-delayed", ("eventName", firstEvent), ("time", nextEventTime.ToString(@"hh\:mm\:ss"))));
|
||||||
_next.UpdateNextEvent(nextEventComponent, firstEvent, GameTicker.RoundDuration() + TimeSpan.FromSeconds(component.TimeUntilNextEvent));
|
_next.UpdateNextEvent(nextEventComponent, firstEvent, GameTicker.RoundDuration() + TimeSpan.FromSeconds(component.TimeUntilNextEvent));
|
||||||
}
|
}
|
||||||
// End DeltaV Additions: init NextEventComp
|
// End DeltaV Additions: init NextEventComp
|
||||||
@@ -83,7 +87,7 @@ public sealed class RampingStationEventSchedulerSystem : GameRuleSystem<RampingS
|
|||||||
if (_event.TryGenerateRandomEvent(scheduler.ScheduledGameRules, nextEventTime) is not {} generatedEvent)
|
if (_event.TryGenerateRandomEvent(scheduler.ScheduledGameRules, nextEventTime) is not {} generatedEvent)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
_chatManager.SendAdminAlert(Loc.GetString("station-event-system-run-event-delayed", ("eventName", generatedEvent), ("seconds", (int)scheduler.TimeUntilNextEvent)));
|
_chatManager.SendAdminAlert(Loc.GetString("station-event-system-run-event-delayed", ("eventName", generatedEvent), ("time", nextEventTime.ToString(@"hh\:mm\:ss"))));
|
||||||
// Cycle the stashed event with the new generated event and time.
|
// Cycle the stashed event with the new generated event and time.
|
||||||
string? storedEvent = _next.UpdateNextEvent(nextEventComponent, generatedEvent, nextEventTime);
|
string? storedEvent = _next.UpdateNextEvent(nextEventComponent, generatedEvent, nextEventTime);
|
||||||
if (string.IsNullOrEmpty(storedEvent)) //If there was no stored event don't try to run it.
|
if (string.IsNullOrEmpty(storedEvent)) //If there was no stored event don't try to run it.
|
||||||
@@ -114,13 +118,28 @@ public sealed class RampingStationEventSchedulerSystem : GameRuleSystem<RampingS
|
|||||||
// Begin DeltaV Additions
|
// Begin DeltaV Additions
|
||||||
var averageTimeUntilNextEvent = component.TimeKeyPoints[0].Y;
|
var averageTimeUntilNextEvent = component.TimeKeyPoints[0].Y;
|
||||||
var timeUntilNextEventDeviation = _random.NextFloat(-1f, 1f) * component.TimeDeviation;
|
var timeUntilNextEventDeviation = _random.NextFloat(-1f, 1f) * component.TimeDeviation;
|
||||||
var roundTime = (float)_gameTicker.RoundDuration().TotalMinutes;
|
|
||||||
var absoluteTimePoint = 0f;
|
|
||||||
|
|
||||||
|
var ruleActivated = TimeSpan.FromSeconds(0);
|
||||||
|
if (TryComp<GameRuleComponent>(uid, out var gameRule))
|
||||||
|
{
|
||||||
|
ruleActivated = gameRule.ActivatedAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
var ruleTime = _timing.CurTime.Subtract(ruleActivated);
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
_chatManager.SendAdminAlert(Loc.GetString("station-event-system-debug-round-time", ("time", _gameTicker.RoundDuration())));
|
||||||
|
_chatManager.SendAdminAlert(Loc.GetString("station-event-system-debug-ramping-time", ("time", ruleActivated)));
|
||||||
|
// This will be what the keypoint system looks at to determine where to start ramping
|
||||||
|
_chatManager.SendAdminAlert(Loc.GetString("station-event-system-debug-keypoint-time", ("time", ruleTime)));
|
||||||
|
_chatManager.SendAdminAlert("_______________"); // Easier to read
|
||||||
|
#endif
|
||||||
|
|
||||||
|
var absoluteTimePoint = 0f;
|
||||||
foreach (var point in component.TimeKeyPoints)
|
foreach (var point in component.TimeKeyPoints)
|
||||||
{
|
{
|
||||||
absoluteTimePoint += point.X;
|
absoluteTimePoint += point.X;
|
||||||
if (roundTime >= absoluteTimePoint)
|
if (ruleTime.TotalMinutes >= absoluteTimePoint)
|
||||||
averageTimeUntilNextEvent = point.Y;
|
averageTimeUntilNextEvent = point.Y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,43 +0,0 @@
|
|||||||
using Content.Shared._CD.Silicons.Borgs;
|
|
||||||
using Content.Shared.Inventory;
|
|
||||||
|
|
||||||
namespace Content.Server._CD.Silicons.Borgs;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Server-side logic that shouldn't be exposed to the client.
|
|
||||||
/// </summary>
|
|
||||||
public sealed class BorgSwitchableSubstypeSystem : SharedBorgSwitchableSubtypeSystem
|
|
||||||
{
|
|
||||||
[Dependency] private readonly InventorySystem _inventorySystem = default!;
|
|
||||||
|
|
||||||
protected override void SelectBorgSubtype(Entity<BorgSwitchableSubtypeComponent> ent)
|
|
||||||
{
|
|
||||||
if (ent.Comp.BorgSubtype == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!Prototypes.Index(ent.Comp.BorgSubtype.Value)
|
|
||||||
.TryGetComponent<BorgSubtypeDefinitionComponent>(out var borgSubtype, ComponentFactory))
|
|
||||||
return;
|
|
||||||
|
|
||||||
// Configure special components
|
|
||||||
if (Prototypes.TryIndex(ent.Comp.BorgSubtype, out var previousPrototype) &&
|
|
||||||
previousPrototype.TryGetComponent<BorgSubtypeDefinitionComponent>(out var previousSubtype, ComponentFactory))
|
|
||||||
{
|
|
||||||
if (previousSubtype.AddComponents is { } removeComponents)
|
|
||||||
EntityManager.RemoveComponents(ent, removeComponents);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (borgSubtype.AddComponents is { } addComponents)
|
|
||||||
{
|
|
||||||
EntityManager.AddComponents(ent, addComponents);
|
|
||||||
}
|
|
||||||
|
|
||||||
// inventory template configuration (hats spacing)
|
|
||||||
if (TryComp(ent, out InventoryComponent? inventory))
|
|
||||||
{
|
|
||||||
_inventorySystem.SetTemplateId((ent.Owner, inventory), borgSubtype.InventoryTemplateId);
|
|
||||||
}
|
|
||||||
|
|
||||||
base.SelectBorgSubtype(ent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -33,7 +33,7 @@ public sealed partial class GameTicker
|
|||||||
public bool ConvertRoundToSurvival()
|
public bool ConvertRoundToSurvival()
|
||||||
{
|
{
|
||||||
// Ramping scheduler is already added. Do nothing.
|
// Ramping scheduler is already added. Do nothing.
|
||||||
if (IsGameRuleActive(RampingSchedulerProto))
|
if (IsGameRuleAdded(RampingSchedulerProto))
|
||||||
{
|
{
|
||||||
_chatManager.SendAdminAlert("RampingStationEventScheduler detected. No rules added.");
|
_chatManager.SendAdminAlert("RampingStationEventScheduler detected. No rules added.");
|
||||||
return true;
|
return true;
|
||||||
@@ -44,7 +44,7 @@ public sealed partial class GameTicker
|
|||||||
var rampingSchedulerStart = _gameTiming.CurTime.Add(GracePeriod);
|
var rampingSchedulerStart = _gameTiming.CurTime.Add(GracePeriod);
|
||||||
EnsureComp<DelayedStartRuleComponent>(rampingScheduler).RuleStartTime = rampingSchedulerStart;
|
EnsureComp<DelayedStartRuleComponent>(rampingScheduler).RuleStartTime = rampingSchedulerStart;
|
||||||
|
|
||||||
_chatManager.SendAdminAlert($"Major antag defeated. Converting to survival at {rampingSchedulerStart}.");
|
_chatManager.SendAdminAlert($"Major antag defeated. Converting to survival at {(RoundDuration() + GracePeriod).ToString(@"hh\:mm\:ss")}.");
|
||||||
|
|
||||||
// End Basic Rules
|
// End Basic Rules
|
||||||
var basicRules = EntityQueryEnumerator<BasicStationEventSchedulerComponent>();
|
var basicRules = EntityQueryEnumerator<BasicStationEventSchedulerComponent>();
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ using Content.Server.NodeContainer.Nodes;
|
|||||||
using Content.Shared._DV.NodeCrawl;
|
using Content.Shared._DV.NodeCrawl;
|
||||||
using Content.Shared.Atmos;
|
using Content.Shared.Atmos;
|
||||||
using Content.Shared.NodeContainer;
|
using Content.Shared.NodeContainer;
|
||||||
|
using Content.Shared.Polymorph;
|
||||||
using Content.Shared.Zombies;
|
using Content.Shared.Zombies;
|
||||||
using Robust.Shared.Reflection;
|
using Robust.Shared.Reflection;
|
||||||
using Robust.Shared.Utility;
|
using Robust.Shared.Utility;
|
||||||
@@ -30,6 +31,7 @@ public sealed class NodeCrawlSystem : SharedNodeCrawlSystem
|
|||||||
SubscribeLocalEvent<NodeCrawlerComponent, InhaleLocationEvent>(OnInhaleLocation);
|
SubscribeLocalEvent<NodeCrawlerComponent, InhaleLocationEvent>(OnInhaleLocation);
|
||||||
SubscribeLocalEvent<NodeCrawlerComponent, ExhaleLocationEvent>(OnExhaleLocation);
|
SubscribeLocalEvent<NodeCrawlerComponent, ExhaleLocationEvent>(OnExhaleLocation);
|
||||||
SubscribeLocalEvent<NodeCrawlerComponent, AtmosExposedGetAirEvent>(OnGetAir);
|
SubscribeLocalEvent<NodeCrawlerComponent, AtmosExposedGetAirEvent>(OnGetAir);
|
||||||
|
SubscribeLocalEvent<NodeCrawlerComponent, PolymorphActionEvent>(OnPolymorph);
|
||||||
|
|
||||||
SubscribeLocalEvent<NodeCrawlerComponent, EntityZombifiedEvent>(OnZombify);
|
SubscribeLocalEvent<NodeCrawlerComponent, EntityZombifiedEvent>(OnZombify);
|
||||||
}
|
}
|
||||||
@@ -222,4 +224,15 @@ public sealed class NodeCrawlSystem : SharedNodeCrawlSystem
|
|||||||
ent.Comp.EnterDelay = ent.Comp.ZombieEnterDelay;
|
ent.Comp.EnterDelay = ent.Comp.ZombieEnterDelay;
|
||||||
Dirty(ent);
|
Dirty(ent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Exit on polymorph or else the entity's movement bugs out.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ent"></param>
|
||||||
|
/// <param name="args"></param>
|
||||||
|
private void OnPolymorph(Entity<NodeCrawlerComponent> ent, ref PolymorphActionEvent args)
|
||||||
|
{
|
||||||
|
if (ent.Comp.Mover.HasValue)
|
||||||
|
ExitNodeCrawl(ent);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using Content.Shared.Tag;
|
using Content.Shared.Tag;
|
||||||
|
using Content.Shared.Whitelist;
|
||||||
using Robust.Shared.Prototypes;
|
using Robust.Shared.Prototypes;
|
||||||
|
|
||||||
namespace Content.Server._DV.Projectiles.Components;
|
namespace Content.Server._DV.Projectiles.Components;
|
||||||
@@ -21,10 +22,14 @@ public sealed partial class PiercingProjectileComponent : Component
|
|||||||
public float PierceCounter;
|
public float PierceCounter;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The tag that will cause the piercing bullet to increment it's <see cref="PierceCounter"/>.
|
/// The whitelist for checking what increments the <see cref="PierceCounter"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <example>
|
||||||
|
/// If this has the tag "Wall" in it, any entity with the tag "Wall" will increment <see cref="PierceCounter"/>
|
||||||
|
/// upon being hit.
|
||||||
|
/// </example>
|
||||||
[DataField]
|
[DataField]
|
||||||
public List<ProtoId<TagPrototype>> PierceBlockTag = ["Wall", "Window"];
|
public EntityWhitelist PierceCounterWhitelist;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The number of entities it is allowed to pierce before being deleted.
|
/// The number of entities it is allowed to pierce before being deleted.
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ using Content.Shared.FixedPoint;
|
|||||||
namespace Content.Server._DV.Projectiles.Events;
|
namespace Content.Server._DV.Projectiles.Events;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Raised when a piercing projectile hits an entity that doesn't follow upstream piercing rules.
|
/// Raised when a piercing projectile that doesn't follow upstream piercing rules hits an entity.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[ByRefEvent]
|
[ByRefEvent]
|
||||||
public record struct ProjectilePierceEvent(EntityUid Target, FixedPoint2 RequiredDamage, bool Pierced = false);
|
public record struct ProjectilePierceEvent(EntityUid Target, FixedPoint2 RequiredDamage, bool Pierced = false);
|
||||||
|
|||||||
@@ -1,29 +1,33 @@
|
|||||||
using Content.Server._DV.Projectiles.Components;
|
using Content.Server._DV.Projectiles.Components;
|
||||||
using Content.Server._DV.Projectiles.Events;
|
using Content.Server._DV.Projectiles.Events;
|
||||||
using Content.Shared.Tag;
|
using Content.Shared.Whitelist;
|
||||||
|
|
||||||
namespace Content.Server._DV.Projectiles.Systems;
|
namespace Content.Server._DV.Projectiles.Systems;
|
||||||
|
|
||||||
public sealed class PiercingProjectileSystem : EntitySystem
|
public sealed class PiercingProjectileSystem : EntitySystem
|
||||||
{
|
{
|
||||||
[Dependency] private readonly TagSystem _tagSystem = default!;
|
[Dependency] private readonly EntityWhitelistSystem _whitelist = default!;
|
||||||
|
|
||||||
|
// Mobs return a required Damage amount of Float.MaxValue. Therefore, we need to check for absurdly high values.
|
||||||
|
private readonly int _indestructibleNumber = 20000000;
|
||||||
|
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
base.Initialize();
|
base.Initialize();
|
||||||
|
|
||||||
SubscribeLocalEvent<PiercingProjectileComponent, ProjectilePierceEvent>(OnPierce);
|
SubscribeLocalEvent<PiercingProjectileComponent, ProjectilePierceEvent>(OnPierce);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnPierce(Entity<PiercingProjectileComponent> bullet, ref ProjectilePierceEvent args)
|
private void OnPierce(Entity<PiercingProjectileComponent> bullet, ref ProjectilePierceEvent args)
|
||||||
{
|
{
|
||||||
// If the target doesn't have any tags to stop the bullet from piercing, it's automatically true.
|
// If the target doesn't have any tags to stop the bullet from piercing, it's automatically true.
|
||||||
if (!_tagSystem.HasAnyTag(args.Target, bullet.Comp.PierceBlockTag))
|
if (_whitelist.IsWhitelistFail(bullet.Comp.PierceCounterWhitelist, args.Target))
|
||||||
{
|
{
|
||||||
args.Pierced = true;
|
args.Pierced = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// If it does have the tag to stop it and enough health to count as "strongly armored", it'll block the bullet.
|
// If it does have the tag to stop it and enough health to count as "strongly armored", it'll block the bullet.
|
||||||
if (bullet.Comp.HealthThreshold < args.RequiredDamage)
|
if (bullet.Comp.HealthThreshold < args.RequiredDamage && args.RequiredDamage < _indestructibleNumber)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (bullet.Comp.Direction == null) // Get the direction of the bullet to determine which walls count.
|
if (bullet.Comp.Direction == null) // Get the direction of the bullet to determine which walls count.
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ using Content.Shared._Goobstation.Flashbang;
|
|||||||
using Content.Shared._Starlight.Flash.Components;
|
using Content.Shared._Starlight.Flash.Components;
|
||||||
using Content.Shared.Body.Components;
|
using Content.Shared.Body.Components;
|
||||||
using Content.Shared.Flash; // Delta V - Flash Work
|
using Content.Shared.Flash; // Delta V - Flash Work
|
||||||
|
using Content.Shared._DV.Body.Components; // Delta V - Remove various comps related to breathing
|
||||||
|
|
||||||
|
|
||||||
namespace Content.Server._Starlight;
|
namespace Content.Server._Starlight;
|
||||||
@@ -68,6 +69,8 @@ public sealed class ShadekinSystem : EntitySystem
|
|||||||
{
|
{
|
||||||
UpdateAlert(uid, component, (short)component.CurrentState);
|
UpdateAlert(uid, component, (short)component.CurrentState);
|
||||||
RemComp<InternalsComponent>(uid);
|
RemComp<InternalsComponent>(uid);
|
||||||
|
RemComp<RespiratorComponent>(uid);
|
||||||
|
RemComp<AffectedByCPRComponent>(uid); // No lungs = no CPR
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnEyeColorChange(EntityUid uid, ShadekinComponent component, EyeColorInitEvent args)
|
private void OnEyeColorChange(EntityUid uid, ShadekinComponent component, EyeColorInitEvent args)
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Numerics;
|
using Content.Shared._DV.Humanoid; // DeltaV
|
||||||
using Content.Shared._DV.Humanoid;
|
|
||||||
using Content.Shared.Humanoid.Markings;
|
using Content.Shared.Humanoid.Markings;
|
||||||
using Content.Shared.Humanoid;
|
using Content.Shared.Humanoid;
|
||||||
using Content.Shared.Sprite;
|
|
||||||
using Robust.Shared.Containers;
|
using Robust.Shared.Containers;
|
||||||
using Robust.Shared.Prototypes;
|
using Robust.Shared.Prototypes;
|
||||||
using Robust.Shared.Utility;
|
using Robust.Shared.Utility;
|
||||||
@@ -18,7 +16,6 @@ public abstract partial class SharedVisualBodySystem : EntitySystem
|
|||||||
[Dependency] private readonly IPrototypeManager _prototype = default!;
|
[Dependency] private readonly IPrototypeManager _prototype = default!;
|
||||||
[Dependency] private readonly MarkingManager _marking = default!;
|
[Dependency] private readonly MarkingManager _marking = default!;
|
||||||
[Dependency] private readonly SharedContainerSystem _container = default!;
|
[Dependency] private readonly SharedContainerSystem _container = default!;
|
||||||
[Dependency] private readonly SharedScaleVisualsSystem _scaleVisualsSystem = default!;
|
|
||||||
|
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
@@ -28,7 +25,6 @@ public abstract partial class SharedVisualBodySystem : EntitySystem
|
|||||||
SubscribeLocalEvent<VisualOrganMarkingsComponent, BodyRelayedEvent<OrganCopyAppearanceEvent>>(OnMarkingsOrganCopyAppearance);
|
SubscribeLocalEvent<VisualOrganMarkingsComponent, BodyRelayedEvent<OrganCopyAppearanceEvent>>(OnMarkingsOrganCopyAppearance);
|
||||||
SubscribeLocalEvent<VisualOrganComponent, BodyRelayedEvent<ApplyOrganProfileDataEvent>>(OnVisualOrganApplyProfile);
|
SubscribeLocalEvent<VisualOrganComponent, BodyRelayedEvent<ApplyOrganProfileDataEvent>>(OnVisualOrganApplyProfile);
|
||||||
SubscribeLocalEvent<VisualOrganMarkingsComponent, BodyRelayedEvent<ApplyOrganMarkingsEvent>>(OnMarkingsOrganApplyMarkings);
|
SubscribeLocalEvent<VisualOrganMarkingsComponent, BodyRelayedEvent<ApplyOrganMarkingsEvent>>(OnMarkingsOrganApplyMarkings);
|
||||||
SubscribeLocalEvent<HumanoidProfileComponent, ApplyOrganProfileDataEvent>(OnApplyOrganProfileData); // Delta V - Taking the solution from CD
|
|
||||||
|
|
||||||
InitializeModifiers();
|
InitializeModifiers();
|
||||||
InitializeInitial();
|
InitializeInitial();
|
||||||
@@ -100,36 +96,9 @@ public abstract partial class SharedVisualBodySystem : EntitySystem
|
|||||||
if (!other.Layer.Equals(ent.Comp.Layer))
|
if (!other.Layer.Equals(ent.Comp.Layer))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Delta V - Begin Fix Height for Cloning
|
|
||||||
var height = other.Profile.Height;
|
|
||||||
if (TryComp<HumanoidProfileComponent>(args.Body.Owner, out var component))
|
|
||||||
ScaleBody((args.Body.Owner, component), height, height);
|
|
||||||
// Delta V - End
|
|
||||||
|
|
||||||
SetOrganAppearance(ent, other.Data);
|
SetOrganAppearance(ent, other.Data);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delta V - BEGIN CD Solution
|
|
||||||
private void OnApplyOrganProfileData(Entity<HumanoidProfileComponent> entity, ref ApplyOrganProfileDataEvent args)
|
|
||||||
{
|
|
||||||
var speciesPrototype = _prototype.Index(entity.Comp.Species);
|
|
||||||
if (args.Base == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
var height = Math.Clamp(MathF.Round(args.Base.Value.Height, 2), speciesPrototype.MinHeight, speciesPrototype.MaxHeight);
|
|
||||||
|
|
||||||
ScaleBody(entity, speciesPrototype.ScaleHeight ? height : 1f, height);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ScaleBody(Entity<HumanoidProfileComponent> entity, float heightX, float heightY)
|
|
||||||
{
|
|
||||||
_scaleVisualsSystem.SetSpriteScale(
|
|
||||||
entity.Owner,
|
|
||||||
new Vector2(heightX, heightY)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
// Delta V - END
|
|
||||||
|
|
||||||
|
|
||||||
private void OnMarkingsOrganCopyAppearance(Entity<VisualOrganMarkingsComponent> ent, ref BodyRelayedEvent<OrganCopyAppearanceEvent> args)
|
private void OnMarkingsOrganCopyAppearance(Entity<VisualOrganMarkingsComponent> ent, ref BodyRelayedEvent<OrganCopyAppearanceEvent> args)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -392,7 +392,6 @@ public abstract partial class SharedBuckleSystem
|
|||||||
if (TryComp<PhysicsComponent>(buckle, out var physics))
|
if (TryComp<PhysicsComponent>(buckle, out var physics))
|
||||||
_physics.ResetDynamics(buckle, physics);
|
_physics.ResetDynamics(buckle, physics);
|
||||||
|
|
||||||
// TOOD: DV - This fails when you try to buckle the entity you're carrying to something. Figure out why later.
|
|
||||||
DebugTools.AssertEqual(xform.ParentUid, strap.Owner);
|
DebugTools.AssertEqual(xform.ParentUid, strap.Owner);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Numerics;
|
using System.Numerics;
|
||||||
|
using Content.Shared._DV.Administration.EntitySystems; // DeltaV - Unorbitable
|
||||||
using Content.Shared.Administration.Managers;
|
using Content.Shared.Administration.Managers;
|
||||||
using Content.Shared.Database;
|
using Content.Shared.Database;
|
||||||
using Content.Shared.Follower.Components;
|
using Content.Shared.Follower.Components;
|
||||||
@@ -33,6 +34,7 @@ public sealed class FollowerSystem : EntitySystem
|
|||||||
[Dependency] private readonly SharedPhysicsSystem _physicsSystem = default!;
|
[Dependency] private readonly SharedPhysicsSystem _physicsSystem = default!;
|
||||||
[Dependency] private readonly INetManager _netMan = default!;
|
[Dependency] private readonly INetManager _netMan = default!;
|
||||||
[Dependency] private readonly ISharedAdminManager _adminManager = default!;
|
[Dependency] private readonly ISharedAdminManager _adminManager = default!;
|
||||||
|
[Dependency] private readonly UnorbitableSystem _unorbitable = default!; // DeltaV - Unorbitable
|
||||||
|
|
||||||
private static readonly ProtoId<TagPrototype> ForceableFollowTag = "ForceableFollow";
|
private static readonly ProtoId<TagPrototype> ForceableFollowTag = "ForceableFollow";
|
||||||
private static readonly ProtoId<TagPrototype> PreventGhostnadoWarpTag = "NotGhostnadoWarpable";
|
private static readonly ProtoId<TagPrototype> PreventGhostnadoWarpTag = "NotGhostnadoWarpable";
|
||||||
@@ -98,6 +100,11 @@ public sealed class FollowerSystem : EntitySystem
|
|||||||
if (ev.User == ev.Target || IsClientSide(ev.Target))
|
if (ev.User == ev.Target || IsClientSide(ev.Target))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// DeltaV - Unorbitable START
|
||||||
|
if (!_unorbitable.CanFollow(ev.User, ev.Target))
|
||||||
|
return;
|
||||||
|
// DeltaV END
|
||||||
|
|
||||||
if (HasComp<GhostComponent>(ev.User))
|
if (HasComp<GhostComponent>(ev.User))
|
||||||
{
|
{
|
||||||
var verb = new AlternativeVerb()
|
var verb = new AlternativeVerb()
|
||||||
@@ -187,6 +194,11 @@ public sealed class FollowerSystem : EntitySystem
|
|||||||
if (follower == entity || TerminatingOrDeleted(entity))
|
if (follower == entity || TerminatingOrDeleted(entity))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// DeltaV - Unorbitable START
|
||||||
|
if (!_unorbitable.CanFollow(follower, entity))
|
||||||
|
return;
|
||||||
|
// DeltaV END
|
||||||
|
|
||||||
// No recursion for you
|
// No recursion for you
|
||||||
var targetXform = Transform(entity);
|
var targetXform = Transform(entity);
|
||||||
while (targetXform.ParentUid.IsValid())
|
while (targetXform.ParentUid.IsValid())
|
||||||
|
|||||||
@@ -2,8 +2,7 @@ using Content.Shared.Armor; // DeltaV - Addition of HandHeldArmor
|
|||||||
using Content.Shared.Atmos;
|
using Content.Shared.Atmos;
|
||||||
using Content.Shared.Camera;
|
using Content.Shared.Camera;
|
||||||
using Content.Shared.Cuffs;
|
using Content.Shared.Cuffs;
|
||||||
using Content.Shared.Damage; // DeltaV End - Addition of HandHeldArmor
|
using Content.Shared.Damage.Systems; // DeltaV - Addition of HandHeldArmor
|
||||||
using Content.Shared.Damage.Systems; // DeltaV End - Addition of HandHeldArmor
|
|
||||||
using Content.Shared.Hands.Components;
|
using Content.Shared.Hands.Components;
|
||||||
using Content.Shared.Movement.Systems;
|
using Content.Shared.Movement.Systems;
|
||||||
using Content.Shared.Projectiles;
|
using Content.Shared.Projectiles;
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
|
using System.Numerics; // DeltaV
|
||||||
using Content.Shared.Examine;
|
using Content.Shared.Examine;
|
||||||
using Content.Shared.Humanoid.Prototypes;
|
using Content.Shared.Humanoid.Prototypes;
|
||||||
using Content.Shared.IdentityManagement;
|
using Content.Shared.IdentityManagement;
|
||||||
using Content.Shared.Preferences;
|
using Content.Shared.Preferences;
|
||||||
|
using Content.Shared.Sprite; // DeltaV
|
||||||
using Robust.Shared.GameObjects.Components.Localization;
|
using Robust.Shared.GameObjects.Components.Localization;
|
||||||
using Robust.Shared.Prototypes;
|
using Robust.Shared.Prototypes;
|
||||||
|
|
||||||
@@ -11,6 +13,7 @@ public sealed class HumanoidProfileSystem : EntitySystem
|
|||||||
{
|
{
|
||||||
[Dependency] private readonly IPrototypeManager _prototype = default!;
|
[Dependency] private readonly IPrototypeManager _prototype = default!;
|
||||||
[Dependency] private readonly GrammarSystem _grammar = default!;
|
[Dependency] private readonly GrammarSystem _grammar = default!;
|
||||||
|
[Dependency] private readonly SharedScaleVisualsSystem _scale = default!; // DeltaV
|
||||||
|
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
@@ -28,6 +31,7 @@ public sealed class HumanoidProfileSystem : EntitySystem
|
|||||||
ent.Comp.Age = profile.Age;
|
ent.Comp.Age = profile.Age;
|
||||||
ent.Comp.Species = profile.Species;
|
ent.Comp.Species = profile.Species;
|
||||||
ent.Comp.Sex = profile.Sex;
|
ent.Comp.Sex = profile.Sex;
|
||||||
|
ent.Comp.Height = profile.Height; // DeltaV
|
||||||
Dirty(ent);
|
Dirty(ent);
|
||||||
|
|
||||||
var sexChanged = new SexChangedEvent(ent.Comp.Sex, profile.Sex);
|
var sexChanged = new SexChangedEvent(ent.Comp.Sex, profile.Sex);
|
||||||
@@ -37,6 +41,15 @@ public sealed class HumanoidProfileSystem : EntitySystem
|
|||||||
{
|
{
|
||||||
_grammar.SetGender((ent, grammar), profile.Gender);
|
_grammar.SetGender((ent, grammar), profile.Gender);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// START DeltaV - Apply profile/species size
|
||||||
|
// Assume 1.0 scale unless the original scale exists (blame Allulalo)
|
||||||
|
var scale = Vector2.One;
|
||||||
|
if (TryComp<ScaleVisualsComponent>(ent, out var scaledVisuals) && scaledVisuals.OriginalScale is { } originalScale)
|
||||||
|
scale = originalScale;
|
||||||
|
|
||||||
|
_scale.SetSpriteScale(ent, scale);
|
||||||
|
// END DeltaV
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnExamined(Entity<HumanoidProfileComponent> ent, ref ExaminedEvent args)
|
private void OnExamined(Entity<HumanoidProfileComponent> ent, ref ExaminedEvent args)
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using System.Numerics; // DeltaV
|
||||||
using Content.Shared.Body;
|
using Content.Shared.Body;
|
||||||
using Content.Shared.Dataset;
|
using Content.Shared.Dataset;
|
||||||
using Content.Shared.Humanoid.Markings;
|
using Content.Shared.Humanoid.Markings;
|
||||||
@@ -111,7 +112,7 @@ public sealed partial class SpeciesPrototype : IPrototype
|
|||||||
/// The base height scale for this species
|
/// The base height scale for this species
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[DataField("baseScale")]
|
[DataField("baseScale")]
|
||||||
public System.Numerics.Vector2 BaseScale = new(1f, 1f);
|
public Vector2 BaseScale = new(1f, 1f);
|
||||||
// End DV - CD Character Records shouldn't nuke species heights
|
// End DV - CD Character Records shouldn't nuke species heights
|
||||||
|
|
||||||
// Begin CD - Character Records
|
// Begin CD - Character Records
|
||||||
@@ -119,13 +120,13 @@ public sealed partial class SpeciesPrototype : IPrototype
|
|||||||
/// The minimum height for this species
|
/// The minimum height for this species
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[DataField("minHeight")]
|
[DataField("minHeight")]
|
||||||
public float MinHeight = 0.9f; // DeltaV - less trolling with the heights
|
public float MinHeight = 0.8f; // DeltaV
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The maximum height for this species
|
/// The maximum height for this species
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[DataField("maxHeight")]
|
[DataField("maxHeight")]
|
||||||
public float MaxHeight = 1.1f; // DeltaV - less trolling with the heights
|
public float MaxHeight = 1.2f; // DeltaV
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The default height for this species
|
/// The default height for this species
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
using Content.Shared._DV.Overlays;
|
using Content.Shared._DV.Overlays; // DeltaV
|
||||||
using Content.Shared._DV.Psionics.Events; // DeltaV
|
using Content.Shared._DV.Psionics.Events; // DeltaV
|
||||||
using Content.Shared.Armor;
|
using Content.Shared.Armor;
|
||||||
using Content.Shared.Atmos;
|
using Content.Shared.Atmos;
|
||||||
@@ -85,13 +85,15 @@ public partial class InventorySystem
|
|||||||
SubscribeLocalEvent<InventoryComponent, WieldAttemptEvent>(RefRelayInventoryEvent);
|
SubscribeLocalEvent<InventoryComponent, WieldAttemptEvent>(RefRelayInventoryEvent);
|
||||||
SubscribeLocalEvent<InventoryComponent, UnwieldAttemptEvent>(RefRelayInventoryEvent);
|
SubscribeLocalEvent<InventoryComponent, UnwieldAttemptEvent>(RefRelayInventoryEvent);
|
||||||
SubscribeLocalEvent<InventoryComponent, IngestionAttemptEvent>(RefRelayInventoryEvent);
|
SubscribeLocalEvent<InventoryComponent, IngestionAttemptEvent>(RefRelayInventoryEvent);
|
||||||
// DeltaV Start - Psionic Events
|
// DeltaV Start
|
||||||
|
// Psionic Events
|
||||||
SubscribeLocalEvent<InventoryComponent, DispelledEvent>(RefRelayInventoryEvent);
|
SubscribeLocalEvent<InventoryComponent, DispelledEvent>(RefRelayInventoryEvent);
|
||||||
SubscribeLocalEvent<InventoryComponent, PsionicPowerUseAttemptEvent>(RefRelayInventoryEvent);
|
SubscribeLocalEvent<InventoryComponent, PsionicPowerUseAttemptEvent>(RefRelayInventoryEvent);
|
||||||
SubscribeLocalEvent<InventoryComponent, TargetedByPsionicPowerEvent>(RefRelayInventoryEvent);
|
SubscribeLocalEvent<InventoryComponent, TargetedByPsionicPowerEvent>(RefRelayInventoryEvent);
|
||||||
SubscribeLocalEvent<InventoryComponent, NoosphericFryEvent>(RefRelayInventoryEvent);
|
SubscribeLocalEvent<InventoryComponent, NoosphericFryEvent>(RefRelayInventoryEvent);
|
||||||
SubscribeLocalEvent<InventoryComponent, WeightlessnessChangedEvent>(RefRelayInventoryEvent); // Heavy Clothing
|
// Heavy Clothing
|
||||||
// DeltaV End - Psionic Events
|
SubscribeLocalEvent<InventoryComponent, WeightlessnessChangedEvent>(RefRelayInventoryEvent);
|
||||||
|
// DeltaV End
|
||||||
|
|
||||||
// Eye/vision events
|
// Eye/vision events
|
||||||
SubscribeLocalEvent<InventoryComponent, CanSeeAttemptEvent>(RelayInventoryEvent);
|
SubscribeLocalEvent<InventoryComponent, CanSeeAttemptEvent>(RelayInventoryEvent);
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using Content.Shared._DV.MedicalRecords; // DeltaV - Medical Records
|
using Content.Shared._DV.MedicalRecords; // DeltaV - Medical Records
|
||||||
|
using Content.Shared.Chemistry.Components; // DeltaV - Health Analyzer Plus
|
||||||
using Robust.Shared.Serialization;
|
using Robust.Shared.Serialization;
|
||||||
|
|
||||||
namespace Content.Shared.MedicalScanner;
|
namespace Content.Shared.MedicalScanner;
|
||||||
@@ -29,11 +30,12 @@ public struct HealthAnalyzerUiState
|
|||||||
public bool? ScanMode;
|
public bool? ScanMode;
|
||||||
public bool? Bleeding;
|
public bool? Bleeding;
|
||||||
public bool? Unrevivable;
|
public bool? Unrevivable;
|
||||||
|
public readonly Solution? BloodSolution; // DeltaV - Health Analyzer Plus
|
||||||
public MedicalRecord? MedicalRecord; // DeltaV - Medical Records
|
public MedicalRecord? MedicalRecord; // DeltaV - Medical Records
|
||||||
|
|
||||||
public HealthAnalyzerUiState() {}
|
public HealthAnalyzerUiState() {}
|
||||||
|
|
||||||
public HealthAnalyzerUiState(NetEntity? targetEntity, float temperature, float bloodLevel, bool? scanMode, bool? bleeding, bool? unrevivable, MedicalRecord? medicalRecord = null) // DeltaV - Medical Records
|
public HealthAnalyzerUiState(NetEntity? targetEntity, float temperature, float bloodLevel, bool? scanMode, bool? bleeding, bool? unrevivable, Solution? bloodSolution, MedicalRecord? medicalRecord = null) // DeltaV - Health Analyzer Plus, Medical Records
|
||||||
{
|
{
|
||||||
TargetEntity = targetEntity;
|
TargetEntity = targetEntity;
|
||||||
Temperature = temperature;
|
Temperature = temperature;
|
||||||
@@ -41,6 +43,7 @@ public struct HealthAnalyzerUiState
|
|||||||
ScanMode = scanMode;
|
ScanMode = scanMode;
|
||||||
Bleeding = bleeding;
|
Bleeding = bleeding;
|
||||||
Unrevivable = unrevivable;
|
Unrevivable = unrevivable;
|
||||||
|
BloodSolution = bloodSolution; // DeltaV - Health Analyzer Plus
|
||||||
MedicalRecord = medicalRecord; // DeltaV - Medical Records
|
MedicalRecord = medicalRecord; // DeltaV - Medical Records
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
using Content.Shared._DV.Body.Components; // DeltaV
|
||||||
|
using Content.Shared._DV.Body.Systems; // DeltaV
|
||||||
using Content.Shared._ST.Interaction; // Stellar - interaction particles
|
using Content.Shared._ST.Interaction; // Stellar - interaction particles
|
||||||
using Content.Shared._Floof.OfferItem; // Floof
|
using Content.Shared._Floof.OfferItem; // Floof
|
||||||
using Content.Shared.ActionBlocker;
|
using Content.Shared.ActionBlocker;
|
||||||
@@ -10,6 +12,7 @@ using Content.Shared.Database;
|
|||||||
using Content.Shared.Hands;
|
using Content.Shared.Hands;
|
||||||
using Content.Shared.Hands.Components;
|
using Content.Shared.Hands.Components;
|
||||||
using Content.Shared.Hands.EntitySystems;
|
using Content.Shared.Hands.EntitySystems;
|
||||||
|
using Content.Shared.Humanoid; // DeltaV
|
||||||
using Content.Shared.IdentityManagement;
|
using Content.Shared.IdentityManagement;
|
||||||
using Content.Shared.Input;
|
using Content.Shared.Input;
|
||||||
using Content.Shared.Interaction;
|
using Content.Shared.Interaction;
|
||||||
@@ -55,6 +58,7 @@ public sealed class PullingSystem : EntitySystem
|
|||||||
[Dependency] private readonly HeldSpeedModifierSystem _clothingMoveSpeed = default!;
|
[Dependency] private readonly HeldSpeedModifierSystem _clothingMoveSpeed = default!;
|
||||||
[Dependency] private readonly SharedPopupSystem _popup = default!;
|
[Dependency] private readonly SharedPopupSystem _popup = default!;
|
||||||
[Dependency] private readonly SharedVirtualItemSystem _virtual = default!;
|
[Dependency] private readonly SharedVirtualItemSystem _virtual = default!;
|
||||||
|
[Dependency] private readonly SmallCharacterSystem _smallCharacter = default!; // DeltaV
|
||||||
|
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
@@ -295,6 +299,14 @@ public sealed class PullingSystem : EntitySystem
|
|||||||
|
|
||||||
private void OnRefreshMovespeed(EntityUid uid, PullerComponent component, RefreshMovementSpeedModifiersEvent args)
|
private void OnRefreshMovespeed(EntityUid uid, PullerComponent component, RefreshMovementSpeedModifiersEvent args)
|
||||||
{
|
{
|
||||||
|
// BEGIN DeltaV - Slow if smaller puller
|
||||||
|
if (TryComp<SmallCharacterComponent>(uid, out var smol))
|
||||||
|
{
|
||||||
|
var sizePenalty = _smallCharacter.ApplyPullSpeedPenalty((uid, smol), component.Pulling);
|
||||||
|
args.ModifySpeed(sizePenalty, sizePenalty);
|
||||||
|
}
|
||||||
|
// END DeltaV
|
||||||
|
|
||||||
if (TryComp<HeldSpeedModifierComponent>(component.Pulling, out var heldMoveSpeed) && component.Pulling.HasValue)
|
if (TryComp<HeldSpeedModifierComponent>(component.Pulling, out var heldMoveSpeed) && component.Pulling.HasValue)
|
||||||
{
|
{
|
||||||
var (walkMod, sprintMod) =
|
var (walkMod, sprintMod) =
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ public sealed partial class ParcelWrappingSystem
|
|||||||
if (target == user)
|
if (target == user)
|
||||||
{
|
{
|
||||||
var selfMsg = Loc.GetString("parcel-wrap-popup-being-wrapped-self");
|
var selfMsg = Loc.GetString("parcel-wrap-popup-being-wrapped-self");
|
||||||
_popup.PopupClient(selfMsg, user, user);
|
_popup.PopupEntity(selfMsg, user, user);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -143,7 +143,7 @@ public sealed partial class ParcelWrappingSystem
|
|||||||
|
|
||||||
// Spawn the actual parcel entity.
|
// Spawn the actual parcel entity.
|
||||||
var targetTransform = Transform(target);
|
var targetTransform = Transform(target);
|
||||||
var spawned = Spawn(GetParcelPrototype(wrapper, target), targetTransform.Coordinates);
|
var spawned = SpawnAtPosition(GetParcelPrototype(wrapper, target), targetTransform.Coordinates);
|
||||||
_transform.SetLocalRotation(spawned, targetTransform.LocalRotation);
|
_transform.SetLocalRotation(spawned, targetTransform.LocalRotation);
|
||||||
|
|
||||||
// If the target is in a container, try to put the parcel in its place in the container.
|
// If the target is in a container, try to put the parcel in its place in the container.
|
||||||
|
|||||||
@@ -177,7 +177,7 @@ namespace Content.Shared.Preferences
|
|||||||
_traitPreferences = traitPreferences;
|
_traitPreferences = traitPreferences;
|
||||||
_loadouts = loadouts;
|
_loadouts = loadouts;
|
||||||
// Begin CD - Character Records
|
// Begin CD - Character Records
|
||||||
Height = height;
|
Height = height; // This is the user-set scale on the profile editor. Not actual height measurements.
|
||||||
CDCharacterRecords = cdCharacterRecords;
|
CDCharacterRecords = cdCharacterRecords;
|
||||||
// End CD - Character Records
|
// End CD - Character Records
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using Content.Shared.Access.Components;
|
using Content.Shared.Access.Components;
|
||||||
|
using Content.Shared.Access.Systems; // DeltaV
|
||||||
using Content.Shared.Administration.Logs;
|
using Content.Shared.Administration.Logs;
|
||||||
using Content.Shared.Database;
|
using Content.Shared.Database;
|
||||||
using Content.Shared.Doors.Components;
|
using Content.Shared.Doors.Components;
|
||||||
@@ -19,6 +20,7 @@ namespace Content.Shared.Remotes.EntitySystems;
|
|||||||
public abstract class SharedDoorRemoteSystem : EntitySystem
|
public abstract class SharedDoorRemoteSystem : EntitySystem
|
||||||
{
|
{
|
||||||
[Dependency] private readonly SharedAirlockSystem _airlock = default!;
|
[Dependency] private readonly SharedAirlockSystem _airlock = default!;
|
||||||
|
[Dependency] private readonly AccessReaderSystem _accessReader = default!; // DeltaV
|
||||||
[Dependency] private readonly SharedAudioSystem _audio = default!;
|
[Dependency] private readonly SharedAudioSystem _audio = default!;
|
||||||
[Dependency] private readonly SharedDoorSystem _doorSystem = default!;
|
[Dependency] private readonly SharedDoorSystem _doorSystem = default!;
|
||||||
[Dependency] private readonly SharedElectrocutionSystem _electrify = default!;
|
[Dependency] private readonly SharedElectrocutionSystem _electrify = default!;
|
||||||
@@ -96,6 +98,19 @@ public abstract class SharedDoorRemoteSystem : EntitySystem
|
|||||||
else if (entity.Comp.RequireTagWhitelist)
|
else if (entity.Comp.RequireTagWhitelist)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// Begin DeltaV - Emergency access only bypasses open/close; bolting and toggling emergency access still require actual access.
|
||||||
|
if (entity.Comp.Mode != OperatingMode.OpenClose
|
||||||
|
&& accessComponent != null
|
||||||
|
&& !_accessReader.IsAllowed(accessTarget, args.Target.Value, accessComponent))
|
||||||
|
{
|
||||||
|
if (isAirlock)
|
||||||
|
_doorSystem.Deny(args.Target.Value, doorComp, user: args.User, predicted: true);
|
||||||
|
|
||||||
|
_popup.PopupClient(Loc.GetString("door-remote-denied"), args.User, args.User);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// End DeltaV
|
||||||
|
|
||||||
switch (entity.Comp.Mode)
|
switch (entity.Comp.Mode)
|
||||||
{
|
{
|
||||||
case OperatingMode.OpenClose:
|
case OperatingMode.OpenClose:
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
using Content.Shared._CD.Silicons.Borgs; // CosmicDrift - borg subtypes
|
|
||||||
using Content.Shared.Actions;
|
using Content.Shared.Actions;
|
||||||
using Content.Shared.Interaction;
|
using Content.Shared.Interaction;
|
||||||
using Content.Shared.Interaction.Components;
|
using Content.Shared.Interaction.Components;
|
||||||
@@ -97,10 +96,6 @@ public abstract partial class SharedBorgSwitchableTypeSystem : EntitySystem // D
|
|||||||
_userInterface.CloseUi((ent.Owner, null), BorgSwitchableTypeUiKey.SelectBorgType);
|
_userInterface.CloseUi((ent.Owner, null), BorgSwitchableTypeUiKey.SelectBorgType);
|
||||||
|
|
||||||
UpdateEntityAppearance(ent);
|
UpdateEntityAppearance(ent);
|
||||||
|
|
||||||
// AL - event for subtype system, always runs at end of borg type code
|
|
||||||
var ev = new AfterBorgTypeSelectEvent();
|
|
||||||
RaiseLocalEvent(ent, ref ev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void UpdateEntityAppearance(Entity<BorgSwitchableTypeComponent> entity)
|
protected void UpdateEntityAppearance(Entity<BorgSwitchableTypeComponent> entity)
|
||||||
@@ -125,25 +120,24 @@ public abstract partial class SharedBorgSwitchableTypeSystem : EntitySystem // D
|
|||||||
{
|
{
|
||||||
footstepModifier.FootstepSoundCollection = prototype.FootstepCollection;
|
footstepModifier.FootstepSoundCollection = prototype.FootstepCollection;
|
||||||
}
|
}
|
||||||
// Start CosmicDrift Changes - Moved to BorgSwitchableTypeSystem.cs
|
|
||||||
// if (prototype.SpriteBodyMovementState is { } movementState)
|
if (prototype.SpriteBodyMovementState is { } movementState)
|
||||||
// {
|
{
|
||||||
// var spriteMovement = EnsureComp<SpriteMovementComponent>(entity);
|
var spriteMovement = EnsureComp<SpriteMovementComponent>(entity);
|
||||||
// spriteMovement.NoMovementLayers.Clear();
|
spriteMovement.NoMovementLayers.Clear();
|
||||||
// spriteMovement.NoMovementLayers["movement"] = new PrototypeLayerData
|
spriteMovement.NoMovementLayers["movement"] = new PrototypeLayerData
|
||||||
// {
|
{
|
||||||
// State = prototype.SpriteBodyState,
|
State = prototype.SpriteBodyState,
|
||||||
// };
|
};
|
||||||
// spriteMovement.MovementLayers.Clear();
|
spriteMovement.MovementLayers.Clear();
|
||||||
// spriteMovement.MovementLayers["movement"] = new PrototypeLayerData
|
spriteMovement.MovementLayers["movement"] = new PrototypeLayerData
|
||||||
// {
|
{
|
||||||
// State = movementState,
|
State = movementState,
|
||||||
// };
|
};
|
||||||
// }
|
}
|
||||||
// else
|
else
|
||||||
// {
|
{
|
||||||
// RemComp<SpriteMovementComponent>(entity);
|
RemComp<SpriteMovementComponent>(entity);
|
||||||
// }
|
}
|
||||||
// End CosmicDrift Changes - Moved to BorgSwitchableTypeSystem.cs
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,11 +25,27 @@ public sealed partial class ScaleVisualsComponent : Component
|
|||||||
[ViewVariables]
|
[ViewVariables]
|
||||||
public Vector2? OriginalScale;
|
public Vector2? OriginalScale;
|
||||||
|
|
||||||
// Delta V Addition
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Base Scale of the Species, which we use to set a new height relative to this.
|
/// DeltaV - Contains the species scale. Set dynamically by
|
||||||
|
/// baseScale in the Species prototype.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[DataField, AutoNetworkedField]
|
[DataField, AutoNetworkedField]
|
||||||
[ViewVariables]
|
[ViewVariables]
|
||||||
public Vector2 SpeciesScale = Vector2.One;
|
public Vector2 SpeciesScale = new(1f, 1f);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// DeltaV - Contains the user-defined scale from the character creation
|
||||||
|
/// screen.
|
||||||
|
/// </summary>
|
||||||
|
[DataField, AutoNetworkedField]
|
||||||
|
[ViewVariables]
|
||||||
|
public Vector2 ProfileScale = new(1f, 1f);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// DeltaV - Contains the computer scale from applying Scale, SpeciesScale, and ProfileScale.
|
||||||
|
/// This will contain the actual scale after all modifiers are applied.
|
||||||
|
/// </summary>
|
||||||
|
[DataField, AutoNetworkedField]
|
||||||
|
[ViewVariables]
|
||||||
|
public Vector2 ComputedScale;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
using System.Numerics;
|
using System.Numerics;
|
||||||
|
using Content.Shared.Humanoid; // DeltaV
|
||||||
|
using Robust.Shared.Prototypes; // DeltaV
|
||||||
using Robust.Shared.Serialization;
|
using Robust.Shared.Serialization;
|
||||||
|
|
||||||
namespace Content.Shared.Sprite;
|
namespace Content.Shared.Sprite;
|
||||||
@@ -6,6 +8,7 @@ namespace Content.Shared.Sprite;
|
|||||||
public abstract class SharedScaleVisualsSystem : EntitySystem
|
public abstract class SharedScaleVisualsSystem : EntitySystem
|
||||||
{
|
{
|
||||||
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
|
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
|
||||||
|
[Dependency] private readonly IPrototypeManager _proto = default!; // DeltaV
|
||||||
|
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
@@ -39,15 +42,28 @@ public abstract class SharedScaleVisualsSystem : EntitySystem
|
|||||||
{
|
{
|
||||||
var comp = EnsureComp<ScaleVisualsComponent>(uid);
|
var comp = EnsureComp<ScaleVisualsComponent>(uid);
|
||||||
comp.Scale = scale;
|
comp.Scale = scale;
|
||||||
|
|
||||||
|
// BEGIN DeltaV - Apply species and profile height
|
||||||
|
// We have to ensure this is idempotent so that if it gets applied more than once
|
||||||
|
// the sprite size at the end is the same.
|
||||||
|
if (TryComp<HumanoidProfileComponent>(uid, out var profile))
|
||||||
|
{
|
||||||
|
var speciesProto = _proto.Index(profile.Species);
|
||||||
|
comp.SpeciesScale = speciesProto.BaseScale;
|
||||||
|
scale *= comp.SpeciesScale; // Apply both species scale and character-defined height
|
||||||
|
|
||||||
|
Vector2 profileHeight = new(profile.Height, profile.Height);
|
||||||
|
comp.ProfileScale = profileHeight;
|
||||||
|
scale *= comp.ProfileScale;
|
||||||
|
}
|
||||||
|
|
||||||
|
comp.ComputedScale = scale; // Nice to know what the computed size is in case of bugs
|
||||||
|
// END DeltaV
|
||||||
|
|
||||||
Dirty(uid, comp);
|
Dirty(uid, comp);
|
||||||
|
|
||||||
// Delta V - Begin Species Scaling
|
|
||||||
// 120% species scale => add 0.2 to scale
|
|
||||||
var newScale = scale + comp.SpeciesScale - Vector2.One;
|
|
||||||
// Delta V - End Species Scaling
|
|
||||||
|
|
||||||
var appearanceComponent = EnsureComp<AppearanceComponent>(uid);
|
var appearanceComponent = EnsureComp<AppearanceComponent>(uid);
|
||||||
_appearance.SetData(uid, ScaleVisuals.Scale, newScale /* Delta V - Custom Species Scale */, appearanceComponent);
|
_appearance.SetData(uid, ScaleVisuals.Scale, scale, appearanceComponent);
|
||||||
|
|
||||||
// Raise an event for content use.
|
// Raise an event for content use.
|
||||||
var ev = new ScaleEntityEvent(uid, scale);
|
var ev = new ScaleEntityEvent(uid, scale);
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
using Content.Shared.Examine;
|
using Content.Shared.Examine;
|
||||||
using Content.Shared.Mobs;
|
using Content.Shared.Mobs;
|
||||||
using Content.Shared.Mobs.Systems;
|
|
||||||
using Content.Shared.Stealth.Components;
|
using Content.Shared.Stealth.Components;
|
||||||
using Robust.Shared.GameStates;
|
using Robust.Shared.GameStates;
|
||||||
using Robust.Shared.Timing;
|
using Robust.Shared.Timing;
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
using Content.Shared.Prototypes;
|
|
||||||
using Robust.Shared.Prototypes;
|
|
||||||
|
|
||||||
namespace Content.Shared._CD.Prototypes;
|
|
||||||
|
|
||||||
public sealed class ALPrototypeSystem : EntitySystem
|
|
||||||
{
|
|
||||||
[Dependency] private readonly IComponentFactory _compFactory = default!;
|
|
||||||
[Dependency] private readonly IPrototypeManager _prototype = default!;
|
|
||||||
|
|
||||||
public IEnumerable<(EntityPrototype Prototype, T Component)> EnumerateComponents<T>() where T : IComponent, new()
|
|
||||||
{
|
|
||||||
foreach (var entity in _prototype.EnumeratePrototypes<EntityPrototype>())
|
|
||||||
{
|
|
||||||
if (entity.TryGetComponent(out T? comp, _compFactory))
|
|
||||||
yield return (entity, comp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public IEnumerable<EntityPrototype> EnumerateEntities<T>() where T : IComponent, new()
|
|
||||||
{
|
|
||||||
foreach (var entity in _prototype.EnumeratePrototypes<EntityPrototype>())
|
|
||||||
{
|
|
||||||
if (entity.HasComponent<T>(_compFactory))
|
|
||||||
yield return entity;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
using System.Numerics;
|
|
||||||
using Content.Shared.Inventory;
|
|
||||||
using Content.Shared.Silicons.Borgs;
|
|
||||||
using Content.Shared.Silicons.Borgs.Components;
|
|
||||||
using Robust.Shared.Audio;
|
|
||||||
using Robust.Shared.GameStates;
|
|
||||||
using Robust.Shared.Prototypes;
|
|
||||||
using Robust.Shared.Utility;
|
|
||||||
|
|
||||||
namespace Content.Shared._CD.Silicons.Borgs;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Information relating to a borg's subtype. Should be mostly cosmetic.
|
|
||||||
/// </summary>
|
|
||||||
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
|
|
||||||
[EntityCategory("BorgSubtype")]
|
|
||||||
public sealed partial class BorgSubtypeDefinitionComponent : Component
|
|
||||||
{
|
|
||||||
private static ProtoId<SoundCollectionPrototype> DefaultFootsteps = new("FootstepBorg"); // DeltaV - Removed Readonly
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// <inheritdoc cref="BorgTypePrototype.InventoryTemplateId"/>
|
|
||||||
/// </summary>
|
|
||||||
[DataField, AutoNetworkedField] public ProtoId<InventoryTemplatePrototype> InventoryTemplateId = "borgShort";
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The parent borg type of this subtype.
|
|
||||||
/// </summary>
|
|
||||||
[DataField(required: true), AutoNetworkedField]
|
|
||||||
public string ParentType;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// <inheritdoc cref="BorgTypePrototype.AddComponents"/>
|
|
||||||
/// </summary>
|
|
||||||
[DataField] public ComponentRegistry? AddComponents;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Sprite path that the prototype's layer data will reference.
|
|
||||||
/// </summary>
|
|
||||||
[DataField, AutoNetworkedField] public ResPath? SpritePath;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The visual layer data for the subtype.
|
|
||||||
/// At the minimum should have definitions for each value of <see cref="BorgVisualLayers"/>.
|
|
||||||
/// </summary>
|
|
||||||
[DataField(required: true), AutoNetworkedField]
|
|
||||||
public PrototypeLayerData[] LayerData;
|
|
||||||
|
|
||||||
|
|
||||||
[DataField(required: true), AutoNetworkedField]
|
|
||||||
public string SpriteHasMindState;
|
|
||||||
|
|
||||||
[DataField(required: true), AutoNetworkedField]
|
|
||||||
public string SpriteNoMindState;
|
|
||||||
|
|
||||||
[DataField, AutoNetworkedField] public string? SpriteBodyState;
|
|
||||||
|
|
||||||
[DataField, AutoNetworkedField] public Vector2? Offset;
|
|
||||||
|
|
||||||
[DataField(required: true), AutoNetworkedField]
|
|
||||||
public EntProtoId DummyPrototype;
|
|
||||||
|
|
||||||
[DataField, AutoNetworkedField] public string PetSuccessString = "petting-success-generic-cyborg";
|
|
||||||
[DataField, AutoNetworkedField] public string PetFailureString = "petting-failure-generic-cyborg";
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Sound specifier for footstep sounds created by this subtype.
|
|
||||||
/// </summary>
|
|
||||||
[DataField, AutoNetworkedField]
|
|
||||||
public SoundSpecifier FootstepCollection { get; set; } = new SoundCollectionSpecifier(DefaultFootsteps);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// <inheritdoc cref="BorgTypePrototype.SpriteBodyMovementState"/>
|
|
||||||
/// </summary>
|
|
||||||
[DataField, AutoNetworkedField]
|
|
||||||
public string? SpriteBodyMovementState { get; set; }
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
using Robust.Shared.GameStates;
|
|
||||||
using Robust.Shared.Prototypes;
|
|
||||||
|
|
||||||
namespace Content.Shared._CD.Silicons.Borgs;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Component given to borgs that should be able to select subtypes inside of the borg type selection menu.
|
|
||||||
/// </summary>
|
|
||||||
[RegisterComponent, NetworkedComponent]
|
|
||||||
[AutoGenerateComponentState(true)]
|
|
||||||
public sealed partial class BorgSwitchableSubtypeComponent : Component
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// The <see cref="BorgSubtypeDefinitionComponent"/> of this chassis.
|
|
||||||
/// </summary>
|
|
||||||
[DataField, AutoNetworkedField]
|
|
||||||
public ProtoId<EntityPrototype>? BorgSubtype;
|
|
||||||
}
|
|
||||||
@@ -1,100 +0,0 @@
|
|||||||
using Content.Shared.Interaction;
|
|
||||||
using Content.Shared.Interaction.Components;
|
|
||||||
using Content.Shared.Movement.Components;
|
|
||||||
using Content.Shared.Silicons.Borgs;
|
|
||||||
using Content.Shared.Silicons.Borgs.Components;
|
|
||||||
using Robust.Shared.Prototypes;
|
|
||||||
|
|
||||||
namespace Content.Shared._CD.Silicons.Borgs;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Shared behaviour for borg switchable subtype logic.
|
|
||||||
/// Essentially a reimplementation of <see cref="SharedBorgSwitchableTypeSystem"/> specifically for cosmetic functions.
|
|
||||||
/// </summary>
|
|
||||||
public abstract class SharedBorgSwitchableSubtypeSystem : EntitySystem
|
|
||||||
{
|
|
||||||
[Dependency] private readonly InteractionPopupSystem _interactionPopup = default!;
|
|
||||||
[Dependency] protected readonly IPrototypeManager Prototypes = default!;
|
|
||||||
[Dependency] protected readonly IComponentFactory ComponentFactory = default!;
|
|
||||||
|
|
||||||
public override void Initialize()
|
|
||||||
{
|
|
||||||
SubscribeLocalEvent<BorgSwitchableSubtypeComponent, MapInitEvent>(OnMapInit); // make sure that our subtype is selected first
|
|
||||||
SubscribeLocalEvent<BorgSwitchableSubtypeComponent, AfterBorgTypeSelectEvent>(OnBorgTypeSelect);
|
|
||||||
SubscribeLocalEvent<BorgSwitchableSubtypeComponent, TypeTryingToUpdateVisualsEvent>(OnBorgTypeUpdatingVisuals);
|
|
||||||
|
|
||||||
Subs.BuiEvents<BorgSwitchableTypeComponent>(BorgSwitchableTypeUiKey.SelectBorgType,
|
|
||||||
sub =>
|
|
||||||
{
|
|
||||||
sub.Event<BorgSelectSubtypeMessage>(SelectSubtypeMessageHandler);
|
|
||||||
});
|
|
||||||
|
|
||||||
base.Initialize();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnBorgTypeUpdatingVisuals(Entity<BorgSwitchableSubtypeComponent> ent, ref TypeTryingToUpdateVisualsEvent args)
|
|
||||||
{
|
|
||||||
if (!ent.Comp.BorgSubtype.HasValue)
|
|
||||||
return;
|
|
||||||
|
|
||||||
Dirty(ent);
|
|
||||||
SelectBorgSubtype(ent);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnMapInit(Entity<BorgSwitchableSubtypeComponent> ent, ref MapInitEvent args)
|
|
||||||
{
|
|
||||||
if (ent.Comp.BorgSubtype != null)
|
|
||||||
{
|
|
||||||
SelectBorgSubtype(ent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnBorgTypeSelect(Entity<BorgSwitchableSubtypeComponent> ent, ref AfterBorgTypeSelectEvent args)
|
|
||||||
{
|
|
||||||
if (!ent.Comp.BorgSubtype.HasValue)
|
|
||||||
return;
|
|
||||||
|
|
||||||
UpdateEntityAppearance(ent);
|
|
||||||
Dirty(ent);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected virtual void SelectBorgSubtype(Entity<BorgSwitchableSubtypeComponent> ent)
|
|
||||||
{
|
|
||||||
UpdateEntityAppearance(ent);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void UpdateEntityAppearance(Entity<BorgSwitchableSubtypeComponent> entity)
|
|
||||||
{
|
|
||||||
if (!Prototypes.TryIndex(entity.Comp.BorgSubtype, out var subtypePrototype))
|
|
||||||
return;
|
|
||||||
|
|
||||||
UpdateEntityAppearance(entity, subtypePrototype);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected virtual void UpdateEntityAppearance(Entity<BorgSwitchableSubtypeComponent> entity,
|
|
||||||
EntityPrototype borgSubtypePrototype)
|
|
||||||
{
|
|
||||||
if (!borgSubtypePrototype.TryGetComponent<BorgSubtypeDefinitionComponent>(out var borgSubtype, ComponentFactory))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (TryComp(entity, out InteractionPopupComponent? popup))
|
|
||||||
{
|
|
||||||
_interactionPopup.SetInteractSuccessString((entity.Owner, popup), borgSubtype.PetSuccessString);
|
|
||||||
_interactionPopup.SetInteractFailureString((entity.Owner, popup), borgSubtype.PetFailureString);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (TryComp(entity, out FootstepModifierComponent? footstepModifier))
|
|
||||||
{
|
|
||||||
footstepModifier.FootstepSoundCollection = borgSubtype.FootstepCollection;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SelectSubtypeMessageHandler(EntityUid uid, BorgSwitchableTypeComponent borgSwitchableTypeComponent, BorgSelectSubtypeMessage args)
|
|
||||||
{
|
|
||||||
if (!TryComp<BorgSwitchableSubtypeComponent>(uid, out var subtypeComp))
|
|
||||||
return;
|
|
||||||
|
|
||||||
subtypeComp.BorgSubtype = args.Subtype;
|
|
||||||
Dirty(uid, subtypeComp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
using Robust.Shared.Prototypes;
|
|
||||||
using Robust.Shared.Serialization;
|
|
||||||
|
|
||||||
namespace Content.Shared._CD.Silicons.Borgs;
|
|
||||||
|
|
||||||
[Serializable, NetSerializable]
|
|
||||||
public sealed class BorgSelectSubtypeMessage(ProtoId<EntityPrototype>? subtype) : BoundUserInterfaceMessage
|
|
||||||
{
|
|
||||||
public ProtoId<EntityPrototype>? Subtype = subtype;
|
|
||||||
}
|
|
||||||
|
|
||||||
[ByRefEvent]
|
|
||||||
public record struct AfterBorgTypeSelectEvent;
|
|
||||||
|
|
||||||
[ByRefEvent]
|
|
||||||
public record struct TypeTryingToUpdateVisualsEvent;
|
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
using Robust.Shared.GameStates;
|
||||||
|
|
||||||
|
namespace Content.Shared._DV.Administration.Components;
|
||||||
|
|
||||||
|
/// This component prevents an entity from being followed by ghosts.
|
||||||
|
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
|
||||||
|
public sealed partial class UnorbitableComponent : Component
|
||||||
|
{
|
||||||
|
/// Whether to allow adminned players to follow the entity.
|
||||||
|
[DataField, AutoNetworkedField]
|
||||||
|
public bool AllowAdmins = false;
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
using Content.Shared._DV.Administration.Components;
|
||||||
|
using Content.Shared.Administration.Managers;
|
||||||
|
using Content.Shared.Follower;
|
||||||
|
using Content.Shared.Follower.Components;
|
||||||
|
|
||||||
|
namespace Content.Shared._DV.Administration.EntitySystems;
|
||||||
|
|
||||||
|
public sealed class UnorbitableSystem : EntitySystem
|
||||||
|
{
|
||||||
|
[Dependency] private readonly FollowerSystem _followerSystem = default!;
|
||||||
|
[Dependency] private readonly ISharedAdminManager _admin = default!;
|
||||||
|
|
||||||
|
public override void Initialize()
|
||||||
|
{
|
||||||
|
base.Initialize();
|
||||||
|
SubscribeLocalEvent<UnorbitableComponent, ComponentInit>(OnInit);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnInit(Entity<UnorbitableComponent> ent, ref ComponentInit args)
|
||||||
|
{
|
||||||
|
if (!HasComp<FollowedComponent>(ent))
|
||||||
|
return;
|
||||||
|
|
||||||
|
_followerSystem.StopAllFollowers(ent);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool CanFollow(EntityUid follower, EntityUid target)
|
||||||
|
{
|
||||||
|
if (TryComp<UnorbitableComponent>(target, out var unorbitable))
|
||||||
|
{
|
||||||
|
return unorbitable.AllowAdmins && _admin.IsAdmin(follower);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
using Content.Shared._DV.Body.Systems;
|
||||||
|
using Robust.Shared.GameStates;
|
||||||
|
|
||||||
|
namespace Content.Shared._DV.Body.Components;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// If an entity has this, if a small character has penalties (such as pull speed),
|
||||||
|
/// the small character will ignore the penalties associated with their size.
|
||||||
|
///
|
||||||
|
/// Mostly used for things like wheeled/floating objects.
|
||||||
|
/// </summary>
|
||||||
|
[RegisterComponent, NetworkedComponent]
|
||||||
|
[AutoGenerateComponentState]
|
||||||
|
[Access(typeof(SmallCharacterSystem))]
|
||||||
|
public sealed partial class SmallCharacterComponent : Component
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The speed of which to scale the small character's pull speed by if the
|
||||||
|
/// object is big enough to warrant a pull-speed slowdown.
|
||||||
|
/// </summary>
|
||||||
|
[DataField, AutoNetworkedField]
|
||||||
|
public float PullSpeedPenalty = 1f;
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
namespace Content.Shared._DV.Body.Components;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// If an entity has this, if a small character has penalties (such as pull speed),
|
||||||
|
/// the small character will ignore the penalties associated with their size.
|
||||||
|
///
|
||||||
|
/// Mostly used for things like wheeled/floating objects.
|
||||||
|
///
|
||||||
|
/// See <see cref="Systems.SmallCharacterSystem"/>
|
||||||
|
/// </summary>
|
||||||
|
[RegisterComponent]
|
||||||
|
public sealed partial class UnaffectedBySizePenaltyComponent : Component;
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
using Content.Shared._DV.Body.Components;
|
using Content.Shared._DV.Body.Components;
|
||||||
using Content.Shared._DV.Body.Events;
|
using Content.Shared._DV.Body.Events;
|
||||||
|
using Content.Shared.Buckle;
|
||||||
using Content.Shared.DoAfter;
|
using Content.Shared.DoAfter;
|
||||||
using Content.Shared.Mobs.Components;
|
using Content.Shared.Mobs.Components;
|
||||||
using Content.Shared.Mobs.Systems;
|
using Content.Shared.Mobs.Systems;
|
||||||
@@ -13,6 +14,7 @@ public sealed class CPRSystem : EntitySystem
|
|||||||
[Dependency] private readonly MobStateSystem _mobStateSystem = default!;
|
[Dependency] private readonly MobStateSystem _mobStateSystem = default!;
|
||||||
[Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!;
|
[Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!;
|
||||||
[Dependency] private readonly SharedPopupSystem _popupSystem = default!;
|
[Dependency] private readonly SharedPopupSystem _popupSystem = default!;
|
||||||
|
[Dependency] private readonly SharedBuckleSystem _buckle = default!;
|
||||||
|
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
@@ -85,7 +87,7 @@ public sealed class CPRSystem : EntitySystem
|
|||||||
{
|
{
|
||||||
Act = () => StartCPR(user, target, cprComp.TimeLength),
|
Act = () => StartCPR(user, target, cprComp.TimeLength),
|
||||||
Text = Loc.GetString("cpr-verb-start"),
|
Text = Loc.GetString("cpr-verb-start"),
|
||||||
Priority = 2,
|
Priority = _buckle.IsBuckled(target) ? 3 : 1, // Higher priority if they are buckled. Otherwise, this conflicts with trying to carry.
|
||||||
Disabled = alreadyAffected,
|
Disabled = alreadyAffected,
|
||||||
Message = alreadyAffected ? Loc.GetString("cpr-verb-disabled-description") : Loc.GetString("cpr-verb-description"),
|
Message = alreadyAffected ? Loc.GetString("cpr-verb-disabled-description") : Loc.GetString("cpr-verb-description"),
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -0,0 +1,97 @@
|
|||||||
|
using Content.Shared._DV.Body.Components;
|
||||||
|
using Content.Shared.GameTicking;
|
||||||
|
using Content.Shared.Humanoid;
|
||||||
|
using Content.Shared.Item;
|
||||||
|
using JetBrains.Annotations;
|
||||||
|
using Robust.Shared.Physics.Components;
|
||||||
|
|
||||||
|
namespace Content.Shared._DV.Body.Systems;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Used to relay or subscribe to events if a character's scale is 1.0 or below.
|
||||||
|
/// This is only used for the height slider scale.
|
||||||
|
/// </summary>
|
||||||
|
public sealed partial class SmallCharacterSystem : EntitySystem
|
||||||
|
{
|
||||||
|
private const float NO_PENALTY = 1.0f;
|
||||||
|
public override void Initialize()
|
||||||
|
{
|
||||||
|
base.Initialize();
|
||||||
|
SubscribeLocalEvent<PlayerSpawnCompleteEvent>(OnSpawn);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnSpawn(PlayerSpawnCompleteEvent ev)
|
||||||
|
{
|
||||||
|
if (TryComp<HumanoidProfileComponent>(ev.Mob, out var profile))
|
||||||
|
ApplySmallCharacter(ev.Mob, profile.Height);
|
||||||
|
}
|
||||||
|
|
||||||
|
[PublicAPI]
|
||||||
|
public float ApplyPullSpeedPenalty(Entity<SmallCharacterComponent?> puller, EntityUid? pulledEntity)
|
||||||
|
{
|
||||||
|
// Ignore if they aren't pulling anything...
|
||||||
|
if (!pulledEntity.HasValue)
|
||||||
|
return NO_PENALTY;
|
||||||
|
|
||||||
|
// Ignore if they aren't a small character in the first place
|
||||||
|
if (!Resolve(puller, ref puller.Comp, false))
|
||||||
|
return NO_PENALTY;
|
||||||
|
|
||||||
|
// If the pulled entity has the component that ignores the penalty
|
||||||
|
if (HasComp<UnaffectedBySizePenaltyComponent>(pulledEntity))
|
||||||
|
return NO_PENALTY;
|
||||||
|
|
||||||
|
// Ignore if it's an item that can be held or stored. It would be weird to
|
||||||
|
// slow by X% from pulling a piece of paper or a gun when you can just hold it
|
||||||
|
// and not suffer from a penalty.
|
||||||
|
if (HasComp<ItemComponent>(pulledEntity))
|
||||||
|
return NO_PENALTY;
|
||||||
|
|
||||||
|
// Ignore if the object is floating in the air.
|
||||||
|
if (TryComp<PhysicsComponent>(pulledEntity, out var pulledPhysics)
|
||||||
|
&& pulledPhysics.BodyStatus == BodyStatus.InAir)
|
||||||
|
return NO_PENALTY;
|
||||||
|
|
||||||
|
return puller.Comp.PullSpeedPenalty;
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Static Members
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the move-speed penalty as a float. Should be applied multiplicatively.
|
||||||
|
/// Caps at 1 so we don't make bigger characters faster when pulling.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[PublicAPI]
|
||||||
|
public static float GetPullSpeedPenaltyFromScale(float scale = 1.0f)
|
||||||
|
{
|
||||||
|
return Math.Min(scale * scale, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Calculates a well-formed display string of the pull speed penalty.
|
||||||
|
/// Used primarily in the character editor to get the well-formed percent
|
||||||
|
/// without having to duplicate formulas.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="scale"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[PublicAPI]
|
||||||
|
public static string GetPullSpeedPenaltyDisplayFromScale(float scale = 1.0f)
|
||||||
|
{
|
||||||
|
return $"{Math.Round((1 - GetPullSpeedPenaltyFromScale(scale)) * 100)}%";
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Private Members
|
||||||
|
private void ApplySmallCharacter(EntityUid uid, float scale = 1)
|
||||||
|
{
|
||||||
|
if (scale >= 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// The character scale is stored in the HumanoidProfileComponent if you ever
|
||||||
|
// need it.
|
||||||
|
var comp = EnsureComp<SmallCharacterComponent>(uid);
|
||||||
|
comp.PullSpeedPenalty = GetPullSpeedPenaltyFromScale(scale);
|
||||||
|
Dirty(uid, comp);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
@@ -30,6 +30,7 @@ using System.Numerics;
|
|||||||
using Content.Shared._DV.Polymorph;
|
using Content.Shared._DV.Polymorph;
|
||||||
using Content.Shared._Floof.OfferItem;
|
using Content.Shared._Floof.OfferItem;
|
||||||
using Content.Shared.Hands.EntitySystems;
|
using Content.Shared.Hands.EntitySystems;
|
||||||
|
using Content.Shared.Buckle;
|
||||||
|
|
||||||
namespace Content.Shared._DV.Carrying;
|
namespace Content.Shared._DV.Carrying;
|
||||||
|
|
||||||
@@ -70,7 +71,7 @@ public sealed class CarryingSystem : EntitySystem
|
|||||||
SubscribeLocalEvent<BeingCarriedComponent, GettingInteractedWithAttemptEvent>(OnInteractedWith);
|
SubscribeLocalEvent<BeingCarriedComponent, GettingInteractedWithAttemptEvent>(OnInteractedWith);
|
||||||
SubscribeLocalEvent<BeingCarriedComponent, PullAttemptEvent>(OnPullAttempt);
|
SubscribeLocalEvent<BeingCarriedComponent, PullAttemptEvent>(OnPullAttempt);
|
||||||
SubscribeLocalEvent<BeingCarriedComponent, StartClimbEvent>(OnDrop);
|
SubscribeLocalEvent<BeingCarriedComponent, StartClimbEvent>(OnDrop);
|
||||||
SubscribeLocalEvent<BeingCarriedComponent, BuckledEvent>(OnDrop);
|
SubscribeLocalEvent<BeingCarriedComponent, BuckledEvent>(OnBuckle);
|
||||||
SubscribeLocalEvent<BeingCarriedComponent, UnbuckledEvent>(OnDrop);
|
SubscribeLocalEvent<BeingCarriedComponent, UnbuckledEvent>(OnDrop);
|
||||||
SubscribeLocalEvent<BeingCarriedComponent, StrappedEvent>(OnDrop);
|
SubscribeLocalEvent<BeingCarriedComponent, StrappedEvent>(OnDrop);
|
||||||
SubscribeLocalEvent<BeingCarriedComponent, UnstrappedEvent>(OnDrop);
|
SubscribeLocalEvent<BeingCarriedComponent, UnstrappedEvent>(OnDrop);
|
||||||
@@ -220,6 +221,13 @@ public sealed class CarryingSystem : EntitySystem
|
|||||||
DropCarried(ent.Comp.Carrier, ent);
|
DropCarried(ent.Comp.Carrier, ent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnBuckle(Entity<BeingCarriedComponent> ent, ref BuckledEvent args)
|
||||||
|
{
|
||||||
|
// Buckling to a bed already handles the reparenting to the entity that the carried
|
||||||
|
// entity is buckled to, and then relays the BuckledEvent, so don't reparent to the grid.
|
||||||
|
DropCarried(ent.Comp.Carrier, ent, attachToGrid: false);
|
||||||
|
}
|
||||||
|
|
||||||
private void OnRemoved(Entity<BeingCarriedComponent> ent, ref ComponentRemove args)
|
private void OnRemoved(Entity<BeingCarriedComponent> ent, ref ComponentRemove args)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@@ -327,9 +335,9 @@ public sealed class CarryingSystem : EntitySystem
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DropCarried(EntityUid carrier, EntityUid carried)
|
public void DropCarried(EntityUid carrier, EntityUid carried, bool attachToGrid = true)
|
||||||
{
|
{
|
||||||
Drop(carried);
|
Drop(carried, attachToGrid);
|
||||||
CleanupCarrier(carrier, carried);
|
CleanupCarrier(carrier, carried);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -341,12 +349,15 @@ public sealed class CarryingSystem : EntitySystem
|
|||||||
_movementSpeed.RefreshMovementSpeedModifiers(carrier);
|
_movementSpeed.RefreshMovementSpeedModifiers(carrier);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Drop(EntityUid carried)
|
private void Drop(EntityUid carried, bool attachToGrid = true)
|
||||||
{
|
{
|
||||||
RemComp<BeingCarriedComponent>(carried);
|
RemComp<BeingCarriedComponent>(carried);
|
||||||
RemComp<KnockedDownComponent>(carried); // TODO SHITMED: make sure this doesnt let you make someone with no legs walk
|
RemComp<KnockedDownComponent>(carried); // TODO SHITMED: make sure this doesnt let you make someone with no legs walk
|
||||||
_actionBlocker.UpdateCanMove(carried);
|
_actionBlocker.UpdateCanMove(carried);
|
||||||
_transform.AttachToGridOrMap(carried);
|
|
||||||
|
// Some systems will handle re-parenting and then throw an event, and this changes the parent when it should not
|
||||||
|
if (attachToGrid)
|
||||||
|
_transform.AttachToGridOrMap(carried);
|
||||||
_standingState.Stand(carried);
|
_standingState.Stand(carried);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -70,13 +70,23 @@ public abstract class SharedLightReactiveSystem : EntitySystem
|
|||||||
/// Avoid calling this too often, as it can be expensive.
|
/// Avoid calling this too often, as it can be expensive.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public float GetLightLevelForPoint(EntityUid uid, TransformComponent? xform = null)
|
public float GetLightLevelForPoint(EntityUid uid, TransformComponent? xform = null)
|
||||||
|
{
|
||||||
|
return GetLightLevelAtPosition(uid, _transform.GetWorldPosition(uid), xform);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the light level at an arbitrary world position, using <paramref name="uid"/> for the
|
||||||
|
/// light lookup and map resolution. Lets callers sample somewhere other than the entity's
|
||||||
|
/// centre — e.g. a point just outside a wall, so the wall's own body can occlude the ray.
|
||||||
|
/// Avoid calling this too often, as it can be expensive.
|
||||||
|
/// </summary>
|
||||||
|
public float GetLightLevelAtPosition(EntityUid uid, Vector2 pos, TransformComponent? xform = null)
|
||||||
{
|
{
|
||||||
float val = 0.0f;
|
float val = 0.0f;
|
||||||
// Get the current map entity so we can get a MapLightComponent from it if it has one
|
// Get the current map entity so we can get a MapLightComponent from it if it has one
|
||||||
var map = _transform.GetMap((uid, xform));
|
var map = _transform.GetMap((uid, xform));
|
||||||
if (TryComp(map, out MapLightComponent? mapLight))
|
if (TryComp(map, out MapLightComponent? mapLight))
|
||||||
val += (mapLight.AmbientLightColor.R + mapLight.AmbientLightColor.G + mapLight.AmbientLightColor.B) / 3f;
|
val += (mapLight.AmbientLightColor.R + mapLight.AmbientLightColor.G + mapLight.AmbientLightColor.B) / 3f;
|
||||||
var pos = _transform.GetWorldPosition(uid);
|
|
||||||
|
|
||||||
foreach (var (lightUid, lightComp) in GetLights(uid))
|
foreach (var (lightUid, lightComp) in GetLights(uid))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -187,14 +187,14 @@ public abstract class SharedNodeCrawlSystem : EntitySystem
|
|||||||
|
|
||||||
private void OnMovementShutdown(Entity<NodeCrawlerMovementComponent> ent, ref ComponentShutdown args)
|
private void OnMovementShutdown(Entity<NodeCrawlerMovementComponent> ent, ref ComponentShutdown args)
|
||||||
{
|
{
|
||||||
if (ent.Comp.Node is { } node)
|
if (ent.Comp.Node is { } node && node.IsValid())
|
||||||
{
|
{
|
||||||
var nodeComp = Comp<CrawlableNodeComponent>(node);
|
var nodeComp = Comp<CrawlableNodeComponent>(node);
|
||||||
nodeComp.Crawlers.Remove(ent);
|
nodeComp.Crawlers.Remove(ent);
|
||||||
Dirty(node, nodeComp);
|
Dirty(node, nodeComp);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ent.Comp.HeldCrawler is { } crawler && !TerminatingOrDeleted(crawler) && TryComp<NodeCrawlerComponent>(crawler, out var nodeCrawler))
|
if (ent.Comp.HeldCrawler is { } crawler && crawler.IsValid() && !TerminatingOrDeleted(crawler) && TryComp<NodeCrawlerComponent>(crawler, out var nodeCrawler))
|
||||||
{
|
{
|
||||||
ExitNodeCrawl((crawler, nodeCrawler));
|
ExitNodeCrawl((crawler, nodeCrawler));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
using Robust.Shared.GameStates;
|
||||||
|
|
||||||
|
namespace Content.Shared._DV.Overlays.Components;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gives the owner darkvision: lighting still renders, but total darkness is raised to
|
||||||
|
/// <see cref="LightFloor"/> brightness instead of pitch black. Unlike night vision this keeps
|
||||||
|
/// the whole lighting gradient visible, so creatures like the Skia can judge what is and isn't dark enough for them.
|
||||||
|
/// </summary>
|
||||||
|
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
|
||||||
|
public sealed partial class DarkVisionComponent : Component
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Brightness that full darkness renders at, 0-1. Rendered light is clamped to a minimum of this value.
|
||||||
|
/// </summary>
|
||||||
|
[DataField, AutoNetworkedField]
|
||||||
|
public float LightFloor = 0.2f;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Multiplier applied to actual light on top of the floor. Values above 1 overbrighten lit areas so they are unmistakable next to the grey darkness floor.
|
||||||
|
/// </summary>
|
||||||
|
[DataField, AutoNetworkedField]
|
||||||
|
public float LightGain = 8f;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Exponent applied to lights, to make brighter areas look notably brighter
|
||||||
|
/// </summary>
|
||||||
|
[DataField, AutoNetworkedField]
|
||||||
|
public float LightExp = 2f;
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
using Robust.Shared.GameStates;
|
||||||
|
using Robust.Shared.Timing;
|
||||||
|
|
||||||
|
namespace Content.Shared._DV.ShadowWalk;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Lets this entity walk straight through solid static objects (walls, doors, windows...)
|
||||||
|
/// while the entity itself is bathed in darkness (the same light level it heals in.)
|
||||||
|
/// Mobs and projectiles always stay solid.
|
||||||
|
/// <para>
|
||||||
|
/// On collision, checks our light level. Objects we're stuck in are tagged in <see cref="PassableEntities"/>
|
||||||
|
/// </para>
|
||||||
|
/// </summary>
|
||||||
|
[RegisterComponent, NetworkedComponent]
|
||||||
|
public sealed partial class ShadowWalkerComponent : Component
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Light level below which an object counts as bathed in darkness.
|
||||||
|
/// If the entity has a <c>LightLevelHealthComponent</c> its DarkThreshold is used
|
||||||
|
/// instead, so objects are passable exactly where the entity would heal.
|
||||||
|
/// </summary>
|
||||||
|
[DataField]
|
||||||
|
public float DarkThreshold = 0.3f;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Objects we're currently in. Objects in this list are never solid until we fully leave.
|
||||||
|
/// </summary>
|
||||||
|
public HashSet<EntityUid> PassableEntities = new();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Light level for this tick, to avoid re-calculating for more than one collision a tick.
|
||||||
|
/// </summary>
|
||||||
|
public GameTick LastLightCheckTick = GameTick.Zero;
|
||||||
|
|
||||||
|
public float LastLightLevel;
|
||||||
|
}
|
||||||
@@ -0,0 +1,139 @@
|
|||||||
|
using Content.Shared._DV.Body;
|
||||||
|
using Content.Shared._DV.Light;
|
||||||
|
using Content.Shared.Projectiles;
|
||||||
|
using Robust.Shared.Map.Components;
|
||||||
|
using Robust.Shared.Physics;
|
||||||
|
using Robust.Shared.Physics.Components;
|
||||||
|
using Robust.Shared.Physics.Events;
|
||||||
|
using Robust.Shared.Timing;
|
||||||
|
|
||||||
|
namespace Content.Shared._DV.ShadowWalk;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Can walk through darkness freely.
|
||||||
|
/// </summary>
|
||||||
|
public sealed partial class SharedShadowWalkSystem : EntitySystem
|
||||||
|
{
|
||||||
|
[Dependency] private readonly EntityLookupSystem _lookup = default!;
|
||||||
|
[Dependency] private readonly IGameTiming _timing = default!;
|
||||||
|
[Dependency] private readonly SharedLightReactiveSystem _lightReactive = default!;
|
||||||
|
[Dependency] private readonly SharedTransformSystem _transform = default!;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// How far outside a tagged object's AABB the walker's centre must be before the object is untagged (and so becomes solid again on the next collision).
|
||||||
|
/// At least the walker's collision radius, so an object is never made solid while it still overlaps the walker.
|
||||||
|
/// </summary>
|
||||||
|
private const float UnstickMargin = 0.45f;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gamefeel. Non-walls get a bigger unstick margin so they stay unstick even if you clip into a wall. Prevents getting stuck in walls.
|
||||||
|
/// </summary>
|
||||||
|
private const float MovableUnstickMargin = 1f;
|
||||||
|
|
||||||
|
private EntityQuery<LightLevelHealthComponent> _lightHealthQuery;
|
||||||
|
private EntityQuery<PhysicsComponent> _physicsQuery;
|
||||||
|
private EntityQuery<ProjectileComponent> _projectileQuery;
|
||||||
|
|
||||||
|
private readonly List<EntityUid> _toRemove = [];
|
||||||
|
|
||||||
|
public override void Initialize()
|
||||||
|
{
|
||||||
|
base.Initialize();
|
||||||
|
|
||||||
|
_lightHealthQuery = GetEntityQuery<LightLevelHealthComponent>();
|
||||||
|
_physicsQuery = GetEntityQuery<PhysicsComponent>();
|
||||||
|
_projectileQuery = GetEntityQuery<ProjectileComponent>();
|
||||||
|
|
||||||
|
SubscribeLocalEvent<ShadowWalkerComponent, PreventCollideEvent>(OnPreventCollide);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Update(float frameTime)
|
||||||
|
{
|
||||||
|
var query = EntityQueryEnumerator<ShadowWalkerComponent>();
|
||||||
|
while (query.MoveNext(out var uid, out var comp))
|
||||||
|
{
|
||||||
|
if (comp.PassableEntities.Count == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
var worldPos = _transform.GetWorldPosition(uid);
|
||||||
|
|
||||||
|
_toRemove.Clear();
|
||||||
|
foreach (var other in comp.PassableEntities)
|
||||||
|
{
|
||||||
|
// Untag anything we've deleted or fully walked clear of; the next collision with it will re-check the light level from scratch.
|
||||||
|
if (Deleted(other))
|
||||||
|
{
|
||||||
|
_toRemove.Add(other);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var margin = UnstickMargin;
|
||||||
|
// Non-statics get a bigger margin :)
|
||||||
|
if (_physicsQuery.TryComp(other, out var body) && body.BodyType != BodyType.Static)
|
||||||
|
margin += MovableUnstickMargin;
|
||||||
|
|
||||||
|
if (!_lookup.GetWorldAABB(other).Enlarged(margin).Contains(worldPos))
|
||||||
|
_toRemove.Add(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var other in _toRemove)
|
||||||
|
comp.PassableEntities.Remove(other);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnPreventCollide(Entity<ShadowWalkerComponent> ent, ref PreventCollideEvent args)
|
||||||
|
{
|
||||||
|
if (args.Cancelled)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Only phase through hard blockers; sensor fixtures must keep triggering.
|
||||||
|
if (!args.OurFixture.Hard || !args.OtherFixture.Hard)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Already phasing through this one: keep it passable until we've left it (pruned in
|
||||||
|
// Update), so a light change mid-overlap can never trap us inside it.
|
||||||
|
if (ent.Comp.PassableEntities.Contains(args.OtherEntity))
|
||||||
|
{
|
||||||
|
args.Cancelled = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!CanPhaseThrough(args.OtherEntity, args.OtherBody))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// A fresh collision: only phase if the walker itself is currently in darkness.
|
||||||
|
if (!InDarkness(ent))
|
||||||
|
return;
|
||||||
|
|
||||||
|
args.Cancelled = true;
|
||||||
|
ent.Comp.PassableEntities.Add(args.OtherEntity);
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool CanPhaseThrough(EntityUid other, PhysicsComponent otherBody)
|
||||||
|
{
|
||||||
|
if (otherBody.BodyType == BodyType.KinematicController)
|
||||||
|
return false;
|
||||||
|
// Bullets never pass or hit based on collision timing.
|
||||||
|
if (_projectileQuery.HasComp(other))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool InDarkness(Entity<ShadowWalkerComponent> ent)
|
||||||
|
{
|
||||||
|
// Darkness is whatever the walker heals in, if it heals in darkness at all.
|
||||||
|
var threshold = _lightHealthQuery.TryComp(ent, out var lightHealth)
|
||||||
|
? lightHealth.DarkThreshold
|
||||||
|
: ent.Comp.DarkThreshold;
|
||||||
|
|
||||||
|
var curTick = _timing.CurTick;
|
||||||
|
if (ent.Comp.LastLightCheckTick != curTick)
|
||||||
|
{
|
||||||
|
ent.Comp.LastLightLevel = _lightReactive.GetLightLevelForPoint(ent.Owner);
|
||||||
|
ent.Comp.LastLightCheckTick = curTick;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ent.Comp.LastLightLevel < threshold;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
- files: ["shadowkin_female_scream.ogg"]
|
||||||
|
license: "CC-BY-SA-3.0"
|
||||||
|
copyright: "Edited and composited by MajorMoth. Re-encoded to Ogg Vorbis."
|
||||||
|
source: "https://freesound.org/people/AlesiaDavina/sounds/722718/"
|
||||||
|
|
||||||
|
- files: ["shadowkin_male_scream.ogg"]
|
||||||
|
license: "CC-BY-SA-3.0"
|
||||||
|
copyright: "Edited and composited by MajorMoth. Re-encoded to Ogg Vorbis."
|
||||||
|
source: "https://freesound.org/people/AlesiaDavina/sounds/722718/"
|
||||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,14 @@
|
|||||||
|
- files: ["shadowkin_speak_say.ogg"]
|
||||||
|
license: "CC-BY-SA-3.0"
|
||||||
|
copyright: "Edited and composited by MajorMoth. Re-encoded to Ogg Vorbis."
|
||||||
|
source: "https://freesound.org/people/JKata/sounds/632414/"
|
||||||
|
|
||||||
|
- files: ["shadowkin_speak_ask.ogg"]
|
||||||
|
license: "CC-BY-SA-3.0"
|
||||||
|
copyright: "Edited and composited by MajorMoth. Re-encoded to Ogg Vorbis."
|
||||||
|
source: "https://freesound.org/people/templeofhades/sounds/95516/"
|
||||||
|
|
||||||
|
- files: ["shadowkin_speak_exclaim.ogg"]
|
||||||
|
license: "CC-BY-SA-3.0"
|
||||||
|
copyright: "Edited and composited by MajorMoth. Re-encoded to Ogg Vorbis."
|
||||||
|
source: "https://freesound.org/people/taure/sounds/376392/"
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,4 @@
|
|||||||
|
- files: ["gnome_scream.ogg", "gnomedeath.ogg", "gnomelaugh.ogg", "gnome1.ogg"]
|
||||||
|
license: "CC-BY-SA-4.0"
|
||||||
|
copyright: "Audio recorded by Cepelinas and edited by rebe83"
|
||||||
|
source: "https://github.com/DeltaV-Station/Delta-v/pull/6027"
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -348,5 +348,28 @@ Entries:
|
|||||||
id: 38
|
id: 38
|
||||||
time: '2026-07-19T16:18:47.0000000+00:00'
|
time: '2026-07-19T16:18:47.0000000+00:00'
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/6317
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6317
|
||||||
|
- author: ShepardToTheStars
|
||||||
|
changes:
|
||||||
|
- message: '`entities` and a lot of other basic QUERY commare are now a DEBUG-level
|
||||||
|
commands.'
|
||||||
|
type: Tweak
|
||||||
|
id: 39
|
||||||
|
time: '2026-07-24T17:27:48.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6351
|
||||||
|
- author: ShepardToTheStars
|
||||||
|
changes:
|
||||||
|
- message: Curators, get off your lazy asses and help out the newbies.
|
||||||
|
type: Tweak
|
||||||
|
id: 40
|
||||||
|
time: '2026-08-09T18:14:15.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6374
|
||||||
|
- author: DisposableCrewmember42
|
||||||
|
changes:
|
||||||
|
- message: Added Unorbitable component, which prevents entities from being followed/warped
|
||||||
|
to.
|
||||||
|
type: Add
|
||||||
|
id: 41
|
||||||
|
time: '2026-08-22T16:18:32.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6435
|
||||||
Name: DeltaVAdmin
|
Name: DeltaVAdmin
|
||||||
Order: 5
|
Order: 5
|
||||||
|
|||||||
@@ -1,403 +1,4 @@
|
|||||||
Entries:
|
Entries:
|
||||||
- author: ShepardToTheStars, foxcumberland
|
|
||||||
changes:
|
|
||||||
- message: Added fashionable longcoats for command, security, and crew. Find them
|
|
||||||
in the loadouts for command, security, and passengers, or in the ClothesMate
|
|
||||||
on station!
|
|
||||||
type: Add
|
|
||||||
id: 2089
|
|
||||||
time: '2026-01-21T16:23:14.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5235
|
|
||||||
- author: Apachito
|
|
||||||
changes:
|
|
||||||
- message: Made tide breaker actually craftable
|
|
||||||
type: Fix
|
|
||||||
id: 2090
|
|
||||||
time: '2026-01-21T16:28:54.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5239
|
|
||||||
- author: ShepardToTheStars
|
|
||||||
changes:
|
|
||||||
- message: Certain painkillers are more long-lasting than others, based on how strong
|
|
||||||
they are.
|
|
||||||
type: Tweak
|
|
||||||
- message: Players with the chronic pain trait start with ~5 minutes of suppressed
|
|
||||||
pain before they start feeling the effects.
|
|
||||||
type: Tweak
|
|
||||||
- message: Fixed chronic pain's effects from pulsing continuously.
|
|
||||||
type: Fix
|
|
||||||
id: 2091
|
|
||||||
time: '2026-01-23T10:24:32.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5180
|
|
||||||
- author: snowywinters
|
|
||||||
changes:
|
|
||||||
- message: Captain's armored winter coat a alternative to the carapace
|
|
||||||
type: Add
|
|
||||||
- message: Changed the defense of captain's EVA suit and carapace
|
|
||||||
type: Tweak
|
|
||||||
id: 2092
|
|
||||||
time: '2026-01-23T19:31:48.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5227
|
|
||||||
- author: pootslap
|
|
||||||
changes:
|
|
||||||
- message: Listening Post Operatives only have the ability to hear binary comms
|
|
||||||
now. They can no longer talk on binary.
|
|
||||||
type: Tweak
|
|
||||||
id: 2093
|
|
||||||
time: '2026-01-23T19:35:58.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5243
|
|
||||||
- author: MilonPL
|
|
||||||
changes:
|
|
||||||
- message: The traits points bar will now show up correctly.
|
|
||||||
type: Fix
|
|
||||||
id: 2094
|
|
||||||
time: '2026-01-24T20:55:31.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5275
|
|
||||||
- author: MilonPL
|
|
||||||
changes:
|
|
||||||
- message: The uncloneable trait no longer prevents your character from getting
|
|
||||||
revived by defibrillators.
|
|
||||||
type: Fix
|
|
||||||
id: 2095
|
|
||||||
time: '2026-01-24T21:29:58.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5273
|
|
||||||
- author: Halo3moth
|
|
||||||
changes:
|
|
||||||
- message: The energy magnums "magnum" rounds no longer pierce windows
|
|
||||||
type: Fix
|
|
||||||
id: 2096
|
|
||||||
time: '2026-01-25T13:48:54.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5270
|
|
||||||
- author: Toby222
|
|
||||||
changes:
|
|
||||||
- message: Added buttons for build info and credits to the escape menu
|
|
||||||
type: Tweak
|
|
||||||
id: 2097
|
|
||||||
time: '2026-01-25T14:42:09.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5260
|
|
||||||
- author: MilonPL
|
|
||||||
changes:
|
|
||||||
- message: Added the "Marked as Protected" trait which makes you immune to becoming
|
|
||||||
a target objective.
|
|
||||||
type: Add
|
|
||||||
id: 2098
|
|
||||||
time: '2026-01-25T16:30:18.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5274
|
|
||||||
- author: AeraAuling
|
|
||||||
changes:
|
|
||||||
- message: Shadow damage no longer removes all your blood immediately
|
|
||||||
type: Tweak
|
|
||||||
id: 2099
|
|
||||||
time: '2026-01-25T16:31:20.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5268
|
|
||||||
- author: ShepardToTheStars
|
|
||||||
changes:
|
|
||||||
- message: You can now toggle your hardsuit helmet on over your hat or beret!
|
|
||||||
type: Add
|
|
||||||
id: 2100
|
|
||||||
time: '2026-01-25T16:31:55.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5263
|
|
||||||
- author: Pharaz4
|
|
||||||
changes:
|
|
||||||
- message: Bingus can no longer drink the **ENTIRE** keg.
|
|
||||||
type: Fix
|
|
||||||
- message: You can eat rice dishes with chopsticks now.
|
|
||||||
type: Add
|
|
||||||
- message: Fixed Smartfridge visuals always showing their wire panels open.
|
|
||||||
type: Fix
|
|
||||||
- message: Projectiles and Mr. Butlertion are now insulated against wizardry.
|
|
||||||
type: Fix
|
|
||||||
- message: Wording fix to initial infected's prompt. It now states that they can
|
|
||||||
explicitly kill people.
|
|
||||||
type: Fix
|
|
||||||
id: 2101
|
|
||||||
time: '2026-01-25T16:31:39.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5278
|
|
||||||
- author: MantasDab360, whatston3, ShepardToTheStars
|
|
||||||
changes:
|
|
||||||
- message: Chemical Dispenser can now toggle between auto labeling!
|
|
||||||
type: Add
|
|
||||||
id: 2102
|
|
||||||
time: '2026-01-25T16:46:12.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5261
|
|
||||||
- author: keekee38
|
|
||||||
changes:
|
|
||||||
- message: a new compact submachine gun for security should be shipping in soon!
|
|
||||||
type: Add
|
|
||||||
- message: added machine pistol magazines to the security techfab's recipes.
|
|
||||||
type: Tweak
|
|
||||||
- message: added rubber SMG mags to the security techfab.
|
|
||||||
type: Tweak
|
|
||||||
id: 2103
|
|
||||||
time: '2026-01-26T10:46:23.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5212
|
|
||||||
- author: Halo3moth
|
|
||||||
changes:
|
|
||||||
- message: Security long coats have been resprited to be more in line with other
|
|
||||||
security gear. (we ran out of red dye)
|
|
||||||
type: Tweak
|
|
||||||
id: 2104
|
|
||||||
time: '2026-01-27T05:50:41.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5288
|
|
||||||
- author: EmberAstra
|
|
||||||
changes:
|
|
||||||
- message: Plasteel can now be printed at the Engineering Techfab.
|
|
||||||
type: Add
|
|
||||||
id: 2105
|
|
||||||
time: '2026-01-27T16:05:20.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5284
|
|
||||||
- author: Pharaz4
|
|
||||||
changes:
|
|
||||||
- message: Wizard has been disabled pending a balance update.
|
|
||||||
type: Remove
|
|
||||||
id: 2106
|
|
||||||
time: '2026-01-27T17:55:11.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5228
|
|
||||||
- author: Toby222
|
|
||||||
changes:
|
|
||||||
- message: Prevented the plasteel market from crashing and burning.
|
|
||||||
type: Fix
|
|
||||||
id: 2107
|
|
||||||
time: '2026-01-27T18:58:24.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5298
|
|
||||||
- author: BarryNorfolk
|
|
||||||
changes:
|
|
||||||
- message: Upstream's November updates are here!
|
|
||||||
type: Add
|
|
||||||
- message: Xenoborgs have arrived in DeltaV. Please report any foriegn borgs to
|
|
||||||
security!
|
|
||||||
type: Add
|
|
||||||
- message: APCs now trip when they are under high load.
|
|
||||||
type: Add
|
|
||||||
- message: Traitors can now find the iconic Mini Energy Crossbow in their uplink
|
|
||||||
for 5 TC.
|
|
||||||
type: Add
|
|
||||||
- message: Attorneys can find a new briefcase gun in their uplink.
|
|
||||||
type: Add
|
|
||||||
- message: Defibs will shock anyone interacting with the patient other than the
|
|
||||||
person using the defib.
|
|
||||||
type: Tweak
|
|
||||||
- message: Added mail cart.
|
|
||||||
type: Add
|
|
||||||
- message: Tourniquets can now fit in medical belts.
|
|
||||||
type: Tweak
|
|
||||||
- message: Make DAGD more likely but restrict it to 1 traitor per round.
|
|
||||||
type: Tweak
|
|
||||||
id: 2108
|
|
||||||
time: '2026-01-29T16:56:03.499291+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5087
|
|
||||||
- author: Pharaz4
|
|
||||||
changes:
|
|
||||||
- message: Lizards now get hardsuit tails
|
|
||||||
type: Add
|
|
||||||
id: 2109
|
|
||||||
time: '2026-01-29T16:55:44.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5293
|
|
||||||
- author: Pharaz4
|
|
||||||
changes:
|
|
||||||
- message: removed syndicate comms from refugees and guards
|
|
||||||
type: Remove
|
|
||||||
id: 2110
|
|
||||||
time: '2026-01-29T17:25:06.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5280
|
|
||||||
- author: Toby222, PureBreadBagel
|
|
||||||
changes:
|
|
||||||
- message: Added the ability to see if a patient is uncloneable via the Health Analyzer!
|
|
||||||
type: Add
|
|
||||||
- message: Medical doctor and Cloning entries have been changed to reflect the new
|
|
||||||
uncloneable trait, as uncloneable and unrevivable are no longer the same.
|
|
||||||
type: Tweak
|
|
||||||
id: 2111
|
|
||||||
time: '2026-01-30T16:18:07.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5310
|
|
||||||
- author: ShepardToTheStars
|
|
||||||
changes:
|
|
||||||
- message: The uncloneable alert in the health analyzer window only shows up when
|
|
||||||
its relevant (i.e. when the patient is dead).
|
|
||||||
type: Tweak
|
|
||||||
id: 2112
|
|
||||||
time: '2026-01-30T21:11:56.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5330
|
|
||||||
- author: verybigman311
|
|
||||||
changes:
|
|
||||||
- message: Wielding a guitar should no longer turn it invisible in your hands.
|
|
||||||
type: Fix
|
|
||||||
id: 2113
|
|
||||||
time: '2026-02-01T19:29:59.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5331
|
|
||||||
- author: verybigman311
|
|
||||||
changes:
|
|
||||||
- message: The Brigmed beret is now avaliable in the Corpsman loadout.
|
|
||||||
type: Add
|
|
||||||
id: 2114
|
|
||||||
time: '2026-02-01T19:30:27.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5333
|
|
||||||
- author: keekee38
|
|
||||||
changes:
|
|
||||||
- message: modified the bandolier slightly, and added a recipe for it in the sec
|
|
||||||
techfab
|
|
||||||
type: Tweak
|
|
||||||
id: 2115
|
|
||||||
time: '2026-02-01T19:32:36.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5313
|
|
||||||
- author: Pharaz4
|
|
||||||
changes:
|
|
||||||
- message: Changed the mapped enabled pumps from 310 to 300 kPa
|
|
||||||
type: Tweak
|
|
||||||
id: 2116
|
|
||||||
time: '2026-02-01T19:34:53.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5336
|
|
||||||
- author: makyo
|
|
||||||
changes:
|
|
||||||
- message: Rodentia! Now your sneak action has an icon showing your sneak status.
|
|
||||||
type: Add
|
|
||||||
id: 2117
|
|
||||||
time: '2026-02-01T19:39:29.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5308
|
|
||||||
- author: makyo
|
|
||||||
changes:
|
|
||||||
- message: Perma chefvends now get a few bowls!
|
|
||||||
type: Add
|
|
||||||
id: 2118
|
|
||||||
time: '2026-02-01T19:43:05.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5304
|
|
||||||
- author: verybigman311
|
|
||||||
changes:
|
|
||||||
- message: Feroxi can now waggy their tails.
|
|
||||||
type: Add
|
|
||||||
id: 2119
|
|
||||||
time: '2026-02-02T17:56:08.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5319
|
|
||||||
- author: Pharaz4
|
|
||||||
changes:
|
|
||||||
- message: Fixed harpy suits not displaying on some clothing.
|
|
||||||
type: Fix
|
|
||||||
- message: Added missing sprite for Lizards on multipe suits.
|
|
||||||
type: Add
|
|
||||||
- message: Removed upstream spawners from entity spawn panel.
|
|
||||||
type: Remove
|
|
||||||
id: 2120
|
|
||||||
time: '2026-02-05T20:04:40.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5325
|
|
||||||
- author: Pharaz4
|
|
||||||
changes:
|
|
||||||
- message: Shoko improved!
|
|
||||||
type: Tweak
|
|
||||||
id: 2121
|
|
||||||
time: '2026-02-10T11:26:42.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5334
|
|
||||||
- author: MantasDab360
|
|
||||||
changes:
|
|
||||||
- message: Gas condenser now uses 2kW instead of 10 kW!
|
|
||||||
type: Tweak
|
|
||||||
id: 2122
|
|
||||||
time: '2026-02-17T23:22:38.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5365
|
|
||||||
- author: Pharaz4
|
|
||||||
changes:
|
|
||||||
- message: Fixed pew sprites!
|
|
||||||
type: Fix
|
|
||||||
id: 2123
|
|
||||||
time: '2026-02-20T23:13:13.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5375
|
|
||||||
- author: Woljif
|
|
||||||
changes:
|
|
||||||
- message: Removed the slowdown penalty when wielding the Estoc DMR.
|
|
||||||
type: Tweak
|
|
||||||
id: 2124
|
|
||||||
time: '2026-02-24T04:26:44.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5242
|
|
||||||
- author: keekee38
|
|
||||||
changes:
|
|
||||||
- message: added a new cryogenics chemical, photoxadone, that heals both holy and
|
|
||||||
shadow damage. it even works on the dead!
|
|
||||||
type: Add
|
|
||||||
- message: added purifying salt to the med vend, as well as a recipe in the techfab.
|
|
||||||
type: Tweak
|
|
||||||
id: 2125
|
|
||||||
time: '2026-02-24T05:05:59.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5276
|
|
||||||
- author: IAmNotGray
|
|
||||||
changes:
|
|
||||||
- message: The maximum record length has been increased from 4096 to 8192. Remember
|
|
||||||
that these things exist?
|
|
||||||
type: Tweak
|
|
||||||
id: 2126
|
|
||||||
time: '2026-02-24T19:11:26.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5385
|
|
||||||
- author: HameyTychol
|
|
||||||
changes:
|
|
||||||
- message: removed ability for limbs to be placed in trash bag and recycled
|
|
||||||
type: Fix
|
|
||||||
id: 2127
|
|
||||||
time: '2026-02-24T19:11:40.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5416
|
|
||||||
- author: rebe83
|
|
||||||
changes:
|
|
||||||
- message: Skias can now emote. Harvest souls with some flavor. and spin.
|
|
||||||
type: Tweak
|
|
||||||
id: 2128
|
|
||||||
time: '2026-02-25T18:18:15.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5366
|
|
||||||
- author: BarryNorfolk
|
|
||||||
changes:
|
|
||||||
- message: Shrapnel Landmines are once again actually dangerous and will murder
|
|
||||||
you.
|
|
||||||
type: Fix
|
|
||||||
id: 2129
|
|
||||||
time: '2026-02-25T18:19:58.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5379
|
|
||||||
- author: Eternally-Confused
|
|
||||||
changes:
|
|
||||||
- message: Bluespace beakers and lead bottles can now only be obtained by emagging
|
|
||||||
the chemvend, instead of cutting the manager wire.
|
|
||||||
type: Tweak
|
|
||||||
id: 2130
|
|
||||||
time: '2026-02-25T18:20:57.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5392
|
|
||||||
- author: zelezniciar
|
|
||||||
changes:
|
|
||||||
- message: Added Engineering SOP, formalizing safety regs, building permits, hazard
|
|
||||||
areas, and more.
|
|
||||||
type: Add
|
|
||||||
- message: RCDs are now a controlled item, restricted to Engineering.
|
|
||||||
type: Tweak
|
|
||||||
id: 2131
|
|
||||||
time: '2026-02-25T20:35:40.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5282
|
|
||||||
- author: Stxcking
|
|
||||||
changes:
|
|
||||||
- message: Gun safes have new sprites!
|
|
||||||
type: Tweak
|
|
||||||
id: 2132
|
|
||||||
time: '2026-02-25T22:42:48.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5314
|
|
||||||
- author: zelezniciar, AraiMaia
|
|
||||||
changes:
|
|
||||||
- message: Added Engineering Tape for use by Engineers to mark off hazardous areas.
|
|
||||||
Danger, Keep Out!
|
|
||||||
type: Add
|
|
||||||
id: 2133
|
|
||||||
time: '2026-02-26T07:29:13.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5277
|
|
||||||
- author: AeraAuling
|
|
||||||
changes:
|
|
||||||
- message: certain tails no longer make skirts look like shorts
|
|
||||||
type: Tweak
|
|
||||||
id: 2134
|
|
||||||
time: '2026-02-26T20:00:49.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/4548
|
|
||||||
- author: SuperGDPWYL, youtissoum, DisposableCrewmember42
|
|
||||||
changes:
|
|
||||||
- message: Conspirators have been ported from Harmony! Check the guidebook for more
|
|
||||||
details.
|
|
||||||
type: Add
|
|
||||||
- message: Conspirators are more likely to be chosen from different departments
|
|
||||||
type: Tweak
|
|
||||||
- message: Conspirators can use custom objective summaries
|
|
||||||
type: Tweak
|
|
||||||
id: 2135
|
|
||||||
time: '2026-02-27T18:24:44.0000000+00:00'
|
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/5218
|
|
||||||
- author: zelezniciar
|
- author: zelezniciar
|
||||||
changes:
|
changes:
|
||||||
- message: Added a generic Slavic accent that can be selected as a character trait.
|
- message: Added a generic Slavic accent that can be selected as a character trait.
|
||||||
@@ -4365,4 +3966,458 @@
|
|||||||
id: 2589
|
id: 2589
|
||||||
time: '2026-07-21T00:05:09.0000000+00:00'
|
time: '2026-07-21T00:05:09.0000000+00:00'
|
||||||
url: https://github.com/DeltaV-Station/Delta-v/pull/6201
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6201
|
||||||
|
- author: Stxcking
|
||||||
|
changes:
|
||||||
|
- message: Vulps can yip properly now.
|
||||||
|
type: Fix
|
||||||
|
id: 2590
|
||||||
|
time: '2026-07-21T02:20:30.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6354
|
||||||
|
- author: Coryler
|
||||||
|
changes:
|
||||||
|
- message: Shadekin meds working on them
|
||||||
|
type: Fix
|
||||||
|
- message: Shadekin emotes being available to other species
|
||||||
|
type: Fix
|
||||||
|
id: 2591
|
||||||
|
time: '2026-07-21T07:58:56.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6357
|
||||||
|
- author: Coryler
|
||||||
|
changes:
|
||||||
|
- message: Add back Felinid root ability
|
||||||
|
type: Add
|
||||||
|
id: 2592
|
||||||
|
time: '2026-07-21T18:44:49.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6358
|
||||||
|
- author: EmberAstra
|
||||||
|
changes:
|
||||||
|
- message: Cosmic Cult's Entropic Blades are now smaller (2x4 spaces)
|
||||||
|
type: Tweak
|
||||||
|
id: 2593
|
||||||
|
time: '2026-07-23T03:17:02.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6371
|
||||||
|
- author: turtlemutt
|
||||||
|
changes:
|
||||||
|
- message: Gave Lighthouse new doorbells and pagers. Have fun harassing departments!
|
||||||
|
type: Tweak
|
||||||
|
id: 2594
|
||||||
|
time: '2026-07-23T16:29:30.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6088
|
||||||
|
- author: ShepardToTheStars
|
||||||
|
changes:
|
||||||
|
- message: Buckling someone while they are being carried should work as intended
|
||||||
|
now.
|
||||||
|
type: Fix
|
||||||
|
- message: Picking someone up that is criticla will have priority over CPR unless
|
||||||
|
they are buckled to something.
|
||||||
|
type: Tweak
|
||||||
|
id: 2595
|
||||||
|
time: '2026-07-23T20:07:04.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6375
|
||||||
|
- author: ManuDemoen
|
||||||
|
changes:
|
||||||
|
- message: Emergency access no longer allows anyone with a remote to bolt the door
|
||||||
|
and checks if the remote has access to bolt.
|
||||||
|
type: Fix
|
||||||
|
id: 2596
|
||||||
|
time: '2026-07-24T17:28:01.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6141
|
||||||
|
- author: pootslap
|
||||||
|
changes:
|
||||||
|
- message: Monkeys now make sounds when using emotes!
|
||||||
|
type: Add
|
||||||
|
id: 2597
|
||||||
|
time: '2026-07-24T17:28:47.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/5928
|
||||||
|
- author: keekee38
|
||||||
|
changes:
|
||||||
|
- message: The WT550 once again fires at 5.5 rounds a second and has 30-round magazines.
|
||||||
|
type: Tweak
|
||||||
|
id: 2598
|
||||||
|
time: '2026-07-24T17:34:48.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6364
|
||||||
|
- author: SirWarock
|
||||||
|
changes:
|
||||||
|
- message: The NT-3 cannot be parcel-wrapped anymore!
|
||||||
|
type: Tweak
|
||||||
|
- message: Adjusted the wielding sprites of the NT-3 to look less wrong.
|
||||||
|
type: Fix
|
||||||
|
- message: The NT-3 can pierce things again.
|
||||||
|
type: Fix
|
||||||
|
id: 2599
|
||||||
|
time: '2026-07-24T17:39:18.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/5653
|
||||||
|
- author: ShepardToTheStars
|
||||||
|
changes:
|
||||||
|
- message: The additional borg chassis from Cosmic Drift has been reverted due to
|
||||||
|
implementation issues.
|
||||||
|
type: Remove
|
||||||
|
id: 2600
|
||||||
|
time: '2026-07-27T13:48:14.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6385
|
||||||
|
- author: JustAnOrange, Stxcking
|
||||||
|
changes:
|
||||||
|
- message: Added 6 departmental bomber jackets and 3 non-departmental ones, they're
|
||||||
|
zippable! They can be found in your loadout option or in the clothing drobes!
|
||||||
|
type: Add
|
||||||
|
id: 2601
|
||||||
|
time: '2026-07-27T16:43:20.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6220
|
||||||
|
- author: CalliganSierre
|
||||||
|
changes:
|
||||||
|
- message: Ported TheDen Shadowkin scream, laugh, and talk sounds for Shadekin.
|
||||||
|
(CC-BY-SA-3.0 MajorMoth)
|
||||||
|
type: Add
|
||||||
|
- message: Shadekin now use custom laughs and speech voice instead of Slime-person
|
||||||
|
sounds for those lines.
|
||||||
|
type: Tweak
|
||||||
|
- message: Shadekin are assigned Felinid Growl, Hiss, and Purr emotes as is consistent
|
||||||
|
with most other servers.
|
||||||
|
type: Tweak
|
||||||
|
id: 2602
|
||||||
|
time: '2026-07-27T19:26:38.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6370
|
||||||
|
- author: starabsurddark-png
|
||||||
|
changes:
|
||||||
|
- message: Increased the resistances of the Durathread Vest to 50% Blunt, Slash
|
||||||
|
and 20% Heat
|
||||||
|
type: Tweak
|
||||||
|
- message: Reduced the resistances of the Plate Carrier to 10% Blunt
|
||||||
|
type: Tweak
|
||||||
|
id: 2603
|
||||||
|
time: '2026-07-29T12:18:54.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6311
|
||||||
|
- author: ShepardToTheStars, rebe83
|
||||||
|
changes:
|
||||||
|
- message: Felinid's sink claws ability delay has been reduced from 3s to 0.5s.
|
||||||
|
type: Tweak
|
||||||
|
- message: Felinids now get a unique icon on their alert bar when they protract
|
||||||
|
their claws.
|
||||||
|
type: Add
|
||||||
|
id: 2604
|
||||||
|
time: '2026-07-29T15:42:01.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6376
|
||||||
|
- author: ShepardToTheStars
|
||||||
|
changes:
|
||||||
|
- message: Remote Medical Tracking has been added to the Biochemical research tree
|
||||||
|
as a T3 technology. It allows you to print crew monitors and crew monitoring
|
||||||
|
server boards!
|
||||||
|
type: Add
|
||||||
|
- message: The crew monitoring crate from Logistics now requires medical access
|
||||||
|
to unlock instead of epistemics.
|
||||||
|
type: Tweak
|
||||||
|
id: 2605
|
||||||
|
time: '2026-07-30T17:30:47.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6272
|
||||||
|
- author: ErhardSteinhauer, Stxcking
|
||||||
|
changes:
|
||||||
|
- message: 'Coming from Frontier: Added Construction Bags and Bag of Holding Variant
|
||||||
|
(T2) to the Engineering Techfab.'
|
||||||
|
type: Add
|
||||||
|
id: 2606
|
||||||
|
time: '2026-08-02T13:31:31.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/5846
|
||||||
|
- author: TehFlaminTaco
|
||||||
|
changes:
|
||||||
|
- message: Removed Skia Ventcrawl
|
||||||
|
type: Remove
|
||||||
|
- message: Added Skia Shadowwalk
|
||||||
|
type: Add
|
||||||
|
- message: Replaced Skia NightVision with DarkVision
|
||||||
|
type: Tweak
|
||||||
|
id: 2607
|
||||||
|
time: '2026-08-03T02:45:12.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6346
|
||||||
|
- author: ShepardToTheStars
|
||||||
|
changes:
|
||||||
|
- message: The height slider on your profile now shows actual height measurements.
|
||||||
|
type: Tweak
|
||||||
|
- message: Characters now have a +/- 20% scale in the character creator for all
|
||||||
|
species.
|
||||||
|
type: Tweak
|
||||||
|
- message: In exchange for being harder to click on, characters that are smaller
|
||||||
|
than average for their species have pull speed penalties while pulling for being
|
||||||
|
so small. This effects only items that are not held in-hand, not in the air,
|
||||||
|
and do not have wheels.
|
||||||
|
type: Tweak
|
||||||
|
- message: Slightly reduced the density of Ovinia so they aren't as dense as an
|
||||||
|
Oni.
|
||||||
|
type: Tweak
|
||||||
|
- message: Increased the density of Thaven to slightly less than a normal human
|
||||||
|
player.
|
||||||
|
type: Tweak
|
||||||
|
id: 2608
|
||||||
|
time: '2026-08-04T16:27:56.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6320
|
||||||
|
- author: ShepardToTheStars
|
||||||
|
changes:
|
||||||
|
- message: Shadekin cannot receive CPR anymore due to them not breathing or having
|
||||||
|
lungs. They are still able to perform CPR.
|
||||||
|
type: Remove
|
||||||
|
- message: Shadekin should have an internal temperature now, so they can get cold
|
||||||
|
and hot.
|
||||||
|
type: Fix
|
||||||
|
id: 2609
|
||||||
|
time: '2026-08-04T16:41:14.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6381
|
||||||
|
- author: ShepardToTheStars
|
||||||
|
changes:
|
||||||
|
- message: Fixed changelog saying Shadekin can't perform CPR. Shadekin can still
|
||||||
|
perform CPR, but cannot receive it (as it would do nothing for them).
|
||||||
|
type: Fix
|
||||||
|
id: 2610
|
||||||
|
time: '2026-08-04T21:49:19.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6395
|
||||||
|
- author: Stxcking
|
||||||
|
changes:
|
||||||
|
- message: Mothroach and Mouse can emote again.
|
||||||
|
type: Fix
|
||||||
|
- message: Moproaches ghostrole can be raffled for properly now.
|
||||||
|
type: Fix
|
||||||
|
id: 2611
|
||||||
|
time: '2026-08-04T22:18:47.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6356
|
||||||
|
- author: ShepardToTheStars
|
||||||
|
changes:
|
||||||
|
- message: Nuclear operatives and ninjas will now be correctly scaled.
|
||||||
|
type: Fix
|
||||||
|
id: 2612
|
||||||
|
time: '2026-08-07T16:51:25.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6398
|
||||||
|
- author: ShepardToTheStars
|
||||||
|
changes:
|
||||||
|
- message: Parcel wrapping when buckled to a chair no longer will make you invisible
|
||||||
|
and uninteractable.
|
||||||
|
type: Fix
|
||||||
|
id: 2613
|
||||||
|
time: '2026-08-07T23:24:54.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6399
|
||||||
|
- author: ShepardToTheStars
|
||||||
|
changes:
|
||||||
|
- message: Polymorphing/jaunting while ventcrawling will no longer break movement
|
||||||
|
for the polymorphed/jaunting player.
|
||||||
|
type: Fix
|
||||||
|
id: 2614
|
||||||
|
time: '2026-08-09T16:57:32.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6400
|
||||||
|
- author: rebe83, cepelinas, ShepardtotheStars, einknusprigestoast, Sloppr
|
||||||
|
changes:
|
||||||
|
- message: Added gnomes! Remember to secure your valuables and be polite.
|
||||||
|
type: Add
|
||||||
|
- message: Added gnome hats, for when you butcher the gnome. This kills the gnome.
|
||||||
|
type: Add
|
||||||
|
- message: Gnome guidebook. All good gnomes know their fae laws! (They don't believe
|
||||||
|
in SOP)
|
||||||
|
type: Add
|
||||||
|
id: 2615
|
||||||
|
time: '2026-08-09T18:24:26.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6027
|
||||||
|
- author: Coryler
|
||||||
|
changes:
|
||||||
|
- message: Harpy Wing Layers on Hardsuits
|
||||||
|
type: Fix
|
||||||
|
id: 2616
|
||||||
|
time: '2026-08-10T16:14:56.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6406
|
||||||
|
- author: SumofThreeParts
|
||||||
|
changes:
|
||||||
|
- message: Universals are cheaper now.
|
||||||
|
type: Tweak
|
||||||
|
id: 2617
|
||||||
|
time: '2026-08-12T16:49:32.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6366
|
||||||
|
- author: keekee38
|
||||||
|
changes:
|
||||||
|
- message: the cowboy crate now has 2 rifles, 2 ammo boxes, 2 hats, and 2 pairs
|
||||||
|
of boots
|
||||||
|
type: Tweak
|
||||||
|
id: 2618
|
||||||
|
time: '2026-08-12T17:05:32.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6363
|
||||||
|
- author: sowelipililimute
|
||||||
|
changes:
|
||||||
|
- message: The set of ion laws has been refined to a smaller set of the best laws.
|
||||||
|
type: Tweak
|
||||||
|
id: 2619
|
||||||
|
time: '2026-08-12T17:34:12.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6390
|
||||||
|
- author: ShepardToTheStars
|
||||||
|
changes:
|
||||||
|
- message: Fixed some visitor shuttles (e.g. Asakim, Interdyne Chemists, Syndie
|
||||||
|
Recruiter, etc) not spawning.
|
||||||
|
type: Fix
|
||||||
|
- message: There should roughly be 1.5x as many random shuttle events per round.
|
||||||
|
type: Tweak
|
||||||
|
- message: Slightly increased the chances of Asakim, LoneOp and SRN events to happen.
|
||||||
|
type: Tweak
|
||||||
|
- message: Asakim and Hitman shuttles are now more likely to appear during survival
|
||||||
|
rounds.
|
||||||
|
type: Tweak
|
||||||
|
id: 2620
|
||||||
|
time: '2026-08-13T01:17:04.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6401
|
||||||
|
- author: ShepardToTheStars
|
||||||
|
changes:
|
||||||
|
- message: Onis should again be able to drink tea without getting poisoned.
|
||||||
|
type: Fix
|
||||||
|
id: 2621
|
||||||
|
time: '2026-08-13T15:01:47.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6409
|
||||||
|
- author: Stop-Signs
|
||||||
|
changes:
|
||||||
|
- message: Cosmic Censer no longer mindwipes people who were not cultists.
|
||||||
|
type: Tweak
|
||||||
|
id: 2622
|
||||||
|
time: '2026-08-14T04:30:57.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6414
|
||||||
|
- author: SirWarock
|
||||||
|
changes:
|
||||||
|
- message: Ejecting from a security belt now prioritizes the handgun instead of
|
||||||
|
the radio!
|
||||||
|
type: Tweak
|
||||||
|
id: 2623
|
||||||
|
time: '2026-08-16T14:07:46.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6418
|
||||||
|
- author: ShepardToTheStars
|
||||||
|
changes:
|
||||||
|
- message: Holy water now heals when injected into someone's bloodstream.
|
||||||
|
type: Fix
|
||||||
|
id: 2624
|
||||||
|
time: '2026-08-16T15:04:40.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6421
|
||||||
|
- author: ShepardToTheStars
|
||||||
|
changes:
|
||||||
|
- message: Kitsune can eat raw meat without getting poisoned again.
|
||||||
|
type: Fix
|
||||||
|
id: 2625
|
||||||
|
time: '2026-08-17T17:38:03.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6422
|
||||||
|
- author: ShepardToTheStars
|
||||||
|
changes:
|
||||||
|
- message: Traitors now have an average of 4 objectives, up from 2.
|
||||||
|
type: Tweak
|
||||||
|
- message: The max number of traitors per Traitor shift has been reduced slightly,
|
||||||
|
from 10 to 8.
|
||||||
|
type: Tweak
|
||||||
|
- message: Added the Logistic Officer's Golden Knuckledusters as a traitor objective.
|
||||||
|
type: Add
|
||||||
|
- message: Added a new steal objective to the CMO, the sensitive medical documents.
|
||||||
|
type: Add
|
||||||
|
- message: Traitors with DAGD can now roll steal objectives, otherwise they end
|
||||||
|
up rolling all killing objectives.
|
||||||
|
type: Tweak
|
||||||
|
- message: The syndicate surplus and the super surplus crates have had their costs
|
||||||
|
adjusted to 30 and 60 TC respectively.
|
||||||
|
type: Tweak
|
||||||
|
- message: The syndicate surplus and the super surplus crates have had the number
|
||||||
|
of items increased to account for the increased cost.
|
||||||
|
type: Tweak
|
||||||
|
id: 2626
|
||||||
|
time: '2026-08-17T19:14:31.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6389
|
||||||
|
- author: ShepardToTheStars
|
||||||
|
changes:
|
||||||
|
- message: The ramping scheduler will now look at when it was added to determine
|
||||||
|
event density, rather than overall round time. This will result in less events
|
||||||
|
and more time to recover after a major antag is defeated.
|
||||||
|
type: Tweak
|
||||||
|
- message: The Xenoborgs gamemode no longer has a ramping scheduler at round start.
|
||||||
|
Instead, it gets added when the mothership core dies (like other game modes).
|
||||||
|
type: Tweak
|
||||||
|
- message: Fixed a bug where the ramping scheduler would get added if a nukie died
|
||||||
|
on nukie planet.
|
||||||
|
type: Fix
|
||||||
|
- message: Fixed a bug where a ramping scheduler would get added if the crew defeated
|
||||||
|
midround zombies.
|
||||||
|
type: Fix
|
||||||
|
id: 2627
|
||||||
|
time: '2026-08-17T20:26:09.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6416
|
||||||
|
- author: rebe83
|
||||||
|
changes:
|
||||||
|
- message: Hristovs are now bulkier and require use of a bipod to aim properly,
|
||||||
|
but fire slightly faster when aimed.
|
||||||
|
type: Tweak
|
||||||
|
- message: .60 antimateriel bullets now pierce up to 3 regular walls, windows, and
|
||||||
|
airlocks. To shreds you say?
|
||||||
|
type: Tweak
|
||||||
|
id: 2628
|
||||||
|
time: '2026-08-18T16:39:08.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/5905
|
||||||
|
- author: Coryler
|
||||||
|
changes:
|
||||||
|
- message: Vulpkanins have their own scream now.
|
||||||
|
type: Add
|
||||||
|
id: 2629
|
||||||
|
time: '2026-08-18T17:51:37.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6348
|
||||||
|
- author: starabsurddark-png
|
||||||
|
changes:
|
||||||
|
- message: Reduced ARCS slowdown to 10%
|
||||||
|
type: Tweak
|
||||||
|
- message: Increased ARCS explosion resist to 40%, Caustic Resist to 10%. Reduced
|
||||||
|
the Heat resist to 10% and removed ranged stamina resist to match upstream Riot
|
||||||
|
Suit
|
||||||
|
type: Tweak
|
||||||
|
- message: Replaced the ARCS with the Riot Suit in the Swat Crate
|
||||||
|
type: Tweak
|
||||||
|
id: 2630
|
||||||
|
time: '2026-08-18T18:14:44.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6353
|
||||||
|
- author: ShepardToTheStars
|
||||||
|
changes:
|
||||||
|
- message: Fixed missing locale strings on the cargo bounty request computer.
|
||||||
|
type: Fix
|
||||||
|
id: 2631
|
||||||
|
time: '2026-08-20T14:25:00.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6427
|
||||||
|
- author: ShepardToTheStars
|
||||||
|
changes:
|
||||||
|
- message: Hitmen can no longer get nuclear operatives nor characters with the marked
|
||||||
|
as protected trait as targets.
|
||||||
|
type: Fix
|
||||||
|
- message: SRN will no longer get command with unborgable as a 'Condemn them to
|
||||||
|
Metal' objective.
|
||||||
|
type: Fix
|
||||||
|
id: 2632
|
||||||
|
time: '2026-08-20T17:19:46.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6426
|
||||||
|
- author: Radezolid, FieldCommand
|
||||||
|
changes:
|
||||||
|
- message: The syndicate recruiter's ship no longer has AA on it's doors.
|
||||||
|
type: Fix
|
||||||
|
- message: The synthesis ship no longer has AA on it's doors.
|
||||||
|
type: Fix
|
||||||
|
- message: The synthesis ship is now power independent from the station, with a
|
||||||
|
17 kW generator.
|
||||||
|
type: Tweak
|
||||||
|
- message: New syndicate evacuation pod for the shuttle event
|
||||||
|
type: Add
|
||||||
|
- message: Most syndicate shuttles should now have a syndicate fax machine.
|
||||||
|
type: Tweak
|
||||||
|
id: 2633
|
||||||
|
time: '2026-08-21T02:38:46.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6094
|
||||||
|
- author: Radezolid
|
||||||
|
changes:
|
||||||
|
- message: Medkits now occupy a 2x3 in your bag, from 2x4.
|
||||||
|
type: Tweak
|
||||||
|
id: 2634
|
||||||
|
time: '2026-08-21T18:29:38.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6413
|
||||||
|
- author: ShepardToTheStars
|
||||||
|
changes:
|
||||||
|
- message: Removed suit coordinates for Arms Dealer, Asakim, and SRN ghost roles.
|
||||||
|
type: Fix
|
||||||
|
id: 2635
|
||||||
|
time: '2026-08-23T12:56:13.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6441
|
||||||
|
- author: ShepardToTheStars
|
||||||
|
changes:
|
||||||
|
- message: Syndicate and hitman business cards now embed if they are throwing at
|
||||||
|
someone.
|
||||||
|
type: Add
|
||||||
|
id: 2636
|
||||||
|
time: '2026-08-23T12:57:01.0000000+00:00'
|
||||||
|
url: https://github.com/DeltaV-Station/Delta-v/pull/6439
|
||||||
Order: 1
|
Order: 1
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
[game]
|
[game]
|
||||||
hostname = "[EN][MRP] Delta-v (Ψ) | Apoapsis [US East 1]"
|
hostname = "[EN][MRP] Delta-V (Ψ) | Apoapsis [NA East 1]"
|
||||||
soft_max_players = 100
|
soft_max_players = 100
|
||||||
|
|
||||||
|
[adminlogs]
|
||||||
|
server_name = "Apoapsis"
|
||||||
|
|
||||||
[hub]
|
[hub]
|
||||||
tags = "lang:en-US,region:am_n_e,rp:med,no_tag_infer"
|
tags = "lang:en-US,region:am_n_e,rp:med,no_tag_infer"
|
||||||
|
|
||||||
|
|||||||
@@ -108,6 +108,7 @@ time = 600
|
|||||||
|
|
||||||
[chat]
|
[chat]
|
||||||
max_announcement_length = 512
|
max_announcement_length = 512
|
||||||
|
rate_limit_announce_admins_delay = -1
|
||||||
|
|
||||||
[audio]
|
[audio]
|
||||||
attenuation = 4 # inversedistanceclamped 1 << 2, see audioparams.cs
|
attenuation = 4 # inversedistanceclamped 1 << 2, see audioparams.cs
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
[game]
|
[game]
|
||||||
hostname = "[EN][MRP] Delta-v (Ψ) | Horizon [US East 3]"
|
hostname = "[EN][MRP] Delta-V (Ψ) | Horizon [NA East 3]"
|
||||||
soft_max_players = 80
|
soft_max_players = 80
|
||||||
|
|
||||||
|
[adminlogs]
|
||||||
|
server_name = "Horizon"
|
||||||
|
|
||||||
[vote]
|
[vote]
|
||||||
preset_enabled = true
|
preset_enabled = true
|
||||||
map_enabled = true
|
map_enabled = true
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
[game]
|
[game]
|
||||||
hostname = "[EN][MRP] Delta-v (Ψ) | Inclination [EU West]"
|
hostname = "[EN][MRP] Delta-V (Ψ) | Inclination [EU West]"
|
||||||
soft_max_players = 50
|
soft_max_players = 50
|
||||||
|
|
||||||
|
[adminlogs]
|
||||||
|
server_name = "Inclination"
|
||||||
|
|
||||||
[server]
|
[server]
|
||||||
rules_file = "DeltaVRuleset"
|
rules_file = "DeltaVRuleset"
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
[game]
|
[game]
|
||||||
hostname = "[EN][MRP] Delta-v (Ψ) | Meridian [EU West]"
|
hostname = "[EN][MRP] Delta-V (Ψ) | Meridian [EU West]"
|
||||||
soft_max_players = 40
|
soft_max_players = 40
|
||||||
|
|
||||||
|
[adminlogs]
|
||||||
|
server_name = "Meridian"
|
||||||
|
|
||||||
[hub]
|
[hub]
|
||||||
tags = "lang:en-US,region:eu_w,rp:med,no_tag_infer"
|
tags = "lang:en-US,region:eu_w,rp:med,no_tag_infer"
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,14 @@
|
|||||||
[game]
|
[game]
|
||||||
hostname = "[EN][MRP] Delta-v (Ψ) | Periapsis [US East 2]"
|
hostname = "[EN][MRP] Delta-V (Ψ) | Periapsis [NA East 2]"
|
||||||
soft_max_players = 60
|
soft_max_players = 60
|
||||||
desc = """\
|
desc = """\
|
||||||
A medium roleplay fork based around the mysterious Noösphere, featuring unique content, custom maps, new species and a revamped science department.\
|
A medium roleplay fork based around the mysterious Noösphere, featuring unique content, custom maps, new species and a revamped science department.\
|
||||||
This server focuses on calmer shifts.\
|
This server focuses on calmer shifts.\
|
||||||
"""
|
"""
|
||||||
|
fallbackpreset = "Extended"
|
||||||
|
|
||||||
|
[adminlogs]
|
||||||
|
server_name = "Periapsis"
|
||||||
|
|
||||||
[vote]
|
[vote]
|
||||||
preset_enabled = true
|
preset_enabled = true
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -1,4 +0,0 @@
|
|||||||
cd-borg-select-subtype-flavour-text = Available cosmetic subtypes
|
|
||||||
|
|
||||||
# medical
|
|
||||||
al-borg-medical-subtype-qualified-doctor-name = qualified doctor
|
|
||||||
@@ -1,2 +1,3 @@
|
|||||||
humanoid-profile-editor-height-label = Height:
|
humanoid-profile-editor-height-label = Size - Height:
|
||||||
|
humanoid-profile-editor-height-pull-speed-penalty-label = Size - Pull Speed Reduction:
|
||||||
humanoid-profile-editor-reset-height-button = Reset
|
humanoid-profile-editor-reset-height-button = Reset
|
||||||
|
|||||||
@@ -92,6 +92,7 @@ psionic-power-precognition-unknown-shuttle-disaster-evac-pod-result-message = Yo
|
|||||||
psionic-power-precognition-syndicate-armsdealer-result-message = You see a vision of a ship lurking in the shadows, its cargo deadly.
|
psionic-power-precognition-syndicate-armsdealer-result-message = You see a vision of a ship lurking in the shadows, its cargo deadly.
|
||||||
psionic-power-precognition-rift-spawn-result-message = You see a small spark of energy, quickly expanding as it tears reality apart, twisting everything around it.
|
psionic-power-precognition-rift-spawn-result-message = You see a small spark of energy, quickly expanding as it tears reality apart, twisting everything around it.
|
||||||
psionic-power-precognition-asakim-spawn-result-message = You smell stale air from a cryopod opening, and the faint echo of an intelligence far away but very near.
|
psionic-power-precognition-asakim-spawn-result-message = You smell stale air from a cryopod opening, and the faint echo of an intelligence far away but very near.
|
||||||
|
psionic-power-precognition-gnome-spawn-result-message = You hear laughter coming from the walls and quick footsteps when your back is turned.
|
||||||
psionic-power-precognition-pitbull-spawn-result-message = You see a vision of a hundred small creatures being torn apart by bloodthirsty beasts in a maze of steel.
|
psionic-power-precognition-pitbull-spawn-result-message = You see a vision of a hundred small creatures being torn apart by bloodthirsty beasts in a maze of steel.
|
||||||
psionic-power-precognition-hitman-spawn-result-message = You see a man in a business suit, a corpse at their feet.
|
psionic-power-precognition-hitman-spawn-result-message = You see a man in a business suit, a corpse at their feet.
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
cmd-stealthmin-desc = Toggle whether others can see you in adminwho and your current entity is followable by ghosts.
|
||||||
|
cmd-stealthmin-help = Usage: stealthmin\nUse stealthmin to toggle whether you appear in the output of the adminwho command and your current entity is followable by ghosts.
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user