using System; using System.Collections.Generic; using System.Text; using DotRecast.Core.Collections; using Entitas; using Game.JNGFrame.Logic.Entity; using Game.JNGFrame.Logic.Entity.Contexts; using JNGame.Math; using JNGame.Sync.State.Tile.Entity; using JNGame.Sync.System; using JNGame.Sync.System.Data; using Newtonsoft.Json; using UnityEngine; namespace Game.JNGState.Logic.Data { [Serializable] public class EDNodeValue { public DValuePosition Position = null; } public class EDNodeData : ISTileData { public readonly EDNodeValue Value = new (); private readonly EDNode _data; public override bool IsHost => _data is not null && _data.IsHost; public EDNodeData() { } public EDNodeData(EDNode node){ Id = node.Id; Value.Position = new DValuePosition() { x = node.Position.x.rawValue, y = node.Position.y.rawValue, z = node.Position.z.rawValue, }; _data = node; } public override bool IsEquals(ISData data) { var node = data as EDNodeData; if (node is null) return false; return Value.Position.Equals(node.Value.Position); } public override byte[] GetByte() { return Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(Value)); } public override byte[] GetByteDifference(ISData diffValue = null) { var diff = diffValue as EDNodeData; if (diff is null || IsEquals(diffValue)) return Array.Empty(); var value = new EDNodeValue(); if (diff.Value.Position is not null) value.Position = diff.Value.Position; return Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(value)); } /// /// 生效字节 /// /// /// public override void UByte(byte[] bytes) { if (bytes.Length == 0) return; var value = JsonConvert.DeserializeObject(Encoding.UTF8.GetString(bytes)); if (value.Position is not null) Value.Position = value.Position; } } public class EDNodeDataSystem : DStateDataSystem { public EDNodeDataSystem(SStateDataEnum type) : base(type) { } public override JNTileContext NodeContext => Contexts.GetContext(); public override int NetID => (int)NetDataEnum.EDNodeData; public override Dictionary GetLatest() { var nodes = new Dictionary(); NodeContext.GetEntities().ForEach(child => { nodes.Add(child.Id,new EDNodeData(child)); }); return nodes; } } }