diff --git a/src/main/java/ru/bclib/api/dataexchange/DataExchangeAPI.java b/src/main/java/ru/bclib/api/dataexchange/DataExchangeAPI.java index 73cac348..f354928d 100644 --- a/src/main/java/ru/bclib/api/dataexchange/DataExchangeAPI.java +++ b/src/main/java/ru/bclib/api/dataexchange/DataExchangeAPI.java @@ -3,8 +3,10 @@ package ru.bclib.api.dataexchange; import com.google.common.collect.Lists; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.networking.v1.ClientLoginConnectionEvents; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; +import net.minecraft.client.Minecraft; import net.minecraft.network.FriendlyByteBuf; import java.util.HashSet; @@ -34,7 +36,12 @@ public class DataExchangeAPI { private void initClientside(){ if (client!=null) return; client = new ConnectorClientside(this); - + ClientLoginConnectionEvents.INIT.register((a, b) ->{ + System.out.println("INIT"); + }); + ClientLoginConnectionEvents.QUERY_START.register((a, b) ->{ + System.out.println("INIT"); + }); ClientPlayConnectionEvents.INIT.register(client::onPlayInit); ClientPlayConnectionEvents.JOIN.register(client::onPlayReady); ClientPlayConnectionEvents.DISCONNECT.register(client::onPlayDisconnect); @@ -117,5 +124,21 @@ public class DataExchangeAPI { } } - + /** + * Automatically called before the player enters the world. + *

+ * This will send all {@link DataHandler}-Objects that have {@link DataHandlerDescriptor#sendBeforeEnter} set to* + * {@Code true}, + */ + @Environment(EnvType.CLIENT) + public static void sendOnEnter(){ + getInstance().descriptors.forEach((desc)-> { + if (desc.sendBeforeEnter){ + DataHandler h = desc.JOIN_INSTANCE.get(); + if (!h.getOriginatesOnServer()) { + getInstance().client.sendToServer(h); + } + } + }); + } } diff --git a/src/main/java/ru/bclib/api/dataexchange/DataHandler.java b/src/main/java/ru/bclib/api/dataexchange/DataHandler.java index f4a360b9..fb11bd25 100644 --- a/src/main/java/ru/bclib/api/dataexchange/DataHandler.java +++ b/src/main/java/ru/bclib/api/dataexchange/DataHandler.java @@ -1,7 +1,5 @@ package ru.bclib.api.dataexchange; -import io.netty.buffer.ByteBufUtil; -import io.netty.util.CharsetUtil; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; @@ -44,7 +42,9 @@ public abstract class DataHandler { client.execute(() -> runOnGameThread(client, null, true)); } + private ServerPlayer lastMessageSender; void receiveFromClient(MinecraftServer server, ServerPlayer player, ServerGamePacketListenerImpl handler, FriendlyByteBuf buf, PacketSender responseSender){ + lastMessageSender = player; deserializeFromIncomingData(buf, responseSender, false); server.execute(() -> runOnGameThread(null, server, false)); } @@ -53,11 +53,15 @@ public abstract class DataHandler { } protected void runOnGameThread(Minecraft client, MinecraftServer server, boolean isClient){ - } protected void serializeData(FriendlyByteBuf buf) { + } + final protected boolean reply(DataHandler message, MinecraftServer server){ + if (lastMessageSender==null) return false; + message.sendToClient(server, lastMessageSender); + return true; } void sendToClient(MinecraftServer server){ diff --git a/src/main/java/ru/bclib/api/dataexchange/DataHandlerDescriptor.java b/src/main/java/ru/bclib/api/dataexchange/DataHandlerDescriptor.java index 585a3725..99017fe4 100644 --- a/src/main/java/ru/bclib/api/dataexchange/DataHandlerDescriptor.java +++ b/src/main/java/ru/bclib/api/dataexchange/DataHandlerDescriptor.java @@ -6,21 +6,23 @@ import java.util.function.Supplier; public class DataHandlerDescriptor { public DataHandlerDescriptor(ResourceLocation identifier, Supplier instancer){ - this(identifier, instancer, instancer, false); + this(identifier, instancer, instancer, false, false); } - public DataHandlerDescriptor(ResourceLocation identifier, Supplier instancer, boolean sendOnJoin){ - this(identifier, instancer, instancer, sendOnJoin); + public DataHandlerDescriptor(ResourceLocation identifier, Supplier instancer, boolean sendOnJoin, boolean sendBeforeEnter){ + this(identifier, instancer, instancer, sendOnJoin, sendBeforeEnter); } - public DataHandlerDescriptor(ResourceLocation identifier, Supplier receiv_instancer, Supplier join_instancer, boolean sendOnJoin){ + public DataHandlerDescriptor(ResourceLocation identifier, Supplier receiv_instancer, Supplier join_instancer, boolean sendOnJoin, boolean sendBeforeEnter){ this.INSTANCE = receiv_instancer; this.JOIN_INSTANCE = join_instancer; this.IDENTIFIER = identifier; this.sendOnJoin = sendOnJoin; + this.sendBeforeEnter = sendBeforeEnter; } public final boolean sendOnJoin; + public final boolean sendBeforeEnter; public final ResourceLocation IDENTIFIER; public final Supplier INSTANCE; public final Supplier JOIN_INSTANCE; diff --git a/src/main/java/ru/bclib/api/dataexchange/handler/HelloClient.java b/src/main/java/ru/bclib/api/dataexchange/handler/HelloClient.java index ef35015d..cfcf17c8 100644 --- a/src/main/java/ru/bclib/api/dataexchange/handler/HelloClient.java +++ b/src/main/java/ru/bclib/api/dataexchange/handler/HelloClient.java @@ -27,7 +27,7 @@ import java.util.Optional; import java.util.function.Consumer; public class HelloClient extends DataHandler { - public static DataHandlerDescriptor DESCRIPTOR = new DataHandlerDescriptor(new ResourceLocation(BCLib.MOD_ID, "hello_client"), HelloClient::new, true); + public static DataHandlerDescriptor DESCRIPTOR = new DataHandlerDescriptor(new ResourceLocation(BCLib.MOD_ID, "hello_client"), HelloClient::new, false, false); public HelloClient() { super(DESCRIPTOR.IDENTIFIER, true); @@ -42,7 +42,7 @@ public class HelloClient extends DataHandler { return "0.0.0"; } - protected static String getBCLibVersion(){ + static String getBCLibVersion(){ return getModVersion(BCLib.MOD_ID); } @@ -64,7 +64,7 @@ public class HelloClient extends DataHandler { @Override protected void runOnGameThread(Minecraft client, MinecraftServer server, boolean isClient) { String localBclibVersion = getBCLibVersion(); - BCLib.LOGGER.info("Hello Client received from BCLib. (client="+localBclibVersion+", server="+bclibVersion+")"); + BCLib.LOGGER.info("Received Hello from Server. (client="+localBclibVersion+", server="+bclibVersion+")"); if (DataFixerAPI.getModVersion(localBclibVersion) == DataFixerAPI.getModVersion(bclibVersion)){ showBCLibError(client); diff --git a/src/main/java/ru/bclib/api/dataexchange/handler/HelloServer.java b/src/main/java/ru/bclib/api/dataexchange/handler/HelloServer.java new file mode 100644 index 00000000..13d1ce63 --- /dev/null +++ b/src/main/java/ru/bclib/api/dataexchange/handler/HelloServer.java @@ -0,0 +1,37 @@ +package ru.bclib.api.dataexchange.handler; + +import net.fabricmc.fabric.api.networking.v1.PacketSender; +import net.minecraft.client.Minecraft; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; +import ru.bclib.BCLib; +import ru.bclib.api.dataexchange.DataHandler; +import ru.bclib.api.dataexchange.DataHandlerDescriptor; +import ru.bclib.api.datafixer.DataFixerAPI; + +public class HelloServer extends DataHandler { + public static DataHandlerDescriptor DESCRIPTOR = new DataHandlerDescriptor(new ResourceLocation(BCLib.MOD_ID, "hello_server"), HelloServer::new, false, true); + + protected String bclibVersion ="0.0.0"; + public HelloServer() { + super(DESCRIPTOR.IDENTIFIER, false); + } + + @Override + protected void deserializeFromIncomingData(FriendlyByteBuf buf, PacketSender responseSender, boolean fromClient) { + bclibVersion = DataFixerAPI.getModVersion(buf.readInt()); + } + + @Override + protected void runOnGameThread(Minecraft client, MinecraftServer server, boolean isClient) { + String localBclibVersion = HelloClient.getBCLibVersion(); + BCLib.LOGGER.info("Received Hello from Server. (server="+localBclibVersion+", client="+bclibVersion+")"); + reply(new HelloClient(), server); + } + + @Override + protected void serializeData(FriendlyByteBuf buf) { + buf.writeInt(DataFixerAPI.getModVersion(HelloClient.getBCLibVersion())); + } +} diff --git a/src/main/java/ru/bclib/mixin/client/ClientLevelMixin.java b/src/main/java/ru/bclib/mixin/client/ClientLevelMixin.java new file mode 100644 index 00000000..26061eda --- /dev/null +++ b/src/main/java/ru/bclib/mixin/client/ClientLevelMixin.java @@ -0,0 +1,2 @@ +package ru.bclib.mixin.client;public class ClientLevelMixin { +}