Merge remote-tracking branch 'upstream/master' into UPS
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
namespace Content.Server._White.Explosion;
|
||||
|
||||
[RegisterComponent]
|
||||
public sealed partial class TriggerOnLandComponent : Component
|
||||
{
|
||||
[DataField]
|
||||
public float Delay = 0.3f;
|
||||
}
|
||||
19
Content.Server/_White/Explosion/TriggerOnLandSystem.cs
Normal file
19
Content.Server/_White/Explosion/TriggerOnLandSystem.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
using Robust.Shared.GameStates;
|
||||
|
||||
namespace Content.Shared._White.Overlays;
|
||||
|
||||
[RegisterComponent, NetworkedComponent]
|
||||
public sealed partial class ThermalBlockerComponent : Component
|
||||
{
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
7
Content.Shared/_White/StunLock/StunLockComponent.cs
Normal file
7
Content.Shared/_White/StunLock/StunLockComponent.cs
Normal file
@@ -0,0 +1,7 @@
|
||||
namespace Content.Shared._White.StunLock;
|
||||
|
||||
[RegisterComponent]
|
||||
public sealed partial class StunLockComponent : Component
|
||||
{
|
||||
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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 =
|
||||
Набор для любителей технологий.
|
||||
Включает в себя устройство для взлома шлюзов и шкафов,
|
||||
временной маяк, глушитель радио и хамелеон проектор.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -54,12 +54,6 @@
|
||||
damageContainer: Biological
|
||||
- type: Destructible
|
||||
thresholds:
|
||||
- trigger:
|
||||
!type:DamageTypeTrigger
|
||||
damageType: Blunt
|
||||
damage: 400
|
||||
behaviors:
|
||||
- !type:GibBehavior { }
|
||||
- trigger:
|
||||
!type:DamageTypeTrigger
|
||||
damageType: Heat
|
||||
|
||||
@@ -59,6 +59,7 @@
|
||||
max: 2
|
||||
- type: StaticPrice
|
||||
price: 50
|
||||
- type: DisarmMalus
|
||||
|
||||
#Security Shields
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
Blunt: 10
|
||||
- type: StaminaDamageOnCollide
|
||||
ignoreResistances: false
|
||||
damage: 60
|
||||
damage: 80
|
||||
|
||||
- type: entity
|
||||
id: PelletShotgun
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -87,6 +87,7 @@
|
||||
- type: GuideHelp
|
||||
guides:
|
||||
- Security
|
||||
- type: StunLock # Wd EDIT
|
||||
|
||||
- type: entity
|
||||
name: truncheon
|
||||
|
||||
@@ -54,6 +54,9 @@
|
||||
radius: 1.15
|
||||
energy: 0.45
|
||||
- type: PointLightLocker
|
||||
- type: Tag
|
||||
tags:
|
||||
- DoorjackUsable
|
||||
|
||||
- type: entity
|
||||
id: LockerBaseSecure
|
||||
|
||||
@@ -291,3 +291,6 @@
|
||||
stateDoorOpen: base
|
||||
stateDoorClosed: door
|
||||
- type: LockVisuals
|
||||
- type: Tag
|
||||
tags:
|
||||
- DoorjackUsable
|
||||
|
||||
@@ -148,3 +148,6 @@
|
||||
- Energy
|
||||
reflectProb: 0.2
|
||||
spread: 90
|
||||
- type: Tag
|
||||
tags:
|
||||
- DoorjackUsable
|
||||
|
||||
@@ -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
|
||||
@@ -0,0 +1,5 @@
|
||||
- type: entity
|
||||
name: BaseWeaponLauncher
|
||||
parent: BaseItem
|
||||
id: BaseWeaponLauncher
|
||||
description: A rooty tooty point and shooty.
|
||||
@@ -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
|
||||
@@ -78,3 +78,6 @@
|
||||
|
||||
- type: Tag
|
||||
id: BaseAimModule
|
||||
|
||||
- type: Tag
|
||||
id: DoorjackUsable
|
||||
|
||||
BIN
Resources/Textures/White/Objects/Tools/doorjack.rsi/icon.png
Normal file
BIN
Resources/Textures/White/Objects/Tools/doorjack.rsi/icon.png
Normal file
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 |
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user