Merge remote-tracking branch 'upstream/master' into UPS

This commit is contained in:
Jabak
2024-07-21 20:30:35 +03:00
47 changed files with 692 additions and 214 deletions

View File

@@ -7,7 +7,8 @@ using Robust.Shared.Player;
namespace Content.Client._White.Overlays;
public sealed class NightVisionSystem : SharedNightVisionSystem
public sealed class NightVisionSystem : SharedEnhancedVisionSystem<NightVisionComponent, TemporaryNightVisionComponent,
ToggleNightVisionEvent>
{
[Dependency] private readonly IPlayerManager _player = default!;
[Dependency] private readonly IOverlayManager _overlayMan = default!;
@@ -46,12 +47,12 @@ public sealed class NightVisionSystem : SharedNightVisionSystem
if (TryComp(ent, out NightVisionComponent? nightVision) && nightVision.IsActive)
return;
UpdateNightVision(ent, false);
UpdateEnhancedVision(ent, false);
}
private void OnTempInit(Entity<TemporaryNightVisionComponent> ent, ref ComponentInit args)
{
UpdateNightVision(ent, true);
UpdateEnhancedVision(ent, true);
}
private void OnPlayerAttached(EntityUid uid, NightVisionComponent component, PlayerAttachedEvent args)
@@ -76,7 +77,7 @@ public sealed class NightVisionSystem : SharedNightVisionSystem
UpdateNightVision(active);
}
protected override void UpdateNightVision(EntityUid uid, bool active)
protected override void UpdateEnhancedVision(EntityUid uid, bool active)
{
if (_player.LocalSession?.AttachedEntity != uid)
return;

View File

@@ -22,6 +22,7 @@ public sealed class ThermalVisionOverlay : Overlay
public override OverlaySpace Space => OverlaySpace.WorldSpace;
private readonly List<NightVisionRenderEntry> _entries = new();
private EntityUid _pointLightEntity;
public ThermalVisionOverlay()
{
@@ -46,23 +47,50 @@ public sealed class ThermalVisionOverlay : Overlay
return;
}
var transform = _entity.GetComponent<TransformComponent>(ent);
if (_pointLightEntity == default)
{
_pointLightEntity = _entity.SpawnAttachedTo(null, transform.Coordinates);
_entity.EnsureComponent<PointLightComponent>(_pointLightEntity);
_transform.SetParent(_pointLightEntity, ent);
}
else
{
var pointLightXForm = _entity.GetComponent<TransformComponent>(_pointLightEntity);
if (pointLightXForm.ParentUid != ent)
_transform.SetParent(_pointLightEntity, pointLightXForm, ent, transform);
}
if (HasOccluders(ent))
return;
var handle = args.WorldHandle;
var eye = args.Viewport.Eye;
var mapId = eye?.Position.MapId;
var eyeRot = eye?.Rotation ?? default;
_entries.Clear();
var entities = _entity.EntityQueryEnumerator<BodyComponent, SpriteComponent, TransformComponent>();
while (entities.MoveNext(out var uid, out _, out var sprite, out var xform))
{
if (HasOccluders(uid))
var entity = uid;
if (_container.TryGetOuterContainer(uid, xform, out var container))
{
var owner = container.Owner;
if (_entity.TryGetComponent<SpriteComponent>(owner, out var ownerSprite) &&
_entity.TryGetComponent<TransformComponent>(owner, out var ownerXform))
{
entity = owner;
sprite = ownerSprite;
xform = ownerXform;
}
}
if (_entries.Any(e => e.Ent.Item1 == entity))
continue;
_entries.Add(new NightVisionRenderEntry((uid, sprite, xform),
eye?.Position.MapId,
eyeRot));
_entries.Add(new NightVisionRenderEntry((entity, sprite, xform), mapId, eyeRot));
}
foreach (var entry in _entries)
@@ -79,7 +107,7 @@ public sealed class ThermalVisionOverlay : Overlay
Angle eyeRot)
{
var (uid, sprite, xform) = ent;
if (xform.MapID != map || _container.IsEntityOrParentInContainer(uid))
if (xform.MapID != map || HasOccluders(uid))
return;
var position = _transform.GetWorldPosition(xform);
@@ -95,6 +123,15 @@ public sealed class ThermalVisionOverlay : Overlay
Box2.CenteredAround(mapCoordinates.Position, new Vector2(0.4f, 0.4f)));
return occluders.Any(o => o.Component.Enabled);
}
public void Reset()
{
if (_pointLightEntity == default)
return;
_entity.DeleteEntity(_pointLightEntity);
_pointLightEntity = default;
}
}
public record struct NightVisionRenderEntry(

View File

@@ -1,13 +1,15 @@
using Content.Shared._Miracle.Systems;
using Content.Shared.GameTicking;
using Content.Shared._White.Overlays;
using Robust.Client.GameObjects;
using Robust.Client.Graphics;
using Robust.Client.Player;
using Robust.Shared.Player;
namespace Content.Client._White.Overlays;
public sealed class ThermalVisionSystem : SharedThermalVisionSystem
public sealed class ThermalVisionSystem : SharedEnhancedVisionSystem<ThermalVisionComponent,
TemporaryThermalVisionComponent, ToggleThermalVisionEvent>
{
[Dependency] private readonly IPlayerManager _player = default!;
[Dependency] private readonly IOverlayManager _overlayMan = default!;
@@ -46,12 +48,12 @@ public sealed class ThermalVisionSystem : SharedThermalVisionSystem
if (TryComp(ent, out ThermalVisionComponent? thermalVision) && thermalVision.IsActive)
return;
UpdateThermalVision(ent, false);
UpdateEnhancedVision(ent, false);
}
private void OnTempInit(Entity<TemporaryThermalVisionComponent> ent, ref ComponentInit args)
{
UpdateThermalVision(ent, true);
UpdateEnhancedVision(ent, true);
}
private void OnPlayerAttached(EntityUid uid, ThermalVisionComponent component, PlayerAttachedEvent args)
@@ -76,7 +78,7 @@ public sealed class ThermalVisionSystem : SharedThermalVisionSystem
UpdateThermalVision(active);
}
protected override void UpdateThermalVision(EntityUid uid, bool active)
protected override void UpdateEnhancedVision(EntityUid uid, bool active)
{
if (_player.LocalSession?.AttachedEntity != uid)
return;
@@ -89,6 +91,7 @@ public sealed class ThermalVisionSystem : SharedThermalVisionSystem
{
if (_player.LocalEntity == null)
{
_overlay.Reset();
_overlayMan.RemoveOverlay(_overlay);
return;
}
@@ -99,11 +102,15 @@ public sealed class ThermalVisionSystem : SharedThermalVisionSystem
if (active)
_overlayMan.AddOverlay(_overlay);
else
{
_overlay.Reset();
_overlayMan.RemoveOverlay(_overlay);
}
}
private void OnRestart(RoundRestartCleanupEvent ev)
{
_overlay.Reset();
_overlayMan.RemoveOverlay(_overlay);
}
}

View File

@@ -1,7 +1,9 @@
using Content.Shared._Miracle.Systems;
using Content.Shared._White.Overlays;
namespace Content.Server._Miracle.Systems;
public sealed class NightVisionSystem : SharedNightVisionSystem
public sealed class NightVisionSystem : SharedEnhancedVisionSystem<NightVisionComponent, TemporaryNightVisionComponent,
ToggleNightVisionEvent>
{
}

View File

@@ -1,7 +1,9 @@
using Content.Shared._Miracle.Systems;
using Content.Shared._White.Overlays;
namespace Content.Server._Miracle.Systems;
public sealed class ThermalVisionSystem : SharedThermalVisionSystem
public sealed class ThermalVisionSystem : SharedEnhancedVisionSystem<ThermalVisionComponent,
TemporaryThermalVisionComponent, ToggleThermalVisionEvent>
{
}

View File

@@ -0,0 +1,64 @@
using Content.Shared._White.Overlays;
using Content.Shared.Actions;
using Robust.Shared.Audio.Systems;
using Robust.Shared.Timing;
namespace Content.Shared._Miracle.Systems;
public abstract class SharedEnhancedVisionSystem<TComp, TTempComp, TEvent> : EntitySystem
where TComp : BaseEnhancedVisionComponent
where TEvent : InstantActionEvent
where TTempComp : Component
{
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly SharedActionsSystem _actions = default!;
[Dependency] private readonly IGameTiming _timing = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<TComp, TEvent>(OnToggle);
SubscribeLocalEvent<TComp, ComponentInit>(OnInit);
SubscribeLocalEvent<TComp, ComponentRemove>(OnRemove);
}
private void OnRemove(EntityUid uid, TComp component, ComponentRemove args)
{
_actions.RemoveAction(uid, component.ToggleActionEntity);
if (HasComp<TTempComp>(uid))
return;
UpdateEnhancedVision(uid, false);
}
private void OnInit(EntityUid uid, TComp component, ComponentInit args)
{
_actions.AddAction(uid, ref component.ToggleActionEntity, component.ToggleAction);
if (!component.IsActive && HasComp<TTempComp>(uid))
return;
UpdateEnhancedVision(uid, component.IsActive);
}
protected virtual void UpdateEnhancedVision(EntityUid uid, bool active) { }
private void OnToggle(EntityUid uid, TComp component, TEvent args)
{
if (!_timing.IsFirstTimePredicted)
return;
component.IsActive = !component.IsActive;
_audio.PlayPredicted(component.IsActive ? component.ActivateSound : component.DeactivateSound, uid, uid);
args.Handled = true;
if (!component.IsActive && HasComp<TTempComp>(uid))
return;
UpdateEnhancedVision(uid, component.IsActive);
}
}

View File

@@ -1,64 +0,0 @@
using Content.Shared._White.Overlays;
using Content.Shared.Actions;
using Robust.Shared.Audio.Systems;
using Robust.Shared.Timing;
namespace Content.Shared._Miracle.Systems;
public abstract class SharedNightVisionSystem : EntitySystem
{
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly SharedActionsSystem _actions = default!;
[Dependency] private readonly IGameTiming _timing = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<NightVisionComponent, ToggleNightVisionEvent>(OnToggle);
SubscribeLocalEvent<NightVisionComponent, ComponentInit>(OnInit);
SubscribeLocalEvent<NightVisionComponent, ComponentRemove>(OnRemove);
}
private void OnRemove(EntityUid uid, NightVisionComponent component, ComponentRemove args)
{
_actions.RemoveAction(uid, component.ToggleActionEntity);
if (HasComp<TemporaryNightVisionComponent>(uid))
return;
UpdateNightVision(uid, false);
}
private void OnInit(EntityUid uid, NightVisionComponent component, ComponentInit args)
{
_actions.AddAction(uid, ref component.ToggleActionEntity, component.ToggleAction);
if (!component.IsActive && HasComp<TemporaryNightVisionComponent>(uid))
return;
UpdateNightVision(uid, component.IsActive);
}
protected virtual void UpdateNightVision(EntityUid uid, bool active) { }
private void OnToggle(EntityUid uid, NightVisionComponent component, ToggleNightVisionEvent args)
{
if (!_timing.IsFirstTimePredicted)
return;
component.IsActive = !component.IsActive;
if (component.IsActive && component.ActivateSound != null)
_audio.PlayPredicted(component.ActivateSound, uid, uid);
else if (component.DeactivateSound != null)
_audio.PlayPredicted(component.DeactivateSound, uid, uid);
args.Handled = true;
if (!component.IsActive && HasComp<TemporaryNightVisionComponent>(uid))
return;
UpdateNightVision(uid, component.IsActive);
}
}

View File

@@ -1,64 +0,0 @@
using Content.Shared._White.Overlays;
using Content.Shared.Actions;
using Robust.Shared.Audio.Systems;
using Robust.Shared.Timing;
namespace Content.Shared._Miracle.Systems;
public abstract class SharedThermalVisionSystem : EntitySystem
{
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly SharedActionsSystem _actions = default!;
[Dependency] private readonly IGameTiming _timing = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<ThermalVisionComponent, ToggleThermalVisionEvent>(OnToggle);
SubscribeLocalEvent<ThermalVisionComponent, ComponentInit>(OnInit);
SubscribeLocalEvent<ThermalVisionComponent, ComponentRemove>(OnRemove);
}
private void OnRemove(EntityUid uid, ThermalVisionComponent component, ComponentRemove args)
{
_actions.RemoveAction(uid, component.ToggleActionEntity);
if (HasComp<TemporaryThermalVisionComponent>(uid))
return;
UpdateThermalVision(uid, false);
}
private void OnInit(EntityUid uid, ThermalVisionComponent component, ComponentInit args)
{
_actions.AddAction(uid, ref component.ToggleActionEntity, component.ToggleAction);
if (!component.IsActive && HasComp<TemporaryThermalVisionComponent>(uid))
return;
UpdateThermalVision(uid, component.IsActive);
}
protected virtual void UpdateThermalVision(EntityUid uid, bool active) { }
private void OnToggle(EntityUid uid, ThermalVisionComponent component, ToggleThermalVisionEvent args)
{
if (!_timing.IsFirstTimePredicted)
return;
component.IsActive = !component.IsActive;
if (component.IsActive && component.ActivateSound != null)
_audio.PlayPredicted(component.ActivateSound, uid, uid);
else if (component.DeactivateSound != null)
_audio.PlayPredicted(component.DeactivateSound, uid, uid);
args.Handled = true;
if (!component.IsActive && HasComp<TemporaryThermalVisionComponent>(uid))
return;
UpdateThermalVision(uid, component.IsActive);
}
}

View File

@@ -0,0 +1,24 @@
using Robust.Shared.Audio;
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
namespace Content.Shared._White.Overlays;
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
public abstract partial class BaseEnhancedVisionComponent : BaseNvOverlayComponent
{
[DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
public bool IsActive = true;
[DataField]
public virtual SoundSpecifier? ActivateSound { get; set; }= new SoundPathSpecifier("/Audio/White/Items/Goggles/activate.ogg");
[DataField]
public virtual SoundSpecifier? DeactivateSound { get; set; } = new SoundPathSpecifier("/Audio/White/Items/Goggles/deactivate.ogg");
[DataField]
public virtual EntProtoId? ToggleAction { get; set; }
[ViewVariables]
public EntityUid? ToggleActionEntity;
}

View File

@@ -6,25 +6,13 @@ using Robust.Shared.Prototypes;
namespace Content.Shared._White.Overlays;
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
public sealed partial class NightVisionComponent : BaseNvOverlayComponent
public sealed partial class NightVisionComponent : BaseEnhancedVisionComponent
{
[DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
public override Color Color { get; set; } = Color.FromHex("#98FB98");
[DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
public bool IsActive = true;
[DataField]
public SoundSpecifier? ActivateSound = new SoundPathSpecifier("/Audio/White/Items/Goggles/activate.ogg");
[DataField]
public SoundSpecifier? DeactivateSound = new SoundPathSpecifier("/Audio/White/Items/Goggles/deactivate.ogg");
[DataField]
public EntProtoId? ToggleAction = "ToggleNightVision";
[ViewVariables]
public EntityUid? ToggleActionEntity;
public override EntProtoId? ToggleAction { get; set; } = "ToggleNightVision";
}
public sealed partial class ToggleNightVisionEvent : InstantActionEvent

View File

@@ -6,25 +6,13 @@ using Robust.Shared.Prototypes;
namespace Content.Shared._White.Overlays;
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
public sealed partial class ThermalVisionComponent : BaseNvOverlayComponent
public sealed partial class ThermalVisionComponent : BaseEnhancedVisionComponent
{
[DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
public override Color Color { get; set; } = Color.FromHex("#F84742");
[DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
public bool IsActive = true;
[DataField]
public SoundSpecifier? ActivateSound = new SoundPathSpecifier("/Audio/White/Items/Goggles/activate.ogg");
[DataField]
public SoundSpecifier? DeactivateSound = new SoundPathSpecifier("/Audio/White/Items/Goggles/deactivate.ogg");
[DataField]
public EntProtoId? ToggleAction = "ToggleThermalVision";
[ViewVariables]
public EntityUid? ToggleActionEntity;
public override EntProtoId? ToggleAction { get; set; } = "ToggleThermalVision";
}
public sealed partial class ToggleThermalVisionEvent : InstantActionEvent

View File

@@ -6245,3 +6245,68 @@
id: 400
time: '2024-07-20T15:28:44.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/470
- author: Aviu
changes:
- message: "\u0422\u0435\u043F\u0435\u0440\u044C \u0442\u0435\u0440\u043C\u0430\u043B\
\u043A\u0438 \u043F\u043E\u0434\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u044E\
\u0442 \u043A\u043E\u043D\u0442\u0435\u0439\u043D\u0435\u0440, \u0435\u0441\u043B\
\u0438 \u0432 \u043D\u0435\u043C \u043A\u0442\u043E-\u0442\u043E \u043D\u0430\
\u0445\u043E\u0434\u0438\u0442\u0441\u044F."
type: Add
- message: "\u0422\u0435\u0440\u043C\u0430\u043B\u043A\u0438 \u0442\u0435\u043F\u0435\
\u0440\u044C \u0434\u0430\u044E\u0442 \u043D\u0435\u043C\u043D\u043E\u0433\u043E\
\ \u043D\u043E\u0447\u043D\u043E\u0433\u043E \u0437\u0440\u0435\u043D\u0438\u044F\
."
type: Add
id: 401
time: '2024-07-21T11:30:47.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/471
- author: ThereDrD
changes:
- message: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0430 \u043A\u0430\u0440\
\u0442\u0430 \u0441\u0442\u0430\u043D\u0446\u0438\u0438 \u0432 \u043F\u043E\u0431\
\u0440\u044F\u043A\u0443\u0448\u043A\u0438 \u043B\u043E\u0430\u0434\u0430\u0443\
\u0442\u043E\u0432"
type: Add
- message: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D \u0441\u0432\u0438\u0441\
\u0442\u043E\u043A \u0438 \u0444\u043E\u043D\u0430\u0440\u0438\u043A \u0434\u043B\
\u044F \u0432\u0441\u0435\u0433\u043E \u0421\u0411 \u0432 \u043B\u043E\u0430\
\u0434\u0430\u0443\u0442\u044B"
type: Add
- message: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0430 \u0440\u0430\u0437\
\u0433\u0440\u0443\u0437\u043A\u0430 \u0432 \u043B\u043E\u0430\u0434\u0430\u0443\
\u0442\u044B \u0434\u043B\u044F \u0432\u0441\u0435\u0433\u043E \u0421\u0411."
type: Add
- message: "\u041F\u043E\u0444\u0438\u043A\u0448\u0435\u043D\u044B \u043D\u0435\u043A\
\u043E\u0442\u043E\u0440\u044B\u0435 \u0441\u043B\u043E\u043C\u0430\u043D\u043D\
\u044B\u0435 \u043F\u0440\u043E\u0442\u043E\u0442\u0438\u043F\u044B \u043B\u043E\
\u0430\u0434\u0430\u0443\u0442\u043E\u0432, \u0443 \u043D\u0435\u043A\u043E\u0442\
\u043E\u0440\u044B\u0445 \u0440\u043E\u043B\u0435\u0439 \u043F\u043E\u044F\u0432\
\u0438\u043B\u0438\u0441\u044C \u0432\u0435\u0449\u0438, \u043A\u043E\u0442\u043E\
\u0440\u044B\u0445 \u0440\u0430\u043D\u044C\u0448\u0435 \u043D\u0435 \u0431\u044B\
\u043B\u043E. \u042D\u0442\u043E \u0432\u0441\u0435 \u0435\u0449\u0435 \u043D\
\u0435 \u0444\u0438\u043A\u0441\u0438\u0442 \u043F\u0440\u043E\u0431\u043B\u0435\
\u043C\u0443 \u0441\u0431\u0440\u0430\u0441\u044B\u0432\u0430\u043D\u0438\u044F\
\ \u043B\u043E\u0430\u0434\u0430\u0443\u0442\u043E\u0432 \u043F\u0440\u0438\
\ \u0432\u044B\u0431\u043E\u0440\u0435 \u0432\u0435\u0449\u0435\u0439 \u0441\
\ \u0442\u0430\u0439\u043C\u0435\u0440\u0430\u043C\u0438. \u041F\u043E\u0434\
\u0440\u043E\u0431\u043D\u0435\u0435 \u0432 \u0437\u0430\u043A\u0440\u0435\u043F\
\u043B\u0435\u043D\u043D\u043E\u043C \u0441\u043E\u043E\u0431\u0449\u0435\u043D\
\u0438\u0438 \u043A\u0430\u043D\u0430\u043B\u0430 \u0438\u0437\u043C\u0435\u043D\
\u0435\u043D\u0438\u0439."
type: Fix
id: 402
time: '2024-07-21T12:48:53.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/473
- author: PuroSlavKing
changes:
- message: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u044B \u0413\u043E\u043D\
\u0434\u043E\u043B\u044B. \u041C\u043E\u0436\u043D\u043E \u043A\u0443\u043F\u0438\
\u0442\u044C \u044F\u0449\u0438\u043A \u0441 \u0413\u043E\u043D\u0434\u043E\u043B\
\u043E\u0439 \u0437\u0430 2\u0422\u041A, \u0432 \u0430\u043F\u043B\u0438\u043D\
\u043A\u0435, \u0432\u043A\u043B\u0430\u0434\u043A\u0430 \u0441\u0430\u0431\u043E\
\u0442\u0430\u0436."
type: Add
id: 403
time: '2024-07-21T16:53:20.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/475

View File

@@ -0,0 +1 @@
accent-words-gondola-1 = ...

View File

@@ -0,0 +1,3 @@
chat-speech-verb-name-gondola = Гондола
chat-speech-verb-gondola-1 = уставляется взглядом
chat-speech-verb-gondola-2 = тяжело дышит

View File

@@ -0,0 +1 @@
reagent-popup-tranquility = Вы чувствуете себя странно спокойными...

View File

@@ -0,0 +1 @@
reagent-physical-desc-calming = успокаивающий

View File

@@ -0,0 +1,2 @@
uplink-gondola-name = Ящик с Гондолой
uplink-gondola-desc = Ящик, содержащий одну стандартную Гондолу.

View File

@@ -0,0 +1,5 @@
ent-FoodMeatGondola = сырое мясо Гондолы
.desc = Ты монстр.
ent-FoodMeatGondolaCooked = стейк из Гондолы
.desc = Приготовленное мясо Гондолы...

View File

@@ -7,3 +7,41 @@
id: ScienceHeadset
equipment:
ears: ClothingHeadsetScience
# Jumpsuit
- type: itemLoadout # WD
id: RoboticistJumpskirt
equipment: RoboticistJumpskirt
- type: startingGear
id: RoboticistJumpskirt
equipment:
jumpsuit: ClothingUniformJumpskirtRoboticist
- type: itemLoadout # WD
id: RoboticistJumpsuit
equipment: RoboticistJumpsuit
- type: startingGear
id: RoboticistJumpsuit
equipment:
jumpsuit: ClothingUniformJumpsuitRoboticist
# Outercloting
- type: itemLoadout # WD
id: RoboticistLabCoat
equipment: RoboticistLabCoat
- type: startingGear
id: RoboticistLabCoat
equipment:
outerClothing: ClothingOuterCoatRoboOpened
# Gloves
- type: itemLoadout # WD
id: RoboticistGloves
equipment: RoboticistGloves
- type: startingGear
id: RoboticistGloves
equipment:
gloves: ClothingHandsGlovesRobohands

View File

@@ -1,15 +1,6 @@
# jumpsuit
- type: itemLoadout
id: SecurityJumpsuitBlue
equipment: SecurityJumpsuitBlue
- type: startingGear
id: SecurityJumpsuitBlue
equipment:
jumpsuit: ClothingUniformJumpsuitSecBlue
# Ears
# ears
- type: itemLoadout
- type: itemLoadout # WD
id: SecurityHeadset
equipment: SecurityHeadset
- type: startingGear
@@ -17,7 +8,7 @@
equipment:
ears: ClothingHeadsetSecurity
- type: itemLoadout
- type: itemLoadout # WD
id: SecurityCommandHeadset
equipment: SecurityCommandHeadset
- type: startingGear
@@ -25,7 +16,7 @@
equipment:
ears: ClothingHeadsetAltSecurityCommand
- type: itemLoadout
- type: itemLoadout # WD
id: SecurityHeadsetFull
equipment: SecurityHeadsetFull
- type: startingGear
@@ -35,7 +26,7 @@
# Mask
- type: itemLoadout
- type: itemLoadout # WD
id: SecurityMaskStandard
equipment: SecurityMaskStandard
- type: startingGear
@@ -43,10 +34,50 @@
equipment:
mask: ClothingMaskGasSecurity
- type: itemLoadout
- type: itemLoadout # WD
id: SecurityMaskSwat
equipment: SecurityMaskSwat
- type: startingGear
id: SecurityMaskSwat
equipment:
mask: ClothingMaskGasSwat
# Jumpsuit
- type: itemLoadout # WD
id: SecurityJumpsuitBlue
equipment: SecurityJumpsuitBlue
- type: startingGear
id: SecurityJumpsuitBlue
equipment:
jumpsuit: ClothingUniformJumpsuitSecBlue
# Belt
- type: itemLoadout # WD
id: SecurityWebbing
equipment: SecurityWebbing
- type: startingGear
id: SecurityWebbing
equipment:
belt: ClothingBeltSecurityWebbing
# Job trinkets
- type: itemLoadout # WD
id: SecurityWhistle
equipment: SecurityWhistle
- type: startingGear
id: SecurityWhistle
storage:
back:
- SecurityWhistle
- type: itemLoadout # WD
id: SecurityFlashlight
equipment: SecurityFlashlight
- type: startingGear
id: SecurityFlashlight
storage:
back:
- FlashlightSeclite

View File

@@ -8,6 +8,17 @@
back:
- PlushieLizard
# Useful items
- type: itemLoadout # WD
id: HandheldStationMap
equipment: HandheldStationMap
- type: startingGear
id: HandheldStationMap
storage:
back:
- HandheldStationMap
# Table games
- type: itemLoadout # WD
id: ChessBoard

View File

@@ -5,6 +5,7 @@
minLimit: 0
maxLimit: 3
loadouts:
- HandheldStationMap # WD
- ChessBoard # WD
- CheckerBoard # WD
- BackgammonBoard # WD
@@ -74,7 +75,6 @@
name: loadout-group-outerclothing
minLimit: 0
loadouts:
- CaptainOuterClothing
- CaptainWintercoat
- type: loadoutGroup
@@ -225,7 +225,7 @@
loadouts:
- AssistantPDA
- type: loadoutGroup # WD edot
- type: loadoutGroup # WD edit
id: BartenderHead
name: loadout-group-head
minLimit: 0
@@ -233,7 +233,7 @@
- BowlerHat
- Tophat
- HatMagician
- BeretStandardЙ
- BeretStandard
- FrenchBeret
- FedoraGrey
@@ -617,7 +617,7 @@
- BowlerHat
- Tophat
- HatMagician
- BeretStandardЙ
- BeretStandard
- FrenchBeret
- type: loadoutGroup
@@ -1211,7 +1211,7 @@
loadouts:
- BrownShoes
- ShoesLeather
- ClothingShoesBootsLaceup
- BootsLaceup # WD
- ScienceWinterBoots
- type: loadoutGroup # WD
@@ -1238,8 +1238,8 @@
loadouts:
- SeniorResearcherJumpsuit
- SeniorResearcherJumpskirt
- RoboticistJumpsuit
- RoboticistJumpskirt
- RoboticistJumpsuit # WD
- RoboticistJumpskirt # WD
- type: loadoutGroup
id: SeniorResearcherOuterclothing
@@ -1251,7 +1251,6 @@
- ScienceLabCoat
- ScienceWintercoat
- RoboticistLabCoat
- RoboticistWintercoat
- type: loadoutGroup
id: ScientistHead
@@ -1287,14 +1286,13 @@
- ScienceLabCoat
- ScienceWintercoat
- RoboticistLabCoat
- RoboticistWintercoat
- type: loadoutGroup
id: ScientistShoes
name: loadout-group-shoes
loadouts:
- WhiteShoes
- BlackShoes
- ShoesColorBlack # WD
- ScienceWinterBoots
- type: loadoutGroup
@@ -1333,7 +1331,7 @@
- GlovesColorBlack
- GlovesColorPurple
- GlovesLatex
- ClothingHandsGlovesRobohands
- RoboticistGloves
- type: loadoutGroup # WD
id: CommonScienceHeadset
@@ -1556,7 +1554,7 @@
loadouts:
- SecurityCadetPDA
- type: loadoutGroup
- type: loadoutGroup # WD
id: CommonSecurityHead
name: loadout-group-head
minLimit: 0
@@ -1568,14 +1566,14 @@
- CowboyBlack
- CowboyBountyHunter
- type: loadoutGroup
- type: loadoutGroup # WD
id: CommonSecurityMask
name: loadout-group-mask
minLimit: 0
loadouts:
- SecurityMaskStandard
- type: loadoutGroup
- type: loadoutGroup # WD
id: CommonSecurityCommandMask
name: loadout-group-mask
minLimit: 0
@@ -1583,7 +1581,7 @@
- SecurityMaskStandard
- SecurityMaskSwat
- type: loadoutGroup
- type: loadoutGroup # WD
id: CommonSecurityNeck
name: loadout-group-neck
minLimit: 0
@@ -1591,13 +1589,13 @@
- BlackTie
- RedTie
- type: loadoutGroup
- type: loadoutGroup # WD
id: CommonSecurityHeadset
name: loadout-group-ears
loadouts:
- SecurityHeadset
- type: loadoutGroup
- type: loadoutGroup # WD
id: CommonSecurityCommandHeadset
name: loadout-group-ears
loadouts:
@@ -1609,14 +1607,21 @@
loadouts:
- SecurityHeadsetFull
- type: loadoutGroup
- type: loadoutGroup # WD
id: CommonSecurityBackpack
name: loadout-group-backpack
loadouts:
- SecurityBackpack
- SecuritySatchel
- SecurityDuffel
- CommonSatchelLeather # WD
- CommonSatchelLeather
- type: loadoutGroup # WD
id: CommonSecurityBelt
name: loadout-group-belt
minLimit: 0
loadouts:
- SecurityWebbing
- type: loadoutGroup
id: CommonSecurityShoes
@@ -1626,6 +1631,14 @@
- BootsJack
- SecurityWinterBoots
- type: loadoutGroup # WD
id: CommonSecurityJobTrinkets
name: loadout-group-job-trinkets
minLimit: 0
loadouts:
- SecurityWhistle
- SecurityFlashlight
# Medical
- type: loadoutGroup

View File

@@ -374,11 +374,12 @@
- CommonSecurityCommandMask # WD
- HeadofSecurityNeck
- HeadofSecurityJumpsuit
- CommonSecurityBackpack
- HeadofSecurityOuterClothing
- CommonGloves # WD
- CommonSecurityBelt # WD
- CommonSecurityBackpack
- CommonSecurityShoes
- HeadofSecurityPDA
- CommonSecurityJobTrinkets # WD
- Trinkets
- type: roleLoadout
@@ -391,8 +392,10 @@
- WardenJumpsuit
- CommonSecurityBackpack
- CommonGloves # WD
- CommonSecurityBelt # WD
- CommonSecurityShoes
- WardenPDA
- CommonSecurityJobTrinkets # WD
- Trinkets
- type: roleLoadout
@@ -405,9 +408,11 @@
- SeniorOfficerJumpsuit
- CommonSecurityBackpack
- SecurityOuterClothing
- CommonSecurityBelt # WD
- CommonGloves # WD
- CommonSecurityShoes
- SeniorOfficerPDA
- CommonSecurityJobTrinkets # WD
- Trinkets
- type: roleLoadout
@@ -420,10 +425,11 @@
- SecurityJumpsuit
- CommonSecurityBackpack
- SecurityOuterClothing
- CommonSecurityBelt # WD
- CommonGloves # WD
- CommonSecurityShoes
- SecurityPDA
- SecurityBelt
- CommonSecurityJobTrinkets # WD
- Trinkets
- type: roleLoadout
@@ -439,6 +445,7 @@
- DetectiveGloves
- DetectiveShoes
- DetectivePDA # WD
- CommonSecurityJobTrinkets # WD
- Trinkets
- type: roleLoadout
@@ -452,6 +459,7 @@
- CommonGloves # WD
- CommonSecurityShoes
- SecurityCadetPDA
- CommonSecurityJobTrinkets # WD
- Trinkets
# Medical
@@ -491,12 +499,11 @@
- CommonMedicalHeadset # WD
- CommonMedicalMask # WD
- MedicalDoctorJumpsuit
- MedicalGloves
- MedicalBackpack
- MedicalDoctorOuterClothing
- CommonMedicalShoes
- CommonMedicalGloves
- MedicalDoctorPDA
- CommonMedicalShoes # WD
- CommonMedicalGloves # WD
- MedicalDoctorPDA # WD
- Trinkets
- type: roleLoadout
@@ -521,10 +528,9 @@
- ChemistEyes
- CommonMedicalMask # WD
- ChemistJumpsuit
- MedicalGloves
- ChemistBackpack
- ChemistOuterClothing
- CommonMedicalGloves
- CommonMedicalGloves # WD
- ChemistShoes
- ChemistPDA
- Trinkets

View File

@@ -0,0 +1,4 @@
- type: accent
id: gondola
fullReplacements:
- accent-words-gondola-1

View File

@@ -0,0 +1,9 @@
- type: entity
parent: CrateLivestock
id: CrateNPCGondola
name: ящик с Гондолой
description: Ящик содержащий в себе Гондолу.
components:
- type: StorageFill
contents:
- id: MobGondola

View File

@@ -292,3 +292,14 @@
categories:
- UplinkDisruption
saleLimit: 2
- type: listing
id: UplinkCrateNPCGondola
name: uplink-gondola-name
description: uplink-gondola-desc
icon: { sprite: /Textures/White/Mobs/Animals/gondola.rsi, state: icon }
productEntity: CrateNPCGondola
cost:
Telecrystal: 2
categories:
- UplinkDisruption

View File

@@ -0,0 +1,13 @@
- type: entity
parent: MarkerBase
id: SpawnMobGondola
name: спавнер Гондола
components:
- type: Sprite
layers:
- state: green
- sprite: White/Mobs/Animals/gondola.rsi
state: icon
- type: ConditionalSpawner
prototypes:
- MobGondola

View File

@@ -0,0 +1,96 @@
- type: entity
parent:
- MobRespirator
- MobAtmosStandard
- BaseSimpleMob
- MobBloodstream
- MobFlammable
id: MobGondola
name: Гондола
description: Не имея рук, он воплощает даосский принцип у-вэй (бездействия), а выражение его улыбающегося лица показывает его полное принятие мира таким, какой он есть.
components:
- type: FloatingVisuals
- type: RotationVisuals
defaultRotation: 90
horizontalRotation: 90
- type: Sprite
sprite: White/Mobs/Animals/gondola.rsi
layers:
- state: gondola_body_medium
map: [ "enum.DamageStateVisualLayers.Base" ]
color: "#6e4e40"
shader: unshaded
- state: gondola_moustache_large_short
map: [ "enum.DamageStateVisualLayers.BaseUnshaded" ]
shader: unshaded
- type: RandomSprite
available:
- enum.DamageStateVisualLayers.Base:
gondola_body_long: GondolaBrowns
gondola_body_medium: GondolaBrowns
enum.DamageStateVisualLayers.BaseUnshaded:
gondola_moustache_large: ""
gondola_moustache_small: ""
- enum.DamageStateVisualLayers.Base:
gondola_body_medium: GondolaBrowns
gondola_body_short: GondolaBrowns
enum.DamageStateVisualLayers.BaseUnshaded:
gondola_moustache_large_short: ""
gondola_moustache_small_short: ""
- type: Fixtures
fixtures:
fix1:
shape:
!type:PhysShapeCircle
radius: 0.2
density: 50
mask:
- MobMask
layer:
- MobLayer
- type: Butcherable
spawned:
- id: FoodMeatGondola
amount: 3
- type: Bloodstream
bloodMaxVolume: 150
- type: Damageable
damageContainer: Biological
damageModifierSet: Scale
- type: Tag
tags:
- VimPilot
- type: MovementSpeedModifier
baseWalkSpeed: 1
baseSprintSpeed: 2
- type: Speech
speechVerb: Gondola
speechSounds: GoofyAhh
- type: ReplacementAccent
accent: gondola
- type: HTN
rootTask:
task: IdleCompound
- type: Body
prototype: Animal
- type: NameIdentifier
group: GenericNumber
- type: SlowOnDamage
speedModifierThresholds:
60: 0.7
80: 0.5
- type: MobPrice
price: 1000
- type: Perishable
- type: GhostRole
makeSentient: true
allowSpeech: true
allowMovement: true
name: Гондола
description: Ты Гондола.
raffle:
settings: default
- type: GhostTakeoverAvailable
- type: NpcFactionMember
factions:
- Passive

View File

@@ -0,0 +1,54 @@
# RAW
- type: entity
parent: FoodMeatRawBase
id: FoodMeatGondola
name: raw Gondola meat
description: You're a monster.
components:
- type: Sprite
state: plain
- type: SolutionContainerManager
solutions:
food:
reagents:
- ReagentId: UncookedAnimalProteins
Quantity: 9
- ReagentId: Fat
Quantity: 9
- ReagentId: Tranquility
Quantity: 10
- type: Construction
graph: GondolaSteak
node: start
defaultTarget: gondola steak
# COOKED
- type: entity
parent: FoodMeatBase
id: FoodMeatGondolaCooked
name: Gondola steak
description: Cooked Gondola meat...
components:
- type: Tag
tags:
- Cooked
- Meat
- Steak
- type: Sprite
layers:
- state: plain-cooked
- type: SolutionContainerManager
solutions:
food:
reagents:
- ReagentId: Nutriment
Quantity: 5
- ReagentId: Protein
Quantity: 5
- ReagentId: Tranquility
Quantity: 15
- type: Construction
graph: GondolaSteak
node: gondola steak

View File

@@ -0,0 +1,8 @@
- type: palette
id: GondolaBrowns
name: коричневая Гондола
colors:
brown: "#6e4e40"
brown1: "#593d31"
brown2: "#6e4330"
brown3: "#73422d"

View File

@@ -0,0 +1,10 @@
- type: polymorph
id: Gondola
configuration:
entity: MobGondola
forced: true
transferName: false
transferHumanoidAppearance: false
inventory: Drop
revertOnDeath: true
revertOnCrit: false

View File

@@ -0,0 +1,40 @@
- type: reagent
id: Tranquility
group: Toxins
name: reagent-name-tranquility
desc: reagent-desc-tranquility
physicalDesc: reagent-physical-desc-calming
flavor: mindful
color: "#915E48"
metabolisms:
Poison:
metabolismRate: 0.25
effects:
- !type:PopupMessage
type: Local
messages: [ "reagent-popup-tranquility" ]
probability: 0.2
- !type:GenericStatusEffect
key: Muted
component: Muted
refresh: false
type: Add
conditions:
- !type:ReagentThreshold
min: 5
- !type:GenericStatusEffect
key: Pacified
component: Pacified
refresh: false
type: Add
conditions:
- !type:ReagentThreshold
min: 10
- !type:Polymorph
prototype: Gondola
conditions:
- !type:OrganType
type: Animal
shouldHave: false
- !type:ReagentThreshold
min: 30

View File

@@ -0,0 +1,15 @@
- type: constructionGraph
id: GondolaSteak
start: start
graph:
- node: start
edges:
- to: gondola steak
completed:
- !type:PlaySound
sound: /Audio/Effects/sizzle.ogg
steps:
- minTemperature: 345
- node: gondola steak
entity: FoodMeatGondolaCooked

View File

@@ -0,0 +1,8 @@
- type: speechSounds
id: GoofyAhh
saySound:
path: /Audio/White/Voice/SpeechSounds/kazooie/ehh.ogg
askSound:
path: /Audio/White/Voice/SpeechSounds/kazooie/ehh3.ogg
exclaimSound:
path: /Audio/White/Voice/SpeechSounds/kazooie/ehh2.ogg

View File

@@ -0,0 +1,6 @@
- type: speechVerb
id: Gondola
name: chat-speech-verb-name-gondola
speechVerbStrings:
- chat-speech-verb-gondola-1
- chat-speech-verb-gondola-2

Binary file not shown.

After

Width:  |  Height:  |  Size: 499 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 497 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 495 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 273 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 273 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 439 B

View File

@@ -0,0 +1,42 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Taken from /TG/ station | Edited by PuroSlavKing (Github) ",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "icon"
},
{
"name": "gondola_body_long",
"directions": 4
},
{
"name": "gondola_body_medium",
"directions": 4
},
{
"name": "gondola_body_short",
"directions": 4
},
{
"name": "gondola_moustache_large",
"directions": 4
},
{
"name": "gondola_moustache_small",
"directions": 4
},
{
"name": "gondola_moustache_large_short",
"directions": 4
},
{
"name": "gondola_moustache_small_short",
"directions": 4
}
]
}