clean up infinite researchsystem shitcode (#13136)
* clean up infinite researchsystem shitcode * fml some more shit * make syncing work logically * naming naming naming
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Linq;
|
||||
using Content.Server.Research.Components;
|
||||
using Content.Server.Power.EntitySystems;
|
||||
using Content.Shared.Research.Components;
|
||||
using Robust.Server.Player;
|
||||
|
||||
namespace Content.Server.Research.Systems;
|
||||
|
||||
@@ -11,80 +13,116 @@ public sealed partial class ResearchSystem
|
||||
SubscribeLocalEvent<ResearchClientComponent, ComponentStartup>(OnClientStartup);
|
||||
SubscribeLocalEvent<ResearchClientComponent, ComponentShutdown>(OnClientShutdown);
|
||||
SubscribeLocalEvent<ResearchClientComponent, BoundUIOpenedEvent>(OnClientUIOpen);
|
||||
SubscribeLocalEvent<ResearchClientComponent, ConsoleServerSyncMessage>(OnConsoleSync);
|
||||
SubscribeLocalEvent<ResearchClientComponent, ConsoleServerSelectionMessage>(OnConsoleSelect);
|
||||
|
||||
SubscribeLocalEvent<ResearchClientComponent, ResearchClientSyncMessage>(OnClientSyncMessage);
|
||||
SubscribeLocalEvent<ResearchClientComponent, ResearchClientServerSelectedMessage>(OnClientSelected);
|
||||
SubscribeLocalEvent<ResearchClientComponent, ResearchClientServerDeselectedMessage>(OnClientDeselected);
|
||||
SubscribeLocalEvent<ResearchClientComponent, ResearchRegistrationChangedEvent>(OnClientRegistrationChanged);
|
||||
}
|
||||
|
||||
#region UI
|
||||
|
||||
private void OnClientDeselected(EntityUid uid, ResearchClientComponent component, ResearchClientServerDeselectedMessage args)
|
||||
{
|
||||
UnregisterClientServer(component);
|
||||
UpdateClientInterface(component);
|
||||
|
||||
if (TryComp<ResearchConsoleComponent>(uid, out var console))
|
||||
{
|
||||
UpdateConsoleInterface(console, component);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnClientSelected(EntityUid uid, ResearchClientComponent component, ResearchClientServerSelectedMessage args)
|
||||
{
|
||||
UnregisterClientServer(component);
|
||||
RegisterClientServer(component, GetServerById(args.ServerId));
|
||||
UpdateClientInterface(component);
|
||||
var server = GetServerById(args.ServerId);
|
||||
if (server == null)
|
||||
return;
|
||||
|
||||
if (TryComp<ResearchConsoleComponent>(uid, out var console))
|
||||
{
|
||||
UpdateConsoleInterface(console, component);
|
||||
}
|
||||
UnregisterClient(uid, clientComponent: component);
|
||||
RegisterClient(uid, server.Owner, component, server);
|
||||
}
|
||||
|
||||
private void OnClientDeselected(EntityUid uid, ResearchClientComponent component, ResearchClientServerDeselectedMessage args)
|
||||
{
|
||||
UnregisterClient(uid, clientComponent: component);
|
||||
}
|
||||
|
||||
private void OnClientSyncMessage(EntityUid uid, ResearchClientComponent component, ResearchClientSyncMessage args)
|
||||
{
|
||||
UpdateClientInterface(component);
|
||||
UpdateClientInterface(uid, component);
|
||||
}
|
||||
|
||||
private void OnConsoleSelect(EntityUid uid, ResearchClientComponent component, ConsoleServerSelectionMessage args)
|
||||
{
|
||||
if (!HasComp<TechnologyDatabaseComponent>(uid) || !this.IsPowered(uid, EntityManager))
|
||||
return;
|
||||
|
||||
_uiSystem.TryToggleUi(uid, ResearchClientUiKey.Key, (IPlayerSession) args.Session);
|
||||
}
|
||||
|
||||
private void OnConsoleSync(EntityUid uid, ResearchClientComponent component, ConsoleServerSyncMessage args)
|
||||
{
|
||||
if (!this.IsPowered(uid, EntityManager))
|
||||
return;
|
||||
|
||||
SyncClientWithServer(uid);
|
||||
}
|
||||
#endregion
|
||||
|
||||
private void OnClientRegistrationChanged(EntityUid uid, ResearchClientComponent component, ref ResearchRegistrationChangedEvent args)
|
||||
{
|
||||
UpdateClientInterface(uid, component);
|
||||
}
|
||||
|
||||
private void OnClientStartup(EntityUid uid, ResearchClientComponent component, ComponentStartup args)
|
||||
{
|
||||
var allServers = EntityQuery<ResearchServerComponent>(true).ToArray();
|
||||
if (allServers.Length > 0)
|
||||
RegisterClientServer(component, allServers[0]);
|
||||
RegisterClient(uid, allServers[0].Owner, component, allServers[0]);
|
||||
}
|
||||
|
||||
private void OnClientShutdown(EntityUid uid, ResearchClientComponent component, ComponentShutdown args)
|
||||
{
|
||||
UnregisterClientServer(component);
|
||||
UnregisterClient(uid, component);
|
||||
}
|
||||
|
||||
private void OnClientUIOpen(EntityUid uid, ResearchClientComponent component, BoundUIOpenedEvent args)
|
||||
{
|
||||
UpdateClientInterface(component);
|
||||
UpdateClientInterface(uid, component);
|
||||
}
|
||||
|
||||
private void UpdateClientInterface(ResearchClientComponent component)
|
||||
private void UpdateClientInterface(EntityUid uid, ResearchClientComponent? component = null)
|
||||
{
|
||||
if (!Resolve(uid, ref component, false))
|
||||
return;
|
||||
|
||||
if (!TryGetClientServer(uid, out _, out var serverComponent, component))
|
||||
return;
|
||||
|
||||
var names = GetServerNames();
|
||||
var state = new ResearchClientBoundInterfaceState(names.Length, names,
|
||||
GetServerIds(), component.ConnectedToServer ? component.Server!.Id : -1);
|
||||
GetServerIds(), component.ConnectedToServer ? serverComponent.Id : -1);
|
||||
|
||||
_uiSystem.TrySetUiState(component.Owner, ResearchClientUiKey.Key, state);
|
||||
}
|
||||
|
||||
private bool RegisterClientServer(ResearchClientComponent component, ResearchServerComponent? server = null)
|
||||
/// <summary>
|
||||
/// Tries to get the server belonging to a client
|
||||
/// </summary>
|
||||
/// <param name="uid">The client</param>
|
||||
/// <param name="server">It's server. Null if false.</param>
|
||||
/// <param name="serverComponent">The server's ResearchServerComponent. Null if false</param>
|
||||
/// <param name="component">The client's Researchclient component</param>
|
||||
/// <returns>If the server was successfully retrieved.</returns>
|
||||
public bool TryGetClientServer(EntityUid uid, [NotNullWhen(returnValue: true)] out EntityUid? server,
|
||||
[NotNullWhen(returnValue: true)] out ResearchServerComponent? serverComponent, ResearchClientComponent? component = null)
|
||||
{
|
||||
return server != null && RegisterServerClient(server, component.Owner, component);
|
||||
}
|
||||
server = null;
|
||||
serverComponent = null;
|
||||
|
||||
if (!Resolve(uid, ref component, false))
|
||||
return false;
|
||||
|
||||
private void UnregisterClientServer(ResearchClientComponent component)
|
||||
{
|
||||
if (component.Server == null)
|
||||
return;
|
||||
return false;
|
||||
|
||||
UnregisterServerClient(component.Server, component.Owner, component);
|
||||
if (!TryComp<ResearchServerComponent>(component.Server, out var sc))
|
||||
return false;
|
||||
|
||||
server = component.Server;
|
||||
serverComponent = sc;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user