using System.Collections.Generic; using DotRecast.Core.Collections; using JNGame.Sync.Entity; using JNGame.Sync.Frame.Entity.Components; using JNGame.Sync.State.Tile; using JNGame.Sync.State.Tile.Entity; namespace JNGame.Sync.System.Data { public abstract class ISTileData : ISStateData { public abstract bool IsHost { get; } } /// /// 支持区块的数据类 /// public abstract class STileDataSystem : SStateDataSystem where T : ISTileData,new() where E : JNTileEntity, new() { public abstract JNTileContext NodeContext { get; } protected STileDataSystem(SStateDataEnum type) : base(type) { } public override void OnUByteUpdate(Dictionary bytes) { base.OnUByteUpdate(bytes); if (isServer) { OnDataSyncContext(); } } /// /// 将数据Data同步到Context /// protected virtual void OnDataSyncContext() { var lIsTileData = new Dictionary(Data); NodeContext.GetEntities().ForEach(child => { //如果有则删除 if (lIsTileData.Remove(child.Id,out var data)) { //同步不属于自己的实体 if (!child.IsHost) { //并且同步属性到实体中 child.TileSyncData(data); } } }); //将数据同步到实体中 foreach (var keyValue in lIsTileData) { var entity = NodeContext.TileSyncCreate(keyValue.Key); entity.TileSyncData(keyValue.Value); } } //只更新有权限的实体 public override void Update(T data) { if (!data.IsHost) return; base.Update(data); } public override void Add(T data) { if (!data.IsHost) return; base.Add(data); } } }