[Fix] move ninja objectives into NinjaRole (#15490)

Co-authored-by: deltanedas <@deltanedas:kde.org>
This commit is contained in:
deltanedas
2023-04-17 22:32:05 +00:00
committed by GitHub
parent 60559ad1c1
commit 251f429fb3
15 changed files with 276 additions and 241 deletions

View File

@@ -8,7 +8,6 @@ namespace Content.Shared.Ninja.Components;
/// Component placed on a mob to make it a space ninja, able to use suit and glove powers.
/// Contains ids of all ninja equipment.
/// </summary>
// TODO: Contains objective related stuff, might want to move it out somehow
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
[Access(typeof(SharedNinjaSystem))]
public sealed partial class NinjaComponent : Component
@@ -16,6 +15,7 @@ public sealed partial class NinjaComponent : Component
/// <summary>
/// Grid entity of the station the ninja was spawned around. Set if spawned naturally by the event.
/// </summary>
[ViewVariables, AutoNetworkedField]
public EntityUid? StationGrid;
/// <summary>
@@ -35,35 +35,4 @@ public sealed partial class NinjaComponent : Component
/// </summary>
[ViewVariables]
public EntityUid? Katana = null;
/// <summary>
/// Number of doors that have been doorjacked, used for objective
/// </summary>
[ViewVariables, AutoNetworkedField]
public int DoorsJacked = 0;
/// <summary>
/// Research nodes that have been downloaded, used for objective
/// </summary>
// TODO: client doesn't need to know what nodes are downloaded, just how many
[ViewVariables, AutoNetworkedField]
public HashSet<string> DownloadedNodes = new();
/// <summary>
/// Warp point that the spider charge has to target
/// </summary>
[ViewVariables, AutoNetworkedField]
public EntityUid? SpiderChargeTarget = null;
/// <summary>
/// Whether the spider charge has been detonated on the target, used for objective
/// </summary>
[ViewVariables, AutoNetworkedField]
public bool SpiderChargeDetonated;
/// <summary>
/// Whether the comms console has been hacked, used for objective
/// </summary>
[ViewVariables, AutoNetworkedField]
public bool CalledInThreat;
}

View File

@@ -36,7 +36,7 @@ public abstract class SharedNinjaGlovesSystem : EntitySystem
[Dependency] private readonly SharedInteractionSystem _interaction = default!;
[Dependency] private readonly INetManager _net = default!;
[Dependency] private readonly SharedNinjaSystem _ninja = default!;
[Dependency] private readonly SharedPopupSystem _popups = default!;
[Dependency] protected readonly SharedPopupSystem Popups = default!;
[Dependency] private readonly TagSystem _tags = default!;
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly UseDelaySystem _useDelay = default!;
@@ -72,7 +72,7 @@ public abstract class SharedNinjaGlovesSystem : EntitySystem
if (comp.User != null)
{
comp.User = null;
_popups.PopupEntity(Loc.GetString("ninja-gloves-off"), user, user);
Popups.PopupEntity(Loc.GetString("ninja-gloves-off"), user, user);
}
}
@@ -191,7 +191,7 @@ public abstract class SharedNinjaGlovesSystem : EntitySystem
// take charge from battery
if (!_ninja.TryUseCharge(user, comp.StunCharge))
{
_popups.PopupEntity(Loc.GetString("ninja-no-power"), user, user);
Popups.PopupEntity(Loc.GetString("ninja-no-power"), user, user);
return;
}
@@ -239,76 +239,18 @@ public abstract class SharedNinjaGlovesSystem : EntitySystem
args.Cancel();
}
private void OnDownloadDoAfter(EntityUid uid, NinjaDownloadComponent comp, DownloadDoAfterEvent args)
{
if (args.Cancelled || args.Handled)
return;
// can't predict roles so only done on server.
protected virtual void OnDownloadDoAfter(EntityUid uid, NinjaDownloadComponent comp, DownloadDoAfterEvent args) { }
var user = args.User;
var target = args.Target;
// cant predict roles for checking if already called
protected virtual void OnTerror(EntityUid uid, NinjaTerrorComponent comp, InteractionAttemptEvent args) { }
if (!TryComp<NinjaComponent>(user, out var ninja)
|| !TryComp<TechnologyDatabaseComponent>(target, out var database))
return;
var gained = _ninja.Download(ninja, database.TechnologyIds);
var str = gained == 0
? Loc.GetString("ninja-download-fail")
: Loc.GetString("ninja-download-success", ("count", gained), ("server", target));
_popups.PopupEntity(str, user, user, PopupType.Medium);
}
private void OnTerror(EntityUid uid, NinjaTerrorComponent comp, InteractionAttemptEvent args)
{
if (!GloveCheck(uid, args, out var gloves, out var user, out var target)
|| !TryComp<NinjaComponent>(user, out var ninja))
return;
if (!IsCommsConsole(target))
return;
// can only do it once
if (ninja.CalledInThreat)
{
_popups.PopupEntity(Loc.GetString("ninja-terror-already-called"), user, user);
return;
}
var doAfterArgs = new DoAfterArgs(user, comp.TerrorTime, new TerrorDoAfterEvent(), target: target, used: uid, eventTarget: uid)
{
BreakOnDamage = true,
BreakOnUserMove = true,
MovementThreshold = 0.5f,
CancelDuplicate = false
};
_doAfter.TryStartDoAfter(doAfterArgs);
// FIXME: doesnt work, don't show the console popup
args.Cancel();
}
//for some reason shared comms console component isn't a component, so this has to be done server-side
protected virtual bool IsCommsConsole(EntityUid uid)
{
return false;
}
private void OnTerrorDoAfter(EntityUid uid, NinjaTerrorComponent comp, TerrorDoAfterEvent args)
{
if (args.Cancelled || args.Handled)
return;
var user = args.User;
if (!TryComp<NinjaComponent>(user, out var ninja) || ninja.CalledInThreat)
return;
_ninja.CallInThreat(ninja);
}
// can't predict roles or anything announcements related so only done on server.
protected virtual void OnTerrorDoAfter(EntityUid uid, NinjaTerrorComponent comp, TerrorDoAfterEvent args) { }
private void ClientPopup(string msg, EntityUid user, PopupType type = PopupType.Small)
{
if (_net.IsClient)
_popups.PopupEntity(msg, user, user, type);
Popups.PopupEntity(msg, user, user, type);
}
}

View File

@@ -48,21 +48,6 @@ public abstract class SharedNinjaSystem : EntitySystem
comp.Katana = katana;
}
// TODO: remove when objective stuff moved into objectives somehow
public void DetonateSpiderCharge(NinjaComponent comp)
{
comp.SpiderChargeDetonated = true;
}
/// <summary>
/// Marks the objective as complete.
/// On server, makes announcement and adds rule of random threat.
/// </summary>
public virtual void CallInThreat(NinjaComponent comp)
{
comp.CalledInThreat = true;
}
/// <summary>
/// Drain power from a target battery into the ninja's suit battery.
/// Serverside only.
@@ -71,17 +56,6 @@ public abstract class SharedNinjaSystem : EntitySystem
{
}
/// <summary>
/// Download the given set of nodes, returning how many new nodes were downloaded.'
/// </summary>
public int Download(NinjaComponent ninja, List<string> ids)
{
var oldCount = ninja.DownloadedNodes.Count;
ninja.DownloadedNodes.UnionWith(ids);
var newCount = ninja.DownloadedNodes.Count;
return newCount - oldCount;
}
/// <summary>
/// Gets the user's battery and tries to use some charge from it, returning true if successful.
/// Serverside only.