Files
ServerStudy/聊天系统课程代码/Server/Hotfix/Share/System/EntityTimeoutComponentSystem.cs
2026-03-05 11:39:06 +08:00

50 lines
1.3 KiB
C#

// ReSharper disable ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract
using Fantasy.Entitas.Interface;
namespace Fantasy;
public sealed class EntityTimeoutComponentDestroySystem : DestroySystem<EntityTimeoutComponent>
{
protected override void Destroy(EntityTimeoutComponent self)
{
self.CancelTimeout();
}
}
public static class EntityTimeoutComponentSystem
{
// 这个组件会挂载到目标组件上
// 当这个组件的超时时间到了,会自动销毁这个组件的父亲
public static void SetTimeout(this EntityTimeoutComponent self, int time)
{
var selfParent = self.Parent;
if (selfParent == null)
{
Log.Error("EntityTimeoutComponent's parent is null.");
return;
}
var selfParentRunTimeId = selfParent.RunTimeId;
self.TimerId = self.Scene.TimerComponent.Net.OnceTimer(time, () =>
{
if (selfParent.RunTimeId != selfParentRunTimeId)
{
return;
}
self.TimerId = 0;
selfParent.Dispose();
});
}
public static void CancelTimeout(this EntityTimeoutComponent self)
{
if (self.TimerId == 0)
{
return;
}
self.Scene.TimerComponent.Net.Remove(ref self.TimerId);
}
}