mirror of
https://github.com/Alex-Rachel/TEngine.git
synced 2025-08-14 16:51:28 +00:00
[+] 接入ET8服务端
[+] 接入ET8服务端
This commit is contained in:
@@ -0,0 +1,19 @@
|
||||
namespace ET.Server
|
||||
{
|
||||
[ActorMessageHandler(SceneType.RoomRoot)]
|
||||
public class C2Room_CheckHashHandler: ActorMessageHandler<Scene, C2Room_CheckHash>
|
||||
{
|
||||
protected override async ETTask Run(Scene root, C2Room_CheckHash message)
|
||||
{
|
||||
Room room = root.GetComponent<Room>();
|
||||
long hash = room.FrameBuffer.GetHash(message.Frame);
|
||||
if (message.Hash != hash)
|
||||
{
|
||||
byte[] bytes = room.FrameBuffer.Snapshot(message.Frame).ToArray();
|
||||
Room2C_CheckHashFail room2CCheckHashFail = new() { Frame = message.Frame, LSWorldBytes = bytes };
|
||||
room.Root().GetComponent<ActorLocationSenderComponent>().Get(LocationType.GateSession).Send(message.PlayerId, room2CCheckHashFail);
|
||||
}
|
||||
await ETTask.CompletedTask;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8f87c1aa12fde40b5afda6ea778cfdf4
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,25 @@
|
||||
using System.Net;
|
||||
|
||||
namespace ET.Server
|
||||
{
|
||||
[Invoke((long)SceneType.RoomRoot)]
|
||||
public class FiberInit_RoomRoot: AInvokeHandler<FiberInit, ETTask>
|
||||
{
|
||||
public override async ETTask Handle(FiberInit fiberInit)
|
||||
{
|
||||
Scene root = fiberInit.Fiber.Root;
|
||||
root.AddComponent<MailBoxComponent, MailBoxType>(MailBoxType.UnOrderedMessage);
|
||||
root.AddComponent<TimerComponent>();
|
||||
root.AddComponent<CoroutineLockComponent>();
|
||||
root.AddComponent<ActorInnerComponent>();
|
||||
root.AddComponent<ActorSenderComponent>();
|
||||
Room room = root.AddChild<Room>();
|
||||
root.AddComponent<LocationProxyComponent>();
|
||||
root.AddComponent<ActorLocationSenderComponent>();
|
||||
|
||||
room.Name = "Server";
|
||||
|
||||
await ETTask.CompletedTask;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6975fc1c87e4bcf46bdd02dc8bb89bc4
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,23 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace ET.Server
|
||||
{
|
||||
[ActorMessageHandler(SceneType.Room)]
|
||||
public class G2Room_ReconnectHandler: ActorMessageHandler<Scene, G2Room_Reconnect, Room2G_Reconnect>
|
||||
{
|
||||
protected override async ETTask Run(Scene root, G2Room_Reconnect request, Room2G_Reconnect response)
|
||||
{
|
||||
Room room = root.GetComponent<Room>();
|
||||
response.StartTime = room.StartTime;
|
||||
LSUnitComponent lsUnitComponent = room.LSWorld.GetComponent<LSUnitComponent>();
|
||||
foreach (long playerId in room.PlayerIds)
|
||||
{
|
||||
LSUnit lsUnit = lsUnitComponent.GetChild<LSUnit>(playerId);
|
||||
response.UnitInfos.Add(new LockStepUnitInfo() {PlayerId = playerId, Position = lsUnit.Position, Rotation = lsUnit.Rotation});
|
||||
}
|
||||
|
||||
response.Frame = room.AuthorityFrame;
|
||||
await ETTask.CompletedTask;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f78aa3bd3f95d5d4a9b4178c61599dab
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,80 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace ET.Server
|
||||
{
|
||||
[EntitySystemOf(typeof(LSServerUpdater))]
|
||||
[FriendOf(typeof(LSServerUpdater))]
|
||||
public static partial class LSServerUpdaterSystem
|
||||
{
|
||||
[EntitySystem]
|
||||
private static void Awake(this LSServerUpdater self)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
[EntitySystem]
|
||||
private static void Update(this LSServerUpdater self)
|
||||
{
|
||||
Room room = self.GetParent<Room>();
|
||||
long timeNow = room.Fiber().TimeInfo.ServerFrameTime();
|
||||
|
||||
|
||||
int frame = room.AuthorityFrame + 1;
|
||||
if (timeNow < room.FixedTimeCounter.FrameTime(frame))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
OneFrameInputs oneFrameInputs = self.GetOneFrameMessage(frame);
|
||||
++room.AuthorityFrame;
|
||||
|
||||
OneFrameInputs sendInput = new();
|
||||
oneFrameInputs.CopyTo(sendInput);
|
||||
|
||||
RoomMessageHelper.BroadCast(room, sendInput);
|
||||
|
||||
room.Update(oneFrameInputs);
|
||||
}
|
||||
|
||||
private static OneFrameInputs GetOneFrameMessage(this LSServerUpdater self, int frame)
|
||||
{
|
||||
Room room = self.GetParent<Room>();
|
||||
FrameBuffer frameBuffer = room.FrameBuffer;
|
||||
OneFrameInputs oneFrameInputs = frameBuffer.FrameInputs(frame);
|
||||
frameBuffer.MoveForward(frame);
|
||||
|
||||
if (oneFrameInputs.Inputs.Count == LSConstValue.MatchCount)
|
||||
{
|
||||
return oneFrameInputs;
|
||||
}
|
||||
|
||||
OneFrameInputs preFrameInputs = null;
|
||||
if (frameBuffer.CheckFrame(frame - 1))
|
||||
{
|
||||
preFrameInputs = frameBuffer.FrameInputs(frame - 1);
|
||||
}
|
||||
|
||||
// 有人输入的消息没过来,给他使用上一帧的操作
|
||||
foreach (long playerId in room.PlayerIds)
|
||||
{
|
||||
if (oneFrameInputs.Inputs.ContainsKey(playerId))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (preFrameInputs != null && preFrameInputs.Inputs.TryGetValue(playerId, out LSInput input))
|
||||
{
|
||||
// 使用上一帧的输入
|
||||
oneFrameInputs.Inputs[playerId] = input;
|
||||
}
|
||||
else
|
||||
{
|
||||
oneFrameInputs.Inputs[playerId] = new LSInput();
|
||||
}
|
||||
}
|
||||
|
||||
return oneFrameInputs;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 524fc1d8fab854147a900bad52d3b28f
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,18 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace ET.Server
|
||||
{
|
||||
[ActorMessageHandler(SceneType.RoomRoot)]
|
||||
public class RoomManager2Room_InitHandler: ActorMessageHandler<Scene, RoomManager2Room_Init, Room2RoomManager_Init>
|
||||
{
|
||||
protected override async ETTask Run(Scene root, RoomManager2Room_Init request, Room2RoomManager_Init response)
|
||||
{
|
||||
Room room = root.AddComponent<Room>();
|
||||
|
||||
room.AddComponent<RoomServerComponent, List<long>>(request.PlayerIds);
|
||||
|
||||
room.LSWorld = new LSWorld(SceneType.LockStepServer);
|
||||
await ETTask.CompletedTask;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8cd5223c61a80bb4e8470bed8c0f2304
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Reference in New Issue
Block a user