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,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b29453dd6d8294ba982500d139b81ed5
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -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 });
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 04a4b6c3a76cb4d53ab4655a2cc4f7eb
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d2320b5939fd246359a4871b18ac94d8
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a86d2aec3f36c405fa581cf362886820
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 228e4d43b85774ae08bf5da1f3425627
|
||||
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.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;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5d37c22fa00c59f48a444cc04a1621e4
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 40bebd1c111464ddb96d36e4d0966070
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7f404c61e317c4fc0ad28508eea3f5f2
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 015483a7767f844349026490961481a1
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6d671f754d680422caba612a77dfdb63
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 397b1655e0ba94b23abb42a1a3c6cca8
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a6a6101f02189c643accabb36f52c150
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 643a9fc2cab3148718708aba9c790f7d
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -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);
|
||||
// 等待进入房间的确认消息,如果超时要通知所有玩家退出房间,重新匹配
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fd80372aeb5d74a3ba66f43bae5613df
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8795299b519a48719a23f048377da2a9
|
||||
timeCreated: 1681817967
|
@@ -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