Pārlūkot izejas kodu

GameSession for game balance

JasonWang 6 gadi atpakaļ
vecāks
revīzija
5e6399796f

+ 20 - 0
src/MineCase.Core/Util/Math/Region.cs

@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace MineCase.Util.Math
+{
+    public struct Region
+    {
+        public ChunkPos BasePos { get; set; }
+        public int XChunkNum { get; set; }
+        public int ZChunkNum { get; set; }
+
+        public Region(ChunkPos chunkPos, int x, int z)
+        {
+            BasePos = chunkPos;
+            XChunkNum = x;
+            ZChunkNum = z;
+        }
+    }
+}

+ 0 - 4
src/MineCase.Server.Grains/MineCase.Server.Grains.csproj

@@ -33,8 +33,4 @@
     <ProjectReference Include="..\MineCase.Server.Interfaces\MineCase.Server.Interfaces.csproj" />
   </ItemGroup>
 
-  <ItemGroup>
-    <Folder Include="Server\MultiPlayer\" />
-  </ItemGroup>
-
 </Project>

+ 11 - 4
src/MineCase.Server.Grains/Network/Handler/Login/ServerLoginNetHandler.cs

@@ -7,6 +7,7 @@ using MineCase.Protocol.Protocol;
 using MineCase.Protocol.Protocol.Login.Client;
 using MineCase.Protocol.Protocol.Login.Server;
 using MineCase.Server.Server;
+using MineCase.Server.Server.MultiPlayer;
 using Orleans;
 
 namespace MineCase.Server.Network.Handler.Login
@@ -80,6 +81,12 @@ namespace MineCase.Server.Network.Handler.Login
                 throw new NotImplementedException("TryAcceptPlayer: Packet compression is not implemented.");
             }
 
+            // Create user
+            IUser user = _client.GetGrain<IUser>(Guid.Parse(_gameProfile.UUID));
+            await user.SetName(_gameProfile.Name);
+
+            await _clientSession.BindToUser(user);
+
             // Send success packet
             LoginSuccess successPacket = new LoginSuccess
             {
@@ -89,14 +96,14 @@ namespace MineCase.Server.Network.Handler.Login
 
             await _packetSink.SendPacket(successPacket);
 
+            // Call server join
+            await server.UserJoin(user);
+
             // Change session state
             await _clientSession.SetSessionState(SessionState.Play);
 
-            // Set net handler
+            // Set net handler to play handler
             await _clientSession.SetNetHandler(SessionState.Play);
-
-            MineCase.Protocol.Protocol.Play.Client.ChunkData chunkData = new MineCase.Protocol.Protocol.Play.Client.ChunkData();
-            await _packetSink.SendPacket(chunkData);
         }
     }
 }

+ 5 - 1
src/MineCase.Server.Grains/Network/Handler/Play/ServerPlayNetHandler.cs

@@ -1,6 +1,7 @@
 using System;
 using System.Collections.Generic;
 using System.Text;
+using MineCase.Server.Server.MultiPlayer;
 using Orleans;
 
 namespace MineCase.Server.Network.Handler.Play
@@ -13,11 +14,14 @@ namespace MineCase.Server.Network.Handler.Play
 
         private IGrainFactory _client;
 
-        public ServerPlayNetHandler(IPacketRouter session, IClientboundPacketSink packetSink, IGrainFactory client)
+        private IUser _user;
+
+        public ServerPlayNetHandler(IPacketRouter session, IClientboundPacketSink packetSink, IGrainFactory client, IUser user)
         {
             _clientSession = session;
             _packetSink = packetSink;
             _client = client;
+            _user = user;
         }
     }
 }

+ 12 - 1
src/MineCase.Server.Grains/Network/PacketRouter.cs

@@ -12,12 +12,14 @@ using MineCase.Server.Network.Handler.Handshaking;
 using MineCase.Server.Network.Handler.Login;
 using MineCase.Server.Network.Handler.Play;
 using MineCase.Server.Network.Handler.Status;
+using MineCase.Server.Server.MultiPlayer;
 using Orleans;
 
 namespace MineCase.Server.Network
 {
     public class PacketRouter : Grain, IPacketRouter
     {
+        private IUser _user;
         private PacketInfo _packetInfo;
         private PacketDecoder _decoder;
         private INetHandler _packetHandler;
@@ -62,7 +64,9 @@ namespace MineCase.Server.Network
                     _packetHandler = new ServerPlayNetHandler(
                         GrainFactory.GetGrain<IPacketRouter>(this.GetPrimaryKey()),
                         GrainFactory.GetGrain<IClientboundPacketSink>(this.GetPrimaryKey()),
-                        GrainFactory);
+                        GrainFactory,
+                        _user
+                        );
                     break;
                 default:
                     throw new NotImplementedException("Invalid intention " + state.ToString());
@@ -71,6 +75,13 @@ namespace MineCase.Server.Network
             return Task.CompletedTask;
         }
 
+        // Bind this router to user when user login
+        public Task BindToUser(IUser user)
+        {
+            _user = user;
+            return Task.CompletedTask;
+        }
+
         // Process packets from game clients
         public async Task ProcessPacket(RawPacket rawPacket)
         {

+ 38 - 0
src/MineCase.Server.Grains/Server/GameSession.cs

@@ -0,0 +1,38 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+using MineCase.Server.Server.MultiPlayer;
+using MineCase.Server.World.Chunk;
+using MineCase.Util.Math;
+using Orleans;
+
+namespace MineCase.Server.Server
+{
+    public class GameSession : Grain, IGameSession
+    {
+        private ChunkManager _chunkManager;
+
+        private List<ChunkPos> _loadedRegion;
+
+        private List<IUser> _users;
+
+        public override Task OnActivateAsync()
+        {
+            _chunkManager = new ChunkManager();
+            _loadedRegion = new List<ChunkPos>();
+            _users = new List<IUser>();
+            return base.OnActivateAsync();
+        }
+
+        public Task UserEnter(IUser user)
+        {
+            return Task.CompletedTask;
+        }
+
+        public Task UserLeave(IUser user)
+        {
+            return Task.CompletedTask;
+        }
+    }
+}

+ 20 - 0
src/MineCase.Server.Grains/Server/MinecraftServer.cs

@@ -3,6 +3,7 @@ using System.Collections.Generic;
 using System.Text;
 using System.Threading.Tasks;
 using MineCase.Core.World.Dimension;
+using MineCase.Server.Server.MultiPlayer;
 using MineCase.Server.World;
 using Orleans;
 using Orleans.Providers;
@@ -17,6 +18,8 @@ namespace MineCase.Server.Server
     [StorageProvider(ProviderName = "MongoDBStore")]
     public class MinecraftServer : Grain<MinecraftServerState>, IMinecraftServer
     {
+        private readonly List<IUser> _users = new List<IUser>();
+
         public Task<int> GetNetworkCompressionThreshold()
         {
             return Task.FromResult(-1);
@@ -26,5 +29,22 @@ namespace MineCase.Server.Server
         {
             return Task.FromResult(false);
         }
+
+        public Task UserJoin(IUser user)
+        {
+            _users.Add(user);
+            user.SetSession(GrainFactory.GetGrain<IGameSession>(user.GetPrimaryKey()));
+            return Task.CompletedTask;
+        }
+
+        public Task UserLeave()
+        {
+            return Task.CompletedTask;
+        }
+
+        public Task<int> UserNumber()
+        {
+            return Task.FromResult(_users.Count);
+        }
     }
 }

+ 40 - 0
src/MineCase.Server.Grains/Server/MultiPlayer/User.cs

@@ -0,0 +1,40 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+using Orleans;
+
+namespace MineCase.Server.Server.MultiPlayer
+{
+    public class UserState
+    {
+        public string Name { get; set; }
+    }
+
+    public class User : Grain<UserState>, IUser
+    {
+        private IGameSession _gameSession;
+
+        public Task SetSession(IGameSession session)
+        {
+            _gameSession = session;
+            return Task.CompletedTask;
+        }
+
+        public Task<IGameSession> GetSession()
+        {
+            return Task.FromResult(_gameSession);
+        }
+
+        public Task SetName(string name)
+        {
+            State.Name = name;
+            return Task.CompletedTask;
+        }
+
+        public Task<string> GetGame()
+        {
+            return Task.FromResult(State.Name);
+        }
+    }
+}

+ 11 - 0
src/MineCase.Server.Grains/World/Chunk/ChunkHolder.cs

@@ -0,0 +1,11 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Orleans;
+
+namespace MineCase.Server.World.Chunk
+{
+    public class ChunkHolder : Grain, IChunkHolder
+    {
+    }
+}

+ 10 - 0
src/MineCase.Server.Grains/World/Chunk/ChunkManager.cs

@@ -0,0 +1,10 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace MineCase.Server.World.Chunk
+{
+    public class ChunkManager
+    {
+    }
+}

+ 1 - 3
src/MineCase.Server.Grains/World/WorldAccessor.cs

@@ -8,12 +8,10 @@ namespace MineCase.Server.World
     public class WorldAccessor
     {
         private IGrainFactory _grainFactory;
-        private WorldPartitionData _partition;
 
-        public WorldAccessor(IGrainFactory grainFactory, WorldPartitionData partition)
+        public WorldAccessor(IGrainFactory grainFactory)
         {
             _grainFactory = grainFactory;
-            _partition = partition;
         }
     }
 }

+ 1 - 1
src/MineCase.Server.Grains/World/WorldPartition.cs

@@ -36,7 +36,7 @@ namespace MineCase.Server.World
             (string worldKey, ChunkPos chunkPos) = this.GetWorldAndChunkPos();
             _world = GrainFactory.GetGrain<IWorld>(worldKey);
             _partition = new WorldPartitionData();
-            _worldAccessor = new WorldAccessor(GrainFactory, _partition);
+            _worldAccessor = new WorldAccessor(GrainFactory);
         }
 
         public override async Task OnDeactivateAsync()

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

@@ -32,7 +32,6 @@
   </ItemGroup>
 
   <ItemGroup>
-    <Folder Include="World\Chunk\" />
     <Folder Include="World\Biome\" />
   </ItemGroup>
 

+ 4 - 0
src/MineCase.Server.Interfaces/Network/IPacketRouter.cs

@@ -3,16 +3,20 @@ using System.Collections.Generic;
 using System.Text;
 using System.Threading.Tasks;
 using MineCase.Protocol.Protocol;
+using MineCase.Server.Server.MultiPlayer;
 using Orleans;
 
 namespace MineCase.Server.Network
 {
     public interface IPacketRouter : IGrainWithGuidKey
     {
+
         Task SetSessionState(SessionState state);
 
         Task SetNetHandler(SessionState state);
 
+        Task BindToUser(IUser user);
+
         Task ProcessPacket(RawPacket rawPacket);
     }
 }

+ 16 - 0
src/MineCase.Server.Interfaces/Server/IGameSession.cs

@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+using MineCase.Server.Server.MultiPlayer;
+using Orleans;
+
+namespace MineCase.Server.Server
+{
+    public interface IGameSession : IGrainWithGuidKey
+    {
+        Task UserEnter(IUser user);
+
+        Task UserLeave(IUser user);
+    }
+}

+ 7 - 0
src/MineCase.Server.Interfaces/Server/IMinecraftServer.cs

@@ -2,6 +2,7 @@
 using System.Collections.Generic;
 using System.Text;
 using System.Threading.Tasks;
+using MineCase.Server.Server.MultiPlayer;
 using Orleans;
 
 namespace MineCase.Server.Server
@@ -11,5 +12,11 @@ namespace MineCase.Server.Server
         Task<bool> GetOnlineMode();
 
         Task<int> GetNetworkCompressionThreshold();
+
+        Task UserJoin(IUser user);
+
+        Task UserLeave();
+
+        Task<int> UserNumber();
     }
 }

+ 19 - 0
src/MineCase.Server.Interfaces/Server/MultiPlayer/IUser.cs

@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+using Orleans;
+
+namespace MineCase.Server.Server.MultiPlayer
+{
+    public interface IUser : IGrainWithGuidKey
+    {
+        Task SetSession(IGameSession session);
+
+        Task<IGameSession> GetSession();
+
+        Task SetName(string name);
+
+        Task<string> GetGame();
+    }
+}

+ 10 - 0
src/MineCase.Server.Interfaces/World/Chunk/IChunkHolder.cs

@@ -0,0 +1,10 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace MineCase.Server.World.Chunk
+{
+    public interface IChunkHolder : IAddressByPartition
+    {
+    }
+}