diff --git a/build.gradle b/build.gradle index 3868255..8835769 100644 --- a/build.gradle +++ b/build.gradle @@ -29,7 +29,7 @@ loom { sourceSet sourceSets.client } } - + accessWidenerPath.set(file("src/main/resources/dynamicpack.accesswidener")) } dependencies { diff --git a/common/src/main/java/com/adamcalculator/dynamicpack/DynamicPackModBase.java b/common/src/main/java/com/adamcalculator/dynamicpack/DynamicPackModBase.java index 5641fe9..19dc2ee 100644 --- a/common/src/main/java/com/adamcalculator/dynamicpack/DynamicPackModBase.java +++ b/common/src/main/java/com/adamcalculator/dynamicpack/DynamicPackModBase.java @@ -94,6 +94,19 @@ public static void addAllowedHosts(String host, Object requester) throws Excepti Mod.addAllowedHosts(host, requester); } + public boolean isNameIsDynamic(String name) { + return getDynamicPackByMinecraftName(name) != null; + } + + public Pack getDynamicPackByMinecraftName(String name) { + for (Pack pack : packs) { + if (("file/" + pack.getName()).equals(name)) { + return pack; + } + } + return null; + } + public boolean isResourcePackActive(Pack pack) throws IOException { for (String readLine : Files.readAllLines(new File(getGameDir(), "options.txt").toPath(), StandardCharsets.UTF_8)) { if (readLine.startsWith("resourcePacks:")) { @@ -124,5 +137,5 @@ public boolean isMinecraftInitialized() { public abstract String getCurrentGameVersion(); - public abstract boolean checkResourcePackMetaValid(String s); + public abstract boolean checkResourcePackMetaValid(String s) throws Exception; } \ No newline at end of file diff --git a/src/client/java/com/adamcalculator/dynamicpack/DynamicPackScreen.java b/src/client/java/com/adamcalculator/dynamicpack/DynamicPackScreen.java new file mode 100644 index 0000000..9c26ed8 --- /dev/null +++ b/src/client/java/com/adamcalculator/dynamicpack/DynamicPackScreen.java @@ -0,0 +1,34 @@ +package com.adamcalculator.dynamicpack; + +import com.adamcalculator.dynamicpack.pack.Pack; +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.text.Text; + +public class DynamicPackScreen extends Screen { + private final Screen parent; + + public DynamicPackScreen(Screen parent, Pack pack) { + super(Text.literal(pack.getName())); + this.client = MinecraftClient.getInstance(); + this.parent = parent; + } + + @Override + public void render(DrawContext context, int mouseX, int mouseY, float delta) { + renderBackground(context); + super.render(context, mouseX, mouseY, delta); + } + + @Override + protected void init() { + addDrawableChild(ButtonWidget.builder(Text.of("Manually sync"), button -> DynamicPackModBase.INSTANCE.startSyncThread()).size(120, 20).position(this.width / 2, this.height / 2).build()); + } + + @Override + public void close() { + this.client.setScreen(parent); + } +} diff --git a/src/client/java/com/adamcalculator/dynamicpack/FabricDynamicMod.java b/src/client/java/com/adamcalculator/dynamicpack/FabricDynamicMod.java index 11f954e..f278200 100644 --- a/src/client/java/com/adamcalculator/dynamicpack/FabricDynamicMod.java +++ b/src/client/java/com/adamcalculator/dynamicpack/FabricDynamicMod.java @@ -84,12 +84,8 @@ public String getCurrentGameVersion() { @Override public boolean checkResourcePackMetaValid(String s) { - try { - new PackResourceMetadataReader().fromJson(JsonHelper.deserialize(s)); - return true; - } catch (Exception e) { - return false; - } + new PackResourceMetadataReader().fromJson(JsonHelper.deserialize(s).getAsJsonObject("pack")); + return true; } private void tryToReloadResources() { diff --git a/src/client/java/com/adamcalculator/dynamicpack/PackMixinHelper.java b/src/client/java/com/adamcalculator/dynamicpack/PackMixinHelper.java new file mode 100644 index 0000000..a3d28b3 --- /dev/null +++ b/src/client/java/com/adamcalculator/dynamicpack/PackMixinHelper.java @@ -0,0 +1,39 @@ +package com.adamcalculator.dynamicpack; + +import com.adamcalculator.dynamicpack.pack.Pack; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.screen.pack.PackListWidget; +import net.minecraft.util.Identifier; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +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; + if (DynamicPackModBase.INSTANCE.isNameIsDynamic(entry.getName())) { + int i = mouseX - x; + int j = mouseY - y; + context.drawTexture(Identifier.of("dynamicpack", "select_button.png"), x + 174, y+16, 0.0F, ((i >= 174 && j >= 16 && hovered) ? 16f : 0f), 16, 16, 16, 32); + } + } + + 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) { + double d = mouseX - (double)widget.getRowLeft(); + double e = mouseY - (double)widget.getRowTop(widget.children().indexOf(entry)); + + if (d >= 174) { + if (e >= 16) { + openPackScreen(pack); + } + } + } + } + + private static void openPackScreen(Pack pack) { + MinecraftClient.getInstance().setScreen(new DynamicPackScreen(MinecraftClient.getInstance().currentScreen, pack)); + } +} diff --git a/src/client/java/com/adamcalculator/dynamicpack/mixin/client/ResourcePackEntryMixin.java b/src/client/java/com/adamcalculator/dynamicpack/mixin/client/ResourcePackEntryMixin.java new file mode 100644 index 0000000..f2047bf --- /dev/null +++ b/src/client/java/com/adamcalculator/dynamicpack/mixin/client/ResourcePackEntryMixin.java @@ -0,0 +1,27 @@ +package com.adamcalculator.dynamicpack.mixin.client; + +import com.adamcalculator.dynamicpack.PackMixinHelper; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.screen.pack.PackListWidget; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(PackListWidget.ResourcePackEntry.class) +public abstract class ResourcePackEntryMixin { + @Shadow @Final private PackListWidget widget; + + @Inject(at = @At("RETURN"), method = "render") + private void render(DrawContext context, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta, CallbackInfo ci) { + PackMixinHelper.renderResourcePackEntry(this, context, index, y, x, entryWidth, entryHeight, mouseX, mouseY, hovered, tickDelta, ci); + } + + @Inject(at = @At("RETURN"), method = "mouseClicked") + private void mouseClicked(double mouseX, double mouseY, int button, CallbackInfoReturnable cir) { + PackMixinHelper.mouseClicked(this, widget, mouseX, mouseY, button, cir); + } +} diff --git a/src/client/resources/dynamicpack.client.mixins.json b/src/client/resources/dynamicpack.client.mixins.json index eb26858..2986611 100644 --- a/src/client/resources/dynamicpack.client.mixins.json +++ b/src/client/resources/dynamicpack.client.mixins.json @@ -3,7 +3,8 @@ "package": "com.adamcalculator.dynamicpack.mixin.client", "compatibilityLevel": "JAVA_17", "client": [ - "MinecraftClientMixin" + "MinecraftClientMixin", + "ResourcePackEntryMixin" ], "injectors": { "defaultRequire": 1 diff --git a/src/main/resources/assets/dynamicpack/icon.png b/src/main/resources/assets/dynamicpack/icon.png index 047b91f..57e7f86 100644 Binary files a/src/main/resources/assets/dynamicpack/icon.png and b/src/main/resources/assets/dynamicpack/icon.png differ diff --git a/src/main/resources/assets/dynamicpack/select_button.png b/src/main/resources/assets/dynamicpack/select_button.png new file mode 100644 index 0000000..4810abf Binary files /dev/null and b/src/main/resources/assets/dynamicpack/select_button.png differ diff --git a/src/main/resources/dynamicpack.accesswidener b/src/main/resources/dynamicpack.accesswidener new file mode 100644 index 0000000..c2e25c3 --- /dev/null +++ b/src/main/resources/dynamicpack.accesswidener @@ -0,0 +1,2 @@ +accessWidener v2 named +accessible method net/minecraft/client/gui/widget/EntryListWidget getRowTop (I)I \ No newline at end of file diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 5da8958..a0a6031 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -14,6 +14,7 @@ "license": "MIT", "icon": "assets/dynamicpack/icon.png", "environment": "client", + "accessWidener": "dynamicpack.accesswidener", "entrypoints": { "modmenu": [ "com.adamcalculator.dynamicpack.ModMenu"