From 3d2d6b5a2be049058e6f48eea61229cde8b091f9 Mon Sep 17 00:00:00 2001 From: adam Date: Wed, 20 Mar 2024 16:40:41 +0300 Subject: [PATCH 1/9] 1.0.13 for 1.20.1 --- common/build.gradle.kts | 2 +- gradle.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 6dac88e..a88ecd1 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -3,7 +3,7 @@ plugins { } group = "com.adamcalculator" -version = "1.0.12" +version = "1.0.13" repositories { mavenCentral() diff --git a/gradle.properties b/gradle.properties index f66a867..6f444d6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,6 +12,6 @@ loader_version=0.15.7 fabric_version=0.92.0+1.20.1 # Mod Properties -mod_version=1.0.12-mc1.20.1 +mod_version=1.0.13-mc1.20.1 maven_group=com.adamcalculator archives_base_name=dynamicpack \ No newline at end of file From 96dc7260d63195ba1687827e609b6e04bdc3c958 Mon Sep 17 00:00:00 2001 From: adam Date: Thu, 21 Mar 2024 15:06:24 +0300 Subject: [PATCH 2/9] Add status checker --- .../com/adamcalculator/dynamicpack/Mod.java | 7 +++ .../adamcalculator/dynamicpack/pack/Pack.java | 17 ++++++ .../dynamicpack/status/StatusChecker.java | 53 +++++++++++++++++++ .../dynamicpack/sync/SyncThread.java | 11 ++++ .../adamcalculator/dynamicpack/util/Out.java | 2 +- .../dynamicpack/FabricDynamicMod.java | 40 +++++++++++++- .../assets/dynamicpack/lang/en_us.json | 8 ++- .../assets/dynamicpack/lang/ru_ru.json | 8 ++- 8 files changed, 142 insertions(+), 4 deletions(-) create mode 100644 common/src/main/java/com/adamcalculator/dynamicpack/status/StatusChecker.java diff --git a/common/src/main/java/com/adamcalculator/dynamicpack/Mod.java b/common/src/main/java/com/adamcalculator/dynamicpack/Mod.java index 830d46e..0ba75eb 100644 --- a/common/src/main/java/com/adamcalculator/dynamicpack/Mod.java +++ b/common/src/main/java/com/adamcalculator/dynamicpack/Mod.java @@ -8,12 +8,19 @@ import java.util.Set; public class Mod { + public static final String VERSION_NAME_MOD = "1.0.13"; + public static final String VERSION_NAME_BRANCH = "mc1.20.1"; + public static final String VERSION_NAME = VERSION_NAME_MOD + "-" + VERSION_NAME_BRANCH; + public static final long VERSION_BUILD = 14; + + // NOTE: for increase contact to mod developer. public static final long DYNAMIC_PACK_HTTPS_FILE_SIZE_LIMIT = megabyte(8); // kb -> mb -> 5MB (for files in resourcepack) public static final long MODRINTH_HTTPS_FILE_SIZE_LIMIT = megabyte(1024); // 1 GB (for .zip files from modrinth) public static final long MOD_MODTINTH_API_LIMIT = megabyte(8); // 8 MB of api public static final long GZIP_LIMIT = megabyte(50); // 50 MB of .gz file public static final long MOD_FILES_LIMIT = megabyte(8); + public static final String MODRINTH_URL = "https://modrinth.com/mod/dynamicpack"; private static final Set ALLOWED_HOSTS = new HashSet<>(); static { diff --git a/common/src/main/java/com/adamcalculator/dynamicpack/pack/Pack.java b/common/src/main/java/com/adamcalculator/dynamicpack/pack/Pack.java index 90ada74..7d9740b 100644 --- a/common/src/main/java/com/adamcalculator/dynamicpack/pack/Pack.java +++ b/common/src/main/java/com/adamcalculator/dynamicpack/pack/Pack.java @@ -2,6 +2,7 @@ import com.adamcalculator.dynamicpack.DynamicPackModBase; import com.adamcalculator.dynamicpack.PackUtil; +import com.adamcalculator.dynamicpack.status.StatusChecker; import com.adamcalculator.dynamicpack.sync.PackSyncProgress; import com.adamcalculator.dynamicpack.util.AFiles; import com.adamcalculator.dynamicpack.util.Out; @@ -50,6 +51,12 @@ public boolean isSyncing() { return isSyncing; } + // See StatusChecker for this. + // Developer can block network for specify version in dynamicpack.status.v1.json by security questions + public boolean isNetworkBlocked() { + return StatusChecker.isBlockUpdating(remoteTypeStr); + } + public boolean isZip() { if (location.isDirectory()) { return false; @@ -84,6 +91,7 @@ public long getLatestUpdated() { } public boolean checkIsUpdateAvailable() throws IOException { + checkNetwork(); return cachedUpdateAvailable = remote.checkUpdateAvailable(); } @@ -108,6 +116,9 @@ private void sync0(PackSyncProgress progress, boolean manually) throws Exception progress.done(false); return; } + + checkNetwork(); + if (!checkIsUpdateAvailable() && !manually) { progress.textLog("update not available"); progress.done(false); @@ -124,6 +135,12 @@ private void sync0(PackSyncProgress progress, boolean manually) throws Exception progress.done(reloadRequired); } + private void checkNetwork() { + if (isNetworkBlocked()) { + throw new SecurityException("Network is blocked for remote_type: " + remoteTypeStr + " in dynamicpack.status.v1.json by security questions!"); + } + } + private void checkSafePackMinecraftMeta() throws IOException { PackUtil.openPackFileSystem(location, path -> { Path mcmeta = path.resolve(DynamicPackModBase.MINECRAFT_META); diff --git a/common/src/main/java/com/adamcalculator/dynamicpack/status/StatusChecker.java b/common/src/main/java/com/adamcalculator/dynamicpack/status/StatusChecker.java new file mode 100644 index 0000000..87e7898 --- /dev/null +++ b/common/src/main/java/com/adamcalculator/dynamicpack/status/StatusChecker.java @@ -0,0 +1,53 @@ +package com.adamcalculator.dynamicpack.status; + +import com.adamcalculator.dynamicpack.Mod; +import com.adamcalculator.dynamicpack.util.Out; +import com.adamcalculator.dynamicpack.util.Urls; +import org.json.JSONObject; + +public class StatusChecker { + private static final String URL = "https://adamcalculator.github.io/DynamicPack/dynamicpack.status.v1.json"; + + + private static boolean isUpdateAvailable = false; + private static boolean isFormatActual = true; + private static boolean isSafe = true; + private static boolean isChecked = false; + + public static void check() throws Exception { + Out.println("Checking status..."); + String s = Urls.parseContent(URL, 1024 * 1024 * 128); + JSONObject j = new JSONObject(s); + JSONObject lat = j.getJSONObject("latest_version"); + isUpdateAvailable = lat.getLong("build") > Mod.VERSION_BUILD; + isSafe = lat.getLong("safe") <= Mod.VERSION_BUILD; + isFormatActual = lat.getLong("format") <= Mod.VERSION_BUILD; + + isChecked = true; + Out.println(String.format("Status checked! isSafe=%s, isFormatActual=%s, isUpdateAvailable=%s", isSafe, isFormatActual, isUpdateAvailable)); + } + + public static boolean isBlockUpdating(String remoteType) { + if (remoteType.equals("modrinth")) { + return false; + } + return !isSafe(); + } + + + public static boolean isModUpdateAvailable() { + return isUpdateAvailable; + } + + public static boolean isSafe() { + return isSafe; + } + + public static boolean isFormatActual() { + return isFormatActual; + } + + public static boolean isChecked() { + return isChecked; + } +} diff --git a/common/src/main/java/com/adamcalculator/dynamicpack/sync/SyncThread.java b/common/src/main/java/com/adamcalculator/dynamicpack/sync/SyncThread.java index d8e2894..e01cf56 100644 --- a/common/src/main/java/com/adamcalculator/dynamicpack/sync/SyncThread.java +++ b/common/src/main/java/com/adamcalculator/dynamicpack/sync/SyncThread.java @@ -1,5 +1,8 @@ package com.adamcalculator.dynamicpack.sync; +import com.adamcalculator.dynamicpack.status.StatusChecker; +import com.adamcalculator.dynamicpack.util.Out; + import java.util.function.Supplier; public class SyncThread extends Thread { @@ -10,6 +13,9 @@ public class SyncThread extends Thread { public SyncThread(Supplier taskSupplier) { super("SyncThread" + (counter++)); + if (counter > 1) { + Out.warn("Multiple SyncThread's is bad behavior..."); + } this.taskSupplier = taskSupplier; } @@ -27,6 +33,11 @@ public void run() { private void startSync() { + try { + StatusChecker.check(); + } catch (Exception e) { + Out.error("Error while check status!", e); + } taskSupplier.get().run(); } } diff --git a/common/src/main/java/com/adamcalculator/dynamicpack/util/Out.java b/common/src/main/java/com/adamcalculator/dynamicpack/util/Out.java index cf627f6..cbf7e20 100644 --- a/common/src/main/java/com/adamcalculator/dynamicpack/util/Out.java +++ b/common/src/main/java/com/adamcalculator/dynamicpack/util/Out.java @@ -16,7 +16,7 @@ public static void println(Object o) { System.out.println(o); return; } - LOGGER.warn(o + ""); + LOGGER.info(o + ""); } public static void error(String s, Exception e) { diff --git a/src/client/java/com/adamcalculator/dynamicpack/FabricDynamicMod.java b/src/client/java/com/adamcalculator/dynamicpack/FabricDynamicMod.java index d253bd6..95c05c1 100644 --- a/src/client/java/com/adamcalculator/dynamicpack/FabricDynamicMod.java +++ b/src/client/java/com/adamcalculator/dynamicpack/FabricDynamicMod.java @@ -1,23 +1,30 @@ package com.adamcalculator.dynamicpack; import com.adamcalculator.dynamicpack.pack.Pack; +import com.adamcalculator.dynamicpack.status.StatusChecker; import com.adamcalculator.dynamicpack.sync.SyncThread; import com.adamcalculator.dynamicpack.sync.SyncingTask; import com.adamcalculator.dynamicpack.sync.state.StateDownloading; import com.adamcalculator.dynamicpack.sync.state.StateFileDeleted; import com.adamcalculator.dynamicpack.sync.state.SyncProgressState; +import com.adamcalculator.dynamicpack.util.Out; import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.SharedConstants; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.toast.SystemToast; import net.minecraft.client.toast.ToastManager; import net.minecraft.resource.metadata.PackResourceMetadataReader; +import net.minecraft.text.ClickEvent; +import net.minecraft.text.HoverEvent; +import net.minecraft.text.Style; import net.minecraft.text.Text; +import net.minecraft.util.Formatting; import net.minecraft.util.JsonHelper; public class FabricDynamicMod extends DynamicPackModBase implements ClientModInitializer { - private static final boolean SHOW_STATE = false; private SystemToast toast = null; private long toastUpdated = 0; @@ -40,6 +47,37 @@ public void setToastContent(Text title, Text text) { public void onInitializeClient() { var gameDir = FabricLoader.getInstance().getGameDir().toFile(); init(gameDir); + + ClientPlayConnectionEvents.JOIN.register((handler, sender, client) -> { + ClientPlayerEntity player = client.player; + Text download = Text.translatable("dynamicpack.status_checker.download") + .fillStyle(Style.EMPTY + .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Text.translatable("dynamicpack.status_checker.download.hover", Text.literal(Mod.MODRINTH_URL).formatted(Formatting.UNDERLINE, Formatting.AQUA)))) + .withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, Mod.MODRINTH_URL)) + ) + .formatted(Formatting.YELLOW, Formatting.UNDERLINE); + + + if (player == null) { + Out.warn("player == null on world join"); + + } else if (!StatusChecker.isSafe()) { + player.sendMessage(Text.translatable("dynamicpack.status_checker.not_safe", download)); + setToastContent(Text.translatable("dynamicpack.status_checker.not_safe.toast.title"), + Text.translatable("dynamicpack.status_checker.not_safe.toast.description")); + + } else if (!StatusChecker.isFormatActual()) { + player.sendMessage(Text.translatable("dynamicpack.status_checker.format_not_actual", download)); + + } else if (StatusChecker.isModUpdateAvailable()) { + Out.println("DynamicPack mod update available: " + Mod.MODRINTH_URL); + + } else if (!StatusChecker.isChecked()) { + Out.warn("StatusChecker isChecked = false :("); + } else { + Out.println("Mod in actual state in current date!"); + } + }); } @Override diff --git a/src/main/resources/assets/dynamicpack/lang/en_us.json b/src/main/resources/assets/dynamicpack/lang/en_us.json index 042f466..dda5f11 100644 --- a/src/main/resources/assets/dynamicpack/lang/en_us.json +++ b/src/main/resources/assets/dynamicpack/lang/en_us.json @@ -15,5 +15,11 @@ "dynamicpack.toast.pack.state.unknown.description": "Processing...", "dynamicpack.screen.pack.description": "This resource pack support DynamicPack features!", "dynamicpack.screen.pack.remote_type": "Remote type: %s", - "dynamicpack.screen.pack.latestUpdated": "Latest updated at: %s" + "dynamicpack.screen.pack.latestUpdated": "Latest updated at: %s", + "dynamicpack.status_checker.not_safe": "Security update available for DynamicPack mod! This message should not be ignored, since the update has fixed possible vulnerabilities: %s", + "dynamicpack.status_checker.not_safe.toast.title": "DynamicPack", + "dynamicpack.status_checker.not_safe.toast.description": "Security update available", + "dynamicpack.status_checker.format_not_actual": "Dynamic pack format update available! Perhaps resource pack developers will use it, and then without updating the mod they will stop working: %s", + "dynamicpack.status_checker.download": "Download!", + "dynamicpack.status_checker.download.hover": "Click for go to %s" } \ No newline at end of file diff --git a/src/main/resources/assets/dynamicpack/lang/ru_ru.json b/src/main/resources/assets/dynamicpack/lang/ru_ru.json index 0f4e7cd..686aaac 100644 --- a/src/main/resources/assets/dynamicpack/lang/ru_ru.json +++ b/src/main/resources/assets/dynamicpack/lang/ru_ru.json @@ -15,5 +15,11 @@ "dynamicpack.toast.pack.state.unknown.description": "Обработка...", "dynamicpack.screen.pack.description": "Этот ресурспак поддерживает возможности мода DynamicPack!", "dynamicpack.screen.pack.remote_type": "Тип: %s", - "dynamicpack.screen.pack.latestUpdated": "Обновлён: %s" + "dynamicpack.screen.pack.latestUpdated": "Обновлён: %s", + "dynamicpack.status_checker.not_safe": "Доступно обновление безопасности для мода DynamicPack! Это сообщение не стоит игнорировать, поскольку в обновлении были исправлены возможные уязвимости: %s", + "dynamicpack.status_checker.not_safe.toast.title": "DynamicPack", + "dynamicpack.status_checker.not_safe.toast.description": "Доступно обновление безопасности", + "dynamicpack.status_checker.format_not_actual": "Доступно обновление формата динамических паков! Возможно разработчики ресурспаков будут его использовать, и тогда без обновления мода они работать перестанут: %s", + "dynamicpack.status_checker.download": "Загрузить!", + "dynamicpack.status_checker.download.hover": "Нажмите чтобы перейти %s" } \ No newline at end of file From 0eef3fb3f7155814aa6a4f62c17342e607367b2b Mon Sep 17 00:00:00 2001 From: adam Date: Thu, 21 Mar 2024 16:05:55 +0300 Subject: [PATCH 3/9] add exception to gui --- .../dynamicpack/DynamicPackModBase.java | 26 ++++++++++++++---- .../dynamicpack/pack/DynamicRepoRemote.java | 10 +++++-- .../adamcalculator/dynamicpack/pack/Pack.java | 22 ++++++++++++++- .../dynamicpack/sync/SyncingTask.java | 2 ++ .../dynamicpack/DynamicPackScreen.java | 5 ++++ .../dynamicpack/PackMixinHelper.java | 6 ++-- .../assets/dynamicpack/lang/en_us.json | 1 + .../assets/dynamicpack/lang/ru_ru.json | 1 + .../dynamicpack/select_button_warning.png | Bin 0 -> 17658 bytes 9 files changed, 61 insertions(+), 12 deletions(-) create mode 100644 src/main/resources/assets/dynamicpack/select_button_warning.png diff --git a/common/src/main/java/com/adamcalculator/dynamicpack/DynamicPackModBase.java b/common/src/main/java/com/adamcalculator/dynamicpack/DynamicPackModBase.java index 76a56e4..d45ba02 100644 --- a/common/src/main/java/com/adamcalculator/dynamicpack/DynamicPackModBase.java +++ b/common/src/main/java/com/adamcalculator/dynamicpack/DynamicPackModBase.java @@ -13,6 +13,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; public abstract class DynamicPackModBase { @@ -21,9 +22,10 @@ public abstract class DynamicPackModBase { public static DynamicPackModBase INSTANCE; protected static int manuallySyncThreadCounter = 0; + public boolean rescanPacksBlocked = false; private boolean isPacksScanning = false; - private List packs = new ArrayList<>(); + private HashMap packs = new HashMap<>(); private File gameDir; private File resourcePacks; private boolean minecraftInitialized = false; @@ -54,9 +56,12 @@ public void rescanPacks() { Out.warn("rescanPacks already in scanning!"); return; } + if (rescanPacksBlocked) { + Out.warn("rescanPacks blocked"); + return; + } isPacksScanning = true; - packs.clear(); - + List forDelete = new ArrayList<>(packs.keySet()); for (File packFile : AFiles.lists(resourcePacks)) { try { PackUtil.openPackFileSystem(packFile, path -> { @@ -65,7 +70,8 @@ public void rescanPacks() { Out.println("+ Pack " + packFile.getName() + " supported by mod!"); try { processPack(packFile, PackUtil.readJson(dynamicPackPath)); - } catch (IOException e) { + forDelete.remove(packFile.getName()); + } catch (Exception e) { throw new RuntimeException(e); } } else { @@ -80,6 +86,10 @@ public void rescanPacks() { } } } + for (String s : forDelete) { + Out.println("Pack " + s + " no longer exists!"); + packs.remove(s); + } isPacksScanning = false; } @@ -87,9 +97,13 @@ public void rescanPacks() { private void processPack(File location, JSONObject json) { long formatVersion = json.getLong("formatVersion"); + Pack oldestPack = packs.getOrDefault(location.getName(), null); if (formatVersion == 1) { Pack pack = new Pack(location, json); - packs.add(pack); + if (oldestPack != null) { + pack.saveReScanData(oldestPack); + } + packs.put(location.getName(), pack); } else { throw new RuntimeException("Unsupported formatVersion: " + formatVersion); @@ -135,7 +149,7 @@ public File getGameDir() { } public Pack[] getPacks() { - return packs.toArray(new Pack[0]); + return packs.values().toArray(new Pack[0]); } public void minecraftInitialized() { diff --git a/common/src/main/java/com/adamcalculator/dynamicpack/pack/DynamicRepoRemote.java b/common/src/main/java/com/adamcalculator/dynamicpack/pack/DynamicRepoRemote.java index fb74540..f78d38a 100644 --- a/common/src/main/java/com/adamcalculator/dynamicpack/pack/DynamicRepoRemote.java +++ b/common/src/main/java/com/adamcalculator/dynamicpack/pack/DynamicRepoRemote.java @@ -55,7 +55,6 @@ public void init(Pack pack, JSONObject remote, JSONObject current) { } } - if (skipSign != this.publicKey.isBlank()) { throw new RuntimeException("Incompatible parameters set. Select one of: sign_no_required or public_key"); } @@ -107,12 +106,12 @@ public String getCurrentPackContentHash(String id) { @Override - public boolean sync(PackSyncProgress progress, boolean manually) throws IOException, NoSuchAlgorithmException { + public boolean sync(PackSyncProgress progress, boolean manually) throws IOException { PackUtil.openPackFileSystem(parent.getLocation(), path -> { try { sync0(progress, path); - } catch (IOException | NoSuchAlgorithmException e) { + } catch (Exception e) { throw new RuntimeException(e); } }); @@ -144,6 +143,11 @@ public void onUpdate(FileDownloadConsumer it) { throw new RuntimeException("Incompatible formatVersion: " + formatVersion); } + long minBuildForWork; + if ((minBuildForWork = repoJson.optLong("minimal_mod_build", Mod.VERSION_BUILD)) > Mod.VERSION_BUILD) { + throw new RuntimeException("Incompatible DynamicPack Mod version for this pack: required minimal_mod_build=" + minBuildForWork + ", but currently mod build is " + Mod.VERSION_BUILD); + } + String remoteName = repoJson.getString("name"); if (!InputValidator.isPackNameValid(remoteName)) { throw new RuntimeException("Remote name of pack not valid."); diff --git a/common/src/main/java/com/adamcalculator/dynamicpack/pack/Pack.java b/common/src/main/java/com/adamcalculator/dynamicpack/pack/Pack.java index 7d9740b..5bd1f6e 100644 --- a/common/src/main/java/com/adamcalculator/dynamicpack/pack/Pack.java +++ b/common/src/main/java/com/adamcalculator/dynamicpack/pack/Pack.java @@ -29,6 +29,7 @@ public class Pack { private boolean cachedUpdateAvailable; private boolean isSyncing = false; private final String remoteTypeStr; + private Exception latestException; public Pack(File location, JSONObject json) { @@ -103,9 +104,11 @@ public void sync(PackSyncProgress progress, boolean manually) throws Exception { try { sync0(progress, manually); checkSafePackMinecraftMeta(); + setLatestException(null); } catch (Exception e) { isSyncing = false; checkSafePackMinecraftMeta(); + setLatestException(e); throw e; } } @@ -137,7 +140,7 @@ private void sync0(PackSyncProgress progress, boolean manually) throws Exception private void checkNetwork() { if (isNetworkBlocked()) { - throw new SecurityException("Network is blocked for remote_type: " + remoteTypeStr + " in dynamicpack.status.v1.json by security questions!"); + throw new SecurityException("Network is blocked for remote_type=" + remoteTypeStr + " current version of mod not safe. Update mod!"); } } @@ -171,4 +174,21 @@ private boolean checkMinecraftMetaIsValid(String s) { public String getRemoteType() { return remoteTypeStr; } + + public void setLatestException(Exception e) { + Out.debug(this + ": latestExcep="+e); + this.latestException = e; + } + + public Exception getLatestException() { + return latestException; + } + + public void saveReScanData(Pack oldestPack) { + if (oldestPack == null) return; + + if (this.latestException == null) { + this.latestException = oldestPack.latestException; + } + } } diff --git a/common/src/main/java/com/adamcalculator/dynamicpack/sync/SyncingTask.java b/common/src/main/java/com/adamcalculator/dynamicpack/sync/SyncingTask.java index a9e3234..cad5ca2 100644 --- a/common/src/main/java/com/adamcalculator/dynamicpack/sync/SyncingTask.java +++ b/common/src/main/java/com/adamcalculator/dynamicpack/sync/SyncingTask.java @@ -32,6 +32,7 @@ public void run() { Out.println("SyncTask started!"); onSyncStart(); DynamicPackModBase.INSTANCE.rescanPacks(); + DynamicPackModBase.INSTANCE.rescanPacksBlocked = true; for (Pack pack : DynamicPackModBase.INSTANCE.getPacks()) { currentPack = pack; try { @@ -42,6 +43,7 @@ public void run() { onPackError(pack, e); } } + DynamicPackModBase.INSTANCE.rescanPacksBlocked = false; onSyncDone(reloadRequired); Out.println("SyncTask ended!"); isSyncing = false; diff --git a/src/client/java/com/adamcalculator/dynamicpack/DynamicPackScreen.java b/src/client/java/com/adamcalculator/dynamicpack/DynamicPackScreen.java index 24491b9..48799e2 100644 --- a/src/client/java/com/adamcalculator/dynamicpack/DynamicPackScreen.java +++ b/src/client/java/com/adamcalculator/dynamicpack/DynamicPackScreen.java @@ -1,6 +1,7 @@ package com.adamcalculator.dynamicpack; import com.adamcalculator.dynamicpack.pack.Pack; +import com.terraformersmc.modmenu.util.DrawingUtil; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; @@ -31,6 +32,10 @@ public void render(DrawContext context, int mouseX, int mouseY, float delta) { context.drawTextWithShadow(this.textRenderer, Text.translatable("dynamicpack.screen.pack.remote_type", pack.getRemoteType()), 20, 36, 16777215); context.drawTextWithShadow(this.textRenderer, Text.translatable("dynamicpack.screen.pack.latestUpdated", pack.getLatestUpdated() < 0 ? "-" : new Date(pack.getLatestUpdated() * 1000)), 20, 52, 16777215); + if (pack.getLatestException() != null) { + DrawingUtil.drawWrappedString(context, Text.translatable("dynamicpack.screen.pack.latestException", pack.getLatestException().getMessage()).asTruncatedString(9999), 20, 70, 500, 99, 0xff2222); + } + super.render(context, mouseX, mouseY, delta); } diff --git a/src/client/java/com/adamcalculator/dynamicpack/PackMixinHelper.java b/src/client/java/com/adamcalculator/dynamicpack/PackMixinHelper.java index ea19f41..55a78c1 100644 --- a/src/client/java/com/adamcalculator/dynamicpack/PackMixinHelper.java +++ b/src/client/java/com/adamcalculator/dynamicpack/PackMixinHelper.java @@ -10,13 +10,15 @@ public class PackMixinHelper { private static final Identifier BUTTON_TEXTURE = Identifier.of("dynamicpack", "select_button.png"); + private static final Identifier BUTTON_WARNING_TEXTURE = Identifier.of("dynamicpack", "select_button_warning.png"); public static void renderResourcePackEntry(Object resourcePackEntryMixin, DrawContext context, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta, CallbackInfo ci) { PackListWidget.ResourcePackEntry entry = (PackListWidget.ResourcePackEntry) resourcePackEntryMixin; - if (DynamicPackModBase.INSTANCE.isNameIsDynamic(entry.getName())) { + Pack pack = DynamicPackModBase.INSTANCE.getDynamicPackByMinecraftName(entry.getName()); + if (pack != null) { int i = mouseX - x; int j = mouseY - y; - context.drawTexture(BUTTON_TEXTURE, x + 174, y+16, 0.0F, ((i >= 174 && j >= 16 && hovered) ? 16f : 0f), 16, 16, 16, 32); + context.drawTexture(pack.getLatestException() != null ? BUTTON_WARNING_TEXTURE : BUTTON_TEXTURE, x + 174, y+16, 0.0F, ((i >= 174 && j >= 16 && hovered) ? 16f : 0f), 16, 16, 16, 32); } } diff --git a/src/main/resources/assets/dynamicpack/lang/en_us.json b/src/main/resources/assets/dynamicpack/lang/en_us.json index dda5f11..ccc0b1d 100644 --- a/src/main/resources/assets/dynamicpack/lang/en_us.json +++ b/src/main/resources/assets/dynamicpack/lang/en_us.json @@ -16,6 +16,7 @@ "dynamicpack.screen.pack.description": "This resource pack support DynamicPack features!", "dynamicpack.screen.pack.remote_type": "Remote type: %s", "dynamicpack.screen.pack.latestUpdated": "Latest updated at: %s", + "dynamicpack.screen.pack.latestException": "Latest error on this pack: %s\nFor details see game logs", "dynamicpack.status_checker.not_safe": "Security update available for DynamicPack mod! This message should not be ignored, since the update has fixed possible vulnerabilities: %s", "dynamicpack.status_checker.not_safe.toast.title": "DynamicPack", "dynamicpack.status_checker.not_safe.toast.description": "Security update available", diff --git a/src/main/resources/assets/dynamicpack/lang/ru_ru.json b/src/main/resources/assets/dynamicpack/lang/ru_ru.json index 686aaac..27b6b7c 100644 --- a/src/main/resources/assets/dynamicpack/lang/ru_ru.json +++ b/src/main/resources/assets/dynamicpack/lang/ru_ru.json @@ -16,6 +16,7 @@ "dynamicpack.screen.pack.description": "Этот ресурспак поддерживает возможности мода DynamicPack!", "dynamicpack.screen.pack.remote_type": "Тип: %s", "dynamicpack.screen.pack.latestUpdated": "Обновлён: %s", + "dynamicpack.screen.pack.latestException": "Последняя ошибка в паке: %s\nДля дополнительного смотрите логи", "dynamicpack.status_checker.not_safe": "Доступно обновление безопасности для мода DynamicPack! Это сообщение не стоит игнорировать, поскольку в обновлении были исправлены возможные уязвимости: %s", "dynamicpack.status_checker.not_safe.toast.title": "DynamicPack", "dynamicpack.status_checker.not_safe.toast.description": "Доступно обновление безопасности", diff --git a/src/main/resources/assets/dynamicpack/select_button_warning.png b/src/main/resources/assets/dynamicpack/select_button_warning.png new file mode 100644 index 0000000000000000000000000000000000000000..06995ef66fb02907a0ad3bc337484ee60c07496c GIT binary patch literal 17658 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 Date: Thu, 21 Mar 2024 17:01:00 +0300 Subject: [PATCH 4/9] reload only if needed in dynamic_repo --- .../dynamicpack/pack/DynamicRepoRemote.java | 11 ++++++++--- .../pack/DynamicRepoSyncProcessV1.java | 14 ++++++++++++++ .../dynamicpack/DynamicPackScreen.java | 17 +++++++++++------ .../dynamicpack/PackMixinHelper.java | 5 +++-- .../assets/dynamicpack/lang/en_us.json | 1 + .../assets/dynamicpack/lang/ru_ru.json | 1 + 6 files changed, 38 insertions(+), 11 deletions(-) diff --git a/common/src/main/java/com/adamcalculator/dynamicpack/pack/DynamicRepoRemote.java b/common/src/main/java/com/adamcalculator/dynamicpack/pack/DynamicRepoRemote.java index f78d38a..3c4a3a7 100644 --- a/common/src/main/java/com/adamcalculator/dynamicpack/pack/DynamicRepoRemote.java +++ b/common/src/main/java/com/adamcalculator/dynamicpack/pack/DynamicRepoRemote.java @@ -16,6 +16,7 @@ import java.nio.file.Path; import java.security.NoSuchAlgorithmException; import java.util.HashMap; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.LongConsumer; public class DynamicRepoRemote extends Remote { @@ -107,18 +108,20 @@ public String getCurrentPackContentHash(String id) { @Override public boolean sync(PackSyncProgress progress, boolean manually) throws IOException { + AtomicBoolean returnValue = new AtomicBoolean(false); PackUtil.openPackFileSystem(parent.getLocation(), path -> { try { - sync0(progress, path); + boolean t = sync0(progress, path); + returnValue.set(t); } catch (Exception e) { throw new RuntimeException(e); } }); - return true; + return returnValue.get(); } - public void sync0(PackSyncProgress progress, Path path) throws IOException, NoSuchAlgorithmException { + public boolean sync0(PackSyncProgress progress, Path path) throws IOException, NoSuchAlgorithmException { String packUrlContent; LongConsumer parseProgress = new FileDownloadConsumer() { @@ -167,6 +170,8 @@ public void onUpdate(FileDownloadConsumer it) { parent.updateJsonLatestUpdate(); AFiles.nioWriteText(path.resolve(DynamicPackModBase.CLIENT_FILE), parent.getPackJson().toString(2)); + + return dynamicRepoSyncProcessV1.isReloadRequired(); } public String getUrl() { diff --git a/common/src/main/java/com/adamcalculator/dynamicpack/pack/DynamicRepoSyncProcessV1.java b/common/src/main/java/com/adamcalculator/dynamicpack/pack/DynamicRepoSyncProcessV1.java index d5421fb..8be9568 100644 --- a/common/src/main/java/com/adamcalculator/dynamicpack/pack/DynamicRepoSyncProcessV1.java +++ b/common/src/main/java/com/adamcalculator/dynamicpack/pack/DynamicRepoSyncProcessV1.java @@ -23,6 +23,7 @@ public class DynamicRepoSyncProcessV1 { private final Set oldestFilesList = new HashSet<>(); private final Path packRootPath; + private boolean isReloadRequired = false; public DynamicRepoSyncProcessV1(Pack pack, DynamicRepoRemote dynamicRepoRemote, PackSyncProgress progress, JSONObject repoJson, Path path) { this.remote = dynamicRepoRemote; @@ -47,6 +48,7 @@ public void run() throws IOException { progress.textLog("File deleted from resource-pack: " + s); AFiles.nioSmartDelete(path); + markReloadRequired(); } try { @@ -140,6 +142,7 @@ private void processContentParsed(JSONObject jsonContent) throws IOException { continue; } + markReloadRequired(); this.progress.textLog("Overwriting: " + filePath); Urls.downloadDynamicFile(fileRemoteUrl, filePath, hash, new FileDownloadConsumer() { @Override @@ -199,4 +202,15 @@ private List calcActiveContents() { } return activeContents; } + + public boolean isReloadRequired() { + return isReloadRequired; + } + + private void markReloadRequired() { + if (!isReloadRequired) { + Out.debug("Now reload is required in " + this); + } + this.isReloadRequired = true; + } } diff --git a/src/client/java/com/adamcalculator/dynamicpack/DynamicPackScreen.java b/src/client/java/com/adamcalculator/dynamicpack/DynamicPackScreen.java index 48799e2..52e0c10 100644 --- a/src/client/java/com/adamcalculator/dynamicpack/DynamicPackScreen.java +++ b/src/client/java/com/adamcalculator/dynamicpack/DynamicPackScreen.java @@ -1,10 +1,12 @@ package com.adamcalculator.dynamicpack; import com.adamcalculator.dynamicpack.pack.Pack; +import com.adamcalculator.dynamicpack.sync.SyncingTask; import com.terraformersmc.modmenu.util.DrawingUtil; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.screen.ScreenTexts; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -15,6 +17,7 @@ public class DynamicPackScreen extends Screen { private final Screen parent; private final Pack pack; private final Text screenDescText; + private ButtonWidget syncButton; public DynamicPackScreen(Screen parent, Pack pack) { super(Text.literal(pack.getName()).formatted(Formatting.BOLD)); @@ -27,13 +30,15 @@ public DynamicPackScreen(Screen parent, Pack pack) { @Override public void render(DrawContext context, int mouseX, int mouseY, float delta) { renderBackground(context); + syncButton.active = !SyncingTask.isSyncing; + int h = 20; context.drawTextWithShadow(this.textRenderer, this.title, 20, 8, 16777215); - context.drawTextWithShadow(this.textRenderer, screenDescText, 20, 20, 16777215); - context.drawTextWithShadow(this.textRenderer, Text.translatable("dynamicpack.screen.pack.remote_type", pack.getRemoteType()), 20, 36, 16777215); - context.drawTextWithShadow(this.textRenderer, Text.translatable("dynamicpack.screen.pack.latestUpdated", pack.getLatestUpdated() < 0 ? "-" : new Date(pack.getLatestUpdated() * 1000)), 20, 52, 16777215); + context.drawTextWithShadow(this.textRenderer, screenDescText, 20, 20 + h, 16777215); + context.drawTextWithShadow(this.textRenderer, Text.translatable("dynamicpack.screen.pack.remote_type", pack.getRemoteType()), 20, 36 + h, 16777215); + context.drawTextWithShadow(this.textRenderer, Text.translatable("dynamicpack.screen.pack.latestUpdated", pack.getLatestUpdated() < 0 ? "-" : new Date(pack.getLatestUpdated() * 1000)), 20, 52 + h, 16777215); if (pack.getLatestException() != null) { - DrawingUtil.drawWrappedString(context, Text.translatable("dynamicpack.screen.pack.latestException", pack.getLatestException().getMessage()).asTruncatedString(9999), 20, 70, 500, 99, 0xff2222); + DrawingUtil.drawWrappedString(context, Text.translatable("dynamicpack.screen.pack.latestException", pack.getLatestException().getMessage()).asTruncatedString(9999), 20, 78 + h, 500, 99, 0xff2222); } super.render(context, mouseX, mouseY, delta); @@ -41,8 +46,8 @@ public void render(DrawContext context, int mouseX, int mouseY, float delta) { @Override protected void init() { - addDrawableChild(Compat.createButton( - Text.of("Manually sync"), + addDrawableChild(syncButton = Compat.createButton( + Text.translatable("dynamicpack.screen.pack.manually_sync"), () -> { DynamicPackModBase.INSTANCE.startManuallySync(); close(); diff --git a/src/client/java/com/adamcalculator/dynamicpack/PackMixinHelper.java b/src/client/java/com/adamcalculator/dynamicpack/PackMixinHelper.java index 55a78c1..a5c5ed1 100644 --- a/src/client/java/com/adamcalculator/dynamicpack/PackMixinHelper.java +++ b/src/client/java/com/adamcalculator/dynamicpack/PackMixinHelper.java @@ -1,6 +1,7 @@ package com.adamcalculator.dynamicpack; import com.adamcalculator.dynamicpack.pack.Pack; +import com.adamcalculator.dynamicpack.sync.SyncingTask; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.pack.PackListWidget; @@ -15,7 +16,7 @@ public class PackMixinHelper { public static void renderResourcePackEntry(Object resourcePackEntryMixin, DrawContext context, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta, CallbackInfo ci) { PackListWidget.ResourcePackEntry entry = (PackListWidget.ResourcePackEntry) resourcePackEntryMixin; Pack pack = DynamicPackModBase.INSTANCE.getDynamicPackByMinecraftName(entry.getName()); - if (pack != null) { + if (pack != null && !SyncingTask.isSyncing) { int i = mouseX - x; int j = mouseY - y; context.drawTexture(pack.getLatestException() != null ? BUTTON_WARNING_TEXTURE : BUTTON_TEXTURE, x + 174, y+16, 0.0F, ((i >= 174 && j >= 16 && hovered) ? 16f : 0f), 16, 16, 16, 32); @@ -25,7 +26,7 @@ public static void renderResourcePackEntry(Object resourcePackEntryMixin, DrawCo public static void mouseClicked(Object resourcePackEntryMixin, PackListWidget widget, double mouseX, double mouseY, int button, CallbackInfoReturnable cir) { PackListWidget.ResourcePackEntry entry = (PackListWidget.ResourcePackEntry) resourcePackEntryMixin; Pack pack = DynamicPackModBase.INSTANCE.getDynamicPackByMinecraftName(entry.getName()); - if (pack != null) { + if (pack != null && !SyncingTask.isSyncing) { double d = mouseX - (double)widget.getRowLeft(); double e = mouseY - (double)widget.getRowTop(widget.children().indexOf(entry)); diff --git a/src/main/resources/assets/dynamicpack/lang/en_us.json b/src/main/resources/assets/dynamicpack/lang/en_us.json index ccc0b1d..55f67fb 100644 --- a/src/main/resources/assets/dynamicpack/lang/en_us.json +++ b/src/main/resources/assets/dynamicpack/lang/en_us.json @@ -17,6 +17,7 @@ "dynamicpack.screen.pack.remote_type": "Remote type: %s", "dynamicpack.screen.pack.latestUpdated": "Latest updated at: %s", "dynamicpack.screen.pack.latestException": "Latest error on this pack: %s\nFor details see game logs", + "dynamicpack.screen.pack.manually_sync": "Manually sync", "dynamicpack.status_checker.not_safe": "Security update available for DynamicPack mod! This message should not be ignored, since the update has fixed possible vulnerabilities: %s", "dynamicpack.status_checker.not_safe.toast.title": "DynamicPack", "dynamicpack.status_checker.not_safe.toast.description": "Security update available", diff --git a/src/main/resources/assets/dynamicpack/lang/ru_ru.json b/src/main/resources/assets/dynamicpack/lang/ru_ru.json index 27b6b7c..5c2ed1e 100644 --- a/src/main/resources/assets/dynamicpack/lang/ru_ru.json +++ b/src/main/resources/assets/dynamicpack/lang/ru_ru.json @@ -17,6 +17,7 @@ "dynamicpack.screen.pack.remote_type": "Тип: %s", "dynamicpack.screen.pack.latestUpdated": "Обновлён: %s", "dynamicpack.screen.pack.latestException": "Последняя ошибка в паке: %s\nДля дополнительного смотрите логи", + "dynamicpack.screen.pack.manually_sync": "Синхр. вручную", "dynamicpack.status_checker.not_safe": "Доступно обновление безопасности для мода DynamicPack! Это сообщение не стоит игнорировать, поскольку в обновлении были исправлены возможные уязвимости: %s", "dynamicpack.status_checker.not_safe.toast.title": "DynamicPack", "dynamicpack.status_checker.not_safe.toast.description": "Доступно обновление безопасности", From c2e5ed53d546b1e756ee297bc638966ae5368ed5 Mon Sep 17 00:00:00 2001 From: adam Date: Thu, 21 Mar 2024 17:06:28 +0300 Subject: [PATCH 5/9] v1.0.14 (build 14) --- common/build.gradle.kts | 2 +- common/src/main/java/com/adamcalculator/dynamicpack/Mod.java | 2 +- gradle.properties | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/common/build.gradle.kts b/common/build.gradle.kts index a88ecd1..0303a00 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -3,7 +3,7 @@ plugins { } group = "com.adamcalculator" -version = "1.0.13" +version = "1.0.14" repositories { mavenCentral() diff --git a/common/src/main/java/com/adamcalculator/dynamicpack/Mod.java b/common/src/main/java/com/adamcalculator/dynamicpack/Mod.java index 0ba75eb..fcb177f 100644 --- a/common/src/main/java/com/adamcalculator/dynamicpack/Mod.java +++ b/common/src/main/java/com/adamcalculator/dynamicpack/Mod.java @@ -8,7 +8,7 @@ import java.util.Set; public class Mod { - public static final String VERSION_NAME_MOD = "1.0.13"; + public static final String VERSION_NAME_MOD = "1.0.14"; public static final String VERSION_NAME_BRANCH = "mc1.20.1"; public static final String VERSION_NAME = VERSION_NAME_MOD + "-" + VERSION_NAME_BRANCH; public static final long VERSION_BUILD = 14; diff --git a/gradle.properties b/gradle.properties index 6f444d6..79b5a1d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,6 +12,6 @@ loader_version=0.15.7 fabric_version=0.92.0+1.20.1 # Mod Properties -mod_version=1.0.13-mc1.20.1 +mod_version=1.0.14-mc1.20.1 maven_group=com.adamcalculator archives_base_name=dynamicpack \ No newline at end of file From 53e778af0a3946e889dfbb701759568d1143f412 Mon Sep 17 00:00:00 2001 From: adam Date: Thu, 21 Mar 2024 17:35:37 +0300 Subject: [PATCH 6/9] secure --- .../java/com/adamcalculator/dynamicpack/Mod.java | 2 ++ .../com/adamcalculator/dynamicpack/util/Out.java | 12 ++++++++++++ 2 files changed, 14 insertions(+) diff --git a/common/src/main/java/com/adamcalculator/dynamicpack/Mod.java b/common/src/main/java/com/adamcalculator/dynamicpack/Mod.java index fcb177f..0352979 100644 --- a/common/src/main/java/com/adamcalculator/dynamicpack/Mod.java +++ b/common/src/main/java/com/adamcalculator/dynamicpack/Mod.java @@ -50,6 +50,8 @@ protected static void addAllowedHosts(String host, Object requester) throws Exce Out.securityWarning("# "); Out.securityWarning("# Host: " + host); Out.securityWarning("# Requester: " + requester); + Out.securityWarning("# StackTrace:"); + Out.securityStackTrace(); Out.securityWarning("# "); Out.securityWarning("==========================="); diff --git a/common/src/main/java/com/adamcalculator/dynamicpack/util/Out.java b/common/src/main/java/com/adamcalculator/dynamicpack/util/Out.java index cbf7e20..60c912a 100644 --- a/common/src/main/java/com/adamcalculator/dynamicpack/util/Out.java +++ b/common/src/main/java/com/adamcalculator/dynamicpack/util/Out.java @@ -66,4 +66,16 @@ public static void securityWarning(String s) { public static void debug(String s) { println("DEBUG: " + s); } + + /** + * Always enable! Ignore enable/disable + */ + public static void securityStackTrace() { + if (USE_SOUT) { + System.out.println("[dynamicpack] Stacktrace"); + new Throwable("StackTrace printer").printStackTrace(); + return; + } + LOGGER.error("No error. This is stacktrace printer", new Throwable("StackTrace printer")); + } } From 706a4f8b7da0c8117a92a9dc62d8b133b988ca28 Mon Sep 17 00:00:00 2001 From: adam Date: Thu, 21 Mar 2024 18:03:52 +0300 Subject: [PATCH 7/9] ICONIFY!!: By @j0u1 (big thanks) --- .../resources/assets/dynamicpack/icon.png | Bin 2570 -> 7506 bytes .../assets/dynamicpack/select_button.png | Bin 19231 -> 15312 bytes .../dynamicpack/select_button_warning.png | Bin 17658 -> 21280 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/dynamicpack/icon.png b/src/main/resources/assets/dynamicpack/icon.png index 57e7f86a2991a4b6702c8e005cf2112dd391d083..57f3f24b3c885fb73371f2dd345642eb77cf78b3 100644 GIT binary patch literal 7506 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 literal 2570 zcmY*bX;f3!8aEUt^00`MaKn;U@LK12sk;8W}&d$D`&dz3W39*qer%nK1RdBvwuSX}vq&w_T z)q2A$Bg6P!-*sIXHQ8+c3N=Hg+k)E6zN#=mq1JClj980?K-+q zs+O*6tUoY4D_nC_dt_%*=Hr*Ob*C+=1J}KUs{?q)_iU`*QWx>YkiimUF>)UB940qd zL;MfPI)t$KpY}ZYGFr}d?+?Phzu5IFk7(0n+%<6BF!Q5h{8hu_S5`{T@+vj;$qAwH zlHA0x@bst){eB5$JNDa7jvR?O=1<%@VLg#uD=xCD4E5g`8$Yz~@X$j`W;n6#7u&=e zle!Z}y7V_>`}(@-S@`Kz9k%RtDqK2dD*vX(uE6W70KFU&O)KZj*_C$1o0KO1GYK8u z8eI74nh`k;qtZfQM~(=49=zTGN%@>BV++MI9G<24{*OjGRnnT$f0+5PdKN0)&EZ`B z>UyKOBu3*mllKfaVG-oiL|HBw2~H&ZtV8+!_kE*4HH+g>*7#!Y*z3Wuk+!H3nGCR4 z33qOvx1k}vU?RNSUBD{f1d(nhGUGHJj zJnl(xi2TV%e?5Ei`)Qv-w1dj* znN>q54!}W5M)2wx1ca#lZ$pHq01Yt2z$8F|eZ2t{a3M>T|DmtkT3zHXu{X7@!&Rgz z7WvkBUtV+)e7;8I%Wt^wkKjOw24j)d7lFnC7ZVYEmZ*gR8L^|LIFS9&9t&7P+!w?f z07D3PGhw?Pq*SJo{I5Fy*C{x@#a4OoW}>D5J^hveqRHAxt%`IELLDySc__{W4NP;p z0n9aDg`xx(xOp)#z(X;L@fFwIqi@C)n0m@{0``Ys(Bs=LKp;1gK?C{nF22$S4@J1R zJU%xaDc@C7>l4N;MFBH95l~$g@`yLq^>^SoRJu+6Cw|wpXt+#FrlT8DObdm0AXqQ4 z!Rer2k&ge9k=qbhOHr~@eYm9XJ+mOUs(U|s-tA?69tAJ6no?zWRCxa-XX%>~gQ+M>})O!#vL4yd(- zFBn508stku2f|PQ&sX5Vsn4k$o69C z(L9WAhEL>=5`5ca2cYbkyIhW3ZgA>zoR8YYz{Dk}HzYb;Vw@i4{Qz<5g;$p_aj~CU z3JU^Omh6Z?*KG#V2`bwj3vt2e>D zNG}qplHdyy#nS8?SIPvUg#^M-5E^dCE0r<}0FtP}u+In&@_45jK%OUsmDA?IRrB+l{Z~_5s}plA+>=_Md!<5jKEr=PQb&jbco;^W8*VVG1w&=KM&i-;^8O!3t3CGdG*Wi6$3GoRa%;NysnRr0D@!r@Og?nVSv z?!A+b(uP`-LW;|ldpet#vZsF?p!W3YcL1L3{&$Me`8=an2R=lRe_`)`Gk86Pz^s+O zv^USwpGxfcR&=*qF5fh;BWN+|>gczKXQ|!HIpg`>kk%k6+w|CEQ1^ZVt0qK>kHQ*v z;i){bV)R&USxanc{m(S0Kr8vv-7{OjZdqEkBFG#UPY;}u6U2o*fe_k*(aCsia$oB@^!TiM0^*iE;9B2f+vrw@CEK5oG~dz-~wp z%I~IskAr_BG~xQ+@`);1AUBw6Yu?+Og-EU_Oq?c{&lG;clbSvA;v2ul{k7F$JG#A5 z!Ypo{-#htiDssrDH`sLdVZ@L{t#{(55ALK)|F#@*lvarcPJ?4po8|_XYr_<^UkD~! zpOTQFc|j^MEZ3!b=C_oQHKwo~mhx8{-7J&<>v|Mnyhpfk4XnS-kwx4UkqAoiW_iNLnpJ4!vpzv|Az zAr8=;)>=DQ6!`#{gE;m}|IPLNriqcKc4~)%J8!2-TTZw454N6>eTe~Tn_=4gm9UCc zvqa&E;Pm^j$!6+Q@rg_Hw^74STM~EQ!@zZ{do%0~cXYnwvrKV1%P~Q@~ diff --git a/src/main/resources/assets/dynamicpack/select_button.png b/src/main/resources/assets/dynamicpack/select_button.png index 4810abf05c1c642e45d483baeb0c554397559525..d3e8e0888dc76077eba7708ff6af300850141e44 100644 GIT binary patch literal 15312 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 diff --git a/src/main/resources/assets/dynamicpack/select_button_warning.png b/src/main/resources/assets/dynamicpack/select_button_warning.png index 06995ef66fb02907a0ad3bc337484ee60c07496c..f538b3aaee8cf8b4d8b594e9e2fe8bb654892e97 100644 GIT binary patch literal 21280 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 Z5+u3Y*l&&s)dp%qDhg`yA8wjH{6F8ffhhn0 delta 14402 zcmZvCRX`j}&+hKBxVyW%yDjcs9E$VeR@`=RZE>e)iV z>stBIczC(nJG$7>cn5gc(b)Mr+5-UoD_?U}yck4N6>dcosDalW6c}hJ?J|@-n=xtM z6Nio7`6{8Pl+UhVOl@O39sJ&WZ9jwF87kgzWi6am%wI#flO%Tb6mAQl*CE(aJ?H0} zw}p4lS-0zxzlJCKCvX0SJ@`D`K5id^3#ro#_qmx*9#64P7o`)Q?nxirnIGDE!Ts<`4wO_mY^eF4-^mJqPe3ic=yAAK;p{eq`y3>%N zr8Sakol>o;`%+&-A?OwPRb0PoWaV;|`{kTRmcbkQgPDqAm1&F5GX;82#%lgql%XAdO%oYfTT>(=##{8ScRi2g)UAfq zIN`5oq0sw}I=%L!qxsz*NJvp{*(>%D?;c;zU(*-mkrGP26On>_Lp1AE@38T{WF7T~ zMHLo8eNq1ee}>_B9`{+x(jnM>)I<@yBeFpcgZSbJ7>i*N5R;;O?f*$c$n5Q`g32y~(bd71Q&O8_^wQm_4aa-^n=&cqwR+w)+zs{qNUOIXdCH z!lUl>Q}d2xHlKn3RlD&7j{qU7>H0cfj`hB#?cwf|?hn&KhyQrgvP&Cvt{dCbFy|)~ zfA;gqkysKiljmp^?%H=Z|M40yt_+({dk-Z({prTB?liv70l)6o*&Rv0G;5ih9qszH z*%-*iF@J0mWV$%{EyQ`d1(UDQNVRUpl&7z%(X+3OW&gce`)B^dvi6gVGmCK-V2f+R zRkv>}f34NV_jAI#;cB0cq} z^Gfzrw?$<;`aIWYomI?V#%{6nzFl05E*xJ?#>5m(DNLnm9mjC;Qhj4K*1s~SjoT+Y znlLbZn&O@y9gKpr#^(*~^}UPG`SG7Yu17}4?B{&o7gW~2)~i`U*SJ|@K`ZNStChZi zTu&xD9ECjTbzc*gw7;xeD_aITe+V#vx{yjz9ud|3OZyXCBePuoes7tA8H3E@7KsI{ z;5a7!VBaKV%I%ZBRC(n|gh}eyQs*obZ!Nquw!U%nhxZDNA|Di^lV#KFiL1{aEg@gD zY>NH6W+Z^1G_K^2ku7!&G@uR-`;ReX!eDsJuv73u_t{-@R)NwR1z@ zC76TYu6I>p8_2(MX;Ps+GtQ*QcKChg@%!aBu{O9Q_shf*HWlGo)ifPh`rZ06e$NifQ4*sl-g*5$C`6=9-K%1DEOEZtbgU@&7H)|1+i$EBZbb z7O;Ufn%<#2aNsxWAyV{pHxpI&M{)q8=-A<)3KgXx=deByLd=!t*|o0PJ8&BOMu`4vYksTB7zvo4nQr0%aA=FkxJNMrE#v7PsgnWn3ot%C=!AGBp#QWJ*z<$2BSl@k8F;;r6->57yiH2{M!(*-{gwph zkCvP%MOuU-SQ1%S+0c^-nyt{@&gn|y^p>2{P9d zu7PIA0ghWTMfm^+so*iB?`zg#AwtE%Vt2?g;>KGESfYDB#2>ltED|RGNG80}y zApU2BZi^F~J49#jqjT@Cq8q-M4<3jRWLR1lW3Up!Zx-j=0CBvwvSLaDdcry>!@*jB zo=l<{B0l^bvMqm>Oz(cb{?bmFZ3-oX|9if<4m0lK$$0HP>JhXOPa+65^pU@a63!73 zAmrf9Svv5%3?uQctHmHN`e9afVqGi5U^-d{0LY{9VE|de?P&InmNR0%jiaR)n)6lR zZ_iBi`}>H%1b-xlndBFJYQ`MijO)uul>yM+Lk~6dE5k|aI_dP<@&b~N{uMATL$eU2XTL6gyrO`w; zQVs_a%g&7pOWtO1<<%cSd+)DhrRL1d& zE>L26<`#!j*bB%=!qJu*1=SxXZgQw!854uQK{BaU2~EgZ38AxG;Vj;z8YyD}32U0r zQP(wER-UoOHF@`&aH#Kw?rpvHyhAU=$4;-2C7dDV0<-MX#CNwz%*Wa>oPGL(NjcF@lpY}7drELUK zk0p%Rk-JEft8sR9G|lg5M2`rww_RWGW%TUAe(QtBAdeD8N=Ac}Oe(QXP1U^jXs}@d ze)fZzdPHkYLhqoEo1%x=v`AkE6*B|prkfoqy^(sRgwoP$MRD6uiJ~*&YCEGC5tj8= zM<}S-QvQ5v`iGi7A;+V8UCd?fXsvo6XJ(zfU|SdQw#Ux$xv*>bH{j9`2b^{PTX z<_3Fo;nq8D%?EUz&V2v0-dl^x1Ce)*GmzNM{o$lPxepfn@8E+IPqY zs5!Bdk0zHCP@zTU4KF!${#e8;uw8(763kgox3^k6 zNV^m*c2nW|$nE1_04`BHGM<#JReV14n7`8AlPy$5Lky?0@tLPj32P6Nf_{B6{-;3q z?~p$w9DU`P0Io_p_9>YegBu57QikZC`iI_ad5E0O%2z9_St8yd|AP3Rp$-@u!4~~3 z{zd=n_Xw6MMnp#Ir3rGZXHit>{qZlJh~c8 z#+qfX+rYYfO#}n>Q^bxBIZ#!`cM5jT28rJkZuJsTX5`C+$}k5n@SNf&V6MEq<~2m- zHnDcvnNnu}4ujwrim9DdnWbSR7s3NJ6>nzgpt zX_OsARl9ePlx||*8>BA<_KEEb^MxZxMqSG*=(WI&drvWlK>Mnj zbFc#?m~Fn*E?a0QbT{u2By#Zw9Ce}L;8fG7PLC^9V*Nmr1i|pT8;l%D!+{z>;Ap{2}IXHKLeihbw(tsbc?_$Aj!N1oS5=Ch?IX6-SOXYq3=Y;V)j1wkCU;;eJEh@ z8X!PoYy1a9(vdCj4nvw#_C(>R!?d$vbZ~JJ_XZR!(KT=VH_oq9@xeNQwoKKPzFJZc zwaq8N5~VZfQ)w6O-(jGG=>zvPz=15Vee2v+Y-A&ybP5+em5RMa&qSE^qGiANH*zc>tRrr2I-@U zpDP>nW<)VPMUy z4bzPmje^gL2!WTkg{k=OzfnGvh8fPF;6PW-eqoBmrI}6TOSb%p-GzIg$<=+71J6nI z1io$nly?5uc!$HSafVrH-dA$ZF$aA@+zm|$#UHvU%R@0g@!X=tqP{kCNf(?;`P`|! z1YL}z#E%`OSFUIcD_h8}Jf*Vz!mWc%#N%|LX6rmP)#~UW$G4pIMd3+3ep(>e0WWe3 zS~ot7Iu^lXf+zCi8*4MvHRel1>CxsJvpQg^<1&K0>8lr_J0uX^aHGh_-xM{TDyuJE zArPG?zKT>;a8baI+%6%U2}G<2Dkd9`hRTKh_;%IC?U8DuMexP4vvY*&4Bc&j*HTIX z&xPqeMzt#Z@{VD{k&ttz)Zcqsc%e<8zA9|6rYY=C^ZU;Y`Z%a|kvnqiqgJU3?_{Ec zQ^HV$Jt#QJW9ZHOH@}(PYEkB5sD6IWKl_R5MSXyP7DE^#Va=}o%2M}(L%7B*=f&Im ztK|@eR%g8K&Nz(O=NGk{8;6;#^+Vw^NbeuW)yO7uxwI^1oDGSzHN(Q;>X`-)UfOH4 zA)-e%;k}9+5yR1k;n&yC`vqmh0)Pwyj0*^6%T|pjOg(=YtBd*}-O?qbTZ24Gsj%kF z96P0M#3B3lAFlWw2l+36rw}w)_!4^R4fAq5&&(Yxk7OJmrO~EK#QD;&OPMW6fe4lt zR|(StKb3g0{RhG2jw};*xewP+#^obM$ex%W#PwII_6^hXZE~=`DJ^4h_~e0eb|7~S z>@jFfpCumw7^nvKOp6V=tikeo+jLlt;~dlfJK2UUk(#1NBhn-q;E(RM-$EhtXN$)_ zEybjLTJTkAV+mpCxe7g(%x+widmzptQ*V^oF>&{UoRG0~@ky$}2uvEIemTophBbQ4 zUcm0`r#nnMweP)jp;MhAW_e25h6LOT)*aQjK+<#vOT%1gf$aG1A#A%X0K-(Nd>Y%Q z+$S4#buI+g_Y%FDjNK#xi2;H&y-$U8MvC}}sCxXvF z93jk-D!1Q(7&~d-`v~>bU*YsHvb#049=GBz^tKzsxW#nI3^Fs|Z0K6m$_1n~Yx!yV z2uC4`p_1i>QXk>C)KYc^hoa+Eb!2?)?+rp6^Sw<(FVpAo43_6SAk7VrSm_8uiV3(R zKojGt31@yzPz_gX9Jyrzi}7qlZw(o)>XjxC$)GoK!lyyGWhmY2Zce!Rmy1A%LU&PMRlRe5n}7}@Qu$FR`@J_`jz|Mf0|CFa zW42>^9on=bZj)W|6=I$V2n&l5W!BZoT$qo7^#%9A>!$ZK9JylOfi7}!-j-4!%lpTo zmPD@7EJ31Jcs7ES#5<7~`o)q)>~5&5+wY`%D0UFWbTksb4h6&@v9V$(2M1U zM93R%UQw@=31#k2+M>-Wz`D#e)RdHf*j_e~R`(A@^0eoWK5h9oN)NP#wS9f`ru!4s zgk$UHosSg1M7SQF8Lrfz`vZ1L5olW?b#qc^p3HkwYDyO+8J=`Rvs-E{4s$ArF zQvS(AYvZ_$XAA3HfL~x55q4tfyy?#iS*^dn6*b^AX>u0=r)tLA?nXMZT?)a1{uXy; ziTjc~vU@Wfs2?9A(zw&3gR&{@DuWV7Yvb;Hl;UQKX;TzL`1Gz%Yw&zOgmWx!gnTc+ zkogrITLYco=YceD@-qo&ego(!RnjFflfj$-mdR9GqC(MGxtW0B(UL1!y=s-nJGE2u z4@R3Jv@cfE=?Z>d&F01tmMF+2Wzh0vqyGGnOZipWumvQ<8~P%wBtZre#!GgUToxkAW4%MtK5&oK#A%4X%<(3 z>?~#aHFo58(om(!6lwpWz>i}9u8&e>no6t!{l{(WR^=29Yqe#qGm~~`H8e2{iHpi~ z(ci;3a!vTtX$P6E0=?jxIGDAnr2vsum!*UkASnd*-)7pGJYzO)9aI-T3TaAU_6J7e zBsA~u&tnhN`Nq{coCW#+PVwOED|RvRTMTdk!8BgE4Y_v&_<;>DEaM~=gY+6{PIpPt zV)AdXn z3_5H#Roq#E4^r*STD{a0+^FcR|9;2s_JsBb^)E47l7Iv2J}s=wdo~m)5mZp9wdx zJbL~0cJCD;KEH_f50U)y(AbR4>{nvf9+uJf3Iq{1kj^3rz>rw~U%3VM* z{*O>BsINw6&Z258$F zx3}t$3+L(YHOg?Fc4x;NXlfud>K-aSg)OI5b6l1Yw4l(k`GXC2_k)hPv8vhZl-~Bc z@7C3fM{X(q^?X03;o&9YaCp~F5vYl!%7AzoD7hOZA+x_AYkvTIs!0FhHB%kB zp8ox6bO;5ECXMHzyiU2!(ztoDO zhqulDs1-?-5lk2l#^ZlziptidnLf(WPY;$*E4DCBiw5&+u2rJ!=!w1FZ31Y2?3KLU zALUkg(e(O)nGbYzYJW6-U26CR0eA@sHdeEE4bwabXrT%z@rdlPBDNKpMDhw0O=t=g zI8IRpl3{CLR|y^(R|9->V|3Xi!37BH|*f?aFblYG|C+5+Y|q9YIMQ zelTrr{_ztMWPx=dy|~uwk(zk(S`=#lZ6t1Hj@_7wE?)QUDHX7LW57T2wM|;7Hunb! z4o=*EIZ&&We)9g=yyo73LXp1s2Gw9q3HuquIO?_<|EIyWtp+$hy}g*A76mO4y6g8w zUiMtFO9Ib#Z|wzQKB}tx77^!tHs_7B9-j1B!^}3#4xg z(EHz(s{1{=kL5wyjfq+U6)u0KW~VfEAxDr>F>z4X2%et%!h-6~B#$RhkLkcKPQj1y`4Ruhybr0uSi-02{XMdFTb6L5I;YsAV2Thg4T9+ zoT36EBAiwt{35)CyB1 zv4T22YL z>YZ?x@FijN+e17g&w5db868mA*->b)*YRZUyEN-{p{b6A$RXmw2m?}M)pPc6zf%&)U=g1QVLHRg#S2#R0e<+$JMgXwkH(?!XQVkNQ4P2Spc=;09Ewp>*gS&NIbZ*k8Cvl9rRPtn z)Dw`ZZA~xE8g_hA-p`*y3#YVYbby23rDaSoj=Nq%zpq~t^#V@8a;Q^O=fB9B6wM8B zxO*4=s5}NOINZj%4nNX4W1v^!N9w}#zkQJNdP&>ugZ_E%(vJOMlX3;;K>=z=7)EGv zF#;e7b>2jxl<$9h(?S4bBYOIYw^b+^eS|n!=F9tfK2-CF_E7N+od=%VEx^Hexj`5- z(`8ZgH$mg}I1@$)#9+T0+=EZj{A)#$TUyA0DmU^in_V1oW&;M6NHKO-*YOC0ZTi?Y zGkv+==++Km%-I+AcBCW0<(i^uM2qb$1e~kT4Ze~mT=)r7)rITu{jzRs(Jir!W>GuL zE3B|L$UH_?SLX{!86E8X1$NYy6dQ7=OFK9H9e42k{@>S}4JPkuVrD4=F;K+-jp@(E zpd;5xhJ5zJ(|YTVaZxDR@dGsD&gRCCu%ZxX4WCey1MJrSzPGlI06s-dIs7pDR&9R) zioc#o1DI|_6W>qk5rRo7ZuDesU|M8-Kb6>b2$JKOAzbIRk*YnHmDHn@I5K2R1&{pM zR_r!1V3d`^o)aO$tg1<@@7yl#Ye3!u4(82 zZ-3e27WAH%_2SK{cB!4{h3PR?8jDBalXkQA7=ccp%*5`&XEoH zTN_78Db5%Iha{Ypi@(M$fLv#hn=^ipv{UWaU)|w5TKahKmWBKugV}ZFoGQi4?8iiC zQUH-4;_7w8y&yJ{T3(FrWdd*?ZK&2TGDIkHbHnf=90MI6wtcxJJi78KEE$9~Aw-EA z?UL<(_Msvg-+5FKzzGS6_}1yV1J3$G|w(FC`nUqBGx^X>8Q7AMA&n=X~2{StZNlCpSN3RU!{uuQ+k36?C$=mv& z7yVpdtzfLlQvVq@M0^-(0CY+!W<+*?8uKF5-YhhPk~eblIL&+9iP4lm?Ct95N_qO# zEnRW%YPF+<_C#O)jq1r7D*v$)w@7lsBK<$c*vOagE(`3t{yPNXjTPrW{mEpMsm6sk z+1uaVD5(|N=k5=TS0o27_sNdE+yZFn42WxK|LquJoF4{VZKQ!L&TS0d zk+bOBQ6`3>buaPHs(lJHvAiv&fOnsKxs_U64raFunQO3g9GGujiH zIuJt$L!O#&^u7{>&vDlCA?vfY@QrhC%M?ytn^u^+01!*@6)ZXZjK@hoqV@E4<~*^3 zlijoi7b(#fZCX$x)n)bo@?pzaVE3mmExyBR4KnK*3MqH0i^A8#@^NAymb`S-nS-=# zR0+8tvF8YD_mbSA)YH2OLwgEfd+Dv(t0r1-aUVD7)w+_>O<1j0_a!T&%noD4T`jB- z?Or#AXY3}2=*jB~FsKrqHFDp+c+9+SzJE_B2atWU5{m5%`*g9Y zx=~F7O0M~8-XKSras5jL#=*Z)6oN(Fy4U%BQac6@ivttd=>+EoM`ujjr4?)8R-ozk*fkg#Vl&!Ug1!5s;{SpOh7JiX!Ng%LehW0+-`rY3Ey5F z9!HcysN^@eumySc@#lL@%I)wZ0j@s<+9w6~s9QAN!KZ{gt_oOBhI86OFbuP|dkO8y zDGu;7+$0QO3av{gJ9(!9RvzhShZ`am-qXX$ z{q#Z7b+gCo9ok{M9*@mRw!Pti{Mk zM;i2+pzd3=m_9DhEQ0npTr13i5f}1pk(s>j5Ne_SI4=*#dB54PwMtU-RiP6M^yHHU z+6F#f z@B+#mI6hF1cFG^eB@5Z%7Nm8C@cyL;;w6aCF-yhxx=rWdyWkHR-g{np*CPt2c0v+w zAJLn2^+gpR1#6liEGSbvfy3Unfy^$h`A`6lk1=p0aR}YwC`dwl1+j6?(+l@bvAP$l zJK*){PrmKjD^LmG3cfWD4Aib|+xX$UVI16L$1Iej28#5Xg``S5i_C>uD? z(f?Npnzt|L_pMlOfh5L5IsXoG>I%tHRx~WLvEpihg?X`8v96pN5Y#{|(vE)f`3DjX zT=9a6n)uhFEx%H2A(B+rmH5`v+CmQ+07D>LatYDfKaBYwu+|oJQ%-{d`gA;YuWF#g252_|}radz^`% zixNWXh^Z$6RD2urHpBI7L?!dycY|&g5X5rn9?m=tsLd`SW>j||8hNqEh>&pBLzxH(tf?nvlg5zW&&V%hw739FOk%Z zBdyI2zXISRxHQf6BxNJoK9Ztyk~ieNOSV7vHgn~7&o3`WMQK0HMK^zfn-2E+PTjL= zMhb>yaAW)7;4`eu|@h{jD(TuBH_~5~$x%cWOAH-oM2SEY zm)>11_qSxV9#}E}4a&)?fuVH9Jnye+PeI%k+ZMMAwc^nAN}ZR1vxm;(kW)r`4U({eqer4%E0*mlpqZJh+w z_C~XKGNhB*!#?b?>GX-8Ko142@LnYL_k7fgH;Mxh%6!}JxGqvt6*2MpmunXqR2E-R zm5XW{QF>_axA6qLqJt^kPlLpu?9}2c9p|WTf)NHYO3KzKXs@$6+e;9pd2Xa?Oh zq0#yhF*Z;VQe>%HGx7#4 z1d3nRLG}G-*L$M@)SHv@hM22_&@H3bppzdlGCgFw1=&*Neon!CD9SCRmB-Y9!NHCB z1f|d!Q%K+;k(O{?TrC|0NevGu#Mu(dPmc7F`)Wg)+P)Ikt0N}pl_{ECd)w*8Bn@B2i6%F@cOeqm1BDV`Aw-ySAd3>*>Nu{-(*S&NoVv<0_>HS2Y@E(AZvb;u z|Ay&ditHS>M8-6nJF}Jcnug5|nqdy!nA%Xt=47dD_9FHecp>j}r&i2HBqXzEgcQ?% z2ILJyy2_`(6Tviq(q=#O7aCT)iuU2B3! zi+wjKw|5)^Y&+!Z2fh^oFfd#%&*H&Cd7@;7+YUxyKZzsO$dy08H$lkIvYXn7n%7?m1jA0JsT;rf@JseHm238utSk>G^`ZS!4 z?3={vD2x9$RG3r?fc>XVKEHCk1w09}APJ_Q{U4Y+d+vvpCx8Z(;6BmK=}&>GTh-<*y^sE!`kdDm1fbLf`0ZXSa^@=rHb3+qTtLOjQ_bW*>XpD9!XCrH%g~X z-~#P^oA|HElOdUB?H1v8vr2E4!!1BNygGs#?`2ju%8C^(hpCD4U9=Sj~AyX&{6ue1**!_a98$ zAAl_80SY{t1 zE2ZMBJi z?uz7yv^rk3S<5vF{Wz4fS?A6{KZD16^iij9H$Pv;ePJ|3uNXQ7e&-ac50={mYJ55% z{3#Ti9sZUFK6~Ri)*zQ=hNyz{FQ(uNC=jmGWBo@cd7o5)HDKYj|LG?^cBt)`9`9Dq1zb9p zAGDVi`qAa}?Bu?K;oPnlHjH z<`>84q5idavQYX9L0=Pq#I*OUfD0wjX7BL$3A*q84n9)3*$*KB1G5{=xz(Rk!ZtaX zkBLeS4F!Sm^#)qr2Nrd=&XFsUP`^F6R^CpI`8$Z8Ed# zy9Cl2Fkf9heou*i50+i+44ixLswTb)NJ0|0^IY-k$G29R^Q`KBoK#n8ME?UXus+r2J}<`rfd zz7y6z#_;(yq^s)fbGw_T$3-c&&K!C7Bf~92BTP7eXK9MEhueL^VkoMvX!nNOp1zf# z*}4|#Gg>e`YBJkD6U3_!u{-{i>^0mEBMNy12;rwUakSPlp5>8X%c<1&+{kYLE9v{N z9K_Zv%$)>C0^9JH&V}NCZumi@zUpTE4&UN;u`_k|=>4D)EK|Px=KKqsnCf$s zRyhj6$h{gLXCak2HQY&=F!-%$_O6#X_u8j+7F!JWeyUWvngH~rGqlgw-0avUlFaxb zEkP*Dy)~ng-7$CiJ#_iS8TG=4V^Q zC?Vmd_Jr8H@{0Py!e6oK5QE4!E9uQHaCc{FK$}lsOJCV%IeyEM82Yd9S4fz9AZR!O zTP@7u#GvjA7@92Qr9l`RooAqW@s>qs!D@IAgAGPYA014eZ}f;fMgOQSonFsmFurY7 zfj|x_0WEqQH&vg--p~(b#d?}V3c{NR?wiQIQcb0f+dK|Laf8ts<*9*CxuRH8-y8U; zjF2@zSnSMT%Mcy-B`}2X+`t$u`S>p<)47|sXft$L1_cs6rUlr3Fa7nxeA7*GE3Y}? z?;HXZF>(PAWdQP@TgFGQ0xhi6QQ`Zd7IM#w;g!q3cLZBaWC-F7{HPK@blfRx@R%XO z+#>AHDll-=x$l=0_V4e$nQWLE;B>^&ANimYh z9+I(9KV^#5J-bpA44^pBHeA;Jt^x*g!FR#e^9PulzlSy9e|FwOeXUPJNKFB!jsWo) zR53{`$WSr18eDksJ!l=n!%J`>oYDoE9O{55t21?Mii889-)3AZJN`QhFGrt+y=o2~ zB@LR?6(CV{-<| z6)z=VeC8A#*0YWDnAQ8@p>+mWUWFU-Y#I%RByed0{|XK~KQc($Tsi|rB!kMJ4!0!m ze=YH0g;;AxpgL9s7oHY$6vb8*|K?AV9FeB9S<{ythe`gd=LC^d3vA7PMK6c@}E z=<7}oKx#j;I2YPcSU_;$IP`&jBt>Svmda7st*u3jh0up5Rj3jA0dU>}F|}ZC4(jA8 znnhkXMjRx*w)oFblDV&@kv~H|RIBVWrNi#@@s$8ihdwdOODYflXeSjjP9mywalyS= zB@c4zXG`oqZ&hq~s3)ZW8Q>!q>>z8=C&DF@icwbQ2-)#GhKNSGx zND8bE9*^X6*H)^bvH*WX0?^eVxLV!{TsFJehIUm{)sBaDgocL5^(q_M3x(Fg`-t2Q z6+LwO1>*tEw9Isi&eio+X@J}$0R466M>U+O|QX5YWy$*|Vsf_GsOU;?7D65A-8QDk=rO zkm_jZ%hfWlxpdw z(SW_xK=K@a9cn*9Ep^Ya6~n}sr@r@i*ai97x-dF&94|lmLT!;*1u0a!4YHc%_O%d5 z;~~dFJbZl$N$OhLCgwbcxSZbf0N*-xuK zc3j5`i!jMfD0yqsuwa;({1izM(8Zme`-MgHWL&;3LC-RR(y~juRjN>f!6`Kf;_Yi4 z^3c+gfgsgAJirKWamSxJ-Y?{in6iuE3#E@?hINU<+k@en)JEm*pHYrSLX;?tA`%j$ zD*u8!LFTy=HHVK`0VMz0?v`#3Ks+sun(m8m-^FsMevTKo3_ZB0zx_1LI^A8aSfvzb z$xtU49{lq0Tw9_*8$-E;05?0cJTNJoD2sn%i8GUo_R&lN8g1>kg0TBOo*^ex2Szky z)Zx?6iZi0D`H`0p*kEu^e+}QDTn^%RL#;uMPW6gf2uU Date: Thu, 21 Mar 2024 18:13:21 +0300 Subject: [PATCH 8/9] 1.19.4 --- common/src/main/java/com/adamcalculator/dynamicpack/Mod.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/com/adamcalculator/dynamicpack/Mod.java b/common/src/main/java/com/adamcalculator/dynamicpack/Mod.java index 0352979..843a1d2 100644 --- a/common/src/main/java/com/adamcalculator/dynamicpack/Mod.java +++ b/common/src/main/java/com/adamcalculator/dynamicpack/Mod.java @@ -9,7 +9,7 @@ public class Mod { public static final String VERSION_NAME_MOD = "1.0.14"; - public static final String VERSION_NAME_BRANCH = "mc1.20.1"; + public static final String VERSION_NAME_BRANCH = "mc1.19.4"; public static final String VERSION_NAME = VERSION_NAME_MOD + "-" + VERSION_NAME_BRANCH; public static final long VERSION_BUILD = 14; From cdad6c5aff93c5d6746c5f6a7c6796138d2637cc Mon Sep 17 00:00:00 2001 From: adam Date: Thu, 21 Mar 2024 18:18:47 +0300 Subject: [PATCH 9/9] 1.19.4 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 79b5a1d..07af975 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,6 +12,6 @@ loader_version=0.15.7 fabric_version=0.92.0+1.20.1 # Mod Properties -mod_version=1.0.14-mc1.20.1 +mod_version=1.0.14-mc1.19.4 maven_group=com.adamcalculator archives_base_name=dynamicpack \ No newline at end of file