Mirror von
https://github.com/PaperMC/Paper.git
synchronisiert 2024-12-16 19:40:07 +01:00
18f0f8d1ca
Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: 312281ea PR-742: Make World implement Keyed CraftBukkit Changes: 2ac7fa7a SPIGOT-7014: getLootTable API should not persistently update loot table 7fdd7941 PR-1046: Make World implement Keyed 7bc728a6 PR-1045: Revert changes to persistence required checks Spigot Changes: b6d12d17 Rebuild patches
75 Zeilen
4.1 KiB
Diff
75 Zeilen
4.1 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Brody Beckwith <brody@beckwith.dev>
|
|
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<ClientGamePa
|
|
|
|
}
|
|
|
|
+ // Paper start
|
|
+ public ClientboundSectionBlocksUpdatePacket(SectionPos sectionPos, it.unimi.dsi.fastutil.shorts.Short2ObjectMap<BlockState> 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 bf90519f04598ccd3f9a1515817524bbf3ab288c..68c3d6bde1e1e25a9032c22a2d5dddb4baf10059 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
|
|
@@ -30,6 +30,7 @@ import javax.annotation.Nullable;
|
|
import net.minecraft.Util;
|
|
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.ChatType;
|
|
@@ -860,6 +861,35 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
|
this.getHandle().connection.send(packet);
|
|
}
|
|
|
|
+ // Paper start
|
|
+ @Override
|
|
+ public void sendMultiBlockChange(Map<Location, BlockData> blockChanges, boolean suppressLightUpdates) {
|
|
+ if (this.getHandle().connection == null) return;
|
|
+
|
|
+ Map<SectionPos, it.unimi.dsi.fastutil.shorts.Short2ObjectMap<net.minecraft.world.level.block.state.BlockState>> sectionMap = new HashMap<>();
|
|
+
|
|
+ for (Map.Entry<Location, BlockData> 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<net.minecraft.world.level.block.state.BlockState> sectionData = sectionMap.computeIfAbsent(sectionPos, key -> new it.unimi.dsi.fastutil.shorts.Short2ObjectArrayMap<>());
|
|
+ sectionData.put(SectionPos.sectionRelativePos(blockPos), ((CraftBlockData) blockData).getState());
|
|
+ }
|
|
+
|
|
+ for (Map.Entry<SectionPos, it.unimi.dsi.fastutil.shorts.Short2ObjectMap<net.minecraft.world.level.block.state.BlockState>> entry : sectionMap.entrySet()) {
|
|
+ SectionPos sectionPos = entry.getKey();
|
|
+ it.unimi.dsi.fastutil.shorts.Short2ObjectMap<net.minecraft.world.level.block.state.BlockState> 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");
|