Beispiel #1
0
    void ApplyLightEmitting(int[] workportionArr, byte[] worklightArr, int[] dataLightRadius)
    {
        int[]         radiusArr    = dataLightRadius;
        const int     portionsize  = 16;
        const int     portionsize3 = portionsize * portionsize * portionsize;
        Vector3IntRef p            = new Vector3IntRef();

        for (int pos = 0; pos < portionsize3; pos++)
        {
            if (workportionArr[pos] >= 10)               //optimization
            {
                if (radiusArr[workportionArr[pos]] != 0) //optimization
                {
                    if (radiusArr[workportionArr[pos]] > worklightArr[pos])
                    {
                        MapUtilCi.PosInt(pos, portionsize, portionsize, p);
                        int xx = p.X;
                        int yy = p.Y;
                        int zz = p.Z;
                        int l  = radiusArr[workportionArr[pos]];
                        lighttoflood.Push(xx);
                        lighttoflood.Push(yy);
                        lighttoflood.Push(zz);
                        worklightArr[pos] = Game.IntToByte(MathCi.MaxInt(l, worklightArr[pos]));
                    }
                }
            }
        }
    }
    public override void Update(Server server, float dt)
    {
        int sizexchunks = server.mapsizexchunks();
        int sizeychunks = server.mapsizeychunks();
        int sizezchunks = server.mapsizezchunks();

        for (int i = 0; i < 100; i++)
        {
            MapUtilCi.PosInt(CompressUnusedIteration, sizexchunks, sizeychunks, chunkpos);
            ServerChunk c    = server.d_Map.GetChunkValid(chunkpos.X, chunkpos.Y, chunkpos.Z);
            bool        stop = false;
            if (c != null)
            {
                var  globalpos = new Vector3i(chunkpos.X * Server.chunksize, chunkpos.Y * Server.chunksize, chunkpos.Z * Server.chunksize);
                bool unload    = true;
                foreach (var k in server.clients)
                {
                    if (k.Value.IsBot)
                    {
                        // don't hold chunks in memory for bots
                        continue;
                    }
                    // unload distance = view distance + 60% (prevents chunks from being unloaded too early (square loading vs. circular unloading))
                    int viewdist = (int)(server.chunkdrawdistance * Server.chunksize * 1.8f);
                    if (server.DistanceSquared(server.PlayerBlockPosition(k.Value), globalpos) <= viewdist * viewdist)
                    {
                        //System.Console.WriteLine("No Unload:   {0},{1},{2}", chunkpos.X, chunkpos.Y, chunkpos.Z);
                        unload = false;
                    }
                }
                if (unload)
                {
                    // unload if chunk isn't seen by anyone
                    if (c.DirtyForSaving)
                    {
                        // save changes to disk if necessary
                        server.DoSaveChunk(chunkpos.X, chunkpos.Y, chunkpos.Z, c);
                    }
                    server.d_Map.SetChunkValid(chunkpos.X, chunkpos.Y, chunkpos.Z, null);
                    foreach (var client in server.clients)
                    {
                        // mark chunks unseen for all players
                        server.ClientSeenChunkRemove(client.Key, chunkpos.X, chunkpos.Y, chunkpos.Z);
                    }
                    stop = true;
                }
            }
            CompressUnusedIteration++;
            if (CompressUnusedIteration >= sizexchunks * sizeychunks * sizezchunks)
            {
                CompressUnusedIteration = 0;
            }
            if (stop)
            {
                // only unload one chunk at a time
                return;
            }
        }
    }
Beispiel #3
0
    public override void OnReadOnlyBackgroundThread(Game game_, float dt)
    {
        game = game_;

        chunksize      = Game.chunksize;
        mapsizexchunks = game.map.MapSizeX / chunksize;
        mapsizeychunks = game.map.MapSizeY / chunksize;
        mapsizezchunks = game.map.MapSizeZ / chunksize;

        int px = game.platform.FloatToInt(game.player.position.x) / chunksize;
        int py = game.platform.FloatToInt(game.player.position.z) / chunksize;
        int pz = game.platform.FloatToInt(game.player.position.y) / chunksize;

        int chunksxy = this.mapAreaSize() / chunksize / 2;
        int chunksz  = this.mapAreaSizeZ() / chunksize / 2;

        int startx = px - chunksxy;
        int endx   = px + chunksxy;
        int starty = py - chunksxy;
        int endy   = py + chunksxy;
        int startz = pz - chunksz;
        int endz   = pz + chunksz;

        if (startx < 0)
        {
            startx = 0;
        }
        if (starty < 0)
        {
            starty = 0;
        }
        if (startz < 0)
        {
            startz = 0;
        }
        if (endx >= mapsizexchunks)
        {
            endx = mapsizexchunks - 1;
        }
        if (endy >= mapsizeychunks)
        {
            endy = mapsizeychunks - 1;
        }
        if (endz >= mapsizezchunks)
        {
            endz = mapsizezchunks - 1;
        }

        int mapsizexchunks_ = mapsizexchunks;
        int mapsizeychunks_ = mapsizeychunks;
        int mapsizezchunks_ = mapsizezchunks;

        int count;

        if (game.platform.IsFastSystem())
        {
            count = 1000;
        }
        else
        {
            count = 250;
        }

        for (int i = 0; i < count; i++)
        {
            unloadIterationXy++;
            if (unloadIterationXy >= mapsizexchunks_ * mapsizeychunks_ * mapsizezchunks_)
            {
                unloadIterationXy = 0;
            }
            MapUtilCi.PosInt(unloadIterationXy, mapsizexchunks_, mapsizeychunks_, unloadxyztemp);
            int  x        = unloadxyztemp.X;
            int  y        = unloadxyztemp.Y;
            int  z        = unloadxyztemp.Z;
            int  pos      = MapUtilCi.Index3d(x, y, z, mapsizexchunks_, mapsizeychunks_);
            bool unloaded = false;

            Chunk c = game.map.chunks[pos];
            if (c == null ||
                c.rendered == null ||
                c.rendered.ids == null)
            {
                continue;
            }
            if (x < startx || y < starty || z < startz ||
                x > endx || y > endy || z > endz)
            {
                int unloadChunkPos = pos;

                UnloadRendererChunksCommit commit = new UnloadRendererChunksCommit();
                commit.game           = game;
                commit.unloadChunkPos = unloadChunkPos;
                game.QueueActionCommit(commit);
            }
            unloaded = true;
            if (unloaded)
            {
                break;
            }
        }
    }