raft: make SetDock async

This commit is contained in:
JohnCorby 2022-03-11 07:04:58 -08:00
parent cd42606d3b
commit 07fc30f9d5
3 changed files with 45 additions and 4 deletions

View File

@ -10,5 +10,5 @@ public class RaftSetDockMessage : QSBWorldObjectMessage<QSBRaft, int>
base(raftCarrier != null ? raftCarrier.GetWorldObject<IQSBRaftCarrier>().ObjectId : -1) { }
public override void OnReceiveRemote() =>
WorldObject.SetDock(Data != -1 ? Data.GetWorldObject<IQSBRaftCarrier>() : null);
WorldObject.SetDock(Data != -1 ? Data.GetWorldObject<IQSBRaftCarrier>() : null).Forget();
}

View File

@ -21,6 +21,8 @@ public class QSBRaft : WorldObject<RaftController>
private QSBLightSensor[] _lightSensors;
private readonly CancellationTokenSource _cts = new();
public override async UniTask Init(CancellationToken ct)
{
if (QSBCore.IsHost)
@ -50,6 +52,8 @@ public class QSBRaft : WorldObject<RaftController>
{
lightSensor.OnDetectLocalLight -= OnDetectLocalLight;
}
_cts.Cancel();
}
private void OnDetectLocalLight()
@ -63,8 +67,25 @@ public class QSBRaft : WorldObject<RaftController>
public override void SendInitialState(uint to) =>
this.SendMessage(new RaftSetDockMessage(AttachedObject._dock));
public void SetDock(IQSBRaftCarrier qsbRaftCarrier)
public async UniTaskVoid SetDock(IQSBRaftCarrier qsbRaftCarrier)
{
if (qsbRaftCarrier?.AttachedObject == AttachedObject._dock)
{
return;
}
DebugLog.DebugWrite($"TODO: {this} dock = {qsbRaftCarrier}");
// undock from current dock
if (AttachedObject._dock != null)
{
await AttachedObject._dock.GetWorldObject<IQSBRaftCarrier>().Undock(this, _cts.Token);
}
// dock to new dock
if (qsbRaftCarrier != null)
{
await qsbRaftCarrier.Dock(this, _cts.Token);
}
}
}

View File

@ -1,4 +1,8 @@
using QSB.WorldSync;
using Cysharp.Threading.Tasks;
using QSB.Utility;
using QSB.WorldSync;
using System;
using System.Threading;
namespace QSB.EchoesOfTheEye.RaftSync.WorldObjects;
@ -8,6 +12,22 @@ public abstract class QSBRaftCarrier<T> : WorldObject<T>, IQSBRaftCarrier where
{
// todo SendInitialState
}
public async UniTask Undock(QSBRaft qsbRaft, CancellationToken ct)
{
DebugLog.DebugWrite($"TODO: {this} undock {qsbRaft}");
await UniTask.Delay(TimeSpan.FromSeconds(3), cancellationToken: ct);
}
public async UniTask Dock(QSBRaft qsbRaft, CancellationToken ct)
{
DebugLog.DebugWrite($"TODO: {this} undock {qsbRaft}");
await UniTask.Delay(TimeSpan.FromSeconds(3), cancellationToken: ct);
}
}
public interface IQSBRaftCarrier : IWorldObject { }
public interface IQSBRaftCarrier : IWorldObject
{
UniTask Undock(QSBRaft qsbRaft, CancellationToken ct);
UniTask Dock(QSBRaft qsbRaft, CancellationToken ct);
}