fixing fixing fixing

This commit is contained in:
Mister_Nebula 2020-08-17 16:51:56 +01:00
parent 90d85dcba1
commit 61b3efe619
26 changed files with 144 additions and 71 deletions

View File

@ -127,7 +127,8 @@ namespace QSB.Animation
{
var message = new AnimTriggerMessage
{
SenderId = netId.Value,
FromId = netId.Value,
AboutId = netId.Value,
TriggerId = (short)trigger,
Value = value
};
@ -148,7 +149,7 @@ namespace QSB.Animation
private void OnClientReceiveMessage(AnimTriggerMessage message)
{
var animationSync = PlayerRegistry.GetAnimationSync(message.SenderId);
var animationSync = PlayerRegistry.GetAnimationSync(message.AboutId);
if (animationSync == null || animationSync == this)
{
return;

View File

@ -24,13 +24,13 @@ namespace QSB.Animation
private ToggleMessage CreateMessage(bool value) => new ToggleMessage
{
SenderId = LocalPlayerId,
AboutId = LocalPlayerId,
ToggleValue = value
};
public override void OnReceiveRemote(ToggleMessage message)
{
var player = PlayerRegistry.GetPlayer(message.SenderId);
var player = PlayerRegistry.GetPlayer(message.AboutId);
player?.UpdateState(State.Suit, message.ToggleValue);
}

View File

@ -22,13 +22,13 @@ namespace QSB.DeathSync
private PlayerDeathMessage CreateMessage(DeathType type) => new PlayerDeathMessage
{
SenderId = LocalPlayerId,
AboutId = LocalPlayerId,
DeathType = type
};
public override void OnReceiveRemote(PlayerDeathMessage message)
{
var playerName = PlayerRegistry.GetPlayer(message.SenderId).Name;
var playerName = PlayerRegistry.GetPlayer(message.AboutId).Name;
var deathMessage = Necronomicon.GetPhrase(message.DeathType);
DebugLog.ToAll(string.Format(deathMessage, playerName));
}

View File

@ -22,7 +22,6 @@ namespace QSB.ElevatorSync
private ElevatorMessage CreateMessage(int id, ElevatorDirection direction) => new ElevatorMessage
{
SenderId = PlayerRegistry.LocalPlayer.NetId,
Direction = direction,
ObjectId = id
};

View File

@ -49,7 +49,6 @@ namespace QSB.Events
Ready = false;
foreach (var item in _eventList)
{
DebugLog.ToConsole("Closing listener for " + item.GetType().Name);
item.Invoke("CloseListener");
}
_eventList = new List<object>();

View File

@ -15,27 +15,21 @@ namespace QSB.Events
public override void CloseListener()
{
DebugLog.ToConsole("Close listener for join event");
GlobalMessenger<string>.RemoveListener(EventNames.QSBPlayerJoin, Handler);
}
private void Handler(string name) => StartSendEvent(CreateMessage(name));
private void StartSendEvent(PlayerJoinMessage message)
{
DebugLog.ToConsole("Got fire event for player join, sending message");
SendEvent(message);
}
private void Handler(string name) => SendEvent(CreateMessage(name));
private PlayerJoinMessage CreateMessage(string name) => new PlayerJoinMessage
{
SenderId = PlayerTransformSync.LocalInstance.netId.Value,
FromId = PlayerTransformSync.LocalInstance.netId.Value,
AboutId = PlayerTransformSync.LocalInstance.netId.Value,
PlayerName = name
};
public override void OnReceiveRemote(PlayerJoinMessage message)
{
var player = PlayerRegistry.CreatePlayer(message.SenderId);
var player = PlayerRegistry.CreatePlayer(message.AboutId);
player.Name = message.PlayerName;
var text = $"{player.Name} joined!";
DebugLog.ToAll(OWML.Common.MessageType.Info, text);
@ -43,7 +37,6 @@ namespace QSB.Events
public override void OnReceiveLocal(PlayerJoinMessage message)
{
DebugLog.ToConsole($"OnReceiveLocal player join event, from {message.SenderId}");
var player = PlayerRegistry.CreatePlayer(PlayerTransformSync.LocalInstance.netId.Value);
player.Name = message.PlayerName;
var text = $"Connected to server as {player.Name}.";

View File

@ -24,23 +24,22 @@ namespace QSB.Events
private PlayerLeaveMessage CreateMessage(uint id, uint[] objects) => new PlayerLeaveMessage
{
SenderId = id,
FromId = LocalPlayerId,
AboutId = id,
ObjectIds = objects
};
public override void OnReceiveRemote(PlayerLeaveMessage message)
{
var playerName = PlayerRegistry.GetPlayer(message.SenderId).Name;
DebugLog.ToAll(playerName, "disconnected.");
PlayerRegistry.RemovePlayer(message.SenderId);
var playerName = PlayerRegistry.GetPlayer(message.AboutId).Name;
DebugLog.ToConsole($"{playerName} disconnected.", OWML.Common.MessageType.Info);
PlayerRegistry.RemovePlayer(message.AboutId);
foreach (var objectId in message.ObjectIds)
{
DestroyObject(objectId);
}
}
public override void OnReceiveLocal(PlayerLeaveMessage message) => OnReceiveRemote(message);
private void DestroyObject(uint objectId)
{
var component = Object.FindObjectsOfType<NetworkBehaviour>()
@ -50,9 +49,14 @@ namespace QSB.Events
return;
}
var transformSync = component.GetComponent<TransformSync.TransformSync>();
if (transformSync != null)
{
Object.Destroy(transformSync.SyncedTransform.gameObject);
PlayerRegistry.TransformSyncs.Remove(transformSync);
if (transformSync.SyncedTransform != null)
{
Object.Destroy(transformSync.SyncedTransform.gameObject);
}
}
Object.Destroy(component.gameObject);
}

View File

@ -14,7 +14,6 @@ namespace QSB.Events
public override void CloseListener()
{
DebugLog.ToConsole("Close listener for ready event");
GlobalMessenger<bool>.RemoveListener(EventNames.QSBPlayerReady, Handler);
}
@ -22,13 +21,14 @@ namespace QSB.Events
private ToggleMessage CreateMessage(bool ready) => new ToggleMessage
{
SenderId = LocalPlayerId,
FromId = LocalPlayerId,
AboutId = LocalPlayerId,
ToggleValue = ready
};
public override void OnServerReceive(ToggleMessage message)
{
PlayerRegistry.GetPlayer(message.SenderId).IsReady = message.ToggleValue;
PlayerRegistry.GetPlayer(message.AboutId).IsReady = message.ToggleValue;
PlayerState.LocalInstance.Send();
}
}

View File

@ -21,11 +21,11 @@ namespace QSB.Events
private void OnClientReceiveMessage(PlayerStateMessage message)
{
if (message.SenderId == PlayerTransformSync.LocalInstance.netId.Value)
if (message.FromId == PlayerTransformSync.LocalInstance.netId.Value)
{
return;
}
UnityHelper.Instance.RunWhen(() => PlayerRegistry.GetTransformSync(message.SenderId) != null,
UnityHelper.Instance.RunWhen(() => PlayerRegistry.GetTransformSync(message.AboutId) != null,
() => PlayerRegistry.HandleFullStateMessage(message));
}
@ -35,7 +35,8 @@ namespace QSB.Events
{
var message = new PlayerStateMessage
{
SenderId = player.NetId,
FromId = PlayerRegistry.LocalPlayerId,
AboutId = player.NetId,
PlayerName = player.Name,
PlayerReady = player.IsReady,
PlayerState = player.State

View File

@ -22,7 +22,7 @@ namespace QSB.Events
private PlayerMessage CreateMessage() => new PlayerMessage
{
SenderId = PlayerTransformSync.LocalInstance.netId.Value
FromId = PlayerTransformSync.LocalInstance.netId.Value
};
public override void OnServerReceive(PlayerMessage message)

View File

@ -1,6 +1,7 @@
using QSB.Messaging;
using QSB.TransformSync;
using QSB.Utility;
using UnityEngine.Networking;
namespace QSB.Events
{
@ -55,26 +56,22 @@ namespace QSB.Events
/// <param name="message"></param>
public virtual void OnServerReceive(T message)
{
DebugLog.ToConsole("server get message");
_eventHandler.SendToAll(message);
}
public void SendEvent(T message)
{
DebugLog.ToConsole("Starting wait to send event...");
UnityHelper.Instance.RunWhen(() => PlayerTransformSync.LocalInstance != null, () => Send(message));
}
private void Send(T message)
{
DebugLog.ToConsole("sending event!");
_eventHandler.SendToServer(message);
}
private void OnClientReceive(T message)
{
DebugLog.ToConsole("Got event!");
if (PlayerRegistry.IsBelongingToLocalPlayer(message.SenderId))
if (PlayerRegistry.IsBelongingToLocalPlayer(message.FromId))
{
OnReceiveLocal(message);
return;

View File

@ -22,7 +22,7 @@ namespace QSB.GeyserSync
private GeyserMessage CreateMessage(int id, bool state) => new GeyserMessage
{
SenderId = PlayerRegistry.LocalPlayer.NetId,
FromId = PlayerRegistry.LocalPlayer.NetId,
ObjectId = id,
State = state
};

View File

@ -27,7 +27,6 @@ namespace QSB.Messaging
private void Init()
{
DebugLog.ToConsole($"Registering handler on server id {NetworkServer.serverHostId}");
NetworkServer.RegisterHandler((short)_messageType, OnServerReceiveMessageHandler);
NetworkManager.singleton.client.RegisterHandler((short)_messageType, OnClientReceiveMessageHandler);
}

View File

@ -4,16 +4,19 @@ namespace QSB.Messaging
{
public class PlayerMessage : MessageBase
{
public uint SenderId { get; set; }
public uint FromId { get; set; }
public uint AboutId { get; set; }
public override void Deserialize(NetworkReader reader)
{
SenderId = reader.ReadUInt32();
FromId = reader.ReadUInt32();
AboutId = reader.ReadUInt32();
}
public override void Serialize(NetworkWriter writer)
{
writer.Write(SenderId);
writer.Write(FromId);
writer.Write(AboutId);
}
}
}

View File

@ -3,6 +3,7 @@ using System.Linq;
using QSB.TransformSync;
using QSB.Animation;
using QSB.Messaging;
using QSB.Utility;
namespace QSB
{
@ -39,12 +40,13 @@ namespace QSB
public static void RemovePlayer(uint id)
{
DebugLog.ToConsole($"Removing player {id}");
PlayerList.Remove(GetPlayer(id));
}
public static void HandleFullStateMessage(PlayerStateMessage message)
{
var player = GetPlayer(message.SenderId) ?? CreatePlayer(message.SenderId);
var player = GetPlayer(message.AboutId) ?? CreatePlayer(message.AboutId);
player.Name = message.PlayerName;
player.IsReady = message.PlayerReady;
player.State = message.PlayerState;
@ -57,11 +59,21 @@ namespace QSB
public static TransformSync.TransformSync GetTransformSync(uint id)
{
DebugLog.ToConsole($"Getting transform sync for id {id}");
foreach (var item in TransformSyncs)
{
DebugLog.ToConsole($"{item.GetType().Name} : {item.netId.Value}");
}
if (TransformSyncs.FirstOrDefault(x => x != null && x.netId.Value == id) == default(TransformSync.TransformSync))
{
DebugLog.ToConsole($"* Couldn't find transformsync for id {id}!", OWML.Common.MessageType.Warning);
}
return TransformSyncs.FirstOrDefault(x => x != null && x.netId.Value == id);
}
public static bool IsBelongingToLocalPlayer(uint id)
{
DebugLog.ToConsole($"LocalPlayerId : {LocalPlayerId}");
return id == LocalPlayerId || GetTransformSync(id).PlayerId == LocalPlayerId;
}

View File

@ -14,6 +14,8 @@ namespace QSB
public static IModHelper Helper;
public static string DefaultServerIP;
public static bool DebugMode;
public static AssetBundle NetworkAssetBundle;
private static GameObject GameObject;
private void Awake()
{
@ -23,6 +25,10 @@ namespace QSB
private void Start()
{
Helper = ModHelper;
GameObject = gameObject;
NetworkAssetBundle = Helper.Assets.LoadBundle("assets/network");
QSB.Helper.HarmonyHelper.EmptyMethod<NetworkManagerHUD>("Update");
gameObject.AddComponent<DebugLog>();
gameObject.AddComponent<QSBNetworkManager>();

View File

@ -11,6 +11,7 @@ using QSB.Utility;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Networking;
using UnityEngine.UI;
namespace QSB
{
@ -54,7 +55,7 @@ namespace QSB
private void Awake()
{
_assetBundle = QSB.Helper.Assets.LoadBundle("assets/network");
_assetBundle = QSB.NetworkAssetBundle;
playerPrefab = _assetBundle.LoadAsset<GameObject>("assets/networkplayer.prefab");
playerPrefab.AddComponent<PlayerTransformSync>();
@ -99,12 +100,11 @@ namespace QSB
connectionConfig.AddChannel(QosType.Unreliable);
channels.Add(QosType.Reliable);
channels.Add(QosType.Unreliable);
QSB.Helper.HarmonyHelper.EmptyMethod<NetworkManagerHUD>("Update");
}
public override void OnServerAddPlayer(NetworkConnection connection, short playerControllerId) // Called on the server when a client joins
{
DebugLog.ToConsole("On server add player " + playerControllerId);
base.OnServerAddPlayer(connection, playerControllerId);
// These have to be in a constant order (for now, until I get a better netId getting system...)
@ -117,7 +117,6 @@ namespace QSB
public override void OnClientConnect(NetworkConnection connection) // Called on the client when connecting to a server
{
DebugLog.ToConsole("OnClientConnect (connected to server)");
base.OnClientConnect(connection);
gameObject.AddComponent<SectorSync>();
@ -138,13 +137,8 @@ namespace QSB
UnityHelper.Instance.RunWhen(() => PlayerTransformSync.LocalInstance != null, EventList.Init);
UnityHelper.Instance.RunWhen(() => EventList.Ready, () => FireJoinEvent());
}
private void FireJoinEvent()
{
DebugLog.ToConsole("Firing join event!");
GlobalMessenger<string>.FireEvent(EventNames.QSBPlayerJoin, _playerName);
UnityHelper.Instance.RunWhen(() => EventList.Ready,
() => GlobalMessenger<string>.FireEvent(EventNames.QSBPlayerJoin, _playerName));
}
public override void OnStopClient() // Called on the client when closing connection
@ -165,13 +159,62 @@ namespace QSB
var playerId = connection.playerControllers[0].gameObject.GetComponent<PlayerTransformSync>().netId.Value;
var objectIds = connection.clientOwnedObjects.Select(x => x.Value).ToArray();
GlobalMessenger<uint, uint[]>.FireEvent(EventNames.QSBPlayerLeave, playerId, objectIds);
base.OnServerDisconnect(connection);
CleanupConnection(connection);
}
public override void OnStopServer()
{
NetworkServer.Reset();
DebugLog.ToConsole("Server stopped!", OWML.Common.MessageType.Info);
foreach (var connection in NetworkServer.connections)
{
CleanupConnection(connection);
}
base.OnStopServer();
}
public override void OnClientDisconnect(NetworkConnection conn)
{
DebugLog.ToConsole("Disconnected from server.", OWML.Common.MessageType.Info);
foreach (var connection in NetworkServer.connections.Where(x => x != conn))
{
CleanupConnection(connection);
}
base.OnClientDisconnect(conn);
}
private void CleanupConnection(NetworkConnection connection)
{
var playerId = connection.playerControllers[0].gameObject.GetComponent<PlayerTransformSync>().netId.Value;
var objectIds = connection.clientOwnedObjects.Select(x => x.Value).ToArray();
var playerName = PlayerRegistry.GetPlayer(playerId).Name;
DebugLog.ToConsole($"{playerName} disconnected.", OWML.Common.MessageType.Info);
PlayerRegistry.RemovePlayer(playerId);
foreach (var objectId in objectIds)
{
DestroyObject(objectId);
}
}
private void DestroyObject(uint objectId)
{
var component = FindObjectsOfType<NetworkBehaviour>()
.FirstOrDefault(x => x.netId.Value == objectId);
if (component == null)
{
return;
}
var transformSync = component.GetComponent<TransformSync.TransformSync>();
if (transformSync != null)
{
PlayerRegistry.TransformSyncs.Remove(transformSync);
if (transformSync.SyncedTransform != null)
{
Destroy(transformSync.SyncedTransform.gameObject);
}
}
Destroy(component.gameObject);
}
private void OnGUI()

View File

@ -21,7 +21,7 @@ namespace QSB.TimeSync
private ServerTimeMessage CreateMessage(float time, int count) => new ServerTimeMessage
{
SenderId = PlayerRegistry.LocalPlayer.NetId,
FromId = PlayerRegistry.LocalPlayer.NetId,
ServerTime = time,
LoopCount = count
};

View File

@ -24,13 +24,14 @@ namespace QSB.Tools
private ToggleMessage CreateMessage(bool value) => new ToggleMessage
{
SenderId = LocalPlayerId,
FromId = LocalPlayerId,
AboutId = LocalPlayerId,
ToggleValue = value
};
public override void OnReceiveRemote(ToggleMessage message)
{
var player = PlayerRegistry.GetPlayer(message.SenderId);
var player = PlayerRegistry.GetPlayer(message.AboutId);
player?.UpdateState(State.Flashlight, message.ToggleValue);
if (!QSBSceneManager.IsInUniverse)
{

View File

@ -24,13 +24,14 @@ namespace QSB.Tools
private ToggleMessage CreateMessage(bool value) => new ToggleMessage
{
SenderId = LocalPlayerId,
FromId = LocalPlayerId,
AboutId = LocalPlayerId,
ToggleValue = value
};
public override void OnReceiveRemote(ToggleMessage message)
{
var player = PlayerRegistry.GetPlayer(message.SenderId);
var player = PlayerRegistry.GetPlayer(message.AboutId);
player.UpdateState(State.ProbeActive, message.ToggleValue);
player.Probe.SetState(message.ToggleValue);
}

View File

@ -24,13 +24,14 @@ namespace QSB.Tools
private ToggleMessage CreateMessage(bool value) => new ToggleMessage
{
SenderId = LocalPlayerId,
FromId = LocalPlayerId,
AboutId = LocalPlayerId,
ToggleValue = value
};
public override void OnReceiveRemote(ToggleMessage message)
{
var player = PlayerRegistry.GetPlayer(message.SenderId);
var player = PlayerRegistry.GetPlayer(message.AboutId);
player?.UpdateState(State.ProbeLauncher, message.ToggleValue);
if (!QSBSceneManager.IsInUniverse)
{

View File

@ -24,13 +24,14 @@ namespace QSB.Tools
private ToggleMessage CreateMessage(bool value) => new ToggleMessage
{
SenderId = LocalPlayerId,
FromId = LocalPlayerId,
AboutId = LocalPlayerId,
ToggleValue = value
};
public override void OnReceiveRemote(ToggleMessage message)
{
var player = PlayerRegistry.GetPlayer(message.SenderId);
var player = PlayerRegistry.GetPlayer(message.AboutId);
player?.UpdateState(State.Signalscope, message.ToggleValue);
if (!QSBSceneManager.IsInUniverse)
{

View File

@ -24,13 +24,14 @@ namespace QSB.Tools
private ToggleMessage CreateMessage(bool value) => new ToggleMessage
{
SenderId = LocalPlayerId,
FromId = LocalPlayerId,
AboutId = LocalPlayerId,
ToggleValue = value
};
public override void OnReceiveRemote(ToggleMessage message)
{
var player = PlayerRegistry.GetPlayer(message.SenderId);
var player = PlayerRegistry.GetPlayer(message.AboutId);
player?.UpdateState(State.Translator, message.ToggleValue);
if (!QSBSceneManager.IsInUniverse)
{

View File

@ -23,7 +23,8 @@ namespace QSB.TransformSync
private WorldObjectMessage CreateMessage(uint netId, QSBSector sector) => new WorldObjectMessage
{
SenderId = netId,
FromId = LocalPlayerId,
AboutId = netId,
ObjectId = sector.ObjectId
};
@ -41,7 +42,7 @@ namespace QSB.TransformSync
return;
}
var transformSync = PlayerRegistry.GetTransformSync(message.SenderId);
var transformSync = PlayerRegistry.GetTransformSync(message.AboutId);
//DebugLog.ToConsole($"{transformSync.GetType().Name} of ID {message.SenderId} set to {sector.Name}");
UnityHelper.Instance.RunWhen(() => transformSync.SyncedTransform != null,
() => transformSync.SetReferenceSector(sector));

View File

@ -1,4 +1,5 @@
using QSB.Animation;
using QSB.Utility;
using UnityEngine;
namespace QSB.TransformSync
@ -9,11 +10,19 @@ namespace QSB.TransformSync
static PlayerTransformSync()
{
DebugLog.ToConsole("constructor of playertransformsync");
AnimControllerPatch.Init();
}
public override void OnNetworkDestroy()
{
DebugLog.ToConsole("PlayerTransformSync on network destroy");
base.OnNetworkDestroy();
}
public override void OnStartLocalPlayer()
{
DebugLog.ToConsole("onstartlocalplayer of playertransformsync, id of " + PlayerId);
LocalInstance = this;
}

View File

@ -22,6 +22,7 @@ namespace QSB.TransformSync
protected virtual void Awake()
{
DebugLog.ToConsole($"Adding {GetType().Name} of id {netId.Value} to transformsync list.");
PlayerRegistry.TransformSyncs.Add(this);
DontDestroyOnLoad(gameObject);
QSBSceneManager.OnSceneLoaded += OnSceneLoaded;