private void Event_ChunkDirty(Vec3i chunkCoord, IWorldChunk chunk, EnumChunkDirtyReason reason)
        {
            if (allNetworksFullyLoaded || reason == EnumChunkDirtyReason.MarkedDirty)
            {
                return;
            }

            allNetworksFullyLoaded = true;
            nowFullyLoaded.Clear();

            foreach (var network in data.networksById.Values)
            {
                if (network.fullyLoaded)
                {
                    continue;
                }
                allNetworksFullyLoaded = false;

                if (network.inChunks.ContainsKey(chunkCoord))
                {
                    testFullyLoaded(network);
                    if (network.fullyLoaded)
                    {
                        nowFullyLoaded.Add(network);
                    }
                }
            }

            for (int i = 0; i < nowFullyLoaded.Count; i++)
            {
                RebuildNetwork(nowFullyLoaded[i]);
            }
        }
Пример #2
0
        private void Event_OnChunkDirty(Vec3i chunkCoord, IWorldChunk chunk, EnumChunkDirtyReason reason)
        {
            //api.Logger.Notification("NowDirty @{0}/{1}", chunkCoord.X, chunkCoord.Z);

            lock (chunksToGenLock)
            {
                if (!mapSink.IsOpened)
                {
                    return;
                }

                tmpMccoord.Set(chunkCoord.X / MultiChunkMapComponent.ChunkLen, chunkCoord.Z / MultiChunkMapComponent.ChunkLen);
                tmpCoord.Set(chunkCoord.X, chunkCoord.Z);

                if (!loadedMapData.ContainsKey(tmpMccoord) && !curVisibleChunks.Contains(tmpCoord))
                {
                    return;
                }

                chunksToGen.Enqueue(new Vec2i(chunkCoord.X, chunkCoord.Z));
                chunksToGen.Enqueue(new Vec2i(chunkCoord.X, chunkCoord.Z - 1));
                chunksToGen.Enqueue(new Vec2i(chunkCoord.X - 1, chunkCoord.Z));
                chunksToGen.Enqueue(new Vec2i(chunkCoord.X, chunkCoord.Z + 1));
                chunksToGen.Enqueue(new Vec2i(chunkCoord.X + 1, chunkCoord.Z + 1));
            }
        }
Пример #3
0
        private void Event_ChunkDirty(Vec3i chunkCoord, IWorldChunk chunk, EnumChunkDirtyReason reason)
        {
            long           index3d = MapUtil.Index3dL(chunkCoord.X, chunkCoord.Y, chunkCoord.Z, chunkMapSizeX, chunkMapSizeZ);
            ChunkRooms     chunkrooms;
            Cuboidi        cuboid;
            FastSetOfLongs set = new FastSetOfLongs();

            set.Add(index3d);
            lock (roomsByChunkIndexLock)
            {
                roomsByChunkIndex.TryGetValue(index3d, out chunkrooms);
                if (chunkrooms != null)
                {
                    set.Add(index3d);
                    for (int i = 0; i < chunkrooms.Rooms.Count; i++)
                    {
                        cuboid = chunkrooms.Rooms[i].Location;
                        int x1 = cuboid.Start.X / chunksize;
                        int x2 = cuboid.End.X / chunksize;
                        int y1 = cuboid.Start.Y / chunksize;
                        int y2 = cuboid.End.Y / chunksize;
                        int z1 = cuboid.Start.Z / chunksize;
                        int z2 = cuboid.End.Z / chunksize;
                        set.Add(MapUtil.Index3dL(x1, y1, z1, chunkMapSizeX, chunkMapSizeZ));
                        if (z2 != z1)
                        {
                            set.Add(MapUtil.Index3dL(x1, y1, z2, chunkMapSizeX, chunkMapSizeZ));
                        }
                        if (y2 != y1)
                        {
                            set.Add(MapUtil.Index3dL(x1, y2, z1, chunkMapSizeX, chunkMapSizeZ));
                            if (z2 != z1)
                            {
                                set.Add(MapUtil.Index3dL(x1, y2, z2, chunkMapSizeX, chunkMapSizeZ));
                            }
                        }
                        if (x2 != x1)
                        {
                            set.Add(MapUtil.Index3dL(x2, y1, z1, chunkMapSizeX, chunkMapSizeZ));
                            if (z2 != z1)
                            {
                                set.Add(MapUtil.Index3dL(x2, y1, z2, chunkMapSizeX, chunkMapSizeZ));
                            }
                            if (y2 != y1)
                            {
                                set.Add(MapUtil.Index3dL(x2, y2, z1, chunkMapSizeX, chunkMapSizeZ));
                                if (z2 != z1)
                                {
                                    set.Add(MapUtil.Index3dL(x2, y2, z2, chunkMapSizeX, chunkMapSizeZ));
                                }
                            }
                        }
                    }
                }
                foreach (long index in set)
                {
                    roomsByChunkIndex.Remove(index);
                }
            }
        }
Пример #4
0
        private void Event_ChunkDirty(Vec3i chunkCoord, IWorldChunk chunk, EnumChunkDirtyReason reason)
        {
            long index3d = MapUtil.Index3dL(chunkCoord.X, chunkCoord.Y, chunkCoord.Z, chunkMapSizeX, chunkMapSizeZ);

            lock (roomsByChunkIndexLock)
            {
                roomsByChunkIndex.Remove(index3d);
            }
        }
Пример #5
0
        private void Event_OnChunkDirty(Vec3i chunkCoord, IWorldChunk chunk, EnumChunkDirtyReason reason)
        {
            if (reason == EnumChunkDirtyReason.NewlyCreated || !mapSink.IsOpened)
            {
                return;
            }

            if (!loadedMapData.ContainsKey(new Vec2i(chunkCoord.X, chunkCoord.Z)))
            {
                return;
            }

            lock (chunksToGenLock)
            {
                chunksToGen.Enqueue(new Vec2i(chunkCoord.X, chunkCoord.Z));
            }
        }