diff --git a/Content.Server/Body/Systems/BloodstreamSystem.cs b/Content.Server/Body/Systems/BloodstreamSystem.cs index fdf29d659d..3262514b96 100644 --- a/Content.Server/Body/Systems/BloodstreamSystem.cs +++ b/Content.Server/Body/Systems/BloodstreamSystem.cs @@ -1,6 +1,5 @@ using Content.Server._White.Accent.Bloodloss; using Content.Server.Body.Components; -using Content.Server.Chemistry.Containers.EntitySystems; using Content.Server.Chemistry.ReactionEffects; using Content.Server.Fluids.EntitySystems; using Content.Server.Forensics; @@ -13,7 +12,6 @@ using Content.Shared.Chemistry.EntitySystems; using Content.Shared.Chemistry.Reaction; using Content.Shared.Damage; using Content.Shared.Damage.Components; -using Content.Shared.Damage.Prototypes; using Content.Shared.Drunk; using Content.Shared.FixedPoint; using Content.Shared.Mobs; @@ -23,7 +21,6 @@ using Content.Shared.Mobs.Systems; using Content.Shared.Movement.Systems; using Content.Shared.Popups; using Content.Shared.Rejuvenate; -using Content.Shared.Speech.EntitySystems; using Robust.Server.Audio; using Robust.Shared.Prototypes; using Robust.Shared.Random; @@ -42,8 +39,7 @@ public sealed class BloodstreamSystem : EntitySystem [Dependency] private readonly PuddleSystem _puddleSystem = default!; [Dependency] private readonly MobStateSystem _mobStateSystem = default!; [Dependency] private readonly SharedDrunkSystem _drunkSystem = default!; - [Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!; - [Dependency] private readonly SharedStutteringSystem _stutteringSystem = default!; + [Dependency] private readonly SharedSolutionContainerSystem _solutionContainerSystem = default!; [Dependency] private readonly AlertsSystem _alertsSystem = default!; [Dependency] private readonly ForensicsSystem _forensicsSystem = default!; [Dependency] private readonly MovementSpeedModifierSystem _speed = default!; // WD @@ -188,12 +184,23 @@ public sealed class BloodstreamSystem : EntitySystem private void OnComponentInit(Entity entity, ref ComponentInit args) { - var chemicalSolution = _solutionContainerSystem.EnsureSolution(entity.Owner, entity.Comp.ChemicalSolutionName); - var bloodSolution = _solutionContainerSystem.EnsureSolution(entity.Owner, entity.Comp.BloodSolutionName); - var tempSolution = _solutionContainerSystem.EnsureSolution(entity.Owner, entity.Comp.BloodTemporarySolutionName); + _solutionContainerSystem.EnsureSolution(entity.Owner, entity.Comp.ChemicalSolutionName, out var chemicalSolution); + _solutionContainerSystem.EnsureSolution(entity.Owner, entity.Comp.BloodSolutionName, out var bloodSolution); + _solutionContainerSystem.EnsureSolution(entity.Owner, entity.Comp.BloodTemporarySolutionName, out var tempSolution); + + if (chemicalSolution == null) + return; chemicalSolution.MaxVolume = entity.Comp.ChemicalMaxVolume; + + if (bloodSolution == null) + return; + bloodSolution.MaxVolume = entity.Comp.BloodMaxVolume; + + if (tempSolution == null) + return; + tempSolution.MaxVolume = entity.Comp.BleedPuddleThreshold * 4; // give some leeway, for chemstream as well // Fill blood solution with BLOOD @@ -203,12 +210,10 @@ public sealed class BloodstreamSystem : EntitySystem private void OnDamageChanged(Entity ent, ref DamageChangedEvent args) { if (args.DamageDelta is null || !args.DamageIncreased) - { return; - } // TODO probably cache this or something. humans get hurt a lot - if (!_prototypeManager.TryIndex(ent.Comp.DamageBleedModifiers, out var modifiers)) + if (!_prototypeManager.TryIndex(ent.Comp.DamageBleedModifiers, out var modifiers)) return; var bloodloss = DamageSpecifier.ApplyModifierSet(args.DamageDelta, modifiers); @@ -222,11 +227,12 @@ public sealed class BloodstreamSystem : EntitySystem var totalFloat = total.Float(); TryModifyBleedAmount(ent, totalFloat, ent); - /// - /// Critical hit. Causes target to lose blood, using the bleed rate modifier of the weapon, currently divided by 5 - /// The crit chance is currently the bleed rate modifier divided by 25. - /// Higher damage weapons have a higher chance to crit! - /// + /* + Critical hit. Causes target to lose blood, using the bleed rate modifier of the weapon, currently divided by 5 + The crit chance is currently the bleed rate modifier divided by 25. + Higher damage weapons have a higher chance to crit! + */ + var prob = Math.Clamp(totalFloat / 25, 0, 1); if (totalFloat > 0 && _robustRandom.Prob(prob)) { @@ -413,7 +419,7 @@ public sealed class BloodstreamSystem : EntitySystem if (HasComp(uid)) // WD { - if (component.BleedAmount == 0f) + if (component.BleedAmount == 0) RemComp(uid); _speed.RefreshMovementSpeedModifiers(uid); diff --git a/Content.Shared/Item/ItemToggle/Components/ItemToggleComponent.cs b/Content.Shared/Item/ItemToggle/Components/ItemToggleComponent.cs index 620ddfd194..be8f1b5912 100644 --- a/Content.Shared/Item/ItemToggle/Components/ItemToggleComponent.cs +++ b/Content.Shared/Item/ItemToggle/Components/ItemToggleComponent.cs @@ -51,6 +51,14 @@ public sealed partial class ItemToggleComponent : Component /// [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField] public bool ToggleLight = true; + + // WD added start + [DataField] + public string ActivatedDescription = "comp-item-toggle-on"; // fallback/standard text + + [DataField] + public string DeactivatedDescription = "comp-item-toggle-off"; // fallback/standard text + // WD added end } /// diff --git a/Content.Shared/Item/ItemToggle/SharedItemToggleSystem.cs b/Content.Shared/Item/ItemToggle/SharedItemToggleSystem.cs index 4ef614f298..5b69bca6b9 100644 --- a/Content.Shared/Item/ItemToggle/SharedItemToggleSystem.cs +++ b/Content.Shared/Item/ItemToggle/SharedItemToggleSystem.cs @@ -1,3 +1,4 @@ +using Content.Shared.Examine; using Content.Shared.Interaction.Events; using Content.Shared.Item.ItemToggle.Components; using Content.Shared.Popups; @@ -23,6 +24,8 @@ public abstract class SharedItemToggleSystem : EntitySystem [Dependency] private readonly INetManager _netManager = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly SharedItemSystem _item = default!; // WD + public override void Initialize() { base.Initialize(); @@ -35,6 +38,9 @@ public abstract class SharedItemToggleSystem : EntitySystem SubscribeLocalEvent(OnIsHotEvent); SubscribeLocalEvent(UpdateActiveSound); + + SubscribeLocalEvent(OnExamined); // WD + SubscribeLocalEvent(UpdatePrefix); // WD } private void OnStartup(Entity ent, ref ComponentStartup args) @@ -255,4 +261,21 @@ public abstract class SharedItemToggleSystem : EntitySystem activeSound.PlayingStream = _audio.Stop(activeSound.PlayingStream); } } + + // WD added start + private void OnExamined(Entity ent, ref ExaminedEvent args) + { + var onMsg = IsActivated(ent.Owner) + ? Loc.GetString(ent.Comp.ActivatedDescription) + : Loc.GetString(ent.Comp.DeactivatedDescription); + + args.PushMarkup(onMsg); + } + + private void UpdatePrefix(Entity ent, ref ItemToggledEvent args) + { + _item.SetHeldPrefix(ent.Owner, args.Activated ? "on" : "off"); + } + + // WD added end } diff --git a/Content.Shared/StatusEffect/StatusEffectsSystem.cs b/Content.Shared/StatusEffect/StatusEffectsSystem.cs index f3e3e12bd8..50435d9fa9 100644 --- a/Content.Shared/StatusEffect/StatusEffectsSystem.cs +++ b/Content.Shared/StatusEffect/StatusEffectsSystem.cs @@ -123,6 +123,30 @@ namespace Content.Shared.StatusEffect return false; } + // WD added start + // May god forgive us + public bool TryAddStatusEffect(EntityUid uid, string key, TimeSpan time, bool refresh, Component component, + StatusEffectsComponent? status = null) + where T : IComponent, new() + { + if (!Resolve(uid, ref status, false)) + return false; + + if (TryAddStatusEffect(uid, key, time, refresh, status)) + { + // If they already have the comp, we just won't bother updating anything. + if (!EntityManager.HasComponent(uid)) + { + EntityManager.AddComponent(uid, component); + status.ActiveEffects[key].RelevantComponent = _componentFactory.GetComponentName(component.GetType()); + } + return true; + } + + return false; + } + // WD added end + public bool TryAddStatusEffect(EntityUid uid, string key, TimeSpan time, bool refresh, string component, StatusEffectsComponent? status = null) { diff --git a/Content.Shared/Stunnable/KnockedDownComponent.cs b/Content.Shared/Stunnable/KnockedDownComponent.cs index e4f11b8cda..cd1d8077c2 100644 --- a/Content.Shared/Stunnable/KnockedDownComponent.cs +++ b/Content.Shared/Stunnable/KnockedDownComponent.cs @@ -1,18 +1,24 @@ +using Content.Shared.Standing.Systems; using Robust.Shared.Audio; using Robust.Shared.GameStates; -using Robust.Shared.Serialization; namespace Content.Shared.Stunnable; [RegisterComponent, NetworkedComponent, AutoGenerateComponentState, Access(typeof(SharedStunSystem))] public sealed partial class KnockedDownComponent : Component { - [DataField("helpInterval"), AutoNetworkedField] + [DataField, AutoNetworkedField] public float HelpInterval = 1f; - [DataField("helpAttemptSound")] + [DataField] public SoundSpecifier StunAttemptSound = new SoundPathSpecifier("/Audio/Effects/thudswoosh.ogg"); [ViewVariables, AutoNetworkedField] public float HelpTimer = 0f; + + // WD added start + // Holy shit why is this so long + [DataField, AutoNetworkedField] + public SharedStandingStateSystem.DropHeldItemsBehavior KnockDownBehavior = SharedStandingStateSystem.DropHeldItemsBehavior.DropIfStanding; + // WD added end } diff --git a/Content.Shared/Stunnable/SharedStunSystem.cs b/Content.Shared/Stunnable/SharedStunSystem.cs index 6053086196..7b3866791d 100644 --- a/Content.Shared/Stunnable/SharedStunSystem.cs +++ b/Content.Shared/Stunnable/SharedStunSystem.cs @@ -106,25 +106,25 @@ public abstract class SharedStunSystem : EntitySystem private void OnKnockInit(EntityUid uid, KnockedDownComponent component, ComponentInit args) { - RaiseNetworkEvent(new CheckAutoGetUpEvent()); // WD EDIT - _standingState.TryLieDown(uid, null, SharedStandingStateSystem.DropHeldItemsBehavior.DropIfStanding); + RaiseNetworkEvent(new CheckAutoGetUpEvent()); // WD edit + _standingState.TryLieDown(uid, null, component.KnockDownBehavior); // WD edit } private void OnKnockShutdown(EntityUid uid, KnockedDownComponent component, ComponentShutdown args) { - // WD EDIT START + // WD edit start // Don't stand up if we can lie down via keybind - if (!TryComp(uid, out StandingStateComponent? standing) || !(!standing.CanLieDown || standing.AutoGetUp)) // WD EDIT + if (!TryComp(uid, out StandingStateComponent? standing) || !(!standing.CanLieDown || standing.AutoGetUp)) // WD edit return; - if (standing.AutoGetUp && !_container.IsEntityInContainer(uid)) // WD EDIT + if (standing.AutoGetUp && !_container.IsEntityInContainer(uid)) // WD edit { _standingState.TryStandUp(uid, standing); return; } _standingState.Stand(uid, standing); - // WD EDIT END + // WD edit end } private void OnStandAttempt(EntityUid uid, KnockedDownComponent component, StandAttemptEvent args) @@ -178,7 +178,7 @@ public abstract class SharedStunSystem : EntitySystem /// Knocks down the entity, making it fall to the ground. /// public bool TryKnockdown(EntityUid uid, TimeSpan time, bool refresh, - StatusEffectsComponent? status = null) + StatusEffectsComponent? status = null, SharedStandingStateSystem.DropHeldItemsBehavior? behavior = null) { if (time <= TimeSpan.Zero) return false; @@ -186,8 +186,24 @@ public abstract class SharedStunSystem : EntitySystem if (!Resolve(uid, ref status, false)) return false; - if (!_statusEffect.TryAddStatusEffect(uid, "KnockedDown", time, refresh)) - return false; + // WD added start + // May god forgive us + if (behavior.HasValue && !HasComp(uid)) + { + var knockedDownComponent = new KnockedDownComponent + { + KnockDownBehavior = behavior.Value + }; + + if (!_statusEffect.TryAddStatusEffect(uid, "KnockedDown", time, refresh, knockedDownComponent)) + return false; + } + else + { + if (!_statusEffect.TryAddStatusEffect(uid, "KnockedDown", time, refresh)) + return false; + } + // WD added end var ev = new KnockedDownEvent(); RaiseLocalEvent(uid, ref ev); diff --git a/Content.Shared/Weapons/Melee/Components/MeleeThrowOnHitComponent.cs b/Content.Shared/Weapons/Melee/Components/MeleeThrowOnHitComponent.cs index 43425ad798..f63941569a 100644 --- a/Content.Shared/Weapons/Melee/Components/MeleeThrowOnHitComponent.cs +++ b/Content.Shared/Weapons/Melee/Components/MeleeThrowOnHitComponent.cs @@ -48,7 +48,7 @@ public sealed partial class MeleeThrowOnHitComponent : Component [AutoNetworkedField] public bool Enabled = true; - // WD START + // WD added [DataField, ViewVariables(VVAccess.ReadWrite)] [AutoNetworkedField] public float StunTime; @@ -56,7 +56,15 @@ public sealed partial class MeleeThrowOnHitComponent : Component [DataField, ViewVariables(VVAccess.ReadWrite)] [AutoNetworkedField] public bool ThrowOnThrowHit; - // WD END + + [DataField, ViewVariables(VVAccess.ReadWrite)] + [AutoNetworkedField] + public bool FallAfterHit; + + [DataField, ViewVariables(VVAccess.ReadWrite)] + [AutoNetworkedField] + public bool RequireWield = true; + // WD added } /// diff --git a/Content.Shared/Weapons/Melee/MeleeThrowOnHitSystem.cs b/Content.Shared/Weapons/Melee/MeleeThrowOnHitSystem.cs index 65693dc506..c6b5bcf277 100644 --- a/Content.Shared/Weapons/Melee/MeleeThrowOnHitSystem.cs +++ b/Content.Shared/Weapons/Melee/MeleeThrowOnHitSystem.cs @@ -1,9 +1,11 @@ using System.Numerics; using Content.Shared.Construction.Components; +using Content.Shared.Standing.Systems; using Content.Shared.Stunnable; using Content.Shared.Throwing; using Content.Shared.Weapons.Melee.Components; using Content.Shared.Weapons.Melee.Events; +using Content.Shared.Wieldable.Components; using Robust.Shared.Physics; using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Events; @@ -20,8 +22,9 @@ public sealed class MeleeThrowOnHitSystem : EntitySystem [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; - [Dependency] private readonly SharedStunSystem _stun = default!; // WD - [Dependency] private readonly ThrownItemSystem _thrownItem = default!; // WD + [Dependency] private readonly SharedStunSystem _stun = default!; // WD added + [Dependency] private readonly ThrownItemSystem _thrownItem = default!; // WD added + [Dependency] private readonly SharedStandingStateSystem _standingState = default!; // WD added /// public override void Initialize() @@ -36,8 +39,10 @@ public sealed class MeleeThrowOnHitSystem : EntitySystem private void OnDoHit(Entity ent, ref ThrowDoHitEvent args) // WD { + // WD edit start if (!ent.Comp.ThrowOnThrowHit) return; + // WD edit end if (!CanThrowOnHit(ent, args.Target)) return; @@ -55,9 +60,15 @@ public sealed class MeleeThrowOnHitSystem : EntitySystem MinLifetime = ent.Comp.MinLifetime }; AddComp(args.Target, thrownComp); + + // WD added start if (ent.Comp.StunTime != 0f) _stun.TryParalyze(args.Target, TimeSpan.FromSeconds(ent.Comp.StunTime), true); + else if (ent.Comp.FallAfterHit) + _standingState.TryLieDown(ent, null, SharedStandingStateSystem.DropHeldItemsBehavior.DropIfStanding); + // WD added end + _thrownItem.LandComponent(ent, args.Component, physics, false); _physics.SetLinearVelocity(ent, Vector2.Zero); } @@ -67,14 +78,24 @@ public sealed class MeleeThrowOnHitSystem : EntitySystem if (args.Handled) // WD return; - var (_, comp) = ent; if (!args.IsHit) return; - // WD START - var stunTime = comp.StunTime; - var speed = comp.Speed; - var lifetime = comp.Lifetime; + // WD added start + if (ent.Comp.RequireWield) + { + if (!TryComp(args.Weapon, out var weapon)) + return; + + if (!weapon.Wielded) + return; + } + // WD added end + + // WD edit start + var stunTime = ent.Comp.StunTime; + var speed = ent.Comp.Speed; + var lifetime = ent.Comp.Lifetime; if (args.Direction != null) // Heavy attack { @@ -82,7 +103,7 @@ public sealed class MeleeThrowOnHitSystem : EntitySystem speed *= 0.5f; lifetime *= 0.5f; } - // WD END + // WD edit end var mapPos = _transform.GetMapCoordinates(args.User).Position; foreach (var hit in args.HitEntities) @@ -95,7 +116,7 @@ public sealed class MeleeThrowOnHitSystem : EntitySystem if (!CanThrowOnHit(ent, hit)) continue; - if (comp.UnanchorOnHit && HasComp(hit)) + if (ent.Comp.UnanchorOnHit && HasComp(hit)) { _transform.Unanchor(hit, Transform(hit)); } @@ -105,13 +126,19 @@ public sealed class MeleeThrowOnHitSystem : EntitySystem RaiseLocalEvent(hit, ref ev); var thrownComp = new MeleeThrownComponent { - Velocity = angle.Normalized() * speed, // WD EDIT - Lifetime = lifetime, // WD EDIT - MinLifetime = comp.MinLifetime + Velocity = angle.Normalized() * speed, // WD edit + Lifetime = lifetime, // WD edit + MinLifetime = ent.Comp.MinLifetime }; AddComp(hit, thrownComp); + + // WD added end if (stunTime != 0f) _stun.TryParalyze(hit, TimeSpan.FromSeconds(stunTime), true); + + else if (ent.Comp.FallAfterHit) + _standingState.TryLieDown(hit); + // WD added start } } @@ -126,9 +153,11 @@ public sealed class MeleeThrowOnHitSystem : EntitySystem comp.PreviousStatus = body.BodyStatus; comp.ThrownEndTime = _timing.CurTime + TimeSpan.FromSeconds(comp.Lifetime); comp.MinLifetimeTime = _timing.CurTime + TimeSpan.FromSeconds(comp.MinLifetime); + _physics.SetBodyStatus(ent, body, BodyStatus.InAir); _physics.SetLinearVelocity(ent, Vector2.Zero, body: body); _physics.ApplyLinearImpulse(ent, comp.Velocity * body.Mass, body: body); + Dirty(ent, ent.Comp); } diff --git a/Content.Shared/_White/Item/KnockDownOnHit/KnockDownOnHitComponent.cs b/Content.Shared/_White/Item/KnockDownOnHit/KnockDownOnHitComponent.cs new file mode 100644 index 0000000000..16ecba2f9f --- /dev/null +++ b/Content.Shared/_White/Item/KnockDownOnHit/KnockDownOnHitComponent.cs @@ -0,0 +1,17 @@ +using Content.Shared.Standing.Systems; +using Robust.Shared.GameStates; + +namespace Content.Shared._White.Item.KnockDownOnHit; + +[RegisterComponent, NetworkedComponent] +public sealed partial class KnockDownOnHitComponent : Component +{ + [DataField, ViewVariables(VVAccess.ReadWrite)] + public TimeSpan KnockdownTime = TimeSpan.FromSeconds(1.5f); + + [DataField] + public SharedStandingStateSystem.DropHeldItemsBehavior? KnockDownBehavior; + + [DataField] + public bool RequireWield; +} diff --git a/Content.Shared/_White/Item/KnockDownOnHit/KnockDownOnHitSystem.cs b/Content.Shared/_White/Item/KnockDownOnHit/KnockDownOnHitSystem.cs new file mode 100644 index 0000000000..891049ae98 --- /dev/null +++ b/Content.Shared/_White/Item/KnockDownOnHit/KnockDownOnHitSystem.cs @@ -0,0 +1,49 @@ +using Content.Shared.Damage.Events; +using Content.Shared.Item.ItemToggle; +using Content.Shared.Stunnable; +using Content.Shared.Weapons.Melee.Events; +using Content.Shared.Wieldable.Components; + +namespace Content.Shared._White.Item.KnockDownOnHit; + +public sealed class KnockDownOnHitSystem : EntitySystem +{ + + [Dependency] private readonly SharedStunSystem _stun = default!; + [Dependency] private readonly SharedItemToggleSystem _itemToggle = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnStaminaHitAttempt); + SubscribeLocalEvent(OnHit); + } + + private void OnHit(Entity ent, ref MeleeHitEvent args) + { + var time = ent.Comp.KnockdownTime; + if (time <= TimeSpan.Zero) + return; + + foreach (var uid in args.HitEntities) + { + if (ent.Comp.RequireWield) + { + if (!TryComp(args.Weapon, out var weapon)) + continue; + + if (!weapon.Wielded) + continue; + } + + _stun.TryKnockdown(uid, time, true, behavior: ent.Comp.KnockDownBehavior); + } + } + + private void OnStaminaHitAttempt(Entity entity, ref StaminaDamageOnHitAttemptEvent args) + { + if (!_itemToggle.IsActivated(entity.Owner)) + args.Cancelled = true; + } +} diff --git a/Content.Shared/_White/Item/TelescopicBaton/TelescopicBatonComponent.cs b/Content.Shared/_White/Item/TelescopicBaton/TelescopicBatonComponent.cs deleted file mode 100644 index b8811c8a23..0000000000 --- a/Content.Shared/_White/Item/TelescopicBaton/TelescopicBatonComponent.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Content.Shared._White.Item.TelescopicBaton; - -[RegisterComponent] -public sealed partial class TelescopicBatonComponent : Component -{ - [DataField, ViewVariables(VVAccess.ReadWrite)] - public TimeSpan KnockdownTime = TimeSpan.FromSeconds(1.5f); -} diff --git a/Content.Shared/_White/Item/TelescopicBaton/TelescopicBatonSystem.cs b/Content.Shared/_White/Item/TelescopicBaton/TelescopicBatonSystem.cs deleted file mode 100644 index f341059862..0000000000 --- a/Content.Shared/_White/Item/TelescopicBaton/TelescopicBatonSystem.cs +++ /dev/null @@ -1,56 +0,0 @@ -using Content.Shared.Damage.Events; -using Content.Shared.Examine; -using Content.Shared.Item; -using Content.Shared.Item.ItemToggle; -using Content.Shared.Item.ItemToggle.Components; -using Content.Shared.Stunnable; - -namespace Content.Shared._White.Item.TelescopicBaton; - -public sealed class TelescopicBatonSystem : EntitySystem -{ - [Dependency] private readonly SharedItemSystem _item = default!; - [Dependency] private readonly SharedStunSystem _stun = default!; - [Dependency] private readonly SharedItemToggleSystem _itemToggle = default!; - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnExamined); - SubscribeLocalEvent(OnStaminaHitAttempt); - SubscribeLocalEvent(ToggleDone); - SubscribeLocalEvent(OnHit); - } - - private void OnHit(Entity ent, ref StaminaMeleeHitEvent args) - { - var time = ent.Comp.KnockdownTime; - if (time <= TimeSpan.Zero) - return; - - foreach (var (uid, _) in args.HitList) - { - _stun.TryKnockdown(uid, time, true); - } - } - - private void OnStaminaHitAttempt(Entity entity, ref StaminaDamageOnHitAttemptEvent args) - { - if (!_itemToggle.IsActivated(entity.Owner)) - args.Cancelled = true; - } - - private void OnExamined(Entity entity, ref ExaminedEvent args) - { - var onMsg = _itemToggle.IsActivated(entity.Owner) - ? Loc.GetString("comp-telebaton-examined-on") - : Loc.GetString("comp-telebaton-examined-off"); - args.PushMarkup(onMsg); - } - - private void ToggleDone(Entity entity, ref ItemToggledEvent args) - { - _item.SetHeldPrefix(entity.Owner, args.Activated ? "on" : "off"); - } -} diff --git a/Resources/Locale/ru-RU/_white/object/telebaton.ftl b/Resources/Locale/ru-RU/_white/object/telebaton.ftl index 31327974e4..e0681828d2 100644 --- a/Resources/Locale/ru-RU/_white/object/telebaton.ftl +++ b/Resources/Locale/ru-RU/_white/object/telebaton.ftl @@ -3,3 +3,6 @@ ent-TelescopicBaton = телескопическая дубинка comp-telebaton-examined-on = Дубинка в боевом положении. comp-telebaton-examined-off = Дубинка сложена. + +comp-item-toggle-on = Активировано +comp-item-toggle-off = Деактивировано diff --git a/Resources/Prototypes/Damage/modifier_sets.yml b/Resources/Prototypes/Damage/modifier_sets.yml index 35a95b58e5..3971053cbe 100644 --- a/Resources/Prototypes/Damage/modifier_sets.yml +++ b/Resources/Prototypes/Damage/modifier_sets.yml @@ -241,10 +241,10 @@ # in relation to how they cause bleed rate. - type: damageModifierSet id: BloodlossHuman - coefficients: - Blunt: 0.05 - Slash: 0.25 - Piercing: 0.2 + coefficients: # WD edit alert!! Weapons rebalanced - only slash and piercing damage should cast bleeding + Blunt: 0.0 + Slash: 0.45 # WD + Piercing: 0.3 # WD Shock: 0.0 Cold: 0.0 Heat: -0.5 # heat damage cauterizes wounds, but will still hurt obviously. diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/baseball_bat.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/baseball_bat.yml index c1ba38ac0f..02bd2b5f0d 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/baseball_bat.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/baseball_bat.yml @@ -11,15 +11,16 @@ wideAnimationRotation: -135 damage: types: - Blunt: 10 + Blunt: 8 # WD Structural: 5 soundHit: path: "/Audio/Weapons/smash.ogg" + canHeavyAttack: false - type: Wieldable - type: IncreaseDamageOnWield damage: types: - Blunt: 5 + Blunt: 4 # WD Structural: 10 - type: Item size: Normal @@ -42,6 +43,14 @@ - type: Tag tags: - BaseballBat + - type: MeleeThrowOnHit # WD + lifetime: 0.2 + speed: 5 + requireWield: true + - type: KnockDownOnHit + knockDownBehavior: NoDrop + knockdownTime: 0.5 + requireWield: true - type: entity name: incomplete baseball bat diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/cane.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/cane.yml index 5c26020d72..eb66e095a3 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/cane.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/cane.yml @@ -41,7 +41,7 @@ attackRate: 1.5 damage: types: - Slash: 14 + Slash: 12 # WD soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Item diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/cult.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/cult.yml index 73eb55cdf4..cfc6202d17 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/cult.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/cult.yml @@ -13,7 +13,7 @@ attackRate: 1.5 damage: types: - Slash: 12 + Slash: 9 # WD soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Item @@ -66,7 +66,7 @@ attackRate: 0.75 damage: types: - Slash: 33 + Slash: 27 # WD soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Item @@ -104,7 +104,7 @@ damage: types: Blunt: 10 - Slash: 20 + Slash: 18 # WD Structural: 5 soundHit: path: "/Audio/Weapons/smash.ogg" @@ -113,7 +113,7 @@ damage: types: Blunt: 4 - Slash: 12 + Slash: 10 # WD Structural: 10 - type: Item size: Ginormous diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/daggers.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/daggers.yml index 9828b66e0a..becaa862e7 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/daggers.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/daggers.yml @@ -13,7 +13,7 @@ attackRate: 1.3 damage: types: - Slash: 10.5 + Slash: 10.5 # WD soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Item @@ -45,7 +45,7 @@ attackRate: 1.5 damage: types: - Slash: 17.5 + Slash: 15 # WD soundHit: path: /Audio/Weapons/bladeslice.ogg - type: EmbeddableProjectile @@ -55,7 +55,7 @@ - type: DamageOtherOnHit damage: types: - Slash: 20 + Slash: 44 # WD - type: Item size: Small - type: DisarmMalus diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml index 649c26b5bb..558f53cd02 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml @@ -36,8 +36,7 @@ variation: 0.125 activatedDamage: types: - Slash: 15 - Heat: 15 + Slash: 41 # WD Structural: 20 - type: Sprite sprite: Objects/Weapons/Melee/e_sword.rsi @@ -131,8 +130,7 @@ variation: 0.250 activatedDamage: types: - Slash: 10 - Heat: 10 + Slash: 23 # WD deactivatedSecret: true - type: ItemToggleActiveSound activeSound: @@ -263,8 +261,7 @@ - type: IncreaseDamageOnWield damage: types: - Slash: 15 - Heat: 15 + Slash: 30 # WD - type: Reflect reflectProb: 1 enabled: false @@ -299,8 +296,7 @@ variation: 0.125 activatedDamage: types: - Slash: 15 - Heat: 15 + Slash: 33 # WD Structural: 20 - type: Reflect reflectProb: 0.8 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml index 047c6b12bf..f905047b2f 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml @@ -18,8 +18,8 @@ damage: types: # axes are kinda like sharp hammers, you know? - Blunt: 5 - Slash: 13 + Blunt: 3 # WD + Slash: 10 # WD Structural: 10 soundHit: path: "/Audio/Weapons/smash.ogg" @@ -28,7 +28,7 @@ damage: types: Blunt: 2.5 - Slash: 10.5 + Slash: 8 # WD Structural: 60 - type: Item size: Ginormous diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml index 8e93fccaee..6652b98efe 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml @@ -14,7 +14,7 @@ wideAnimationRotation: -135 damage: types: - Slash: 12 + Slash: 10 # WD soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Sprite @@ -42,6 +42,10 @@ - type: Item sprite: Objects/Weapons/Melee/kitchen_knife.rsi storedRotation: -45 + - type: DamageOtherOnHit # WD + damage: + types: + Piercing: 20 - type: GuideHelp guides: - Chef @@ -68,7 +72,7 @@ attackRate: 1.5 damage: types: - Slash: 12 + Slash: 13 # WD - type: Item size: Normal sprite: Objects/Weapons/Melee/cleaver.rsi @@ -100,7 +104,7 @@ - type: DamageOtherOnHit damage: types: - Slash: 10 + Piercing: 27 # WD - type: Item sprite: Objects/Weapons/Melee/combat_knife.rsi storedRotation: -45 @@ -136,7 +140,11 @@ attackRate: 1.0 damage: types: - Slash: 18 # Same DPS as combat knife + Slash: 12 # WD + - type: DamageOtherOnHit # WD + damage: + types: + Piercing: 44 - type: Item sprite: Objects/Weapons/Melee/kukri_knife.rsi @@ -159,7 +167,7 @@ - type: DamageOtherOnHit damage: types: - Slash: 10 + Piercing: 10 # WD - type: Sprite sprite: Clothing/Head/Hats/greyflatcap.rsi - type: Clothing @@ -289,7 +297,7 @@ damage: types: Slash: 10 - Piercing: 15 + Piercing: 35 # WD - type: Item sprite: Objects/Weapons/Melee/throwing_knife.rsi storedRotation: -45 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml index b3f4362f02..0bcd987881 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml @@ -13,7 +13,7 @@ attackRate: 1.5 damage: types: - Slash: 19 + Slash: 14 # WD # WD edit sounds start soundHit: path: /Audio/White/Items/hit/sabre_hit2.ogg @@ -27,12 +27,12 @@ storedRotation: 44 # It just works shape: - 0, 0, 4, 0 - - type: Tag - tags: - - CaptainSabre - type: DisarmMalus - type: MeleeBlock delay: 6.1 + - type: Tag + tags: + - CaptainSabre - type: entity name: katana @@ -51,7 +51,7 @@ wideAnimationRotation: -135 damage: types: - Slash: 24 + Slash: 20 # WD soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Item @@ -80,7 +80,7 @@ wideAnimationRotation: -60 damage: types: - Slash: 30 + Slash: 33 # WD - type: Item size: Huge sprite: Objects/Weapons/Melee/energykatana.rsi @@ -123,7 +123,7 @@ wideAnimationRotation: -135 damage: types: - Slash: 20 + Slash: 17 # WD soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Item @@ -155,7 +155,7 @@ attackRate: 0.75 damage: types: - Slash: 30 + Slash: 21 # WD soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Item @@ -191,7 +191,7 @@ wideAnimationRotation: -135 damage: types: - Slash: 20 + Slash: 20 # WD soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Item diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/tagilla_hammer.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/tagilla_hammer.yml index b21bfd08d3..52b02eb7e2 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/tagilla_hammer.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/tagilla_hammer.yml @@ -14,8 +14,7 @@ attackRate: 0.75 damage: types: - Blunt: 5 - Slash: 5 + Blunt: 10 Structural: 10 soundHit: path: "/Audio/Weapons/sledgehammer_hit_1.ogg" @@ -23,8 +22,7 @@ - type: IncreaseDamageOnWield damage: types: - Blunt: 10 - Slash: 5 + Blunt: 15 Structural: 40 - type: Item size: Ginormous diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/throwing_stars.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/throwing_stars.yml index 788e95e8e1..c70683e6c9 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/throwing_stars.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/throwing_stars.yml @@ -77,7 +77,7 @@ damage: types: Slash: 8 - Piercing: 10 + Piercing: 16 # WD - type: StaminaDamageOnCollide damage: 45 - type: StaminaDamageOnEmbed diff --git a/Resources/Prototypes/_White/Entities/Objects/Weapons/chaplain_weapons.yml b/Resources/Prototypes/_White/Entities/Objects/Weapons/chaplain_weapons.yml index 0a29e7b361..8bb031ba6d 100644 --- a/Resources/Prototypes/_White/Entities/Objects/Weapons/chaplain_weapons.yml +++ b/Resources/Prototypes/_White/Entities/Objects/Weapons/chaplain_weapons.yml @@ -1,5 +1,21 @@ +# Так как мечей много, а смысла в них не очень - я буду писать в комментариях геймдизайнерских прикол каждого из них + - type: entity parent: BaseItem + id: BaseHolyWeapon + abstract: true + components: + - type: HolyWeapon + - type: Sprite + sprite: White/Objects/Weapons/Chaplain/forceweapon.rsi + state: icon + - type: MeleeWeapon + soundHit: + path: /Audio/Weapons/bladeslice.ogg + +# Базовая палка, чтобы как можно быстрее сменить ее. +- type: entity + parent: BaseHolyWeapon id: NullRod name: жезл нулификации description: Жезл из чистого обсидиана. Само его присутствие разрушает и ослабляет "магические силы". Во всяком случае так написано в путеводителе. @@ -11,6 +27,8 @@ damage: types: Blunt: 18 + soundHit: + collection: MetalThud - type: Item size: Normal sprite: White/Objects/Weapons/Chaplain/nullrod.rsi @@ -43,10 +61,10 @@ - UnholyPitchfork - WarHammer - HyperTool - - type: HolyWeapon +# Прикольно выглядящая рука, нельзя снять и бьет ожогами. - type: entity - parent: BaseItem + parent: BaseHolyWeapon id: GodHand name: божья длань description: Эта рука сияет с потрясающей силой! @@ -63,26 +81,22 @@ wideAnimationRotation: 180 damage: types: - Heat: 18 + Heat: 15 - type: Item size: Ginormous sprite: White/Objects/Weapons/Chaplain/godhand.rsi - type: Unremoveable deleteOnDrop: true - - type: HolyWeapon +# Типичный меч, база базовая. Может блокировать, острый. - type: entity - parent: Claymore + parent: BaseHolyWeapon id: HolyClaymore name: священный клеймор description: Оружие, подходящее для крестового похода! components: - type: Sprite sprite: White/Objects/Weapons/Chaplain/claymore.rsi - - type: MeleeWeapon - damage: - types: - Slash: 33 - type: Clothing sprite: White/Objects/Weapons/Chaplain/claymore.rsi slots: @@ -91,29 +105,45 @@ - suitStorage - type: Item sprite: White/Objects/Weapons/Chaplain/claymore.rsi - - type: HolyWeapon + - type: MeleeWeapon + damage: + types: + Slash: 15 + - type: Sharp + - type: MeleeBlock + delay: 12.1 +# Отсылка на вархаммер, больше всего урона, так как не может блокировать - type: entity - parent: HolyClaymore + parent: BaseHolyWeapon id: Chainsword name: цепной меч description: Не позволь еретику жить. components: - type: Sprite sprite: White/Objects/Weapons/Chaplain/chainsword.rsi + state: icon + - type: Clothing + sprite: White/Objects/Weapons/Chaplain/chainsword.rsi + slots: + - back + - belt + - suitStorage + - type: Item + sprite: White/Objects/Weapons/Chaplain/chainsword.rsi - type: MeleeWeapon soundHit: path: /Audio/Weapons/chainsaw.ogg - - type: Clothing - sprite: White/Objects/Weapons/Chaplain/chainsword.rsi - - type: Item - sprite: White/Objects/Weapons/Chaplain/chainsword.rsi + damage: + types: + Slash: 21 - type: Tool qualities: - Sawing speed: 0.5 - - type: HolyWeapon + - type: Sharp +# Он светится - type: entity parent: HolyClaymore id: SwordGlowing @@ -130,10 +160,10 @@ color: lightblue - type: Item sprite: White/Objects/Weapons/Chaplain/forceweapon.rsi - - type: HolyWeapon +# Позволяет блокировать быстрее, средненький урон. - type: entity - parent: Katana + parent: BaseHolyWeapon id: HolyKatana name: лезвие ханзо description: Способен прорезать святой клеймор. @@ -148,10 +178,24 @@ - suitStorage - type: Item sprite: White/Objects/Weapons/Chaplain/katana.rsi - - type: HolyWeapon + - type: MeleeWeapon + wideAnimationRotation: -135 + damage: + types: + Slash: 13 + soundHit: + path: /Audio/Weapons/bladeslice.ogg + - type: DisarmMalus + - type: MeleeBlock + delay: 8.1 + - type: Sharp + - type: Tag + tags: + - Katana +# Смешной меч с разбросом дамага - type: entity - parent: HolyKatana + parent: BaseHolyWeapon id: MultiverseBlade name: внепространственный клинок description: Будучи когда-то предвестником межпространственной войны, его острота сильно колеблется. Наносит от 1 до 50 урона. @@ -170,10 +214,11 @@ - type: Item sprite: White/Objects/Weapons/Chaplain/multiverse.rsi - type: RandomDamage - - type: HolyWeapon + - type: Sharp +# Пробивает броню - type: entity - parent: HolyClaymore + parent: BaseHolyWeapon id: VorpalScythe name: коса жнеца description: И жрец, и жнец, и на дуде игрец! Коса способна пробить броню противника. @@ -184,7 +229,7 @@ ignoreResistances: true damage: types: - Slash: 24 + Slash: 14 - type: Clothing sprite: White/Objects/Weapons/Chaplain/scythe.rsi slots: @@ -192,8 +237,9 @@ - suitStorage - type: Item sprite: White/Objects/Weapons/Chaplain/scythe-inhands.rsi - - type: HolyWeapon + - type: Sharp +# Может пиздеть - type: entity parent: HolyKatana id: PossessedBlade @@ -218,10 +264,10 @@ - type: Examiner - type: Item sprite: White/Objects/Weapons/Chaplain/possessed.rsi - - type: HolyWeapon +# Приклеен к руке, быстро и громко бьет - type: entity - parent: BaseItem + parent: BaseHolyWeapon id: ChainsawHand name: рука-бензопила description: Добро? Зло? Ты парень с бензопилой в руке. @@ -251,10 +297,10 @@ qualities: - Sawing speed: 0.5 - - type: HolyWeapon +# Нокдаунит при ударе - type: entity - parent: BaseItem + parent: BaseHolyWeapon id: HolyWhip name: священная плеть description: Какая ужасная ночь на космической станции 14. @@ -265,10 +311,11 @@ - type: MeleeWeapon soundHit: path: /Audio/White/Items/hit/chainhit.ogg - range: 2.5 + range: 1.5 + attackRate: 0.5 damage: types: - Blunt: 18 + Blunt: 10 - type: Item size: Normal sprite: White/Objects/Weapons/Chaplain/whip.rsi @@ -277,10 +324,13 @@ slots: - belt - type: DisarmMalus - - type: HolyWeapon + - type: KnockDownOnHit + knockDownBehavior: NoDrop + knockdownTime: 0.4 +# Отбрасывает при ударе и может блокировать, требует держать себя в двух руках для отброса - type: entity - parent: BaseItem + parent: BaseHolyWeapon id: HolyStaff name: посох монаха description: Длинный высокий посох из полированного дерева. Традиционно используемый в боевых искусствах древней Земли, теперь он используется для преследования клоуна. @@ -288,11 +338,6 @@ - type: Sprite sprite: White/Objects/Weapons/Chaplain/staff.rsi state: icon - - type: MeleeWeapon - wideAnimationRotation: 135 - damage: - types: - Blunt: 10 - type: Item size: Huge sprite: White/Objects/Weapons/Chaplain/staff.rsi @@ -301,23 +346,64 @@ slots: - back - suitStorage + - type: MeleeWeapon + wideAnimationRotation: 135 + damage: + types: + Blunt: 6 + soundHit: + collection: MetalThud - type: Wieldable - type: IncreaseDamageOnWield damage: types: Blunt: 8 + - type: MeleeThrowOnHit + lifetime: 0.2 + speed: 5 + fallAfterHit: true + requireWield: true - type: UseDelay - - type: DisarmMalus - type: MeleeBlock - delay: 6.1 - - type: HolyWeapon + delay: 8.1 +# Можно кинуть, если попасть нанесет ебать как много, не попадет - ты проебал ее. Далеко бьет - type: entity - parent: BaseItem + parent: BaseHolyWeapon id: UnholyPitchfork name: нечестивые вилы description: Держа это, ты выглядишь абсолютно по дьявольски. components: + - type: Sprite + sprite: White/Objects/Weapons/Chaplain/pitchfork.rsi + state: icon + - type: Item + sprite: White/Objects/Weapons/Chaplain/pitchfork.rsi + size: Huge + - type: Clothing + sprite: White/Objects/Weapons/Chaplain/pitchfork.rsi + slots: + - back + - suitStorage + - type: MeleeWeapon + range: 2 + wideAnimationRotation: -135 + damage: + types: + Piercing: 8 + angle: 0 + animation: WeaponArcThrust + soundHit: + path: /Audio/Weapons/bladeslice.ogg + - type: DamageOtherOnHit + damage: + types: + Piercing: 77 + - type: Wieldable + - type: IncreaseDamageOnWield + damage: + types: + Piercing: 4 - type: EmbeddableProjectile offset: 0.15,0.15 - type: ThrowingAngle @@ -337,42 +423,12 @@ restitution: 0.3 friction: 0.2 - type: Sharp - - type: Sprite - sprite: White/Objects/Weapons/Chaplain/pitchfork.rsi - state: icon - - type: MeleeWeapon - range: 2 - wideAnimationRotation: -135 - damage: - types: - Piercing: 15 - angle: 0 - animation: WeaponArcThrust - soundHit: - path: /Audio/Weapons/bladeslice.ogg - - type: DamageOtherOnHit - damage: - types: - Piercing: 25 - - type: Item - sprite: White/Objects/Weapons/Chaplain/pitchfork.rsi - size: Huge - - type: Clothing - sprite: White/Objects/Weapons/Chaplain/pitchfork.rsi - slots: - - back - - suitStorage - - type: Wieldable - - type: IncreaseDamageOnWield - damage: - types: - Piercing: 9 - type: UseDelay - type: DisarmMalus - - type: HolyWeapon +# Высокий структурный урон - type: entity - parent: BaseItem + parent: BaseHolyWeapon id: WarHammer name: реликтовый боевой молот description: Этот боевой молот обошелся священнику в сорок тысяч кредитов. @@ -380,17 +436,6 @@ - type: Sprite sprite: White/Objects/Weapons/Chaplain/hammer.rsi state: icon - - type: MeleeWeapon - wideAnimationRotation: -135 - attackRate: 0.75 - damage: - types: - Blunt: 24 - Structural: 40 - soundHit: - collection: HammerHit - soundSwing: - collection: HammerMiss - type: Item size: Huge sprite: White/Objects/Weapons/Chaplain/hammer.rsi @@ -400,14 +445,25 @@ - belt - back - suitStorage + - type: MeleeWeapon + wideAnimationRotation: -135 + attackRate: 0.75 + damage: + types: + Blunt: 16 + Structural: 40 + soundHit: + collection: HammerHit + soundSwing: + collection: HammerMiss - type: DisarmMalus - - type: HolyWeapon +# Имеет все инструменты в себе, но работает медленно и почти не наносит урона - type: entity - parent: BaseItem + parent: BaseHolyWeapon id: HyperTool name: гиперинструмент - description: Инструмент настолько мощный, что даже вы не можете им идеально пользоваться. + description: Кто-то додумался склеить все инструменты вместе и вот, что вышло. Настолько продуманный, что вы не понимаете, как этим адекватно пользоваться components: - type: Sprite sprite: White/Objects/Weapons/Chaplain/hypertool.rsi @@ -417,9 +473,9 @@ canHeavyAttack: false damage: types: - Blunt: 0 - - type: StaminaDamageOnHit - damage: 40 + Blunt: 4 + soundHit: + collection: HyperToolUsing - type: Item size: Normal sprite: White/Objects/Weapons/Chaplain/hypertool.rsi @@ -428,4 +484,29 @@ slots: - belt - type: DisarmMalus - - type: HolyWeapon + - type: Tool + qualities: + - Screwing + - Prying + - Anchoring + - Cutting + - Pulsing + speed: 0.7 + useSound: + collection: HyperToolUsing + +- type: soundCollection + id: HyperToolUsing + files: + - /Audio/Effects/RingtoneNotes/a.ogg + - /Audio/Effects/RingtoneNotes/asharp.ogg + - /Audio/Effects/RingtoneNotes/b.ogg + - /Audio/Effects/RingtoneNotes/c.ogg + - /Audio/Effects/RingtoneNotes/csharp.ogg + - /Audio/Effects/RingtoneNotes/d.ogg + - /Audio/Effects/RingtoneNotes/dsharp.ogg + - /Audio/Effects/RingtoneNotes/e.ogg + - /Audio/Effects/RingtoneNotes/f.ogg + - /Audio/Effects/RingtoneNotes/fsharp.ogg + - /Audio/Effects/RingtoneNotes/g.ogg + - /Audio/Effects/RingtoneNotes/gsharp.ogg diff --git a/Resources/Prototypes/_White/Entities/Objects/Weapons/telescopic_baton.yml b/Resources/Prototypes/_White/Entities/Objects/Weapons/telescopic_baton.yml index da46efab0d..1ea81d0778 100644 --- a/Resources/Prototypes/_White/Entities/Objects/Weapons/telescopic_baton.yml +++ b/Resources/Prototypes/_White/Entities/Objects/Weapons/telescopic_baton.yml @@ -4,7 +4,6 @@ name: telescopic baton description: A compact yet robust personal defense weapon. Can be concealed when folded. components: - - type: TelescopicBaton - type: Sprite sprite: White/Objects/Weapons/telebaton.rsi layers: @@ -23,6 +22,8 @@ path: /Audio/Weapons/telescopicoff.ogg params: volume: -5 + activatedDescription: comp-telebaton-examined-on + deactivatedDescription: comp-telebaton-examined-off - type: Appearance - type: GenericVisualizer visuals: @@ -64,3 +65,4 @@ - Belt - type: StaticPrice price: 150 + - type: KnockDownOnHit diff --git a/Resources/Prototypes/_White/Fluff/fluff.yml b/Resources/Prototypes/_White/Fluff/fluff.yml index fb3db181aa..67d5624465 100644 --- a/Resources/Prototypes/_White/Fluff/fluff.yml +++ b/Resources/Prototypes/_White/Fluff/fluff.yml @@ -824,7 +824,7 @@ wideAnimationRotation: -135 damage: types: - Slash: 18 + Slash: 14 soundHit: path: /Audio/Weapons/bladeslice.ogg - type: HolyWeapon diff --git a/Resources/Prototypes/_White/Wizard/magic_items.yml b/Resources/Prototypes/_White/Wizard/magic_items.yml index aecf11ac6c..7bc0ef44c9 100644 --- a/Resources/Prototypes/_White/Wizard/magic_items.yml +++ b/Resources/Prototypes/_White/Wizard/magic_items.yml @@ -11,7 +11,7 @@ attackRate: 5 damage: types: - Slash: 10 + Slash: 25 - type: Clothing sprite: White/Objects/Weapons/Chaplain/hfrequency.rsi slots: @@ -101,6 +101,7 @@ minLifetime: 0.01 speed: 20 stunTime: 1.5 + fallAfterHit: true throwOnThrowHit: true - type: DamageOtherOnHit sound: