Search in sources :

Example 1 with FakeBlock

use of com.denizenscript.denizen.utilities.blocks.FakeBlock in project Denizen-For-Bukkit by DenizenScript.

the class DenizenNetworkManagerImpl method processShowFakeForPacket.

public boolean processShowFakeForPacket(Packet<?> packet, GenericFutureListener<? extends Future<? super Void>> genericfuturelistener) {
    if (FakeBlock.blocks.isEmpty()) {
        return false;
    }
    try {
        if (packet instanceof PacketPlayOutMapChunk) {
            FakeBlock.FakeBlockMap map = FakeBlock.blocks.get(player.getUniqueID());
            if (map == null) {
                return false;
            }
            int chunkX = CHUNKX_MAPCHUNK.getInt(packet);
            int chunkZ = CHUNKZ_MAPCHUNK.getInt(packet);
            ChunkCoordinate chunkCoord = new ChunkCoordinate(chunkX, chunkZ, player.getWorld().getWorld().getName());
            List<FakeBlock> blocks = FakeBlock.getFakeBlocksFor(player.getUniqueID(), chunkCoord);
            if (blocks == null || blocks.isEmpty()) {
                return false;
            }
            PacketPlayOutMapChunk newPacket = FakeBlockHelper.handleMapChunkPacket((PacketPlayOutMapChunk) packet, blocks);
            oldManager.sendPacket(newPacket, genericfuturelistener);
            return true;
        } else if (packet instanceof PacketPlayOutMultiBlockChange) {
            FakeBlock.FakeBlockMap map = FakeBlock.blocks.get(player.getUniqueID());
            if (map == null) {
                return false;
            }
            SectionPosition coord = (SectionPosition) SECTIONPOS_MULTIBLOCKCHANGE.get(packet);
            ChunkCoordinate coordinateDenizen = new ChunkCoordinate(coord.getX(), coord.getZ(), player.getWorld().getWorld().getName());
            if (!map.byChunk.containsKey(coordinateDenizen)) {
                return false;
            }
            PacketPlayOutMultiBlockChange newPacket = new PacketPlayOutMultiBlockChange();
            copyPacket(packet, newPacket);
            LocationTag location = new LocationTag(player.getWorld().getWorld(), 0, 0, 0);
            short[] originalOffsetArray = (short[]) OFFSETARRAY_MULTIBLOCKCHANGE.get(newPacket);
            IBlockData[] originalDataArray = (IBlockData[]) BLOCKARRAY_MULTIBLOCKCHANGE.get(newPacket);
            short[] offsetArray = Arrays.copyOf(originalOffsetArray, originalOffsetArray.length);
            IBlockData[] dataArray = Arrays.copyOf(originalDataArray, originalDataArray.length);
            OFFSETARRAY_MULTIBLOCKCHANGE.set(newPacket, offsetArray);
            BLOCKARRAY_MULTIBLOCKCHANGE.set(newPacket, dataArray);
            for (int i = 0; i < offsetArray.length; i++) {
                short offset = offsetArray[i];
                BlockPosition pos = coord.g(offset);
                location.setX(pos.getX());
                location.setY(pos.getY());
                location.setZ(pos.getZ());
                FakeBlock block = map.byLocation.get(location);
                if (block != null) {
                    dataArray[i] = FakeBlockHelper.getNMSState(block);
                }
            }
            oldManager.sendPacket(newPacket, genericfuturelistener);
            return true;
        } else if (packet instanceof PacketPlayOutBlockChange) {
            BlockPosition pos = (BlockPosition) BLOCKPOS_BLOCKCHANGE.get(packet);
            LocationTag loc = new LocationTag(player.getWorld().getWorld(), pos.getX(), pos.getY(), pos.getZ());
            FakeBlock block = FakeBlock.getFakeBlockFor(player.getUniqueID(), loc);
            if (block != null) {
                PacketPlayOutBlockChange newPacket = new PacketPlayOutBlockChange();
                copyPacket(packet, newPacket);
                newPacket.block = FakeBlockHelper.getNMSState(block);
                oldManager.sendPacket(newPacket, genericfuturelistener);
                return true;
            }
        } else if (packet instanceof PacketPlayOutBlockBreak) {
            BlockPosition pos = (BlockPosition) BLOCKPOS_BLOCKBREAK.get(packet);
            LocationTag loc = new LocationTag(player.getWorld().getWorld(), pos.getX(), pos.getY(), pos.getZ());
            FakeBlock block = FakeBlock.getFakeBlockFor(player.getUniqueID(), loc);
            if (block != null) {
                PacketPlayOutBlockBreak newPacket = new PacketPlayOutBlockBreak();
                copyPacket(packet, newPacket);
                BLOCKDATA_BLOCKBREAK.set(newPacket, FakeBlockHelper.getNMSState(block));
                oldManager.sendPacket(newPacket, genericfuturelistener);
                return true;
            }
        }
    } catch (Exception ex) {
        Debug.echoError(ex);
    }
    return false;
}
Also used : ChunkCoordinate(com.denizenscript.denizen.utilities.blocks.ChunkCoordinate) FakeBlock(com.denizenscript.denizen.utilities.blocks.FakeBlock) IOException(java.io.IOException) LocationTag(com.denizenscript.denizen.objects.LocationTag)

Example 2 with FakeBlock

use of com.denizenscript.denizen.utilities.blocks.FakeBlock in project Denizen-For-Bukkit by DenizenScript.

the class FakeBlockHelper method anyBlocksInSection.

public static boolean anyBlocksInSection(List<FakeBlock> blocks, int y) {
    int minY = y << 4;
    int maxY = (y << 4) + 16;
    for (FakeBlock block : blocks) {
        int blockY = block.location.getBlockY();
        if (blockY >= minY && blockY < maxY) {
            return true;
        }
    }
    return false;
}
Also used : FakeBlock(com.denizenscript.denizen.utilities.blocks.FakeBlock)

Example 3 with FakeBlock

use of com.denizenscript.denizen.utilities.blocks.FakeBlock in project Denizen-For-Bukkit by DenizenScript.

the class DenizenNetworkManagerImpl method processShowFakeForPacket.

public boolean processShowFakeForPacket(Packet<?> packet, GenericFutureListener<? extends Future<? super Void>> genericfuturelistener) {
    if (FakeBlock.blocks.isEmpty()) {
        return false;
    }
    try {
        if (packet instanceof ClientboundLevelChunkPacket) {
            FakeBlock.FakeBlockMap map = FakeBlock.blocks.get(player.getUUID());
            if (map == null) {
                return false;
            }
            int chunkX = ((ClientboundLevelChunkPacket) packet).getX();
            int chunkZ = ((ClientboundLevelChunkPacket) packet).getZ();
            ChunkCoordinate chunkCoord = new ChunkCoordinate(chunkX, chunkZ, player.getLevel().getWorld().getName());
            List<FakeBlock> blocks = FakeBlock.getFakeBlocksFor(player.getUUID(), chunkCoord);
            if (blocks == null || blocks.isEmpty()) {
                return false;
            }
            ClientboundLevelChunkPacket newPacket = FakeBlockHelper.handleMapChunkPacket((ClientboundLevelChunkPacket) packet, blocks);
            oldManager.send(newPacket, genericfuturelistener);
            return true;
        } else if (packet instanceof ClientboundSectionBlocksUpdatePacket) {
            FakeBlock.FakeBlockMap map = FakeBlock.blocks.get(player.getUUID());
            if (map == null) {
                return false;
            }
            SectionPos coord = (SectionPos) SECTIONPOS_MULTIBLOCKCHANGE.get(packet);
            ChunkCoordinate coordinateDenizen = new ChunkCoordinate(coord.getX(), coord.getZ(), player.getLevel().getWorld().getName());
            if (!map.byChunk.containsKey(coordinateDenizen)) {
                return false;
            }
            ClientboundSectionBlocksUpdatePacket newPacket = new ClientboundSectionBlocksUpdatePacket(copyPacket(packet));
            LocationTag location = new LocationTag(player.getLevel().getWorld(), 0, 0, 0);
            short[] originalOffsetArray = (short[]) OFFSETARRAY_MULTIBLOCKCHANGE.get(newPacket);
            BlockState[] originalDataArray = (BlockState[]) BLOCKARRAY_MULTIBLOCKCHANGE.get(newPacket);
            short[] offsetArray = Arrays.copyOf(originalOffsetArray, originalOffsetArray.length);
            BlockState[] dataArray = Arrays.copyOf(originalDataArray, originalDataArray.length);
            OFFSETARRAY_MULTIBLOCKCHANGE.set(newPacket, offsetArray);
            BLOCKARRAY_MULTIBLOCKCHANGE.set(newPacket, dataArray);
            for (int i = 0; i < offsetArray.length; i++) {
                short offset = offsetArray[i];
                BlockPos pos = coord.relativeToBlockPos(offset);
                location.setX(pos.getX());
                location.setY(pos.getY());
                location.setZ(pos.getZ());
                FakeBlock block = map.byLocation.get(location);
                if (block != null) {
                    dataArray[i] = FakeBlockHelper.getNMSState(block);
                }
            }
            oldManager.send(newPacket, genericfuturelistener);
            return true;
        } else if (packet instanceof ClientboundBlockUpdatePacket) {
            BlockPos pos = ((ClientboundBlockUpdatePacket) packet).getPos();
            LocationTag loc = new LocationTag(player.getLevel().getWorld(), pos.getX(), pos.getY(), pos.getZ());
            FakeBlock block = FakeBlock.getFakeBlockFor(player.getUUID(), loc);
            if (block != null) {
                ClientboundBlockUpdatePacket newPacket = new ClientboundBlockUpdatePacket(((ClientboundBlockUpdatePacket) packet).getPos(), FakeBlockHelper.getNMSState(block));
                oldManager.send(newPacket, genericfuturelistener);
                return true;
            }
        } else if (packet instanceof ClientboundBlockBreakAckPacket) {
            BlockPos pos = ((ClientboundBlockBreakAckPacket) packet).getPos();
            LocationTag loc = new LocationTag(player.getLevel().getWorld(), pos.getX(), pos.getY(), pos.getZ());
            FakeBlock block = FakeBlock.getFakeBlockFor(player.getUUID(), loc);
            if (block != null) {
                ClientboundBlockBreakAckPacket newPacket = new ClientboundBlockBreakAckPacket(copyPacket(packet));
                BLOCKDATA_BLOCKBREAK.set(newPacket, FakeBlockHelper.getNMSState(block));
                oldManager.send(newPacket, genericfuturelistener);
                return true;
            }
        }
    } catch (Exception ex) {
        Debug.echoError(ex);
    }
    return false;
}
Also used : ChunkCoordinate(com.denizenscript.denizen.utilities.blocks.ChunkCoordinate) FakeBlock(com.denizenscript.denizen.utilities.blocks.FakeBlock) LocationTag(com.denizenscript.denizen.objects.LocationTag) BlockState(net.minecraft.world.level.block.state.BlockState) BlockPos(net.minecraft.core.BlockPos) SectionPos(net.minecraft.core.SectionPos)

Example 4 with FakeBlock

use of com.denizenscript.denizen.utilities.blocks.FakeBlock in project Denizen-For-Bukkit by DenizenScript.

the class FakeBlockHelper method handleMapChunkPacket.

public static ClientboundLevelChunkPacket handleMapChunkPacket(ClientboundLevelChunkPacket originalPacket, List<FakeBlock> blocks) {
    try {
        ClientboundLevelChunkPacket packet = new ClientboundLevelChunkPacket(DenizenNetworkManagerImpl.copyPacket(originalPacket));
        copyPacketPaperPatch(packet, originalPacket);
        // TODO: properly update HeightMap?
        BitSet bitmask = packet.getAvailableSections();
        FriendlyByteBuf serial = originalPacket.getReadBuffer();
        FriendlyByteBuf outputSerial = new FriendlyByteBuf(Unpooled.buffer(serial.readableBytes()));
        List<net.minecraft.nbt.CompoundTag> blockEntities = new ArrayList<>(packet.getBlockEntitiesTags());
        BLOCKENTITIES_MAPCHUNK.set(packet, blockEntities);
        ListIterator<CompoundTag> iterator = blockEntities.listIterator();
        while (iterator.hasNext()) {
            net.minecraft.nbt.CompoundTag blockEnt = iterator.next();
            int x = blockEnt.getInt("x");
            int y = blockEnt.getInt("y");
            int z = blockEnt.getInt("z");
            for (FakeBlock block : blocks) {
                LocationTag loc = block.location;
                if (loc.getBlockX() == x && loc.getBlockY() == y && loc.getBlockZ() == z && block.material != null) {
                    iterator.remove();
                    break;
                }
            }
        }
        for (FakeBlock block : blocks) {
            if (block.material != null) {
                LocationTag loc = block.location;
                net.minecraft.nbt.CompoundTag newCompound = new net.minecraft.nbt.CompoundTag();
                newCompound.putInt("x", loc.getBlockX());
                newCompound.putInt("y", loc.getBlockY());
                newCompound.putInt("z", loc.getBlockZ());
                newCompound.putString("id", block.material.getMaterial().getKey().toString());
                blockEntities.add(newCompound);
            }
        }
        for (int y = 0; y < 16; y++) {
            if (bitmask.get(y)) {
                int blockCount = serial.readShort();
                int width = serial.readUnsignedByte();
                int paletteLen = serial.readVarInt();
                int[] palette = new int[paletteLen];
                for (int p = 0; p < paletteLen; p++) {
                    palette[p] = serial.readVarInt();
                }
                int dataLen = serial.readVarInt();
                long[] blockListHelper = new long[dataLen];
                for (int i = 0; i < blockListHelper.length; i++) {
                    blockListHelper[i] = serial.readLong();
                }
                outputSerial.writeShort(blockCount);
                if (!anyBlocksInSection(blocks, y)) {
                    outputSerial.writeByte(width);
                    outputSerial.writeVarInt(paletteLen);
                    for (int p = 0; p < paletteLen; p++) {
                        outputSerial.writeVarInt(palette[p]);
                    }
                    outputSerial.writeLongArray(blockListHelper);
                    continue;
                }
                char dataBitsF = (char) (64 / width);
                int expectedLength = (4096 + dataBitsF - 1) / dataBitsF;
                if (blockListHelper.length != expectedLength) {
                    // This chunk is too-complex and is using non-standard chunk format. For now, just ignore it.
                    return originalPacket;
                // TODO: Add support for processing very-complex chunks (DataPaletteHash might be responsible for the unique format?)
                }
                BitStorage bits = new BitStorage(width, 4096, blockListHelper);
                int minY = y << 4;
                int maxY = (y << 4) + 16;
                for (FakeBlock block : blocks) {
                    if (block.material != null) {
                        int blockY = block.location.getBlockY();
                        if (blockY >= minY && blockY < maxY) {
                            int blockX = block.location.getBlockX();
                            int blockZ = block.location.getBlockZ();
                            blockX -= (blockX >> 4) * 16;
                            blockY -= (blockY >> 4) * 16;
                            blockZ -= (blockZ >> 4) * 16;
                            int blockIndex = blockArrayIndex(blockX, blockY, blockZ);
                            BlockState replacementData = getNMSState(block);
                            int globalPaletteIndex = indexInPalette(replacementData);
                            int subPaletteId = getPaletteSubId(palette, globalPaletteIndex);
                            if (subPaletteId == -1) {
                                int[] newPalette = new int[paletteLen + 1];
                                if (paletteLen >= 0)
                                    System.arraycopy(palette, 0, newPalette, 0, paletteLen);
                                newPalette[paletteLen] = globalPaletteIndex;
                                subPaletteId = paletteLen;
                                paletteLen++;
                                palette = newPalette;
                                int newWidth = Mth.ceillog2(paletteLen);
                                if (newWidth > width) {
                                    BitStorage newBits = new BitStorage(newWidth, 4096);
                                    for (int i = 0; i < bits.getSize(); i++) {
                                        newBits.getAndSet(i, bits.get(i));
                                    }
                                    bits = newBits;
                                    width = newWidth;
                                }
                            }
                            bits.getAndSet(blockIndex, subPaletteId);
                        }
                    }
                }
                outputSerial.writeByte(width);
                outputSerial.writeVarInt(paletteLen);
                for (int p = 0; p < palette.length; p++) {
                    outputSerial.writeVarInt(palette[p]);
                }
                outputSerial.writeLongArray(bits.getRaw());
            }
        }
        int[] biomes = packet.getBiomes();
        if (biomes != null) {
            outputSerial.writeVarIntArray(biomes);
        }
        byte[] outputBytes = outputSerial.array();
        DATA_MAPCHUNK.set(packet, outputBytes);
        return packet;
    } catch (Exception ex) {
        Debug.echoError(ex);
    }
    return null;
}
Also used : FriendlyByteBuf(net.minecraft.network.FriendlyByteBuf) BitSet(java.util.BitSet) ArrayList(java.util.ArrayList) FakeBlock(com.denizenscript.denizen.utilities.blocks.FakeBlock) LocationTag(com.denizenscript.denizen.objects.LocationTag) CompoundTag(net.minecraft.nbt.CompoundTag) BlockState(net.minecraft.world.level.block.state.BlockState) ClientboundLevelChunkPacket(net.minecraft.network.protocol.game.ClientboundLevelChunkPacket) CompoundTag(net.minecraft.nbt.CompoundTag) BitStorage(net.minecraft.util.BitStorage)

Example 5 with FakeBlock

use of com.denizenscript.denizen.utilities.blocks.FakeBlock in project Denizen-For-Bukkit by DenizenScript.

the class FakeBlockHelper method anyBlocksInSection.

public static boolean anyBlocksInSection(List<FakeBlock> blocks, int y) {
    int minY = y << 4;
    int maxY = (y << 4) + 16;
    for (FakeBlock block : blocks) {
        int blockY = block.location.getBlockY();
        if (blockY >= minY && blockY < maxY && block.material != null) {
            return true;
        }
    }
    return false;
}
Also used : FakeBlock(com.denizenscript.denizen.utilities.blocks.FakeBlock)

Aggregations

FakeBlock (com.denizenscript.denizen.utilities.blocks.FakeBlock)10 LocationTag (com.denizenscript.denizen.objects.LocationTag)6 BlockState (net.minecraft.world.level.block.state.BlockState)4 ChunkCoordinate (com.denizenscript.denizen.utilities.blocks.ChunkCoordinate)3 ArrayList (java.util.ArrayList)3 BlockPos (net.minecraft.core.BlockPos)2 SectionPos (net.minecraft.core.SectionPos)2 FriendlyByteBuf (net.minecraft.network.FriendlyByteBuf)2 Sidebar (com.denizenscript.denizen.nms.abstracts.Sidebar)1 DisguiseCommand (com.denizenscript.denizen.scripts.commands.player.DisguiseCommand)1 FakeEntity (com.denizenscript.denizen.utilities.entity.FakeEntity)1 IOException (java.io.IOException)1 BitSet (java.util.BitSet)1 List (java.util.List)1 ListIterator (java.util.ListIterator)1 CompoundTag (net.minecraft.nbt.CompoundTag)1 ClientboundLevelChunkPacket (net.minecraft.network.protocol.game.ClientboundLevelChunkPacket)1 ClientboundLevelChunkPacketData (net.minecraft.network.protocol.game.ClientboundLevelChunkPacketData)1 ClientboundLevelChunkWithLightPacket (net.minecraft.network.protocol.game.ClientboundLevelChunkWithLightPacket)1 BitStorage (net.minecraft.util.BitStorage)1