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))); + } } }