diff --git a/build.gradle b/build.gradle index 92b1d8fc..71258097 100644 --- a/build.gradle +++ b/build.gradle @@ -180,7 +180,7 @@ tasks.withType(ProcessResources).configureEach { mod_description : mod_description ] inputs.properties replaceProperties - + duplicatesStrategy = DuplicatesStrategy.EXCLUDE filesMatching(['META-INF/neoforge.mods.toml']) { expand replaceProperties } diff --git a/src/main/java/com/rae/creatingspace/content/datagen/CSDatagen.java b/src/main/java/com/rae/creatingspace/content/datagen/CSDatagen.java index d39f31a5..b4d45060 100644 --- a/src/main/java/com/rae/creatingspace/content/datagen/CSDatagen.java +++ b/src/main/java/com/rae/creatingspace/content/datagen/CSDatagen.java @@ -4,20 +4,30 @@ import com.google.gson.JsonObject; import com.rae.creatingspace.CreatingSpace; +import com.rae.creatingspace.content.datagen.recipe.CSPressingRecipeGen; +import com.rae.creatingspace.content.datagen.recipe.CSStandardRecipeGen; import com.simibubi.create.foundation.utility.FilesHelper; import com.tterrag.registrate.providers.ProviderType; +import com.tterrag.registrate.providers.RegistrateDataProvider; +import net.minecraft.core.HolderLookup; import net.minecraft.data.DataGenerator; +import net.minecraft.data.PackOutput; import net.neoforged.neoforge.common.data.ExistingFileHelper; import net.neoforged.neoforge.data.event.GatherDataEvent; import java.util.Map.Entry; +import java.util.concurrent.CompletableFuture; import java.util.function.BiConsumer; +import static com.rae.creatingspace.CreatingSpace.REGISTRATE; + public class CSDatagen { public static void gatherData(GatherDataEvent event) { addExtraRegistrateData(); DataGenerator generator = event.getGenerator(); + PackOutput output = generator.getPackOutput(); + CompletableFuture lookupProvider = event.getLookupProvider(); ExistingFileHelper existingFileHelper = event.getExistingFileHelper(); if (event.includeClient()) { @@ -35,13 +45,20 @@ public static void gatherData(GatherDataEvent event) { //ProcessingRecipeGen.registerAll(generator); // AllOreFeatureConfigEntries.gatherData(event); + + //CS Recipes + generator.addProvider(true, new CSStandardRecipeGen(output, lookupProvider)); + generator.addProvider(true, new CSPressingRecipeGen(output, lookupProvider)); + + event.getGenerator().addProvider(true, REGISTRATE.setDataProvider(new RegistrateDataProvider(REGISTRATE, CreatingSpace.MODID, event))); } } private static void addExtraRegistrateData() { //CreateRegistrateTags.addGenerators(); - CreatingSpace.REGISTRATE.addDataGenerator(ProviderType.LANG, provider -> { + /* + REGISTRATE.addDataGenerator(ProviderType.LANG, provider -> { BiConsumer langConsumer = provider::add; provideDefaultLang("interface", langConsumer); @@ -50,6 +67,7 @@ private static void addExtraRegistrateData() { //AllSoundEvents.provideLang(langConsumer); providePonderLang(langConsumer); }); + */ } private static void provideDefaultLang(String fileName, BiConsumer consumer) { diff --git a/src/main/java/com/rae/creatingspace/content/datagen/CSMetalSets.java b/src/main/java/com/rae/creatingspace/content/datagen/CSMetalSets.java new file mode 100644 index 00000000..54f81ae2 --- /dev/null +++ b/src/main/java/com/rae/creatingspace/content/datagen/CSMetalSets.java @@ -0,0 +1,64 @@ +package com.rae.creatingspace.content.datagen; + +import com.rae.creatingspace.content.datagen.recipe.CSMetalRecipeHelper; +import com.rae.creatingspace.init.ingameobject.BlockInit; +import com.rae.creatingspace.init.ingameobject.ItemInit; +import com.simibubi.create.AllTags; +import net.minecraft.data.recipes.RecipeOutput; +import net.minecraft.world.item.Item; + +import javax.annotation.Nullable; +import java.util.List; + +public class CSMetalSets { + + public static final MetalSet ALUMINUM = new MetalSet( + "aluminum", + true, + ItemInit.ALUMINUM_NUGGET.get(), + ItemInit.ALUMINUM_INGOT.get(), + BlockInit.ALUMINUM_BLOCK.asItem(), + ItemInit.RAW_ALUMINUM.get(), + BlockInit.MOON_ALUMINUM_ORE.asItem(), + null + ); + + public static final MetalSet COBALT = new MetalSet( + "cobalt", + true, + ItemInit.COBALT_NUGGET.get(), + ItemInit.COBALT_INGOT.get(), + BlockInit.COBALT_BLOCK.asItem(), + ItemInit.RAW_COBALT.get(), + BlockInit.MOON_COBALT_ORE.asItem(), + null + ); + + public static final MetalSet NICKEL = new MetalSet( + "nickel", + true, + ItemInit.NICKEL_NUGGET.get(), + ItemInit.NICKEL_INGOT.get(), + BlockInit.NICKEL_BLOCK.asItem(), + ItemInit.RAW_NICKEL.get(), + BlockInit.NICKEL_ORE.asItem(), + BlockInit.MOON_NICKEL_ORE.asItem() + ); + + public static final List ALL = List.of("aluminum","cobalt", "nickel"); + + public record MetalSet( + String name, + boolean generateSmelting, + Item nugget, + Item ingot, + Item block, + @Nullable Item rawOre, + @Nullable Item ore, + @Nullable Item deepslateOre + ){} + + protected void buildRecipes(RecipeOutput recipeOutput) { + } + +} diff --git a/src/main/java/com/rae/creatingspace/content/datagen/CSRecipeProvider.java b/src/main/java/com/rae/creatingspace/content/datagen/CSRecipeProvider.java new file mode 100644 index 00000000..c425ed9d --- /dev/null +++ b/src/main/java/com/rae/creatingspace/content/datagen/CSRecipeProvider.java @@ -0,0 +1,38 @@ +package com.rae.creatingspace.content.datagen; + +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.data.recipes.RecipeOutput; +import net.minecraft.data.recipes.RecipeProvider; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; + +public class CSRecipeProvider extends RecipeProvider { + + protected final List all = new ArrayList<>(); + + public CSRecipeProvider(PackOutput output, CompletableFuture registries) { + super(output, registries); + } + + @Override + protected void buildRecipes(@NotNull RecipeOutput pRecipeOutput) { + all.forEach(c -> c.register(pRecipeOutput)); + } + + protected GeneratedRecipe register(GeneratedRecipe recipe) { + all.add(recipe); + return recipe; + } + + @FunctionalInterface + public interface GeneratedRecipe { + void register(RecipeOutput output); + } + + public static class Marker { + } +} diff --git a/src/main/java/com/rae/creatingspace/content/datagen/recipe/CSMetalRecipeHelper.java b/src/main/java/com/rae/creatingspace/content/datagen/recipe/CSMetalRecipeHelper.java new file mode 100644 index 00000000..46ada80c --- /dev/null +++ b/src/main/java/com/rae/creatingspace/content/datagen/recipe/CSMetalRecipeHelper.java @@ -0,0 +1,103 @@ +package com.rae.creatingspace.content.datagen.recipe; + +import com.rae.creatingspace.CreatingSpace; +import com.rae.creatingspace.content.datagen.CSMetalSets; +import com.rae.creatingspace.init.EngineMaterialInit; +import com.rae.creatingspace.init.ingameobject.ItemInit; +import com.simibubi.create.AllTags; +import com.simibubi.create.foundation.data.recipe.PressingRecipeGen; +import net.minecraft.advancements.Criterion; +import net.minecraft.advancements.critereon.InventoryChangeTrigger; +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.data.recipes.RecipeCategory; +import net.minecraft.data.recipes.RecipeOutput; +import net.minecraft.data.recipes.ShapedRecipeBuilder; +import net.minecraft.data.recipes.ShapelessRecipeBuilder; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; + +import java.util.concurrent.CompletableFuture; + +import static com.rae.creatingspace.CreatingSpace.resource; + +public class CSMetalRecipeHelper { + + public static void generateMetalRecipes(RecipeOutput output, CSMetalSets.MetalSet metal) { + // 9 Nuggets → 1 Ingot + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, metal.ingot()) + .define('#', AllTags.commonItemTag("nuggets/" + metal.name())) + .pattern("###") + .pattern("###") + .pattern("###") + .unlockedBy("has_nugget", has(metal.nugget())) + .save(output, resource(metal.name() + "_ingot_from_nuggets")); + + // 1 Ingot → 9 Nuggets + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, metal.nugget(), 9) + .requires(AllTags.commonItemTag("ingots/" + metal.name())) + .unlockedBy("has_ingot", has(metal.ingot())) + .save(output, resource(metal.name() + "_nugget")); + + // 9 Ingots → 1 Block + ShapedRecipeBuilder.shaped(RecipeCategory.BUILDING_BLOCKS, metal.block()) + .define('#', AllTags.commonItemTag("ingots/" + metal.name())) + .pattern("###") + .pattern("###") + .pattern("###") + .unlockedBy("has_ingot", has(metal.ingot())) + .save(output, resource(metal.name() + "_block")); + + // 1 Block → 9 Ingots + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, metal.ingot(), 9) + .requires(AllTags.commonItemTag("storage_blocks/" + metal.name())) + .unlockedBy("has_block", has(metal.block())) + .save(output, resource(metal.name() + "_ingot_from_block")); + } + + public static void generateMetalAlloyRecipes(RecipeOutput output, CSMetalSets.MetalSet metal) { + // 9 Nuggets → 1 Ingot + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, metal.ingot()) + .define('#', AllTags.commonItemTag("nuggets/" + metal.name())) + .pattern("###") + .pattern("###") + .pattern("###") + .unlockedBy("has_nugget", has(metal.nugget())) + .save(output, ResourceLocation.fromNamespaceAndPath(CreatingSpace.MODID, metal.name() + "_ingot_from_nuggets")); + + // 1 Ingot → 9 Nuggets + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, metal.nugget(), 9) + .requires(AllTags.commonItemTag("ingots/" + metal.name())) + .unlockedBy("has_ingot", has(metal.ingot())) + .save(output, ResourceLocation.fromNamespaceAndPath(CreatingSpace.MODID, metal.name() + "_nugget")); + + // 9 Ingots → 1 Block + ShapedRecipeBuilder.shaped(RecipeCategory.BUILDING_BLOCKS, metal.block()) + .define('#', AllTags.commonItemTag("ingots/" + metal.name())) + .pattern("###") + .pattern("###") + .pattern("###") + .unlockedBy("has_ingot", has(metal.ingot())) + .save(output, ResourceLocation.fromNamespaceAndPath(CreatingSpace.MODID, metal.name() + "_block")); + + // 1 Block → 9 Ingots + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, metal.ingot(), 9) + .requires(AllTags.commonItemTag("storage_blocks/" + metal.name())) + .unlockedBy("has_block", has(metal.block())) + .save(output, ResourceLocation.fromNamespaceAndPath(CreatingSpace.MODID, metal.name() + "_ingot_from_block")); + } + + public static void generateMetalPressingRecipes(RecipeOutput output, CSMetalSets.MetalSet metal) { + + } + + // helper for criteria + private static Criterion has(Item item) { + return InventoryChangeTrigger.TriggerInstance.hasItems(item); + } + + private ResourceLocation createLocation(String recipeName) { + return ResourceLocation.fromNamespaceAndPath(CreatingSpace.MODID, recipeName); + } +} + diff --git a/src/main/java/com/rae/creatingspace/content/datagen/recipe/CSPressingRecipeGen.java b/src/main/java/com/rae/creatingspace/content/datagen/recipe/CSPressingRecipeGen.java new file mode 100644 index 00000000..5621b6f9 --- /dev/null +++ b/src/main/java/com/rae/creatingspace/content/datagen/recipe/CSPressingRecipeGen.java @@ -0,0 +1,61 @@ +package com.rae.creatingspace.content.datagen.recipe; + +import com.rae.creatingspace.content.datagen.CSRecipeProvider; +import com.rae.creatingspace.init.ingameobject.ItemInit; +import com.simibubi.create.AllRecipeTypes; +import com.simibubi.create.AllTags; +import com.simibubi.create.content.processing.recipe.ProcessingRecipe; +import com.simibubi.create.content.processing.recipe.ProcessingRecipeBuilder; +import com.simibubi.create.content.processing.recipe.ProcessingRecipeSerializer; +import com.simibubi.create.foundation.data.recipe.ProcessingRecipeGen; +import net.createmod.catnip.registry.RegisteredObjectsHelper; +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.ItemLike; + +import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; +import java.util.function.UnaryOperator; + +import static com.rae.creatingspace.CreatingSpace.resource; + +@SuppressWarnings("unused") +public class CSPressingRecipeGen extends ProcessingRecipeGen { + + GeneratedRecipe + + ALUMINUM_SHEET = create(resource("aluminum_sheet"), b -> b + .require(AllTags.commonItemTag("ingots/aluminum")) + .output(ItemInit.ALUMINUM_SHEET)), + NICKEL_SHEET = create(resource( "nickel_sheet"), b -> b.require(AllTags.commonItemTag("ingots/nickel")) + .output(ItemInit.NICKEL_SHEET)), + COBALT_SHEET = create(resource("cobalt_sheet"), b -> b.require(AllTags.commonItemTag("ingots/cobalt")) + .output(ItemInit.COBALT_SHEET)), + COPRONICKEL_SHEET = create(resource("copronickel_sheet"), b -> b + .require(AllTags.commonItemTag("ingots/copronickel")) + .output(resource("copronickel_sheet"))), + REINFORCED_COPPER_SHEET = create(resource("reinforced_copper_sheet"), b -> b + .require(AllTags.commonItemTag("ingots/reinforced_copper")) + .output(resource("reinforced_copper_sheet"))), + MONEL_SHEET = create(resource("monel_sheet"), b -> b + .require(AllTags.commonItemTag("ingots/monel")) + .output(resource("monel_sheet"))), + INCONEL_SHEET = create(resource("inconel_sheet"), b -> b + .require(AllTags.commonItemTag("ingots/inconel")) + .output(resource("inconel_sheet"))), + HASTELLOY_SHEET = create(resource("hastelloy_sheet"), b -> b + .require(AllTags.commonItemTag("ingots/hastelloy")) + .output(resource("hastelloy_sheet"))); + + public CSPressingRecipeGen(PackOutput output, CompletableFuture registries) { + super(output, registries); + } + + @Override + protected AllRecipeTypes getRecipeType() { + return AllRecipeTypes.PRESSING; + } +} diff --git a/src/main/java/com/rae/creatingspace/content/datagen/recipe/CSStandardRecipeGen.java b/src/main/java/com/rae/creatingspace/content/datagen/recipe/CSStandardRecipeGen.java new file mode 100644 index 00000000..f68d0db5 --- /dev/null +++ b/src/main/java/com/rae/creatingspace/content/datagen/recipe/CSStandardRecipeGen.java @@ -0,0 +1,751 @@ +package com.rae.creatingspace.content.datagen.recipe; + +import com.google.common.base.Supplier; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import com.rae.creatingspace.content.datagen.CSMetalSets; +import com.rae.creatingspace.content.datagen.CSRecipeProvider; +import com.rae.creatingspace.init.ingameobject.BlockInit; +import com.rae.creatingspace.init.ingameobject.ItemInit; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllItems; +import com.simibubi.create.AllTags; +import com.simibubi.create.foundation.data.recipe.CompatMetals; +import com.simibubi.create.foundation.data.recipe.Mods; +import com.simibubi.create.foundation.data.recipe.PressingRecipeGen; +import com.simibubi.create.foundation.mixin.accessor.MappedRegistryAccessor; +import com.tterrag.registrate.util.entry.BlockEntry; +import com.tterrag.registrate.util.entry.ItemEntry; +import com.tterrag.registrate.util.entry.ItemProviderEntry; +import net.createmod.catnip.registry.RegisteredObjectsHelper; +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.AdvancementHolder; +import net.minecraft.advancements.critereon.ItemPredicate; +import net.minecraft.core.Holder; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.data.PackOutput; +import net.minecraft.data.recipes.*; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.ItemTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.*; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.neoforged.neoforge.common.conditions.ICondition; +import net.neoforged.neoforge.common.conditions.ModLoadedCondition; +import net.neoforged.neoforge.common.conditions.NotCondition; +import org.jetbrains.annotations.Nullable; + +import javax.annotation.ParametersAreNonnullByDefault; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; +import java.util.function.UnaryOperator; + +import static com.rae.creatingspace.CreatingSpace.resource; + +public class CSStandardRecipeGen extends CSRecipeProvider { + + private Marker RESOURCES = enterFolder("resources"); + + /* + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, ItemInit.ALUMINUM_NUGGET.get(), 9) + .requires(AllTags.commonItemTag("ingots/aluminum")) + .unlockedBy("has_aluminum_ingot", has(ItemInit.ALUMINUM_INGOT)).save(recipeOutput, createSimpleLocation("aluminum_nugget")); + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, ItemInit.ALUMINUM_INGOT.get(), 9) + .requires(AllTags.commonItemTag("storage_blocks/aluminum")) + .unlockedBy("has_aluminum_ingot", has(ItemInit.ALUMINUM_INGOT)).save(recipeOutput, withSuffix("_from_block").createLocation("aluminum_ingot")); + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, ItemInit.ALUMINUM_INGOT.get()) + .pattern("###") + .pattern("###") + .pattern("###") + .define('#', AllTags.commonItemTag("nuggets/aluminum")) + .unlockedBy("has_aluminum_ingot", has(ItemInit.ALUMINUM_INGOT)) + .save(recipeOutput, withSuffix("_from_nuggets").createLocation("aluminum_ingot")); + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, BlockInit.ALUMINUM_BLOCK.get()) + .pattern("###") + .pattern("###") + .pattern("###") + .define('#', AllTags.commonItemTag("ingots/aluminum")) + .unlockedBy("has_aluminum_ingot", has(ItemInit.ALUMINUM_INGOT)) + .save(recipeOutput, createSimpleLocation("aluminum_block")); + + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, ItemInit.NICKEL_NUGGET.get(), 9) + .requires(AllTags.commonItemTag("ingots/nickel")) + .unlockedBy("has_nickel_ingot", has(ItemInit.NICKEL_INGOT)).save(recipeOutput, createSimpleLocation("nickel_nugget")); + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, ItemInit.NICKEL_INGOT.get(), 9) + .requires(AllTags.commonItemTag("storage_blocks/nickel")) + .unlockedBy("has_nickel_ingot", has(ItemInit.NICKEL_INGOT)).save(recipeOutput, withSuffix("_from_block").createLocation("nickel_ingot")); + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, ItemInit.NICKEL_INGOT.get()) + .pattern("###") + .pattern("###") + .pattern("###") + .define('#', AllTags.commonItemTag("nuggets/nickel")) + .unlockedBy("has_nickel_ingot", has(ItemInit.NICKEL_INGOT)) + .save(recipeOutput, withSuffix("_from_nuggets").createLocation("nickel_ingot")); + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, BlockInit.NICKEL_BLOCK.get()) + .pattern("###") + .pattern("###") + .pattern("###") + .define('#', AllTags.commonItemTag("ingots/nickel")) + .unlockedBy("has_nickel_ingot", has(ItemInit.NICKEL_INGOT)) + .save(recipeOutput, createSimpleLocation("nickel_block")); + + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, ItemInit.COBALT_NUGGET.get(), 9) + .requires(AllTags.commonItemTag("ingots/cobalt")) + .unlockedBy("has_cobalt_ingot", has(ItemInit.COBALT_INGOT)).save(recipeOutput, createSimpleLocation("cobalt_nugget")); + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, ItemInit.COBALT_INGOT.get(), 9) + .requires(AllTags.commonItemTag("storage_blocks/cobalt")) + .unlockedBy("has_cobalt_ingot", has(ItemInit.COBALT_INGOT)).save(recipeOutput, withSuffix("_from_block").createLocation("cobalt_ingot")); + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, ItemInit.COBALT_INGOT.get()) + .pattern("###") + .pattern("###") + .pattern("###") + .define('#', AllTags.commonItemTag("nuggets/cobalt")) + .unlockedBy("has_cobalt_ingot", has(ItemInit.COBALT_INGOT)) + .save(recipeOutput, withSuffix("_from_nuggets").createLocation("cobalt_ingot")); + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, BlockInit.COBALT_BLOCK.get()) + .pattern("###") + .pattern("###") + .pattern("###") + .define('#', AllTags.commonItemTag("ingots/cobalt")) + .unlockedBy("has_cobalt_ingot", has(ItemInit.COBALT_INGOT)) + .save(recipeOutput, createSimpleLocation("cobalt_block")); + */ + + + private Marker ARMOR = enterFolder("armor"); + + GeneratedRecipe + + ADVANCED_SPACESUIT_BOOTS = create(ItemInit.ADVANCED_SPACESUIT_BOOTS).returns(1) + .unlockedBy(ItemInit.ADVANCED_SPACESUIT_FABRIC::get) + .viaShaped(b -> b.define('F', ItemInit.ADVANCED_SPACESUIT_FABRIC::get) + .pattern("F F") + .pattern("F F")), + + ADVANCED_SPACESUIT_HELMET = create(ItemInit.ADVANCED_SPACESUIT_HELMET).returns(1) + .unlockedBy(ItemInit.ADVANCED_SPACESUIT_FABRIC::get) + .viaShaped(b -> b.define('F', ItemInit.ADVANCED_SPACESUIT_FABRIC::get) + .define('G', AllItems.GOLDEN_SHEET::get) + .pattern("FFF") + .pattern("FGF")), + + ADVANCED_SPACESUIT_LEGGINGS = create(ItemInit.ADVANCED_SPACESUIT_LEGGINGS).returns(1) + .unlockedBy(ItemInit.ADVANCED_SPACESUIT_FABRIC::get) + .viaShaped(b -> b.define('F', ItemInit.ADVANCED_SPACESUIT_FABRIC::get) + .pattern("FFF") + .pattern("F F") + .pattern("F F")), + + BASIC_SPACESUIT_BOOTS = create(ItemInit.BASIC_SPACESUIT_BOOTS).returns(1) + .unlockedBy(ItemInit.BASIC_SPACESUIT_FABRIC::get) + .viaShaped(b -> b.define('F', ItemInit.BASIC_SPACESUIT_FABRIC::get) + .pattern("F F") + .pattern("F F")), + + BASIC_SPACESUIT_HELMET = create(ItemInit.BASIC_SPACESUIT_HELMET).returns(1) + .unlockedBy(ItemInit.BASIC_SPACESUIT_FABRIC::get) + .viaShaped(b -> b.define('F', ItemInit.BASIC_SPACESUIT_FABRIC::get) + .define('G', AllItems.GOLDEN_SHEET::get) + .pattern("FFF") + .pattern("FGF")), + + BASIC_SPACESUIT_LEGGINGS = create(ItemInit.BASIC_SPACESUIT_LEGGINGS).returns(1) + .unlockedBy(ItemInit.BASIC_SPACESUIT_FABRIC::get) + .viaShaped(b -> b.define('F', ItemInit.BASIC_SPACESUIT_FABRIC::get) + .pattern("FFF") + .pattern("F F") + .pattern("F F")) + ; + + Marker MACHINES = enterFolder("machines"); + + GeneratedRecipe + + AIR_LIQUIFIER = create(BlockInit.AIR_LIQUEFIER).returns(1) + .unlockedBy(AllBlocks.FLUID_TANK::get) + .viaShaped(b -> b.define('S', AllItems.BRASS_SHEET::get) + .define('T', AllBlocks.FLUID_TANK.get()) + .define('C', AllBlocks.BRASS_CASING.get()) + .define('P', AllBlocks.ENCASED_FAN.get()) + .pattern(" S ") + .pattern("CPC") + .pattern(" T ")), + + CATALYST_CARRIER = create(BlockInit.CATALYST_CARRIER).returns(1) + .unlockedBy(AllBlocks.MECHANICAL_PRESS::get) + .viaShaped(b -> b + .define('N', AllTags.commonItemTag("ingots/nickel")) + .define('G', AllTags.commonItemTag("plates/gold")) + .define('P', AllBlocks.MECHANICAL_PRESS.get()) + .pattern(" G ") + .pattern("NPN") + .pattern(" G ")), + + CLAMPS = create(BlockInit.CLAMPS).returns(4) + .unlockedBy(AllBlocks.COPPER_CASING::get) + .viaShaped(b -> b + .define('I', Blocks.IRON_BLOCK) + .define('C', AllBlocks.COPPER_CASING.get()) + .pattern("ICI") + .pattern("CIC") + .pattern("ICI")), + + CRYOGENIC_TANK = create(BlockInit.CRYOGENIC_TANK).returns(1) + .unlockedBy(AllBlocks.FLUID_TANK::get) + .viaShaped(b -> b + .define('N', AllTags.commonItemTag("plates/nickel")) + .define('W', Items.RED_WOOL) + .define('T', AllBlocks.FLUID_TANK.get()) + .pattern("NWN") + .pattern("WTW") + .pattern("NWN")), + + FLIGHT_RECORDER = create(BlockInit.FLIGHT_RECORDER).returns(1) + .unlockedBy(AllBlocks.BRASS_CASING::get) + .viaShaped(b -> b + .define('B', AllBlocks.BRASS_CASING.get()) + .define('A', AllBlocks.SHAFT.get()) + .define('K', Items.DRIED_KELP_BLOCK) + .pattern(" B ") + .pattern("AKA") + .pattern(" B ")), + + FLOW_METER = create(BlockInit.FLOW_METER).returns(1) + .unlockedBy(AllBlocks.COPPER_CASING::get) + .viaShaped(b -> b + .define('C', AllBlocks.COPPER_CASING.get()) + .define('G', Items.COMPASS) + .pattern("G") + .pattern("C")), + + MECHANICAL_ELECTROLYZER = create(BlockInit.MECHANICAL_ELECTROLYZER).returns(1) + .unlockedBy(AllBlocks.FLUID_TANK::get) + .viaShaped(b -> b + .define('C', ItemInit.COPPER_COIL.get()) + .define('X', AllBlocks.COPPER_CASING.get()) + .define('T', AllBlocks.FLUID_TANK.get()) + .define('S', AllBlocks.SHAFT.get()) + .define('G', AllTags.commonItemTag("plates/gold")) + .pattern("XSX") + .pattern("CCC") + .pattern("GTG")), + + OXYGEN_SEALER = create(BlockInit.OXYGEN_SEALER).returns(1) + .unlockedBy(AllBlocks.FLUID_TANK::get) + .viaShaped(b -> b + .define('P', AllItems.PROPELLER.get()) + .define('C', AllBlocks.COPPER_CASING.get()) + .define('T', AllBlocks.FLUID_TANK.get()) + .define('N', AllTags.commonItemTag("plates/nickel")) + .pattern("NPN") + .pattern("CTC") + .pattern("CCC")), + + ROCKET_CASING = create(BlockInit.ROCKET_CASING).returns(1) + .unlockedBy(ItemInit.COBALT_INGOT::get) + .viaShaped(b -> b + .define('S', AllTags.commonItemTag("plates/aluminum")) + .define('C', AllTags.commonItemTag("ingots/cobalt")) + .pattern("CSC") + .pattern("SCS") + .pattern("CSC")), + + ROCKET_CONTROLS_RESET = create(BlockInit.ROCKET_CONTROLS).withSuffix("_reset").returns(1) + .unlockedBy(BlockInit.ROCKET_CONTROLS::get) + .viaShapeless(b -> b + .requires(BlockInit.ROCKET_CONTROLS.get())), + + ROCKET_CONTROLS = create(BlockInit.ROCKET_CONTROLS).returns(1) + .unlockedBy(AllBlocks.TRAIN_CONTROLS::get) + .viaShaped(b -> b + .define('E', AllItems.ELECTRON_TUBE.get()) + .define('R', AllBlocks.REDSTONE_LINK.get()) + .define('T', AllBlocks.TRAIN_CONTROLS.get()) + .define('S', AllItems.STURDY_SHEET.get()) + .pattern("ERE") + .pattern("ETE") + .pattern("SSS")), + + ROCKET_ENGINEER_TABLE = create(BlockInit.ROCKET_ENGINEER_TABLE).returns(1) + .unlockedBy(BlockInit.ROCKET_ENGINEER_TABLE::get) + .viaShaped(b -> b + .define('W', ItemTags.WOODEN_SLABS) + .define('S', Items.SMOOTH_STONE) + .pattern("WWW") + .pattern("WWW") + .pattern(" S ")) + ; + + private Marker MISC = enterFolder("misc"); + + GeneratedRecipe + + COPPER_COIL = create(ItemInit.COPPER_COIL).returns(1) + .unlockedBy(ItemInit.COPPER_COIL::get) + .viaShaped(b -> b + .define('C', AllTags.commonItemTag("ingots/copper")) + .pattern("CCC") + .pattern("C C") + .pattern("CCC")), + + STARTER_CHARGE = create(ItemInit.STARTER_CHARGE).returns(1) + .unlockedBy(ItemInit.STARTER_CHARGE::get) + .viaShaped(b -> b + .define('P', Items.PAPER) + .define('G', Items.GUNPOWDER) + .pattern("PGP") + .pattern("PGP") + .pattern("PGP")), + + STURDY_PROPELLER = create(ItemInit.STURDY_PROPELLER).returns(1) + .unlockedBy(AllItems.STURDY_SHEET::get) + .viaShaped(b -> b + .define('I', Items.IRON_INGOT) + .define('S', AllItems.STURDY_SHEET) + .pattern(" S ") + .pattern("SIS") + .pattern(" S ")); + + String currentFolder = ""; + + Marker enterFolder(String folder) { + currentFolder = folder; + return new Marker(); + } + + GeneratedRecipeBuilder create(Supplier result) { + return new GeneratedRecipeBuilder(currentFolder, result); + } + + GeneratedRecipeBuilder create(ResourceLocation result) { + return new GeneratedRecipeBuilder(currentFolder, result); + } + + GeneratedRecipeBuilder create(ItemProviderEntry result) { + return create(result::get); + } + + GeneratedRecipe createSpecial(Function> builder, String recipeType, String path) { + ResourceLocation location = resource(recipeType + "/" + currentFolder + "/" + path); + return register(consumer -> { + SpecialRecipeBuilder b = SpecialRecipeBuilder.special(builder); + b.save(consumer, location.toString()); + }); + } + + GeneratedRecipe blastCrushedMetal(Supplier result, Supplier ingredient) { + return create(result::get).withSuffix("_from_crushed") + .viaCooking(ingredient) + .rewardXP(.1f) + .inBlastFurnace(); + } + + GeneratedRecipe blastModdedCrushedMetal(ItemEntry ingredient, CompatMetals metal) { + for (Mods mod : metal.getMods()) { + String metalName = metal.getName(mod); + ResourceLocation ingot = mod.ingotOf(metalName); + String modId = mod.getId(); + create(ingot).withSuffix("_compat_" + modId) + .whenModLoaded(modId) + .viaCooking(ingredient::get) + .rewardXP(.1f) + .inBlastFurnace(); + } + return null; + } + + GeneratedRecipe recycleGlass(BlockEntry ingredient) { + return create(() -> Blocks.GLASS).withSuffix("_from_" + ingredient.getId() + .getPath()) + .viaCooking(ingredient::get) + .forDuration(50) + .inFurnace(); + } + + GeneratedRecipe recycleGlassPane(BlockEntry ingredient) { + return create(() -> Blocks.GLASS_PANE).withSuffix("_from_" + ingredient.getId() + .getPath()) + .viaCooking(ingredient::get) + .forDuration(50) + .inFurnace(); + } + + GeneratedRecipe metalCompacting(List> variants, + List>> ingredients) { + GeneratedRecipe result = null; + for (int i = 0; i + 1 < variants.size(); i++) { + ItemProviderEntry currentEntry = variants.get(i); + ItemProviderEntry nextEntry = variants.get(i + 1); + Supplier> currentIngredient = ingredients.get(i); + Supplier> nextIngredient = ingredients.get(i + 1); + + result = create(nextEntry).withSuffix("_from_compacting") + .unlockedBy(currentEntry::get) + .viaShaped(b -> b.pattern("###") + .pattern("###") + .pattern("###") + .define('#', currentIngredient.get())); + + result = create(currentEntry).returns(9) + .withSuffix("_from_decompacting") + .unlockedBy(nextEntry::get) + .viaShapeless(b -> b.requires(nextIngredient.get())); + } + return result; + } + + GeneratedRecipe conversionCycle(List> cycle) { + GeneratedRecipe result = null; + for (int i = 0; i < cycle.size(); i++) { + ItemProviderEntry currentEntry = cycle.get(i); + ItemProviderEntry nextEntry = cycle.get((i + 1) % cycle.size()); + result = create(nextEntry).withSuffix("_from_conversion") + .unlockedBy(currentEntry::get) + .viaShapeless(b -> b.requires(currentEntry.get())); + } + return result; + } + + GeneratedRecipe clearData(ItemProviderEntry item) { + return create(item).withSuffix("_clear") + .unlockedBy(item::get) + .viaShapeless(b -> b.requires(item.get())); + } + + class GeneratedRecipeBuilder { + + private String path; + private String suffix; + private Supplier result; + private ResourceLocation compatDatagenOutput; + List recipeConditions; + + private Supplier unlockedBy; + private int amount; + + private GeneratedRecipeBuilder(String path) { + this.path = path; + this.recipeConditions = new ArrayList<>(); + this.suffix = ""; + this.amount = 1; + } + + public GeneratedRecipeBuilder(String path, Supplier result) { + this(path); + this.result = result; + } + + public GeneratedRecipeBuilder(String path, ResourceLocation result) { + this(path); + this.compatDatagenOutput = result; + } + + GeneratedRecipeBuilder returns(int amount) { + this.amount = amount; + return this; + } + + GeneratedRecipeBuilder unlockedBy(Supplier item) { + this.unlockedBy = () -> ItemPredicate.Builder.item() + .of(item.get()) + .build(); + return this; + } + + GeneratedRecipeBuilder unlockedByTag(Supplier> tag) { + this.unlockedBy = () -> ItemPredicate.Builder.item() + .of(tag.get()) + .build(); + return this; + } + + GeneratedRecipeBuilder whenModLoaded(String modid) { + return withCondition(new ModLoadedCondition(modid)); + } + + GeneratedRecipeBuilder whenModMissing(String modid) { + return withCondition(new NotCondition(new ModLoadedCondition(modid))); + } + + GeneratedRecipeBuilder withCondition(ICondition condition) { + recipeConditions.add(condition); + return this; + } + + GeneratedRecipeBuilder withSuffix(String suffix) { + this.suffix = suffix; + return this; + } + + GeneratedRecipe viaShaped(UnaryOperator builder) { + return register(consumer -> { + ShapedRecipeBuilder b = + builder.apply(ShapedRecipeBuilder.shaped(RecipeCategory.MISC, result.get(), amount)); + if (unlockedBy != null) + b.unlockedBy("has_item", inventoryTrigger(unlockedBy.get())); + b.save(consumer, createLocation("crafting")); + }); + } + + GeneratedRecipe viaShapeless(UnaryOperator builder) { + return register(recipeOutput -> { + ShapelessRecipeBuilder b = + builder.apply(ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, result.get(), amount)); + if (unlockedBy != null) + b.unlockedBy("has_item", inventoryTrigger(unlockedBy.get())); + + RecipeOutput conditionalOutput = recipeOutput.withConditions(recipeConditions.toArray(new ICondition[0])); + + b.save(recipeOutput, createLocation("crafting")); + }); + } + + GeneratedRecipe viaNetheriteSmithing(Supplier base, Supplier upgradeMaterial) { + return register(consumer -> { + SmithingTransformRecipeBuilder b = + SmithingTransformRecipeBuilder.smithing(Ingredient.of(Items.NETHERITE_UPGRADE_SMITHING_TEMPLATE), + Ingredient.of(base.get()), upgradeMaterial.get(), RecipeCategory.COMBAT, result.get() + .asItem()); + b.unlocks("has_item", inventoryTrigger(ItemPredicate.Builder.item() + .of(base.get()) + .build())); + b.save(consumer, createLocation("crafting")); + }); + } + + private ResourceLocation createSimpleLocation(String recipeType) { + return resource(recipeType + "/" + getRegistryName().getPath() + suffix); + } + + private ResourceLocation createLocation(String recipeType) { + return resource(recipeType + "/" + path + "/" + getRegistryName().getPath() + suffix); + } + + private ResourceLocation getRegistryName() { + return compatDatagenOutput == null ? RegisteredObjectsHelper.getKeyOrThrow(result.get() + .asItem()) : compatDatagenOutput; + } + + GeneratedCookingRecipeBuilder viaCooking(Supplier item) { + return unlockedBy(item).viaCookingIngredient(() -> Ingredient.of(item.get())); + } + + GeneratedCookingRecipeBuilder viaCookingTag(Supplier> tag) { + return unlockedByTag(tag).viaCookingIngredient(() -> Ingredient.of(tag.get())); + } + + GeneratedCookingRecipeBuilder viaCookingIngredient(Supplier ingredient) { + return new GeneratedCookingRecipeBuilder(ingredient); + } + + class GeneratedCookingRecipeBuilder { + + private Supplier ingredient; + private float exp; + private int cookingTime; + + GeneratedCookingRecipeBuilder(Supplier ingredient) { + this.ingredient = ingredient; + cookingTime = 200; + exp = 0; + } + + GeneratedCookingRecipeBuilder forDuration(int duration) { + cookingTime = duration; + return this; + } + + GeneratedCookingRecipeBuilder rewardXP(float xp) { + exp = xp; + return this; + } + + GeneratedRecipe inFurnace() { + return inFurnace(b -> b); + } + + GeneratedRecipe inFurnace(UnaryOperator builder) { + return create(RecipeSerializer.SMELTING_RECIPE, builder, SmeltingRecipe::new, 1); + } + + GeneratedRecipe inSmoker() { + return inSmoker(b -> b); + } + + GeneratedRecipe inSmoker(UnaryOperator builder) { + create(RecipeSerializer.SMELTING_RECIPE, builder, SmeltingRecipe::new, 1); + create(RecipeSerializer.CAMPFIRE_COOKING_RECIPE, builder, CampfireCookingRecipe::new, 3); + return create(RecipeSerializer.SMOKING_RECIPE, builder, SmokingRecipe::new, .5f); + } + + GeneratedRecipe inBlastFurnace() { + return inBlastFurnace(b -> b); + } + + GeneratedRecipe inBlastFurnace(UnaryOperator builder) { + create(RecipeSerializer.SMELTING_RECIPE, builder, SmeltingRecipe::new, 1); + return create(RecipeSerializer.BLASTING_RECIPE, builder, BlastingRecipe::new, .5f); + } + + private GeneratedRecipe create(RecipeSerializer serializer, + UnaryOperator builder, AbstractCookingRecipe.Factory factory, float cookingTimeModifier) { + return register(recipeOutput -> { + boolean isOtherMod = compatDatagenOutput != null; + + SimpleCookingRecipeBuilder b = builder.apply(SimpleCookingRecipeBuilder.generic(ingredient.get(), + RecipeCategory.MISC, isOtherMod ? Items.DIRT : result.get(), exp, + (int) (cookingTime * cookingTimeModifier), serializer, factory)); + if (unlockedBy != null) + b.unlockedBy("has_item", inventoryTrigger(unlockedBy.get())); + + RecipeOutput conditionalOutput = recipeOutput.withConditions(recipeConditions.toArray(new ICondition[0])); + + b.save( + isOtherMod ? new ModdedCookingRecipeOutput(conditionalOutput, compatDatagenOutput) : conditionalOutput, + createSimpleLocation(RegisteredObjectsHelper.getKeyOrThrow(serializer).getPath()) + ); + }); + } + } + } + + public String getthisName() { + return "CreatingSpace Standard Recipes"; + } + + public CSStandardRecipeGen(PackOutput output, CompletableFuture registries) { + super(output, registries); + } + } + + @ParametersAreNonnullByDefault + @MethodsReturnNonnullByDefault + class ModdedCookingRecipeOutputShim implements Recipe { + + private static final Map, Serializer> serializers = new ConcurrentHashMap<>(); + + private final Recipe wrapped; + private final ResourceLocation overrideID; + + ModdedCookingRecipeOutputShim(Recipe wrapped, ResourceLocation overrideID) { + this.wrapped = wrapped; + this.overrideID = overrideID; + } + + @Override + public boolean matches(RecipeInput recipeInput, Level level) { + throw new AssertionError("Only for datagen output"); + } + + @Override + public ItemStack assemble(RecipeInput input, HolderLookup.Provider registries) { + throw new AssertionError("Only for datagen output"); + } + + @Override + public boolean canCraftInDimensions(int pWidth, int pHeight) { + throw new AssertionError("Only for datagen output"); + } + + @Override + public ItemStack getResultItem(HolderLookup.Provider registries) { + throw new AssertionError("Only for datagen output"); + } + + @Override + public RecipeSerializer getSerializer() { + return serializers.computeIfAbsent( + getType(), + t -> Serializer.create(wrapped) + ); + } + + @Override + public RecipeType getType() { + return wrapped.getType(); + } + + private record Serializer( + MapCodec> wrappedCodec) implements RecipeSerializer { + private static Serializer create(Recipe wrapped) { + RecipeSerializer wrappedSerializer = wrapped.getSerializer(); + @SuppressWarnings("unchecked") + Serializer serializer = new Serializer((MapCodec>) wrappedSerializer.codec()); + + // Need to do some registry injection to get the Recipe/Registry#byNameCodec to encode the right type for this + // getResourceKey and getId + // byValue and toId + // Holder.Reference: key + if (BuiltInRegistries.RECIPE_SERIALIZER instanceof MappedRegistryAccessor mra) { + @SuppressWarnings("unchecked") + MappedRegistryAccessor> mra$ = (MappedRegistryAccessor>) mra; + + int wrappedId = mra$.getToId().getOrDefault(wrappedSerializer, -1); + ResourceKey> wrappedKey = mra$.getByValue().get(wrappedSerializer).key(); + + mra$.getToId().put(serializer, wrappedId); + //noinspection DataFlowIssue - it is ok to pass null as the owner, because this is only being used for serialization + mra$.getByValue().put(serializer, Holder.Reference.createStandAlone(null, wrappedKey)); + } else { + throw new AssertionError("ModdedCookingRecipeOutputShim will not be able to" + + " serialize without injecting into a registry. Expected" + + " BuiltInRegistries.RECIPE_SERIALIZER to be of class MappedRegistry, is of class " + + BuiltInRegistries.RECIPE_SERIALIZER.getClass() + ); + } + return serializer; + } + + @Override + public MapCodec codec() { + return RecordCodecBuilder.mapCodec(instance -> instance.group( + wrappedCodec.forGetter(i -> i.wrapped), + FakeItemStack.CODEC.fieldOf("result").forGetter(i -> new FakeItemStack(i.overrideID)) + ).apply(instance, (wrappedRecipe, fakeItemStack) -> { + throw new AssertionError("Only for datagen output"); + })); + } + + @Override + public StreamCodec streamCodec() { + throw new AssertionError("Only for datagen output"); + } + } + + private record FakeItemStack(ResourceLocation id) { + public static Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + ResourceLocation.CODEC.fieldOf("id").forGetter(FakeItemStack::id) + ).apply(instance, FakeItemStack::new)); + } + } + + @ParametersAreNonnullByDefault + @MethodsReturnNonnullByDefault + record ModdedCookingRecipeOutput(RecipeOutput wrapped, ResourceLocation outputOverride) implements RecipeOutput { + + @Override + public Advancement.Builder advancement() { + return wrapped.advancement(); + } + + @Override + public void accept(ResourceLocation id, Recipe recipe, @Nullable AdvancementHolder advancement, ICondition... conditions) { + wrapped.accept(id, new ModdedCookingRecipeOutputShim(recipe, outputOverride), advancement, conditions); + } + } \ No newline at end of file diff --git a/src/main/java/com/rae/creatingspace/init/TagsInit.java b/src/main/java/com/rae/creatingspace/init/TagsInit.java index 6044782e..8cbe5e1a 100644 --- a/src/main/java/com/rae/creatingspace/init/TagsInit.java +++ b/src/main/java/com/rae/creatingspace/init/TagsInit.java @@ -194,7 +194,8 @@ public enum CustomFluidTags { LIQUID_HYDROGEN(), LIQUID_OXYGEN(), METALIC_HYDROGEN(), - DISSIPATE_IN_SPACE(), LIQUID_CO2(); + DISSIPATE_IN_SPACE(), LIQUID_CO2(), + MONOPROPELLANT(); public final TagKey tag; public final boolean alwaysDatagen; diff --git a/src/main/java/com/rae/creatingspace/init/ingameobject/BlockInit.java b/src/main/java/com/rae/creatingspace/init/ingameobject/BlockInit.java index 8df50385..0f734729 100644 --- a/src/main/java/com/rae/creatingspace/init/ingameobject/BlockInit.java +++ b/src/main/java/com/rae/creatingspace/init/ingameobject/BlockInit.java @@ -29,12 +29,15 @@ import com.rae.creatingspace.content.rocket.engine.EngineItem; import com.rae.creatingspace.legacy.server.items.SmallEngineItem; +import com.simibubi.create.AllTags; import com.simibubi.create.content.decoration.encasing.CasingBlock; import com.simibubi.create.content.processing.AssemblyOperatorBlockItem; import com.simibubi.create.foundation.data.*; import com.simibubi.create.foundation.item.ItemDescription; import com.tterrag.registrate.util.entry.BlockEntry; import net.minecraft.core.registries.Registries; +import net.minecraft.data.recipes.RecipeCategory; +import net.minecraft.data.recipes.ShapedRecipeBuilder; import net.minecraft.tags.BlockTags; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.BlockBehaviour; @@ -42,10 +45,13 @@ import net.neoforged.neoforge.common.Tags; import static com.rae.creatingspace.CreatingSpace.REGISTRATE; +import static com.rae.creatingspace.CreatingSpace.resource; +import static com.simibubi.create.AllTags.commonItemTag; import static com.simibubi.create.api.behaviour.interaction.MovingInteractionBehaviour.interactionBehaviour; import static com.simibubi.create.api.behaviour.movement.MovementBehaviour.movementBehaviour; import static com.simibubi.create.foundation.data.ModelGen.customItemModel; import static com.simibubi.create.foundation.data.TagGen.*; +import static com.tterrag.registrate.providers.RegistrateRecipeProvider.has; public class BlockInit { static{ @@ -56,6 +62,7 @@ public class BlockInit { public static final BlockEntry ROCKET_ENGINEER_TABLE = REGISTRATE .block("rocket_engineer_table", RocketEngineerTableBlock::new) .properties(p -> p.strength(1.0f).noOcclusion()) + .blockstate((c, p)-> p.horizontalBlock(c.getEntry(), p.models().getExistingFile(c.getId()))) .item() .build().register(); public static final BlockEntry SMALL_ROCKET_ENGINE = REGISTRATE @@ -67,27 +74,27 @@ public class BlockInit { .blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.standardModel(c, p))) .onRegister(movementBehaviour(new EngineMovementBehaviour())) .item(SmallEngineItem::new) - .transform(customItemModel()) + .transform(customItemModel("1_2_1_block")) .register(); public static final BlockEntry ROCKET_ENGINE = REGISTRATE .block("rocket_engine", SuperEngineBlock::new) //.initialProperties(SharedProperties::copperMetal) .properties(p -> p.strength(1.0f).dynamicShape().noOcclusion()) - .transform(axeOrPickaxe()) - .blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.standardModel(c, p))) + .blockstate((c, p) -> p.horizontalBlock(c.getEntry(), p.models().getExistingFile(resource("block/small_rocket_engine")))) .onRegister(movementBehaviour(new EngineMovementBehaviour())) .item(EngineItem::new) - .transform(customItemModel()) + .transform(customItemModel("small_rocket_engine")) .register(); public static final BlockEntry BIG_ROCKET_ENGINE = REGISTRATE .block("big_rocket_engine", BigEngineBlock::new) //.initialProperties(SharedProperties::copperMetal) .properties(p-> p.strength(1.0f).dynamicShape().noOcclusion()) + .blockstate((c, p) -> p.simpleBlock(c.getEntry(), AssetLookup.standardModel(c, p))) .transform(axeOrPickaxe()) .onRegister(movementBehaviour(new EngineMovementBehaviour())) .item(BigEngineItem::new) - .transform(customItemModel()) + .transform(customItemModel("big_rocket_engine")) .register(); public static final BlockEntry BIG_ENGINE_STRUCTURAL = @@ -123,7 +130,7 @@ public class BlockInit { .block("clamps",Block::new).initialProperties(()-> Blocks.STONE) .properties(p -> p.strength(1.0f)) .item() - .transform(customItemModel()) + .transform(customItemModel("clamps")) .register(); public static final BlockEntry ROCKET_CASING = REGISTRATE .block("rocket_casing",CasingBlock::new) @@ -134,16 +141,18 @@ public class BlockInit { public static final BlockEntry ROCKET_CONTROLS = REGISTRATE.block( "rocket_controls", RocketControlsBlock::new) .initialProperties(SharedProperties::copperMetal) + .blockstate((c, p) -> p.horizontalBlock(c.getEntry(), p.models().getExistingFile(c.getId()))) .properties(p -> p.strength(1.0f).dynamicShape().noOcclusion().requiresCorrectToolForDrops()) .transform(axeOrPickaxe()) .onRegister(interactionBehaviour(new RocketControlInteraction())) .item(RocketControlsItem::new) - .transform(customItemModel()) + .transform(customItemModel("rocket_controls")) .register(); public static final BlockEntry FLIGHT_RECORDER = REGISTRATE.block( "flight_recorder", FlightRecorderBlock::new) .initialProperties(SharedProperties::copperMetal) .properties(p-> p.strength(1.0f).dynamicShape().noOcclusion().requiresCorrectToolForDrops()) + .blockstate(BlockStateGen.directionalAxisBlockProvider()) .transform(axeOrPickaxe()) .onRegister(interactionBehaviour(new FlightRecorderInteraction())) .item() @@ -155,6 +164,7 @@ public class BlockInit { "mechanical_electrolyzer", MechanicalElectrolyzerBlock::new) .initialProperties(SharedProperties::copperMetal) .properties(p -> p.strength(1.0f).noOcclusion().requiresCorrectToolForDrops()) + .blockstate(BlockStateGen.horizontalBlockProvider(true)) .transform(CSStress.setImpact(2000)) .transform(axeOrPickaxe()) .item() @@ -175,13 +185,16 @@ public class BlockInit { public static final BlockEntry OXYGEN_SEALER = REGISTRATE .block("oxygen_sealer", RoomPressuriserBlock::new) .properties(p -> p.strength(1.0f).dynamicShape().requiresCorrectToolForDrops()) + .blockstate(BlockStateGen.directionalAxisBlockProvider()) .item() - .build() + .transform(customItemModel()) + // .build() .register(); public static final BlockEntry AIR_LIQUEFIER = REGISTRATE.block( "air_liquefier", AirLiquefierBlock::new) .initialProperties(SharedProperties::copperMetal) .properties(p-> p.strength(1.0f).noOcclusion().requiresCorrectToolForDrops()) + .blockstate(BlockStateGen.directionalAxisBlockProvider()) .transform(CSStress.setImpact(500)) .transform(axeOrPickaxe()) .item() @@ -191,14 +204,17 @@ public class BlockInit { .block("flow_meter", FlowGaugeBlock::new) .initialProperties(SharedProperties::copperMetal) .properties(p -> p.strength(1.0f).noOcclusion().requiresCorrectToolForDrops()) + .blockstate((c, p) -> p.getVariantBuilder(c.get()) + .forAllStatesExcept(BlockStateGen.mapToAir(p), FlowGaugeBlock.FACING)) .transform(axeOrPickaxe()) .item() - .transform(customItemModel()) + .transform(customItemModel("flow_meter/block")) .register(); public static final BlockEntry COPPER_OXYGEN_BACKTANK = REGISTRATE .block("copper_oxygen_backtank", OxygenBacktankBlock::new) .initialProperties(SharedProperties::copperMetal) + .blockstate((c,p)-> p.horizontalBlock(c.getEntry(),p.models().getExistingFile(resource("block/oxygen_backtank/copper")))) .properties(BlockBehaviour.Properties::dynamicShape) .transform(pickaxeOnly()) .register(); @@ -206,6 +222,7 @@ public class BlockInit { public static final BlockEntry NETHERITE_OXYGEN_BACKTANK = REGISTRATE .block("netherite_oxygen_backtank", OxygenBacktankBlock::new) .initialProperties(SharedProperties::netheriteMetal) + .blockstate((c,p)-> p.horizontalBlock(c.getEntry(),p.models().getExistingFile(resource("block/oxygen_backtank/netherite")))) .properties(BlockBehaviour.Properties::dynamicShape) .transform(pickaxeOnly()) .register(); @@ -213,6 +230,7 @@ public class BlockInit { public static final BlockEntry CRYOGENIC_TANK = REGISTRATE .block("cryogenic_tank", CryogenicTankBlock::new) .initialProperties(SharedProperties::copperMetal) + .blockstate((c,p)-> p.simpleBlock(c.getEntry(), p.models().getExistingFile(resource("block/cryogenic_tank")))) .transform(pickaxeOnly()) .item(CryogenicTankItem::new) .build() @@ -226,54 +244,55 @@ public class BlockInit { .block("moon_stone",Block::new).initialProperties(()-> Blocks.STONE) .properties(p-> p.strength(1.0f).requiresCorrectToolForDrops()) .item() - .transform(customItemModel()) + .transform(customItemModel("moon_stone")) .register(); public static final BlockEntry MOON_STONE_BRICK = REGISTRATE .block("moon_stone_brick",Block::new).initialProperties(()-> Blocks.STONE) .properties(p-> p.strength(1.0f).requiresCorrectToolForDrops()) .item() - .transform(customItemModel()) + .transform(customItemModel("moon_stone_brick")) .register(); public static final BlockEntry POLISHED_MOON_STONE = REGISTRATE .block("polished_moon_stone",Block::new).initialProperties(()-> Blocks.STONE) .properties(p-> p.strength(1.0f).requiresCorrectToolForDrops()) .item() - .transform(customItemModel()) + .transform(customItemModel("polished_moon_stone")) .register(); public static final BlockEntry MOON_REGOLITH = REGISTRATE .block("moon_regolith",Block::new).initialProperties(()-> Blocks.DIRT) .properties(p-> p.strength(1.0f).sound(SoundType.SNOW)) .item() - .transform(customItemModel()) + .transform(customItemModel("moon_regolith")) .register(); public static final BlockEntry MOON_SURFACE_REGOLITH = REGISTRATE .block("moon_surface_regolith",RegolithSurfaceBlock::new).initialProperties(()-> Blocks.DIRT) .properties(p-> p.strength(1.0f).sound(SoundType.SNOW).mapColor(MapColor.SNOW)) .item() - .transform(customItemModel()) + .transform(customItemModel("moon_surface_regolith")) .register(); public static final BlockEntry MARS_STONE = REGISTRATE .block("mars_stone", Block::new).initialProperties(() -> Blocks.STONE) .properties(p -> p.strength(1.0f).requiresCorrectToolForDrops()) + .transform(pickaxeOnly()) .item() //.properties(p -> p.tab(CreativeModeTabsInit.MINERALS_TAB)) - .transform(customItemModel()) + .transform(customItemModel("mars_stone")) .register(); public static final BlockEntry MARS_REGOLITH = REGISTRATE .block("mars_regolith", Block::new).initialProperties(() -> Blocks.DIRT) .properties(p -> p.strength(1.0f).sound(SoundType.SNOW)) .item() //.properties(p -> p.tab(CreativeModeTabsInit.MINERALS_TAB)) - .transform(customItemModel()) + .transform(customItemModel("mars_regolith")) .register(); public static final BlockEntry MARS_SURFACE_REGOLITH = REGISTRATE .block("mars_surface_regolith", Block::new).initialProperties(() -> Blocks.DIRT) .properties(p -> p.strength(1.0f).sound(SoundType.SNOW)) .item() //.properties(p -> p.tab(CreativeModeTabsInit.MINERALS_TAB)) - .transform(customItemModel()) + .transform(customItemModel("mars_surface_regolith")) .register(); //ores @@ -295,8 +314,8 @@ public class BlockInit { .properties(p-> p.strength(4.0f).requiresCorrectToolForDrops()) .tag(BlockTags.NEEDS_IRON_TOOL) .transform(TagGen.pickaxeOnly()) - .item() - .transform(customItemModel()) + .transform(tagBlockAndItem("ores/nickel", "ores_in_ground/stone")) + .build() .register(); public static final BlockEntry MOON_NICKEL_ORE = REGISTRATE.block( @@ -306,19 +325,53 @@ public class BlockInit { .tag(BlockTags.NEEDS_IRON_TOOL) .transform(TagGen.pickaxeOnly()) .item() - .transform(customItemModel()) + .transform(customItemModel("moon_nickel_ore")) .register(); public static final BlockEntry RAW_NICKEL_BLOCK = REGISTRATE.block( "raw_nickel_block",Block::new) .initialProperties(()-> Blocks.STONE) .properties(p-> p.strength(1.0f).requiresCorrectToolForDrops()) - .tag(BlockTags.NEEDS_IRON_TOOL) .transform(TagGen.pickaxeOnly()) - .item() - .transform(customItemModel()) + .tag(BlockTags.NEEDS_IRON_TOOL) + .tag(Tags.Blocks.STORAGE_BLOCKS) + .recipe((c,p) -> + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, c.get(), 1) + .define('#', commonItemTag("raw_materials/nickel")) + .pattern("###") + .pattern("###") + .pattern("###") + .unlockedBy("has_" + c.getName(), has(c.get())) + .save(p, resource("crafting/" + c.getName()))) + .transform(tagBlockAndItem("storage_blocks/raw_nickel")) + .tag(Tags.Items.STORAGE_BLOCKS) + .build() + .register(); + + public static final BlockEntry NICKEL_BLOCK = REGISTRATE.block("nickel_block", Block::new) + .initialProperties(() -> Blocks.IRON_BLOCK) + .properties(p -> p.mapColor(MapColor.GLOW_LICHEN) + .requiresCorrectToolForDrops()) + .transform(pickaxeOnly()) + .tag(BlockTags.NEEDS_IRON_TOOL) + .tag(Tags.Blocks.STORAGE_BLOCKS) + .tag(BlockTags.BEACON_BASE_BLOCKS) + .recipe((c,p) -> + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, c.get(), 1) + .define('#', commonItemTag("ingots/nickel")) + .pattern("###") + .pattern("###") + .pattern("###") + .unlockedBy("has_" + c.getName(), has(c.get())) + .save(p, resource("crafting/" + c.getName()))) + .transform(tagBlockAndItem("storage_blocks/nickel")) + .tag(Tags.Items.STORAGE_BLOCKS) + .build() + //.lang("Block of Nickel") .register(); + + public static final BlockEntry MOON_COBALT_ORE = REGISTRATE.block( "moon_cobalt_ore", Block::new) .initialProperties(()-> Blocks.STONE) @@ -326,7 +379,7 @@ public class BlockInit { .tag(BlockTags.NEEDS_DIAMOND_TOOL) .transform(TagGen.pickaxeOnly()) .item() - .transform(customItemModel()) + .transform(customItemModel("moon_cobalt_ore")) .register(); public static final BlockEntry RAW_COBALT_BLOCK = REGISTRATE.block( "raw_cobalt_block",Block::new) @@ -334,8 +387,16 @@ public class BlockInit { .properties(p-> p.strength(1.0f).requiresCorrectToolForDrops()) .tag(BlockTags.NEEDS_DIAMOND_TOOL) .transform(TagGen.pickaxeOnly()) - .item() - .transform(customItemModel()) + .recipe((c,p) -> + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, c.get(), 1) + .define('#', commonItemTag("raw_materials/cobalt")) + .pattern("###") + .pattern("###") + .pattern("###") + .unlockedBy("has_" + c.getName(), has(c.get())) + .save(p, resource("crafting/" + c.getName()))) + .transform(tagBlockAndItem("storage_blocks/raw_cobalt")) + .transform(customItemModel("raw_cobalt_block")) .register(); public static final BlockEntry MOON_ALUMINUM_ORE = REGISTRATE.block( "moon_aluminum_ore", Block::new) @@ -344,7 +405,7 @@ public class BlockInit { .tag(BlockTags.NEEDS_IRON_TOOL) .transform(TagGen.pickaxeOnly()) .item() - .transform(customItemModel()) + .transform(customItemModel("moon_aluminum_ore")) .register(); public static final BlockEntry RAW_ALUMINUM_BLOCK = REGISTRATE.block( "raw_aluminum_block",Block::new) @@ -352,14 +413,169 @@ public class BlockInit { .properties(p-> p.strength(1.0f).requiresCorrectToolForDrops()) .tag(BlockTags.NEEDS_IRON_TOOL) .transform(TagGen.pickaxeOnly()) - .item() - .transform(customItemModel()) + .recipe((c,p) -> + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, c.get(), 1) + .define('#', commonItemTag("raw_materials/aluminum")) + .pattern("###") + .pattern("###") + .pattern("###") + .unlockedBy("has_" + c.getName(), has(c.get())) + .save(p, resource("crafting/" + c.getName()))) + .transform(tagBlockAndItem("storage_blocks/raw_aluminum")) + .transform(customItemModel("raw_aluminum_block")) .register(); - //machinery + public static final BlockEntry ALUMINUM_BLOCK = REGISTRATE.block("aluminum_block", Block::new) + .initialProperties(() -> Blocks.IRON_BLOCK) + .properties(p -> p.mapColor(MapColor.GLOW_LICHEN) + .requiresCorrectToolForDrops()) + .transform(pickaxeOnly()) + .tag(BlockTags.NEEDS_IRON_TOOL) + .tag(Tags.Blocks.STORAGE_BLOCKS) + .tag(BlockTags.BEACON_BASE_BLOCKS) + .recipe((c,p) -> + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, c.get(), 1) + .define('#', commonItemTag("ingots/aluminum")) + .pattern("###") + .pattern("###") + .pattern("###") + .unlockedBy("has_" + c.getName(), has(c.get())) + .save(p, resource("crafting/" + c.getName()))) + .transform(tagBlockAndItem("storage_blocks/aluminum")) + .tag(Tags.Items.STORAGE_BLOCKS) + .build() + //.lang("Block of Aluminum") + .register(); + public static final BlockEntry COBALT_BLOCK = REGISTRATE.block("cobalt_block", Block::new) + .initialProperties(() -> Blocks.IRON_BLOCK) + .properties(p -> p.mapColor(MapColor.GLOW_LICHEN) + .requiresCorrectToolForDrops()) + .transform(pickaxeOnly()) + .tag(BlockTags.NEEDS_IRON_TOOL) + .tag(Tags.Blocks.STORAGE_BLOCKS) + .tag(BlockTags.BEACON_BASE_BLOCKS) + .recipe((c,p) -> + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, c.get(), 1) + .define('#', commonItemTag("ingots/cobalt")) + .pattern("###") + .pattern("###") + .pattern("###") + .unlockedBy("has_" + c.getName(), has(c.get())) + .save(p, resource("crafting/" + c.getName()))) + .transform(tagBlockAndItem("storage_blocks/cobalt")) + .tag(Tags.Items.STORAGE_BLOCKS) + .build() + //.lang("Block of Cobalt") + .register(); + public static final BlockEntry COPRONICKEL_BLOCK = REGISTRATE.block( + "copronickel_block",Block::new) + .initialProperties(()-> Blocks.IRON_BLOCK) + .properties(p-> p.strength(1.0f).requiresCorrectToolForDrops()) + .tag(BlockTags.NEEDS_IRON_TOOL) + .transform(TagGen.pickaxeOnly()) + .tag(Tags.Blocks.STORAGE_BLOCKS) + .tag(BlockTags.BEACON_BASE_BLOCKS) + .recipe((c,p) -> + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, c.get(), 1) + .define('#', commonItemTag("ingots/copronickel")) + .pattern("###") + .pattern("###") + .pattern("###") + .unlockedBy("has_" + c.getName(), has(c.get())) + .save(p, resource("crafting/" + c.getName()))) + .transform(tagBlockAndItem("storage_blocks/copronickel")) + .tag(Tags.Items.STORAGE_BLOCKS) + .build() + //.lang("Block of Copronickel") + .register(); + public static final BlockEntry REINFORCED_COPPER_BLOCK = REGISTRATE.block( + "reinforced_copper_block",Block::new) + .initialProperties(()-> Blocks.IRON_BLOCK) + .tag(BlockTags.NEEDS_IRON_TOOL) + .transform(TagGen.pickaxeOnly()) + .tag(Tags.Blocks.STORAGE_BLOCKS) + .tag(BlockTags.BEACON_BASE_BLOCKS) + .recipe((c,p) -> + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, c.get(), 1) + .define('#', commonItemTag("ingots/reinforced_copper")) + .pattern("###") + .pattern("###") + .pattern("###") + .unlockedBy("has_" + c.getName(), has(c.get())) + .save(p, resource("crafting/" + c.getName()))) + .transform(tagBlockAndItem("storage_blocks/reinforced_copper")) + .tag(Tags.Items.STORAGE_BLOCKS) + .build() + //.lang("Block of Reinforced Copper") + .register(); + + public static final BlockEntry INCONEL_BLOCK = REGISTRATE.block( + "inconel_block",Block::new) + .initialProperties(()-> Blocks.IRON_BLOCK) + .tag(BlockTags.NEEDS_IRON_TOOL) + .transform(TagGen.pickaxeOnly()) + .tag(Tags.Blocks.STORAGE_BLOCKS) + .tag(BlockTags.BEACON_BASE_BLOCKS) + .recipe((c,p) -> + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, c.get(), 1) + .define('#', commonItemTag("ingots/inconel")) + .pattern("###") + .pattern("###") + .pattern("###") + .unlockedBy("has_" + c.getName(), has(c.get())) + .save(p, resource("crafting/" + c.getName()))) + .transform(tagBlockAndItem("storage_blocks/inconel")) + .tag(Tags.Items.STORAGE_BLOCKS) + .build() + //.lang("Block of Inconel") + .register(); + + public static final BlockEntry HASTELLOY_BLOCK = REGISTRATE.block( + "hastelloy_block",Block::new) + .initialProperties(()-> Blocks.IRON_BLOCK) + .tag(BlockTags.NEEDS_IRON_TOOL) + .transform(TagGen.pickaxeOnly()) + .tag(Tags.Blocks.STORAGE_BLOCKS) + .tag(BlockTags.BEACON_BASE_BLOCKS) + .recipe((c,p) -> + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, c.get(), 1) + .define('#', commonItemTag("ingots/hastelloy")) + .pattern("###") + .pattern("###") + .pattern("###") + .unlockedBy("has_" + c.getName(), has(c.get())) + .save(p, resource("crafting/" + c.getName()))) + .transform(tagBlockAndItem("storage_blocks/hastelloy")) + .tag(Tags.Items.STORAGE_BLOCKS) + .build() + //.lang("Block of Hastelloy") + .register(); + + public static final BlockEntry MONEL_BLOCK = REGISTRATE.block( + "monel_block",Block::new) + .initialProperties(()-> Blocks.IRON_BLOCK) + .tag(BlockTags.NEEDS_IRON_TOOL) + .transform(TagGen.pickaxeOnly()) + .tag(Tags.Blocks.STORAGE_BLOCKS) + .tag(BlockTags.BEACON_BASE_BLOCKS) + .recipe((c,p) -> + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, c.get(), 1) + .define('#', commonItemTag("ingots/monel")) + .pattern("###") + .pattern("###") + .pattern("###") + .unlockedBy("has_" + c.getName(), has(c.get())) + .save(p, resource("crafting/" + c.getName()))) + .transform(tagBlockAndItem("storage_blocks/monel")) + .tag(Tags.Items.STORAGE_BLOCKS) + .build() + //.lang("Block of Monel") + .register(); + + //machinery public static final BlockEntry CRYSTAL_BLOCK = REGISTRATE.block( diff --git a/src/main/java/com/rae/creatingspace/init/ingameobject/FluidInit.java b/src/main/java/com/rae/creatingspace/init/ingameobject/FluidInit.java index f330af31..9cc74b8f 100644 --- a/src/main/java/com/rae/creatingspace/init/ingameobject/FluidInit.java +++ b/src/main/java/com/rae/creatingspace/init/ingameobject/FluidInit.java @@ -79,6 +79,12 @@ private static FluidBuilder registrateCustomVirt .tag(TagsInit.CustomFluidTags.LIQUID_CO2.tag) .register(); + public static final FluidEntry MONOPROPELLANT = + registrateCustomVirtualLiquid("monopropellant") + .properties(p -> p.viscosity(1000).temperature(80).density(350)) + .tag(TagsInit.CustomFluidTags.MONOPROPELLANT.tag) + .register(); + /*public static final ItemEntry CREATIVE_BUCKET_CO2 = CreatingSpace.REGISTRATE.item("liquid_co2_bucket", p -> new BucketItem(LIQUID_CO2.get(), p)) diff --git a/src/main/java/com/rae/creatingspace/init/ingameobject/ItemInit.java b/src/main/java/com/rae/creatingspace/init/ingameobject/ItemInit.java index 840db125..fb331c9d 100644 --- a/src/main/java/com/rae/creatingspace/init/ingameobject/ItemInit.java +++ b/src/main/java/com/rae/creatingspace/init/ingameobject/ItemInit.java @@ -13,6 +13,9 @@ import com.simibubi.create.content.processing.sequenced.SequencedAssemblyItem; import com.simibubi.create.foundation.item.CombustibleItem; import com.tterrag.registrate.util.entry.ItemEntry; +import net.minecraft.data.recipes.RecipeCategory; +import net.minecraft.data.recipes.ShapedRecipeBuilder; +import net.minecraft.data.recipes.ShapelessRecipeBuilder; import net.minecraft.tags.ItemTags; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffects; @@ -23,7 +26,9 @@ import java.util.ArrayList; -import static com.rae.creatingspace.CreatingSpace.REGISTRATE; +import static com.rae.creatingspace.CreatingSpace.*; +import static com.simibubi.create.AllTags.commonItemTag; +import static com.tterrag.registrate.providers.RegistrateRecipeProvider.has; public class ItemInit { @@ -34,8 +39,8 @@ public class ItemInit { public static final ArrayList> AEROSPIKE_PLUG = smartRegisterSequencedItem("aerospike_plug"); public static final ArrayList> BELL_NOZZLE = smartRegisterSequencedItem("bell_nozzle"); - public static final ArrayList> POWER_PACK = smartRegisterSequencedItem("power_pack"); - public static final ArrayList> EXHAUST_PACK= smartRegisterSequencedItem("exhaust_pack"); + public static final ArrayList> POWER_PACK = smartRegisterSequenced3DItem("power_pack"); + public static final ArrayList> EXHAUST_PACK= smartRegisterSequenced3DItem("exhaust_pack"); public static final ArrayList> COMBUSTION_CHAMBER = smartRegisterSequencedItem("combustion_chamber"); public static final ArrayList> ENGINE_INGREDIENTS = EngineMaterialInit.collectMaterials(); public static final ArrayList> METALS_INGREDIENTS = EngineMaterialInit.collectMetals(); @@ -59,6 +64,14 @@ public static ArrayList> registerEngineIngredientForMa collector.add(REGISTRATE.item( name + "_rib", Item::new) .defaultModel() + .recipe((c,p) -> + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, c.get(), 1) + .define('N', commonItemTag("nuggets/" + name)) + .define('I', commonItemTag("ingots/" + name)) + .pattern("NIN") + .pattern(" N ") + .unlockedBy("has_" + c.getName(), has(c.get())) + .save(p, resource("crafting/" + name + "_rib"))) .register()); /*collector.add(CreatingSpace.REGISTRATE.item( name + "_canal", Item::new) @@ -77,18 +90,38 @@ public static ArrayList> registerEngineIngredientForMa public static ArrayList> registerMetalVariants(String name) { ArrayList> collector = new ArrayList<>(); - collector.add(REGISTRATE.item( - name + "_ingot", Item::new) + collector.add(REGISTRATE.item(name + "_ingot", Item::new) .defaultModel() //.properties(p -> p.tab(CreativeModeTabsInit.COMPONENT_TAB)) + .recipe((c,p) -> { + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, c.get(), 1) + .define('#', commonItemTag("nuggets/" + name)) + .pattern("###") + .pattern("###") + .pattern("###") + .unlockedBy("has_" + c.getName(), has(c.get())) + .save(p, resource("crafting/" + name + "_ingot_from_nuggets")); + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, c.get(), 9) + .requires(commonItemTag("storage_blocks/" + name)) + .unlockedBy("has_" + c.getName(), has(c.get())) + .save(p, resource("crafting/" + name + "_ingot_from_block")); + }) + .tag(commonItemTag("ingots/"+ name), commonItemTag("ingots")) .register()); collector.add(REGISTRATE.item( name + "_sheet", Item::new) + .tag(commonItemTag("plates/" + name), commonItemTag("plates")) .defaultModel() //.properties(p -> p.tab(CreativeModeTabsInit.COMPONENT_TAB)) .register()); collector.add(REGISTRATE.item( name + "_nugget", Item::new) + .recipe((c,p) -> + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, c.get(), 9) + .requires(commonItemTag("ingots/" + name)) + .unlockedBy("has_" + c.getName(), has(c.get())) + .save(p, resource("crafting/" + name + "_nuggets_from_ingot"))) + .tag(commonItemTag("nuggets/"+ name), commonItemTag("nuggets")) .defaultModel() //.properties(p -> p.tab(CreativeModeTabsInit.COMPONENT_TAB)) .register()); @@ -100,26 +133,56 @@ private static ArrayList> smartRegisterSequencedItem(S collector.add(REGISTRATE.item( name, Item::new) //.properties(p -> p.tab(CreativeModeTabsInit.COMPONENT_TAB)) + .defaultModel() .register()); registerSequencedItem("incomplete_" + name); // we don't put the incomplete version in the creative tab System.out.println(collector); return collector; } + private static ArrayList> smartRegisterSequenced3DItem(String name) { + ArrayList> collector = new ArrayList<>(); + collector.add(REGISTRATE.item( + name, Item::new) + //.properties(p -> p.tab(CreativeModeTabsInit.COMPONENT_TAB)) + .model((c,p) -> p.withExistingParent(name, + MODID + ":item/3d_items")) + .register()); + // registerSequencedItem("incomplete_" + name); // we don't put the incomplete version in the creative tab + System.out.println(collector); + return collector; + } + private static ItemEntry registerSequencedItem(String name) { return REGISTRATE.item( name, SequencedAssemblyItem::new) + .model((c, p) -> p.withExistingParent(name, + "item/generated").texture("layer0", + resource("item/transition_item/" + name.substring(11)))) .register(); } - public static final ItemEntry INCOMPLETE_ENGINE = registerSequencedItem("incomplete_rocket_engine"); + private static ItemEntry registerSequencedEngineItem(String name) { + return REGISTRATE.item( + name, SequencedAssemblyItem::new) + .model((c, p) -> p.withExistingParent(name, + resource("block/1_2_1_block"))) + .register(); + } + + public static final ItemEntry INCOMPLETE_ENGINE = registerSequencedEngineItem("incomplete_rocket_engine"); public static final ItemEntry DESIGN_BLUEPRINT = REGISTRATE.item("design_blueprint", DesignBlueprintItem::new) //.properties(p -> p.tab(CreativeModeTabsInit.COMPONENT_TAB)) + .model((c, p) -> p.withExistingParent("design_blueprint", + "item/generated").texture("layer0", + resource("item/engine_blueprint"))) .register(); + public static final ItemEntry ENGINE_BLUEPRINT = REGISTRATE.item("engine_blueprint", EngineFabricationBlueprint::new) //.properties(p -> p.tab(CreativeModeTabsInit.COMPONENT_TAB)) + .defaultModel() .register(); public static final ItemEntry BASIC_SPACESUIT_FABRIC = REGISTRATE.item( @@ -172,97 +235,186 @@ private static ItemEntry registerSequencedItem(String nam //nickel public static final ItemEntry RAW_NICKEL = REGISTRATE.item( "raw_nickel",Item::new) + .recipe((c,p) -> + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, c.get(), 9) + .requires(commonItemTag("storage_blocks/raw_nickel")) + .unlockedBy("has_" + c.getName(), has(c.get())) + .save(p, resource("crafting/" + c.getName() + "_from_block"))) + .tag(commonItemTag("raw_materials/nickel"), commonItemTag("raw_materials"),commonItemTag("ores/nickel")) .register(); - /*public static final ItemEntry CRUSHED_NICKEL_ORE = CreatingSpace.REGISTRATE.item( + public static final ItemEntry CRUSHED_NICKEL_ORE = CreatingSpace.REGISTRATE.item( "crushed_nickel_ore",Item::new) - .register();*/ + .tag(commonItemTag("crushed_raw_nickel"), commonItemTag("crushed_raw_materials")) + .register(); public static final ItemEntry NICKEL_DUST = REGISTRATE.item( "nickel_dust",Item::new) + .tag(commonItemTag("dusts/nickel"), commonItemTag("dusts")) .register(); public static final ItemEntry NICKEL_INGOT = REGISTRATE.item( "nickel_ingot",Item::new) + .recipe((c,p) -> { + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, c.get(), 1) + .define('#', commonItemTag("nuggets/nickel")) + .pattern("###") + .pattern("###") + .pattern("###") + .unlockedBy("has_" + c.getName(), has(c.get())) + .save(p, resource("crafting/" + c.getName() + "_from_nuggets")); + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, c.get(), 9) + .requires(commonItemTag("storage_blocks/nickel")) + .unlockedBy("has_" + c.getName(), has(c.get())) + .save(p, resource("crafting/" + c.getName() + "_from_block")); + }) + .tag(commonItemTag("ingots/nickel"), commonItemTag("ingots")) .register(); public static final ItemEntry NICKEL_NUGGET = REGISTRATE.item( "nickel_nugget",Item::new) + .recipe((c,p) -> + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, c.get(), 9) + .requires(commonItemTag("ingots/nickel")) + .unlockedBy("has_" + c.getName(), has(c.get())) + .save(p, resource("crafting/" + c.getName()))) + .tag(commonItemTag("nuggets/nickel"), commonItemTag("nuggets")) .register(); public static final ItemEntry NICKEL_SHEET = REGISTRATE.item( "nickel_sheet",Item::new) + .tag(commonItemTag("plates/nickel"), commonItemTag("plates")) .register(); //aluminium public static final ItemEntry RAW_ALUMINUM = REGISTRATE.item( "raw_aluminum",Item::new) + .recipe((c,p) -> + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, c.get(), 9) + .requires(commonItemTag("storage_blocks/raw_aluminum")) + .unlockedBy("has_" + c.getName(), has(c.get())) + .save(p, resource("crafting/" + c.getName() + "_from_block"))) + .tag(commonItemTag("raw_materials/aluminum"), commonItemTag("raw_materials")) .register(); - /*public static final ItemEntry CRUSHED_ALUMINUM_ORE = CreatingSpace.REGISTRATE.item( + public static final ItemEntry CRUSHED_ALUMINUM_ORE = CreatingSpace.REGISTRATE.item( "crushed_aluminum_ore",Item::new) - .register();*/ + .tag(commonItemTag("crushed_raw_aluminum"), commonItemTag("crushed_raw_materials"), commonItemTag("ores/aluminum")) + .register(); public static final ItemEntry ALUMINUM_INGOT = REGISTRATE.item( "aluminum_ingot",Item::new) + .recipe((c,p) -> { + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, c.get(), 1) + .define('#', commonItemTag("nuggets/aluminum")) + .pattern("###") + .pattern("###") + .pattern("###") + .unlockedBy("has_" + c.getName(), has(c.get())) + .save(p, resource("crafting/" + c.getName() + "_from_nuggets")); + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, c.get(), 9) + .requires(commonItemTag("storage_blocks/aluminum")) + .unlockedBy("has_" + c.getName(), has(c.get())) + .save(p, resource("crafting/" + c.getName() + "_from_block")); + }) + .tag(commonItemTag("ingots/aluminum"), commonItemTag("ingots")) .register(); public static final ItemEntry ALUMINUM_NUGGET = REGISTRATE.item( "aluminum_nugget",Item::new) + .recipe((c,p) -> + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, c.get(), 9) + .requires(commonItemTag("ingots/aluminum")) + .unlockedBy("has_" + c.getName(), has(c.get())) + .save(p, resource("crafting/" + c.getName()))) + .tag(commonItemTag("nuggets/aluminum"), commonItemTag("nuggets")) .register(); public static final ItemEntry ALUMINUM_SHEET = REGISTRATE.item( "aluminum_sheet",Item::new) + .tag(commonItemTag("plates/aluminum"), commonItemTag("plates")) .register(); //cobalt public static final ItemEntry RAW_COBALT = REGISTRATE.item( "raw_cobalt",Item::new) + .recipe((c,p) -> + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, c.get(), 9) + .requires(commonItemTag("storage_blocks/raw_cobalt")) + .unlockedBy("has_" + c.getName(), has(c.get())) + .save(p, resource("crafting/" + c.getName() + "_from_block"))) + .tag(commonItemTag("raw_materials/cobalt"), commonItemTag("raw_materials")) .register(); public static final ItemEntry CRUSHED_COBALT_ORE = REGISTRATE.item( "crushed_cobalt_ore",Item::new) + .tag(commonItemTag("crushed_raw_cobalt"), commonItemTag("crushed_raw_materials"), commonItemTag("ores/cobalt")) .register(); public static final ItemEntry COBALT_INGOT = REGISTRATE.item( "cobalt_ingot",Item::new) + .recipe((c,p) -> { + ShapedRecipeBuilder.shaped(RecipeCategory.MISC, c.get(), 1) + .define('#', commonItemTag("nuggets/cobalt")) + .pattern("###") + .pattern("###") + .pattern("###") + .unlockedBy("has_" + c.getName(), has(c.get())) + .save(p, resource("crafting/" + c.getName() + "_from_nuggets")); + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, c.get(), 9) + .requires(commonItemTag("storage_blocks/cobalt")) + .unlockedBy("has_" + c.getName(), has(c.get())) + .save(p, resource("crafting/" + c.getName() + "_from_block")); + }) + .tag(commonItemTag("ingots/cobalt"), commonItemTag("ingots")) .register(); public static final ItemEntry COBALT_NUGGET = REGISTRATE.item( "cobalt_nugget",Item::new) + .recipe((c,p) -> + ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, c.get(), 9) + .requires(commonItemTag("ingots/cobalt")) + .unlockedBy("has_" + c.getName(), has(c.get())) + .save(p, resource("crafting/" + c.getName()))) + .tag(commonItemTag("nuggets/cobalt"), commonItemTag("nuggets")) .register(); public static final ItemEntry COBALT_SHEET = REGISTRATE.item( "cobalt_sheet",Item::new) + .tag(commonItemTag("plates/cobalt"), commonItemTag("plates")) .register(); public static final ItemEntry COPPER_BACKTANK_PLACEABLE = REGISTRATE .item("copper_oxygen_backtank_placeable", p -> new OxygenBacktankItem.O2BacktankBlockItem(BlockInit.COPPER_OXYGEN_BACKTANK.get(), ItemInit.COPPER_OXYGEN_BACKTANK::get, p)) + .model((c,p) -> p.withExistingParent("copper_oxygen_backtank", + "minecraft:item/barrier")) .register(); public static final ItemEntry COPPER_OXYGEN_BACKTANK = REGISTRATE .item("copper_oxygen_backtank", p -> new OxygenBacktankItem.Layered(AllArmorMaterials.COPPER, p, CreatingSpace.resource("basic_spacesuit"), COPPER_BACKTANK_PLACEABLE)) + .model((c,p) -> p.withExistingParent("copper_oxygen_backtank_placeable", + MODID + ":block/oxygen_backtank/copper")) .tag(TagsInit.CustomItemTags.OXYGEN_SOURCES.tag) .tag(ItemTags.CHEST_ARMOR) .register(); @@ -271,12 +423,16 @@ private static ItemEntry registerSequencedItem(String nam REGISTRATE .item("netherite_oxygen_backtank_placeable", p -> new OxygenBacktankItem.O2BacktankBlockItem(BlockInit.NETHERITE_OXYGEN_BACKTANK.get(), ItemInit.NETHERITE_OXYGEN_BACKTANK::get, p)) + .model((c,p) -> p.withExistingParent("netherite_oxygen_backtank_placeable", + "minecraft:item/barrier")) .register(); public static final ItemEntry NETHERITE_OXYGEN_BACKTANK = REGISTRATE .item("netherite_oxygen_backtank", p -> new OxygenBacktankItem.Layered(ArmorMaterials.NETHERITE, p, CreatingSpace.resource("advanced_spacesuit"), NETHERITE_BACKTANK_PLACEABLE)) + .model((c,p) -> p.withExistingParent("copper_oxygen_netherite", + MODID + ":block/oxygen_backtank/netherite")) .tag(TagsInit.CustomItemTags.OXYGEN_SOURCES.tag) .tag(ItemTags.CHEST_ARMOR) .register(); diff --git a/src/main/resources/assets/creatingspace/blockstates/raw_aluminum_block.json b/src/main/resources/assets/creatingspace/blockstates/raw_aluminum_block-old.json similarity index 100% rename from src/main/resources/assets/creatingspace/blockstates/raw_aluminum_block.json rename to src/main/resources/assets/creatingspace/blockstates/raw_aluminum_block-old.json diff --git a/src/main/resources/assets/creatingspace/models/item/incomplete_aerospike_plug.json b/src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_aerospike_plug.json similarity index 100% rename from src/main/resources/assets/creatingspace/models/item/incomplete_aerospike_plug.json rename to src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_aerospike_plug.json diff --git a/src/main/resources/assets/creatingspace/models/item/incomplete_andesite_injector.json b/src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_andesite_injector.json similarity index 100% rename from src/main/resources/assets/creatingspace/models/item/incomplete_andesite_injector.json rename to src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_andesite_injector.json diff --git a/src/main/resources/assets/creatingspace/models/item/incomplete_andesite_injector_grid.json b/src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_andesite_injector_grid.json similarity index 100% rename from src/main/resources/assets/creatingspace/models/item/incomplete_andesite_injector_grid.json rename to src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_andesite_injector_grid.json diff --git a/src/main/resources/assets/creatingspace/models/item/incomplete_andesite_turbine.json b/src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_andesite_turbine.json similarity index 100% rename from src/main/resources/assets/creatingspace/models/item/incomplete_andesite_turbine.json rename to src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_andesite_turbine.json diff --git a/src/main/resources/assets/creatingspace/models/item/incomplete_bell_nozzle.json b/src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_bell_nozzle.json similarity index 100% rename from src/main/resources/assets/creatingspace/models/item/incomplete_bell_nozzle.json rename to src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_bell_nozzle.json diff --git a/src/main/resources/assets/creatingspace/models/item/incomplete_brass_injector.json b/src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_brass_injector.json similarity index 100% rename from src/main/resources/assets/creatingspace/models/item/incomplete_brass_injector.json rename to src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_brass_injector.json diff --git a/src/main/resources/assets/creatingspace/models/item/incomplete_brass_injector_grid.json b/src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_brass_injector_grid.json similarity index 100% rename from src/main/resources/assets/creatingspace/models/item/incomplete_brass_injector_grid.json rename to src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_brass_injector_grid.json diff --git a/src/main/resources/assets/creatingspace/models/item/incomplete_brass_turbine.json b/src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_brass_turbine.json similarity index 100% rename from src/main/resources/assets/creatingspace/models/item/incomplete_brass_turbine.json rename to src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_brass_turbine.json diff --git a/src/main/resources/assets/creatingspace/models/item/incomplete_combustion_chamber.json b/src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_combustion_chamber.json similarity index 100% rename from src/main/resources/assets/creatingspace/models/item/incomplete_combustion_chamber.json rename to src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_combustion_chamber.json diff --git a/src/main/resources/assets/creatingspace/models/item/incomplete_copper_injector.json b/src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_copper_injector.json similarity index 100% rename from src/main/resources/assets/creatingspace/models/item/incomplete_copper_injector.json rename to src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_copper_injector.json diff --git a/src/main/resources/assets/creatingspace/models/item/incomplete_copper_injector_grid.json b/src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_copper_injector_grid.json similarity index 100% rename from src/main/resources/assets/creatingspace/models/item/incomplete_copper_injector_grid.json rename to src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_copper_injector_grid.json diff --git a/src/main/resources/assets/creatingspace/models/item/incomplete_copper_turbine.json b/src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_copper_turbine.json similarity index 100% rename from src/main/resources/assets/creatingspace/models/item/incomplete_copper_turbine.json rename to src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_copper_turbine.json diff --git a/src/main/resources/assets/creatingspace/models/item/incomplete_copronickel_injector.json b/src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_copronickel_injector.json similarity index 100% rename from src/main/resources/assets/creatingspace/models/item/incomplete_copronickel_injector.json rename to src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_copronickel_injector.json diff --git a/src/main/resources/assets/creatingspace/models/item/incomplete_copronickel_injector_grid.json b/src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_copronickel_injector_grid.json similarity index 100% rename from src/main/resources/assets/creatingspace/models/item/incomplete_copronickel_injector_grid.json rename to src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_copronickel_injector_grid.json diff --git a/src/main/resources/assets/creatingspace/models/item/incomplete_copronickel_turbine.json b/src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_copronickel_turbine.json similarity index 100% rename from src/main/resources/assets/creatingspace/models/item/incomplete_copronickel_turbine.json rename to src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_copronickel_turbine.json diff --git a/src/main/resources/assets/creatingspace/models/item/incomplete_exhaust_pack.json b/src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_exhaust_pack.json similarity index 100% rename from src/main/resources/assets/creatingspace/models/item/incomplete_exhaust_pack.json rename to src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_exhaust_pack.json diff --git a/src/main/resources/assets/creatingspace/models/item/incomplete_hastelloy_injector.json b/src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_hastelloy_injector.json similarity index 100% rename from src/main/resources/assets/creatingspace/models/item/incomplete_hastelloy_injector.json rename to src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_hastelloy_injector.json diff --git a/src/main/resources/assets/creatingspace/models/item/incomplete_hastelloy_injector_grid.json b/src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_hastelloy_injector_grid.json similarity index 100% rename from src/main/resources/assets/creatingspace/models/item/incomplete_hastelloy_injector_grid.json rename to src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_hastelloy_injector_grid.json diff --git a/src/main/resources/assets/creatingspace/models/item/incomplete_hastelloy_turbine.json b/src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_hastelloy_turbine.json similarity index 100% rename from src/main/resources/assets/creatingspace/models/item/incomplete_hastelloy_turbine.json rename to src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_hastelloy_turbine.json diff --git a/src/main/resources/assets/creatingspace/models/item/incomplete_inconel_injector.json b/src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_inconel_injector.json similarity index 100% rename from src/main/resources/assets/creatingspace/models/item/incomplete_inconel_injector.json rename to src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_inconel_injector.json diff --git a/src/main/resources/assets/creatingspace/models/item/incomplete_inconel_injector_grid.json b/src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_inconel_injector_grid.json similarity index 100% rename from src/main/resources/assets/creatingspace/models/item/incomplete_inconel_injector_grid.json rename to src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_inconel_injector_grid.json diff --git a/src/main/resources/assets/creatingspace/models/item/incomplete_inconel_turbine.json b/src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_inconel_turbine.json similarity index 100% rename from src/main/resources/assets/creatingspace/models/item/incomplete_inconel_turbine.json rename to src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_inconel_turbine.json diff --git a/src/main/resources/assets/creatingspace/models/item/incomplete_injector_grid.json b/src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_injector_grid.json similarity index 100% rename from src/main/resources/assets/creatingspace/models/item/incomplete_injector_grid.json rename to src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_injector_grid.json diff --git a/src/main/resources/assets/creatingspace/models/item/incomplete_iron_injector.json b/src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_iron_injector.json similarity index 100% rename from src/main/resources/assets/creatingspace/models/item/incomplete_iron_injector.json rename to src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_iron_injector.json diff --git a/src/main/resources/assets/creatingspace/models/item/incomplete_iron_injector_grid.json b/src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_iron_injector_grid.json similarity index 100% rename from src/main/resources/assets/creatingspace/models/item/incomplete_iron_injector_grid.json rename to src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_iron_injector_grid.json diff --git a/src/main/resources/assets/creatingspace/models/item/incomplete_iron_turbine.json b/src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_iron_turbine.json similarity index 100% rename from src/main/resources/assets/creatingspace/models/item/incomplete_iron_turbine.json rename to src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_iron_turbine.json diff --git a/src/main/resources/assets/creatingspace/models/item/incomplete_monel_injector.json b/src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_monel_injector.json similarity index 100% rename from src/main/resources/assets/creatingspace/models/item/incomplete_monel_injector.json rename to src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_monel_injector.json diff --git a/src/main/resources/assets/creatingspace/models/item/incomplete_monel_injector_grid.json b/src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_monel_injector_grid.json similarity index 100% rename from src/main/resources/assets/creatingspace/models/item/incomplete_monel_injector_grid.json rename to src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_monel_injector_grid.json diff --git a/src/main/resources/assets/creatingspace/models/item/incomplete_monel_turbine.json b/src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_monel_turbine.json similarity index 100% rename from src/main/resources/assets/creatingspace/models/item/incomplete_monel_turbine.json rename to src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_monel_turbine.json diff --git a/src/main/resources/assets/creatingspace/models/item/incomplete_power_pack.json b/src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_power_pack.json similarity index 100% rename from src/main/resources/assets/creatingspace/models/item/incomplete_power_pack.json rename to src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_power_pack.json diff --git a/src/main/resources/assets/creatingspace/models/item/incomplete_reinforced_copper_injector.json b/src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_reinforced_copper_injector.json similarity index 100% rename from src/main/resources/assets/creatingspace/models/item/incomplete_reinforced_copper_injector.json rename to src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_reinforced_copper_injector.json diff --git a/src/main/resources/assets/creatingspace/models/item/incomplete_reinforced_copper_injector_grid.json b/src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_reinforced_copper_injector_grid.json similarity index 100% rename from src/main/resources/assets/creatingspace/models/item/incomplete_reinforced_copper_injector_grid.json rename to src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_reinforced_copper_injector_grid.json diff --git a/src/main/resources/assets/creatingspace/models/item/incomplete_reinforced_copper_turbine.json b/src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_reinforced_copper_turbine.json similarity index 100% rename from src/main/resources/assets/creatingspace/models/item/incomplete_reinforced_copper_turbine.json rename to src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_reinforced_copper_turbine.json diff --git a/src/main/resources/assets/creatingspace/models/item/incomplete_rocket_engine.json b/src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_rocket_engine.json similarity index 100% rename from src/main/resources/assets/creatingspace/models/item/incomplete_rocket_engine.json rename to src/main/resources/assets/creatingspace/models/item/transition_item/incomplete_rocket_engine.json diff --git a/src/main/resources/assets/creatingspace/textures/block/aluminum_block.png b/src/main/resources/assets/creatingspace/textures/block/aluminum_block.png new file mode 100644 index 00000000..3c42a2e2 Binary files /dev/null and b/src/main/resources/assets/creatingspace/textures/block/aluminum_block.png differ diff --git a/src/main/resources/assets/creatingspace/textures/block/cobalt_block.png b/src/main/resources/assets/creatingspace/textures/block/cobalt_block.png new file mode 100644 index 00000000..217ac818 Binary files /dev/null and b/src/main/resources/assets/creatingspace/textures/block/cobalt_block.png differ diff --git a/src/main/resources/assets/creatingspace/textures/block/hastelloy_block.png b/src/main/resources/assets/creatingspace/textures/block/hastelloy_block.png new file mode 100644 index 00000000..d803aed8 Binary files /dev/null and b/src/main/resources/assets/creatingspace/textures/block/hastelloy_block.png differ diff --git a/src/main/resources/assets/creatingspace/textures/block/nickel_block.png b/src/main/resources/assets/creatingspace/textures/block/nickel_block.png new file mode 100644 index 00000000..07ef0c0d Binary files /dev/null and b/src/main/resources/assets/creatingspace/textures/block/nickel_block.png differ diff --git a/src/main/resources/assets/creatingspace/textures/block/reinforced_copper_block.png b/src/main/resources/assets/creatingspace/textures/block/reinforced_copper_block.png new file mode 100644 index 00000000..5374da6e Binary files /dev/null and b/src/main/resources/assets/creatingspace/textures/block/reinforced_copper_block.png differ diff --git a/src/main/resources/assets/creatingspace/textures/item/aluminum_block.png b/src/main/resources/assets/creatingspace/textures/item/aluminum_block.png new file mode 100644 index 00000000..3c42a2e2 Binary files /dev/null and b/src/main/resources/assets/creatingspace/textures/item/aluminum_block.png differ diff --git a/src/main/resources/assets/creatingspace/textures/item/cobalt_block.png b/src/main/resources/assets/creatingspace/textures/item/cobalt_block.png new file mode 100644 index 00000000..217ac818 Binary files /dev/null and b/src/main/resources/assets/creatingspace/textures/item/cobalt_block.png differ diff --git a/src/main/resources/assets/creatingspace/textures/item/copronickel_block.png b/src/main/resources/assets/creatingspace/textures/item/copronickel_block.png new file mode 100644 index 00000000..ed9d0d0b Binary files /dev/null and b/src/main/resources/assets/creatingspace/textures/item/copronickel_block.png differ diff --git a/src/main/resources/assets/creatingspace/textures/item/hastelloy_block.png b/src/main/resources/assets/creatingspace/textures/item/hastelloy_block.png new file mode 100644 index 00000000..d803aed8 Binary files /dev/null and b/src/main/resources/assets/creatingspace/textures/item/hastelloy_block.png differ diff --git a/src/main/resources/assets/creatingspace/textures/item/inconel_block.png b/src/main/resources/assets/creatingspace/textures/item/inconel_block.png new file mode 100644 index 00000000..67e36c93 Binary files /dev/null and b/src/main/resources/assets/creatingspace/textures/item/inconel_block.png differ diff --git a/src/main/resources/assets/creatingspace/textures/item/nickel_block.png b/src/main/resources/assets/creatingspace/textures/item/nickel_block.png new file mode 100644 index 00000000..07ef0c0d Binary files /dev/null and b/src/main/resources/assets/creatingspace/textures/item/nickel_block.png differ diff --git a/src/main/resources/assets/creatingspace/textures/item/reinforced_copper_block.png b/src/main/resources/assets/creatingspace/textures/item/reinforced_copper_block.png new file mode 100644 index 00000000..5374da6e Binary files /dev/null and b/src/main/resources/assets/creatingspace/textures/item/reinforced_copper_block.png differ