From 6b77557e0e87cf5afd9ebd3985323ff1249e615c Mon Sep 17 00:00:00 2001 From: Glease <4586901+Glease@users.noreply.github.com> Date: Sun, 2 Apr 2023 00:02:47 +0800 Subject: Recipe Adder v2 (#1770) * add everything * fixes * migrate plasma forge recipes * syntax update * make chances array length differ a fatal error * time constants + long eut overload * migrate extruder recipes * migrate electromagnetic separator recipes * migrate wiremill recipes * migrate forming press recipes * migrate bender recipes * add doc to clarify the three itemInputs * migrate alloy smelter recipes * migrate arc furnace recipes * added ModIDs enum * sort ModIDs * migrate autoclave recipes * migrated some assembler recipes * split a bit more assembler recipes * migrate canner recipes * migrate brewing recipes * ic2 mod check in canner recipes * use some loops to reduce the amount of recipes to migrate * add requested helper methods * migrate vacuum freezer recipes * migrate thermal centrifuge recipes * format smelter recipes only, doesn't go through normal GT recipe * migrated slicer recipes * migrated sifter recipes * Use proper enum now * remove more constants * cleaning cutting recipes before migration * remove tons of dead commented recipes * migrate pyrolyse recipes * use ModIDs enum more * migrate printer recipes * add a less confusing way to specify value of specialItem * migrate pulverizer recipes * less confusing special item specification * even more ModIDs enum usage * fix auto * import confusing Minecraft enum value with Minecraft client object * migrated blast furnace recipes * migrated Centrifuge recipes * migrated assembler recipes * migrated implosion compressor recipes * migrated extractor recipes * migrated mixer recipes * remove useless code * mgrate universal chemical recipes * refactor chemical recipes * migrate single block only chem reactor recipes * migrate chem reactor recipes * reworked circuit assembler recipes before migrating them * migrated circuit assembler recipes * fix merge conflict for assembler recipes * remove leftover of the merge conflicts * fix weird translation glitch * example of assembly line recipe using RA2 * bugfixes for assline * remove specialValue usage in blast furnace recipes * fix more bugs * add nooptimize to where it make sense * add recipe descriptions * Materials.Superconductor -> Materials.SuperconductorUHV * remove useless Object creations * remove explicit long casts * migrate assemblyline recipes * migrate chemical bath recipes * migrate compressor recipes * move smelting recipe where it belongs * migrated cutting machine recipes * migrated fermenter recipes (unhide alcohol) * remove explicit long casts * migrate fluid canner recipes * migrate fluid heater recipes * migrated fusion recipes * migrated lathe recipes * migrated laser engraver recipes * migrated packager recipes * migrated forge hammer recipes * migrated TPM recipes * exit early and reduced indents * migrated fluid extractor recipes * migrated fluid solidifier recipes * migrated electrolyzer recipes * migrated crop processing recipes * migrated default polymerization recipes * migrate distillery recipes * migrate matter amplifier recipes * add metadata identifier for fusion ignition threshold * migrate fuel recipes * update bs (cherry picked from commit c2d931c9b6caa0376e9d50591894cd849021104d) * spotless (cherry picked from commit 1060f5357fb95e28bfae1f052025f55dabc21a0f) * guard against null itemstacks * wrong translation * fix empty arrays being accessed * add 0 duration and 0 EU/t for fuel recipes * fix typo in matter amplifier recipes * spotless apply --------- Co-authored-by: boubou19 Co-authored-by: Martin Robertz --- ResourcePacks_Guide.md | 67 - build.gradle | 67 +- docs/RecipeBuilder.md | 60 + docs/ResourcePacks_Guide.md | 67 + gradle/wrapper/gradle-wrapper.jar | Bin 61574 -> 61608 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- src/main/java/gregtech/GT_Mod.java | 17 +- src/main/java/gregtech/api/GregTech_API.java | 4 +- src/main/java/gregtech/api/enums/GT_Values.java | 4 +- src/main/java/gregtech/api/enums/Materials.java | 8 +- src/main/java/gregtech/api/enums/ModIDs.java | 84 + .../java/gregtech/api/enums/SoundResource.java | 48 +- .../gregtech/api/interfaces/IGT_RecipeMap.java | 64 + .../api/interfaces/internal/IGT_RecipeAdder.java | 3 + .../gregtech/api/items/GT_MetaGenerated_Item.java | 4 +- .../implementations/GT_MetaPipeEntity_Cable.java | 9 +- .../GT_MetaTileEntity_BasicMachine_GT_Recipe.java | 6 +- src/main/java/gregtech/api/util/GT_BaseCrop.java | 4 +- .../java/gregtech/api/util/GT_ModReference.java | 29 + src/main/java/gregtech/api/util/GT_Recipe.java | 601 +- .../java/gregtech/api/util/GT_RecipeBuilder.java | 713 ++ .../java/gregtech/api/util/GT_RecipeConstants.java | 258 + .../java/gregtech/api/util/GT_RecipeMapUtil.java | 196 + src/main/java/gregtech/api/util/GT_Utility.java | 83 + src/main/java/gregtech/common/GT_Client.java | 4 +- src/main/java/gregtech/common/GT_Proxy.java | 121 +- src/main/java/gregtech/common/GT_RecipeAdder.java | 27 +- .../gregtech/common/blocks/GT_Block_Metal.java | 5 +- .../common/blocks/GT_Block_Ores_Abstract.java | 5 +- .../common/items/GT_MetaGenerated_Item_01.java | 4 +- src/main/java/gregtech/common/items/ItemComb.java | 93 +- src/main/java/gregtech/common/items/ItemDrop.java | 8 +- .../java/gregtech/common/items/ItemPropolis.java | 6 +- .../GT_MetaTileEntity_MagicalEnergyAbsorber.java | 5 +- .../basic/GT_MetaTileEntity_Disassembler.java | 10 +- .../machines/basic/GT_MetaTileEntity_Scanner.java | 28 +- .../multi/GT_MetaTileEntity_PyrolyseOven.java | 7 +- .../java/gregtech/common/tools/GT_Tool_Scoop.java | 6 +- .../materialprocessing/ProcessingModSupport.java | 30 +- .../gregtech/loaders/misc/GT_Achievements.java | 5 +- .../gregtech/loaders/misc/GT_BeeDefinition.java | 506 +- src/main/java/gregtech/loaders/misc/GT_Bees.java | 30 +- .../loaders/oreprocessing/ProcessingCrafting.java | 4 +- .../loaders/oreprocessing/ProcessingSlab.java | 5 +- .../loaders/postload/GT_CraftingRecipeLoader.java | 310 +- .../loaders/postload/GT_MachineRecipeLoader.java | 33 +- .../gregtech/loaders/postload/GT_PostLoad.java | 63 +- .../loaders/postload/chains/GT_NaniteChain.java | 40 +- .../postload/chains/GT_PCBFactoryRecipes.java | 9 +- .../postload/recipes/AlloySmelterRecipes.java | 80 +- .../postload/recipes/ArcFurnaceRecipes.java | 623 +- .../loaders/postload/recipes/AssemblerRecipes.java | 9241 +++++++++++--------- .../postload/recipes/AssemblyLineRecipes.java | 1307 +-- .../loaders/postload/recipes/AutoclaveRecipes.java | 299 +- .../loaders/postload/recipes/BenderRecipes.java | 418 +- .../postload/recipes/BlastFurnaceRecipes.java | 1133 ++- .../loaders/postload/recipes/BreweryRecipes.java | 719 +- .../loaders/postload/recipes/CannerRecipes.java | 89 +- .../postload/recipes/CentrifugeRecipes.java | 1740 ++-- .../postload/recipes/ChemicalBathRecipes.java | 974 +-- .../loaders/postload/recipes/ChemicalRecipes.java | 8436 ++++++++---------- .../postload/recipes/CircuitAssemblerRecipes.java | 538 +- .../postload/recipes/CompressorRecipes.java | 174 +- .../postload/recipes/CropProcessingRecipes.java | 135 +- .../loaders/postload/recipes/CuttingRecipes.java | 432 +- .../postload/recipes/DistilleryRecipes.java | 1009 +-- .../postload/recipes/ElectrolyzerRecipes.java | 587 +- .../recipes/ElectromagneticSeparatorRecipes.java | 16 +- .../loaders/postload/recipes/ExtractorRecipes.java | 138 +- .../loaders/postload/recipes/ExtruderRecipes.java | 23 +- .../loaders/postload/recipes/FermenterRecipes.java | 401 +- .../postload/recipes/FluidCannerRecipes.java | 79 +- .../postload/recipes/FluidExtractorRecipes.java | 775 +- .../postload/recipes/FluidHeaterRecipes.java | 91 +- .../postload/recipes/FluidSolidifierRecipes.java | 751 +- .../postload/recipes/ForgeHammerRecipes.java | 161 +- .../postload/recipes/FormingPressRecipes.java | 258 +- .../loaders/postload/recipes/FuelRecipes.java | 91 +- .../postload/recipes/FusionReactorRecipes.java | 433 +- .../recipes/ImplosionCompressorRecipes.java | 72 +- .../postload/recipes/LaserEngraverRecipes.java | 62 +- .../loaders/postload/recipes/LatheRecipes.java | 34 +- .../postload/recipes/MatterAmplifierRecipes.java | 14 +- .../loaders/postload/recipes/MixerRecipes.java | 2953 +++---- .../loaders/postload/recipes/NEIHiding.java | 30 +- .../postload/recipes/OreDictUnification.java | 6 +- .../loaders/postload/recipes/PackagerRecipes.java | 52 +- .../postload/recipes/PlasmaForgeRecipes.java | 46 +- .../loaders/postload/recipes/PrinterRecipes.java | 60 +- .../loaders/postload/recipes/Pulverizer.java | 801 +- .../loaders/postload/recipes/PyrolyseRecipes.java | 181 +- .../loaders/postload/recipes/SifterRecipes.java | 39 +- .../loaders/postload/recipes/SlicerRecipes.java | 43 +- .../loaders/postload/recipes/SmelterRecipes.java | 20 +- .../postload/recipes/ThaumcraftRecipes.java | 1887 ++-- .../postload/recipes/ThermalCentrifugeRecipes.java | 21 +- .../recipes/TranscendentPlasmaMixerRecipes.java | 108 +- .../postload/recipes/VacuumFreezerRecipes.java | 503 +- .../loaders/postload/recipes/WiremillRecipes.java | 183 +- .../loaders/preload/GT_Loader_ItemData.java | 4 +- .../preload/GT_Loader_MetaTileEntities.java | 60 +- .../loaders/preload/GT_Loader_OreDictionary.java | 52 +- .../java/gregtech/loaders/preload/GT_PreLoad.java | 25 +- src/main/java/gregtech/nei/IMCForNEI.java | 5 +- .../java/gregtech/nei/dumper/GregTechIDDumper.java | 5 +- 105 files changed, 20524 insertions(+), 21655 deletions(-) delete mode 100644 ResourcePacks_Guide.md create mode 100644 docs/RecipeBuilder.md create mode 100644 docs/ResourcePacks_Guide.md create mode 100644 src/main/java/gregtech/api/enums/ModIDs.java create mode 100644 src/main/java/gregtech/api/interfaces/IGT_RecipeMap.java create mode 100644 src/main/java/gregtech/api/util/GT_ModReference.java create mode 100644 src/main/java/gregtech/api/util/GT_RecipeBuilder.java create mode 100644 src/main/java/gregtech/api/util/GT_RecipeConstants.java create mode 100644 src/main/java/gregtech/api/util/GT_RecipeMapUtil.java diff --git a/ResourcePacks_Guide.md b/ResourcePacks_Guide.md deleted file mode 100644 index 5b3dabbcd1..0000000000 --- a/ResourcePacks_Guide.md +++ /dev/null @@ -1,67 +0,0 @@ -This is a guide for resource packs to set up advanced configurations for GUI. - -## Override text color with mcmeta files - -You might want to change color of text if your texture has similar color to text. You can place mcmeta files at the following locations: -- `gregtech/textures/gui/background/singleblock_default.mcmeta` (most of the machines) -- `gregtech/textures/gui/background/bronze.mcmeta` (steam bronze machines) -- `gregtech/textures/gui/background/steel.mcmeta` (steam steel machines) -- `gregtech/textures/gui/background/primitive.mcmeta` (steam primitive machines) -- `gregtech/textures/gui/background/fusion_computer.mcmeta` (fusion reactor controller) -- `modularui/textures/gui/background/vanilla_background.mcmeta` (NEI) - -(and there might be more in the future, but currently these are exhaustive.) - -Here is an example of the file: -```json -{ - "colors": { - "guiTint": { - "enableGUITint": true, - "Black": "202020", - "Red": "800000", - "Green": "005B00", - "Brown": "553C00", - "Blue": "002456", - "Purple": "551839", - "Cyan": "007780", - "Light Gray": "AAAAAA", - "Gray": "808080", - "Pink": "800056", - "Lime": "559155", - "Yellow": "AAA455", - "Light Blue": "55A4AA", - "Magenta": "BF4095", - "Orange": "AA4F00", - "White": "FAFAFF", - "Machine Metal": "0047AB" - }, - "textColor": { - "title": "FF7700", - "title_white": "66FAFA", - "text_white": "807BAA", - "text_gray": "AAE055", - "text_red": "FF2222", - "nei": "556D8E", - "nei_overlay_yellow": "0xFDD835" - } - } -} -``` - -## Override progress bar texture - -With the transition to ModularUI, many of the textures can be reused in many places now. However, some resource packs still want to add progress bar textures for singleblock machines, unique to each type of them. -You can simply add textures named by the following rules: - -- Basically place at `gregtech/textures/gui/progressbar/${unlocalized name of recipemap}`. Unlocalized name can be found on either of: - - Hold shift while hovering over NEI tab. "HandlerID" indicates unlocalized name. -![](/screenshots/recipemap-unlocalized-name.png) - - Read code. Usually they're passed as 2nd argument for `GT_Recipe_Map` constructor. Recipemaps are defined at `gregtech.api.util.GT_Recipe`. -- For steam machines, append `_bronze`, `_steel`, or `_primitive`. -- Exceptions: Miner: `miner`, Electric Furnace: `E_Furnace`, Electric Oven: `E_Oven` - -Examples: -- `gregtech/textures/gui/progressbar/gt.recipe.laserengraver.png` -- `gregtech/textures/gui/progressbar/gt.recipe.alloysmelter_bronze.png` -- `gregtech/textures/gui/progressbar/E_Furnace.png` diff --git a/build.gradle b/build.gradle index 927ed20fdb..055dcee435 100644 --- a/build.gradle +++ b/build.gradle @@ -1,4 +1,4 @@ -//version: 1678003329 +//version: 1680120787 /* DO NOT CHANGE THIS FILE! Also, you may replace this file at any time if there is an update available. @@ -65,7 +65,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 'org.ajoberstar.grgit' version '4.1.1' // 4.1.1 is the last jvm8 supporting version ,unused, available for addon.gradle + id 'org.ajoberstar.grgit' version '4.1.1' // 4.1.1 is the last jvm8 supporting version, unused, available for addon.gradle id 'com.github.johnrengelman.shadow' version '7.1.2' apply false id 'com.palantir.git-version' version '0.13.0' apply false // 0.13.0 is the last jvm8 supporting version id 'de.undercouch.download' version '5.3.0' @@ -73,7 +73,7 @@ plugins { id 'com.diffplug.spotless' version '6.7.2' apply false id 'com.modrinth.minotaur' version '2.+' apply false id 'com.matthewprenger.cursegradle' version '1.4.0' apply false - id 'com.gtnewhorizons.retrofuturagradle' version '1.2.3' + id 'com.gtnewhorizons.retrofuturagradle' version '1.2.4' } boolean settingsupdated = verifySettingsGradle() settingsupdated = verifyGitAttributes() || settingsupdated @@ -160,6 +160,14 @@ java { } } +tasks.withType(JavaCompile).configureEach { + options.encoding = "UTF-8" +} + +tasks.withType(ScalaCompile).configureEach { + options.encoding = "UTF-8" +} + pluginManager.withPlugin('org.jetbrains.kotlin.jvm') { // If Kotlin is enabled in the project kotlin { @@ -397,8 +405,6 @@ minecraft { extraRunJvmArguments.add("-ea:${modGroup}") if (usesMixins.toBoolean() || forceEnableMixins.toBoolean()) { - extraTweakClasses.add("org.spongepowered.asm.launch.MixinTweaker") - if (usesMixinDebug.toBoolean()) { extraRunJvmArguments.addAll([ "-Dmixin.debug.countInjections=true", @@ -513,14 +519,6 @@ repositories { url = "http://jenkins.usrv.eu:8081/nexus/content/groups/public/" allowInsecureProtocol = true } - if (usesMixins.toBoolean() || forceEnableMixins.toBoolean()) { - if (usesMixinDebug.toBoolean()) { - maven { - name = "Fabric Maven" - url = "https://maven.fabricmc.net/" - } - } - } maven { name 'sonatype' url 'https://oss.sonatype.org/content/repositories/snapshots/' @@ -559,29 +557,49 @@ repositories { } } +def mixinProviderGroup = "io.github.legacymoddingmc" +def mixinProviderModule = "unimixins" +def mixinProviderVersion = "0.1.6" +def mixinProviderSpecNoClassifer = "${mixinProviderGroup}:${mixinProviderModule}:${mixinProviderVersion}" +def mixinProviderSpec = "${mixinProviderSpecNoClassifer}:dev" + dependencies { if (usesMixins.toBoolean()) { annotationProcessor('org.ow2.asm:asm-debug-all:5.0.3') annotationProcessor('com.google.guava:guava:24.1.1-jre') annotationProcessor('com.google.code.gson:gson:2.8.6') - annotationProcessor('com.gtnewhorizon:gtnhmixins:2.1.13:processor') + annotationProcessor(mixinProviderSpec) if (usesMixinDebug.toBoolean()) { runtimeOnlyNonPublishable('org.jetbrains:intellij-fernflower:1.2.1.16') } } - if (usesMixins.toBoolean() || forceEnableMixins.toBoolean()) { - implementation('com.gtnewhorizon:gtnhmixins:2.1.13') + if (usesMixins.toBoolean()) { + implementation(mixinProviderSpec) + } else if (forceEnableMixins.toBoolean()) { + runtimeOnlyNonPublishable(mixinProviderSpec) } } pluginManager.withPlugin('org.jetbrains.kotlin.kapt') { if (usesMixins.toBoolean()) { dependencies { - kapt('com.gtnewhorizon:gtnhmixins:2.1.13:processor') + kapt(mixinProviderSpec) } } } +// Replace old mixin mods with unimixins +// https://docs.gradle.org/8.0.2/userguide/resolution_rules.html#sec:substitution_with_classifier +configurations.all { + resolutionStrategy.dependencySubstitution { + substitute module('com.gtnewhorizon:gtnhmixins') using module(mixinProviderSpecNoClassifer) withClassifier("dev") because("Unimixins replaces other mixin mods") + substitute module('com.github.GTNewHorizons:Mixingasm') using module(mixinProviderSpecNoClassifer) withClassifier("dev") because("Unimixins replaces other mixin mods") + substitute module('com.github.GTNewHorizons:SpongePoweredMixin') using module(mixinProviderSpecNoClassifer) withClassifier("dev") because("Unimixins replaces other mixin mods") + substitute module('com.github.GTNewHorizons:SpongeMixins') using module(mixinProviderSpecNoClassifer) withClassifier("dev") because("Unimixins replaces other mixin mods") + substitute module('io.github.legacymoddingmc:unimixins') using module(mixinProviderSpecNoClassifer) withClassifier("dev") because("Our previous unimixins upload was missing the dev classifier") + } +} + apply from: 'dependencies.gradle' def mixingConfigRefMap = 'mixins.' + modId + '.refmap.json' @@ -695,13 +713,13 @@ ext.java17PatchDependenciesCfg = configurations.create("java17PatchDependencies" } dependencies { - def lwjgl3ifyVersion = '1.1.35' + def lwjgl3ifyVersion = '1.3.3' def asmVersion = '9.4' if (modId != 'lwjgl3ify') { java17Dependencies("com.github.GTNewHorizons:lwjgl3ify:${lwjgl3ifyVersion}") } if (modId != 'hodgepodge') { - java17Dependencies('com.github.GTNewHorizons:Hodgepodge:2.0.40') + java17Dependencies('com.github.GTNewHorizons:Hodgepodge:2.2.4') } java17PatchDependencies('net.minecraft:launchwrapper:1.15') {transitive = false} @@ -793,10 +811,6 @@ public abstract class RunHotswappableMinecraftTask extends RunMinecraftTask { !file.path.contains("2.9.4-nightly-20150209") // Remove lwjgl2 } this.classpath(project.java17DependenciesCfg) - - if (!(project.usesMixins.toBoolean() || project.forceEnableMixins.toBoolean())) { - this.extraArgs.addAll("--tweakClass", "org.spongepowered.asm.launch.MixinTweaker") - } } } @@ -1006,6 +1020,7 @@ idea { } compiler.javac { afterEvaluate { + javacAdditionalOptions = "-encoding utf8" moduleJavacAdditionalOptions = [ (project.name + ".main"): tasks.compileJava.options.compilerArgs.collect { '"' + it + '"' }.join(' ') ] @@ -1125,7 +1140,7 @@ if (modrinthProjectId.size() != 0 && System.getenv("MODRINTH_TOKEN") != null) { } } if (usesMixins.toBoolean()) { - addModrinthDep("required", "project", "gtnhmixins") + addModrinthDep("required", "project", "unimixins") } tasks.modrinth.dependsOn(build) tasks.publish.dependsOn(tasks.modrinth) @@ -1169,7 +1184,7 @@ if (curseForgeProjectId.size() != 0 && System.getenv("CURSEFORGE_TOKEN") != null } } if (usesMixins.toBoolean()) { - addCurseForgeRelation("requiredDependency", "gtnhmixins") + addCurseForgeRelation("requiredDependency", "unimixins") } tasks.curseforge.dependsOn(build) tasks.publish.dependsOn(tasks.curseforge) @@ -1204,7 +1219,7 @@ def addCurseForgeRelation(String type, String name) { // Updating -def buildscriptGradleVersion = "8.0.1" +def buildscriptGradleVersion = "8.0.2" tasks.named('wrapper', Wrapper).configure { gradleVersion = buildscriptGradleVersion diff --git a/docs/RecipeBuilder.md b/docs/RecipeBuilder.md new file mode 100644 index 0000000000..710f1b2dbc --- /dev/null +++ b/docs/RecipeBuilder.md @@ -0,0 +1,60 @@ +# introduction + +GT_RecipeBuilder is the replacement of GT_Values.RA.addXXXX for constructing and adding recipes. +Compared to the old style, this one utilizes the builder pattern to + +1. allow greater flexibility in API. +2. allow us to unify the AssLine recipes and everything else +3. a much nicer syntax than an awfully long line, i.e. more readability + +## metadata + +this corresponds to the various int/long parameter on the old recipe adder interface. +See implosion compressor recipe map for a example on its usage. +the extension also made it possible to use more complicated value, however there is no such use case yet. + +# Coding Conventions + +## Metadata identifiers + +1. naming uses snake case, e.g. `my_metadata_identifier` +2. + +## complicated recipe adder + +1. If one invocation of recipe adder would add multiple recipe to same recipe map, give that recipe map a recipeEmitter +2. If one invocation of recipe adder would conditionally add recipe, define a new IGT_RecipeMap in GT_RecipeConstants +3. If one invocation of recipe adder would add recipe to multiple recipe map, + 1. If all recipe maps involved receive recipe only via this type of adding, use the chaining mechanism offered by GT_RecipeMap, i.e. addDownstream(). + + e.g.sMultiblockElectrolyzerRecipes and sElectrolyzerRecipes + 2. Otherwise, define a new IGT_RecipeMap in GT_RecipeConstants. +4. If the target isn't a real recipe map (e.g. AssLine stuff), define a new IGT_RecipeMap in GT_RecipeConstants. + +## Downstream in an addon + +This assumes you need to generate recipe into your own recipe map from a parent recipe map. + +## deep copy or not + +There is no need to do deep copy EXCEPT you are downstream. +If you do modify the values in a downstream recipe map, call IGT_RecipeMap.deepCopyInput() before adding yourself as a downstream. + +## setRecipeSpecialHandler or setRecipeEmitterSingle + +Prefer setRecipeSpecialHandler, unless it would throw exception on builder.build(). + +## Special Value and Special Item + +These are considered legacy. IGT_RecipeMap should avoid using these and use the more readable metadata system. + +## Use recipe builder or add() directly inside IGT_RecipeMap.doAdd()? + +You SHOULD use the recipe builder and delegate further processing to the doAdd() on that recipe map. e.g. UniversalDistillation +However, there are situations that you need to bypass those logic. Then add() is a valid choice. + +## Reassign builder variable + +No. Just like StringBuilder, you should not do this. Builder is guaranteed to return itself, not a copy. + +Reassigning wouldn't break anything though. This is a coding convention to help the code to stay organized. diff --git a/docs/ResourcePacks_Guide.md b/docs/ResourcePacks_Guide.md new file mode 100644 index 0000000000..5b3dabbcd1 --- /dev/null +++ b/docs/ResourcePacks_Guide.md @@ -0,0 +1,67 @@ +This is a guide for resource packs to set up advanced configurations for GUI. + +## Override text color with mcmeta files + +You might want to change color of text if your texture has similar color to text. You can place mcmeta files at the following locations: +- `gregtech/textures/gui/background/singleblock_default.mcmeta` (most of the machines) +- `gregtech/textures/gui/background/bronze.mcmeta` (steam bronze machines) +- `gregtech/textures/gui/background/steel.mcmeta` (steam steel machines) +- `gregtech/textures/gui/background/primitive.mcmeta` (steam primitive machines) +- `gregtech/textures/gui/background/fusion_computer.mcmeta` (fusion reactor controller) +- `modularui/textures/gui/background/vanilla_background.mcmeta` (NEI) + +(and there might be more in the future, but currently these are exhaustive.) + +Here is an example of the file: +```json +{ + "colors": { + "guiTint": { + "enableGUITint": true, + "Black": "202020", + "Red": "800000", + "Green": "005B00", + "Brown": "553C00", + "Blue": "002456", + "Purple": "551839", + "Cyan": "007780", + "Light Gray": "AAAAAA", + "Gray": "808080", + "Pink": "800056", + "Lime": "559155", + "Yellow": "AAA455", + "Light Blue": "55A4AA", + "Magenta": "BF4095", + "Orange": "AA4F00", + "White": "FAFAFF", + "Machine Metal": "0047AB" + }, + "textColor": { + "title": "FF7700", + "title_white": "66FAFA", + "text_white": "807BAA", + "text_gray": "AAE055", + "text_red": "FF2222", + "nei": "556D8E", + "nei_overlay_yellow": "0xFDD835" + } + } +} +``` + +## Override progress bar texture + +With the transition to ModularUI, many of the textures can be reused in many places now. However, some resource packs still want to add progress bar textures for singleblock machines, unique to each type of them. +You can simply add textures named by the following rules: + +- Basically place at `gregtech/textures/gui/progressbar/${unlocalized name of recipemap}`. Unlocalized name can be found on either of: + - Hold shift while hovering over NEI tab. "HandlerID" indicates unlocalized name. +![](/screenshots/recipemap-unlocalized-name.png) + - Read code. Usually they're passed as 2nd argument for `GT_Recipe_Map` constructor. Recipemaps are defined at `gregtech.api.util.GT_Recipe`. +- For steam machines, append `_bronze`, `_steel`, or `_primitive`. +- Exceptions: Miner: `miner`, Electric Furnace: `E_Furnace`, Electric Oven: `E_Oven` + +Examples: +- `gregtech/textures/gui/progressbar/gt.recipe.laserengraver.png` +- `gregtech/textures/gui/progressbar/gt.recipe.alloysmelter_bronze.png` +- `gregtech/textures/gui/progressbar/E_Furnace.png` diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 943f0cbfa7..ccebba7710 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index fc10b601f7..bdc9a83b1e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/java/gregtech/GT_Mod.java b/src/main/java/gregtech/GT_Mod.java index 9d6aa21d3f..fabc76d581 100644 --- a/src/main/java/gregtech/GT_Mod.java +++ b/src/main/java/gregtech/GT_Mod.java @@ -1,7 +1,7 @@ package gregtech; import static gregtech.api.GregTech_API.registerCircuitProgrammer; -import static gregtech.api.enums.GT_Values.MOD_ID_FR; +import static gregtech.api.enums.ModIDs.Forestry; import java.io.PrintWriter; import java.io.StringWriter; @@ -32,7 +32,6 @@ import appeng.api.AEApi; import com.google.common.base.Stopwatch; import cpw.mods.fml.common.FMLCommonHandler; -import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.SidedProxy; import cpw.mods.fml.common.event.FMLInitializationEvent; @@ -48,13 +47,7 @@ import gregtech.api.GregTech_API; import gregtech.api.enchants.Enchantment_EnderDamage; import gregtech.api.enchants.Enchantment_Hazmat; import gregtech.api.enchants.Enchantment_Radioactivity; -import gregtech.api.enums.ConfigCategories; -import gregtech.api.enums.Element; -import gregtech.api.enums.GT_Values; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.enums.Textures; +import gregtech.api.enums.*; import gregtech.api.interfaces.internal.IGT_Mod; import gregtech.api.metatileentity.BaseMetaPipeEntity; import gregtech.api.objects.GT_ItemStack; @@ -303,7 +296,7 @@ public class GT_Mod implements IGT_Mod { } } - if (Loader.isModLoaded(MOD_ID_FR)) + if (Forestry.isModLoaded()) // noinspection InstantiationOfUtilityClass//TODO: Refactor GT_Bees with proper state handling new GT_Bees(); @@ -330,7 +323,7 @@ public class GT_Mod implements IGT_Mod { gregtechproxy.registerUnificationEntries(); new GT_FuelLoader().run(); } - if (Loader.isModLoaded("Waila")) { + if (ModIDs.Waila.isModLoaded()) { Waila.init(); } IMCForNEI.IMCSender(); @@ -464,7 +457,7 @@ public class GT_Mod implements IGT_Mod { GT_PostLoad.registerFluidCannerRecipes(); - if (Loader.isModLoaded(MOD_ID_FR)) { + if (Forestry.isModLoaded()) { GT_Forestry_Compat.transferCentrifugeRecipes(); GT_Forestry_Compat.transferSqueezerRecipes(); } diff --git a/src/main/java/gregtech/api/GregTech_API.java b/src/main/java/gregtech/api/GregTech_API.java index 68d1afdebd..d8ad1ca07b 100644 --- a/src/main/java/gregtech/api/GregTech_API.java +++ b/src/main/java/gregtech/api/GregTech_API.java @@ -3,7 +3,7 @@ package gregtech.api; import static gregtech.api.enums.GT_Values.B; import static gregtech.api.enums.GT_Values.L; import static gregtech.api.enums.GT_Values.M; -import static gregtech.api.enums.GT_Values.MOD_ID_IC2; +import static gregtech.api.enums.ModIDs.IndustrialCraft2; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -284,7 +284,7 @@ public class GregTech_API { public static boolean mUseOnlyGoodSolderingMaterials = false; - private static final String aTextIC2Lower = MOD_ID_IC2.toLowerCase(Locale.ENGLISH); + private static final String aTextIC2Lower = IndustrialCraft2.modID.toLowerCase(Locale.ENGLISH); /** * Getting assigned by the Mod loading */ diff --git a/src/main/java/gregtech/api/enums/GT_Values.java b/src/main/java/gregtech/api/enums/GT_Values.java index d06e70b0b5..6ccf092461 100644 --- a/src/main/java/gregtech/api/enums/GT_Values.java +++ b/src/main/java/gregtech/api/enums/GT_Values.java @@ -1,5 +1,7 @@ package gregtech.api.enums; +import static gregtech.api.enums.ModIDs.IndustrialCraft2; + import java.math.BigInteger; import java.util.*; @@ -206,7 +208,7 @@ public class GT_Values { TEX_DIR_ASPECTS = TEX_DIR + "aspects/", RES_PATH = MOD_ID + ":" + TEX_DIR, RES_PATH_GUI = MOD_ID + ":" + TEX_DIR_GUI, RES_PATH_ITEM = MOD_ID + ":", RES_PATH_BLOCK = MOD_ID + ":", RES_PATH_ENTITY = MOD_ID + ":" + TEX_DIR_ENTITY, RES_PATH_ASPECTS = MOD_ID + ":" + TEX_DIR_ASPECTS, - RES_PATH_IC2 = MOD_ID_IC2.toLowerCase(Locale.ENGLISH) + ":", + RES_PATH_IC2 = IndustrialCraft2.modID.toLowerCase(Locale.ENGLISH) + ":", RES_PATH_MODEL = MOD_ID + ":" + TEX_DIR + "models/"; /** diff --git a/src/main/java/gregtech/api/enums/Materials.java b/src/main/java/gregtech/api/enums/Materials.java index 9932cf3b09..3ff4d70920 100644 --- a/src/main/java/gregtech/api/enums/Materials.java +++ b/src/main/java/gregtech/api/enums/Materials.java @@ -2,7 +2,8 @@ package gregtech.api.enums; import static gregtech.api.enums.FluidState.GAS; import static gregtech.api.enums.GT_Values.M; -import static gregtech.api.enums.GT_Values.MOD_ID_DC; +import static gregtech.api.enums.ModIDs.NewHorizonsCoreMod; +import static gregtech.api.enums.ModIDs.Thaumcraft; import java.util.*; import java.util.stream.Collectors; @@ -13,7 +14,6 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; -import cpw.mods.fml.common.Loader; import gregtech.GT_Mod; import gregtech.api.GregTech_API; import gregtech.api.enums.TC_Aspects.TC_AspectStack; @@ -2316,7 +2316,7 @@ public class Materials implements IColorModulationContainer, ISubTagContainer { MATERIALS_ARRAY = MATERIALS_MAP.values().toArray(new Materials[0]); // Generate standard object array. This is a // lot faster to loop over. VALUES = Arrays.asList(MATERIALS_ARRAY); - if (!Loader.isModLoaded(MOD_ID_DC) && !GT_Mod.gregtechproxy.mEnableAllComponents) + if (!NewHorizonsCoreMod.isModLoaded() && !GT_Mod.gregtechproxy.mEnableAllComponents) OrePrefixes.initMaterialComponents(); else { OrePrefixes.ingotHot.mDisabledItems.addAll( @@ -2442,7 +2442,7 @@ public class Materials implements IColorModulationContainer, ISubTagContainer { : aMaterial == Diamond || aMaterial == Thaumium ? Wood : aMaterial.contains(SubTag.BURNING) ? Blaze : aMaterial.contains(SubTag.MAGICAL) && aMaterial.contains(SubTag.CRYSTAL) - && Loader.isModLoaded(GT_Values.MOD_ID_TC) ? Thaumium + && Thaumcraft.isModLoaded() ? Thaumium : aMaterial.getMass() > Element.Tc.getMass() * 2 ? TungstenSteel : aMaterial.getMass() > Element.Tc.getMass() ? Steel : Wood); diff --git a/src/main/java/gregtech/api/enums/ModIDs.java b/src/main/java/gregtech/api/enums/ModIDs.java new file mode 100644 index 0000000000..16c03e3ae5 --- /dev/null +++ b/src/main/java/gregtech/api/enums/ModIDs.java @@ -0,0 +1,84 @@ +package gregtech.api.enums; + +import cpw.mods.fml.common.Loader; + +public enum ModIDs { + + AdvancedSolarPanel("AdvancedSolarPanel"), + AE2FluidCraft("ae2fc"), + AppleCore("AppleCore"), + AppliedEnergistics2("appliedenergistics2"), + Avaritia("Avaritia"), + AvaritiaAddons("avaritiaddons"), + BartWorks("bartworks"), + BetterLoadingScreen("betterloadingscreen"), + BiomesOPlanty("BiomesOPlenty"), + BuildCraftFactory("BuildCraft|Factory"), + BuildCraftSilicon("BuildCraft|Silicon"), + BuildCraftTransport("BuildCraft|Transport"), + Computronics("computronics"), + CraftTweaker("MineTweaker3"), + EnderIO("EnderIO"), + EnderStorage("EnderStorage"), + EternalSingularity("eternalsingularity"), + ExtraCells2("extracells"), + ExtraUtilities("ExtraUtilities"), + ForbiddenMagic("ForbiddenMagic"), + Forestry("Forestry"), + GalacticraftCore("GalacticraftCore"), + GalacticraftMars("GalacticraftMars"), + GalaxySpace("GalaxySpace"), + Gendustry("gendustry"), + GoodGenerator("GoodGenerator"), + GregTech("gregtech"), + GraviSuite("GraviSuite"), + GTNHLanthanides("gtnhlanth"), + GTPlusPlus("miscutils"), + PamsHarvestCraft("harvestcraft"), + HardcoreEnderExpansion("HardcoreEnderExpansion"), + HodgePodge("hodgepodge"), + IC2CropPlugin("Ic2Nei"), + IC2NuclearControl("IC2NuclearControl"), + IguanaTweaksTinkerConstruct("IguanaTweaksTConstruct"), + IndustrialCraft2("IC2"), + IronChests("IronChest"), + IronTanks("irontank"), + Minecraft("minecraft"), + Natura("Natura"), + NEICustomDiagrams("neicustomdiagram"), + NewHorizonsCoreMod("dreamcraft"), + NotEnoughItems("NotEnoughItems"), + OpenComputers("OpenComputers"), + ProjectRedCore("ProjRed|Core"), + Railcraft("Railcraft"), + TaintedMagic("TaintedMagic"), + Thaumcraft("Thaumcraft"), + ThaumicBases("thaumicbases"), + ThaumicTinkerer("ThaumicTinkerer"), + TinkerConstruct("TConstruct"), + TinkersGregworks("TGregworks"), + Translocator("Translocator"), + TwilightForest("TwilightForest"), + Waila("Waila"), + // Do we keep compat of those? + IndustrialCraft2Classic("IC2-Classic-Spmod"), + Metallurgy("Metallurgy"), + RotaryCraft("RotaryCraft"), + ThermalExpansion("ThermalExpansion"), + ThermalFondation("ThermalFoundation"), + UndergroundBiomes("UndergroundBiomes"); + + public final String modID; + private Boolean modLoaded; + + ModIDs(String modID) { + this.modID = modID; + } + + public boolean isModLoaded() { + if (this.modLoaded == null) { + this.modLoaded = Loader.isModLoaded(modID); + } + return this.modLoaded; + } +} diff --git a/src/main/java/gregtech/api/enums/SoundResource.java b/src/main/java/gregtech/api/enums/SoundResource.java index f1dffb3884..63a8331496 100644 --- a/src/main/java/gregtech/api/enums/SoundResource.java +++ b/src/main/java/gregtech/api/enums/SoundResource.java @@ -1,7 +1,7 @@ package gregtech.api.enums; import static gregtech.api.enums.GT_Values.MOD_ID; -import static gregtech.api.enums.GT_Values.MOD_ID_IC2; +import static gregtech.api.enums.ModIDs.IndustrialCraft2; import java.util.EnumSet; import java.util.Locale; @@ -30,31 +30,31 @@ public enum SoundResource { RANDOM_EXPLODE(5, "random.explode"), FIRE_IGNITE(6, "fire.ignite"), - IC2_TOOLS_WRENCH(100, MOD_ID_IC2, "tools.Wrench"), - IC2_TOOLS_RUBBER_TRAMPOLINE(101, MOD_ID_IC2, "tools.RubberTrampoline"), - IC2_TOOLS_PAINTER(102, MOD_ID_IC2, "tools.Painter"), - IC2_TOOLS_BATTERY_USE(103, MOD_ID_IC2, "tools.BatteryUse"), - IC2_TOOLS_CHAINSAW_CHAINSAW_USE_ONE(104, MOD_ID_IC2, "tools.chainsaw.ChainsawUseOne"), - IC2_TOOLS_CHAINSAW_CHAINSAW_USE_TWO(105, MOD_ID_IC2, "tools.chainsaw.ChainsawUseTwo"), - IC2_TOOLS_DRILL_DRILL_SOFT(106, MOD_ID_IC2, "tools.drill.DrillSoft"), - IC2_TOOLS_DRILL_DRILL_HARD(107, MOD_ID_IC2, "tools.drill.DrillHard"), - IC2_TOOLS_OD_SCANNER(108, MOD_ID_IC2, "tools.ODScanner"), - IC2_TOOLS_INSULATION_CUTTERS(109, MOD_ID_IC2, "tools.InsulationCutters"), + IC2_TOOLS_WRENCH(100, IndustrialCraft2.modID, "tools.Wrench"), + IC2_TOOLS_RUBBER_TRAMPOLINE(101, IndustrialCraft2.modID, "tools.RubberTrampoline"), + IC2_TOOLS_PAINTER(102, IndustrialCraft2.modID, "tools.Painter"), + IC2_TOOLS_BATTERY_USE(103, IndustrialCraft2.modID, "tools.BatteryUse"), + IC2_TOOLS_CHAINSAW_CHAINSAW_USE_ONE(104, IndustrialCraft2.modID, "tools.chainsaw.ChainsawUseOne"), + IC2_TOOLS_CHAINSAW_CHAINSAW_USE_TWO(105, IndustrialCraft2.modID, "tools.chainsaw.ChainsawUseTwo"), + IC2_TOOLS_DRILL_DRILL_SOFT(106, IndustrialCraft2.modID, "tools.drill.DrillSoft"), + IC2_TOOLS_DRILL_DRILL_HARD(107, IndustrialCraft2.modID, "tools.drill.DrillHard"), + IC2_TOOLS_OD_SCANNER(108, IndustrialCraft2.modID, "tools.ODScanner"), + IC2_TOOLS_INSULATION_CUTTERS(109, IndustrialCraft2.modID, "tools.InsulationCutters"), - IC2_MACHINES_EXTRACTOR_OP(200, MOD_ID_IC2, "machines.ExtractorOp"), - IC2_MACHINES_MACERATOR_OP(201, MOD_ID_IC2, "machines.MaceratorOp"), - IC2_MACHINES_INDUCTION_LOOP(202, MOD_ID_IC2, "machines.InductionLoop"), - IC2_MACHINES_COMPRESSOR_OP(203, MOD_ID_IC2, "machines.CompressorOp"), - IC2_MACHINES_RECYCLER_OP(204, MOD_ID_IC2, "machines.RecyclerOp"), - IC2_MACHINES_MINER_OP(205, MOD_ID_IC2, "machines.MinerOp"), - IC2_MACHINES_PUMP_OP(206, MOD_ID_IC2, "machines.PumpOp"), - IC2_MACHINES_ELECTROFURNACE_LOOP(207, MOD_ID_IC2, "machines.ElectroFurnaceLoop"), + IC2_MACHINES_EXTRACTOR_OP(200, IndustrialCraft2.modID, "machines.ExtractorOp"), + IC2_MACHINES_MACERATOR_OP(201, IndustrialCraft2.modID, "machines.MaceratorOp"), + IC2_MACHINES_INDUCTION_LOOP(202, IndustrialCraft2.modID, "machines.InductionLoop"), + IC2_MACHINES_COMPRESSOR_OP(203, IndustrialCraft2.modID, "machines.CompressorOp"), + IC2_MACHINES_RECYCLER_OP(204, IndustrialCraft2.modID, "machines.RecyclerOp"), + IC2_MACHINES_MINER_OP(205, IndustrialCraft2.modID, "machines.MinerOp"), + IC2_MACHINES_PUMP_OP(206, IndustrialCraft2.modID, "machines.PumpOp"), + IC2_MACHINES_ELECTROFURNACE_LOOP(207, IndustrialCraft2.modID, "machines.ElectroFurnaceLoop"), @Deprecated - DEPRECATED_DUPE_OF_IC2_MACHINES_INDUCTION_LOOP(208, MOD_ID_IC2, "machines.InductionLoop"), - IC2_MACHINES_MACHINE_OVERLOAD(209, MOD_ID_IC2, "machines.MachineOverload"), - IC2_MACHINES_INTERRUPT_ONE(210, MOD_ID_IC2, "machines.InterruptOne"), - IC2_MACHINES_KA_CHING(211, MOD_ID_IC2, "machines.KaChing"), - IC2_MACHINES_MAGNETIZER_LOOP(212, MOD_ID_IC2, "machines.MagnetizerLoop"), + DEPRECATED_DUPE_OF_IC2_MACHINES_INDUCTION_LOOP(208, IndustrialCraft2.modID, "machines.InductionLoop"), + IC2_MACHINES_MACHINE_OVERLOAD(209, IndustrialCraft2.modID, "machines.MachineOverload"), + IC2_MACHINES_INTERRUPT_ONE(210, IndustrialCraft2.modID, "machines.InterruptOne"), + IC2_MACHINES_KA_CHING(211, IndustrialCraft2.modID, "machines.KaChing"), + IC2_MACHINES_MAGNETIZER_LOOP(212, IndustrialCraft2.modID, "machines.MagnetizerLoop"), GT_MACHINES_FUSION_LOOP(230, MOD_ID, "machines.FusionLoop"), GT_MACHINES_DISTILLERY_LOOP(231, MOD_ID, "machines.DistilleryLoop"), diff --git a/src/main/java/gregtech/api/interfaces/IGT_RecipeMap.java b/src/main/java/gregtech/api/interfaces/IGT_RecipeMap.java new file mode 100644 index 0000000000..69f87161d1 --- /dev/null +++ b/src/main/java/gregtech/api/interfaces/IGT_RecipeMap.java @@ -0,0 +1,64 @@ +package gregtech.api.interfaces; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.function.Function; + +import javax.annotation.Nonnull; + +import gregtech.api.util.GT_Recipe; +import gregtech.api.util.GT_RecipeBuilder; +import gregtech.api.util.GT_Utility; + +/** + * Represents the target of a recipe adding action, usually, but not necessarily, is a recipe map itself. + */ +public interface IGT_RecipeMap { + + /** + * Add a downstream recipe map that will get to handle the original builder. + * + * @param downstream + */ + void addDownstream(IGT_RecipeMap downstream); + + /** + * Actually add the recipe represented by the builder. CAN modify the builder's internal states!!! + */ + @Nonnull + Collection doAdd(GT_RecipeBuilder builder); + + /** + * Return a variant of this recipe map that will perform a deep copy on input recipe builder before doing anything + * to it. + * + * The returned recipe map will not have any downstreams, but can accept new downstreams. + */ + default IGT_RecipeMap deepCopyInput() { + return newRecipeMap(b -> doAdd(b.copy())); + } + + static IGT_RecipeMap newRecipeMap(Function> func) { + return new IGT_RecipeMap() { + + private final Collection downstreams = new ArrayList<>(); + + @Override + public void addDownstream(IGT_RecipeMap downstream) { + downstreams.add(downstream); + } + + @Nonnull + @Override + public Collection doAdd(GT_RecipeBuilder builder) { + List> ret = new ArrayList<>(); + ret.add(func.apply(builder)); + for (IGT_RecipeMap downstream : downstreams) { + ret.add(downstream.doAdd(builder)); + } + return GT_Utility.concat(ret); + } + }; + } +} diff --git a/src/main/java/gregtech/api/interfaces/internal/IGT_RecipeAdder.java b/src/main/java/gregtech/api/interfaces/internal/IGT_RecipeAdder.java index bda2523811..149600b426 100644 --- a/src/main/java/gregtech/api/interfaces/internal/IGT_RecipeAdder.java +++ b/src/main/java/gregtech/api/interfaces/internal/IGT_RecipeAdder.java @@ -5,6 +5,7 @@ import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import gregtech.api.util.GT_Recipe; +import gregtech.api.util.GT_RecipeBuilder; public interface IGT_RecipeAdder { @@ -960,4 +961,6 @@ public interface IGT_RecipeAdder { */ GT_Recipe addIC2ReactorFuelCell(ItemStack input, ItemStack output, boolean aMox, float aHeat, float aEnergy, int aCells); + + GT_RecipeBuilder stdBuilder(); } diff --git a/src/main/java/gregtech/api/items/GT_MetaGenerated_Item.java b/src/main/java/gregtech/api/items/GT_MetaGenerated_Item.java index 32a46c8641..b6ea08213b 100644 --- a/src/main/java/gregtech/api/items/GT_MetaGenerated_Item.java +++ b/src/main/java/gregtech/api/items/GT_MetaGenerated_Item.java @@ -1,6 +1,7 @@ package gregtech.api.items; import static gregtech.api.enums.GT_Values.*; +import static gregtech.api.enums.ModIDs.AppleCore; import java.util.ArrayList; import java.util.Arrays; @@ -20,7 +21,6 @@ import net.minecraft.world.World; import squeek.applecore.api.food.FoodValues; import squeek.applecore.api.food.IEdible; -import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -321,7 +321,7 @@ public abstract class GT_MetaGenerated_Item extends GT_MetaBase_Item implements public final ItemStack onEaten(ItemStack aStack, World aWorld, EntityPlayer aPlayer) { IFoodStat tStat = mFoodStats.get((short) getDamage(aStack)); if (tStat != null) { - if (Loader.isModLoaded(MOD_ID_APC)) { + if (AppleCore.isModLoaded()) { aPlayer.getFoodStats().func_151686_a( (ItemFood) GT_Utility.callConstructor( "squeek.applecore.api.food.ItemFoodProxy.ItemFoodProxy", diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java index 1ea2e3e756..e2e0b13f12 100644 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java +++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaPipeEntity_Cable.java @@ -1,6 +1,7 @@ package gregtech.api.metatileentity.implementations; import static gregtech.api.enums.GT_Values.ALL_VALID_SIDES; +import static gregtech.api.enums.ModIDs.GalacticraftCore; import java.util.ArrayList; import java.util.HashSet; @@ -19,13 +20,9 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import cofh.api.energy.IEnergyReceiver; -import cpw.mods.fml.common.Loader; import gregtech.GT_Mod; import gregtech.api.GregTech_API; -import gregtech.api.enums.Dyes; -import gregtech.api.enums.Materials; -import gregtech.api.enums.TextureSet; -import gregtech.api.enums.Textures; +import gregtech.api.enums.*; import gregtech.api.graphs.Node; import gregtech.api.graphs.NodeList; import gregtech.api.graphs.PowerNode; @@ -348,7 +345,7 @@ public class GT_MetaPipeEntity_Cable extends MetaPipeEntity implements IMetaTile // ((tIsGregTechTileEntity && tIsTileEntityCable) && (tAlwaysLookConnected || tLetEnergyIn || tLetEnergyOut) ) // --> Not needed - if (Loader.isModLoaded("GalacticraftCore") && GT_GC_Compat.canConnect(tTileEntity, tDir)) return true; + if (GalacticraftCore.isModLoaded() && GT_GC_Compat.canConnect(tTileEntity, tDir)) return true; // AE2-p2p Compat if (GT_Mod.gregtechproxy.mAE2Integration) { diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_GT_Recipe.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_GT_Recipe.java index 7976ea94c6..e51da3bbdc 100644 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_GT_Recipe.java +++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_GT_Recipe.java @@ -4,6 +4,7 @@ import static gregtech.api.enums.GT_Values.V; import static gregtech.api.enums.GT_Values.VN; import static gregtech.api.enums.GT_Values.W; import static gregtech.api.enums.GT_Values.ticksBetweenSounds; +import static gregtech.api.enums.ModIDs.BartWorks; import static gregtech.api.objects.XSTR.XSTR_INSTANCE; import java.util.Locale; @@ -23,7 +24,6 @@ import com.gtnewhorizons.modularui.api.math.Pos2d; import com.gtnewhorizons.modularui.api.math.Size; import com.gtnewhorizons.modularui.common.widget.ProgressBar; -import cpw.mods.fml.common.Loader; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import gregtech.api.enums.*; @@ -206,12 +206,12 @@ public class GT_MetaTileEntity_BasicMachine_GT_Recipe extends GT_MetaTileEntity_ case 6: case 7: case 8: - if (Loader.isModLoaded("bartworks")) { // todo remove via provider pattern on all enums? + if (BartWorks.isModLoaded()) { // todo remove via provider pattern on all enums? aRecipe[i] = "blockGlass" + VN[aTier]; break; } default: - if (Loader.isModLoaded("bartworks")) { // todo remove via provider pattern on all enums? + if (BartWorks.isModLoaded()) { // todo remove via provider pattern on all enums? aRecipe[i] = "blockGlass" + VN[8]; } else { aRecipe[i] = Ic2Items.reinforcedGlass; diff --git a/src/main/java/gregtech/api/util/GT_BaseCrop.java b/src/main/java/gregtech/api/util/GT_BaseCrop.java index 65d2900176..bfffbe8572 100644 --- a/src/main/java/gregtech/api/util/GT_BaseCrop.java +++ b/src/main/java/gregtech/api/util/GT_BaseCrop.java @@ -1,6 +1,7 @@ package gregtech.api.util; import static gregtech.api.enums.GT_Values.E; +import static gregtech.api.enums.ModIDs.IC2CropPlugin; import java.util.ArrayList; import java.util.List; @@ -12,7 +13,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import speiger.src.crops.api.ICropCardInfo; -import cpw.mods.fml.common.Loader; import gregtech.GT_Mod; import gregtech.api.GregTech_API; import gregtech.api.enums.ConfigCategories; @@ -33,7 +33,7 @@ public class GT_BaseCrop extends CropCard implements ICropCardInfo { mGrowthSpeed = 0; private ItemStack mDrop = null, mSpecialDrops[] = null; private Materials mBlock = null; - private static boolean bIc2NeiLoaded = Loader.isModLoaded("Ic2Nei"); + private static boolean bIc2NeiLoaded = IC2CropPlugin.isModLoaded(); /** * To create new Crops diff --git a/src/main/java/gregtech/api/util/GT_ModReference.java b/src/main/java/gregtech/api/util/GT_ModReference.java new file mode 100644 index 0000000000..02a1116f68 --- /dev/null +++ b/src/main/java/gregtech/api/util/GT_ModReference.java @@ -0,0 +1,29 @@ +package gregtech.api.util; + +import static gregtech.api.enums.ModIDs.GTPlusPlus; +import static gregtech.api.enums.ModIDs.Railcraft; + +import cpw.mods.fml.common.Loader; + +@Deprecated // use gregtech.api.enums.ModIDs instead +public enum GT_ModReference { + + RAILCRAFT(Railcraft.modID), + GTPP(GTPlusPlus.modID),; + + private final boolean loaded; + private final String modID; + + GT_ModReference(String modID) { + loaded = Loader.isModLoaded(modID); + this.modID = modID; + } + + public boolean isLoaded() { + return loaded; + } + + public String getModID() { + return modID; + } +} diff --git a/src/main/java/gregtech/api/util/GT_Recipe.java b/src/main/java/gregtech/api/util/GT_Recipe.java index 3b7f64aae8..e7443a63b5 100644 --- a/src/main/java/gregtech/api/util/GT_Recipe.java +++ b/src/main/java/gregtech/api/util/GT_Recipe.java @@ -1,7 +1,14 @@ package gregtech.api.util; import static gregtech.api.enums.GT_Values.*; +import static gregtech.api.enums.ModIDs.GTPlusPlus; +import static gregtech.api.enums.ModIDs.NEICustomDiagrams; +import static gregtech.api.enums.ModIDs.Railcraft; +import static gregtech.api.util.GT_RecipeConstants.ADDITIVE_AMOUNT; +import static gregtech.api.util.GT_RecipeMapUtil.*; import static gregtech.api.util.GT_Utility.formatNumbers; +import static gregtech.api.util.GT_Utility.isArrayEmptyOrNull; +import static gregtech.api.util.GT_Utility.isArrayOfLength; import static net.minecraft.util.EnumChatFormatting.GRAY; import static net.minecraft.util.StatCollector.translateToLocal; @@ -9,10 +16,15 @@ import java.awt.*; import java.util.*; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Consumer; +import java.util.function.Function; import java.util.function.Supplier; import javax.annotation.Nullable; +import mods.railcraft.common.blocks.aesthetics.cube.EnumCube; +import mods.railcraft.common.items.RailcraftToolItems; + import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.init.Blocks; @@ -27,6 +39,8 @@ import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.IFluidContainerItem; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; @@ -34,6 +48,7 @@ import appeng.util.ReadableNumberConverter; import codechicken.lib.gui.GuiDraw; import codechicken.nei.PositionedStack; +import com.google.common.collect.Iterables; import com.gtnewhorizons.modularui.api.GlStateManager; import com.gtnewhorizons.modularui.api.ModularUITextures; import com.gtnewhorizons.modularui.api.drawable.FallbackableUITexture; @@ -60,6 +75,7 @@ import gregtech.api.gui.GT_GUIColorOverride; import gregtech.api.gui.modularui.FallbackableSteamTexture; import gregtech.api.gui.modularui.GT_UITextures; import gregtech.api.gui.modularui.SteamTexture; +import gregtech.api.interfaces.IGT_RecipeMap; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.interfaces.tileentity.IHasWorldObjectAndCoords; import gregtech.api.objects.GT_FluidStack; @@ -155,13 +171,13 @@ public class GT_Recipe implements Comparable { */ public List> stackTraces = new ArrayList<>(); - private GT_Recipe(GT_Recipe aRecipe) { - mInputs = GT_Utility.copyStackArray((Object[]) aRecipe.mInputs); - mOutputs = GT_Utility.copyStackArray((Object[]) aRecipe.mOutputs); + private GT_Recipe(GT_Recipe aRecipe, boolean shallow) { + mInputs = shallow ? aRecipe.mInputs : GT_Utility.copyStackArray((Object[]) aRecipe.mInputs); + mOutputs = shallow ? aRecipe.mOutputs : GT_Utility.copyStackArray((Object[]) aRecipe.mOutputs); mSpecialItems = aRecipe.mSpecialItems; mChances = aRecipe.mChances; - mFluidInputs = GT_Utility.copyFluidArray(aRecipe.mFluidInputs); - mFluidOutputs = GT_Utility.copyFluidArray(aRecipe.mFluidOutputs); + mFluidInputs = shallow ? aRecipe.mFluidInputs : GT_Utility.copyFluidArray(aRecipe.mFluidInputs); + mFluidOutputs = shallow ? aRecipe.mFluidOutputs : GT_Utility.copyFluidArray(aRecipe.mFluidOutputs); mDuration = aRecipe.mDuration; mSpecialValue = aRecipe.mSpecialValue; mEUt = aRecipe.mEUt; @@ -174,6 +190,29 @@ public class GT_Recipe implements Comparable { reloadOwner(); } + // only used for GT_RecipeBuilder. Should not be called otherwise + GT_Recipe(ItemStack[] mInputs, ItemStack[] mOutputs, FluidStack[] mFluidInputs, FluidStack[] mFluidOutputs, + int[] mChances, Object mSpecialItems, int mDuration, int mEUt, int mSpecialValue, boolean mEnabled, + boolean mHidden, boolean mFakeRecipe, boolean mCanBeBuffered, boolean mNeedsEmptyOutput, String[] neiDesc) { + this.mInputs = mInputs; + this.mOutputs = mOutputs; + this.mFluidInputs = mFluidInputs; + this.mFluidOutputs = mFluidOutputs; + this.mChances = mChances; + this.mSpecialItems = mSpecialItems; + this.mDuration = mDuration; + this.mEUt = mEUt; + this.mSpecialValue = mSpecialValue; + this.mEnabled = mEnabled; + this.mHidden = mHidden; + this.mFakeRecipe = mFakeRecipe; + this.mCanBeBuffered = mCanBeBuffered; + this.mNeedsEmptyOutput = mNeedsEmptyOutput; + this.neiDesc = neiDesc; + + reloadOwner(); + } + public GT_Recipe(boolean aOptimize, ItemStack[] aInputs, ItemStack[] aOutputs, Object aSpecialItems, int[] aChances, FluidStack[] aFluidInputs, FluidStack[] aFluidOutputs, int aDuration, int aEUt, int aSpecialValue) { if (aInputs == null) aInputs = new ItemStack[0]; @@ -556,7 +595,11 @@ public class GT_Recipe implements Comparable { } public GT_Recipe copy() { - return new GT_Recipe(this); + return new GT_Recipe(this, false); + } + + public GT_Recipe copyShallow() { + return new GT_Recipe(this, true); } public boolean isRecipeInputEqual(boolean aDecreaseStacksizeBySuccess, FluidStack[] aFluidInputs, @@ -768,6 +811,7 @@ public class GT_Recipe implements Comparable { final List excludedClasses = Arrays.asList( "java.lang.Thread", "gregtech.api.util.GT_Recipe", + "gregtech.api.util.GT_RecipeBuilder", "gregtech.api.util.GT_Recipe$GT_Recipe_Map", "gregtech.common.GT_RecipeAdder"); if (GT_Mod.gregtechproxy.mNEIRecipeOwnerStackTrace) { @@ -800,6 +844,37 @@ public class GT_Recipe implements Comparable { } } + public GT_Recipe setInputs(ItemStack... aInputs) { + // TODO determine if we need this without trailing nulls call + this.mInputs = ArrayExt.withoutTrailingNulls(aInputs, ItemStack[]::new); + return this; + } + + public GT_Recipe setOutputs(ItemStack... aOutputs) { + this.mOutputs = ArrayExt.withoutTrailingNulls(aOutputs, ItemStack[]::new); + return this; + } + + public GT_Recipe setFluidInputs(FluidStack... aInputs) { + this.mFluidInputs = ArrayExt.withoutTrailingNulls(aInputs, FluidStack[]::new); + return this; + } + + public GT_Recipe setFluidOutputs(FluidStack... aOutputs) { + this.mFluidOutputs = ArrayExt.withoutTrailingNulls(aOutputs, FluidStack[]::new); + return this; + } + + public GT_Recipe setDuration(int aDuration) { + this.mDuration = aDuration; + return this; + } + + public GT_Recipe setEUt(int aEUt) { + this.mEUt = aEUt; + return this; + } + public static class GT_Recipe_AssemblyLine { public static final ArrayList sAssemblylineRecipes = new ArrayList(); @@ -992,7 +1067,7 @@ public class GT_Recipe implements Comparable { } @SuppressWarnings("StaticInitializerReferencesSubClass") - public static class GT_Recipe_Map { + public static class GT_Recipe_Map implements IGT_RecipeMap { /** * Contains all Recipe Maps @@ -1020,6 +1095,7 @@ public class GT_Recipe implements Comparable { true, true).setSlotOverlay(false, false, GT_UITextures.OVERLAY_SLOT_CRUSHED_ORE) .setSlotOverlay(false, true, GT_UITextures.OVERLAY_SLOT_DUST) + .setRecipeConfigFile("orewasher", FIRST_ITEM_INPUT) .setProgressBar(GT_UITextures.PROGRESSBAR_BATH, ProgressBar.Direction.CIRCULAR_CW); public static final GT_Recipe_Map sThermalCentrifugeRecipes = new GT_Recipe_Map( new HashSet<>(1000), @@ -1038,6 +1114,7 @@ public class GT_Recipe implements Comparable { true, true).setSlotOverlay(false, false, GT_UITextures.OVERLAY_SLOT_CRUSHED_ORE) .setSlotOverlay(false, true, GT_UITextures.OVERLAY_SLOT_DUST) + .setRecipeConfigFile("thermalcentrifuge", FIRST_ITEM_INPUT) .setProgressBar(GT_UITextures.PROGRESSBAR_ARROW, ProgressBar.Direction.RIGHT); public static final GT_Recipe_Map sCompressorRecipes = new GT_Recipe_Map( new HashSet<>(750), @@ -1055,6 +1132,7 @@ public class GT_Recipe implements Comparable { E, true, true).setSlotOverlay(false, false, GT_UITextures.OVERLAY_SLOT_COMPRESSOR) + .setRecipeConfigFile("compressor", FIRST_ITEM_INPUT) .setProgressBar(GT_UITextures.PROGRESSBAR_COMPRESS, ProgressBar.Direction.RIGHT) .setSlotOverlaySteam(false, GT_UITextures.OVERLAY_SLOT_COMPRESSOR_STEAM) .setProgressBarSteam(GT_UITextures.PROGRESSBAR_COMPRESS_STEAM); @@ -1074,6 +1152,7 @@ public class GT_Recipe implements Comparable { E, true, true).setSlotOverlay(false, false, GT_UITextures.OVERLAY_SLOT_CENTRIFUGE) + .setRecipeConfigFile("extractor", FIRST_ITEM_INPUT) .setProgressBar(GT_UITextures.PROGRESSBAR_EXTRACT, ProgressBar.Direction.RIGHT) .setSlotOverlaySteam(false, GT_UITextures.OVERLAY_SLOT_CENTRIFUGE_STEAM) .setProgressBarSteam(GT_UITextures.PROGRESSBAR_EXTRACT_STEAM); @@ -1257,7 +1336,7 @@ public class GT_Recipe implements Comparable { E, true, true).setSlotOverlay(false, false, true, true, GT_UITextures.OVERLAY_SLOT_DATA_ORB) - .setUsualFluidInputCount(4); + .setUsualFluidInputCount(4).setDisableOptimize(true); public static final GT_Recipe_Map sPlasmaArcFurnaceRecipes = new GT_Recipe_Map( new HashSet<>(20000), "gt.recipe.plasmaarcfurnace", @@ -1273,7 +1352,8 @@ public class GT_Recipe implements Comparable { 1, E, true, - true).setProgressBar(GT_UITextures.PROGRESSBAR_ARROW, ProgressBar.Direction.RIGHT); + true).setProgressBar(GT_UITextures.PROGRESSBAR_ARROW, ProgressBar.Direction.RIGHT) + .setRecipeConfigFile("arcfurnace", FIRST_ITEM_INPUT); public static final GT_Recipe_Map sArcFurnaceRecipes = new GT_Recipe_Map( new HashSet<>(20000), "gt.recipe.arcfurnace", @@ -1289,7 +1369,8 @@ public class GT_Recipe implements Comparable { 1, E, true, - true).setProgressBar(GT_UITextures.PROGRESSBAR_ARROW, ProgressBar.Direction.RIGHT); + true).setProgressBar(GT_UITextures.PROGRESSBAR_ARROW, ProgressBar.Direction.RIGHT) + .setRecipeConfigFile("arcfurnace", FIRST_ITEM_INPUT); public static final GT_Recipe_Map sPrinterRecipes = new GT_Recipe_Map_Printer( new HashSet<>(5), "gt.recipe.printer", @@ -1308,6 +1389,7 @@ public class GT_Recipe implements Comparable { true).setSlotOverlay(false, false, GT_UITextures.OVERLAY_SLO