cleanup after disconnected players (#62)

* * removed need for NetPlayer
* split JoinPlayer into JoinPlayer and LeavePlayer
* cleanup of player and ship in LeavePlayer

* null checks in anim mirror

* it kinda works

* resetting some more stuff when DCing

* cleaning up ship

* removed some unused code

* cleanup

* cleaning up all client owned objects

* resetting (mostly) anim stuff when leaving

* setting local instance on player transform sync right away

Co-authored-by: Ricardo Lopes <Raicuparta@users.noreply.github.com>
This commit is contained in:
AmazingAlek 2020-03-07 16:42:43 +01:00 committed by GitHub
parent d762d35f56
commit f239acd724
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 99 additions and 64 deletions

View File

@ -1,9 +1,26 @@
using QSB.Messaging;
using System;
using System.Linq;
using QSB.Messaging;
using UnityEngine.Networking;
namespace QSB.Events
{
public class LeaveMessage : NameMessage
{
public override MessageType MessageType => MessageType.Leave;
public uint[] ObjectIds { get; set; }
public override void Deserialize(NetworkReader reader)
{
base.Deserialize(reader);
ObjectIds = reader.ReadString().Split(',').Select(x => Convert.ToUInt32(x)).ToArray();
}
public override void Serialize(NetworkWriter writer)
{
base.Serialize(writer);
writer.Write(string.Join(",", ObjectIds.Select(x => x.ToString()).ToArray()));
}
}
}

View File

@ -1,6 +1,7 @@
using System.Collections;
using System.Collections.Generic;
using QSB.Messaging;
using QSB.TransformSync;
using UnityEngine;
using UnityEngine.Networking;
@ -12,17 +13,12 @@ namespace QSB.Events
public static string MyName { get; private set; }
private MessageHandler<JoinMessage> _joinHandler;
private MessageHandler<LeaveMessage> _leaveHandler;
private void Awake()
{
_joinHandler = new MessageHandler<JoinMessage>();
_joinHandler.OnClientReceiveMessage += OnClientReceiveMessage;
_joinHandler.OnServerReceiveMessage += OnServerReceiveMessage;
_leaveHandler = new MessageHandler<LeaveMessage>();
_leaveHandler.OnClientReceiveMessage += OnClientReceiveMessage;
_leaveHandler.OnServerReceiveMessage += OnServerReceiveMessage;
}
public void Join(string playerName)
@ -33,25 +29,15 @@ namespace QSB.Events
private IEnumerator SendJoinMessage(string playerName)
{
yield return new WaitUntil(() => NetPlayer.LocalInstance != null);
yield return new WaitUntil(() => PlayerTransformSync.LocalInstance != null);
var message = new JoinMessage
{
PlayerName = playerName,
SenderId = NetPlayer.LocalInstance.netId.Value
SenderId = PlayerTransformSync.LocalInstance.netId.Value
};
_joinHandler.SendToServer(message);
}
public void Leave(uint playerId) // called by server
{
var message = new LeaveMessage
{
PlayerName = PlayerNames[playerId],
SenderId = playerId
};
_leaveHandler.SendToAll(message);
}
private void OnServerReceiveMessage(JoinMessage message)
{
_joinHandler.SendToAll(message);
@ -63,19 +49,5 @@ namespace QSB.Events
DebugLog.All(message.PlayerName, "joined!");
}
private void OnServerReceiveMessage(LeaveMessage message)
{
_leaveHandler.SendToAll(message);
}
private void OnClientReceiveMessage(LeaveMessage message)
{
if (PlayerNames.ContainsKey(message.SenderId))
{
PlayerNames.Remove(message.SenderId);
}
DebugLog.All(message.PlayerName, "left");
}
}
}

56
QSB/Events/PlayerLeave.cs Normal file
View File

@ -0,0 +1,56 @@
using System.Linq;
using QSB.Messaging;
using UnityEngine;
using UnityEngine.Networking;
namespace QSB.Events
{
public class PlayerLeave : NetworkBehaviour
{
private MessageHandler<LeaveMessage> _leaveHandler;
private void Awake()
{
_leaveHandler = new MessageHandler<LeaveMessage>();
_leaveHandler.OnClientReceiveMessage += OnClientReceiveMessage;
}
public void Leave(uint playerId, uint[] objectIds)
{
var message = new LeaveMessage
{
PlayerName = PlayerJoin.PlayerNames[playerId],
SenderId = playerId,
ObjectIds = objectIds
};
_leaveHandler.SendToAll(message);
}
private void OnClientReceiveMessage(LeaveMessage message)
{
DebugLog.All(message.PlayerName, "left");
PlayerJoin.PlayerNames.Remove(message.SenderId);
foreach (var objectId in message.ObjectIds)
{
DestroyObject(objectId);
}
}
private void DestroyObject(uint objectId)
{
var component = GameObject.FindObjectsOfType<NetworkBehaviour>()
.FirstOrDefault(x => x.netId.Value == objectId);
if (component == null)
{
return;
}
var transformSync = component.GetComponent<TransformSync.TransformSync>();
if (transformSync != null)
{
Destroy(transformSync.SyncedTransform.gameObject);
}
Destroy(component.gameObject);
}
}
}

View File

@ -1,14 +0,0 @@
using UnityEngine.Networking;
namespace QSB
{
public class NetPlayer : NetworkBehaviour
{
public static NetPlayer LocalInstance { get; private set; }
public override void OnStartLocalPlayer()
{
LocalInstance = this;
}
}
}

View File

@ -108,7 +108,7 @@
<Compile Include="Animation\AnimTrigger.cs" />
<Compile Include="Events\JoinMessage.cs" />
<Compile Include="Events\LeaveMessage.cs" />
<Compile Include="NetPlayer.cs" />
<Compile Include="Events\PlayerLeave.cs" />
<Compile Include="DebugLog.cs" />
<Compile Include="Events\DeathMessage.cs" />
<Compile Include="Events\PlayerJoin.cs" />

View File

@ -50,7 +50,6 @@ namespace QSB
playerPrefab.AddComponent<PlayerTransformSync>();
playerPrefab.AddComponent<AnimationSync>();
playerPrefab.AddComponent<WakeUpSync>();
playerPrefab.AddComponent<NetPlayer>();
_shipPrefab = _assetBundle.LoadAsset<GameObject>("assets/networkship.prefab");
_shipPrefab.AddComponent<ShipTransformSync>();
@ -102,6 +101,7 @@ namespace QSB
DebugLog.Screen("OnClientConnect");
gameObject.AddComponent<SectorSync>();
gameObject.AddComponent<PlayerJoin>().Join(_playerName);
gameObject.AddComponent<PlayerLeave>();
_canEditName = false;
}
@ -111,6 +111,7 @@ namespace QSB
DebugLog.Screen("OnStopClient");
Destroy(GetComponent<SectorSync>());
Destroy(GetComponent<PlayerJoin>());
Destroy(GetComponent<PlayerLeave>());
PlayerTransformSync.LocalInstance.gameObject.GetComponent<AnimationSync>().Reset();
_canEditName = true;
@ -120,8 +121,9 @@ namespace QSB
{
DebugLog.Screen("OnServerDisconnect");
var playerId = conn.playerControllers[0].gameObject.GetComponent<NetPlayer>().netId.Value;
GetComponent<PlayerJoin>().Leave(playerId);
var playerId = conn.playerControllers[0].gameObject.GetComponent<PlayerTransformSync>().netId.Value;
var objectIds = conn.clientOwnedObjects.Select(x => x.Value).ToArray();
GetComponent<PlayerLeave>().Leave(playerId, objectIds);
base.OnServerDisconnect(conn);
}

View File

@ -2,6 +2,7 @@
using OWML.ModHelper.Events;
using QSB.Events;
using QSB.Messaging;
using QSB.TransformSync;
using UnityEngine;
namespace QSB.TimeSync
@ -156,7 +157,7 @@ namespace QSB.TimeSync
var message = new DeathMessage
{
PlayerName = PlayerJoin.MyName,
SenderId = NetPlayer.LocalInstance.netId.Value,
SenderId = PlayerTransformSync.LocalInstance.netId.Value,
DeathId = (short)deathType
};
_instance._deathHandler.SendToServer(message);

View File

@ -12,7 +12,7 @@ namespace QSB.TransformSync
private Dictionary<uint, Transform> _playerSectors;
private Sector[] _allSectors;
private MessageHandler<SectorMessage> _sectorHandler;
private readonly Sector.Name[] sectorWhitelist = new Sector.Name[]{
private readonly Sector.Name[] _sectorWhitelist = {
Sector.Name.BrambleDimension,
Sector.Name.BrittleHollow,
Sector.Name.Comet,
@ -110,7 +110,7 @@ namespace QSB.TransformSync
{
private static void PreAddSector(Sector sector, DynamicOccupant ____occupantType)
{
if (!Instance.sectorWhitelist.Contains(sector.GetName()))
if (!Instance._sectorWhitelist.Contains(sector.GetName()))
{
return;
}

View File

@ -8,7 +8,8 @@ namespace QSB.TransformSync
private const float SmoothTime = 0.1f;
private static bool _isAwake;
private Transform _syncedTransform;
public Transform SyncedTransform { get; private set; }
private bool _isSectorSetUp;
private Vector3 _positionSmoothVelocity;
private Quaternion _rotationSmoothVelocity;
@ -36,10 +37,10 @@ namespace QSB.TransformSync
Invoke(nameof(SetFirstSector), 1);
transform.parent = Locator.GetRootTransform();
_syncedTransform = hasAuthority ? InitLocalTransform() : InitRemoteTransform();
SyncedTransform = hasAuthority ? InitLocalTransform() : InitRemoteTransform();
if (!hasAuthority)
{
_syncedTransform.position = Locator.GetAstroObject(AstroObject.Name.Sun).transform.position;
SyncedTransform.position = Locator.GetAstroObject(AstroObject.Name.Sun).transform.position;
}
}
@ -56,7 +57,7 @@ namespace QSB.TransformSync
private void Update()
{
if (!_syncedTransform || !_isSectorSetUp)
if (!SyncedTransform || !_isSectorSetUp)
{
return;
}
@ -65,21 +66,21 @@ namespace QSB.TransformSync
if (hasAuthority)
{
transform.position = sectorTransform.InverseTransformPoint(_syncedTransform.position);
transform.rotation = sectorTransform.InverseTransformRotation(_syncedTransform.rotation);
transform.position = sectorTransform.InverseTransformPoint(SyncedTransform.position);
transform.rotation = sectorTransform.InverseTransformRotation(SyncedTransform.rotation);
}
else
{
if (_syncedTransform.position == Vector3.zero)
if (SyncedTransform.position == Vector3.zero)
{
_syncedTransform.position = Locator.GetAstroObject(AstroObject.Name.Sun).transform.position;
SyncedTransform.position = Locator.GetAstroObject(AstroObject.Name.Sun).transform.position;
}
else
{
_syncedTransform.parent = sectorTransform;
SyncedTransform.parent = sectorTransform;
_syncedTransform.localPosition = Vector3.SmoothDamp(_syncedTransform.localPosition, transform.position, ref _positionSmoothVelocity, SmoothTime);
_syncedTransform.localRotation = QuaternionHelper.SmoothDamp(_syncedTransform.localRotation, transform.rotation, ref _rotationSmoothVelocity, Time.deltaTime);
SyncedTransform.localPosition = Vector3.SmoothDamp(SyncedTransform.localPosition, transform.position, ref _positionSmoothVelocity, SmoothTime);
SyncedTransform.localRotation = QuaternionHelper.SmoothDamp(SyncedTransform.localRotation, transform.rotation, ref _rotationSmoothVelocity, Time.deltaTime);
}
}
}