From b5c08b996f335ebbe5b1bff58a811f8579fbda5d Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Wed, 10 May 2023 15:29:46 -0400 Subject: [PATCH] Add button to title screen for datagenning inside runClient --- .../main/resources/modernfix.accesswidener | 3 +- .../forge/datagen/RuntimeDatagen.java | 78 +++++++++++++++++++ 2 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 forge/src/main/java/org/embeddedt/modernfix/forge/datagen/RuntimeDatagen.java diff --git a/common/src/main/resources/modernfix.accesswidener b/common/src/main/resources/modernfix.accesswidener index bf157c09..4f571127 100644 --- a/common/src/main/resources/modernfix.accesswidener +++ b/common/src/main/resources/modernfix.accesswidener @@ -37,4 +37,5 @@ accessible method net/minecraft/resources/ResourceKey (Lnet/minecraft/res accessible method net/minecraft/client/renderer/texture/TextureAtlasSprite (Lnet/minecraft/client/renderer/texture/TextureAtlas;Lnet/minecraft/client/renderer/texture/TextureAtlasSprite$Info;IIIIILcom/mojang/blaze3d/platform/NativeImage;)V accessible field net/minecraft/client/renderer/block/model/BlockModel GSON Lcom/google/gson/Gson; accessible field net/minecraft/server/MinecraftServer resources Lnet/minecraft/server/ServerResources; -accessible field net/minecraft/client/renderer/RenderStateShard name Ljava/lang/String; \ No newline at end of file +accessible field net/minecraft/client/renderer/RenderStateShard name Ljava/lang/String; +accessible method net/minecraft/client/gui/screens/Screen addButton (Lnet/minecraft/client/gui/components/AbstractWidget;)Lnet/minecraft/client/gui/components/AbstractWidget; \ No newline at end of file diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/datagen/RuntimeDatagen.java b/forge/src/main/java/org/embeddedt/modernfix/forge/datagen/RuntimeDatagen.java new file mode 100644 index 00000000..b3ea5c59 --- /dev/null +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/datagen/RuntimeDatagen.java @@ -0,0 +1,78 @@ +package org.embeddedt.modernfix.forge.datagen; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.screens.TitleScreen; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.server.packs.resources.SimpleReloadableResourceManager; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.GuiScreenEvent; +import net.minecraftforge.common.data.ExistingFileHelper; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.DatagenModLoader; +import net.minecraftforge.fml.ModLoader; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.ObfuscationReflectionHelper; +import net.minecraftforge.fml.event.lifecycle.GatherDataEvent; +import org.embeddedt.modernfix.ModernFix; + +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; +import java.util.stream.Collectors; + +@Mod.EventBusSubscriber(value = Dist.CLIENT) +public class RuntimeDatagen { + private static final String RESOURCES_OUT_DIR = getPropertyOrBlank("modernfix.datagen.output"); + private static final String RESOURCES_IN_DIR = getPropertyOrBlank("modernfix.datagen.existing"); + private static final String MODS_LIST = getPropertyOrBlank("modernfix.datagen.mods"); + private static final String EXISTING_MODS_LIST = getPropertyOrBlank("modernfix.datagen.existing_mods"); + private static final boolean IS_FLAT = Boolean.getBoolean("modernfix.datagen.flat"); + + private static String getPropertyOrBlank(String name) { + String val = System.getProperty(name); + if(val == null || val.length() == 0) + return ""; + else + return val; + } + + public static boolean isDatagenAvailable() { + return RESOURCES_OUT_DIR.length() > 0; + } + + public static void runRuntimeDatagen() { + ObfuscationReflectionHelper.setPrivateValue(DatagenModLoader.class, null, true, "runningDataGen"); + Set mods = new HashSet<>(Arrays.stream(MODS_LIST.split(",")).collect(Collectors.toSet())); + ModernFix.LOGGER.info("Beginning runtime datagen for " + mods.size() + " mods..."); + Set existingMods = new HashSet<>(Arrays.stream(EXISTING_MODS_LIST.split(",")).collect(Collectors.toSet())); + Set existingPacks = new HashSet<>(Arrays.stream(RESOURCES_IN_DIR.split(",")).map(Paths::get).collect(Collectors.toSet())); + Path path = Paths.get(RESOURCES_OUT_DIR); + GatherDataEvent.DataGeneratorConfig dataGeneratorConfig = new GatherDataEvent.DataGeneratorConfig(mods, path, Collections.emptyList(), + true, true, true, true, true, mods.isEmpty() || IS_FLAT); + if (!mods.contains("forge")) { + //If we aren't generating data for forge, automatically add forge as an existing so mods can access forge's data + existingMods.add("forge"); + } + ExistingFileHelper existingFileHelper = new ExistingFileHelper(existingPacks, existingMods, true, null, null); + /* Inject the client pack resources from us */ + ((SimpleReloadableResourceManager)ObfuscationReflectionHelper.getPrivateValue(ExistingFileHelper.class, existingFileHelper, "clientResources")).add(Minecraft.getInstance().getClientPackSource().getVanillaPack()); + ModLoader.get().runEventGenerator(mc->new GatherDataEvent(mc, dataGeneratorConfig.makeGenerator(p->dataGeneratorConfig.isFlat() ? p : p.resolve(mc.getModId()), dataGeneratorConfig.getMods().contains(mc.getModId())), dataGeneratorConfig, existingFileHelper)); + dataGeneratorConfig.runAll(); + ObfuscationReflectionHelper.setPrivateValue(DatagenModLoader.class, null, false, "runningDataGen"); + ModernFix.LOGGER.info("Finished runtime datagen."); + } + + @SubscribeEvent + public static void onInitTitleScreen(GuiScreenEvent.InitGuiEvent.Post event) { + if(isDatagenAvailable() && event.getGui() instanceof TitleScreen) { + TitleScreen screen = (TitleScreen)event.getGui(); + screen.addButton(new Button(screen.width / 2 - 100 - 50, screen.height / 4 + 48, 50, 20, new TextComponent("DG"), (arg) -> { + runRuntimeDatagen(); + })); + } + } +}