Files
OldThink/Content.Server/Weapons/Ranged/Systems/GunSystem.Battery.cs

146 lines
5.6 KiB
C#
Raw Normal View History

using Content.Server.Power.Components;
using Content.Shared.Damage;
2023-08-07 12:09:35 +03:00
using Content.Shared.Damage.Events;
2023-04-28 02:10:32 +06:00
using Content.Shared.Interaction.Events;
using Content.Shared.Weapons.Ranged;
using Content.Shared.Weapons.Ranged.Components;
2024-01-11 09:44:36 +03:00
using Robust.Server.Audio;
namespace Content.Server.Weapons.Ranged.Systems;
public sealed partial class GunSystem
{
2024-01-11 09:44:36 +03:00
[Dependency] private readonly AudioSystem _audio = default!;
2023-04-28 02:10:32 +06:00
protected override void InitializeBattery()
{
base.InitializeBattery();
// Hitscan
SubscribeLocalEvent<HitscanBatteryAmmoProviderComponent, ComponentStartup>(OnBatteryStartup);
SubscribeLocalEvent<HitscanBatteryAmmoProviderComponent, ChargeChangedEvent>(OnBatteryChargeChange);
2023-08-07 12:09:35 +03:00
SubscribeLocalEvent<HitscanBatteryAmmoProviderComponent, DamageExamineEvent>(OnBatteryDamageExamine);
// Projectile
SubscribeLocalEvent<ProjectileBatteryAmmoProviderComponent, ComponentStartup>(OnBatteryStartup);
SubscribeLocalEvent<ProjectileBatteryAmmoProviderComponent, ChargeChangedEvent>(OnBatteryChargeChange);
2023-08-07 12:09:35 +03:00
SubscribeLocalEvent<ProjectileBatteryAmmoProviderComponent, DamageExamineEvent>(OnBatteryDamageExamine);
2023-04-28 02:10:32 +06:00
//TwoModeEnergy
SubscribeLocalEvent<TwoModeEnergyAmmoProviderComponent, ComponentStartup>(OnBatteryStartup);
SubscribeLocalEvent<TwoModeEnergyAmmoProviderComponent, ChargeChangedEvent>(OnBatteryChargeChange);
2024-01-11 09:44:36 +03:00
SubscribeLocalEvent<TwoModeEnergyAmmoProviderComponent, DamageExamineEvent>(OnBatteryDamageExamine);
2023-04-28 02:10:32 +06:00
SubscribeLocalEvent<TwoModeEnergyAmmoProviderComponent, UseInHandEvent>(OnBatteryModeChange);
}
private void OnBatteryModeChange(EntityUid uid, TwoModeEnergyAmmoProviderComponent component, UseInHandEvent args)
{
if (!TryComp<GunComponent>(uid, out var gun))
return;
switch (component.CurrentMode)
2023-04-28 02:10:32 +06:00
{
case EnergyModes.Stun:
component.InStun = false;
component.CurrentMode = EnergyModes.Laser;
component.FireCost = component.LaserFireCost;
gun.SoundGunshot = component.LaserSound;
gun.ProjectileSpeed = component.LaserProjectileSpeed;
_audio.PlayPvs(component.ToggleSound, args.User);
break;
case EnergyModes.Laser:
component.InStun = true;
component.CurrentMode = EnergyModes.Stun;
component.FireCost = component.StunFireCost;
gun.SoundGunshot = component.StunSound;
gun.ProjectileSpeed = component.StunProjectileSpeed;
_audio.PlayPvs(component.ToggleSound, args.User);
break;
2023-04-28 02:10:32 +06:00
}
2023-04-28 02:10:32 +06:00
UpdateShots(uid, component);
UpdateTwoModeAppearance(uid, component);
UpdateBatteryAppearance(uid, component);
UpdateAmmoCount(uid);
}
private void OnBatteryStartup(EntityUid uid, BatteryAmmoProviderComponent component, ComponentStartup args)
{
UpdateShots(uid, component);
}
private void OnBatteryChargeChange(
EntityUid uid,
BatteryAmmoProviderComponent component,
ref ChargeChangedEvent args)
{
2023-04-19 22:10:08 +12:00
UpdateShots(uid, component, args.Charge, args.MaxCharge);
}
private void UpdateShots(EntityUid uid, BatteryAmmoProviderComponent component)
{
if (!TryComp<BatteryComponent>(uid, out var battery))
return;
UpdateShots(uid, component, battery.CurrentCharge, battery.MaxCharge);
}
2023-04-19 22:10:08 +12:00
private void UpdateShots(EntityUid uid, BatteryAmmoProviderComponent component, float charge, float maxCharge)
{
2023-04-19 22:10:08 +12:00
var shots = (int) (charge / component.FireCost);
var maxShots = (int) (maxCharge / component.FireCost);
if (component.Shots != shots || component.Capacity != maxShots)
{
Dirty(uid, component);
}
component.Shots = shots;
component.Capacity = maxShots;
UpdateBatteryAppearance(uid, component);
}
private void OnBatteryDamageExamine(
EntityUid uid,
BatteryAmmoProviderComponent component,
ref DamageExamineEvent args)
{
var damageSpec = GetDamage(component);
if (damageSpec == null)
return;
var damageType = component switch
{
HitscanBatteryAmmoProviderComponent => Loc.GetString("damage-hitscan"),
ProjectileBatteryAmmoProviderComponent => Loc.GetString("damage-projectile"),
TwoModeEnergyAmmoProviderComponent twoMode => Loc.GetString(twoMode.CurrentMode == EnergyModes.Stun
? "damage-projectile"
: "damage-hitscan"),
_ => throw new ArgumentOutOfRangeException()
};
2023-08-07 12:09:35 +03:00
_damageExamine.AddDamageExamine(args.Message, damageSpec, damageType);
}
private DamageSpecifier? GetDamage(BatteryAmmoProviderComponent component)
{
return component switch
{
HitscanBatteryAmmoProviderComponent hitscan =>
ProtoManager.Index<HitscanPrototype>(hitscan.Prototype).Damage,
ProjectileBatteryAmmoProviderComponent battery => GetProjectileDamage(battery.Prototype),
TwoModeEnergyAmmoProviderComponent twoMode => GetProjectileDamage(twoMode.CurrentMode == EnergyModes.Laser
? twoMode.LaserPrototype
: twoMode.StunPrototype),
_ => null
};
}
protected override void TakeCharge(EntityUid uid, BatteryAmmoProviderComponent component)
{
2023-04-19 22:10:08 +12:00
// Will raise ChargeChangedEvent
_battery.UseCharge(uid, component.FireCost);
}
}