diff --git a/src/main/java/ru/bclib/api/dataexchange/handler/autosync/AutoFileSyncEntry.java b/src/main/java/ru/bclib/api/dataexchange/handler/autosync/AutoFileSyncEntry.java index 92abed37..0b1ee2ca 100644 --- a/src/main/java/ru/bclib/api/dataexchange/handler/autosync/AutoFileSyncEntry.java +++ b/src/main/java/ru/bclib/api/dataexchange/handler/autosync/AutoFileSyncEntry.java @@ -1,11 +1,14 @@ package ru.bclib.api.dataexchange.handler.autosync; import net.minecraft.network.FriendlyByteBuf; +import ru.bclib.BCLib; import ru.bclib.api.dataexchange.DataHandler; import ru.bclib.api.dataexchange.SyncFileHash; import ru.bclib.api.dataexchange.handler.autosync.AutoSync.NeedTransferPredicate; import ru.bclib.api.dataexchange.handler.autosync.SyncFolderDescriptor.SubFile; import ru.bclib.util.Pair; +import ru.bclib.util.PathUtil; +import ru.bclib.util.PathUtil.ModInfo; import ru.bclib.util.Triple; import java.io.File; @@ -50,6 +53,38 @@ class AutoFileSyncEntry extends AutoSyncID { } } + static class ForModFileRequest extends AutoFileSyncEntry { + public static Path getLocalPathForID(String modID){ + ModInfo mi = PathUtil.getModInfo(modID); + if (mi!=null){ + return mi.jarPath; + } + return null; + } + + ForModFileRequest(String modID) { + super(modID, AutoSyncID.ForModFileRequest.UNIQUE_ID, getLocalPathForID(modID).toFile(), false, (a, b, c) -> false); + if (this.fileName == null){ + BCLib.LOGGER.error("Unknown mod '"+modID+"'."); + } + } + + @Override + public int serializeContent(FriendlyByteBuf buf) { + final int res = super.serializeContent(buf); + return res; + } + + static AutoFileSyncEntry.ForModFileRequest finishDeserializeContent(String modID, FriendlyByteBuf buf) { + return new AutoFileSyncEntry.ForModFileRequest(modID); + } + + @Override + public String toString() { + return modID; + } + } + public final NeedTransferPredicate needTransfer; public final File fileName; public final boolean requestContent; @@ -101,6 +136,9 @@ class AutoFileSyncEntry extends AutoSyncID { if (AutoSyncID.ForDirectFileRequest.MOD_ID.equals(modID)) { entry = AutoFileSyncEntry.ForDirectFileRequest.finishDeserializeContent(uniqueID, buf); } + else if (AutoSyncID.ForModFileRequest.UNIQUE_ID.equals(uniqueID)) { + entry = AutoFileSyncEntry.ForModFileRequest.finishDeserializeContent(uniqueID, buf); + } else { entry = AutoFileSyncEntry.findMatching(modID, uniqueID); } diff --git a/src/main/java/ru/bclib/api/dataexchange/handler/autosync/AutoSyncID.java b/src/main/java/ru/bclib/api/dataexchange/handler/autosync/AutoSyncID.java index ea4891ed..d2a3c180 100644 --- a/src/main/java/ru/bclib/api/dataexchange/handler/autosync/AutoSyncID.java +++ b/src/main/java/ru/bclib/api/dataexchange/handler/autosync/AutoSyncID.java @@ -39,6 +39,24 @@ public class AutoSyncID { return new ForDirectFileRequest(uniqueID, fl); } } + + static class ForModFileRequest extends AutoSyncID { + public final static String UNIQUE_ID = "bclib::MOD"; + + ForModFileRequest(String modID) { + super(modID, ForModFileRequest.UNIQUE_ID); + } + + @Override + void serializeData(FriendlyByteBuf buf) { + super.serializeData(buf); + } + + static ForModFileRequest finishDeserialize(String modID, String uniqueID, FriendlyByteBuf buf){ + return new ForModFileRequest(modID); + } + } + /** * A Unique ID for the referenced File. *
@@ -91,7 +109,9 @@ public class AutoSyncID {
if (ForDirectFileRequest.MOD_ID.equals(modID)){
return ForDirectFileRequest.finishDeserialize(modID, uID, buf);
- } else {
+ } else if (ForModFileRequest.UNIQUE_ID.equals(uID)){
+ return ForModFileRequest.finishDeserialize(modID, uID, buf);
+ } else{
return new AutoSyncID(modID, uID);
}
}
diff --git a/src/main/java/ru/bclib/api/dataexchange/handler/autosync/HelloClient.java b/src/main/java/ru/bclib/api/dataexchange/handler/autosync/HelloClient.java
index 5f458795..f1d0ec39 100644
--- a/src/main/java/ru/bclib/api/dataexchange/handler/autosync/HelloClient.java
+++ b/src/main/java/ru/bclib/api/dataexchange/handler/autosync/HelloClient.java
@@ -260,6 +260,14 @@ public class HelloClient extends DataHandler.FromServer {
}
}
+ @Environment(EnvType.CLIENT)
+ private void processModFileSync(final List
* An error message is printed if a mod fails to load, but the parsing will continue.
- * @return A map of all found mods. (key=ModID, value={@link ModMetadata})
+ * @return A map of all found mods. (key=ModID, value={@link ModInfo})
*/
- public static Map
+ * The call will also return null if the mode-Version in the jar-File is not the same
+ * as the version of the loaded Mod.
+ * @param modID The mod ID to query
+ * @return A {@link ModInfo}-Object for the querried Mod.
+ */
+ public static ModInfo getModInfo(String modID){
+ getMods();
+ final ModInfo mi = mods.get(modID);
+ if (!getModVersion(modID).equals(mi.metadata.getVersion())) return null;
+ return mi;
+ }
+
+ /**
+ * Local Mod Version for the queried Mod
+ * @param modID The mod ID to query
+ * @return The version of the locally installed Mod
+ */
public static String getModVersion(String modID) {
Optional