Антаг без ПДА - фикс от визденов (с костылями) (#788)
* Апстрима будет * Also this
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
using Content.Server.Traitor.Systems;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Server.Traitor.Components;
|
||||
|
||||
@@ -9,14 +10,8 @@ namespace Content.Server.Traitor.Components;
|
||||
public sealed partial class AutoTraitorComponent : Component
|
||||
{
|
||||
/// <summary>
|
||||
/// Whether to give the traitor an uplink or not.
|
||||
/// The traitor profile to use
|
||||
/// </summary>
|
||||
[DataField("giveUplink"), ViewVariables(VVAccess.ReadWrite)]
|
||||
public bool GiveUplink = true;
|
||||
|
||||
/// <summary>
|
||||
/// Whether to give the traitor objectives or not.
|
||||
/// </summary>
|
||||
[DataField("giveObjectives"), ViewVariables(VVAccess.ReadWrite)]
|
||||
public bool GiveObjectives = true;
|
||||
[DataField]
|
||||
public EntProtoId Profile = "Traitor"; // WD EDIT AHEAD OF WIZDEN UPSTREAM
|
||||
}
|
||||
|
||||
@@ -12,9 +12,6 @@ public sealed class AutoTraitorSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly AntagSelectionSystem _antag = default!;
|
||||
|
||||
[ValidatePrototypeId<EntityPrototype>]
|
||||
private const string DefaultTraitorRule = "Traitor";
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
@@ -24,6 +21,6 @@ public sealed class AutoTraitorSystem : EntitySystem
|
||||
|
||||
private void OnMindAdded(EntityUid uid, AutoTraitorComponent comp, MindAddedMessage args)
|
||||
{
|
||||
_antag.ForceMakeAntag<AutoTraitorComponent>(args.Mind.Comp.Session, DefaultTraitorRule);
|
||||
_antag.ForceMakeAntag<AutoTraitorComponent>(args.Mind.Comp.Session, comp.Profile); // WD EDIT AHEAD OF WIZDEN UPSTREAM
|
||||
}
|
||||
}
|
||||
|
||||
7
Content.Server/Traitor/Uplink/UplinkComponent.cs
Normal file
7
Content.Server/Traitor/Uplink/UplinkComponent.cs
Normal file
@@ -0,0 +1,7 @@
|
||||
namespace Content.Server.Traitor.Uplink;
|
||||
|
||||
/// <summary>
|
||||
/// This is used for identifying something as a hidden uplink and showing the UI.
|
||||
/// </summary>
|
||||
[RegisterComponent]
|
||||
public sealed partial class UplinkComponent : Component;
|
||||
@@ -1,94 +1,130 @@
|
||||
using Content.Server.Store.Systems;
|
||||
using Content.Shared.FixedPoint;
|
||||
using Content.Shared.Hands.EntitySystems;
|
||||
using Content.Shared.Implants;
|
||||
using Content.Shared.Inventory;
|
||||
using Content.Shared.PDA;
|
||||
using Content.Server.Store.Components;
|
||||
using Content.Shared.FixedPoint;
|
||||
using Content.Shared.Store;
|
||||
using Content.Server.Store.Components;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Server.Traitor.Uplink
|
||||
namespace Content.Server.Traitor.Uplink;
|
||||
|
||||
public sealed class UplinkSystem : EntitySystem // WD EDIT AHEAD OF WIZDEN UPSTREAM
|
||||
{
|
||||
public sealed class UplinkSystem : EntitySystem
|
||||
[Dependency] private readonly InventorySystem _inventorySystem = default!;
|
||||
[Dependency] private readonly SharedHandsSystem _handsSystem = default!;
|
||||
[Dependency] private readonly IPrototypeManager _proto = default!;
|
||||
[Dependency] private readonly StoreSystem _store = default!;
|
||||
[Dependency] private readonly SharedSubdermalImplantSystem _subdermalImplant = default!;
|
||||
|
||||
[ValidatePrototypeId<CurrencyPrototype>]
|
||||
public const string TelecrystalCurrencyPrototype = "Telecrystal";
|
||||
private const string FallbackUplinkImplant = "UplinkImplant";
|
||||
private const string FallbackUplinkCatalog = "UplinkUplinkImplanter";
|
||||
|
||||
/// <summary>
|
||||
/// Adds an uplink to the target
|
||||
/// </summary>
|
||||
/// <param name="user">The person who is getting the uplink</param>
|
||||
/// <param name="balance">The amount of currency on the uplink. If null, will just use the amount specified in the preset.</param>
|
||||
/// <param name="uplinkEntity">The entity that will actually have the uplink functionality. Defaults to the PDA if null.</param>
|
||||
/// <param name="giveDiscounts">Marker that enables discounts for uplink items.</param>
|
||||
/// <returns>Whether or not the uplink was added successfully</returns>
|
||||
public bool AddUplink(
|
||||
EntityUid user,
|
||||
FixedPoint2 balance,
|
||||
EntityUid? uplinkEntity = null,
|
||||
bool giveDiscounts = false)
|
||||
{
|
||||
[Dependency] private readonly InventorySystem _inventorySystem = default!;
|
||||
[Dependency] private readonly SharedHandsSystem _handsSystem = default!;
|
||||
[Dependency] private readonly StoreSystem _store = default!;
|
||||
// Try to find target item if none passed
|
||||
uplinkEntity ??= FindUplinkTarget(user);
|
||||
if (uplinkEntity == null)
|
||||
return ImplantUplink(user, balance, giveDiscounts);
|
||||
|
||||
[ValidatePrototypeId<CurrencyPrototype>]
|
||||
public const string TelecrystalCurrencyPrototype = "Telecrystal";
|
||||
EnsureComp<UplinkComponent>(uplinkEntity.Value);
|
||||
|
||||
/// <summary>
|
||||
/// Gets the amount of TC on an "uplink"
|
||||
/// Mostly just here for legacy systems based on uplink.
|
||||
/// </summary>
|
||||
/// <param name="component"></param>
|
||||
/// <returns>the amount of TC</returns>
|
||||
public int GetTCBalance(StoreComponent component)
|
||||
SetUplink(user, uplinkEntity.Value, balance, giveDiscounts);
|
||||
|
||||
// TODO add BUI. Currently can't be done outside of yaml -_-
|
||||
// ^ What does this even mean?
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Configure TC for the uplink
|
||||
/// </summary>
|
||||
private void SetUplink(EntityUid user, EntityUid uplink, FixedPoint2 balance, bool giveDiscounts)
|
||||
{
|
||||
var store = EnsureComp<StoreComponent>(uplink);
|
||||
store.AccountOwner = user;
|
||||
_store.InitializeFromPreset("StorePresetUplink", uplink, store); // WD
|
||||
store.Balance.Clear();
|
||||
_store.TryAddCurrency(new Dictionary<string, FixedPoint2> { { TelecrystalCurrencyPrototype, balance } },
|
||||
uplink,
|
||||
store);
|
||||
// WD REMOVED UNTIL PROPER UPSTREAM
|
||||
// var uplinkInitializedEvent = new StoreInitializedEvent(
|
||||
// TargetUser: user,
|
||||
// Store: uplink,
|
||||
// UseDiscounts: giveDiscounts,
|
||||
// Listings: _store.GetAvailableListings(user, uplink, store)
|
||||
// .ToArray());
|
||||
// RaiseLocalEvent(ref uplinkInitializedEvent);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Implant an uplink as a fallback measure if the traitor had no PDA
|
||||
/// </summary>
|
||||
private bool ImplantUplink(EntityUid user, FixedPoint2 balance, bool giveDiscounts)
|
||||
{
|
||||
var implantProto = new string(FallbackUplinkImplant);
|
||||
|
||||
if (!_proto.TryIndex<ListingPrototype>(FallbackUplinkCatalog, out var catalog))
|
||||
return false;
|
||||
|
||||
if (!catalog.Cost.TryGetValue(TelecrystalCurrencyPrototype, out var cost))
|
||||
return false;
|
||||
|
||||
if (balance < cost) // Can't use Math functions on FixedPoint2
|
||||
balance = 0;
|
||||
else
|
||||
balance = balance - cost;
|
||||
|
||||
var implant = _subdermalImplant.AddImplant(user, implantProto);
|
||||
|
||||
if (!HasComp<StoreComponent>(implant))
|
||||
return false;
|
||||
|
||||
SetUplink(user, implant.Value, balance, giveDiscounts);
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Finds the entity that can hold an uplink for a user.
|
||||
/// Usually this is a pda in their pda slot, but can also be in their hands. (but not pockets or inside bag, etc.)
|
||||
/// </summary>
|
||||
public EntityUid? FindUplinkTarget(EntityUid user)
|
||||
{
|
||||
// Try to find PDA in inventory
|
||||
if (_inventorySystem.TryGetContainerSlotEnumerator(user, out var containerSlotEnumerator))
|
||||
{
|
||||
FixedPoint2? tcBalance = component.Balance.GetValueOrDefault(TelecrystalCurrencyPrototype);
|
||||
return tcBalance?.Int() ?? 0;
|
||||
while (containerSlotEnumerator.MoveNext(out var pdaUid))
|
||||
{
|
||||
if (!pdaUid.ContainedEntity.HasValue)
|
||||
continue;
|
||||
if (HasComp<PdaComponent>(pdaUid.ContainedEntity.Value) || HasComp<StoreComponent>(pdaUid.ContainedEntity.Value))
|
||||
return pdaUid.ContainedEntity.Value;
|
||||
}
|
||||
}
|
||||
// Also check hands
|
||||
foreach (var item in _handsSystem.EnumerateHeld(user))
|
||||
{
|
||||
if (HasComp<PdaComponent>(item) || HasComp<StoreComponent>(item))
|
||||
return item;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds an uplink to the target
|
||||
/// </summary>
|
||||
/// <param name="user">The person who is getting the uplink</param>
|
||||
/// <param name="balance">The amount of currency on the uplink. If null, will just use the amount specified in the preset.</param>
|
||||
/// <param name="uplinkPresetId">The id of the storepreset</param>
|
||||
/// <param name="uplinkEntity">The entity that will actually have the uplink functionality. Defaults to the PDA if null.</param>
|
||||
/// <returns>Whether or not the uplink was added successfully</returns>
|
||||
public bool AddUplink(EntityUid user, FixedPoint2? balance, string uplinkPresetId = "StorePresetUplink", EntityUid? uplinkEntity = null)
|
||||
{
|
||||
// Try to find target item
|
||||
if (uplinkEntity == null)
|
||||
{
|
||||
uplinkEntity = FindUplinkTarget(user);
|
||||
if (uplinkEntity == null)
|
||||
return false;
|
||||
}
|
||||
|
||||
var store = EnsureComp<StoreComponent>(uplinkEntity.Value);
|
||||
_store.InitializeFromPreset(uplinkPresetId, uplinkEntity.Value, store);
|
||||
store.AccountOwner = user;
|
||||
store.Balance.Clear();
|
||||
|
||||
if (balance != null)
|
||||
{
|
||||
store.Balance.Clear();
|
||||
_store.TryAddCurrency(new Dictionary<string, FixedPoint2> { { TelecrystalCurrencyPrototype, balance.Value } }, uplinkEntity.Value, store);
|
||||
}
|
||||
|
||||
// TODO add BUI. Currently can't be done outside of yaml -_-
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Finds the entity that can hold an uplink for a user.
|
||||
/// Usually this is a pda in their pda slot, but can also be in their hands. (but not pockets or inside bag, etc.)
|
||||
/// </summary>
|
||||
public EntityUid? FindUplinkTarget(EntityUid user)
|
||||
{
|
||||
// Try to find PDA in inventory
|
||||
if (_inventorySystem.TryGetContainerSlotEnumerator(user, out var containerSlotEnumerator))
|
||||
{
|
||||
while (containerSlotEnumerator.MoveNext(out var pdaUid))
|
||||
{
|
||||
if (!pdaUid.ContainedEntity.HasValue) continue;
|
||||
|
||||
if (HasComp<PdaComponent>(pdaUid.ContainedEntity.Value) || HasComp<StoreComponent>(pdaUid.ContainedEntity.Value))
|
||||
return pdaUid.ContainedEntity.Value;
|
||||
}
|
||||
}
|
||||
|
||||
// Also check hands
|
||||
foreach (var item in _handsSystem.EnumerateHeld(user))
|
||||
{
|
||||
if (HasComp<PdaComponent>(item) || HasComp<StoreComponent>(item))
|
||||
return item;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user