From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Brody Beckwith Date: Fri, 14 Jan 2022 00:41:11 -0500 Subject: [PATCH] Multi Block Change API Implementation diff --git a/src/main/java/net/minecraft/network/protocol/game/ClientboundSectionBlocksUpdatePacket.java b/src/main/java/net/minecraft/network/protocol/game/ClientboundSectionBlocksUpdatePacket.java index 82ea4fabd5732052a286d50bcff8bbcc2c4aa7d7..652bea6868a03a5315965f79c76172fb9dbb93fb 100644 --- a/src/main/java/net/minecraft/network/protocol/game/ClientboundSectionBlocksUpdatePacket.java +++ b/src/main/java/net/minecraft/network/protocol/game/ClientboundSectionBlocksUpdatePacket.java @@ -54,6 +54,15 @@ public class ClientboundSectionBlocksUpdatePacket implements Packet blockChanges, boolean suppressLightUpdates) { + this.sectionPos = sectionPos; + this.positions = blockChanges.keySet().toShortArray(); + this.states = blockChanges.values().toArray(new BlockState[0]); + this.suppressLightUpdates = suppressLightUpdates; + } + // Paper end + @Override public void write(FriendlyByteBuf buf) { buf.writeLong(this.sectionPos.asLong()); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java index eb2a93a02006c95d50d6158d6ad03b1ea2c96c18..909693c50d75eebc8fcb5a091c561dda00ddfd8c 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -29,6 +29,7 @@ import java.util.logging.Logger; import javax.annotation.Nullable; import net.minecraft.advancements.AdvancementProgress; import net.minecraft.core.BlockPos; +import net.minecraft.core.SectionPos; // Paper import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.ChatSender; @@ -870,6 +871,35 @@ public class CraftPlayer extends CraftHumanEntity implements Player { this.getHandle().connection.send(packet); } + // Paper start + @Override + public void sendMultiBlockChange(Map blockChanges, boolean suppressLightUpdates) { + if (this.getHandle().connection == null) return; + + Map> sectionMap = new HashMap<>(); + + for (Map.Entry entry : blockChanges.entrySet()) { + Location location = entry.getKey(); + if (!location.getWorld().equals(this.getWorld())) continue; + + BlockData blockData = entry.getValue(); + BlockPos blockPos = new BlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ()); + SectionPos sectionPos = SectionPos.of(blockPos); + + it.unimi.dsi.fastutil.shorts.Short2ObjectMap sectionData = sectionMap.computeIfAbsent(sectionPos, key -> new it.unimi.dsi.fastutil.shorts.Short2ObjectArrayMap<>()); + sectionData.put(SectionPos.sectionRelativePos(blockPos), ((CraftBlockData) blockData).getState()); + } + + for (Map.Entry> entry : sectionMap.entrySet()) { + SectionPos sectionPos = entry.getKey(); + it.unimi.dsi.fastutil.shorts.Short2ObjectMap blockData = entry.getValue(); + + net.minecraft.network.protocol.game.ClientboundSectionBlocksUpdatePacket packet = new net.minecraft.network.protocol.game.ClientboundSectionBlocksUpdatePacket(sectionPos, blockData, suppressLightUpdates); + this.getHandle().connection.send(packet); + } + } + // Paper end + @Override public void sendBlockDamage(Location loc, float progress) { Preconditions.checkArgument(loc != null, "loc must not be null");