if (_followerSystem.GetMostGhostFollowed() is not {} target)
return;
- WarpTo(uid, target);
+ // If there is a ghostnado happening you almost definitely wanna join it, so we automatically follow instead of just warping.
+ _followerSystem.StartFollowingEntity(uid, target);
}
private void WarpTo(EntityUid uid, EntityUid target)
[Dependency] private readonly ISharedAdminManager _adminManager = default!;
private static readonly ProtoId<TagPrototype> ForceableFollowTag = "ForceableFollow";
+ private static readonly ProtoId<TagPrototype> PreventGhostnadoWarpTag = "NotGhostnadoWarpable";
public override void Initialize()
{
var query = EntityQueryEnumerator<FollowerComponent, GhostComponent, ActorComponent>();
while (query.MoveNext(out _, out var follower, out _, out var actor))
{
- // Exclude admins
+ // Don't count admin followers so that players cannot notice if admins are in stealth mode and following someone.
if (_adminManager.IsAdmin(actor.PlayerSession))
continue;
var followed = follower.Following;
+
+ // If the followed entity cannot be ghostnado'd to, we don't count it.
+ // Used for making admins not warpable to, but IsAdmin isn't used for cases where the admin wants to be followed, for example during events.
+ if (_tagSystem.HasTag(followed, PreventGhostnadoWarpTag))
+ continue;
+
// Add new entry or increment existing
followedEnts.TryGetValue(followed, out var currentValue);
followedEnts[followed] = currentValue + 1;
- type: Tag
id: Mouse # CargoBounty: BountyMouse
-
+
- type: Tag
id: Multitool # Storage whitelist: BaseClothingBeltEngineering. ItemMapper: BaseClothingBeltEngineering. ConstructionGraph: LogicGate
- type: Tag
id: NoConsoleSound # Blacklist on BaseComputer, StationMap. Tagged entity will not make sound when opening the UI.
+- type: Tag
+ id: NotGhostnadoWarpable # Prevents the entity from being selected via "Warp to most followed" ghost warp
+
- type: Tag
id: NozzleBackTank # Used by WeaponSprayNozzle to find a tagged entity for supplying ammo.