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; } } }
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; } } }