diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/player/ShowFakeCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/player/ShowFakeCommand.java index 1cbd93a04e..e15a311436 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/player/ShowFakeCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/player/ShowFakeCommand.java @@ -14,6 +14,7 @@ import com.denizenscript.denizencore.scripts.ScriptEntry; import com.denizenscript.denizencore.scripts.commands.AbstractCommand; +import java.util.ArrayList; import java.util.List; public class ShowFakeCommand extends AbstractCommand { @@ -95,8 +96,8 @@ else if (!scriptEntry.hasObject("locations") } if (!scriptEntry.hasObject("players") && Utilities.entryHasPlayer(scriptEntry)) { - ListTag players = new ListTag(); - players.addObject(Utilities.getEntryPlayer(scriptEntry)); + List players = new ArrayList<>(); + players.add(Utilities.getEntryPlayer(scriptEntry)); scriptEntry.defaultObject("players", players); } diff --git a/v1_14/src/main/java/com/denizenscript/denizen/nms/v1_14/impl/network/handlers/FakeBlockHelper.java b/v1_14/src/main/java/com/denizenscript/denizen/nms/v1_14/impl/network/handlers/FakeBlockHelper.java index a65416efab..cd2ca67440 100644 --- a/v1_14/src/main/java/com/denizenscript/denizen/nms/v1_14/impl/network/handlers/FakeBlockHelper.java +++ b/v1_14/src/main/java/com/denizenscript/denizen/nms/v1_14/impl/network/handlers/FakeBlockHelper.java @@ -8,6 +8,7 @@ import org.bukkit.craftbukkit.v1_14_R1.block.data.CraftBlockData; import java.lang.reflect.Field; +import java.util.Arrays; import java.util.List; public class FakeBlockHelper { @@ -33,6 +34,16 @@ public static boolean anyBlocksInSection(List blocks, int y) { return false; } + public static void pushByteArrayToLongArrayBE(byte[] bits, long[] longs) { + for (int i = 0; i < bits.length; i++) { + int longIndex = i >> 3; + int startBit = longIndex * 8; + if (longIndex >= longs.length) { + break; + } + longs[longIndex] |= ((long) bits[i]) << (7 - (i - startBit)); + } + } public static IBlockData blockInPalette(int paletteId) { return ChunkSection.GLOBAL_PALETTE.a(paletteId); } @@ -68,29 +79,18 @@ public static void writeWideInt(PacketDataSerializer serial, int value, int widt } } - public static int getWidthFor(int value) { - if (value < 256) { - return 1; - } - if (value < 256 * 256) { - return 2; - } - if (value < 256 * 256 * 256) { - return 3; - } - return 4; - } - public static void handleMapChunkPacket(PacketPlayOutMapChunk packet, List blocks) { try { - // TODO: properly update HeightMap and BlockEntities? + // TODO: properly update HeightMap? int bitmask = BITMASK_MAPCHUNK.getInt(packet); byte[] data = (byte[]) DATA_MAPCHUNK.get(packet); PacketDataSerializer serial = new PacketDataSerializer(Unpooled.wrappedBuffer(data)); PacketDataSerializer outputSerial = new PacketDataSerializer(Unpooled.buffer(data.length)); - byte[] blockDataHelper = new byte[4 * 16 * 16 * 16]; // 16,384 - int[] blockListHelper = new int[16 * 16 * 16]; - + boolean isFull = packet.f(); + // TODO: Handle blockEntities? + //List blockEntities = (List) BLOCKENTITIES_MAPCHUNK.get(packet); + //NBTTagList blockEntitiesList = new NBTTagList(); + //blockEntitiesList.addAll(blockEntities); for (int y = 0; y < 16; y++) { if ((bitmask & (1 << y)) != 0) { int blockCount = serial.readShort(); @@ -101,21 +101,23 @@ public static void handleMapChunkPacket(PacketPlayOutMapChunk packet, List width) { + DataBits newBits = new DataBits(newWdith, 4096); + for (int i = 0; i < bits.b(); i++) { + newBits.a(i, bits.a(i)); + } + bits = newBits; + width = newWdith; + } } - blockListHelper[blockIndex] = subPaletteId; + bits.a(blockIndex, subPaletteId); } } - width = getWidthFor(paletteLen); - for (int i = 0; i < blockListHelper.length; i++) { - writeWideInt(outputSerial, blockListHelper[i], width); + int[] testOut = new int[bits.b()]; + for (int i = 0; i < testOut.length; i++) { + testOut[i] = bits.a(i); } + Debug.log("Blocks: " + Arrays.toString(testOut)); + outputSerial.writeByte(width); + outputSerial.d(paletteLen); + Debug.log("Palette: " + Arrays.toString(palette) + ", endWidth: " + width); + for (int p = 0; p < palette.length; p++) { + outputSerial.d(palette[p]); + } + outputSerial.a(bits.a()); } } + if (isFull) { + // biomes + outputSerial.writeBytes(serial, 256 * 4); + } byte[] outputBytes = outputSerial.array(); DATA_MAPCHUNK.set(packet, outputBytes); }