[+] 接入ET8服务端

[+] 接入ET8服务端
This commit is contained in:
ALEXTANG
2023-07-13 12:23:48 +08:00
parent e0be062006
commit 336d4b2eb9
1316 changed files with 130657 additions and 626 deletions

View File

@@ -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;
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 8f87c1aa12fde40b5afda6ea778cfdf4
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -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;
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 6975fc1c87e4bcf46bdd02dc8bb89bc4
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -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;
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: f78aa3bd3f95d5d4a9b4178c61599dab
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -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;
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 524fc1d8fab854147a900bad52d3b28f
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -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;
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 8cd5223c61a80bb4e8470bed8c0f2304
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: