diff --git a/Content.Server/Gatherable/Components/GatheringProjectileComponent.cs b/Content.Server/Gatherable/Components/GatheringProjectileComponent.cs
index 2ac8eedcd17..3d0d6c3d78e 100644
--- a/Content.Server/Gatherable/Components/GatheringProjectileComponent.cs
+++ b/Content.Server/Gatherable/Components/GatheringProjectileComponent.cs
@@ -11,4 +11,11 @@ public sealed partial class GatheringProjectileComponent : Component
///
[ViewVariables(VVAccess.ReadWrite), DataField("amount")]
public int Amount = 1;
+
+ ///
+ /// Goobstation
+ /// The probability that the given projectile will actually be gathering
+ ///
+ [DataField]
+ public float Probability = 1f;
}
diff --git a/Content.Shared/Weapons/Ranged/Events/GunRefreshModifiersEvent.cs b/Content.Shared/Weapons/Ranged/Events/GunRefreshModifiersEvent.cs
index 0ad79bd74af..1290a6eacff 100644
--- a/Content.Shared/Weapons/Ranged/Events/GunRefreshModifiersEvent.cs
+++ b/Content.Shared/Weapons/Ranged/Events/GunRefreshModifiersEvent.cs
@@ -19,5 +19,7 @@ public record struct GunRefreshModifiersEvent(
Angle MinAngle,
int ShotsPerBurst,
float FireRate,
- float ProjectileSpeed
+ float ProjectileSpeed,
+ float BurstFireRate, // Goobstation
+ float BurstCooldown // Goobstation
);
diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs
index ce969899806..84ca6ddaf9b 100644
--- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs
+++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs
@@ -594,7 +594,11 @@ public void RefreshModifiers(Entity gun)
comp.MinAngle,
comp.ShotsPerBurst,
comp.FireRate,
- comp.ProjectileSpeed
+ // Goobstation Lavaland PKAs Start
+ comp.ProjectileSpeed,
+ comp.BurstFireRate,
+ comp.BurstCooldown
+ // Goobstation Lavaland PKAs end
);
// Begin DeltaV additions
diff --git a/Content.Shared/Weapons/Ranged/Upgrades/Components/GunUpgradeDamageComponent.cs b/Content.Shared/Weapons/Ranged/Upgrades/Components/GunUpgradeDamageComponent.cs
index b69c7973a03..d0743937155 100644
--- a/Content.Shared/Weapons/Ranged/Upgrades/Components/GunUpgradeDamageComponent.cs
+++ b/Content.Shared/Weapons/Ranged/Upgrades/Components/GunUpgradeDamageComponent.cs
@@ -1,3 +1,4 @@
+using Content.Shared._Lavaland.Weapons.Ranged.Upgrades;
using Content.Shared.Damage;
using Robust.Shared.GameStates;
@@ -6,12 +7,16 @@ namespace Content.Shared.Weapons.Ranged.Upgrades.Components;
///
/// A for increasing the damage of a gun's projectile.
///
-[RegisterComponent, NetworkedComponent, Access(typeof(GunUpgradeSystem))]
+[RegisterComponent, NetworkedComponent, Access(typeof(SharedGunUpgradeSystem))] // Goobstation - Swapped from GunUpgradeSystem to SharedGunUpgradeSystem
public sealed partial class GunUpgradeDamageComponent : Component
{
+ [DataField]
+ public DamageSpecifier? BonusDamage;
+
///
- /// Additional damage added onto the projectile's base damage.
+ /// Goobstation
+ /// How much should we multiply the total projectile's damage.
///
[DataField]
- public DamageSpecifier Damage = new();
+ public float Modifier = 1f;
}
diff --git a/Content.Shared/Weapons/Ranged/Upgrades/GunUpgradeSystem.cs b/Content.Shared/Weapons/Ranged/Upgrades/GunUpgradeSystem.cs
index cbaef3db88e..df9338d4c42 100644
--- a/Content.Shared/Weapons/Ranged/Upgrades/GunUpgradeSystem.cs
+++ b/Content.Shared/Weapons/Ranged/Upgrades/GunUpgradeSystem.cs
@@ -1,5 +1,6 @@
using System.Linq;
-using Content.Shared._DV.Weapons.Ranged.Upgrades; // DeltaV
+using Content.Shared._DV.Weapons.Ranged.Upgrades; // DeltaV
+using Content.Shared.Weapons.Ranged.Upgrades.Components;
using Content.Shared.Administration.Logs;
using Content.Shared.Database;
using Content.Shared.Examine;
@@ -9,7 +10,6 @@
using Content.Shared.Tag;
using Content.Shared.Weapons.Ranged.Events;
using Content.Shared.Weapons.Ranged.Systems;
-using Content.Shared.Weapons.Ranged.Upgrades.Components;
using Content.Shared.Whitelist;
using Robust.Shared.Audio.Systems;
using Robust.Shared.Containers;
@@ -106,12 +106,12 @@ private void OnAfterInteractUsing(Entity ent, ref After
// End DeltaV Additions
}
- private void OnFireRateRefresh(Entity ent, ref GunRefreshModifiersEvent args)
+ private void OnFireRateRefresh(Entity ent, ref GunRefreshModifiersEvent args)
{
args.FireRate *= ent.Comp.Coefficient;
}
- private void OnSpeedRefresh(Entity ent, ref GunRefreshModifiersEvent args)
+ private void OnSpeedRefresh(Entity ent, ref GunRefreshModifiersEvent args)
{
args.ProjectileSpeed *= ent.Comp.Coefficient;
}
@@ -120,8 +120,14 @@ private void OnDamageGunShot(Entity ent, ref GunShotE
{
foreach (var (ammo, _) in args.Ammo)
{
- if (TryComp(ammo, out var proj))
- proj.Damage += ent.Comp.Damage;
+ // Goobstation - Lavaland PKAs Start
+ if (!TryComp(ammo, out var projectile))
+ continue;
+ var multiplier = 1f;
+ if (ent.Comp.BonusDamage != null)
+ projectile.Damage += ent.Comp.BonusDamage * multiplier;
+ projectile.Damage *= ent.Comp.Modifier;
+ // Goobstation - Lavaland PKAs Start
}
}
diff --git a/Content.Shared/_Lavaland/Body/CursedHeartComponent.cs b/Content.Shared/_Lavaland/Body/CursedHeartComponent.cs
new file mode 100644
index 00000000000..455e270bb80
--- /dev/null
+++ b/Content.Shared/_Lavaland/Body/CursedHeartComponent.cs
@@ -0,0 +1,19 @@
+using Content.Shared.Actions;
+using Robust.Shared.GameStates;
+
+namespace Content.Shared._Lavaland.Body;
+
+[RegisterComponent, NetworkedComponent]
+[AutoGenerateComponentState]
+public sealed partial class CursedHeartComponent : Component
+{
+ [AutoNetworkedField]
+ public EntityUid? PumpActionEntity;
+
+ public TimeSpan LastPump = TimeSpan.Zero;
+
+ [DataField]
+ public float MaxDelay = 5f;
+}
+
+public sealed partial class PumpHeartActionEvent : InstantActionEvent;
diff --git a/Content.Shared/_Lavaland/Body/CursedHeartGrantComponent.cs b/Content.Shared/_Lavaland/Body/CursedHeartGrantComponent.cs
new file mode 100644
index 00000000000..bffc194617e
--- /dev/null
+++ b/Content.Shared/_Lavaland/Body/CursedHeartGrantComponent.cs
@@ -0,0 +1,25 @@
+// SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Aidenkrz
+// SPDX-FileCopyrightText: 2025 Aineias1
+// SPDX-FileCopyrightText: 2025 FaDeOkno <143940725+FaDeOkno@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 GoobBot
+// SPDX-FileCopyrightText: 2025 McBosserson <148172569+McBosserson@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Milon
+// SPDX-FileCopyrightText: 2025 Piras314
+// SPDX-FileCopyrightText: 2025 Rouden <149893554+Roudenn@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 TheBorzoiMustConsume <197824988+TheBorzoiMustConsume@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Unlumination <144041835+Unlumy@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 deltanedas <39013340+deltanedas@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 deltanedas <@deltanedas:kde.org>
+// SPDX-FileCopyrightText: 2025 gluesniffler <159397573+gluesniffler@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 gluesniffler
+// SPDX-FileCopyrightText: 2025 username <113782077+whateverusername0@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 whateverusername0
+//
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
+namespace Content.Shared._Lavaland.Body;
+
+[RegisterComponent]
+public sealed partial class CursedHeartGrantComponent : Component;
\ No newline at end of file
diff --git a/Content.Shared/_Lavaland/Body/CursedHeartSystem.cs b/Content.Shared/_Lavaland/Body/CursedHeartSystem.cs
new file mode 100644
index 00000000000..36e24e225e2
--- /dev/null
+++ b/Content.Shared/_Lavaland/Body/CursedHeartSystem.cs
@@ -0,0 +1,105 @@
+using Content.Shared.Actions;
+using Content.Shared.Damage;
+using Content.Shared.Damage.Prototypes;
+using Content.Shared.Interaction.Events;
+using Content.Shared.Mobs;
+using Content.Shared.Mobs.Components;
+using Content.Shared.Mobs.Systems;
+using Content.Shared.Popups;
+using Robust.Shared.Audio;
+using Robust.Shared.Audio.Systems;
+using Robust.Shared.Prototypes;
+using Robust.Shared.Timing;
+using Content.Shared._Shitmed.Targeting; // Shitmed Change
+using Content.Shared.Damage.Systems; // Shitmed Change
+namespace Content.Shared._Lavaland.Body;
+
+// TODO: Use Shitmed instead of Shitcode
+public sealed class CursedHeartSystem : EntitySystem
+{
+ [Dependency] private readonly SharedActionsSystem _actions = default!;
+ [Dependency] private readonly SharedAudioSystem _audio = default!;
+ [Dependency] private readonly IGameTiming _timing = default!;
+ [Dependency] private readonly MobStateSystem _mobState = default!;
+ [Dependency] private readonly DamageableSystem _damage = default!;
+ //[Dependency] private readonly BloodstreamSystem _bloodstream = default!;
+ [Dependency] private readonly SharedPopupSystem _popup = default!;
+ [Dependency] private readonly IPrototypeManager _proto = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(OnMapInit);
+ SubscribeLocalEvent(OnShutdown);
+ SubscribeLocalEvent(OnPump);
+
+ SubscribeLocalEvent(OnUseInHand);
+ }
+
+ public override void Update(float frameTime)
+ {
+ base.Update(frameTime);
+
+ var query = EntityQueryEnumerator();
+ while (query.MoveNext(out var uid, out var comp, out var state))
+ {
+ if (state.CurrentState is MobState.Critical or MobState.Dead)
+ continue;
+
+ if (_timing.CurTime < comp.LastPump + TimeSpan.FromSeconds(comp.MaxDelay))
+ continue;
+
+ Damage(uid);
+ comp.LastPump = _timing.CurTime;
+ }
+ }
+
+ private void Damage(EntityUid uid)
+ {
+ // TODO: WHY BLOODSTREAM IS NOT IN SHARED RAAAAAGH
+ //_bloodstream.TryModifyBloodLevel(uid, -50, spill: false);
+ _damage.TryChangeDamage(uid, new DamageSpecifier(_proto.Index("Airloss"), 50), true, false);
+ _popup.PopupEntity(Loc.GetString("popup-cursed-heart-damage"), uid, uid, PopupType.MediumCaution);
+ }
+
+ private void OnMapInit(EntityUid uid, CursedHeartComponent comp, MapInitEvent args)
+ {
+ _actions.AddAction(uid, ref comp.PumpActionEntity, "ActionPumpCursedHeart");
+ }
+
+ private void OnShutdown(EntityUid uid, CursedHeartComponent comp, ComponentShutdown args)
+ {
+ _actions.RemoveAction(uid, comp.PumpActionEntity);
+ }
+
+ private void OnPump(EntityUid uid, CursedHeartComponent comp, PumpHeartActionEvent args)
+ {
+ if (args.Handled)
+ return;
+
+ args.Handled = true;
+ _audio.PlayGlobal(new SoundPathSpecifier("/Audio/_Lavaland/heartbeat.ogg"), uid);
+ _damage.TryChangeDamage(uid, new DamageSpecifier(_proto.Index("Brute"), -5), true, false, targetPart: TargetBodyPart.All); // Shitmed Change
+ _damage.TryChangeDamage(uid, new DamageSpecifier(_proto.Index("Airloss"), -5), true, false, targetPart: TargetBodyPart.All); // Shitmed Change
+ _damage.TryChangeDamage(uid, new DamageSpecifier(_proto.Index("Burn"), -8), true, false, targetPart: TargetBodyPart.All); // Shitmed Change
+ //_bloodstream.TryModifyBloodLevel(uid, 17);
+ comp.LastPump = _timing.CurTime;
+ }
+
+ private void OnUseInHand(EntityUid uid, CursedHeartGrantComponent comp, UseInHandEvent args)
+ {
+ if (HasComp(args.User))
+ {
+ _popup.PopupEntity(Loc.GetString("popup-cursed-heart-already-cursed"), args.User, args.User, PopupType.MediumCaution);
+ args.Handled = true;
+ return;
+ }
+
+ _audio.PlayGlobal(new SoundPathSpecifier("/Audio/_Lavaland/heartbeat.ogg"), args.User);
+ var heart = EnsureComp(args.User);
+ heart.LastPump = _timing.CurTime;
+ QueueDel(uid);
+ args.Handled = true;
+ }
+}
diff --git a/Content.Shared/_Lavaland/Weapons/GetLightAttackRangeEvent.cs b/Content.Shared/_Lavaland/Weapons/GetLightAttackRangeEvent.cs
new file mode 100644
index 00000000000..ec7c51c99fe
--- /dev/null
+++ b/Content.Shared/_Lavaland/Weapons/GetLightAttackRangeEvent.cs
@@ -0,0 +1,8 @@
+namespace Content.Goobstation.Common.Weapons;
+
+[ByRefEvent]
+public record struct GetLightAttackRangeEvent(EntityUid? Target, EntityUid User, float Range, bool Cancel = false);
+
+
+[ByRefEvent]
+public record struct LightAttackSpecialInteractionEvent(EntityUid? Target, EntityUid User, float Range, bool Cancel = false);
diff --git a/Content.Shared/_Lavaland/Weapons/MeleeWeaponRelayComponent.cs b/Content.Shared/_Lavaland/Weapons/MeleeWeaponRelayComponent.cs
new file mode 100644
index 00000000000..632f23c36e6
--- /dev/null
+++ b/Content.Shared/_Lavaland/Weapons/MeleeWeaponRelayComponent.cs
@@ -0,0 +1,33 @@
+// SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Aidenkrz
+// SPDX-FileCopyrightText: 2025 Aineias1
+// SPDX-FileCopyrightText: 2025 FaDeOkno <143940725+FaDeOkno@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 GoobBot
+// SPDX-FileCopyrightText: 2025 McBosserson <148172569+McBosserson@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Milon
+// SPDX-FileCopyrightText: 2025 Piras314
+// SPDX-FileCopyrightText: 2025 Rouden <149893554+Roudenn@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 TheBorzoiMustConsume <197824988+TheBorzoiMustConsume@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Unlumination <144041835+Unlumy@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 deltanedas <39013340+deltanedas@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 deltanedas <@deltanedas:kde.org>
+// SPDX-FileCopyrightText: 2025 gluesniffler <159397573+gluesniffler@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 gluesniffler
+// SPDX-FileCopyrightText: 2025 username <113782077+whateverusername0@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 whateverusername0
+//
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
+using Robust.Shared.GameStates;
+
+namespace Content.Shared._Lavaland.Weapons;
+
+///
+/// Allows this melee weapon to relay the damage and take it from some other sources, for example gun attachments.
+///
+[RegisterComponent, NetworkedComponent]
+public sealed partial class MeleeWeaponRelayComponent : Component;
+
+[ByRefEvent]
+public record struct GetRelayMeleeWeaponEvent(EntityUid? Found = null, bool Handled = false);
diff --git a/Content.Shared/_Lavaland/Weapons/Ranged/Events/ProjectileShotEvent.cs b/Content.Shared/_Lavaland/Weapons/Ranged/Events/ProjectileShotEvent.cs
new file mode 100644
index 00000000000..1451cbf8cf4
--- /dev/null
+++ b/Content.Shared/_Lavaland/Weapons/Ranged/Events/ProjectileShotEvent.cs
@@ -0,0 +1,31 @@
+// SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Aidenkrz
+// SPDX-FileCopyrightText: 2025 Aineias1
+// SPDX-FileCopyrightText: 2025 FaDeOkno <143940725+FaDeOkno@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 GoobBot
+// SPDX-FileCopyrightText: 2025 McBosserson <148172569+McBosserson@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Milon
+// SPDX-FileCopyrightText: 2025 Piras314
+// SPDX-FileCopyrightText: 2025 Rouden <149893554+Roudenn@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 TheBorzoiMustConsume <197824988+TheBorzoiMustConsume@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Unlumination <144041835+Unlumy@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 deltanedas <39013340+deltanedas@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 deltanedas <@deltanedas:kde.org>
+// SPDX-FileCopyrightText: 2025 gluesniffler <159397573+gluesniffler@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 gluesniffler
+// SPDX-FileCopyrightText: 2025 username <113782077+whateverusername0@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 whateverusername0
+//
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
+namespace Content.Shared._Lavaland.Weapons.Ranged.Events;
+
+///
+/// Raised on a gun when a projectile has been fired from it.
+///
+public sealed class ProjectileShotEvent : EntityEventArgs
+{
+ public EntityUid FiredProjectile = default!;
+}
+
diff --git a/Content.Shared/_Lavaland/Weapons/Ranged/MultishotComponent.cs b/Content.Shared/_Lavaland/Weapons/Ranged/MultishotComponent.cs
new file mode 100644
index 00000000000..2c47b33b9ef
--- /dev/null
+++ b/Content.Shared/_Lavaland/Weapons/Ranged/MultishotComponent.cs
@@ -0,0 +1,69 @@
+// SPDX-FileCopyrightText: 2024 BombasterDS <115770678+BombasterDS@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2024 Piras314
+// SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 BombasterDS
+// SPDX-FileCopyrightText: 2025 GoobBot
+// SPDX-FileCopyrightText: 2025 Misandry
+// SPDX-FileCopyrightText: 2025 gus
+// SPDX-FileCopyrightText: 2025 pheenty
+//
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
+using Robust.Shared.GameStates;
+
+namespace Content.Goobstation.Common.Weapons.Multishot;
+
+///
+/// This component allows guns to be shot with another such gun at the same time by holding them in both hands.
+///
+[RegisterComponent]
+[NetworkedComponent, AutoGenerateComponentState]
+public sealed partial class MultishotComponent : Component
+{
+ ///
+ /// Shows that this entity is affected with multishot debuffs.
+ ///
+ [DataField, AutoNetworkedField]
+ public bool MultishotAffected;
+
+ ///
+ /// The chance of bullet fired of the gun while dual-wielding getting its BulletImpassable fixture layer removed.
+ /// This effectively means that the bullet won't collide with people, but has no effect on hitscans (like lasers).
+ ///
+ [DataField]
+ public float MissChance = 0.2f;
+
+ ///
+ /// Spread multiplier of the gun while dual-wielding.
+ ///
+ [DataField]
+ public float SpreadMultiplier = 1.5f;
+
+ ///
+ /// Flat spread increase of the gun while dual-wielding.
+ ///
+ [DataField]
+ public float SpreadAddition = 5f;
+
+ ///
+ /// This is Common, and we can't import DamageSpecifier here, so we shitcode it instead.
+ /// Amount of damage applied to hands when firing this gun with another one. Doesn't damage the shooter itself.
+ ///
+ [DataField]
+ public float HandDamageAmount;
+
+ ///
+ /// Type of the said damage.
+ ///
+ [DataField]
+ public string HandDamageType = "Blunt";
+
+ ///
+ /// Stamina damage applied to the entity when firing this gun with another one.
+ ///
+ [DataField]
+ public float StaminaDamage;
+
+ [DataField]
+ public string ExamineMessage = "multishot-component-examine";
+}
diff --git a/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/Components/GunUpgradeBayonetComponent.cs b/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/Components/GunUpgradeBayonetComponent.cs
new file mode 100644
index 00000000000..b0721d3cdce
--- /dev/null
+++ b/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/Components/GunUpgradeBayonetComponent.cs
@@ -0,0 +1,30 @@
+// SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Aidenkrz
+// SPDX-FileCopyrightText: 2025 Aineias1
+// SPDX-FileCopyrightText: 2025 FaDeOkno <143940725+FaDeOkno@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 GoobBot
+// SPDX-FileCopyrightText: 2025 McBosserson <148172569+McBosserson@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Milon
+// SPDX-FileCopyrightText: 2025 Piras314
+// SPDX-FileCopyrightText: 2025 Rouden <149893554+Roudenn@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 TheBorzoiMustConsume <197824988+TheBorzoiMustConsume@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Unlumination <144041835+Unlumy@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 deltanedas <39013340+deltanedas@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 deltanedas <@deltanedas:kde.org>
+// SPDX-FileCopyrightText: 2025 gluesniffler <159397573+gluesniffler@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 gluesniffler
+// SPDX-FileCopyrightText: 2025 username <113782077+whateverusername0@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 whateverusername0
+//
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
+using Robust.Shared.GameStates;
+
+namespace Content.Shared._Lavaland.Weapons.Ranged.Upgrades.Components;
+
+///
+/// Component to indicate a valid bayonet for weapon attachment
+///
+[RegisterComponent, NetworkedComponent]
+public sealed partial class GunUpgradeBayonetComponent : Component;
diff --git a/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/Components/GunUpgradeComponent.cs b/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/Components/GunUpgradeComponent.cs
new file mode 100644
index 00000000000..6dcf871df7a
--- /dev/null
+++ b/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/Components/GunUpgradeComponent.cs
@@ -0,0 +1,58 @@
+// SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Aidenkrz
+// SPDX-FileCopyrightText: 2025 Aineias1
+// SPDX-FileCopyrightText: 2025 FaDeOkno <143940725+FaDeOkno@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 GoobBot
+// SPDX-FileCopyrightText: 2025 McBosserson <148172569+McBosserson@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Milon
+// SPDX-FileCopyrightText: 2025 Piras314
+// SPDX-FileCopyrightText: 2025 Rouden <149893554+Roudenn@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 TheBorzoiMustConsume <197824988+TheBorzoiMustConsume@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Unlumination <144041835+Unlumy@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 deltanedas <39013340+deltanedas@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 deltanedas <@deltanedas:kde.org>
+// SPDX-FileCopyrightText: 2025 gluesniffler <159397573+gluesniffler@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 gluesniffler
+// SPDX-FileCopyrightText: 2025 pheenty
+// SPDX-FileCopyrightText: 2025 username <113782077+whateverusername0@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 whateverusername0
+//
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
+using Robust.Shared.GameStates;
+
+
+namespace Content.Shared._Lavaland.Weapons.Ranged.Upgrades.Components;
+
+[Access(typeof(SharedGunUpgradeSystem))]
+[RegisterComponent, NetworkedComponent]
+public sealed partial class GunUpgradeLavalandComponent : Component
+{
+ ///
+ /// Literal name of this upgrade that is shown on all examine texts.
+ ///
+ [DataField(required: true)]
+ public LocId Name;
+
+ ///
+ /// Text to use when examining the upgrade itself.
+ ///
+ [DataField]
+ public LocId? ExamineTextType = "gun-upgrade-examine-type-upgrade";
+
+ ///
+ /// Text template to use when examining a weapon where this upgrade is inserted to.
+ ///
+ [DataField]
+ public LocId? InsertedTextType = "gun-upgrade-inserted-examine-type-contains";
+
+ [DataField]
+ public int? CapacityCost;
+
+ ///
+ /// If this string matches with some other weapon upgrade, it will fil to install.
+ ///
+ [DataField]
+ public string? UniqueGroup;
+}
diff --git a/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/Components/GunUpgradeComponentsComponent.cs b/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/Components/GunUpgradeComponentsComponent.cs
new file mode 100644
index 00000000000..eae8aa60bf7
--- /dev/null
+++ b/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/Components/GunUpgradeComponentsComponent.cs
@@ -0,0 +1,36 @@
+// SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Aidenkrz
+// SPDX-FileCopyrightText: 2025 Aineias1
+// SPDX-FileCopyrightText: 2025 FaDeOkno <143940725+FaDeOkno@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 GoobBot
+// SPDX-FileCopyrightText: 2025 McBosserson <148172569+McBosserson@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Milon
+// SPDX-FileCopyrightText: 2025 Piras314
+// SPDX-FileCopyrightText: 2025 Rouden <149893554+Roudenn@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 TheBorzoiMustConsume <197824988+TheBorzoiMustConsume@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Unlumination <144041835+Unlumy@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 deltanedas <39013340+deltanedas@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 deltanedas <@deltanedas:kde.org>
+// SPDX-FileCopyrightText: 2025 gluesniffler <159397573+gluesniffler@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 gluesniffler
+// SPDX-FileCopyrightText: 2025 pheenty
+// SPDX-FileCopyrightText: 2025 username <113782077+whateverusername0@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 whateverusername0
+//
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
+using Robust.Shared.GameStates;
+using Robust.Shared.Prototypes;
+
+namespace Content.Shared._Lavaland.Weapons.Ranged.Upgrades.Components;
+
+///
+/// Adds components when inserted and removes them when ejected from a weapon.
+///
+[RegisterComponent, NetworkedComponent, Access(typeof(SharedGunUpgradeSystem))]
+public sealed partial class GunUpgradeComponentsComponent : Component
+{
+ [DataField]
+ public ComponentRegistry Components = new();
+}
diff --git a/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/Components/GunUpgradeFireRateComponent.cs b/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/Components/GunUpgradeFireRateComponent.cs
new file mode 100644
index 00000000000..bc70e20219a
--- /dev/null
+++ b/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/Components/GunUpgradeFireRateComponent.cs
@@ -0,0 +1,34 @@
+// SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Aidenkrz
+// SPDX-FileCopyrightText: 2025 Aineias1
+// SPDX-FileCopyrightText: 2025 FaDeOkno <143940725+FaDeOkno@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 GoobBot
+// SPDX-FileCopyrightText: 2025 McBosserson <148172569+McBosserson@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Milon
+// SPDX-FileCopyrightText: 2025 Piras314
+// SPDX-FileCopyrightText: 2025 Rouden <149893554+Roudenn@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 TheBorzoiMustConsume <197824988+TheBorzoiMustConsume@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Unlumination <144041835+Unlumy@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 deltanedas <39013340+deltanedas@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 deltanedas <@deltanedas:kde.org>
+// SPDX-FileCopyrightText: 2025 gluesniffler <159397573+gluesniffler@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 gluesniffler
+// SPDX-FileCopyrightText: 2025 username <113782077+whateverusername0@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 whateverusername0
+//
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
+using Robust.Shared.GameStates;
+
+namespace Content.Shared._Lavaland.Weapons.Ranged.Upgrades.Components;
+
+///
+/// A for increasing the firerate of a gun.
+///
+[RegisterComponent, NetworkedComponent, Access(typeof(SharedGunUpgradeSystem))]
+public sealed partial class GunUpgradeFireRateLavalandComponent : Component
+{
+ [DataField]
+ public float Coefficient = 1;
+}
diff --git a/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/Components/GunUpgradePressureComponent.cs b/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/Components/GunUpgradePressureComponent.cs
new file mode 100644
index 00000000000..f5c387512bb
--- /dev/null
+++ b/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/Components/GunUpgradePressureComponent.cs
@@ -0,0 +1,39 @@
+// SPDX-FileCopyrightText: 2025 GoobBot
+// SPDX-FileCopyrightText: 2025 pheenty
+//
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
+using Content.Shared.Atmos;
+
+namespace Content.Shared._Lavaland.Weapons.Ranged.Upgrades.Components;
+
+///
+/// Changes pressure modifiers on a weapon that supports them.
+///
+[RegisterComponent]
+public sealed partial class GunUpgradePressureComponent : Component
+{
+ [DataField]
+ public float? NewLowerBound;
+
+ [DataField]
+ public float? NewUpperBound;
+
+ [DataField]
+ public bool? NewApplyWhenInRange = true;
+
+ [DataField]
+ public float? NewAppliedModifier = 2f;
+
+ [ViewVariables]
+ public float SavedLowerBound = Atmospherics.OneAtmosphere * 0.2f;
+
+ [ViewVariables]
+ public float SavedUpperBound = Atmospherics.OneAtmosphere * 0.5f;
+
+ [ViewVariables]
+ public bool SavedApplyWhenInRange = true;
+
+ [ViewVariables]
+ public float SavedAppliedModifier = 2f;
+}
diff --git a/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/Components/GunUpgradeProjectileComponentsComponent.cs b/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/Components/GunUpgradeProjectileComponentsComponent.cs
new file mode 100644
index 00000000000..622fe25e300
--- /dev/null
+++ b/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/Components/GunUpgradeProjectileComponentsComponent.cs
@@ -0,0 +1,35 @@
+// SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Aidenkrz
+// SPDX-FileCopyrightText: 2025 Aineias1
+// SPDX-FileCopyrightText: 2025 FaDeOkno <143940725+FaDeOkno@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 GoobBot
+// SPDX-FileCopyrightText: 2025 McBosserson <148172569+McBosserson@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Milon
+// SPDX-FileCopyrightText: 2025 Piras314
+// SPDX-FileCopyrightText: 2025 Rouden <149893554+Roudenn@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 TheBorzoiMustConsume <197824988+TheBorzoiMustConsume@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Unlumination <144041835+Unlumy@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 deltanedas <39013340+deltanedas@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 deltanedas <@deltanedas:kde.org>
+// SPDX-FileCopyrightText: 2025 gluesniffler <159397573+gluesniffler@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 gluesniffler
+// SPDX-FileCopyrightText: 2025 username <113782077+whateverusername0@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 whateverusername0
+//
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
+using Robust.Shared.GameStates;
+using Robust.Shared.Prototypes;
+
+namespace Content.Shared._Lavaland.Weapons.Ranged.Upgrades.Components;
+
+///
+/// A for adding new components to projectiles shot by this weapon.
+///
+[RegisterComponent, NetworkedComponent, Access(typeof(SharedGunUpgradeSystem))]
+public sealed partial class GunUpgradeProjectileComponentsComponent : Component
+{
+ [DataField]
+ public ComponentRegistry Components = new();
+}
diff --git a/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/Components/GunUpgradeSpeedComponent.cs b/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/Components/GunUpgradeSpeedComponent.cs
new file mode 100644
index 00000000000..594190acdd5
--- /dev/null
+++ b/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/Components/GunUpgradeSpeedComponent.cs
@@ -0,0 +1,34 @@
+// SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Aidenkrz
+// SPDX-FileCopyrightText: 2025 Aineias1
+// SPDX-FileCopyrightText: 2025 FaDeOkno <143940725+FaDeOkno@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 GoobBot
+// SPDX-FileCopyrightText: 2025 McBosserson <148172569+McBosserson@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Milon
+// SPDX-FileCopyrightText: 2025 Piras314
+// SPDX-FileCopyrightText: 2025 Rouden <149893554+Roudenn@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 TheBorzoiMustConsume <197824988+TheBorzoiMustConsume@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Unlumination <144041835+Unlumy@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 deltanedas <39013340+deltanedas@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 deltanedas <@deltanedas:kde.org>
+// SPDX-FileCopyrightText: 2025 gluesniffler <159397573+gluesniffler@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 gluesniffler
+// SPDX-FileCopyrightText: 2025 username <113782077+whateverusername0@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 whateverusername0
+//
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
+using Robust.Shared.GameStates;
+
+namespace Content.Shared._Lavaland.Weapons.Ranged.Upgrades.Components;
+
+///
+/// A for increasing the speed of a gun's projectile.
+///
+[RegisterComponent, NetworkedComponent, Access(typeof(SharedGunUpgradeSystem))]
+public sealed partial class GunUpgradeSpeedLavalandComponent : Component
+{
+ [DataField]
+ public float Coefficient = 1;
+}
diff --git a/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/Components/GunUpgradeVampirismComponent.cs b/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/Components/GunUpgradeVampirismComponent.cs
new file mode 100644
index 00000000000..4798b06cad5
--- /dev/null
+++ b/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/Components/GunUpgradeVampirismComponent.cs
@@ -0,0 +1,43 @@
+// SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Aidenkrz
+// SPDX-FileCopyrightText: 2025 Aineias1
+// SPDX-FileCopyrightText: 2025 FaDeOkno <143940725+FaDeOkno@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 GoobBot
+// SPDX-FileCopyrightText: 2025 McBosserson <148172569+McBosserson@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Milon
+// SPDX-FileCopyrightText: 2025 Piras314
+// SPDX-FileCopyrightText: 2025 Rouden <149893554+Roudenn@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 TheBorzoiMustConsume <197824988+TheBorzoiMustConsume@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Unlumination <144041835+Unlumy@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 deltanedas <39013340+deltanedas@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 deltanedas <@deltanedas:kde.org>
+// SPDX-FileCopyrightText: 2025 gluesniffler <159397573+gluesniffler@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 gluesniffler
+// SPDX-FileCopyrightText: 2025 username <113782077+whateverusername0@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 whateverusername0
+//
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
+
+using Content.Shared.Damage;
+using Robust.Shared.GameStates;
+
+namespace Content.Shared._Lavaland.Weapons.Ranged.Upgrades.Components;
+
+///
+/// A for increasing the damage of a gun's projectile.
+///
+[RegisterComponent, NetworkedComponent, Access(typeof(SharedGunUpgradeSystem))]
+public sealed partial class GunUpgradeVampirismComponent : Component
+{
+ [DataField]
+ public DamageSpecifier DamageOnHit = new();
+}
+
+[RegisterComponent, NetworkedComponent, Access(typeof(SharedGunUpgradeSystem))]
+public sealed partial class ProjectileVampirismComponent : Component
+{
+ [DataField]
+ public DamageSpecifier DamageOnHit = new();
+}
diff --git a/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/Components/UpgradeableWeaponComponent.cs b/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/Components/UpgradeableWeaponComponent.cs
new file mode 100644
index 00000000000..ec2e68d985d
--- /dev/null
+++ b/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/Components/UpgradeableWeaponComponent.cs
@@ -0,0 +1,35 @@
+// SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Aidenkrz
+// SPDX-FileCopyrightText: 2025 Aineias1
+// SPDX-FileCopyrightText: 2025 FaDeOkno <143940725+FaDeOkno@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 GoobBot
+// SPDX-FileCopyrightText: 2025 McBosserson <148172569+McBosserson@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Milon
+// SPDX-FileCopyrightText: 2025 Piras314
+// SPDX-FileCopyrightText: 2025 Rouden <149893554+Roudenn@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 TheBorzoiMustConsume <197824988+TheBorzoiMustConsume@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Unlumination <144041835+Unlumy@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 deltanedas <39013340+deltanedas@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 deltanedas <@deltanedas:kde.org>
+// SPDX-FileCopyrightText: 2025 gluesniffler <159397573+gluesniffler@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 gluesniffler
+// SPDX-FileCopyrightText: 2025 pheenty
+// SPDX-FileCopyrightText: 2025 username <113782077+whateverusername0@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 whateverusername0
+//
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
+using Robust.Shared.GameStates;
+
+namespace Content.Shared._Lavaland.Weapons.Ranged.Upgrades.Components;
+
+[RegisterComponent, NetworkedComponent, Access(typeof(SharedGunUpgradeSystem))]
+public sealed partial class UpgradeableWeaponComponent : Component
+{
+ ///
+ /// If specified, upgrades that support capacity will block any new upgrades from being inserted
+ ///
+ [DataField]
+ public int? MaxUpgradeCapacity;
+}
diff --git a/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/Components/WeaponUpgradeDamageComponent.cs b/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/Components/WeaponUpgradeDamageComponent.cs
new file mode 100644
index 00000000000..7aa88f1f6ce
--- /dev/null
+++ b/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/Components/WeaponUpgradeDamageComponent.cs
@@ -0,0 +1,20 @@
+using Content.Shared.Damage;
+using Robust.Shared.GameStates;
+
+namespace Content.Shared._Lavaland.Weapons.Ranged.Upgrades.Components;
+
+///
+/// A for increasing the damage of a gun's projectile.
+///
+[RegisterComponent, NetworkedComponent, Access(typeof(SharedGunUpgradeSystem))]
+public sealed partial class WeaponUpgradeDamageComponent : Component
+{
+ [DataField]
+ public DamageSpecifier? BonusDamage;
+
+ ///
+ /// How much should we multiply the total projectile's damage.
+ ///
+ [DataField]
+ public float Modifier = 1f;
+}
diff --git a/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/Components/WeaponUpgradeRangeComponent.cs b/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/Components/WeaponUpgradeRangeComponent.cs
new file mode 100644
index 00000000000..3b05cf8c3e1
--- /dev/null
+++ b/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/Components/WeaponUpgradeRangeComponent.cs
@@ -0,0 +1,16 @@
+using Robust.Shared.GameStates;
+
+namespace Content.Shared._Lavaland.Weapons.Ranged.Upgrades.Components;
+
+///
+/// Upgrades the range of a melee weapon.
+///
+[RegisterComponent, NetworkedComponent]
+public sealed partial class WeaponUpgradeRangeComponent : Component
+{
+ [DataField]
+ public float? BonusRange;
+
+ [DataField]
+ public float? RangeMultiplier;
+}
diff --git a/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/Components/WeaponUpgradeSpeedComponent.cs b/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/Components/WeaponUpgradeSpeedComponent.cs
new file mode 100644
index 00000000000..2cae10739d3
--- /dev/null
+++ b/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/Components/WeaponUpgradeSpeedComponent.cs
@@ -0,0 +1,16 @@
+using Robust.Shared.GameStates;
+
+namespace Content.Shared._Lavaland.Weapons.Ranged.Upgrades.Components;
+
+///
+/// Improves attack rate of melee weapon.
+///
+[RegisterComponent, NetworkedComponent]
+public sealed partial class WeaponUpgradeSpeedComponent : Component
+{
+ [DataField]
+ public float? BonusAttackRate;
+
+ [DataField]
+ public float? AttackRateMultiplier;
+}
diff --git a/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/SharedGunUpgradeSystem.Upgrades.cs b/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/SharedGunUpgradeSystem.Upgrades.cs
new file mode 100644
index 00000000000..ae627260045
--- /dev/null
+++ b/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/SharedGunUpgradeSystem.Upgrades.cs
@@ -0,0 +1,129 @@
+using Content.Goobstation.Common.Weapons;
+using Content.Shared._Goobstation.Weapons.Ranged;
+using Content.Shared._Lavaland.Weapons.Ranged.Upgrades.Components;
+using Content.Shared.Mobs.Components;
+using Content.Shared.Projectiles;
+using Content.Shared.Weapons.Melee.Events;
+using Content.Shared.Weapons.Ranged.Events;
+using Content.Shared.Weapons.Ranged.Systems;
+using Content.Shared.Weapons.Ranged.Upgrades.Components;
+using Robust.Shared.Containers;
+
+namespace Content.Shared._Lavaland.Weapons.Ranged.Upgrades;
+
+public abstract partial class SharedGunUpgradeSystem
+{
+ private void InitializeUpgrades()
+ {
+ SubscribeLocalEvent(OnCompsUpgradeInsert);
+ SubscribeLocalEvent(OnCompsUpgradeEject);
+
+ SubscribeLocalEvent(OnFireRateRefresh);
+ SubscribeLocalEvent(OnFireRateRefreshRecharge);
+
+ SubscribeLocalEvent(OnSpeedRefresh);
+
+ SubscribeLocalEvent(OnDamageGunShotComps);
+
+ SubscribeLocalEvent(OnVampirismGunShot);
+ SubscribeLocalEvent(OnVampirismProjectileHit);
+
+ SubscribeLocalEvent(OnGetMeleeRelay);
+
+ SubscribeLocalEvent(OnGetMeleeDamage);
+
+ SubscribeLocalEvent(OnGetRange);
+ SubscribeLocalEvent(OnGetAttackRate);
+ }
+
+ private void OnFireRateRefresh(Entity ent, ref GunRefreshModifiersEvent args)
+ {
+ args.FireRate *= ent.Comp.Coefficient;
+ args.BurstFireRate *= ent.Comp.Coefficient;
+ args.BurstCooldown /= ent.Comp.Coefficient;
+ args.BurstFireRate /= ent.Comp.Coefficient;
+ }
+
+ private void OnFireRateRefreshRecharge(Entity ent, ref RechargeBasicEntityAmmoGetCooldownModifiersEvent args)
+ {
+ args.Multiplier /= ent.Comp.Coefficient;
+ }
+
+ private void OnCompsUpgradeInsert(Entity ent, ref EntGotInsertedIntoContainerMessage args)
+ {
+ if (!_timing.ApplyingState && HasComp(args.Container.Owner))
+ EntityManager.AddComponents(args.Container.Owner, ent.Comp.Components);
+ }
+
+ private void OnCompsUpgradeEject(Entity ent, ref EntGotRemovedFromContainerMessage args)
+ {
+ if (!_timing.ApplyingState && HasComp(args.Container.Owner))
+ EntityManager.RemoveComponents(args.Container.Owner, ent.Comp.Components);
+ }
+
+ private void OnSpeedRefresh(Entity ent, ref GunRefreshModifiersEvent args)
+ {
+ args.ProjectileSpeed *= ent.Comp.Coefficient;
+ }
+
+ private void OnDamageGunShotComps(Entity ent, ref GunShotEvent args)
+ {
+ foreach (var (ammo, _) in args.Ammo)
+ {
+ if (HasComp(ammo))
+ EntityManager.AddComponents(ammo.Value, ent.Comp.Components);
+ }
+ }
+
+ private void OnVampirismGunShot(Entity ent, ref GunShotEvent args)
+ {
+ foreach (var (ammo, _) in args.Ammo)
+ {
+ if (!HasComp(ammo))
+ continue;
+
+ var comp = EnsureComp(ammo.Value);
+ comp.DamageOnHit = ent.Comp.DamageOnHit;
+ }
+ }
+
+ private void OnVampirismProjectileHit(Entity ent, ref ProjectileHitEvent args)
+ {
+ if (!HasComp(args.Target))
+ return;
+ if (args.Shooter != null)
+ _damage.TryChangeDamage(args.Shooter.Value, ent.Comp.DamageOnHit); // may need to revert this shit
+ }
+
+ private void OnGetMeleeRelay(Entity ent, ref GetRelayMeleeWeaponEvent args)
+ {
+ if (args.Handled)
+ return;
+
+ args.Found = ent.Owner;
+ args.Handled = true;
+ }
+
+ private void OnGetMeleeDamage(Entity ent, ref GetMeleeDamageEvent args)
+ {
+ if (ent.Comp.BonusDamage != null)
+ args.Damage += ent.Comp.BonusDamage;
+ args.Damage *= ent.Comp.Modifier;
+ }
+
+ private void OnGetRange(Entity ent, ref GetLightAttackRangeEvent args)
+ {
+ if (ent.Comp.BonusRange != null)
+ args.Range += ent.Comp.BonusRange.Value;
+ if (ent.Comp.RangeMultiplier != null)
+ args.Range *= ent.Comp.RangeMultiplier.Value;
+ }
+
+ private void OnGetAttackRate(Entity ent, ref GetMeleeAttackRateEvent args)
+ {
+ if (ent.Comp.BonusAttackRate != null)
+ args.Rate += ent.Comp.BonusAttackRate.Value;
+ if (ent.Comp.AttackRateMultiplier != null)
+ args.Multipliers *= ent.Comp.AttackRateMultiplier.Value;
+ }
+}
diff --git a/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/SharedGunUpgradeSystem.cs b/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/SharedGunUpgradeSystem.cs
new file mode 100644
index 00000000000..29c4f632068
--- /dev/null
+++ b/Content.Shared/_Lavaland/Weapons/Ranged/Upgrades/SharedGunUpgradeSystem.cs
@@ -0,0 +1,188 @@
+// SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Aidenkrz
+// SPDX-FileCopyrightText: 2025 Aineias1
+// SPDX-FileCopyrightText: 2025 FaDeOkno <143940725+FaDeOkno@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 GoobBot
+// SPDX-FileCopyrightText: 2025 Ilya246 <57039557+Ilya246@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 McBosserson <148172569+McBosserson@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Milon
+// SPDX-FileCopyrightText: 2025 Misandry
+// SPDX-FileCopyrightText: 2025 Piras314
+// SPDX-FileCopyrightText: 2025 Rouden <149893554+Roudenn@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 SX-7 <92227810+SX-7@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Ted Lukin <66275205+pheenty@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 TheBorzoiMustConsume <197824988+TheBorzoiMustConsume@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Unlumination <144041835+Unlumy@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 deltanedas <39013340+deltanedas@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 deltanedas <@deltanedas:kde.org>
+// SPDX-FileCopyrightText: 2025 gluesniffler <159397573+gluesniffler@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 gluesniffler
+// SPDX-FileCopyrightText: 2025 gus
+// SPDX-FileCopyrightText: 2025 pheenty
+// SPDX-FileCopyrightText: 2025 username <113782077+whateverusername0@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 whateverusername0
+//
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
+using Content.Shared._Lavaland.Weapons.Ranged.Upgrades.Components;
+using Content.Shared._Lavaland.Weapons.Ranged.Events;
+using Content.Shared.Containers.ItemSlots;
+using Content.Shared.Damage;
+using Content.Shared.Examine;
+using Content.Shared.Weapons.Ranged.Events;
+using Content.Shared.Weapons.Ranged.Systems;
+using System.Linq;
+using Content.Goobstation.Common.Weapons;
+using Content.Shared._Goobstation.Weapons.Ranged;
+using Content.Shared.Actions;
+using Content.Shared.Damage.Systems;
+using Content.Shared.Weapons.Melee.Events;
+using Content.Shared.Weapons.Ranged.Components;
+using Robust.Shared.Containers;
+using Robust.Shared.Timing;
+
+namespace Content.Shared._Lavaland.Weapons.Ranged.Upgrades;
+
+public abstract partial class SharedGunUpgradeSystem : EntitySystem
+{
+ [Dependency] private readonly IGameTiming _timing = default!;
+ [Dependency] private readonly SharedActionsSystem _actions = default!;
+ [Dependency] private readonly ActionContainerSystem _actionContainer = default!;
+ [Dependency] private readonly SharedGunSystem _gun = default!;
+ [Dependency] private readonly DamageableSystem _damage = default!;
+
+ ///
+ public override void Initialize()
+ {
+ SubscribeLocalEvent(OnUpgradeInserted);
+ SubscribeLocalEvent(OnItemSlotInsertAttemptEvent);
+ SubscribeLocalEvent(OnExamine);
+
+ SubscribeLocalEvent(RelayEvent);
+ SubscribeLocalEvent(RelayEvent);
+ SubscribeLocalEvent(RelayEvent);
+ SubscribeLocalEvent(RelayEvent);
+ SubscribeLocalEvent(RelayEvent);
+ SubscribeLocalEvent(RelayEvent);
+ SubscribeLocalEvent(RelayEvent);
+ SubscribeLocalEvent(RelayEvent);
+ SubscribeLocalEvent(RelayEvent);
+
+ //SubscribeLocalEvent(RelayGetActionEvent); // Floofstation - not doing upgrade pull outs yet
+
+ SubscribeLocalEvent(OnUpgradeExamine);
+
+ InitializeUpgrades();
+ }
+
+ private void RelayEvent(Entity ent, ref T args) where T : notnull
+ {
+ foreach (var upgrade in GetCurrentUpgrades(ent))
+ {
+ RaiseLocalEvent(upgrade, ref args);
+ }
+ }
+
+ // Floofstation - we are not doing upgrade pulling out yet (pull out game weak)
+ // Because of how action container work we need that workaround for GetItemActionsEvent
+ /*
+ private void RelayGetActionEvent(Entity ent, ref GetItemActionsEvent args)
+ {
+ foreach (var upgrade in GetCurrentUpgrades(ent))
+ {
+ var ev = new GetItemActionsEvent(_actionContainer, args.User, upgrade.Owner, isEquipping: args.isEquipping);
+ RaiseLocalEvent(upgrade.Owner, ev);
+
+ if (ev.Actions.Count == 0)
+ continue;
+
+ if (!args.IsEquipping)
+ {
+ _actions.RemoveProvidedActions(args.User, upgrade.Owner);
+ _actions.SaveActions(args.User);
+ continue;
+ }
+
+ _actions.GrantActions(args.User, ev.Actions, upgrade.Owner);
+ _actions.LoadActions(args.User);
+ }
+ }
+ */
+ private void OnExamine(Entity ent, ref ExaminedEvent args)
+ {
+ var usedCapacity = 0;
+ using (args.PushGroup(nameof(UpgradeableWeaponComponent)))
+ {
+ foreach (var upgrade in GetCurrentUpgrades(ent))
+ {
+ if (upgrade.Comp.InsertedTextType != null)
+ args.PushMarkup(Loc.GetString(upgrade.Comp.InsertedTextType.Value, ("name", Loc.GetString(upgrade.Comp.Name))));
+ if (upgrade.Comp.CapacityCost != null)
+ usedCapacity += upgrade.Comp.CapacityCost.Value;
+ }
+
+ if (ent.Comp.MaxUpgradeCapacity != null)
+ args.PushMarkup(Loc.GetString("upgradeable-gun-total-remaining-capacity", ("value", ent.Comp.MaxUpgradeCapacity.Value - usedCapacity)));
+ }
+ }
+
+ private void OnUpgradeExamine(Entity ent, ref ExaminedEvent args)
+ {
+ if (ent.Comp.ExamineTextType != null) // TODO add a list of all weapon types that this gun upgrade can be inserted to
+ args.PushMarkup(Loc.GetString(ent.Comp.ExamineTextType.Value, ("name", Loc.GetString(ent.Comp.Name))));
+
+ if (ent.Comp.CapacityCost != null)
+ args.PushMarkup(Loc.GetString("gun-upgrade-capacity-cost", ("value", ent.Comp.CapacityCost.Value)));
+ }
+
+ private void OnUpgradeInserted(Entity ent, ref EntInsertedIntoContainerMessage args)
+ {
+ // Update some characteristics here.
+ if (TryComp(ent.Owner, out GunComponent? gun))
+ _gun.RefreshModifiers((ent.Owner, gun));
+ }
+
+ private void OnItemSlotInsertAttemptEvent(Entity ent, ref ItemSlotInsertAttemptEvent args)
+ {
+ if (!TryComp(args.Item, out var upgradeComp)
+ || !TryComp(ent, out var itemSlots))
+ return;
+
+ var currentUpgrades = GetCurrentUpgrades(ent, itemSlots);
+ var totalCapacityCost = currentUpgrades.Sum(upgrade => upgrade.Comp.CapacityCost);
+ if (totalCapacityCost + upgradeComp.CapacityCost > ent.Comp.MaxUpgradeCapacity)
+ {
+ args.Cancelled = true;
+ return;
+ }
+
+ foreach (var curUpgrade in currentUpgrades)
+ {
+ if (upgradeComp.UniqueGroup == null
+ || curUpgrade.Comp.UniqueGroup == null
+ || upgradeComp.UniqueGroup != curUpgrade.Comp.UniqueGroup)
+ continue;
+
+ args.Cancelled = true;
+ return;
+ }
+ }
+
+ public HashSet> GetCurrentUpgrades(Entity ent, ItemSlotsComponent? itemSlots = null)
+ {
+ if (!Resolve(ent, ref itemSlots))
+ return [];
+
+ var upgrades = new HashSet>();
+
+ foreach (var itemSlot in itemSlots.Slots.Values)
+ {
+ if (itemSlot is { HasItem: true, Item: { } item }
+ && TryComp(item, out var upgradeComp))
+ upgrades.Add((item, upgradeComp));
+ }
+
+ return upgrades;
+ }
+}
diff --git a/Content.Shared/_Lavaland/Weapons/RechargeBasicEntityAmmoGetCooldownModifiersEvent.cs b/Content.Shared/_Lavaland/Weapons/RechargeBasicEntityAmmoGetCooldownModifiersEvent.cs
new file mode 100644
index 00000000000..d93ab9f8b37
--- /dev/null
+++ b/Content.Shared/_Lavaland/Weapons/RechargeBasicEntityAmmoGetCooldownModifiersEvent.cs
@@ -0,0 +1,16 @@
+// SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Aidenkrz
+// SPDX-FileCopyrightText: 2025 Ilya246 <57039557+Ilya246@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 Misandry
+// SPDX-FileCopyrightText: 2025 SX-7 <92227810+SX-7@users.noreply.github.com>
+// SPDX-FileCopyrightText: 2025 gus
+//
+// SPDX-License-Identifier: AGPL-3.0-or-later
+
+namespace Content.Shared._Goobstation.Weapons.Ranged;
+
+// todo: get event names closer to the length of the bible
+[ByRefEvent]
+public record struct RechargeBasicEntityAmmoGetCooldownModifiersEvent(
+ float Multiplier
+);
\ No newline at end of file
diff --git a/Resources/Locale/en-US/_Lavaland/salvage/fibers.ftl b/Resources/Locale/en-US/_Lavaland/salvage/fibers.ftl
new file mode 100644
index 00000000000..e66f3d0c88d
--- /dev/null
+++ b/Resources/Locale/en-US/_Lavaland/salvage/fibers.ftl
@@ -0,0 +1 @@
+fibers-kinetic = kinetic
diff --git a/Resources/Locale/en-US/weapons/ranged/upgrades.ftl b/Resources/Locale/en-US/weapons/ranged/upgrades.ftl
index c766b1e6672..90cfddce330 100644
--- a/Resources/Locale/en-US/weapons/ranged/upgrades.ftl
+++ b/Resources/Locale/en-US/weapons/ranged/upgrades.ftl
@@ -5,3 +5,4 @@ gun-upgrade-popup-insert = Inserted {THE($upgrade)} into {THE($gun)}!
gun-upgrade-examine-text-damage = This has upgraded [color=#ec9b2d][bold]damage.[/bold][/color]
gun-upgrade-examine-text-range = This has upgraded [color=#2decec][bold]range.[/bold][/color]
gun-upgrade-examine-text-reload = This has upgraded [color=#bbf134][bold]fire rate.[/bold][/color]
+gun-upgrade-vampirism-name = This has upgraded [color=crimson][bold]vampirism[/bold][/color]
diff --git a/Resources/Prototypes/Entities/Objects/Tools/pka_upgrade.yml b/Resources/Prototypes/Entities/Objects/Tools/pka_upgrade.yml
index 4e99802c522..d8b8be20b7a 100644
--- a/Resources/Prototypes/Entities/Objects/Tools/pka_upgrade.yml
+++ b/Resources/Prototypes/Entities/Objects/Tools/pka_upgrade.yml
@@ -31,14 +31,20 @@
color: "#a71010"
- state: overlay-3
color: "#eb4c13"
+ # Floofstation - lavaland pka changes start
- type: GunUpgrade
#tags: [ GunUpgradeDamage ] # DeltaV - allow multiple
examineText: gun-upgrade-examine-text-damage
- type: GunUpgradeDamage
- damage:
- types:
- Blunt: 5 # DeltaV - modkits can still exist but greatly lowering how much it does so we don't have 70 damage monster gun anymore
- #Structural: 15 # DeltaV - SS13 parity, 10 blunt per shot only
+ modifier: 1.25
+ #Modifier:
+ # types:
+ # Blunt: 5 # DeltaV - modkits can still exist but greatly lowering how much it does so we don't have 70 damage monster gun anymore
+ # #Structural: 15 # DeltaV - SS13 parity, 10 blunt per shot only
+ #damage:
+ # types:
+ # Blunt: 10
+ # Floofstation - lavaland pka changes end
- type: entity
id: PKAUpgradeRange
@@ -54,13 +60,17 @@
color: "#1012a7"
- state: overlay-3
color: "#1373eb"
+ # Floofstation - lavaland pka changes start
- type: GunUpgrade
#tags: [ GunUpgradeRange ] # DeltaV - allow multiple
examineText: gun-upgrade-examine-text-range
- - type: GunUpgradeRange # DeltaV - actually change range not speed
- coefficient: 1.15 # DeltaV - lowered further to account for increased base range
- - type: GunUpgradeCost # DeltaV
- cost: 25
+ #- type: GunUpgradeRange # DeltaV - actually change range not speed
+ # coefficient: 1.15 # DeltaV - lowered further to account for increased base range
+ #- type: GunUpgradeCost # DeltaV
+ # cost: 25
+ - type: GunUpgradeSpeed
+ coefficient: 1.5
+ # Floofstation - lavaland pka changes end
- type: entity
id: PKAUpgradeFireRate
@@ -81,4 +91,3 @@
examineText: gun-upgrade-examine-text-reload
- type: GunUpgradeFireRate
coefficient: 1.25 # DeltaV - was 1.5, SS13 parity (maths used is different but same result: 0.64s recharge time with 3 upgrades)
-
diff --git a/Resources/Prototypes/_DV/Catalog/VendingMachines/Inventories/salvage_points.yml b/Resources/Prototypes/_DV/Catalog/VendingMachines/Inventories/salvage_points.yml
index 2a852e50da2..4c3e3980402 100644
--- a/Resources/Prototypes/_DV/Catalog/VendingMachines/Inventories/salvage_points.yml
+++ b/Resources/Prototypes/_DV/Catalog/VendingMachines/Inventories/salvage_points.yml
@@ -47,7 +47,17 @@
cost: 3500
- id: PKAUpgradeDamage
cost: 5000
- #BEGIN floofstation addtions
+ #BEGIN floofstation addtions
+ - id: PKAUpgradeFireRate
+ cost: 5000
+ - id: LavalandWeaponKineticMachete
+ cost: 750
+ - id: LavalandWeaponKineticClaws
+ cost: 750
+ - id: WeaponCrusherHammer
+ cost: 1000
+ - id: WeaponCrusherHalberd
+ cost: 1000
- id: WeaponSniperMosin
cost: 5000
- id: WeaponPistolForged
@@ -79,6 +89,5 @@
# TODO: mining drone stuff
- id: MedicalTrackingImplanter
cost: 10000
- - id: LavalandJaunter
+ - id: LavalandJaunter
cost: 2500
-
\ No newline at end of file
diff --git a/Resources/Prototypes/_DV/Recipes/Lathes/Packs/logistics.yml b/Resources/Prototypes/_DV/Recipes/Lathes/Packs/logistics.yml
index 8beacc5b63d..dae91ebedb8 100644
--- a/Resources/Prototypes/_DV/Recipes/Lathes/Packs/logistics.yml
+++ b/Resources/Prototypes/_DV/Recipes/Lathes/Packs/logistics.yml
@@ -27,6 +27,11 @@
- WeaponProtoKineticAccelerator
- PKAUpgradeDamage
- PKAUpgradeRange
+ # Floofstation additions start
+ - WeaponProtoKineticPistol
+ - WeaponProtoKineticRepeater
+ - WeaponProtoKineticShotgun
+ # Floofstation additions end
- type: latheRecipePack
id: SalvageHardsuits
diff --git a/Resources/Prototypes/_DV/Research/arsenal.yml b/Resources/Prototypes/_DV/Research/arsenal.yml
index 0f20e3bda2a..85697d771ba 100644
--- a/Resources/Prototypes/_DV/Research/arsenal.yml
+++ b/Resources/Prototypes/_DV/Research/arsenal.yml
@@ -12,6 +12,11 @@
recipeUnlocks:
- WeaponProtoKineticAccelerator
- ShuttleGunKineticCircuitboard
+ # Floofstation additions start
+ - WeaponProtoKineticPistol
+ - WeaponProtoKineticRepeater
+ - WeaponProtoKineticShotgun
+ # Floofstation additions end
# These are roundstart but not replenishable for salvage
# Tier 2
diff --git a/Resources/Prototypes/_Lavaland/Actions/cursed_heart.yml b/Resources/Prototypes/_Lavaland/Actions/cursed_heart.yml
new file mode 100644
index 00000000000..9fcc963972e
--- /dev/null
+++ b/Resources/Prototypes/_Lavaland/Actions/cursed_heart.yml
@@ -0,0 +1,17 @@
+- type: entity
+ parent: BaseAction
+ id: ActionPumpCursedHeart
+ name: Heartbeat
+ description: Pump your own blood to live!
+ categories: [ HideSpawnMenu ]
+ components:
+ - type: Action
+ icon:
+ sprite: _Lavaland/Objects/Specific/loot.rsi
+ state: cursed_heart
+ checkCanInteract: false
+ checkConsciousness: false
+ itemIconStyle: BigAction
+ useDelay: 1
+ - type: InstantAction
+ event: !type:PumpHeartActionEvent
diff --git a/Resources/Prototypes/_Lavaland/Entities/Objects/Weapons/Guns/Basic/pka.yml b/Resources/Prototypes/_Lavaland/Entities/Objects/Weapons/Guns/Basic/pka.yml
index dc7659c8e69..0b762b48bb9 100644
--- a/Resources/Prototypes/_Lavaland/Entities/Objects/Weapons/Guns/Basic/pka.yml
+++ b/Resources/Prototypes/_Lavaland/Entities/Objects/Weapons/Guns/Basic/pka.yml
@@ -4,6 +4,117 @@
table: !type:GroupSelector
children:
- id: WeaponProtoKineticAccelerator
- #- id: WeaponProtoKineticShotgun - Euphoria
- #- id: WeaponProtoKineticRepeater - Euphoria
- #- id: WeaponProtoKineticPistol - Euphoria
+ - id: WeaponProtoKineticShotgun
+ - id: WeaponProtoKineticRepeater
+ - id: WeaponProtoKineticPistol
+
+- type: entity
+ name: proto-kinetic shotgun
+ id: WeaponProtoKineticShotgun
+ parent: [ BaseGunWieldable, WeaponProtoKineticAcceleratorBase, BaseCargoContraband ]
+ description: Fires a spread of low-damage kinetic bolts that are half as effective for mining.
+ components:
+ - type: Sprite
+ sprite: _Lavaland/Objects/Weapons/Guns/Basic/kinetic_shotgun.rsi
+ layers:
+ - state: icon
+ - state: animation-icon
+ visible: false
+ map: [ "empty-icon" ]
+ - type: Clothing
+ sprite: _Lavaland/Objects/Weapons/Guns/Basic/kinetic_shotgun.rsi
+ - type: BasicEntityAmmoProvider
+ proto: PelletKineticSpread
+ - type: GunRequiresWield
+ - type: Item
+ sprite: _Lavaland/Objects/Weapons/Guns/Basic/kinetic_shotgun.rsi
+ shape:
+ - 0,0,4,0
+ - type: UpgradeableGun
+ maxUpgradeCount: 10 # DeltaV - use cost for limiting modkits instead
+ whitelist:
+ tags:
+ - PKAUpgrade
+ - type: UpgradeableGunCost # DeltaV
+ maxCost: 100
+ - type: ContainerContainer
+ containers:
+ upgrades: !type:Container
+
+- type: entity
+ name: proto-kinetic repeater
+ id: WeaponProtoKineticRepeater
+ parent: [ WeaponProtoKineticAcceleratorBase, BaseCargoContraband ]
+ description: Fires a barrage of medium-damage kinetic bolts at a short range.
+ components:
+ - type: Sprite
+ sprite: _Lavaland/Objects/Weapons/Guns/Basic/kinetic_repeater.rsi
+ layers:
+ - state: icon
+ - type: Clothing
+ sprite: _Lavaland/Objects/Weapons/Guns/Basic/kinetic_repeater.rsi
+ - type: Gun
+ selectedMode: Burst
+ burstFireRate: 3
+ burstCooldown: 1.5
+ availableModes:
+ - Burst
+ soundGunshot:
+ path: /Audio/Weapons/Guns/Gunshots/kinetic_accel.ogg
+ - type: BasicEntityAmmoProvider
+ proto: RapidBulletKinetic
+ capacity: 3
+ count: 3
+ - type: Item
+ sprite: _Lavaland/Objects/Weapons/Guns/Basic/kinetic_repeater.rsi
+ shape:
+ - 0,0,2,1
+ - type: UpgradeableGun
+ maxUpgradeCount: 10 # DeltaV - use cost for limiting modkits instead
+ whitelist:
+ tags:
+ - PKAUpgrade
+ - type: UpgradeableGunCost # DeltaV
+ maxCost: 100
+ - type: ContainerContainer
+ containers:
+ upgrades: !type:Container
+
+- type: entity
+ name: proto-kinetic pistol
+ id: WeaponProtoKineticPistol
+ parent: [ WeaponProtoKineticAcceleratorBase, BaseCargoContraband ]
+ description: Fires low-damage kinetic bolts, has a higher mod capacity.
+ components:
+ - type: Sprite
+ sprite: _Lavaland/Objects/Weapons/Guns/Basic/kinetic_pistol.rsi
+ layers:
+ - state: icon
+ - type: Clothing
+ sprite: _Lavaland/Objects/Weapons/Guns/Basic/kinetic_pistol.rsi
+ - type: BasicEntityAmmoProvider
+ proto: RapidBulletKinetic
+ - type: Gun
+ availableModes:
+ - FullAuto
+ - SemiAuto
+ #selectedMode: Burst # Only a pistol should support that for balancing reasons
+ - type: Multishot # Only a pistol should support that for balancing reasons
+ missChance: 0
+ spreadAddition: 5
+ - type: Item
+ sprite: _Lavaland/Objects/Weapons/Guns/Basic/kinetic_pistol.rsi
+ size: Small
+ shape:
+ - 0,0,1,0
+ - 0,1,0,1
+ - type: UpgradeableGun
+ maxUpgradeCount: 10 # DeltaV - use cost for limiting modkits instead
+ whitelist:
+ tags:
+ - PKAUpgrade
+ - type: UpgradeableGunCost # DeltaV
+ maxCost: 100
+ - type: ContainerContainer
+ containers:
+ upgrades: !type:Container
diff --git a/Resources/Prototypes/_Lavaland/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml b/Resources/Prototypes/_Lavaland/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml
new file mode 100644
index 00000000000..c5a4f38a648
--- /dev/null
+++ b/Resources/Prototypes/_Lavaland/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml
@@ -0,0 +1,63 @@
+# SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
+# SPDX-FileCopyrightText: 2025 Aidenkrz
+# SPDX-FileCopyrightText: 2025 Aineias1
+# SPDX-FileCopyrightText: 2025 FaDeOkno <143940725+FaDeOkno@users.noreply.github.com>
+# SPDX-FileCopyrightText: 2025 GoobBot
+# SPDX-FileCopyrightText: 2025 McBosserson <148172569+McBosserson@users.noreply.github.com>
+# SPDX-FileCopyrightText: 2025 Milon
+# SPDX-FileCopyrightText: 2025 Piras314
+# SPDX-FileCopyrightText: 2025 Rouden <149893554+Roudenn@users.noreply.github.com>
+# SPDX-FileCopyrightText: 2025 Ted Lukin <66275205+pheenty@users.noreply.github.com>
+# SPDX-FileCopyrightText: 2025 TheBorzoiMustConsume <197824988+TheBorzoiMustConsume@users.noreply.github.com>
+# SPDX-FileCopyrightText: 2025 Unlumination <144041835+Unlumy@users.noreply.github.com>
+# SPDX-FileCopyrightText: 2025 coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
+# SPDX-FileCopyrightText: 2025 deltanedas <39013340+deltanedas@users.noreply.github.com>
+# SPDX-FileCopyrightText: 2025 deltanedas <@deltanedas:kde.org>
+# SPDX-FileCopyrightText: 2025 gluesniffler <159397573+gluesniffler@users.noreply.github.com>
+# SPDX-FileCopyrightText: 2025 gluesniffler
+# SPDX-FileCopyrightText: 2025 thebiggestbruh
+# SPDX-FileCopyrightText: 2025 username <113782077+whateverusername0@users.noreply.github.com>
+# SPDX-FileCopyrightText: 2025 whateverusername0
+#
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
+- type: entity
+ id: RapidBulletKinetic # Used for PK repeater and pistol
+ name: rapid kinetic bolt
+ parent: BulletKinetic
+ categories: [ HideSpawnMenu ]
+ components:
+ - type: Projectile
+ damage:
+ types:
+ Blunt: 8
+ - type: TimedDespawn
+ lifetime: 0.22 # roughly 5.5 tiles
+
+- type: entity
+ id: WeakBulletKinetic # Used for PK shotgun
+ categories: [ HideSpawnMenu ]
+ parent: RapidBulletKinetic
+ components:
+ - type: Projectile
+ damage:
+ types:
+ Blunt: 5
+
+- type: entity
+ id: PelletKinetic
+ categories: [ HideSpawnMenu ]
+ parent: WeakBulletKinetic
+ components:
+ - type: GatheringProjectile
+ probability: 0.5
+
+- type: entity
+ id: PelletKineticSpread
+ categories: [ HideSpawnMenu ]
+ parent: PelletKinetic
+ components:
+ - type: ProjectileSpread
+ proto: PelletKinetic
+ count: 4
+ spread: 20
diff --git a/Resources/Prototypes/_Lavaland/Entities/Objects/Weapons/crushers.yml b/Resources/Prototypes/_Lavaland/Entities/Objects/Weapons/crushers.yml
index 52eca4eac80..e0e26dea943 100644
--- a/Resources/Prototypes/_Lavaland/Entities/Objects/Weapons/crushers.yml
+++ b/Resources/Prototypes/_Lavaland/Entities/Objects/Weapons/crushers.yml
@@ -5,5 +5,70 @@
children:
- id: WeaponCrusher
- id: WeaponCrusherGlaive
- #- id: WeaponCrusherHammer -Euphoria
- #- id: WeaponCrusherHalberd -Euphoria
+ - id: WeaponCrusherHammer
+ - id: WeaponCrusherHalberd
+
+- type: entity
+ parent: [WeaponCrusher, BaseSecurityCargoContraband]
+ id: WeaponCrusherHammer
+ name: crusher hammer
+ description: A beefy, two-handed weapon that inflicts knockback and heavier damage than a crusher.
+ components:
+ - type: Sprite
+ sprite: _Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi
+ state: icon
+ - type: MeleeWeapon # Slower attack speed but higher damage makes it more risky and rewarding to use
+ attackRate: 0.6
+ damage:
+ types:
+ Blunt: 12
+ - type: IncreaseDamageOnWield
+ damage:
+ types:
+ Blunt: 13
+ Structural: 15 # Breaks weak rocks effectively
+ - type: Item
+ size: Ginormous
+ sprite: _Lavaland/Objects/Weapons/Crushers/crusher_hammer-inhands.rsi
+ - type: Tool
+ speedModifier: 1.5
+ useSound:
+ path: /Audio/Items/trayhit2.ogg
+ - type: Clothing
+ sprite: _Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi
+ quickEquip: false
+ slots:
+ - Back
+ - suitStorage
+
+- type: entity
+ parent: [WeaponCrusher, BaseSecurityCargoContraband]
+ id: WeaponCrusherHalberd
+ name: crusher halberd
+ description: A universal weapon that combines the power of a crusher and the range of a spear.
+ components:
+ - type: Sprite
+ sprite: _Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi
+ state: icon
+ - type: Item
+ size: Ginormous
+ sprite: _Lavaland/Objects/Weapons/Crushers/crusher_halberd-inhands.rsi
+ # Basically a crusher but better
+ - type: MeleeWeapon
+ range: 2.2
+ damage:
+ types:
+ Slash: 6
+ Blunt: 5
+ - type: IncreaseDamageOnWield
+ damage:
+ types:
+ Piercing: 3
+ Slash: 3
+ Structural: 15 # Breaks weak rocks effectively
+ - type: Clothing
+ sprite: _Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi
+ quickEquip: false
+ slots:
+ - Back
+ - suitStorage
diff --git a/Resources/Prototypes/_Lavaland/Entities/Objects/Weapons/secondary.yml b/Resources/Prototypes/_Lavaland/Entities/Objects/Weapons/secondary.yml
index a4c6f259dea..290f6146f52 100644
--- a/Resources/Prototypes/_Lavaland/Entities/Objects/Weapons/secondary.yml
+++ b/Resources/Prototypes/_Lavaland/Entities/Objects/Weapons/secondary.yml
@@ -4,5 +4,88 @@
table: !type:GroupSelector
children:
- id: WeaponCrusherDagger
- #- id: LavalandWeaponKineticClaws -Euphoria
- #- id: LavalandWeaponKineticMachete -Euphoria
+ - id: LavalandWeaponKineticClaws
+ - id: LavalandWeaponKineticMachete
+
+- type: entity
+ parent: [BaseItem, ClothingHandsBase, BaseSecurityCargoContraband]
+ id: LavalandWeaponKineticClaws
+ name: kinetic claws
+ description: Unleash your inner edgelord with this one-handed claw small enough to fit in your backpack.
+ components:
+ - type: Appearance
+ - type: Sprite
+ sprite: _Lavaland/Objects/Weapons/Secondary/kinetic_claws.rsi
+ state: icon
+ - type: Clothing
+ sprite: _Lavaland/Objects/Weapons/Secondary/kinetic_claws-inhands.rsi
+ - type: Item
+ size: Normal
+ sprite: _Lavaland/Objects/Weapons/Secondary/kinetic_claws-inhands.rsi
+ - type: MeleeWeapon
+ attackRate: 2.5 # "We have northstars at home"
+ wideAnimationRotation: -135
+ damage:
+ types:
+ Slash: 7
+ soundHit:
+ collection: AlienClaw
+ angle: 30
+ animation: WeaponArcClaw
+ range: 1.1 # Awful range
+ mustBeEquippedToUse: true
+ - type: Sharp
+ - type: Prying
+ - type: UseDelay
+ delay: 1
+ - type: Fiber
+ fiberMaterial: fibers-kinetic
+ fiberColor: fibers-purple
+ - type: Execution
+ doAfterDuration: 4.0
+ - type: Tool
+ qualities:
+ - Slicing
+ useSound:
+ path: /Audio/Items/Culinary/chop.ogg
+ - type: Scalpel # Shitmed
+ speed: 0.3 # awful
+
+- type: entity
+ parent: [BaseItem, BaseSecurityCargoContraband]
+ id: LavalandWeaponKineticMachete
+ name: kinetic machete
+ description: A smaller, one-handed variant of the crusher which allows you to attack from afar and block incoming attacks.
+ components:
+ - type: Sprite
+ sprite: _Lavaland/Objects/Weapons/Secondary/kinetic_machete.rsi
+ state: icon
+ - type: UseDelay
+ delay: 1
+ - type: Appearance
+ - type: Sharp
+ - type: Execution
+ doAfterDuration: 4.0
+ - type: DisarmMalus
+ - type: Prying
+ - type: MeleeWeapon
+ attackRate: 1.0
+ damage:
+ types:
+ Slash: 15
+ soundHit:
+ collection: MetalThud
+ angle: 0
+ animation: WeaponArcThrust
+ range: 2 # Like a crusher, makes it possible to hit enemies without them hitting you
+ # TODO make it wearable on a belt/back slot
+ - type: Item
+ size: Normal
+ sprite: _Lavaland/Objects/Weapons/Secondary/kinetic_machete-inhands.rsi
+ - type: Tool
+ qualities:
+ - Slicing
+ useSound:
+ path: /Audio/Items/Culinary/chop.ogg
+ - type: Scalpel # Shitmed
+ speed: 0.55
diff --git a/Resources/Prototypes/_Lavaland/Entities/Spawners/Random/lavaland_loot.yml b/Resources/Prototypes/_Lavaland/Entities/Spawners/Random/lavaland_loot.yml
new file mode 100644
index 00000000000..590e459a017
--- /dev/null
+++ b/Resources/Prototypes/_Lavaland/Entities/Spawners/Random/lavaland_loot.yml
@@ -0,0 +1,29 @@
+- type: entity
+ id: LavalandCursedHeart
+ parent: BaseHumanOrgan
+ name: heart
+ description: "I feel bad for the heartless bastard who lost this."
+ components:
+ - type: Sprite
+ sprite: _Lavaland/Objects/Specific/loot.rsi
+ state: cursed_heart
+ - type: Item
+ size: Small
+ - type: CursedHeartGrant
+
+- type: entity
+ id: LavalandVampirismCrystal
+ parent: BasePKAUpgrade
+ name: Vamprisim Crystal
+ components:
+ - type: Sprite
+ sprite: _Lavaland/Objects/Specific/loot.rsi
+ state: crystal
+ - type: GunUpgrade
+ examineText: gun-upgrade-vampirism-name
+ - type: GunUpgradeVampirism
+ damageOnHit:
+ types:
+ Slash: -1.5
+ Piercing: -1.5
+ Blunt: -1.5
diff --git a/Resources/Prototypes/_Lavaland/Recipies/Lathes/salvage.yml b/Resources/Prototypes/_Lavaland/Recipies/Lathes/salvage.yml
new file mode 100644
index 00000000000..e762707d46e
--- /dev/null
+++ b/Resources/Prototypes/_Lavaland/Recipies/Lathes/salvage.yml
@@ -0,0 +1,37 @@
+# pka variants
+- type: latheRecipe
+ id: WeaponProtoKineticPistol
+ result: WeaponProtoKineticPistol
+ categories:
+ - Weapons
+ completetime: 5
+ materials:
+ Steel: 1000
+ Glass: 500
+ Silver: 100
+ Plasma: 500
+
+- type: latheRecipe
+ id: WeaponProtoKineticRepeater # strongest one so most expensive
+ result: WeaponProtoKineticRepeater
+ categories:
+ - Weapons
+ completetime: 5
+ materials:
+ Steel: 1000
+ Glass: 500
+ Silver: 100
+ Plasma: 500
+ Uranium: 500
+
+- type: latheRecipe
+ id: WeaponProtoKineticShotgun
+ result: WeaponProtoKineticShotgun
+ categories:
+ - Weapons
+ completetime: 5
+ materials:
+ Steel: 1000
+ Glass: 500
+ Silver: 100
+ Plasma: 500
diff --git a/Resources/Textures/_Lavaland/Objects/Specific/loot.rsi/crystal.png b/Resources/Textures/_Lavaland/Objects/Specific/loot.rsi/crystal.png
new file mode 100644
index 00000000000..1bc3a8555dc
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Specific/loot.rsi/crystal.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Specific/loot.rsi/cursed_heart.png b/Resources/Textures/_Lavaland/Objects/Specific/loot.rsi/cursed_heart.png
new file mode 100644
index 00000000000..b0ce3d09398
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Specific/loot.rsi/cursed_heart.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Specific/loot.rsi/meta.json b/Resources/Textures/_Lavaland/Objects/Specific/loot.rsi/meta.json
new file mode 100644
index 00000000000..b51d9292569
--- /dev/null
+++ b/Resources/Textures/_Lavaland/Objects/Specific/loot.rsi/meta.json
@@ -0,0 +1,24 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from https://github.com/tgstation/tgstation at at https://github.com/tgstation/tgstation/commit/40d89d11ea4a5cb81d61dc1018b46f4e7d32c62a",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "crystal"
+ },
+ {
+ "name": "cursed_heart",
+ "delays": [
+ [
+ 0.1,
+ 0.1,
+ 0.2
+ ]
+ ]
+ }
+ ]
+}
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd-inhands.rsi/inhand-left.png b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd-inhands.rsi/inhand-left.png
new file mode 100644
index 00000000000..3b15d9780df
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd-inhands.rsi/inhand-left.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd-inhands.rsi/inhand-right.png b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd-inhands.rsi/inhand-right.png
new file mode 100644
index 00000000000..5f9e55d21b7
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd-inhands.rsi/inhand-right.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd-inhands.rsi/meta.json b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd-inhands.rsi/meta.json
new file mode 100644
index 00000000000..c634ba82a37
--- /dev/null
+++ b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd-inhands.rsi/meta.json
@@ -0,0 +1,27 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "by alzore_ (discord) based on the proto-kinetic crusher",
+ "size": {
+ "x": 64,
+ "y": 64
+ },
+ "states": [
+ {
+ "name": "inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "wielded-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "wielded-inhand-right",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd-inhands.rsi/wielded-inhand-left.png b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd-inhands.rsi/wielded-inhand-left.png
new file mode 100644
index 00000000000..74cc6228d46
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd-inhands.rsi/wielded-inhand-left.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd-inhands.rsi/wielded-inhand-right.png b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd-inhands.rsi/wielded-inhand-right.png
new file mode 100644
index 00000000000..d2eef244261
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd-inhands.rsi/wielded-inhand-right.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/equipped-BACKPACK.png b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/equipped-BACKPACK.png
new file mode 100644
index 00000000000..2e8d6f03cf1
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/equipped-BACKPACK.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/equipped-SUITSTORAGE.png
new file mode 100644
index 00000000000..2e8d6f03cf1
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/equipped-SUITSTORAGE.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/flashlight.png b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/flashlight.png
new file mode 100644
index 00000000000..a80d04c7b04
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/flashlight.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/icon-lit.png b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/icon-lit.png
new file mode 100644
index 00000000000..54e91bfa703
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/icon-lit.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/icon-uncharged.png b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/icon-uncharged.png
new file mode 100644
index 00000000000..d31cdbd5bac
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/icon-uncharged.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/icon.png b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/icon.png
new file mode 100644
index 00000000000..77181f316c1
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/icon.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/meta.json b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/meta.json
new file mode 100644
index 00000000000..7ed9edc7d8b
--- /dev/null
+++ b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/meta.json
@@ -0,0 +1,89 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from fluffy frontier at commit https://github.com/Fluffy-Frontier/FluffySTG/pull/3293/commits/498811256ce8f64609c8c4195cec08801aed6147",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "icon-lit"
+ },
+ {
+ "name": "icon-uncharged",
+ "delays": [
+ [
+ 0.3,
+ 0.3
+ ]
+ ]
+ },
+ {
+ "name": "flashlight"
+ },
+ {
+ "name": "equipped-BACKPACK",
+ "directions": 4
+ },
+ {
+ "name": "equipped-SUITSTORAGE",
+ "directions": 4
+ },
+ {
+ "name": "upgrade-marker",
+ "delays": [
+ [
+ 0.2,
+ 0.2
+ ]
+ ]
+ },
+ {
+ "name": "upgrade-rude-buster",
+ "delays": [
+ [
+ 0.2,
+ 0.2
+ ]
+ ]
+ },
+ {
+ "name": "upgrade-lava-aspect"
+ },
+ {
+ "name": "upgrade-ice-frost"
+ },
+ {
+ "name": "upgrade-sharpness",
+ "delays": [
+ [
+ 6,
+ 0.1,
+ 0.1,
+ 0.1,
+ 0.1,
+ 0.1,
+ 0.1,
+ 0.1,
+ 0.1,
+ 0.1,
+ 0.1,
+ 0.1
+ ]
+ ]
+ },
+ {
+ "name": "upgrade-handle-weights"
+ },
+ {
+ "name": "upgrade-handle-range"
+ },
+ {
+ "name": "upgrade-handle-lightweight"
+ }
+ ]
+}
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/upgrade-handle-lightweight.png b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/upgrade-handle-lightweight.png
new file mode 100644
index 00000000000..7b35b6129bd
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/upgrade-handle-lightweight.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/upgrade-handle-range.png b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/upgrade-handle-range.png
new file mode 100644
index 00000000000..ec4c6d97ea5
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/upgrade-handle-range.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/upgrade-handle-weights.png b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/upgrade-handle-weights.png
new file mode 100644
index 00000000000..93adba1c4ea
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/upgrade-handle-weights.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/upgrade-ice-frost.png b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/upgrade-ice-frost.png
new file mode 100644
index 00000000000..41e9c231acc
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/upgrade-ice-frost.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/upgrade-lava-aspect.png b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/upgrade-lava-aspect.png
new file mode 100644
index 00000000000..6026e27e635
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/upgrade-lava-aspect.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/upgrade-marker.png b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/upgrade-marker.png
new file mode 100644
index 00000000000..066144d799d
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/upgrade-marker.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/upgrade-rude-buster.png b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/upgrade-rude-buster.png
new file mode 100644
index 00000000000..b0b2e58f490
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/upgrade-rude-buster.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/upgrade-sharpness.png b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/upgrade-sharpness.png
new file mode 100644
index 00000000000..0ceb76f94cf
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_halberd.rsi/upgrade-sharpness.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer-inhands.rsi/inhand-left.png b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer-inhands.rsi/inhand-left.png
new file mode 100644
index 00000000000..17fdb31c988
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer-inhands.rsi/inhand-left.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer-inhands.rsi/inhand-right.png b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer-inhands.rsi/inhand-right.png
new file mode 100644
index 00000000000..9d1fb0e632d
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer-inhands.rsi/inhand-right.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer-inhands.rsi/meta.json b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer-inhands.rsi/meta.json
new file mode 100644
index 00000000000..b90f854785c
--- /dev/null
+++ b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer-inhands.rsi/meta.json
@@ -0,0 +1,27 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from fluffy frontier at commit https://github.com/Fluffy-Frontier/FluffySTG/pull/3293/commits/498811256ce8f64609c8c4195cec08801aed6147",
+ "size": {
+ "x": 64,
+ "y": 64
+ },
+ "states": [
+ {
+ "name": "inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "wielded-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "wielded-inhand-right",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer-inhands.rsi/wielded-inhand-left.png b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer-inhands.rsi/wielded-inhand-left.png
new file mode 100644
index 00000000000..8836f9f2b4a
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer-inhands.rsi/wielded-inhand-left.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer-inhands.rsi/wielded-inhand-right.png b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer-inhands.rsi/wielded-inhand-right.png
new file mode 100644
index 00000000000..061fa8888c1
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer-inhands.rsi/wielded-inhand-right.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/equipped-BACKPACK.png b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/equipped-BACKPACK.png
new file mode 100644
index 00000000000..ec98c966dda
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/equipped-BACKPACK.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/equipped-SUITSTORAGE.png
new file mode 100644
index 00000000000..ec98c966dda
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/equipped-SUITSTORAGE.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/flashlight.png b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/flashlight.png
new file mode 100644
index 00000000000..7ca122e2d7f
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/flashlight.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/icon-lit.png b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/icon-lit.png
new file mode 100644
index 00000000000..54e91bfa703
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/icon-lit.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/icon-uncharged.png b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/icon-uncharged.png
new file mode 100644
index 00000000000..d31cdbd5bac
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/icon-uncharged.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/icon.png b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/icon.png
new file mode 100644
index 00000000000..a40c3abed24
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/icon.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/meta.json b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/meta.json
new file mode 100644
index 00000000000..12fe7280f69
--- /dev/null
+++ b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/meta.json
@@ -0,0 +1,88 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from fluffy frontier at commit https://github.com/Fluffy-Frontier/FluffySTG/pull/3293/commits/498811256ce8f64609c8c4195cec08801aed6147",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "icon-lit"
+ },
+ {
+ "name": "icon-uncharged",
+ "delays": [
+ [
+ 0.3,
+ 0.3
+ ]
+ ]
+ },
+ {
+ "name": "flashlight"
+ },
+ {
+ "name": "equipped-BACKPACK",
+ "directions": 4
+ },
+ {
+ "name": "equipped-SUITSTORAGE",
+ "directions": 4
+ },
+ {
+ "name": "upgrade-marker",
+ "delays": [
+ [
+ 0.2,
+ 0.2
+ ]
+ ]
+ },
+ {
+ "name": "upgrade-rude-buster",
+ "delays": [
+ [
+ 0.2,
+ 0.2
+ ]
+ ]
+ },
+ {
+ "name": "upgrade-lava-aspect"
+ },
+ {
+ "name": "upgrade-ice-frost"
+ },
+ {
+ "name": "upgrade-sharpness",
+ "delays": [
+ [
+ 6,
+ 0.1,
+ 0.1,
+ 0.1,
+ 0.1,
+ 0.1,
+ 0.1,
+ 0.1,
+ 0.1,
+ 0.1,
+ 0.1
+ ]
+ ]
+ },
+ {
+ "name": "upgrade-handle-weights"
+ },
+ {
+ "name": "upgrade-handle-range"
+ },
+ {
+ "name": "upgrade-handle-lightweight"
+ }
+ ]
+}
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/upgrade-handle-lightweight.png b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/upgrade-handle-lightweight.png
new file mode 100644
index 00000000000..222019ae884
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/upgrade-handle-lightweight.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/upgrade-handle-range.png b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/upgrade-handle-range.png
new file mode 100644
index 00000000000..b9f57b57c2a
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/upgrade-handle-range.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/upgrade-handle-weights.png b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/upgrade-handle-weights.png
new file mode 100644
index 00000000000..10781e99d6b
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/upgrade-handle-weights.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/upgrade-ice-frost.png b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/upgrade-ice-frost.png
new file mode 100644
index 00000000000..c3b719cd860
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/upgrade-ice-frost.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/upgrade-lava-aspect.png b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/upgrade-lava-aspect.png
new file mode 100644
index 00000000000..b19b437b221
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/upgrade-lava-aspect.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/upgrade-marker.png b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/upgrade-marker.png
new file mode 100644
index 00000000000..f2382061e33
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/upgrade-marker.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/upgrade-rude-buster.png b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/upgrade-rude-buster.png
new file mode 100644
index 00000000000..928ba9b9a7e
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/upgrade-rude-buster.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/upgrade-sharpness.png b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/upgrade-sharpness.png
new file mode 100644
index 00000000000..9cffff7bcab
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Crushers/crusher_hammer.rsi/upgrade-sharpness.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_pistol.rsi/animation-icon.png b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_pistol.rsi/animation-icon.png
new file mode 100644
index 00000000000..ca155989794
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_pistol.rsi/animation-icon.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_pistol.rsi/equipped-BELT.png b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_pistol.rsi/equipped-BELT.png
new file mode 100644
index 00000000000..6b475a13994
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_pistol.rsi/equipped-BELT.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_pistol.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_pistol.rsi/equipped-SUITSTORAGE.png
new file mode 100644
index 00000000000..6b475a13994
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_pistol.rsi/equipped-SUITSTORAGE.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_pistol.rsi/icon.png b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_pistol.rsi/icon.png
new file mode 100644
index 00000000000..2a3a3155110
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_pistol.rsi/icon.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_pistol.rsi/inhand-left.png b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_pistol.rsi/inhand-left.png
new file mode 100644
index 00000000000..e57f58242b8
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_pistol.rsi/inhand-left.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_pistol.rsi/inhand-right.png b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_pistol.rsi/inhand-right.png
new file mode 100644
index 00000000000..8df62ab64ba
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_pistol.rsi/inhand-right.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_pistol.rsi/meta.json b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_pistol.rsi/meta.json
new file mode 100644
index 00000000000..1bc6c55db0c
--- /dev/null
+++ b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_pistol.rsi/meta.json
@@ -0,0 +1,42 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "bayonet and animation-icon taken from https://github.com/Bubberstation/Bubberstation/pull/1332/commits/712c86db77c96657cd2b8cfaf6203d76f85f9649, rest made by ratyyy(github), animation-icon, icon.png, inhand-right.png, inhand-left.png, equipped-BELT.png, equipped-SUITSTORAGE.png modified by mironium_adt | Edited by PuroSlavKing (Github)",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "animation-icon",
+ "delays": [
+ [
+ 0.2,
+ 0.2
+ ]
+ ]
+ },
+ {
+ "name": "inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "equipped-BELT",
+ "directions": 4
+ },
+ {
+ "name": "equipped-SUITSTORAGE",
+ "directions": 4
+ },
+ {
+ "name": "upgrade-space"
+ }
+ ]
+}
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_pistol.rsi/upgrade-space.png b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_pistol.rsi/upgrade-space.png
new file mode 100644
index 00000000000..e484ec8b17d
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_pistol.rsi/upgrade-space.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_railgun.rsi/animation-icon.png b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_railgun.rsi/animation-icon.png
new file mode 100644
index 00000000000..85ed5fc7c60
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_railgun.rsi/animation-icon.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_railgun.rsi/bayonet.png b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_railgun.rsi/bayonet.png
new file mode 100644
index 00000000000..a88994188d3
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_railgun.rsi/bayonet.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_railgun.rsi/equipped-BELT.png b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_railgun.rsi/equipped-BELT.png
new file mode 100644
index 00000000000..3c97ef1604a
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_railgun.rsi/equipped-BELT.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_railgun.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_railgun.rsi/equipped-SUITSTORAGE.png
new file mode 100644
index 00000000000..3c97ef1604a
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_railgun.rsi/equipped-SUITSTORAGE.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_repeater.rsi/flight-on.png b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_railgun.rsi/flight-on.png
similarity index 100%
rename from Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_repeater.rsi/flight-on.png
rename to Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_railgun.rsi/flight-on.png
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_repeater.rsi/flight.png b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_railgun.rsi/flight.png
similarity index 100%
rename from Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_repeater.rsi/flight.png
rename to Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_railgun.rsi/flight.png
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_railgun.rsi/icon.png b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_railgun.rsi/icon.png
new file mode 100644
index 00000000000..9c80d709a35
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_railgun.rsi/icon.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_railgun.rsi/inhand-left.png b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_railgun.rsi/inhand-left.png
new file mode 100644
index 00000000000..4a5d5c4c485
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_railgun.rsi/inhand-left.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_railgun.rsi/inhand-right.png b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_railgun.rsi/inhand-right.png
new file mode 100644
index 00000000000..2ea6e402b8d
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_railgun.rsi/inhand-right.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_railgun.rsi/meta.json b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_railgun.rsi/meta.json
new file mode 100644
index 00000000000..a8d0aa435e4
--- /dev/null
+++ b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_railgun.rsi/meta.json
@@ -0,0 +1,56 @@
+{
+ "version": 2,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "icon and animation-icon taken from https://github.com/Bubberstation/Bubberstation/pull/1332/commits/712c86db77c96657cd2b8cfaf6203d76f85f9649, rest made by ratyyy(github). equipped-BELT.png, equipped-SUITSTORAGE.png modified by mironium_adt, wielded-inhand-left/wielded-inhand-right sprited by orange6775 (discord)",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "bayonet"
+ },
+ {
+ "name": "flight"
+ },
+ {
+ "name": "flight-on"
+ },
+ {
+ "name": "animation-icon",
+ "delays": [
+ [
+ 0.2,
+ 0.2
+ ]
+ ]
+ },
+ {
+ "name": "inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "equipped-BELT",
+ "directions": 4
+ },
+ {
+ "name": "equipped-SUITSTORAGE",
+ "directions": 4
+ },
+ {
+ "name": "wielded-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "wielded-inhand-right",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_railgun.rsi/wielded-inhand-left.png b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_railgun.rsi/wielded-inhand-left.png
new file mode 100644
index 00000000000..70d17600c70
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_railgun.rsi/wielded-inhand-left.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_railgun.rsi/wielded-inhand-right.png b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_railgun.rsi/wielded-inhand-right.png
new file mode 100644
index 00000000000..8c6313b6235
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_railgun.rsi/wielded-inhand-right.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_repeater.rsi/bayonet.png b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_repeater.rsi/bayonet.png
deleted file mode 100644
index 28f96dcc283..00000000000
Binary files a/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_repeater.rsi/bayonet.png and /dev/null differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_repeater.rsi/meta.json b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_repeater.rsi/meta.json
index d6103834fc5..8e7fb4fbb44 100644
--- a/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_repeater.rsi/meta.json
+++ b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_repeater.rsi/meta.json
@@ -10,15 +10,7 @@
{
"name": "icon"
},
- {
- "name": "bayonet"
- },
- {
- "name": "flight"
- },
- {
- "name": "flight-on"
- },
+
{
"name": "animation-icon",
"delays": [
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_shotgun.rsi/animation-icon.png b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_shotgun.rsi/animation-icon.png
new file mode 100644
index 00000000000..4c91c432b8f
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_shotgun.rsi/animation-icon.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_shotgun.rsi/equipped-BELT.png b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_shotgun.rsi/equipped-BELT.png
new file mode 100644
index 00000000000..9f4e6a63f1e
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_shotgun.rsi/equipped-BELT.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_shotgun.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_shotgun.rsi/equipped-SUITSTORAGE.png
new file mode 100644
index 00000000000..9f4e6a63f1e
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_shotgun.rsi/equipped-SUITSTORAGE.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_shotgun.rsi/icon.png b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_shotgun.rsi/icon.png
new file mode 100644
index 00000000000..7af9b7b08df
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_shotgun.rsi/icon.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_shotgun.rsi/inhand-left.png b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_shotgun.rsi/inhand-left.png
new file mode 100644
index 00000000000..650e56697c9
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_shotgun.rsi/inhand-left.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_shotgun.rsi/inhand-right.png b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_shotgun.rsi/inhand-right.png
new file mode 100644
index 00000000000..9eae37b784b
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_shotgun.rsi/inhand-right.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_shotgun.rsi/meta.json b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_shotgun.rsi/meta.json
new file mode 100644
index 00000000000..70f651953b8
--- /dev/null
+++ b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_shotgun.rsi/meta.json
@@ -0,0 +1,50 @@
+{
+ "version": 2,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "icon and animation-icon taken from https://github.com/Bubberstation/Bubberstation/pull/1332/commits/712c86db77c96657cd2b8cfaf6203d76f85f9649, rest made by ratyyy(github), wielded-inhand-left/wielded-inhand-right sprited by orange6775 (discord)",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "animation-icon",
+ "delays": [
+ [
+ 0.2,
+ 0.2
+ ]
+ ]
+ },
+ {
+ "name": "inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "wielded-inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "wielded-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "equipped-BELT",
+ "directions": 4
+ },
+ {
+ "name": "equipped-SUITSTORAGE",
+ "directions": 4
+ },
+ {
+ "name": "upgrade-space"
+ }
+ ]
+}
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_shotgun.rsi/upgrade-space.png b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_shotgun.rsi/upgrade-space.png
new file mode 100644
index 00000000000..41495404645
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_shotgun.rsi/upgrade-space.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_shotgun.rsi/wielded-inhand-left.png b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_shotgun.rsi/wielded-inhand-left.png
new file mode 100644
index 00000000000..ac2a4987dbe
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_shotgun.rsi/wielded-inhand-left.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_shotgun.rsi/wielded-inhand-right.png b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_shotgun.rsi/wielded-inhand-right.png
new file mode 100644
index 00000000000..68b1764ceac
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Guns/Basic/kinetic_shotgun.rsi/wielded-inhand-right.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_claws-inhands.rsi/equipped-HAND.png b/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_claws-inhands.rsi/equipped-HAND.png
new file mode 100644
index 00000000000..bfb2234d08f
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_claws-inhands.rsi/equipped-HAND.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_claws-inhands.rsi/inhand-left.png b/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_claws-inhands.rsi/inhand-left.png
new file mode 100644
index 00000000000..1cb891ff68f
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_claws-inhands.rsi/inhand-left.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_claws-inhands.rsi/inhand-right.png b/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_claws-inhands.rsi/inhand-right.png
new file mode 100644
index 00000000000..6a1d6855c4a
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_claws-inhands.rsi/inhand-right.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_claws-inhands.rsi/meta.json b/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_claws-inhands.rsi/meta.json
new file mode 100644
index 00000000000..005b3b90a63
--- /dev/null
+++ b/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_claws-inhands.rsi/meta.json
@@ -0,0 +1,31 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from fluffy frontier at commit https://github.com/Fluffy-Frontier/FluffySTG/pull/3293/commits/498811256ce8f64609c8c4195cec08801aed6147",
+ "size": {
+ "x": 64,
+ "y": 64
+ },
+ "states": [
+ {
+ "name": "inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "wielded-inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "wielded-inhand-right",
+ "directions": 4
+ },
+ {
+ "name": "equipped-HAND",
+ "directions": 4
+ }
+ ]
+}
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_claws-inhands.rsi/wielded-inhand-left.png b/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_claws-inhands.rsi/wielded-inhand-left.png
new file mode 100644
index 00000000000..bfb2234d08f
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_claws-inhands.rsi/wielded-inhand-left.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_claws-inhands.rsi/wielded-inhand-right.png b/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_claws-inhands.rsi/wielded-inhand-right.png
new file mode 100644
index 00000000000..bfb2234d08f
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_claws-inhands.rsi/wielded-inhand-right.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_claws.rsi/icon-lit.png b/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_claws.rsi/icon-lit.png
new file mode 100644
index 00000000000..f51d7d18e19
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_claws.rsi/icon-lit.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_claws.rsi/icon-uncharged.png b/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_claws.rsi/icon-uncharged.png
new file mode 100644
index 00000000000..cff3cfc6739
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_claws.rsi/icon-uncharged.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_claws.rsi/icon.png b/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_claws.rsi/icon.png
new file mode 100644
index 00000000000..3be7d73e8fc
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_claws.rsi/icon.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_claws.rsi/meta.json b/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_claws.rsi/meta.json
new file mode 100644
index 00000000000..bbb1ac9984a
--- /dev/null
+++ b/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_claws.rsi/meta.json
@@ -0,0 +1,26 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from fluffy frontier at commit https://github.com/Fluffy-Frontier/FluffySTG/pull/3293/commits/498811256ce8f64609c8c4195cec08801aed6147",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "icon-lit"
+ },
+ {
+ "name": "icon-uncharged",
+ "delays": [
+ [
+ 0.3,
+ 0.3
+ ]
+ ]
+ }
+ ]
+}
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_machete-inhands.rsi/inhand-left.png b/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_machete-inhands.rsi/inhand-left.png
new file mode 100644
index 00000000000..77eb2b41ea9
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_machete-inhands.rsi/inhand-left.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_machete-inhands.rsi/inhand-right.png b/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_machete-inhands.rsi/inhand-right.png
new file mode 100644
index 00000000000..aae15dd777b
Binary files /dev/null and b/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_machete-inhands.rsi/inhand-right.png differ
diff --git a/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_machete-inhands.rsi/meta.json b/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_machete-inhands.rsi/meta.json
new file mode 100644
index 00000000000..77e11bd954d
--- /dev/null
+++ b/Resources/Textures/_Lavaland/Objects/Weapons/Secondary/kinetic_machete-inhands.rsi/meta.json
@@ -0,0 +1,19 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from fluffy frontier at commit https://github.com/Fluffy-Frontier/FluffySTG/pull/3293/commits/498811256ce8f64609c8c4195cec08801aed6147",
+ "size": {
+ "x": 64,
+ "y": 64
+ },
+ "states": [
+ {
+ "name": "inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "inhand-right",
+ "directions": 4
+ }
+ ]
+}
\ No newline at end of file