Stamina damage (#9230)
10
Content.Server/Damage/Components/ActiveStaminaComponent.cs
Normal file
@@ -0,0 +1,10 @@
|
||||
namespace Content.Server.Damage.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Tracks whether an entity has ANY stamina damage for update purposes only.
|
||||
/// </summary>
|
||||
[RegisterComponent]
|
||||
public sealed class ActiveStaminaComponent : Component
|
||||
{
|
||||
|
||||
}
|
||||
47
Content.Server/Damage/Components/StaminaComponent.cs
Normal file
@@ -0,0 +1,47 @@
|
||||
using Content.Server.Damage.Systems;
|
||||
using Robust.Shared.GameStates;
|
||||
|
||||
namespace Content.Server.Damage.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Add to an entity to paralyze it whenever it reaches critical amounts of Stamina DamageType.
|
||||
/// </summary>
|
||||
[RegisterComponent]
|
||||
public sealed class StaminaComponent : Component
|
||||
{
|
||||
/// <summary>
|
||||
/// Have we reached peak stamina damage and been paralyzed?
|
||||
/// </summary>
|
||||
[ViewVariables(VVAccess.ReadWrite), DataField("critical")]
|
||||
public bool Critical;
|
||||
|
||||
/// <summary>
|
||||
/// How much stamina reduces per second.
|
||||
/// </summary>
|
||||
[ViewVariables(VVAccess.ReadWrite), DataField("decay")]
|
||||
public float Decay = 3f;
|
||||
|
||||
/// <summary>
|
||||
/// How much time after receiving damage until stamina starts decreasing.
|
||||
/// </summary>
|
||||
[ViewVariables(VVAccess.ReadWrite), DataField("cooldown")]
|
||||
public float DecayCooldown = 5f;
|
||||
|
||||
/// <summary>
|
||||
/// How much stamina damage this entity has taken.
|
||||
/// </summary>
|
||||
[ViewVariables(VVAccess.ReadWrite), DataField("staminaDamage")]
|
||||
public float StaminaDamage;
|
||||
|
||||
/// <summary>
|
||||
/// How much stamina damage is required to entire stam crit.
|
||||
/// </summary>
|
||||
[ViewVariables(VVAccess.ReadWrite), DataField("excess")]
|
||||
public float CritThreshold = 100f;
|
||||
|
||||
/// <summary>
|
||||
/// Next time we're allowed to decrease stamina damage. Refreshes whenever the stam damage is changed.
|
||||
/// </summary>
|
||||
[ViewVariables(VVAccess.ReadWrite), DataField("decayAccumulator")]
|
||||
public float StaminaDecayAccumulator;
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
using Robust.Shared.GameStates;
|
||||
|
||||
namespace Content.Server.Damage.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Applies stamina damage when colliding with an entity.
|
||||
/// </summary>
|
||||
[RegisterComponent]
|
||||
public sealed class StaminaDamageOnCollideComponent : Component
|
||||
{
|
||||
[ViewVariables(VVAccess.ReadWrite), DataField("damage")]
|
||||
public float Damage = 55f;
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
namespace Content.Server.Damage.Components;
|
||||
|
||||
[RegisterComponent]
|
||||
public sealed class StaminaDamageOnHitComponent : Component
|
||||
{
|
||||
[ViewVariables(VVAccess.ReadWrite), DataField("damage")]
|
||||
public float Damage = 30f;
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
namespace Content.Server.Damage.Events;
|
||||
|
||||
/// <summary>
|
||||
/// Attempting to apply stamina damage on a melee hit to an entity.
|
||||
/// </summary>
|
||||
[ByRefEvent]
|
||||
public struct StaminaDamageOnHitAttemptEvent
|
||||
{
|
||||
public bool Cancelled;
|
||||
}
|
||||
221
Content.Server/Damage/Systems/StaminaSystem.cs
Normal file
@@ -0,0 +1,221 @@
|
||||
using Content.Server.Damage.Components;
|
||||
using Content.Server.Damage.Events;
|
||||
using Content.Server.Popups;
|
||||
using Content.Server.Weapon.Melee;
|
||||
using Content.Shared.Alert;
|
||||
using Content.Shared.Rounding;
|
||||
using Content.Shared.Stunnable;
|
||||
using Robust.Shared.Collections;
|
||||
using Robust.Shared.Physics.Dynamics;
|
||||
using Robust.Shared.Player;
|
||||
using Robust.Shared.Timing;
|
||||
|
||||
namespace Content.Server.Damage.Systems;
|
||||
|
||||
public sealed class StaminaSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly IGameTiming _timing = default!;
|
||||
[Dependency] private readonly AlertsSystem _alerts = default!;
|
||||
[Dependency] private readonly PopupSystem _popup = default!;
|
||||
[Dependency] private readonly SharedStunSystem _stunSystem = default!;
|
||||
|
||||
private const float UpdateCooldown = 2f;
|
||||
private float _accumulator;
|
||||
|
||||
private const string CollideFixture = "projectile";
|
||||
|
||||
/// <summary>
|
||||
/// How much of a buffer is there between the stun duration and when stuns can be re-applied.
|
||||
/// </summary>
|
||||
private const float StamCritBufferTime = 3f;
|
||||
|
||||
private readonly List<EntityUid> _dirtyEntities = new();
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
SubscribeLocalEvent<StaminaDamageOnCollideComponent, StartCollideEvent>(OnCollide);
|
||||
SubscribeLocalEvent<StaminaDamageOnHitComponent, MeleeHitEvent>(OnHit);
|
||||
SubscribeLocalEvent<StaminaComponent, ComponentStartup>(OnStartup);
|
||||
SubscribeLocalEvent<StaminaComponent, ComponentShutdown>(OnShutdown);
|
||||
}
|
||||
|
||||
private void OnShutdown(EntityUid uid, StaminaComponent component, ComponentShutdown args)
|
||||
{
|
||||
SetStaminaAlert(uid);
|
||||
}
|
||||
|
||||
private void OnStartup(EntityUid uid, StaminaComponent component, ComponentStartup args)
|
||||
{
|
||||
SetStaminaAlert(uid, component);
|
||||
}
|
||||
|
||||
private void OnHit(EntityUid uid, StaminaDamageOnHitComponent component, MeleeHitEvent args)
|
||||
{
|
||||
if (component.Damage <= 0f) return;
|
||||
|
||||
var ev = new StaminaDamageOnHitAttemptEvent();
|
||||
RaiseLocalEvent(uid, ref ev);
|
||||
|
||||
if (ev.Cancelled) return;
|
||||
|
||||
var stamQuery = GetEntityQuery<StaminaComponent>();
|
||||
var toHit = new ValueList<StaminaComponent>();
|
||||
|
||||
// Split stamina damage between all eligible targets.
|
||||
foreach (var ent in args.HitEntities)
|
||||
{
|
||||
if (!stamQuery.TryGetComponent(ent, out var stam)) continue;
|
||||
toHit.Add(stam);
|
||||
}
|
||||
|
||||
foreach (var comp in toHit)
|
||||
{
|
||||
var oldDamage = comp.StaminaDamage;
|
||||
TakeStaminaDamage(comp.Owner, component.Damage / toHit.Count, comp);
|
||||
if (comp.StaminaDamage.Equals(oldDamage))
|
||||
{
|
||||
_popup.PopupEntity(Loc.GetString("stamina-resist"), comp.Owner, Filter.Entities(args.User));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void OnCollide(EntityUid uid, StaminaDamageOnCollideComponent component, StartCollideEvent args)
|
||||
{
|
||||
if (!args.OurFixture.ID.Equals(CollideFixture)) return;
|
||||
|
||||
TakeStaminaDamage(args.OtherFixture.Body.Owner, component.Damage);
|
||||
}
|
||||
|
||||
private void SetStaminaAlert(EntityUid uid, StaminaComponent? component = null)
|
||||
{
|
||||
if (!Resolve(uid, ref component, false) || component.Deleted)
|
||||
{
|
||||
_alerts.ClearAlert(uid, AlertType.Stamina);
|
||||
return;
|
||||
}
|
||||
|
||||
var severity = ContentHelpers.RoundToLevels(MathF.Max(0f, component.CritThreshold - component.StaminaDamage), component.CritThreshold, 7);
|
||||
_alerts.ShowAlert(uid, AlertType.Stamina, (short) severity);
|
||||
}
|
||||
|
||||
public void TakeStaminaDamage(EntityUid uid, float value, StaminaComponent? component = null)
|
||||
{
|
||||
if (!Resolve(uid, ref component, false) || component.Critical) return;
|
||||
|
||||
var oldDamage = component.StaminaDamage;
|
||||
component.StaminaDamage = MathF.Max(0f, component.StaminaDamage + value);
|
||||
|
||||
// Reset the decay cooldown upon taking damage.
|
||||
if (oldDamage < component.StaminaDamage)
|
||||
{
|
||||
component.StaminaDecayAccumulator = component.DecayCooldown;
|
||||
}
|
||||
|
||||
var slowdownThreshold = component.CritThreshold / 2f;
|
||||
|
||||
// If we go above n% then apply slowdown
|
||||
if (oldDamage < slowdownThreshold &&
|
||||
component.StaminaDamage > slowdownThreshold)
|
||||
{
|
||||
_stunSystem.TrySlowdown(uid, TimeSpan.FromSeconds(3), true, 0.8f, 0.8f);
|
||||
}
|
||||
|
||||
SetStaminaAlert(uid, component);
|
||||
|
||||
// Can't do it here as resetting prediction gets cooked.
|
||||
_dirtyEntities.Add(uid);
|
||||
|
||||
if (!component.Critical)
|
||||
{
|
||||
if (component.StaminaDamage >= component.CritThreshold)
|
||||
{
|
||||
EnterStamCrit(uid, component);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (component.StaminaDamage < component.CritThreshold)
|
||||
{
|
||||
ExitStamCrit(uid, component);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override void Update(float frameTime)
|
||||
{
|
||||
base.Update(frameTime);
|
||||
|
||||
if (!_timing.IsFirstTimePredicted) return;
|
||||
|
||||
_accumulator -= frameTime;
|
||||
|
||||
if (_accumulator > 0f) return;
|
||||
|
||||
var stamQuery = GetEntityQuery<StaminaComponent>();
|
||||
|
||||
foreach (var uid in _dirtyEntities)
|
||||
{
|
||||
// Don't need to RemComp as they will get handled below.
|
||||
if (!stamQuery.TryGetComponent(uid, out var comp) || comp.StaminaDamage <= 0f) continue;
|
||||
EnsureComp<ActiveStaminaComponent>(uid);
|
||||
}
|
||||
|
||||
_dirtyEntities.Clear();
|
||||
_accumulator += UpdateCooldown;
|
||||
|
||||
foreach (var active in EntityQuery<ActiveStaminaComponent>())
|
||||
{
|
||||
// Just in case we have active but not stamina we'll check and account for it.
|
||||
if (!stamQuery.TryGetComponent(active.Owner, out var comp) ||
|
||||
comp.StaminaDamage <= 0f)
|
||||
{
|
||||
RemComp<ActiveStaminaComponent>(active.Owner);
|
||||
continue;
|
||||
}
|
||||
|
||||
comp.StaminaDecayAccumulator -= UpdateCooldown;
|
||||
|
||||
if (comp.StaminaDecayAccumulator > 0f) continue;
|
||||
|
||||
// We were in crit so come out of it and continue.
|
||||
if (comp.Critical)
|
||||
{
|
||||
ExitStamCrit(active.Owner, comp);
|
||||
continue;
|
||||
}
|
||||
|
||||
comp.StaminaDecayAccumulator = 0f;
|
||||
TakeStaminaDamage(comp.Owner, -comp.Decay * UpdateCooldown, comp);
|
||||
}
|
||||
}
|
||||
|
||||
private void EnterStamCrit(EntityUid uid, StaminaComponent? component = null)
|
||||
{
|
||||
if (!Resolve(uid, ref component) ||
|
||||
component.Critical) return;
|
||||
|
||||
// To make the difference between a stun and a stamcrit clear
|
||||
// TODO: Mask?
|
||||
|
||||
component.Critical = true;
|
||||
component.StaminaDamage = component.CritThreshold;
|
||||
component.StaminaDecayAccumulator = 0f;
|
||||
|
||||
var stunTime = TimeSpan.FromSeconds(6);
|
||||
_stunSystem.TryParalyze(uid, stunTime, true);
|
||||
|
||||
// Give them buffer before being able to be re-stunned
|
||||
component.StaminaDecayAccumulator = (float) stunTime.TotalSeconds + StamCritBufferTime;
|
||||
}
|
||||
|
||||
private void ExitStamCrit(EntityUid uid, StaminaComponent? component = null)
|
||||
{
|
||||
if (!Resolve(uid, ref component) ||
|
||||
!component.Critical) return;
|
||||
|
||||
component.Critical = false;
|
||||
component.StaminaDamage = 0f;
|
||||
SetStaminaAlert(uid, component);
|
||||
}
|
||||
}
|
||||
@@ -30,7 +30,6 @@ namespace Content.Server.Flash
|
||||
{
|
||||
base.Initialize();
|
||||
SubscribeLocalEvent<FlashComponent, MeleeHitEvent>(OnFlashMeleeHit);
|
||||
SubscribeLocalEvent<FlashComponent, UseInHandEvent>(OnFlashUseInHand);
|
||||
SubscribeLocalEvent<FlashComponent, ExaminedEvent>(OnFlashExamined);
|
||||
|
||||
SubscribeLocalEvent<InventoryComponent, FlashAttemptEvent>(OnInventoryFlashAttempt);
|
||||
@@ -78,16 +77,6 @@ namespace Content.Server.Flash
|
||||
}
|
||||
}
|
||||
|
||||
private void OnFlashUseInHand(EntityUid uid, FlashComponent comp, UseInHandEvent args)
|
||||
{
|
||||
if (!UseFlash(comp, args.User))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
FlashArea(uid, args.User, comp.Range, comp.AoeFlashDuration, comp.SlowTo, true);
|
||||
}
|
||||
|
||||
private bool UseFlash(FlashComponent comp, EntityUid user)
|
||||
{
|
||||
if (comp.HasUses)
|
||||
@@ -121,16 +110,16 @@ namespace Content.Server.Flash
|
||||
return false;
|
||||
}
|
||||
|
||||
public void Flash(EntityUid target, EntityUid? user, EntityUid? used, float flashDuration, float slowTo, bool displayPopup = true)
|
||||
public void Flash(EntityUid target, EntityUid? user, EntityUid? used, float flashDuration, float slowTo, bool displayPopup = true, FlashableComponent? flashable = null)
|
||||
{
|
||||
if (!Resolve(target, ref flashable, false)) return;
|
||||
|
||||
var attempt = new FlashAttemptEvent(target, user, used);
|
||||
RaiseLocalEvent(target, attempt, true);
|
||||
|
||||
if (attempt.Cancelled)
|
||||
return;
|
||||
|
||||
if (EntityManager.TryGetComponent<FlashableComponent>(target, out var flashable))
|
||||
{
|
||||
flashable.LastFlash = _gameTiming.CurTime;
|
||||
flashable.Duration = flashDuration / 1000f; // TODO: Make this sane...
|
||||
Dirty(flashable);
|
||||
@@ -144,16 +133,17 @@ namespace Content.Server.Flash
|
||||
("user", user.Value)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void FlashArea(EntityUid source, EntityUid? user, float range, float duration, float slowTo = 0f, bool displayPopup = false, SoundSpecifier? sound = null)
|
||||
public void FlashArea(EntityUid source, EntityUid? user, float range, float duration, float slowTo = 0.8f, bool displayPopup = false, SoundSpecifier? sound = null)
|
||||
{
|
||||
var transform = EntityManager.GetComponent<TransformComponent>(source);
|
||||
var mapPosition = transform.MapPosition;
|
||||
var flashableEntities = new List<EntityUid>();
|
||||
var flashableQuery = GetEntityQuery<FlashableComponent>();
|
||||
|
||||
foreach (var entity in _entityLookup.GetEntitiesInRange(transform.Coordinates, range))
|
||||
{
|
||||
if (!EntityManager.HasComponent<FlashableComponent>(entity))
|
||||
if (!flashableQuery.HasComponent(entity))
|
||||
continue;
|
||||
|
||||
flashableEntities.Add(entity);
|
||||
@@ -162,14 +152,15 @@ namespace Content.Server.Flash
|
||||
foreach (var entity in flashableEntities)
|
||||
{
|
||||
// Check for unobstructed entities while ignoring the mobs with flashable components.
|
||||
if (!_interactionSystem.InRangeUnobstructed(entity, transform.MapPosition, range, CollisionGroup.Opaque, (e) => flashableEntities.Contains(e)))
|
||||
if (!_interactionSystem.InRangeUnobstructed(entity, mapPosition, range, CollisionGroup.Opaque, (e) => flashableEntities.Contains(e)))
|
||||
continue;
|
||||
|
||||
Flash(entity, user, source, duration, slowTo, displayPopup);
|
||||
// They shouldn't have flash removed in between right?
|
||||
Flash(entity, user, source, duration, slowTo, displayPopup, flashableQuery.GetComponent(entity));
|
||||
}
|
||||
if (sound != null)
|
||||
{
|
||||
SoundSystem.Play(sound.GetSound(), Filter.Pvs(transform), transform.Coordinates);
|
||||
SoundSystem.Play(sound.GetSound(), Filter.Pvs(transform), source);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using Content.Server.Stunnable.Systems;
|
||||
using Content.Shared.Sound;
|
||||
using Content.Shared.Timing;
|
||||
|
||||
@@ -8,21 +9,6 @@ namespace Content.Server.Stunnable.Components
|
||||
{
|
||||
public bool Activated = false;
|
||||
|
||||
/// <summary>
|
||||
/// What the <see cref="UseDelayComponent"/> is when the stun baton is active.
|
||||
/// </summary>
|
||||
[ViewVariables(VVAccess.ReadWrite), DataField("activeCooldown")]
|
||||
public TimeSpan ActiveDelay = TimeSpan.FromSeconds(4);
|
||||
|
||||
/// <summary>
|
||||
/// Store what the <see cref="UseDelayComponent"/> was before being activated.
|
||||
/// </summary>
|
||||
public TimeSpan? OldDelay;
|
||||
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
[DataField("paralyzeTime")]
|
||||
public float ParalyzeTime { get; set; } = 5f;
|
||||
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
[DataField("energyPerUse")]
|
||||
public float EnergyPerUse { get; set; } = 350;
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
using System.Linq;
|
||||
using Content.Server.Damage.Components;
|
||||
using Content.Server.Damage.Events;
|
||||
using Content.Server.Power.Components;
|
||||
using Content.Server.Power.Events;
|
||||
using Content.Server.Speech.EntitySystems;
|
||||
using Content.Server.Stunnable.Components;
|
||||
using Content.Server.Weapon.Melee;
|
||||
using Content.Server.Weapon.Melee.Components;
|
||||
using Content.Shared.Audio;
|
||||
using Content.Shared.Examine;
|
||||
using Content.Shared.Interaction.Events;
|
||||
@@ -12,55 +13,48 @@ using Content.Shared.Item;
|
||||
using Content.Shared.Jittering;
|
||||
using Content.Shared.Popups;
|
||||
using Content.Shared.StatusEffect;
|
||||
using Content.Shared.Stunnable;
|
||||
using Content.Shared.Throwing;
|
||||
using Content.Shared.Timing;
|
||||
using Robust.Server.GameObjects;
|
||||
using Robust.Shared.Audio;
|
||||
using Robust.Shared.Player;
|
||||
using Robust.Shared.Random;
|
||||
using Robust.Shared.Timing;
|
||||
|
||||
namespace Content.Server.Stunnable
|
||||
namespace Content.Server.Stunnable.Systems
|
||||
{
|
||||
public sealed class StunbatonSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly MeleeWeaponSystem _melee = default!;
|
||||
[Dependency] private readonly StunSystem _stunSystem = default!;
|
||||
[Dependency] private readonly StutteringSystem _stutteringSystem = default!;
|
||||
[Dependency] private readonly SharedJitteringSystem _jitterSystem = default!;
|
||||
[Dependency] private readonly UseDelaySystem _useDelay = default!;
|
||||
[Dependency] private readonly IGameTiming _timing = default!;
|
||||
[Dependency] private readonly IRobustRandom _robustRandom = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<StunbatonComponent, MeleeHitEvent>(OnMeleeHit);
|
||||
SubscribeLocalEvent<StunbatonComponent, UseInHandEvent>(OnUseInHand);
|
||||
SubscribeLocalEvent<StunbatonComponent, ThrowDoHitEvent>(OnThrowCollide);
|
||||
SubscribeLocalEvent<StunbatonComponent, ExaminedEvent>(OnExamined);
|
||||
SubscribeLocalEvent<StunbatonComponent, StaminaDamageOnHitAttemptEvent>(OnStaminaHitAttempt);
|
||||
SubscribeLocalEvent<StunbatonComponent, MeleeHitEvent>(OnMeleeHit);
|
||||
}
|
||||
|
||||
private void OnMeleeHit(EntityUid uid, StunbatonComponent comp, MeleeHitEvent args)
|
||||
private void OnMeleeHit(EntityUid uid, StunbatonComponent component, MeleeHitEvent args)
|
||||
{
|
||||
if (!comp.Activated || !args.HitEntities.Any() || args.Handled || _useDelay.ActiveDelay(uid))
|
||||
return;
|
||||
if (!component.Activated) return;
|
||||
|
||||
if (!TryComp<BatteryComponent>(uid, out var battery) || !battery.TryUseCharge(comp.EnergyPerUse))
|
||||
return;
|
||||
|
||||
foreach (var entity in args.HitEntities)
|
||||
{
|
||||
StunEntity(entity, comp);
|
||||
SendPowerPulse(entity, args.User, uid);
|
||||
// Don't apply damage if it's activated; just do stamina damage.
|
||||
args.BonusDamage -= args.BaseDamage;
|
||||
}
|
||||
|
||||
_melee.SetAttackCooldown(uid, _timing.CurTime + comp.ActiveDelay);
|
||||
_useDelay.BeginDelay(uid);
|
||||
// No combat should occur if we successfully stunned.
|
||||
args.Handled = true;
|
||||
private void OnStaminaHitAttempt(EntityUid uid, StunbatonComponent component, ref StaminaDamageOnHitAttemptEvent args)
|
||||
{
|
||||
if (!component.Activated ||
|
||||
!TryComp<BatteryComponent>(uid, out var battery) || !battery.TryUseCharge(component.EnergyPerUse))
|
||||
{
|
||||
args.Cancelled = true;
|
||||
return;
|
||||
}
|
||||
|
||||
if (battery.CurrentCharge < component.EnergyPerUse)
|
||||
{
|
||||
SoundSystem.Play(component.SparksSound.GetSound(), Filter.Pvs(component.Owner, entityManager: EntityManager), uid, AudioHelpers.WithVariation(0.25f));
|
||||
TurnOff(component);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnUseInHand(EntityUid uid, StunbatonComponent comp, UseInHandEvent args)
|
||||
@@ -75,21 +69,6 @@ namespace Content.Server.Stunnable
|
||||
}
|
||||
}
|
||||
|
||||
private void OnThrowCollide(EntityUid uid, StunbatonComponent comp, ThrowDoHitEvent args)
|
||||
{
|
||||
if (!comp.Activated)
|
||||
return;
|
||||
|
||||
if (!TryComp<BatteryComponent>(uid, out var battery))
|
||||
return;
|
||||
|
||||
if (_robustRandom.Prob(comp.OnThrowStunChance) && battery.TryUseCharge(comp.EnergyPerUse))
|
||||
{
|
||||
SendPowerPulse(args.Target, args.User, uid);
|
||||
StunEntity(args.Target, comp);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnExamined(EntityUid uid, StunbatonComponent comp, ExaminedEvent args)
|
||||
{
|
||||
var msg = comp.Activated
|
||||
@@ -101,24 +80,6 @@ namespace Content.Server.Stunnable
|
||||
("charge", (int)((battery.CurrentCharge/battery.MaxCharge) * 100))));
|
||||
}
|
||||
|
||||
private void StunEntity(EntityUid entity, StunbatonComponent comp)
|
||||
{
|
||||
if (!EntityManager.TryGetComponent(entity, out StatusEffectsComponent? status) || !comp.Activated) return;
|
||||
|
||||
SoundSystem.Play(comp.StunSound.GetSound(), Filter.Pvs(comp.Owner), comp.Owner, AudioHelpers.WithVariation(0.25f));
|
||||
_stunSystem.TryParalyze(entity, TimeSpan.FromSeconds(comp.ParalyzeTime), true, status);
|
||||
|
||||
var slowdownTime = TimeSpan.FromSeconds(comp.ParalyzeTime);
|
||||
_jitterSystem.DoJitter(entity, slowdownTime, true, status:status);
|
||||
_stutteringSystem.DoStutter(entity, slowdownTime, true, status);
|
||||
|
||||
if (!TryComp<BatteryComponent>(comp.Owner, out var battery) || !(battery.CurrentCharge < comp.EnergyPerUse))
|
||||
return;
|
||||
|
||||
SoundSystem.Play(comp.SparksSound.GetSound(), Filter.Pvs(comp.Owner), comp.Owner, AudioHelpers.WithVariation(0.25f));
|
||||
TurnOff(comp);
|
||||
}
|
||||
|
||||
private void TurnOff(StunbatonComponent comp)
|
||||
{
|
||||
if (!comp.Activated)
|
||||
@@ -135,11 +96,6 @@ namespace Content.Server.Stunnable
|
||||
SoundSystem.Play(comp.SparksSound.GetSound(), Filter.Pvs(comp.Owner), comp.Owner, AudioHelpers.WithVariation(0.25f));
|
||||
|
||||
comp.Activated = false;
|
||||
if (TryComp<UseDelayComponent>(comp.Owner, out var useDelay) && comp.OldDelay != null)
|
||||
{
|
||||
useDelay.Delay = comp.OldDelay.Value;
|
||||
comp.OldDelay = null;
|
||||
}
|
||||
}
|
||||
|
||||
private void TurnOn(StunbatonComponent comp, EntityUid user)
|
||||
@@ -147,13 +103,6 @@ namespace Content.Server.Stunnable
|
||||
if (comp.Activated)
|
||||
return;
|
||||
|
||||
if (EntityManager.TryGetComponent<SpriteComponent?>(comp.Owner, out var sprite) &&
|
||||
EntityManager.TryGetComponent<SharedItemComponent?>(comp.Owner, out var item))
|
||||
{
|
||||
item.EquippedPrefix = "on";
|
||||
sprite.LayerSetState(0, "stunbaton_on");
|
||||
}
|
||||
|
||||
var playerFilter = Filter.Pvs(comp.Owner, entityManager: EntityManager);
|
||||
if (!TryComp<BatteryComponent>(comp.Owner, out var battery) || battery.CurrentCharge < comp.EnergyPerUse)
|
||||
{
|
||||
@@ -162,14 +111,15 @@ namespace Content.Server.Stunnable
|
||||
return;
|
||||
}
|
||||
|
||||
SoundSystem.Play(comp.SparksSound.GetSound(), playerFilter, comp.Owner, AudioHelpers.WithVariation(0.25f));
|
||||
|
||||
comp.Activated = true;
|
||||
if (TryComp<UseDelayComponent>(comp.Owner, out var useDelay))
|
||||
if (EntityManager.TryGetComponent<SpriteComponent?>(comp.Owner, out var sprite) &&
|
||||
EntityManager.TryGetComponent<SharedItemComponent?>(comp.Owner, out var item))
|
||||
{
|
||||
comp.OldDelay = useDelay.Delay;
|
||||
useDelay.Delay = comp.ActiveDelay;
|
||||
item.EquippedPrefix = "on";
|
||||
sprite.LayerSetState(0, "stunbaton_on");
|
||||
}
|
||||
|
||||
SoundSystem.Play(comp.SparksSound.GetSound(), playerFilter, comp.Owner, AudioHelpers.WithVariation(0.25f));
|
||||
comp.Activated = true;
|
||||
}
|
||||
|
||||
private void SendPowerPulse(EntityUid target, EntityUid? user, EntityUid used)
|
||||
@@ -1,4 +1,5 @@
|
||||
using System.Linq;
|
||||
using Content.Server.Damage.Systems;
|
||||
using Content.Server.Projectiles.Components;
|
||||
using Content.Server.Weapon.Melee;
|
||||
using Content.Server.Weapon.Ranged.Components;
|
||||
@@ -24,6 +25,7 @@ namespace Content.Server.Weapon.Ranged.Systems;
|
||||
public sealed partial class GunSystem : SharedGunSystem
|
||||
{
|
||||
[Dependency] private readonly EffectSystem _effects = default!;
|
||||
[Dependency] private readonly StaminaSystem _stamina = default!;
|
||||
|
||||
public const float DamagePitchVariation = MeleeWeaponSystem.DamagePitchVariation;
|
||||
|
||||
@@ -116,6 +118,9 @@ public sealed partial class GunSystem : SharedGunSystem
|
||||
var distance = result.Distance;
|
||||
FireEffects(fromCoordinates, distance, entityDirection.ToAngle(), hitscan, result.HitEntity);
|
||||
|
||||
if (hitscan.StaminaDamage > 0f)
|
||||
_stamina.TakeStaminaDamage(result.HitEntity, hitscan.StaminaDamage);
|
||||
|
||||
var dmg = hitscan.Damage;
|
||||
|
||||
if (dmg != null)
|
||||
|
||||
@@ -10,6 +10,7 @@ public enum AlertCategory
|
||||
Breathing,
|
||||
Buckled,
|
||||
Health,
|
||||
Stamina,
|
||||
Piloting,
|
||||
Hunger,
|
||||
Thirst,
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
Overhydrated,
|
||||
Thirsty,
|
||||
Parched,
|
||||
Stamina,
|
||||
Pulled,
|
||||
Pulling,
|
||||
Magboots,
|
||||
|
||||
@@ -85,7 +85,7 @@ public abstract class AlertsSystem : EntitySystem
|
||||
|
||||
AfterShowAlert(alertsComponent);
|
||||
|
||||
alertsComponent.Dirty();
|
||||
Dirty(alertsComponent);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -14,7 +14,7 @@ namespace Content.Shared.StatusEffect
|
||||
/// <summary>
|
||||
/// A list of status effect IDs to be allowed
|
||||
/// </summary>
|
||||
[DataField("allowed", required: true)]
|
||||
[DataField("allowed", required: true), Access(typeof(StatusEffectsSystem), Other = AccessPermissions.ReadExecute)]
|
||||
public List<string> AllowedEffects = default!;
|
||||
}
|
||||
|
||||
|
||||
@@ -14,6 +14,9 @@ public sealed class HitscanPrototype : IPrototype, IShootable
|
||||
[IdDataFieldAttribute]
|
||||
public string ID { get; } = default!;
|
||||
|
||||
[ViewVariables(VVAccess.ReadWrite), DataField("staminaDamage")]
|
||||
public float StaminaDamage;
|
||||
|
||||
[ViewVariables(VVAccess.ReadWrite), DataField("damage")]
|
||||
public DamageSpecifier? Damage;
|
||||
|
||||
|
||||
@@ -1,2 +1,5 @@
|
||||
atreides.ogg, c-20r.ogg, flaregun.ogg, mateba.ogg, minigun.ogg, mk58.ogg were taken from https://gitlab.com/cmdevs/colonial-warfare/-/tree/32cb5892413243cc74bb2d11df8e3085f8ef1164/sound/weapons
|
||||
They are licensed under CC-BY-SA 3.0
|
||||
|
||||
taser2.ogg was taken from https://github.com/tgstation/tgstation/tree/88d7dbfc105fbf40284d7b7c4587f8d23c0ac3ac
|
||||
It is licensed under CC-BY-SA 3.0
|
||||
BIN
Resources/Audio/Weapons/Guns/Gunshots/taser2.ogg
Normal file
1
Resources/Locale/en-US/damage/stamina.ftl
Normal file
@@ -0,0 +1 @@
|
||||
stamina-resist = Resisted
|
||||
@@ -1,5 +1,7 @@
|
||||
### Stunbaton component
|
||||
|
||||
comp-stunbaton-stun = Stunned
|
||||
|
||||
## Used when examining the stunbaton
|
||||
|
||||
comp-stunbaton-examined-on = The light is currently [color=darkgreen]on[/color].
|
||||
|
||||
@@ -41157,23 +41157,6 @@ entities:
|
||||
pos: 13.5,-38.5
|
||||
parent: 60
|
||||
type: Transform
|
||||
- uid: 2177
|
||||
type: ShellShotgunFlash
|
||||
components:
|
||||
- pos: 11.711429,-35.299614
|
||||
parent: 60
|
||||
type: Transform
|
||||
- canCollide: False
|
||||
type: Physics
|
||||
- uid: 2178
|
||||
type: ShellShotgunFlash
|
||||
components:
|
||||
- rot: 0.0007520564831793308 rad
|
||||
pos: 11.738948,-35.53393
|
||||
parent: 60
|
||||
type: Transform
|
||||
- canCollide: False
|
||||
type: Physics
|
||||
- uid: 2179
|
||||
type: ShellShotgunBeanbag
|
||||
components:
|
||||
|
||||
@@ -27317,30 +27317,6 @@ entities:
|
||||
type: Transform
|
||||
- canCollide: False
|
||||
type: Physics
|
||||
- uid: 680
|
||||
type: ShellShotgunFlash
|
||||
components:
|
||||
- pos: -11.704681,19.266298
|
||||
parent: 30
|
||||
type: Transform
|
||||
- canCollide: False
|
||||
type: Physics
|
||||
- uid: 681
|
||||
type: ShellShotgunFlash
|
||||
components:
|
||||
- pos: -11.517181,19.250673
|
||||
parent: 30
|
||||
type: Transform
|
||||
- canCollide: False
|
||||
type: Physics
|
||||
- uid: 682
|
||||
type: ShellShotgunFlash
|
||||
components:
|
||||
- pos: -11.329681,19.250673
|
||||
parent: 30
|
||||
type: Transform
|
||||
- canCollide: False
|
||||
type: Physics
|
||||
- uid: 683
|
||||
type: ClothingEyesGlassesSunglasses
|
||||
components:
|
||||
|
||||
@@ -74639,14 +74639,6 @@ entities:
|
||||
- pos: 11.5,13.5
|
||||
parent: 130
|
||||
type: Transform
|
||||
- uid: 7568
|
||||
type: ShellShotgunFlash
|
||||
components:
|
||||
- pos: 1.4405079,19.67595
|
||||
parent: 130
|
||||
type: Transform
|
||||
- canCollide: False
|
||||
type: Physics
|
||||
- uid: 7569
|
||||
type: CableApcExtension
|
||||
components:
|
||||
@@ -75226,14 +75218,6 @@ entities:
|
||||
- pos: 0.5,4.5
|
||||
parent: 130
|
||||
type: Transform
|
||||
- uid: 7664
|
||||
type: ShellShotgunFlash
|
||||
components:
|
||||
- pos: 1.5967579,19.660324
|
||||
parent: 130
|
||||
type: Transform
|
||||
- canCollide: False
|
||||
type: Physics
|
||||
- uid: 7665
|
||||
type: WallReinforced
|
||||
components:
|
||||
@@ -77007,14 +76991,6 @@ entities:
|
||||
type: Physics
|
||||
- solution: drink
|
||||
type: DrainableSolution
|
||||
- uid: 7889
|
||||
type: ShellShotgunFlash
|
||||
components:
|
||||
- pos: 1.3155079,19.691576
|
||||
parent: 130
|
||||
type: Transform
|
||||
- canCollide: False
|
||||
type: Physics
|
||||
- uid: 7890
|
||||
type: DrinkGlass
|
||||
components:
|
||||
@@ -92463,18 +92439,6 @@ entities:
|
||||
ballistic-ammo: !type:Container
|
||||
ents: []
|
||||
type: ContainerContainer
|
||||
- uid: 9852
|
||||
type: BoxShotgunFlash
|
||||
components:
|
||||
- pos: -50.401936,33.396786
|
||||
parent: 130
|
||||
type: Transform
|
||||
- canCollide: False
|
||||
type: Physics
|
||||
- containers:
|
||||
storagebase: !type:Container
|
||||
ents: []
|
||||
type: ContainerContainer
|
||||
- uid: 9853
|
||||
type: WeaponShotgunKammerer
|
||||
components:
|
||||
@@ -148567,14 +148531,6 @@ entities:
|
||||
type: Airtight
|
||||
- canCollide: False
|
||||
type: Physics
|
||||
- uid: 17447
|
||||
type: ShellShotgunFlash
|
||||
components:
|
||||
- pos: 1.7061329,19.660326
|
||||
parent: 130
|
||||
type: Transform
|
||||
- canCollide: False
|
||||
type: Physics
|
||||
- uid: 17448
|
||||
type: CarpetBlack
|
||||
components:
|
||||
|
||||
@@ -190355,18 +190355,6 @@ entities:
|
||||
- pos: 48.5,6.5
|
||||
parent: 69
|
||||
type: Transform
|
||||
- uid: 22390
|
||||
type: BoxShotgunFlash
|
||||
components:
|
||||
- pos: 6.6360016,-56.489788
|
||||
parent: 69
|
||||
type: Transform
|
||||
- canCollide: False
|
||||
type: Physics
|
||||
- containers:
|
||||
storagebase: !type:Container
|
||||
ents: []
|
||||
type: ContainerContainer
|
||||
- uid: 22391
|
||||
type: DisposalPipe
|
||||
components:
|
||||
|
||||
@@ -63,6 +63,7 @@
|
||||
name: "[color=red]On Fire[/color]"
|
||||
description: "You're [color=red]on fire[/color]. Click the alert to stop, drop and roll to put the fire out or move to a vacuum area."
|
||||
|
||||
|
||||
- type: alert
|
||||
id: Cold
|
||||
category: Temperature
|
||||
@@ -163,6 +164,17 @@
|
||||
name: "[color=yellow]Peckish[/color]"
|
||||
description: Some food would be good right about now.
|
||||
|
||||
- type: alert
|
||||
id: Stamina
|
||||
category: Stamina
|
||||
icon:
|
||||
sprite: /Textures/Interface/Alerts/stamina.rsi
|
||||
state: stamina
|
||||
name: Stamina
|
||||
description: "Stuns you if it is too low."
|
||||
minSeverity: 0
|
||||
maxSeverity: 6
|
||||
|
||||
- type: alert
|
||||
id: Starving
|
||||
category: Hunger
|
||||
|
||||
@@ -101,17 +101,6 @@
|
||||
- id: MagazineMagnum
|
||||
amount: 6
|
||||
|
||||
- type: entity
|
||||
name: box of .40 Lamia (flash) magazines.
|
||||
parent: BoxCardboard
|
||||
id: BoxMagazineMagnumFlash
|
||||
description: A box full of .40 Lamia (flash) magazines.
|
||||
components:
|
||||
- type: StorageFill
|
||||
contents:
|
||||
- id: MagazineMagnumFlash
|
||||
amount: 6
|
||||
|
||||
- type: entity
|
||||
name: box of .40 Lamia (high-velocity) magazines
|
||||
parent: BoxCardboard
|
||||
@@ -212,17 +201,6 @@
|
||||
- id: MagazinePistol
|
||||
amount: 6
|
||||
|
||||
- type: entity
|
||||
name: box of pistol .35 auto (flash) magazines
|
||||
parent: BoxCardboard
|
||||
id: BoxMagazinePistolFlash
|
||||
description: A box full of pistol .35 auto (flash) magazines.
|
||||
components:
|
||||
- type: StorageFill
|
||||
contents:
|
||||
- id: MagazinePistolFlash
|
||||
amount: 6
|
||||
|
||||
- type: entity
|
||||
name: box of pistol .35 auto (high-velocity) magazines
|
||||
parent: BoxCardboard
|
||||
@@ -311,17 +289,6 @@
|
||||
- id: MagazinePistolSubMachineGun
|
||||
amount: 3
|
||||
|
||||
- type: entity
|
||||
name: box of SMG .35 auto (flash) magazines
|
||||
parent: BoxCardboard
|
||||
id: BoxMagazinePistolSubMachineGunFlash
|
||||
description: A box full of SMG .35 auto (flash) magazines.
|
||||
components:
|
||||
- type: StorageFill
|
||||
contents:
|
||||
- id: MagazinePistolSubMachineGunFlash
|
||||
amount: 3
|
||||
|
||||
- type: entity
|
||||
name: box of SMG .35 auto (high-velocity) magazines
|
||||
parent: BoxCardboard
|
||||
@@ -412,17 +379,6 @@
|
||||
- id: MagazineRifle
|
||||
amount: 6
|
||||
|
||||
- type: entity
|
||||
name: box of .20 rifle (flash) magazines
|
||||
parent: BoxCardboard
|
||||
id: BoxMagazineRifleFlash
|
||||
description: A box full of .20 rifle (flash) magazines.
|
||||
components:
|
||||
- type: StorageFill
|
||||
contents:
|
||||
- id: MagazineRifleFlash
|
||||
amount: 6
|
||||
|
||||
- type: entity
|
||||
name: box of .20 rifle (high-velocity) magazines
|
||||
parent: BoxCardboard
|
||||
|
||||
@@ -133,21 +133,6 @@
|
||||
- state: boxwide
|
||||
- state: shellflare
|
||||
|
||||
- type: entity
|
||||
name: box of shotgun flash cartridges
|
||||
parent: BoxCardboard
|
||||
id: BoxShotgunFlash
|
||||
description: A box full of shotgun flash cartridges, designed for riot shotguns.
|
||||
components:
|
||||
- type: StorageFill
|
||||
contents:
|
||||
- id: ShellShotgunFlash
|
||||
amount: 6
|
||||
- type: Sprite
|
||||
layers:
|
||||
- state: boxwide
|
||||
- state: shellflash
|
||||
|
||||
- type: entity
|
||||
name: box of shotgun incendiary cartridges
|
||||
parent: BoxCardboard
|
||||
@@ -205,17 +190,6 @@
|
||||
- id: MagazineRifle
|
||||
amount: 6
|
||||
|
||||
- type: entity
|
||||
name: box of .20 rifle (flash) magazines
|
||||
parent: BoxCardboard
|
||||
id: BoxMagazineRifleFlash
|
||||
description: A box full of .20 rifle (flash) magazines.
|
||||
components:
|
||||
- type: StorageFill
|
||||
contents:
|
||||
- id: MagazineRifleFlash
|
||||
amount: 6
|
||||
|
||||
- type: entity
|
||||
name: box of .20 rifle (high-velocity) magazines
|
||||
parent: BoxCardboard
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
spriteName: ammo
|
||||
startingInventory:
|
||||
MagazineBoxCaselessRifle: 3
|
||||
MagazineBoxCaselessRifleFlash: 3
|
||||
MagazineBoxCaselessRifleHighVelocity: 3
|
||||
MagazineBoxCaselessRiflePractice: 3
|
||||
MagazineBoxCaselessRifleRubber: 3
|
||||
@@ -15,19 +14,16 @@
|
||||
MagazineBoxLightRifleRubber: 3
|
||||
|
||||
MagazineBoxMagnum: 3
|
||||
MagazineBoxMagnumFlash: 3
|
||||
MagazineBoxMagnumHighVelocity: 3
|
||||
MagazineBoxMagnumPractice: 3
|
||||
MagazineBoxMagnumRubber: 3
|
||||
|
||||
MagazineBoxPistol: 3
|
||||
MagazineBoxPistolFlash: 3
|
||||
MagazineBoxPistolHighVelocity: 3
|
||||
MagazineBoxPistolPractice: 3
|
||||
MagazineBoxPistolRubber: 3
|
||||
|
||||
MagazineBoxRifle: 3
|
||||
MagazineBoxRifleFlash: 3
|
||||
MagazineBoxRifleHighVelocity: 3
|
||||
MagazineBoxRiflePractice: 3
|
||||
MagazineBoxRifleRubber: 3
|
||||
|
||||
@@ -1,28 +1,3 @@
|
||||
- type: damageType
|
||||
id: Blunt
|
||||
|
||||
- type: damageType
|
||||
id: Slash
|
||||
|
||||
- type: damageType
|
||||
id: Piercing
|
||||
|
||||
- type: damageType
|
||||
id: Heat
|
||||
|
||||
- type: damageType
|
||||
id: Shock
|
||||
|
||||
- type: damageType
|
||||
id: Cold
|
||||
|
||||
# Poison damage. Generally caused by various reagents being metabolised.
|
||||
- type: damageType
|
||||
id: Poison
|
||||
|
||||
- type: damageType
|
||||
id: Radiation
|
||||
|
||||
# Damage due to being unable to breathe.
|
||||
# Represents not enough oxygen (or equivalent) getting to the blood.
|
||||
# Usually healed automatically if entity can breathe
|
||||
@@ -34,9 +9,34 @@
|
||||
- type: damageType
|
||||
id: Bloodloss
|
||||
|
||||
- type: damageType
|
||||
id: Blunt
|
||||
|
||||
- type: damageType
|
||||
id: Cellular
|
||||
|
||||
- type: damageType
|
||||
id: Cold
|
||||
|
||||
- type: damageType
|
||||
id: Heat
|
||||
|
||||
- type: damageType
|
||||
id: Piercing
|
||||
|
||||
# Poison damage. Generally caused by various reagents being metabolised.
|
||||
- type: damageType
|
||||
id: Poison
|
||||
|
||||
- type: damageType
|
||||
id: Radiation
|
||||
|
||||
- type: damageType
|
||||
id: Shock
|
||||
|
||||
- type: damageType
|
||||
id: Slash
|
||||
|
||||
# Damage represent structures internal integrity.
|
||||
# Exclusive for structures such as walls, airlocks and others.
|
||||
- type: damageType
|
||||
|
||||
@@ -67,6 +67,7 @@
|
||||
types:
|
||||
Bloodloss:
|
||||
-0.25
|
||||
- type: Stamina
|
||||
- type: StatusEffects
|
||||
allowed:
|
||||
- Stun
|
||||
|
||||
@@ -100,21 +100,6 @@
|
||||
- state: mag-1
|
||||
map: ["enum.GunVisualLayers.Mag"]
|
||||
|
||||
- type: entity
|
||||
parent: BaseMagazineBoxCaselessRifle
|
||||
id: MagazineBoxCaselessRifleFlash
|
||||
name: ammunition box (.25 caseless flash)
|
||||
components:
|
||||
- type: BallisticAmmoProvider
|
||||
proto: CartridgeCaselessRifleFlash
|
||||
- type: Sprite
|
||||
layers:
|
||||
- state: base
|
||||
map: ["enum.GunVisualLayers.Base"]
|
||||
- state: mag-1
|
||||
map: ["enum.GunVisualLayers.Mag"]
|
||||
- state: flash
|
||||
|
||||
- type: entity
|
||||
parent: BaseMagazineBoxCaselessRifle
|
||||
id: MagazineBoxCaselessRifleHighVelocity
|
||||
|
||||
@@ -38,21 +38,6 @@
|
||||
- state: mag-1
|
||||
map: ["enum.GunVisualLayers.Mag"]
|
||||
|
||||
- type: entity
|
||||
parent: BaseMagazineBoxMagnum
|
||||
id: MagazineBoxMagnumFlash
|
||||
name: ammunition box (.40 magnum flash)
|
||||
components:
|
||||
- type: BallisticAmmoProvider
|
||||
proto: CartridgeMagnumFlash
|
||||
- type: Sprite
|
||||
layers:
|
||||
- state: base
|
||||
map: ["enum.GunVisualLayers.Base"]
|
||||
- state: mag-1
|
||||
map: ["enum.GunVisualLayers.Mag"]
|
||||
- state: flash
|
||||
|
||||
- type: entity
|
||||
parent: BaseMagazineBoxMagnum
|
||||
id: MagazineBoxMagnumHighVelocity
|
||||
|
||||
@@ -39,21 +39,6 @@
|
||||
- state: mag-1
|
||||
map: ["enum.GunVisualLayers.Mag"]
|
||||
|
||||
- type: entity
|
||||
parent: BaseMagazineBoxPistol
|
||||
id: MagazineBoxPistolFlash
|
||||
name: ammunition box (.35 auto flash)
|
||||
components:
|
||||
- type: BallisticAmmoProvider
|
||||
proto: CartridgePistolFlash
|
||||
- type: Sprite
|
||||
layers:
|
||||
- state: base
|
||||
map: ["enum.GunVisualLayers.Base"]
|
||||
- state: mag-1
|
||||
map: ["enum.GunVisualLayers.Mag"]
|
||||
- state: flash
|
||||
|
||||
- type: entity
|
||||
parent: BaseMagazineBoxPistol
|
||||
id: MagazineBoxPistolHighVelocity
|
||||
|
||||
@@ -79,21 +79,6 @@
|
||||
- state: mag-1
|
||||
map: ["enum.GunVisualLayers.Mag"]
|
||||
|
||||
- type: entity
|
||||
parent: BaseMagazineBoxRifle
|
||||
id: MagazineBoxRifleFlash
|
||||
name: ammunition box (.20 rifle flash)
|
||||
components:
|
||||
- type: BallisticAmmoProvider
|
||||
proto: CartridgeRifleFlash
|
||||
- type: Sprite
|
||||
layers:
|
||||
- state: base
|
||||
map: ["enum.GunVisualLayers.Base"]
|
||||
- state: mag-1
|
||||
map: ["enum.GunVisualLayers.Mag"]
|
||||
- state: flash
|
||||
|
||||
- type: entity
|
||||
parent: BaseMagazineBoxRifle
|
||||
id: MagazineBoxRifleHighVelocity
|
||||
|
||||
@@ -28,14 +28,6 @@
|
||||
- type: CartridgeAmmo
|
||||
proto: BulletCaselessRifle
|
||||
|
||||
- type: entity
|
||||
id: CartridgeCaselessRifleFlash
|
||||
name: cartridge (.25 caseless flash)
|
||||
parent: BaseCartridgeCaselessRifle
|
||||
components:
|
||||
- type: CartridgeAmmo
|
||||
proto: BulletCaselessRifleFlash
|
||||
|
||||
- type: entity
|
||||
id: CartridgeCaselessRifleHighVelocity
|
||||
name: cartridge (.25 caseless high-velocity)
|
||||
|
||||
@@ -27,14 +27,6 @@
|
||||
- type: CartridgeAmmo
|
||||
proto: BulletLightRifle
|
||||
|
||||
- type: entity
|
||||
id: CartridgeLightRifleFlash
|
||||
name: cartridge (.30 rifle flash)
|
||||
parent: BaseCartridgeLightRifle
|
||||
components:
|
||||
- type: CartridgeAmmo
|
||||
proto: BulletLightRifleFlash
|
||||
|
||||
- type: entity
|
||||
id: CartridgeLightRifleHighVelocity
|
||||
name: cartridge (.30 rifle high-velocity)
|
||||
|
||||
@@ -27,14 +27,6 @@
|
||||
- type: CartridgeAmmo
|
||||
proto: BulletMagnum
|
||||
|
||||
- type: entity
|
||||
id: CartridgeMagnumFlash
|
||||
name: cartridge (.40 magnum flash)
|
||||
parent: BaseCartridgeMagnum
|
||||
components:
|
||||
- type: CartridgeAmmo
|
||||
proto: BulletMagnumFlash
|
||||
|
||||
- type: entity
|
||||
id: CartridgeMagnumHighVelocity
|
||||
name: cartridge (.40 magnum high-velocity)
|
||||
|
||||
@@ -27,14 +27,6 @@
|
||||
- type: CartridgeAmmo
|
||||
proto: BulletPistol
|
||||
|
||||
- type: entity
|
||||
id: CartridgePistolFlash
|
||||
name: cartridge (.35 auto flash)
|
||||
parent: BaseCartridgePistol
|
||||
components:
|
||||
- type: CartridgeAmmo
|
||||
proto: BulletPistolFlash
|
||||
|
||||
- type: entity
|
||||
id: CartridgePistolHighVelocity
|
||||
name: cartridge (.35 auto high-velocity)
|
||||
|
||||
@@ -27,14 +27,6 @@
|
||||
- type: CartridgeAmmo
|
||||
proto: BulletRifle
|
||||
|
||||
- type: entity
|
||||
id: CartridgeRifleFlash
|
||||
name: cartridge (.20 rifle flash)
|
||||
parent: BaseCartridgeRifle
|
||||
components:
|
||||
- type: CartridgeAmmo
|
||||
proto: BulletRifleFlash
|
||||
|
||||
- type: entity
|
||||
id: CartridgeRifleHighVelocity
|
||||
name: cartridge (.20 rifle high-velocity)
|
||||
|
||||
@@ -80,20 +80,6 @@
|
||||
- type: CartridgeAmmo
|
||||
proto: PelletShotgun
|
||||
|
||||
- type: entity
|
||||
id: ShellShotgunFlash
|
||||
name: shell (.50 flash)
|
||||
parent: BaseShellShotgun
|
||||
components:
|
||||
- type: Sprite
|
||||
layers:
|
||||
- state: flash
|
||||
map: [ "enum.AmmoVisualLayers.Base" ]
|
||||
- type: CartridgeAmmo
|
||||
proto: PelletShotgunFlash
|
||||
- type: SpentAmmoVisuals
|
||||
state: "flash"
|
||||
|
||||
- type: entity
|
||||
id: ShellShotgunIncendiary
|
||||
name: shell (.50 incendiary)
|
||||
|
||||
@@ -112,8 +112,6 @@
|
||||
zeroVisible: false
|
||||
- type: Appearance
|
||||
|
||||
# No flash
|
||||
|
||||
- type: entity
|
||||
id: MagazinePistolCaselessRifleHighVelocity
|
||||
name: "pistol magazine (.25 caseless high-velocity)"
|
||||
@@ -245,21 +243,6 @@
|
||||
- state: mag-1
|
||||
map: ["enum.GunVisualLayers.Mag"]
|
||||
|
||||
- type: entity
|
||||
id: MagazineCaselessRifleShortFlash
|
||||
name: "short magazine (.25 caseless flash)"
|
||||
parent: BaseMagazineCaselessRifleShort
|
||||
components:
|
||||
- type: BallisticAmmoProvider
|
||||
proto: CartridgeCaselessRifleFlash
|
||||
capacity: 20
|
||||
- type: Sprite
|
||||
layers:
|
||||
- state: flash
|
||||
map: ["enum.GunVisualLayers.Base"]
|
||||
- state: mag-1
|
||||
map: ["enum.GunVisualLayers.Mag"]
|
||||
|
||||
- type: entity
|
||||
id: MagazineCaselessRifleShortHighVelocity
|
||||
name: "short magazine (.25 caseless high-velocity)"
|
||||
|
||||
@@ -68,20 +68,6 @@
|
||||
- state: mag-1
|
||||
map: ["enum.GunVisualLayers.Mag"]
|
||||
|
||||
- type: entity
|
||||
id: MagazineLightRifleFlash
|
||||
name: "magazine (.30 rifle flash)"
|
||||
parent: BaseMagazineLightRifle
|
||||
components:
|
||||
- type: BallisticAmmoProvider
|
||||
proto: CartridgeLightRifleFlash
|
||||
- type: Sprite
|
||||
layers:
|
||||
- state: flash
|
||||
map: ["enum.GunVisualLayers.Base"]
|
||||
- state: mag-1
|
||||
map: ["enum.GunVisualLayers.Mag"]
|
||||
|
||||
- type: entity
|
||||
id: MagazineLightRifleHighVelocity
|
||||
name: "magazine (.30 rifle high-velocity)"
|
||||
|
||||
@@ -78,20 +78,6 @@
|
||||
- state: mag-1
|
||||
map: ["enum.GunVisualLayers.Mag"]
|
||||
|
||||
- type: entity
|
||||
id: MagazineMagnumFlash
|
||||
name: "Lamia magazine (.40 magnum flash)"
|
||||
parent: BaseMagazineMagnum
|
||||
components:
|
||||
- type: BallisticAmmoProvider
|
||||
proto: CartridgeMagnumFlash
|
||||
- type: Sprite
|
||||
layers:
|
||||
- state: flash
|
||||
map: ["enum.GunVisualLayers.Base"]
|
||||
- state: mag-1
|
||||
map: ["enum.GunVisualLayers.Mag"]
|
||||
|
||||
- type: entity
|
||||
id: MagazineMagnumHighVelocity
|
||||
name: "Lamia magazine (.40 magnum high-velocity)"
|
||||
|
||||
@@ -159,20 +159,6 @@
|
||||
- state: mag-1
|
||||
map: ["enum.GunVisualLayers.Mag"]
|
||||
|
||||
- type: entity
|
||||
id: MagazinePistolFlash
|
||||
name: pistol magazine (.35 auto flash)
|
||||
parent: BaseMagazinePistol
|
||||
components:
|
||||
- type: BallisticAmmoProvider
|
||||
proto: CartridgePistolFlash
|
||||
- type: Sprite
|
||||
layers:
|
||||
- state: flash
|
||||
map: ["enum.GunVisualLayers.Base"]
|
||||
- state: mag-1
|
||||
map: ["enum.GunVisualLayers.Mag"]
|
||||
|
||||
- type: entity
|
||||
id: MagazinePistolHighVelocity
|
||||
name: pistol magazine (.35 auto high-velocity)
|
||||
@@ -291,20 +277,6 @@
|
||||
- state: mag-1
|
||||
map: ["enum.GunVisualLayers.Mag"]
|
||||
|
||||
- type: entity
|
||||
id: MagazinePistolSubMachineGunFlash
|
||||
name: SMG magazine (.35 auto flash)
|
||||
parent: BaseMagazinePistolSubMachineGun
|
||||
components:
|
||||
- type: BallisticAmmoProvider
|
||||
proto: CartridgePistolFlash
|
||||
- type: Sprite
|
||||
layers:
|
||||
- state: flash
|
||||
map: ["enum.GunVisualLayers.Base"]
|
||||
- state: mag-1
|
||||
map: ["enum.GunVisualLayers.Mag"]
|
||||
|
||||
- type: entity
|
||||
id: MagazinePistolSubMachineGunHighVelocity
|
||||
name: SMG magazine (.35 auto high-velocity)
|
||||
|
||||
@@ -47,20 +47,6 @@
|
||||
- state: mag-1
|
||||
map: ["enum.GunVisualLayers.Mag"]
|
||||
|
||||
- type: entity
|
||||
id: MagazineRifleFlash
|
||||
name: "magazine (.20 rifle flash)"
|
||||
parent: BaseMagazineRifle
|
||||
components:
|
||||
- type: BallisticAmmoProvider
|
||||
proto: CartridgeRifleFlash
|
||||
- type: Sprite
|
||||
layers:
|
||||
- state: flash
|
||||
map: ["enum.GunVisualLayers.Base"]
|
||||
- state: mag-1
|
||||
map: ["enum.GunVisualLayers.Mag"]
|
||||
|
||||
- type: entity
|
||||
id: MagazineRifleHighVelocity
|
||||
name: "magazine (.20 rifle high-velocity)"
|
||||
|
||||
@@ -9,17 +9,6 @@
|
||||
types:
|
||||
Piercing: 19
|
||||
|
||||
- type: entity
|
||||
id: BulletCaselessRifleFlash
|
||||
name: bullet (.25 caseless flash)
|
||||
parent: BaseBulletFlash
|
||||
noSpawn: true
|
||||
components:
|
||||
- type: Projectile
|
||||
damage:
|
||||
types:
|
||||
Blunt: 3
|
||||
|
||||
- type: entity
|
||||
id: BulletCaselessRifleHighVelocity
|
||||
name: bullet (.25 caseless high-velocity)
|
||||
|
||||
@@ -9,17 +9,6 @@
|
||||
types:
|
||||
Piercing: 19
|
||||
|
||||
- type: entity
|
||||
id: BulletLightRifleFlash
|
||||
name: bullet (.20 rifle flash)
|
||||
parent: BaseBulletFlash
|
||||
noSpawn: true
|
||||
components:
|
||||
- type: Projectile
|
||||
damage:
|
||||
types:
|
||||
Blunt: 3
|
||||
|
||||
- type: entity
|
||||
id: BulletLightRifleHighVelocity
|
||||
name: bullet (.20 rifle high-velocity)
|
||||
|
||||
@@ -9,17 +9,6 @@
|
||||
types:
|
||||
Piercing: 22
|
||||
|
||||
- type: entity
|
||||
id: BulletMagnumFlash
|
||||
name: bullet (.40 magnum flash)
|
||||
parent: BaseBulletFlash
|
||||
noSpawn: true
|
||||
components:
|
||||
- type: Projectile
|
||||
damage:
|
||||
types:
|
||||
Blunt: 3
|
||||
|
||||
- type: entity
|
||||
id: BulletMagnumHighVelocity
|
||||
name: bullet (.40 magnum high-velocity)
|
||||
|
||||
@@ -9,17 +9,6 @@
|
||||
types:
|
||||
Piercing: 16
|
||||
|
||||
- type: entity
|
||||
id: BulletPistolFlash
|
||||
name: bullet (.35 auto flash)
|
||||
parent: BaseBulletFlash
|
||||
noSpawn: true
|
||||
components:
|
||||
- type: Projectile
|
||||
damage:
|
||||
types:
|
||||
Blunt: 3
|
||||
|
||||
- type: entity
|
||||
id: BulletPistolHighVelocity
|
||||
name: bullet (.35 auto high-velocity)
|
||||
|
||||
@@ -9,17 +9,6 @@
|
||||
types:
|
||||
Piercing: 17
|
||||
|
||||
- type: entity
|
||||
id: BulletRifleFlash
|
||||
name: bullet (0.20 rifle flash)
|
||||
parent: BaseBulletFlash
|
||||
noSpawn: true
|
||||
components:
|
||||
- type: Projectile
|
||||
damage:
|
||||
types:
|
||||
Blunt: 3
|
||||
|
||||
- type: entity
|
||||
id: BulletRifleHighVelocity
|
||||
name: bullet (0.20 rifle high-velocity)
|
||||
|
||||
@@ -25,9 +25,8 @@
|
||||
damage:
|
||||
types:
|
||||
Blunt: 10
|
||||
- type: StunOnCollide
|
||||
stunAmount: 5
|
||||
knockdownAmount: 3
|
||||
- type: StaminaDamageOnCollide
|
||||
damage: 55
|
||||
|
||||
- type: entity
|
||||
id: PelletShotgun
|
||||
@@ -43,20 +42,6 @@
|
||||
types:
|
||||
Piercing: 5
|
||||
|
||||
- type: entity
|
||||
id: PelletShotgunFlash
|
||||
name: pellet (.50 flash)
|
||||
noSpawn: true
|
||||
parent: BaseBulletFlash
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi
|
||||
state: buckshot
|
||||
- type: Projectile
|
||||
damage:
|
||||
types:
|
||||
Blunt: 2
|
||||
|
||||
- type: entity
|
||||
id: PelletShotgunIncendiary
|
||||
name: pellet (.50 incendiary)
|
||||
|
||||
@@ -32,26 +32,6 @@
|
||||
zeroVisible: false
|
||||
- type: Appearance
|
||||
|
||||
- type: entity
|
||||
id: SpeedLoaderMagnumFlash
|
||||
name: "speed loader (.40 magnum flash)"
|
||||
parent: BaseSpeedLoaderMagnum
|
||||
components:
|
||||
- type: BallisticAmmoProvider
|
||||
proto: CartridgeMagnumFlash
|
||||
- type: Sprite
|
||||
sprite: Objects/Weapons/Guns/Ammunition/SpeedLoaders/Magnum/magnum_speed_loader.rsi
|
||||
layers:
|
||||
- state: base
|
||||
map: [ "enum.GunVisualLayers.Base" ]
|
||||
- state: flash-6
|
||||
map: [ "enum.GunVisualLayers.Mag" ]
|
||||
- type: MagazineVisuals
|
||||
magState: flash
|
||||
steps: 7
|
||||
zeroVisible: false
|
||||
- type: Appearance
|
||||
|
||||
- type: entity
|
||||
id: SpeedLoaderMagnumHighVelocity
|
||||
name: "speed loader (.40 magnum high-velocity)"
|
||||
|
||||
@@ -32,25 +32,6 @@
|
||||
zeroVisible: false
|
||||
- type: Appearance
|
||||
|
||||
- type: entity
|
||||
id: SpeedLoaderPistolFlash
|
||||
name: "speed loader (.35 auto flash)"
|
||||
parent: BaseSpeedLoaderPistol
|
||||
components:
|
||||
- type: BallisticAmmoProvider
|
||||
proto: CartridgePistolFlash
|
||||
- type: Sprite
|
||||
layers:
|
||||
- state: base
|
||||
map: ["enum.GunVisualLayers.Base"]
|
||||
- state: flash-6
|
||||
map: ["enum.GunVisualLayers.Mag"]
|
||||
- type: MagazineVisuals
|
||||
magState: flash
|
||||
steps: 7
|
||||
zeroVisible: false
|
||||
- type: Appearance
|
||||
|
||||
- type: entity
|
||||
id: SpeedLoaderPistolHighVelocity
|
||||
name: "speed loader (.35 auto high-velocity)"
|
||||
|
||||
@@ -246,11 +246,49 @@
|
||||
zeroVisible: true
|
||||
- type: Appearance
|
||||
|
||||
- type: entity
|
||||
name: disabler
|
||||
parent: BaseWeaponBattery
|
||||
id: WeaponDisabler
|
||||
description: A self-defense weapon that exhausts organic targets, weakening them until they collapse.
|
||||
components:
|
||||
- type: Tag
|
||||
tags:
|
||||
- Taser
|
||||
- type: Sprite
|
||||
sprite: Objects/Weapons/Guns/Battery/disabler.rsi
|
||||
layers:
|
||||
- state: base
|
||||
map: ["enum.GunVisualLayers.Base"]
|
||||
- state: mag-unshaded-0
|
||||
map: ["enum.GunVisualLayers.MagUnshaded"]
|
||||
shader: unshaded
|
||||
- type: Clothing
|
||||
sprite: Objects/Weapons/Guns/Battery/disabler.rsi
|
||||
size: 10
|
||||
quickEquip: false
|
||||
Slots:
|
||||
- Belt
|
||||
- type: Gun
|
||||
fireRate: 2
|
||||
soundGunshot:
|
||||
path: /Audio/Weapons/Guns/Gunshots/taser2.ogg
|
||||
- type: ProjectileBatteryAmmoProvider
|
||||
proto: BulletDisabler
|
||||
fireCost: 50
|
||||
- type: MagazineVisuals
|
||||
magState: mag
|
||||
steps: 5
|
||||
zeroVisible: true
|
||||
- type: Appearance
|
||||
|
||||
- type: entity
|
||||
name: taser
|
||||
parent: BaseWeaponBattery
|
||||
id: WeaponTaser
|
||||
description: A low-capacity, energy-based stun gun used by security teams to subdue targets at range.
|
||||
# Use Disabler
|
||||
suffix: Obsolete
|
||||
components:
|
||||
- type: Tag
|
||||
tags:
|
||||
@@ -274,11 +312,8 @@
|
||||
soundGunshot:
|
||||
path: /Audio/Weapons/Guns/Gunshots/taser.ogg
|
||||
- type: ProjectileBatteryAmmoProvider
|
||||
proto: BulletTaser
|
||||
proto: BulletDisabler
|
||||
fireCost: 50
|
||||
- type: Battery
|
||||
maxCharge: 100
|
||||
startingCharge: 100
|
||||
- type: MagazineVisuals
|
||||
magState: mag
|
||||
steps: 5
|
||||
|
||||
@@ -42,21 +42,6 @@
|
||||
sprite: Objects/Weapons/Guns/Projectiles/projectiles.rsi
|
||||
state: impact_laser
|
||||
|
||||
- type: hitscan
|
||||
id: OmniLaser
|
||||
damage:
|
||||
types:
|
||||
Heat: 21
|
||||
muzzleFlash:
|
||||
sprite: Objects/Weapons/Guns/Projectiles/projectiles.rsi
|
||||
state: muzzle_omni
|
||||
travelFlash:
|
||||
sprite: Objects/Weapons/Guns/Projectiles/projectiles.rsi
|
||||
state: beam_omni
|
||||
impactFlash:
|
||||
sprite: Objects/Weapons/Guns/Projectiles/projectiles.rsi
|
||||
state: impact_omni
|
||||
|
||||
- type: hitscan
|
||||
id: XrayLaser
|
||||
damage:
|
||||
|
||||
@@ -57,21 +57,6 @@
|
||||
- Impassable
|
||||
- BulletImpassable
|
||||
|
||||
- type: entity
|
||||
id: BaseBulletFlash
|
||||
name: base bullet flash
|
||||
parent: BaseBulletTrigger
|
||||
noSpawn: true
|
||||
components:
|
||||
- type: Projectile
|
||||
soundHit:
|
||||
path: /Audio/Weapons/Guns/Hits/snap.ogg
|
||||
- type: FlashOnTrigger
|
||||
range: 1
|
||||
- type: EmitSoundOnTrigger
|
||||
sound:
|
||||
path: "/Audio/Effects/flash_bang.ogg"
|
||||
|
||||
- type: entity
|
||||
id: BaseBulletHighVelocity
|
||||
name: base bullet high-velocity
|
||||
@@ -106,14 +91,13 @@
|
||||
Blunt: 3
|
||||
soundHit:
|
||||
path: /Audio/Weapons/Guns/Hits/snap.ogg
|
||||
- type: StunOnCollide
|
||||
stunAmount: 2
|
||||
knockdownAmount: 2
|
||||
- type: StaminaDamageOnCollide
|
||||
damage: 15
|
||||
|
||||
# Energy projectiles
|
||||
- type: entity
|
||||
name : taser bolt
|
||||
id: BulletTaser
|
||||
name : disabler bolt
|
||||
id: BulletDisabler
|
||||
parent: BaseBullet
|
||||
noSpawn: true
|
||||
components:
|
||||
@@ -123,24 +107,24 @@
|
||||
params:
|
||||
volume: 5
|
||||
- type: Sprite
|
||||
noRot: true
|
||||
sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi
|
||||
color: "#ffff33"
|
||||
sprite: Objects/Weapons/Guns/Projectiles/projectiles_tg.rsi
|
||||
layers:
|
||||
- state: spark
|
||||
- state: omnilaser
|
||||
shader: unshaded
|
||||
- type: Physics
|
||||
- type: Fixtures
|
||||
fixtures:
|
||||
- shape:
|
||||
!type:PhysShapeAabb
|
||||
bounds: "-0.2,-0.2,0.2,0.2"
|
||||
bounds: "-0.15,-0.3,0.15,0.3"
|
||||
hard: false
|
||||
id: projectile
|
||||
mask:
|
||||
- Impassable
|
||||
- BulletImpassable
|
||||
- type: Ammo
|
||||
- type: StaminaDamageOnCollide
|
||||
damage: 55
|
||||
- type: Projectile
|
||||
damage:
|
||||
types:
|
||||
@@ -148,9 +132,6 @@
|
||||
soundHit:
|
||||
path: "/Audio/Weapons/Guns/Hits/taser_hit.ogg"
|
||||
soundForce: true
|
||||
- type: StunOnCollide
|
||||
stunAmount: 5
|
||||
knockdownAmount: 5
|
||||
|
||||
- type: entity
|
||||
name: emitter bolt
|
||||
@@ -246,9 +227,8 @@
|
||||
Blunt: 1
|
||||
soundHit:
|
||||
path: /Audio/Effects/gen_hit.ogg
|
||||
- type: StunOnCollide
|
||||
stunAmount: 8
|
||||
knockdownAmount: 8
|
||||
- type: StaminaDamageOnCollide
|
||||
damage: 80
|
||||
|
||||
- type: entity
|
||||
id: BulletGrenadeBlast
|
||||
@@ -269,7 +249,7 @@
|
||||
- type: entity
|
||||
id: BulletGrenadeFlash
|
||||
name: flash grenade
|
||||
parent: BaseBulletFlash
|
||||
parent: BaseBulletTrigger
|
||||
noSpawn: true
|
||||
components:
|
||||
- type: Sprite
|
||||
|
||||
@@ -13,9 +13,8 @@
|
||||
sound: /Audio/Weapons/bolathrow.ogg
|
||||
- type: EmitSoundOnLand
|
||||
sound: /Audio/Effects/snap.ogg
|
||||
- type: StunOnCollide
|
||||
stunAmount: 1
|
||||
knockdownAmount: 3
|
||||
- type: StaminaDamageOnCollide
|
||||
damage: 80
|
||||
- type: Construction
|
||||
graph: Bola
|
||||
node: bola
|
||||
|
||||
@@ -16,8 +16,10 @@
|
||||
range: 1.5
|
||||
arcwidth: 60
|
||||
arc: default
|
||||
- type: UseDelay
|
||||
delay: 4
|
||||
cooldownTime: 1.5
|
||||
arcCooldownTime: 1.5
|
||||
- type: StaminaDamageOnHit
|
||||
damage: 55
|
||||
- type: Battery
|
||||
maxCharge: 1000
|
||||
startingCharge: 1000
|
||||
@@ -50,7 +52,7 @@
|
||||
arcWidth: 10
|
||||
arc: default
|
||||
- type: Item
|
||||
size: 2
|
||||
size: 5
|
||||
sprite: Objects/Weapons/Melee/flash.rsi
|
||||
- type: ItemCooldown
|
||||
|
||||
|
||||
@@ -170,14 +170,3 @@
|
||||
Plastic: 15
|
||||
Steel: 10
|
||||
Glass: 5
|
||||
|
||||
- type: latheRecipe
|
||||
id: ShellShotgunFlash
|
||||
icon:
|
||||
sprite: Objects/Weapons/Guns/Ammunition/Casings/shotgun_shell.rsi
|
||||
state: flash
|
||||
result: ShellShotgunFlash
|
||||
completetime: 2
|
||||
materials:
|
||||
Plastic: 20
|
||||
Steel: 5
|
||||
|
||||
124
Resources/Textures/Interface/Alerts/stamina.rsi/meta.json
Normal file
@@ -0,0 +1,124 @@
|
||||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-SA-3.0",
|
||||
"copyright": "taken from tg station at commit https://github.com/tgstation/tgstation/blob/832ae532766d491d91db53746d15b4b55be3f2b0",
|
||||
"size": {
|
||||
"x": 32,
|
||||
"y": 32
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "stamina6",
|
||||
"delays": [
|
||||
[
|
||||
0.5,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.5
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stamina5",
|
||||
"delays": [
|
||||
[
|
||||
0.5,
|
||||
0.2,
|
||||
0.2,
|
||||
0.2,
|
||||
0.2,
|
||||
0.5
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stamina4",
|
||||
"delays": [
|
||||
[
|
||||
0.3,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.3
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stamina3",
|
||||
"delays": [
|
||||
[
|
||||
0.3,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.3
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stamina2",
|
||||
"delays": [
|
||||
[
|
||||
0.3,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.3
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stamina1",
|
||||
"delays": [
|
||||
[
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stamina0",
|
||||
"delays": [
|
||||
[
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1,
|
||||
0.1
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
BIN
Resources/Textures/Interface/Alerts/stamina.rsi/stamina0.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
Resources/Textures/Interface/Alerts/stamina.rsi/stamina1.png
Normal file
|
After Width: | Height: | Size: 701 B |
BIN
Resources/Textures/Interface/Alerts/stamina.rsi/stamina2.png
Normal file
|
After Width: | Height: | Size: 1003 B |
BIN
Resources/Textures/Interface/Alerts/stamina.rsi/stamina3.png
Normal file
|
After Width: | Height: | Size: 912 B |
BIN
Resources/Textures/Interface/Alerts/stamina.rsi/stamina4.png
Normal file
|
After Width: | Height: | Size: 795 B |
BIN
Resources/Textures/Interface/Alerts/stamina.rsi/stamina5.png
Normal file
|
After Width: | Height: | Size: 704 B |
BIN
Resources/Textures/Interface/Alerts/stamina.rsi/stamina6.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 304 B |
@@ -25,9 +25,6 @@
|
||||
{
|
||||
"name": "mag10-1"
|
||||
},
|
||||
{
|
||||
"name": "flash"
|
||||
},
|
||||
{
|
||||
"name": "hv"
|
||||
},
|
||||
|
||||
|
Before Width: | Height: | Size: 136 B |
@@ -13,9 +13,6 @@
|
||||
{
|
||||
"name": "mag-1"
|
||||
},
|
||||
{
|
||||
"name": "flash"
|
||||
},
|
||||
{
|
||||
"name": "hv"
|
||||
},
|
||||
|
||||
|
Before Width: | Height: | Size: 312 B |
@@ -13,9 +13,6 @@
|
||||
{
|
||||
"name": "mag-1"
|
||||
},
|
||||
{
|
||||
"name": "flash"
|
||||
},
|
||||
{
|
||||
"name": "hv"
|
||||
},
|
||||
|
||||
|
Before Width: | Height: | Size: 318 B |
@@ -19,9 +19,6 @@
|
||||
{
|
||||
"name": "magb-1"
|
||||
},
|
||||
{
|
||||
"name": "flash"
|
||||
},
|
||||
{
|
||||
"name": "hv"
|
||||
},
|
||||
|
||||
|
Before Width: | Height: | Size: 352 B |
|
Before Width: | Height: | Size: 332 B |
@@ -31,12 +31,6 @@
|
||||
{
|
||||
"name": "flare-spent"
|
||||
},
|
||||
{
|
||||
"name": "flash"
|
||||
},
|
||||
{
|
||||
"name": "flash-spent"
|
||||
},
|
||||
{
|
||||
"name": "incendiary"
|
||||
},
|
||||
|
||||
|
Before Width: | Height: | Size: 358 B |
@@ -10,9 +10,6 @@
|
||||
{
|
||||
"name": "base"
|
||||
},
|
||||
{
|
||||
"name": "flash"
|
||||
},
|
||||
{
|
||||
"name": "high_velocity"
|
||||
},
|
||||
|
||||
|
Before Width: | Height: | Size: 369 B |
@@ -10,9 +10,6 @@
|
||||
{
|
||||
"name": "base"
|
||||
},
|
||||
{
|
||||
"name": "flash"
|
||||
},
|
||||
{
|
||||
"name": "high_velocity"
|
||||
},
|
||||
|
||||
|
Before Width: | Height: | Size: 403 B |
@@ -10,9 +10,6 @@
|
||||
{
|
||||
"name": "base"
|
||||
},
|
||||
{
|
||||
"name": "flash"
|
||||
},
|
||||
{
|
||||
"name": "high_velocity"
|
||||
},
|
||||
|
||||
|
Before Width: | Height: | Size: 404 B |
@@ -10,9 +10,6 @@
|
||||
{
|
||||
"name": "base"
|
||||
},
|
||||
{
|
||||
"name": "flash"
|
||||
},
|
||||
{
|
||||
"name": "high_velocity"
|
||||
},
|
||||
|
||||
|
Before Width: | Height: | Size: 364 B |
@@ -10,9 +10,6 @@
|
||||
{
|
||||
"name": "base"
|
||||
},
|
||||
{
|
||||
"name": "flash"
|
||||
},
|
||||
{
|
||||
"name": "high_velocity"
|
||||
},
|
||||
|
||||
|
Before Width: | Height: | Size: 286 B |
@@ -10,9 +10,6 @@
|
||||
{
|
||||
"name": "base"
|
||||
},
|
||||
{
|
||||
"name": "flash"
|
||||
},
|
||||
{
|
||||
"name": "high_velocity"
|
||||
},
|
||||
|
||||
|
Before Width: | Height: | Size: 333 B |
@@ -10,9 +10,6 @@
|
||||
{
|
||||
"name": "base"
|
||||
},
|
||||
{
|
||||
"name": "flash"
|
||||
},
|
||||
{
|
||||
"name": "high_velocity"
|
||||
},
|
||||
|
||||
|
Before Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 2.5 KiB |
@@ -28,24 +28,6 @@
|
||||
{
|
||||
"name": "base-6"
|
||||
},
|
||||
{
|
||||
"name": "flash-1"
|
||||
},
|
||||
{
|
||||
"name": "flash-2"
|
||||
},
|
||||
{
|
||||
"name": "flash-3"
|
||||
},
|
||||
{
|
||||
"name": "flash-4"
|
||||
},
|
||||
{
|
||||
"name": "flash-5"
|
||||
},
|
||||
{
|
||||
"name": "flash-6"
|
||||
},
|
||||
{
|
||||
"name": "high-velocity-1"
|
||||
},
|
||||
|
||||