From 63830a27d6dc623481ff0b2d9dbdee78562fb7e3 Mon Sep 17 00:00:00 2001 From: Frank Date: Sun, 22 Aug 2021 15:00:29 +0200 Subject: [PATCH] First (untested) version of File-Chunker --- src/main/java/ru/bclib/BCLib.java | 2 + .../bclib/api/dataexchange/DataHandler.java | 19 +- .../handler/autosync/Chunker.java | 175 ++++++++++++++++++ .../handler/autosync/HelloServer.java | 2 +- .../ru/bclib/mixin/client/MinecraftMixin.java | 6 - 5 files changed, 194 insertions(+), 10 deletions(-) create mode 100644 src/main/java/ru/bclib/api/dataexchange/handler/autosync/Chunker.java diff --git a/src/main/java/ru/bclib/BCLib.java b/src/main/java/ru/bclib/BCLib.java index e02ccafd..86b12fe0 100644 --- a/src/main/java/ru/bclib/BCLib.java +++ b/src/main/java/ru/bclib/BCLib.java @@ -17,6 +17,7 @@ import ru.bclib.recipes.CraftingRecipes; import ru.bclib.registry.BaseBlockEntities; import ru.bclib.registry.BaseRegistry; import ru.bclib.util.Logger; +import ru.bclib.util.ModUtil; import ru.bclib.world.generator.BCLibEndBiomeSource; import ru.bclib.world.generator.BCLibNetherBiomeSource; import ru.bclib.world.generator.GeneratorOptions; @@ -30,6 +31,7 @@ public class BCLib implements ModInitializer { @Override public void onInitialize() { + ModUtil.convertModVersion("1.3.0-pre1-1.17.1"); BaseRegistry.register(); GeneratorOptions.init(); BaseBlockEntities.register(); diff --git a/src/main/java/ru/bclib/api/dataexchange/DataHandler.java b/src/main/java/ru/bclib/api/dataexchange/DataHandler.java index 1d489bac..00a9576d 100644 --- a/src/main/java/ru/bclib/api/dataexchange/DataHandler.java +++ b/src/main/java/ru/bclib/api/dataexchange/DataHandler.java @@ -15,6 +15,9 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.ServerGamePacketListenerImpl; import ru.bclib.BCLib; +import ru.bclib.api.dataexchange.handler.autosync.Chunker.FileChunkSender; + +import java.util.List; public abstract class DataHandler extends BaseDataHandler { public abstract static class WithoutPayload extends DataHandler { @@ -68,8 +71,13 @@ public abstract class DataHandler extends BaseDataHandler { FriendlyByteBuf buf = PacketByteBufs.create(); serializeData(buf, false); - for (ServerPlayer player : PlayerLookup.all(server)) { - ServerPlayNetworking.send(player, getIdentifier(), buf); + if (buf.readableBytes()>1024*1024) { + final FileChunkSender sender = new FileChunkSender(buf); + sender.sendChunks(PlayerLookup.all(server)); + } else { + for (ServerPlayer player : PlayerLookup.all(server)) { + ServerPlayNetworking.send(player, getIdentifier(), buf); + } } } } @@ -79,7 +87,12 @@ public abstract class DataHandler extends BaseDataHandler { if (prepareData(false)) { FriendlyByteBuf buf = PacketByteBufs.create(); serializeData(buf, false); - ServerPlayNetworking.send(player, getIdentifier(), buf); + if (buf.readableBytes()>1024*1024) { + final FileChunkSender sender = new FileChunkSender(buf); + sender.sendChunks(List.of(player)); + } else { + ServerPlayNetworking.send(player, getIdentifier(), buf); + } } } diff --git a/src/main/java/ru/bclib/api/dataexchange/handler/autosync/Chunker.java b/src/main/java/ru/bclib/api/dataexchange/handler/autosync/Chunker.java new file mode 100644 index 00000000..f90356ac --- /dev/null +++ b/src/main/java/ru/bclib/api/dataexchange/handler/autosync/Chunker.java @@ -0,0 +1,175 @@ +package ru.bclib.api.dataexchange.handler.autosync; + +import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; +import net.fabricmc.fabric.api.networking.v1.PacketSender; +import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; +import net.minecraft.client.Minecraft; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import org.jetbrains.annotations.NotNull; +import ru.bclib.BCLib; +import ru.bclib.api.dataexchange.DataHandler; +import ru.bclib.api.dataexchange.DataHandlerDescriptor; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Objects; +import java.util.UUID; + +public class Chunker extends DataHandler.FromServer { + public static class FileChunkReceiver { + @NotNull + public final UUID uuid; + public final int chunkCount; + @NotNull + private final FriendlyByteBuf networkedBuf; + + private static List active = new ArrayList<>(1); + private static FileChunkReceiver newReceiver(@NotNull UUID uuid, int chunkCount){ + final FileChunkReceiver r = new FileChunkReceiver(uuid, chunkCount); + active.add(r); + return r; + } + + private static FileChunkReceiver getOrCreate(@NotNull UUID uuid, int chunkCount){ + return active.stream().filter(r -> r.uuid.equals(uuid)).findFirst().orElse(newReceiver(uuid, chunkCount)); + } + + public static FileChunkReceiver get(@NotNull UUID uuid){ + return active.stream().filter(r -> r.uuid.equals(uuid)).findFirst().orElse(null); + } + + private FileChunkReceiver(@NotNull UUID uuid, int chunkCount){ + this.uuid = uuid; + this.chunkCount = chunkCount; + networkedBuf = PacketByteBufs.create(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof FileChunkReceiver)) return false; + FileChunkReceiver that = (FileChunkReceiver) o; + return uuid.equals(that.uuid); + } + + @Override + public int hashCode() { + return Objects.hash(uuid); + } + + public boolean testFinished(){ + return false; + } + + public void processReceived(FriendlyByteBuf buf, int serialNo, int size){ + + } + } + + public static class FileChunkSender { + private final FriendlyByteBuf networkedBuf; + public final UUID uuid; + public final int chunkCount; + public final int size; + + public FileChunkSender(FriendlyByteBuf buf){ + networkedBuf = buf; + + size = buf.readableBytes(); + chunkCount = (int)Math.ceil((double)size / MAX_PAYLOAD_SIZE); + uuid = UUID.randomUUID(); + } + + public void sendChunks(Collection players){ + BCLib.LOGGER.info("Sending Request in " + chunkCount + " File-Chunks"); + for (int i=0; i { this.doLoadLevel(levelID, RegistryAccess.builtin(), Minecraft::loadDataPacks, Minecraft::loadWorldData, false, Minecraft.ExperimentalDialogType.BACKUP); })) {