* Multiple hands in gui first pass * Remove IHandsComponent interface * Create hand class and more hand textures * Refactor ServerHandsComponent to use a single list of hands * Seal SharedHand * Fix picked up items not showing on top of the hand buttons * Remove HandsGui buttons and panels dictionaries * Fix items in hands rendering * Fix wrong hand container comparison * Fix not updating the location of duplicate hands * Change ClientHandsComponent to use a SortedList instead of a dictionary * More merge conflict fixes * Change SortedList to List * Fix hand button order * Add item tooltip for more than 2 hands and updating when removing hands * Add add hand and remove hand command * Merge conflict fixes * Remove nullable reference type from ContainerSlot * Fix texture errors * Fix error when reaching 0 hands * Fix error when swapping hands with no hands * Merged remove hand methods * Fix item panel texture errors * Merge conflict fixes * Fix addhand and removehand command descriptions * Add properly displaying tooltips for 2 hands * Make hand indexes and locations consistent across the client and server * Add dropping held entity if a hand is removed * Change hand location to be calculated by index * Made different hand gui updates more consistent * Remove human body yml testing changes * Sanitize addhand and removehand commands * Merge conflict fixes * Remove testing changes * Revert body system changes * Add missing imports * Remove obsolete hands parameter in yml files * Fix broken import * Fix startup error and adding and removing hands on the same tick * Make hand container id use an uint In case someone gets more than 2 billion hands * Rename hand component files * Make hands state use an array
128 lines
4.3 KiB
C#
128 lines
4.3 KiB
C#
using Content.Server.GameObjects;
|
|
using Content.Server.GameObjects.Components;
|
|
using Content.Server.GameObjects.Components.GUI;
|
|
using Content.Server.GameTicking;
|
|
using Content.Server.Interfaces.GameTicking;
|
|
using Content.Shared.Sandbox;
|
|
using Robust.Server.Console;
|
|
using Robust.Server.Interfaces.Placement;
|
|
using Robust.Server.Interfaces.Player;
|
|
using Robust.Server.Player;
|
|
using Robust.Shared.Enums;
|
|
using Robust.Shared.Interfaces.GameObjects;
|
|
using Robust.Shared.Interfaces.Network;
|
|
using Robust.Shared.IoC;
|
|
using Robust.Shared.ViewVariables;
|
|
|
|
namespace Content.Server.Sandbox
|
|
{
|
|
internal sealed class SandboxManager : SharedSandboxManager, ISandboxManager
|
|
{
|
|
#pragma warning disable 649
|
|
[Dependency] private readonly IPlayerManager _playerManager;
|
|
[Dependency] private readonly IServerNetManager _netManager;
|
|
[Dependency] private readonly IGameTicker _gameTicker;
|
|
[Dependency] private readonly IPlacementManager _placementManager;
|
|
[Dependency] private readonly IConGroupController _conGroupController;
|
|
[Dependency] private readonly IEntityManager _entityManager;
|
|
#pragma warning restore 649
|
|
|
|
private bool _isSandboxEnabled;
|
|
|
|
[ViewVariables(VVAccess.ReadWrite)]
|
|
public bool IsSandboxEnabled
|
|
{
|
|
get => _isSandboxEnabled;
|
|
set
|
|
{
|
|
_isSandboxEnabled = value;
|
|
UpdateSandboxStatusForAll();
|
|
}
|
|
}
|
|
|
|
public void Initialize()
|
|
{
|
|
_netManager.RegisterNetMessage<MsgSandboxStatus>(nameof(MsgSandboxStatus));
|
|
_netManager.RegisterNetMessage<MsgSandboxRespawn>(nameof(MsgSandboxRespawn), SandboxRespawnReceived);
|
|
_netManager.RegisterNetMessage<MsgSandboxGiveAccess>(nameof(MsgSandboxGiveAccess), SandboxGiveAccessReceived);
|
|
|
|
_playerManager.PlayerStatusChanged += OnPlayerStatusChanged;
|
|
_gameTicker.OnRunLevelChanged += GameTickerOnOnRunLevelChanged;
|
|
|
|
_placementManager.AllowPlacementFunc = placement =>
|
|
{
|
|
if (IsSandboxEnabled)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
var channel = placement.MsgChannel;
|
|
var player = _playerManager.GetSessionByChannel(channel);
|
|
|
|
if (_conGroupController.CanAdminPlace(player))
|
|
{
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
};
|
|
}
|
|
|
|
private void GameTickerOnOnRunLevelChanged(GameRunLevelChangedEventArgs obj)
|
|
{
|
|
// Automatically clear sandbox state when round resets.
|
|
if (obj.NewRunLevel == GameRunLevel.PreRoundLobby)
|
|
{
|
|
IsSandboxEnabled = false;
|
|
}
|
|
}
|
|
|
|
private void OnPlayerStatusChanged(object sender, SessionStatusEventArgs e)
|
|
{
|
|
if (e.NewStatus != SessionStatus.Connected || e.OldStatus != SessionStatus.Connecting)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var msg = _netManager.CreateNetMessage<MsgSandboxStatus>();
|
|
msg.SandboxAllowed = IsSandboxEnabled;
|
|
_netManager.ServerSendMessage(msg, e.Session.ConnectedClient);
|
|
}
|
|
|
|
private void SandboxRespawnReceived(MsgSandboxRespawn message)
|
|
{
|
|
if (!IsSandboxEnabled)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var player = _playerManager.GetSessionByChannel(message.MsgChannel);
|
|
_gameTicker.Respawn(player);
|
|
}
|
|
|
|
private void SandboxGiveAccessReceived(MsgSandboxGiveAccess message)
|
|
{
|
|
if(!IsSandboxEnabled)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var player = _playerManager.GetSessionByChannel(message.MsgChannel);
|
|
if(player.AttachedEntity.TryGetComponent<HandsComponent>(out var hands))
|
|
{
|
|
;
|
|
hands.PutInHandOrDrop(
|
|
_entityManager.SpawnEntity("CaptainIDCard",
|
|
player.AttachedEntity.Transform.GridPosition).GetComponent<ItemComponent>());
|
|
}
|
|
}
|
|
|
|
private void UpdateSandboxStatusForAll()
|
|
{
|
|
var msg = _netManager.CreateNetMessage<MsgSandboxStatus>();
|
|
msg.SandboxAllowed = IsSandboxEnabled;
|
|
_netManager.ServerSendToAll(msg);
|
|
}
|
|
}
|
|
}
|