浏览代码

Fix a bug in Chunk tranferring (#24)

sunnycase 8 年之前
父节点
当前提交
782dc4b07c
共有 1 个文件被更改,包括 12 次插入3 次删除
  1. 12 3
      src/MineCase.Server.Grains/User/UserGrain.cs

+ 12 - 3
src/MineCase.Server.Grains/User/UserGrain.cs

@@ -53,8 +53,6 @@ namespace MineCase.Server.User
             }
 
             _world = await GrainFactory.GetGrain<IWorldAccessor>(0).GetWorld(_worldId);
-            _sendingChunks = new HashSet<(int x, int z)>();
-            _sentChunks = new HashSet<(int x, int z)>();
         }
 
         public Task<IClientboundPacketSink> GetClientPacketSink()
@@ -88,6 +86,8 @@ namespace MineCase.Server.User
             _lastStreamedChunk = null;
             _state = UserState.JoinedGame;
             _keepAliveWaiters = new HashSet<uint>();
+            _sendingChunks = new HashSet<(int x, int z)>();
+            _sentChunks = new HashSet<(int x, int z)>();
             _sendKeepAliveTimer = RegisterTimer(OnSendKeepAliveRequests, null, TimeSpan.Zero, TimeSpan.FromSeconds(5));
 
             // _worldTimeSyncTimer = RegisterTimer(OnSyncWorldTime, null, TimeSpan.Zero, )
@@ -247,10 +247,19 @@ namespace MineCase.Server.User
             return false;
         }
 
+        private readonly List<(int x, int y)> _clonedSentChunks = new List<(int x, int y)>();
+
+        private List<(int x, int z)> CloneSentChunks()
+        {
+            _clonedSentChunks.Clear();
+            _clonedSentChunks.AddRange(_sentChunks);
+            return _clonedSentChunks;
+        }
+
         private async Task UnloadOutOfRangeChunks()
         {
             var currentChunk = await _player.GetChunkPosition();
-            foreach (var chunk in _sentChunks.ToArray())
+            foreach (var chunk in CloneSentChunks())
             {
                 var distance = Math.Abs(chunk.x - currentChunk.x) + Math.Abs(chunk.z - currentChunk.z);
                 if (distance > _viewDistance)