using System;
using System.Linq;
using DotRecast.Core.Collections;
using JNGame.Math;
using JNGame.Sync.Entity.Component;
using JNGame.Sync.Frame.Entity;
using JNGame.Sync.Frame.Entity.Component.Components;
using JNGame.Sync.Frame.Entity.Components;
using JNGame.Sync.Frame.Service;
using JNGame.Sync.System;
namespace JNGame.Sync.Entity
{
public interface IJNEntity : IJNSyncCycle,IJNSyncId
{
///
/// 坐标
///
public JNTransformComponent Transform { get; }
///
/// 位置
///
public LVector3 Position { get; }
public IJNContext GetContext();
public T GetComponent() where T : JNComponent;
}
public abstract class JNEntity : Entitas.Entity,IJNEntity,IComparable
{
private long _id;
public long Id => _id;
public IJNContext Context { get; private set; }
//组件Lookup
public JNEntityLookup CLookup{ get; set; }
///
/// 坐标
///
public JNTransformComponent Transform => CLookup.Query(this);
///
/// 位置
///
public LVector3 Position => Transform.Position;
public void OnInit(IJNContext context,long id = 0)
{
Context = context;
_id = id;
if (_id <= 0)
{
_id = GetSystem().NextId();
}
}
public abstract JNEntityLookup NewCLookup();
public T GetSystem() where T : SLogicSystem
{
return Context.GetSync().GetSystem();
}
///
/// 获取组件
///
///
///
public T GetComponent() where T : JNComponent
{
return CLookup.Query(this);
}
///
/// 添加组件
///
///
///
public JNComponent AddComponent() where T : JNComponent,new()
{
int index = CLookup.GetIndex();
var temp = CreateComponent(index);
temp.OnInit(this);
base.AddComponent(index,temp);
temp.OnSyncStart();
return temp;
}
public void RemoveComponent() where T : JNComponent,new()
{
int index = CLookup.GetIndex();
var component = CLookup.Query(this);
component.OnSyncDestroy();
base.RemoveComponent(index);
}
public override void RemoveAllComponents()
{
GetComponents().ForEach(child => (child as JNComponent)?.OnSyncDestroy());
base.RemoveAllComponents();
}
//实现排序实现
public int CompareTo(object obj)
{
if (obj is IJNEntity entity)
{
return Id.CompareTo(entity.Id);
}
return 1;
}
public IJNContext GetContext()
{
return Context;
}
public override void Destroy()
{
OnSyncDestroy();
RemoveAllComponents();
base.Destroy();
}
//生命周期
public virtual void OnSyncStart(){}
public virtual void OnSyncUpdate()
{
//给组件推帧
foreach (var component in GetComponents())
{
(component as JNComponent)?.OnSyncUpdate();
}
}
public virtual void OnSyncDestroy()
{}
}
}