diff --git a/Content.Client/GameObjects/Components/Weapons/Ranged/HitscanWeaponVisualizer2D.cs b/Content.Client/GameObjects/Components/Weapons/Ranged/HitscanWeaponVisualizer2D.cs new file mode 100644 index 0000000000..408362fd30 --- /dev/null +++ b/Content.Client/GameObjects/Components/Weapons/Ranged/HitscanWeaponVisualizer2D.cs @@ -0,0 +1,33 @@ +using Content.Shared.GameObjects.Components.Power; +using Content.Shared.Utility; +using Robust.Client.GameObjects; +using Robust.Client.Interfaces.GameObjects.Components; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Utility; +using YamlDotNet.RepresentationModel; + +namespace Content.Client.GameObjects.Components.Power +{ + public class HitscanWeaponVisualizer2D : AppearanceVisualizer + { + private string _prefix; + + public override void LoadData(YamlMappingNode node) + { + base.LoadData(node); + + _prefix = node.GetNode("prefix").AsString(); + } + + public override void OnChangeData(AppearanceComponent component) + { + base.OnChangeData(component); + + var sprite = component.Owner.GetComponent(); + if (component.TryGetData(PowerCellVisuals.ChargeLevel, out float fraction)) + { + sprite.LayerSetState(0, $"{_prefix}_{ContentHelpers.RoundToLevels(fraction, 1, 5) * 25}"); + } + } + } +} diff --git a/Content.Server/GameObjects/Components/Weapon/Ranged/Hitscan/HitscanWeaponCapacitorComponent.cs b/Content.Server/GameObjects/Components/Weapon/Ranged/Hitscan/HitscanWeaponCapacitorComponent.cs index f5ddd546e9..6a58ff3a46 100644 --- a/Content.Server/GameObjects/Components/Weapon/Ranged/Hitscan/HitscanWeaponCapacitorComponent.cs +++ b/Content.Server/GameObjects/Components/Weapon/Ranged/Hitscan/HitscanWeaponCapacitorComponent.cs @@ -1,14 +1,27 @@ using System; +using Content.Shared.GameObjects.Components.Power; using Content.Server.GameObjects.Components.Power; using Robust.Shared.Serialization; +using Robust.Server.GameObjects; namespace Content.Server.GameObjects.Components.Weapon.Ranged.Hitscan { public class HitscanWeaponCapacitorComponent : PowerCellComponent { + private AppearanceComponent _appearance; public override string Name => "HitscanWeaponCapacitor"; + public override float Charge + { + get => base.Charge; + set + { + base.Charge = value; + _updateAppearance(); + } + } + public override void ExposeData(ObjectSerializer serializer) { base.ExposeData(serializer); @@ -19,6 +32,8 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Hitscan base.Initialize(); Charge = Capacity; + Owner.TryGetComponent(out _appearance); + } public float GetChargeFrom(float toDeduct) @@ -27,6 +42,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Hitscan ChargeChanged(); var chargeChangedBy = Math.Min(this.Charge, toDeduct); this.DeductCharge(chargeChangedBy); + _updateAppearance(); return chargeChangedBy; } @@ -43,6 +59,12 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Hitscan this.AddCharge(battery.Charge); battery.DeductCharge(battery.Charge); } + _updateAppearance(); + } + + private void _updateAppearance() + { + _appearance?.SetData(PowerCellVisuals.ChargeLevel, Charge / Capacity); } } diff --git a/Content.Server/GameObjects/Components/Weapon/Ranged/Hitscan/HitscanWeaponComponent.cs b/Content.Server/GameObjects/Components/Weapon/Ranged/Hitscan/HitscanWeaponComponent.cs index c18906e904..b5cb365b9b 100644 --- a/Content.Server/GameObjects/Components/Weapon/Ranged/Hitscan/HitscanWeaponComponent.cs +++ b/Content.Server/GameObjects/Components/Weapon/Ranged/Hitscan/HitscanWeaponComponent.cs @@ -29,6 +29,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Hitscan private int _damage; private int _baseFireCost; private float _lowerChargeLimit; + private string _fireSound; //As this is a component that sits on the weapon rather than a static value //we just declare the field and then use GetComponent later to actually get it. @@ -46,10 +47,11 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Hitscan { base.ExposeData(serializer); - serializer.DataField(ref _spritename, "sprite", "Objects/laser.png"); + serializer.DataField(ref _spritename, "fireSprite", "Objects/laser.png"); serializer.DataField(ref _damage, "damage", 10); serializer.DataField(ref _baseFireCost, "baseFireCost", 300); serializer.DataField(ref _lowerChargeLimit, "lowerChargeLimit", 10); + serializer.DataField(ref _fireSound, "fireSound", "/Audio/laser.ogg"); } public override void Initialize() @@ -58,6 +60,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Hitscan var rangedWeapon = Owner.GetComponent(); capacitorComponent = Owner.GetComponent(); rangedWeapon.FireHandler = Fire; + } public bool AttackBy(AttackByEventArgs eventArgs) @@ -124,7 +127,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Hitscan }; var mgr = IoCManager.Resolve(); mgr.GetEntitySystem().CreateParticle(message); - Owner.GetComponent().Play("/Audio/laser.ogg", AudioParams.Default.WithVolume(-5)); + Owner.GetComponent().Play(_fireSound, AudioParams.Default.WithVolume(-5)); } } } diff --git a/Resources/Audio/lasercannonfire.ogg b/Resources/Audio/lasercannonfire.ogg new file mode 100644 index 0000000000..612d608db8 Binary files /dev/null and b/Resources/Audio/lasercannonfire.ogg differ diff --git a/Resources/Prototypes/Entities/weapons/laserguns.yml b/Resources/Prototypes/Entities/weapons/laserguns.yml index f26657c244..baea97c8c4 100644 --- a/Resources/Prototypes/Entities/weapons/laserguns.yml +++ b/Resources/Prototypes/Entities/weapons/laserguns.yml @@ -1,24 +1,59 @@ - type: entity - name: Laser Gun + name: Retro Laser Gun parent: BaseItem id: LaserItem - description: A weapon using light amplified by the stimulated emission of radiation + description: A weapon using light amplified by the stimulated emission of radiation. Ancient inefficient model. components: - type: Sprite + netsync: false sprite: Objects/laser_retro.rsi - state: 100 + state: laser_retro_100 - type: Icon sprite: Objects/laser_retro.rsi - state: 100 + state: laser_retro_100 - type: RangedWeapon - type: HitscanWeapon damage: 30 - sprite: "Objects/laser.png" + fireSprite: "Objects/laser.png" + fireSound: "/Audio/laser.ogg" lowerDischargeLimit: 10 - type: HitscanWeaponCapacitor - capacity: 1000 + capacity: 1200 - type: Item Size: 24 sprite: Objects/laser_retro.rsi - prefix: 100 - - type: Sound \ No newline at end of file + prefix: laser_retro_100 + - type: Appearance + visuals: + - type: HitscanWeaponVisualizer2D + prefix: laser_retro + - type: Sound + +- type: entity + name: Laser Cannon + parent: LaserItem + id: LCannon + description: With the L.A.S.E.R. cannon, the lasing medium is enclosed in a tube lined with uranium-235 and subjected to high neutron flux in a nuclear reactor core. This incredible technology may help YOU achieve high excitation rates with small laser volumes! + components: + - type: Sprite + netsync: false + sprite: Objects/laser_cannon.rsi + state: laser_cannon_100 + - type: Icon + sprite: Objects/laser_cannon.rsi + state: laser_cannon_100 + - type: HitscanWeapon + damage: 90 + fireSprite: "Objects/heavylaser.png" + fireSound: "/Audio/lasercannonfire.ogg" + lowerDischargeLimit: 10 + - type: HitscanWeaponCapacitor + capacity: 2400 + - type: Item + Size: 32 + sprite: Objects/laser_cannon.rsi + prefix: laser_cannon_100 + - type: Appearance + visuals: + - type: HitscanWeaponVisualizer2D + prefix: laser_cannon \ No newline at end of file diff --git a/Resources/Textures/Objects/heavylaser.png b/Resources/Textures/Objects/heavylaser.png new file mode 100644 index 0000000000..b19aad95e4 Binary files /dev/null and b/Resources/Textures/Objects/heavylaser.png differ diff --git a/Resources/Textures/Objects/laser_cannon.rsi/0-inhand-left.png b/Resources/Textures/Objects/laser_cannon.rsi/0-inhand-left.png new file mode 100644 index 0000000000..c9f0bf40ee Binary files /dev/null and b/Resources/Textures/Objects/laser_cannon.rsi/0-inhand-left.png differ diff --git a/Resources/Textures/Objects/laser_cannon.rsi/0-inhand-right.png b/Resources/Textures/Objects/laser_cannon.rsi/0-inhand-right.png new file mode 100644 index 0000000000..a7f9eae5f2 Binary files /dev/null and b/Resources/Textures/Objects/laser_cannon.rsi/0-inhand-right.png differ diff --git a/Resources/Textures/Objects/laser_cannon.rsi/25-inhand-left.png b/Resources/Textures/Objects/laser_cannon.rsi/25-inhand-left.png new file mode 100644 index 0000000000..b5a9bd637f Binary files /dev/null and b/Resources/Textures/Objects/laser_cannon.rsi/25-inhand-left.png differ diff --git a/Resources/Textures/Objects/laser_cannon.rsi/25-inhand-right.png b/Resources/Textures/Objects/laser_cannon.rsi/25-inhand-right.png new file mode 100644 index 0000000000..aeeceaedd6 Binary files /dev/null and b/Resources/Textures/Objects/laser_cannon.rsi/25-inhand-right.png differ diff --git a/Resources/Textures/Objects/laser_cannon.rsi/50-inhand-left.png b/Resources/Textures/Objects/laser_cannon.rsi/50-inhand-left.png new file mode 100644 index 0000000000..7f47b5bce8 Binary files /dev/null and b/Resources/Textures/Objects/laser_cannon.rsi/50-inhand-left.png differ diff --git a/Resources/Textures/Objects/laser_cannon.rsi/50-inhand-right.png b/Resources/Textures/Objects/laser_cannon.rsi/50-inhand-right.png new file mode 100644 index 0000000000..dd40abd811 Binary files /dev/null and b/Resources/Textures/Objects/laser_cannon.rsi/50-inhand-right.png differ diff --git a/Resources/Textures/Objects/laser_cannon.rsi/75-inhand-left.png b/Resources/Textures/Objects/laser_cannon.rsi/75-inhand-left.png new file mode 100644 index 0000000000..527b821557 Binary files /dev/null and b/Resources/Textures/Objects/laser_cannon.rsi/75-inhand-left.png differ diff --git a/Resources/Textures/Objects/laser_cannon.rsi/75-inhand-right.png b/Resources/Textures/Objects/laser_cannon.rsi/75-inhand-right.png new file mode 100644 index 0000000000..f54497b6e0 Binary files /dev/null and b/Resources/Textures/Objects/laser_cannon.rsi/75-inhand-right.png differ diff --git a/Resources/Textures/Objects/laser_cannon.rsi/inhand-left.png b/Resources/Textures/Objects/laser_cannon.rsi/inhand-left.png new file mode 100644 index 0000000000..b4ea4bdf9e Binary files /dev/null and b/Resources/Textures/Objects/laser_cannon.rsi/inhand-left.png differ diff --git a/Resources/Textures/Objects/laser_cannon.rsi/inhand-right.png b/Resources/Textures/Objects/laser_cannon.rsi/inhand-right.png new file mode 100644 index 0000000000..c895636e4e Binary files /dev/null and b/Resources/Textures/Objects/laser_cannon.rsi/inhand-right.png differ diff --git a/Resources/Textures/Objects/laser_cannon.rsi/laser_cannon.png b/Resources/Textures/Objects/laser_cannon.rsi/laser_cannon.png new file mode 100755 index 0000000000..f4d02654d8 Binary files /dev/null and b/Resources/Textures/Objects/laser_cannon.rsi/laser_cannon.png differ diff --git a/Resources/Textures/Objects/laser_cannon.rsi/laser_cannon_0.png b/Resources/Textures/Objects/laser_cannon.rsi/laser_cannon_0.png new file mode 100755 index 0000000000..ba4a9fe876 Binary files /dev/null and b/Resources/Textures/Objects/laser_cannon.rsi/laser_cannon_0.png differ diff --git a/Resources/Textures/Objects/laser_cannon.rsi/laser_cannon_100.png b/Resources/Textures/Objects/laser_cannon.rsi/laser_cannon_100.png new file mode 100755 index 0000000000..f4d02654d8 Binary files /dev/null and b/Resources/Textures/Objects/laser_cannon.rsi/laser_cannon_100.png differ diff --git a/Resources/Textures/Objects/laser_cannon.rsi/laser_cannon_25.png b/Resources/Textures/Objects/laser_cannon.rsi/laser_cannon_25.png new file mode 100755 index 0000000000..d0820af53e Binary files /dev/null and b/Resources/Textures/Objects/laser_cannon.rsi/laser_cannon_25.png differ diff --git a/Resources/Textures/Objects/laser_cannon.rsi/laser_cannon_50.png b/Resources/Textures/Objects/laser_cannon.rsi/laser_cannon_50.png new file mode 100755 index 0000000000..3524024892 Binary files /dev/null and b/Resources/Textures/Objects/laser_cannon.rsi/laser_cannon_50.png differ diff --git a/Resources/Textures/Objects/laser_cannon.rsi/laser_cannon_75.png b/Resources/Textures/Objects/laser_cannon.rsi/laser_cannon_75.png new file mode 100755 index 0000000000..020797c0f8 Binary files /dev/null and b/Resources/Textures/Objects/laser_cannon.rsi/laser_cannon_75.png differ diff --git a/Resources/Textures/Objects/laser_cannon.rsi/meta.json b/Resources/Textures/Objects/laser_cannon.rsi/meta.json new file mode 100644 index 0000000000..fdef41874e --- /dev/null +++ b/Resources/Textures/Objects/laser_cannon.rsi/meta.json @@ -0,0 +1,123 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13 at commit 125c975f1b3bf9826b37029e9ab5a5f89e975a7e", + "states": [ + { + "name": "laser_cannon", + "directions": 1, + "delays": [ + [1.0] + ] + }, + { + "name": "laser_cannon_100", + "directions": 1, + "delays": [ + [1.0] + ] + }, + { + "name": "laser_cannon_75", + "directions": 1, + "delays": [ + [1.0] + ] + }, + { + "name": "laser_cannon_50", + "directions": 1, + "delays": [ + [1.0] + ] + }, + { + "name": "laser_cannon_25", + "directions": 1, + "delays": [ + [1.0] + ] + }, + { + "name": "laser_cannon_0", + "directions": 1, + "delays": [ + [1.0] + ] + }, + { + "name": "inhand-left", + "directions": 4, + "delays": [ + [1.0], [1.0], [1.0], [1.0] + ] + }, + { + "name": "inhand-right", + "directions": 4, + "delays": [ + [1.0], [1.0], [1.0], [1.0] + ] + }, + { + "name": "0-inhand-left", + "directions": 4, + "delays": [ + [1.0], [1.0], [1.0], [1.0] + ] + }, + { + "name": "0-inhand-right", + "directions": 4, + "delays": [ + [1.0], [1.0], [1.0], [1.0] + ] + }, + { + "name": "25-inhand-left", + "directions": 4, + "delays": [ + [1.0], [1.0], [1.0], [1.0] + ] + }, + { + "name": "25-inhand-right", + "directions": 4, + "delays": [ + [1.0], [1.0], [1.0], [1.0] + ] + }, + { + "name": "50-inhand-left", + "directions": 4, + "delays": [ + [1.0], [1.0], [1.0], [1.0] + ] + }, + { + "name": "50-inhand-right", + "directions": 4, + "delays": [ + [1.0], [1.0], [1.0], [1.0] + ] + }, + { + "name": "75-inhand-left", + "directions": 4, + "delays": [ + [1.0], [1.0], [1.0], [1.0] + ] + }, + { + "name": "75-inhand-right", + "directions": 4, + "delays": [ + [1.0], [1.0], [1.0], [1.0] + ] + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Objects/laser_retro.rsi/100-inhand-left.png b/Resources/Textures/Objects/laser_retro.rsi/inhand-left.png similarity index 100% rename from Resources/Textures/Objects/laser_retro.rsi/100-inhand-left.png rename to Resources/Textures/Objects/laser_retro.rsi/inhand-left.png diff --git a/Resources/Textures/Objects/laser_retro.rsi/100-inhand-right.png b/Resources/Textures/Objects/laser_retro.rsi/inhand-right.png similarity index 100% rename from Resources/Textures/Objects/laser_retro.rsi/100-inhand-right.png rename to Resources/Textures/Objects/laser_retro.rsi/inhand-right.png diff --git a/Resources/Textures/Objects/laser_retro.rsi/100.png b/Resources/Textures/Objects/laser_retro.rsi/laser_retro.png similarity index 100% rename from Resources/Textures/Objects/laser_retro.rsi/100.png rename to Resources/Textures/Objects/laser_retro.rsi/laser_retro.png diff --git a/Resources/Textures/Objects/laser_retro.rsi/0.png b/Resources/Textures/Objects/laser_retro.rsi/laser_retro_0.png similarity index 100% rename from Resources/Textures/Objects/laser_retro.rsi/0.png rename to Resources/Textures/Objects/laser_retro.rsi/laser_retro_0.png diff --git a/Resources/Textures/Objects/laser_retro.rsi/laser_retro_100.png b/Resources/Textures/Objects/laser_retro.rsi/laser_retro_100.png new file mode 100644 index 0000000000..8a12221de3 Binary files /dev/null and b/Resources/Textures/Objects/laser_retro.rsi/laser_retro_100.png differ diff --git a/Resources/Textures/Objects/laser_retro.rsi/25.png b/Resources/Textures/Objects/laser_retro.rsi/laser_retro_25.png similarity index 100% rename from Resources/Textures/Objects/laser_retro.rsi/25.png rename to Resources/Textures/Objects/laser_retro.rsi/laser_retro_25.png diff --git a/Resources/Textures/Objects/laser_retro.rsi/50.png b/Resources/Textures/Objects/laser_retro.rsi/laser_retro_50.png similarity index 100% rename from Resources/Textures/Objects/laser_retro.rsi/50.png rename to Resources/Textures/Objects/laser_retro.rsi/laser_retro_50.png diff --git a/Resources/Textures/Objects/laser_retro.rsi/75.png b/Resources/Textures/Objects/laser_retro.rsi/laser_retro_75.png similarity index 100% rename from Resources/Textures/Objects/laser_retro.rsi/75.png rename to Resources/Textures/Objects/laser_retro.rsi/laser_retro_75.png diff --git a/Resources/Textures/Objects/laser_retro.rsi/meta.json b/Resources/Textures/Objects/laser_retro.rsi/meta.json index 149e54c660..e2322df7dc 100644 --- a/Resources/Textures/Objects/laser_retro.rsi/meta.json +++ b/Resources/Textures/Objects/laser_retro.rsi/meta.json @@ -1 +1,123 @@ -{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "Taken from https://github.com/vgstation-coders/vgstation13 at commit 125c975f1b3bf9826b37029e9ab5a5f89e975a7e", "states": [{"name": "0", "directions": 1, "delays": [[1.0]]}, {"name": "0-inhand-left", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "0-inhand-right", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "100", "directions": 1, "delays": [[1.0]]}, {"name": "100-inhand-left", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "100-inhand-right", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "25", "directions": 1, "delays": [[1.0]]}, {"name": "25-inhand-left", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "25-inhand-right", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "50", "directions": 1, "delays": [[1.0]]}, {"name": "50-inhand-left", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "50-inhand-right", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "75", "directions": 1, "delays": [[1.0]]}, {"name": "75-inhand-left", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "75-inhand-right", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}]} \ No newline at end of file +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13 at commit 125c975f1b3bf9826b37029e9ab5a5f89e975a7e", + "states": [ + { + "name": "laser_retro", + "directions": 1, + "delays": [ + [1.0] + ] + }, + { + "name": "laser_retro_100", + "directions": 1, + "delays": [ + [1.0] + ] + }, + { + "name": "laser_retro_75", + "directions": 1, + "delays": [ + [1.0] + ] + }, + { + "name": "laser_retro_50", + "directions": 1, + "delays": [ + [1.0] + ] + }, + { + "name": "laser_retro_25", + "directions": 1, + "delays": [ + [1.0] + ] + }, + { + "name": "laser_retro_0", + "directions": 1, + "delays": [ + [1.0] + ] + }, + { + "name": "inhand-left", + "directions": 4, + "delays": [ + [1.0], [1.0], [1.0], [1.0] + ] + }, + { + "name": "inhand-right", + "directions": 4, + "delays": [ + [1.0], [1.0], [1.0], [1.0] + ] + }, + { + "name": "0-inhand-left", + "directions": 4, + "delays": [ + [1.0], [1.0], [1.0], [1.0] + ] + }, + { + "name": "0-inhand-right", + "directions": 4, + "delays": [ + [1.0], [1.0], [1.0], [1.0] + ] + }, + { + "name": "25-inhand-left", + "directions": 4, + "delays": [ + [1.0], [1.0], [1.0], [1.0] + ] + }, + { + "name": "25-inhand-right", + "directions": 4, + "delays": [ + [1.0], [1.0], [1.0], [1.0] + ] + }, + { + "name": "50-inhand-left", + "directions": 4, + "delays": [ + [1.0], [1.0], [1.0], [1.0] + ] + }, + { + "name": "50-inhand-right", + "directions": 4, + "delays": [ + [1.0], [1.0], [1.0], [1.0] + ] + }, + { + "name": "75-inhand-left", + "directions": 4, + "delays": [ + [1.0], [1.0], [1.0], [1.0] + ] + }, + { + "name": "75-inhand-right", + "directions": 4, + "delays": [ + [1.0], [1.0], [1.0], [1.0] + ] + } + ] +} \ No newline at end of file