Stamina damage (#9230)

This commit is contained in:
metalgearsloth
2022-07-06 18:06:12 +10:00
committed by GitHub
parent 305cdc02cb
commit 40eecdd78a
129 changed files with 703 additions and 778 deletions

View 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
{
}

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

View File

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

View File

@@ -0,0 +1,8 @@
namespace Content.Server.Damage.Components;
[RegisterComponent]
public sealed class StaminaDamageOnHitComponent : Component
{
[ViewVariables(VVAccess.ReadWrite), DataField("damage")]
public float Damage = 30f;
}

View File

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

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -10,6 +10,7 @@ public enum AlertCategory
Breathing,
Buckled,
Health,
Stamina,
Piloting,
Hunger,
Thirst,

View File

@@ -28,6 +28,7 @@
Overhydrated,
Thirsty,
Parched,
Stamina,
Pulled,
Pulling,
Magboots,

View File

@@ -85,7 +85,7 @@ public abstract class AlertsSystem : EntitySystem
AfterShowAlert(alertsComponent);
alertsComponent.Dirty();
Dirty(alertsComponent);
}
else
{

View File

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

View File

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

View File

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

Binary file not shown.

View File

@@ -0,0 +1 @@
stamina-resist = Resisted

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -67,6 +67,7 @@
types:
Bloodloss:
-0.25
- type: Stamina
- type: StatusEffects
allowed:
- Stun

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View 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
]
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 701 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1003 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 912 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 795 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 704 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 304 B

View File

@@ -25,9 +25,6 @@
{
"name": "mag10-1"
},
{
"name": "flash"
},
{
"name": "hv"
},

Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 B

View File

@@ -13,9 +13,6 @@
{
"name": "mag-1"
},
{
"name": "flash"
},
{
"name": "hv"
},

Binary file not shown.

Before

Width:  |  Height:  |  Size: 312 B

View File

@@ -13,9 +13,6 @@
{
"name": "mag-1"
},
{
"name": "flash"
},
{
"name": "hv"
},

Binary file not shown.

Before

Width:  |  Height:  |  Size: 318 B

View File

@@ -19,9 +19,6 @@
{
"name": "magb-1"
},
{
"name": "flash"
},
{
"name": "hv"
},

Binary file not shown.

Before

Width:  |  Height:  |  Size: 352 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 332 B

View File

@@ -31,12 +31,6 @@
{
"name": "flare-spent"
},
{
"name": "flash"
},
{
"name": "flash-spent"
},
{
"name": "incendiary"
},

View File

@@ -10,9 +10,6 @@
{
"name": "base"
},
{
"name": "flash"
},
{
"name": "high_velocity"
},

View File

@@ -10,9 +10,6 @@
{
"name": "base"
},
{
"name": "flash"
},
{
"name": "high_velocity"
},

View File

@@ -10,9 +10,6 @@
{
"name": "base"
},
{
"name": "flash"
},
{
"name": "high_velocity"
},

Binary file not shown.

Before

Width:  |  Height:  |  Size: 404 B

View File

@@ -10,9 +10,6 @@
{
"name": "base"
},
{
"name": "flash"
},
{
"name": "high_velocity"
},

Binary file not shown.

Before

Width:  |  Height:  |  Size: 364 B

View File

@@ -10,9 +10,6 @@
{
"name": "base"
},
{
"name": "flash"
},
{
"name": "high_velocity"
},

Binary file not shown.

Before

Width:  |  Height:  |  Size: 286 B

View File

@@ -10,9 +10,6 @@
{
"name": "base"
},
{
"name": "flash"
},
{
"name": "high_velocity"
},

Binary file not shown.

Before

Width:  |  Height:  |  Size: 333 B

View File

@@ -10,9 +10,6 @@
{
"name": "base"
},
{
"name": "flash"
},
{
"name": "high_velocity"
},

View File

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

Some files were not shown because too many files have changed in this diff Show More