diff --git a/build.gradle b/build.gradle index 8ea7b05..b3bf1c9 100644 --- a/build.gradle +++ b/build.gradle @@ -1,4 +1,4 @@ -//version: 1707682661 +//version: 1743737794 /* * DO NOT CHANGE THIS FILE! * Also, you may replace this file at any time if there is an update available. @@ -7,14 +7,24 @@ */ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import com.gtnewhorizons.retrofuturagradle.MinecraftExtension +import com.gtnewhorizons.retrofuturagradle.mcp.MCPTasks +import com.gtnewhorizons.retrofuturagradle.minecraft.MinecraftTasks import com.gtnewhorizons.retrofuturagradle.mcp.ReobfuscatedJar +import com.gtnewhorizons.retrofuturagradle.minecraft.RunMinecraftTask +import com.gtnewhorizons.retrofuturagradle.util.Distribution import com.modrinth.minotaur.dependencies.ModDependency import com.modrinth.minotaur.dependencies.VersionDependency +import de.undercouch.gradle.tasks.download.DownloadExtension +import org.apache.commons.io.FileUtils +import org.gradle.api.internal.artifacts.configurations.DefaultUnlockedConfiguration import org.gradle.api.tasks.testing.logging.TestExceptionFormat import org.gradle.api.tasks.testing.logging.TestLogEvent import org.gradle.internal.logging.text.StyledTextOutputFactory import org.jetbrains.gradle.ext.Gradle +import javax.inject.Inject + import static org.gradle.internal.logging.text.StyledTextOutput.Style plugins { @@ -23,9 +33,9 @@ plugins { id 'base' id 'eclipse' id 'maven-publish' - id 'org.jetbrains.gradle.plugin.idea-ext' version '1.1.7' - id 'com.gtnewhorizons.retrofuturagradle' version '1.3.33' - id 'net.darkhax.curseforgegradle' version '1.1.18' apply false + id 'org.jetbrains.gradle.plugin.idea-ext' version '1.1.8' + id 'com.gtnewhorizons.retrofuturagradle' version '1.4.0' + id 'net.darkhax.curseforgegradle' version '1.1.24' apply false id 'com.modrinth.minotaur' version '2.8.7' apply false id 'com.diffplug.spotless' version '6.13.0' apply false id 'com.palantir.git-version' version '3.0.0' apply false @@ -33,6 +43,7 @@ plugins { id 'org.jetbrains.kotlin.jvm' version '1.8.0' apply false id 'org.jetbrains.kotlin.kapt' version '1.8.0' apply false id 'com.google.devtools.ksp' version '1.8.0-1.0.9' apply false + id 'de.undercouch.download' version '5.6.0' apply false } def out = services.get(StyledTextOutputFactory).create('an-output') @@ -58,6 +69,8 @@ propertyDefaultIfUnset("includeMCVersionJar", false) propertyDefaultIfUnset("autoUpdateBuildScript", false) propertyDefaultIfUnset("modArchivesBaseName", project.modId) propertyDefaultIfUnsetWithEnvVar("developmentEnvironmentUserName", "Developer", "DEV_USERNAME") +propertyDefaultIfUnset("additionalJavaArguments", "") +propertyDefaultIfUnset("enableJava17RunTasks", false) propertyDefaultIfUnset("generateGradleTokenClass", "") propertyDefaultIfUnset("gradleTokenModId", "") propertyDefaultIfUnset("gradleTokenModName", "") @@ -65,8 +78,11 @@ propertyDefaultIfUnset("gradleTokenVersion", "") propertyDefaultIfUnset("useSrcApiPath", false) propertyDefaultIfUnset("includeWellKnownRepositories", true) propertyDefaultIfUnset("includeCommonDevEnvMods", true) +propertyDefaultIfUnset("stripForgeRequirements", false) propertyDefaultIfUnset("noPublishedSources", false) +propertyDefaultIfUnset("mixinProviderSpec", "zone.rong:mixinbooter:10.6") propertyDefaultIfUnset("forceEnableMixins", false) +propertyDefaultIfUnset("mixinConfigRefmap", "mixins.${project.modId}.refmap.json") propertyDefaultIfUnsetWithEnvVar("enableCoreModDebug", false, "CORE_MOD_DEBUG") propertyDefaultIfUnset("generateMixinConfig", true) propertyDefaultIfUnset("usesShadowedDependencies", false) @@ -107,7 +123,7 @@ if (!getFile(targetPackageJava).exists() && !getFile(targetPackageScala).exists( if (apiPackage) { final String endApiPath = modGroupPath + '/' + apiPackagePath - if (useSrcApiPath) { + if (useSrcApiPath.toBoolean()) { targetPackageJava = 'src/api/java/' + endApiPath targetPackageScala = 'src/api/scala/' + endApiPath targetPackageKotlin = 'src/api/kotlin/' + endApiPath @@ -369,6 +385,14 @@ minecraft { '-Dlegacy.debugClassLoadingSave=true' ]) } + + if (additionalJavaArguments.size() != 0) { + extraRunJvmArguments.addAll(additionalJavaArguments.split(';')) + } + + if (enableJava17RunTasks.toBoolean()) { + lwjgl3Version = "3.3.2" + } } if (coreModClass) { @@ -495,7 +519,6 @@ configurations { testRuntimeClasspath.extendsFrom(runtimeOnlyNonPublishable) } -String mixinProviderSpec = 'zone.rong:mixinbooter:9.1' dependencies { if (usesMixins.toBoolean()) { annotationProcessor 'org.ow2.asm:asm-debug-all:5.2' @@ -504,7 +527,7 @@ dependencies { // should use 2.8.6 but 2.8.9+ has a vulnerability fix annotationProcessor 'com.google.code.gson:gson:2.8.9' - mixinProviderSpec = modUtils.enableMixins(mixinProviderSpec, "mixins.${modId}.refmap.json") + mixinProviderSpec = modUtils.enableMixins(mixinProviderSpec, mixinConfigRefmap) api (mixinProviderSpec) { transitive = false } @@ -546,6 +569,10 @@ dependencies { transitive = false } + if ((usesMixins.toBoolean() || forceEnableMixins.toBoolean()) && stripForgeRequirements.toBoolean()) { + runtimeOnlyNonPublishable 'com.cleanroommc:strip-latest-forge-requirements:1.0' + } + if (includeCommonDevEnvMods.toBoolean()) { if (!(modId.equals('jei'))) { implementation 'mezz.jei:jei_1.12.2:4.16.1.302' @@ -679,7 +706,6 @@ tasks.register('generateAssets') { if (usesMixins.toBoolean() && generateMixinConfig.toBoolean()) { def mixinConfigFile = getFile("src/main/resources/mixins.${modId}.json") if (!mixinConfigFile.exists()) { - def mixinConfigRefmap = "mixins.${modId}.refmap.json" mixinConfigFile.text = """{ "package": "${modGroup}.${mixinsPackage}", @@ -820,6 +846,218 @@ def getManifestAttributes() { } +// LWJGL3ify setup +if (enableJava17RunTasks.toBoolean()) { + + apply plugin: 'de.undercouch.download' + + ext.java17Toolchain = (JavaToolchainSpec spec) -> { + spec.languageVersion.set(JavaLanguageVersion.of(17)) + spec.vendor.set(JvmVendorSpec.matching("jetbrains")) + } + ext.java21Toolchain = (JavaToolchainSpec spec) -> { + spec.languageVersion.set(JavaLanguageVersion.of(21)) + spec.vendor.set(JvmVendorSpec.matching("jetbrains")) + } + + ext.java17DependenciesCfg = (DefaultUnlockedConfiguration) configurations.create("java17Dependencies") { + extendsFrom(configurations.getByName("runtimeClasspath")) // Ensure consistent transitive dependency resolution + canBeConsumed = false + } + ext.java17PatchDependenciesCfg = (DefaultUnlockedConfiguration) configurations.create("java17PatchDependencies") { + canBeConsumed = false + } + + dependencies { + if (modId != 'lwjgl3ify') { + java17Dependencies("io.github.twilightflower:lwjgl3ify:1.0.0") + java17PatchDependencies("io.github.twilightflower:lwjgl3ify:1.0.0:forgePatches") { + transitive = false + } + } + } + + ext.java17JvmArgs = [ + "-Dfile.encoding=UTF-8", + "-Djava.system.class.loader=com.gtnewhorizons.retrofuturabootstrap.RfbSystemClassLoader", + "-Djava.security.manager=allow", + "--add-opens", "java.base/jdk.internal.loader=ALL-UNNAMED", + "--add-opens", "java.base/java.net=ALL-UNNAMED", + "--add-opens", "java.base/java.nio=ALL-UNNAMED", + "--add-opens", "java.base/java.io=ALL-UNNAMED", + "--add-opens", "java.base/java.lang=ALL-UNNAMED", + "--add-opens", "java.base/java.lang.reflect=ALL-UNNAMED", + "--add-opens", "java.base/java.text=ALL-UNNAMED", + "--add-opens", "java.base/java.util=ALL-UNNAMED", + "--add-opens", "java.base/jdk.internal.reflect=ALL-UNNAMED", + "--add-opens", "java.base/sun.nio.ch=ALL-UNNAMED", + "--add-opens", "jdk.naming.dns/com.sun.jndi.dns=ALL-UNNAMED,java.naming", + "--add-opens", "java.desktop/sun.awt=ALL-UNNAMED", + "--add-opens", "java.desktop/sun.awt.image=ALL-UNNAMED", + "--add-opens", "java.desktop/com.sun.imageio.plugins.png=ALL-UNNAMED", + "--add-opens", "jdk.dynalink/jdk.dynalink.beans=ALL-UNNAMED", + "--add-opens", "java.sql.rowset/javax.sql.rowset.serial=ALL-UNNAMED" + ] + + ext.hotswapJvmArgs = [ + // DCEVM advanced hot reload + "-XX:+AllowEnhancedClassRedefinition", + "-XX:HotswapAgent=fatjar" + ] + + ext.setupHotswapAgent17 = tasks.register("setupHotswapAgent17", SetupHotswapAgentTask, t -> { + t.setTargetForToolchain(java17Toolchain) + }) + + ext.setupHotswapAgent21 = tasks.register("setupHotswapAgent21", SetupHotswapAgentTask, t -> { + t.setTargetForToolchain(java21Toolchain) + }) + + def runClient17Task = tasks.register("runClient17", RunHotswappableMinecraftTask, Distribution.CLIENT, "runClient") + runClient17Task.configure { + dependsOn(setupHotswapAgent17) + setup(project) + javaLauncher = project.javaToolchains.launcherFor(project.java17Toolchain) + } + + def runServer17Task = tasks.register("runServer17", RunHotswappableMinecraftTask, Distribution.DEDICATED_SERVER, "runServer") + runServer17Task.configure { + dependsOn(setupHotswapAgent17) + setup(project) + javaLauncher = project.javaToolchains.launcherFor(project.java17Toolchain) + } + + def runClient21Task = tasks.register("runClient21", RunHotswappableMinecraftTask, Distribution.CLIENT, "runClient") + runClient21Task.configure { + dependsOn(setupHotswapAgent21) + setup(project) + javaLauncher = project.javaToolchains.launcherFor(project.java21Toolchain) + } + + def runServer21Task = tasks.register("runServer21", RunHotswappableMinecraftTask, Distribution.DEDICATED_SERVER, "runServer") + runServer21Task.configure { + dependsOn(setupHotswapAgent21) + setup(project) + javaLauncher = project.javaToolchains.launcherFor(project.java21Toolchain) + } +} + +abstract class RunHotswappableMinecraftTask extends RunMinecraftTask { + + // IntelliJ doesn't seem to allow pre-set commandline arguments, so we also support an env variable + private boolean enableHotswap = Boolean.valueOf(System.getenv("HOTSWAP")) + + public final Distribution side + public final String superTask + + @Input + boolean getEnableHotswap() { + return enableHotswap + } + + @Option(option = "hotswap", description = "Enables HotSwapAgent for enhanced class reloading under a debugger") + boolean setEnableHotswap(boolean enable) { + enableHotswap = enable + } + + @Inject + RunHotswappableMinecraftTask(Distribution side, String superTask, org.gradle.api.invocation.Gradle gradle) { + super(side, gradle) + + this.side = side + this.superTask = superTask + setGroup("Modded Minecraft") + setDescription("Runs the modded " + side.name().toLowerCase(Locale.ROOT) + " using modern Java and lwjgl3ify") + this.getLwjglVersion().set(3) + } + + void setup(Project project) { + final MinecraftExtension minecraft = project.getExtensions().getByType(MinecraftExtension.class) + final MCPTasks mcpTasks = project.getExtensions().getByType(MCPTasks.class) + final MinecraftTasks mcTasks = project.getExtensions().getByType(MinecraftTasks.class) + + this.getExtraJvmArgs().addAll((List) project.property("java17JvmArgs")) + if (getEnableHotswap()) { + this.getExtraJvmArgs().addAll((List) project.property("hotswapJvmArgs")) + } + + this.classpath(project.property("java17PatchDependenciesCfg")) + this.classpath(mcpTasks.getTaskPackageMcLauncher()) + this.classpath(mcpTasks.getTaskPackagePatchedMc()) + this.classpath(mcpTasks.getPatchedConfiguration()) + this.classpath(project.getTasks().named("jar")) + this.classpath(project.property("java17DependenciesCfg")) + + super.setup(project) + + dependsOn( + mcpTasks.getLauncherSources().getClassesTaskName(), + mcTasks.getTaskDownloadVanillaAssets(), + mcpTasks.getTaskPackagePatchedMc(), + "jar" + ) + + getMainClass().set((side == Distribution.CLIENT) ? "GradleStart" : "GradleStartServer") + getUsername().set(minecraft.getUsername()) + getUserUUID().set(minecraft.getUserUUID()) + if (side == Distribution.DEDICATED_SERVER) { + getExtraArgs().add("nogui") + } + + systemProperty("gradlestart.bouncerClient", "com.gtnewhorizons.retrofuturabootstrap.Main") + systemProperty("gradlestart.bouncerServer", "com.gtnewhorizons.retrofuturabootstrap.Main") + + if (project.usesMixins.toBoolean()) { + this.extraJvmArgs.addAll(project.provider(() -> { + def mixinCfg = project.configurations.detachedConfiguration(project.dependencies.create(mixinProviderSpec)) + mixinCfg.canBeConsumed = false + mixinCfg.canBeResolved = true + mixinCfg.transitive = false + enableHotswap ? ["-javaagent:" + mixinCfg.singleFile.absolutePath] : [] + })) + } + } +} + +abstract class SetupHotswapAgentTask extends DefaultTask { + + @OutputFile + abstract RegularFileProperty getTargetFile() + + void setTargetForToolchain(Action spec) { + getTargetFile().set(project.javaToolchains.launcherFor(spec).map { + it.metadata.installationPath.file("lib/hotswap/hotswap-agent.jar") + }) + } + + @Inject + SetupHotswapAgentTask() { + setGroup("GT Buildscript") + setDescription("Installs a recent version of HotSwapAgent into the Java runtime directory") + onlyIf("Run only if not already installed", t -> !((SetupHotswapAgentTask) t).getTargetFile().getAsFile().get().exists()) + } + + @TaskAction + void installHSA() { + final String url = 'https://github.com/HotswapProjects/HotswapAgent/releases/download/1.4.2-SNAPSHOT/hotswap-agent-1.4.2-SNAPSHOT.jar' + final File target = getTargetFile().getAsFile().get() + final File parent = target.getParentFile() + FileUtils.forceMkdir(parent) + final DownloadExtension download = getProject().getExtensions().findByType(DownloadExtension.class) + download.run(ds -> { + try { + ds.src(url) + } catch (MalformedURLException e) { + throw new RuntimeException(e) + } + ds.dest(target) + ds.overwrite(false) + ds.tempAndMove(true) + }) + } +} + + // IDE Configuration eclipse { @@ -844,9 +1082,25 @@ idea { '2. Run Client'(Gradle) { taskNames = ['runClient'] } + if (enableJava17RunTasks.toBoolean()) { + '2a. Run Client (Java 17)'(Gradle) { + taskNames = ['runClient17'] + } + '2b. Run Client (Java 21)'(Gradle) { + taskNames = ['runClient21'] + } + } '3. Run Server'(Gradle) { taskNames = ['runServer'] } + if (enableJava17RunTasks.toBoolean()) { + '3a. Run Server (Java 17)'(Gradle) { + taskNames = ['runServer17'] + } + '3b. Run Server (Java 21)'(Gradle) { + taskNames = ['runServer21'] + } + } '4. Run Obfuscated Client'(Gradle) { taskNames = ['runObfClient'] } @@ -983,6 +1237,30 @@ if (cfApiKey.isPresent() || deploymentDebug.toBoolean()) { additionalFile.changelog = changelogRaw } } + doLast { + // No File IDs in Debug Mode + if (!deploymentDebug.toBoolean()) { + def list = [] + for (def artifact : tasks.curseforge.getUploadArtifacts()) { + list.add(artifact) + for (def additionalArtifact : artifact.getAdditionalArtifacts()) { + list.add(additionalArtifact) + } + } + def summary = "## CurseForge Build Summary (Mod ${modName} | Project ID ${curseForgeProjectId})" + for (def artifact : list) { + def fileId = artifact.getCurseFileId() + def fileName = artifact.getArtifact().getSingleFile().name + println("Uploaded File ${fileName}, With File ID: ${fileId}") + summary = summary + "\n - File: ${fileName} | File ID: ${fileId}" + } + println(summary) + def stepSummary = providers.environmentVariable("GITHUB_STEP_SUMMARY") + if (stepSummary.isPresent()) { + file(stepSummary.get()).write(summary) + } + } + } } tasks.curseforge.dependsOn(build) tasks.curseforge.dependsOn('generateChangelog') @@ -1113,7 +1391,7 @@ def getChangelog() { // Buildscript updating -def buildscriptGradleVersion = '8.5' +def buildscriptGradleVersion = '8.9' tasks.named('wrapper', Wrapper).configure { gradleVersion = buildscriptGradleVersion diff --git a/dependencies.gradle b/dependencies.gradle index 3e4eaf1..c19ff7e 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -23,12 +23,17 @@ */ dependencies { api("codechicken:codechickenlib:3.2.3.358") // CCL 3.2.3.358 - devOnlyNonPublishable(rfg.deobf("curse.maven:gregtech-ce-unofficial-557242:5519022")) // CEu 2.8.10 - devOnlyNonPublishable(rfg.deobf("curse.maven:gregicality-multiblocks-564858:5619513")) // GCYM 1.2.11 + //devOnlyNonPublishable(rfg.deobf("curse.maven:gregtech-ce-unofficial-557242:5519022")) // CEu 2.8.10 + //devOnlyNonPublishable(rfg.deobf("curse.maven:gregicality-multiblocks-564858:5121714")) // GCYM 1.2.8 + devOnlyNonPublishable(rfg.deobf(project.files("libs/gregtech-1.12.2-2.9.0-beta_build-b24ff3e-dev.jar"))) // CEu 2.9-pr + devOnlyNonPublishable(rfg.deobf(project.files("libs/GregicalityMultiblocks-1.3.0_build-b24ff3e-dev.jar"))) // GCYM for CEu 2.9-pr + + + api("com.cleanroommc:modularui:2.5.0-rc4") { transitive = false } + api("com.cleanroommc:groovyscript:1.2.0-hotfix1") { transitive = false } + api("CraftTweaker2:CraftTweaker2-MC1120-Main:1.12-4.1.20.700") + api rfg.deobf("curse.maven:ctm-267602:2915363") // CTM 1.0.2.31 - api("com.cleanroommc:groovyscript:1.1.1") { transitive = false } // GrS 1.1.1 - api("CraftTweaker2:CraftTweaker2-MC1120-Main:1.12-4.1.20.700") // CrT 4.1.20.689 - api("com.cleanroommc:modularui:2.4.3") // MUI 2.4.3 api("appeng:ae2-uel:v0.56.4") { transitive = false } // Debug Forestry @@ -36,5 +41,4 @@ dependencies { if (project.forestry.toBoolean()) { runtimeOnlyNonPublishable rfg.deobf("curse.maven:forestry-59751:2684780") // Forestry 5.8.2.387 } - } diff --git a/libs/GregicalityMultiblocks-1.3.0_build-b24ff3e-dev.jar b/libs/GregicalityMultiblocks-1.3.0_build-b24ff3e-dev.jar new file mode 100644 index 0000000..057e6d2 Binary files /dev/null and b/libs/GregicalityMultiblocks-1.3.0_build-b24ff3e-dev.jar differ diff --git a/libs/gregtech-1.12.2-2.9.0-beta_build-b24ff3e-dev.jar b/libs/gregtech-1.12.2-2.9.0-beta_build-b24ff3e-dev.jar new file mode 100644 index 0000000..7a43d88 Binary files /dev/null and b/libs/gregtech-1.12.2-2.9.0-beta_build-b24ff3e-dev.jar differ diff --git a/src/main/java/kono/ceu/materialreplication/MRConfig.java b/src/main/java/kono/ceu/materialreplication/MRConfig.java index 9879b53..c4a594c 100644 --- a/src/main/java/kono/ceu/materialreplication/MRConfig.java +++ b/src/main/java/kono/ceu/materialreplication/MRConfig.java @@ -7,10 +7,6 @@ @Config(modid = MRValues.MODID) public class MRConfig { - @Config.Name("MetaTileEntityID Option") - @Config.RequiresMcRestart - public static IdOption id = new IdOption(); - @Config.Comment("Config option of materials for Deconstruction/Replication") @Config.Name("Material Options") @Config.RequiresMcRestart @@ -41,16 +37,6 @@ public class MRConfig { @Config.RequiresMcRestart public static StartTier tier = new StartTier(); - public static class IdOption { - - @Config.Comment({ "Change the starting ID of the MetaTileEntityID used by this add-on.", - "By Default, this add-on starts MetaTileEntityIDs of 20000.", - "Only change this if the crash is caused by a duplicate MTEIDs.", - "WARNING: If you change it, the one already created will disappear or be changed to another one." }) - @Config.RangeInt(min = 11000, max = 32200) - public int startId = 20000; - } - public static class MaterialOption { // TODO Make Blacklist from Config diff --git a/src/main/java/kono/ceu/materialreplication/MaterialReplication.java b/src/main/java/kono/ceu/materialreplication/MaterialReplication.java index 4e2e502..b9c72c8 100644 --- a/src/main/java/kono/ceu/materialreplication/MaterialReplication.java +++ b/src/main/java/kono/ceu/materialreplication/MaterialReplication.java @@ -1,5 +1,6 @@ package kono.ceu.materialreplication; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.config.Config; import net.minecraftforge.common.config.ConfigManager; import net.minecraftforge.fml.client.event.ConfigChangedEvent; @@ -15,13 +16,14 @@ import kono.ceu.materialreplication.api.util.MRValues; import kono.ceu.materialreplication.api.util.Mods; import kono.ceu.materialreplication.common.CommonProxy; +import kono.ceu.materialreplication.common.machines.MRMetaTileEntities; @Mod(modid = MRValues.MODID, name = MRValues.MODNAME, version = Tags.VERSION, acceptedMinecraftVersions = "[1.12, 1.12.2]", - dependencies = GTInternalTags.DEP_VERSION_STRING + "required-after:" + Mods.Names.GREGICALITY_MULTIBLOCKS + ";" + - "after:" + Mods.Names.FORESTRY + ";") + dependencies = GTInternalTags.DEP_VERSION_STRING + "required-after:" + Mods.Names.MODULRAUI + ";" + + "required-after:" + Mods.Names.GREGICALITY_MULTIBLOCKS + ";" + "after:" + Mods.Names.FORESTRY) public class MaterialReplication { @@ -35,7 +37,9 @@ public class MaterialReplication { @Mod.EventHandler public void preInit(FMLPreInitializationEvent event) { + MinecraftForge.EVENT_BUS.register(this); proxy.preInit(event); + MRMetaTileEntities.init(); } @Mod.EventHandler diff --git a/src/main/java/kono/ceu/materialreplication/api/recipes/MRRecipeMaps.java b/src/main/java/kono/ceu/materialreplication/api/recipes/MRRecipeMaps.java index 91a960c..9287351 100644 --- a/src/main/java/kono/ceu/materialreplication/api/recipes/MRRecipeMaps.java +++ b/src/main/java/kono/ceu/materialreplication/api/recipes/MRRecipeMaps.java @@ -1,5 +1,6 @@ package kono.ceu.materialreplication.api.recipes; +import static kono.ceu.materialreplication.api.util.MRValues.mrId; import static kono.ceu.materialreplication.loaders.recipe.MRMachineRecipeLoader.hasOnlyMolten; import java.util.ArrayList; @@ -13,8 +14,10 @@ import gregtech.api.gui.widgets.ProgressWidget; import gregtech.api.recipes.RecipeBuilder; import gregtech.api.recipes.RecipeMap; +import gregtech.api.recipes.RecipeMapBuilder; import gregtech.api.recipes.RecipeMaps; import gregtech.api.recipes.builders.SimpleRecipeBuilder; +import gregtech.api.recipes.ui.RecipeMapUI; import gregtech.api.unification.material.Material; import gregtech.api.unification.material.properties.PropertyKey; import gregtech.api.unification.ore.OrePrefix; @@ -26,7 +29,6 @@ import kono.ceu.materialreplication.api.gui.MRGuiTextures; import kono.ceu.materialreplication.api.recipes.builders.ReplicatorRecipeBuilder; import kono.ceu.materialreplication.api.recipes.machines.IReplicatorRecipeMap; -import kono.ceu.materialreplication.api.recipes.machines.RecipeMapReplicator; import kono.ceu.materialreplication.api.recipes.machines.RecipeMapScrapMaker; import kono.ceu.materialreplication.api.unification.materials.flags.MRMaterialFlags; import kono.ceu.materialreplication.common.items.MRMetaItems; @@ -34,29 +36,33 @@ public class MRRecipeMaps { // Deconstractor - public static final RecipeMap DECONSTRUCTION_RECIPES = new RecipeMap<>("deconstruction", - 1, 1, 1, 2, // Max(itemIn, itemOut, fluidIn, fluidOut) - new SimpleRecipeBuilder(), false) - .setSound(GTSoundEvents.CENTRIFUGE) - .setSlotOverlay(false, false, GuiTextures.DUST_OVERLAY) // Item Input - .setSlotOverlay(false, true, GuiTextures.LIGHTNING_OVERLAY_2) // Fluid Input - .setSlotOverlay(true, true, false, GuiTextures.MOLECULAR_OVERLAY_3) // Fluid Output1 - .setSlotOverlay(true, true, true, GuiTextures.MOLECULAR_OVERLAY_4) // Fluid Output2 - .setProgressBar(GuiTextures.PROGRESS_BAR_MASS_FAB, ProgressWidget.MoveType.HORIZONTAL); + public static final RecipeMap DECONSTRUCTION_RECIPES = new RecipeMapBuilder<>("deconstruction", + new SimpleRecipeBuilder()) + .itemInputs(1).itemOutputs(1) + .fluidInputs(1).fluidOutputs(2) + .itemSlotOverlay(GuiTextures.DUST_OVERLAY, false) + .itemSlotOverlay(GuiTextures.DUST_OVERLAY, true) + .fluidSlotOverlay(GuiTextures.LIGHTNING_OVERLAY_2, false) + .fluidSlotOverlay(GuiTextures.MOLECULAR_OVERLAY_3, true, false) + .fluidSlotOverlay(GuiTextures.MOLECULAR_OVERLAY_4, true, true) + .sound(GTSoundEvents.CENTRIFUGE) + .progressBar(GuiTextures.PROGRESS_BAR_MASS_FAB, ProgressWidget.MoveType.HORIZONTAL) + .build(); // Replicator - public static final RecipeMap REPLICATION_RECIPES = new RecipeMapReplicator("replication", - 2, 1, 2, 1, new ReplicatorRecipeBuilder(), false) - .setSound(GTSoundEvents.ASSEMBLER) - .setSlotOverlay(false, false, GuiTextures.DATA_ORB_OVERLAY) - .setSlotOverlay(false, false, MRGuiTextures.USB_OVERLAY) // Item Input - .setSlotOverlay(false, true, false, GuiTextures.ATOMIC_OVERLAY_1) // Fluid Input 1 - .setSlotOverlay(false, true, true, GuiTextures.ATOMIC_OVERLAY_2) // Fluid Input 2 - .setSlotOverlay(true, false, GuiTextures.DUST_OVERLAY) // Item Output - .setSlotOverlay(true, true, GuiTextures.VIAL_OVERLAY_1) // Fluid Output - .setProgressBar(GuiTextures.PROGRESS_BAR_REPLICATOR, ProgressWidget.MoveType.HORIZONTAL) - .allowEmptyOutput() - .onRecipeBuild(recipeBuilder -> { + // toDo Use RecipeMapReplicator<> instead of RecipeMapBuilder<> + public static final RecipeMap REPLICATION_RECIPES = new RecipeMapBuilder<>("replication", + new ReplicatorRecipeBuilder()) + .itemInputs(1).itemOutputs(1) + .fluidInputs(2).fluidOutputs(1) + .itemSlotOverlay(MRGuiTextures.USB_OVERLAY, false) + .itemSlotOverlay(GuiTextures.DUST_OVERLAY, true) + .fluidSlotOverlay(GuiTextures.ATOMIC_OVERLAY_1, false, false) + .fluidSlotOverlay(GuiTextures.ATOMIC_OVERLAY_2, false, true) + .fluidSlotOverlay(GuiTextures.VIAL_OVERLAY_1, true) + .progressBar(GuiTextures.PROGRESS_BAR_REPLICATOR, ProgressWidget.MoveType.HORIZONTAL) + .sound(GTSoundEvents.ASSEMBLER) + .onBuild(mrId("replication_research"), recipeBuilder -> { if (!recipeBuilder.scanRecipe()) return; String replicateId = recipeBuilder.getReplicateID(); @@ -74,7 +80,6 @@ public class MRRecipeMaps { List materialDusts = new ArrayList<>(); List materialFluids = new ArrayList<>(); - if (!replicateMaterial.hasFlag(MRMaterialFlags.DISABLE_REPLICATION)) { // Has Dust Property? if (replicateMaterial.hasProperty(PropertyKey.DUST)) { @@ -95,7 +100,6 @@ public class MRRecipeMaps { .EUt(recipeBuilder.getVoltage()) .duration(recipeBuilder.getDuration()) .buildAndRegister(); - } for (Material materialFluid : materialFluids) { @@ -115,14 +119,14 @@ public class MRRecipeMaps { } scanner.buildAndRegister(); } - }); + }).build(); // Scrapper public static final RecipeMap SCRAPMAKER_RECIPES = new RecipeMapScrapMaker("scrapper", - 1, 1, 1, 0, - new SimpleRecipeBuilder(), false) - .setSound(GTSoundEvents.MACERATOR) - .setSlotOverlay(true, false, GuiTextures.DUST_OVERLAY) - .setSlotOverlay(false, true, GuiTextures.LIGHTNING_OVERLAY_2) // Fluid Input - .setProgressBar(GuiTextures.PROGRESS_BAR_RECYCLER, ProgressWidget.MoveType.HORIZONTAL); + new SimpleRecipeBuilder(), recipeMap -> { + RecipeMapUI ui = new RecipeMapUI<>(recipeMap, true, true, true, false, false); + ui.setItemSlotOverlay(GuiTextures.DUST_OVERLAY, true); + ui.setFluidSlotOverlay(GuiTextures.LIGHTNING_OVERLAY_2, false); + return ui; + }); } diff --git a/src/main/java/kono/ceu/materialreplication/api/recipes/builders/ReplicatorRecipeBuilder.java b/src/main/java/kono/ceu/materialreplication/api/recipes/builders/ReplicatorRecipeBuilder.java index b55f5e2..7b3f304 100644 --- a/src/main/java/kono/ceu/materialreplication/api/recipes/builders/ReplicatorRecipeBuilder.java +++ b/src/main/java/kono/ceu/materialreplication/api/recipes/builders/ReplicatorRecipeBuilder.java @@ -8,6 +8,7 @@ import net.minecraft.nbt.NBTTagCompound; import org.apache.commons.lang3.builder.ToStringBuilder; +import org.jetbrains.annotations.NotNull; import gregtech.api.GregTechAPI; import gregtech.api.recipes.Recipe; @@ -20,7 +21,7 @@ import gregtech.api.util.ValidationResult; import kono.ceu.materialreplication.api.recipes.machines.IReplicatorRecipeMap; -import kono.ceu.materialreplication.api.recipes.properties.ReplicateProperty; +import kono.ceu.materialreplication.api.recipes.properties.impl.ReplicateProperty; public class ReplicatorRecipeBuilder extends RecipeBuilder { @@ -37,7 +38,7 @@ public ReplicatorRecipeBuilder(Recipe recipe, RecipeMap super(recipe, recipeMap); } - public ReplicatorRecipeBuilder(ReplicatorRecipeBuilder recipeBuilder) { + public ReplicatorRecipeBuilder(@NotNull ReplicatorRecipeBuilder recipeBuilder) { super(recipeBuilder); this.replicationMaterial = recipeBuilder.replicationMaterial; this.Duration = recipeBuilder.Duration; @@ -50,12 +51,12 @@ public ReplicatorRecipeBuilder copy() { } @Override - public boolean applyProperty(@Nonnull String key, Object value) { + public boolean applyPropertyCT(@Nonnull String key, @NotNull Object value) { if (key.equals(ReplicateProperty.KEY)) { this.replicate(value.toString()); return true; } - return super.applyProperty(key, value); + return super.applyPropertyCT(key, value); } protected ReplicatorRecipeBuilder replicate(@Nonnull String replicateID) { @@ -73,7 +74,7 @@ public ReplicatorRecipeBuilder replicate(@Nonnull Material replicationMaterial) } public ReplicatorRecipeBuilder replicate(@Nonnull Material replicationMaterial, int time, int EUt) { - return replicate(replicationMaterial, replicationMaterial.toString(), time, EUt); + return replicate(replicationMaterial, replicationMaterial.getRegistryName(), time, EUt); } public ReplicatorRecipeBuilder replicate(@Nonnull Material replicationMaterial, @Nonnull String replicateID, @@ -105,9 +106,7 @@ public ValidationResult build() { ValidationResult result = super.build(); if (result.getType() == EnumValidationResult.VALID && !this.outputs.isEmpty() && !this.outputs.get(0).isEmpty()) { - if (!recipePropertyStorage.hasRecipeProperty(ReplicateProperty.getInstance())) { - this.applyProperty(ReplicateProperty.getInstance(), this.outputs.get(0).getTranslationKey()); - } + this.applyProperty(ReplicateProperty.getInstance(), this.outputs.get(0).getTranslationKey()); } return result; } @@ -131,7 +130,7 @@ public boolean scanRecipe() { public String getReplicateID() { return this.recipePropertyStorage == null ? "" : - this.recipePropertyStorage.getRecipePropertyValue(ReplicateProperty.getInstance(), ""); + this.recipePropertyStorage.get(ReplicateProperty.getInstance(), ""); } @Override diff --git a/src/main/java/kono/ceu/materialreplication/api/recipes/machines/RecipeMapReplicator.java b/src/main/java/kono/ceu/materialreplication/api/recipes/machines/RecipeMapReplicator.java index 10c917d..a6d645d 100644 --- a/src/main/java/kono/ceu/materialreplication/api/recipes/machines/RecipeMapReplicator.java +++ b/src/main/java/kono/ceu/materialreplication/api/recipes/machines/RecipeMapReplicator.java @@ -6,28 +6,34 @@ import javax.annotation.Nonnull; +import org.jetbrains.annotations.NotNull; + import gregtech.api.recipes.Recipe; +import gregtech.api.recipes.RecipeBuilder; import gregtech.api.recipes.RecipeMap; +import gregtech.api.recipes.ui.RecipeMapUIFunction; import gregtech.api.util.EnumValidationResult; import gregtech.api.util.ValidationResult; +import gregtech.core.sound.GTSoundEvents; -import kono.ceu.materialreplication.api.recipes.builders.ReplicatorRecipeBuilder; -import kono.ceu.materialreplication.api.recipes.properties.ReplicateProperty; +import kono.ceu.materialreplication.api.recipes.properties.impl.ReplicateProperty; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; -public class RecipeMapReplicator extends RecipeMap implements IReplicatorRecipeMap { +// Implemented for now (unused) +public class RecipeMapReplicator> extends RecipeMap implements IReplicatorRecipeMap { private final Map> replicateEntries = new Object2ObjectOpenHashMap<>(); - public RecipeMapReplicator(String unlocalizedName, int maxInputs, int maxOutputs, int maxFluidInputs, - int maxFluidOutputs, ReplicatorRecipeBuilder defaultRecipe, boolean isHidden) { - super(unlocalizedName, maxInputs, maxOutputs, maxFluidInputs, maxFluidOutputs, defaultRecipe, isHidden); + public RecipeMapReplicator(@NotNull String unlocalizedName, @NotNull R defaultRecipe, + @NotNull RecipeMapUIFunction recipeMapUI) { + super(unlocalizedName, defaultRecipe, recipeMapUI, 2, 1, 2, 1); + setSound(GTSoundEvents.ASSEMBLER); } @Override - public boolean addRecipe(ValidationResult validationResult) { + public boolean addRecipe(@NotNull ValidationResult validationResult) { super.addRecipe(validationResult); if (validationResult.getType() == EnumValidationResult.INVALID) { Recipe recipe = validationResult.getResult(); @@ -40,7 +46,7 @@ public boolean addRecipe(ValidationResult validationResult) { } @Override - public boolean removeRecipe(Recipe recipe) { + public boolean removeRecipe(@NotNull Recipe recipe) { boolean result = super.removeRecipe(recipe); if (result && recipe.hasProperty(ReplicateProperty.getInstance())) { String replicateId = recipe.getProperty(ReplicateProperty.getInstance(), ""); diff --git a/src/main/java/kono/ceu/materialreplication/api/recipes/machines/RecipeMapScrapMaker.java b/src/main/java/kono/ceu/materialreplication/api/recipes/machines/RecipeMapScrapMaker.java index fed0938..7e0717a 100644 --- a/src/main/java/kono/ceu/materialreplication/api/recipes/machines/RecipeMapScrapMaker.java +++ b/src/main/java/kono/ceu/materialreplication/api/recipes/machines/RecipeMapScrapMaker.java @@ -13,16 +13,19 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidStack; +import org.jetbrains.annotations.NotNull; + import gregtech.api.recipes.Recipe; import gregtech.api.recipes.RecipeMap; import gregtech.api.recipes.builders.SimpleRecipeBuilder; import gregtech.api.recipes.ingredients.GTRecipeItemInput; +import gregtech.api.recipes.ui.RecipeMapUIFunction; public class RecipeMapScrapMaker extends RecipeMap { - public RecipeMapScrapMaker(String unlocalizedName, int maxInputs, int maxOutputs, int maxFluidInputs, - int maxFluidOutputs, SimpleRecipeBuilder defaultRecipe, boolean isHidden) { - super(unlocalizedName, maxInputs, maxOutputs, maxFluidInputs, maxFluidOutputs, defaultRecipe, isHidden); + public RecipeMapScrapMaker(@NotNull String unlocalizedName, @NotNull SimpleRecipeBuilder defaultRecipe, + @NotNull RecipeMapUIFunction recipeMapUI) { + super(unlocalizedName, defaultRecipe, recipeMapUI, 1, 1, 1, 0); } @Override diff --git a/src/main/java/kono/ceu/materialreplication/api/recipes/properties/ReplicateProperty.java b/src/main/java/kono/ceu/materialreplication/api/recipes/properties/impl/ReplicateProperty.java similarity index 63% rename from src/main/java/kono/ceu/materialreplication/api/recipes/properties/ReplicateProperty.java rename to src/main/java/kono/ceu/materialreplication/api/recipes/properties/impl/ReplicateProperty.java index 1785317..5547671 100644 --- a/src/main/java/kono/ceu/materialreplication/api/recipes/properties/ReplicateProperty.java +++ b/src/main/java/kono/ceu/materialreplication/api/recipes/properties/impl/ReplicateProperty.java @@ -1,4 +1,4 @@ -package kono.ceu.materialreplication.api.recipes.properties; +package kono.ceu.materialreplication.api.recipes.properties.impl; import static net.minecraft.util.text.TextFormatting.GOLD; import static net.minecraft.util.text.TextFormatting.YELLOW; @@ -7,11 +7,16 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.resources.I18n; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagString; -import gregtech.api.recipes.recipeproperties.RecipeProperty; +import org.jetbrains.annotations.NotNull; + +import gregtech.api.GregTechAPI; +import gregtech.api.recipes.properties.RecipeProperty; import gregtech.client.utils.TooltipHelper; -public class ReplicateProperty extends RecipeProperty { +public final class ReplicateProperty extends RecipeProperty { public static final String KEY = "replicate"; @@ -24,10 +29,21 @@ private ReplicateProperty() { public static ReplicateProperty getInstance() { if (INSTANCE == null) { INSTANCE = new ReplicateProperty(); + GregTechAPI.RECIPE_PROPERTIES.register(KEY, INSTANCE); } return INSTANCE; } + @Override + public @NotNull NBTBase serialize(@NotNull Object value) { + return new NBTTagString(castValue(value)); + } + + @Override + public @NotNull Object deserialize(@NotNull NBTBase nbt) { + return nbt.toString(); + } + public static TooltipHelper.GTFormatCode BLINKING_ORANGE_FAST = TooltipHelper.createNewCode(5, GOLD, YELLOW); @Override diff --git a/src/main/java/kono/ceu/materialreplication/api/recipes/ui/impl/ReplicatorUI.java b/src/main/java/kono/ceu/materialreplication/api/recipes/ui/impl/ReplicatorUI.java new file mode 100644 index 0000000..4c0091e --- /dev/null +++ b/src/main/java/kono/ceu/materialreplication/api/recipes/ui/impl/ReplicatorUI.java @@ -0,0 +1,23 @@ +package kono.ceu.materialreplication.api.recipes.ui.impl; + +import org.jetbrains.annotations.NotNull; + +import gregtech.api.gui.GuiTextures; +import gregtech.api.gui.widgets.ProgressWidget; +import gregtech.api.recipes.RecipeMap; +import gregtech.api.recipes.ui.RecipeMapUI; + +import kono.ceu.materialreplication.api.gui.MRGuiTextures; + +// Implemented for now (unused) +public class ReplicatorUI> extends RecipeMapUI { + + public ReplicatorUI(@NotNull R recipeMap) { + super(recipeMap, true, true, true, true, false); + setProgressBar(GuiTextures.PROGRESS_BAR_REPLICATOR, ProgressWidget.MoveType.HORIZONTAL); + setItemSlotOverlay(MRGuiTextures.USB_OVERLAY, false, true); + setItemSlotOverlay(GuiTextures.DUST_OVERLAY, true); + setFluidSlotOverlay(GuiTextures.ATOMIC_OVERLAY_1, false, false); + setFluidSlotOverlay(GuiTextures.ATOMIC_OVERLAY_2, false, true); + } +} diff --git a/src/main/java/kono/ceu/materialreplication/api/util/MRValues.java b/src/main/java/kono/ceu/materialreplication/api/util/MRValues.java index b4f4c94..34a6e1f 100644 --- a/src/main/java/kono/ceu/materialreplication/api/util/MRValues.java +++ b/src/main/java/kono/ceu/materialreplication/api/util/MRValues.java @@ -10,10 +10,8 @@ public class MRValues { public static final String MODNAME = "Material Replication"; public static final String MODID = "materialreplication"; - public static int baseID = rangeUtil(MRConfig.id.startId, 11000, 32200, "MetaTileEntityID") ? - MRConfig.id.startId : 20000, - BaseTime_D = rangeTime(MRConfig.deconstruction.DeconstructionBaseTime) ? - MRConfig.deconstruction.DeconstructionBaseTime : 600, + public static int BaseTime_D = rangeTime(MRConfig.deconstruction.DeconstructionBaseTime) ? + MRConfig.deconstruction.DeconstructionBaseTime : 600, BaseTime_R = rangeTime(MRConfig.replication.ReplicationBaseTime) ? MRConfig.replication.ReplicationBaseTime : 1200, BaseTime_S = rangeTime(MRConfig.replication.ScanTime) ? diff --git a/src/main/java/kono/ceu/materialreplication/api/util/Mods.java b/src/main/java/kono/ceu/materialreplication/api/util/Mods.java index 432b344..c05a099 100644 --- a/src/main/java/kono/ceu/materialreplication/api/util/Mods.java +++ b/src/main/java/kono/ceu/materialreplication/api/util/Mods.java @@ -29,6 +29,7 @@ public enum Mods { GregTechFoodOption(Names.GREGTECH_FOOD_OPTION), MaterialReplication(Names.MATERIAL_REPLICATION), MixinBooter(Names.MIXINBOOTER), + ModularUI(Names.MODULRAUI), Vanilla(Names.VANILLA), // Special Optifine handler, but consolidated here for simplicity @@ -58,6 +59,7 @@ public static class Names { public static final String GREGTECH_FOOD_OPTION = "gregtechfoodoption"; public static final String MATERIAL_REPLICATION = MRValues.MODID; public static final String MIXINBOOTER = "mixinbooter"; + public static final String MODULRAUI = "modularui"; public static final String VANILLA = "minecraft"; } diff --git a/src/main/java/kono/ceu/materialreplication/common/CommonProxy.java b/src/main/java/kono/ceu/materialreplication/common/CommonProxy.java index c5874ea..51ead83 100644 --- a/src/main/java/kono/ceu/materialreplication/common/CommonProxy.java +++ b/src/main/java/kono/ceu/materialreplication/common/CommonProxy.java @@ -19,7 +19,6 @@ import kono.ceu.materialreplication.api.util.MRValues; import kono.ceu.materialreplication.api.util.MaterialReplicationLog; import kono.ceu.materialreplication.common.items.MRMetaItems; -import kono.ceu.materialreplication.common.machines.MRMetaTileEntities; import kono.ceu.materialreplication.integration.forestry.MRIntegration; import kono.ceu.materialreplication.loaders.recipe.MRRecipes; @@ -48,7 +47,6 @@ private static ItemBlock createItemBlock(T block, Function event) { MaterialReplicationLog.logger.info("Registering recipes..."); - MRMetaTileEntities.init(); MRMetaItems.init(); } diff --git a/src/main/java/kono/ceu/materialreplication/common/MREventHandlers.java b/src/main/java/kono/ceu/materialreplication/common/MREventHandlers.java index 426aaa5..26cfb88 100644 --- a/src/main/java/kono/ceu/materialreplication/common/MREventHandlers.java +++ b/src/main/java/kono/ceu/materialreplication/common/MREventHandlers.java @@ -4,6 +4,8 @@ import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import gregtech.api.GregTechAPI; +import gregtech.api.metatileentity.registry.MTEManager; import gregtech.api.unification.material.event.MaterialEvent; import gregtech.api.unification.material.event.PostMaterialEvent; @@ -14,6 +16,11 @@ @Mod.EventBusSubscriber(modid = MRValues.MODID) public class MREventHandlers { + @SubscribeEvent + public static void registerMTERegistry(MTEManager.MTERegistryEvent event) { + GregTechAPI.mteManager.createRegistry(MRValues.MODID); + } + @SubscribeEvent(priority = EventPriority.HIGH) public static void registerMaterials(MaterialEvent event) { MRMaterials.init(); diff --git a/src/main/java/kono/ceu/materialreplication/common/items/behaviors/ReplicationBehaviors.java b/src/main/java/kono/ceu/materialreplication/common/items/behaviors/ReplicationBehaviors.java index 3496962..9eb4ffb 100644 --- a/src/main/java/kono/ceu/materialreplication/common/items/behaviors/ReplicationBehaviors.java +++ b/src/main/java/kono/ceu/materialreplication/common/items/behaviors/ReplicationBehaviors.java @@ -44,6 +44,12 @@ public void addInformation(@Nonnull ItemStack itemStack, List lines) { lines.add(I18n.format("behaviour.usb.replicate_data4", Charged, materialStack.getProtons())); } } + String str = replicateMaterialNBT.getString("Material"); + for (Material mat : GregTechAPI.materialManager.getRegisteredMaterials()) { + if (str.equals(mat.toString())) { + lines.add(RED + I18n.format("behaviour.usb.old")); + } + } } else { lines.add(I18n.format("behaviour.usb.no_data")); } diff --git a/src/main/java/kono/ceu/materialreplication/common/machines/MRMetaTileEntities.java b/src/main/java/kono/ceu/materialreplication/common/machines/MRMetaTileEntities.java index 877d601..effdc11 100644 --- a/src/main/java/kono/ceu/materialreplication/common/machines/MRMetaTileEntities.java +++ b/src/main/java/kono/ceu/materialreplication/common/machines/MRMetaTileEntities.java @@ -1,6 +1,6 @@ package kono.ceu.materialreplication.common.machines; -import static gregtech.common.metatileentities.MetaTileEntities.registerMetaTileEntity; +import static gregtech.common.metatileentities.MetaTileEntities.*; import static kono.ceu.materialreplication.api.util.MRValues.*; import net.minecraft.util.ResourceLocation; @@ -38,8 +38,8 @@ public static void init() { public static void registerSingleMachine() { // Material Deconstructor - // Default: 20000 - 20014 - int id = baseID; + // Default: 0 - 14 + int id = 0; for (int i = 1; i < DECONSTRUCTOR.length; i++) { String voltageName = GTValues.VN[i].toLowerCase(); if (!GregTechAPI.isHighTier() && i > GTValues.UV) @@ -47,13 +47,13 @@ public static void registerSingleMachine() { if (tierDeconstruct <= i) DECONSTRUCTOR[i] = registerMetaTileEntity(id + (i - 1), new SimpleMachineMetaTileEntity( - new ResourceLocation(MODID, (String.format("%s.%s", "deconstructor", voltageName))), + mrId(String.format("%s.%s", "deconstructor", voltageName)), MRRecipeMaps.DECONSTRUCTION_RECIPES, MRTextures.DECONSTRUCTOR_OVERLAY, i, true, GTUtility.hvCappedTankSizeFunction)); } // Material Replicator - // Default: 20015 - 20029 + // Default: 15 - 29 id = id + 15; for (int i = 1; i < REPLICATOR.length; i++) { String voltageName = GTValues.VN[i].toLowerCase(); @@ -62,36 +62,34 @@ public static void registerSingleMachine() { if (tierReplicate <= i) REPLICATOR[i] = registerMetaTileEntity(id + (i - 1), new SimpleMachineMetaTileEntity( - new ResourceLocation(MODID, (String.format("%s.%s", "replicator", voltageName))), + mrId(String.format("%s.%s", "replicator", voltageName)), MRRecipeMaps.REPLICATION_RECIPES, MRTextures.REPLICATOR_OVERLAY, i, true, GTUtility.hvCappedTankSizeFunction)); } // Scrapper - // Default: 20030 - 20044 + // Default: 30 - 44 id = id + 15; - for (int i = 0; i < SCRAPPER.length - 1; i++) { - String voltageName = GTValues.VN[i + 1].toLowerCase(); + for (int i = 1; i < SCRAPPER.length; i++) { + String voltageName = GTValues.VN[i].toLowerCase(); if (!GregTechAPI.isHighTier() && i > GTValues.UV) break; - SCRAPPER[i] = registerMetaTileEntity(id + i, + SCRAPPER[i] = registerMetaTileEntity(id + (i - 1), new MetaTileEntityScrapMaker( - new ResourceLocation(MODID, (String.format("%s.%s", "scrapmaker", voltageName))), - MRRecipeMaps.SCRAPMAKER_RECIPES, MRTextures.SCRAPPER_OVERLAY, i + 1, + mrId(String.format("%s.%s", "scrapmaker", voltageName)), + MRRecipeMaps.SCRAPMAKER_RECIPES, MRTextures.SCRAPPER_OVERLAY, i, GTUtility.hvCappedTankSizeFunction)); } } public static void registerMultiMachine() { - int id = baseID + 1000; + int id = 1000; // LargeDeconstructor - // Default: 21000 LARGE_DECONSTRUCTOR = registerMetaTileEntity(id, new MetaTileEntityLargeDeconstructor(mrId("large_deconstructor"))); // LargeScrapper - // Default: 21001 LARGE_SCRAPPER = registerMetaTileEntity(id + 1, new MetaTileEntityLargeScrapper(mrId("large_scrapper"))); } diff --git a/src/main/java/kono/ceu/materialreplication/loaders/recipe/MRMTECraftingRecipeLoader.java b/src/main/java/kono/ceu/materialreplication/loaders/recipe/MRMTECraftingRecipeLoader.java index 604f35c..5288cb9 100644 --- a/src/main/java/kono/ceu/materialreplication/loaders/recipe/MRMTECraftingRecipeLoader.java +++ b/src/main/java/kono/ceu/materialreplication/loaders/recipe/MRMTECraftingRecipeLoader.java @@ -19,7 +19,7 @@ public class MRMTECraftingRecipeLoader { public static void register() { // Deconstructor - registerMachineRecipe(MRMetaTileEntities.DECONSTRUCTOR, + registerMachineRecipe(true, MRMetaTileEntities.DECONSTRUCTOR, "CSC", "FHF", "CQC", 'C', BETTER_CIRCUIT, 'S', SENSOR, @@ -28,7 +28,7 @@ public static void register() { 'Q', CABLE_QUAD); // Replicator - registerMachineRecipe(MRMetaTileEntities.REPLICATOR, + registerMachineRecipe(true, MRMetaTileEntities.REPLICATOR, "EFE", "CHC", "SQS", 'E', EMITTER, 'F', FIELD_GENERATOR, @@ -38,7 +38,7 @@ public static void register() { 'Q', CABLE_QUAD); // ScrapMaker - registerMachineRecipe(MRMetaTileEntities.SCRAPPER, + registerMachineRecipe(true, MRMetaTileEntities.SCRAPPER, "GCG", "PHP", "WCW", 'G', new UnificationEntry(OrePrefix.dust, Materials.Glowstone), 'C', CIRCUIT, diff --git a/src/main/java/kono/ceu/materialreplication/loaders/recipe/MRMachineRecipeLoader.java b/src/main/java/kono/ceu/materialreplication/loaders/recipe/MRMachineRecipeLoader.java index 2ddbb54..891936c 100644 --- a/src/main/java/kono/ceu/materialreplication/loaders/recipe/MRMachineRecipeLoader.java +++ b/src/main/java/kono/ceu/materialreplication/loaders/recipe/MRMachineRecipeLoader.java @@ -5,12 +5,13 @@ import static gregtech.api.unification.ore.OrePrefix.dust; import static gregtech.api.unification.ore.OrePrefix.dustTiny; import static kono.ceu.materialreplication.api.util.MRValues.*; -import static kono.ceu.materialreplication.common.items.MRMetaItems.SCRAP; -import static kono.ceu.materialreplication.common.items.MRMetaItems.SCRAP_BOX; +import static kono.ceu.materialreplication.common.items.MRMetaItems.*; import java.util.ArrayList; import java.util.List; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; @@ -176,12 +177,28 @@ public static void registerReplicatorRecipe(@NotNull Material material) { NBTCondition.create(NBTTagType.COMPOUND, IReplicatorRecipeMap.REPLICATE_NBT_TAG, NBTCondition.create(NBTTagType.STRING, IReplicatorRecipeMap.REPLICATE_MATERIAL, - material.toString()))) + material.getRegistryName()))) .setNonConsumable()) .replicate(material) .EUt(Voltage_R) .output(dust, material) .buildAndRegister(); + + // REMOVED in 1.3.1 + ItemStack stack = USB_STICK.getStackForm(); + NBTTagCompound compound = new NBTTagCompound(); + compound.setTag(IReplicatorRecipeMap.REPLICATE_NBT_TAG, + ReplicatorRecipeBuilder.generateReplicateNBT(material.getRegistryName())); + stack.setTagCompound(compound); + SCANNER_RECIPES.recipeBuilder() + .input(GTRecipeItemInput.getOrCreate(MRMetaItems.USB_STICK.getStackForm()) + .setNBTMatchingCondition(NBTMatcher.RECURSIVE_EQUAL_TO, + NBTCondition.create(NBTTagType.COMPOUND, IReplicatorRecipeMap.REPLICATE_NBT_TAG, + NBTCondition.create(NBTTagType.STRING, + IReplicatorRecipeMap.REPLICATE_MATERIAL, + material.toString())))) + .outputs(stack) + .duration(1).EUt(1).buildAndRegister(); } public static void registerReplicatorFluidRecipe(@NotNull Material material) { @@ -201,7 +218,7 @@ public static void registerReplicatorFluidRecipe(@NotNull Material material) { .setNBTMatchingCondition(NBTMatcher.RECURSIVE_EQUAL_TO, NBTCondition.create(NBTTagType.COMPOUND, IReplicatorRecipeMap.REPLICATE_NBT_TAG, NBTCondition.create(NBTTagType.STRING, IReplicatorRecipeMap.REPLICATE_MATERIAL, - material.toString()))) + material.getRegistryName()))) .setNonConsumable()) .replicate(material) .duration(BaseTime_R * (int) material.getMass()) diff --git a/src/main/resources/assets/materialreplication/lang/en_us.lang b/src/main/resources/assets/materialreplication/lang/en_us.lang index 65fc23f..df2f4f3 100644 --- a/src/main/resources/assets/materialreplication/lang/en_us.lang +++ b/src/main/resources/assets/materialreplication/lang/en_us.lang @@ -12,6 +12,7 @@ behaviour.usb.replicate_data1=Replication Material: §a%s behaviour.usb.replicate_data2=Amount of Matter required when replication behaviour.usb.replicate_data3=§4%s§7 : %s L behaviour.usb.replicate_data4=§3%s§7 : %s L +behaviour.usb.old=Old data is saved. Can be used again by scanning. ## Material materialreplication.material.primal_matter=Primal Matter diff --git a/src/main/resources/assets/materialreplication/lang/ja_jp.lang b/src/main/resources/assets/materialreplication/lang/ja_jp.lang index fd05582..a594ace 100644 --- a/src/main/resources/assets/materialreplication/lang/ja_jp.lang +++ b/src/main/resources/assets/materialreplication/lang/ja_jp.lang @@ -12,6 +12,7 @@ behaviour.usb.replicate_data1=複製対象: §a%s behaviour.usb.replicate_data2=複製時の要求マター量 behaviour.usb.replicate_data3=§4%s§7 : %s L behaviour.usb.replicate_data4=§3%s§7 : %s L +behaviour.usb.old=古いデータが保存されている。スキャンすることで再び利用できるようになる。 ## Material materialreplication.material.primal_matter=プライマルマター diff --git a/src/main/resources/assets/materialreplication/models/item/mte.json b/src/main/resources/assets/materialreplication/models/item/mte.json new file mode 100644 index 0000000..51469af --- /dev/null +++ b/src/main/resources/assets/materialreplication/models/item/mte.json @@ -0,0 +1,13 @@ +{ + "forge_marker": 1, + "defaults": { + "model": "minecraft:cube_all", + "textures": { + "all": "blocks/iron_block" + } + }, + "variants": { + "normal": [{}], + "inventory": [{}] + } +} \ No newline at end of file diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index 81021c1..11ae888 100644 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -13,6 +13,7 @@ "screenshots": [], "dependencies": [ "chickenchunks", + "modularui", "gregtech", "gcym" ]