пара фиксов

This commit is contained in:
Remuchi
2024-03-30 11:33:13 +07:00
parent d4aba17eaa
commit 297cfd23ad
8 changed files with 123 additions and 243 deletions

View File

@@ -39,7 +39,7 @@ public sealed class VoiceMaskBoundUserInterface : BoundUserInterface
return; return;
} }
_window.UpdateState(cast.Name, cast.Verb); _window.UpdateState(cast.Name, cast.Voice, cast.Verb);
} }
protected override void Dispose(bool disposing) protected override void Dispose(bool disposing)
@@ -48,4 +48,4 @@ public sealed class VoiceMaskBoundUserInterface : BoundUserInterface
_window?.Close(); _window?.Close();
} }
} }

View File

@@ -122,8 +122,7 @@ namespace Content.Server.Administration.Managers
else else
{ {
_chat.DispatchServerMessage(session, Loc.GetString("admin-manager-stealthed-message")); _chat.DispatchServerMessage(session, Loc.GetString("admin-manager-stealthed-message"));
_chat.SendAdminAnnouncement(Loc.GetString("admin-manager-self-re-admin-message", _chat.SendAdminAnnouncement(Loc.GetString("admin-manager-self-re-admin-message", ("newAdminName", session.Name)));
("newAdminName", session.Name)), flagWhitelist: AdminFlags.Stealth);
} }
SendPermsChangedEvent(session); SendPermsChangedEvent(session);

View File

@@ -75,7 +75,6 @@ namespace Content.Server.Bed.Sleep
} }
emitSound.MinInterval = sleepSound.Interval; emitSound.MinInterval = sleepSound.Interval;
emitSound.MaxInterval = sleepSound.MaxInterval; emitSound.MaxInterval = sleepSound.MaxInterval;
emitSound.PopUp = sleepSound.PopUp;
} }
return; return;

View File

@@ -111,7 +111,7 @@ public sealed class RespiratorSystem : EntitySystem
if (TryComp(uid, out VoidAdaptationComponent? voidAdaptation)) if (TryComp(uid, out VoidAdaptationComponent? voidAdaptation))
{ {
voidAdaptation.ChemMultiplier = 0.75f; voidAdaptation.ChemMultiplier = 0.75f;
StopSuffocation(uid, respirator); StopSuffocation((uid, respirator));
respirator.SuffocationCycles = 0; respirator.SuffocationCycles = 0;
continue; continue;
} }

View File

@@ -28,7 +28,7 @@ namespace Content.Server.Chat.Managers
bool TrySendNewMessage(ICommonSession session, string newMessage, bool checkLength = false); bool TrySendNewMessage(ICommonSession session, string newMessage, bool checkLength = false);
// WD-EDIT // WD-EDIT
void SendAdminAnnouncement(string message, AdminFlags? flagBlacklist = null, AdminFlags? flagWhitelist = null); void SendAdminAnnouncement(string message);
void SendAdminAlert(string message); void SendAdminAlert(string message);
void SendAdminAlert(EntityUid player, string message); void SendAdminAlert(EntityUid player, string message);

View File

@@ -1,262 +1,143 @@
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Content.Server.Administration.Logs; using Content.Server.Administration.Logs;
using Content.Server.Atmos.EntitySystems;
using Content.Server.Chat.Systems; using Content.Server.Chat.Systems;
using Content.Server.GameTicking.Rules; using Content.Server.GameTicking.Rules;
using Content.Server.GameTicking.Rules.Components; using Content.Server.GameTicking.Rules.Components;
using Content.Server.Station.Components; using Content.Server.Station.Components;
using Content.Shared.Database; using Content.Shared.Database;
using Content.Shared.Physics;
using Robust.Server.GameObjects;
using Robust.Shared.Audio.Systems; using Robust.Shared.Audio.Systems;
using Robust.Shared.Collections;
using Robust.Shared.Map;
using Robust.Shared.Map.Components;
using Robust.Shared.Physics;
using Robust.Shared.Physics.Components;
using Robust.Shared.Player; using Robust.Shared.Player;
using Robust.Shared.Random;
using Robust.Shared.Timing; using Robust.Shared.Timing;
namespace Content.Server._White.AspectsSystem.Base namespace Content.Server._White.AspectsSystem.Base;
/// <summary>
/// Base class for aspect systems.
/// </summary>
/// <typeparam name="T">The type of component to which the system is applied.</typeparam>
public abstract class AspectSystem<T> : GameRuleSystem<T> where T : Component
{ {
/// <summary> [Dependency] private readonly IAdminLogManager _adminLogManager = default!;
/// Base class for aspect systems. [Dependency] private readonly IGameTiming _timing = default!;
/// </summary> [Dependency] private readonly ChatSystem _chatSystem = default!;
/// <typeparam name="T">The type of component to which the system is applied.</typeparam> [Dependency] private readonly SharedAudioSystem _audio = default!;
public abstract class AspectSystem<T> : GameRuleSystem<T> where T : Component
protected ISawmill Sawmill = default!;
public override void Initialize()
{ {
[Dependency] private readonly IAdminLogManager _adminLogManager = default!; base.Initialize();
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly ChatSystem _chatSystem = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly IRobustRandom _robustRandom = default!;
[Dependency] private readonly AtmosphereSystem _atmosphere = default!;
[Dependency] private readonly TransformSystem _transform = default!;
protected ISawmill Sawmill = default!; Sawmill = Logger.GetSawmill("aspects");
}
public override void Initialize() /// <summary>
/// Called every tick when this aspect is running.
/// </summary>
public override void Update(float frameTime)
{
base.Update(frameTime);
var query = EntityQueryEnumerator<AspectComponent, GameRuleComponent>();
while (query.MoveNext(out var uid, out var aspect, out var ruleData))
{ {
base.Initialize(); if (!GameTicker.IsGameRuleAdded(uid, ruleData))
continue;
Sawmill = Logger.GetSawmill("aspects"); if (!GameTicker.IsGameRuleActive(uid, ruleData) && _timing.CurTime >= aspect.StartTime)
}
/// <summary>
/// Called every tick when this aspect is running.
/// </summary>
public override void Update(float frameTime)
{
base.Update(frameTime);
var query = EntityQueryEnumerator<AspectComponent, GameRuleComponent>();
while (query.MoveNext(out var uid, out var aspect, out var ruleData))
{ {
if (!GameTicker.IsGameRuleAdded(uid, ruleData)) GameTicker.StartGameRule(uid, ruleData);
continue;
if (!GameTicker.IsGameRuleActive(uid, ruleData) && _timing.CurTime >= aspect.StartTime)
{
GameTicker.StartGameRule(uid, ruleData);
}
} }
} }
}
/// <summary> /// <summary>
/// Called when an aspect is added to an entity. /// Called when an aspect is added to an entity.
/// </summary> /// </summary>
protected override void Added(EntityUid uid, T component, GameRuleComponent gameRule, GameRuleAddedEvent args) protected override void Added(EntityUid uid, T component, GameRuleComponent gameRule, GameRuleAddedEvent args)
{
base.Added(uid, component, gameRule, args);
if (!TryComp<AspectComponent>(uid, out var aspect))
return;
_adminLogManager.Add(LogType.AspectAnnounced, $"Aspect added {ToPrettyString(uid)}");
if (aspect is { Description: not null, IsHidden: false })
{ {
base.Added(uid, component, gameRule, args); _chatSystem.DispatchGlobalAnnouncement(aspect.Description, playSound: false,
colorOverride: Color.Aquamarine);
if (!TryComp<AspectComponent>(uid, out var aspect))
return;
_adminLogManager.Add(LogType.AspectAnnounced, $"Aspect added {ToPrettyString(uid)}");
if (aspect is { Description: not null, IsHidden: false })
{
_chatSystem.DispatchGlobalAnnouncement(aspect.Description, playSound: false,
colorOverride: Color.Aquamarine);
}
_audio.PlayGlobal(aspect.StartAudio, Filter.Broadcast(), true);
aspect.StartTime = _timing.CurTime + aspect.StartDelay;
} }
/// <summary> _audio.PlayGlobal(aspect.StartAudio, Filter.Broadcast(), true);
/// Called when an aspect is started. aspect.StartTime = _timing.CurTime + aspect.StartDelay;
/// </summary> }
protected override void Started(
EntityUid uid, /// <summary>
T component, /// Called when an aspect is started.
GameRuleComponent gameRule, /// </summary>
GameRuleStartedEvent args) protected override void Started(
EntityUid uid,
T component,
GameRuleComponent gameRule,
GameRuleStartedEvent args)
{
base.Started(uid, component, gameRule, args);
if (!TryComp<AspectComponent>(uid, out _))
return;
_adminLogManager.Add(LogType.AspectStarted, LogImpact.High, $"Aspect started: {ToPrettyString(uid)}");
}
/// <summary>
/// Called when an aspect is ended.
/// </summary>
protected override void Ended(EntityUid uid, T component, GameRuleComponent gameRule, GameRuleEndedEvent args)
{
base.Ended(uid, component, gameRule, args);
if (!TryComp<AspectComponent>(uid, out var aspect))
return;
_adminLogManager.Add(LogType.AspectStopped, $"Aspect ended: {ToPrettyString(uid)}");
if (aspect is { Name: not null, IsHidden: false })
{ {
base.Started(uid, component, gameRule, args); _chatSystem.DispatchGlobalAnnouncement($"Именем аспекта являлось: {aspect.Name}", playSound: false,
colorOverride: Color.Aquamarine);
if (!TryComp<AspectComponent>(uid, out _))
return;
_adminLogManager.Add(LogType.AspectStarted, LogImpact.High, $"Aspect started: {ToPrettyString(uid)}");
} }
/// <summary> _audio.PlayGlobal(aspect.EndAudio, Filter.Broadcast(), true);
/// Called when an aspect is ended. }
/// </summary>
protected override void Ended(EntityUid uid, T component, GameRuleComponent gameRule, GameRuleEndedEvent args)
{
base.Ended(uid, component, gameRule, args);
if (!TryComp<AspectComponent>(uid, out var aspect))
return;
_adminLogManager.Add(LogType.AspectStopped, $"Aspect ended: {ToPrettyString(uid)}");
if (aspect is { Name: not null, IsHidden: false })
{
_chatSystem.DispatchGlobalAnnouncement($"Именем аспекта являлось: {aspect.Name}", playSound: false,
colorOverride: Color.Aquamarine);
}
_audio.PlayGlobal(aspect.EndAudio, Filter.Broadcast(), true);
}
#region Helpers #region Helpers
/// <summary> /// <summary>
/// Forces this aspect to end prematurely. /// Forces this aspect to end prematurely.
/// </summary> /// </summary>
/// <param name="uid">The entity UID on which the aspect is being performed.</param> /// <param name="uid">The entity UID on which the aspect is being performed.</param>
/// <param name="component">The game rule component associated with this aspect (optional).</param> /// <param name="component">The game rule component associated with this aspect (optional).</param>
protected void ForceEndSelf(EntityUid uid, GameRuleComponent? component = null) protected void ForceEndSelf(EntityUid uid, GameRuleComponent? component = null)
{
GameTicker.EndGameRule(uid, component);
}
protected bool TryGetStationGrids(
[NotNullWhen(true)] out EntityUid? targetStation,
[NotNullWhen(true)] out HashSet<EntityUid>? grids)
{
if (!TryGetRandomStation(out targetStation))
{ {
GameTicker.EndGameRule(uid, component); targetStation = EntityUid.Invalid;
grids = null;
return false;
} }
protected bool TryGetRandomStation( grids = Comp<StationDataComponent>(targetStation.Value).Grids;
[NotNullWhen(true)] out EntityUid? station,
Func<EntityUid, bool>? filter = null)
{
var stations = new ValueList<EntityUid>();
if (filter == null) return grids.Count > 0;
{ }
var stationCount = Count<StationEventEligibleComponent>();
if (stationCount > 0)
{
stations.EnsureCapacity(stationCount);
}
}
filter ??= _ => true;
var query = AllEntityQuery<StationEventEligibleComponent>();
while (query.MoveNext(out var uid, out _))
{
if (!filter(uid))
continue;
stations.Add(uid);
}
if (stations.Count == 0)
{
station = null;
return false;
}
station = stations[_robustRandom.Next(stations.Count)];
return true;
}
protected bool TryGetStationGrids(
[NotNullWhen(true)] out EntityUid? targetStation,
[NotNullWhen(true)] out HashSet<EntityUid>? grids)
{
if (!TryGetRandomStation(out targetStation))
{
targetStation = EntityUid.Invalid;
grids = null;
return false;
}
grids = Comp<StationDataComponent>(targetStation.Value).Grids;
return grids.Count > 0;
}
protected bool TryFindRandomTile(
out Vector2i tile,
[NotNullWhen(true)] out EntityUid? targetStation,
out EntityUid targetGrid,
out EntityCoordinates targetCoords)
{
tile = default;
targetCoords = EntityCoordinates.Invalid;
if (!TryGetStationGrids(out targetStation, out var possibleTargets))
{
targetGrid = EntityUid.Invalid;
return false;
}
targetGrid = _robustRandom.Pick(possibleTargets);
foreach (var target in possibleTargets.Where(HasComp<BecomesStationComponent>))
{
targetGrid = target;
break;
}
if (!TryComp<MapGridComponent>(targetGrid, out var gridComp))
return false;
var found = false;
var gridBounds = gridComp.LocalAABB.Scale(0.6f);
for (var i = 0; i < 10; i++)
{
var randomX = _robustRandom.Next((int) gridBounds.Left, (int) gridBounds.Right);
var randomY = _robustRandom.Next((int) gridBounds.Bottom, (int) gridBounds.Top);
tile = new Vector2i(randomX, randomY);
if (_atmosphere.IsTileSpace(targetGrid, Transform(targetGrid).MapUid, tile,
mapGridComp: gridComp)
|| _atmosphere.IsTileAirBlocked(targetGrid, tile, mapGridComp: gridComp))
{
continue;
}
var physQuery = GetEntityQuery<PhysicsComponent>();
var valid = true;
foreach (var ent in gridComp.GetAnchoredEntities(tile))
{
if (!physQuery.TryGetComponent(ent, out var body))
continue;
if (body.BodyType != BodyType.Static ||
!body.Hard ||
(body.CollisionLayer & (int) CollisionGroup.Impassable) == 0)
continue;
valid = false;
break;
}
if (!valid)
continue;
found = true;
targetCoords = gridComp.GridTileToLocal(tile);
break;
}
return found;
}
#endregion #endregion
} }
}

View File

@@ -190,8 +190,8 @@ public sealed class TorchCultistsProviderSystem : EntitySystem
var ownerTransform = Transform(args.User); var ownerTransform = Transform(args.User);
if (_station.GetStationInMap(ownerTransform.MapID) is not { } station || if (_station.GetStationInMap(ownerTransform.MapID) is not { } station ||
!TryComp<StationDataComponent>(station, out var data) || !TryComp<StationDataComponent>(station, out var stationData) ||
_station.GetLargestGrid(data) is not { } grid) _station.GetLargestGrid(stationData) is not { } grid)
{ {
if (ownerTransform.GridUid == null) if (ownerTransform.GridUid == null)
return; return;
@@ -199,13 +199,13 @@ public sealed class TorchCultistsProviderSystem : EntitySystem
grid = ownerTransform.GridUid.Value; grid = ownerTransform.GridUid.Value;
} }
if (!TryComp<MapGridComponent>(grid, out var gridComp)) if (!TryComp<MapGridComponent>(grid, out var mapGrid))
{ {
return; return;
} }
var gridTransform = Transform(grid); var gridTransform = Transform(grid);
var gridBounds = gridComp.LocalAABB.Scale(0.7f); // чтобы не заспавнить на самом краю станции var gridBounds = mapGrid.LocalAABB.Scale(0.7f); // чтобы не заспавнить на самом краю станции
var targetCoords = gridTransform.Coordinates; var targetCoords = gridTransform.Coordinates;
@@ -217,8 +217,8 @@ public sealed class TorchCultistsProviderSystem : EntitySystem
var tile = new Vector2i(randomX, randomY); var tile = new Vector2i(randomX, randomY);
// no air-blocked areas. // no air-blocked areas.
if (_atmosphere.IsTileSpace(grid, gridTransform.MapUid, tile, mapGridComp: gridComp) || if (_atmosphere.IsTileSpace(grid, gridTransform.MapUid, tile) ||
_atmosphere.IsTileAirBlocked(grid, tile, mapGridComp: gridComp)) _atmosphere.IsTileAirBlocked(grid, tile, mapGridComp: mapGrid))
{ {
continue; continue;
} }
@@ -226,7 +226,7 @@ public sealed class TorchCultistsProviderSystem : EntitySystem
// don't spawn inside of solid objects // don't spawn inside of solid objects
var physQuery = GetEntityQuery<PhysicsComponent>(); var physQuery = GetEntityQuery<PhysicsComponent>();
var valid = true; var valid = true;
foreach (var ent in _map.GetAnchoredEntities(grid, gridComp, tile)) foreach (var ent in _map.GetAnchoredEntities(grid, mapGrid, tile))
{ {
if (!physQuery.TryGetComponent(ent, out var body)) if (!physQuery.TryGetComponent(ent, out var body))
continue; continue;
@@ -243,7 +243,7 @@ public sealed class TorchCultistsProviderSystem : EntitySystem
if (!valid) if (!valid)
continue; continue;
targetCoords = _map.GridTileToLocal(grid, gridComp, tile); targetCoords = _map.GridTileToLocal(grid, mapGrid, tile);
break; break;
} }

View File

@@ -321,9 +321,10 @@ namespace Content.Server._White.Supermatter.Systems
//if there are space tiles next to SM //if there are space tiles next to SM
//TODO: change moles out for checking if adjacent tiles exist //TODO: change moles out for checking if adjacent tiles exist
foreach (var ind in _atmosphere.GetAdjacentTileMixtures(xform.GridUid.Value, indices)) var query = _atmosphere.GetAdjacentTileMixtures(xform.GridUid.Value, indices);
while(query.MoveNext(out var mix))
{ {
if (ind.TotalMoles != 0) if (mix.TotalMoles != 0)
continue; continue;
var integrity = GetIntegrity(sMcomponent.Damage, sMcomponent.ExplosionPoint); var integrity = GetIntegrity(sMcomponent.Damage, sMcomponent.ExplosionPoint);