ChemicalAmmoComponent (#2739)

* ChemicalAmmoComponent

* Moves BarrelFiredMessage to FireProjectiles

Co-authored-by: py01 <pyronetics01@gmail.com>
This commit is contained in:
py01
2020-12-15 07:38:41 -06:00
committed by GitHub
parent 0a50f608c6
commit c770c6b37e
5 changed files with 91 additions and 9 deletions

View File

@@ -223,7 +223,8 @@
"Machine",
"MachinePart",
"MachineFrame",
"MachineBoard"
"MachineBoard",
"ChemicalAmmo"
};
}
}

View File

@@ -0,0 +1,66 @@
using Content.Server.GameObjects.Components.Chemistry;
using Content.Server.GameObjects.Components.Weapon.Ranged.Barrels;
using Content.Shared.Chemistry;
using Robust.Shared.GameObjects;
using Robust.Shared.Interfaces.GameObjects;
using Robust.Shared.Serialization;
using System.Collections.Generic;
using System.Linq;
namespace Content.Server.GameObjects.Components.Weapon.Ranged.Ammunition
{
[RegisterComponent]
public class ChemicalAmmoComponent : Component
{
public override string Name => "ChemicalAmmo";
private float _fractionTransfered;
public override void ExposeData(ObjectSerializer serializer)
{
base.ExposeData(serializer);
serializer.DataField(ref _fractionTransfered, "fractionTransfered", 1);
}
public override void HandleMessage(ComponentMessage message, IComponent component)
{
base.HandleMessage(message, component);
switch (message)
{
case BarrelFiredMessage barrelFired:
TransferSolution(barrelFired);
break;
}
}
private void TransferSolution(BarrelFiredMessage barrelFired)
{
if (!Owner.TryGetComponent<SolutionContainerComponent>(out var ammoSolutionContainer))
return;
var projectiles = barrelFired.FiredProjectiles;
var projectileSolutionContainers = new List<SolutionContainerComponent>();
foreach (var projectile in projectiles)
{
if (projectile.TryGetComponent<SolutionContainerComponent>(out var projectileSolutionContainer))
{
projectileSolutionContainers.Add(projectileSolutionContainer);
}
}
if (!projectileSolutionContainers.Any())
return;
var solutionPerProjectile = ammoSolutionContainer.CurrentVolume * (1 / projectileSolutionContainers.Count);
foreach (var projectileSolutionContainer in projectileSolutionContainers)
{
var solutionToTransfer = ammoSolutionContainer.SplitSolution(solutionPerProjectile);
projectileSolutionContainer.TryAddSolution(solutionToTransfer);
}
ammoSolutionContainer.RemoveAllSolution();
}
}
}

View File

@@ -252,7 +252,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels
{
var ammoComponent = ammo.GetComponent<AmmoComponent>();
FireProjectiles(shooter, projectile, ammoComponent.ProjectilesFired, ammoComponent.EvenSpreadAngle, angle, ammoComponent.Velocity);
FireProjectiles(shooter, projectile, ammoComponent.ProjectilesFired, ammoComponent.EvenSpreadAngle, angle, ammoComponent.Velocity, ammo);
if (CanMuzzleFlash)
{
@@ -351,7 +351,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels
/// <summary>
/// Handles firing one or many projectiles
/// </summary>
private void FireProjectiles(IEntity shooter, IEntity baseProjectile, int count, float evenSpreadAngle, Angle angle, float velocity)
private void FireProjectiles(IEntity shooter, IEntity baseProjectile, int count, float evenSpreadAngle, Angle angle, float velocity, IEntity ammo)
{
List<Angle> sprayAngleChange = null;
if (count > 1)
@@ -360,6 +360,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels
sprayAngleChange = Linspace(-evenSpreadAngle / 2, evenSpreadAngle / 2, count);
}
var firedProjectiles = new List<IEntity>();
for (var i = 0; i < count; i++)
{
IEntity projectile;
@@ -373,6 +374,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels
projectile =
Owner.EntityManager.SpawnEntity(baseProjectile.Prototype.ID, baseProjectile.Transform.Coordinates);
}
firedProjectiles.Add(projectile);
Angle projectileAngle;
@@ -398,6 +400,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels
projectile.Transform.LocalRotation = projectileAngle.Theta;
}
ammo.SendMessage(this, new BarrelFiredMessage(firedProjectiles));
}
/// <summary>
@@ -458,4 +461,14 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels
message.AddText(fireRateMessage);
}
}
public class BarrelFiredMessage : ComponentMessage
{
public readonly List<IEntity> FiredProjectiles;
public BarrelFiredMessage(List<IEntity> firedProjectiles)
{
FiredProjectiles = firedProjectiles;
}
}
}

View File

@@ -99,3 +99,8 @@
projectile: PelletShotgunTranquilizer
projectilesFired: 1
ammoSpread: 0
- type: ChemicalAmmo
- type: SolutionContainer
maxVol: 15
caps: AddTo, RemoveFrom
- type: Pourable

View File

@@ -90,10 +90,7 @@
damages:
Blunt: 1
- type: SolutionContainer
maxVol: 10
contents:
reagents:
- ReagentId: chem.H2O
Quantity: 10
caps: RemoveFrom
maxVol: 15
caps: AddTo, RemoveFrom
- type: ChemicalInjectionProjectile
transferAmount: 15