Browse Source

update world partition

JasonWang 6 năm trước cách đây
mục cha
commit
2dbb8f0856

+ 17 - 0
src/MineCase.Server.Grains/World/WorldGrain.cs

@@ -22,6 +22,13 @@ namespace MineCase.Server.Grains.World
             await base.OnActivateAsync();
         }
 
+        public override async Task OnDeactivateAsync()
+        {
+            var tickEmitter = GrainFactory.GetGrain<ITickEmitter>(_name);
+            await tickEmitter.Stop();
+            await base.OnDeactivateAsync();
+        }
+
         public async Task OnTick()
         {
             foreach (var eachPartition in _activePartition)
@@ -30,5 +37,15 @@ namespace MineCase.Server.Grains.World
                 await partition.OnTick();
             }
         }
+
+        public Task ActivatePartition(string key)
+        {
+            return Task.CompletedTask;
+        }
+
+        public Task DeactivatePartition(string key)
+        {
+            return Task.CompletedTask;
+        }
     }
 }

+ 52 - 0
src/MineCase.Server.Grains/World/WorldPartitionGrain.cs

@@ -4,21 +4,56 @@ using System.Text;
 using System.Threading.Tasks;
 using MineCase.Engine;
 using MineCase.Server.Interfaces.World;
+using MineCase.World;
 using Orleans;
 
 namespace MineCase.Server.Grains.World
 {
+    public class PartitionState
+    {
+        public string WorldName { get; set; }
+
+        public BlockWorldPos Position { get; set; }
+
+        public EntityPack Entities { get; set; }
+
+        public bool IsActive { get; set; }
+    }
+
     public class WorldPartitionGrain : Grain, IWorldPartition
     {
+        public const int RangeAOI = 16;
+
+        public const int PartitionSize = 16 * 16; // 256 x 256 block
+
+        private string _worldName;
+
+        private BlockWorldPos _position;
+
+        private bool _isActive = false;
+
         private EntityPack _entityPack = new EntityPack();
 
+        private Dictionary<string, PartitionState> _ghostPartitions = new Dictionary<string, PartitionState>();
+
+        public override async Task OnActivateAsync()
+        {
+            var keys = this.GetWorldAndPartitionPos();
+            _worldName = keys.worldKey;
+            _position = keys.partitionPos;
+
+            await base.OnActivateAsync();
+        }
+
         public Task EnterEntity(Entity entity)
         {
+            _entityPack.AddEntity(entity);
             return Task.CompletedTask;
         }
 
         public Task LeaveEntity(Entity entity)
         {
+            _entityPack.RemoveEntity(entity.GetGuid());
             return Task.CompletedTask;
         }
 
@@ -26,5 +61,22 @@ namespace MineCase.Server.Grains.World
         {
             return Task.CompletedTask;
         }
+
+        private string MakeAddressByPartitionKey(IWorld world, BlockWorldPos blockWorldPos)
+        {
+            return $"{world.GetPrimaryKeyString()},{blockWorldPos.X},{blockWorldPos.Z}";
+        }
+
+        private BlockWorldPos GetPartitionPos()
+        {
+            var key = this.GetPrimaryKeyString().Split(',');
+            return new BlockWorldPos(int.Parse(key[1]), 0, int.Parse(key[2]));
+        }
+
+        private (string worldKey, BlockWorldPos partitionPos) GetWorldAndPartitionPos()
+        {
+            var key = this.GetPrimaryKeyString().Split(',');
+            return (key[0], new BlockWorldPos(int.Parse(key[1]), 0, int.Parse(key[2])));
+        }
     }
 }

+ 0 - 2
src/MineCase.sln

@@ -25,8 +25,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Common", "Common", "{2F824C
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Server", "Server", "{66D961CA-776F-4181-8F27-16D464B4514C}"
 EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Client", "Client", "{96E9F43D-37B3-46A6-A314-DBF2A80267B3}"
-EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MineCase.Core", "MineCase.Core\MineCase.Core.csproj", "{96EAEA39-F37A-4571-BB28-B7D9BF693138}"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MineCase.Protocol", "MineCase.Protocol\MineCase.Protocol.csproj", "{2B904789-EC33-493E-A7C9-062C54EA0404}"