diff --git a/Content.Client/_White/Overlays/ThermalVisionOverlay.cs b/Content.Client/_White/Overlays/ThermalVisionOverlay.cs index 04ed047b23..72b6619d1a 100644 --- a/Content.Client/_White/Overlays/ThermalVisionOverlay.cs +++ b/Content.Client/_White/Overlays/ThermalVisionOverlay.cs @@ -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(); _transform = _entity.System(); _occluder = _entity.System(); + _pointLight = _entity.System(); ZIndex = -1; } @@ -51,7 +53,8 @@ public sealed class ThermalVisionOverlay : Overlay if (_pointLightEntity == default) { _pointLightEntity = _entity.SpawnAttachedTo(null, transform.Coordinates); - _entity.EnsureComponent(_pointLightEntity); + var pointLight = _entity.EnsureComponent(_pointLightEntity); + _pointLight.SetRadius(_pointLightEntity, 3f, pointLight); _transform.SetParent(_pointLightEntity, ent); } else @@ -59,6 +62,7 @@ public sealed class ThermalVisionOverlay : Overlay var pointLightXForm = _entity.GetComponent(_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(); 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(ent); + } + private bool HasOccluders(EntityUid ent) { var mapCoordinates = _transform.GetMapCoordinates(ent); diff --git a/Content.Server/Implants/SubdermalImplantSystem.cs b/Content.Server/Implants/SubdermalImplantSystem.cs index e8af08b2eb..05550e2f4b 100644 --- a/Content.Server/Implants/SubdermalImplantSystem.cs +++ b/Content.Server/Implants/SubdermalImplantSystem.cs @@ -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 _physicsQuery; private HashSet> _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(ent, out var dna)) { dna.DNA = _forensicsSystem.GenerateDNA(); diff --git a/Content.Server/_White/Explosion/TriggerOnLandComponent.cs b/Content.Server/_White/Explosion/TriggerOnLandComponent.cs new file mode 100644 index 0000000000..7b98d13a38 --- /dev/null +++ b/Content.Server/_White/Explosion/TriggerOnLandComponent.cs @@ -0,0 +1,8 @@ +namespace Content.Server._White.Explosion; + +[RegisterComponent] +public sealed partial class TriggerOnLandComponent : Component +{ + [DataField] + public float Delay = 0.3f; +} diff --git a/Content.Server/_White/Explosion/TriggerOnLandSystem.cs b/Content.Server/_White/Explosion/TriggerOnLandSystem.cs new file mode 100644 index 0000000000..935b270d5f --- /dev/null +++ b/Content.Server/_White/Explosion/TriggerOnLandSystem.cs @@ -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(OnLand); + } + + private void OnLand(EntityUid uid, TriggerOnLandComponent component, ref LandEvent args) + { + _timer.HandleTimerTrigger(uid, null, component.Delay, 1, null, null); + } +} diff --git a/Content.Server/_White/Implants/Mindslave/MindslaveSystem.cs b/Content.Server/_White/Implants/Mindslave/MindslaveSystem.cs index 80838ba8ae..0a2810d017 100644 --- a/Content.Server/_White/Implants/Mindslave/MindslaveSystem.cs +++ b/Content.Server/_White/Implants/Mindslave/MindslaveSystem.cs @@ -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) { @@ -73,7 +74,7 @@ public sealed class MindslaveSystem : SharedMindslaveSystem { return; } - + if (!TryComp(args.Target, out MindSlaveComponent? mindslave)) { return; @@ -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(master); + } + RemComp(args.Target); } -} \ No newline at end of file +} diff --git a/Content.Shared/Damage/Systems/StaminaSystem.cs b/Content.Shared/Damage/Systems/StaminaSystem.cs index e722b79904..1324e4f822 100644 --- a/Content.Shared/Damage/Systems/StaminaSystem.cs +++ b/Content.Shared/Damage/Systems/StaminaSystem.cs @@ -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 /// /// 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(with, out _)) + { + if (TryComp(with, out var toggle) && !toggle.Activated) + return; + _stunSystem.TryParalyze(uid, component.StunTime, true); + if (visual) + _color.RaiseEffect(Color.Aqua, new List() { 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; diff --git a/Content.Shared/Emag/Components/EmagComponent.cs b/Content.Shared/Emag/Components/EmagComponent.cs index 235cf0c744..09bc8a80d4 100644 --- a/Content.Shared/Emag/Components/EmagComponent.cs +++ b/Content.Shared/Emag/Components/EmagComponent.cs @@ -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)), ViewVariables(VVAccess.ReadWrite)] [AutoNetworkedField] public string EmagImmuneTag = "EmagImmune"; + + [DataField] + public EntityWhitelist? Whitelist; } diff --git a/Content.Shared/Emag/Systems/EmagSystem.cs b/Content.Shared/Emag/Systems/EmagSystem.cs index 4d3bbcbb8e..62010a7697 100644 --- a/Content.Shared/Emag/Systems/EmagSystem.cs +++ b/Content.Shared/Emag/Systems/EmagSystem.cs @@ -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(uid, out var charges); if (_charges.IsEmpty(uid, charges)) { diff --git a/Content.Shared/Stunnable/SharedStunSystem.cs b/Content.Shared/Stunnable/SharedStunSystem.cs index 2931117036..1a226ef28f 100644 --- a/Content.Shared/Stunnable/SharedStunSystem.cs +++ b/Content.Shared/Stunnable/SharedStunSystem.cs @@ -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); } diff --git a/Content.Shared/_Miracle/Systems/SharedEnhancedVisionSystem.cs b/Content.Shared/_Miracle/Systems/SharedEnhancedVisionSystem.cs index b9920a3fd8..62f4c42252 100644 --- a/Content.Shared/_Miracle/Systems/SharedEnhancedVisionSystem.cs +++ b/Content.Shared/_Miracle/Systems/SharedEnhancedVisionSystem.cs @@ -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 : 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 : 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; diff --git a/Content.Shared/_White/Overlays/ThermalBlockerComponent.cs b/Content.Shared/_White/Overlays/ThermalBlockerComponent.cs new file mode 100644 index 0000000000..2c246aff4d --- /dev/null +++ b/Content.Shared/_White/Overlays/ThermalBlockerComponent.cs @@ -0,0 +1,8 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._White.Overlays; + +[RegisterComponent, NetworkedComponent] +public sealed partial class ThermalBlockerComponent : Component +{ +} diff --git a/Content.Shared/_White/StaminaProtection/StaminaProtectionSystem.cs b/Content.Shared/_White/StaminaProtection/StaminaProtectionSystem.cs index 934ebce818..8dda4616d4 100644 --- a/Content.Shared/_White/StaminaProtection/StaminaProtectionSystem.cs +++ b/Content.Shared/_White/StaminaProtection/StaminaProtectionSystem.cs @@ -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; } } diff --git a/Content.Shared/_White/StunLock/StunLockComponent.cs b/Content.Shared/_White/StunLock/StunLockComponent.cs new file mode 100644 index 0000000000..7589080a3d --- /dev/null +++ b/Content.Shared/_White/StunLock/StunLockComponent.cs @@ -0,0 +1,7 @@ +namespace Content.Shared._White.StunLock; + +[RegisterComponent] +public sealed partial class StunLockComponent : Component +{ + +} diff --git a/Resources/Changelog/ChangelogWhite.yml b/Resources/Changelog/ChangelogWhite.yml index 98033acb6b..ebb7adc9e5 100644 --- a/Resources/Changelog/ChangelogWhite.yml +++ b/Resources/Changelog/ChangelogWhite.yml @@ -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 diff --git a/Resources/Locale/ru-RU/implant/implant.ftl b/Resources/Locale/ru-RU/implant/implant.ftl index 766b4cc49f..f79a2f79a7 100644 --- a/Resources/Locale/ru-RU/implant/implant.ftl +++ b/Resources/Locale/ru-RU/implant/implant.ftl @@ -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 diff --git a/Resources/Locale/ru-RU/thief/backpack.ftl b/Resources/Locale/ru-RU/thief/backpack.ftl index 6ff25fa3c5..566e2ce90c 100644 --- a/Resources/Locale/ru-RU/thief/backpack.ftl +++ b/Resources/Locale/ru-RU/thief/backpack.ftl @@ -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 = + Набор для любителей технологий. + Включает в себя устройство для взлома шлюзов и шкафов, + временной маяк, глушитель радио и хамелеон проектор. diff --git a/Resources/Prototypes/Catalog/thief_toolbox_sets.yml b/Resources/Prototypes/Catalog/thief_toolbox_sets.yml index d0fbd277c8..ba4ece9cfa 100644 --- a/Resources/Prototypes/Catalog/thief_toolbox_sets.yml +++ b/Resources/Prototypes/Catalog/thief_toolbox_sets.yml @@ -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 diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml index 1661727cb2..991fa93c5c 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml @@ -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 diff --git a/Resources/Prototypes/Entities/Mobs/Species/base.yml b/Resources/Prototypes/Entities/Mobs/Species/base.yml index e582052037..bbfbc5ef11 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/base.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml @@ -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 diff --git a/Resources/Prototypes/Entities/Mobs/base.yml b/Resources/Prototypes/Entities/Mobs/base.yml index 41ece683df..bbc7b1e920 100644 --- a/Resources/Prototypes/Entities/Mobs/base.yml +++ b/Resources/Prototypes/Entities/Mobs/base.yml @@ -54,12 +54,6 @@ damageContainer: Biological - type: Destructible thresholds: - - trigger: - !type:DamageTypeTrigger - damageType: Blunt - damage: 400 - behaviors: - - !type:GibBehavior { } - trigger: !type:DamageTypeTrigger damageType: Heat diff --git a/Resources/Prototypes/Entities/Objects/Shields/shields.yml b/Resources/Prototypes/Entities/Objects/Shields/shields.yml index a35693617b..ed85e4500e 100644 --- a/Resources/Prototypes/Entities/Objects/Shields/shields.yml +++ b/Resources/Prototypes/Entities/Objects/Shields/shields.yml @@ -59,6 +59,7 @@ max: 2 - type: StaticPrice price: 50 + - type: DisarmMalus #Security Shields diff --git a/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml b/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml index 800c0add54..d4abe6847e 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml @@ -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 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/magnum.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/magnum.yml index 7457891c6c..364ba18c42 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/magnum.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/magnum.yml @@ -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 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml index 8f07ec2a4a..f7b30f214d 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml @@ -27,7 +27,7 @@ Blunt: 10 - type: StaminaDamageOnCollide ignoreResistances: false - damage: 60 + damage: 80 - type: entity id: PelletShotgun diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml index 78cc46c3f1..9100b5bf2e 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml @@ -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 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/security.yml b/Resources/Prototypes/Entities/Objects/Weapons/security.yml index 21097aac66..5dcf2c872e 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/security.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/security.yml @@ -87,6 +87,7 @@ - type: GuideHelp guides: - Security + - type: StunLock # Wd EDIT - type: entity name: truncheon diff --git a/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/base_structurelockers.yml b/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/base_structurelockers.yml index 69e63b6c6e..45d464e6a1 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/base_structurelockers.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/base_structurelockers.yml @@ -54,6 +54,9 @@ radius: 1.15 energy: 0.45 - type: PointLightLocker + - type: Tag + tags: + - DoorjackUsable - type: entity id: LockerBaseSecure diff --git a/Resources/Prototypes/Entities/Structures/Storage/Closets/base_structureclosets.yml b/Resources/Prototypes/Entities/Structures/Storage/Closets/base_structureclosets.yml index 96b008eb02..90fd36eac2 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Closets/base_structureclosets.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Closets/base_structureclosets.yml @@ -291,3 +291,6 @@ stateDoorOpen: base stateDoorClosed: door - type: LockVisuals + - type: Tag + tags: + - DoorjackUsable diff --git a/Resources/Prototypes/Entities/Structures/Storage/Crates/base_structurecrates.yml b/Resources/Prototypes/Entities/Structures/Storage/Crates/base_structurecrates.yml index 95580292d9..c742caaf20 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Crates/base_structurecrates.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Crates/base_structurecrates.yml @@ -148,3 +148,6 @@ - Energy reflectProb: 0.2 spread: 90 + - type: Tag + tags: + - DoorjackUsable diff --git a/Resources/Prototypes/_White/Entities/Objects/Tools/doorjack.yml b/Resources/Prototypes/_White/Entities/Objects/Tools/doorjack.yml new file mode 100644 index 0000000000..9c589e1c07 --- /dev/null +++ b/Resources/Prototypes/_White/Entities/Objects/Tools/doorjack.yml @@ -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 diff --git a/Resources/Prototypes/_White/Entities/Objects/Weapons/Guns/riotgrenadelauncher.txt b/Resources/Prototypes/_White/Entities/Objects/Weapons/Guns/riotgrenadelauncher.txt new file mode 100644 index 0000000000..557417f1be --- /dev/null +++ b/Resources/Prototypes/_White/Entities/Objects/Weapons/Guns/riotgrenadelauncher.txt @@ -0,0 +1,5 @@ +- type: entity + name: BaseWeaponLauncher + parent: BaseItem + id: BaseWeaponLauncher + description: A rooty tooty point and shooty. \ No newline at end of file diff --git a/Resources/Prototypes/_White/Entities/Objects/Weapons/Guns/riotgrenadelauncher.yml b/Resources/Prototypes/_White/Entities/Objects/Weapons/Guns/riotgrenadelauncher.yml new file mode 100644 index 0000000000..9b656dabd2 --- /dev/null +++ b/Resources/Prototypes/_White/Entities/Objects/Weapons/Guns/riotgrenadelauncher.yml @@ -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 \ No newline at end of file diff --git a/Resources/Prototypes/_White/tags.yml b/Resources/Prototypes/_White/tags.yml index 3a54188103..a2cefb74dc 100644 --- a/Resources/Prototypes/_White/tags.yml +++ b/Resources/Prototypes/_White/tags.yml @@ -78,3 +78,6 @@ - type: Tag id: BaseAimModule + +- type: Tag + id: DoorjackUsable diff --git a/Resources/Textures/White/Objects/Tools/doorjack.rsi/icon.png b/Resources/Textures/White/Objects/Tools/doorjack.rsi/icon.png new file mode 100644 index 0000000000..f244ac00b4 Binary files /dev/null and b/Resources/Textures/White/Objects/Tools/doorjack.rsi/icon.png differ diff --git a/Resources/Textures/White/Objects/Tools/doorjack.rsi/inhand-left.png b/Resources/Textures/White/Objects/Tools/doorjack.rsi/inhand-left.png new file mode 100644 index 0000000000..f273903cb6 Binary files /dev/null and b/Resources/Textures/White/Objects/Tools/doorjack.rsi/inhand-left.png differ diff --git a/Resources/Textures/White/Objects/Tools/doorjack.rsi/inhand-right.png b/Resources/Textures/White/Objects/Tools/doorjack.rsi/inhand-right.png new file mode 100644 index 0000000000..f6933973f2 Binary files /dev/null and b/Resources/Textures/White/Objects/Tools/doorjack.rsi/inhand-right.png differ diff --git a/Resources/Textures/White/Objects/Tools/doorjack.rsi/meta.json b/Resources/Textures/White/Objects/Tools/doorjack.rsi/meta.json new file mode 100644 index 0000000000..ce906d3c74 --- /dev/null +++ b/Resources/Textures/White/Objects/Tools/doorjack.rsi/meta.json @@ -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" + } + ] +}