using Content.Shared.Damage; using Content.Shared.Damage.Events; using Content.Shared.Examine; using Content.Shared.FixedPoint; using Content.Shared.Projectiles; using Content.Shared.Weapons.Ranged; using Content.Shared.Weapons.Ranged.Components; using Robust.Shared.Prototypes; namespace Content.Server.Weapons.Ranged.Systems; public sealed partial class GunSystem { protected override void InitializeCartridge() { base.InitializeCartridge(); SubscribeLocalEvent(OnCartridgeExamine); SubscribeLocalEvent(OnCartridgeDamageExamine); SubscribeLocalEvent(OnHitScanCartridgeExamine); SubscribeLocalEvent(OnHitScanCartridgeDamageExamine); } private void OnHitScanCartridgeDamageExamine(EntityUid uid, HitScanCartridgeAmmoComponent component, ref DamageExamineEvent args) { var damageSpec = GetHitscanDamage(component.Prototype); if (damageSpec == null) return; var shotCount = 1; var shootModifier = ShootModifier.None; var hitScanPrototype = _proto.Index(component.Prototype); if (hitScanPrototype.ShootModifier == ShootModifier.Split) { shotCount = hitScanPrototype.SplitCount; shootModifier = ShootModifier.Split; } else if (hitScanPrototype.ShootModifier == ShootModifier.Spread) { shotCount = hitScanPrototype.SpreadCount; shootModifier = ShootModifier.Spread; } _damageExamine.AddDamageExamineWithModifier(args.Message, damageSpec, shotCount, shootModifier, Loc.GetString("damage-hitscan")); } private DamageSpecifier? GetHitscanDamage(string proto) { if (!ProtoManager.TryIndex(proto, out var hitscanProto)) return null; return hitscanProto.Damage ?? null; } private void OnHitScanCartridgeExamine(EntityUid uid, HitScanCartridgeAmmoComponent component, ExaminedEvent args) { if (component.Spent) { args.PushMarkup(Loc.GetString("gun-cartridge-spent")); } else { args.PushMarkup(Loc.GetString("gun-cartridge-unspent")); } } private void OnCartridgeDamageExamine(EntityUid uid, CartridgeAmmoComponent component, ref DamageExamineEvent args) { var damageSpec = GetProjectileDamage(component.Prototype); if (damageSpec == null) return; var shotCount = 1; var shootModifier = ShootModifier.None; var prototype = _proto.Index(component.Prototype); if (prototype.TryGetComponent(out var ammoSpreadComp, _componentFactory)) { shotCount = ammoSpreadComp.Count; shootModifier = ShootModifier.Spread; } _damageExamine.AddDamageExamineWithModifier(args.Message, Damageable.ApplyUniversalAllModifiers(damageSpec), shotCount, shootModifier, Loc.GetString("damage-projectile")); } private DamageSpecifier? GetProjectileDamage(string proto) { if (!ProtoManager.TryIndex(proto, out var entityProto)) return null; if (entityProto.Components .TryGetValue(Factory.GetComponentName(), out var projectile)) { var p = (ProjectileComponent) projectile.Component; if (!p.Damage.Empty) { return p.Damage * Damageable.UniversalProjectileDamageModifier; } } return null; } private void OnCartridgeExamine(EntityUid uid, CartridgeAmmoComponent component, ExaminedEvent args) { if (component.Spent) { args.PushMarkup(Loc.GetString("gun-cartridge-spent")); } else { args.PushMarkup(Loc.GetString("gun-cartridge-unspent")); } } }