using Content.Shared.Interaction.Events; using Content.Shared.Popups; using Content.Shared._Goobstation.Bingle; using Robust.Shared.Map; using System.Numerics; using Content.Shared.Overlays.Switchable; using Content.Server.Flash.Components; using Content.Server.Polymorph.Components; using Content.Server.Polymorph.Systems; using Content.Shared.CombatMode; using Robust.Server.GameObjects; namespace Content.Server._Goobstation.Bingle; public sealed class BingleSystem : EntitySystem { [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly PolymorphSystem _polymorph = default!; [Dependency] private readonly AppearanceSystem _appearance = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(OnAttackAttempt); SubscribeLocalEvent(OnNightvision); SubscribeLocalEvent(OnCombatToggle); } private void OnMapInit(EntityUid uid, BingleComponent component, MapInitEvent args) { var cords = Transform(uid).Coordinates; if (!cords.IsValid(EntityManager) || cords.Position == Vector2.Zero) return; if (MapId.Nullspace == Transform(uid).MapID) return; if (component.Prime) component.MyPit = Spawn("BinglePit", cords); else { var query = EntityQueryEnumerator(); while (query.MoveNext(out var queryUid, out var _)) if (cords == Transform(queryUid).Coordinates) component.MyPit = queryUid; } } //ran by the pit to upgrade bingle damage public void UpgradeBingle(EntityUid uid, BingleComponent component) { if (component.Upgraded) return; var polyComp = EnsureComp(uid); _polymorph.CreatePolymorphAction("BinglePolymorph",(uid, polyComp )); _popup.PopupEntity(Loc.GetString("bingle-upgrade-success"), uid, uid); component.Upgraded = true; } private void OnAttackAttempt(EntityUid uid, BingleComponent component, AttackAttemptEvent args) { //Prevent Friendly Bingle fire if (HasComp(args.Target) || HasComp(args.Target)) args.Cancel(); } private void OnNightvision(EntityUid uid, BingleComponent component, ToggleNightVisionEvent args) { if (!TryComp(uid, out var flashComp)) return; flashComp.Enabled = !flashComp.Enabled; } private void OnCombatToggle(EntityUid uid, BingleComponent component, ToggleCombatActionEvent args) { if (!TryComp(uid, out var combat)) return; _appearance.SetData(uid, BingleVisual.Combat, combat.IsInCombatMode); } }