mirror of
https://github.com/misternebula/quantum-space-buddies.git
synced 2025-02-20 15:41:01 +00:00
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:
parent
d762d35f56
commit
f239acd724
@ -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()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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
56
QSB/Events/PlayerLeave.cs
Normal 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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
@ -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" />
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user