using System; using System.Collections.Generic; using System.Threading.Tasks; using AppGame.Sync; using Cysharp.Threading.Tasks; using DotRecast.Core.Collections; using Game.Logic.System; using Google.Protobuf; using JNGame.Network; using JNGame.Sync.State.Tile; using JNGame.Sync.System.Data; using Plugins.JNGame.Network; using Plugins.JNGame.Network.Action; namespace AppGame.Systems.CServer { public partial class JNGServer : JNTCPServer { private int _index = 1; private bool isInit = false; 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)NActionEnum.LocalClientDisconnect,OnLocalClientDisconnect); OnInit_Game(); //连接 await base.OnInit(); } public override void OnClose() { isInit = false; base.OnClose(); } protected override async UniTask GetPort() { return (await App.GAPI.NSyncTilePort).data; } /// /// 接收帧数入 /// /// 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 JNSSTileServerService tileServer) return; var allData = new JNStateTileAllData(); allData.TId = tileServer.TID; allData.Data = new JNStateAllData(); //获取角色 根据角色 返回 全量数据 Roles.TryGetValue(args.Client, out var role); tileServer.GetSystems().ForEach(data => { var item = new JNStateItemData(); allData.Data.Data.Add(item); item.NetID = ((ISStateDataSystem)data).NetID; Dictionary byteData; switch (role) { case JNGClientRole.Player: byteData = data.GetHostDataBytes(); break; case JNGClientRole.SlaveServer: byteData = data.GetHostDataBytesFilterSlave(); break; default: byteData = new (); break; } byteData.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); } /// /// 有客户端断开连接 /// private void OnLocalClientDisconnect(JNServerParam args) { if (App.Game.Server is null) return; //只有绑定过ID 的客户端才可以执行操作 if (!ids.ContainsKey(args.Client)) return; App.Game.Server.GetSystems().ForEach(child => { child.OnPlayerExitServer(ids[args.Client]); }); } } }