package com.plotsquared.nukkit.util.block; import cn.nukkit.block.Block; import cn.nukkit.level.Level; import cn.nukkit.level.format.FullChunk; import cn.nukkit.level.format.generic.BaseFullChunk; import cn.nukkit.level.generator.biome.Biome; import cn.nukkit.math.Vector3; import com.intellectualcrafters.plot.PS; import com.intellectualcrafters.plot.object.PlotBlock; import com.intellectualcrafters.plot.util.block.BasicLocalBlockQueue; import com.plotsquared.nukkit.NukkitMain; public class NukkitLocalQueue<T> extends BasicLocalBlockQueue<T> { private final Level level; public NukkitLocalQueue(String world) { super(world); this.level = ((NukkitMain) PS.get().IMP).getServer().getLevelByName(world); } @Override public LocalChunk<T> getLocalChunk(int x, int z) { return (LocalChunk<T>) new BasicLocalChunk(this, x, z) { // Custom stuff? }; } @Override public void optimize() { } @Override public PlotBlock getBlock(int x, int y, int z) { Block block = level.getBlock(getMut(x, y, z)); if (block == null) { return PlotBlock.get(0, 0); } int id = block.getId(); if (id == 0) { return PlotBlock.get(0, 0); } return PlotBlock.get(id, block.getDamage()); } @Override public void refreshChunk(int x, int z) { } @Override public void fixChunkLighting(int x, int z) { // Do nothing } @Override public final void regenChunk(int x, int z) { level.regenerateChunk(x, z); } @Override public final void setComponents(LocalChunk<T> lc) { setBlocks(lc); setBiomes(lc); } public BaseFullChunk getChunk(int x, int z) { return level.getChunk(x, z); } private Vector3 mutable; private Vector3 getMut(int x, int y, int z) { mutable.x = x; mutable.y = y; mutable.z = z; return mutable; } public void setBlocks(LocalChunk<T> lc) { FullChunk chunk = level.getChunk(lc.getX(), lc.getZ(), true); for (int layer = 0; layer < lc.blocks.length; layer++) { PlotBlock[] blocksLayer = (PlotBlock[]) lc.blocks[layer]; if (blocksLayer != null) { int by = layer << 4; int j = 0; for (int y = by; y < by + 16; y++) { for (int z = 0; z < 16; z++) { for (int x = 0; x < 16; x++, j++) { PlotBlock block = blocksLayer[j]; if (block != null) { chunk.setBlock(x, y, z, (int) block.id, (int) block.data); } } } } } } } public void setBiomes(LocalChunk<T> lc) { if (lc.biomes != null) { int bx = lc.getX() << 4; int bz = lc.getX() << 4; String last = null; int biome = -1; for (int x = 0; x < lc.biomes.length; x++) { String[] biomes2 = lc.biomes[x]; if (biomes2 != null) { for (int y = 0; y < biomes2.length; y++) { String biomeStr = biomes2[y]; if (biomeStr != null) { biome = Biome.getBiome(biomeStr.toUpperCase()).getId(); level.setBiomeId(bx + x, bz + y, biome); } } } } } } }