2020-08-09 12:19:51 +01:00
|
|
|
|
using QSB.Messaging;
|
|
|
|
|
using QSB.Utility;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
using UnityEngine.Networking;
|
|
|
|
|
|
|
|
|
|
namespace QSB.Events
|
|
|
|
|
{
|
2020-08-10 18:17:54 +02:00
|
|
|
|
public class PlayerLeaveEvent : QSBEvent<PlayerLeaveMessage>
|
2020-08-09 12:19:51 +01:00
|
|
|
|
{
|
|
|
|
|
public override MessageType Type => MessageType.PlayerLeave;
|
|
|
|
|
|
|
|
|
|
public override void SetupListener()
|
|
|
|
|
{
|
2020-08-15 21:52:43 +02:00
|
|
|
|
GlobalMessenger<uint, uint[]>.AddListener(EventNames.QSBPlayerLeave, Handler);
|
2020-08-09 12:19:51 +01:00
|
|
|
|
}
|
|
|
|
|
|
2020-08-15 20:32:58 +01:00
|
|
|
|
public override void CloseListener()
|
|
|
|
|
{
|
2020-08-15 21:52:43 +02:00
|
|
|
|
GlobalMessenger<uint, uint[]>.RemoveListener(EventNames.QSBPlayerLeave, Handler);
|
2020-08-15 20:32:58 +01:00
|
|
|
|
}
|
|
|
|
|
|
2020-08-15 21:52:43 +02:00
|
|
|
|
private void Handler(uint id, uint[] objects) => SendEvent(CreateMessage(id, objects));
|
|
|
|
|
|
2020-08-10 18:17:54 +02:00
|
|
|
|
private PlayerLeaveMessage CreateMessage(uint id, uint[] objects) => new PlayerLeaveMessage
|
|
|
|
|
{
|
2020-08-17 16:51:56 +01:00
|
|
|
|
AboutId = id,
|
2020-08-10 18:17:54 +02:00
|
|
|
|
ObjectIds = objects
|
|
|
|
|
};
|
|
|
|
|
|
2020-08-10 14:40:06 +01:00
|
|
|
|
public override void OnReceiveRemote(PlayerLeaveMessage message)
|
2020-08-09 12:19:51 +01:00
|
|
|
|
{
|
2020-08-17 16:51:56 +01:00
|
|
|
|
var playerName = PlayerRegistry.GetPlayer(message.AboutId).Name;
|
|
|
|
|
DebugLog.ToConsole($"{playerName} disconnected.", OWML.Common.MessageType.Info);
|
|
|
|
|
PlayerRegistry.RemovePlayer(message.AboutId);
|
2020-08-09 12:19:51 +01:00
|
|
|
|
foreach (var objectId in message.ObjectIds)
|
|
|
|
|
{
|
|
|
|
|
DestroyObject(objectId);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void DestroyObject(uint objectId)
|
|
|
|
|
{
|
2020-08-17 17:59:13 +01:00
|
|
|
|
var components = Object.FindObjectsOfType<NetworkBehaviour>()
|
|
|
|
|
.Where(x => x.netId.Value == objectId);
|
|
|
|
|
foreach (var component in components)
|
2020-08-09 12:19:51 +01:00
|
|
|
|
{
|
2020-08-17 17:59:13 +01:00
|
|
|
|
if (component == null)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var transformSync = component.GetComponent<TransformSync.TransformSync>();
|
|
|
|
|
|
|
|
|
|
if (transformSync != null)
|
2020-08-17 16:51:56 +01:00
|
|
|
|
{
|
2020-08-17 17:59:13 +01:00
|
|
|
|
PlayerRegistry.TransformSyncs.Remove(transformSync);
|
|
|
|
|
if (transformSync.SyncedTransform != null)
|
|
|
|
|
{
|
|
|
|
|
Object.Destroy(transformSync.SyncedTransform.gameObject);
|
|
|
|
|
}
|
2020-08-17 16:51:56 +01:00
|
|
|
|
}
|
2020-08-17 17:59:13 +01:00
|
|
|
|
Object.Destroy(component.gameObject);
|
2020-08-09 12:19:51 +01:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|