mirror of
https://github.com/misternebula/quantum-space-buddies.git
synced 2025-01-26 18:35:34 +00:00
change authority before client disconnects and wipes stuff out
(fixes #380)
This commit is contained in:
parent
99d0eab098
commit
cb84fcd847
@ -1,4 +1,6 @@
|
||||
using OWML.Common;
|
||||
using System;
|
||||
using System.Linq;
|
||||
using OWML.Common;
|
||||
using OWML.Utils;
|
||||
using QSB.ClientServerStateSync;
|
||||
using QSB.DeathSync;
|
||||
@ -8,13 +10,13 @@ using QSB.Patches;
|
||||
using QSB.Player;
|
||||
using QSB.Player.TransformSync;
|
||||
using QSB.PoolSync;
|
||||
using QSB.ShipSync.TransformSync;
|
||||
using QSB.SuspendableSync;
|
||||
using QSB.TimeSync;
|
||||
using QSB.Utility;
|
||||
using QSB.WorldSync;
|
||||
using QuantumUNET;
|
||||
using QuantumUNET.Components;
|
||||
using System;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Networking;
|
||||
|
||||
@ -157,7 +159,7 @@ namespace QSB
|
||||
if (!QSBCore.IsHost)
|
||||
{
|
||||
QSBCore.UnityEvents.RunWhen(() => QSBEventManager.Ready && PlayerTransformSync.LocalInstance != null,
|
||||
() => QSBEventManager.FireEvent(EventNames.QSBRequestStateResync));
|
||||
() => QSBEventManager.FireEvent(EventNames.QSBRequestStateResync));
|
||||
}
|
||||
|
||||
_everConnected = true;
|
||||
@ -199,24 +201,38 @@ namespace QSB
|
||||
OnClientDisconnected?.SafeInvoke(conn.LastError);
|
||||
}
|
||||
|
||||
public override void OnServerDisconnect(QNetworkConnection connection) // Called on the server when any client disconnects
|
||||
public override void OnServerDisconnect(QNetworkConnection conn) // Called on the server when any client disconnects
|
||||
{
|
||||
base.OnServerDisconnect(connection);
|
||||
DebugLog.DebugWrite("OnServerDisconnect", MessageType.Info);
|
||||
|
||||
// remove authority for orbs
|
||||
foreach (var item in NomaiOrbTransformSync.OrbTransformSyncs)
|
||||
{
|
||||
if (item is null)
|
||||
if (!item)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var identity = item.GetComponent<QNetworkIdentity>();
|
||||
if (identity.ClientAuthorityOwner == connection)
|
||||
var identity = item.NetIdentity;
|
||||
if (identity.ClientAuthorityOwner == conn)
|
||||
{
|
||||
identity.RemoveClientAuthority(connection);
|
||||
identity.RemoveClientAuthority(conn);
|
||||
}
|
||||
}
|
||||
|
||||
// remove authority from ship
|
||||
if (!ShipTransformSync.LocalInstance)
|
||||
{
|
||||
var identity = ShipTransformSync.LocalInstance.NetIdentity;
|
||||
if (identity.ClientAuthorityOwner == conn)
|
||||
{
|
||||
identity.RemoveClientAuthority(conn);
|
||||
}
|
||||
}
|
||||
|
||||
SuspendableManager.OnDisconnect(conn);
|
||||
|
||||
base.OnServerDisconnect(conn);
|
||||
}
|
||||
|
||||
public override void OnStopServer()
|
||||
|
@ -31,7 +31,7 @@ namespace QSB.SuspendableSync
|
||||
return;
|
||||
}
|
||||
|
||||
SuspendableManager.SetSuspended(message.FromId, message.Identity, message.Suspended);
|
||||
SuspendableManager.UpdateSuspended(message.FromId, message.Identity, message.Suspended);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using QSB.Player;
|
||||
using HarmonyLib;
|
||||
using QSB.Utility;
|
||||
using QuantumUNET;
|
||||
using QuantumUNET.Components;
|
||||
@ -12,25 +12,10 @@ namespace QSB.SuspendableSync
|
||||
{
|
||||
private static readonly Dictionary<QNetworkIdentity, List<uint>> _unsuspendedFor = new();
|
||||
|
||||
static SuspendableManager() => QSBPlayerManager.OnRemovePlayer += OnPlayerLeave;
|
||||
|
||||
private static void OnPlayerLeave(uint id)
|
||||
{
|
||||
if (!QSBCore.IsHost)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (var (identity, _) in _unsuspendedFor)
|
||||
{
|
||||
SetSuspended(id, identity, false);
|
||||
}
|
||||
}
|
||||
|
||||
public static void Register(QNetworkIdentity identity) => _unsuspendedFor.Add(identity, new List<uint>());
|
||||
public static void Unregister(QNetworkIdentity identity) => _unsuspendedFor.Remove(identity);
|
||||
|
||||
public static void SetSuspended(uint id, QNetworkIdentity identity, bool suspended)
|
||||
public static void UpdateSuspended(uint id, QNetworkIdentity identity, bool suspended)
|
||||
{
|
||||
var unsuspendedFor = _unsuspendedFor[identity];
|
||||
|
||||
@ -51,7 +36,6 @@ namespace QSB.SuspendableSync
|
||||
|
||||
var newOwner = unsuspendedFor.Count != 0 ? unsuspendedFor[0] : uint.MaxValue;
|
||||
SetAuthority(identity, newOwner);
|
||||
|
||||
}
|
||||
|
||||
private static void SetAuthority(QNetworkIdentity identity, uint id)
|
||||
@ -76,7 +60,22 @@ namespace QSB.SuspendableSync
|
||||
identity.AssignClientAuthority(newConn);
|
||||
}
|
||||
|
||||
DebugLog.DebugWrite($"{QSBPlayerManager.LocalPlayerId}.{identity.NetId}:{identity.gameObject.name} - set authority to {id}");
|
||||
DebugLog.DebugWrite($"{identity.NetId}:{identity.gameObject.name} - set authority to {id}");
|
||||
}
|
||||
|
||||
|
||||
/// transfer authority to a different client
|
||||
public static void OnDisconnect(QNetworkConnection conn)
|
||||
{
|
||||
var id = conn.GetPlayerId();
|
||||
foreach (var (identity, unsuspendedFor) in _unsuspendedFor)
|
||||
{
|
||||
if (unsuspendedFor.Remove(id))
|
||||
{
|
||||
var newOwner = unsuspendedFor.Count != 0 ? unsuspendedFor[0] : uint.MaxValue;
|
||||
SetAuthority(identity, newOwner);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user