mirror of
https://gitee.com/jisol/jisol-game/
synced 2025-06-26 19:34:47 +00:00
169 lines
5.1 KiB
C#
169 lines
5.1 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Threading.Tasks;
|
|
using AppGame.Sync;
|
|
using Cysharp.Threading.Tasks;
|
|
using DotRecast.Core.Collections;
|
|
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);
|
|
|
|
OnInit_Game();
|
|
|
|
//连接
|
|
await base.OnInit();
|
|
}
|
|
|
|
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 的客户端才可以执行操作
|
|
if (!ids.ContainsKey(args.Client)) return;
|
|
inputs.Message.Inputs.ForEach(child =>
|
|
{
|
|
child.ClientId = ids[args.Client];
|
|
});
|
|
App.Game.AddTileInput(inputs);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 返回全量信息
|
|
/// </summary>
|
|
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<ISTileDataSystem>().ForEach(data =>
|
|
{
|
|
|
|
var item = new JNStateItemData();
|
|
allData.Data.Data.Add(item);
|
|
|
|
item.NetID = ((ISStateDataSystem)data).NetID;
|
|
|
|
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 =>
|
|
{
|
|
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);
|
|
|
|
}
|
|
|
|
|
|
}
|
|
} |