From 1131a60651215c94476bbc998f27025f6ab0bddf Mon Sep 17 00:00:00 2001 From: Jomar Milan Date: Fri, 2 Aug 2024 20:48:51 -0700 Subject: [PATCH] Include data packs from mod in in-world selector --- .../mixin/GameMenuScreenMixin.java | 20 ++++++++++++++++++- .../mixin/MinecraftServerAccessor.java | 12 +++++++++++ .../resources/DatapackInstaller.mixins.json | 1 + 3 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 src/main/java/ml/unbreakinggold/datapackinstaller/mixin/MinecraftServerAccessor.java diff --git a/src/main/java/ml/unbreakinggold/datapackinstaller/mixin/GameMenuScreenMixin.java b/src/main/java/ml/unbreakinggold/datapackinstaller/mixin/GameMenuScreenMixin.java index db40f9b..f3c88ea 100644 --- a/src/main/java/ml/unbreakinggold/datapackinstaller/mixin/GameMenuScreenMixin.java +++ b/src/main/java/ml/unbreakinggold/datapackinstaller/mixin/GameMenuScreenMixin.java @@ -7,6 +7,10 @@ import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.gui.widget.GridWidget; import net.minecraft.text.Text; +import net.minecraft.util.WorldSavePath; +import org.apache.commons.io.FileUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -15,14 +19,19 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; +import java.io.File; +import java.io.IOException; +import java.nio.file.Path; import java.util.Collection; import java.util.function.Supplier; @Mixin(GameMenuScreen.class) public abstract class GameMenuScreenMixin extends Screen { - @Shadow private ButtonWidget createButton(Text text, Supplier screenSupplier) { return null; }; + @Unique private final Logger LOGGER = LogManager.getLogger(GameMenuScreenMixin.class); @Unique private static final Text DATA_PACK_TEXT = Text.translatable("dataPack.title"); + @Shadow private ButtonWidget createButton(Text text, Supplier screenSupplier) { return null; }; + private GameMenuScreenMixin(Text title) { super(title); } @@ -32,6 +41,15 @@ private void onInitWidgets(CallbackInfo ci, GridWidget gridWidget, GridWidget.Ad if (!this.client.isIntegratedServerRunning() || this.client.getServer().isRemote()) return; adder.add(this.createButton(DATA_PACK_TEXT, () -> { + Path worldDataPackPath = ((MinecraftServerAccessor)this.client.getServer()).getSession().getDirectory(WorldSavePath.DATAPACKS); + File modDatapackDir = DatapackInstallerClient.MAIN_PATH.toFile(); + File worldDataPackDir = worldDataPackPath.toFile(); + try { + FileUtils.copyDirectory(modDatapackDir, worldDataPackDir); + } catch(IOException exception) { + LOGGER.error("Unable to install new data packs to world. Data packs not yet seen by this world may be missing.", exception); + } + return new PackScreen(this.client.getServer().getDataPackManager(), (dataPackManager) -> { Collection enabledProfiles = dataPackManager.getEnabledIds(); diff --git a/src/main/java/ml/unbreakinggold/datapackinstaller/mixin/MinecraftServerAccessor.java b/src/main/java/ml/unbreakinggold/datapackinstaller/mixin/MinecraftServerAccessor.java new file mode 100644 index 0000000..d662416 --- /dev/null +++ b/src/main/java/ml/unbreakinggold/datapackinstaller/mixin/MinecraftServerAccessor.java @@ -0,0 +1,12 @@ +package ml.unbreakinggold.datapackinstaller.mixin; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.level.storage.LevelStorage; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(MinecraftServer.class) +public interface MinecraftServerAccessor { + @Accessor + LevelStorage.Session getSession(); +} diff --git a/src/main/resources/DatapackInstaller.mixins.json b/src/main/resources/DatapackInstaller.mixins.json index 57636c4..d6e4a48 100644 --- a/src/main/resources/DatapackInstaller.mixins.json +++ b/src/main/resources/DatapackInstaller.mixins.json @@ -4,6 +4,7 @@ "package": "ml.unbreakinggold.datapackinstaller.mixin", "compatibilityLevel": "JAVA_17", "mixins": [ + "MinecraftServerAccessor" ], "client": [ "CreateWorldScreenMixin",