diff --git a/src/main/java/ru/bclib/api/dataexchange/BaseDataHandler.java b/src/main/java/ru/bclib/api/dataexchange/BaseDataHandler.java index eedeba27..47ca87af 100644 --- a/src/main/java/ru/bclib/api/dataexchange/BaseDataHandler.java +++ b/src/main/java/ru/bclib/api/dataexchange/BaseDataHandler.java @@ -55,6 +55,7 @@ public abstract class BaseDataHandler { @Environment(EnvType.CLIENT) abstract void sendToServer(Minecraft client); + protected boolean isBlocking() { return false; } @Override public String toString() { diff --git a/src/main/java/ru/bclib/api/dataexchange/DataHandler.java b/src/main/java/ru/bclib/api/dataexchange/DataHandler.java index 540d9193..b1043fc3 100644 --- a/src/main/java/ru/bclib/api/dataexchange/DataHandler.java +++ b/src/main/java/ru/bclib/api/dataexchange/DataHandler.java @@ -56,7 +56,10 @@ public abstract class DataHandler extends BaseDataHandler { @Override void receiveFromServer(Minecraft client, ClientPacketListener handler, FriendlyByteBuf buf, PacketSender responseSender) { deserializeIncomingData(buf, responseSender, true); - client.execute(() -> runOnGameThread(client, null, true)); + final Runnable runner = () -> runOnGameThread(client, null, true); + + if (isBlocking()) client.executeBlocking(runner); + else client.execute(runner); } @Override @@ -64,7 +67,10 @@ public abstract class DataHandler extends BaseDataHandler { super.receiveFromClient(server, player, handler, buf, responseSender); deserializeIncomingData(buf, responseSender, false); - server.execute(() -> runOnGameThread(null, server, false)); + final Runnable runner = () -> runOnGameThread(null, server, false); + + if (isBlocking()) server.executeBlocking(runner); + else server.execute(runner); } @Override @@ -156,7 +162,10 @@ public abstract class DataHandler extends BaseDataHandler { super.receiveFromClient(server, player, handler, buf, responseSender); deserializeIncomingDataOnServer(buf, responseSender); - server.execute(() -> runOnServerGameThread(server)); + final Runnable runner = () -> runOnServerGameThread(server); + + if (isBlocking()) server.executeBlocking(runner); + else server.execute(runner); } @Override @@ -220,7 +229,10 @@ public abstract class DataHandler extends BaseDataHandler { @Override final void receiveFromServer(Minecraft client, ClientPacketListener handler, FriendlyByteBuf buf, PacketSender responseSender) { deserializeIncomingDataOnClient(buf, responseSender); - client.execute(() -> runOnClientGameThread(client)); + final Runnable runner = () -> runOnClientGameThread(client); + + if (isBlocking()) client.executeBlocking(runner); + else client.execute(runner); } @Override 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 index b3282596..e021c98b 100644 --- a/src/main/java/ru/bclib/api/dataexchange/handler/autosync/Chunker.java +++ b/src/main/java/ru/bclib/api/dataexchange/handler/autosync/Chunker.java @@ -1,9 +1,13 @@ package ru.bclib.api.dataexchange.handler.autosync; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; 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.util.ProgressListener; +import ru.bclib.gui.screens.ProgressScreen; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; @@ -23,8 +27,35 @@ import java.util.Map; import java.util.Objects; import java.util.UUID; +/** + * Used to seperate large data transfers into multiple smaller messages. + *
+ * {@link DataHandler} will automatically convert larger messages into Chunks on the Server
+ * and assemble the original message from those chunks on the client.
+ */
public class Chunker extends DataHandler.FromServer {
- public static class PacketChunkReceiver {
+ private static ProgressScreen progressScreen;
+
+ @Environment(EnvType.CLIENT)
+ public static void setProgressScreen(ProgressScreen scr){
+ progressScreen = scr;
+ }
+
+ @Environment(EnvType.CLIENT)
+ public static ProgressScreen getProgressScreen(){
+ return progressScreen;
+ }
+
+ @Environment(EnvType.CLIENT)
+ public static ProgressListener getProgressListener(){
+ return progressScreen;
+ }
+
+ /**
+ * Responsible for assembling the original ByteBuffer created by {@link PacketChunkSender} on the
+ * receiving end. Automatically created from the header {@link Chunker}-Message (where the serialNo==-1)
+ */
+ static class PacketChunkReceiver {
@NotNull
public final UUID uuid;
public final int chunkCount;
@@ -70,6 +101,10 @@ public class Chunker extends DataHandler.FromServer {
}
public boolean testFinished(){
+ ProgressListener listener = getProgressListener();
+ if (listener!=null){
+ listener.progressStagePercentage((100*receivedCount)/chunkCount);
+ }
if (incomingBuffer == null){
return true;
} if (lastReadSerial>=chunkCount-1){
@@ -79,7 +114,7 @@ public class Chunker extends DataHandler.FromServer {
return false;
}
- protected void addBuffer(FriendlyByteBuf input){
+ private void addBuffer(FriendlyByteBuf input){
final int size = input.readableBytes();
final int cap = networkedBuf.capacity()-networkedBuf.writerIndex();
@@ -102,7 +137,10 @@ public class Chunker extends DataHandler.FromServer {
Map