[+] 接入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,8 @@
fileFormatVersion: 2
guid: b29453dd6d8294ba982500d139b81ed5
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,16 @@
namespace ET.Server
{
[MessageHandler(SceneType.Gate)]
public class C2G_MatchHandler : MessageHandler<C2G_Match, G2C_Match>
{
protected override async ETTask Run(Session session, C2G_Match request, G2C_Match response)
{
Player player = session.GetComponent<SessionPlayerComponent>().Player;
StartSceneConfig startSceneConfig = StartSceneConfigCategory.Instance.Match;
await session.Root().GetComponent<ActorSenderComponent>().Call(startSceneConfig.ActorId,
new G2Match_Match() { Id = player.Id });
}
}
}

View File

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

View File

@@ -0,0 +1,17 @@
using System;
namespace ET.Server
{
[ActorMessageHandler(SceneType.Gate)]
public class Match2G_NotifyMatchSuccessHandler : ActorMessageHandler<Player, Match2G_NotifyMatchSuccess>
{
protected override async ETTask Run(Player player, Match2G_NotifyMatchSuccess message)
{
player.AddComponent<PlayerRoomComponent>().RoomActorId = message.ActorId;
player.GetComponent<PlayerSessionComponent>().Session.Send(message);
await ETTask.CompletedTask;
}
}
}

View File

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

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: a86d2aec3f36c405fa581cf362886820
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,40 @@
using System.Collections.Generic;
using TrueSync;
namespace ET.Server
{
[ActorMessageHandler(SceneType.RoomRoot)]
[FriendOf(typeof (RoomServerComponent))]
public class C2Room_ChangeSceneFinishHandler: ActorMessageHandler<Scene, C2Room_ChangeSceneFinish>
{
protected override async ETTask Run(Scene root, C2Room_ChangeSceneFinish message)
{
Room room = root.GetComponent<Room>();
RoomServerComponent roomServerComponent = room.GetComponent<RoomServerComponent>();
RoomPlayer roomPlayer = room.GetComponent<RoomServerComponent>().GetChild<RoomPlayer>(message.PlayerId);
roomPlayer.Progress = 100;
if (!roomServerComponent.IsAllPlayerProgress100())
{
return;
}
await room.Fiber.TimerComponent.WaitAsync(1000);
Room2C_Start room2CStart = new() { StartTime = room.Fiber().TimeInfo.ServerFrameTime() };
foreach (RoomPlayer rp in roomServerComponent.Children.Values)
{
room2CStart.UnitInfo.Add(new LockStepUnitInfo()
{
PlayerId = rp.Id, Position = new TSVector(20, 0, -10), Rotation = TSQuaternion.identity
});
}
room.Init(room2CStart.UnitInfo, room2CStart.StartTime);
room.AddComponent<LSServerUpdater>();
RoomMessageHelper.BroadCast(room, room2CStart);
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 228e4d43b85774ae08bf5da1f3425627
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.Map)]
public class FiberInit_Map: 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>();
root.AddComponent<UnitComponent>();
root.AddComponent<AOIManagerComponent>();
root.AddComponent<RoomManagerComponent>();
root.AddComponent<LocationProxyComponent>();
root.AddComponent<ActorLocationSenderComponent>();
await ETTask.CompletedTask;
}
}
}

View File

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

View File

@@ -0,0 +1,46 @@
using System;
using System.Collections.Generic;
namespace ET.Server
{
[ActorMessageHandler(SceneType.RoomRoot)]
public class FrameMessageHandler: ActorMessageHandler<Scene, FrameMessage>
{
protected override async ETTask Run(Scene root, FrameMessage message)
{
Room room = root.GetComponent<Room>();
FrameBuffer frameBuffer = room.FrameBuffer;
if (message.Frame % (1000 / LSConstValue.UpdateInterval) == 0)
{
long nowFrameTime = room.FixedTimeCounter.FrameTime(message.Frame);
int diffTime = (int)(nowFrameTime - room.Fiber().TimeInfo.ServerFrameTime());
room.Root().GetComponent<ActorLocationSenderComponent>().Get(LocationType.GateSession).Send(message.PlayerId, new Room2C_AdjustUpdateTime() {DiffTime = diffTime});
}
if (message.Frame < room.AuthorityFrame) // 小于AuthorityFrame丢弃
{
Log.Warning($"FrameMessage < AuthorityFrame discard: {message}");
return;
}
if (message.Frame > room.AuthorityFrame + 10) // 大于AuthorityFrame + 10丢弃
{
Log.Warning($"FrameMessage > AuthorityFrame + 10 discard: {message}");
return;
}
OneFrameInputs oneFrameInputs = frameBuffer.FrameInputs(message.Frame);
if (oneFrameInputs == null)
{
Log.Error($"FrameMessageHandler get frame is null: {message.Frame}, max frame: {frameBuffer.MaxFrame}");
return;
}
oneFrameInputs.Inputs[message.PlayerId] = message.Input;
await ETTask.CompletedTask;
}
}
}

View File

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

View File

@@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
namespace ET.Server
{
[ActorMessageHandler(SceneType.Map)]
public class Match2Map_GetRoomHandler : ActorMessageHandler<Scene, Match2Map_GetRoom, Map2Match_GetRoom>
{
protected override async ETTask Run(Scene root, Match2Map_GetRoom request, Map2Match_GetRoom response)
{
//RoomManagerComponent roomManagerComponent = root.GetComponent<RoomManagerComponent>();
Fiber fiber = root.Fiber();
int fiberId = await FiberManager.Instance.Create(SchedulerType.ThreadPool, fiber.Zone, SceneType.RoomRoot, "RoomRoot");
ActorId roomRootActorId = new(fiber.Process, fiberId);
// 发送消息给房间纤程,初始化
RoomManager2Room_Init roomManager2RoomInit = RoomManager2Room_Init.Create();
roomManager2RoomInit.PlayerIds.AddRange(request.PlayerIds);
await root.GetComponent<ActorSenderComponent>().Call(roomRootActorId, roomManager2RoomInit);
response.ActorId = roomRootActorId;
await ETTask.CompletedTask;
}
}
}

View File

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

View File

@@ -0,0 +1,27 @@
namespace ET.Server
{
public static partial class RoomMessageHelper
{
public static void BroadCast(Room room, IActorMessage message)
{
// 广播的消息不能被池回收
(message as MessageObject).IsFromPool = false;
RoomServerComponent roomServerComponent = room.GetComponent<RoomServerComponent>();
ActorLocationSenderComponent actorLocationSenderComponent = room.Root().GetComponent<ActorLocationSenderComponent>();
foreach (var kv in roomServerComponent.Children)
{
RoomPlayer roomPlayer = kv.Value as RoomPlayer;
if (!roomPlayer.IsOnline)
{
continue;
}
actorLocationSenderComponent.Get(LocationType.GateSession).Send(roomPlayer.Id, message);
}
}
}
}

View File

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

View File

@@ -0,0 +1,31 @@
using System;
using System.Collections.Generic;
namespace ET.Server
{
[EntitySystemOf(typeof(RoomServerComponent))]
[FriendOf(typeof(RoomServerComponent))]
public static partial class RoomServerComponentSystem
{
[EntitySystem]
private static void Awake(this RoomServerComponent self, List<long> playerIds)
{
foreach (long id in playerIds)
{
RoomPlayer roomPlayer = self.AddChildWithId<RoomPlayer>(id);
}
}
public static bool IsAllPlayerProgress100(this RoomServerComponent self)
{
foreach (RoomPlayer roomPlayer in self.Children.Values)
{
if (roomPlayer.Progress != 100)
{
return false;
}
}
return true;
}
}
}

View File

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

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 397b1655e0ba94b23abb42a1a3c6cca8
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,23 @@
using System.Net;
namespace ET.Server
{
[Invoke((long)SceneType.Match)]
public class FiberInit_Match: 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>();
root.AddComponent<MatchComponent>();
root.AddComponent<LocationProxyComponent>();
root.AddComponent<ActorLocationSenderComponent>();
await ETTask.CompletedTask;
}
}
}

View File

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

View File

@@ -0,0 +1,16 @@
using System;
namespace ET.Server
{
[ActorMessageHandler(SceneType.Match)]
public class G2Match_MatchHandler : ActorMessageHandler<Scene, G2Match_Match, Match2G_Match>
{
protected override async ETTask Run(Scene scene, G2Match_Match request, Match2G_Match response)
{
MatchComponent matchComponent = scene.GetComponent<MatchComponent>();
matchComponent.Match(request.Id).Coroutine();
await ETTask.CompletedTask;
}
}
}

View File

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

View File

@@ -0,0 +1,49 @@
using System;
using System.Collections.Generic;
namespace ET.Server
{
[FriendOf(typeof(MatchComponent))]
public static partial class MatchComponentSystem
{
public static async ETTask Match(this MatchComponent self, long playerId)
{
if (self.waitMatchPlayers.Contains(playerId))
{
return;
}
self.waitMatchPlayers.Add(playerId);
if (self.waitMatchPlayers.Count < LSConstValue.MatchCount)
{
return;
}
// 申请一个房间
StartSceneConfig startSceneConfig = RandomGenerator.RandomArray(StartSceneConfigCategory.Instance.Maps);
Match2Map_GetRoom match2MapGetRoom = new();
foreach (long id in self.waitMatchPlayers)
{
match2MapGetRoom.PlayerIds.Add(id);
}
self.waitMatchPlayers.Clear();
Scene root = self.Root();
Map2Match_GetRoom map2MatchGetRoom = await root.GetComponent<ActorSenderComponent>().Call(
startSceneConfig.ActorId, match2MapGetRoom) as Map2Match_GetRoom;
Match2G_NotifyMatchSuccess match2GNotifyMatchSuccess = new() { ActorId = map2MatchGetRoom.ActorId };
ActorLocationSenderComponent actorLocationSenderComponent = root.GetComponent<ActorLocationSenderComponent>();
foreach (long id in match2MapGetRoom.PlayerIds) // 这里发送消息线程不会修改PlayerInfo所以可以直接使用
{
actorLocationSenderComponent.Get(LocationType.Player).Send(id, match2GNotifyMatchSuccess);
// 等待进入房间的确认消息,如果超时要通知所有玩家退出房间,重新匹配
}
}
}
}

View File

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

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 8795299b519a48719a23f048377da2a9
timeCreated: 1681817967

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: