}
/// <summary>
-/// Event raised on a player's entity after its simple antag rule is started and objectives get added.
+/// Event raised on a player's entity after its simple antag rule is started.
/// Use this to add a briefing, roles, etc.
/// </summary>
[ByRefEvent]
using Content.Server.Research.Systems;
using Content.Server.Roles;
using Content.Server.GenericAntag;
-using Content.Server.Warps;
using Content.Shared.Alert;
using Content.Shared.Clothing.EntitySystems;
using Content.Shared.Doors.Components;
using Content.Shared.Ninja.Systems;
using Content.Shared.Popups;
using Content.Shared.Rounding;
-using Robust.Shared.Random;
+using Robust.Shared.Audio;
+using Robust.Shared.Player;
using System.Diagnostics.CodeAnalysis;
using Content.Server.Objectives.Components;
+using Robust.Shared.Audio.Systems;
namespace Content.Server.Ninja.Systems;
[Dependency] private readonly AlertsSystem _alerts = default!;
[Dependency] private readonly BatterySystem _battery = default!;
[Dependency] private readonly IChatManager _chatMan = default!;
- [Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly PowerCellSystem _powerCell = default!;
[Dependency] private readonly RoleSystem _role = default!;
+ [Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly SharedMindSystem _mind = default!;
[Dependency] private readonly StealthClothingSystem _stealthClothing = default!;
_role.MindAddRole(mindId, role, mind);
_role.MindPlaySound(mindId, config.GreetingSound, mind);
- // choose spider charge detonation point
- var warps = new List<EntityUid>();
- var query = EntityQueryEnumerator<BombingTargetComponent, WarpPointComponent>();
- while (query.MoveNext(out var warpUid, out _, out var warp))
- {
- warps.Add(warpUid);
- }
-
- if (warps.Count > 0)
- role.SpiderChargeTarget = _random.Pick(warps);
-
- _chatMan.DispatchServerMessage(mind.Session, Loc.GetString("ninja-role-greeting"));
+ var session = mind.Session;
+ _audio.PlayGlobal(config.GreetingSound, Filter.Empty().AddPlayer(session), false, AudioParams.Default);
+ _chatMan.DispatchServerMessage(session, Loc.GetString("ninja-role-greeting"));
}
// TODO: PowerCellDraw, modify when cloak enabled
using Content.Server.Explosion.EntitySystems;
+using Content.Server.GameTicking.Rules.Components;
using Content.Server.Mind;
using Content.Server.Objectives.Components;
using Content.Server.Popups;
var user = args.User;
- if (!_mind.TryGetRole<NinjaRoleComponent>(user, out var role))
+ if (!_mind.TryGetRole<NinjaRoleComponent>(user, out var _))
{
_popup.PopupEntity(Loc.GetString("spider-charge-not-ninja"), user, user);
args.Cancelled = true;
}
// allow planting anywhere if there is no target, which should never happen
- if (role.SpiderChargeTarget == null)
+ if (!_mind.TryGetObjectiveComp<SpiderChargeConditionComponent>(user, out var obj) || obj.Target == null)
return;
// assumes warp point still exists
- var targetXform = Transform(role.SpiderChargeTarget.Value);
+ var targetXform = Transform(obj.Target.Value);
var locXform = Transform(args.Target);
if (locXform.MapID != targetXform.MapID ||
(_transform.GetWorldPosition(locXform) - _transform.GetWorldPosition(targetXform)).LengthSquared() > comp.Range * comp.Range)
return;
// assumes the target was destroyed, that the charge wasn't moved somehow
- obj.SpiderChargeDetonated = true;
+ obj.Detonated = true;
}
}
/// <summary>
/// Requires that the player is a ninja and blew up their spider charge at its target location.
/// </summary>
-[RegisterComponent, Access(typeof(NinjaConditionsSystem), typeof(SpiderChargeSystem))]
+[RegisterComponent, Access(typeof(NinjaConditionsSystem), typeof(SpiderChargeSystem), typeof(SpaceNinjaSystem))]
public sealed partial class SpiderChargeConditionComponent : Component
{
- [DataField("spiderChargeDetonated"), ViewVariables(VVAccess.ReadWrite)]
- public bool SpiderChargeDetonated;
+ [DataField, ViewVariables(VVAccess.ReadWrite)]
+ public bool Detonated;
+
+ /// <summary>
+ /// Warp point that the spider charge has to target
+ /// </summary>
+ [DataField, ViewVariables(VVAccess.ReadWrite)]
+ public EntityUid? Target;
}
+++ /dev/null
-using Content.Server.Objectives.Systems;
-
-namespace Content.Server.Objectives.Components;
-
-/// <summary>
-/// Requires the player to be a ninja that has a spider charge target assigned, which is almost always the case.
-/// </summary>
-[RegisterComponent, Access(typeof(SpiderChargeTargetRequirementSystem))]
-public sealed partial class SpiderChargeTargetRequirementComponent : Component
-{
-}
-using Content.Server.Roles;
using Content.Server.Objectives.Components;
using Content.Server.Warps;
using Content.Shared.Objectives.Components;
+using Content.Shared.Mind;
+using Content.Shared.Ninja.Components;
+using Robust.Shared.Random;
+using Content.Server.Roles;
namespace Content.Server.Objectives.Systems;
{
[Dependency] private readonly MetaDataSystem _metaData = default!;
[Dependency] private readonly NumberObjectiveSystem _number = default!;
+ [Dependency] private readonly SharedMindSystem _mind = default!;
+ [Dependency] private readonly IRobustRandom _random = default!;
public override void Initialize()
{
SubscribeLocalEvent<DoorjackConditionComponent, ObjectiveGetProgressEvent>(OnDoorjackGetProgress);
+ SubscribeLocalEvent<SpiderChargeConditionComponent, RequirementCheckEvent>(OnSpiderChargeRequirementCheck);
SubscribeLocalEvent<SpiderChargeConditionComponent, ObjectiveAfterAssignEvent>(OnSpiderChargeAfterAssign);
SubscribeLocalEvent<SpiderChargeConditionComponent, ObjectiveGetProgressEvent>(OnSpiderChargeGetProgress);
}
// spider charge
-
- private void OnSpiderChargeAfterAssign(EntityUid uid, SpiderChargeConditionComponent comp, ref ObjectiveAfterAssignEvent args)
+ private void OnSpiderChargeRequirementCheck(EntityUid uid, SpiderChargeConditionComponent comp, ref RequirementCheckEvent args)
{
- _metaData.SetEntityName(uid, SpiderChargeTitle(args.MindId), args.Meta);
- }
+ if (args.Cancelled || !HasComp<NinjaRoleComponent>(args.MindId))
+ {
+ return;
+ }
- private void OnSpiderChargeGetProgress(EntityUid uid, SpiderChargeConditionComponent comp, ref ObjectiveGetProgressEvent args)
- {
- args.Progress = comp.SpiderChargeDetonated ? 1f : 0f;
+ // choose spider charge detonation point
+ var warps = new List<EntityUid>();
+ var query = EntityQueryEnumerator<BombingTargetComponent, WarpPointComponent>();
+ while (query.MoveNext(out var warpUid, out _, out var warp))
+ {
+ if (warp.Location != null)
+ {
+ warps.Add(warpUid);
+ }
+ }
+
+ if (warps.Count <= 0)
+ {
+ args.Cancelled = true;
+ return;
+ }
+ comp.Target = _random.Pick(warps);
}
- private string SpiderChargeTitle(EntityUid mindId)
+ private void OnSpiderChargeAfterAssign(EntityUid uid, SpiderChargeConditionComponent comp, ref ObjectiveAfterAssignEvent args)
{
- if (!TryComp<NinjaRoleComponent>(mindId, out var role) ||
- role.SpiderChargeTarget == null ||
- !TryComp<WarpPointComponent>(role.SpiderChargeTarget, out var warp))
+ string title;
+ if (comp.Target == null || !TryComp<WarpPointComponent>(comp.Target, out var warp) || warp.Location == null)
{
// this should never really happen but eh
- return Loc.GetString("objective-condition-spider-charge-title-no-target");
+ title = Loc.GetString("objective-condition-spider-charge-title-no-target");
}
+ else
+ {
+ title = Loc.GetString("objective-condition-spider-charge-title", ("location", warp.Location));
+ }
+ _metaData.SetEntityName(uid, title, args.Meta);
+ }
- return Loc.GetString("objective-condition-spider-charge-title", ("location", warp.Location ?? Name(role.SpiderChargeTarget.Value)));
+ private void OnSpiderChargeGetProgress(EntityUid uid, SpiderChargeConditionComponent comp, ref ObjectiveGetProgressEvent args)
+ {
+ args.Progress = comp.Detonated ? 1f : 0f;
}
// steal research
+++ /dev/null
-using Content.Server.Objectives.Components;
-using Content.Server.Roles;
-using Content.Shared.Objectives.Components;
-
-namespace Content.Server.Objectives.Systems;
-
-public sealed class SpiderChargeTargetRequirementSystem : EntitySystem
-{
- public override void Initialize()
- {
- base.Initialize();
-
- SubscribeLocalEvent<SpiderChargeTargetRequirementComponent, RequirementCheckEvent>(OnCheck);
- }
-
- private void OnCheck(EntityUid uid, SpiderChargeTargetRequirementComponent comp, ref RequirementCheckEvent args)
- {
- if (args.Cancelled)
- return;
-
- if (!TryComp<NinjaRoleComponent>(args.MindId, out var role) || role.SpiderChargeTarget == null)
- args.Cancelled = true;
- }
-}
namespace Content.Server.Roles;
-/// <summary>
-/// Stores the ninja's objectives on the mind so if they die the rest of the greentext persists.
-/// </summary>
[RegisterComponent]
public sealed partial class NinjaRoleComponent : AntagonistRoleComponent
{
- /// <summary>
- /// Warp point that the spider charge has to target
- /// </summary>
- [DataField("spiderChargeTarget")]
- public EntityUid? SpiderChargeTarget;
}
+objective-condition-spider-charge-title-no-target = Detonate the spider clan charge (no target)
objective-condition-spider-charge-title = Detonate the spider clan charge in {$location}
icon:
sprite: Objects/Weapons/Bombs/spidercharge.rsi
state: icon
- - type: SpiderChargeTargetRequirement
- type: SpiderChargeCondition
- type: entity