|
| 1 | +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
| 2 | +From: Brody Beckwith <brody@beckwith.dev> |
| 3 | +Date: Fri, 14 Jan 2022 00:41:11 -0500 |
| 4 | +Subject: [PATCH] Multi Block Change API Implementation |
| 5 | + |
| 6 | + |
| 7 | +diff --git a/src/main/java/net/minecraft/network/protocol/game/ClientboundSectionBlocksUpdatePacket.java b/src/main/java/net/minecraft/network/protocol/game/ClientboundSectionBlocksUpdatePacket.java |
| 8 | +index 82ea4fabd5732052a286d50bcff8bbcc2c4aa7d7..652bea6868a03a5315965f79c76172fb9dbb93fb 100644 |
| 9 | +--- a/src/main/java/net/minecraft/network/protocol/game/ClientboundSectionBlocksUpdatePacket.java |
| 10 | ++++ b/src/main/java/net/minecraft/network/protocol/game/ClientboundSectionBlocksUpdatePacket.java |
| 11 | +@@ -54,6 +54,15 @@ public class ClientboundSectionBlocksUpdatePacket implements Packet<ClientGamePa |
| 12 | + |
| 13 | + } |
| 14 | + |
| 15 | ++ // Paper start |
| 16 | ++ public ClientboundSectionBlocksUpdatePacket(SectionPos sectionPos, it.unimi.dsi.fastutil.shorts.Short2ObjectMap<BlockState> blockChanges, boolean suppressLightUpdates) { |
| 17 | ++ this.sectionPos = sectionPos; |
| 18 | ++ this.positions = blockChanges.keySet().toShortArray(); |
| 19 | ++ this.states = blockChanges.values().toArray(new BlockState[0]); |
| 20 | ++ this.suppressLightUpdates = suppressLightUpdates; |
| 21 | ++ } |
| 22 | ++ // Paper end |
| 23 | ++ |
| 24 | + @Override |
| 25 | + public void write(FriendlyByteBuf buf) { |
| 26 | + buf.writeLong(this.sectionPos.asLong()); |
| 27 | +diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java |
| 28 | +index 148e1985017f6955267b5c970730645394d700f6..43d96760828e4c9683398f3f6925701d003556e4 100644 |
| 29 | +--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java |
| 30 | ++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java |
| 31 | +@@ -30,6 +30,7 @@ import javax.annotation.Nullable; |
| 32 | + import net.minecraft.Util; |
| 33 | + import net.minecraft.advancements.AdvancementProgress; |
| 34 | + import net.minecraft.core.BlockPos; |
| 35 | ++import net.minecraft.core.SectionPos; // Paper |
| 36 | + import net.minecraft.nbt.CompoundTag; |
| 37 | + import net.minecraft.network.FriendlyByteBuf; |
| 38 | + import net.minecraft.network.chat.ChatType; |
| 39 | +@@ -836,6 +837,35 @@ public class CraftPlayer extends CraftHumanEntity implements Player { |
| 40 | + this.getHandle().connection.send(packet); |
| 41 | + } |
| 42 | + |
| 43 | ++ // Paper start |
| 44 | ++ @Override |
| 45 | ++ public void sendMultiBlockChange(Map<Location, BlockData> blockChanges, boolean suppressLightUpdates) { |
| 46 | ++ if (this.getHandle().connection == null) return; |
| 47 | ++ |
| 48 | ++ Map<SectionPos, it.unimi.dsi.fastutil.shorts.Short2ObjectMap<net.minecraft.world.level.block.state.BlockState>> sectionMap = new HashMap<>(); |
| 49 | ++ |
| 50 | ++ for (Map.Entry<Location, BlockData> entry : blockChanges.entrySet()) { |
| 51 | ++ Location location = entry.getKey(); |
| 52 | ++ if (!location.getWorld().equals(this.getWorld())) continue; |
| 53 | ++ |
| 54 | ++ BlockData blockData = entry.getValue(); |
| 55 | ++ BlockPos blockPos = new BlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ()); |
| 56 | ++ SectionPos sectionPos = SectionPos.of(blockPos); |
| 57 | ++ |
| 58 | ++ it.unimi.dsi.fastutil.shorts.Short2ObjectMap<net.minecraft.world.level.block.state.BlockState> sectionData = sectionMap.computeIfAbsent(sectionPos, key -> new it.unimi.dsi.fastutil.shorts.Short2ObjectArrayMap<>()); |
| 59 | ++ sectionData.put(SectionPos.sectionRelativePos(blockPos), ((CraftBlockData) blockData).getState()); |
| 60 | ++ } |
| 61 | ++ |
| 62 | ++ for (Map.Entry<SectionPos, it.unimi.dsi.fastutil.shorts.Short2ObjectMap<net.minecraft.world.level.block.state.BlockState>> entry : sectionMap.entrySet()) { |
| 63 | ++ SectionPos sectionPos = entry.getKey(); |
| 64 | ++ it.unimi.dsi.fastutil.shorts.Short2ObjectMap<net.minecraft.world.level.block.state.BlockState> blockData = entry.getValue(); |
| 65 | ++ |
| 66 | ++ net.minecraft.network.protocol.game.ClientboundSectionBlocksUpdatePacket packet = new net.minecraft.network.protocol.game.ClientboundSectionBlocksUpdatePacket(sectionPos, blockData, suppressLightUpdates); |
| 67 | ++ this.getHandle().connection.send(packet); |
| 68 | ++ } |
| 69 | ++ } |
| 70 | ++ // Paper end |
| 71 | ++ |
| 72 | + @Override |
| 73 | + public void sendBlockDamage(Location loc, float progress) { |
| 74 | + Preconditions.checkArgument(loc != null, "loc must not be null"); |
0 commit comments