From 7166525b8c028432cb7f2b838b9c10b436dca7e7 Mon Sep 17 00:00:00 2001 From: Matt Worzala Date: Tue, 26 Jan 2021 08:46:14 -0500 Subject: [PATCH] send individual section updates when less than half of the sections are updated. --- .../net/minestom/server/instance/Chunk.java | 20 ------------------- .../server/instance/batch/ChunkBatch.java | 19 +++++++++--------- 2 files changed, 10 insertions(+), 29 deletions(-) diff --git a/src/main/java/net/minestom/server/instance/Chunk.java b/src/main/java/net/minestom/server/instance/Chunk.java index d15789bed..54ba18639 100644 --- a/src/main/java/net/minestom/server/instance/Chunk.java +++ b/src/main/java/net/minestom/server/instance/Chunk.java @@ -8,7 +8,6 @@ import net.minestom.server.entity.Player; import net.minestom.server.entity.pathfinding.PFColumnarSpace; import net.minestom.server.event.player.PlayerChunkLoadEvent; import net.minestom.server.event.player.PlayerChunkUnloadEvent; -import net.minestom.server.instance.batch.BatchOption; import net.minestom.server.instance.block.Block; import net.minestom.server.instance.block.BlockManager; import net.minestom.server.instance.block.CustomBlock; @@ -31,7 +30,6 @@ import org.jetbrains.annotations.Nullable; import java.util.*; import java.util.concurrent.CopyOnWriteArraySet; -import java.util.stream.Collectors; // TODO light data & API @@ -547,23 +545,6 @@ public abstract class Chunk implements Viewable, DataContainer { PacketUtils.sendGroupedPacket(getViewers(), getFreshFullDataPacket()); } - /** - * Sends a single section {@link ChunkDataPacket} to all chunk viewers. - * - * @param section The section to send. - */ - public synchronized void sendChunkSectionUpdate(int section) { - Check.argCondition(!MathUtils.isBetween(section, 0, CHUNK_SECTION_COUNT), - "The chunk section " + section + " does not exist"); - PacketUtils.sendGroupedPacket( - //todo An option to filter out non-netty clients in sendGroupedPacket would be nice. - getViewers() - .stream() - .filter(PlayerUtils::isNettyClient) - .collect(Collectors.toUnmodifiableList()), - createChunkSectionUpdatePacket(section)); - } - /** * Sends a chunk section update packet to {@code player}. * @@ -589,7 +570,6 @@ public abstract class Chunk implements Viewable, DataContainer { @NotNull protected ChunkDataPacket createChunkSectionUpdatePacket(int section) { ChunkDataPacket chunkDataPacket = getFreshPartialDataPacket(); - chunkDataPacket.fullChunk = false; int[] sections = new int[CHUNK_SECTION_COUNT]; sections[section] = 1; chunkDataPacket.sections = sections; diff --git a/src/main/java/net/minestom/server/instance/batch/ChunkBatch.java b/src/main/java/net/minestom/server/instance/batch/ChunkBatch.java index 21468a857..dec9072c2 100644 --- a/src/main/java/net/minestom/server/instance/batch/ChunkBatch.java +++ b/src/main/java/net/minestom/server/instance/batch/ChunkBatch.java @@ -10,10 +10,13 @@ import net.minestom.server.data.Data; import net.minestom.server.instance.Chunk; import net.minestom.server.instance.Instance; import net.minestom.server.instance.InstanceContainer; +import net.minestom.server.network.packet.server.play.ChunkDataPacket; +import net.minestom.server.utils.PacketUtils; import net.minestom.server.utils.block.CustomBlockUtils; import net.minestom.server.utils.callback.OptionalCallback; import net.minestom.server.utils.chunk.ChunkCallback; import net.minestom.server.utils.chunk.ChunkUtils; +import net.minestom.server.utils.player.PlayerUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; @@ -35,7 +38,6 @@ import java.util.function.IntConsumer; * @see Batch */ public class ChunkBatch implements Batch { - private static final int CHUNK_SECTION_THRESHOLD = Chunk.CHUNK_SECTION_COUNT / 2; private static final Logger LOGGER = LoggerFactory.getLogger(ChunkBatch.class); @@ -252,15 +254,14 @@ public class ChunkBatch implements Batch { /** * Updates the given chunk for all of its viewers, and executes the callback. */ - private void updateChunk(@NotNull Instance instance, Chunk chunk, IntSet sections, @Nullable ChunkCallback callback, boolean safeCallback) { + private void updateChunk(@NotNull Instance instance, Chunk chunk, IntSet updatedSections, @Nullable ChunkCallback callback, boolean safeCallback) { // Refresh chunk for viewers - if (sections.size() <= CHUNK_SECTION_THRESHOLD) { - // Update only a few sections of the chunk - sections.forEach((IntConsumer) chunk::sendChunkSectionUpdate); - } else { - // Update the entire chunk - chunk.sendChunk(); - } + ChunkDataPacket chunkDataPacket = chunk.getFreshPartialDataPacket(); + int[] sections = new int[Chunk.CHUNK_SECTION_COUNT]; + for (int section : updatedSections) + sections[section] = 1; + chunkDataPacket.sections = sections; + PacketUtils.sendGroupedPacket(chunk.getViewers(), chunkDataPacket, PlayerUtils::isNettyClient); if (instance instanceof InstanceContainer) { // FIXME: put method in Instance instead