Большой ребаланс милишки (#681)

* MeleeThrowOnHit rework

* buff baseball bat

* better mjolnir

* telebaton system unhardcode + refactor + transform TelescopicBatonComponent to KnockDownOnHitComponent

* fix telebaton prototype

* darova

* fix KnockDownOnHitSystem

* chaplain weapons rebalance

* fix nullrod hit sound

* BloodstreamSystem cleanup

* bleeding rebalance

* damage rebalance

* small baseball bat fix
This commit is contained in:
ThereDrD
2024-09-12 21:52:04 +03:00
committed by GitHub
parent 52fdb873d9
commit 724e4e0e3c
28 changed files with 466 additions and 246 deletions

View File

@@ -1,6 +1,5 @@
using Content.Server._White.Accent.Bloodloss; using Content.Server._White.Accent.Bloodloss;
using Content.Server.Body.Components; using Content.Server.Body.Components;
using Content.Server.Chemistry.Containers.EntitySystems;
using Content.Server.Chemistry.ReactionEffects; using Content.Server.Chemistry.ReactionEffects;
using Content.Server.Fluids.EntitySystems; using Content.Server.Fluids.EntitySystems;
using Content.Server.Forensics; using Content.Server.Forensics;
@@ -13,7 +12,6 @@ using Content.Shared.Chemistry.EntitySystems;
using Content.Shared.Chemistry.Reaction; using Content.Shared.Chemistry.Reaction;
using Content.Shared.Damage; using Content.Shared.Damage;
using Content.Shared.Damage.Components; using Content.Shared.Damage.Components;
using Content.Shared.Damage.Prototypes;
using Content.Shared.Drunk; using Content.Shared.Drunk;
using Content.Shared.FixedPoint; using Content.Shared.FixedPoint;
using Content.Shared.Mobs; using Content.Shared.Mobs;
@@ -23,7 +21,6 @@ using Content.Shared.Mobs.Systems;
using Content.Shared.Movement.Systems; using Content.Shared.Movement.Systems;
using Content.Shared.Popups; using Content.Shared.Popups;
using Content.Shared.Rejuvenate; using Content.Shared.Rejuvenate;
using Content.Shared.Speech.EntitySystems;
using Robust.Server.Audio; using Robust.Server.Audio;
using Robust.Shared.Prototypes; using Robust.Shared.Prototypes;
using Robust.Shared.Random; using Robust.Shared.Random;
@@ -42,8 +39,7 @@ public sealed class BloodstreamSystem : EntitySystem
[Dependency] private readonly PuddleSystem _puddleSystem = default!; [Dependency] private readonly PuddleSystem _puddleSystem = default!;
[Dependency] private readonly MobStateSystem _mobStateSystem = default!; [Dependency] private readonly MobStateSystem _mobStateSystem = default!;
[Dependency] private readonly SharedDrunkSystem _drunkSystem = default!; [Dependency] private readonly SharedDrunkSystem _drunkSystem = default!;
[Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!; [Dependency] private readonly SharedSolutionContainerSystem _solutionContainerSystem = default!;
[Dependency] private readonly SharedStutteringSystem _stutteringSystem = default!;
[Dependency] private readonly AlertsSystem _alertsSystem = default!; [Dependency] private readonly AlertsSystem _alertsSystem = default!;
[Dependency] private readonly ForensicsSystem _forensicsSystem = default!; [Dependency] private readonly ForensicsSystem _forensicsSystem = default!;
[Dependency] private readonly MovementSpeedModifierSystem _speed = default!; // WD [Dependency] private readonly MovementSpeedModifierSystem _speed = default!; // WD
@@ -188,12 +184,23 @@ public sealed class BloodstreamSystem : EntitySystem
private void OnComponentInit(Entity<BloodstreamComponent> entity, ref ComponentInit args) private void OnComponentInit(Entity<BloodstreamComponent> entity, ref ComponentInit args)
{ {
var chemicalSolution = _solutionContainerSystem.EnsureSolution(entity.Owner, entity.Comp.ChemicalSolutionName); _solutionContainerSystem.EnsureSolution(entity.Owner, entity.Comp.ChemicalSolutionName, out var chemicalSolution);
var bloodSolution = _solutionContainerSystem.EnsureSolution(entity.Owner, entity.Comp.BloodSolutionName); _solutionContainerSystem.EnsureSolution(entity.Owner, entity.Comp.BloodSolutionName, out var bloodSolution);
var tempSolution = _solutionContainerSystem.EnsureSolution(entity.Owner, entity.Comp.BloodTemporarySolutionName); _solutionContainerSystem.EnsureSolution(entity.Owner, entity.Comp.BloodTemporarySolutionName, out var tempSolution);
if (chemicalSolution == null)
return;
chemicalSolution.MaxVolume = entity.Comp.ChemicalMaxVolume; chemicalSolution.MaxVolume = entity.Comp.ChemicalMaxVolume;
if (bloodSolution == null)
return;
bloodSolution.MaxVolume = entity.Comp.BloodMaxVolume; bloodSolution.MaxVolume = entity.Comp.BloodMaxVolume;
if (tempSolution == null)
return;
tempSolution.MaxVolume = entity.Comp.BleedPuddleThreshold * 4; // give some leeway, for chemstream as well tempSolution.MaxVolume = entity.Comp.BleedPuddleThreshold * 4; // give some leeway, for chemstream as well
// Fill blood solution with BLOOD // Fill blood solution with BLOOD
@@ -203,12 +210,10 @@ public sealed class BloodstreamSystem : EntitySystem
private void OnDamageChanged(Entity<BloodstreamComponent> ent, ref DamageChangedEvent args) private void OnDamageChanged(Entity<BloodstreamComponent> ent, ref DamageChangedEvent args)
{ {
if (args.DamageDelta is null || !args.DamageIncreased) if (args.DamageDelta is null || !args.DamageIncreased)
{
return; return;
}
// TODO probably cache this or something. humans get hurt a lot // TODO probably cache this or something. humans get hurt a lot
if (!_prototypeManager.TryIndex<DamageModifierSetPrototype>(ent.Comp.DamageBleedModifiers, out var modifiers)) if (!_prototypeManager.TryIndex(ent.Comp.DamageBleedModifiers, out var modifiers))
return; return;
var bloodloss = DamageSpecifier.ApplyModifierSet(args.DamageDelta, modifiers); var bloodloss = DamageSpecifier.ApplyModifierSet(args.DamageDelta, modifiers);
@@ -222,11 +227,12 @@ public sealed class BloodstreamSystem : EntitySystem
var totalFloat = total.Float(); var totalFloat = total.Float();
TryModifyBleedAmount(ent, totalFloat, ent); TryModifyBleedAmount(ent, totalFloat, ent);
/// <summary> /*
/// Critical hit. Causes target to lose blood, using the bleed rate modifier of the weapon, currently divided by 5 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. The crit chance is currently the bleed rate modifier divided by 25.
/// Higher damage weapons have a higher chance to crit! Higher damage weapons have a higher chance to crit!
/// </summary> */
var prob = Math.Clamp(totalFloat / 25, 0, 1); var prob = Math.Clamp(totalFloat / 25, 0, 1);
if (totalFloat > 0 && _robustRandom.Prob(prob)) if (totalFloat > 0 && _robustRandom.Prob(prob))
{ {
@@ -413,7 +419,7 @@ public sealed class BloodstreamSystem : EntitySystem
if (HasComp<BloodLustComponent>(uid)) // WD if (HasComp<BloodLustComponent>(uid)) // WD
{ {
if (component.BleedAmount == 0f) if (component.BleedAmount == 0)
RemComp<BloodLustComponent>(uid); RemComp<BloodLustComponent>(uid);
_speed.RefreshMovementSpeedModifiers(uid); _speed.RefreshMovementSpeedModifiers(uid);

View File

@@ -51,6 +51,14 @@ public sealed partial class ItemToggleComponent : Component
/// </summary> /// </summary>
[ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField] [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField]
public bool ToggleLight = true; 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
} }
/// <summary> /// <summary>

View File

@@ -1,3 +1,4 @@
using Content.Shared.Examine;
using Content.Shared.Interaction.Events; using Content.Shared.Interaction.Events;
using Content.Shared.Item.ItemToggle.Components; using Content.Shared.Item.ItemToggle.Components;
using Content.Shared.Popups; using Content.Shared.Popups;
@@ -23,6 +24,8 @@ public abstract class SharedItemToggleSystem : EntitySystem
[Dependency] private readonly INetManager _netManager = default!; [Dependency] private readonly INetManager _netManager = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly SharedPopupSystem _popup = default!;
[Dependency] private readonly SharedItemSystem _item = default!; // WD
public override void Initialize() public override void Initialize()
{ {
base.Initialize(); base.Initialize();
@@ -35,6 +38,9 @@ public abstract class SharedItemToggleSystem : EntitySystem
SubscribeLocalEvent<ItemToggleHotComponent, IsHotEvent>(OnIsHotEvent); SubscribeLocalEvent<ItemToggleHotComponent, IsHotEvent>(OnIsHotEvent);
SubscribeLocalEvent<ItemToggleActiveSoundComponent, ItemToggledEvent>(UpdateActiveSound); SubscribeLocalEvent<ItemToggleActiveSoundComponent, ItemToggledEvent>(UpdateActiveSound);
SubscribeLocalEvent<ItemToggleComponent, ExaminedEvent>(OnExamined); // WD
SubscribeLocalEvent<ItemToggleComponent, ItemToggledEvent>(UpdatePrefix); // WD
} }
private void OnStartup(Entity<ItemToggleComponent> ent, ref ComponentStartup args) private void OnStartup(Entity<ItemToggleComponent> ent, ref ComponentStartup args)
@@ -255,4 +261,21 @@ public abstract class SharedItemToggleSystem : EntitySystem
activeSound.PlayingStream = _audio.Stop(activeSound.PlayingStream); activeSound.PlayingStream = _audio.Stop(activeSound.PlayingStream);
} }
} }
// WD added start
private void OnExamined(Entity<ItemToggleComponent> 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<ItemToggleComponent> ent, ref ItemToggledEvent args)
{
_item.SetHeldPrefix(ent.Owner, args.Activated ? "on" : "off");
}
// WD added end
} }

View File

@@ -123,6 +123,30 @@ namespace Content.Shared.StatusEffect
return false; return false;
} }
// WD added start
// May god forgive us
public bool TryAddStatusEffect<T>(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<T>(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, public bool TryAddStatusEffect(EntityUid uid, string key, TimeSpan time, bool refresh, string component,
StatusEffectsComponent? status = null) StatusEffectsComponent? status = null)
{ {

View File

@@ -1,18 +1,24 @@
using Content.Shared.Standing.Systems;
using Robust.Shared.Audio; using Robust.Shared.Audio;
using Robust.Shared.GameStates; using Robust.Shared.GameStates;
using Robust.Shared.Serialization;
namespace Content.Shared.Stunnable; namespace Content.Shared.Stunnable;
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState, Access(typeof(SharedStunSystem))] [RegisterComponent, NetworkedComponent, AutoGenerateComponentState, Access(typeof(SharedStunSystem))]
public sealed partial class KnockedDownComponent : Component public sealed partial class KnockedDownComponent : Component
{ {
[DataField("helpInterval"), AutoNetworkedField] [DataField, AutoNetworkedField]
public float HelpInterval = 1f; public float HelpInterval = 1f;
[DataField("helpAttemptSound")] [DataField]
public SoundSpecifier StunAttemptSound = new SoundPathSpecifier("/Audio/Effects/thudswoosh.ogg"); public SoundSpecifier StunAttemptSound = new SoundPathSpecifier("/Audio/Effects/thudswoosh.ogg");
[ViewVariables, AutoNetworkedField] [ViewVariables, AutoNetworkedField]
public float HelpTimer = 0f; 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
} }

View File

@@ -106,25 +106,25 @@ public abstract class SharedStunSystem : EntitySystem
private void OnKnockInit(EntityUid uid, KnockedDownComponent component, ComponentInit args) private void OnKnockInit(EntityUid uid, KnockedDownComponent component, ComponentInit args)
{ {
RaiseNetworkEvent(new CheckAutoGetUpEvent()); // WD EDIT RaiseNetworkEvent(new CheckAutoGetUpEvent()); // WD edit
_standingState.TryLieDown(uid, null, SharedStandingStateSystem.DropHeldItemsBehavior.DropIfStanding); _standingState.TryLieDown(uid, null, component.KnockDownBehavior); // WD edit
} }
private void OnKnockShutdown(EntityUid uid, KnockedDownComponent component, ComponentShutdown args) 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 // 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; return;
if (standing.AutoGetUp && !_container.IsEntityInContainer(uid)) // WD EDIT if (standing.AutoGetUp && !_container.IsEntityInContainer(uid)) // WD edit
{ {
_standingState.TryStandUp(uid, standing); _standingState.TryStandUp(uid, standing);
return; return;
} }
_standingState.Stand(uid, standing); _standingState.Stand(uid, standing);
// WD EDIT END // WD edit end
} }
private void OnStandAttempt(EntityUid uid, KnockedDownComponent component, StandAttemptEvent args) 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. /// Knocks down the entity, making it fall to the ground.
/// </summary> /// </summary>
public bool TryKnockdown(EntityUid uid, TimeSpan time, bool refresh, public bool TryKnockdown(EntityUid uid, TimeSpan time, bool refresh,
StatusEffectsComponent? status = null) StatusEffectsComponent? status = null, SharedStandingStateSystem.DropHeldItemsBehavior? behavior = null)
{ {
if (time <= TimeSpan.Zero) if (time <= TimeSpan.Zero)
return false; return false;
@@ -186,8 +186,24 @@ public abstract class SharedStunSystem : EntitySystem
if (!Resolve(uid, ref status, false)) if (!Resolve(uid, ref status, false))
return false; return false;
// WD added start
// May god forgive us
if (behavior.HasValue && !HasComp<KnockedDownComponent>(uid))
{
var knockedDownComponent = new KnockedDownComponent
{
KnockDownBehavior = behavior.Value
};
if (!_statusEffect.TryAddStatusEffect<KnockedDownComponent>(uid, "KnockedDown", time, refresh, knockedDownComponent))
return false;
}
else
{
if (!_statusEffect.TryAddStatusEffect<KnockedDownComponent>(uid, "KnockedDown", time, refresh)) if (!_statusEffect.TryAddStatusEffect<KnockedDownComponent>(uid, "KnockedDown", time, refresh))
return false; return false;
}
// WD added end
var ev = new KnockedDownEvent(); var ev = new KnockedDownEvent();
RaiseLocalEvent(uid, ref ev); RaiseLocalEvent(uid, ref ev);

View File

@@ -48,7 +48,7 @@ public sealed partial class MeleeThrowOnHitComponent : Component
[AutoNetworkedField] [AutoNetworkedField]
public bool Enabled = true; public bool Enabled = true;
// WD START // WD added
[DataField, ViewVariables(VVAccess.ReadWrite)] [DataField, ViewVariables(VVAccess.ReadWrite)]
[AutoNetworkedField] [AutoNetworkedField]
public float StunTime; public float StunTime;
@@ -56,7 +56,15 @@ public sealed partial class MeleeThrowOnHitComponent : Component
[DataField, ViewVariables(VVAccess.ReadWrite)] [DataField, ViewVariables(VVAccess.ReadWrite)]
[AutoNetworkedField] [AutoNetworkedField]
public bool ThrowOnThrowHit; public bool ThrowOnThrowHit;
// WD END
[DataField, ViewVariables(VVAccess.ReadWrite)]
[AutoNetworkedField]
public bool FallAfterHit;
[DataField, ViewVariables(VVAccess.ReadWrite)]
[AutoNetworkedField]
public bool RequireWield = true;
// WD added
} }
/// <summary> /// <summary>

View File

@@ -1,9 +1,11 @@
using System.Numerics; using System.Numerics;
using Content.Shared.Construction.Components; using Content.Shared.Construction.Components;
using Content.Shared.Standing.Systems;
using Content.Shared.Stunnable; using Content.Shared.Stunnable;
using Content.Shared.Throwing; using Content.Shared.Throwing;
using Content.Shared.Weapons.Melee.Components; using Content.Shared.Weapons.Melee.Components;
using Content.Shared.Weapons.Melee.Events; using Content.Shared.Weapons.Melee.Events;
using Content.Shared.Wieldable.Components;
using Robust.Shared.Physics; using Robust.Shared.Physics;
using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Components;
using Robust.Shared.Physics.Events; using Robust.Shared.Physics.Events;
@@ -20,8 +22,9 @@ public sealed class MeleeThrowOnHitSystem : EntitySystem
[Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly SharedTransformSystem _transform = default!;
[Dependency] private readonly SharedPhysicsSystem _physics = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!;
[Dependency] private readonly SharedStunSystem _stun = default!; // WD [Dependency] private readonly SharedStunSystem _stun = default!; // WD added
[Dependency] private readonly ThrownItemSystem _thrownItem = default!; // WD [Dependency] private readonly ThrownItemSystem _thrownItem = default!; // WD added
[Dependency] private readonly SharedStandingStateSystem _standingState = default!; // WD added
/// <inheritdoc/> /// <inheritdoc/>
public override void Initialize() public override void Initialize()
@@ -36,8 +39,10 @@ public sealed class MeleeThrowOnHitSystem : EntitySystem
private void OnDoHit(Entity<MeleeThrowOnHitComponent> ent, ref ThrowDoHitEvent args) // WD private void OnDoHit(Entity<MeleeThrowOnHitComponent> ent, ref ThrowDoHitEvent args) // WD
{ {
// WD edit start
if (!ent.Comp.ThrowOnThrowHit) if (!ent.Comp.ThrowOnThrowHit)
return; return;
// WD edit end
if (!CanThrowOnHit(ent, args.Target)) if (!CanThrowOnHit(ent, args.Target))
return; return;
@@ -55,9 +60,15 @@ public sealed class MeleeThrowOnHitSystem : EntitySystem
MinLifetime = ent.Comp.MinLifetime MinLifetime = ent.Comp.MinLifetime
}; };
AddComp(args.Target, thrownComp); AddComp(args.Target, thrownComp);
// WD added start
if (ent.Comp.StunTime != 0f) if (ent.Comp.StunTime != 0f)
_stun.TryParalyze(args.Target, TimeSpan.FromSeconds(ent.Comp.StunTime), true); _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); _thrownItem.LandComponent(ent, args.Component, physics, false);
_physics.SetLinearVelocity(ent, Vector2.Zero); _physics.SetLinearVelocity(ent, Vector2.Zero);
} }
@@ -67,14 +78,24 @@ public sealed class MeleeThrowOnHitSystem : EntitySystem
if (args.Handled) // WD if (args.Handled) // WD
return; return;
var (_, comp) = ent;
if (!args.IsHit) if (!args.IsHit)
return; return;
// WD START // WD added start
var stunTime = comp.StunTime; if (ent.Comp.RequireWield)
var speed = comp.Speed; {
var lifetime = comp.Lifetime; if (!TryComp<WieldableComponent>(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 if (args.Direction != null) // Heavy attack
{ {
@@ -82,7 +103,7 @@ public sealed class MeleeThrowOnHitSystem : EntitySystem
speed *= 0.5f; speed *= 0.5f;
lifetime *= 0.5f; lifetime *= 0.5f;
} }
// WD END // WD edit end
var mapPos = _transform.GetMapCoordinates(args.User).Position; var mapPos = _transform.GetMapCoordinates(args.User).Position;
foreach (var hit in args.HitEntities) foreach (var hit in args.HitEntities)
@@ -95,7 +116,7 @@ public sealed class MeleeThrowOnHitSystem : EntitySystem
if (!CanThrowOnHit(ent, hit)) if (!CanThrowOnHit(ent, hit))
continue; continue;
if (comp.UnanchorOnHit && HasComp<AnchorableComponent>(hit)) if (ent.Comp.UnanchorOnHit && HasComp<AnchorableComponent>(hit))
{ {
_transform.Unanchor(hit, Transform(hit)); _transform.Unanchor(hit, Transform(hit));
} }
@@ -105,13 +126,19 @@ public sealed class MeleeThrowOnHitSystem : EntitySystem
RaiseLocalEvent(hit, ref ev); RaiseLocalEvent(hit, ref ev);
var thrownComp = new MeleeThrownComponent var thrownComp = new MeleeThrownComponent
{ {
Velocity = angle.Normalized() * speed, // WD EDIT Velocity = angle.Normalized() * speed, // WD edit
Lifetime = lifetime, // WD EDIT Lifetime = lifetime, // WD edit
MinLifetime = comp.MinLifetime MinLifetime = ent.Comp.MinLifetime
}; };
AddComp(hit, thrownComp); AddComp(hit, thrownComp);
// WD added end
if (stunTime != 0f) if (stunTime != 0f)
_stun.TryParalyze(hit, TimeSpan.FromSeconds(stunTime), true); _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.PreviousStatus = body.BodyStatus;
comp.ThrownEndTime = _timing.CurTime + TimeSpan.FromSeconds(comp.Lifetime); comp.ThrownEndTime = _timing.CurTime + TimeSpan.FromSeconds(comp.Lifetime);
comp.MinLifetimeTime = _timing.CurTime + TimeSpan.FromSeconds(comp.MinLifetime); comp.MinLifetimeTime = _timing.CurTime + TimeSpan.FromSeconds(comp.MinLifetime);
_physics.SetBodyStatus(ent, body, BodyStatus.InAir); _physics.SetBodyStatus(ent, body, BodyStatus.InAir);
_physics.SetLinearVelocity(ent, Vector2.Zero, body: body); _physics.SetLinearVelocity(ent, Vector2.Zero, body: body);
_physics.ApplyLinearImpulse(ent, comp.Velocity * body.Mass, body: body); _physics.ApplyLinearImpulse(ent, comp.Velocity * body.Mass, body: body);
Dirty(ent, ent.Comp); Dirty(ent, ent.Comp);
} }

View File

@@ -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;
}

View File

@@ -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<KnockDownOnHitComponent, StaminaDamageOnHitAttemptEvent>(OnStaminaHitAttempt);
SubscribeLocalEvent<KnockDownOnHitComponent, MeleeHitEvent>(OnHit);
}
private void OnHit(Entity<KnockDownOnHitComponent> 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<WieldableComponent>(args.Weapon, out var weapon))
continue;
if (!weapon.Wielded)
continue;
}
_stun.TryKnockdown(uid, time, true, behavior: ent.Comp.KnockDownBehavior);
}
}
private void OnStaminaHitAttempt(Entity<KnockDownOnHitComponent> entity, ref StaminaDamageOnHitAttemptEvent args)
{
if (!_itemToggle.IsActivated(entity.Owner))
args.Cancelled = true;
}
}

View File

@@ -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);
}

View File

@@ -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<TelescopicBatonComponent, ExaminedEvent>(OnExamined);
SubscribeLocalEvent<TelescopicBatonComponent, StaminaDamageOnHitAttemptEvent>(OnStaminaHitAttempt);
SubscribeLocalEvent<TelescopicBatonComponent, ItemToggledEvent>(ToggleDone);
SubscribeLocalEvent<TelescopicBatonComponent, StaminaMeleeHitEvent>(OnHit);
}
private void OnHit(Entity<TelescopicBatonComponent> 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<TelescopicBatonComponent> entity, ref StaminaDamageOnHitAttemptEvent args)
{
if (!_itemToggle.IsActivated(entity.Owner))
args.Cancelled = true;
}
private void OnExamined(Entity<TelescopicBatonComponent> 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<TelescopicBatonComponent> entity, ref ItemToggledEvent args)
{
_item.SetHeldPrefix(entity.Owner, args.Activated ? "on" : "off");
}
}

View File

@@ -3,3 +3,6 @@ ent-TelescopicBaton = телескопическая дубинка
comp-telebaton-examined-on = Дубинка в боевом положении. comp-telebaton-examined-on = Дубинка в боевом положении.
comp-telebaton-examined-off = Дубинка сложена. comp-telebaton-examined-off = Дубинка сложена.
comp-item-toggle-on = Активировано
comp-item-toggle-off = Деактивировано

View File

@@ -241,10 +241,10 @@
# in relation to how they cause bleed rate. # in relation to how they cause bleed rate.
- type: damageModifierSet - type: damageModifierSet
id: BloodlossHuman id: BloodlossHuman
coefficients: coefficients: # WD edit alert!! Weapons rebalanced - only slash and piercing damage should cast bleeding
Blunt: 0.05 Blunt: 0.0
Slash: 0.25 Slash: 0.45 # WD
Piercing: 0.2 Piercing: 0.3 # WD
Shock: 0.0 Shock: 0.0
Cold: 0.0 Cold: 0.0
Heat: -0.5 # heat damage cauterizes wounds, but will still hurt obviously. Heat: -0.5 # heat damage cauterizes wounds, but will still hurt obviously.

View File

@@ -11,15 +11,16 @@
wideAnimationRotation: -135 wideAnimationRotation: -135
damage: damage:
types: types:
Blunt: 10 Blunt: 8 # WD
Structural: 5 Structural: 5
soundHit: soundHit:
path: "/Audio/Weapons/smash.ogg" path: "/Audio/Weapons/smash.ogg"
canHeavyAttack: false
- type: Wieldable - type: Wieldable
- type: IncreaseDamageOnWield - type: IncreaseDamageOnWield
damage: damage:
types: types:
Blunt: 5 Blunt: 4 # WD
Structural: 10 Structural: 10
- type: Item - type: Item
size: Normal size: Normal
@@ -42,6 +43,14 @@
- type: Tag - type: Tag
tags: tags:
- BaseballBat - BaseballBat
- type: MeleeThrowOnHit # WD
lifetime: 0.2
speed: 5
requireWield: true
- type: KnockDownOnHit
knockDownBehavior: NoDrop
knockdownTime: 0.5
requireWield: true
- type: entity - type: entity
name: incomplete baseball bat name: incomplete baseball bat

View File

@@ -41,7 +41,7 @@
attackRate: 1.5 attackRate: 1.5
damage: damage:
types: types:
Slash: 14 Slash: 12 # WD
soundHit: soundHit:
path: /Audio/Weapons/bladeslice.ogg path: /Audio/Weapons/bladeslice.ogg
- type: Item - type: Item

View File

@@ -13,7 +13,7 @@
attackRate: 1.5 attackRate: 1.5
damage: damage:
types: types:
Slash: 12 Slash: 9 # WD
soundHit: soundHit:
path: /Audio/Weapons/bladeslice.ogg path: /Audio/Weapons/bladeslice.ogg
- type: Item - type: Item
@@ -66,7 +66,7 @@
attackRate: 0.75 attackRate: 0.75
damage: damage:
types: types:
Slash: 33 Slash: 27 # WD
soundHit: soundHit:
path: /Audio/Weapons/bladeslice.ogg path: /Audio/Weapons/bladeslice.ogg
- type: Item - type: Item
@@ -104,7 +104,7 @@
damage: damage:
types: types:
Blunt: 10 Blunt: 10
Slash: 20 Slash: 18 # WD
Structural: 5 Structural: 5
soundHit: soundHit:
path: "/Audio/Weapons/smash.ogg" path: "/Audio/Weapons/smash.ogg"
@@ -113,7 +113,7 @@
damage: damage:
types: types:
Blunt: 4 Blunt: 4
Slash: 12 Slash: 10 # WD
Structural: 10 Structural: 10
- type: Item - type: Item
size: Ginormous size: Ginormous

View File

@@ -13,7 +13,7 @@
attackRate: 1.3 attackRate: 1.3
damage: damage:
types: types:
Slash: 10.5 Slash: 10.5 # WD
soundHit: soundHit:
path: /Audio/Weapons/bladeslice.ogg path: /Audio/Weapons/bladeslice.ogg
- type: Item - type: Item
@@ -45,7 +45,7 @@
attackRate: 1.5 attackRate: 1.5
damage: damage:
types: types:
Slash: 17.5 Slash: 15 # WD
soundHit: soundHit:
path: /Audio/Weapons/bladeslice.ogg path: /Audio/Weapons/bladeslice.ogg
- type: EmbeddableProjectile - type: EmbeddableProjectile
@@ -55,7 +55,7 @@
- type: DamageOtherOnHit - type: DamageOtherOnHit
damage: damage:
types: types:
Slash: 20 Slash: 44 # WD
- type: Item - type: Item
size: Small size: Small
- type: DisarmMalus - type: DisarmMalus

View File

@@ -36,8 +36,7 @@
variation: 0.125 variation: 0.125
activatedDamage: activatedDamage:
types: types:
Slash: 15 Slash: 41 # WD
Heat: 15
Structural: 20 Structural: 20
- type: Sprite - type: Sprite
sprite: Objects/Weapons/Melee/e_sword.rsi sprite: Objects/Weapons/Melee/e_sword.rsi
@@ -131,8 +130,7 @@
variation: 0.250 variation: 0.250
activatedDamage: activatedDamage:
types: types:
Slash: 10 Slash: 23 # WD
Heat: 10
deactivatedSecret: true deactivatedSecret: true
- type: ItemToggleActiveSound - type: ItemToggleActiveSound
activeSound: activeSound:
@@ -263,8 +261,7 @@
- type: IncreaseDamageOnWield - type: IncreaseDamageOnWield
damage: damage:
types: types:
Slash: 15 Slash: 30 # WD
Heat: 15
- type: Reflect - type: Reflect
reflectProb: 1 reflectProb: 1
enabled: false enabled: false
@@ -299,8 +296,7 @@
variation: 0.125 variation: 0.125
activatedDamage: activatedDamage:
types: types:
Slash: 15 Slash: 33 # WD
Heat: 15
Structural: 20 Structural: 20
- type: Reflect - type: Reflect
reflectProb: 0.8 reflectProb: 0.8

View File

@@ -18,8 +18,8 @@
damage: damage:
types: types:
# axes are kinda like sharp hammers, you know? # axes are kinda like sharp hammers, you know?
Blunt: 5 Blunt: 3 # WD
Slash: 13 Slash: 10 # WD
Structural: 10 Structural: 10
soundHit: soundHit:
path: "/Audio/Weapons/smash.ogg" path: "/Audio/Weapons/smash.ogg"
@@ -28,7 +28,7 @@
damage: damage:
types: types:
Blunt: 2.5 Blunt: 2.5
Slash: 10.5 Slash: 8 # WD
Structural: 60 Structural: 60
- type: Item - type: Item
size: Ginormous size: Ginormous

View File

@@ -14,7 +14,7 @@
wideAnimationRotation: -135 wideAnimationRotation: -135
damage: damage:
types: types:
Slash: 12 Slash: 10 # WD
soundHit: soundHit:
path: /Audio/Weapons/bladeslice.ogg path: /Audio/Weapons/bladeslice.ogg
- type: Sprite - type: Sprite
@@ -42,6 +42,10 @@
- type: Item - type: Item
sprite: Objects/Weapons/Melee/kitchen_knife.rsi sprite: Objects/Weapons/Melee/kitchen_knife.rsi
storedRotation: -45 storedRotation: -45
- type: DamageOtherOnHit # WD
damage:
types:
Piercing: 20
- type: GuideHelp - type: GuideHelp
guides: guides:
- Chef - Chef
@@ -68,7 +72,7 @@
attackRate: 1.5 attackRate: 1.5
damage: damage:
types: types:
Slash: 12 Slash: 13 # WD
- type: Item - type: Item
size: Normal size: Normal
sprite: Objects/Weapons/Melee/cleaver.rsi sprite: Objects/Weapons/Melee/cleaver.rsi
@@ -100,7 +104,7 @@
- type: DamageOtherOnHit - type: DamageOtherOnHit
damage: damage:
types: types:
Slash: 10 Piercing: 27 # WD
- type: Item - type: Item
sprite: Objects/Weapons/Melee/combat_knife.rsi sprite: Objects/Weapons/Melee/combat_knife.rsi
storedRotation: -45 storedRotation: -45
@@ -136,7 +140,11 @@
attackRate: 1.0 attackRate: 1.0
damage: damage:
types: types:
Slash: 18 # Same DPS as combat knife Slash: 12 # WD
- type: DamageOtherOnHit # WD
damage:
types:
Piercing: 44
- type: Item - type: Item
sprite: Objects/Weapons/Melee/kukri_knife.rsi sprite: Objects/Weapons/Melee/kukri_knife.rsi
@@ -159,7 +167,7 @@
- type: DamageOtherOnHit - type: DamageOtherOnHit
damage: damage:
types: types:
Slash: 10 Piercing: 10 # WD
- type: Sprite - type: Sprite
sprite: Clothing/Head/Hats/greyflatcap.rsi sprite: Clothing/Head/Hats/greyflatcap.rsi
- type: Clothing - type: Clothing
@@ -289,7 +297,7 @@
damage: damage:
types: types:
Slash: 10 Slash: 10
Piercing: 15 Piercing: 35 # WD
- type: Item - type: Item
sprite: Objects/Weapons/Melee/throwing_knife.rsi sprite: Objects/Weapons/Melee/throwing_knife.rsi
storedRotation: -45 storedRotation: -45

View File

@@ -13,7 +13,7 @@
attackRate: 1.5 attackRate: 1.5
damage: damage:
types: types:
Slash: 19 Slash: 14 # WD
# WD edit sounds start # WD edit sounds start
soundHit: soundHit:
path: /Audio/White/Items/hit/sabre_hit2.ogg path: /Audio/White/Items/hit/sabre_hit2.ogg
@@ -27,12 +27,12 @@
storedRotation: 44 # It just works storedRotation: 44 # It just works
shape: shape:
- 0, 0, 4, 0 - 0, 0, 4, 0
- type: Tag
tags:
- CaptainSabre
- type: DisarmMalus - type: DisarmMalus
- type: MeleeBlock - type: MeleeBlock
delay: 6.1 delay: 6.1
- type: Tag
tags:
- CaptainSabre
- type: entity - type: entity
name: katana name: katana
@@ -51,7 +51,7 @@
wideAnimationRotation: -135 wideAnimationRotation: -135
damage: damage:
types: types:
Slash: 24 Slash: 20 # WD
soundHit: soundHit:
path: /Audio/Weapons/bladeslice.ogg path: /Audio/Weapons/bladeslice.ogg
- type: Item - type: Item
@@ -80,7 +80,7 @@
wideAnimationRotation: -60 wideAnimationRotation: -60
damage: damage:
types: types:
Slash: 30 Slash: 33 # WD
- type: Item - type: Item
size: Huge size: Huge
sprite: Objects/Weapons/Melee/energykatana.rsi sprite: Objects/Weapons/Melee/energykatana.rsi
@@ -123,7 +123,7 @@
wideAnimationRotation: -135 wideAnimationRotation: -135
damage: damage:
types: types:
Slash: 20 Slash: 17 # WD
soundHit: soundHit:
path: /Audio/Weapons/bladeslice.ogg path: /Audio/Weapons/bladeslice.ogg
- type: Item - type: Item
@@ -155,7 +155,7 @@
attackRate: 0.75 attackRate: 0.75
damage: damage:
types: types:
Slash: 30 Slash: 21 # WD
soundHit: soundHit:
path: /Audio/Weapons/bladeslice.ogg path: /Audio/Weapons/bladeslice.ogg
- type: Item - type: Item
@@ -191,7 +191,7 @@
wideAnimationRotation: -135 wideAnimationRotation: -135
damage: damage:
types: types:
Slash: 20 Slash: 20 # WD
soundHit: soundHit:
path: /Audio/Weapons/bladeslice.ogg path: /Audio/Weapons/bladeslice.ogg
- type: Item - type: Item

View File

@@ -14,8 +14,7 @@
attackRate: 0.75 attackRate: 0.75
damage: damage:
types: types:
Blunt: 5 Blunt: 10
Slash: 5
Structural: 10 Structural: 10
soundHit: soundHit:
path: "/Audio/Weapons/sledgehammer_hit_1.ogg" path: "/Audio/Weapons/sledgehammer_hit_1.ogg"
@@ -23,8 +22,7 @@
- type: IncreaseDamageOnWield - type: IncreaseDamageOnWield
damage: damage:
types: types:
Blunt: 10 Blunt: 15
Slash: 5
Structural: 40 Structural: 40
- type: Item - type: Item
size: Ginormous size: Ginormous

View File

@@ -77,7 +77,7 @@
damage: damage:
types: types:
Slash: 8 Slash: 8
Piercing: 10 Piercing: 16 # WD
- type: StaminaDamageOnCollide - type: StaminaDamageOnCollide
damage: 45 damage: 45
- type: StaminaDamageOnEmbed - type: StaminaDamageOnEmbed

View File

@@ -1,5 +1,21 @@
# Так как мечей много, а смысла в них не очень - я буду писать в комментариях геймдизайнерских прикол каждого из них
- type: entity - type: entity
parent: BaseItem 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 id: NullRod
name: жезл нулификации name: жезл нулификации
description: Жезл из чистого обсидиана. Само его присутствие разрушает и ослабляет "магические силы". Во всяком случае так написано в путеводителе. description: Жезл из чистого обсидиана. Само его присутствие разрушает и ослабляет "магические силы". Во всяком случае так написано в путеводителе.
@@ -11,6 +27,8 @@
damage: damage:
types: types:
Blunt: 18 Blunt: 18
soundHit:
collection: MetalThud
- type: Item - type: Item
size: Normal size: Normal
sprite: White/Objects/Weapons/Chaplain/nullrod.rsi sprite: White/Objects/Weapons/Chaplain/nullrod.rsi
@@ -43,10 +61,10 @@
- UnholyPitchfork - UnholyPitchfork
- WarHammer - WarHammer
- HyperTool - HyperTool
- type: HolyWeapon
# Прикольно выглядящая рука, нельзя снять и бьет ожогами.
- type: entity - type: entity
parent: BaseItem parent: BaseHolyWeapon
id: GodHand id: GodHand
name: божья длань name: божья длань
description: Эта рука сияет с потрясающей силой! description: Эта рука сияет с потрясающей силой!
@@ -63,26 +81,22 @@
wideAnimationRotation: 180 wideAnimationRotation: 180
damage: damage:
types: types:
Heat: 18 Heat: 15
- type: Item - type: Item
size: Ginormous size: Ginormous
sprite: White/Objects/Weapons/Chaplain/godhand.rsi sprite: White/Objects/Weapons/Chaplain/godhand.rsi
- type: Unremoveable - type: Unremoveable
deleteOnDrop: true deleteOnDrop: true
- type: HolyWeapon
# Типичный меч, база базовая. Может блокировать, острый.
- type: entity - type: entity
parent: Claymore parent: BaseHolyWeapon
id: HolyClaymore id: HolyClaymore
name: священный клеймор name: священный клеймор
description: Оружие, подходящее для крестового похода! description: Оружие, подходящее для крестового похода!
components: components:
- type: Sprite - type: Sprite
sprite: White/Objects/Weapons/Chaplain/claymore.rsi sprite: White/Objects/Weapons/Chaplain/claymore.rsi
- type: MeleeWeapon
damage:
types:
Slash: 33
- type: Clothing - type: Clothing
sprite: White/Objects/Weapons/Chaplain/claymore.rsi sprite: White/Objects/Weapons/Chaplain/claymore.rsi
slots: slots:
@@ -91,29 +105,45 @@
- suitStorage - suitStorage
- type: Item - type: Item
sprite: White/Objects/Weapons/Chaplain/claymore.rsi sprite: White/Objects/Weapons/Chaplain/claymore.rsi
- type: HolyWeapon - type: MeleeWeapon
damage:
types:
Slash: 15
- type: Sharp
- type: MeleeBlock
delay: 12.1
# Отсылка на вархаммер, больше всего урона, так как не может блокировать
- type: entity - type: entity
parent: HolyClaymore parent: BaseHolyWeapon
id: Chainsword id: Chainsword
name: цепной меч name: цепной меч
description: Не позволь еретику жить. description: Не позволь еретику жить.
components: components:
- type: Sprite - type: Sprite
sprite: White/Objects/Weapons/Chaplain/chainsword.rsi 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 - type: MeleeWeapon
soundHit: soundHit:
path: /Audio/Weapons/chainsaw.ogg path: /Audio/Weapons/chainsaw.ogg
- type: Clothing damage:
sprite: White/Objects/Weapons/Chaplain/chainsword.rsi types:
- type: Item Slash: 21
sprite: White/Objects/Weapons/Chaplain/chainsword.rsi
- type: Tool - type: Tool
qualities: qualities:
- Sawing - Sawing
speed: 0.5 speed: 0.5
- type: HolyWeapon - type: Sharp
# Он светится
- type: entity - type: entity
parent: HolyClaymore parent: HolyClaymore
id: SwordGlowing id: SwordGlowing
@@ -130,10 +160,10 @@
color: lightblue color: lightblue
- type: Item - type: Item
sprite: White/Objects/Weapons/Chaplain/forceweapon.rsi sprite: White/Objects/Weapons/Chaplain/forceweapon.rsi
- type: HolyWeapon
# Позволяет блокировать быстрее, средненький урон.
- type: entity - type: entity
parent: Katana parent: BaseHolyWeapon
id: HolyKatana id: HolyKatana
name: лезвие ханзо name: лезвие ханзо
description: Способен прорезать святой клеймор. description: Способен прорезать святой клеймор.
@@ -148,10 +178,24 @@
- suitStorage - suitStorage
- type: Item - type: Item
sprite: White/Objects/Weapons/Chaplain/katana.rsi 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 - type: entity
parent: HolyKatana parent: BaseHolyWeapon
id: MultiverseBlade id: MultiverseBlade
name: внепространственный клинок name: внепространственный клинок
description: Будучи когда-то предвестником межпространственной войны, его острота сильно колеблется. Наносит от 1 до 50 урона. description: Будучи когда-то предвестником межпространственной войны, его острота сильно колеблется. Наносит от 1 до 50 урона.
@@ -170,10 +214,11 @@
- type: Item - type: Item
sprite: White/Objects/Weapons/Chaplain/multiverse.rsi sprite: White/Objects/Weapons/Chaplain/multiverse.rsi
- type: RandomDamage - type: RandomDamage
- type: HolyWeapon - type: Sharp
# Пробивает броню
- type: entity - type: entity
parent: HolyClaymore parent: BaseHolyWeapon
id: VorpalScythe id: VorpalScythe
name: коса жнеца name: коса жнеца
description: И жрец, и жнец, и на дуде игрец! Коса способна пробить броню противника. description: И жрец, и жнец, и на дуде игрец! Коса способна пробить броню противника.
@@ -184,7 +229,7 @@
ignoreResistances: true ignoreResistances: true
damage: damage:
types: types:
Slash: 24 Slash: 14
- type: Clothing - type: Clothing
sprite: White/Objects/Weapons/Chaplain/scythe.rsi sprite: White/Objects/Weapons/Chaplain/scythe.rsi
slots: slots:
@@ -192,8 +237,9 @@
- suitStorage - suitStorage
- type: Item - type: Item
sprite: White/Objects/Weapons/Chaplain/scythe-inhands.rsi sprite: White/Objects/Weapons/Chaplain/scythe-inhands.rsi
- type: HolyWeapon - type: Sharp
# Может пиздеть
- type: entity - type: entity
parent: HolyKatana parent: HolyKatana
id: PossessedBlade id: PossessedBlade
@@ -218,10 +264,10 @@
- type: Examiner - type: Examiner
- type: Item - type: Item
sprite: White/Objects/Weapons/Chaplain/possessed.rsi sprite: White/Objects/Weapons/Chaplain/possessed.rsi
- type: HolyWeapon
# Приклеен к руке, быстро и громко бьет
- type: entity - type: entity
parent: BaseItem parent: BaseHolyWeapon
id: ChainsawHand id: ChainsawHand
name: рука-бензопила name: рука-бензопила
description: Добро? Зло? Ты парень с бензопилой в руке. description: Добро? Зло? Ты парень с бензопилой в руке.
@@ -251,10 +297,10 @@
qualities: qualities:
- Sawing - Sawing
speed: 0.5 speed: 0.5
- type: HolyWeapon
# Нокдаунит при ударе
- type: entity - type: entity
parent: BaseItem parent: BaseHolyWeapon
id: HolyWhip id: HolyWhip
name: священная плеть name: священная плеть
description: Какая ужасная ночь на космической станции 14. description: Какая ужасная ночь на космической станции 14.
@@ -265,10 +311,11 @@
- type: MeleeWeapon - type: MeleeWeapon
soundHit: soundHit:
path: /Audio/White/Items/hit/chainhit.ogg path: /Audio/White/Items/hit/chainhit.ogg
range: 2.5 range: 1.5
attackRate: 0.5
damage: damage:
types: types:
Blunt: 18 Blunt: 10
- type: Item - type: Item
size: Normal size: Normal
sprite: White/Objects/Weapons/Chaplain/whip.rsi sprite: White/Objects/Weapons/Chaplain/whip.rsi
@@ -277,10 +324,13 @@
slots: slots:
- belt - belt
- type: DisarmMalus - type: DisarmMalus
- type: HolyWeapon - type: KnockDownOnHit
knockDownBehavior: NoDrop
knockdownTime: 0.4
# Отбрасывает при ударе и может блокировать, требует держать себя в двух руках для отброса
- type: entity - type: entity
parent: BaseItem parent: BaseHolyWeapon
id: HolyStaff id: HolyStaff
name: посох монаха name: посох монаха
description: Длинный высокий посох из полированного дерева. Традиционно используемый в боевых искусствах древней Земли, теперь он используется для преследования клоуна. description: Длинный высокий посох из полированного дерева. Традиционно используемый в боевых искусствах древней Земли, теперь он используется для преследования клоуна.
@@ -288,11 +338,6 @@
- type: Sprite - type: Sprite
sprite: White/Objects/Weapons/Chaplain/staff.rsi sprite: White/Objects/Weapons/Chaplain/staff.rsi
state: icon state: icon
- type: MeleeWeapon
wideAnimationRotation: 135
damage:
types:
Blunt: 10
- type: Item - type: Item
size: Huge size: Huge
sprite: White/Objects/Weapons/Chaplain/staff.rsi sprite: White/Objects/Weapons/Chaplain/staff.rsi
@@ -301,23 +346,64 @@
slots: slots:
- back - back
- suitStorage - suitStorage
- type: MeleeWeapon
wideAnimationRotation: 135
damage:
types:
Blunt: 6
soundHit:
collection: MetalThud
- type: Wieldable - type: Wieldable
- type: IncreaseDamageOnWield - type: IncreaseDamageOnWield
damage: damage:
types: types:
Blunt: 8 Blunt: 8
- type: MeleeThrowOnHit
lifetime: 0.2
speed: 5
fallAfterHit: true
requireWield: true
- type: UseDelay - type: UseDelay
- type: DisarmMalus
- type: MeleeBlock - type: MeleeBlock
delay: 6.1 delay: 8.1
- type: HolyWeapon
# Можно кинуть, если попасть нанесет ебать как много, не попадет - ты проебал ее. Далеко бьет
- type: entity - type: entity
parent: BaseItem parent: BaseHolyWeapon
id: UnholyPitchfork id: UnholyPitchfork
name: нечестивые вилы name: нечестивые вилы
description: Держа это, ты выглядишь абсолютно по дьявольски. description: Держа это, ты выглядишь абсолютно по дьявольски.
components: 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 - type: EmbeddableProjectile
offset: 0.15,0.15 offset: 0.15,0.15
- type: ThrowingAngle - type: ThrowingAngle
@@ -337,42 +423,12 @@
restitution: 0.3 restitution: 0.3
friction: 0.2 friction: 0.2
- type: Sharp - 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: UseDelay
- type: DisarmMalus - type: DisarmMalus
- type: HolyWeapon
# Высокий структурный урон
- type: entity - type: entity
parent: BaseItem parent: BaseHolyWeapon
id: WarHammer id: WarHammer
name: реликтовый боевой молот name: реликтовый боевой молот
description: Этот боевой молот обошелся священнику в сорок тысяч кредитов. description: Этот боевой молот обошелся священнику в сорок тысяч кредитов.
@@ -380,17 +436,6 @@
- type: Sprite - type: Sprite
sprite: White/Objects/Weapons/Chaplain/hammer.rsi sprite: White/Objects/Weapons/Chaplain/hammer.rsi
state: icon state: icon
- type: MeleeWeapon
wideAnimationRotation: -135
attackRate: 0.75
damage:
types:
Blunt: 24
Structural: 40
soundHit:
collection: HammerHit
soundSwing:
collection: HammerMiss
- type: Item - type: Item
size: Huge size: Huge
sprite: White/Objects/Weapons/Chaplain/hammer.rsi sprite: White/Objects/Weapons/Chaplain/hammer.rsi
@@ -400,14 +445,25 @@
- belt - belt
- back - back
- suitStorage - suitStorage
- type: MeleeWeapon
wideAnimationRotation: -135
attackRate: 0.75
damage:
types:
Blunt: 16
Structural: 40
soundHit:
collection: HammerHit
soundSwing:
collection: HammerMiss
- type: DisarmMalus - type: DisarmMalus
- type: HolyWeapon
# Имеет все инструменты в себе, но работает медленно и почти не наносит урона
- type: entity - type: entity
parent: BaseItem parent: BaseHolyWeapon
id: HyperTool id: HyperTool
name: гиперинструмент name: гиперинструмент
description: Инструмент настолько мощный, что даже вы не можете им идеально пользоваться. description: Кто-то додумался склеить все инструменты вместе и вот, что вышло. Настолько продуманный, что вы не понимаете, как этим адекватно пользоваться
components: components:
- type: Sprite - type: Sprite
sprite: White/Objects/Weapons/Chaplain/hypertool.rsi sprite: White/Objects/Weapons/Chaplain/hypertool.rsi
@@ -417,9 +473,9 @@
canHeavyAttack: false canHeavyAttack: false
damage: damage:
types: types:
Blunt: 0 Blunt: 4
- type: StaminaDamageOnHit soundHit:
damage: 40 collection: HyperToolUsing
- type: Item - type: Item
size: Normal size: Normal
sprite: White/Objects/Weapons/Chaplain/hypertool.rsi sprite: White/Objects/Weapons/Chaplain/hypertool.rsi
@@ -428,4 +484,29 @@
slots: slots:
- belt - belt
- type: DisarmMalus - 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

View File

@@ -4,7 +4,6 @@
name: telescopic baton name: telescopic baton
description: A compact yet robust personal defense weapon. Can be concealed when folded. description: A compact yet robust personal defense weapon. Can be concealed when folded.
components: components:
- type: TelescopicBaton
- type: Sprite - type: Sprite
sprite: White/Objects/Weapons/telebaton.rsi sprite: White/Objects/Weapons/telebaton.rsi
layers: layers:
@@ -23,6 +22,8 @@
path: /Audio/Weapons/telescopicoff.ogg path: /Audio/Weapons/telescopicoff.ogg
params: params:
volume: -5 volume: -5
activatedDescription: comp-telebaton-examined-on
deactivatedDescription: comp-telebaton-examined-off
- type: Appearance - type: Appearance
- type: GenericVisualizer - type: GenericVisualizer
visuals: visuals:
@@ -64,3 +65,4 @@
- Belt - Belt
- type: StaticPrice - type: StaticPrice
price: 150 price: 150
- type: KnockDownOnHit

View File

@@ -824,7 +824,7 @@
wideAnimationRotation: -135 wideAnimationRotation: -135
damage: damage:
types: types:
Slash: 18 Slash: 14
soundHit: soundHit:
path: /Audio/Weapons/bladeslice.ogg path: /Audio/Weapons/bladeslice.ogg
- type: HolyWeapon - type: HolyWeapon

View File

@@ -11,7 +11,7 @@
attackRate: 5 attackRate: 5
damage: damage:
types: types:
Slash: 10 Slash: 25
- type: Clothing - type: Clothing
sprite: White/Objects/Weapons/Chaplain/hfrequency.rsi sprite: White/Objects/Weapons/Chaplain/hfrequency.rsi
slots: slots:
@@ -101,6 +101,7 @@
minLifetime: 0.01 minLifetime: 0.01
speed: 20 speed: 20
stunTime: 1.5 stunTime: 1.5
fallAfterHit: true
throwOnThrowHit: true throwOnThrowHit: true
- type: DamageOtherOnHit - type: DamageOtherOnHit
sound: sound: