using System; using System.Collections.Generic; using System.Net.Sockets; using System.Threading.Tasks; using AppGame.Sync; using Cysharp.Threading.Tasks; using DotRecast.Core.Collections; using Google.Protobuf; using JNGame.Network; using JNGame.Sync.System; using JNGame.Sync.System.Data; using Plugins.JNGame.Network; using Plugins.JNGame.Network.Action; namespace AppGame.Systems { public class JNGServer : JNTCPServer { private int _index = 1; private bool isInit = false; //客户端绑定的Id private Dictionary ids = new(); public override async Task OnInit() { if (isInit) return; isInit = true; //监听服务端事件 AddListener((int)NActionEnum.NSyncFrameInput,OnNSyncFrameInput); AddListener((int)NActionEnum.NSyncTileInput,OnNSyncTileInput); AddListener((int)NActionEnum.NSyncTileAllUpdate,OnNSyncTileAllUpdate); AddListener((int)NActionEnum.NSyncTileGetTileInfo,OnNSyncTileGetTileInfo); AddListener((int)GActionEnum.BindClientID,OnBindClientID); //连接 await base.OnInit(); } public override void OnClose() { isInit = false; base.OnClose(); } protected override async UniTask GetPort() { return (await App.GAPI.NSyncTilePort).data; } /// /// 绑定客户端Id /// /// /// private void OnBindClientID(JNServerParam args) { var message = RClientIDMessage.Parser.ParseFrom(args.Message); ids[args.Client] = message.ClientId; } /// /// 接收帧数入 /// /// private void OnNSyncFrameInput(JNServerParam args) { var inputs = JNFrameInputs.Parser.ParseFrom(args.Message); var frame = new JNFrameInfo(); frame.Index = 0; foreach (var input in inputs.Inputs) { frame.Messages.Add(input); } App.Game.AddInput(frame); } /// /// 接收瓦片输入 /// /// private void OnNSyncTileInput(JNServerParam args) { var inputs = JNStateTileInputs.Parser.ParseFrom(args.Message); //只有绑定过ID 的客户端才可以执行操作 if (!ids.ContainsKey(args.Client)) return; inputs.Message.Inputs.ForEach(child => { child.ClientId = ids[args.Client]; }); App.Game.AddTileInput(inputs); } /// /// 返回全量信息 /// private void OnNSyncTileAllUpdate(JNServerParam args) { if (App.Game.Server is not JNGTileServerSystem tileServer) return; var allData = new JNStateTileAllData(); allData.TId = tileServer.TID; allData.Data = new JNStateAllData(); tileServer.GetSystems().ForEach(data => { var item = new JNStateItemData(); allData.Data.Data.Add(item); item.NetID = ((ISStateDataSystem)data).NetID; data.GetHostDataBytes().ForEach(keyValue => { item.Messages[keyValue.Key] = new JNStateData() { Data = ByteString.CopyFrom(keyValue.Value) }; }); }); Send(args.Client, (int)NActionEnum.NSyncTileAllUpdateBack,allData); } /// /// 获取指定区块的全量信息 /// private void OnNSyncTileGetTileInfo(JNServerParam args) { if (App.Game.Server is not JNGTileServerSystem tileServer) return; var tileSpecify = NSyncTileGetTileInfoRequest.Parser.ParseFrom(args.Message); var allData = new JNStateTileAllData(); allData.TId = tileServer.TID; allData.Data = new JNStateAllData(); tileServer.GetSystems().ForEach(data => { var item = new JNStateItemData(); allData.Data.Data.Add(item); item.NetID = ((ISStateDataSystem)data).NetID; data.GetTileDataBytes(tileSpecify.TId).ForEach(keyValue => { item.Messages[keyValue.Key] = new JNStateData() { Data = ByteString.CopyFrom(keyValue.Value) }; }); }); //返回消息 SendCallback(args.Client,args.MessageID,allData); } } }