internal void processBlockUpdates(Vec2i coord, UpdateSnowLayerChunk updateChunk, IBulkBlockAccessor ba) { int chunkX = coord.X; int chunkZ = coord.Y; var setblocks = updateChunk.SetBlocks; double lastSnowAccumUpdateTotalHours = updateChunk.LastSnowAccumUpdateTotalHours; IMapChunk mc = sapi.WorldManager.GetMapChunk(chunkX, chunkZ); if (mc == null) { return; // No longer loaded, we can just ditch it and re-do the thing again next time it gets loaded again } Vec2i tmpVec = new Vec2i(); foreach (var sval in setblocks) { Block newblock = sval.Value.Block; float snowLevel = sval.Value.SnowLevel; Block hereblock = ba.GetBlock(sval.Key); tmpVec.Set(sval.Key.X, sval.Key.Z); if (snowLevel > 0 && !mc.SnowAccum.ContainsKey(tmpVec)) { continue; // Must have gotten removed since we last checked in our seperate thread } hereblock.PerformSnowLevelUpdate(ba, sval.Key, newblock, snowLevel); } mc.SetData("lastSnowAccumUpdateTotalHours", SerializerUtil.Serialize <double>(lastSnowAccumUpdateTotalHours)); mc.MarkDirty(); }
internal void processBlockUpdates(IMapChunk mc, UpdateSnowLayerChunk updateChunk, IBulkBlockAccessor ba) { var setblocks = updateChunk.SetBlocks; double lastSnowAccumUpdateTotalHours = updateChunk.LastSnowAccumUpdateTotalHours; Vec2i tmpVec = new Vec2i(); foreach (var sval in setblocks) { Block newblock = sval.Value.Block; float snowLevel = sval.Value.SnowLevel; Block hereblock = ba.GetBlock(sval.Key); tmpVec.Set(sval.Key.X, sval.Key.Z); if (snowLevel > 0 && !mc.SnowAccum.ContainsKey(tmpVec)) { continue; // Must have gotten removed since we last checked in our seperate thread } hereblock.PerformSnowLevelUpdate(ba, sval.Key, newblock, snowLevel); } mc.SetModdata("lastSnowAccumUpdateTotalHours", SerializerUtil.Serialize <double>(lastSnowAccumUpdateTotalHours)); mc.MarkDirty(); }
void rebuildRainmap(int cx, int cz) { ICoreServerAPI sapi = api as ICoreServerAPI; int ymax = sapi.WorldManager.MapSizeY / sapi.WorldManager.ChunkSize; IServerChunk[] column = new IServerChunk[ymax]; int chunksize = sapi.WorldManager.ChunkSize; IMapChunk mapchunk = null; for (int cy = 0; cy < ymax; cy++) { column[cy] = sapi.WorldManager.GetChunk(cx, cy, cz); column[cy]?.Unpack(); mapchunk = column[cy]?.MapChunk; } if (mapchunk == null) { return; } for (int dx = 0; dx < chunksize; dx++) { for (int dz = 0; dz < chunksize; dz++) { for (int dy = sapi.WorldManager.MapSizeY - 1; dy >= 0; dy--) { IServerChunk chunk = column[dy / chunksize]; if (chunk == null) { continue; } int index = ((dy % chunksize) * chunksize + dz) * chunksize + dx; Block block = sapi.World.Blocks[chunk.Blocks[index]]; if (!block.RainPermeable || dy == 0) { mapchunk.RainHeightMap[dz * chunksize + dx] = (ushort)dy; break; } } } } sapi.WorldManager.ResendMapChunk(cx, cz, true); mapchunk.MarkDirty(); }