refactored PlayerRegistry and PlayerInfo (#108)

This commit is contained in:
AmazingAlek 2020-07-30 21:57:39 +02:00 committed by GitHub
parent 11811283d4
commit c2763b186d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 87 additions and 167 deletions

View File

@ -44,41 +44,42 @@ namespace QSB.Events
private void OnClientReceiveMessage(EventMessage message)
{
if (message.SenderId == PlayerTransformSync.LocalInstance.netId.Value)
if (message.SenderId == PlayerRegistry.LocalPlayer.NetId)
{
return;
}
var player = PlayerRegistry.GetPlayer(message.SenderId);
switch ((EventType)message.EventType)
{
case EventType.TurnOnFlashlight:
PlayerRegistry.GetPlayerFlashlight(message.SenderId).TurnOn();
PlayerRegistry.UpdateState(message.SenderId, State.Flashlight, true);
player.FlashLight.TurnOn();
player.UpdateState(State.Flashlight, true);
break;
case EventType.TurnOffFlashlight:
PlayerRegistry.GetPlayerFlashlight(message.SenderId).TurnOff();
PlayerRegistry.UpdateState(message.SenderId, State.Flashlight, false);
player.FlashLight.TurnOn();
player.UpdateState(State.Flashlight, false);
break;
case EventType.SuitUp:
PlayerRegistry.UpdateState(message.SenderId, State.Suit, true);
player.UpdateState(State.Suit, true);
break;
case EventType.RemoveSuit:
PlayerRegistry.UpdateState(message.SenderId, State.Suit, false);
player.UpdateState(State.Suit, false);
break;
case EventType.EquipSignalscope:
PlayerRegistry.UpdateState(message.SenderId, State.Signalscope, true);
PlayerRegistry.GetPlayerSignalscope(message.SenderId).EquipTool();
player.UpdateState(State.Signalscope, true);
player.Signalscope.EquipTool();
break;
case EventType.UnequipSignalscope:
PlayerRegistry.UpdateState(message.SenderId, State.Signalscope, false);
PlayerRegistry.GetPlayerSignalscope(message.SenderId).UnequipTool();
player.UpdateState(State.Signalscope, false);
player.Signalscope.UnequipTool();
break;
case EventType.EquipTranslator:
PlayerRegistry.UpdateState(message.SenderId, State.Translator, true);
PlayerRegistry.GetPlayerTranslator(message.SenderId).EquipTool();
player.UpdateState(State.Translator, true);
player.Translator.EquipTool();
break;
case EventType.UnequipTranslator:
PlayerRegistry.UpdateState(message.SenderId, State.Translator, false);
PlayerRegistry.GetPlayerTranslator(message.SenderId).UnequipTool();
player.UpdateState(State.Translator, false);
player.Translator.UnequipTool();
break;
}
}

View File

@ -45,8 +45,9 @@ namespace QSB.Events
private void OnClientReceiveMessage(JoinMessage message)
{
PlayerRegistry.CreatePlayer(message.SenderId, message.PlayerName);
PlayerRegistry.SetReadiness(message.SenderId, true);
var player = PlayerRegistry.CreatePlayer(message.SenderId);
player.Name = message.PlayerName;
player.IsReady = true;
DebugLog.ToAll(message.PlayerName, "joined!");
}
}

View File

@ -30,7 +30,7 @@ namespace QSB.Events
private void OnClientReceiveMessage(LeaveMessage message)
{
var playerName = PlayerRegistry.GetPlayerName(message.SenderId);
var playerName = PlayerRegistry.GetPlayer(message.SenderId).Name;
DebugLog.ToAll(playerName, "disconnected.");
PlayerRegistry.RemovePlayer(message.SenderId);
foreach (var objectId in message.ObjectIds)

View File

@ -1,15 +1,46 @@
using UnityEngine;
using System.Linq;
using QSB.Animation;
using QSB.Utility;
using UnityEngine;
namespace QSB
{
public class PlayerInfo
{
public uint NetId { get; set; }
public uint NetId { get; }
public GameObject Body { get; set; }
public GameObject Camera { get; set; }
public QSBFlashlight FlashLight => Camera.GetComponentInChildren<QSBFlashlight>();
public QSBTool Signalscope => GetToolByType(ToolType.Signalscope);
public QSBTool Translator => GetToolByType(ToolType.Translator);
public string Name { get; set; }
public bool Ready { get; set; }
public bool IsReady { get; set; }
public Transform ReferenceSector { get; set; }
public State State { get; set; }
public State State { get; private set; }
public PlayerInfo(uint id)
{
NetId = id;
}
public void UpdateState(State state, bool value)
{
var states = State;
if (value)
{
FlagsHelper.Set(ref states, state);
}
else
{
FlagsHelper.Unset(ref states, state);
}
State = states;
}
private QSBTool GetToolByType(ToolType type)
{
return Camera.GetComponentsInChildren<QSBTool>().First(x => x.Type == type);
}
}
}

View File

@ -1,160 +1,46 @@
using OWML.Common;
using QSB.Animation;
using QSB.Events;
using QSB.Utility;
using QSB.Events;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using QSB.TransformSync;
namespace QSB
{
public static class PlayerRegistry
{
public static PlayerInfo LocalPlayer => GetPlayer(PlayerTransformSync.LocalInstance.netId.Value);
public static List<PlayerInfo> PlayerList { get; } = new List<PlayerInfo>();
// Methods relating to the PlayerList :
public static void CreatePlayer(uint id, string name)
public static PlayerInfo CreatePlayer(uint id)
{
if (PlayerExists(id))
{
return;
return null;
}
var player = new PlayerInfo
{
NetId = id,
Name = name
};
var player = new PlayerInfo(id);
PlayerList.Add(player);
return player;
}
private static PlayerInfo GetPlayer(uint id)
public static PlayerInfo GetPlayer(uint id)
{
return PlayerList.Find(x => x.NetId == id);
return PlayerList.FirstOrDefault(x => x.NetId == id);
}
public static bool PlayerExists(uint id)
{
return PlayerList.Any(x => x.NetId == id);
return GetPlayer(id) != null;
}
public static void RemovePlayer(uint id)
{
PlayerList.Remove(PlayerList.Find(x => x.NetId == id));
PlayerList.Remove(GetPlayer(id));
}
public static Dictionary<uint, string> GetPlayerNames()
{
var dict = new Dictionary<uint, string>();
PlayerList.ForEach(x => dict.Add(x.NetId, x.Name));
return dict;
}
// Registering player objects :
public static void RegisterPlayerBody(uint id, GameObject body)
{
GetPlayer(id).Body = body;
}
public static void RegisterPlayerCamera(uint id, GameObject camera)
{
GetPlayer(id).Camera = camera;
}
// Get player objects :
public static GameObject GetPlayerCamera(uint id)
{
return GetPlayer(id).Camera;
}
public static QSBFlashlight GetPlayerFlashlight(uint id)
{
return GetPlayerCamera(id).GetComponentInChildren<QSBFlashlight>();
}
public static QSBTool GetPlayerSignalscope(uint id)
{
var tools = GetPlayer(id).Camera.GetComponentsInChildren<QSBTool>();
if (tools.Length == 0)
{
DebugLog.ToConsole("Error - Zero items in QSBTool list while trying to get Signalscope", MessageType.Error);
return null;
}
return tools.First(x => x.Type == ToolType.Signalscope);
}
public static QSBTool GetPlayerTranslator(uint id)
{
var tools = GetPlayer(id).Camera.GetComponentsInChildren<QSBTool>();
if (tools.Length == 0)
{
DebugLog.ToConsole("Error - Zero items in QSBTool list while trying to get Translator", MessageType.Error);
return null;
}
return tools.First(x => x.Type == ToolType.Translator);
}
// Update player data :
public static void HandleFullStateMessage(FullStateMessage message)
{
if (!PlayerExists(message.SenderId))
{
CreatePlayer(message.SenderId, message.PlayerName);
}
else
{
GetPlayer(message.SenderId).Name = message.PlayerName;
}
var player = GetPlayer(message.SenderId) ?? CreatePlayer(message.SenderId);
player.Name = message.PlayerName;
}
public static void SetReadiness(uint id, bool ready)
{
GetPlayer(id).Ready = ready;
}
public static void UpdateSector(uint id, Transform sector)
{
GetPlayer(id).ReferenceSector = sector;
}
public static void UpdateState(uint id, State state, bool value)
{
var states = GetPlayer(id).State;
if (value)
{
FlagsHelper.Set(ref states, state);
}
else
{
FlagsHelper.Unset(ref states, state);
}
GetPlayer(id).State = states;
}
// Get player data :
public static string GetPlayerName(uint id)
{
return GetPlayer(id).Name;
}
public static bool IsPlayerReady(uint id)
{
return GetPlayer(id).Ready;
}
public static Transform GetSector(uint id)
{
return GetPlayer(id).ReferenceSector;
}
public static bool GetState(uint id, State state)
{
var states = GetPlayer(id).State;
return FlagsHelper.IsSet(states, state);
}
}
}

View File

@ -77,8 +77,8 @@ namespace QSB
profileManager.Initialize();
var profile = profileManager.GetValue<StandaloneProfileManager.ProfileData>("_currentProfile");
var profileName = profile?.profileName;
return !string.IsNullOrEmpty(profileName)
? profileName
return !string.IsNullOrEmpty(profileName)
? profileName
: _defaultNames.OrderBy(x => Guid.NewGuid()).First();
}

View File

@ -147,7 +147,7 @@ namespace QSB.TimeSync
private void OnClientReceiveMessage(DeathMessage message)
{
var playerName = PlayerRegistry.GetPlayerName(message.SenderId);
var playerName = PlayerRegistry.GetPlayer(message.SenderId).Name;
var deathMessage = Necronomicon.GetPhrase(message.DeathType);
DebugLog.ToAll(string.Format(deathMessage, playerName));
}

View File

@ -30,7 +30,7 @@ namespace QSB.TransformSync
PlayerToolsManager.Init(body);
PlayerRegistry.RegisterPlayerCamera(GetAttachedNetId(), body.gameObject);
PlayerRegistry.GetPlayer(GetAttachedNetId()).Camera = body.gameObject;
return body;
}
@ -41,7 +41,7 @@ namespace QSB.TransformSync
PlayerToolsManager.Init(body.transform);
PlayerRegistry.RegisterPlayerCamera(GetAttachedNetId(), body);
PlayerRegistry.GetPlayer(GetAttachedNetId()).Camera = body;
return body.transform;
}

View File

@ -33,11 +33,11 @@ namespace QSB.TransformSync
private void Update()
{
if (!_isReady || !PlayerRegistry.IsPlayerReady(_netId))
if (!_isReady || !PlayerRegistry.GetPlayer(_netId).IsReady)
{
return;
}
_markerLabel = PlayerRegistry.GetPlayerName(_netId);
_markerLabel = PlayerRegistry.GetPlayer(_netId).Name;
_isReady = false;
base.InitCanvasMarker();

View File

@ -37,7 +37,7 @@ namespace QSB.TransformSync
GetComponent<AnimationSync>().InitLocal(body);
PlayerRegistry.RegisterPlayerBody(GetAttachedNetId(), body.gameObject);
PlayerRegistry.GetPlayer(GetAttachedNetId()).Body = body.gameObject;
return body;
}
@ -53,7 +53,7 @@ namespace QSB.TransformSync
var marker = body.gameObject.AddComponent<PlayerHUDMarker>();
marker.SetId(netId.Value);
PlayerRegistry.RegisterPlayerBody(GetAttachedNetId(), body.gameObject);
PlayerRegistry.GetPlayer(GetAttachedNetId()).Body = body.gameObject;
return body;
}

View File

@ -55,7 +55,7 @@ namespace QSB.TransformSync
{
DebugLog.ToScreen("Gonna set sector");
PlayerRegistry.UpdateSector(id, FindSectorTransform(sectorName));
PlayerRegistry.GetPlayer(id).ReferenceSector = FindSectorTransform(sectorName);
var msg = new SectorMessage
{
@ -91,7 +91,7 @@ namespace QSB.TransformSync
}
DebugLog.ToScreen("Found sector", sectorName, ", setting for", message.SenderId);
PlayerRegistry.UpdateSector(message.SenderId, sectorTransform);
PlayerRegistry.GetPlayer(message.SenderId).ReferenceSector = sectorTransform;
}
private void OnServerReceiveMessage(SectorMessage message)

View File

@ -1,4 +1,5 @@
using QSB.Events;
using OWML.Common;
using QSB.Events;
using QSB.Utility;
using UnityEngine;
using UnityEngine.Networking;
@ -55,12 +56,12 @@ namespace QSB.TransformSync
private void SetFirstSector()
{
_isSectorSetUp = true;
PlayerRegistry.UpdateSector(PlayerTransformSync.LocalInstance.netId.Value, Locator.GetAstroObject(AstroObject.Name.TimberHearth).transform);
PlayerRegistry.LocalPlayer.ReferenceSector = Locator.GetAstroObject(AstroObject.Name.TimberHearth).transform;
}
public void EnterSector(Sector sector)
{
SectorSync.Instance.SetSector(PlayerTransformSync.LocalInstance.netId.Value, sector.GetName());
SectorSync.Instance.SetSector(PlayerRegistry.LocalPlayer.NetId, sector.GetName());
}
private void Update()
@ -80,11 +81,11 @@ namespace QSB.TransformSync
}
// Get which sector should be used as a reference point
var sectorTransform = PlayerRegistry.GetSector(PlayerTransformSync.LocalInstance.netId.Value);
var sectorTransform = PlayerRegistry.LocalPlayer.ReferenceSector;
if (sectorTransform == null)
{
DebugLog.ToConsole($"Error - Player ID {PlayerTransformSync.LocalInstance.netId.Value}'s reference sector is null!", OWML.Common.MessageType.Error);
DebugLog.ToConsole($"Error - Player ID {PlayerRegistry.LocalPlayer.NetId}'s reference sector is null!", MessageType.Error);
}
if (hasAuthority) // If this script is attached to the client's own body on the client's side.
@ -94,7 +95,7 @@ namespace QSB.TransformSync
}
else // If this script is attached to any other body, eg the representations of other players
{
if (SyncedTransform.position == Vector3.zero)
if (SyncedTransform.position == Vector3.zero)
{
// Fix bodies staying at 0,0,0 by chucking them into the sun
SyncedTransform.position = Locator.GetAstroObject(AstroObject.Name.Sun).transform.position;