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();
|
base.Initialize();
|
||||||
SubscribeLocalEvent<FlashComponent, MeleeHitEvent>(OnFlashMeleeHit);
|
SubscribeLocalEvent<FlashComponent, MeleeHitEvent>(OnFlashMeleeHit);
|
||||||
SubscribeLocalEvent<FlashComponent, UseInHandEvent>(OnFlashUseInHand);
|
|
||||||
SubscribeLocalEvent<FlashComponent, ExaminedEvent>(OnFlashExamined);
|
SubscribeLocalEvent<FlashComponent, ExaminedEvent>(OnFlashExamined);
|
||||||
|
|
||||||
SubscribeLocalEvent<InventoryComponent, FlashAttemptEvent>(OnInventoryFlashAttempt);
|
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)
|
private bool UseFlash(FlashComponent comp, EntityUid user)
|
||||||
{
|
{
|
||||||
if (comp.HasUses)
|
if (comp.HasUses)
|
||||||
@@ -121,39 +110,40 @@ namespace Content.Server.Flash
|
|||||||
return false;
|
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);
|
var attempt = new FlashAttemptEvent(target, user, used);
|
||||||
RaiseLocalEvent(target, attempt, true);
|
RaiseLocalEvent(target, attempt, true);
|
||||||
|
|
||||||
if (attempt.Cancelled)
|
if (attempt.Cancelled)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (EntityManager.TryGetComponent<FlashableComponent>(target, out var flashable))
|
flashable.LastFlash = _gameTiming.CurTime;
|
||||||
|
flashable.Duration = flashDuration / 1000f; // TODO: Make this sane...
|
||||||
|
Dirty(flashable);
|
||||||
|
|
||||||
|
_stunSystem.TrySlowdown(target, TimeSpan.FromSeconds(flashDuration/1000f), true,
|
||||||
|
slowTo, slowTo);
|
||||||
|
|
||||||
|
if (displayPopup && user != null && target != user && EntityManager.EntityExists(user.Value))
|
||||||
{
|
{
|
||||||
flashable.LastFlash = _gameTiming.CurTime;
|
user.Value.PopupMessage(target, Loc.GetString("flash-component-user-blinds-you",
|
||||||
flashable.Duration = flashDuration / 1000f; // TODO: Make this sane...
|
("user", user.Value)));
|
||||||
Dirty(flashable);
|
|
||||||
|
|
||||||
_stunSystem.TrySlowdown(target, TimeSpan.FromSeconds(flashDuration/1000f), true,
|
|
||||||
slowTo, slowTo);
|
|
||||||
|
|
||||||
if (displayPopup && user != null && target != user && EntityManager.EntityExists(user.Value))
|
|
||||||
{
|
|
||||||
user.Value.PopupMessage(target, Loc.GetString("flash-component-user-blinds-you",
|
|
||||||
("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 transform = EntityManager.GetComponent<TransformComponent>(source);
|
||||||
|
var mapPosition = transform.MapPosition;
|
||||||
var flashableEntities = new List<EntityUid>();
|
var flashableEntities = new List<EntityUid>();
|
||||||
|
var flashableQuery = GetEntityQuery<FlashableComponent>();
|
||||||
|
|
||||||
foreach (var entity in _entityLookup.GetEntitiesInRange(transform.Coordinates, range))
|
foreach (var entity in _entityLookup.GetEntitiesInRange(transform.Coordinates, range))
|
||||||
{
|
{
|
||||||
if (!EntityManager.HasComponent<FlashableComponent>(entity))
|
if (!flashableQuery.HasComponent(entity))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
flashableEntities.Add(entity);
|
flashableEntities.Add(entity);
|
||||||
@@ -162,14 +152,15 @@ namespace Content.Server.Flash
|
|||||||
foreach (var entity in flashableEntities)
|
foreach (var entity in flashableEntities)
|
||||||
{
|
{
|
||||||
// Check for unobstructed entities while ignoring the mobs with flashable components.
|
// 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;
|
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)
|
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.Sound;
|
||||||
using Content.Shared.Timing;
|
using Content.Shared.Timing;
|
||||||
|
|
||||||
@@ -8,21 +9,6 @@ namespace Content.Server.Stunnable.Components
|
|||||||
{
|
{
|
||||||
public bool Activated = false;
|
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)]
|
[ViewVariables(VVAccess.ReadWrite)]
|
||||||
[DataField("energyPerUse")]
|
[DataField("energyPerUse")]
|
||||||
public float EnergyPerUse { get; set; } = 350;
|
public float EnergyPerUse { get; set; } = 350;
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using Content.Server.Damage.Components;
|
||||||
|
using Content.Server.Damage.Events;
|
||||||
using Content.Server.Power.Components;
|
using Content.Server.Power.Components;
|
||||||
using Content.Server.Power.Events;
|
using Content.Server.Power.Events;
|
||||||
using Content.Server.Speech.EntitySystems;
|
using Content.Server.Speech.EntitySystems;
|
||||||
using Content.Server.Stunnable.Components;
|
using Content.Server.Stunnable.Components;
|
||||||
using Content.Server.Weapon.Melee;
|
using Content.Server.Weapon.Melee;
|
||||||
using Content.Server.Weapon.Melee.Components;
|
|
||||||
using Content.Shared.Audio;
|
using Content.Shared.Audio;
|
||||||
using Content.Shared.Examine;
|
using Content.Shared.Examine;
|
||||||
using Content.Shared.Interaction.Events;
|
using Content.Shared.Interaction.Events;
|
||||||
@@ -12,55 +13,48 @@ using Content.Shared.Item;
|
|||||||
using Content.Shared.Jittering;
|
using Content.Shared.Jittering;
|
||||||
using Content.Shared.Popups;
|
using Content.Shared.Popups;
|
||||||
using Content.Shared.StatusEffect;
|
using Content.Shared.StatusEffect;
|
||||||
using Content.Shared.Stunnable;
|
|
||||||
using Content.Shared.Throwing;
|
using Content.Shared.Throwing;
|
||||||
using Content.Shared.Timing;
|
|
||||||
using Robust.Server.GameObjects;
|
using Robust.Server.GameObjects;
|
||||||
using Robust.Shared.Audio;
|
using Robust.Shared.Audio;
|
||||||
using Robust.Shared.Player;
|
using Robust.Shared.Player;
|
||||||
using Robust.Shared.Random;
|
using Robust.Shared.Random;
|
||||||
using Robust.Shared.Timing;
|
|
||||||
|
|
||||||
namespace Content.Server.Stunnable
|
namespace Content.Server.Stunnable.Systems
|
||||||
{
|
{
|
||||||
public sealed class StunbatonSystem : EntitySystem
|
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()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
base.Initialize();
|
base.Initialize();
|
||||||
|
|
||||||
SubscribeLocalEvent<StunbatonComponent, MeleeHitEvent>(OnMeleeHit);
|
|
||||||
SubscribeLocalEvent<StunbatonComponent, UseInHandEvent>(OnUseInHand);
|
SubscribeLocalEvent<StunbatonComponent, UseInHandEvent>(OnUseInHand);
|
||||||
SubscribeLocalEvent<StunbatonComponent, ThrowDoHitEvent>(OnThrowCollide);
|
|
||||||
SubscribeLocalEvent<StunbatonComponent, ExaminedEvent>(OnExamined);
|
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))
|
if (!component.Activated) return;
|
||||||
return;
|
|
||||||
|
|
||||||
if (!TryComp<BatteryComponent>(uid, out var battery) || !battery.TryUseCharge(comp.EnergyPerUse))
|
// Don't apply damage if it's activated; just do stamina damage.
|
||||||
return;
|
args.BonusDamage -= args.BaseDamage;
|
||||||
|
}
|
||||||
|
|
||||||
foreach (var entity in args.HitEntities)
|
private void OnStaminaHitAttempt(EntityUid uid, StunbatonComponent component, ref StaminaDamageOnHitAttemptEvent args)
|
||||||
|
{
|
||||||
|
if (!component.Activated ||
|
||||||
|
!TryComp<BatteryComponent>(uid, out var battery) || !battery.TryUseCharge(component.EnergyPerUse))
|
||||||
{
|
{
|
||||||
StunEntity(entity, comp);
|
args.Cancelled = true;
|
||||||
SendPowerPulse(entity, args.User, uid);
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_melee.SetAttackCooldown(uid, _timing.CurTime + comp.ActiveDelay);
|
if (battery.CurrentCharge < component.EnergyPerUse)
|
||||||
_useDelay.BeginDelay(uid);
|
{
|
||||||
// No combat should occur if we successfully stunned.
|
SoundSystem.Play(component.SparksSound.GetSound(), Filter.Pvs(component.Owner, entityManager: EntityManager), uid, AudioHelpers.WithVariation(0.25f));
|
||||||
args.Handled = true;
|
TurnOff(component);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnUseInHand(EntityUid uid, StunbatonComponent comp, UseInHandEvent args)
|
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)
|
private void OnExamined(EntityUid uid, StunbatonComponent comp, ExaminedEvent args)
|
||||||
{
|
{
|
||||||
var msg = comp.Activated
|
var msg = comp.Activated
|
||||||
@@ -101,24 +80,6 @@ namespace Content.Server.Stunnable
|
|||||||
("charge", (int)((battery.CurrentCharge/battery.MaxCharge) * 100))));
|
("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)
|
private void TurnOff(StunbatonComponent comp)
|
||||||
{
|
{
|
||||||
if (!comp.Activated)
|
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));
|
SoundSystem.Play(comp.SparksSound.GetSound(), Filter.Pvs(comp.Owner), comp.Owner, AudioHelpers.WithVariation(0.25f));
|
||||||
|
|
||||||
comp.Activated = false;
|
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)
|
private void TurnOn(StunbatonComponent comp, EntityUid user)
|
||||||
@@ -147,13 +103,6 @@ namespace Content.Server.Stunnable
|
|||||||
if (comp.Activated)
|
if (comp.Activated)
|
||||||
return;
|
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);
|
var playerFilter = Filter.Pvs(comp.Owner, entityManager: EntityManager);
|
||||||
if (!TryComp<BatteryComponent>(comp.Owner, out var battery) || battery.CurrentCharge < comp.EnergyPerUse)
|
if (!TryComp<BatteryComponent>(comp.Owner, out var battery) || battery.CurrentCharge < comp.EnergyPerUse)
|
||||||
{
|
{
|
||||||
@@ -162,14 +111,15 @@ namespace Content.Server.Stunnable
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SoundSystem.Play(comp.SparksSound.GetSound(), playerFilter, comp.Owner, AudioHelpers.WithVariation(0.25f));
|
if (EntityManager.TryGetComponent<SpriteComponent?>(comp.Owner, out var sprite) &&
|
||||||
|
EntityManager.TryGetComponent<SharedItemComponent?>(comp.Owner, out var item))
|
||||||
comp.Activated = true;
|
|
||||||
if (TryComp<UseDelayComponent>(comp.Owner, out var useDelay))
|
|
||||||
{
|
{
|
||||||
comp.OldDelay = useDelay.Delay;
|
item.EquippedPrefix = "on";
|
||||||
useDelay.Delay = comp.ActiveDelay;
|
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)
|
private void SendPowerPulse(EntityUid target, EntityUid? user, EntityUid used)
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using Content.Server.Damage.Systems;
|
||||||
using Content.Server.Projectiles.Components;
|
using Content.Server.Projectiles.Components;
|
||||||
using Content.Server.Weapon.Melee;
|
using Content.Server.Weapon.Melee;
|
||||||
using Content.Server.Weapon.Ranged.Components;
|
using Content.Server.Weapon.Ranged.Components;
|
||||||
@@ -24,6 +25,7 @@ namespace Content.Server.Weapon.Ranged.Systems;
|
|||||||
public sealed partial class GunSystem : SharedGunSystem
|
public sealed partial class GunSystem : SharedGunSystem
|
||||||
{
|
{
|
||||||
[Dependency] private readonly EffectSystem _effects = default!;
|
[Dependency] private readonly EffectSystem _effects = default!;
|
||||||
|
[Dependency] private readonly StaminaSystem _stamina = default!;
|
||||||
|
|
||||||
public const float DamagePitchVariation = MeleeWeaponSystem.DamagePitchVariation;
|
public const float DamagePitchVariation = MeleeWeaponSystem.DamagePitchVariation;
|
||||||
|
|
||||||
@@ -116,6 +118,9 @@ public sealed partial class GunSystem : SharedGunSystem
|
|||||||
var distance = result.Distance;
|
var distance = result.Distance;
|
||||||
FireEffects(fromCoordinates, distance, entityDirection.ToAngle(), hitscan, result.HitEntity);
|
FireEffects(fromCoordinates, distance, entityDirection.ToAngle(), hitscan, result.HitEntity);
|
||||||
|
|
||||||
|
if (hitscan.StaminaDamage > 0f)
|
||||||
|
_stamina.TakeStaminaDamage(result.HitEntity, hitscan.StaminaDamage);
|
||||||
|
|
||||||
var dmg = hitscan.Damage;
|
var dmg = hitscan.Damage;
|
||||||
|
|
||||||
if (dmg != null)
|
if (dmg != null)
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ public enum AlertCategory
|
|||||||
Breathing,
|
Breathing,
|
||||||
Buckled,
|
Buckled,
|
||||||
Health,
|
Health,
|
||||||
|
Stamina,
|
||||||
Piloting,
|
Piloting,
|
||||||
Hunger,
|
Hunger,
|
||||||
Thirst,
|
Thirst,
|
||||||
|
|||||||
@@ -28,6 +28,7 @@
|
|||||||
Overhydrated,
|
Overhydrated,
|
||||||
Thirsty,
|
Thirsty,
|
||||||
Parched,
|
Parched,
|
||||||
|
Stamina,
|
||||||
Pulled,
|
Pulled,
|
||||||
Pulling,
|
Pulling,
|
||||||
Magboots,
|
Magboots,
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ public abstract class AlertsSystem : EntitySystem
|
|||||||
|
|
||||||
AfterShowAlert(alertsComponent);
|
AfterShowAlert(alertsComponent);
|
||||||
|
|
||||||
alertsComponent.Dirty();
|
Dirty(alertsComponent);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ namespace Content.Shared.StatusEffect
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// A list of status effect IDs to be allowed
|
/// A list of status effect IDs to be allowed
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[DataField("allowed", required: true)]
|
[DataField("allowed", required: true), Access(typeof(StatusEffectsSystem), Other = AccessPermissions.ReadExecute)]
|
||||||
public List<string> AllowedEffects = default!;
|
public List<string> AllowedEffects = default!;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,9 @@ public sealed class HitscanPrototype : IPrototype, IShootable
|
|||||||
[IdDataFieldAttribute]
|
[IdDataFieldAttribute]
|
||||||
public string ID { get; } = default!;
|
public string ID { get; } = default!;
|
||||||
|
|
||||||
|
[ViewVariables(VVAccess.ReadWrite), DataField("staminaDamage")]
|
||||||
|
public float StaminaDamage;
|
||||||
|
|
||||||
[ViewVariables(VVAccess.ReadWrite), DataField("damage")]
|
[ViewVariables(VVAccess.ReadWrite), DataField("damage")]
|
||||||
public DamageSpecifier? 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
|
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
|
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
|
### Stunbaton component
|
||||||
|
|
||||||
|
comp-stunbaton-stun = Stunned
|
||||||
|
|
||||||
## Used when examining the stunbaton
|
## Used when examining the stunbaton
|
||||||
|
|
||||||
comp-stunbaton-examined-on = The light is currently [color=darkgreen]on[/color].
|
comp-stunbaton-examined-on = The light is currently [color=darkgreen]on[/color].
|
||||||
|
|||||||
@@ -41157,23 +41157,6 @@ entities:
|
|||||||
pos: 13.5,-38.5
|
pos: 13.5,-38.5
|
||||||
parent: 60
|
parent: 60
|
||||||
type: Transform
|
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
|
- uid: 2179
|
||||||
type: ShellShotgunBeanbag
|
type: ShellShotgunBeanbag
|
||||||
components:
|
components:
|
||||||
|
|||||||
@@ -27317,30 +27317,6 @@ entities:
|
|||||||
type: Transform
|
type: Transform
|
||||||
- canCollide: False
|
- canCollide: False
|
||||||
type: Physics
|
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
|
- uid: 683
|
||||||
type: ClothingEyesGlassesSunglasses
|
type: ClothingEyesGlassesSunglasses
|
||||||
components:
|
components:
|
||||||
|
|||||||
@@ -74639,14 +74639,6 @@ entities:
|
|||||||
- pos: 11.5,13.5
|
- pos: 11.5,13.5
|
||||||
parent: 130
|
parent: 130
|
||||||
type: Transform
|
type: Transform
|
||||||
- uid: 7568
|
|
||||||
type: ShellShotgunFlash
|
|
||||||
components:
|
|
||||||
- pos: 1.4405079,19.67595
|
|
||||||
parent: 130
|
|
||||||
type: Transform
|
|
||||||
- canCollide: False
|
|
||||||
type: Physics
|
|
||||||
- uid: 7569
|
- uid: 7569
|
||||||
type: CableApcExtension
|
type: CableApcExtension
|
||||||
components:
|
components:
|
||||||
@@ -75226,14 +75218,6 @@ entities:
|
|||||||
- pos: 0.5,4.5
|
- pos: 0.5,4.5
|
||||||
parent: 130
|
parent: 130
|
||||||
type: Transform
|
type: Transform
|
||||||
- uid: 7664
|
|
||||||
type: ShellShotgunFlash
|
|
||||||
components:
|
|
||||||
- pos: 1.5967579,19.660324
|
|
||||||
parent: 130
|
|
||||||
type: Transform
|
|
||||||
- canCollide: False
|
|
||||||
type: Physics
|
|
||||||
- uid: 7665
|
- uid: 7665
|
||||||
type: WallReinforced
|
type: WallReinforced
|
||||||
components:
|
components:
|
||||||
@@ -77007,14 +76991,6 @@ entities:
|
|||||||
type: Physics
|
type: Physics
|
||||||
- solution: drink
|
- solution: drink
|
||||||
type: DrainableSolution
|
type: DrainableSolution
|
||||||
- uid: 7889
|
|
||||||
type: ShellShotgunFlash
|
|
||||||
components:
|
|
||||||
- pos: 1.3155079,19.691576
|
|
||||||
parent: 130
|
|
||||||
type: Transform
|
|
||||||
- canCollide: False
|
|
||||||
type: Physics
|
|
||||||
- uid: 7890
|
- uid: 7890
|
||||||
type: DrinkGlass
|
type: DrinkGlass
|
||||||
components:
|
components:
|
||||||
@@ -92463,18 +92439,6 @@ entities:
|
|||||||
ballistic-ammo: !type:Container
|
ballistic-ammo: !type:Container
|
||||||
ents: []
|
ents: []
|
||||||
type: ContainerContainer
|
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
|
- uid: 9853
|
||||||
type: WeaponShotgunKammerer
|
type: WeaponShotgunKammerer
|
||||||
components:
|
components:
|
||||||
@@ -148567,14 +148531,6 @@ entities:
|
|||||||
type: Airtight
|
type: Airtight
|
||||||
- canCollide: False
|
- canCollide: False
|
||||||
type: Physics
|
type: Physics
|
||||||
- uid: 17447
|
|
||||||
type: ShellShotgunFlash
|
|
||||||
components:
|
|
||||||
- pos: 1.7061329,19.660326
|
|
||||||
parent: 130
|
|
||||||
type: Transform
|
|
||||||
- canCollide: False
|
|
||||||
type: Physics
|
|
||||||
- uid: 17448
|
- uid: 17448
|
||||||
type: CarpetBlack
|
type: CarpetBlack
|
||||||
components:
|
components:
|
||||||
|
|||||||
@@ -190355,18 +190355,6 @@ entities:
|
|||||||
- pos: 48.5,6.5
|
- pos: 48.5,6.5
|
||||||
parent: 69
|
parent: 69
|
||||||
type: Transform
|
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
|
- uid: 22391
|
||||||
type: DisposalPipe
|
type: DisposalPipe
|
||||||
components:
|
components:
|
||||||
|
|||||||
@@ -63,6 +63,7 @@
|
|||||||
name: "[color=red]On Fire[/color]"
|
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."
|
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
|
- type: alert
|
||||||
id: Cold
|
id: Cold
|
||||||
category: Temperature
|
category: Temperature
|
||||||
@@ -163,6 +164,17 @@
|
|||||||
name: "[color=yellow]Peckish[/color]"
|
name: "[color=yellow]Peckish[/color]"
|
||||||
description: Some food would be good right about now.
|
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
|
- type: alert
|
||||||
id: Starving
|
id: Starving
|
||||||
category: Hunger
|
category: Hunger
|
||||||
|
|||||||
@@ -101,17 +101,6 @@
|
|||||||
- id: MagazineMagnum
|
- id: MagazineMagnum
|
||||||
amount: 6
|
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
|
- type: entity
|
||||||
name: box of .40 Lamia (high-velocity) magazines
|
name: box of .40 Lamia (high-velocity) magazines
|
||||||
parent: BoxCardboard
|
parent: BoxCardboard
|
||||||
@@ -212,17 +201,6 @@
|
|||||||
- id: MagazinePistol
|
- id: MagazinePistol
|
||||||
amount: 6
|
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
|
- type: entity
|
||||||
name: box of pistol .35 auto (high-velocity) magazines
|
name: box of pistol .35 auto (high-velocity) magazines
|
||||||
parent: BoxCardboard
|
parent: BoxCardboard
|
||||||
@@ -311,17 +289,6 @@
|
|||||||
- id: MagazinePistolSubMachineGun
|
- id: MagazinePistolSubMachineGun
|
||||||
amount: 3
|
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
|
- type: entity
|
||||||
name: box of SMG .35 auto (high-velocity) magazines
|
name: box of SMG .35 auto (high-velocity) magazines
|
||||||
parent: BoxCardboard
|
parent: BoxCardboard
|
||||||
@@ -412,17 +379,6 @@
|
|||||||
- id: MagazineRifle
|
- id: MagazineRifle
|
||||||
amount: 6
|
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
|
- type: entity
|
||||||
name: box of .20 rifle (high-velocity) magazines
|
name: box of .20 rifle (high-velocity) magazines
|
||||||
parent: BoxCardboard
|
parent: BoxCardboard
|
||||||
|
|||||||
@@ -133,21 +133,6 @@
|
|||||||
- state: boxwide
|
- state: boxwide
|
||||||
- state: shellflare
|
- 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
|
- type: entity
|
||||||
name: box of shotgun incendiary cartridges
|
name: box of shotgun incendiary cartridges
|
||||||
parent: BoxCardboard
|
parent: BoxCardboard
|
||||||
@@ -205,17 +190,6 @@
|
|||||||
- id: MagazineRifle
|
- id: MagazineRifle
|
||||||
amount: 6
|
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
|
- type: entity
|
||||||
name: box of .20 rifle (high-velocity) magazines
|
name: box of .20 rifle (high-velocity) magazines
|
||||||
parent: BoxCardboard
|
parent: BoxCardboard
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
spriteName: ammo
|
spriteName: ammo
|
||||||
startingInventory:
|
startingInventory:
|
||||||
MagazineBoxCaselessRifle: 3
|
MagazineBoxCaselessRifle: 3
|
||||||
MagazineBoxCaselessRifleFlash: 3
|
|
||||||
MagazineBoxCaselessRifleHighVelocity: 3
|
MagazineBoxCaselessRifleHighVelocity: 3
|
||||||
MagazineBoxCaselessRiflePractice: 3
|
MagazineBoxCaselessRiflePractice: 3
|
||||||
MagazineBoxCaselessRifleRubber: 3
|
MagazineBoxCaselessRifleRubber: 3
|
||||||
@@ -15,19 +14,16 @@
|
|||||||
MagazineBoxLightRifleRubber: 3
|
MagazineBoxLightRifleRubber: 3
|
||||||
|
|
||||||
MagazineBoxMagnum: 3
|
MagazineBoxMagnum: 3
|
||||||
MagazineBoxMagnumFlash: 3
|
|
||||||
MagazineBoxMagnumHighVelocity: 3
|
MagazineBoxMagnumHighVelocity: 3
|
||||||
MagazineBoxMagnumPractice: 3
|
MagazineBoxMagnumPractice: 3
|
||||||
MagazineBoxMagnumRubber: 3
|
MagazineBoxMagnumRubber: 3
|
||||||
|
|
||||||
MagazineBoxPistol: 3
|
MagazineBoxPistol: 3
|
||||||
MagazineBoxPistolFlash: 3
|
|
||||||
MagazineBoxPistolHighVelocity: 3
|
MagazineBoxPistolHighVelocity: 3
|
||||||
MagazineBoxPistolPractice: 3
|
MagazineBoxPistolPractice: 3
|
||||||
MagazineBoxPistolRubber: 3
|
MagazineBoxPistolRubber: 3
|
||||||
|
|
||||||
MagazineBoxRifle: 3
|
MagazineBoxRifle: 3
|
||||||
MagazineBoxRifleFlash: 3
|
|
||||||
MagazineBoxRifleHighVelocity: 3
|
MagazineBoxRifleHighVelocity: 3
|
||||||
MagazineBoxRiflePractice: 3
|
MagazineBoxRiflePractice: 3
|
||||||
MagazineBoxRifleRubber: 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.
|
# Damage due to being unable to breathe.
|
||||||
# Represents not enough oxygen (or equivalent) getting to the blood.
|
# Represents not enough oxygen (or equivalent) getting to the blood.
|
||||||
# Usually healed automatically if entity can breathe
|
# Usually healed automatically if entity can breathe
|
||||||
@@ -34,9 +9,34 @@
|
|||||||
- type: damageType
|
- type: damageType
|
||||||
id: Bloodloss
|
id: Bloodloss
|
||||||
|
|
||||||
|
- type: damageType
|
||||||
|
id: Blunt
|
||||||
|
|
||||||
- type: damageType
|
- type: damageType
|
||||||
id: Cellular
|
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.
|
# Damage represent structures internal integrity.
|
||||||
# Exclusive for structures such as walls, airlocks and others.
|
# Exclusive for structures such as walls, airlocks and others.
|
||||||
- type: damageType
|
- type: damageType
|
||||||
|
|||||||
@@ -67,6 +67,7 @@
|
|||||||
types:
|
types:
|
||||||
Bloodloss:
|
Bloodloss:
|
||||||
-0.25
|
-0.25
|
||||||
|
- type: Stamina
|
||||||
- type: StatusEffects
|
- type: StatusEffects
|
||||||
allowed:
|
allowed:
|
||||||
- Stun
|
- Stun
|
||||||
|
|||||||
@@ -100,21 +100,6 @@
|
|||||||
- state: mag-1
|
- state: mag-1
|
||||||
map: ["enum.GunVisualLayers.Mag"]
|
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
|
- type: entity
|
||||||
parent: BaseMagazineBoxCaselessRifle
|
parent: BaseMagazineBoxCaselessRifle
|
||||||
id: MagazineBoxCaselessRifleHighVelocity
|
id: MagazineBoxCaselessRifleHighVelocity
|
||||||
|
|||||||
@@ -38,21 +38,6 @@
|
|||||||
- state: mag-1
|
- state: mag-1
|
||||||
map: ["enum.GunVisualLayers.Mag"]
|
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
|
- type: entity
|
||||||
parent: BaseMagazineBoxMagnum
|
parent: BaseMagazineBoxMagnum
|
||||||
id: MagazineBoxMagnumHighVelocity
|
id: MagazineBoxMagnumHighVelocity
|
||||||
|
|||||||
@@ -39,21 +39,6 @@
|
|||||||
- state: mag-1
|
- state: mag-1
|
||||||
map: ["enum.GunVisualLayers.Mag"]
|
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
|
- type: entity
|
||||||
parent: BaseMagazineBoxPistol
|
parent: BaseMagazineBoxPistol
|
||||||
id: MagazineBoxPistolHighVelocity
|
id: MagazineBoxPistolHighVelocity
|
||||||
|
|||||||
@@ -79,21 +79,6 @@
|
|||||||
- state: mag-1
|
- state: mag-1
|
||||||
map: ["enum.GunVisualLayers.Mag"]
|
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
|
- type: entity
|
||||||
parent: BaseMagazineBoxRifle
|
parent: BaseMagazineBoxRifle
|
||||||
id: MagazineBoxRifleHighVelocity
|
id: MagazineBoxRifleHighVelocity
|
||||||
|
|||||||
@@ -28,14 +28,6 @@
|
|||||||
- type: CartridgeAmmo
|
- type: CartridgeAmmo
|
||||||
proto: BulletCaselessRifle
|
proto: BulletCaselessRifle
|
||||||
|
|
||||||
- type: entity
|
|
||||||
id: CartridgeCaselessRifleFlash
|
|
||||||
name: cartridge (.25 caseless flash)
|
|
||||||
parent: BaseCartridgeCaselessRifle
|
|
||||||
components:
|
|
||||||
- type: CartridgeAmmo
|
|
||||||
proto: BulletCaselessRifleFlash
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: CartridgeCaselessRifleHighVelocity
|
id: CartridgeCaselessRifleHighVelocity
|
||||||
name: cartridge (.25 caseless high-velocity)
|
name: cartridge (.25 caseless high-velocity)
|
||||||
|
|||||||
@@ -27,14 +27,6 @@
|
|||||||
- type: CartridgeAmmo
|
- type: CartridgeAmmo
|
||||||
proto: BulletLightRifle
|
proto: BulletLightRifle
|
||||||
|
|
||||||
- type: entity
|
|
||||||
id: CartridgeLightRifleFlash
|
|
||||||
name: cartridge (.30 rifle flash)
|
|
||||||
parent: BaseCartridgeLightRifle
|
|
||||||
components:
|
|
||||||
- type: CartridgeAmmo
|
|
||||||
proto: BulletLightRifleFlash
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: CartridgeLightRifleHighVelocity
|
id: CartridgeLightRifleHighVelocity
|
||||||
name: cartridge (.30 rifle high-velocity)
|
name: cartridge (.30 rifle high-velocity)
|
||||||
|
|||||||
@@ -27,14 +27,6 @@
|
|||||||
- type: CartridgeAmmo
|
- type: CartridgeAmmo
|
||||||
proto: BulletMagnum
|
proto: BulletMagnum
|
||||||
|
|
||||||
- type: entity
|
|
||||||
id: CartridgeMagnumFlash
|
|
||||||
name: cartridge (.40 magnum flash)
|
|
||||||
parent: BaseCartridgeMagnum
|
|
||||||
components:
|
|
||||||
- type: CartridgeAmmo
|
|
||||||
proto: BulletMagnumFlash
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: CartridgeMagnumHighVelocity
|
id: CartridgeMagnumHighVelocity
|
||||||
name: cartridge (.40 magnum high-velocity)
|
name: cartridge (.40 magnum high-velocity)
|
||||||
|
|||||||
@@ -27,14 +27,6 @@
|
|||||||
- type: CartridgeAmmo
|
- type: CartridgeAmmo
|
||||||
proto: BulletPistol
|
proto: BulletPistol
|
||||||
|
|
||||||
- type: entity
|
|
||||||
id: CartridgePistolFlash
|
|
||||||
name: cartridge (.35 auto flash)
|
|
||||||
parent: BaseCartridgePistol
|
|
||||||
components:
|
|
||||||
- type: CartridgeAmmo
|
|
||||||
proto: BulletPistolFlash
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: CartridgePistolHighVelocity
|
id: CartridgePistolHighVelocity
|
||||||
name: cartridge (.35 auto high-velocity)
|
name: cartridge (.35 auto high-velocity)
|
||||||
|
|||||||
@@ -27,14 +27,6 @@
|
|||||||
- type: CartridgeAmmo
|
- type: CartridgeAmmo
|
||||||
proto: BulletRifle
|
proto: BulletRifle
|
||||||
|
|
||||||
- type: entity
|
|
||||||
id: CartridgeRifleFlash
|
|
||||||
name: cartridge (.20 rifle flash)
|
|
||||||
parent: BaseCartridgeRifle
|
|
||||||
components:
|
|
||||||
- type: CartridgeAmmo
|
|
||||||
proto: BulletRifleFlash
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: CartridgeRifleHighVelocity
|
id: CartridgeRifleHighVelocity
|
||||||
name: cartridge (.20 rifle high-velocity)
|
name: cartridge (.20 rifle high-velocity)
|
||||||
|
|||||||
@@ -80,20 +80,6 @@
|
|||||||
- type: CartridgeAmmo
|
- type: CartridgeAmmo
|
||||||
proto: PelletShotgun
|
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
|
- type: entity
|
||||||
id: ShellShotgunIncendiary
|
id: ShellShotgunIncendiary
|
||||||
name: shell (.50 incendiary)
|
name: shell (.50 incendiary)
|
||||||
|
|||||||
@@ -112,8 +112,6 @@
|
|||||||
zeroVisible: false
|
zeroVisible: false
|
||||||
- type: Appearance
|
- type: Appearance
|
||||||
|
|
||||||
# No flash
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: MagazinePistolCaselessRifleHighVelocity
|
id: MagazinePistolCaselessRifleHighVelocity
|
||||||
name: "pistol magazine (.25 caseless high-velocity)"
|
name: "pistol magazine (.25 caseless high-velocity)"
|
||||||
@@ -245,21 +243,6 @@
|
|||||||
- state: mag-1
|
- state: mag-1
|
||||||
map: ["enum.GunVisualLayers.Mag"]
|
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
|
- type: entity
|
||||||
id: MagazineCaselessRifleShortHighVelocity
|
id: MagazineCaselessRifleShortHighVelocity
|
||||||
name: "short magazine (.25 caseless high-velocity)"
|
name: "short magazine (.25 caseless high-velocity)"
|
||||||
|
|||||||
@@ -68,20 +68,6 @@
|
|||||||
- state: mag-1
|
- state: mag-1
|
||||||
map: ["enum.GunVisualLayers.Mag"]
|
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
|
- type: entity
|
||||||
id: MagazineLightRifleHighVelocity
|
id: MagazineLightRifleHighVelocity
|
||||||
name: "magazine (.30 rifle high-velocity)"
|
name: "magazine (.30 rifle high-velocity)"
|
||||||
|
|||||||
@@ -78,20 +78,6 @@
|
|||||||
- state: mag-1
|
- state: mag-1
|
||||||
map: ["enum.GunVisualLayers.Mag"]
|
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
|
- type: entity
|
||||||
id: MagazineMagnumHighVelocity
|
id: MagazineMagnumHighVelocity
|
||||||
name: "Lamia magazine (.40 magnum high-velocity)"
|
name: "Lamia magazine (.40 magnum high-velocity)"
|
||||||
|
|||||||
@@ -159,20 +159,6 @@
|
|||||||
- state: mag-1
|
- state: mag-1
|
||||||
map: ["enum.GunVisualLayers.Mag"]
|
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
|
- type: entity
|
||||||
id: MagazinePistolHighVelocity
|
id: MagazinePistolHighVelocity
|
||||||
name: pistol magazine (.35 auto high-velocity)
|
name: pistol magazine (.35 auto high-velocity)
|
||||||
@@ -291,20 +277,6 @@
|
|||||||
- state: mag-1
|
- state: mag-1
|
||||||
map: ["enum.GunVisualLayers.Mag"]
|
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
|
- type: entity
|
||||||
id: MagazinePistolSubMachineGunHighVelocity
|
id: MagazinePistolSubMachineGunHighVelocity
|
||||||
name: SMG magazine (.35 auto high-velocity)
|
name: SMG magazine (.35 auto high-velocity)
|
||||||
|
|||||||
@@ -47,20 +47,6 @@
|
|||||||
- state: mag-1
|
- state: mag-1
|
||||||
map: ["enum.GunVisualLayers.Mag"]
|
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
|
- type: entity
|
||||||
id: MagazineRifleHighVelocity
|
id: MagazineRifleHighVelocity
|
||||||
name: "magazine (.20 rifle high-velocity)"
|
name: "magazine (.20 rifle high-velocity)"
|
||||||
|
|||||||
@@ -9,17 +9,6 @@
|
|||||||
types:
|
types:
|
||||||
Piercing: 19
|
Piercing: 19
|
||||||
|
|
||||||
- type: entity
|
|
||||||
id: BulletCaselessRifleFlash
|
|
||||||
name: bullet (.25 caseless flash)
|
|
||||||
parent: BaseBulletFlash
|
|
||||||
noSpawn: true
|
|
||||||
components:
|
|
||||||
- type: Projectile
|
|
||||||
damage:
|
|
||||||
types:
|
|
||||||
Blunt: 3
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: BulletCaselessRifleHighVelocity
|
id: BulletCaselessRifleHighVelocity
|
||||||
name: bullet (.25 caseless high-velocity)
|
name: bullet (.25 caseless high-velocity)
|
||||||
|
|||||||
@@ -9,17 +9,6 @@
|
|||||||
types:
|
types:
|
||||||
Piercing: 19
|
Piercing: 19
|
||||||
|
|
||||||
- type: entity
|
|
||||||
id: BulletLightRifleFlash
|
|
||||||
name: bullet (.20 rifle flash)
|
|
||||||
parent: BaseBulletFlash
|
|
||||||
noSpawn: true
|
|
||||||
components:
|
|
||||||
- type: Projectile
|
|
||||||
damage:
|
|
||||||
types:
|
|
||||||
Blunt: 3
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: BulletLightRifleHighVelocity
|
id: BulletLightRifleHighVelocity
|
||||||
name: bullet (.20 rifle high-velocity)
|
name: bullet (.20 rifle high-velocity)
|
||||||
|
|||||||
@@ -9,17 +9,6 @@
|
|||||||
types:
|
types:
|
||||||
Piercing: 22
|
Piercing: 22
|
||||||
|
|
||||||
- type: entity
|
|
||||||
id: BulletMagnumFlash
|
|
||||||
name: bullet (.40 magnum flash)
|
|
||||||
parent: BaseBulletFlash
|
|
||||||
noSpawn: true
|
|
||||||
components:
|
|
||||||
- type: Projectile
|
|
||||||
damage:
|
|
||||||
types:
|
|
||||||
Blunt: 3
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: BulletMagnumHighVelocity
|
id: BulletMagnumHighVelocity
|
||||||
name: bullet (.40 magnum high-velocity)
|
name: bullet (.40 magnum high-velocity)
|
||||||
|
|||||||
@@ -9,17 +9,6 @@
|
|||||||
types:
|
types:
|
||||||
Piercing: 16
|
Piercing: 16
|
||||||
|
|
||||||
- type: entity
|
|
||||||
id: BulletPistolFlash
|
|
||||||
name: bullet (.35 auto flash)
|
|
||||||
parent: BaseBulletFlash
|
|
||||||
noSpawn: true
|
|
||||||
components:
|
|
||||||
- type: Projectile
|
|
||||||
damage:
|
|
||||||
types:
|
|
||||||
Blunt: 3
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: BulletPistolHighVelocity
|
id: BulletPistolHighVelocity
|
||||||
name: bullet (.35 auto high-velocity)
|
name: bullet (.35 auto high-velocity)
|
||||||
|
|||||||
@@ -9,17 +9,6 @@
|
|||||||
types:
|
types:
|
||||||
Piercing: 17
|
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
|
- type: entity
|
||||||
id: BulletRifleHighVelocity
|
id: BulletRifleHighVelocity
|
||||||
name: bullet (0.20 rifle high-velocity)
|
name: bullet (0.20 rifle high-velocity)
|
||||||
|
|||||||
@@ -25,9 +25,8 @@
|
|||||||
damage:
|
damage:
|
||||||
types:
|
types:
|
||||||
Blunt: 10
|
Blunt: 10
|
||||||
- type: StunOnCollide
|
- type: StaminaDamageOnCollide
|
||||||
stunAmount: 5
|
damage: 55
|
||||||
knockdownAmount: 3
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: PelletShotgun
|
id: PelletShotgun
|
||||||
@@ -43,20 +42,6 @@
|
|||||||
types:
|
types:
|
||||||
Piercing: 5
|
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
|
- type: entity
|
||||||
id: PelletShotgunIncendiary
|
id: PelletShotgunIncendiary
|
||||||
name: pellet (.50 incendiary)
|
name: pellet (.50 incendiary)
|
||||||
|
|||||||
@@ -32,26 +32,6 @@
|
|||||||
zeroVisible: false
|
zeroVisible: false
|
||||||
- type: Appearance
|
- 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
|
- type: entity
|
||||||
id: SpeedLoaderMagnumHighVelocity
|
id: SpeedLoaderMagnumHighVelocity
|
||||||
name: "speed loader (.40 magnum high-velocity)"
|
name: "speed loader (.40 magnum high-velocity)"
|
||||||
|
|||||||
@@ -32,25 +32,6 @@
|
|||||||
zeroVisible: false
|
zeroVisible: false
|
||||||
- type: Appearance
|
- 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
|
- type: entity
|
||||||
id: SpeedLoaderPistolHighVelocity
|
id: SpeedLoaderPistolHighVelocity
|
||||||
name: "speed loader (.35 auto high-velocity)"
|
name: "speed loader (.35 auto high-velocity)"
|
||||||
|
|||||||
@@ -246,11 +246,49 @@
|
|||||||
zeroVisible: true
|
zeroVisible: true
|
||||||
- type: Appearance
|
- 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
|
- type: entity
|
||||||
name: taser
|
name: taser
|
||||||
parent: BaseWeaponBattery
|
parent: BaseWeaponBattery
|
||||||
id: WeaponTaser
|
id: WeaponTaser
|
||||||
description: A low-capacity, energy-based stun gun used by security teams to subdue targets at range.
|
description: A low-capacity, energy-based stun gun used by security teams to subdue targets at range.
|
||||||
|
# Use Disabler
|
||||||
|
suffix: Obsolete
|
||||||
components:
|
components:
|
||||||
- type: Tag
|
- type: Tag
|
||||||
tags:
|
tags:
|
||||||
@@ -274,11 +312,8 @@
|
|||||||
soundGunshot:
|
soundGunshot:
|
||||||
path: /Audio/Weapons/Guns/Gunshots/taser.ogg
|
path: /Audio/Weapons/Guns/Gunshots/taser.ogg
|
||||||
- type: ProjectileBatteryAmmoProvider
|
- type: ProjectileBatteryAmmoProvider
|
||||||
proto: BulletTaser
|
proto: BulletDisabler
|
||||||
fireCost: 50
|
fireCost: 50
|
||||||
- type: Battery
|
|
||||||
maxCharge: 100
|
|
||||||
startingCharge: 100
|
|
||||||
- type: MagazineVisuals
|
- type: MagazineVisuals
|
||||||
magState: mag
|
magState: mag
|
||||||
steps: 5
|
steps: 5
|
||||||
|
|||||||
@@ -42,21 +42,6 @@
|
|||||||
sprite: Objects/Weapons/Guns/Projectiles/projectiles.rsi
|
sprite: Objects/Weapons/Guns/Projectiles/projectiles.rsi
|
||||||
state: impact_laser
|
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
|
- type: hitscan
|
||||||
id: XrayLaser
|
id: XrayLaser
|
||||||
damage:
|
damage:
|
||||||
|
|||||||
@@ -57,21 +57,6 @@
|
|||||||
- Impassable
|
- Impassable
|
||||||
- BulletImpassable
|
- 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
|
- type: entity
|
||||||
id: BaseBulletHighVelocity
|
id: BaseBulletHighVelocity
|
||||||
name: base bullet high-velocity
|
name: base bullet high-velocity
|
||||||
@@ -106,14 +91,13 @@
|
|||||||
Blunt: 3
|
Blunt: 3
|
||||||
soundHit:
|
soundHit:
|
||||||
path: /Audio/Weapons/Guns/Hits/snap.ogg
|
path: /Audio/Weapons/Guns/Hits/snap.ogg
|
||||||
- type: StunOnCollide
|
- type: StaminaDamageOnCollide
|
||||||
stunAmount: 2
|
damage: 15
|
||||||
knockdownAmount: 2
|
|
||||||
|
|
||||||
# Energy projectiles
|
# Energy projectiles
|
||||||
- type: entity
|
- type: entity
|
||||||
name : taser bolt
|
name : disabler bolt
|
||||||
id: BulletTaser
|
id: BulletDisabler
|
||||||
parent: BaseBullet
|
parent: BaseBullet
|
||||||
noSpawn: true
|
noSpawn: true
|
||||||
components:
|
components:
|
||||||
@@ -123,24 +107,24 @@
|
|||||||
params:
|
params:
|
||||||
volume: 5
|
volume: 5
|
||||||
- type: Sprite
|
- type: Sprite
|
||||||
noRot: true
|
sprite: Objects/Weapons/Guns/Projectiles/projectiles_tg.rsi
|
||||||
sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi
|
|
||||||
color: "#ffff33"
|
|
||||||
layers:
|
layers:
|
||||||
- state: spark
|
- state: omnilaser
|
||||||
shader: unshaded
|
shader: unshaded
|
||||||
- type: Physics
|
- type: Physics
|
||||||
- type: Fixtures
|
- type: Fixtures
|
||||||
fixtures:
|
fixtures:
|
||||||
- shape:
|
- shape:
|
||||||
!type:PhysShapeAabb
|
!type:PhysShapeAabb
|
||||||
bounds: "-0.2,-0.2,0.2,0.2"
|
bounds: "-0.15,-0.3,0.15,0.3"
|
||||||
hard: false
|
hard: false
|
||||||
id: projectile
|
id: projectile
|
||||||
mask:
|
mask:
|
||||||
- Impassable
|
- Impassable
|
||||||
- BulletImpassable
|
- BulletImpassable
|
||||||
- type: Ammo
|
- type: Ammo
|
||||||
|
- type: StaminaDamageOnCollide
|
||||||
|
damage: 55
|
||||||
- type: Projectile
|
- type: Projectile
|
||||||
damage:
|
damage:
|
||||||
types:
|
types:
|
||||||
@@ -148,9 +132,6 @@
|
|||||||
soundHit:
|
soundHit:
|
||||||
path: "/Audio/Weapons/Guns/Hits/taser_hit.ogg"
|
path: "/Audio/Weapons/Guns/Hits/taser_hit.ogg"
|
||||||
soundForce: true
|
soundForce: true
|
||||||
- type: StunOnCollide
|
|
||||||
stunAmount: 5
|
|
||||||
knockdownAmount: 5
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
name: emitter bolt
|
name: emitter bolt
|
||||||
@@ -246,9 +227,8 @@
|
|||||||
Blunt: 1
|
Blunt: 1
|
||||||
soundHit:
|
soundHit:
|
||||||
path: /Audio/Effects/gen_hit.ogg
|
path: /Audio/Effects/gen_hit.ogg
|
||||||
- type: StunOnCollide
|
- type: StaminaDamageOnCollide
|
||||||
stunAmount: 8
|
damage: 80
|
||||||
knockdownAmount: 8
|
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: BulletGrenadeBlast
|
id: BulletGrenadeBlast
|
||||||
@@ -269,7 +249,7 @@
|
|||||||
- type: entity
|
- type: entity
|
||||||
id: BulletGrenadeFlash
|
id: BulletGrenadeFlash
|
||||||
name: flash grenade
|
name: flash grenade
|
||||||
parent: BaseBulletFlash
|
parent: BaseBulletTrigger
|
||||||
noSpawn: true
|
noSpawn: true
|
||||||
components:
|
components:
|
||||||
- type: Sprite
|
- type: Sprite
|
||||||
|
|||||||
@@ -13,9 +13,8 @@
|
|||||||
sound: /Audio/Weapons/bolathrow.ogg
|
sound: /Audio/Weapons/bolathrow.ogg
|
||||||
- type: EmitSoundOnLand
|
- type: EmitSoundOnLand
|
||||||
sound: /Audio/Effects/snap.ogg
|
sound: /Audio/Effects/snap.ogg
|
||||||
- type: StunOnCollide
|
- type: StaminaDamageOnCollide
|
||||||
stunAmount: 1
|
damage: 80
|
||||||
knockdownAmount: 3
|
|
||||||
- type: Construction
|
- type: Construction
|
||||||
graph: Bola
|
graph: Bola
|
||||||
node: bola
|
node: bola
|
||||||
|
|||||||
@@ -16,8 +16,10 @@
|
|||||||
range: 1.5
|
range: 1.5
|
||||||
arcwidth: 60
|
arcwidth: 60
|
||||||
arc: default
|
arc: default
|
||||||
- type: UseDelay
|
cooldownTime: 1.5
|
||||||
delay: 4
|
arcCooldownTime: 1.5
|
||||||
|
- type: StaminaDamageOnHit
|
||||||
|
damage: 55
|
||||||
- type: Battery
|
- type: Battery
|
||||||
maxCharge: 1000
|
maxCharge: 1000
|
||||||
startingCharge: 1000
|
startingCharge: 1000
|
||||||
@@ -50,7 +52,7 @@
|
|||||||
arcWidth: 10
|
arcWidth: 10
|
||||||
arc: default
|
arc: default
|
||||||
- type: Item
|
- type: Item
|
||||||
size: 2
|
size: 5
|
||||||
sprite: Objects/Weapons/Melee/flash.rsi
|
sprite: Objects/Weapons/Melee/flash.rsi
|
||||||
- type: ItemCooldown
|
- type: ItemCooldown
|
||||||
|
|
||||||
|
|||||||
@@ -170,14 +170,3 @@
|
|||||||
Plastic: 15
|
Plastic: 15
|
||||||
Steel: 10
|
Steel: 10
|
||||||
Glass: 5
|
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": "mag10-1"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "flash"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "hv"
|
"name": "hv"
|
||||||
},
|
},
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 136 B |
@@ -13,9 +13,6 @@
|
|||||||
{
|
{
|
||||||
"name": "mag-1"
|
"name": "mag-1"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "flash"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "hv"
|
"name": "hv"
|
||||||
},
|
},
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 312 B |
@@ -13,9 +13,6 @@
|
|||||||
{
|
{
|
||||||
"name": "mag-1"
|
"name": "mag-1"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "flash"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "hv"
|
"name": "hv"
|
||||||
},
|
},
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 318 B |
@@ -19,9 +19,6 @@
|
|||||||
{
|
{
|
||||||
"name": "magb-1"
|
"name": "magb-1"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "flash"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "hv"
|
"name": "hv"
|
||||||
},
|
},
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 352 B |
|
Before Width: | Height: | Size: 332 B |
@@ -31,12 +31,6 @@
|
|||||||
{
|
{
|
||||||
"name": "flare-spent"
|
"name": "flare-spent"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "flash"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "flash-spent"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "incendiary"
|
"name": "incendiary"
|
||||||
},
|
},
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 358 B |
@@ -10,9 +10,6 @@
|
|||||||
{
|
{
|
||||||
"name": "base"
|
"name": "base"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "flash"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "high_velocity"
|
"name": "high_velocity"
|
||||||
},
|
},
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 369 B |
@@ -10,9 +10,6 @@
|
|||||||
{
|
{
|
||||||
"name": "base"
|
"name": "base"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "flash"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "high_velocity"
|
"name": "high_velocity"
|
||||||
},
|
},
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 403 B |
@@ -10,9 +10,6 @@
|
|||||||
{
|
{
|
||||||
"name": "base"
|
"name": "base"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "flash"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "high_velocity"
|
"name": "high_velocity"
|
||||||
},
|
},
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 404 B |
@@ -10,9 +10,6 @@
|
|||||||
{
|
{
|
||||||
"name": "base"
|
"name": "base"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "flash"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "high_velocity"
|
"name": "high_velocity"
|
||||||
},
|
},
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 364 B |
@@ -10,9 +10,6 @@
|
|||||||
{
|
{
|
||||||
"name": "base"
|
"name": "base"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "flash"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "high_velocity"
|
"name": "high_velocity"
|
||||||
},
|
},
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 286 B |
@@ -10,9 +10,6 @@
|
|||||||
{
|
{
|
||||||
"name": "base"
|
"name": "base"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "flash"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "high_velocity"
|
"name": "high_velocity"
|
||||||
},
|
},
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 333 B |
@@ -10,9 +10,6 @@
|
|||||||
{
|
{
|
||||||
"name": "base"
|
"name": "base"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "flash"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "high_velocity"
|
"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": "base-6"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "flash-1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "flash-2"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "flash-3"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "flash-4"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "flash-5"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "flash-6"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "high-velocity-1"
|
"name": "high-velocity-1"
|
||||||
},
|
},
|
||||||
|
|||||||