From 1e1b21830eac97c17478aec80a57806d4773b5d4 Mon Sep 17 00:00:00 2001 From: Yannick Lamprecht Date: Tue, 27 Feb 2024 17:22:16 +0100 Subject: [PATCH] more work --- .../0464-add-biome-change-per-player.patch | 46 ++++++++++++++----- .../1048-add-biome-change-per-player.patch | 31 +++++++------ 2 files changed, 51 insertions(+), 26 deletions(-) diff --git a/patches/api/0464-add-biome-change-per-player.patch b/patches/api/0464-add-biome-change-per-player.patch index 4425cc6aa894..38dd7fde6f83 100644 --- a/patches/api/0464-add-biome-change-per-player.patch +++ b/patches/api/0464-add-biome-change-per-player.patch @@ -6,7 +6,7 @@ Subject: [PATCH] add biome change per player diff --git a/src/main/java/io/papermc/paper/event/packet/PlayerBiomesLoadEvent.java b/src/main/java/io/papermc/paper/event/packet/PlayerBiomesLoadEvent.java new file mode 100644 -index 0000000000000000000000000000000000000000..8f19181f54c3e82e9c51101b8f56255fc6668d00 +index 0000000000000000000000000000000000000000..7774a3e3b19bfcaae319ea9ee03e85091be03a8b --- /dev/null +++ b/src/main/java/io/papermc/paper/event/packet/PlayerBiomesLoadEvent.java @@ -0,0 +1,82 @@ @@ -19,6 +19,7 @@ index 0000000000000000000000000000000000000000..8f19181f54c3e82e9c51101b8f56255f +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.event.HandlerList; ++import org.bukkit.event.world.ChunkEvent; +import org.bukkit.event.world.WorldEvent; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; @@ -32,16 +33,16 @@ index 0000000000000000000000000000000000000000..8f19181f54c3e82e9c51101b8f56255f + * Should only be used for packet/clientside related stuff. + * Not intended for modifying server side state. + */ -+public class PlayerBiomesLoadEvent extends WorldEvent { ++public class PlayerBiomesLoadEvent extends ChunkEvent { + + private static final HandlerList HANDLER_LIST = new HandlerList(); + + private final Player player; -+ private final Map chunkBiomesSnapshots = new HashMap<>(); ++ private BiomesSnapshot biomesSnapshot; + + @ApiStatus.Internal -+ public PlayerBiomesLoadEvent(@NotNull final Player player, World world) { -+ super(world); ++ public PlayerBiomesLoadEvent(@NotNull final Player player, Chunk chunk) { ++ super(chunk); + this.player = player; + } + @@ -67,20 +68,19 @@ index 0000000000000000000000000000000000000000..8f19181f54c3e82e9c51101b8f56255f + /** + * Returns a biomes snapshot for the given chunk, by default it won't be set. + * -+ * @param chunk the given chunk + * @return biome snapshot if one is set + */ -+ public @Nullable BiomesSnapshot getBiomeSnapshotAt(@NotNull Chunk chunk) { -+ return chunkBiomesSnapshots.get(chunk); ++ public @Nullable BiomesSnapshot getBiomeSnapshot() { ++ return biomesSnapshot; + } + + /** -+ * Sets the biome snapshot for the given chunk that will be send as an override to the player ++ * Sets the biome snapshot for the given chunk that will be sent as an override to the player + * + * @param biomesSnapshot the biome override + */ -+ public void setBiomeSnapshot(@NotNull Chunk chunk, @Nullable final BiomesSnapshot biomesSnapshot) { -+ this.chunkBiomesSnapshots.put(chunk, biomesSnapshot); ++ public void setBiomeSnapshot(@Nullable final BiomesSnapshot biomesSnapshot) { ++ this.biomesSnapshot = biomesSnapshot; + } + + /** @@ -89,9 +89,31 @@ index 0000000000000000000000000000000000000000..8f19181f54c3e82e9c51101b8f56255f + * @return true if override was made, else false + */ + public boolean hasOverrides() { -+ return !this.chunkBiomesSnapshots.isEmpty(); ++ return biomesSnapshot != null; + } +} +diff --git a/src/main/java/io/papermc/paper/event/packet/PlayerChunkLoadEvent.java b/src/main/java/io/papermc/paper/event/packet/PlayerChunkLoadEvent.java +index 3ddbc099a13df939b3912f30b54e7635840ba5a4..2933de0e9455720040619e52b7d4df66b5dbb717 100644 +--- a/src/main/java/io/papermc/paper/event/packet/PlayerChunkLoadEvent.java ++++ b/src/main/java/io/papermc/paper/event/packet/PlayerChunkLoadEvent.java +@@ -15,7 +15,7 @@ import org.jetbrains.annotations.NotNull; + * Should only be used for packet/clientside related stuff. + * Not intended for modifying server side state. + */ +-public class PlayerChunkLoadEvent extends ChunkEvent { ++public class PlayerChunkLoadEvent extends PlayerBiomesLoadEvent { + + private static final HandlerList HANDLER_LIST = new HandlerList(); + +@@ -23,7 +23,7 @@ public class PlayerChunkLoadEvent extends ChunkEvent { + + @ApiStatus.Internal + public PlayerChunkLoadEvent(@NotNull Chunk chunk, @NotNull Player player) { +- super(chunk); ++ super(player, chunk); + this.player = player; + } + diff --git a/src/main/java/org/bukkit/BiomesSnapshot.java b/src/main/java/org/bukkit/BiomesSnapshot.java new file mode 100644 index 0000000000000000000000000000000000000000..bb8683127eca2b86b23efa81bff9c54a357e04d4 diff --git a/patches/server/1048-add-biome-change-per-player.patch b/patches/server/1048-add-biome-change-per-player.patch index acf283284bfb..5468825bbadb 100644 --- a/patches/server/1048-add-biome-change-per-player.patch +++ b/patches/server/1048-add-biome-change-per-player.patch @@ -5,15 +5,15 @@ Subject: [PATCH] add biome change per player diff --git a/src/main/java/net/minecraft/network/protocol/game/ClientboundChunksBiomesPacket.java b/src/main/java/net/minecraft/network/protocol/game/ClientboundChunksBiomesPacket.java -index 51f647de153255c919b1440338cf1b3e2d6b5dbf..f525c51a1c888f76fa56528f204e4fac52416641 100644 +index 51f647de153255c919b1440338cf1b3e2d6b5dbf..f6ec892c9e717a3a4b22e42c738ba74de1a510e5 100644 --- a/src/main/java/net/minecraft/network/protocol/game/ClientboundChunksBiomesPacket.java +++ b/src/main/java/net/minecraft/network/protocol/game/ClientboundChunksBiomesPacket.java -@@ -2,12 +2,22 @@ package net.minecraft.network.protocol.game; +@@ -2,12 +2,21 @@ package net.minecraft.network.protocol.game; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; +import io.papermc.paper.event.packet.PlayerBiomesLoadEvent; -+import java.util.Arrays; ++import java.util.ArrayList; import java.util.List; +import net.minecraft.core.Holder; import net.minecraft.network.FriendlyByteBuf; @@ -25,13 +25,12 @@ index 51f647de153255c919b1440338cf1b3e2d6b5dbf..f525c51a1c888f76fa56528f204e4fac import net.minecraft.world.level.chunk.LevelChunkSection; +import net.minecraft.world.level.chunk.PalettedContainer; +import org.bukkit.BiomesSnapshot; -+import org.bukkit.Chunk; +import org.bukkit.craftbukkit.CraftBiomesSnapshot; +import org.bukkit.craftbukkit.CraftChunk; public record ClientboundChunksBiomesPacket(List chunkBiomeData) implements Packet { private static final int TWO_MEGABYTES = 2097152; -@@ -16,8 +26,23 @@ public record ClientboundChunksBiomesPacket(List chunks) { + org.bukkit.entity.Player bukkitPlayer = (org.bukkit.entity.Player) player.getBukkitEntity(); -+ final PlayerBiomesLoadEvent biomesLoadEvent = new PlayerBiomesLoadEvent(bukkitPlayer, bukkitPlayer.getWorld()); -+ biomesLoadEvent.callEvent(); -+ if(biomesLoadEvent.hasOverrides()) { -+ return new ClientboundChunksBiomesPacket(chunks.stream().map(levelChunk -> create(levelChunk, biomesLoadEvent)).toList()); -+ } else { -+ return new ClientboundChunksBiomesPacket(chunks.stream().map(ClientboundChunksBiomesPacket.ChunkBiomeData::new).toList()); ++ List biomeData = new ArrayList<>(); ++ for (LevelChunk chunk : chunks) { ++ final PlayerBiomesLoadEvent biomesLoadEvent = new PlayerBiomesLoadEvent(bukkitPlayer, new CraftChunk(chunk)); ++ biomesLoadEvent.callEvent(); ++ if (biomesLoadEvent.hasOverrides()) { ++ biomeData.add(create(chunk, biomesLoadEvent)); ++ } else { ++ biomeData.add(new ChunkBiomeData(chunk)); ++ } + } ++ return new ClientboundChunksBiomesPacket(biomeData); + } + + private static ClientboundChunksBiomesPacket.ChunkBiomeData create(LevelChunk levelChunk, PlayerBiomesLoadEvent biomesLoadEvent) { -+ final BiomesSnapshot snapshotAt = biomesLoadEvent.getBiomeSnapshotAt(new CraftChunk(levelChunk)); ++ final BiomesSnapshot snapshotAt = biomesLoadEvent.getBiomeSnapshot(); + if(snapshotAt != null){ + return new ClientboundChunksBiomesPacket.ChunkBiomeData(snapshotAt); + } @@ -57,7 +60,7 @@ index 51f647de153255c919b1440338cf1b3e2d6b5dbf..f525c51a1c888f76fa56528f204e4fac } @Override -@@ -38,6 +63,11 @@ public record ClientboundChunksBiomesPacket(List