فهرست منبع

add new cell and entity system

JasonWang 6 سال پیش
والد
کامیت
be1c7bc1a2

+ 60 - 0
src/MineCase.Server.Grains/Game/Cell.cs

@@ -0,0 +1,60 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MineCase.Server.Game
+{
+    public class Cell
+    {
+        String SpaceKey { get; set; }
+
+        String CellKey { get; set; }
+
+        public int X { get; set; }
+
+        public int Y { get; set; }
+
+        public int Z { get; set; }
+
+        private Dictionary<Guid, CellEntity> _entityValues;
+
+        private ICell _cell;
+
+        public Task<object> Tell(CellEntityRef entity, object message)
+        {
+            if (entity.SpaceKey == SpaceKey && entity.CellKey == CellKey)
+            {
+                if (_entityValues.ContainsKey(entity.Id))
+                {
+                    return _entityValues[entity.Id].OnMessage(message);
+                }
+                else
+                {
+                    return null;
+                }
+            }
+            else
+            {
+                return _cell.Tell(entity.Id, message);
+            }
+        }
+
+        public Task<object> Tell(Guid entityId, object message)
+        {
+            if (_entityValues.ContainsKey(entityId))
+            {
+                return _entityValues[entityId].OnMessage(message);
+            }
+            else
+            {
+                return null;
+            }
+        }
+
+        public void SetCell(ICell cell)
+        {
+            _cell = cell;
+        }
+    }
+}

+ 28 - 0
src/MineCase.Server.Grains/Game/CellEntity.cs

@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MineCase.Server.Game
+{
+    public abstract class CellEntity
+    {
+        String Space { get; set; }
+
+        String Cell { get; set; }
+
+        String EntityType { get; set; }
+
+        float X { get; set; }
+
+        float Y { get; set; }
+
+        float Z { get; set; }
+
+        bool Global { get; set; }
+
+        Guid Id { get; set; }
+
+        public abstract Task<object> OnMessage(object message);
+    }
+}

+ 14 - 0
src/MineCase.Server.Grains/Game/CellEntityRef.cs

@@ -0,0 +1,14 @@
+using System;
+using System.Threading.Tasks;
+
+namespace MineCase.Server.Game
+{
+    public class CellEntityRef
+    {
+        public String SpaceKey { get; set; }
+
+        public String CellKey { get; set; }
+
+        public Guid Id { get; set; }
+    }
+}

+ 30 - 0
src/MineCase.Server.Grains/Game/CellGrain.cs

@@ -0,0 +1,30 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+using MineCase.Server.Game;
+using Orleans;
+
+namespace MineCase.Server.Game
+{
+    public class CellGrain : Grain, ICell
+    {
+        private Cell _cell;
+
+        public CellGrain()
+        {
+            _cell = new Cell();
+            _cell.SetCell(this);
+        }
+
+        public Task<ICell> GetCell(String key)
+        {
+            return Task.FromResult(GrainFactory.GetGrain<ICell>(key));
+        }
+
+        public Task<object> Tell(Guid entityId, object message)
+        {
+            return _cell.Tell(entityId, message);
+        }
+    }
+}

+ 10 - 0
src/MineCase.Server.Grains/Game/Message.cs

@@ -0,0 +1,10 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace MineCase.Server.Grains.Game
+{
+    public interface Message
+    {
+    }
+}

+ 15 - 0
src/MineCase.Server.Interfaces/Game/ICell.cs

@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Threading.Tasks;
+using Orleans;
+
+namespace MineCase.Server.Game
+{
+    public interface ICell : IGrainWithStringKey
+    {
+        Task<ICell> GetCell(String key);
+
+        Task<object> Tell(Guid entityId, object message);
+    }
+}