Guo Hui 8 yıl önce
ebeveyn
işleme
e1d0d623d1

+ 1 - 1
src/MineCase.Gateway/Network/ClientSession.cs

@@ -36,7 +36,7 @@ namespace MineCase.Gateway.Network
             using (_remoteStream = _tcpClient.GetStream())
             {
                 var observerRef = await _grainFactory.CreateObjectReference<IClientboundPacketObserver>(_outcomingPacketObserver);
-                await _grainFactory.GetGrain<IClientboundPaketSink>(_sessionId).Subscribe(observerRef);
+                await _grainFactory.GetGrain<IClientboundPacketSink>(_sessionId).Subscribe(observerRef);
                 try
                 {
                     while (!cancellationToken.IsCancellationRequested &&

+ 15 - 0
src/MineCase.Server.Grains/Game/GameModule.cs

@@ -0,0 +1,15 @@
+using Autofac;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace MineCase.Server.Game
+{
+    class GameModule : Module
+    {
+        protected override void Load(ContainerBuilder builder)
+        {
+            builder.RegisterType<GameSession>();
+        }
+    }
+}

+ 29 - 0
src/MineCase.Server.Grains/Game/GameSession.cs

@@ -0,0 +1,29 @@
+using MineCase.Server.World;
+using Orleans;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+using MineCase.Server.Player;
+using MineCase.Server.Network.Play;
+
+namespace MineCase.Server.Game
+{
+    class GameSession : Grain, IGameSession
+    {
+        private IWorld _world;
+        private readonly Dictionary<IPlayer, ClientPlayPacketGenerator> _players = new Dictionary<IPlayer, ClientPlayPacketGenerator>();
+        
+        public async Task JoinGame(IPlayer player)
+        {
+            var generator = new ClientPlayPacketGenerator(await player.GetClientPacketSink());
+            _players.Add(player, generator);
+            await generator.JoinGame()
+        }
+
+        public override async Task OnActivateAsync()
+        {
+            _world = await GrainFactory.GetGrain<IWorldAccessor>(0).GetWorld(this.GetPrimaryKeyString());
+        }
+    }
+}

+ 1 - 1
src/MineCase.Server.Grains/Network/ClientboundPaketSinkGrain.cs → src/MineCase.Server.Grains/Network/ClientboundPacketSinkGrain.cs

@@ -10,7 +10,7 @@ using System.Reflection;
 
 namespace MineCase.Server.Network
 {
-    class ClientboundPaketSinkGrain : Grain, IClientboundPaketSink
+    class ClientboundPacketSinkGrain : Grain, IClientboundPacketSink
     {
         private ObserverSubscriptionManager<IClientboundPacketObserver> _subsManager;
 

+ 9 - 1
src/MineCase.Server.Grains/Network/Login/LoginFlowGrain.cs

@@ -5,6 +5,7 @@ using System.Text;
 using MineCase.Protocol.Login;
 using System.Threading.Tasks;
 using MineCase.Server.Player;
+using MineCase.Server.Game;
 
 namespace MineCase.Server.Network.Login
 {
@@ -20,12 +21,19 @@ namespace MineCase.Server.Network.Login
             {
                 var uuid = await GrainFactory.GetGrain<INonAuthenticatedPlayer>(packet.Name).GetUUID();
                 await SendLoginSuccess(packet.Name, uuid);
+
+                var player = GrainFactory.GetGrain<IPlayer>(uuid);
+                await player.SetClientPacketSink(GrainFactory.GetGrain<IClientboundPacketSink>(this.GetPrimaryKey()));
+
+                var world = await player.GetWorld();
+                var game = GrainFactory.GetGrain<IGameSession>(world.GetPrimaryKeyString());
+                await game.JoinGame(player);
             }
         }
 
         private async Task SendLoginSuccess(string userName, Guid uuid)
         {
-            var sink = GrainFactory.GetGrain<IClientboundPaketSink>(this.GetPrimaryKey());
+            var sink = GrainFactory.GetGrain<IClientboundPacketSink>(this.GetPrimaryKey());
             await GrainFactory.GetGrain<IPacketRouter>(this.GetPrimaryKey()).Play();
             await sink.SendPacket(new LoginSuccess
             {

+ 1 - 1
src/MineCase.Server.Grains/Network/NetworkModule.cs

@@ -10,7 +10,7 @@ namespace MineCase.Server.Network
         protected override void Load(ContainerBuilder builder)
         {
             builder.RegisterType<PacketRouterGrain>();
-            builder.RegisterType<ClientboundPaketSinkGrain>();
+            builder.RegisterType<ClientboundPacketSinkGrain>();
         }
     }
 }

+ 1 - 1
src/MineCase.Server.Grains/Network/PacketRouterGrain.cs

@@ -41,7 +41,7 @@ namespace MineCase.Server.Network
         public async Task Close()
         {
             _state = SessionState.Closed;
-            await GrainFactory.GetGrain<IClientboundPaketSink>(this.GetPrimaryKey()).Close();
+            await GrainFactory.GetGrain<IClientboundPacketSink>(this.GetPrimaryKey()).Close();
             DeactivateOnIdle();
         }
 

+ 22 - 0
src/MineCase.Server.Grains/Network/Play/ClientPlayPacketGenerator.cs

@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MineCase.Server.Network.Play
+{
+    class ClientPlayPacketGenerator
+    {
+        private readonly IClientboundPacketSink _sink;
+
+        public ClientPlayPacketGenerator(IClientboundPacketSink sink)
+        {
+            _sink = sink;
+        }
+
+        public Task JoinGame(uint eid, byte gameMode, int dimension, byte difficulty, byte maxPlayers, string levelType, bool reducedDebugInfo)
+        {
+            return _sink.SendPacket(new )
+        }
+    }
+}

+ 1 - 1
src/MineCase.Server.Grains/Network/Status/PingGrain.cs

@@ -14,7 +14,7 @@ namespace MineCase.Server.Network.Status
     {
         public async Task DispatchPacket(Guid sessionId, Ping packet)
         {
-            await GrainFactory.GetGrain<IClientboundPaketSink>(sessionId).SendPacket(new Pong { Payload = packet.Payload });
+            await GrainFactory.GetGrain<IClientboundPacketSink>(sessionId).SendPacket(new Pong { Payload = packet.Payload });
             GrainFactory.GetGrain<IPacketRouter>(sessionId).Close().Ignore();
         }
     }

+ 1 - 1
src/MineCase.Server.Grains/Network/Status/RequestGrain.cs

@@ -41,7 +41,7 @@ namespace MineCase.Server.Network.Status
             {
                 JsonResponse = JsonConvert.SerializeObject(serverInfo, Formatting.Indented, _jsonSettings)
             };
-            await GrainFactory.GetGrain<IClientboundPaketSink>(sessionId).SendPacket(response);
+            await GrainFactory.GetGrain<IClientboundPacketSink>(sessionId).SendPacket(response);
         }
 
         class ServerInfo

+ 26 - 0
src/MineCase.Server.Grains/Player/PlayerGrain.cs

@@ -0,0 +1,26 @@
+using Orleans;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using MineCase.Server.Game;
+using MineCase.Server.World;
+using System.Threading.Tasks;
+
+namespace MineCase.Server.Player
+{
+    class PlayerGrain : Grain, IPlayer
+    {
+        private string _worldId;
+
+        public async Task<IWorld> GetWorld()
+        {
+            if(string.IsNullOrEmpty(_worldId))
+            {
+                var world = await GrainFactory.GetGrain<IWorldAccessor>(0).GetDefaultWorld();
+                _worldId = world.GetPrimaryKeyString();
+                return world;
+            }
+            return await GrainFactory.GetGrain<IWorldAccessor>(0).GetWorld(_worldId);
+        }
+    }
+}

+ 2 - 2
src/MineCase.Server.Grains/World/WorldAccessorGrain.cs

@@ -15,9 +15,9 @@ namespace MineCase.Server.World
             return Task.FromResult(GrainFactory.GetGrain<IWorld>(_defaultWorldName));
         }
 
-        public async Task<IWorld> GetWorld(string name)
+        public Task<IWorld> GetWorld(string name)
         {
-            return null;
+            return Task.FromResult(GrainFactory.GetGrain<IWorld>(name));
         }
     }
 }

+ 14 - 0
src/MineCase.Server.Interfaces/Game/IGameSession.cs

@@ -0,0 +1,14 @@
+using MineCase.Server.Player;
+using Orleans;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MineCase.Server.Game
+{
+    public interface IGameSession : IGrainWithStringKey
+    {
+        Task JoinGame(IPlayer player);
+    }
+}

+ 1 - 0
src/MineCase.Server.Interfaces/MineCase.Server.Interfaces.csproj

@@ -16,6 +16,7 @@
 
   <ItemGroup>
     <Folder Include="Network\Handshaking\" />
+    <Folder Include="Play\" />
   </ItemGroup>
 
 </Project>

+ 1 - 1
src/MineCase.Server.Interfaces/Network/IClientboundPaketSink.cs → src/MineCase.Server.Interfaces/Network/IClientboundPacketSink.cs

@@ -8,7 +8,7 @@ using System.Threading.Tasks;
 
 namespace MineCase.Server.Network
 {
-    public interface IClientboundPaketSink : IGrainWithGuidKey
+    public interface IClientboundPacketSink : IGrainWithGuidKey
     {
         Task Subscribe(IClientboundPacketObserver observer);
         Task UnSubscribe(IClientboundPacketObserver observer);

+ 18 - 0
src/MineCase.Server.Interfaces/Player/IPlayer.cs

@@ -0,0 +1,18 @@
+using MineCase.Server.Game;
+using MineCase.Server.Network;
+using MineCase.Server.World;
+using Orleans;
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MineCase.Server.Player
+{
+    public interface IPlayer : IGrainWithGuidKey
+    {
+        Task<IWorld> GetWorld();
+        Task SetClientPacketSink(IClientboundPacketSink sink);
+        Task<IClientboundPacketSink> GetClientPacketSink();
+    }
+}

+ 3 - 3
src/NuGet.config

@@ -1,11 +1,11 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <configuration>
   <!-- NOTE: Leave this file here and keep it in sync with list in dir.props. -->
   <!-- The command-line doesn't need it, but the IDE does.                    -->
   <packageSources>
-    <clear/>
+    <clear />
     <add key="orleans-prerlease" value="https://dotnet.myget.org/F/orleans-prerelease/api/v3/index.json" />
-    <add key="nuget.org" value="https://www.nuget.org/api/v2/" />
+    <add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
   </packageSources>
   <config>
     <add key="repositoryPath" value="..\packages" />