mirror of
https://gitee.com/jisol/jisol-game/
synced 2025-06-26 11:24:46 +00:00
199 lines
5.2 KiB
C#
199 lines
5.2 KiB
C#
|
using System.Collections.Generic;
|
|||
|
using System.Linq;
|
|||
|
using System.Net;
|
|||
|
using System.Threading.Tasks;
|
|||
|
using AppGame.Systems;
|
|||
|
using Game.Input;
|
|||
|
using Game.JNGFrame.View;
|
|||
|
using Game.JNGState.Logic.Data;
|
|||
|
using JNGame.Math;
|
|||
|
using JNGame.Sync.State.Tile;
|
|||
|
using JNGame.Sync.System;
|
|||
|
using JNGame.Sync.System.Data;
|
|||
|
using JNGame.Util;
|
|||
|
using Plugins.JNGame.Network.Action;
|
|||
|
using UnityEngine;
|
|||
|
|
|||
|
namespace AppGame.Sync
|
|||
|
{
|
|||
|
public class JNGTileClientSystem : JNSSTileClientService
|
|||
|
{
|
|||
|
|
|||
|
//区块Socket
|
|||
|
public Dictionary<int, JNGClient> Sockets = new ();
|
|||
|
|
|||
|
//玩家位置
|
|||
|
public LVector3? PlayerPos;
|
|||
|
|
|||
|
public override void Initialize()
|
|||
|
{
|
|||
|
base.Initialize();
|
|||
|
//默认玩家位置
|
|||
|
SetPlayerPosition(LVector3.Zero);
|
|||
|
|
|||
|
//定时更新Socket
|
|||
|
Timers.Instance.SetInterval(1f, UpdateTileSocket);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
protected override int[][] Tiles => new[]
|
|||
|
{
|
|||
|
new[] { 1, 2, 3 },
|
|||
|
new[] { 4, 5, 6 },
|
|||
|
new[] { 7, 8, 9 },
|
|||
|
};
|
|||
|
|
|||
|
protected override int TileSize => 100;
|
|||
|
|
|||
|
public override SLogicSystem[] NewLogicSystems()
|
|||
|
{
|
|||
|
return new SLogicSystem[]
|
|||
|
{
|
|||
|
|
|||
|
//基础数据
|
|||
|
new DInputSystem(), //游戏输入
|
|||
|
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
public override SDataSystemBase[] NewDataSystems()
|
|||
|
{
|
|||
|
return new SDataSystemBase[] {
|
|||
|
new EDNodeDataSystem(SStateDataEnum.Client), //游戏数据
|
|||
|
new EDPlayerDataSystem(SStateDataEnum.Client), //游戏数据
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
public override SViewSystem[] NewViewSystems()
|
|||
|
{
|
|||
|
return new SViewSystem[]
|
|||
|
{
|
|||
|
//视图层
|
|||
|
new DViewSystem(), //游戏视图
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
protected override void OnRunSimulate()
|
|||
|
{
|
|||
|
//更新玩家位置
|
|||
|
UpdatePlayerPosition();
|
|||
|
|
|||
|
base.OnRunSimulate();
|
|||
|
//发送输入
|
|||
|
OnSendInput();
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 发送输入 (正常服务器是不需要发送输入的 这里用于测试)
|
|||
|
/// </summary>
|
|||
|
private void OnSendInput()
|
|||
|
{
|
|||
|
var inputs = GetSystem<DInputSystem>().Dequeue();
|
|||
|
if (inputs.Inputs.Count > 0)
|
|||
|
{
|
|||
|
//发送帧数据给服务端
|
|||
|
JNStateTileInputs tileInputs = new JNStateTileInputs()
|
|||
|
{
|
|||
|
TId = 0,
|
|||
|
Message = inputs
|
|||
|
};
|
|||
|
App.Client.Send((int)NActionEnum.NSyncTileInput,tileInputs);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 设置玩家位置
|
|||
|
/// </summary>
|
|||
|
public void SetPlayerPosition(LVector3 pos)
|
|||
|
{
|
|||
|
PlayerPos = pos;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 更新玩家位置
|
|||
|
/// </summary>
|
|||
|
public void UpdatePlayerPosition()
|
|||
|
{
|
|||
|
if (PlayerPos is null) return;
|
|||
|
|
|||
|
List<int> ids = GetTileGridIndex(PlayerPos.Value);
|
|||
|
|
|||
|
ids.ForEach(AddTileShow);
|
|||
|
TileShow.ForEach(id =>
|
|||
|
{
|
|||
|
if (!(ids.Contains(id)))
|
|||
|
{
|
|||
|
RemoveTileShow(id);
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 更新区块Socket
|
|||
|
/// </summary>
|
|||
|
public void UpdateTileSocket()
|
|||
|
{
|
|||
|
TileShow.ForEach(index =>
|
|||
|
{
|
|||
|
if (!IsTileConnect(index))
|
|||
|
{
|
|||
|
AddSocket(index);
|
|||
|
}
|
|||
|
});
|
|||
|
var keysToRemove = Sockets.Keys.Where(key => !TileShow.Contains(key)).ToList();
|
|||
|
foreach (var key in keysToRemove)
|
|||
|
{
|
|||
|
RemoveSocket(key);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 判断是否当前区块是否连接
|
|||
|
/// </summary>
|
|||
|
/// <param name="index"></param>
|
|||
|
/// <returns></returns>
|
|||
|
public bool IsTileConnect(int index)
|
|||
|
{
|
|||
|
return Sockets.ContainsKey(index);
|
|||
|
}
|
|||
|
|
|||
|
protected async Task AddSocket(int index)
|
|||
|
{
|
|||
|
if (IsTileConnect(index)) return;
|
|||
|
|
|||
|
var client = new JNGClient();
|
|||
|
Sockets.Add(index,client);
|
|||
|
|
|||
|
//获取连接
|
|||
|
var message = (await App.GAPI.NSyncTileServer(index));
|
|||
|
TileServerInfo info = message.data;
|
|||
|
if (info is not null)
|
|||
|
{
|
|||
|
client.SetPoint(new IPEndPoint(IPAddress.Parse(info.ip),info.port));
|
|||
|
|
|||
|
if (IsTileConnect(index))
|
|||
|
{
|
|||
|
App.Client.AddClient(client);
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
Sockets.Remove(index);
|
|||
|
Debug.Log("获取连接失败");
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
protected void RemoveSocket(int index)
|
|||
|
{
|
|||
|
if (Sockets.TryGetValue(index,out var client))
|
|||
|
{
|
|||
|
App.Client.RemoveClient(client);
|
|||
|
}
|
|||
|
Sockets.Remove(index);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|