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

This commit is contained in:
Jabak
2024-07-22 19:24:10 +03:00
37 changed files with 487 additions and 26 deletions

View File

@@ -18,6 +18,7 @@ public sealed class ThermalVisionOverlay : Overlay
private readonly ContainerSystem _container;
private readonly TransformSystem _transform;
private readonly OccluderSystem _occluder;
private readonly PointLightSystem _pointLight;
public override OverlaySpace Space => OverlaySpace.WorldSpace;
@@ -31,6 +32,7 @@ public sealed class ThermalVisionOverlay : Overlay
_container = _entity.System<ContainerSystem>();
_transform = _entity.System<TransformSystem>();
_occluder = _entity.System<OccluderSystem>();
_pointLight = _entity.System<PointLightSystem>();
ZIndex = -1;
}
@@ -51,7 +53,8 @@ public sealed class ThermalVisionOverlay : Overlay
if (_pointLightEntity == default)
{
_pointLightEntity = _entity.SpawnAttachedTo(null, transform.Coordinates);
_entity.EnsureComponent<PointLightComponent>(_pointLightEntity);
var pointLight = _entity.EnsureComponent<PointLightComponent>(_pointLightEntity);
_pointLight.SetRadius(_pointLightEntity, 3f, pointLight);
_transform.SetParent(_pointLightEntity, ent);
}
else
@@ -59,6 +62,7 @@ public sealed class ThermalVisionOverlay : Overlay
var pointLightXForm = _entity.GetComponent<TransformComponent>(_pointLightEntity);
if (pointLightXForm.ParentUid != ent)
_transform.SetParent(_pointLightEntity, pointLightXForm, ent, transform);
_transform.SetLocalPosition(_pointLightEntity, Vector2.Zero, pointLightXForm);
}
if (HasOccluders(ent))
@@ -73,6 +77,9 @@ public sealed class ThermalVisionOverlay : Overlay
var entities = _entity.EntityQueryEnumerator<BodyComponent, SpriteComponent, TransformComponent>();
while (entities.MoveNext(out var uid, out _, out var sprite, out var xform))
{
if (!CanSee(uid))
continue;
var entity = uid;
if (_container.TryGetOuterContainer(uid, xform, out var container))
@@ -107,7 +114,7 @@ public sealed class ThermalVisionOverlay : Overlay
Angle eyeRot)
{
var (uid, sprite, xform) = ent;
if (xform.MapID != map || HasOccluders(uid))
if (xform.MapID != map || HasOccluders(uid) || !CanSee(uid))
return;
var position = _transform.GetWorldPosition(xform);
@@ -116,6 +123,11 @@ public sealed class ThermalVisionOverlay : Overlay
sprite.Render(handle, eyeRot, rotation, position: position);
}
private bool CanSee(EntityUid ent)
{
return !_entity.HasComponent<ThermalBlockerComponent>(ent);
}
private bool HasOccluders(EntityUid ent)
{
var mapCoordinates = _transform.GetMapCoordinates(ent);

View File

@@ -18,6 +18,7 @@ using Robust.Shared.Physics;
using Robust.Shared.Physics.Components;
using Robust.Shared.Random;
using System.Numerics;
using Content.Server.IdentityManagement;
using Content.Shared.Movement.Pulling.Components;
using Content.Shared.Movement.Pulling.Systems;
using Robust.Shared.Collections;
@@ -39,6 +40,7 @@ public sealed class SubdermalImplantSystem : SharedSubdermalImplantSystem
[Dependency] private readonly PullingSystem _pullingSystem = default!;
[Dependency] private readonly EntityLookupSystem _lookupSystem = default!;
[Dependency] private readonly SharedMapSystem _mapSystem = default!;
[Dependency] private readonly IdentitySystem _identity = default!; // WD
private EntityQuery<PhysicsComponent> _physicsQuery;
private HashSet<Entity<MapGridComponent>> _targetGrids = [];
@@ -208,6 +210,7 @@ public sealed class SubdermalImplantSystem : SharedSubdermalImplantSystem
var newProfile = HumanoidCharacterProfile.RandomWithSpecies(humanoid.Species);
_humanoidAppearance.LoadProfile(ent, newProfile, humanoid);
_metaData.SetEntityName(ent, newProfile.Name);
_identity.QueueIdentityUpdate(ent); // WD
if (TryComp<DnaComponent>(ent, out var dna))
{
dna.DNA = _forensicsSystem.GenerateDNA();

View File

@@ -0,0 +1,8 @@
namespace Content.Server._White.Explosion;
[RegisterComponent]
public sealed partial class TriggerOnLandComponent : Component
{
[DataField]
public float Delay = 0.3f;
}

View File

@@ -0,0 +1,19 @@
using Content.Server.Explosion.EntitySystems;
using Content.Shared.Throwing;
namespace Content.Server._White.Explosion;
public sealed class TriggerOnLandSystem : EntitySystem
{
[Dependency] private readonly TriggerSystem _timer = default!;
public override void Initialize()
{
SubscribeLocalEvent<TriggerOnLandComponent, LandEvent>(OnLand);
}
private void OnLand(EntityUid uid, TriggerOnLandComponent component, ref LandEvent args)
{
_timer.HandleTimerTrigger(uid, null, component.Delay, 1, null, null);
}
}

View File

@@ -37,7 +37,8 @@ public sealed class MindslaveSystem : SharedMindslaveSystem
masterComponent.Slaves.Add(GetNetEntity(args.Target));
masterComponent.Master = GetNetEntity(args.User);
Dirty(args.Target, masterComponent);
Dirty(args.User, masterComponent);
Dirty(args.Target, slaveComponent);
if (!Mind.TryGetMind(args.Target, out var targetMindId, out var targetMind) || targetMind.Session is null)
{
@@ -85,6 +86,14 @@ public sealed class MindslaveSystem : SharedMindslaveSystem
Popup.PopupEntity(Loc.GetString("mindslave-freed", ("player", mindslave.Master)), args.Target, args.Target);
}
var master = GetEntity(mindslave.Master);
if (TryComp(master, out MindSlaveComponent? masterMindslave))
{
masterMindslave.Slaves.Remove(GetNetEntity(args.Target));
if (masterMindslave.Slaves.Count == 0)
RemComp<MindSlaveComponent>(master);
}
RemComp<MindSlaveComponent>(args.Target);
}
}

View File

@@ -1,5 +1,6 @@
using System.Linq;
using Content.Shared._White.StaminaProtection;
using Content.Shared._White.StunLock;
using Content.Shared.Administration.Logs;
using Content.Shared.Alert;
using Content.Shared.CombatMode;
@@ -8,6 +9,7 @@ using Content.Shared.Damage.Events;
using Content.Shared.Database;
using Content.Shared.Effects;
using Content.Shared.IdentityManagement;
using Content.Shared.Item.ItemToggle.Components;
using Content.Shared.Popups;
using Content.Shared.Projectiles;
using Content.Shared.Rejuvenate;
@@ -15,6 +17,7 @@ using Content.Shared.Rounding;
using Content.Shared.Stunnable;
using Content.Shared.Throwing;
using Content.Shared.Weapons.Melee.Events;
using Content.Shared.StatusEffect;
using JetBrains.Annotations;
using Robust.Shared.Audio;
using Robust.Shared.Audio.Systems;
@@ -35,6 +38,7 @@ public sealed partial class StaminaSystem : EntitySystem
[Dependency] private readonly SharedColorFlashEffectSystem _color = default!;
[Dependency] private readonly SharedStunSystem _stunSystem = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!; // WD EDIT
/// <summary>
/// How much of a buffer is there between the stun duration and when stuns can be re-applied.
@@ -209,7 +213,7 @@ public sealed partial class StaminaSystem : EntitySystem
damage = modifyEv.Damage;
}
TakeStaminaDamage(target, damage, source: uid, sound: component.Sound);
TakeStaminaDamage(target, damage, with: uid, sound: component.Sound);
// WD EDIT END
}
@@ -255,8 +259,20 @@ public sealed partial class StaminaSystem : EntitySystem
return;
// Have we already reached the point of max stamina damage?
if (component.Critical)
return;
if (component.Critical) // WD EDIT
{
if (TryComp<StunLockComponent>(with, out _))
{
if (TryComp<ItemToggleComponent>(with, out var toggle) && !toggle.Activated)
return;
_stunSystem.TryParalyze(uid, component.StunTime, true);
if (visual)
_color.RaiseEffect(Color.Aqua, new List<EntityUid>() { uid }, Filter.Pvs(uid, entityManager: EntityManager));
if (_net.IsServer)
_audio.PlayPvs(sound, uid);
return;
}
}
var oldDamage = component.StaminaDamage;
component.StaminaDamage = MathF.Max(0f, component.StaminaDamage + value);
@@ -349,7 +365,7 @@ public sealed partial class StaminaSystem : EntitySystem
continue;
// We were in crit so come out of it and continue.
if (comp.Critical)
if (!_statusEffectsSystem.HasStatusEffect(uid, "Stun") && comp.Critical) // WD EIT
{
ExitStamCrit(uid, comp);
continue;

View File

@@ -1,5 +1,6 @@
using Content.Shared.Emag.Systems;
using Content.Shared.Tag;
using Content.Shared.Whitelist;
using Robust.Shared.GameStates;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
using Robust.Shared.Serialization;
@@ -17,4 +18,7 @@ public sealed partial class EmagComponent : Component
[DataField("emagImmuneTag", customTypeSerializer: typeof(PrototypeIdSerializer<TagPrototype>)), ViewVariables(VVAccess.ReadWrite)]
[AutoNetworkedField]
public string EmagImmuneTag = "EmagImmune";
[DataField]
public EntityWhitelist? Whitelist;
}

View File

@@ -50,6 +50,9 @@ public sealed class EmagSystem : EntitySystem
if (_tag.HasTag(target, comp.EmagImmuneTag))
return false;
if (comp.Whitelist?.IsValid(target, EntityManager) is false)
return false;
TryComp<LimitedChargesComponent>(uid, out var charges);
if (_charges.IsEmpty(uid, charges))
{

View File

@@ -202,6 +202,9 @@ public abstract class SharedStunSystem : EntitySystem
if (!Resolve(uid, ref status, false))
return false;
if (_statusEffect.HasStatusEffect(uid, "Stun"))
time = TimeSpan.FromSeconds(6);
return TryKnockdown(uid, time, refresh, status) && TryStun(uid, time, refresh, status);
}

View File

@@ -1,6 +1,8 @@
using Content.Shared._White.Overlays;
using Content.Shared.Actions;
using Robust.Shared.Audio.Systems;
using Robust.Shared.Network;
using Robust.Shared.Player;
using Robust.Shared.Timing;
namespace Content.Shared._Miracle.Systems;
@@ -13,6 +15,7 @@ public abstract class SharedEnhancedVisionSystem<TComp, TTempComp, TEvent> : Ent
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly SharedActionsSystem _actions = default!;
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly INetManager _net = default!;
public override void Initialize()
{
@@ -52,7 +55,8 @@ public abstract class SharedEnhancedVisionSystem<TComp, TTempComp, TEvent> : Ent
component.IsActive = !component.IsActive;
_audio.PlayPredicted(component.IsActive ? component.ActivateSound : component.DeactivateSound, uid, uid);
if (_net.IsClient)
_audio.PlayEntity(component.IsActive ? component.ActivateSound : component.DeactivateSound, Filter.Local(), uid, false);
args.Handled = true;

View File

@@ -0,0 +1,8 @@
using Robust.Shared.GameStates;
namespace Content.Shared._White.Overlays;
[RegisterComponent, NetworkedComponent]
public sealed partial class ThermalBlockerComponent : Component
{
}

View File

@@ -20,7 +20,7 @@ public sealed class StaminaProtectionSystem : EntitySystem
args.Args.Damage = MathF.Max(0f, args.Args.Damage - flat);
if (modifiers.Coefficients.TryGetValue("Blunt", out var coefficient))
args.Args.Damage *= coefficient;
args.Args.Damage *= coefficient / 1.5f;
}
}

View File

@@ -0,0 +1,7 @@
namespace Content.Shared._White.StunLock;
[RegisterComponent]
public sealed partial class StunLockComponent : Component
{
}

View File

@@ -6310,3 +6310,118 @@
id: 403
time: '2024-07-21T16:53:20.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/475
- author: Spatison
changes:
- message: "\u0423\u0434\u0430\u0440 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u043D\
\u043E\u0439 \u0434\u0443\u0431\u0438\u043D\u043A\u043E\u0439 \u0421\u0411 \u043D\
\u0435 \u0434\u0430\u0435\u0442 \u0432\u0441\u0442\u0430\u0442\u044C \u0438\u0437\
\ \u0441\u0442\u0430\u043D\u043A\u0440\u0438\u0442\u0430"
type: Add
- message: "\u0421\u0442\u0430\u043D \u0443\u0440\u043E\u043D \u0440\u0435\u0437\
\u0438\u043D\u043E\u0432\u044B\u0445 \u043F\u0443\u043B\u044C 22 -> 33"
type: Tweak
- message: "\u0421\u0442\u0430\u043D \u0443\u0440\u043E\u043D \u0440\u0435\u0437\
\u0438\u043D\u043E\u0432\u044B\u0445 \u043F\u0443\u043B\u044C \u043C\u0430\u0433\
\u043D\u0443\u043C\u0430 35 -> 45"
type: Tweak
- message: "\u0421\u0442\u0430\u043D \u0443\u0440\u043E\u043D \u0442\u0440\u0430\
\u0432\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u043F\u0443\
\u043B\u044C 60 -> 80"
type: Tweak
- message: "\u0429\u0438\u0442\u044B \u0441\u0442\u0430\u043B\u043E \u0441\u043B\
\u043E\u0436\u043D\u0435\u0435 \u0432\u044B\u0431\u0438\u0442\u044C \u0438\u0437\
\ \u0440\u0443\u043A"
type: Tweak
id: 404
time: '2024-07-21T17:55:01.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/474
- author: ThereDrD
changes:
- message: "\u0423\u0431\u0440\u0430\u043D\u0430 \u0432\u043E\u0437\u043C\u043E\u0436\
\u043D\u043E\u0441\u0442\u044C \u0433\u0438\u0431\u043D\u0443\u0442\u044C \u0447\
\u0435\u043B\u043E\u0432\u0435\u043A\u0430 \u043D\u0430\u043D\u0435\u0441\u044F\
\ 400 \u0443\u0440\u043E\u043D\u0430 \u0431\u0440\u0443\u0442\u043E\u043C. \u042D\
\u0442\u043E \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u0442\u0443\u043F\u043E\
\u0439 \u0438 \u043B\u0435\u0433\u043A\u0438\u0439 \u0441\u043F\u043E\u0441\u043E\
\u0431 \u043D\u0430\u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044B\u0432\u0435\
\u0441\u0442\u0438 \u0438\u0433\u0440\u0443\u043D\u0430 \u0438\u0437 \u0438\u0433\
\u0440\u044B. \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435\
\ \u0431\u043E\u043B\u0435\u0435 \u0441\u043B\u043E\u0436\u043D\u044B\u0435\
\ \u0441\u043F\u043E\u0441\u043E\u0431\u044B \u0438\u043B\u0438 \u0434\u0430\
\u0439\u0442\u0435 \u0438\u0433\u0440\u043E\u043A\u0430\u043C \u0441\u043B\u0443\
\u0447\u0430\u0439\u043D\u044B\u0439 \u0432\u0442\u043E\u0440\u043E\u0439 \u0448\
\u0430\u043D\u0441."
type: Remove
- message: "\u0426\u0435\u043D\u0430 \u0436\u0438\u0432\u044B\u0445 \u043A\u043E\
\u0441\u043C\u043E\u043D\u0430\u0432\u0442\u0438\u043A\u043E\u0432 \u0432 \u043A\
\u0430\u0440\u0433\u043E \u0443\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0430\
\ \u0441 1500 -> 10000."
type: Tweak
- message: "\u041A\u043E\u0441\u043C\u043E\u043D\u0430\u0432\u0442\u044B \u0441\u0442\
\u0430\u043B\u0438 \u043D\u0430 10% \u0431\u044B\u0441\u0442\u0440\u0435\u0435\
\ \u0434\u0432\u0438\u0433\u0430\u0442\u044C\u0441\u044F \u0431\u0443\u0434\u0443\
\u0447\u0438 \u0437\u0430\u043C\u0435\u0434\u043B\u0435\u043D\u043D\u044B\u043C\
\u0438 \u043E\u0442 \u0434\u0430\u043C\u0430\u0433\u0430"
type: Tweak
id: 405
time: '2024-07-21T23:53:41.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/476
- author: Aviu
changes:
- message: "\u0423\u0431\u0440\u0430\u043D \u043D\u0430\u0431\u043E\u0440 \u0441\
\u0438\u043D\u0434\u0438\u043A\u0430\u0442\u0430 \u0443 \u0432\u043E\u0440\u0430\
."
type: Remove
- message: "\u0414\u043E\u0431\u0430\u0432\u0438\u0435\u043D \u043D\u0430\u0431\u043E\
\u0440 \u0440\u0430\u0431\u043E\u0432\u043B\u0430\u0434\u0435\u043B\u044C\u0446\
\u0430 \u0432\u043E\u0440\u0443."
type: Add
- message: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D \u0432\u044B\u0441\u043E\
\u043A\u043E\u0442\u0435\u0445\u043D\u043E\u043B\u043E\u0433\u0438\u0447\u043D\
\u044B\u0439 \u043D\u0430\u0431\u043E\u0440 \u0432\u043E\u0440\u0443."
type: Add
- message: "\u0410\u0439\u0434\u0438 \u043A\u0430\u0440\u0442\u0430 \u0430\u0433\
\u0435\u043D\u0442\u0430 \u0442\u0435\u043F\u0435\u0440\u044C \u0435\u0441\u0442\
\u044C \u0432 \u0445\u0430\u043C\u0435\u043B\u0435\u043E\u043D \u043D\u0430\u0431\
\u043E\u0440\u0435 \u0443 \u0432\u043E\u0440\u0430."
type: Tweak
- message: "\u0424\u0438\u043A\u0441 \u0438\u043C\u043F\u043B\u0430\u043D\u0442\u0430\
\ \u043F\u043E\u0434\u0447\u0438\u043D\u0435\u043D\u0438\u044F \u0438 \u0441\
\u043A\u0440\u0430\u043C\u0431\u043B\u0435\u0440\u0430 \u0434\u043D\u043A."
type: Fix
id: 406
time: '2024-07-22T14:20:05.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/480
- author: Spatison
changes:
- message: "\u041F\u0440\u043E\u0442\u043E\u0442\u0438\u043F \u0433\u0440\u0430\u043D\
\u0430\u0442\u043E\u043C\u0435\u0442\u0430 \u0421\u0411"
type: Add
- message: "\u0428\u043E\u043A \u0434\u0443\u0431\u0438\u043D\u043A\u0430 \u0432\
\ \u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u043E\u043C \u0441\u043E\
\u0441\u0442\u043E\u044F\u043D\u0438\u0438 \u043D\u0435 \u043C\u0435\u0448\u0430\
\u0435\u0442 \u0432\u0441\u0442\u0430\u0442\u044C"
type: Fix
id: 407
time: '2024-07-22T14:20:16.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/479
- author: Aviu
changes:
- message: "\u041D\u0438\u043D\u0434\u0437\u044F \u0432 \u0441\u043A\u0430\u0444\
\u0430\u043D\u0434\u0440\u0435 \u0431\u043E\u043B\u044C\u0448\u0435 \u043D\u0435\
\ \u0432\u0438\u0434\u043D\u043E \u0432 \u0442\u0435\u0440\u043C\u0430\u043B\
\u043A\u0430\u0445."
type: Add
- message: "\u0423\u043C\u0435\u043D\u044C\u0448\u0435\u043D\u043E \u043D\u043E\u0447\
\u043D\u043E\u0435 \u0437\u0440\u0435\u043D\u0438\u0435 \u0443 \u0442\u0435\u0440\
\u043C\u0430\u043B\u043E\u043A."
type: Tweak
- message: "\u0422\u0435\u043F\u0435\u0440\u044C \u0437\u0432\u0443\u043A \u043F\
\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u044F \u0442\u0435\
\u0440\u043C\u0430\u043B\u043E\u043A \u0438 \u043F\u043D\u0432 \u0441\u043B\u044B\
\u0448\u043D\u043E \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u043A\u043B\u0438\
\u0435\u043D\u0442\u0435."
type: Tweak
id: 408
time: '2024-07-22T14:24:00.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/477

View File

@@ -18,7 +18,7 @@ implanter-contained-implant-text = [color=green]{ $desc }[/color]
## Implant Popups
scramble-implant-activated-popup = Вы превратились в { $identity }
scramble-implant-activated-popup = Ваша внешность меняется!
## Implanter Actions

View File

@@ -15,7 +15,7 @@ thief-backpack-button-deselect = Выбрать [X]
thief-backpack-category-chameleon-name = набор хамелеона
thief-backpack-category-chameleon-description =
Включает в себя полный комплект одежды-хамелеона,
Включает в себя айди карту агента, а также полный комплект одежды-хамелеона,
позволяющую вам маскироваться под практически любую вещь на станции.
thief-backpack-category-tools-name = набор медвежатника
@@ -53,3 +53,15 @@ thief-backpack-category-smuggler-description =
и ящик-невидимка. В них нельзя передвигаться,
но вы можете быстро спрятать или унести ценную добычу.
К этому набору также прилагается крутой плащ пустоты.
thief-backpack-category-slavery-name = набор рабовладельца
thief-backpack-category-slavery-description =
Набор, состоящий из трёх имплантеров подчинения
и стильной одежды рабовладельца.
Собери собственную армию послушных рабов!
thief-backpack-category-hitech-name = высокотехнологичный набор
thief-backpack-category-hitech-description =
Набор для любителей технологий.
Включает в себя устройство для взлома шлюзов и шкафов,
временной маяк, глушитель радио и хамелеон проектор.

View File

@@ -14,6 +14,7 @@
- ClothingEyesChameleon
- ClothingHeadsetChameleon
- ClothingShoesChameleon
- AgentIDCard # WD
- type: thiefBackpackSet
id: ToolsSet
@@ -108,3 +109,30 @@
- SmokeGrenade
- SmokeGrenade
- SmokeGrenade
- type: thiefBackpackSet
id: SlaverySet
name: thief-backpack-category-slavery-name
description: thief-backpack-category-slavery-description
sprite:
sprite: /Textures/Clothing/Head/Hats/syndiecap_maa.rsi
state: icon
content:
- MindSlaveImplanter
- MindSlaveImplanter
- MindSlaveImplanter
- ClothingOuterCoatSyndieCap
- ClothingHeadHatSyndieMAA
- type: thiefBackpackSet
id: HiTechSet
name: thief-backpack-category-hitech-name
description: thief-backpack-category-hitech-description
sprite:
sprite: /Textures/White/Objects/Tools/doorjack.rsi
state: icon
content:
- ChameleonProjector
- Doorjack
- TimeBeacon
- RadioJammer

View File

@@ -155,6 +155,9 @@
name: power-cell-slot-component-slot-name-default
startingItem: PowerCellSmall
disableEject: true
- type: ClothingGrantComponent
component:
- type: ThermalBlocker
- type: entity
parent: ClothingOuterBase

View File

@@ -106,8 +106,8 @@
species: Human
- type: SlowOnDamage
speedModifierThresholds:
60: 0.7
80: 0.5
60: 0.8 # WD
80: 0.6 # WD
- type: Fixtures
fixtures: # TODO: This needs a second fixture just for mob collisions.
fix1:
@@ -260,7 +260,7 @@
attributes:
proper: true
- type: MobPrice
price: 1500 # Kidnapping a living person and selling them for cred is a good move.
price: 10000 # Kidnapping a living person and selling them for cred is a good move.
deathPenalty: 0.01 # However they really ought to be living and intact, otherwise they're worth 100x less.
- type: Tag
tags:
@@ -279,6 +279,7 @@
- type: InteractionPanel
actionListPrototype: Humanoid
- type: RoleplayInfo
- type: Mood # WD
- type: OfferItem # WD-EDIT
- type: entity

View File

@@ -54,12 +54,6 @@
damageContainer: Biological
- type: Destructible
thresholds:
- trigger:
!type:DamageTypeTrigger
damageType: Blunt
damage: 400
behaviors:
- !type:GibBehavior { }
- trigger:
!type:DamageTypeTrigger
damageType: Heat

View File

@@ -59,6 +59,7 @@
max: 2
- type: StaticPrice
price: 50
- type: DisarmMalus
#Security Shields

View File

@@ -170,10 +170,12 @@
- ChemistrySet
- ToolsSet
- ChameleonSet # - TO DO Chameleon stump PR needed
- SyndieSet
# - SyndieSet
- SleeperSet
- CommunicatorSet
- SmugglerSet
- SlaverySet # WD
- HiTechSet # WD
- type: ActivatableUI
key: enum.ThiefBackpackUIKey.Key
- type: UserInterface

View File

@@ -32,7 +32,7 @@
Blunt: 3
- type: StaminaDamageOnCollide
ignoreResistances: false
damage: 35 # 3 hits to stun cuz revolver
damage: 45 # 3 hits to stun cuz revolver
- type: entity
id: BulletMagnumIncendiary

View File

@@ -27,7 +27,7 @@
Blunt: 10
- type: StaminaDamageOnCollide
ignoreResistances: false
damage: 60
damage: 80
- type: entity
id: PelletShotgun

View File

@@ -122,7 +122,7 @@
path: /Audio/Weapons/Guns/Hits/snap.ogg
- type: StaminaDamageOnCollide
ignoreResistances: false
damage: 22 # 5 hits to stun sounds reasonable
damage: 33 # Wd EDIT
- type: entity
id: BaseBulletIncendiary
@@ -756,6 +756,7 @@
- state: grenade
- type: FlashOnTrigger
range: 7
forceStun: true # WD EDIT
- type: SpawnOnTrigger
proto: GrenadeFlashEffect
- type: ActiveTimerTrigger

View File

@@ -87,6 +87,7 @@
- type: GuideHelp
guides:
- Security
- type: StunLock # Wd EDIT
- type: entity
name: truncheon

View File

@@ -54,6 +54,9 @@
radius: 1.15
energy: 0.45
- type: PointLightLocker
- type: Tag
tags:
- DoorjackUsable
- type: entity
id: LockerBaseSecure

View File

@@ -291,3 +291,6 @@
stateDoorOpen: base
stateDoorClosed: door
- type: LockVisuals
- type: Tag
tags:
- DoorjackUsable

View File

@@ -148,3 +148,6 @@
- Energy
reflectProb: 0.2
spread: 90
- type: Tag
tags:
- DoorjackUsable

View File

@@ -0,0 +1,21 @@
- type: entity
parent: Emag
id: Doorjack
name: взломщик замков
description: Специальное устройство, предназначенное для обхода доступа в замках шлюзов и шкафов.
components:
- type: LimitedCharges
- type: AutoRecharge
- type: Sprite
sprite: White/Objects/Tools/doorjack.rsi
state: icon
scale: 0.8, 0.8
- type: Item
sprite: White/Objects/Tools/doorjack.rsi
storedRotation: -90
- type: Emag
whitelist:
tags:
- DoorjackUsable
components:
- Airlock

View File

@@ -0,0 +1,5 @@
- type: entity
name: BaseWeaponLauncher
parent: BaseItem
id: BaseWeaponLauncher
description: A rooty tooty point and shooty.

View File

@@ -0,0 +1,147 @@
- type: entity
name: Riot Launcher
parent: BaseItem
id: RiotWeaponLauncher
description: ShitSec Launcher
components:
- type: Sprite
sprite: White/Objects/Weapons/Guns/Launchers/china_lake-icons.rsi
layers:
- state: icon
map: ["enum.GunVisualLayers.Base"]
- type: Item
sprite: White/Objects/Weapons/Guns/Launchers/china_lake-inhands.rsi
- type: Clothing
sprite: White/Objects/Weapons/Guns/Launchers/china_lake-inhands.rsi
slots:
- Back
- suitStorage
- type: AmmoCounter
- type: Gun
fireRate: 1
selectedMode: SemiAuto
projectileSpeed: 10
projectileSpeedModified: 10
availableModes:
- SemiAuto
soundGunshot:
path: /Audio/Weapons/Guns/Gunshots/grenade_launcher.ogg
- type: BallisticAmmoProvider
whitelist:
tags:
- RiotGrenade
capacity: 1
proto: RiotGrenadeFlash
soundInsert:
path: /Audio/Weapons/Guns/MagIn/batrifle_magin.ogg
autoCycle: false
- type: entity
id: BaseRiotGrenade
name: base riot grenade
parent: BaseItem
abstract: true
components:
- type: Tag
tags:
- RiotGrenade
- type: Item
size: Small
- type: Sprite
- type: entity
id: RiotGrenadeFlash
name: riot flash grenade
parent: BaseRiotGrenade
components:
- type: CartridgeAmmo
proto: RiotBulletGrenadeFlash
- type: Sprite
sprite: Objects/Weapons/Guns/Ammunition/Explosives/explosives.rsi
layers:
- state: blast
map: ["enum.AmmoVisualLayers.Base"]
- type: Appearance
- type: SpentAmmoVisuals
state: flash
suffix: false
- type: entity
id: RiotGrenadeSmoke
name: riot smoke grenade
parent: BaseRiotGrenade
components:
- type: CartridgeAmmo
proto: RiotBulletGrenadeSmoke
- type: Sprite
sprite: Objects/Weapons/Guns/Ammunition/Explosives/explosives.rsi
layers:
- state: blast
map: ["enum.AmmoVisualLayers.Base"]
- type: Appearance
- type: SpentAmmoVisuals
state: smoke
suffix: false
- type: entity
id: BaseBulletRiotGranade
name: base roit granade
abstract: true
components:
- type: MovedByPressure
- type: FlyBySound
- type: Clickable
- type: Sprite
noRot: false
sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi
layers:
- state: grenade
- type: Fixtures
fixtures:
fix1:
shape:
!type:PhysShapeAabb
bounds: "-0.25,-0.25,0.25,0.25"
density: 20
mask:
- ItemMask
restitution: 0.3 # fite me
friction: 0.2
- type: DeleteOnTrigger
- type: Physics
bodyType: Dynamic
- type: TimedDespawn
lifetime: 10
- type: TriggerOnLand
- type: entity
id: RiotBulletGrenadeFlash
name: flash riot grenade
parent: BaseBulletRiotGranade
noSpawn: true
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi
layers:
- state: grenade
- type: FlashOnTrigger
range: 7
forceStun: true
- type: SpawnOnTrigger
proto: GrenadeFlashEffect
- type: entity
id: RiotBulletGrenadeSmoke
name: smoke riot grenade
parent: BaseBulletRiotGranade
noSpawn: true
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi
layers:
- state: grenade
- type: SmokeOnTrigger
duration: 30
spreadAmount: 50
- type: SoundOnTrigger
sound: /Audio/Items/smoke_grenade_smoke.ogg

View File

@@ -78,3 +78,6 @@
- type: Tag
id: BaseAimModule
- type: Tag
id: DoorjackUsable

Binary file not shown.

After

Width:  |  Height:  |  Size: 369 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 B

View File

@@ -0,0 +1,22 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Taken from tgstation from commit https://github.com/tgstation/tgstation/commit/d917f4c2a088419d5c3aec7656b7ff8cebd1822e, inhand sprites modified from tgstation at commit https://github.com/tgstation/tgstation/commit/d917f4c2a088419d5c3aec7656b7ff8cebd1822e",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "inhand-left",
"directions": 4
},
{
"name": "inhand-right",
"directions": 4
},
{
"name": "icon"
}
]
}