From e9faa34e80c9309c36fff26d8fe87cbc7382d1a4 Mon Sep 17 00:00:00 2001 From: NONPLAYT <76615486+NONPLAYT@users.noreply.github.com> Date: Tue, 25 Mar 2025 01:18:21 +0300 Subject: [PATCH] resend chunks command --- .../divinemc/command/DivineCommand.java | 14 ++--- .../subcommands/ResendChunksCommand.java | 51 +++++++++++++++++++ 2 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 divinemc-server/src/main/java/org/bxteam/divinemc/command/subcommands/ResendChunksCommand.java diff --git a/divinemc-server/src/main/java/org/bxteam/divinemc/command/DivineCommand.java b/divinemc-server/src/main/java/org/bxteam/divinemc/command/DivineCommand.java index d729c61..a2ca513 100644 --- a/divinemc-server/src/main/java/org/bxteam/divinemc/command/DivineCommand.java +++ b/divinemc-server/src/main/java/org/bxteam/divinemc/command/DivineCommand.java @@ -10,9 +10,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.permissions.Permission; import org.bukkit.permissions.PermissionDefault; import org.bukkit.plugin.PluginManager; -import org.bxteam.divinemc.command.subcommands.MSPTCommand; -import org.bxteam.divinemc.command.subcommands.ReloadCommand; -import org.bxteam.divinemc.command.subcommands.VersionCommand; +import org.bxteam.divinemc.command.subcommands.*; import org.jetbrains.annotations.Nullable; import java.util.*; @@ -28,15 +26,17 @@ public final class DivineCommand extends Command { public static final String BASE_PERM = DivineCommands.COMMAND_BASE_PERM + "." + COMMAND_LABEL; private static final Permission basePermission = new Permission(BASE_PERM, PermissionDefault.TRUE); - private static final DivineSubCommand RELOAD_SUBCOMMAND = new ReloadCommand(); - private static final DivineSubCommand VERSION_SUBCOMMAND = new VersionCommand(); private static final DivineSubCommand MSPT_SUBCOMMAND = new MSPTCommand(); + private static final DivineSubCommand RELOAD_SUBCOMMAND = new ReloadCommand(); + private static final DivineSubCommand RESEND_CHUNKS_SUBCOMMAND = new ResendChunksCommand(); + private static final DivineSubCommand VERSION_SUBCOMMAND = new VersionCommand(); private static final Map SUBCOMMANDS = Util.make(() -> { final Map, DivineSubCommand> commands = new HashMap<>(); - commands.put(Set.of(ReloadCommand.LITERAL_ARGUMENT), RELOAD_SUBCOMMAND); - commands.put(Set.of(VersionCommand.LITERAL_ARGUMENT), VERSION_SUBCOMMAND); commands.put(Set.of(MSPTCommand.LITERAL_ARGUMENT), MSPT_SUBCOMMAND); + commands.put(Set.of(ReloadCommand.LITERAL_ARGUMENT), RELOAD_SUBCOMMAND); + commands.put(Set.of(ResendChunksCommand.LITERAL_ARGUMENT), RESEND_CHUNKS_SUBCOMMAND); + commands.put(Set.of(VersionCommand.LITERAL_ARGUMENT), VERSION_SUBCOMMAND); return commands.entrySet().stream() .flatMap(entry -> entry.getKey().stream().map(s -> Map.entry(s, entry.getValue()))) diff --git a/divinemc-server/src/main/java/org/bxteam/divinemc/command/subcommands/ResendChunksCommand.java b/divinemc-server/src/main/java/org/bxteam/divinemc/command/subcommands/ResendChunksCommand.java new file mode 100644 index 0000000..f3fafd5 --- /dev/null +++ b/divinemc-server/src/main/java/org/bxteam/divinemc/command/subcommands/ResendChunksCommand.java @@ -0,0 +1,51 @@ +package org.bxteam.divinemc.command.subcommands; + +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.network.PlayerChunkSender; +import net.minecraft.world.level.ChunkPos; +import org.bukkit.Chunk; +import org.bukkit.command.CommandSender; +import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.bukkit.permissions.PermissionDefault; +import org.bxteam.divinemc.command.DivineCommand; +import org.bxteam.divinemc.command.DivineSubCommandPermission; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.framework.qual.DefaultQualifier; +import org.jetbrains.annotations.NotNull; +import java.util.stream.Collectors; + +@DefaultQualifier(NonNull.class) +public final class ResendChunksCommand extends DivineSubCommandPermission { + public static final String LITERAL_ARGUMENT = "resendchunks"; + public static final String PERM = DivineCommand.BASE_PERM + "." + LITERAL_ARGUMENT; + + public ResendChunksCommand() { + super(PERM, PermissionDefault.TRUE); + } + + @Override + public boolean execute(final CommandSender sender, final String subCommand, final String[] args) { + if (sender instanceof Player player) { + final ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); + PlayerChunkSender chunkSender = serverPlayer.connection.chunkSender; + int resent = 0; + + for (ChunkPos chunkPos : serverPlayer.getBukkitEntity().getSentChunks().stream().map(ResendChunksCommand::bukkitChunk2ChunkPos).collect(Collectors.toSet())) { + chunkSender.dropChunk(serverPlayer, chunkPos); + PlayerChunkSender.sendChunk(serverPlayer.connection, serverPlayer.serverLevel(), serverPlayer.level().getChunk(chunkPos.x, chunkPos.z)); + resent++; + } + serverPlayer.sendSystemMessage(Component.literal("Resent " + resent + " chunks to client")); + } else { + sender.sendMessage("Only a player can execute this command."); + } + + return true; + } + + public static @NotNull ChunkPos bukkitChunk2ChunkPos(@NotNull Chunk chunk) { + return new ChunkPos(chunk.getX(), chunk.getZ()); + } +}