From 93be8a0c97b91ec88de94e9fde4357238bc7be07 Mon Sep 17 00:00:00 2001 From: Aviu00 <93730715+Aviu00@users.noreply.github.com> Date: Mon, 14 Aug 2023 15:55:12 +0300 Subject: [PATCH] Add flamethrower (#253) * Add flamethrower * Fix RSI * Add GasAmmoProvider * Add hidden crafting * Remove DoubleSwordCraft * Fix yml --- .../Construction/ConstructionSystem.Graph.cs | 21 ++++ .../Flamethrower/FlamethrowerComponent.cs | 6 + .../White/Flamethrower/FlamethrowerSystem.cs | 27 +++++ .../Flamethrower/GasProjectileComponent.cs | 19 +++ .../White/Flamethrower/GasProjectileSystem.cs | 78 +++++++++++++ .../White/Flamethrower/GunSystem.Gas.cs | 110 ++++++++++++++++++ .../Other/EnergySword/DoubleSwordCraft.cs | 57 --------- .../EnergySword/DoubleSwordCraftComponent.cs | 6 - .../Weapons/Ranged/Systems/SharedGunSystem.cs | 1 + .../Flamethrower/GasAmmoProviderComponent.cs | 31 +++++ .../White/Flamethrower/SharedGunSystem.Gas.cs | 44 +++++++ .../Entities/Objects/Tools/cowtools.yml | 2 +- .../Entities/Objects/Tools/gas_tanks.yml | 5 +- .../Entities/Objects/Tools/welders.yml | 20 +++- .../Objects/Weapons/Melee/e_sword.yml | 11 ++ .../Projectiles/flamethrower_projectile.yml | 32 +++++ .../Objects/Weapons/Guns/flamethrower.yml | 105 +++++++++++++++++ .../White/Recipes/hidden_crafts.yml | 46 ++++++++ Resources/Prototypes/White/tags.yml | 5 + .../Weapons/flamethrower.rsi/flame.png | Bin 0 -> 321 bytes .../Objects/Weapons/flamethrower.rsi/icon.png | Bin 0 -> 410 bytes .../flamethrower.rsi/inhand-left-flame.png | Bin 0 -> 201 bytes .../Weapons/flamethrower.rsi/inhand-left.png | Bin 0 -> 387 bytes .../flamethrower.rsi/inhand-right-flame.png | Bin 0 -> 201 bytes .../Weapons/flamethrower.rsi/inhand-right.png | Bin 0 -> 394 bytes .../Weapons/flamethrower.rsi/meta.json | 91 +++++++++++++++ .../Weapons/flamethrower.rsi/no-igniter.png | Bin 0 -> 395 bytes .../Objects/Weapons/flamethrower.rsi/tank.png | Bin 0 -> 326 bytes 28 files changed, 648 insertions(+), 69 deletions(-) create mode 100644 Content.Server/White/Flamethrower/FlamethrowerComponent.cs create mode 100644 Content.Server/White/Flamethrower/FlamethrowerSystem.cs create mode 100644 Content.Server/White/Flamethrower/GasProjectileComponent.cs create mode 100644 Content.Server/White/Flamethrower/GasProjectileSystem.cs create mode 100644 Content.Server/White/Flamethrower/GunSystem.Gas.cs delete mode 100644 Content.Server/White/Other/EnergySword/DoubleSwordCraft.cs delete mode 100644 Content.Server/White/Other/EnergySword/DoubleSwordCraftComponent.cs create mode 100644 Content.Shared/White/Flamethrower/GasAmmoProviderComponent.cs create mode 100644 Content.Shared/White/Flamethrower/SharedGunSystem.Gas.cs create mode 100644 Resources/Prototypes/White/Entities/Objects/Weapons/Guns/Projectiles/flamethrower_projectile.yml create mode 100644 Resources/Prototypes/White/Entities/Objects/Weapons/Guns/flamethrower.yml create mode 100644 Resources/Prototypes/White/Recipes/hidden_crafts.yml create mode 100644 Resources/Prototypes/White/tags.yml create mode 100644 Resources/Textures/White/Objects/Weapons/flamethrower.rsi/flame.png create mode 100644 Resources/Textures/White/Objects/Weapons/flamethrower.rsi/icon.png create mode 100644 Resources/Textures/White/Objects/Weapons/flamethrower.rsi/inhand-left-flame.png create mode 100644 Resources/Textures/White/Objects/Weapons/flamethrower.rsi/inhand-left.png create mode 100644 Resources/Textures/White/Objects/Weapons/flamethrower.rsi/inhand-right-flame.png create mode 100644 Resources/Textures/White/Objects/Weapons/flamethrower.rsi/inhand-right.png create mode 100644 Resources/Textures/White/Objects/Weapons/flamethrower.rsi/meta.json create mode 100644 Resources/Textures/White/Objects/Weapons/flamethrower.rsi/no-igniter.png create mode 100644 Resources/Textures/White/Objects/Weapons/flamethrower.rsi/tank.png diff --git a/Content.Server/Construction/ConstructionSystem.Graph.cs b/Content.Server/Construction/ConstructionSystem.Graph.cs index 570360bf09..2365b4781a 100644 --- a/Content.Server/Construction/ConstructionSystem.Graph.cs +++ b/Content.Server/Construction/ConstructionSystem.Graph.cs @@ -1,3 +1,4 @@ +using System.Linq; using Content.Server.Construction.Components; using Content.Server.Containers; using Content.Shared.Construction; @@ -5,6 +6,8 @@ using Content.Shared.Construction.Prototypes; using Content.Shared.Construction.Steps; using Content.Shared.Containers; using Content.Shared.Database; +using Content.Shared.Hands.Components; +using Content.Shared.Item; using Robust.Server.Containers; using Robust.Shared.Containers; using Robust.Shared.Prototypes; @@ -394,6 +397,16 @@ namespace Content.Server.Construction } } + if (userUid != null && IsTransformParentOf(userUid.Value, transform) && + TryComp(userUid, out HandsComponent? hands)) + { + var hand = hands.Hands.Values.FirstOrDefault(h => h.HeldEntity == uid); + if (hand != null) + _handsSystem.TryDrop(userUid.Value, hand, handsComp: hands); + + _handsSystem.PickupOrDrop(userUid, newUid, handsComp: hands); + } + var entChangeEv = new ConstructionChangeEntityEvent(newUid, uid); RaiseLocalEvent(uid, entChangeEv); RaiseLocalEvent(newUid, entChangeEv, broadcast: true); @@ -410,6 +423,14 @@ namespace Content.Server.Construction return newUid; } + bool IsTransformParentOf(EntityUid uid, TransformComponent target) // WD + { + var parentUid = target.ParentUid; + + return parentUid == uid || + TryComp(parentUid, out TransformComponent? trans) && IsTransformParentOf(uid, trans); + } + /// /// Performs a construction graph change on a construction entity, also changing the node to a valid one on /// the new graph. diff --git a/Content.Server/White/Flamethrower/FlamethrowerComponent.cs b/Content.Server/White/Flamethrower/FlamethrowerComponent.cs new file mode 100644 index 0000000000..c669c73ec6 --- /dev/null +++ b/Content.Server/White/Flamethrower/FlamethrowerComponent.cs @@ -0,0 +1,6 @@ +namespace Content.Server.White.Flamethrower; + +[RegisterComponent] +public sealed partial class FlamethrowerComponent : Component +{ +} diff --git a/Content.Server/White/Flamethrower/FlamethrowerSystem.cs b/Content.Server/White/Flamethrower/FlamethrowerSystem.cs new file mode 100644 index 0000000000..cd85b9a309 --- /dev/null +++ b/Content.Server/White/Flamethrower/FlamethrowerSystem.cs @@ -0,0 +1,27 @@ +using Content.Server.IgnitionSource; +using Content.Shared.Temperature; +using Content.Shared.Weapons.Ranged.Systems; + +namespace Content.Server.White.Flamethrower; + +public sealed class FlamethrowerSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnShoot); + } + + private void OnShoot(EntityUid uid, FlamethrowerComponent component, ref GunShotEvent args) + { + var hasIgnition = TryComp(uid, out IgnitionSourceComponent? ignition); + var isHotEvent = new IsHotEvent {IsHot = hasIgnition && ignition!.Ignited}; + + foreach (var (shotUid, _) in args.Ammo) + { + if(shotUid is not null) + RaiseLocalEvent(shotUid.Value, isHotEvent); + } + } +} diff --git a/Content.Server/White/Flamethrower/GasProjectileComponent.cs b/Content.Server/White/Flamethrower/GasProjectileComponent.cs new file mode 100644 index 0000000000..aa7803e928 --- /dev/null +++ b/Content.Server/White/Flamethrower/GasProjectileComponent.cs @@ -0,0 +1,19 @@ +using Content.Server.Atmos; + +namespace Content.Server.White.Flamethrower; + +[RegisterComponent] +public sealed partial class GasProjectileComponent : Component +{ + public GasMixture? GasMixture; + + public TileInfo? LastTile; + + public TileInfo? CurTile; + + [DataField("gasUsagePerTile", required: true)] + [ViewVariables(VVAccess.ReadWrite)] + public float GasUsagePerTile; +} + +public record struct TileInfo(EntityUid? GridUid, EntityUid? MapUid, Vector2i Tile); diff --git a/Content.Server/White/Flamethrower/GasProjectileSystem.cs b/Content.Server/White/Flamethrower/GasProjectileSystem.cs new file mode 100644 index 0000000000..4a8e748566 --- /dev/null +++ b/Content.Server/White/Flamethrower/GasProjectileSystem.cs @@ -0,0 +1,78 @@ +using Content.Server.Atmos.Components; +using Content.Server.Atmos.EntitySystems; +using Content.Server.IgnitionSource; +using Robust.Server.GameObjects; +using Robust.Shared.Physics.Events; + +namespace Content.Server.White.Flamethrower; + +public sealed class GasProjectileSystem : EntitySystem +{ + [Dependency] private readonly AtmosphereSystem _atmos = default!; + [Dependency] private readonly TransformSystem _transformSystem = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnCollide); + } + + private void OnCollide(EntityUid uid, GasProjectileComponent component, ref StartCollideEvent args) + { + if (component.GasMixture is null) + return; + + var tileInfo = HasComp(args.OtherEntity) ? component.LastTile : component.CurTile; + + if (tileInfo is null) + return; + + var tile = tileInfo.Value; + + var environment = _atmos.GetTileMixture(tile.GridUid, tile.MapUid, tile.Tile, true); + + if (environment is null) + return; + + _atmos.Merge(environment, component.GasMixture); + + if (tile.GridUid is null || !TryComp(uid, out IgnitionSourceComponent? ignition) || !ignition.Ignited) + return; + + _atmos.HotspotExpose(tile.GridUid.Value, tile.Tile, ignition.Temperature, 50, uid, true); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + var query = EntityManager.EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var proj, out var trans)) + { + if (proj.GasMixture is null || proj.GasMixture.TotalMoles == 0f) + { + QueueDel(uid); + continue; + } + + var tileCoords = _transformSystem.GetGridOrMapTilePosition(uid, trans); + + var tileInfo = new TileInfo(trans.GridUid, trans.MapUid, tileCoords); + + if (proj.CurTile == tileInfo) + continue; + + proj.LastTile = proj.CurTile; + proj.CurTile = tileInfo; + + var environment = _atmos.GetTileMixture(trans.GridUid, trans.MapUid, tileCoords, true); + var removed = proj.GasMixture.Remove(proj.GasUsagePerTile); + + if (environment is null) + continue; + + _atmos.Merge(environment, removed); + } + } +} diff --git a/Content.Server/White/Flamethrower/GunSystem.Gas.cs b/Content.Server/White/Flamethrower/GunSystem.Gas.cs new file mode 100644 index 0000000000..7b6105ffa4 --- /dev/null +++ b/Content.Server/White/Flamethrower/GunSystem.Gas.cs @@ -0,0 +1,110 @@ +using System.Diagnostics.CodeAnalysis; +using Content.Server.Atmos.Components; +using Content.Server.Atmos.EntitySystems; +using Content.Server.White.Flamethrower; +using Content.Shared.White.Flamethrower; +using Robust.Shared.Containers; + +namespace Content.Server.Weapons.Ranged.Systems; + +public sealed partial class GunSystem +{ + [Dependency] private readonly GasTankSystem _gasTank = default!; + + private const string GasTankSlot = "gas_tank"; + + protected override void InitializeGas() + { + base.InitializeGas(); + + SubscribeLocalEvent(OnGasStartup); + SubscribeLocalEvent(OnGasSlotChange); + SubscribeLocalEvent(OnGasSlotChange); + } + + private void OnGasSlotChange(EntityUid uid, GasAmmoProviderComponent component, ContainerModifiedMessage args) + { + if (GasTankSlot != args.Container.ID) + return; + + UpdateShots(uid, component); + } + + private void OnGasStartup(EntityUid uid, GasAmmoProviderComponent component, ComponentStartup args) + { + UpdateShots(uid, component); + } + + private static int CalculateShots(GasAmmoProviderComponent component, GasTankComponent tank) + { + return (int) MathF.Ceiling(tank.Air.TotalMoles / component.GasUsage); + } + + private void UpdateShots(EntityUid uid, GasAmmoProviderComponent component) + { + var shots = 0; + var pressure = 0f; + + if (TryTakeGasTankComponent(uid, out var tank, out _)) + { + shots = CalculateShots(component, tank); + pressure = tank.Air.Pressure; + } + + UpdateShots(component, shots, pressure); + } + + private void UpdateShots(GasAmmoProviderComponent component, int shots, float pressure) + { + if (component.Shots != shots || MathF.Abs(component.Pressure - pressure) > 1e-3f) + { + Dirty(component); + } + + component.Shots = shots; + component.Pressure = pressure; + } + + private bool TryTakeGasTankComponent(EntityUid uid, [NotNullWhen(true)] out GasTankComponent? tank, + [NotNullWhen(true)] out EntityUid? tankUid) + { + if (!Containers.TryGetContainer(uid, GasTankSlot, out var container) || + container is not ContainerSlot slot) + { + tank = null; + tankUid = null; + return false; + } + + tankUid = slot.ContainedEntity; + + if (tankUid != null) + return TryComp(tankUid, out tank); + + tank = null; + return false; + + } + + protected override void InitShot(EntityUid uid, GasAmmoProviderComponent component, EntityUid shotUid) + { + if (!TryTakeGasTankComponent(uid, out var tank, out var tankUid) || + !TryComp(shotUid, out GasProjectileComponent? proj)) + return; + + var trans = Transform(uid); + + var curTile = TransformSystem.GetGridOrMapTilePosition(uid, trans); + + var tileInfo = new TileInfo(trans.GridUid, trans.MapUid, curTile); + proj.LastTile = tileInfo; + proj.CurTile = tileInfo; + + var removed = _gasTank.RemoveAir((tankUid.Value, tank), component.GasUsage); + + if(removed is not null) + proj.GasMixture = removed; + + UpdateShots(component, CalculateShots(component, tank), tank.Air.Pressure); + } +} diff --git a/Content.Server/White/Other/EnergySword/DoubleSwordCraft.cs b/Content.Server/White/Other/EnergySword/DoubleSwordCraft.cs deleted file mode 100644 index a785efae33..0000000000 --- a/Content.Server/White/Other/EnergySword/DoubleSwordCraft.cs +++ /dev/null @@ -1,57 +0,0 @@ -using Content.Shared.Hands.EntitySystems; -using Content.Shared.Interaction; -using Robust.Shared.Audio; - -namespace Content.Server.White.Other.EnergySword; - -public sealed class EnergyDoubleSwordCraftSystem : EntitySystem -{ - [Dependency] private readonly SharedHandsSystem _handsSystem = default!; - [Dependency] private readonly IEntityManager _entityManager = default!; - - public override void Initialize() - { - base.Initialize(); - SubscribeLocalEvent(Combine); - } - - private const string NeededEnt = "EnergySword"; - private const string EnergyDoubleSword = "EnergyDoubleSword"; - - private void Combine(EntityUid uid, DoubleSwordCraftComponent component, InteractUsingEvent args) - { - if (args.Handled) - return; - - var user = args.User; - var usedEnt = _entityManager.GetComponent(args.Used).EntityPrototype!.ID; - var usedTo = _entityManager.GetComponent(uid).EntityPrototype!.ID; - - if (usedTo is EnergyDoubleSword) - return; - - if (usedEnt != NeededEnt || usedTo != NeededEnt) - return; - - DeleteUsed(args.Used, uid); - SpawnEnergyDoubleSword(user); - } - - - private void DeleteUsed(EntityUid itemA, EntityUid itemB) - { - _entityManager.DeleteEntity(itemA); - _entityManager.DeleteEntity(itemB); - } - - private void SpawnEnergyDoubleSword(EntityUid player) - { - var transform = CompOrNull(player)?.Coordinates; - - if (transform == null) - return; - - var weaponEntity = _entityManager.SpawnEntity(EnergyDoubleSword, transform.Value); - _handsSystem.PickupOrDrop(player, weaponEntity); - } -} diff --git a/Content.Server/White/Other/EnergySword/DoubleSwordCraftComponent.cs b/Content.Server/White/Other/EnergySword/DoubleSwordCraftComponent.cs deleted file mode 100644 index c71380fae0..0000000000 --- a/Content.Server/White/Other/EnergySword/DoubleSwordCraftComponent.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Content.Server.White.Other.EnergySword; - -[RegisterComponent] -public sealed partial class DoubleSwordCraftComponent : Component -{ -} diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs index f302a8a9d6..e09a550236 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs @@ -86,6 +86,7 @@ public abstract partial class SharedGunSystem : EntitySystem InitializeClothing(); InitializeContainer(); InitializeSolution(); + InitializeGas(); // WD // Interactions SubscribeLocalEvent>(OnAltVerb); diff --git a/Content.Shared/White/Flamethrower/GasAmmoProviderComponent.cs b/Content.Shared/White/Flamethrower/GasAmmoProviderComponent.cs new file mode 100644 index 0000000000..77c4d2445a --- /dev/null +++ b/Content.Shared/White/Flamethrower/GasAmmoProviderComponent.cs @@ -0,0 +1,31 @@ +using Content.Shared.Weapons.Ranged.Components; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; + +namespace Content.Shared.White.Flamethrower; + +[RegisterComponent, NetworkedComponent] +[AutoGenerateComponentState] +public sealed partial class GasAmmoProviderComponent : AmmoProviderComponent +{ + [DataField("gasUsage", required: true)] + [AutoNetworkedField] + public float GasUsage; + + [ViewVariables] + [AutoNetworkedField] + public int Shots; + + [ViewVariables] + [AutoNetworkedField] + public int Capacity; + + [ViewVariables] + [AutoNetworkedField] + public float Pressure; + + [ViewVariables(VVAccess.ReadWrite), DataField("proto", required: true, customTypeSerializer: typeof(PrototypeIdSerializer))] + [AutoNetworkedField] + public string Prototype = default!; +} diff --git a/Content.Shared/White/Flamethrower/SharedGunSystem.Gas.cs b/Content.Shared/White/Flamethrower/SharedGunSystem.Gas.cs new file mode 100644 index 0000000000..a3149b2134 --- /dev/null +++ b/Content.Shared/White/Flamethrower/SharedGunSystem.Gas.cs @@ -0,0 +1,44 @@ +using Content.Shared.Examine; +using Content.Shared.Weapons.Ranged.Components; +using Content.Shared.Weapons.Ranged.Events; +using Content.Shared.White.Flamethrower; + +namespace Content.Shared.Weapons.Ranged.Systems; + +public abstract partial class SharedGunSystem +{ + protected virtual void InitializeGas() + { + SubscribeLocalEvent(OnGasTakeAmmo); + SubscribeLocalEvent(OnGasAmmoCount); + SubscribeLocalEvent(OnGasExamine); + } + + private void OnGasExamine(EntityUid uid, GasAmmoProviderComponent component, ExaminedEvent args) + { + args.PushMarkup(Loc.GetString("comp-gas-tank-examine", ("pressure", MathF.Round(component.Pressure)))); + } + + private void OnGasAmmoCount(EntityUid uid, GasAmmoProviderComponent component, ref GetAmmoCountEvent args) + { + args.Count = component.Shots; + args.Capacity = component.Capacity; + } + + private void OnGasTakeAmmo(EntityUid uid, GasAmmoProviderComponent component, TakeAmmoEvent args) + { + var shots = Math.Min(args.Shots, component.Shots); + + if (shots == 0) + return; + + for (var i = 0; i < shots; i++) + { + var ent = Spawn(component.Prototype, args.Coordinates); + InitShot(uid, component, ent); + args.Ammo.Add((ent, EnsureComp(ent))); + } + } + + protected virtual void InitShot(EntityUid uid, GasAmmoProviderComponent component, EntityUid shotUid) {} +} diff --git a/Resources/Prototypes/Entities/Objects/Tools/cowtools.yml b/Resources/Prototypes/Entities/Objects/Tools/cowtools.yml index 05a80043e8..cb321a7819 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/cowtools.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/cowtools.yml @@ -116,7 +116,7 @@ - type: entity name: cowelding tool - parent: Welder + parent: BaseWelder id: Cowelder description: "Melts anything as long as it's fueled, don't forget your eye protection! Moo!" components: diff --git a/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml b/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml index 71b581a4f3..169e767973 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml @@ -1,4 +1,4 @@ -- type: entity +- type: entity abstract: true parent: BaseItem id: GasTankBase @@ -250,3 +250,6 @@ outputPressure: 101.3 - type: Clothing sprite: Objects/Tanks/plasma.rsi + - type: Tag + tags: + - TankPlasma diff --git a/Resources/Prototypes/Entities/Objects/Tools/welders.yml b/Resources/Prototypes/Entities/Objects/Tools/welders.yml index 60dfe0f136..5606e4cbac 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/welders.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/welders.yml @@ -1,8 +1,9 @@ - type: entity name: welding tool parent: BaseItem - id: Welder + id: BaseWelder description: "Melts anything as long as it's fueled, don't forget your eye protection!" + noSpawn: true components: - type: EmitSoundOnLand sound: @@ -99,9 +100,20 @@ - type: IgnitionSource temperature: 700 +- type: entity + name: welding tool + parent: BaseWelder + id: Welder + description: "Melts anything as long as it's fueled, don't forget your eye protection!" + components: + - type: Construction + deconstructionTarget: null + graph: WeaponFlamethrowerGraph + node: welder + - type: entity name: industrial welding tool - parent: Welder + parent: BaseWelder id: WelderIndustrial description: "An industrial welder with over double the fuel capacity." components: @@ -139,7 +151,7 @@ - type: entity name: experimental welding tool - parent: Welder + parent: BaseWelder id: WelderExperimental description: "An experimental welder capable of self-fuel generation and less harmful to the eyes." components: @@ -167,7 +179,7 @@ - type: entity name: emergency welding tool - parent: Welder + parent: BaseWelder id: WelderMini description: "A miniature welder used during emergencies." components: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml index 96fe04b18e..c7df82e3bf 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml @@ -78,6 +78,13 @@ malus: 0 - type: Reflect enabled: false + - type: Tag + tags: + - EnergySword + - type: Construction + deconstructionTarget: null + graph: EnergyDoubleSwordGraph + node: esword - type: entity name: pen @@ -244,3 +251,7 @@ energeticChance: 0.6 kineticChance: 0.6 spread: 45 + - type: Construction + deconstructionTarget: null + graph: EnergyDoubleSwordGraph + node: desword diff --git a/Resources/Prototypes/White/Entities/Objects/Weapons/Guns/Projectiles/flamethrower_projectile.yml b/Resources/Prototypes/White/Entities/Objects/Weapons/Guns/Projectiles/flamethrower_projectile.yml new file mode 100644 index 0000000000..c591299419 --- /dev/null +++ b/Resources/Prototypes/White/Entities/Objects/Weapons/Guns/Projectiles/flamethrower_projectile.yml @@ -0,0 +1,32 @@ +- type: entity + id: ProjectileFlamethrower + name: ProjectileFlamethrower + description: ProjectileFlamethrower + noSpawn: true + components: + - type: GasProjectile + gasUsagePerTile: 0.7 + - type: Projectile + damage: + types: + Structural: 0 + - type: TimedDespawn + lifetime: 0.2 + - type: Physics + bodyType: Dynamic + linearDamping: 0 + angularDamping: 0 + - type: Fixtures + fixtures: + projectile: + shape: + !type:PhysShapeAabb + bounds: "-0.1,-0.1,0.1,0.1" + hard: false + mask: + - Impassable + - BulletImpassable + - type: IgnitionSource + temperature: 4000 + - type: Ammo + muzzleFlash: null diff --git a/Resources/Prototypes/White/Entities/Objects/Weapons/Guns/flamethrower.yml b/Resources/Prototypes/White/Entities/Objects/Weapons/Guns/flamethrower.yml new file mode 100644 index 0000000000..5651114d31 --- /dev/null +++ b/Resources/Prototypes/White/Entities/Objects/Weapons/Guns/flamethrower.yml @@ -0,0 +1,105 @@ +- type: entity + name: огнемёт + parent: BaseWelder + id: WeaponFlamethrower + description: Отлично подходит для сжигания фурри. + components: + - type: Sprite + sprite: White/Objects/Weapons/flamethrower.rsi + layers: + - state: icon + - state: tank + map: [ "tank" ] + visible: false + - state: flame + shader: unshaded + visible: false + map: ["enum.ToggleVisuals.Layer"] + - type: Item + size: Large + sprite: White/Objects/Weapons/flamethrower.rsi + - type: Clothing + quickEquip: false + slots: + - Back + - type: Gun + cameraRecoilScalar: 0 + fireRate: 2 + soundGunshot: + path: /Audio/Weapons/Guns/Gunshots/water_spray.ogg + - type: GasAmmoProvider + gasUsage: 2.1 + proto: ProjectileFlamethrower + - type: Flamethrower + - type: ItemMapper + containerWhitelist: [gas_tank] + mapLayers: + tank: + whitelist: + tags: + - TankPlasma + - type: ItemSlots + slots: + gas_tank: + name: Баллон с плазмой + whitelist: + tags: + - TankPlasma + insertSound: + path: /Audio/Weapons/click.ogg + params: + volume: -3 + - type: ContainerContainer + containers: + gas_tank: !type:ContainerSlot + - type: ToggleableLightVisuals + spriteLayer: flame + inhandVisuals: + left: + - state: inhand-left-flame + shader: unshaded + right: + - state: inhand-right-flame + shader: unshaded + - type: Construction + deconstructionTarget: null + graph: WeaponFlamethrowerGraph + node: flamethrower + +- type: entity + name: часть огнемёта + parent: BaseItem + id: WeaponFlamethrowerNoIgniter + description: Недоделанный огнемёт. + components: + - type: Sprite + sprite: White/Objects/Weapons/flamethrower.rsi + layers: + - state: no-igniter + - type: Item + size: Large + sprite: White/Objects/Weapons/flamethrower.rsi + - type: Clothing + quickEquip: false + slots: + - Back + - type: Construction + deconstructionTarget: null + graph: WeaponFlamethrowerGraph + node: no-igniter + +- type: entity + name: часть огнемёта + parent: WeaponFlamethrowerNoIgniter + id: WeaponFlamethrowerUnscrewed + description: Недоделанный огнемёт. + components: + - type: Sprite + sprite: White/Objects/Weapons/flamethrower.rsi + layers: + - state: icon + - type: Construction + deconstructionTarget: null + graph: WeaponFlamethrowerGraph + node: unscrewed + diff --git a/Resources/Prototypes/White/Recipes/hidden_crafts.yml b/Resources/Prototypes/White/Recipes/hidden_crafts.yml new file mode 100644 index 0000000000..41fd1c90bb --- /dev/null +++ b/Resources/Prototypes/White/Recipes/hidden_crafts.yml @@ -0,0 +1,46 @@ +- type: constructionGraph + id: EnergyDoubleSwordGraph + start: esword + graph: + - node: esword + entity: EnergySword + edges: + - to: desword + steps: + - tag: EnergySword + - node: desword + entity: EnergyDoubleSword + +- type: constructionGraph + id: WeaponFlamethrowerGraph + start: welder + graph: + - node: welder + entity: Welder + edges: + - to: screwed-welder + steps: + - tool: Screwing + doAfter: 1 + - node: screwed-welder + edges: + - to: no-igniter + steps: + - material: MetalRod + amount: 5 + doAfter: 5 + - node: no-igniter + entity: WeaponFlamethrowerNoIgniter + edges: + - to: unscrewed + steps: + - tag: Igniter + - node: unscrewed + entity: WeaponFlamethrowerUnscrewed + edges: + - to: flamethrower + steps: + - tool: Screwing + doAfter: 1 + - node: flamethrower + entity: WeaponFlamethrower diff --git a/Resources/Prototypes/White/tags.yml b/Resources/Prototypes/White/tags.yml new file mode 100644 index 0000000000..77fb65e2eb --- /dev/null +++ b/Resources/Prototypes/White/tags.yml @@ -0,0 +1,5 @@ +- type: Tag + id: TankPlasma + +- type: Tag + id: EnergySword diff --git a/Resources/Textures/White/Objects/Weapons/flamethrower.rsi/flame.png b/Resources/Textures/White/Objects/Weapons/flamethrower.rsi/flame.png new file mode 100644 index 0000000000000000000000000000000000000000..622436b3597b3d30d08cdeb8761cc1bd220f9359 GIT binary patch literal 321 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!7>k44ofy`glX(f`R0sHkxE?rg z;Qtxp|1%kmMDsDE{bw*vJCl~Ct)*pcWz}ZO?&j+HxK8SMt>|2D{@>j)XLHpzhl~98 zGX8I1eACN(sV|?Fre;V;$ocvFGt2l44GrDh-9v+e6|@~}ZEYnbB|Xd-vH}=u;#gdq zoIE@{($muFSXnm<2n721{r~^}=UaInpffZ}g8YIRfPA8W)A4gFfST+*T^vIqTHjtX zM`S<_mH?cTJogVAAlP=7Y{JPgg&ebxsLQ09{mw#{d8T literal 0 HcmV?d00001 diff --git a/Resources/Textures/White/Objects/Weapons/flamethrower.rsi/icon.png b/Resources/Textures/White/Objects/Weapons/flamethrower.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f3bfd1973cf0ffb67349d1c32f796d235d4cb319 GIT binary patch literal 410 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|ssnsNTn`*L z@c)eQ|CtO&qWKuo{xcY-ok>g6*3z=JvTCzscXM@pTqpIsR&=g6|L<;@v$^V1k_1Oom1{{R2~^R2uO&>5N~L4LsuKt55x>G-)7Kut3|T^vI!dY?`@ z$j79}!z zW2n@1ZDKZS+9^AMseYa3#jiGdtV`H>X=|-3+nTelom`XSUT>TH^4grWty&X;UcHNW zKPTGUi21Lkdqz!kD+kKGW{l&bWVfR0A2IGHR_KVed3k4F- Tvosw5x{<-t)z4*}Q$iB}e>k&7 literal 0 HcmV?d00001 diff --git a/Resources/Textures/White/Objects/Weapons/flamethrower.rsi/inhand-left-flame.png b/Resources/Textures/White/Objects/Weapons/flamethrower.rsi/inhand-left-flame.png new file mode 100644 index 0000000000000000000000000000000000000000..cbb49ca3be4e1f49e8200b049d7cd0c9c30da2d1 GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^2|(Py!VDzYJ{5KXDVB6cUq=Rpjs4tz5?O(K{s5m4 zS0H`t{r{I@Vjq70{~E(^M|g zj`J4GF8Lq)^}f?4g+Rm4-(v(EKO|-!FggC$VjcJEu+y2{8uJ($!bP0sy+3O6W<~)g u!~X2i>T6l9v-jzp+&ftiP_gs*18^O2ZN`ppUXO@geCx;;6}p$ literal 0 HcmV?d00001 diff --git a/Resources/Textures/White/Objects/Weapons/flamethrower.rsi/inhand-left.png b/Resources/Textures/White/Objects/Weapons/flamethrower.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..7e97dad0ec951dfcea72c479b91ebc3e067a4914 GIT binary patch literal 387 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!7>k44ofy`glX(f`Ix3`~<_d5lZ|NsAg zs^(Gz+NV+yQB`{#uCj+w4AZs&!>%x>f~RbJ)P`6?@PuHXstBSjm(<#>f{ z^3=Gae>tWkXKTva^Piso4%~cGLX=&t(DA1aYPE&KIs)@wT$tDdpy7B+2L3bcd4)78&qol`;+0Jj=U%>V!Z literal 0 HcmV?d00001 diff --git a/Resources/Textures/White/Objects/Weapons/flamethrower.rsi/inhand-right.png b/Resources/Textures/White/Objects/Weapons/flamethrower.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..25ad2f380c9b8a30575753f79c1e25a27035db05 GIT binary patch literal 394 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!7>k44ofy`glX(f`kD zUkwaYRaO1Gy%iM|Uv1|9&%ki+{yl#mA4Nq4e{UZ(HPx4!6(@Q!|9Y$ZPEmD&x8g(} zMFj-~MJ1(8v0VSx+y0-%@G(YdbArb2bq+tK%WaBRpXjald!7A{X>$JF-hMvb?-W#k z7A1cBmj|?0r6kBNm|-SRfBbm_7Ob|1FAq z93fkELYI17J=go7beeE5mtsqe{Lhk*t3IKrjpknh&t8d8dzSb2rC;;BxZq7?6NR?6 zK74s((bXCEA8q{^(cR`AnSXVAbB7I^`I&=0bK?&1UT}2cP<--y&)?(BOa(#hb7LJR zu(_Asc(-?@f_v!<=>pcupmvt93DaLOXrDOBaQ0DrC4;mvt8(Ktp2I+QGI+ZBxvXg6*3z=JvTCzscXM@pTqpIsR&=g6|L<;@v$^V1k_1Oom1{{R2~^R2uO&>5N~L4LsuKt55x>G-)7Kuw*VE{-7>|%d>8g<-0FEeraS7-TG$f`oAJg6*3z=JvTCzscXM@pTqpIsR&=g6|L<;@v$^V1k_1Oom1{{R2~^R2uO&>5N~L4LsuKt55x>G-)7Apdx}IEGmCzMZg> zmqCGtd1BDQ50n3