List all mod versions from server and client

This commit is contained in:
Frank Bauer 2021-07-30 17:30:19 +02:00
parent 032b4187bd
commit a53c503c4e
4 changed files with 81 additions and 6 deletions

View file

@ -8,6 +8,7 @@ import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtIo; import net.minecraft.nbt.NbtIo;
import net.minecraft.world.level.storage.LevelStorageSource.LevelStorageAccess; import net.minecraft.world.level.storage.LevelStorageSource.LevelStorageAccess;
import ru.bclib.BCLib; import ru.bclib.BCLib;
import ru.bclib.api.dataexchange.DataExchangeAPI;
import ru.bclib.api.datafixer.DataFixerAPI; import ru.bclib.api.datafixer.DataFixerAPI;
import java.io.File; import java.io.File;
@ -62,11 +63,14 @@ public class WorldDataAPI {
/** /**
* Register mod cache, world cache is located in world data folder. * Register mod cache, world cache is located in world data folder.
* <p>
* Will also register the Mod for the {@link DataExchangeAPI} using {@link DataExchangeAPI#registerMod(String)}
* *
* @param modID - {@link String} modID. * @param modID - {@link String} modID.
*/ */
public static void registerModCache(String modID) { public static void registerModCache(String modID) {
MODS.add(modID); MODS.add(modID);
DataExchangeAPI.registerMod(modID);
} }
/** /**

View file

@ -1,5 +1,6 @@
package ru.bclib.api.dataexchange; package ru.bclib.api.dataexchange;
import com.google.common.collect.Lists;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; 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 net.minecraft.network.FriendlyByteBuf;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Set; import java.util.Set;
public class DataExchangeAPI { public class DataExchangeAPI {
private final static List<String> MODS = Lists.newArrayList();
private static DataExchangeAPI instance; private static DataExchangeAPI instance;
private ConnectorServerside server; private ConnectorServerside server;
private ConnectorClientside client; private ConnectorClientside client;
@ -46,6 +49,23 @@ public class DataExchangeAPI {
ServerPlayConnectionEvents.DISCONNECT.register(server::onPlayDisconnect); 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<String> registeredMods(){
return MODS;
}
/** /**
* Add a new Descriptor for a DataHandler. * Add a new Descriptor for a DataHandler.
* @param desc The Descriptor you want to add. * @param desc The Descriptor you want to add.

View file

@ -1,5 +1,7 @@
package ru.bclib.api.dataexchange; package ru.bclib.api.dataexchange;
import io.netty.buffer.ByteBufUtil;
import io.netty.util.CharsetUtil;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; 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 net.minecraft.server.network.ServerGamePacketListenerImpl;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.nio.charset.StandardCharsets;
public abstract class DataHandler { public abstract class DataHandler {
private final boolean originatesOnServer; private final boolean originatesOnServer;
@NotNull @NotNull
@ -104,4 +108,23 @@ public abstract class DataHandler {
public String toString() { public String toString() {
return "DataHandler{" + "originatesOnServer=" + originatesOnServer + ", identifier=" + identifier + '}'; 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);
}
} }

View file

@ -1,5 +1,7 @@
package ru.bclib.api.dataexchange.handler; 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.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.networking.v1.PacketSender; 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.client.Minecraft;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.MinecraftServer;
import ru.bclib.BCLib; 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.DataHandler;
import ru.bclib.api.dataexchange.DataHandlerDescriptor; import ru.bclib.api.dataexchange.DataHandlerDescriptor;
import ru.bclib.api.datafixer.DataFixerAPI; 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; import java.util.Optional;
public class HelloServer extends DataHandler { public class HelloServer extends DataHandler {
@ -35,22 +44,41 @@ public class HelloServer extends DataHandler {
return getModVersion(BCLib.MOD_ID); return getModVersion(BCLib.MOD_ID);
} }
String bclibVersion ="0.0.0";
Map<String, String> modVersion = new HashMap<>();
@Override @Override
protected void deserializeFromIncomingData(FriendlyByteBuf buf, PacketSender responseSender, boolean fromClient) { protected void deserializeFromIncomingData(FriendlyByteBuf buf, PacketSender responseSender, boolean fromClient) {
String bclibVersion = DataFixerAPI.getModVersion(buf.readInt()); bclibVersion = DataFixerAPI.getModVersion(buf.readInt());
String localBclibVersion = getBCLibVersion(); 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 @Override
@Environment(EnvType.CLIENT) protected void runOnServer(MinecraftServer server) {
protected void runOnClient(Minecraft client) { String localBclibVersion = getBCLibVersion();
BCLib.LOGGER.info("Hello Server received from BCLib. (server="+localBclibVersion+", client="+bclibVersion+")");
for (Entry<String, String> e : modVersion.entrySet()){
String ver = getModVersion(e.getKey());
BCLib.LOGGER.info(" - " + e.getKey() + " (server="+ver+", client="+ver+")");
}
} }
@Override @Override
protected void serializeData(FriendlyByteBuf buf) { protected void serializeData(FriendlyByteBuf buf) {
final List<String> mods = DataExchangeAPI.registeredMods();
buf.writeInt(DataFixerAPI.getModVersion(getBCLibVersion())); buf.writeInt(DataFixerAPI.getModVersion(getBCLibVersion()));
buf.writeInt(mods.size());
for (String modID : mods) {
writeString(buf, modID);
buf.writeInt(DataFixerAPI.getModVersion(getModVersion(modID)));
}
} }
} }