diff --git a/Content.Server/TraitorDeathMatch/Components/TraitorDeathMatchRedemptionComponent.cs b/Content.Server/TraitorDeathMatch/Components/TraitorDeathMatchRedemptionComponent.cs index 6fad19beeb7b..9ea08c4204cb 100644 --- a/Content.Server/TraitorDeathMatch/Components/TraitorDeathMatchRedemptionComponent.cs +++ b/Content.Server/TraitorDeathMatch/Components/TraitorDeathMatchRedemptionComponent.cs @@ -1,109 +1,7 @@ -using System.Threading.Tasks; -using Content.Server.Mind.Components; -using Content.Server.Traitor.Uplink.Account; -using Content.Server.Traitor.Uplink.Components; -using Content.Shared.Interaction; -using Content.Shared.Inventory; -using Content.Shared.Popups; - namespace Content.Server.TraitorDeathMatch.Components { [RegisterComponent] - public sealed class TraitorDeathMatchRedemptionComponent : Component, IInteractUsing + public sealed class TraitorDeathMatchRedemptionComponent : Component { - [Dependency] private readonly IEntityManager _entMan = default!; - - async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) - { - if (!_entMan.TryGetComponent(eventArgs.User, out var userMindComponent)) - { - Owner.PopupMessage(eventArgs.User, Loc.GetString("traitor-death-match-redemption-component-interact-using-main-message", - ("secondMessage", Loc.GetString("traitor-death-match-redemption-component-interact-using-no-mind-message")))); - return false; - } - - var userMind = userMindComponent.Mind; - if (userMind == null) - { - Owner.PopupMessage(eventArgs.User, Loc.GetString("traitor-death-match-redemption-component-interact-using-main-message", - ("secondMessage", Loc.GetString("traitor-death-match-redemption-component-interact-using-no-user-mind-message")))); - return false; - } - - if (!_entMan.TryGetComponent(eventArgs.Using, out var victimUplink)) - { - Owner.PopupMessage(eventArgs.User, Loc.GetString("traitor-death-match-redemption-component-interact-using-main-message", - ("secondMessage", Loc.GetString("traitor-death-match-redemption-component-interact-using-no-pda-message")))); - return false; - } - - if (!_entMan.TryGetComponent(eventArgs.Using, out var victimPDAOwner)) - { - Owner.PopupMessage(eventArgs.User, Loc.GetString("traitor-death-match-redemption-component-interact-using-main-message", - ("secondMessage", Loc.GetString("traitor-death-match-redemption-component-interact-using-no-pda-owner-message")))); - return false; - } - - if (victimPDAOwner.UserId == userMind.UserId) - { - Owner.PopupMessage(eventArgs.User, Loc.GetString("traitor-death-match-redemption-component-interact-using-main-message", - ("secondMessage", Loc.GetString("traitor-death-match-redemption-component-interact-using-pda-different-user-message")))); - return false; - } - - UplinkComponent? userUplink = null; - var invSystem = EntitySystem.Get(); - - if (invSystem.TryGetSlotEntity(eventArgs.User, "id", out var pdaUid) && - _entMan.TryGetComponent(pdaUid, out var userUplinkComponent)) - { - userUplink = userUplinkComponent; - } - - if (userUplink == null) - { - Owner.PopupMessage(eventArgs.User, Loc.GetString("traitor-death-match-redemption-component-interact-using-main-message", - ("secondMessage", Loc.GetString("traitor-death-match-redemption-component-interact-using-no-pda-in-pocket-message")))); - return false; - } - - // We have finally determined both PDA components. FINALLY. - - var userAccount = userUplink.UplinkAccount; - var victimAccount = victimUplink.UplinkAccount; - - if (userAccount == null) - { - // This shouldn't even BE POSSIBLE in the actual mode this is meant for. - // Advanced Syndicate anti-tampering technology. - // Owner.PopupMessage(eventArgs.User, Loc.GetString("traitor-death-match-redemption-component-interact-using-tampering-detected")); - // if (eventArgs.User.TryGetComponent(out var userDamagable)) - // userDamagable.ChangeDamage(DamageType.Shock, 9001, true, null); - // ...So apparently, "it probably shouldn't kill people for a mistake". - // :( - // Give boring error message instead. - Owner.PopupMessage(eventArgs.User, Loc.GetString("traitor-death-match-redemption-component-interact-using-main-message", - ("secondMessage", Loc.GetString("traitor-death-match-redemption-component-interact-using-user-no-uplink-account-message")))); - return false; - } - - if (victimAccount == null) - { - Owner.PopupMessage(eventArgs.User, Loc.GetString("traitor-death-match-redemption-component-interact-using-main-message", - ("secondMessage", Loc.GetString("traitor-death-match-redemption-component-interact-using-victim-no-uplink-account-message")))); - return false; - } - - // 4 is the per-PDA bonus amount. - var accounts = _entMan.EntitySysManager.GetEntitySystem(); - var transferAmount = victimAccount.Balance + 4; - accounts.SetBalance(victimAccount, 0); - accounts.AddToBalance(userAccount, transferAmount); - - _entMan.DeleteEntity(victimUplink.Owner); - - Owner.PopupMessage(eventArgs.User, Loc.GetString("traitor-death-match-redemption-component-interact-using-success-message", ("tcAmount", transferAmount))); - return true; - } } } diff --git a/Content.Server/TraitorDeathMatch/TraitorDeathMatchRedemptionSystem.cs b/Content.Server/TraitorDeathMatch/TraitorDeathMatchRedemptionSystem.cs new file mode 100644 index 000000000000..3eb791259072 --- /dev/null +++ b/Content.Server/TraitorDeathMatch/TraitorDeathMatchRedemptionSystem.cs @@ -0,0 +1,128 @@ +using Content.Server.Mind.Components; +using Content.Server.Traitor.Uplink.Account; +using Content.Server.Traitor.Uplink.Components; +using Content.Server.TraitorDeathMatch.Components; +using Content.Shared.Interaction; +using Content.Shared.Inventory; +using Content.Shared.Popups; +using Robust.Shared.Player; + +namespace Content.Server.TraitorDeathMatch; + +public sealed class TraitorDeathMatchRedemptionSystem : EntitySystem +{ + [Dependency] private readonly InventorySystem _inventory = default!; + [Dependency] private readonly UplinkAccountsSystem _uplink = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnInteractUsing); + } + + private void OnInteractUsing(EntityUid uid, TraitorDeathMatchRedemptionComponent component, InteractUsingEvent args) + { + if (!EntityManager.TryGetComponent(args.User, out var userMindComponent)) + { + _popup.PopupEntity(Loc.GetString( + "traitor-death-match-redemption-component-interact-using-main-message", + ("secondMessage", + Loc.GetString("traitor-death-match-redemption-component-interact-using-no-mind-message"))), uid, Filter.Entities(args.User)); + return; + } + + var userMind = userMindComponent.Mind; + if (userMind == null) + { + _popup.PopupEntity(Loc.GetString( + "traitor-death-match-redemption-component-interact-using-main-message", + ("secondMessage", + Loc.GetString("traitor-death-match-redemption-component-interact-using-no-user-mind-message"))), uid, Filter.Entities(args.User)); + return; + } + + if (!EntityManager.TryGetComponent(args.Used, out var victimUplink)) + { + _popup.PopupEntity(Loc.GetString( + "traitor-death-match-redemption-component-interact-using-main-message", + ("secondMessage", + Loc.GetString("traitor-death-match-redemption-component-interact-using-no-pda-message"))), uid, Filter.Entities(args.User)); + return; + } + + if (!EntityManager.TryGetComponent(args.Used, + out var victimPDAuid)) + { + _popup.PopupEntity(Loc.GetString( + "traitor-death-match-redemption-component-interact-using-main-message", + ("secondMessage", + Loc.GetString("traitor-death-match-redemption-component-interact-using-no-pda-owner-message"))), uid, Filter.Entities(args.User)); + return; + } + + if (victimPDAuid.UserId == userMind.UserId) + { + _popup.PopupEntity(Loc.GetString( + "traitor-death-match-redemption-component-interact-using-main-message", + ("secondMessage", + Loc.GetString( + "traitor-death-match-redemption-component-interact-using-pda-different-user-message"))), uid, Filter.Entities(args.User)); + return; + } + + UplinkComponent? userUplink = null; + + if (_inventory.TryGetSlotEntity(args.User, "id", out var pdaUid) && + EntityManager.TryGetComponent(pdaUid, out var userUplinkComponent)) + userUplink = userUplinkComponent; + + if (userUplink == null) + { + _popup.PopupEntity(Loc.GetString( + "traitor-death-match-redemption-component-interact-using-main-message", + ("secondMessage", + Loc.GetString( + "traitor-death-match-redemption-component-interact-using-no-pda-in-pocket-message"))), uid, Filter.Entities(args.User)); + return; + } + + // We have finally determined both PDA components. FINALLY. + + var userAccount = userUplink.UplinkAccount; + var victimAccount = victimUplink.UplinkAccount; + + if (userAccount == null) + { + _popup.PopupEntity(Loc.GetString( + "traitor-death-match-redemption-component-interact-using-main-message", + ("secondMessage", + Loc.GetString( + "traitor-death-match-redemption-component-interact-using-user-no-uplink-account-message"))), uid, Filter.Entities(args.User)); + return; + } + + if (victimAccount == null) + { + _popup.PopupEntity(Loc.GetString( + "traitor-death-match-redemption-component-interact-using-main-message", + ("secondMessage", + Loc.GetString( + "traitor-death-match-redemption-component-interact-using-victim-no-uplink-account-message"))), uid, Filter.Entities(args.User)); + return; + } + + // 4 is the per-PDA bonus amount. + var transferAmount = victimAccount.Balance + 4; + _uplink.SetBalance(victimAccount, 0); + _uplink.AddToBalance(userAccount, transferAmount); + + EntityManager.DeleteEntity(victimUplink.Owner); + + _popup.PopupEntity(Loc.GetString("traitor-death-match-redemption-component-interact-using-success-message", + ("tcAmount", transferAmount)), uid, Filter.Entities(args.User)); + + args.Handled = true; + } +}