190 lines
5.7 KiB
C#
Raw Permalink Normal View History

2024-08-17 14:27:18 +08:00
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
2024-08-22 20:37:39 +08:00
using AppGame.Sync;
2024-08-17 14:27:18 +08:00
using Cysharp.Threading.Tasks;
using DotRecast.Core.Collections;
2024-09-23 03:50:27 +08:00
using Game.Logic.System;
2024-08-22 20:37:39 +08:00
using Google.Protobuf;
2024-08-17 14:27:18 +08:00
using JNGame.Network;
2024-08-31 15:35:12 +08:00
using JNGame.Sync.State.Tile;
2024-08-22 20:37:39 +08:00
using JNGame.Sync.System.Data;
2024-08-17 14:27:18 +08:00
using Plugins.JNGame.Network;
using Plugins.JNGame.Network.Action;
2024-08-31 15:35:12 +08:00
namespace AppGame.Systems.CServer
2024-08-17 14:27:18 +08:00
{
2024-08-31 15:35:12 +08:00
public partial class JNGServer : JNTCPServer
2024-08-17 14:27:18 +08:00
{
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);
2024-08-22 20:37:39 +08:00
AddListener((int)NActionEnum.NSyncTileAllUpdate,OnNSyncTileAllUpdate);
AddListener((int)NActionEnum.NSyncTileGetTileInfo,OnNSyncTileGetTileInfo);
2024-09-23 03:50:27 +08:00
AddListener((int)NActionEnum.LocalClientDisconnect,OnLocalClientDisconnect);
2024-08-31 15:35:12 +08:00
OnInit_Game();
2024-08-17 14:27:18 +08:00
//连接
await base.OnInit();
}
2024-09-23 03:50:27 +08:00
2024-08-17 14:27:18 +08:00
public override void OnClose()
{
isInit = false;
base.OnClose();
}
protected override async UniTask<int> GetPort()
{
return (await App.GAPI.NSyncTilePort).data;
}
/// <summary>
/// 接收帧数入
/// </summary>
/// <param name="args"></param>
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);
}
/// <summary>
/// 接收瓦片输入
/// </summary>
/// <param name="args"></param>
private void OnNSyncTileInput(JNServerParam args)
{
var inputs = JNStateTileInputs.Parser.ParseFrom(args.Message);
//只有绑定过ID 的客户端才可以执行操作
2024-08-19 11:51:17 +08:00
if (!ids.ContainsKey(args.Client)) return;
2024-08-17 14:27:18 +08:00
inputs.Message.Inputs.ForEach(child =>
{
2024-08-19 11:51:17 +08:00
child.ClientId = ids[args.Client];
2024-08-17 14:27:18 +08:00
});
App.Game.AddTileInput(inputs);
}
2024-08-22 20:37:39 +08:00
/// <summary>
/// 返回全量信息
/// </summary>
private void OnNSyncTileAllUpdate(JNServerParam args)
{
2024-08-31 15:35:12 +08:00
if (App.Game.Server is not JNSSTileServerService tileServer) return;
2024-08-22 20:37:39 +08:00
var allData = new JNStateTileAllData();
allData.TId = tileServer.TID;
allData.Data = new JNStateAllData();
2024-08-31 15:35:12 +08:00
//获取角色 根据角色 返回 全量数据
Roles.TryGetValue(args.Client, out var role);
2024-08-22 20:37:39 +08:00
tileServer.GetSystems<ISTileDataSystem>().ForEach(data =>
{
var item = new JNStateItemData();
allData.Data.Data.Add(item);
item.NetID = ((ISStateDataSystem)data).NetID;
2024-08-31 15:35:12 +08:00
Dictionary<ulong, byte[]> byteData;
switch (role)
{
case JNGClientRole.Player:
byteData = data.GetHostDataBytes();
break;
case JNGClientRole.SlaveServer:
byteData = data.GetHostDataBytesFilterSlave();
break;
default:
byteData = new ();
break;
}
byteData.ForEach(keyValue =>
2024-08-22 20:37:39 +08:00
{
item.Messages[keyValue.Key] = new JNStateData() { Data = ByteString.CopyFrom(keyValue.Value) };
});
});
Send(args.Client, (int)NActionEnum.NSyncTileAllUpdateBack,allData);
}
/// <summary>
/// 获取指定区块的全量信息
/// </summary>
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<ISTileDataSystem>().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);
}
2024-08-17 14:27:18 +08:00
2024-09-23 03:50:27 +08:00
/// <summary>
/// 有客户端断开连接
/// </summary>
private void OnLocalClientDisconnect(JNServerParam args)
{
if (App.Game.Server is null) return;
//只有绑定过ID 的客户端才可以执行操作
if (!ids.ContainsKey(args.Client)) return;
App.Game.Server.GetSystems<DGBasisSystem>().ForEach(child =>
{
child.OnPlayerExitServer(ids[args.Client]);
});
}
2024-08-17 14:27:18 +08:00
}
}