diff --git a/src/main/java/ru/bclib/api/WorldDataAPI.java b/src/main/java/ru/bclib/api/WorldDataAPI.java
index 78bbd980..477807b7 100644
--- a/src/main/java/ru/bclib/api/WorldDataAPI.java
+++ b/src/main/java/ru/bclib/api/WorldDataAPI.java
@@ -8,6 +8,7 @@ import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtIo;
import net.minecraft.world.level.storage.LevelStorageSource.LevelStorageAccess;
import ru.bclib.BCLib;
+import ru.bclib.api.dataexchange.DataExchangeAPI;
import ru.bclib.api.datafixer.DataFixerAPI;
import java.io.File;
@@ -62,11 +63,14 @@ public class WorldDataAPI {
/**
* Register mod cache, world cache is located in world data folder.
+ *
+ * Will also register the Mod for the {@link DataExchangeAPI} using {@link DataExchangeAPI#registerMod(String)}
*
* @param modID - {@link String} modID.
*/
public static void registerModCache(String modID) {
MODS.add(modID);
+ DataExchangeAPI.registerMod(modID);
}
/**
diff --git a/src/main/java/ru/bclib/api/dataexchange/DataExchangeAPI.java b/src/main/java/ru/bclib/api/dataexchange/DataExchangeAPI.java
index 3796160a..73cac348 100644
--- a/src/main/java/ru/bclib/api/dataexchange/DataExchangeAPI.java
+++ b/src/main/java/ru/bclib/api/dataexchange/DataExchangeAPI.java
@@ -1,5 +1,6 @@
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.ClientPlayConnectionEvents;
@@ -7,9 +8,11 @@ import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents;
import net.minecraft.network.FriendlyByteBuf;
import java.util.HashSet;
+import java.util.List;
import java.util.Set;
public class DataExchangeAPI {
+ private final static List MODS = Lists.newArrayList();
private static DataExchangeAPI instance;
private ConnectorServerside server;
private ConnectorClientside client;
@@ -46,6 +49,23 @@ public class DataExchangeAPI {
ServerPlayConnectionEvents.DISCONNECT.register(server::onPlayDisconnect);
}
+ /**
+ * Register a mod to participate in the DataExchange.
+ *
+ * @param modID - {@link String} modID.
+ */
+ public static void registerMod(String modID) {
+ MODS.add(modID);
+ }
+
+ /**
+ * Returns the IDs of all registered Mods.
+ * @return List of modIDs
+ */
+ public static List registeredMods(){
+ return MODS;
+ }
+
/**
* Add a new Descriptor for a DataHandler.
* @param desc The Descriptor you want to add.
diff --git a/src/main/java/ru/bclib/api/dataexchange/DataHandler.java b/src/main/java/ru/bclib/api/dataexchange/DataHandler.java
index ece8b021..0005ced8 100644
--- a/src/main/java/ru/bclib/api/dataexchange/DataHandler.java
+++ b/src/main/java/ru/bclib/api/dataexchange/DataHandler.java
@@ -1,5 +1,7 @@
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;
@@ -16,6 +18,8 @@ import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.network.ServerGamePacketListenerImpl;
import org.jetbrains.annotations.NotNull;
+import java.nio.charset.StandardCharsets;
+
public abstract class DataHandler {
private final boolean originatesOnServer;
@NotNull
@@ -104,4 +108,23 @@ public abstract class DataHandler {
public String toString() {
return "DataHandler{" + "originatesOnServer=" + originatesOnServer + ", identifier=" + identifier + '}';
}
+
+ /**
+ * Write a String to a buffer (Convenience Method)
+ * @param buf The buffer to write to
+ * @param s The String you want to write
+ */
+ public static void writeString(FriendlyByteBuf buf, String s){
+ buf.writeByteArray(s.getBytes(StandardCharsets.UTF_8));
+ }
+
+ /**
+ * Read a string from a buffer (Convenience Method)
+ * @param buf Thea buffer to read from
+ * @return The received String
+ */
+ public static String readString(FriendlyByteBuf buf){
+ byte[] data = buf.readByteArray();
+ return new String(data, StandardCharsets.UTF_8);
+ }
}
diff --git a/src/main/java/ru/bclib/api/dataexchange/handler/HelloServer.java b/src/main/java/ru/bclib/api/dataexchange/handler/HelloServer.java
index 571de6d5..13b2fe02 100644
--- a/src/main/java/ru/bclib/api/dataexchange/handler/HelloServer.java
+++ b/src/main/java/ru/bclib/api/dataexchange/handler/HelloServer.java
@@ -1,5 +1,7 @@
package ru.bclib.api.dataexchange.handler;
+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.networking.v1.PacketSender;
@@ -8,11 +10,18 @@ import net.fabricmc.loader.api.ModContainer;
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.WorldDataAPI;
+import ru.bclib.api.dataexchange.DataExchangeAPI;
import ru.bclib.api.dataexchange.DataHandler;
import ru.bclib.api.dataexchange.DataHandlerDescriptor;
import ru.bclib.api.datafixer.DataFixerAPI;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
import java.util.Optional;
public class HelloServer extends DataHandler {
@@ -35,22 +44,41 @@ public class HelloServer extends DataHandler {
return getModVersion(BCLib.MOD_ID);
}
+ String bclibVersion ="0.0.0";
+ Map modVersion = new HashMap<>();
@Override
protected void deserializeFromIncomingData(FriendlyByteBuf buf, PacketSender responseSender, boolean fromClient) {
- String bclibVersion = DataFixerAPI.getModVersion(buf.readInt());
- String localBclibVersion = getBCLibVersion();
+ bclibVersion = DataFixerAPI.getModVersion(buf.readInt());
+ modVersion = new HashMap<>();
- BCLib.LOGGER.info("Hello Server received from BCLib. (server="+localBclibVersion+", client="+bclibVersion+")");
+ int count = buf.readInt();
+ for (int i=0; i< count; i++){
+ String id = readString(buf);
+ String version = DataFixerAPI.getModVersion(buf.readInt());
+ modVersion.put(id, version);
+ }
}
@Override
- @Environment(EnvType.CLIENT)
- protected void runOnClient(Minecraft client) {
-
+ protected void runOnServer(MinecraftServer server) {
+ String localBclibVersion = getBCLibVersion();
+ BCLib.LOGGER.info("Hello Server received from BCLib. (server="+localBclibVersion+", client="+bclibVersion+")");
+
+ for (Entry e : modVersion.entrySet()){
+ String ver = getModVersion(e.getKey());
+ BCLib.LOGGER.info(" - " + e.getKey() + " (server="+ver+", client="+ver+")");
+ }
}
@Override
protected void serializeData(FriendlyByteBuf buf) {
+ final List mods = DataExchangeAPI.registeredMods();
buf.writeInt(DataFixerAPI.getModVersion(getBCLibVersion()));
+
+ buf.writeInt(mods.size());
+ for (String modID : mods) {
+ writeString(buf, modID);
+ buf.writeInt(DataFixerAPI.getModVersion(getModVersion(modID)));
+ }
}
}