Большой ребаланс милишки (#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.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<BloodstreamComponent> 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<BloodstreamComponent> 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<DamageModifierSetPrototype>(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);
/// <summary>
/// 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!
/// </summary>
/*
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<BloodLustComponent>(uid)) // WD
{
if (component.BleedAmount == 0f)
if (component.BleedAmount == 0)
RemComp<BloodLustComponent>(uid);
_speed.RefreshMovementSpeedModifiers(uid);

View File

@@ -51,6 +51,14 @@ public sealed partial class ItemToggleComponent : Component
/// </summary>
[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
}
/// <summary>

View File

@@ -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<ItemToggleHotComponent, IsHotEvent>(OnIsHotEvent);
SubscribeLocalEvent<ItemToggleActiveSoundComponent, ItemToggledEvent>(UpdateActiveSound);
SubscribeLocalEvent<ItemToggleComponent, ExaminedEvent>(OnExamined); // WD
SubscribeLocalEvent<ItemToggleComponent, ItemToggledEvent>(UpdatePrefix); // WD
}
private void OnStartup(Entity<ItemToggleComponent> 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<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;
}
// 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,
StatusEffectsComponent? status = null)
{

View File

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

View File

@@ -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.
/// </summary>
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<KnockedDownComponent>(uid, "KnockedDown", time, refresh))
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))
return false;
}
// WD added end
var ev = new KnockedDownEvent();
RaiseLocalEvent(uid, ref ev);

View File

@@ -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
}
/// <summary>

View File

@@ -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
/// <inheritdoc/>
public override void Initialize()
@@ -36,8 +39,10 @@ public sealed class MeleeThrowOnHitSystem : EntitySystem
private void OnDoHit(Entity<MeleeThrowOnHitComponent> 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<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
{
@@ -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<AnchorableComponent>(hit))
if (ent.Comp.UnanchorOnHit && HasComp<AnchorableComponent>(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);
}

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-off = Дубинка сложена.
comp-item-toggle-on = Активировано
comp-item-toggle-off = Деактивировано

View File

@@ -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.

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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: