Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Traitor deathmatch ecs #9714

Merged
merged 1 commit into from
Jul 14, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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<bool> IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs)
{
if (!_entMan.TryGetComponent<MindComponent?>(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<UplinkComponent?>(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<TraitorDeathMatchReliableOwnerTagComponent?>(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<InventorySystem>();

if (invSystem.TryGetSlotEntity(eventArgs.User, "id", out var pdaUid) &&
_entMan.TryGetComponent<UplinkComponent>(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<DamagableComponent>(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<UplinkAccountsSystem>();
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;
}
}
}
128 changes: 128 additions & 0 deletions Content.Server/TraitorDeathMatch/TraitorDeathMatchRedemptionSystem.cs
Original file line number Diff line number Diff line change
@@ -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<TraitorDeathMatchRedemptionComponent, InteractUsingEvent>(OnInteractUsing);
}

private void OnInteractUsing(EntityUid uid, TraitorDeathMatchRedemptionComponent component, InteractUsingEvent args)
{
if (!EntityManager.TryGetComponent<MindComponent>(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<UplinkComponent>(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<TraitorDeathMatchReliableOwnerTagComponent>(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<UplinkComponent>(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;
}
}