ChemicalAmmoComponent (#2739)
* ChemicalAmmoComponent * Moves BarrelFiredMessage to FireProjectiles Co-authored-by: py01 <pyronetics01@gmail.com>
This commit is contained in:
@@ -223,7 +223,8 @@
|
||||
"Machine",
|
||||
"MachinePart",
|
||||
"MachineFrame",
|
||||
"MachineBoard"
|
||||
"MachineBoard",
|
||||
"ChemicalAmmo"
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -99,3 +99,8 @@
|
||||
projectile: PelletShotgunTranquilizer
|
||||
projectilesFired: 1
|
||||
ammoSpread: 0
|
||||
- type: ChemicalAmmo
|
||||
- type: SolutionContainer
|
||||
maxVol: 15
|
||||
caps: AddTo, RemoveFrom
|
||||
- type: Pourable
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user