<Label Name="SharedConnections"/>
<BoxContainer Align="Center">
- <GridContainer Rows="5">
+ <GridContainer Rows="6">
<Button Name="NotesButton" Text="{Loc player-panel-show-notes}" SetWidth="136" Disabled="True"/>
<Button Name="AhelpButton" Text="{Loc player-panel-help}" Disabled="True"/>
<Button Name="FreezeButton" Text = "{Loc player-panel-freeze}" Disabled="True"/>
<controls:ConfirmButton Name="KickButton" Text="{Loc player-panel-kick}" Disabled="True"/>
<controls:ConfirmButton Name="DeleteButton" Text="{Loc player-panel-delete}" Disabled="True"/>
+ <Button Name="FollowButton" Text="{Loc player-panel-follow}"/>
<Button Name="ShowBansButton" Text="{Loc player-panel-show-bans}" SetWidth="136" Disabled="True"/>
<Button Name="LogsButton" Text="{Loc player-panel-logs}" Disabled="True"/>
<Button Name="FreezeAndMuteToggleButton" Text="{Loc player-panel-freeze-and-mute}" Disabled="True"/>
using Content.Client.UserInterface.Controls;
using Content.Shared.Administration;
using Robust.Client.AutoGenerated;
-using Robust.Client.UserInterface;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Network;
using Robust.Shared.Utility;
public event Action<string?>? OnKick;
public event Action<NetUserId?>? OnOpenBanPanel;
public event Action<NetUserId?, bool>? OnWhitelistToggle;
+ public event Action? OnFollow;
public event Action? OnFreezeAndMuteToggle;
public event Action? OnFreeze;
public event Action? OnLogs;
OnWhitelistToggle?.Invoke(TargetPlayer, _isWhitelisted);
SetWhitelisted(!_isWhitelisted);
};
+ FollowButton.OnPressed += _ => OnFollow?.Invoke();
FreezeButton.OnPressed += _ => OnFreeze?.Invoke();
FreezeAndMuteToggleButton.OnPressed += _ => OnFreezeAndMuteToggle?.Invoke();
LogsButton.OnPressed += _ => OnLogs?.Invoke();
PlayerPanel.OnLogs += () => SendMessage(new PlayerPanelLogsMessage());
PlayerPanel.OnRejuvenate += () => SendMessage(new PlayerPanelRejuvenationMessage());
PlayerPanel.OnDelete+= () => SendMessage(new PlayerPanelDeleteMessage());
+ PlayerPanel.OnFollow += () => SendMessage(new PlayerPanelFollowMessage());
PlayerPanel.OnClose += () => SendMessage(new CloseEuiMessage());
}
using Content.Shared.Administration;
using Content.Shared.Database;
using Content.Shared.Eui;
+using Content.Shared.Follower;
using Robust.Server.Player;
using Robust.Shared.Player;
private bool _frozen;
private bool _canFreeze;
private bool _canAhelp;
+ private FollowerSystem _follower;
public PlayerPanelEui(LocatedPlayerData player)
{
IoCManager.InjectDependencies(this);
_targetPlayer = player;
+ _follower = _entity.System<FollowerSystem>();
}
public override void Opened()
_entity.DeleteEntity(session.AttachedEntity);
}
break;
+ case PlayerPanelFollowMessage:
+ if (!_admins.HasAdminFlag(Player, AdminFlags.Admin) ||
+ !_player.TryGetSessionById(_targetPlayer.UserId, out session) ||
+ session.AttachedEntity == null ||
+ Player.AttachedEntity is null ||
+ session.AttachedEntity == Player.AttachedEntity)
+ return;
+
+ _follower.StartFollowingEntity(Player.AttachedEntity.Value, session.AttachedEntity.Value);
+ break;
}
}
using Content.Shared.Eui;
using Robust.Shared.Network;
using Robust.Shared.Serialization;
-using YamlDotNet.Serialization.Callbacks;
namespace Content.Shared.Administration;
[Serializable, NetSerializable]
-public sealed class PlayerPanelEuiState(NetUserId guid,
+public sealed class PlayerPanelEuiState(
+ NetUserId guid,
string username,
TimeSpan playtime,
int? totalNotes,
[Serializable, NetSerializable]
public sealed class PlayerPanelRejuvenationMessage: EuiMessageBase;
+
+[Serializable, NetSerializable]
+public sealed class PlayerPanelFollowMessage: EuiMessageBase;
player-panel-rejuvenate = Rejuvenate
player-panel-false = False
player-panel-true = True
+player-panel-follow = Follow