From 087cbc91982c3641af7c957c086b66ec48b2568e Mon Sep 17 00:00:00 2001 From: Ghostipedia Date: Fri, 19 Sep 2025 20:30:55 -0400 Subject: [PATCH 01/17] Init Port of the Old PR --- dependencies.gradle | 5 + gradle/forge.versions.toml | 4 + gradle/scripts/repositories.gradle | 4 + .../assets/cosmiccore/lang/en_ud.json | 2 +- .../assets/cosmiccore/lang/en_us.json | 2 +- .../tool_definitions/wire_cutter.json | 46 ++++++++ .../forge/tags/items/tools/wire_cutters.json | 5 + .../items/tools/crafting_wire_cutters.json | 5 + .../tags/items/cluster_max_harvestables.json | 5 + .../tconstruct/tags/items/modifiable/aoe.json | 5 + .../tags/items/modifiable/bonus_slots.json | 5 + .../tags/items/modifiable/durability.json | 5 + .../items/modifiable/harvest/primary.json | 5 + .../items/modifiable/interactable/right.json | 5 + .../tags/items/modifiable/melee/weapon.json | 5 + .../tags/items/modifiable/multipart.json | 5 + .../tags/items/modifiable/small.json | 5 + .../ghostipedia/cosmiccore/CosmicCore.java | 26 ++++- .../cosmiccore/CosmicCoreGTAddon.java | 2 + .../recipe/ingredient/TinkerIngredient.java | 109 ++++++++++++++++++ .../common/data/CosmicCreativeModeTabs.java | 10 ++ .../common/data/recipe/TinkersRecipeTest.java | 23 ++++ .../item/tcon/CosmicCreativeTinkersTab.java | 28 +++++ .../item/tcon/CosmicTconBlockTagProvider.java | 22 ++++ .../item/tcon/CosmicTconItemTagProvider.java | 49 ++++++++ .../common/item/tcon/CosmicTinkerTools.java | 27 +++++ .../item/tcon/CosmicToolDefinitions.java | 17 +++ .../item/tcon/CosmicToolDefitionProvider.java | 57 +++++++++ .../mixin/tinkers/ModifiableItemMixin.java | 38 ++++++ src/main/resources/cosmiccore.mixins.json | 3 +- src/main/templates/META-INF/mods.toml | 10 +- 31 files changed, 534 insertions(+), 5 deletions(-) create mode 100644 src/generated/resources/data/cosmiccore/tinkering/tool_definitions/wire_cutter.json create mode 100644 src/generated/resources/data/forge/tags/items/tools/wire_cutters.json create mode 100644 src/generated/resources/data/gtceu/tags/items/tools/crafting_wire_cutters.json create mode 100644 src/generated/resources/data/minecraft/tags/items/cluster_max_harvestables.json create mode 100644 src/generated/resources/data/tconstruct/tags/items/modifiable/aoe.json create mode 100644 src/generated/resources/data/tconstruct/tags/items/modifiable/bonus_slots.json create mode 100644 src/generated/resources/data/tconstruct/tags/items/modifiable/durability.json create mode 100644 src/generated/resources/data/tconstruct/tags/items/modifiable/harvest/primary.json create mode 100644 src/generated/resources/data/tconstruct/tags/items/modifiable/interactable/right.json create mode 100644 src/generated/resources/data/tconstruct/tags/items/modifiable/melee/weapon.json create mode 100644 src/generated/resources/data/tconstruct/tags/items/modifiable/multipart.json create mode 100644 src/generated/resources/data/tconstruct/tags/items/modifiable/small.json create mode 100644 src/main/java/com/ghostipedia/cosmiccore/api/recipe/ingredient/TinkerIngredient.java create mode 100644 src/main/java/com/ghostipedia/cosmiccore/common/data/recipe/TinkersRecipeTest.java create mode 100644 src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicCreativeTinkersTab.java create mode 100644 src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTconBlockTagProvider.java create mode 100644 src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTconItemTagProvider.java create mode 100644 src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerTools.java create mode 100644 src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitions.java create mode 100644 src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefitionProvider.java create mode 100644 src/main/java/com/ghostipedia/cosmiccore/mixin/tinkers/ModifiableItemMixin.java diff --git a/dependencies.gradle b/dependencies.gradle index b3bf01c1c..cd49c685d 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -8,6 +8,11 @@ dependencies { // implementation(forge.botania) + //Tinkers + modImplementation(forge.tconstruct) + modImplementation(forge.mantle) + + // LDLib modImplementation(forge.ldlib) diff --git a/gradle/forge.versions.toml b/gradle/forge.versions.toml index be2446bcd..02288e13a 100644 --- a/gradle/forge.versions.toml +++ b/gradle/forge.versions.toml @@ -51,12 +51,16 @@ modernFix = "6025611" botania = "6366547" ae2wtlib = "5217955" clothConfig = "5729105" +tconstruct = "1.20.1-3.9.2.37" +mantle = "1.20.1-1.11.44" malum = "1.20.1-1.6.7.1" lodestone = "1.20.1-1.6.4.1.256" [libraries] +tconstruct = { module = "slimeknights.tconstruct:TConstruct", version.ref = "tconstruct" } +mantle = { module = "slimeknights.mantle:Mantle", version.ref = "mantle" } ldlib = { module = "com.lowdragmc.ldlib:ldlib-forge-1.20.1", version.ref = "ldlib" } gtceu = { module = "com.gregtechceu.gtceu:gtceu-1.20.1", version.ref = "gtceu" } diff --git a/gradle/scripts/repositories.gradle b/gradle/scripts/repositories.gradle index 00ac2cdc6..18b515197 100644 --- a/gradle/scripts/repositories.gradle +++ b/gradle/scripts/repositories.gradle @@ -98,6 +98,10 @@ repositories { includeGroup "com.klikli_dev" } } + maven { + name 'DVS1 Maven FS' + url 'https://dvs1.progwml6.com/files/maven' + } maven { name = 'GeckoLib' url 'https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/' diff --git a/src/generated/resources/assets/cosmiccore/lang/en_ud.json b/src/generated/resources/assets/cosmiccore/lang/en_ud.json index 6e711a778..f89c1bbd0 100644 --- a/src/generated/resources/assets/cosmiccore/lang/en_ud.json +++ b/src/generated/resources/assets/cosmiccore/lang/en_ud.json @@ -663,7 +663,7 @@ "item.cosmiccore.wrathful_spirit": "ʇıɹıdS ןnɟɥʇɐɹM", "item.cosmiccore.zpm_radio_module": "ǝןnpoW oıpɐᴚ WԀZ", "item.gtceu.tool.luv_meld_tool": "ןooʇıʇןnW pןǝW %s", - "itemGroup.cosmiccore.creative_tab": "ǝɹoƆ ɔıɯsoƆ", + "itemGroup.cosmiccore.creative_tab_tinker_tools": "ʇɐdɯoƆ sɹǝʞuı⟘ ǝɹoƆ ɔıɯsoƆ", "material.cosmiccore.causal_fabric": "ɔıɹqɐℲ ןɐsnɐƆ", "material.cosmiccore.chronon": "uouoɹɥƆ", "material.cosmiccore.cosmocite": "ǝʇıɔoɯsoƆ", diff --git a/src/generated/resources/assets/cosmiccore/lang/en_us.json b/src/generated/resources/assets/cosmiccore/lang/en_us.json index 01c559d08..5fc9ca2c6 100644 --- a/src/generated/resources/assets/cosmiccore/lang/en_us.json +++ b/src/generated/resources/assets/cosmiccore/lang/en_us.json @@ -663,7 +663,7 @@ "item.cosmiccore.wrathful_spirit": "Wrathful Spirit", "item.cosmiccore.zpm_radio_module": "ZPM Radio Module", "item.gtceu.tool.luv_meld_tool": "%s Meld Multitool", - "itemGroup.cosmiccore.creative_tab": "Cosmic Core", + "itemGroup.cosmiccore.creative_tab_tinker_tools": "Cosmic Core Tinkers Compat", "material.cosmiccore.causal_fabric": "Causal Fabric", "material.cosmiccore.chronon": "Chronon", "material.cosmiccore.cosmocite": "Cosmocite", diff --git a/src/generated/resources/data/cosmiccore/tinkering/tool_definitions/wire_cutter.json b/src/generated/resources/data/cosmiccore/tinkering/tool_definitions/wire_cutter.json new file mode 100644 index 000000000..9da907097 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/tool_definitions/wire_cutter.json @@ -0,0 +1,46 @@ +{ + "modules": [ + { + "type": "tconstruct:part_stats", + "parts": [ + "tconstruct:small_blade", + "tconstruct:tool_binding", + "tconstruct:tool_handle", + "tconstruct:tool_handle" + ], + "primary_part": 0 + }, + { + "type": "tconstruct:default_materials", + "materials": [ + { + "type": "tconstruct:random", + "tier": 1 + }, + { + "type": "tconstruct:random", + "tier": 1 + }, + { + "type": "tconstruct:random", + "tier": 1 + }, + { + "type": "tconstruct:random", + "tier": 1 + } + ] + }, + { + "type": "tconstruct:base_stats", + "stats": { + "tconstruct:attack_speed": 0.9 + } + }, + { + "type": "tconstruct:is_effective", + "predicate_type": "mantle:tag", + "tag": "forge:mineable/wire_cutter" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/tools/wire_cutters.json b/src/generated/resources/data/forge/tags/items/tools/wire_cutters.json new file mode 100644 index 000000000..32acf3ab2 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/tools/wire_cutters.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:wire_cutter" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/items/tools/crafting_wire_cutters.json b/src/generated/resources/data/gtceu/tags/items/tools/crafting_wire_cutters.json new file mode 100644 index 000000000..32acf3ab2 --- /dev/null +++ b/src/generated/resources/data/gtceu/tags/items/tools/crafting_wire_cutters.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:wire_cutter" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/items/cluster_max_harvestables.json b/src/generated/resources/data/minecraft/tags/items/cluster_max_harvestables.json new file mode 100644 index 000000000..32acf3ab2 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/items/cluster_max_harvestables.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:wire_cutter" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/tconstruct/tags/items/modifiable/aoe.json b/src/generated/resources/data/tconstruct/tags/items/modifiable/aoe.json new file mode 100644 index 000000000..32acf3ab2 --- /dev/null +++ b/src/generated/resources/data/tconstruct/tags/items/modifiable/aoe.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:wire_cutter" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/tconstruct/tags/items/modifiable/bonus_slots.json b/src/generated/resources/data/tconstruct/tags/items/modifiable/bonus_slots.json new file mode 100644 index 000000000..32acf3ab2 --- /dev/null +++ b/src/generated/resources/data/tconstruct/tags/items/modifiable/bonus_slots.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:wire_cutter" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/tconstruct/tags/items/modifiable/durability.json b/src/generated/resources/data/tconstruct/tags/items/modifiable/durability.json new file mode 100644 index 000000000..32acf3ab2 --- /dev/null +++ b/src/generated/resources/data/tconstruct/tags/items/modifiable/durability.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:wire_cutter" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/tconstruct/tags/items/modifiable/harvest/primary.json b/src/generated/resources/data/tconstruct/tags/items/modifiable/harvest/primary.json new file mode 100644 index 000000000..32acf3ab2 --- /dev/null +++ b/src/generated/resources/data/tconstruct/tags/items/modifiable/harvest/primary.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:wire_cutter" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/tconstruct/tags/items/modifiable/interactable/right.json b/src/generated/resources/data/tconstruct/tags/items/modifiable/interactable/right.json new file mode 100644 index 000000000..32acf3ab2 --- /dev/null +++ b/src/generated/resources/data/tconstruct/tags/items/modifiable/interactable/right.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:wire_cutter" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/tconstruct/tags/items/modifiable/melee/weapon.json b/src/generated/resources/data/tconstruct/tags/items/modifiable/melee/weapon.json new file mode 100644 index 000000000..32acf3ab2 --- /dev/null +++ b/src/generated/resources/data/tconstruct/tags/items/modifiable/melee/weapon.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:wire_cutter" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/tconstruct/tags/items/modifiable/multipart.json b/src/generated/resources/data/tconstruct/tags/items/modifiable/multipart.json new file mode 100644 index 000000000..32acf3ab2 --- /dev/null +++ b/src/generated/resources/data/tconstruct/tags/items/modifiable/multipart.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:wire_cutter" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/tconstruct/tags/items/modifiable/small.json b/src/generated/resources/data/tconstruct/tags/items/modifiable/small.json new file mode 100644 index 000000000..32acf3ab2 --- /dev/null +++ b/src/generated/resources/data/tconstruct/tags/items/modifiable/small.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:wire_cutter" + ] +} \ No newline at end of file diff --git a/src/main/java/com/ghostipedia/cosmiccore/CosmicCore.java b/src/main/java/com/ghostipedia/cosmiccore/CosmicCore.java index 5532fb949..ce4e83615 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/CosmicCore.java +++ b/src/main/java/com/ghostipedia/cosmiccore/CosmicCore.java @@ -3,6 +3,7 @@ import com.ghostipedia.cosmiccore.api.capability.CosmicCapabilities; import com.ghostipedia.cosmiccore.api.item.LinkedTerminalBehavior; import com.ghostipedia.cosmiccore.api.pattern.CosmicPredicates; +import com.ghostipedia.cosmiccore.api.recipe.ingredient.TinkerIngredient; import com.ghostipedia.cosmiccore.api.recipe.lookup.MapSoulIngredient; import com.ghostipedia.cosmiccore.api.registries.CosmicRegistration; import com.ghostipedia.cosmiccore.client.CosmicCoreClient; @@ -10,6 +11,10 @@ import com.ghostipedia.cosmiccore.common.data.materials.CosmicMaterialSet; import com.ghostipedia.cosmiccore.common.data.materials.CosmicMaterials; import com.ghostipedia.cosmiccore.common.item.behavior.GravityCoreBehavior; +import com.ghostipedia.cosmiccore.common.item.tcon.CosmicTconBlockTagProvider; +import com.ghostipedia.cosmiccore.common.item.tcon.CosmicTconItemTagProvider; +import com.ghostipedia.cosmiccore.common.item.tcon.CosmicTinkerTools; +import com.ghostipedia.cosmiccore.common.item.tcon.CosmicToolDefitionProvider; import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.modular.MultiblockInit; import com.ghostipedia.cosmiccore.common.network.CCoreNetwork; import com.ghostipedia.cosmiccore.common.recipe.condition.CosmicConditions; @@ -30,8 +35,13 @@ import com.lowdragmc.lowdraglib.Platform; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.PackOutput; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.common.capabilities.RegisterCapabilitiesEvent; +import net.minecraftforge.common.crafting.CraftingHelper; +import net.minecraftforge.common.data.ExistingFileHelper; +import net.minecraftforge.data.event.GatherDataEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; @@ -74,17 +84,30 @@ public static void init() { CosmicBlocks.init(); CosmicBlockEntities.init(); CosmicItems.init(); + CosmicTinkerTools.init(); CosmicBotanyItemRegistration.init(); CosmicRegistration.REGISTRATE.registerRegistrate(); CosmicCoreDatagen.init(); CosmicPredicates.init(); CosmicMaterialSet.init(); + CosmicCreativeModeTabs.init(); } public static ResourceLocation id(String path) { return new ResourceLocation(MOD_ID, path); } - + @SubscribeEvent + public void gatherDataEvent(GatherDataEvent event){ + DataGenerator generator = event.getGenerator(); + PackOutput packOutput = generator.getPackOutput(); + ExistingFileHelper existingFileHelper = event.getExistingFileHelper(); + boolean server = event.includeServer(); + boolean client = event.includeClient(); + CosmicTconBlockTagProvider blockTags = new CosmicTconBlockTagProvider(packOutput,event.getLookupProvider(),existingFileHelper); + generator.addProvider(server,blockTags); + generator.addProvider(server, new CosmicToolDefitionProvider(packOutput)); + generator.addProvider(server, new CosmicTconItemTagProvider(packOutput,event.getLookupProvider(),blockTags.contentsGetter(),existingFileHelper)); + } @SubscribeEvent public void registerMaterialRegistry(MaterialRegistryEvent event) { MATERIAL_REGISTRY = GTCEuAPI.materialManager.createRegistry(CosmicCore.MOD_ID); @@ -105,6 +128,7 @@ public void commonSetup(FMLCommonSetupEvent event) { event.enqueueWork(() -> { MapIngredientTypeManager.registerMapIngredient(Integer.class, MapSoulIngredient::convertToMapIngredient); GridLinkables.register(CosmicItems.LINKED_TERMINAL, LinkedTerminalBehavior.handler); + CraftingHelper.register(TinkerIngredient.TYPE, TinkerIngredient.SERIALIZER); CCoreNetwork.init(); }); } diff --git a/src/main/java/com/ghostipedia/cosmiccore/CosmicCoreGTAddon.java b/src/main/java/com/ghostipedia/cosmiccore/CosmicCoreGTAddon.java index c97a5932b..ae122fef0 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/CosmicCoreGTAddon.java +++ b/src/main/java/com/ghostipedia/cosmiccore/CosmicCoreGTAddon.java @@ -7,6 +7,7 @@ import com.ghostipedia.cosmiccore.common.data.materials.CosmicElements; import com.ghostipedia.cosmiccore.common.data.recipe.CosmicCoreOreRecipeHandler; import com.ghostipedia.cosmiccore.common.data.recipe.CosmicMaterialRecipeHandlers; +import com.ghostipedia.cosmiccore.common.data.recipe.TinkersRecipeTest; import com.ghostipedia.cosmiccore.gtbridge.CosmicCoreRecipes; import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; @@ -63,6 +64,7 @@ public void addRecipes(Consumer provider) { CosmicCoreOreRecipeHandler.init(provider, material); CosmicMaterialRecipeHandlers.init(provider, material); } + TinkersRecipeTest.init(provider); } @Override diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/recipe/ingredient/TinkerIngredient.java b/src/main/java/com/ghostipedia/cosmiccore/api/recipe/ingredient/TinkerIngredient.java new file mode 100644 index 000000000..ee686b393 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/recipe/ingredient/TinkerIngredient.java @@ -0,0 +1,109 @@ +package com.ghostipedia.cosmiccore.api.recipe.ingredient; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraftforge.common.crafting.IIngredientSerializer; + +import com.google.common.base.Preconditions; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import lombok.Getter; +import org.jetbrains.annotations.Nullable; +import slimeknights.tconstruct.library.tools.definition.ToolDefinition; +import slimeknights.tconstruct.library.tools.definition.ToolDefinitionLoader; +import slimeknights.tconstruct.library.tools.item.ModifiableItem; +import slimeknights.tconstruct.library.tools.nbt.ToolStack; + +import java.util.stream.Stream; +public class TinkerIngredient extends Ingredient { + + public static final ResourceLocation TYPE = CosmicCore.id("tool_ingredient"); + + @Getter + private final ToolDefinition definition; + + private ItemStack[] cacheStacks; + + public TinkerIngredient(ToolDefinition definition) { + super(Stream.empty()); + Preconditions.checkNotNull(definition); + this.definition = definition; + } + + @Override + public JsonElement toJson() { + JsonObject json = new JsonObject(); + json.addProperty("type", TYPE.toString()); + json.addProperty("definition", definition.getId().toString()); + return json; + } + + @Override + public boolean test(@Nullable ItemStack stack) { + if (stack == null || stack.isEmpty()) return false; + if (!(stack.getItem() instanceof ModifiableItem)) return false; + ToolStack toolStack = ToolStack.from(stack); + + if (toolStack.isBroken()) return false; + + return super.test(stack); + } + + @Override + public boolean isSimple() { + return false; + } + + @Override + public ItemStack[] getItems() { + if (cacheStacks == null) { + cacheStacks = new ItemStack[] { BuiltInRegistries.ITEM.get(definition.getId()).getDefaultInstance() }; + } + return cacheStacks; + } + + @Override + public boolean isEmpty() { + return false; + } + + @Override + public IIngredientSerializer getSerializer() { + return SERIALIZER; + } + + public static final IIngredientSerializer SERIALIZER = new IIngredientSerializer() { + + @Override + public TinkerIngredient parse(FriendlyByteBuf friendlyByteBuf) { + ResourceLocation resLoc = friendlyByteBuf.readResourceLocation(); + var toolDef = ToolDefinitionLoader.getInstance(); + ToolDefinition def = toolDef.getRegisteredToolDefinitions().stream() + .filter(d -> d.getId().equals(resLoc)) + .findFirst() + .orElse(null); + return new TinkerIngredient(def); + } + + @Override + public TinkerIngredient parse(JsonObject jsonObject) { + ResourceLocation resLoc = new ResourceLocation(jsonObject.get("definition").getAsString()); + var toolDef = ToolDefinitionLoader.getInstance(); + ToolDefinition def = toolDef.getRegisteredToolDefinitions().stream() + .filter(d -> d.getId().equals(resLoc)) + .findFirst() + .orElse(null); + return new TinkerIngredient(def); + } + + @Override + public void write(FriendlyByteBuf friendlyByteBuf, TinkerIngredient tinkerIngredient) { + friendlyByteBuf.writeResourceLocation(tinkerIngredient.definition.getId()); + } + }; +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicCreativeModeTabs.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicCreativeModeTabs.java index 0a2b1c103..8fe4c06fc 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicCreativeModeTabs.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicCreativeModeTabs.java @@ -2,6 +2,7 @@ import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.item.tcon.CosmicCreativeTinkersTab; import com.gregtechceu.gtceu.common.data.GTCreativeModeTabs; import net.minecraft.world.item.CreativeModeTab; @@ -20,5 +21,14 @@ public class CosmicCreativeModeTabs { .build()) .register(); + + public static RegistryEntry COSMIC_CORE_TINKERS_TOOLS = REGISTRATE.defaultCreativeTab(CosmicCore.MOD_ID, + builder -> builder + .displayItems(CosmicCreativeTinkersTab::addCreativeTabItems) + .title(REGISTRATE.addLang("itemGroup", CosmicCore.id("creative_tab_tinker_tools"), "Cosmic Core Tinkers Compat")) + .icon(CosmicItems.RUNE_CONJUNCTION_VALKRUTH::asStack) + .build()) + .register(); + public static void init() {} } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/recipe/TinkersRecipeTest.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/recipe/TinkersRecipeTest.java new file mode 100644 index 000000000..6e75b6929 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/recipe/TinkersRecipeTest.java @@ -0,0 +1,23 @@ +package com.ghostipedia.cosmiccore.common.data.recipe; + +import com.ghostipedia.cosmiccore.api.recipe.ingredient.TinkerIngredient; + +import com.gregtechceu.gtceu.data.recipe.VanillaRecipeHelper; + +import net.minecraft.data.recipes.FinishedRecipe; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; + +import slimeknights.tconstruct.tools.ToolDefinitions; + +import java.util.function.Consumer; + +public class TinkersRecipeTest { + + public static void init(Consumer provider) { + VanillaRecipeHelper.addShapedRecipe(provider, "tinkertest", + new ItemStack(Items.STRING), "BK ", " ", " ", + 'B', Items.OAK_PLANKS, + 'K', new TinkerIngredient(ToolDefinitions.SCYTHE)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicCreativeTinkersTab.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicCreativeTinkersTab.java new file mode 100644 index 000000000..517c378de --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicCreativeTinkersTab.java @@ -0,0 +1,28 @@ +package com.ghostipedia.cosmiccore.common.item.tcon; + +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.ItemStack; +import slimeknights.mantle.registration.object.EnumObject; +import slimeknights.tconstruct.library.tools.helper.ToolBuildHandler; +import slimeknights.tconstruct.library.tools.item.IModifiable; + +import java.util.function.Consumer; +import java.util.function.Supplier; + +public class CosmicCreativeTinkersTab { + + public static void addCreativeTabItems(CreativeModeTab.ItemDisplayParameters itemDisplayParameters, CreativeModeTab.Output tab){ + Consumer output = tab::accept; + acceptTool(output, CosmicTinkerTools.wireCutter); + } + + + + + private static void acceptTool(Consumer output, Supplier tool) { + ToolBuildHandler.addVariants(output, tool.get(), ""); + } + private static void acceptTools(Consumer output, EnumObject tools) { + tools.forEach(tool -> ToolBuildHandler.addVariants(output, tool, "")); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTconBlockTagProvider.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTconBlockTagProvider.java new file mode 100644 index 000000000..fccf4dc89 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTconBlockTagProvider.java @@ -0,0 +1,22 @@ +package com.ghostipedia.cosmiccore.common.item.tcon; + + +import com.ghostipedia.cosmiccore.CosmicCore; +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraftforge.common.data.BlockTagsProvider; +import net.minecraftforge.common.data.ExistingFileHelper; + +import java.util.concurrent.CompletableFuture; + +public class CosmicTconBlockTagProvider extends BlockTagsProvider { + + public CosmicTconBlockTagProvider(PackOutput packOutput, CompletableFuture registries, ExistingFileHelper existingFileHelper) { + super(packOutput, registries, CosmicCore.MOD_ID, existingFileHelper); + } + + @Override + protected void addTags(HolderLookup.Provider provider) { + + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTconItemTagProvider.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTconItemTagProvider.java new file mode 100644 index 000000000..2782d5969 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTconItemTagProvider.java @@ -0,0 +1,49 @@ +package com.ghostipedia.cosmiccore.common.item.tcon; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.gregtechceu.gtceu.data.recipe.CustomTags; +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.data.tags.ItemTagsProvider; +import net.minecraft.tags.ItemTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.common.data.ExistingFileHelper; +import slimeknights.tconstruct.TConstruct; +import slimeknights.tconstruct.tools.TinkerTools; + +import java.util.concurrent.CompletableFuture; + +import static net.minecraft.tags.ItemTags.CLUSTER_MAX_HARVESTABLES; +import static slimeknights.tconstruct.common.TinkerTags.Items.*; + + +public class CosmicTconItemTagProvider extends ItemTagsProvider { + + + public CosmicTconItemTagProvider(PackOutput output, CompletableFuture lookupProvider, CompletableFuture> blockTagProvider, ExistingFileHelper existingFileHelper) { + super(output, lookupProvider, blockTagProvider, CosmicCore.MOD_ID, existingFileHelper); + } + + @Override + protected void addTags(HolderLookup.Provider provider) { + this.addTools(); + } + + + private void addTools() { + addToolTags(CosmicTinkerTools.wireCutter, MULTIPART_TOOL, DURABILITY, HARVEST_PRIMARY, CustomTags.WIRE_CUTTERS, CustomTags.CRAFTING_WIRE_CUTTERS, MELEE_WEAPON, INTERACTABLE_RIGHT, AOE, CLUSTER_MAX_HARVESTABLES, SMALL_TOOLS, BONUS_SLOTS); + + } + + + @SafeVarargs + private void addToolTags(ItemLike tool, TagKey... tags) { + Item item = tool.asItem(); + for (TagKey tag : tags) { + this.tag(tag).add(item); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerTools.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerTools.java new file mode 100644 index 000000000..141ea56b5 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerTools.java @@ -0,0 +1,27 @@ +package com.ghostipedia.cosmiccore.common.item.tcon; + +import com.ghostipedia.cosmiccore.CosmicCore; +import net.minecraft.world.item.Item; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import slimeknights.mantle.registration.object.ItemObject; +import slimeknights.tconstruct.common.registration.ItemDeferredRegisterExtension; +import slimeknights.tconstruct.library.tools.item.ModifiableItem; +import slimeknights.tconstruct.tools.ToolDefinitions; + +public class CosmicTinkerTools { + + protected static final ItemDeferredRegisterExtension COSMIC_TINKER_ITEM = new ItemDeferredRegisterExtension(CosmicCore.MOD_ID); + + + private static final Item.Properties UNSTACKABLE_PROPS = new Item.Properties().stacksTo(1); + + + + + public static final ItemObject wireCutter = COSMIC_TINKER_ITEM.register("wire_cutter", () -> new ModifiableItem(UNSTACKABLE_PROPS, ToolDefinitions.PICKAXE)); + + + public static void init() { + COSMIC_TINKER_ITEM.register(FMLJavaModLoadingContext.get().getModEventBus()); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitions.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitions.java new file mode 100644 index 000000000..83d97e4b2 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitions.java @@ -0,0 +1,17 @@ +package com.ghostipedia.cosmiccore.common.item.tcon; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import slimeknights.tconstruct.library.tools.definition.ToolDefinition; +import slimeknights.tconstruct.tools.TinkerTools; + + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class CosmicToolDefinitions { + + + + public static final ToolDefinition WIRE_CUTTERS = ToolDefinition.create(CosmicTinkerTools.wireCutter); + + +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefitionProvider.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefitionProvider.java new file mode 100644 index 000000000..493dca3dc --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefitionProvider.java @@ -0,0 +1,57 @@ +package com.ghostipedia.cosmiccore.common.item.tcon; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.gregtechceu.gtceu.data.recipe.CustomTags; +import net.minecraft.data.PackOutput; +import slimeknights.tconstruct.library.data.tinkering.AbstractToolDefinitionDataProvider; +import slimeknights.tconstruct.library.materials.RandomMaterial; +import slimeknights.tconstruct.library.tools.definition.module.build.SetStatsModule; +import slimeknights.tconstruct.library.tools.definition.module.material.DefaultMaterialsModule; +import slimeknights.tconstruct.library.tools.definition.module.material.PartStatsModule; +import slimeknights.tconstruct.library.tools.definition.module.mining.IsEffectiveModule; +import slimeknights.tconstruct.library.tools.nbt.StatsNBT; +import slimeknights.tconstruct.library.tools.stat.ToolStats; + +import static slimeknights.tconstruct.tools.TinkerToolParts.*; + +public class CosmicToolDefitionProvider extends AbstractToolDefinitionDataProvider { + + + public CosmicToolDefitionProvider(PackOutput packOutput) { + super(packOutput, CosmicCore.MOD_ID); + } + + @Override + protected void addToolDefinitions() { + RandomMaterial tier1Material = RandomMaterial.random().tier(1).build(); + RandomMaterial randomMaterial = RandomMaterial.random().allowHidden().build(); + DefaultMaterialsModule defaultTwoParts = DefaultMaterialsModule.builder().material(tier1Material, tier1Material).build(); + DefaultMaterialsModule defaultThreeParts = DefaultMaterialsModule.builder().material(tier1Material, tier1Material, tier1Material).build(); + DefaultMaterialsModule defaultFourParts = DefaultMaterialsModule.builder().material(tier1Material, tier1Material, tier1Material, tier1Material).build(); + DefaultMaterialsModule ancientTwoParts = DefaultMaterialsModule.builder().material(randomMaterial, randomMaterial).build(); + DefaultMaterialsModule ancientThreeParts = DefaultMaterialsModule.builder().material(randomMaterial, randomMaterial, randomMaterial).build(); + + // pickaxes + + + define(CosmicToolDefinitions.WIRE_CUTTERS) + + .module(PartStatsModule.parts() + .part(smallBlade) + .part(toolBinding) + .part(toolHandle) + .part(toolHandle).build()) + .module(defaultFourParts) + .module(new SetStatsModule(StatsNBT.builder() + .set(ToolStats.ATTACK_SPEED, 0.9f) + .build())) + .module(IsEffectiveModule.tag(CustomTags.MINEABLE_WITH_WIRE_CUTTER)); + + + } + + @Override + public String getName() { + return "Cosmic Core Tinker's Construct Tool Definition Data Generator"; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/tinkers/ModifiableItemMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/tinkers/ModifiableItemMixin.java new file mode 100644 index 000000000..74ea5fa93 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/tinkers/ModifiableItemMixin.java @@ -0,0 +1,38 @@ +package com.ghostipedia.cosmiccore.mixin.tinkers; + +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Tier; +import net.minecraft.world.item.TieredItem; +import net.minecraftforge.common.ForgeHooks; + +import org.spongepowered.asm.mixin.Debug; +import org.spongepowered.asm.mixin.Mixin; +import slimeknights.tconstruct.library.tools.helper.ToolDamageUtil; +import slimeknights.tconstruct.library.tools.item.ModifiableItem; +import slimeknights.tconstruct.library.tools.nbt.ToolStack; + +@Debug( + export = true) +@Mixin(value = ModifiableItem.class, remap = false) +public class ModifiableItemMixin extends TieredItem { + + public ModifiableItemMixin(Tier tier, Properties properties) { + super(tier, properties); + } + + @Override + public boolean hasCraftingRemainingItem(ItemStack stack) { + return !ToolStack.from(stack).isBroken(); + } + + @Override + public ItemStack getCraftingRemainingItem(ItemStack itemStack) { + ItemStack stack = itemStack.copy(); + Player player = ForgeHooks.getCraftingPlayer(); + + ToolDamageUtil.handleDamageItem(stack, 1, player, p -> {}); + + return stack; + } +} \ No newline at end of file diff --git a/src/main/resources/cosmiccore.mixins.json b/src/main/resources/cosmiccore.mixins.json index 6ae85d2cd..da387a3af 100644 --- a/src/main/resources/cosmiccore.mixins.json +++ b/src/main/resources/cosmiccore.mixins.json @@ -41,7 +41,8 @@ "emi.EmiApiMixin", "lso.FrostbiteEffectMixin", "lso.HeatstrokeEffectMixin", - "lso.TemperatureCapabilityMixin" + "lso.TemperatureCapabilityMixin", + "tinkers.ModifiableItemMixin" ], "injectors": { "defaultRequire": 1, diff --git a/src/main/templates/META-INF/mods.toml b/src/main/templates/META-INF/mods.toml index aa589ff7f..9f35999dd 100644 --- a/src/main/templates/META-INF/mods.toml +++ b/src/main/templates/META-INF/mods.toml @@ -44,4 +44,12 @@ description = "${mod_description}" mandatory=true versionRange="[1.20.1-1.20.1-2.0.15,)" ordering="BEFORE" - side="BOTH" \ No newline at end of file + side="BOTH" + +[[dependencies.${mod_id}]] +modId = "tconstruct" +mandatory = true +embedded = true +versionRange = "[1.20.1-3.9.2.37,)" +ordering = "AFTER" +side = "BOTH" \ No newline at end of file From 99a8ce068cb43a444cf7387cb532ed451b1aeb74 Mon Sep 17 00:00:00 2001 From: Ghostipedia Date: Fri, 19 Sep 2025 21:13:40 -0400 Subject: [PATCH 02/17] Wrench, Doesn't have mode swap, SOS. --- .../tool_definitions/wire_cutter.json | 1 + .../tinkering/tool_definitions/wrench.json | 46 +++++++++++++++++++ .../data/forge/tags/items/tools/wrenches.json | 5 ++ .../tags/items/tools/crafting_wrenches.json | 5 ++ .../tags/items/cluster_max_harvestables.json | 3 +- .../tconstruct/tags/items/modifiable/aoe.json | 3 +- .../tags/items/modifiable/bonus_slots.json | 3 +- .../tags/items/modifiable/durability.json | 3 +- .../items/modifiable/harvest/primary.json | 3 +- .../items/modifiable/interactable/right.json | 3 +- .../tags/items/modifiable/melee/weapon.json | 3 +- .../tags/items/modifiable/multipart.json | 3 +- .../tags/items/modifiable/small.json | 3 +- .../item/tcon/CosmicCreativeTinkersTab.java | 1 + .../item/tcon/CosmicTconItemTagProvider.java | 2 +- .../common/item/tcon/CosmicTinkerTools.java | 1 + .../item/tcon/CosmicToolDefinitions.java | 1 + .../item/tcon/CosmicToolDefitionProvider.java | 18 ++++++++ 18 files changed, 97 insertions(+), 10 deletions(-) create mode 100644 src/generated/resources/data/cosmiccore/tinkering/tool_definitions/wrench.json create mode 100644 src/generated/resources/data/forge/tags/items/tools/wrenches.json create mode 100644 src/generated/resources/data/gtceu/tags/items/tools/crafting_wrenches.json diff --git a/src/generated/resources/data/cosmiccore/tinkering/tool_definitions/wire_cutter.json b/src/generated/resources/data/cosmiccore/tinkering/tool_definitions/wire_cutter.json index 9da907097..aed429838 100644 --- a/src/generated/resources/data/cosmiccore/tinkering/tool_definitions/wire_cutter.json +++ b/src/generated/resources/data/cosmiccore/tinkering/tool_definitions/wire_cutter.json @@ -3,6 +3,7 @@ { "type": "tconstruct:part_stats", "parts": [ + "tconstruct:small_blade", "tconstruct:small_blade", "tconstruct:tool_binding", "tconstruct:tool_handle", diff --git a/src/generated/resources/data/cosmiccore/tinkering/tool_definitions/wrench.json b/src/generated/resources/data/cosmiccore/tinkering/tool_definitions/wrench.json new file mode 100644 index 000000000..58edc1222 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/tool_definitions/wrench.json @@ -0,0 +1,46 @@ +{ + "modules": [ + { + "type": "tconstruct:part_stats", + "parts": [ + "tconstruct:pick_head", + "tconstruct:tough_binding", + "tconstruct:tool_binding", + "tconstruct:tool_handle" + ], + "primary_part": 0 + }, + { + "type": "tconstruct:default_materials", + "materials": [ + { + "type": "tconstruct:random", + "tier": 1 + }, + { + "type": "tconstruct:random", + "tier": 1 + }, + { + "type": "tconstruct:random", + "tier": 1 + }, + { + "type": "tconstruct:random", + "tier": 1 + } + ] + }, + { + "type": "tconstruct:base_stats", + "stats": { + "tconstruct:attack_speed": 0.9 + } + }, + { + "type": "tconstruct:is_effective", + "predicate_type": "mantle:tag", + "tag": "forge:mineable/wrench" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/tools/wrenches.json b/src/generated/resources/data/forge/tags/items/tools/wrenches.json new file mode 100644 index 000000000..303d57f8b --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/tools/wrenches.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:wrench" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/items/tools/crafting_wrenches.json b/src/generated/resources/data/gtceu/tags/items/tools/crafting_wrenches.json new file mode 100644 index 000000000..303d57f8b --- /dev/null +++ b/src/generated/resources/data/gtceu/tags/items/tools/crafting_wrenches.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:wrench" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/items/cluster_max_harvestables.json b/src/generated/resources/data/minecraft/tags/items/cluster_max_harvestables.json index 32acf3ab2..f7f403ff0 100644 --- a/src/generated/resources/data/minecraft/tags/items/cluster_max_harvestables.json +++ b/src/generated/resources/data/minecraft/tags/items/cluster_max_harvestables.json @@ -1,5 +1,6 @@ { "values": [ - "cosmiccore:wire_cutter" + "cosmiccore:wire_cutter", + "cosmiccore:wrench" ] } \ No newline at end of file diff --git a/src/generated/resources/data/tconstruct/tags/items/modifiable/aoe.json b/src/generated/resources/data/tconstruct/tags/items/modifiable/aoe.json index 32acf3ab2..f7f403ff0 100644 --- a/src/generated/resources/data/tconstruct/tags/items/modifiable/aoe.json +++ b/src/generated/resources/data/tconstruct/tags/items/modifiable/aoe.json @@ -1,5 +1,6 @@ { "values": [ - "cosmiccore:wire_cutter" + "cosmiccore:wire_cutter", + "cosmiccore:wrench" ] } \ No newline at end of file diff --git a/src/generated/resources/data/tconstruct/tags/items/modifiable/bonus_slots.json b/src/generated/resources/data/tconstruct/tags/items/modifiable/bonus_slots.json index 32acf3ab2..f7f403ff0 100644 --- a/src/generated/resources/data/tconstruct/tags/items/modifiable/bonus_slots.json +++ b/src/generated/resources/data/tconstruct/tags/items/modifiable/bonus_slots.json @@ -1,5 +1,6 @@ { "values": [ - "cosmiccore:wire_cutter" + "cosmiccore:wire_cutter", + "cosmiccore:wrench" ] } \ No newline at end of file diff --git a/src/generated/resources/data/tconstruct/tags/items/modifiable/durability.json b/src/generated/resources/data/tconstruct/tags/items/modifiable/durability.json index 32acf3ab2..f7f403ff0 100644 --- a/src/generated/resources/data/tconstruct/tags/items/modifiable/durability.json +++ b/src/generated/resources/data/tconstruct/tags/items/modifiable/durability.json @@ -1,5 +1,6 @@ { "values": [ - "cosmiccore:wire_cutter" + "cosmiccore:wire_cutter", + "cosmiccore:wrench" ] } \ No newline at end of file diff --git a/src/generated/resources/data/tconstruct/tags/items/modifiable/harvest/primary.json b/src/generated/resources/data/tconstruct/tags/items/modifiable/harvest/primary.json index 32acf3ab2..f7f403ff0 100644 --- a/src/generated/resources/data/tconstruct/tags/items/modifiable/harvest/primary.json +++ b/src/generated/resources/data/tconstruct/tags/items/modifiable/harvest/primary.json @@ -1,5 +1,6 @@ { "values": [ - "cosmiccore:wire_cutter" + "cosmiccore:wire_cutter", + "cosmiccore:wrench" ] } \ No newline at end of file diff --git a/src/generated/resources/data/tconstruct/tags/items/modifiable/interactable/right.json b/src/generated/resources/data/tconstruct/tags/items/modifiable/interactable/right.json index 32acf3ab2..f7f403ff0 100644 --- a/src/generated/resources/data/tconstruct/tags/items/modifiable/interactable/right.json +++ b/src/generated/resources/data/tconstruct/tags/items/modifiable/interactable/right.json @@ -1,5 +1,6 @@ { "values": [ - "cosmiccore:wire_cutter" + "cosmiccore:wire_cutter", + "cosmiccore:wrench" ] } \ No newline at end of file diff --git a/src/generated/resources/data/tconstruct/tags/items/modifiable/melee/weapon.json b/src/generated/resources/data/tconstruct/tags/items/modifiable/melee/weapon.json index 32acf3ab2..f7f403ff0 100644 --- a/src/generated/resources/data/tconstruct/tags/items/modifiable/melee/weapon.json +++ b/src/generated/resources/data/tconstruct/tags/items/modifiable/melee/weapon.json @@ -1,5 +1,6 @@ { "values": [ - "cosmiccore:wire_cutter" + "cosmiccore:wire_cutter", + "cosmiccore:wrench" ] } \ No newline at end of file diff --git a/src/generated/resources/data/tconstruct/tags/items/modifiable/multipart.json b/src/generated/resources/data/tconstruct/tags/items/modifiable/multipart.json index 32acf3ab2..f7f403ff0 100644 --- a/src/generated/resources/data/tconstruct/tags/items/modifiable/multipart.json +++ b/src/generated/resources/data/tconstruct/tags/items/modifiable/multipart.json @@ -1,5 +1,6 @@ { "values": [ - "cosmiccore:wire_cutter" + "cosmiccore:wire_cutter", + "cosmiccore:wrench" ] } \ No newline at end of file diff --git a/src/generated/resources/data/tconstruct/tags/items/modifiable/small.json b/src/generated/resources/data/tconstruct/tags/items/modifiable/small.json index 32acf3ab2..f7f403ff0 100644 --- a/src/generated/resources/data/tconstruct/tags/items/modifiable/small.json +++ b/src/generated/resources/data/tconstruct/tags/items/modifiable/small.json @@ -1,5 +1,6 @@ { "values": [ - "cosmiccore:wire_cutter" + "cosmiccore:wire_cutter", + "cosmiccore:wrench" ] } \ No newline at end of file diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicCreativeTinkersTab.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicCreativeTinkersTab.java index 517c378de..d3f15aa69 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicCreativeTinkersTab.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicCreativeTinkersTab.java @@ -14,6 +14,7 @@ public class CosmicCreativeTinkersTab { public static void addCreativeTabItems(CreativeModeTab.ItemDisplayParameters itemDisplayParameters, CreativeModeTab.Output tab){ Consumer output = tab::accept; acceptTool(output, CosmicTinkerTools.wireCutter); + acceptTool(output, CosmicTinkerTools.wrench); } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTconItemTagProvider.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTconItemTagProvider.java index 2782d5969..a9dc88971 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTconItemTagProvider.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTconItemTagProvider.java @@ -35,7 +35,7 @@ protected void addTags(HolderLookup.Provider provider) { private void addTools() { addToolTags(CosmicTinkerTools.wireCutter, MULTIPART_TOOL, DURABILITY, HARVEST_PRIMARY, CustomTags.WIRE_CUTTERS, CustomTags.CRAFTING_WIRE_CUTTERS, MELEE_WEAPON, INTERACTABLE_RIGHT, AOE, CLUSTER_MAX_HARVESTABLES, SMALL_TOOLS, BONUS_SLOTS); - + addToolTags(CosmicTinkerTools.wrench, MULTIPART_TOOL, DURABILITY, HARVEST_PRIMARY, CustomTags.WRENCHES, CustomTags.CRAFTING_WRENCHES, MELEE_WEAPON, INTERACTABLE_RIGHT, AOE, CLUSTER_MAX_HARVESTABLES, SMALL_TOOLS, BONUS_SLOTS); } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerTools.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerTools.java index 141ea56b5..eca14b153 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerTools.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerTools.java @@ -19,6 +19,7 @@ public class CosmicTinkerTools { public static final ItemObject wireCutter = COSMIC_TINKER_ITEM.register("wire_cutter", () -> new ModifiableItem(UNSTACKABLE_PROPS, ToolDefinitions.PICKAXE)); + public static final ItemObject wrench = COSMIC_TINKER_ITEM.register("wrench", () -> new ModifiableItem(UNSTACKABLE_PROPS, ToolDefinitions.PICKAXE)); public static void init() { diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitions.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitions.java index 83d97e4b2..1eb3381c0 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitions.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitions.java @@ -12,6 +12,7 @@ public class CosmicToolDefinitions { public static final ToolDefinition WIRE_CUTTERS = ToolDefinition.create(CosmicTinkerTools.wireCutter); + public static final ToolDefinition WRENCHES = ToolDefinition.create(CosmicTinkerTools.wrench); } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefitionProvider.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefitionProvider.java index 493dca3dc..dd22445c7 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefitionProvider.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefitionProvider.java @@ -37,6 +37,7 @@ protected void addToolDefinitions() { define(CosmicToolDefinitions.WIRE_CUTTERS) .module(PartStatsModule.parts() + .part(smallBlade) .part(smallBlade) .part(toolBinding) .part(toolHandle) @@ -48,6 +49,23 @@ protected void addToolDefinitions() { .module(IsEffectiveModule.tag(CustomTags.MINEABLE_WITH_WIRE_CUTTER)); + + define(CosmicToolDefinitions.WRENCHES) + + .module(PartStatsModule.parts() + .part(pickHead) + .part(toughBinding) + .part(toolBinding) + .part(toolHandle).build()) + .module(defaultFourParts) + .module(new SetStatsModule(StatsNBT.builder() + .set(ToolStats.ATTACK_SPEED, 0.9f) + .build())) + .module(IsEffectiveModule.tag(CustomTags.MINEABLE_WITH_WRENCH)); + + + + } @Override From a34c2a7f60c88613627f51bccdcafff85933a57a Mon Sep 17 00:00:00 2001 From: Spicierspace153 <21964509+Spicierspace153@users.noreply.github.com> Date: Fri, 19 Sep 2025 19:45:32 -0600 Subject: [PATCH 03/17] wrench tag --- .../resources/data/forge/tags/items/tools/wrench.json | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 src/generated/resources/data/forge/tags/items/tools/wrench.json diff --git a/src/generated/resources/data/forge/tags/items/tools/wrench.json b/src/generated/resources/data/forge/tags/items/tools/wrench.json new file mode 100644 index 000000000..303d57f8b --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/tools/wrench.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:wrench" + ] +} \ No newline at end of file From 36592326e86e224227742387ad17ff42ab7fc341 Mon Sep 17 00:00:00 2001 From: Ghostipedia Date: Sat, 20 Sep 2025 06:02:08 -0400 Subject: [PATCH 04/17] Wirecutter Texture, Table Recipe, Lang --- .../common/item/tcon/CosmicTinkerTools.java | 4 +- .../item/tcon/CosmicToolDefitionProvider.java | 1 + .../assets/cosmiccore/lang/en_us.json | 4 ++ .../cosmiccore/models/item/wire_cutter.json | 22 +++++++++ .../models/item/wire_cutter_broken.json | 7 +++ .../item/tool/wire_cutter/binding.png | Bin 0 -> 138 bytes .../textures/item/tool/wire_cutter/broken.png | Bin 0 -> 186 bytes .../textures/item/tool/wire_cutter/handle.png | Bin 0 -> 226 bytes .../textures/item/tool/wire_cutter/head.png | Bin 0 -> 220 bytes .../cosmiccore/recipes/tools/wire_cutter.json | 4 ++ .../station_layouts/wire_cutter.json | 45 ++++++++++++++++++ 11 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/assets/cosmiccore/lang/en_us.json create mode 100644 src/main/resources/assets/cosmiccore/models/item/wire_cutter.json create mode 100644 src/main/resources/assets/cosmiccore/models/item/wire_cutter_broken.json create mode 100644 src/main/resources/assets/cosmiccore/textures/item/tool/wire_cutter/binding.png create mode 100644 src/main/resources/assets/cosmiccore/textures/item/tool/wire_cutter/broken.png create mode 100644 src/main/resources/assets/cosmiccore/textures/item/tool/wire_cutter/handle.png create mode 100644 src/main/resources/assets/cosmiccore/textures/item/tool/wire_cutter/head.png create mode 100644 src/main/resources/data/cosmiccore/recipes/tools/wire_cutter.json create mode 100644 src/main/resources/data/cosmiccore/tinkering/station_layouts/wire_cutter.json diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerTools.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerTools.java index eca14b153..ff9138616 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerTools.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerTools.java @@ -18,8 +18,8 @@ public class CosmicTinkerTools { - public static final ItemObject wireCutter = COSMIC_TINKER_ITEM.register("wire_cutter", () -> new ModifiableItem(UNSTACKABLE_PROPS, ToolDefinitions.PICKAXE)); - public static final ItemObject wrench = COSMIC_TINKER_ITEM.register("wrench", () -> new ModifiableItem(UNSTACKABLE_PROPS, ToolDefinitions.PICKAXE)); + public static final ItemObject wireCutter = COSMIC_TINKER_ITEM.register("wire_cutter", () -> new ModifiableItem(UNSTACKABLE_PROPS, CosmicToolDefinitions.WIRE_CUTTERS)); + public static final ItemObject wrench = COSMIC_TINKER_ITEM.register("wrench", () -> new ModifiableItem(UNSTACKABLE_PROPS, CosmicToolDefinitions.WRENCHES)); public static void init() { diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefitionProvider.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefitionProvider.java index dd22445c7..9ba277018 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefitionProvider.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefitionProvider.java @@ -28,6 +28,7 @@ protected void addToolDefinitions() { DefaultMaterialsModule defaultTwoParts = DefaultMaterialsModule.builder().material(tier1Material, tier1Material).build(); DefaultMaterialsModule defaultThreeParts = DefaultMaterialsModule.builder().material(tier1Material, tier1Material, tier1Material).build(); DefaultMaterialsModule defaultFourParts = DefaultMaterialsModule.builder().material(tier1Material, tier1Material, tier1Material, tier1Material).build(); + DefaultMaterialsModule defaultFiveParts = DefaultMaterialsModule.builder().material(tier1Material, tier1Material, tier1Material, tier1Material, tier1Material).build(); DefaultMaterialsModule ancientTwoParts = DefaultMaterialsModule.builder().material(randomMaterial, randomMaterial).build(); DefaultMaterialsModule ancientThreeParts = DefaultMaterialsModule.builder().material(randomMaterial, randomMaterial, randomMaterial).build(); diff --git a/src/main/resources/assets/cosmiccore/lang/en_us.json b/src/main/resources/assets/cosmiccore/lang/en_us.json new file mode 100644 index 000000000..e10259146 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/lang/en_us.json @@ -0,0 +1,4 @@ +{ + "item.cosmiccore.wire_cutter": "Wire Cutters", + "item.cosmiccore.wire_cutter.description": "Snip wires cleanly with these cutters." +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/wire_cutter.json b/src/main/resources/assets/cosmiccore/models/item/wire_cutter.json new file mode 100644 index 000000000..6b0459955 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/wire_cutter.json @@ -0,0 +1,22 @@ +{ + "loader": "tconstruct:tool", + "parent": "forge:item/default-tool", + "textures": { + "broken": "cosmiccore:item/tool/wire_cutter/broken", + "head": "cosmiccore:item/tool/wire_cutter/head", + "handle": "cosmiccore:item/tool/wire_cutter/handle", + "binding": "cosmiccore:item/tool/wire_cutter/binding" + }, + "modifier_roots": [ "tconstruct:item/tool/pickaxe/modifiers/" ], + "parts": [ + { "name": "head", "index": 0 }, + { "name": "handle", "index": 1 }, + { "name": "binding","index": 2 } + ], + "overrides": [ + { + "predicate": { "tconstruct:broken": 1 }, + "model": "tconstruct:item/tool/pickaxe/broken" + } + ] +} diff --git a/src/main/resources/assets/cosmiccore/models/item/wire_cutter_broken.json b/src/main/resources/assets/cosmiccore/models/item/wire_cutter_broken.json new file mode 100644 index 000000000..d6ae6bf30 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/wire_cutter_broken.json @@ -0,0 +1,7 @@ +{ + "loader": "tconstruct:tool", + "textures": { + "broken": "cosmiccore:item/tool/wire_cutter/broken" + }, + "parts": [ { "name": "broken" } ] +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/tool/wire_cutter/binding.png b/src/main/resources/assets/cosmiccore/textures/item/tool/wire_cutter/binding.png new file mode 100644 index 0000000000000000000000000000000000000000..be0be4a32f3f1393218a1583b38e0736565143d3 GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP|(KH z#WBR9H~G*1|MtwP4V_ANm5(rZdY=5R;4_i?)vH$r*b*lvtBCZTkeY8_f6ikQ<6#9c h4o0;mt+xG)3^EUea`nD6eFU1r;OXk;vd$@?2>>j*D3bsH literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/cosmiccore/textures/item/tool/wire_cutter/broken.png b/src/main/resources/assets/cosmiccore/textures/item/tool/wire_cutter/broken.png new file mode 100644 index 0000000000000000000000000000000000000000..85f306194c73d87e57f531463b28f105200aea1c GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP%y{S z#WBR9H~G*1|MtwP4V_ANON1AYRCkKRwr*rV}v1O~>NS%G~10G|+77Z;c8?CfdNrb$Rh0LAV{?b-pPSWANZg8u^n!|!c;AcHsyJR*x3 z82Ao>Fr%o3R|8Pc+tbA{L?d`^-$k(l3LH*_pZ?#saV^fS?rwiHsh!2%ir;|Ws9~nY z6h^&b{g4TFM3|CediG8G$vS!SuVpL#9S@GFju2md{o!r7{E6m|ibP0l+XkKO>sw# literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/cosmiccore/textures/item/tool/wire_cutter/head.png b/src/main/resources/assets/cosmiccore/textures/item/tool/wire_cutter/head.png new file mode 100644 index 0000000000000000000000000000000000000000..a15cb9345c7e5525ada92b6dd62503a903cf4b90 GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85p?vL6~vUPv)gS!9q_L#}EtuxBUls4=C_3J0DMAdghQL?B;TY z@p6F7ME)S}pIdxOA~pl|Xsj#@q!bDHq;KvBEfx~-Fn&pG6* zoob!nwx5OR%R9e&)t23cL0*|FMFm7PO}4p(Pm7;1SI+u>4aXwk2S4rQg}jb%11)Fp MboFyt=akR{0M2trtN;K2 literal 0 HcmV?d00001 diff --git a/src/main/resources/data/cosmiccore/recipes/tools/wire_cutter.json b/src/main/resources/data/cosmiccore/recipes/tools/wire_cutter.json new file mode 100644 index 000000000..7b6496bca --- /dev/null +++ b/src/main/resources/data/cosmiccore/recipes/tools/wire_cutter.json @@ -0,0 +1,4 @@ +{ + "type": "tconstruct:tool_building", + "result": "cosmiccore:wire_cutter" +} \ No newline at end of file diff --git a/src/main/resources/data/cosmiccore/tinkering/station_layouts/wire_cutter.json b/src/main/resources/data/cosmiccore/tinkering/station_layouts/wire_cutter.json new file mode 100644 index 000000000..451d7164a --- /dev/null +++ b/src/main/resources/data/cosmiccore/tinkering/station_layouts/wire_cutter.json @@ -0,0 +1,45 @@ +{ + "icon": { + "item": "cosmiccore:wire_cutter", + "nbt": "{Damage:0,tic_broken:0b,tic_display:1b,tic_materials:[\"tconstruct:ui_render#head\",\"tconstruct:ui_render#head\",\"tconstruct:ui_render#extra\",\"tconstruct:ui_render#handle\",\"tconstruct:ui_render#handle\"]}" + }, + "input_slots": [ + { + "filter": { "item": "tconstruct:small_blade" }, + "icon": "tconstruct:small_blade", + "translation_key": "item.tconstruct.small_blade", + "x": 44, + "y": 29 + }, + { + "filter": { "item": "tconstruct:small_blade" }, + "icon": "tconstruct:small_blade", + "translation_key": "item.tconstruct.small_blade", + "x": 25, + "y": 20 + }, + { + "filter": { "item": "tconstruct:tool_binding" }, + "icon": "tconstruct:tool_binding", + "translation_key": "item.tconstruct.tool_binding", + "x": 50, + "y": 48 + }, + { + "filter": { "item": "tconstruct:tool_handle" }, + "icon": "tconstruct:tool_handle", + "translation_key": "item.tconstruct.tool_handle", + "x": 21, + "y": 52 + }, + { + "filter": { "item": "tconstruct:tool_handle" }, + "icon": "tconstruct:tool_handle", + "translation_key": "item.tconstruct.tool_handle", + "x": 70, + "y": 36 + } + ], + "sortIndex": 25, + "translation_key": "item.cosmiccore.wire_cutter" +} From 4cde461f87bcaf338986c66fa53f2ed9475e6ba1 Mon Sep 17 00:00:00 2001 From: Ghostipedia Date: Sat, 20 Sep 2025 06:08:12 -0400 Subject: [PATCH 05/17] Im stupid i can use datagen for lang. --- .../resources/assets/cosmiccore/lang/en_ud.json | 2 ++ .../resources/assets/cosmiccore/lang/en_us.json | 2 ++ .../cosmiccore/common/data/lang/CosmicLangHandler.java | 9 +++++++++ src/main/resources/assets/cosmiccore/lang/en_us.json | 4 ---- 4 files changed, 13 insertions(+), 4 deletions(-) delete mode 100644 src/main/resources/assets/cosmiccore/lang/en_us.json diff --git a/src/generated/resources/assets/cosmiccore/lang/en_ud.json b/src/generated/resources/assets/cosmiccore/lang/en_ud.json index f89c1bbd0..4e2cbeebd 100644 --- a/src/generated/resources/assets/cosmiccore/lang/en_ud.json +++ b/src/generated/resources/assets/cosmiccore/lang/en_ud.json @@ -658,6 +658,8 @@ "item.cosmiccore.wafer_pragmiso": "]sɔısʎɥԀ[ ɹǝɟɐM osıɯbɐɹԀ", "item.cosmiccore.waxed_leather": "ɹǝɥʇɐǝꞀ pǝxɐM", "item.cosmiccore.wicked_essence": "ǝɔuǝssƎ pǝʞɔıM", + "item.cosmiccore.wire_cutter": "sɹǝʇʇnƆ ǝɹıM", + "item.cosmiccore.wire_cutter.description": "˙sɹǝʇʇnɔ ǝsǝɥʇ ɥʇıʍ ʎןuɐǝןɔ sǝɹıʍ dıuS", "item.cosmiccore.wired_petri_dish": "ɥsıᗡ ıɹʇǝԀ pǝɹıM", "item.cosmiccore.wireless_pda": "ⱯᗡԀ ɐʇɐᗡ ssǝןǝɹıM", "item.cosmiccore.wrathful_spirit": "ʇıɹıdS ןnɟɥʇɐɹM", diff --git a/src/generated/resources/assets/cosmiccore/lang/en_us.json b/src/generated/resources/assets/cosmiccore/lang/en_us.json index 5fc9ca2c6..621d4b976 100644 --- a/src/generated/resources/assets/cosmiccore/lang/en_us.json +++ b/src/generated/resources/assets/cosmiccore/lang/en_us.json @@ -658,6 +658,8 @@ "item.cosmiccore.wafer_pragmiso": "Pragmiso Wafer [Physics]", "item.cosmiccore.waxed_leather": "Waxed Leather", "item.cosmiccore.wicked_essence": "Wicked Essence", + "item.cosmiccore.wire_cutter": "Wire Cutters", + "item.cosmiccore.wire_cutter.description": "Snip wires cleanly with these cutters.", "item.cosmiccore.wired_petri_dish": "Wired Petri Dish", "item.cosmiccore.wireless_pda": "Wireless Data PDA", "item.cosmiccore.wrathful_spirit": "Wrathful Spirit", diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/lang/CosmicLangHandler.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/lang/CosmicLangHandler.java index 1fa43d85f..789c62cd0 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/lang/CosmicLangHandler.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/lang/CosmicLangHandler.java @@ -351,5 +351,14 @@ public static void init(RegistrateLangProvider provider) { provider.add("cosmiccore.item.spraycan.tooltip.solvent_mode", "Spraycan in SOLVENT mode"); provider.add("cosmiccore.item.linked_terminal.boundTo", "Bound to %s"); + + //Tinkers + provider.add("item.cosmiccore.wire_cutter", "Wire Cutters"); + provider.add("item.cosmiccore.wire_cutter.description", "Snip wires cleanly with these cutters."); + + + + + } } diff --git a/src/main/resources/assets/cosmiccore/lang/en_us.json b/src/main/resources/assets/cosmiccore/lang/en_us.json deleted file mode 100644 index e10259146..000000000 --- a/src/main/resources/assets/cosmiccore/lang/en_us.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "item.cosmiccore.wire_cutter": "Wire Cutters", - "item.cosmiccore.wire_cutter.description": "Snip wires cleanly with these cutters." -} \ No newline at end of file From 8897ee96191c74a30bcb513312ba12405755dd57 Mon Sep 17 00:00:00 2001 From: Ghostipedia Date: Sat, 20 Sep 2025 06:14:22 -0400 Subject: [PATCH 06/17] YEAAAH SPOTLESS WOOO YEAH SPOTLESS --- .../ghostipedia/cosmiccore/CosmicCore.java | 12 +++++--- .../recipe/ingredient/TinkerIngredient.java | 1 + .../common/data/CosmicCreativeModeTabs.java | 9 +++--- .../common/data/lang/CosmicLangHandler.java | 7 +---- .../item/tcon/CosmicCreativeTinkersTab.java | 10 +++---- .../item/tcon/CosmicTconBlockTagProvider.java | 9 +++--- .../item/tcon/CosmicTconItemTagProvider.java | 21 +++++++------- .../common/item/tcon/CosmicTinkerTools.java | 17 +++++------ .../item/tcon/CosmicToolDefinitions.java | 6 ---- .../item/tcon/CosmicToolDefitionProvider.java | 29 ++++++++++--------- .../mixin/tinkers/ModifiableItemMixin.java | 4 +-- 11 files changed, 60 insertions(+), 65 deletions(-) diff --git a/src/main/java/com/ghostipedia/cosmiccore/CosmicCore.java b/src/main/java/com/ghostipedia/cosmiccore/CosmicCore.java index ce4e83615..c5bf59ca2 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/CosmicCore.java +++ b/src/main/java/com/ghostipedia/cosmiccore/CosmicCore.java @@ -96,18 +96,22 @@ public static void init() { public static ResourceLocation id(String path) { return new ResourceLocation(MOD_ID, path); } + @SubscribeEvent - public void gatherDataEvent(GatherDataEvent event){ + public void gatherDataEvent(GatherDataEvent event) { DataGenerator generator = event.getGenerator(); PackOutput packOutput = generator.getPackOutput(); ExistingFileHelper existingFileHelper = event.getExistingFileHelper(); boolean server = event.includeServer(); boolean client = event.includeClient(); - CosmicTconBlockTagProvider blockTags = new CosmicTconBlockTagProvider(packOutput,event.getLookupProvider(),existingFileHelper); - generator.addProvider(server,blockTags); + CosmicTconBlockTagProvider blockTags = new CosmicTconBlockTagProvider(packOutput, event.getLookupProvider(), + existingFileHelper); + generator.addProvider(server, blockTags); generator.addProvider(server, new CosmicToolDefitionProvider(packOutput)); - generator.addProvider(server, new CosmicTconItemTagProvider(packOutput,event.getLookupProvider(),blockTags.contentsGetter(),existingFileHelper)); + generator.addProvider(server, new CosmicTconItemTagProvider(packOutput, event.getLookupProvider(), + blockTags.contentsGetter(), existingFileHelper)); } + @SubscribeEvent public void registerMaterialRegistry(MaterialRegistryEvent event) { MATERIAL_REGISTRY = GTCEuAPI.materialManager.createRegistry(CosmicCore.MOD_ID); diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/recipe/ingredient/TinkerIngredient.java b/src/main/java/com/ghostipedia/cosmiccore/api/recipe/ingredient/TinkerIngredient.java index ee686b393..f089eedad 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/api/recipe/ingredient/TinkerIngredient.java +++ b/src/main/java/com/ghostipedia/cosmiccore/api/recipe/ingredient/TinkerIngredient.java @@ -20,6 +20,7 @@ import slimeknights.tconstruct.library.tools.nbt.ToolStack; import java.util.stream.Stream; + public class TinkerIngredient extends Ingredient { public static final ResourceLocation TYPE = CosmicCore.id("tool_ingredient"); diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicCreativeModeTabs.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicCreativeModeTabs.java index 8fe4c06fc..86d315a97 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicCreativeModeTabs.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicCreativeModeTabs.java @@ -1,8 +1,8 @@ package com.ghostipedia.cosmiccore.common.data; import com.ghostipedia.cosmiccore.CosmicCore; - import com.ghostipedia.cosmiccore.common.item.tcon.CosmicCreativeTinkersTab; + import com.gregtechceu.gtceu.common.data.GTCreativeModeTabs; import net.minecraft.world.item.CreativeModeTab; @@ -21,11 +21,12 @@ public class CosmicCreativeModeTabs { .build()) .register(); - - public static RegistryEntry COSMIC_CORE_TINKERS_TOOLS = REGISTRATE.defaultCreativeTab(CosmicCore.MOD_ID, + public static RegistryEntry COSMIC_CORE_TINKERS_TOOLS = REGISTRATE + .defaultCreativeTab(CosmicCore.MOD_ID, builder -> builder .displayItems(CosmicCreativeTinkersTab::addCreativeTabItems) - .title(REGISTRATE.addLang("itemGroup", CosmicCore.id("creative_tab_tinker_tools"), "Cosmic Core Tinkers Compat")) + .title(REGISTRATE.addLang("itemGroup", CosmicCore.id("creative_tab_tinker_tools"), + "Cosmic Core Tinkers Compat")) .icon(CosmicItems.RUNE_CONJUNCTION_VALKRUTH::asStack) .build()) .register(); diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/lang/CosmicLangHandler.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/lang/CosmicLangHandler.java index 3328a96af..020010e22 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/lang/CosmicLangHandler.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/lang/CosmicLangHandler.java @@ -366,13 +366,8 @@ public static void init(RegistrateLangProvider provider) { provider.add("cosmiccore.item.linked_terminal.boundTo", "Bound to %s"); - //Tinkers + // Tinkers provider.add("item.cosmiccore.wire_cutter", "Wire Cutters"); provider.add("item.cosmiccore.wire_cutter.description", "Snip wires cleanly with these cutters."); - - - - - } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicCreativeTinkersTab.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicCreativeTinkersTab.java index d3f15aa69..5c0f029da 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicCreativeTinkersTab.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicCreativeTinkersTab.java @@ -2,6 +2,7 @@ import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.ItemStack; + import slimeknights.mantle.registration.object.EnumObject; import slimeknights.tconstruct.library.tools.helper.ToolBuildHandler; import slimeknights.tconstruct.library.tools.item.IModifiable; @@ -11,19 +12,18 @@ public class CosmicCreativeTinkersTab { - public static void addCreativeTabItems(CreativeModeTab.ItemDisplayParameters itemDisplayParameters, CreativeModeTab.Output tab){ + public static void addCreativeTabItems(CreativeModeTab.ItemDisplayParameters itemDisplayParameters, + CreativeModeTab.Output tab) { Consumer output = tab::accept; acceptTool(output, CosmicTinkerTools.wireCutter); acceptTool(output, CosmicTinkerTools.wrench); } - - - private static void acceptTool(Consumer output, Supplier tool) { ToolBuildHandler.addVariants(output, tool.get(), ""); } - private static void acceptTools(Consumer output, EnumObject tools) { + + private static void acceptTools(Consumer output, EnumObject tools) { tools.forEach(tool -> ToolBuildHandler.addVariants(output, tool, "")); } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTconBlockTagProvider.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTconBlockTagProvider.java index fccf4dc89..3c27326ca 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTconBlockTagProvider.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTconBlockTagProvider.java @@ -1,7 +1,7 @@ package com.ghostipedia.cosmiccore.common.item.tcon; - import com.ghostipedia.cosmiccore.CosmicCore; + import net.minecraft.core.HolderLookup; import net.minecraft.data.PackOutput; import net.minecraftforge.common.data.BlockTagsProvider; @@ -11,12 +11,11 @@ public class CosmicTconBlockTagProvider extends BlockTagsProvider { - public CosmicTconBlockTagProvider(PackOutput packOutput, CompletableFuture registries, ExistingFileHelper existingFileHelper) { + public CosmicTconBlockTagProvider(PackOutput packOutput, CompletableFuture registries, + ExistingFileHelper existingFileHelper) { super(packOutput, registries, CosmicCore.MOD_ID, existingFileHelper); } @Override - protected void addTags(HolderLookup.Provider provider) { - - } + protected void addTags(HolderLookup.Provider provider) {} } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTconItemTagProvider.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTconItemTagProvider.java index a9dc88971..f98a4dace 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTconItemTagProvider.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTconItemTagProvider.java @@ -1,29 +1,28 @@ package com.ghostipedia.cosmiccore.common.item.tcon; import com.ghostipedia.cosmiccore.CosmicCore; + import com.gregtechceu.gtceu.data.recipe.CustomTags; + import net.minecraft.core.HolderLookup; import net.minecraft.data.PackOutput; import net.minecraft.data.tags.ItemTagsProvider; -import net.minecraft.tags.ItemTags; import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.Block; import net.minecraftforge.common.data.ExistingFileHelper; -import slimeknights.tconstruct.TConstruct; -import slimeknights.tconstruct.tools.TinkerTools; import java.util.concurrent.CompletableFuture; import static net.minecraft.tags.ItemTags.CLUSTER_MAX_HARVESTABLES; import static slimeknights.tconstruct.common.TinkerTags.Items.*; - public class CosmicTconItemTagProvider extends ItemTagsProvider { - - public CosmicTconItemTagProvider(PackOutput output, CompletableFuture lookupProvider, CompletableFuture> blockTagProvider, ExistingFileHelper existingFileHelper) { + public CosmicTconItemTagProvider(PackOutput output, CompletableFuture lookupProvider, + CompletableFuture> blockTagProvider, + ExistingFileHelper existingFileHelper) { super(output, lookupProvider, blockTagProvider, CosmicCore.MOD_ID, existingFileHelper); } @@ -32,13 +31,15 @@ protected void addTags(HolderLookup.Provider provider) { this.addTools(); } - private void addTools() { - addToolTags(CosmicTinkerTools.wireCutter, MULTIPART_TOOL, DURABILITY, HARVEST_PRIMARY, CustomTags.WIRE_CUTTERS, CustomTags.CRAFTING_WIRE_CUTTERS, MELEE_WEAPON, INTERACTABLE_RIGHT, AOE, CLUSTER_MAX_HARVESTABLES, SMALL_TOOLS, BONUS_SLOTS); - addToolTags(CosmicTinkerTools.wrench, MULTIPART_TOOL, DURABILITY, HARVEST_PRIMARY, CustomTags.WRENCHES, CustomTags.CRAFTING_WRENCHES, MELEE_WEAPON, INTERACTABLE_RIGHT, AOE, CLUSTER_MAX_HARVESTABLES, SMALL_TOOLS, BONUS_SLOTS); + addToolTags(CosmicTinkerTools.wireCutter, MULTIPART_TOOL, DURABILITY, HARVEST_PRIMARY, CustomTags.WIRE_CUTTERS, + CustomTags.CRAFTING_WIRE_CUTTERS, MELEE_WEAPON, INTERACTABLE_RIGHT, AOE, CLUSTER_MAX_HARVESTABLES, + SMALL_TOOLS, BONUS_SLOTS); + addToolTags(CosmicTinkerTools.wrench, MULTIPART_TOOL, DURABILITY, HARVEST_PRIMARY, CustomTags.WRENCHES, + CustomTags.CRAFTING_WRENCHES, MELEE_WEAPON, INTERACTABLE_RIGHT, AOE, CLUSTER_MAX_HARVESTABLES, + SMALL_TOOLS, BONUS_SLOTS); } - @SafeVarargs private void addToolTags(ItemLike tool, TagKey... tags) { Item item = tool.asItem(); diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerTools.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerTools.java index ff9138616..b16390185 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerTools.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerTools.java @@ -1,26 +1,25 @@ package com.ghostipedia.cosmiccore.common.item.tcon; import com.ghostipedia.cosmiccore.CosmicCore; + import net.minecraft.world.item.Item; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; + import slimeknights.mantle.registration.object.ItemObject; import slimeknights.tconstruct.common.registration.ItemDeferredRegisterExtension; import slimeknights.tconstruct.library.tools.item.ModifiableItem; -import slimeknights.tconstruct.tools.ToolDefinitions; public class CosmicTinkerTools { - protected static final ItemDeferredRegisterExtension COSMIC_TINKER_ITEM = new ItemDeferredRegisterExtension(CosmicCore.MOD_ID); - + protected static final ItemDeferredRegisterExtension COSMIC_TINKER_ITEM = new ItemDeferredRegisterExtension( + CosmicCore.MOD_ID); private static final Item.Properties UNSTACKABLE_PROPS = new Item.Properties().stacksTo(1); - - - - public static final ItemObject wireCutter = COSMIC_TINKER_ITEM.register("wire_cutter", () -> new ModifiableItem(UNSTACKABLE_PROPS, CosmicToolDefinitions.WIRE_CUTTERS)); - public static final ItemObject wrench = COSMIC_TINKER_ITEM.register("wrench", () -> new ModifiableItem(UNSTACKABLE_PROPS, CosmicToolDefinitions.WRENCHES)); - + public static final ItemObject wireCutter = COSMIC_TINKER_ITEM.register("wire_cutter", + () -> new ModifiableItem(UNSTACKABLE_PROPS, CosmicToolDefinitions.WIRE_CUTTERS)); + public static final ItemObject wrench = COSMIC_TINKER_ITEM.register("wrench", + () -> new ModifiableItem(UNSTACKABLE_PROPS, CosmicToolDefinitions.WRENCHES)); public static void init() { COSMIC_TINKER_ITEM.register(FMLJavaModLoadingContext.get().getModEventBus()); diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitions.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitions.java index 1eb3381c0..5b1e85950 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitions.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitions.java @@ -3,16 +3,10 @@ import lombok.AccessLevel; import lombok.NoArgsConstructor; import slimeknights.tconstruct.library.tools.definition.ToolDefinition; -import slimeknights.tconstruct.tools.TinkerTools; - @NoArgsConstructor(access = AccessLevel.PRIVATE) public class CosmicToolDefinitions { - - public static final ToolDefinition WIRE_CUTTERS = ToolDefinition.create(CosmicTinkerTools.wireCutter); public static final ToolDefinition WRENCHES = ToolDefinition.create(CosmicTinkerTools.wrench); - - } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefitionProvider.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefitionProvider.java index 9ba277018..fa440375d 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefitionProvider.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefitionProvider.java @@ -1,8 +1,11 @@ package com.ghostipedia.cosmiccore.common.item.tcon; import com.ghostipedia.cosmiccore.CosmicCore; + import com.gregtechceu.gtceu.data.recipe.CustomTags; + import net.minecraft.data.PackOutput; + import slimeknights.tconstruct.library.data.tinkering.AbstractToolDefinitionDataProvider; import slimeknights.tconstruct.library.materials.RandomMaterial; import slimeknights.tconstruct.library.tools.definition.module.build.SetStatsModule; @@ -16,7 +19,6 @@ public class CosmicToolDefitionProvider extends AbstractToolDefinitionDataProvider { - public CosmicToolDefitionProvider(PackOutput packOutput) { super(packOutput, CosmicCore.MOD_ID); } @@ -25,16 +27,21 @@ public CosmicToolDefitionProvider(PackOutput packOutput) { protected void addToolDefinitions() { RandomMaterial tier1Material = RandomMaterial.random().tier(1).build(); RandomMaterial randomMaterial = RandomMaterial.random().allowHidden().build(); - DefaultMaterialsModule defaultTwoParts = DefaultMaterialsModule.builder().material(tier1Material, tier1Material).build(); - DefaultMaterialsModule defaultThreeParts = DefaultMaterialsModule.builder().material(tier1Material, tier1Material, tier1Material).build(); - DefaultMaterialsModule defaultFourParts = DefaultMaterialsModule.builder().material(tier1Material, tier1Material, tier1Material, tier1Material).build(); - DefaultMaterialsModule defaultFiveParts = DefaultMaterialsModule.builder().material(tier1Material, tier1Material, tier1Material, tier1Material, tier1Material).build(); - DefaultMaterialsModule ancientTwoParts = DefaultMaterialsModule.builder().material(randomMaterial, randomMaterial).build(); - DefaultMaterialsModule ancientThreeParts = DefaultMaterialsModule.builder().material(randomMaterial, randomMaterial, randomMaterial).build(); + DefaultMaterialsModule defaultTwoParts = DefaultMaterialsModule.builder().material(tier1Material, tier1Material) + .build(); + DefaultMaterialsModule defaultThreeParts = DefaultMaterialsModule.builder() + .material(tier1Material, tier1Material, tier1Material).build(); + DefaultMaterialsModule defaultFourParts = DefaultMaterialsModule.builder() + .material(tier1Material, tier1Material, tier1Material, tier1Material).build(); + DefaultMaterialsModule defaultFiveParts = DefaultMaterialsModule.builder() + .material(tier1Material, tier1Material, tier1Material, tier1Material, tier1Material).build(); + DefaultMaterialsModule ancientTwoParts = DefaultMaterialsModule.builder() + .material(randomMaterial, randomMaterial).build(); + DefaultMaterialsModule ancientThreeParts = DefaultMaterialsModule.builder() + .material(randomMaterial, randomMaterial, randomMaterial).build(); // pickaxes - define(CosmicToolDefinitions.WIRE_CUTTERS) .module(PartStatsModule.parts() @@ -49,8 +56,6 @@ protected void addToolDefinitions() { .build())) .module(IsEffectiveModule.tag(CustomTags.MINEABLE_WITH_WIRE_CUTTER)); - - define(CosmicToolDefinitions.WRENCHES) .module(PartStatsModule.parts() @@ -63,10 +68,6 @@ protected void addToolDefinitions() { .set(ToolStats.ATTACK_SPEED, 0.9f) .build())) .module(IsEffectiveModule.tag(CustomTags.MINEABLE_WITH_WRENCH)); - - - - } @Override diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/tinkers/ModifiableItemMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/tinkers/ModifiableItemMixin.java index 74ea5fa93..e6ad6daa5 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/mixin/tinkers/ModifiableItemMixin.java +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/tinkers/ModifiableItemMixin.java @@ -13,7 +13,7 @@ import slimeknights.tconstruct.library.tools.nbt.ToolStack; @Debug( - export = true) + export = true) @Mixin(value = ModifiableItem.class, remap = false) public class ModifiableItemMixin extends TieredItem { @@ -35,4 +35,4 @@ public ItemStack getCraftingRemainingItem(ItemStack itemStack) { return stack; } -} \ No newline at end of file +} From dd5d1fd2e0a34b01f81ce6a36142f785108312d0 Mon Sep 17 00:00:00 2001 From: Ghostipedia Date: Sat, 20 Sep 2025 07:02:49 -0400 Subject: [PATCH 07/17] Wrench head but it doesn't show in EMI as variants (IDK IF ANYTHING ELSE WORKS LOL) --- .../ghostipedia/cosmiccore/CosmicCore.java | 6 ++-- .../api/plugins/CosmicEMIPlugin.java | 36 +++++++++++++++++++ .../item/tcon/CosmicTinkerToolPart.java | 24 +++++++++++++ .../recipes/tools/parts/wrench_head.json | 7 ++++ .../tags/items/tconstruct/tool_parts.json | 1 + 5 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/ghostipedia/cosmiccore/api/plugins/CosmicEMIPlugin.java create mode 100644 src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerToolPart.java create mode 100644 src/main/resources/data/cosmiccore/recipes/tools/parts/wrench_head.json create mode 100644 src/main/resources/data/cosmiccore/tags/items/tconstruct/tool_parts.json diff --git a/src/main/java/com/ghostipedia/cosmiccore/CosmicCore.java b/src/main/java/com/ghostipedia/cosmiccore/CosmicCore.java index c5bf59ca2..8665bc4a5 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/CosmicCore.java +++ b/src/main/java/com/ghostipedia/cosmiccore/CosmicCore.java @@ -11,10 +11,7 @@ import com.ghostipedia.cosmiccore.common.data.materials.CosmicMaterialSet; import com.ghostipedia.cosmiccore.common.data.materials.CosmicMaterials; import com.ghostipedia.cosmiccore.common.item.behavior.GravityCoreBehavior; -import com.ghostipedia.cosmiccore.common.item.tcon.CosmicTconBlockTagProvider; -import com.ghostipedia.cosmiccore.common.item.tcon.CosmicTconItemTagProvider; -import com.ghostipedia.cosmiccore.common.item.tcon.CosmicTinkerTools; -import com.ghostipedia.cosmiccore.common.item.tcon.CosmicToolDefitionProvider; +import com.ghostipedia.cosmiccore.common.item.tcon.*; import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.modular.MultiblockInit; import com.ghostipedia.cosmiccore.common.network.CCoreNetwork; import com.ghostipedia.cosmiccore.common.recipe.condition.CosmicConditions; @@ -85,6 +82,7 @@ public static void init() { CosmicBlockEntities.init(); CosmicItems.init(); CosmicTinkerTools.init(); + CosmicTinkerToolPart.init(); CosmicBotanyItemRegistration.init(); CosmicRegistration.REGISTRATE.registerRegistrate(); CosmicCoreDatagen.init(); diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/plugins/CosmicEMIPlugin.java b/src/main/java/com/ghostipedia/cosmiccore/api/plugins/CosmicEMIPlugin.java new file mode 100644 index 000000000..2448dce2f --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/plugins/CosmicEMIPlugin.java @@ -0,0 +1,36 @@ +package com.ghostipedia.cosmiccore.api.plugins; + +import dev.emi.emi.api.EmiEntrypoint; +import dev.emi.emi.api.EmiPlugin; +import dev.emi.emi.api.EmiRegistry; +import dev.emi.emi.api.stack.EmiStack; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import slimeknights.tconstruct.common.TinkerTags; +import slimeknights.tconstruct.library.materials.MaterialRegistry; +import slimeknights.tconstruct.library.materials.definition.MaterialVariantId; +import slimeknights.tconstruct.library.tools.part.IMaterialItem; +import slimeknights.tconstruct.tools.stats.HeadMaterialStats; + +import java.util.ArrayList; +import java.util.List; + +@EmiEntrypoint +public class CosmicEMIPlugin implements EmiPlugin { + @Override + public void register(EmiRegistry registry) { + // Show all material variants for every TCon tool part + for (Holder holder : BuiltInRegistries.ITEM.getTagOrEmpty(TinkerTags.Items.TOOL_PARTS)) { + Item item = holder.value(); + if (item instanceof IMaterialItem materialItem) { + List variants = new ArrayList<>(); + materialItem.addVariants(variants::add, ""); + for (ItemStack stack : variants) { + registry.addEmiStack(EmiStack.of(stack)); + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerToolPart.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerToolPart.java new file mode 100644 index 000000000..4d6ac7fe6 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerToolPart.java @@ -0,0 +1,24 @@ +package com.ghostipedia.cosmiccore.common.item.tcon; + +import com.ghostipedia.cosmiccore.CosmicCore; +import net.minecraft.world.item.Item; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import slimeknights.mantle.registration.object.ItemObject; +import slimeknights.tconstruct.TConstruct; +import slimeknights.tconstruct.common.registration.ItemDeferredRegisterExtension; +import slimeknights.tconstruct.library.tools.part.ToolPartItem; +import slimeknights.tconstruct.tools.stats.HeadMaterialStats; + +public class CosmicTinkerToolPart { + + //Tinkers uses Protected in their Registry class to seal it, we should do the same to avoid conflicts!! + protected static final ItemDeferredRegisterExtension COSMIC_TINKER_PARTS = new ItemDeferredRegisterExtension(CosmicCore.MOD_ID); + protected static final Item.Properties ITEM_PROPS = new Item.Properties(); + + public static final ItemObject wrenchHead = COSMIC_TINKER_PARTS.register("wrench_head", () -> new ToolPartItem(ITEM_PROPS, HeadMaterialStats.ID)); + + public static void init() { + COSMIC_TINKER_PARTS.register(FMLJavaModLoadingContext.get().getModEventBus()); + } + +} diff --git a/src/main/resources/data/cosmiccore/recipes/tools/parts/wrench_head.json b/src/main/resources/data/cosmiccore/recipes/tools/parts/wrench_head.json new file mode 100644 index 000000000..14ff901fe --- /dev/null +++ b/src/main/resources/data/cosmiccore/recipes/tools/parts/wrench_head.json @@ -0,0 +1,7 @@ +{ + "type": "tconstruct:part_builder", + "pattern": { "item": "tconstruct:pattern" }, + "pattern_id": "cosmiccore:wrench_head", + "result": { "item": "cosmiccore:wrench_head" }, + "cost": 1 +} diff --git a/src/main/resources/data/cosmiccore/tags/items/tconstruct/tool_parts.json b/src/main/resources/data/cosmiccore/tags/items/tconstruct/tool_parts.json new file mode 100644 index 000000000..590333bfa --- /dev/null +++ b/src/main/resources/data/cosmiccore/tags/items/tconstruct/tool_parts.json @@ -0,0 +1 @@ +{ "values": ["cosmiccore:wrench_head"] } From 6a1916c94c50e76a1c26fb3b58738ab703f78ce6 Mon Sep 17 00:00:00 2001 From: Ghostipedia Date: Sat, 20 Sep 2025 12:52:15 -0400 Subject: [PATCH 08/17] Wrenches - They have a Custom Toolhead. --- dependencies.gradle | 1 + gradle/forge.versions.toml | 2 +- gradle/libs.versions.toml | 6 +-- .../assets/cosmiccore/lang/en_ud.json | 8 +++- .../assets/cosmiccore/lang/en_us.json | 8 +++- .../models/item/wrench_head_cast.json | 6 +++ .../models/item/wrench_head_sand_cast.json | 6 +++ .../items/casts/multi_use/wrench_head.json | 5 ++ .../items/casts/single_use/wrench_head.json | 5 ++ .../tinkering/tool_definitions/wrench.json | 7 +-- .../data/forge/tags/items/tools/wrench.json | 5 -- .../common/data/CosmicCreativeModeTabs.java | 43 +++++++++++------- .../cosmiccore/common/data/CosmicItems.java | 16 +++++++ .../common/data/lang/CosmicLangHandler.java | 4 ++ .../common/data/tag/item/CosmicItemTags.java | 4 ++ .../item/tcon/CosmicCreativeTinkersTab.java | 19 ++++++++ .../item/tcon/CosmicTinkerToolPart.java | 16 ++++++- .../item/tcon/CosmicToolDefitionProvider.java | 6 +-- .../assets/cosmiccore/models/item/wrench.json | 22 +++++++++ .../cosmiccore/models/item/wrench_broken.json | 7 +++ .../cosmiccore/models/item/wrench_head.json | 11 +++++ .../textures/gui/tinker_pattern/wrench.png | Bin 0 -> 176 bytes .../gui/tinker_pattern/wrench_head.png | Bin 0 -> 176 bytes .../textures/item/tool/wrench/binding.png | Bin 0 -> 198 bytes .../textures/item/tool/wrench/broken.png | Bin 0 -> 234 bytes .../textures/item/tool/wrench/handle.png | Bin 0 -> 251 bytes .../textures/item/tool/wrench/head.png | Bin 0 -> 284 bytes .../tool/wrench/head_tconstruct_unknown.png | Bin 0 -> 176 bytes .../textures/item/tool/wrench/head_tool.png | Bin 0 -> 266 bytes .../textures/item/wrench_head_cast.png | Bin 0 -> 365 bytes .../textures/item/wrench_head_sand_cast.png | Bin 0 -> 480 bytes .../casting/wrench_head_cast_from_gold.json | 9 ++++ .../casting/wrench_head_cast_from_sand.json | 9 ++++ .../parts/wrench_head_casting_gold.json | 7 +++ .../parts/wrench_head_casting_sand.json | 7 +++ .../recipes/tools/parts/wrench_head.json | 8 ++-- .../data/cosmiccore/recipes/tools/wrench.json | 5 ++ .../tags/items/tconstruct/parts.json | 3 ++ .../tags/items/tconstruct/tool_parts.json | 4 +- .../tinkering/station_layouts/wrench.json | 15 ++++++ 40 files changed, 231 insertions(+), 43 deletions(-) create mode 100644 src/generated/resources/assets/cosmiccore/models/item/wrench_head_cast.json create mode 100644 src/generated/resources/assets/cosmiccore/models/item/wrench_head_sand_cast.json create mode 100644 src/generated/resources/data/cosmiccore/tags/items/casts/multi_use/wrench_head.json create mode 100644 src/generated/resources/data/cosmiccore/tags/items/casts/single_use/wrench_head.json delete mode 100644 src/generated/resources/data/forge/tags/items/tools/wrench.json create mode 100644 src/main/resources/assets/cosmiccore/models/item/wrench.json create mode 100644 src/main/resources/assets/cosmiccore/models/item/wrench_broken.json create mode 100644 src/main/resources/assets/cosmiccore/models/item/wrench_head.json create mode 100644 src/main/resources/assets/cosmiccore/textures/gui/tinker_pattern/wrench.png create mode 100644 src/main/resources/assets/cosmiccore/textures/gui/tinker_pattern/wrench_head.png create mode 100644 src/main/resources/assets/cosmiccore/textures/item/tool/wrench/binding.png create mode 100644 src/main/resources/assets/cosmiccore/textures/item/tool/wrench/broken.png create mode 100644 src/main/resources/assets/cosmiccore/textures/item/tool/wrench/handle.png create mode 100644 src/main/resources/assets/cosmiccore/textures/item/tool/wrench/head.png create mode 100644 src/main/resources/assets/cosmiccore/textures/item/tool/wrench/head_tconstruct_unknown.png create mode 100644 src/main/resources/assets/cosmiccore/textures/item/tool/wrench/head_tool.png create mode 100644 src/main/resources/assets/cosmiccore/textures/item/wrench_head_cast.png create mode 100644 src/main/resources/assets/cosmiccore/textures/item/wrench_head_sand_cast.png create mode 100644 src/main/resources/data/cosmiccore/recipes/tconstruct/casting/wrench_head_cast_from_gold.json create mode 100644 src/main/resources/data/cosmiccore/recipes/tconstruct/casting/wrench_head_cast_from_sand.json create mode 100644 src/main/resources/data/cosmiccore/recipes/tconstruct/parts/wrench_head_casting_gold.json create mode 100644 src/main/resources/data/cosmiccore/recipes/tconstruct/parts/wrench_head_casting_sand.json create mode 100644 src/main/resources/data/cosmiccore/recipes/tools/wrench.json create mode 100644 src/main/resources/data/cosmiccore/tags/items/tconstruct/parts.json create mode 100644 src/main/resources/data/cosmiccore/tinkering/station_layouts/wrench.json diff --git a/dependencies.gradle b/dependencies.gradle index cd49c685d..04cdf2d6d 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -3,6 +3,7 @@ dependencies { modRuntimeOnly("curse.maven:worldedit-225608:4586218") //Worldedit bc i'm lazy ty modRuntimeOnly("curse.maven:effortless-building-302113:4979089") //EB bc i'm lazy ty + modRuntimeOnly("curse.maven:tmrv-1194921:6856065") //EB bc i'm lazy ty //Botania // implementation(forge.botania) diff --git a/gradle/forge.versions.toml b/gradle/forge.versions.toml index d83b16dca..9ee67195d 100644 --- a/gradle/forge.versions.toml +++ b/gradle/forge.versions.toml @@ -6,7 +6,7 @@ configuration = "3.1.0-forge" mixinExtras = "0.2.0" jei = "15.20.0.105" -emi = "1.1.13+1.20.1" +emi = "1.1.22+1.20.1" ae2 = "15.4.7-cosmolite.12" expandedAE = "1.2.0-cosmolite.6" guideme = "20.1.11" diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 18d569832..851f1428a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,11 +1,11 @@ [versions] minecraft = "1.20.1" -forge = "47.3.0" -minecraftForge = "1.20.1-47.3.22" +forge = "47.4.0" +minecraftForge = "1.20.1-47.4.0" parchment = "2023.09.03" shadow = "8.3.5" spotless = "7.0.2" -modDevGradle = "2.0.96" # TODO: Update to stable MDG when https://github.com/neoforged/ModDevGradle/issues/227 is fixed +modDevGradle = "2.0.96" lombok = "8.11" jetbrains-annotations = "26.0.1" mixin = "0.8.7" diff --git a/src/generated/resources/assets/cosmiccore/lang/en_ud.json b/src/generated/resources/assets/cosmiccore/lang/en_ud.json index e40603413..71209d18f 100644 --- a/src/generated/resources/assets/cosmiccore/lang/en_ud.json +++ b/src/generated/resources/assets/cosmiccore/lang/en_ud.json @@ -672,9 +672,15 @@ "item.cosmiccore.wired_petri_dish": "ɥsıᗡ ıɹʇǝԀ pǝɹıM", "item.cosmiccore.wireless_pda": "ⱯᗡԀ ɐʇɐᗡ ssǝןǝɹıM", "item.cosmiccore.wrathful_spirit": "ʇıɹıdS ןnɟɥʇɐɹM", + "item.cosmiccore.wrench": "ɥɔuǝɹM", + "item.cosmiccore.wrench.description": "¡pןɹoM ǝɥʇ ǝʇɐʇoᴚ", + "item.cosmiccore.wrench_head": "pɐǝH ɥɔuǝɹM", + "item.cosmiccore.wrench_head_cast": "ʇsɐƆ pɐǝH ɥɔuǝɹM", + "item.cosmiccore.wrench_head_sand_cast": "ʇsɐƆ puɐS pɐǝH ɥɔuǝɹM", "item.cosmiccore.zpm_radio_module": "ǝןnpoW oıpɐᴚ WԀZ", "item.gtceu.tool.luv_meld_tool": "ןooʇıʇןnW pןǝW %s", - "itemGroup.cosmiccore.creative_tab_tinker_tools": "ʇɐdɯoƆ sɹǝʞuı⟘ ǝɹoƆ ɔıɯsoƆ", + "itemGroup.cosmiccore.creative_tab": "sɯǝʇI uıɐW ǝɹoƆ ɔıɯsoƆ", + "itemGroup.tinkers.parts.cosmiccore.creative_tab_tinker_tools": "ʇɐdɯoƆ sɹǝʞuı⟘ ǝɹoƆ ɔıɯsoƆ", "material.cosmiccore.causal_fabric": "ɔıɹqɐℲ ןɐsnɐƆ", "material.cosmiccore.chronon": "uouoɹɥƆ", "material.cosmiccore.cosmocite": "ǝʇıɔoɯsoƆ", diff --git a/src/generated/resources/assets/cosmiccore/lang/en_us.json b/src/generated/resources/assets/cosmiccore/lang/en_us.json index 75e6f7452..9c92a5fcc 100644 --- a/src/generated/resources/assets/cosmiccore/lang/en_us.json +++ b/src/generated/resources/assets/cosmiccore/lang/en_us.json @@ -672,9 +672,15 @@ "item.cosmiccore.wired_petri_dish": "Wired Petri Dish", "item.cosmiccore.wireless_pda": "Wireless Data PDA", "item.cosmiccore.wrathful_spirit": "Wrathful Spirit", + "item.cosmiccore.wrench": "Wrench", + "item.cosmiccore.wrench.description": "Rotate the World!", + "item.cosmiccore.wrench_head": "Wrench Head", + "item.cosmiccore.wrench_head_cast": "Wrench Head Cast", + "item.cosmiccore.wrench_head_sand_cast": "Wrench Head Sand Cast", "item.cosmiccore.zpm_radio_module": "ZPM Radio Module", "item.gtceu.tool.luv_meld_tool": "%s Meld Multitool", - "itemGroup.cosmiccore.creative_tab_tinker_tools": "Cosmic Core Tinkers Compat", + "itemGroup.cosmiccore.creative_tab": "Cosmic Core Main Items", + "itemGroup.tinkers.parts.cosmiccore.creative_tab_tinker_tools": "Cosmic Core Tinkers Compat", "material.cosmiccore.causal_fabric": "Causal Fabric", "material.cosmiccore.chronon": "Chronon", "material.cosmiccore.cosmocite": "Cosmocite", diff --git a/src/generated/resources/assets/cosmiccore/models/item/wrench_head_cast.json b/src/generated/resources/assets/cosmiccore/models/item/wrench_head_cast.json new file mode 100644 index 000000000..d23d82633 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/wrench_head_cast.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/wrench_head_cast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/wrench_head_sand_cast.json b/src/generated/resources/assets/cosmiccore/models/item/wrench_head_sand_cast.json new file mode 100644 index 000000000..690622691 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/wrench_head_sand_cast.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/wrench_head_sand_cast" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tags/items/casts/multi_use/wrench_head.json b/src/generated/resources/data/cosmiccore/tags/items/casts/multi_use/wrench_head.json new file mode 100644 index 000000000..e0b332939 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tags/items/casts/multi_use/wrench_head.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:wrench_head_cast" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tags/items/casts/single_use/wrench_head.json b/src/generated/resources/data/cosmiccore/tags/items/casts/single_use/wrench_head.json new file mode 100644 index 000000000..f1940bdc8 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tags/items/casts/single_use/wrench_head.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:wrench_head_sand_cast" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/tool_definitions/wrench.json b/src/generated/resources/data/cosmiccore/tinkering/tool_definitions/wrench.json index 58edc1222..ba833cb73 100644 --- a/src/generated/resources/data/cosmiccore/tinkering/tool_definitions/wrench.json +++ b/src/generated/resources/data/cosmiccore/tinkering/tool_definitions/wrench.json @@ -3,9 +3,8 @@ { "type": "tconstruct:part_stats", "parts": [ - "tconstruct:pick_head", + "cosmiccore:wrench_head", "tconstruct:tough_binding", - "tconstruct:tool_binding", "tconstruct:tool_handle" ], "primary_part": 0 @@ -21,10 +20,6 @@ "type": "tconstruct:random", "tier": 1 }, - { - "type": "tconstruct:random", - "tier": 1 - }, { "type": "tconstruct:random", "tier": 1 diff --git a/src/generated/resources/data/forge/tags/items/tools/wrench.json b/src/generated/resources/data/forge/tags/items/tools/wrench.json deleted file mode 100644 index 303d57f8b..000000000 --- a/src/generated/resources/data/forge/tags/items/tools/wrench.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "cosmiccore:wrench" - ] -} \ No newline at end of file diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicCreativeModeTabs.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicCreativeModeTabs.java index 86d315a97..60b3c7d03 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicCreativeModeTabs.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicCreativeModeTabs.java @@ -3,8 +3,13 @@ import com.ghostipedia.cosmiccore.CosmicCore; import com.ghostipedia.cosmiccore.common.item.tcon.CosmicCreativeTinkersTab; +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; +import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.common.data.GTCreativeModeTabs; +import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.common.registry.GTRegistration; import net.minecraft.world.item.CreativeModeTab; import com.tterrag.registrate.util.entry.RegistryEntry; @@ -13,23 +18,27 @@ public class CosmicCreativeModeTabs { - public static RegistryEntry COSMIC_CORE = REGISTRATE.defaultCreativeTab(CosmicCore.MOD_ID, - builder -> builder - .displayItems(new GTCreativeModeTabs.RegistrateDisplayItemsGenerator(CosmicCore.MOD_ID, REGISTRATE)) - .title(REGISTRATE.addLang("itemGroup", CosmicCore.id("creative_tab"), "Cosmic Core")) - .icon(CosmicItems.DONK::asStack) - .build()) - .register(); - - public static RegistryEntry COSMIC_CORE_TINKERS_TOOLS = REGISTRATE - .defaultCreativeTab(CosmicCore.MOD_ID, - builder -> builder - .displayItems(CosmicCreativeTinkersTab::addCreativeTabItems) - .title(REGISTRATE.addLang("itemGroup", CosmicCore.id("creative_tab_tinker_tools"), - "Cosmic Core Tinkers Compat")) - .icon(CosmicItems.RUNE_CONJUNCTION_VALKRUTH::asStack) - .build()) - .register(); + public static final RegistryEntry COSMIC_CORE = + REGISTRATE.defaultCreativeTab("main", + b -> b + .displayItems(new GTCreativeModeTabs.RegistrateDisplayItemsGenerator("main", REGISTRATE)) + .title(REGISTRATE.addLang("itemGroup", CosmicCore.id("creative_tab"), "Cosmic Core Main Items")) + .icon(CosmicItems.DONK::asStack) + .build()) + .register(); + + // Tab id: cosmiccore:tinkers_tools + public static final RegistryEntry COSMIC_CORE_TINKERS_TOOLS = + REGISTRATE.defaultCreativeTab("tinkers_tools", + b -> b + .displayItems(CosmicCreativeTinkersTab::addCreativeTabItems) + .title(REGISTRATE.addLang("itemGroup.tinkers.parts", + CosmicCore.id("creative_tab_tinker_tools"), "Cosmic Core Tinkers Compat")) + .icon(CosmicItems.RUNE_CONJUNCTION_VALKRUTH::asStack) + .build()) + .register(); + + public static void init() {} } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicItems.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicItems.java index 0f316f52f..6d3170bec 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicItems.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicItems.java @@ -1789,6 +1789,22 @@ public boolean isFoil(ItemStack stack) { .defaultModel() .register(); + + public static final ItemEntry WRENCH_CAST_GOLD = REGISTRATE + .item("wrench_head_cast", ComponentItem::create) + .lang("Wrench Head Cast") + .properties(p -> p.stacksTo(1)) + .tag(CosmicItemTags.WRENCH_HEAD_CAST_MULTI) + .defaultModel() + .register(); + public static final ItemEntry WRENCH_CAST_SAND = REGISTRATE + .item("wrench_head_sand_cast", ComponentItem::create) + .lang("Wrench Head Sand Cast") + .tag(CosmicItemTags.WRENCH_HEAD_CAST_SINGLE) + .properties(p -> p.stacksTo(1)) + .defaultModel() + .register(); + public static ItemEntry LINKED_TERMINAL = REGISTRATE .item("linked_terminal", ComponentItem::create) .lang("Linked Terminal") diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/lang/CosmicLangHandler.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/lang/CosmicLangHandler.java index 020010e22..961e169ac 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/lang/CosmicLangHandler.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/lang/CosmicLangHandler.java @@ -369,5 +369,9 @@ public static void init(RegistrateLangProvider provider) { // Tinkers provider.add("item.cosmiccore.wire_cutter", "Wire Cutters"); provider.add("item.cosmiccore.wire_cutter.description", "Snip wires cleanly with these cutters."); + + provider.add("item.cosmiccore.wrench", "Wrench"); + provider.add("item.cosmiccore.wrench_head", "Wrench Head"); + provider.add("item.cosmiccore.wrench.description", "Rotate the World!"); } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/item/CosmicItemTags.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/item/CosmicItemTags.java index 4d92d583a..0769a2cb5 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/item/CosmicItemTags.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/item/CosmicItemTags.java @@ -9,4 +9,8 @@ public class CosmicItemTags { public static final TagKey NANOMUSCLE_SPACE_SUITE = TagUtil.createModItemTag("nano_space_suite"); public static final TagKey QUARKTECH_SPACE_SUITE = TagUtil.createModItemTag("quantum_space_suite"); + public static final TagKey WRENCH_HEAD_CAST_MULTI = TagUtil.createModItemTag("casts/multi_use/wrench_head"); + public static final TagKey WRENCH_HEAD_CAST_SINGLE = TagUtil.createModItemTag("casts/single_use/wrench_head"); + + } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicCreativeTinkersTab.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicCreativeTinkersTab.java index 5c0f029da..7e6dfb06b 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicCreativeTinkersTab.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicCreativeTinkersTab.java @@ -1,28 +1,47 @@ package com.ghostipedia.cosmiccore.common.item.tcon; +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.CosmicItems; +import com.tterrag.registrate.util.entry.RegistryEntry; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.ItemStack; import slimeknights.mantle.registration.object.EnumObject; import slimeknights.tconstruct.library.tools.helper.ToolBuildHandler; import slimeknights.tconstruct.library.tools.item.IModifiable; +import slimeknights.tconstruct.library.tools.part.IMaterialItem; import java.util.function.Consumer; import java.util.function.Supplier; +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; + public class CosmicCreativeTinkersTab { + + + public static void addCreativeTabItems(CreativeModeTab.ItemDisplayParameters itemDisplayParameters, CreativeModeTab.Output tab) { Consumer output = tab::accept; acceptTool(output, CosmicTinkerTools.wireCutter); acceptTool(output, CosmicTinkerTools.wrench); + + acceptPart(output, CosmicTinkerToolPart.wrenchHead); + + } private static void acceptTool(Consumer output, Supplier tool) { ToolBuildHandler.addVariants(output, tool.get(), ""); } + public static void acceptPart(Consumer output, Supplier item){ + item.get().addVariants(output, ""); + } + + + private static void acceptTools(Consumer output, EnumObject tools) { tools.forEach(tool -> ToolBuildHandler.addVariants(output, tool, "")); } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerToolPart.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerToolPart.java index 4d6ac7fe6..3ba29bd53 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerToolPart.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerToolPart.java @@ -1,16 +1,26 @@ package com.ghostipedia.cosmiccore.common.item.tcon; import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.CosmicCreativeModeTabs; import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import slimeknights.mantle.registration.object.ItemObject; import slimeknights.tconstruct.TConstruct; import slimeknights.tconstruct.common.registration.ItemDeferredRegisterExtension; +import slimeknights.tconstruct.library.tools.part.IMaterialItem; import slimeknights.tconstruct.library.tools.part.ToolPartItem; import slimeknights.tconstruct.tools.stats.HeadMaterialStats; -public class CosmicTinkerToolPart { +import java.util.function.Consumer; +import java.util.function.Supplier; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +public class CosmicTinkerToolPart { + static { + REGISTRATE.creativeModeTab(() -> CosmicCreativeModeTabs.COSMIC_CORE_TINKERS_TOOLS); + } //Tinkers uses Protected in their Registry class to seal it, we should do the same to avoid conflicts!! protected static final ItemDeferredRegisterExtension COSMIC_TINKER_PARTS = new ItemDeferredRegisterExtension(CosmicCore.MOD_ID); protected static final Item.Properties ITEM_PROPS = new Item.Properties(); @@ -21,4 +31,8 @@ public static void init() { COSMIC_TINKER_PARTS.register(FMLJavaModLoadingContext.get().getModEventBus()); } + + private static void accept(Consumer output, Supplier item) { + item.get().addVariants(output, ""); + } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefitionProvider.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefitionProvider.java index fa440375d..8912ecd6e 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefitionProvider.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefitionProvider.java @@ -15,6 +15,7 @@ import slimeknights.tconstruct.library.tools.nbt.StatsNBT; import slimeknights.tconstruct.library.tools.stat.ToolStats; +import static com.ghostipedia.cosmiccore.common.item.tcon.CosmicTinkerToolPart.wrenchHead; import static slimeknights.tconstruct.tools.TinkerToolParts.*; public class CosmicToolDefitionProvider extends AbstractToolDefinitionDataProvider { @@ -59,11 +60,10 @@ protected void addToolDefinitions() { define(CosmicToolDefinitions.WRENCHES) .module(PartStatsModule.parts() - .part(pickHead) + .part(wrenchHead) .part(toughBinding) - .part(toolBinding) .part(toolHandle).build()) - .module(defaultFourParts) + .module(defaultThreeParts) .module(new SetStatsModule(StatsNBT.builder() .set(ToolStats.ATTACK_SPEED, 0.9f) .build())) diff --git a/src/main/resources/assets/cosmiccore/models/item/wrench.json b/src/main/resources/assets/cosmiccore/models/item/wrench.json new file mode 100644 index 000000000..268f886d0 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/wrench.json @@ -0,0 +1,22 @@ +{ + "loader": "tconstruct:tool", + "parent": "forge:item/default-tool", + "textures": { + "broken": "cosmiccore:item/tool/wrench/broken", + "head": "cosmiccore:item/tool/wrench/head_tool", + "binding":"cosmiccore:item/tool/wrench/binding", + "handle": "cosmiccore:item/tool/wrench/handle" + }, + "modifier_roots": [ "tconstruct:item/tool/pickaxe/modifiers/" ], + "parts": [ + { "name": "handle", "index": 2 }, + { "name": "binding", "index": 1 }, + { "name": "head", "index": 0 } + ], + "overrides": [ + { + "predicate": { "tconstruct:broken": 1 }, + "model": "cosmiccore:item/tool/wrench/broken" + } + ] +} diff --git a/src/main/resources/assets/cosmiccore/models/item/wrench_broken.json b/src/main/resources/assets/cosmiccore/models/item/wrench_broken.json new file mode 100644 index 000000000..1c38d4e92 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/wrench_broken.json @@ -0,0 +1,7 @@ +{ + "loader": "tconstruct:tool", + "textures": { + "broken": "cosmiccore:item/tool/wrench/broken" + }, + "parts": [ { "name": "broken" } ] +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/wrench_head.json b/src/main/resources/assets/cosmiccore/models/item/wrench_head.json new file mode 100644 index 000000000..a39c6fbc5 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/wrench_head.json @@ -0,0 +1,11 @@ +{ + "parent": "forge:item/default", + "loader": "tconstruct:material", + "offset": [ + -2, + 1 + ], + "textures": { + "texture": "cosmiccore:item/tool/wrench/head" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/gui/tinker_pattern/wrench.png b/src/main/resources/assets/cosmiccore/textures/gui/tinker_pattern/wrench.png new file mode 100644 index 0000000000000000000000000000000000000000..35114f268adfaadc14bc42bd772eb170d17b4b86 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP%z2U z#WBR9_wFQbt^*Dn&Y@Kt#s3eVH4KUoIrV4dmTtC9g~!B2rY=cIS@|xUkwK!4h2cO@ z*SiBbS8Fu0Y&$%I%&PY+?{l*V||qHJu^+-uP}9`!Y+K8ZeHv78(H U`fz2h7SJ{ZPgg&ebxsLQ0LUjf&j0`b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/cosmiccore/textures/gui/tinker_pattern/wrench_head.png b/src/main/resources/assets/cosmiccore/textures/gui/tinker_pattern/wrench_head.png new file mode 100644 index 0000000000000000000000000000000000000000..35114f268adfaadc14bc42bd772eb170d17b4b86 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP%z2U z#WBR9_wFQbt^*Dn&Y@Kt#s3eVH4KUoIrV4dmTtC9g~!B2rY=cIS@|xUkwK!4h2cO@ z*SiBbS8Fu0Y&$%I%&PY+?{l*V||qHJu^+-uP}9`!Y+K8ZeHv78(H U`fz2h7SJ{ZPgg&ebxsLQ0LUjf&j0`b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/cosmiccore/textures/item/tool/wrench/binding.png b/src/main/resources/assets/cosmiccore/textures/item/tool/wrench/binding.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf2520c20013cb4bf51bccba190d7ae86a9af9f GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP_V+& z#WBR9H~G*1|MtwP4V_AN7qbN%XAmoCymTq3U{BnRg2u$}@9y@fNHZ{LYHB9jx_b4i zy`uAs3#<-i%?CE8pO|lJx&B5{D^7#WD+M3Nd sZJGP({#q%YWHS)pWV4eE$YEeGpQ3g(xc&EBpc@!GUHx3vIVCg!08!jThyVZp literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/cosmiccore/textures/item/tool/wrench/broken.png b/src/main/resources/assets/cosmiccore/textures/item/tool/wrench/broken.png new file mode 100644 index 0000000000000000000000000000000000000000..20f026a31f228be7fa9d898716d9903488060e48 GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP;ic? zi(`mIZ}Ol2|LvJo8#Q&Lz#;U5S|BV~=H1JDHN&RDI6c?ZV|HLC9 zA))_{GbRQ|EVy0w^pvPbrCSouidCzUb`(Bln~|TBb4Ec$<;aKc@8j9n+1U@V9r&{= z=cW;xrl#f&36Ia8pP!fPG-62O=+RYBU?>t)4vcePw&CI7$?56od7r@4(`>IO$mGKk d%2UtG@O(}D&0586Q9ySxc)I$ztaD0e0su$;PNV<; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/cosmiccore/textures/item/tool/wrench/handle.png b/src/main/resources/assets/cosmiccore/textures/item/tool/wrench/handle.png new file mode 100644 index 0000000000000000000000000000000000000000..69a42d35c02755dbb1cfff49fe324c4fc5281a9f GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP;jlM zi(`mI@7u{6Igc3dxK8zX*l5yd{r*9aa7x>RRGyiNOS^UyCT?PzoOg))ju zS)XyY;mBP-_T8>jd5FU x_BtQlqH_srTWjw}m+G6mtbGzx_42ko1K;A~DGDdwoCZ3a!PC{xWt~$(69Bv3Wq<$x literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/cosmiccore/textures/item/tool/wrench/head.png b/src/main/resources/assets/cosmiccore/textures/item/tool/wrench/head.png new file mode 100644 index 0000000000000000000000000000000000000000..cda11fbde2d04a3a64e333e2848a92970c547ce2 GIT binary patch literal 284 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkQ1G0m zi(`mI@73VbyoVKdOjnraJvqc7siHF>vM7mR+Nt!uJIbj|aY39rH%Tj9b*0#9Y+Q ze6A6B8gso=O literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/cosmiccore/textures/item/tool/wrench/head_tconstruct_unknown.png b/src/main/resources/assets/cosmiccore/textures/item/tool/wrench/head_tconstruct_unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..35114f268adfaadc14bc42bd772eb170d17b4b86 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP%z2U z#WBR9_wFQbt^*Dn&Y@Kt#s3eVH4KUoIrV4dmTtC9g~!B2rY=cIS@|xUkwK!4h2cO@ z*SiBbS8Fu0Y&$%I%&PY+?{l*V||qHJu^+-uP}9`!Y+K8ZeHv78(H U`fz2h7SJ{ZPgg&ebxsLQ0LUjf&j0`b literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/cosmiccore/textures/item/tool/wrench/head_tool.png b/src/main/resources/assets/cosmiccore/textures/item/tool/wrench/head_tool.png new file mode 100644 index 0000000000000000000000000000000000000000..b9b348049ed3e42fcf3e794db6fa14b6a102170c GIT binary patch literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP;if@ zi(`mI@7sxve9a01uK#B&<9^$;!|A=#Bd7c)UCfo7Pvzzu*zt;&gLg}Emd})9x%Ey= z%>U1_pQ!Fv7QC2tcU!KB&t(zwP0rt^dwT6GlR93=s;FWiReS%p0vpTXtz~QPp4%mz zT(-4x-o)oWe|P-uxs7H ztXXWQHw6eaDB6fSwYYqg))f74k@>*fj(IT)4w400y2II?E2ItDabVVW5koESkE z*-OZ-{PFY=!Ug}aXht@eS#~3s|Lo<8nC`~eLZd;q2yW+@Z8=D&~qai&aAAcDgQ zDJq#jfe6#gAuR`%1S!O(8Ken@;nBzlPUppN%`ouwgyDZ=F=T%udll>gkV0fd-!EN6 z@h43DpY#2>KxWUqFu00000 LNkvXXu0mjfsX3E- literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/cosmiccore/textures/item/wrench_head_sand_cast.png b/src/main/resources/assets/cosmiccore/textures/item/wrench_head_sand_cast.png new file mode 100644 index 0000000000000000000000000000000000000000..c01962a6d6c3e789c1082a9ed783749d8eb7905f GIT binary patch literal 480 zcmV<60U!Q}P)7Yoy|<=PG`Ia&|^(63rCf=`C7NRbkm0XNR0caM5kjl?qU-&ujwLr6wD}=LPVxSQn z Date: Sat, 20 Sep 2025 13:23:48 -0400 Subject: [PATCH 09/17] Ah fucking spotless --- .../api/plugins/CosmicEMIPlugin.java | 15 ++++--- .../common/data/CosmicCreativeModeTabs.java | 40 ++++++++----------- .../cosmiccore/common/data/CosmicItems.java | 1 - .../common/data/tag/item/CosmicItemTags.java | 2 - .../item/tcon/CosmicCreativeTinkersTab.java | 14 +------ .../item/tcon/CosmicTinkerToolPart.java | 13 +++--- 6 files changed, 32 insertions(+), 53 deletions(-) diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/plugins/CosmicEMIPlugin.java b/src/main/java/com/ghostipedia/cosmiccore/api/plugins/CosmicEMIPlugin.java index 2448dce2f..4bb53bbf1 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/api/plugins/CosmicEMIPlugin.java +++ b/src/main/java/com/ghostipedia/cosmiccore/api/plugins/CosmicEMIPlugin.java @@ -1,24 +1,23 @@ package com.ghostipedia.cosmiccore.api.plugins; -import dev.emi.emi.api.EmiEntrypoint; -import dev.emi.emi.api.EmiPlugin; -import dev.emi.emi.api.EmiRegistry; -import dev.emi.emi.api.stack.EmiStack; import net.minecraft.core.Holder; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; + +import dev.emi.emi.api.EmiEntrypoint; +import dev.emi.emi.api.EmiPlugin; +import dev.emi.emi.api.EmiRegistry; +import dev.emi.emi.api.stack.EmiStack; import slimeknights.tconstruct.common.TinkerTags; -import slimeknights.tconstruct.library.materials.MaterialRegistry; -import slimeknights.tconstruct.library.materials.definition.MaterialVariantId; import slimeknights.tconstruct.library.tools.part.IMaterialItem; -import slimeknights.tconstruct.tools.stats.HeadMaterialStats; import java.util.ArrayList; import java.util.List; @EmiEntrypoint public class CosmicEMIPlugin implements EmiPlugin { + @Override public void register(EmiRegistry registry) { // Show all material variants for every TCon tool part @@ -33,4 +32,4 @@ public void register(EmiRegistry registry) { } } } -} \ No newline at end of file +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicCreativeModeTabs.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicCreativeModeTabs.java index 60b3c7d03..0d871f6bb 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicCreativeModeTabs.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicCreativeModeTabs.java @@ -3,13 +3,8 @@ import com.ghostipedia.cosmiccore.CosmicCore; import com.ghostipedia.cosmiccore.common.item.tcon.CosmicCreativeTinkersTab; -import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; -import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.common.data.GTCreativeModeTabs; -import com.gregtechceu.gtceu.common.data.GTMaterials; -import com.gregtechceu.gtceu.common.registry.GTRegistration; import net.minecraft.world.item.CreativeModeTab; import com.tterrag.registrate.util.entry.RegistryEntry; @@ -18,27 +13,24 @@ public class CosmicCreativeModeTabs { - public static final RegistryEntry COSMIC_CORE = - REGISTRATE.defaultCreativeTab("main", - b -> b - .displayItems(new GTCreativeModeTabs.RegistrateDisplayItemsGenerator("main", REGISTRATE)) - .title(REGISTRATE.addLang("itemGroup", CosmicCore.id("creative_tab"), "Cosmic Core Main Items")) - .icon(CosmicItems.DONK::asStack) - .build()) - .register(); + public static final RegistryEntry COSMIC_CORE = REGISTRATE.defaultCreativeTab("main", + b -> b + .displayItems(new GTCreativeModeTabs.RegistrateDisplayItemsGenerator("main", REGISTRATE)) + .title(REGISTRATE.addLang("itemGroup", CosmicCore.id("creative_tab"), "Cosmic Core Main Items")) + .icon(CosmicItems.DONK::asStack) + .build()) + .register(); // Tab id: cosmiccore:tinkers_tools - public static final RegistryEntry COSMIC_CORE_TINKERS_TOOLS = - REGISTRATE.defaultCreativeTab("tinkers_tools", - b -> b - .displayItems(CosmicCreativeTinkersTab::addCreativeTabItems) - .title(REGISTRATE.addLang("itemGroup.tinkers.parts", - CosmicCore.id("creative_tab_tinker_tools"), "Cosmic Core Tinkers Compat")) - .icon(CosmicItems.RUNE_CONJUNCTION_VALKRUTH::asStack) - .build()) - .register(); - - + public static final RegistryEntry COSMIC_CORE_TINKERS_TOOLS = REGISTRATE + .defaultCreativeTab("tinkers_tools", + b -> b + .displayItems(CosmicCreativeTinkersTab::addCreativeTabItems) + .title(REGISTRATE.addLang("itemGroup.tinkers.parts", + CosmicCore.id("creative_tab_tinker_tools"), "Cosmic Core Tinkers Compat")) + .icon(CosmicItems.RUNE_CONJUNCTION_VALKRUTH::asStack) + .build()) + .register(); public static void init() {} } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicItems.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicItems.java index 6d3170bec..d6498b1fc 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicItems.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicItems.java @@ -1789,7 +1789,6 @@ public boolean isFoil(ItemStack stack) { .defaultModel() .register(); - public static final ItemEntry WRENCH_CAST_GOLD = REGISTRATE .item("wrench_head_cast", ComponentItem::create) .lang("Wrench Head Cast") diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/item/CosmicItemTags.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/item/CosmicItemTags.java index 0769a2cb5..cf06b625f 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/item/CosmicItemTags.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/item/CosmicItemTags.java @@ -11,6 +11,4 @@ public class CosmicItemTags { public static final TagKey QUARKTECH_SPACE_SUITE = TagUtil.createModItemTag("quantum_space_suite"); public static final TagKey WRENCH_HEAD_CAST_MULTI = TagUtil.createModItemTag("casts/multi_use/wrench_head"); public static final TagKey WRENCH_HEAD_CAST_SINGLE = TagUtil.createModItemTag("casts/single_use/wrench_head"); - - } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicCreativeTinkersTab.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicCreativeTinkersTab.java index 7e6dfb06b..cfd01e3b9 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicCreativeTinkersTab.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicCreativeTinkersTab.java @@ -1,8 +1,5 @@ package com.ghostipedia.cosmiccore.common.item.tcon; -import com.ghostipedia.cosmiccore.CosmicCore; -import com.ghostipedia.cosmiccore.common.data.CosmicItems; -import com.tterrag.registrate.util.entry.RegistryEntry; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.ItemStack; @@ -14,13 +11,8 @@ import java.util.function.Consumer; import java.util.function.Supplier; -import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; - public class CosmicCreativeTinkersTab { - - - public static void addCreativeTabItems(CreativeModeTab.ItemDisplayParameters itemDisplayParameters, CreativeModeTab.Output tab) { Consumer output = tab::accept; @@ -28,20 +20,16 @@ public static void addCreativeTabItems(CreativeModeTab.ItemDisplayParameters ite acceptTool(output, CosmicTinkerTools.wrench); acceptPart(output, CosmicTinkerToolPart.wrenchHead); - - } private static void acceptTool(Consumer output, Supplier tool) { ToolBuildHandler.addVariants(output, tool.get(), ""); } - public static void acceptPart(Consumer output, Supplier item){ + public static void acceptPart(Consumer output, Supplier item) { item.get().addVariants(output, ""); } - - private static void acceptTools(Consumer output, EnumObject tools) { tools.forEach(tool -> ToolBuildHandler.addVariants(output, tool, "")); } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerToolPart.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerToolPart.java index 3ba29bd53..4500b54e1 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerToolPart.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerToolPart.java @@ -2,11 +2,12 @@ import com.ghostipedia.cosmiccore.CosmicCore; import com.ghostipedia.cosmiccore.common.data.CosmicCreativeModeTabs; + import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; + import slimeknights.mantle.registration.object.ItemObject; -import slimeknights.tconstruct.TConstruct; import slimeknights.tconstruct.common.registration.ItemDeferredRegisterExtension; import slimeknights.tconstruct.library.tools.part.IMaterialItem; import slimeknights.tconstruct.library.tools.part.ToolPartItem; @@ -18,20 +19,22 @@ import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; public class CosmicTinkerToolPart { + static { REGISTRATE.creativeModeTab(() -> CosmicCreativeModeTabs.COSMIC_CORE_TINKERS_TOOLS); } - //Tinkers uses Protected in their Registry class to seal it, we should do the same to avoid conflicts!! - protected static final ItemDeferredRegisterExtension COSMIC_TINKER_PARTS = new ItemDeferredRegisterExtension(CosmicCore.MOD_ID); + // Tinkers uses Protected in their Registry class to seal it, we should do the same to avoid conflicts!! + protected static final ItemDeferredRegisterExtension COSMIC_TINKER_PARTS = new ItemDeferredRegisterExtension( + CosmicCore.MOD_ID); protected static final Item.Properties ITEM_PROPS = new Item.Properties(); - public static final ItemObject wrenchHead = COSMIC_TINKER_PARTS.register("wrench_head", () -> new ToolPartItem(ITEM_PROPS, HeadMaterialStats.ID)); + public static final ItemObject wrenchHead = COSMIC_TINKER_PARTS.register("wrench_head", + () -> new ToolPartItem(ITEM_PROPS, HeadMaterialStats.ID)); public static void init() { COSMIC_TINKER_PARTS.register(FMLJavaModLoadingContext.get().getModEventBus()); } - private static void accept(Consumer output, Supplier item) { item.get().addVariants(output, ""); } From 8884023a522997425a139ed0f11412f29004b98d Mon Sep 17 00:00:00 2001 From: Ghostipedia / Caitlynn <46772882+Ghostipedia@users.noreply.github.com> Date: Sat, 20 Sep 2025 22:34:57 -0400 Subject: [PATCH 10/17] Yo/ticon modifiers (#141) * tried to get modifiers to work in tinkers * tried to get modifiers to work in tinkers * confict cleanup * got machine interaction to work with specific modifier/traits * timker wrenches now fully work on gt machines and pipes :3 * sounds and durability now work with the tool interactions and some clean up --------- Co-authored-by: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Co-authored-by: Spicierspace153 <21964509+Spicierspace153@users.noreply.github.com> --- .../modifiers/wrenchModeBehavior.json | 4 + .../tinkering/tool_definitions/wrench.json | 9 ++ .../ghostipedia/cosmiccore/CosmicCore.java | 6 +- .../api/misc/IMetaMachineMixin.java | 15 ++++ .../api/misc/IPipeBlockEntityMixin.java | 16 ++++ .../common/data/CosmicCreativeModeTabs.java | 19 ++-- .../data/datagen/CosmicDataGenerators.java | 6 ++ .../item/tcon/CosmicCreativeTinkersTab.java | 1 - .../common/item/tcon/CosmicTinkerTools.java | 14 ++- ...java => CosmicToolDefinitionProvider.java} | 11 +-- .../common/item/tcon/TiconUtils.java | 31 +++++++ .../tcon/modifiers/CosmicCoreModifiers.java | 20 +++++ .../tcon/modifiers/CosmicModifierIds.java | 10 +++ .../modifiers/CosmicModifierProvider.java | 24 +++++ .../modifiers/WrenchModeSwitchModifier.java | 72 +++++++++++++++ .../mixin/gtceu/MetaMachineBlockMixin.java | 57 ++++++++++++ .../mixin/gtceu/MetaMachineMixin.java | 90 +++++++++++++++++++ .../mixin/gtceu/PipeBlockEntityMixin.java | 54 +++++++++++ .../mixin/gtceu/PipeBlockMixin.java | 55 ++++++++++++ src/main/resources/cosmiccore.mixins.json | 4 + 20 files changed, 500 insertions(+), 18 deletions(-) create mode 100644 src/generated/resources/data/cosmiccore/tinkering/modifiers/wrenchModeBehavior.json create mode 100644 src/main/java/com/ghostipedia/cosmiccore/api/misc/IMetaMachineMixin.java create mode 100644 src/main/java/com/ghostipedia/cosmiccore/api/misc/IPipeBlockEntityMixin.java rename src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/{CosmicToolDefitionProvider.java => CosmicToolDefinitionProvider.java} (88%) create mode 100644 src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/TiconUtils.java create mode 100644 src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/modifiers/CosmicCoreModifiers.java create mode 100644 src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/modifiers/CosmicModifierIds.java create mode 100644 src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/modifiers/CosmicModifierProvider.java create mode 100644 src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/modifiers/WrenchModeSwitchModifier.java create mode 100644 src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/MetaMachineBlockMixin.java create mode 100644 src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/MetaMachineMixin.java create mode 100644 src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/PipeBlockEntityMixin.java create mode 100644 src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/PipeBlockMixin.java diff --git a/src/generated/resources/data/cosmiccore/tinkering/modifiers/wrenchModeBehavior.json b/src/generated/resources/data/cosmiccore/tinkering/modifiers/wrenchModeBehavior.json new file mode 100644 index 000000000..c042c4fea --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/modifiers/wrenchModeBehavior.json @@ -0,0 +1,4 @@ +{ + "level_display": "tconstruct:no_levels", + "tooltip_display": "always" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/tool_definitions/wrench.json b/src/generated/resources/data/cosmiccore/tinkering/tool_definitions/wrench.json index ba833cb73..a5ca86ab3 100644 --- a/src/generated/resources/data/cosmiccore/tinkering/tool_definitions/wrench.json +++ b/src/generated/resources/data/cosmiccore/tinkering/tool_definitions/wrench.json @@ -36,6 +36,15 @@ "type": "tconstruct:is_effective", "predicate_type": "mantle:tag", "tag": "forge:mineable/wrench" + }, + { + "type": "tconstruct:traits", + "traits": [ + { + "level": 1, + "name": "cosmiccore:wrench_switch" + } + ] } ] } \ No newline at end of file diff --git a/src/main/java/com/ghostipedia/cosmiccore/CosmicCore.java b/src/main/java/com/ghostipedia/cosmiccore/CosmicCore.java index 8665bc4a5..636e5e126 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/CosmicCore.java +++ b/src/main/java/com/ghostipedia/cosmiccore/CosmicCore.java @@ -12,6 +12,10 @@ import com.ghostipedia.cosmiccore.common.data.materials.CosmicMaterials; import com.ghostipedia.cosmiccore.common.item.behavior.GravityCoreBehavior; import com.ghostipedia.cosmiccore.common.item.tcon.*; +import com.ghostipedia.cosmiccore.common.item.tcon.CosmicTconBlockTagProvider; +import com.ghostipedia.cosmiccore.common.item.tcon.CosmicTconItemTagProvider; +import com.ghostipedia.cosmiccore.common.item.tcon.CosmicTinkerTools; +import com.ghostipedia.cosmiccore.common.item.tcon.CosmicToolDefinitionProvider; import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.modular.MultiblockInit; import com.ghostipedia.cosmiccore.common.network.CCoreNetwork; import com.ghostipedia.cosmiccore.common.recipe.condition.CosmicConditions; @@ -105,7 +109,7 @@ public void gatherDataEvent(GatherDataEvent event) { CosmicTconBlockTagProvider blockTags = new CosmicTconBlockTagProvider(packOutput, event.getLookupProvider(), existingFileHelper); generator.addProvider(server, blockTags); - generator.addProvider(server, new CosmicToolDefitionProvider(packOutput)); + generator.addProvider(server, new CosmicToolDefinitionProvider(packOutput)); generator.addProvider(server, new CosmicTconItemTagProvider(packOutput, event.getLookupProvider(), blockTags.contentsGetter(), existingFileHelper)); } diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/misc/IMetaMachineMixin.java b/src/main/java/com/ghostipedia/cosmiccore/api/misc/IMetaMachineMixin.java new file mode 100644 index 000000000..ac9f49175 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/misc/IMetaMachineMixin.java @@ -0,0 +1,15 @@ +package com.ghostipedia.cosmiccore.api.misc; + +import net.minecraft.world.InteractionResult; +import net.minecraft.world.item.context.UseOnContext; + +import com.mojang.datafixers.util.Pair; +import slimeknights.tconstruct.library.tools.definition.ToolDefinition; +import slimeknights.tconstruct.library.tools.item.ModifiableItem; + +public interface IMetaMachineMixin { + + default Pair ccore$onToolClick(ModifiableItem ticonItem, UseOnContext context) { + return Pair.of(null, InteractionResult.PASS); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/misc/IPipeBlockEntityMixin.java b/src/main/java/com/ghostipedia/cosmiccore/api/misc/IPipeBlockEntityMixin.java new file mode 100644 index 000000000..876f5bec7 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/misc/IPipeBlockEntityMixin.java @@ -0,0 +1,16 @@ +package com.ghostipedia.cosmiccore.api.misc; + +import net.minecraft.world.InteractionResult; +import net.minecraft.world.item.context.UseOnContext; + +import com.mojang.datafixers.util.Pair; +import slimeknights.tconstruct.library.tools.definition.ToolDefinition; +import slimeknights.tconstruct.library.tools.item.ModifiableItem; + +public interface IPipeBlockEntityMixin { + + default Pair ccore$onToolClick(ModifiableItem ticonItem, + UseOnContext context) { + return Pair.of(null, InteractionResult.PASS); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicCreativeModeTabs.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicCreativeModeTabs.java index 0d871f6bb..86d315a97 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicCreativeModeTabs.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicCreativeModeTabs.java @@ -13,21 +13,20 @@ public class CosmicCreativeModeTabs { - public static final RegistryEntry COSMIC_CORE = REGISTRATE.defaultCreativeTab("main", - b -> b - .displayItems(new GTCreativeModeTabs.RegistrateDisplayItemsGenerator("main", REGISTRATE)) - .title(REGISTRATE.addLang("itemGroup", CosmicCore.id("creative_tab"), "Cosmic Core Main Items")) + public static RegistryEntry COSMIC_CORE = REGISTRATE.defaultCreativeTab(CosmicCore.MOD_ID, + builder -> builder + .displayItems(new GTCreativeModeTabs.RegistrateDisplayItemsGenerator(CosmicCore.MOD_ID, REGISTRATE)) + .title(REGISTRATE.addLang("itemGroup", CosmicCore.id("creative_tab"), "Cosmic Core")) .icon(CosmicItems.DONK::asStack) .build()) .register(); - // Tab id: cosmiccore:tinkers_tools - public static final RegistryEntry COSMIC_CORE_TINKERS_TOOLS = REGISTRATE - .defaultCreativeTab("tinkers_tools", - b -> b + public static RegistryEntry COSMIC_CORE_TINKERS_TOOLS = REGISTRATE + .defaultCreativeTab(CosmicCore.MOD_ID, + builder -> builder .displayItems(CosmicCreativeTinkersTab::addCreativeTabItems) - .title(REGISTRATE.addLang("itemGroup.tinkers.parts", - CosmicCore.id("creative_tab_tinker_tools"), "Cosmic Core Tinkers Compat")) + .title(REGISTRATE.addLang("itemGroup", CosmicCore.id("creative_tab_tinker_tools"), + "Cosmic Core Tinkers Compat")) .icon(CosmicItems.RUNE_CONJUNCTION_VALKRUTH::asStack) .build()) .register(); diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicDataGenerators.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicDataGenerators.java index 82a0af8ec..1d4fb6198 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicDataGenerators.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicDataGenerators.java @@ -1,6 +1,7 @@ package com.ghostipedia.cosmiccore.common.data.datagen; import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.item.tcon.modifiers.CosmicModifierProvider; import com.gregtechceu.gtceu.api.registry.registrate.SoundEntryBuilder; @@ -20,6 +21,11 @@ public static void gatherData(GatherDataEvent event) { PackOutput packOutput = generator.getPackOutput(); ExistingFileHelper existingFileHelper = event.getExistingFileHelper(); var registries = event.getLookupProvider(); + + boolean server = event.includeServer(); + + generator.addProvider(server, new CosmicModifierProvider(packOutput)); + if (event.includeClient()) { generator.addProvider(true, new SoundEntryBuilder.SoundEntryProvider(packOutput, CosmicCore.MOD_ID)); } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicCreativeTinkersTab.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicCreativeTinkersTab.java index cfd01e3b9..fb09cfe2b 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicCreativeTinkersTab.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicCreativeTinkersTab.java @@ -18,7 +18,6 @@ public static void addCreativeTabItems(CreativeModeTab.ItemDisplayParameters ite Consumer output = tab::accept; acceptTool(output, CosmicTinkerTools.wireCutter); acceptTool(output, CosmicTinkerTools.wrench); - acceptPart(output, CosmicTinkerToolPart.wrenchHead); } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerTools.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerTools.java index b16390185..6f63e4ddf 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerTools.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerTools.java @@ -1,8 +1,13 @@ package com.ghostipedia.cosmiccore.common.item.tcon; import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.item.tcon.modifiers.CosmicCoreModifiers; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.LevelReader; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import slimeknights.mantle.registration.object.ItemObject; @@ -19,9 +24,16 @@ public class CosmicTinkerTools { public static final ItemObject wireCutter = COSMIC_TINKER_ITEM.register("wire_cutter", () -> new ModifiableItem(UNSTACKABLE_PROPS, CosmicToolDefinitions.WIRE_CUTTERS)); public static final ItemObject wrench = COSMIC_TINKER_ITEM.register("wrench", - () -> new ModifiableItem(UNSTACKABLE_PROPS, CosmicToolDefinitions.WRENCHES)); + () -> new ModifiableItem(UNSTACKABLE_PROPS, CosmicToolDefinitions.WRENCHES) { + + @Override + public boolean doesSneakBypassUse(ItemStack stack, LevelReader level, BlockPos pos, Player player) { + return true; + } + }); public static void init() { COSMIC_TINKER_ITEM.register(FMLJavaModLoadingContext.get().getModEventBus()); + CosmicCoreModifiers.init(); } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefitionProvider.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitionProvider.java similarity index 88% rename from src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefitionProvider.java rename to src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitionProvider.java index 8912ecd6e..ab0f97126 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefitionProvider.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitionProvider.java @@ -1,6 +1,7 @@ package com.ghostipedia.cosmiccore.common.item.tcon; import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.item.tcon.modifiers.CosmicCoreModifiers; import com.gregtechceu.gtceu.data.recipe.CustomTags; @@ -9,6 +10,7 @@ import slimeknights.tconstruct.library.data.tinkering.AbstractToolDefinitionDataProvider; import slimeknights.tconstruct.library.materials.RandomMaterial; import slimeknights.tconstruct.library.tools.definition.module.build.SetStatsModule; +import slimeknights.tconstruct.library.tools.definition.module.build.ToolTraitsModule; import slimeknights.tconstruct.library.tools.definition.module.material.DefaultMaterialsModule; import slimeknights.tconstruct.library.tools.definition.module.material.PartStatsModule; import slimeknights.tconstruct.library.tools.definition.module.mining.IsEffectiveModule; @@ -18,9 +20,9 @@ import static com.ghostipedia.cosmiccore.common.item.tcon.CosmicTinkerToolPart.wrenchHead; import static slimeknights.tconstruct.tools.TinkerToolParts.*; -public class CosmicToolDefitionProvider extends AbstractToolDefinitionDataProvider { +public class CosmicToolDefinitionProvider extends AbstractToolDefinitionDataProvider { - public CosmicToolDefitionProvider(PackOutput packOutput) { + public CosmicToolDefinitionProvider(PackOutput packOutput) { super(packOutput, CosmicCore.MOD_ID); } @@ -44,7 +46,6 @@ protected void addToolDefinitions() { // pickaxes define(CosmicToolDefinitions.WIRE_CUTTERS) - .module(PartStatsModule.parts() .part(smallBlade) .part(smallBlade) @@ -58,7 +59,6 @@ protected void addToolDefinitions() { .module(IsEffectiveModule.tag(CustomTags.MINEABLE_WITH_WIRE_CUTTER)); define(CosmicToolDefinitions.WRENCHES) - .module(PartStatsModule.parts() .part(wrenchHead) .part(toughBinding) @@ -67,7 +67,8 @@ protected void addToolDefinitions() { .module(new SetStatsModule(StatsNBT.builder() .set(ToolStats.ATTACK_SPEED, 0.9f) .build())) - .module(IsEffectiveModule.tag(CustomTags.MINEABLE_WITH_WRENCH)); + .module(IsEffectiveModule.tag(CustomTags.MINEABLE_WITH_WRENCH)) + .module(ToolTraitsModule.builder().trait(CosmicCoreModifiers.wrenchModeSwitch).build());; } @Override diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/TiconUtils.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/TiconUtils.java new file mode 100644 index 000000000..171496493 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/TiconUtils.java @@ -0,0 +1,31 @@ +package com.ghostipedia.cosmiccore.common.item.tcon; + +import com.gregtechceu.gtceu.api.item.tool.GTToolType; + +import net.minecraft.world.item.ItemStack; + +import slimeknights.tconstruct.library.modifiers.ModifierEntry; +import slimeknights.tconstruct.library.tools.definition.ToolDefinition; +import slimeknights.tconstruct.library.tools.nbt.ToolStack; + +import java.util.List; + +public class TiconUtils { + + public static ToolStack getTool(ItemStack stack) { + return ToolStack.from(stack); + } + + public static List getModifierList(ToolStack tool) { + return tool.getModifierList(); + } + + public static GTToolType getGTToolType(ToolDefinition def) { + if (def == CosmicToolDefinitions.WRENCHES) { + return GTToolType.WRENCH; + } else if (def == CosmicToolDefinitions.WIRE_CUTTERS) { + return GTToolType.WIRE_CUTTER; + } + return GTToolType.FILE; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/modifiers/CosmicCoreModifiers.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/modifiers/CosmicCoreModifiers.java new file mode 100644 index 000000000..1a551af75 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/modifiers/CosmicCoreModifiers.java @@ -0,0 +1,20 @@ +package com.ghostipedia.cosmiccore.common.item.tcon.modifiers; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; + +import slimeknights.tconstruct.library.modifiers.util.ModifierDeferredRegister; +import slimeknights.tconstruct.library.modifiers.util.StaticModifier; + +public class CosmicCoreModifiers { + + private static final ModifierDeferredRegister MODIFIERS = ModifierDeferredRegister.create(CosmicCore.MOD_ID); + + public static final StaticModifier wrenchModeSwitch = MODIFIERS.register("wrench_switch", + WrenchModeSwitchModifier::new); + + public static void init() { + MODIFIERS.register(FMLJavaModLoadingContext.get().getModEventBus()); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/modifiers/CosmicModifierIds.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/modifiers/CosmicModifierIds.java new file mode 100644 index 000000000..fa9152fd2 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/modifiers/CosmicModifierIds.java @@ -0,0 +1,10 @@ +package com.ghostipedia.cosmiccore.common.item.tcon.modifiers; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import slimeknights.tconstruct.library.modifiers.ModifierId; + +public class CosmicModifierIds { + + public static final ModifierId wrenchModeBehavior = new ModifierId(CosmicCore.MOD_ID, "wrenchModeBehavior"); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/modifiers/CosmicModifierProvider.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/modifiers/CosmicModifierProvider.java new file mode 100644 index 000000000..c59bf9271 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/modifiers/CosmicModifierProvider.java @@ -0,0 +1,24 @@ +package com.ghostipedia.cosmiccore.common.item.tcon.modifiers; + +import net.minecraft.data.PackOutput; + +import slimeknights.tconstruct.library.data.tinkering.AbstractModifierProvider; +import slimeknights.tconstruct.library.modifiers.util.ModifierLevelDisplay; + +public class CosmicModifierProvider extends AbstractModifierProvider { + + public CosmicModifierProvider(PackOutput packOutput) { + super(packOutput); + } + + @Override + protected void addModifiers() { + buildModifier(CosmicModifierIds.wrenchModeBehavior) + .levelDisplay(ModifierLevelDisplay.NO_LEVELS); + } + + @Override + public String getName() { + return ""; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/modifiers/WrenchModeSwitchModifier.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/modifiers/WrenchModeSwitchModifier.java new file mode 100644 index 000000000..6383d2e88 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/modifiers/WrenchModeSwitchModifier.java @@ -0,0 +1,72 @@ +package com.ghostipedia.cosmiccore.common.item.tcon.modifiers; + +import com.gregtechceu.gtceu.common.item.tool.behavior.ToolModeSwitchBehavior; + +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.TooltipFlag; +import net.minecraftforge.common.ToolAction; + +import lombok.RequiredArgsConstructor; +import org.jetbrains.annotations.Nullable; +import slimeknights.mantle.client.TooltipKey; +import slimeknights.tconstruct.library.modifiers.Modifier; +import slimeknights.tconstruct.library.modifiers.ModifierEntry; +import slimeknights.tconstruct.library.modifiers.ModifierHooks; +import slimeknights.tconstruct.library.modifiers.hook.behavior.ToolActionModifierHook; +import slimeknights.tconstruct.library.modifiers.hook.display.TooltipModifierHook; +import slimeknights.tconstruct.library.modifiers.hook.interaction.GeneralInteractionModifierHook; +import slimeknights.tconstruct.library.modifiers.hook.interaction.InteractionSource; +import slimeknights.tconstruct.library.module.ModuleHookMap; +import slimeknights.tconstruct.library.tools.nbt.IToolStackView; + +import java.util.List; + +@RequiredArgsConstructor +public class WrenchModeSwitchModifier extends Modifier implements GeneralInteractionModifierHook, + ToolActionModifierHook, TooltipModifierHook { + + @Override + protected void registerHooks(ModuleHookMap.Builder hookBuilder) { + super.registerHooks(hookBuilder); + hookBuilder.addHook(this, ModifierHooks.GENERAL_INTERACT, ModifierHooks.TOOL_ACTION, ModifierHooks.TOOLTIP); + } + + private static ResourceLocation MODE_SWITCH = new ResourceLocation("ccore", "mode"); + + @Override + public InteractionResult onToolUse(IToolStackView tool, ModifierEntry modifier, Player player, InteractionHand hand, + InteractionSource source) { + var nbt = tool.getPersistentData(); + boolean shift = player.isShiftKeyDown(); + if (shift && source == InteractionSource.RIGHT_CLICK && !tool.isBroken()) { + nbt.putInt(MODE_SWITCH, + (nbt.getInt(MODE_SWITCH) + 1) % ToolModeSwitchBehavior.WrenchModeType.values().length); + player.displayClientMessage(Component.translatable("metaitem.machine_configuration.mode", + ToolModeSwitchBehavior.WrenchModeType.values()[nbt.getInt(MODE_SWITCH)].getName()), true); + } + return InteractionResult.PASS; + } + + @Override + public void addTooltip(IToolStackView tool, ModifierEntry modifier, @Nullable Player player, + List tooltip, TooltipKey tooltipKey, TooltipFlag tooltipFlag) { + var nbt = tool.getPersistentData(); + tooltip.add(Component.translatable("metaitem.machine_configuration.mode", + ToolModeSwitchBehavior.WrenchModeType.values()[nbt.getInt(MODE_SWITCH)].getName())); + } + + public ToolModeSwitchBehavior.WrenchModeType getType(IToolStackView tool) { + var nbt = tool.getPersistentData(); + return ToolModeSwitchBehavior.WrenchModeType.values()[nbt.getInt(MODE_SWITCH)]; + } + + @Override + public boolean canPerformAction(IToolStackView tool, ModifierEntry modifier, ToolAction toolAction) { + // todo check if we are on wrenches + return true; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/MetaMachineBlockMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/MetaMachineBlockMixin.java new file mode 100644 index 000000000..11a4e5cda --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/MetaMachineBlockMixin.java @@ -0,0 +1,57 @@ +package com.ghostipedia.cosmiccore.mixin.gtceu; + +import com.ghostipedia.cosmiccore.api.misc.IMetaMachineMixin; +import com.ghostipedia.cosmiccore.common.item.tcon.TiconUtils; + +import com.gregtechceu.gtceu.api.block.MetaMachineBlock; +import com.gregtechceu.gtceu.api.item.tool.ToolHelper; +import com.gregtechceu.gtceu.api.machine.MetaMachine; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; + +import com.llamalad7.mixinextras.sugar.Local; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import slimeknights.tconstruct.library.tools.helper.ToolDamageUtil; +import slimeknights.tconstruct.library.tools.item.ModifiableItem; + +@Mixin(value = MetaMachineBlock.class, remap = false) +public class MetaMachineBlockMixin { + + @Inject(method = "use", + at = @At(value = "INVOKE", + target = "Lcom/gregtechceu/gtceu/api/item/tool/ToolHelper;getToolTypes(Lnet/minecraft/world/item/ItemStack;)Ljava/util/Set;"), + cancellable = true) + public void ccore$use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, + BlockHitResult hit, + CallbackInfoReturnable cir, @Local MetaMachine machine, + @Local ItemStack itemStack) { + if (itemStack.getItem() instanceof ModifiableItem ticonTool) { + var result = ((IMetaMachineMixin) machine).ccore$onToolClick(ticonTool, + new UseOnContext(player, hand, hit)); + if (result.getSecond() == InteractionResult.CONSUME && player instanceof ServerPlayer serverPlayer) { + ToolHelper.playToolSound(TiconUtils.getGTToolType(result.getFirst()), serverPlayer); + + if (!serverPlayer.isCreative()) { + ToolDamageUtil.handleDamageItem(itemStack, 1, player, p -> {}); + } + } + + if (result.getSecond() != InteractionResult.PASS) { + cir.setReturnValue(result.getSecond()); + cir.cancel(); + } + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/MetaMachineMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/MetaMachineMixin.java new file mode 100644 index 000000000..a2bee417d --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/MetaMachineMixin.java @@ -0,0 +1,90 @@ +package com.ghostipedia.cosmiccore.mixin.gtceu; + +import com.ghostipedia.cosmiccore.api.misc.IMetaMachineMixin; +import com.ghostipedia.cosmiccore.common.item.tcon.CosmicToolDefinitions; +import com.ghostipedia.cosmiccore.common.item.tcon.TiconUtils; +import com.ghostipedia.cosmiccore.common.item.tcon.modifiers.WrenchModeSwitchModifier; + +import com.gregtechceu.gtceu.api.capability.ICoverable; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputFluid; +import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; + +import net.minecraft.core.Direction; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.phys.BlockHitResult; + +import com.mojang.datafixers.util.Pair; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import slimeknights.tconstruct.library.tools.definition.ToolDefinition; +import slimeknights.tconstruct.library.tools.item.ModifiableItem; +import slimeknights.tconstruct.library.tools.nbt.ToolStack; + +@Mixin(MetaMachine.class) +public class MetaMachineMixin implements IMetaMachineMixin { + + public Pair ccore$onToolClick(ModifiableItem ticonItem, UseOnContext context) { + var hitResult = new BlockHitResult(context.getClickLocation(), context.getClickedFace(), + context.getClickedPos(), false); + Direction gridSide = ICoverable.determineGridSideHit(hitResult); + if (gridSide == null) gridSide = hitResult.getDirection(); + if (context.getPlayer() == null) Pair.of(null, InteractionResult.PASS); + + if (ticonItem.getToolDefinition() == CosmicToolDefinitions.WRENCHES) { + return Pair.of(ticonItem.getToolDefinition(), + onWrenchClick(context.getPlayer(), context.getHand(), gridSide, hitResult)); + } + return Pair.of(null, InteractionResult.PASS); + } + + @Unique + private InteractionResult onWrenchClick(Player playerIn, InteractionHand hand, Direction gridSide, + BlockHitResult hitResult) { + ItemStack stack = playerIn.getItemInHand(hand); + var tool = ToolStack.from(stack); + var modList = TiconUtils.getModifierList(tool); + + if (gridSide == ((MetaMachine) (Object) this).getFrontFacing() && + ((MetaMachine) (Object) this).allowExtendedFacing()) { + ((MetaMachine) (Object) this).setUpwardsFacing( + playerIn.isShiftKeyDown() ? ((MetaMachine) (Object) this).getUpwardsFacing().getCounterClockWise() : + ((MetaMachine) (Object) this).getUpwardsFacing().getClockWise()); + return InteractionResult.sidedSuccess(((MetaMachine) (Object) this).isRemote()); + } + if (playerIn.isShiftKeyDown()) { + if (gridSide == ((MetaMachine) (Object) this).getFrontFacing() || + !((MetaMachine) (Object) this).isFacingValid(gridSide)) { + return InteractionResult.FAIL; + } + ((MetaMachine) (Object) this).setFrontFacing(gridSide); + } else { + for (var mod : modList) { + if (mod.getModifier() instanceof WrenchModeSwitchModifier wmsm) { + var type = wmsm.getType(tool); + + if (type.isItem()) { + if (((MetaMachine) (Object) this) instanceof IAutoOutputItem autoOutputItem && + (!((MetaMachine) (Object) this).hasFrontFacing() || + gridSide != ((MetaMachine) (Object) this).getFrontFacing())) { + autoOutputItem.setOutputFacingItems(gridSide); + } + } + if (type.isFluid()) { + if (((MetaMachine) (Object) this) instanceof IAutoOutputFluid autoOutputFluid && + (!((MetaMachine) (Object) this).hasFrontFacing() || + gridSide != ((MetaMachine) (Object) this).getFrontFacing())) { + autoOutputFluid.setOutputFacingFluids(gridSide); + } + } + + } + } + } + return InteractionResult.sidedSuccess(((MetaMachine) (Object) this).isRemote()); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/PipeBlockEntityMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/PipeBlockEntityMixin.java new file mode 100644 index 000000000..97ca41ae7 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/PipeBlockEntityMixin.java @@ -0,0 +1,54 @@ +package com.ghostipedia.cosmiccore.mixin.gtceu; + +import com.ghostipedia.cosmiccore.api.misc.IPipeBlockEntityMixin; +import com.ghostipedia.cosmiccore.common.item.tcon.CosmicToolDefinitions; + +import com.gregtechceu.gtceu.api.blockentity.PipeBlockEntity; +import com.gregtechceu.gtceu.api.capability.ICoverable; +import com.gregtechceu.gtceu.api.cover.CoverBehavior; +import com.gregtechceu.gtceu.api.pipenet.PipeCoverContainer; + +import net.minecraft.core.Direction; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.phys.BlockHitResult; + +import com.mojang.datafixers.util.Pair; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import slimeknights.tconstruct.library.tools.definition.ToolDefinition; +import slimeknights.tconstruct.library.tools.item.ModifiableItem; + +@Mixin(value = PipeBlockEntity.class, remap = false) +public class PipeBlockEntityMixin implements IPipeBlockEntityMixin { + + @Shadow + public PipeCoverContainer coverContainer; + + @Override + public Pair ccore$onToolClick(ModifiableItem ticonItem, UseOnContext context) { + if (((PipeBlockEntity) (Object) this) == null || context.getPlayer() == null) { + return Pair.of(null, InteractionResult.FAIL); + } + + var playerIn = context.getPlayer(); + if (ticonItem.getToolDefinition() == CosmicToolDefinitions.WRENCHES) { + var hitResult = new BlockHitResult(context.getClickLocation(), context.getClickedFace(), + context.getClickedPos(), false); + Direction gridSide = ICoverable.determineGridSideHit(hitResult); + CoverBehavior coverBehavior = gridSide == null ? null : coverContainer.getCoverAtSide(gridSide); + if (gridSide == null) gridSide = hitResult.getDirection(); + + if (playerIn.isShiftKeyDown() && ((PipeBlockEntity) (Object) this).canHaveBlockedFaces()) { + boolean isBlocked = ((PipeBlockEntity) (Object) this).isBlocked(gridSide); + ((PipeBlockEntity) (Object) this).setBlocked(gridSide, !isBlocked); + } else { + boolean isOpen = ((PipeBlockEntity) (Object) this).isConnected(gridSide); + ((PipeBlockEntity) (Object) this).setConnection(gridSide, !isOpen, false); + } + return Pair.of(CosmicToolDefinitions.WRENCHES, + InteractionResult.sidedSuccess(playerIn.level().isClientSide)); + } + return Pair.of(null, InteractionResult.sidedSuccess(playerIn.level().isClientSide)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/PipeBlockMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/PipeBlockMixin.java new file mode 100644 index 000000000..9075039d0 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/PipeBlockMixin.java @@ -0,0 +1,55 @@ +package com.ghostipedia.cosmiccore.mixin.gtceu; + +import com.ghostipedia.cosmiccore.api.misc.IPipeBlockEntityMixin; +import com.ghostipedia.cosmiccore.common.item.tcon.TiconUtils; + +import com.gregtechceu.gtceu.api.block.PipeBlock; +import com.gregtechceu.gtceu.api.blockentity.PipeBlockEntity; +import com.gregtechceu.gtceu.api.item.tool.ToolHelper; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; + +import com.llamalad7.mixinextras.sugar.Local; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import slimeknights.tconstruct.library.tools.helper.ToolDamageUtil; +import slimeknights.tconstruct.library.tools.item.ModifiableItem; + +@Mixin(value = PipeBlock.class, remap = false) +public class PipeBlockMixin { + + @Inject(method = "use", + at = @At(value = "INVOKE", + target = "Lcom/gregtechceu/gtceu/api/item/tool/ToolHelper;getToolTypes(Lnet/minecraft/world/item/ItemStack;)Ljava/util/Set;"), + cancellable = true) + public void cc$use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, + BlockHitResult hit, CallbackInfoReturnable cir, + @Local ItemStack itemStack, @Local PipeBlockEntity pipeBlockEntity) { + if (itemStack.getItem() instanceof ModifiableItem ticonTool) { + var result = ((IPipeBlockEntityMixin) pipeBlockEntity).ccore$onToolClick(ticonTool, + new UseOnContext(player, hand, hit)); + if (result.getSecond() == InteractionResult.CONSUME && player instanceof ServerPlayer serverPlayer) { + ToolHelper.playToolSound(TiconUtils.getGTToolType(result.getFirst()), serverPlayer); + + if (!serverPlayer.isCreative()) { + ToolDamageUtil.handleDamageItem(itemStack, 1, player, p -> {}); + } + } + + if (result.getSecond() != InteractionResult.PASS) { + cir.setReturnValue(result.getSecond()); + } + } + } +} diff --git a/src/main/resources/cosmiccore.mixins.json b/src/main/resources/cosmiccore.mixins.json index da387a3af..3637f9046 100644 --- a/src/main/resources/cosmiccore.mixins.json +++ b/src/main/resources/cosmiccore.mixins.json @@ -39,6 +39,10 @@ "ae2.eudisplay.EUAddSettingMixin", "client.CosmicCoreRemainingAirOverlayMixin", "emi.EmiApiMixin", + "gtceu.MetaMachineBlockMixin", + "gtceu.MetaMachineMixin", + "gtceu.PipeBlockEntityMixin", + "gtceu.PipeBlockMixin", "lso.FrostbiteEffectMixin", "lso.HeatstrokeEffectMixin", "lso.TemperatureCapabilityMixin", From ea664dcdfac73c988143ea7d5ef54ade320799f6 Mon Sep 17 00:00:00 2001 From: Ghostipedia Date: Sun, 21 Sep 2025 00:28:53 -0400 Subject: [PATCH 11/17] screwdriver --- .../assets/cosmiccore/lang/en_ud.json | 8 +++-- .../assets/cosmiccore/lang/en_us.json | 8 +++-- .../models/item/screwdriver_head_cast.json | 6 ++++ .../item/screwdriver_head_sand_cast.json | 6 ++++ .../tool_definitions/screwdriver.json | 31 ++++++++++++++++++ .../forge/tags/items/tools/screwdrivers.json | 5 +++ .../items/tools/crafting_screwdrivers.json | 5 +++ .../tags/items/cluster_max_harvestables.json | 3 +- .../tconstruct/tags/items/modifiable/aoe.json | 3 +- .../tags/items/modifiable/bonus_slots.json | 3 +- .../tags/items/modifiable/durability.json | 3 +- .../items/modifiable/harvest/primary.json | 3 +- .../items/modifiable/interactable/right.json | 3 +- .../tags/items/modifiable/melee/weapon.json | 3 +- .../tags/items/modifiable/multipart.json | 3 +- .../tags/items/modifiable/small.json | 3 +- .../cosmiccore/common/data/CosmicItems.java | 15 +++++++++ .../common/data/lang/CosmicLangHandler.java | 4 +++ .../common/data/tag/item/CosmicItemTags.java | 4 +++ .../item/tcon/CosmicCreativeTinkersTab.java | 3 ++ .../item/tcon/CosmicTconItemTagProvider.java | 4 +++ .../item/tcon/CosmicTinkerToolPart.java | 3 ++ .../common/item/tcon/CosmicTinkerTools.java | 4 +++ .../tcon/CosmicToolDefinitionProvider.java | 12 +++++++ .../item/tcon/CosmicToolDefinitions.java | 1 + .../cosmiccore/models/item/screwdriver.json | 20 +++++++++++ .../models/item/screwdriver_broken.json | 7 ++++ .../models/item/screwdriver_head.json | 11 +++++++ .../gui/tinker_pattern/screwdriver.png | Bin 0 -> 162 bytes .../gui/tinker_pattern/screwdriver_head.png | Bin 0 -> 162 bytes .../textures/item/screwdriver_head_cast.png | Bin 0 -> 440 bytes .../item/screwdriver_head_sand_cast.png | Bin 0 -> 485 bytes .../item/tool/screwdriver/binding.png | Bin 0 -> 198 bytes .../textures/item/tool/screwdriver/broken.png | Bin 0 -> 155 bytes .../textures/item/tool/screwdriver/handle.png | Bin 0 -> 198 bytes .../screwdriver/handle_tconstruct_unknown.png | Bin 0 -> 159 bytes .../textures/item/tool/screwdriver/head.png | Bin 0 -> 200 bytes .../screwdriver/head_tconstruct_unknown.png | Bin 0 -> 162 bytes .../item/tool/screwdriver/head_tool.png | Bin 0 -> 195 bytes .../head_tool_tconstruct_unknown.png | Bin 0 -> 162 bytes .../screwdriver_head_cast_from_gold.json | 9 +++++ .../screwdriver_head_cast_from_sand.json | 9 +++++ .../tconstruct/materials/neutronium.json | 8 +++++ .../parts/screwdriver_head_casting_gold.json | 7 ++++ .../parts/screwdriver_head_casting_sand.json | 7 ++++ .../recipes/tools/parts/screwdriver_head.json | 7 ++++ .../cosmiccore/recipes/tools/screwdriver.json | 7 ++++ .../data/cosmiccore/recipes/tools/wrench.json | 2 ++ .../tags/items/tconstruct/parts.json | 3 -- .../tags/items/tconstruct/tool_parts.json | 5 ++- .../station_layouts/screwdriver.json | 26 +++++++++++++++ 51 files changed, 257 insertions(+), 17 deletions(-) create mode 100644 src/generated/resources/assets/cosmiccore/models/item/screwdriver_head_cast.json create mode 100644 src/generated/resources/assets/cosmiccore/models/item/screwdriver_head_sand_cast.json create mode 100644 src/generated/resources/data/cosmiccore/tinkering/tool_definitions/screwdriver.json create mode 100644 src/generated/resources/data/forge/tags/items/tools/screwdrivers.json create mode 100644 src/generated/resources/data/gtceu/tags/items/tools/crafting_screwdrivers.json create mode 100644 src/main/resources/assets/cosmiccore/models/item/screwdriver.json create mode 100644 src/main/resources/assets/cosmiccore/models/item/screwdriver_broken.json create mode 100644 src/main/resources/assets/cosmiccore/models/item/screwdriver_head.json create mode 100644 src/main/resources/assets/cosmiccore/textures/gui/tinker_pattern/screwdriver.png create mode 100644 src/main/resources/assets/cosmiccore/textures/gui/tinker_pattern/screwdriver_head.png create mode 100644 src/main/resources/assets/cosmiccore/textures/item/screwdriver_head_cast.png create mode 100644 src/main/resources/assets/cosmiccore/textures/item/screwdriver_head_sand_cast.png create mode 100644 src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/binding.png create mode 100644 src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/broken.png create mode 100644 src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/handle.png create mode 100644 src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/handle_tconstruct_unknown.png create mode 100644 src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/head.png create mode 100644 src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/head_tconstruct_unknown.png create mode 100644 src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/head_tool.png create mode 100644 src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/head_tool_tconstruct_unknown.png create mode 100644 src/main/resources/data/cosmiccore/recipes/tconstruct/casting/screwdriver_head_cast_from_gold.json create mode 100644 src/main/resources/data/cosmiccore/recipes/tconstruct/casting/screwdriver_head_cast_from_sand.json create mode 100644 src/main/resources/data/cosmiccore/recipes/tconstruct/materials/neutronium.json create mode 100644 src/main/resources/data/cosmiccore/recipes/tconstruct/parts/screwdriver_head_casting_gold.json create mode 100644 src/main/resources/data/cosmiccore/recipes/tconstruct/parts/screwdriver_head_casting_sand.json create mode 100644 src/main/resources/data/cosmiccore/recipes/tools/parts/screwdriver_head.json create mode 100644 src/main/resources/data/cosmiccore/recipes/tools/screwdriver.json delete mode 100644 src/main/resources/data/cosmiccore/tags/items/tconstruct/parts.json create mode 100644 src/main/resources/data/cosmiccore/tinkering/station_layouts/screwdriver.json diff --git a/src/generated/resources/assets/cosmiccore/lang/en_ud.json b/src/generated/resources/assets/cosmiccore/lang/en_ud.json index 71209d18f..2f954d31f 100644 --- a/src/generated/resources/assets/cosmiccore/lang/en_ud.json +++ b/src/generated/resources/assets/cosmiccore/lang/en_ud.json @@ -613,6 +613,11 @@ "item.cosmiccore.sanguine_warptech_helmet": "ʇǝɯןǝH ɥɔǝ⟘dɹɐM ǝuınbuɐS", "item.cosmiccore.sanguine_warptech_leggings": "sbuıbbǝꞀ ɥɔǝ⟘dɹɐM ǝuınbuɐS", "item.cosmiccore.saturated_sculk_hemocytoblast": "ʇsɐןqoʇʎɔoɯǝH ʞןnɔS pǝʇɐɹnʇɐS", + "item.cosmiccore.screwdriver": "ɹǝʌıɹpʍǝɹɔS", + "item.cosmiccore.screwdriver.description": "¡uɹn⟘ puɐ ʇsıʍ⟘", + "item.cosmiccore.screwdriver_head": "pɐǝH ɹǝʌıɹpʍǝɹɔS", + "item.cosmiccore.screwdriver_head_cast": "ʇsɐƆ pɐǝH ɹǝʌıɹpʍǝɹɔS", + "item.cosmiccore.screwdriver_head_sand_cast": "ʇsɐƆ puɐS pɐǝH ɹǝʌıɹpʍǝɹɔS", "item.cosmiccore.sculk_fibroblast": "ʇsɐןqoɹqıℲ ʞןnɔS", "item.cosmiccore.sculk_myofibroblast": "ʇsɐןqoɹqıɟoʎW ʞןnɔS", "item.cosmiccore.self_aware_processing_assembly": "ʎןqɯǝssⱯ ɹossǝɔoɹԀ ǝɹɐʍⱯ ɟןǝS", @@ -679,8 +684,7 @@ "item.cosmiccore.wrench_head_sand_cast": "ʇsɐƆ puɐS pɐǝH ɥɔuǝɹM", "item.cosmiccore.zpm_radio_module": "ǝןnpoW oıpɐᴚ WԀZ", "item.gtceu.tool.luv_meld_tool": "ןooʇıʇןnW pןǝW %s", - "itemGroup.cosmiccore.creative_tab": "sɯǝʇI uıɐW ǝɹoƆ ɔıɯsoƆ", - "itemGroup.tinkers.parts.cosmiccore.creative_tab_tinker_tools": "ʇɐdɯoƆ sɹǝʞuı⟘ ǝɹoƆ ɔıɯsoƆ", + "itemGroup.cosmiccore.creative_tab_tinker_tools": "ʇɐdɯoƆ sɹǝʞuı⟘ ǝɹoƆ ɔıɯsoƆ", "material.cosmiccore.causal_fabric": "ɔıɹqɐℲ ןɐsnɐƆ", "material.cosmiccore.chronon": "uouoɹɥƆ", "material.cosmiccore.cosmocite": "ǝʇıɔoɯsoƆ", diff --git a/src/generated/resources/assets/cosmiccore/lang/en_us.json b/src/generated/resources/assets/cosmiccore/lang/en_us.json index 9c92a5fcc..57be4002f 100644 --- a/src/generated/resources/assets/cosmiccore/lang/en_us.json +++ b/src/generated/resources/assets/cosmiccore/lang/en_us.json @@ -613,6 +613,11 @@ "item.cosmiccore.sanguine_warptech_helmet": "Sanguine WarpTech Helmet", "item.cosmiccore.sanguine_warptech_leggings": "Sanguine WarpTech Leggings", "item.cosmiccore.saturated_sculk_hemocytoblast": "Saturated Sculk Hemocytoblast", + "item.cosmiccore.screwdriver": "Screwdriver", + "item.cosmiccore.screwdriver.description": "Twist and Turn!", + "item.cosmiccore.screwdriver_head": "Screwdriver Head", + "item.cosmiccore.screwdriver_head_cast": "Screwdriver Head Cast", + "item.cosmiccore.screwdriver_head_sand_cast": "Screwdriver Head Sand Cast", "item.cosmiccore.sculk_fibroblast": "Sculk Fibroblast", "item.cosmiccore.sculk_myofibroblast": "Sculk Myofibroblast", "item.cosmiccore.self_aware_processing_assembly": "Self Aware Processor Assembly", @@ -679,8 +684,7 @@ "item.cosmiccore.wrench_head_sand_cast": "Wrench Head Sand Cast", "item.cosmiccore.zpm_radio_module": "ZPM Radio Module", "item.gtceu.tool.luv_meld_tool": "%s Meld Multitool", - "itemGroup.cosmiccore.creative_tab": "Cosmic Core Main Items", - "itemGroup.tinkers.parts.cosmiccore.creative_tab_tinker_tools": "Cosmic Core Tinkers Compat", + "itemGroup.cosmiccore.creative_tab_tinker_tools": "Cosmic Core Tinkers Compat", "material.cosmiccore.causal_fabric": "Causal Fabric", "material.cosmiccore.chronon": "Chronon", "material.cosmiccore.cosmocite": "Cosmocite", diff --git a/src/generated/resources/assets/cosmiccore/models/item/screwdriver_head_cast.json b/src/generated/resources/assets/cosmiccore/models/item/screwdriver_head_cast.json new file mode 100644 index 000000000..3ca72bee0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/screwdriver_head_cast.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/screwdriver_head_cast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/screwdriver_head_sand_cast.json b/src/generated/resources/assets/cosmiccore/models/item/screwdriver_head_sand_cast.json new file mode 100644 index 000000000..3253a1b79 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/screwdriver_head_sand_cast.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/screwdriver_head_sand_cast" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tinkering/tool_definitions/screwdriver.json b/src/generated/resources/data/cosmiccore/tinkering/tool_definitions/screwdriver.json new file mode 100644 index 000000000..42fa06d0f --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tinkering/tool_definitions/screwdriver.json @@ -0,0 +1,31 @@ +{ + "modules": [ + { + "type": "tconstruct:part_stats", + "parts": [ + "cosmiccore:screwdriver_head", + "tconstruct:tool_handle" + ], + "primary_part": 0 + }, + { + "type": "tconstruct:default_materials", + "materials": [ + { + "type": "tconstruct:random", + "tier": 1 + }, + { + "type": "tconstruct:random", + "tier": 1 + } + ] + }, + { + "type": "tconstruct:base_stats", + "stats": { + "tconstruct:attack_speed": 0.9 + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/tools/screwdrivers.json b/src/generated/resources/data/forge/tags/items/tools/screwdrivers.json new file mode 100644 index 000000000..668f50863 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/tools/screwdrivers.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:screwdriver" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/items/tools/crafting_screwdrivers.json b/src/generated/resources/data/gtceu/tags/items/tools/crafting_screwdrivers.json new file mode 100644 index 000000000..668f50863 --- /dev/null +++ b/src/generated/resources/data/gtceu/tags/items/tools/crafting_screwdrivers.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:screwdriver" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/items/cluster_max_harvestables.json b/src/generated/resources/data/minecraft/tags/items/cluster_max_harvestables.json index f7f403ff0..46e488c48 100644 --- a/src/generated/resources/data/minecraft/tags/items/cluster_max_harvestables.json +++ b/src/generated/resources/data/minecraft/tags/items/cluster_max_harvestables.json @@ -1,6 +1,7 @@ { "values": [ "cosmiccore:wire_cutter", - "cosmiccore:wrench" + "cosmiccore:wrench", + "cosmiccore:screwdriver" ] } \ No newline at end of file diff --git a/src/generated/resources/data/tconstruct/tags/items/modifiable/aoe.json b/src/generated/resources/data/tconstruct/tags/items/modifiable/aoe.json index f7f403ff0..46e488c48 100644 --- a/src/generated/resources/data/tconstruct/tags/items/modifiable/aoe.json +++ b/src/generated/resources/data/tconstruct/tags/items/modifiable/aoe.json @@ -1,6 +1,7 @@ { "values": [ "cosmiccore:wire_cutter", - "cosmiccore:wrench" + "cosmiccore:wrench", + "cosmiccore:screwdriver" ] } \ No newline at end of file diff --git a/src/generated/resources/data/tconstruct/tags/items/modifiable/bonus_slots.json b/src/generated/resources/data/tconstruct/tags/items/modifiable/bonus_slots.json index f7f403ff0..46e488c48 100644 --- a/src/generated/resources/data/tconstruct/tags/items/modifiable/bonus_slots.json +++ b/src/generated/resources/data/tconstruct/tags/items/modifiable/bonus_slots.json @@ -1,6 +1,7 @@ { "values": [ "cosmiccore:wire_cutter", - "cosmiccore:wrench" + "cosmiccore:wrench", + "cosmiccore:screwdriver" ] } \ No newline at end of file diff --git a/src/generated/resources/data/tconstruct/tags/items/modifiable/durability.json b/src/generated/resources/data/tconstruct/tags/items/modifiable/durability.json index f7f403ff0..46e488c48 100644 --- a/src/generated/resources/data/tconstruct/tags/items/modifiable/durability.json +++ b/src/generated/resources/data/tconstruct/tags/items/modifiable/durability.json @@ -1,6 +1,7 @@ { "values": [ "cosmiccore:wire_cutter", - "cosmiccore:wrench" + "cosmiccore:wrench", + "cosmiccore:screwdriver" ] } \ No newline at end of file diff --git a/src/generated/resources/data/tconstruct/tags/items/modifiable/harvest/primary.json b/src/generated/resources/data/tconstruct/tags/items/modifiable/harvest/primary.json index f7f403ff0..46e488c48 100644 --- a/src/generated/resources/data/tconstruct/tags/items/modifiable/harvest/primary.json +++ b/src/generated/resources/data/tconstruct/tags/items/modifiable/harvest/primary.json @@ -1,6 +1,7 @@ { "values": [ "cosmiccore:wire_cutter", - "cosmiccore:wrench" + "cosmiccore:wrench", + "cosmiccore:screwdriver" ] } \ No newline at end of file diff --git a/src/generated/resources/data/tconstruct/tags/items/modifiable/interactable/right.json b/src/generated/resources/data/tconstruct/tags/items/modifiable/interactable/right.json index f7f403ff0..46e488c48 100644 --- a/src/generated/resources/data/tconstruct/tags/items/modifiable/interactable/right.json +++ b/src/generated/resources/data/tconstruct/tags/items/modifiable/interactable/right.json @@ -1,6 +1,7 @@ { "values": [ "cosmiccore:wire_cutter", - "cosmiccore:wrench" + "cosmiccore:wrench", + "cosmiccore:screwdriver" ] } \ No newline at end of file diff --git a/src/generated/resources/data/tconstruct/tags/items/modifiable/melee/weapon.json b/src/generated/resources/data/tconstruct/tags/items/modifiable/melee/weapon.json index f7f403ff0..46e488c48 100644 --- a/src/generated/resources/data/tconstruct/tags/items/modifiable/melee/weapon.json +++ b/src/generated/resources/data/tconstruct/tags/items/modifiable/melee/weapon.json @@ -1,6 +1,7 @@ { "values": [ "cosmiccore:wire_cutter", - "cosmiccore:wrench" + "cosmiccore:wrench", + "cosmiccore:screwdriver" ] } \ No newline at end of file diff --git a/src/generated/resources/data/tconstruct/tags/items/modifiable/multipart.json b/src/generated/resources/data/tconstruct/tags/items/modifiable/multipart.json index f7f403ff0..46e488c48 100644 --- a/src/generated/resources/data/tconstruct/tags/items/modifiable/multipart.json +++ b/src/generated/resources/data/tconstruct/tags/items/modifiable/multipart.json @@ -1,6 +1,7 @@ { "values": [ "cosmiccore:wire_cutter", - "cosmiccore:wrench" + "cosmiccore:wrench", + "cosmiccore:screwdriver" ] } \ No newline at end of file diff --git a/src/generated/resources/data/tconstruct/tags/items/modifiable/small.json b/src/generated/resources/data/tconstruct/tags/items/modifiable/small.json index f7f403ff0..46e488c48 100644 --- a/src/generated/resources/data/tconstruct/tags/items/modifiable/small.json +++ b/src/generated/resources/data/tconstruct/tags/items/modifiable/small.json @@ -1,6 +1,7 @@ { "values": [ "cosmiccore:wire_cutter", - "cosmiccore:wrench" + "cosmiccore:wrench", + "cosmiccore:screwdriver" ] } \ No newline at end of file diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicItems.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicItems.java index d6498b1fc..d959df25d 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicItems.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicItems.java @@ -1804,6 +1804,21 @@ public boolean isFoil(ItemStack stack) { .defaultModel() .register(); + public static final ItemEntry SCREWDRIVER_CAST_GOLD = REGISTRATE + .item("screwdriver_head_cast", ComponentItem::create) + .lang("Screwdriver Head Cast") + .properties(p -> p.stacksTo(1)) + .tag(CosmicItemTags.SCREWDRIVER_HEAD_CAST_MULTI) + .defaultModel() + .register(); + public static final ItemEntry SCREWDRIVER_CAST_SAND = REGISTRATE + .item("screwdriver_head_sand_cast", ComponentItem::create) + .lang("Screwdriver Head Sand Cast") + .tag(CosmicItemTags.SCREWDRIVER_HEAD_CAST_SINGLE) + .properties(p -> p.stacksTo(1)) + .defaultModel() + .register(); + public static ItemEntry LINKED_TERMINAL = REGISTRATE .item("linked_terminal", ComponentItem::create) .lang("Linked Terminal") diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/lang/CosmicLangHandler.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/lang/CosmicLangHandler.java index 961e169ac..952ab0c7b 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/lang/CosmicLangHandler.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/lang/CosmicLangHandler.java @@ -373,5 +373,9 @@ public static void init(RegistrateLangProvider provider) { provider.add("item.cosmiccore.wrench", "Wrench"); provider.add("item.cosmiccore.wrench_head", "Wrench Head"); provider.add("item.cosmiccore.wrench.description", "Rotate the World!"); + + provider.add("item.cosmiccore.screwdriver", "Screwdriver"); + provider.add("item.cosmiccore.screwdriver_head", "Screwdriver Head"); + provider.add("item.cosmiccore.screwdriver.description", "Twist and Turn!"); } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/item/CosmicItemTags.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/item/CosmicItemTags.java index cf06b625f..bb003201d 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/item/CosmicItemTags.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/item/CosmicItemTags.java @@ -11,4 +11,8 @@ public class CosmicItemTags { public static final TagKey QUARKTECH_SPACE_SUITE = TagUtil.createModItemTag("quantum_space_suite"); public static final TagKey WRENCH_HEAD_CAST_MULTI = TagUtil.createModItemTag("casts/multi_use/wrench_head"); public static final TagKey WRENCH_HEAD_CAST_SINGLE = TagUtil.createModItemTag("casts/single_use/wrench_head"); + public static final TagKey SCREWDRIVER_HEAD_CAST_SINGLE = TagUtil + .createModItemTag("casts/single_use/screwdriver_head"); + public static final TagKey SCREWDRIVER_HEAD_CAST_MULTI = TagUtil + .createModItemTag("casts/multi_use/screwdriver_head_sand"); } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicCreativeTinkersTab.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicCreativeTinkersTab.java index fb09cfe2b..96b5c1df0 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicCreativeTinkersTab.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicCreativeTinkersTab.java @@ -18,7 +18,10 @@ public static void addCreativeTabItems(CreativeModeTab.ItemDisplayParameters ite Consumer output = tab::accept; acceptTool(output, CosmicTinkerTools.wireCutter); acceptTool(output, CosmicTinkerTools.wrench); + acceptTool(output, CosmicTinkerTools.screwdriver); + acceptPart(output, CosmicTinkerToolPart.wrenchHead); + acceptPart(output, CosmicTinkerToolPart.screwdriverHead); } private static void acceptTool(Consumer output, Supplier tool) { diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTconItemTagProvider.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTconItemTagProvider.java index f98a4dace..0d5c3f98c 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTconItemTagProvider.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTconItemTagProvider.java @@ -38,6 +38,10 @@ private void addTools() { addToolTags(CosmicTinkerTools.wrench, MULTIPART_TOOL, DURABILITY, HARVEST_PRIMARY, CustomTags.WRENCHES, CustomTags.CRAFTING_WRENCHES, MELEE_WEAPON, INTERACTABLE_RIGHT, AOE, CLUSTER_MAX_HARVESTABLES, SMALL_TOOLS, BONUS_SLOTS); + + addToolTags(CosmicTinkerTools.screwdriver, MULTIPART_TOOL, DURABILITY, HARVEST_PRIMARY, CustomTags.SCREWDRIVERS, + CustomTags.CRAFTING_SCREWDRIVERS, MELEE_WEAPON, INTERACTABLE_RIGHT, AOE, CLUSTER_MAX_HARVESTABLES, + SMALL_TOOLS, BONUS_SLOTS); } @SafeVarargs diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerToolPart.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerToolPart.java index 4500b54e1..f8f56e4da 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerToolPart.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerToolPart.java @@ -31,6 +31,9 @@ public class CosmicTinkerToolPart { public static final ItemObject wrenchHead = COSMIC_TINKER_PARTS.register("wrench_head", () -> new ToolPartItem(ITEM_PROPS, HeadMaterialStats.ID)); + public static final ItemObject screwdriverHead = COSMIC_TINKER_PARTS.register("screwdriver_head", + () -> new ToolPartItem(ITEM_PROPS, HeadMaterialStats.ID)); + public static void init() { COSMIC_TINKER_PARTS.register(FMLJavaModLoadingContext.get().getModEventBus()); } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerTools.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerTools.java index 6f63e4ddf..b2a381072 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerTools.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerTools.java @@ -23,6 +23,10 @@ public class CosmicTinkerTools { public static final ItemObject wireCutter = COSMIC_TINKER_ITEM.register("wire_cutter", () -> new ModifiableItem(UNSTACKABLE_PROPS, CosmicToolDefinitions.WIRE_CUTTERS)); + + public static final ItemObject screwdriver = COSMIC_TINKER_ITEM.register("screwdriver", + () -> new ModifiableItem(UNSTACKABLE_PROPS, CosmicToolDefinitions.SCREWDRIVER)); + public static final ItemObject wrench = COSMIC_TINKER_ITEM.register("wrench", () -> new ModifiableItem(UNSTACKABLE_PROPS, CosmicToolDefinitions.WRENCHES) { diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitionProvider.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitionProvider.java index ab0f97126..cbc819fd9 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitionProvider.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitionProvider.java @@ -17,6 +17,7 @@ import slimeknights.tconstruct.library.tools.nbt.StatsNBT; import slimeknights.tconstruct.library.tools.stat.ToolStats; +import static com.ghostipedia.cosmiccore.common.item.tcon.CosmicTinkerToolPart.screwdriverHead; import static com.ghostipedia.cosmiccore.common.item.tcon.CosmicTinkerToolPart.wrenchHead; import static slimeknights.tconstruct.tools.TinkerToolParts.*; @@ -58,6 +59,17 @@ protected void addToolDefinitions() { .build())) .module(IsEffectiveModule.tag(CustomTags.MINEABLE_WITH_WIRE_CUTTER)); + define(CosmicToolDefinitions.SCREWDRIVER) + .module(PartStatsModule.parts() + .part(screwdriverHead) + .part(toolHandle) + .build()) + .module(defaultTwoParts) + .module(new SetStatsModule(StatsNBT.builder() + .set(ToolStats.ATTACK_SPEED, 0.9f) + + .build())); + define(CosmicToolDefinitions.WRENCHES) .module(PartStatsModule.parts() .part(wrenchHead) diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitions.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitions.java index 5b1e85950..46d035d97 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitions.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitions.java @@ -9,4 +9,5 @@ public class CosmicToolDefinitions { public static final ToolDefinition WIRE_CUTTERS = ToolDefinition.create(CosmicTinkerTools.wireCutter); public static final ToolDefinition WRENCHES = ToolDefinition.create(CosmicTinkerTools.wrench); + public static final ToolDefinition SCREWDRIVER = ToolDefinition.create(CosmicTinkerTools.screwdriver); } diff --git a/src/main/resources/assets/cosmiccore/models/item/screwdriver.json b/src/main/resources/assets/cosmiccore/models/item/screwdriver.json new file mode 100644 index 000000000..a0b5d0034 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/screwdriver.json @@ -0,0 +1,20 @@ +{ + "loader": "tconstruct:tool", + "parent": "forge:item/default-tool", + "textures": { + "broken": "cosmiccore:item/tool/screwdriver/broken", + "head": "cosmiccore:item/tool/screwdriver/head_tool", + "handle": "cosmiccore:item/tool/screwdriver/handle" + }, + "modifier_roots": [ "tconstruct:item/tool/pickaxe/modifiers/" ], + "parts": [ + { "name": "handle", "index": 1 }, + { "name": "head", "index": 0 } + ], + "overrides": [ + { + "predicate": { "tconstruct:broken": 1 }, + "model": "cosmiccore:item/tool/screwdriver/broken" + } + ] +} diff --git a/src/main/resources/assets/cosmiccore/models/item/screwdriver_broken.json b/src/main/resources/assets/cosmiccore/models/item/screwdriver_broken.json new file mode 100644 index 000000000..469bcefdd --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/screwdriver_broken.json @@ -0,0 +1,7 @@ +{ + "loader": "tconstruct:tool", + "textures": { + "broken": "cosmiccore:item/tool/screwdriver/broken" + }, + "parts": [ { "name": "broken" } ] +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/screwdriver_head.json b/src/main/resources/assets/cosmiccore/models/item/screwdriver_head.json new file mode 100644 index 000000000..546733b7c --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/screwdriver_head.json @@ -0,0 +1,11 @@ +{ + "parent": "forge:item/default", + "loader": "tconstruct:material", + "offset": [ + -2, + 1 + ], + "textures": { + "texture": "cosmiccore:item/tool/screwdriver/head" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/gui/tinker_pattern/screwdriver.png b/src/main/resources/assets/cosmiccore/textures/gui/tinker_pattern/screwdriver.png new file mode 100644 index 0000000000000000000000000000000000000000..0dd24d8df4bffcfbbb0d982155156858d1550902 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP%y;P z#WBR9_w6J@z5@mv%(8Kb|NaMrORh2!WXjf66u2bGrti69>hAgpOI9nbw2)pF^!V4i z_dR?v-)9_9Wmfxev4P#fG=WjCe!-G3_0B-EvlIWaRWN+Moz*nyT2D35d1j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/cosmiccore/textures/gui/tinker_pattern/screwdriver_head.png b/src/main/resources/assets/cosmiccore/textures/gui/tinker_pattern/screwdriver_head.png new file mode 100644 index 0000000000000000000000000000000000000000..0dd24d8df4bffcfbbb0d982155156858d1550902 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP%y;P z#WBR9_w6J@z5@mv%(8Kb|NaMrORh2!WXjf66u2bGrti69>hAgpOI9nbw2)pF^!V4i z_dR?v-)9_9Wmfxev4P#fG=WjCe!-G3_0B-EvlIWaRWN+Moz*nyT2D35d1j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/cosmiccore/textures/item/screwdriver_head_cast.png b/src/main/resources/assets/cosmiccore/textures/item/screwdriver_head_cast.png new file mode 100644 index 0000000000000000000000000000000000000000..20b8ef85da352eb0d127c0ba2e020ccb5a447621 GIT binary patch literal 440 zcmV;p0Z0CcP)DlD|p=K@i4wj}>z<5haCqqD2I;5XH*E7r4sKR>2pr z@Hs4e1zTSrg+4&A5CuUk6i&R5BL2Jl#h8_E&RO@CM8vPz+u8Z;d^3A;pwF}zA>BTv zRpxg_o-2F|9*@$*(sVYV@gltWeY590&V8*^(hFP|AoLr|Im(7PXv46H_-z!*$(cZO znu#cj6VtZmR&`;h*4vX~6GehQS_#FvPtlJ9?Z6E389={K6z}y|;3B}ixR&N?E17z; z_7JS2>hr@L!9n*>1D*=QYzuP89BwW)$U3yLd9BN(w0FQ}h?3qot%@M*<-RNT+f9lu zuU9pn`KxQ0BFgTS2Xo)pmO>;#Jb znJD64Okv|U-Lot;u-v>ZKIGfQyAes6*>Sh=l_>8|PMh|N7>+0H8(@#6QytUEb-qLp04x5!lZ^OHs3wF~FFCm zxLTtzm&iUw5F}~l#X!_05{-hONnSoBQ&aN~ND_K1keCZ*r@InFwJitp3 z&N+v#xkq&7mzVrPT>=FqXjY;4>Rku}s$vRB*%WYHPR1C1Abuov?eJ#?n4D>xu1UM= brjl+yaA7s<%tUkq00000NkvXXu0mjfAfD3< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/binding.png b/src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/binding.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf2520c20013cb4bf51bccba190d7ae86a9af9f GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP_V+& z#WBR9H~G*1|MtwP4V_AN7qbN%XAmoCymTq3U{BnRg2u$}@9y@fNHZ{LYHB9jx_b4i zy`uAs3#<-i%?CE8pO|lJx&B5{D^7#WD+M3Nd sZJGP({#q%YWHS)pWV4eE$YEeGpQ3g(xc&EBpc@!GUHx3vIVCg!08!jThyVZp literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/broken.png b/src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/broken.png new file mode 100644 index 0000000000000000000000000000000000000000..02985cfd9f0b1a8916ab03364943d42a339cd894 GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP|(-Y z#WBR9_wA&Oyax<8Sl;>^bU1(O%t15po!bi>A1XQSdR4k!f5w3qcP?+T4|(uTXPaVx zQs==mZK83BY&0yhezDqt`ias|?4*xi^ zqk(mLT8f<=Ly*h1G!gv?izU~vPnnzePc_u|1Pg=8QbXB)&-7%0hBJ7&`njxgN@xNA DzJ@S2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/head.png b/src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/head.png new file mode 100644 index 0000000000000000000000000000000000000000..266cca1147b3196deea2dfc220c2cbaa4469befe GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP_W9= z#WBR9_v++}oCg$mTtcl}%nBwJyR{3>Ih?!h2LHq?!=wL9CaiyQH&#H`b8~QB_dllx z7xdZ$Zmrc+z0IaFows4B$TcCsZ^p}gAM7$Dc uOBda2WM^bJW4ZcaCQ~Kj^=<$E`>20eRZ%DhAgpOI9nbw2)pF^!V4i z_dR?v-)9_9Wmfxev4P#fG=WjCe!-G3_0B-EvlIWaRWN+Moz*nyT2D35d1j literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/head_tool.png b/src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/head_tool.png new file mode 100644 index 0000000000000000000000000000000000000000..73cf86da728b078a7fca12db0f87d0150ea88515 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP_Wd~ z#WBR9_wA&+oCg$mS|U5o4AWgU zSx$_}UYeYC=LxH(>PgG><_9+3HUF){%3zUgFJ~cmVQM;4!Rotz#G4xy%CIsdXsS+g p=gm?1ebCTimgF}7Z}JM~_?FE*cWv*=8z5&gc)I$ztaD0e0sssALpuNf literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/head_tool_tconstruct_unknown.png b/src/main/resources/assets/cosmiccore/textures/item/tool/screwdriver/head_tool_tconstruct_unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..0dd24d8df4bffcfbbb0d982155156858d1550902 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP%y;P z#WBR9_w6J@z5@mv%(8Kb|NaMrORh2!WXjf66u2bGrti69>hAgpOI9nbw2)pF^!V4i z_dR?v-)9_9Wmfxev4P#fG=WjCe!-G3_0B-EvlIWaRWN+Moz*nyT2D35d1j literal 0 HcmV?d00001 diff --git a/src/main/resources/data/cosmiccore/recipes/tconstruct/casting/screwdriver_head_cast_from_gold.json b/src/main/resources/data/cosmiccore/recipes/tconstruct/casting/screwdriver_head_cast_from_gold.json new file mode 100644 index 000000000..26aa2dfa6 --- /dev/null +++ b/src/main/resources/data/cosmiccore/recipes/tconstruct/casting/screwdriver_head_cast_from_gold.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:casting_table", + "cast": { "item": "cosmiccore:screwdriver_head" }, + "cast_consumed": false, + "fluid": { "tag": "forge:molten_gold", "amount": 288 }, + "result": { "item": "cosmiccore:screwdriver_head_cast" }, + "cooling_time": 80, + "switch_slots": true +} \ No newline at end of file diff --git a/src/main/resources/data/cosmiccore/recipes/tconstruct/casting/screwdriver_head_cast_from_sand.json b/src/main/resources/data/cosmiccore/recipes/tconstruct/casting/screwdriver_head_cast_from_sand.json new file mode 100644 index 000000000..d86f29ec2 --- /dev/null +++ b/src/main/resources/data/cosmiccore/recipes/tconstruct/casting/screwdriver_head_cast_from_sand.json @@ -0,0 +1,9 @@ +{ + "type": "tconstruct:casting_table", + "cast": { "item": "cosmiccore:screwdriver_head" }, + "cast_consumed": true, + "fluid": { "tag": "forge:molten_gold", "amount": 288 }, + "result": { "item": "cosmiccore:screwdriver_head_cast" }, + "cooling_time": 80, + "switch_slots": true +} \ No newline at end of file diff --git a/src/main/resources/data/cosmiccore/recipes/tconstruct/materials/neutronium.json b/src/main/resources/data/cosmiccore/recipes/tconstruct/materials/neutronium.json new file mode 100644 index 000000000..7af3e1ab5 --- /dev/null +++ b/src/main/resources/data/cosmiccore/recipes/tconstruct/materials/neutronium.json @@ -0,0 +1,8 @@ +{ + "hidden": false, + "tier": 4, + "sortOrder": 50, + "craftable": false, + "castable": false, + "textColor": "9AD3FF" +} diff --git a/src/main/resources/data/cosmiccore/recipes/tconstruct/parts/screwdriver_head_casting_gold.json b/src/main/resources/data/cosmiccore/recipes/tconstruct/parts/screwdriver_head_casting_gold.json new file mode 100644 index 000000000..ea979a45e --- /dev/null +++ b/src/main/resources/data/cosmiccore/recipes/tconstruct/parts/screwdriver_head_casting_gold.json @@ -0,0 +1,7 @@ +{ + "type": "tconstruct:table_casting_material", + "cast": { "tag": "cosmiccore:casts/multi_use/screwdriver_head" }, + "cast_consumed": false, + "item_cost": 2, + "result": "cosmiccore:screwdriver_head" +} \ No newline at end of file diff --git a/src/main/resources/data/cosmiccore/recipes/tconstruct/parts/screwdriver_head_casting_sand.json b/src/main/resources/data/cosmiccore/recipes/tconstruct/parts/screwdriver_head_casting_sand.json new file mode 100644 index 000000000..5f2b1dfab --- /dev/null +++ b/src/main/resources/data/cosmiccore/recipes/tconstruct/parts/screwdriver_head_casting_sand.json @@ -0,0 +1,7 @@ +{ + "type": "tconstruct:table_casting_material", + "cast": { "tag": "cosmiccore:casts/multi_use/screwdriver_head_sand" }, + "cast_consumed": true, + "item_cost": 2, + "result": "cosmiccore:screwdriver_head" +} \ No newline at end of file diff --git a/src/main/resources/data/cosmiccore/recipes/tools/parts/screwdriver_head.json b/src/main/resources/data/cosmiccore/recipes/tools/parts/screwdriver_head.json new file mode 100644 index 000000000..dc7fe8cac --- /dev/null +++ b/src/main/resources/data/cosmiccore/recipes/tools/parts/screwdriver_head.json @@ -0,0 +1,7 @@ +{ + "type": "tconstruct:part_builder", + "pattern": "cosmiccore:screwdriver_head", + "pattern_item": { "item": "tconstruct:pattern" }, + "cost": 1, + "result": { "item": "cosmiccore:screwdriver_head" } +} diff --git a/src/main/resources/data/cosmiccore/recipes/tools/screwdriver.json b/src/main/resources/data/cosmiccore/recipes/tools/screwdriver.json new file mode 100644 index 000000000..3cb9659a0 --- /dev/null +++ b/src/main/resources/data/cosmiccore/recipes/tools/screwdriver.json @@ -0,0 +1,7 @@ +{ + "type": "tconstruct:tool_building", + "result": "cosmiccore:screwdriver", + "layout_slot": "cosmiccore:screwdriver" +} + + diff --git a/src/main/resources/data/cosmiccore/recipes/tools/wrench.json b/src/main/resources/data/cosmiccore/recipes/tools/wrench.json index f08f32891..bb8ade177 100644 --- a/src/main/resources/data/cosmiccore/recipes/tools/wrench.json +++ b/src/main/resources/data/cosmiccore/recipes/tools/wrench.json @@ -3,3 +3,5 @@ "result": "cosmiccore:wrench", "layout_slot": "cosmiccore:wrench" } + + diff --git a/src/main/resources/data/cosmiccore/tags/items/tconstruct/parts.json b/src/main/resources/data/cosmiccore/tags/items/tconstruct/parts.json deleted file mode 100644 index e1d5c8b5d..000000000 --- a/src/main/resources/data/cosmiccore/tags/items/tconstruct/parts.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "values": ["cosmiccore:wrench_head"] -} diff --git a/src/main/resources/data/cosmiccore/tags/items/tconstruct/tool_parts.json b/src/main/resources/data/cosmiccore/tags/items/tconstruct/tool_parts.json index aa2e6da3f..5cdbafba6 100644 --- a/src/main/resources/data/cosmiccore/tags/items/tconstruct/tool_parts.json +++ b/src/main/resources/data/cosmiccore/tags/items/tconstruct/tool_parts.json @@ -1,3 +1,6 @@ { - "values": ["cosmiccore:wrench_head"] + "values": [ + "cosmiccore:wrench_head", + "cosmiccore:screwdriver_head" + ] } \ No newline at end of file diff --git a/src/main/resources/data/cosmiccore/tinkering/station_layouts/screwdriver.json b/src/main/resources/data/cosmiccore/tinkering/station_layouts/screwdriver.json new file mode 100644 index 000000000..7579671b4 --- /dev/null +++ b/src/main/resources/data/cosmiccore/tinkering/station_layouts/screwdriver.json @@ -0,0 +1,26 @@ +{ + "translation_key": "tool.cosmiccore.screwdriver", + "sortIndex": 26, + + "icon": { + "item": "cosmiccore:screwdriver", + "nbt": "{Damage:0,tic_broken:0b,tic_display:1b,tic_materials:[\"tconstruct:ui_render#head\",\"tconstruct:ui_render#handle\"]}" + }, + + "input_slots": [ + { + "filter": { "item": "cosmiccore:screwdriver_head" }, + "icon": "cosmiccore:screwdriver_head", + "translation_key": "tool.cosmiccore.screwdriver.head", + "x": 44, + "y": 29 + }, + { + "filter": { "item": "tconstruct:tool_handle" }, + "icon": "tconstruct:tool_handle", + "translation_key": "item.tconstruct.tool_handle", + "x": 21, + "y": 52 + } + ] +} From 92540b57a1f4eb66ca04828ae428406cacf23bd2 Mon Sep 17 00:00:00 2001 From: Ghostipedia Date: Sun, 21 Sep 2025 00:29:42 -0400 Subject: [PATCH 12/17] whoops forgot a file --- .../tags/items/casts/multi_use/screwdriver_head_sand.json | 5 +++++ .../tags/items/casts/single_use/screwdriver_head.json | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 src/generated/resources/data/cosmiccore/tags/items/casts/multi_use/screwdriver_head_sand.json create mode 100644 src/generated/resources/data/cosmiccore/tags/items/casts/single_use/screwdriver_head.json diff --git a/src/generated/resources/data/cosmiccore/tags/items/casts/multi_use/screwdriver_head_sand.json b/src/generated/resources/data/cosmiccore/tags/items/casts/multi_use/screwdriver_head_sand.json new file mode 100644 index 000000000..7c7eff2b2 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tags/items/casts/multi_use/screwdriver_head_sand.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:screwdriver_head_cast" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tags/items/casts/single_use/screwdriver_head.json b/src/generated/resources/data/cosmiccore/tags/items/casts/single_use/screwdriver_head.json new file mode 100644 index 000000000..0e6ac1c16 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tags/items/casts/single_use/screwdriver_head.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:screwdriver_head_sand_cast" + ] +} \ No newline at end of file From d8faed54458a7c117d6cdc38dbaf8ed68759736c Mon Sep 17 00:00:00 2001 From: Ghostipedia Date: Sun, 21 Sep 2025 18:18:32 -0400 Subject: [PATCH 13/17] Datagen Attempt 1 (Failure) --- .../data/datagen/CosmicDataGenerators.java | 5 ++++ .../data/datagen/CosmicTinkersMaterials.java | 28 +++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicTinkersMaterials.java diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicDataGenerators.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicDataGenerators.java index 1d4fb6198..04b10d110 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicDataGenerators.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicDataGenerators.java @@ -26,6 +26,11 @@ public static void gatherData(GatherDataEvent event) { generator.addProvider(server, new CosmicModifierProvider(packOutput)); +// TODO DATAGEN FOR Materials + stats + traits (server) +// generator.addProvider(server, new CosmicTinkersMaterials(packOutput)); +// generator.addProvider(server, new CosmicMaterialStats(packOutput)); +// generator.addProvider(server, new CosmicMaterialTraits(packOutput)); + if (event.includeClient()) { generator.addProvider(true, new SoundEntryBuilder.SoundEntryProvider(packOutput, CosmicCore.MOD_ID)); } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicTinkersMaterials.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicTinkersMaterials.java new file mode 100644 index 000000000..5673832e4 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicTinkersMaterials.java @@ -0,0 +1,28 @@ +package com.ghostipedia.cosmiccore.common.data.datagen; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import net.minecraft.data.PackOutput; +import net.minecraft.resources.ResourceLocation; + +import slimeknights.tconstruct.library.data.material.AbstractMaterialDataProvider; + +public class CosmicTinkersMaterials extends AbstractMaterialDataProvider { + + public static final ResourceLocation SCREWDRIVERIUM = CosmicCore.id("neutronite"); + + public CosmicTinkersMaterials(PackOutput out) { + super(out); + } + + @Override + protected void addMaterials() { + //todo figure this out + } + + + @Override + public String getName() { + return ""; + } +} From 2e3125244daa12506cda60cb0f00561ea344962d Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Mon, 22 Sep 2025 19:52:34 -0600 Subject: [PATCH 14/17] fix crash (#143) --- .../cosmiccore/mixin/gtceu/MetaMachineBlockMixin.java | 10 +++++----- .../cosmiccore/mixin/gtceu/PipeBlockMixin.java | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/MetaMachineBlockMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/MetaMachineBlockMixin.java index 11a4e5cda..069d28089 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/MetaMachineBlockMixin.java +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/MetaMachineBlockMixin.java @@ -26,17 +26,17 @@ import slimeknights.tconstruct.library.tools.helper.ToolDamageUtil; import slimeknights.tconstruct.library.tools.item.ModifiableItem; -@Mixin(value = MetaMachineBlock.class, remap = false) +@Mixin(value = MetaMachineBlock.class, remap = true) public class MetaMachineBlockMixin { @Inject(method = "use", at = @At(value = "INVOKE", target = "Lcom/gregtechceu/gtceu/api/item/tool/ToolHelper;getToolTypes(Lnet/minecraft/world/item/ItemStack;)Ljava/util/Set;"), cancellable = true) - public void ccore$use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, - BlockHitResult hit, - CallbackInfoReturnable cir, @Local MetaMachine machine, - @Local ItemStack itemStack) { + public void cosmicCore$use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, + BlockHitResult hit, + CallbackInfoReturnable cir, @Local MetaMachine machine, + @Local ItemStack itemStack) { if (itemStack.getItem() instanceof ModifiableItem ticonTool) { var result = ((IMetaMachineMixin) machine).ccore$onToolClick(ticonTool, new UseOnContext(player, hand, hit)); diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/PipeBlockMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/PipeBlockMixin.java index 9075039d0..0e21dd00e 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/PipeBlockMixin.java +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/PipeBlockMixin.java @@ -26,16 +26,16 @@ import slimeknights.tconstruct.library.tools.helper.ToolDamageUtil; import slimeknights.tconstruct.library.tools.item.ModifiableItem; -@Mixin(value = PipeBlock.class, remap = false) +@Mixin(value = PipeBlock.class, remap = true) public class PipeBlockMixin { @Inject(method = "use", at = @At(value = "INVOKE", target = "Lcom/gregtechceu/gtceu/api/item/tool/ToolHelper;getToolTypes(Lnet/minecraft/world/item/ItemStack;)Ljava/util/Set;"), cancellable = true) - public void cc$use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, - BlockHitResult hit, CallbackInfoReturnable cir, - @Local ItemStack itemStack, @Local PipeBlockEntity pipeBlockEntity) { + public void cosmicCore$use(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, + BlockHitResult hit, CallbackInfoReturnable cir, + @Local ItemStack itemStack, @Local PipeBlockEntity pipeBlockEntity) { if (itemStack.getItem() instanceof ModifiableItem ticonTool) { var result = ((IPipeBlockEntityMixin) pipeBlockEntity).ccore$onToolClick(ticonTool, new UseOnContext(player, hand, hit)); From d5bd644f957eb96f6c221ca1a8b9ef20874c8302 Mon Sep 17 00:00:00 2001 From: Ghostipedia Date: Tue, 23 Sep 2025 03:22:36 -0400 Subject: [PATCH 15/17] Dawnforge on the tinkers branch --- .../{ember_tester.json => dawn_forge.json} | 32 +++---- .../blockstates/ev_ember_input_hatch.json | 28 ++++++ .../blockstates/ev_ember_output_hatch.json | 28 ++++++ .../blockstates/hv_ember_input_hatch.json | 28 ++++++ .../blockstates/hv_ember_output_hatch.json | 28 ++++++ .../blockstates/light_dawnstone_casing.json | 7 ++ .../blockstates/lv_ember_input_hatch.json | 28 ++++++ .../blockstates/lv_ember_output_hatch.json | 28 ++++++ .../blockstates/mv_ember_input_hatch.json | 28 ++++++ .../blockstates/mv_ember_output_hatch.json | 28 ++++++ .../reinforced_dawnstone_casing.json | 7 ++ .../assets/cosmiccore/lang/en_ud.json | 19 +++- .../assets/cosmiccore/lang/en_us.json | 19 +++- .../models/block/light_dawnstone_casing.json | 6 ++ .../models/block/machine/dawn_forge.json | 90 ++++++++++++++++++ .../models/block/machine/ember_tester.json | 90 ------------------ .../block/machine/ev_ember_input_hatch.json | 32 +++++++ .../block/machine/ev_ember_output_hatch.json | 32 +++++++ .../block/machine/hv_ember_input_hatch.json | 32 +++++++ .../block/machine/hv_ember_output_hatch.json | 32 +++++++ .../block/machine/lv_ember_input_hatch.json | 32 +++++++ .../block/machine/lv_ember_output_hatch.json | 32 +++++++ .../block/machine/mv_ember_input_hatch.json | 32 +++++++ .../block/machine/mv_ember_output_hatch.json | 32 +++++++ .../machine/steam_fluid_input_hatch.json | 30 +++++- .../machine/steam_fluid_output_hatch.json | 30 +++++- .../block/reinforced_dawnstone_casing.json | 6 ++ .../cosmiccore/models/item/dawn_forge.json | 3 + .../cosmiccore/models/item/ember_tester.json | 3 - .../models/item/ev_ember_input_hatch.json | 3 + .../models/item/ev_ember_output_hatch.json | 3 + .../models/item/ev_wildfire_core.json | 6 ++ .../models/item/hv_ember_input_hatch.json | 3 + .../models/item/hv_ember_output_hatch.json | 3 + .../models/item/hv_wildfire_core.json | 6 ++ .../models/item/iv_wildfire_core.json | 6 ++ .../models/item/light_dawnstone_casing.json | 3 + .../models/item/luv_wildfire_core.json | 6 ++ .../models/item/lv_ember_input_hatch.json | 3 + .../models/item/lv_ember_output_hatch.json | 3 + .../models/item/lv_wildfire_core.json | 6 ++ .../models/item/mv_ember_input_hatch.json | 3 + .../models/item/mv_ember_output_hatch.json | 3 + .../models/item/mv_wildfire_core.json | 6 ++ .../item/reinforced_dawnstone_casing.json | 3 + .../models/item/zpm_wildfire_core.json | 6 ++ .../resources/assets/cosmiccore/sounds.json | 9 ++ .../blocks/light_dawnstone_casing.json | 21 ++++ .../blocks/reinforced_dawnstone_casing.json | 21 ++++ .../blocks/mineable/pickaxe_or_wrench.json | 2 + .../cosmiccore/api/CosmicGuiTextures.java | 4 + .../cosmiccore/common/data/CosmicBlocks.java | 9 ++ .../cosmiccore/common/data/CosmicItems.java | 44 +++++++++ .../common/data/CosmicMachines.java | 2 + .../cosmiccore/common/data/CosmicSounds.java | 1 + .../data/datagen/CosmicDataGenerators.java | 8 +- .../data/datagen/CosmicTinkersMaterials.java | 3 +- .../machine/multiblock/multi/DawnForge.java | 57 +++++++++++ .../multi/modular/MultiblockInit.java | 1 + .../gtbridge/CosmicRecipeTypes.java | 6 ++ .../assets/cosmiccore/sounds/dawnforge.ogg | Bin 0 -> 88385 bytes .../casings/solid/light_dawnstone_casing.png | Bin 0 -> 417 bytes .../solid/light_dawnstone_casing.png.mcmeta | 5 + .../solid/light_dawnstone_casing_ctm.png | Bin 0 -> 705 bytes .../solid/reinforced_dawnstone_casing.png | Bin 0 -> 327 bytes .../reinforced_dawnstone_casing.png.mcmeta | 5 + .../solid/reinforced_dawnstone_casing_ctm.png | Bin 0 -> 670 bytes .../multiblock/dawnforge/overlay_front.png | Bin 0 -> 248 bytes .../dawnforge/overlay_front_active.png | Bin 0 -> 292 bytes .../overlay_front_active_emissive.png | Bin 0 -> 241 bytes .../dawnforge/overlay_front_emissive.png | Bin 0 -> 149 bytes .../textures/gui/overlay/dawnforge_slot.png | Bin 0 -> 814 bytes .../gui/overlay/explosive_overlay.png | Bin 0 -> 460 bytes .../textures/item/ev_wildfire_core.png | Bin 0 -> 610 bytes .../textures/item/hv_wildfire_core.png | Bin 0 -> 576 bytes .../textures/item/iv_wildfire_core.png | Bin 0 -> 611 bytes .../textures/item/luv_wildfire_core.png | Bin 0 -> 603 bytes .../textures/item/lv_wildfire_core.png | Bin 0 -> 442 bytes .../textures/item/mv_wildfire_core.png | Bin 0 -> 591 bytes .../textures/item/zpm_wildfire_core.png | Bin 0 -> 642 bytes .../cosmiccore/ui/recipe_type/dawn_forge.rtui | Bin 0 -> 13478 bytes 81 files changed, 971 insertions(+), 121 deletions(-) rename src/generated/resources/assets/cosmiccore/blockstates/{ember_tester.json => dawn_forge.json} (58%) create mode 100644 src/generated/resources/assets/cosmiccore/blockstates/ev_ember_input_hatch.json create mode 100644 src/generated/resources/assets/cosmiccore/blockstates/ev_ember_output_hatch.json create mode 100644 src/generated/resources/assets/cosmiccore/blockstates/hv_ember_input_hatch.json create mode 100644 src/generated/resources/assets/cosmiccore/blockstates/hv_ember_output_hatch.json create mode 100644 src/generated/resources/assets/cosmiccore/blockstates/light_dawnstone_casing.json create mode 100644 src/generated/resources/assets/cosmiccore/blockstates/lv_ember_input_hatch.json create mode 100644 src/generated/resources/assets/cosmiccore/blockstates/lv_ember_output_hatch.json create mode 100644 src/generated/resources/assets/cosmiccore/blockstates/mv_ember_input_hatch.json create mode 100644 src/generated/resources/assets/cosmiccore/blockstates/mv_ember_output_hatch.json create mode 100644 src/generated/resources/assets/cosmiccore/blockstates/reinforced_dawnstone_casing.json create mode 100644 src/generated/resources/assets/cosmiccore/models/block/light_dawnstone_casing.json create mode 100644 src/generated/resources/assets/cosmiccore/models/block/machine/dawn_forge.json delete mode 100644 src/generated/resources/assets/cosmiccore/models/block/machine/ember_tester.json create mode 100644 src/generated/resources/assets/cosmiccore/models/block/machine/ev_ember_input_hatch.json create mode 100644 src/generated/resources/assets/cosmiccore/models/block/machine/ev_ember_output_hatch.json create mode 100644 src/generated/resources/assets/cosmiccore/models/block/machine/hv_ember_input_hatch.json create mode 100644 src/generated/resources/assets/cosmiccore/models/block/machine/hv_ember_output_hatch.json create mode 100644 src/generated/resources/assets/cosmiccore/models/block/machine/lv_ember_input_hatch.json create mode 100644 src/generated/resources/assets/cosmiccore/models/block/machine/lv_ember_output_hatch.json create mode 100644 src/generated/resources/assets/cosmiccore/models/block/machine/mv_ember_input_hatch.json create mode 100644 src/generated/resources/assets/cosmiccore/models/block/machine/mv_ember_output_hatch.json create mode 100644 src/generated/resources/assets/cosmiccore/models/block/reinforced_dawnstone_casing.json create mode 100644 src/generated/resources/assets/cosmiccore/models/item/dawn_forge.json delete mode 100644 src/generated/resources/assets/cosmiccore/models/item/ember_tester.json create mode 100644 src/generated/resources/assets/cosmiccore/models/item/ev_ember_input_hatch.json create mode 100644 src/generated/resources/assets/cosmiccore/models/item/ev_ember_output_hatch.json create mode 100644 src/generated/resources/assets/cosmiccore/models/item/ev_wildfire_core.json create mode 100644 src/generated/resources/assets/cosmiccore/models/item/hv_ember_input_hatch.json create mode 100644 src/generated/resources/assets/cosmiccore/models/item/hv_ember_output_hatch.json create mode 100644 src/generated/resources/assets/cosmiccore/models/item/hv_wildfire_core.json create mode 100644 src/generated/resources/assets/cosmiccore/models/item/iv_wildfire_core.json create mode 100644 src/generated/resources/assets/cosmiccore/models/item/light_dawnstone_casing.json create mode 100644 src/generated/resources/assets/cosmiccore/models/item/luv_wildfire_core.json create mode 100644 src/generated/resources/assets/cosmiccore/models/item/lv_ember_input_hatch.json create mode 100644 src/generated/resources/assets/cosmiccore/models/item/lv_ember_output_hatch.json create mode 100644 src/generated/resources/assets/cosmiccore/models/item/lv_wildfire_core.json create mode 100644 src/generated/resources/assets/cosmiccore/models/item/mv_ember_input_hatch.json create mode 100644 src/generated/resources/assets/cosmiccore/models/item/mv_ember_output_hatch.json create mode 100644 src/generated/resources/assets/cosmiccore/models/item/mv_wildfire_core.json create mode 100644 src/generated/resources/assets/cosmiccore/models/item/reinforced_dawnstone_casing.json create mode 100644 src/generated/resources/assets/cosmiccore/models/item/zpm_wildfire_core.json create mode 100644 src/generated/resources/data/cosmiccore/loot_tables/blocks/light_dawnstone_casing.json create mode 100644 src/generated/resources/data/cosmiccore/loot_tables/blocks/reinforced_dawnstone_casing.json create mode 100644 src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/DawnForge.java create mode 100644 src/main/resources/assets/cosmiccore/sounds/dawnforge.ogg create mode 100644 src/main/resources/assets/cosmiccore/textures/block/casings/solid/light_dawnstone_casing.png create mode 100644 src/main/resources/assets/cosmiccore/textures/block/casings/solid/light_dawnstone_casing.png.mcmeta create mode 100644 src/main/resources/assets/cosmiccore/textures/block/casings/solid/light_dawnstone_casing_ctm.png create mode 100644 src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_dawnstone_casing.png create mode 100644 src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_dawnstone_casing.png.mcmeta create mode 100644 src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_dawnstone_casing_ctm.png create mode 100644 src/main/resources/assets/cosmiccore/textures/block/multiblock/dawnforge/overlay_front.png create mode 100644 src/main/resources/assets/cosmiccore/textures/block/multiblock/dawnforge/overlay_front_active.png create mode 100644 src/main/resources/assets/cosmiccore/textures/block/multiblock/dawnforge/overlay_front_active_emissive.png create mode 100644 src/main/resources/assets/cosmiccore/textures/block/multiblock/dawnforge/overlay_front_emissive.png create mode 100644 src/main/resources/assets/cosmiccore/textures/gui/overlay/dawnforge_slot.png create mode 100644 src/main/resources/assets/cosmiccore/textures/gui/overlay/explosive_overlay.png create mode 100644 src/main/resources/assets/cosmiccore/textures/item/ev_wildfire_core.png create mode 100644 src/main/resources/assets/cosmiccore/textures/item/hv_wildfire_core.png create mode 100644 src/main/resources/assets/cosmiccore/textures/item/iv_wildfire_core.png create mode 100644 src/main/resources/assets/cosmiccore/textures/item/luv_wildfire_core.png create mode 100644 src/main/resources/assets/cosmiccore/textures/item/lv_wildfire_core.png create mode 100644 src/main/resources/assets/cosmiccore/textures/item/mv_wildfire_core.png create mode 100644 src/main/resources/assets/cosmiccore/textures/item/zpm_wildfire_core.png create mode 100644 src/main/resources/assets/cosmiccore/ui/recipe_type/dawn_forge.rtui diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ember_tester.json b/src/generated/resources/assets/cosmiccore/blockstates/dawn_forge.json similarity index 58% rename from src/generated/resources/assets/cosmiccore/blockstates/ember_tester.json rename to src/generated/resources/assets/cosmiccore/blockstates/dawn_forge.json index 1cd46d933..b3bad3e78 100644 --- a/src/generated/resources/assets/cosmiccore/blockstates/ember_tester.json +++ b/src/generated/resources/assets/cosmiccore/blockstates/dawn_forge.json @@ -2,74 +2,74 @@ "variants": { "facing=east,upwards_facing=east": { "gtceu:z": 270, - "model": "cosmiccore:block/machine/ember_tester", + "model": "cosmiccore:block/machine/dawn_forge", "y": 90 }, "facing=east,upwards_facing=north": { - "model": "cosmiccore:block/machine/ember_tester", + "model": "cosmiccore:block/machine/dawn_forge", "y": 90 }, "facing=east,upwards_facing=south": { "gtceu:z": 180, - "model": "cosmiccore:block/machine/ember_tester", + "model": "cosmiccore:block/machine/dawn_forge", "y": 90 }, "facing=east,upwards_facing=west": { "gtceu:z": 90, - "model": "cosmiccore:block/machine/ember_tester", + "model": "cosmiccore:block/machine/dawn_forge", "y": 90 }, "facing=north,upwards_facing=east": { "gtceu:z": 270, - "model": "cosmiccore:block/machine/ember_tester" + "model": "cosmiccore:block/machine/dawn_forge" }, "facing=north,upwards_facing=north": { - "model": "cosmiccore:block/machine/ember_tester" + "model": "cosmiccore:block/machine/dawn_forge" }, "facing=north,upwards_facing=south": { "gtceu:z": 180, - "model": "cosmiccore:block/machine/ember_tester" + "model": "cosmiccore:block/machine/dawn_forge" }, "facing=north,upwards_facing=west": { "gtceu:z": 90, - "model": "cosmiccore:block/machine/ember_tester" + "model": "cosmiccore:block/machine/dawn_forge" }, "facing=south,upwards_facing=east": { "gtceu:z": 270, - "model": "cosmiccore:block/machine/ember_tester", + "model": "cosmiccore:block/machine/dawn_forge", "y": 180 }, "facing=south,upwards_facing=north": { - "model": "cosmiccore:block/machine/ember_tester", + "model": "cosmiccore:block/machine/dawn_forge", "y": 180 }, "facing=south,upwards_facing=south": { "gtceu:z": 180, - "model": "cosmiccore:block/machine/ember_tester", + "model": "cosmiccore:block/machine/dawn_forge", "y": 180 }, "facing=south,upwards_facing=west": { "gtceu:z": 90, - "model": "cosmiccore:block/machine/ember_tester", + "model": "cosmiccore:block/machine/dawn_forge", "y": 180 }, "facing=west,upwards_facing=east": { "gtceu:z": 270, - "model": "cosmiccore:block/machine/ember_tester", + "model": "cosmiccore:block/machine/dawn_forge", "y": 270 }, "facing=west,upwards_facing=north": { - "model": "cosmiccore:block/machine/ember_tester", + "model": "cosmiccore:block/machine/dawn_forge", "y": 270 }, "facing=west,upwards_facing=south": { "gtceu:z": 180, - "model": "cosmiccore:block/machine/ember_tester", + "model": "cosmiccore:block/machine/dawn_forge", "y": 270 }, "facing=west,upwards_facing=west": { "gtceu:z": 90, - "model": "cosmiccore:block/machine/ember_tester", + "model": "cosmiccore:block/machine/dawn_forge", "y": 270 } } diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ev_ember_input_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/ev_ember_input_hatch.json new file mode 100644 index 000000000..0229d55f2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/ev_ember_input_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/ev_ember_input_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/ev_ember_input_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/ev_ember_input_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/ev_ember_input_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/ev_ember_input_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/ev_ember_input_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ev_ember_output_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/ev_ember_output_hatch.json new file mode 100644 index 000000000..88360b27b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/ev_ember_output_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/ev_ember_output_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/ev_ember_output_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/ev_ember_output_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/ev_ember_output_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/ev_ember_output_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/ev_ember_output_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/hv_ember_input_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/hv_ember_input_hatch.json new file mode 100644 index 000000000..c01b72ab6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/hv_ember_input_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/hv_ember_input_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/hv_ember_input_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/hv_ember_input_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/hv_ember_input_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/hv_ember_input_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/hv_ember_input_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/hv_ember_output_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/hv_ember_output_hatch.json new file mode 100644 index 000000000..76660b22a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/hv_ember_output_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/hv_ember_output_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/hv_ember_output_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/hv_ember_output_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/hv_ember_output_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/hv_ember_output_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/hv_ember_output_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/light_dawnstone_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/light_dawnstone_casing.json new file mode 100644 index 000000000..d70ef361c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/light_dawnstone_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/light_dawnstone_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/lv_ember_input_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/lv_ember_input_hatch.json new file mode 100644 index 000000000..ed94438d1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/lv_ember_input_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/lv_ember_input_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/lv_ember_input_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/lv_ember_input_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/lv_ember_input_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/lv_ember_input_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/lv_ember_input_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/lv_ember_output_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/lv_ember_output_hatch.json new file mode 100644 index 000000000..e8fec1901 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/lv_ember_output_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/lv_ember_output_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/lv_ember_output_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/lv_ember_output_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/lv_ember_output_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/lv_ember_output_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/lv_ember_output_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/mv_ember_input_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/mv_ember_input_hatch.json new file mode 100644 index 000000000..fadc477a7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/mv_ember_input_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/mv_ember_input_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/mv_ember_input_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/mv_ember_input_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/mv_ember_input_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/mv_ember_input_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/mv_ember_input_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/mv_ember_output_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/mv_ember_output_hatch.json new file mode 100644 index 000000000..472fb34a0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/mv_ember_output_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/mv_ember_output_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/mv_ember_output_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/mv_ember_output_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/mv_ember_output_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/mv_ember_output_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/mv_ember_output_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/reinforced_dawnstone_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/reinforced_dawnstone_casing.json new file mode 100644 index 000000000..108ececb7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/reinforced_dawnstone_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/reinforced_dawnstone_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/lang/en_ud.json b/src/generated/resources/assets/cosmiccore/lang/en_ud.json index 8e1ab420b..11446dd34 100644 --- a/src/generated/resources/assets/cosmiccore/lang/en_ud.json +++ b/src/generated/resources/assets/cosmiccore/lang/en_ud.json @@ -20,13 +20,15 @@ "block.cosmiccore.cyclozine_chemically_repelling_casing": "buısɐƆ buıןןǝdǝᴚ ʎןןɐɔıɯǝɥƆ ǝuızoןɔʎƆ", "block.cosmiccore.cyclozine_chemically_repelling_pipe": "ǝdıԀ buıןןǝdǝᴚ ʎןןɐɔıɯǝɥƆ ǝuızoןɔʎƆ", "block.cosmiccore.cyclozine_high_rigidity_casing": "buısɐƆ ʎʇıpıbıᴚ ɥbıH ǝuızoןɔʎƆ", + "block.cosmiccore.dawn_forge": "ǝbɹoℲ uʍɐᗡ", "block.cosmiccore.dimensional_energy_capacitor": "uoıʇɐʇsqnS ɹǝʍoԀ", "block.cosmiccore.dimensional_energy_interface": "ǝɔɐɟɹǝʇuI ןɐuoısuǝɯıᗡ uoıʇɐʇsqnS ɹǝʍoԀ", "block.cosmiccore.drone_maintenance_interface": "ǝɔɐɟɹǝʇuI ǝɔuɐuǝʇuıɐW ǝuoɹᗡ", "block.cosmiccore.drone_station": "uoıʇɐʇS ǝuoɹᗡ", "block.cosmiccore.drygmy_grove": "ǝʌoɹ⅁ ʎɯbʎɹᗡ", "block.cosmiccore.dyson_solar_cell": "ןןǝƆ ɹɐןoS uosʎᗡ", - "block.cosmiccore.ember_tester": "ɹǝʇsǝ⟘ ɹǝqɯƎ", + "block.cosmiccore.ev_ember_input_hatch": "ɥɔʇɐH ʇnduI ɹǝqɯƎ ΛƎϛ§", + "block.cosmiccore.ev_ember_output_hatch": "ɥɔʇɐH ʇndʇnO ɹǝqɯƎ ΛƎϛ§", "block.cosmiccore.ev_wireless_charger": "ɹǝbɹɐɥƆ ssǝןǝɹıM ΛƎ", "block.cosmiccore.extreme_combustion_engine_cc": "ɔƆ ǝuıbuƎ uoıʇsnqɯoƆ ǝɯǝɹʇxƎ", "block.cosmiccore.fulgorinth_prime_casing": "buısɐƆ ǝɯıɹԀ ɥʇuıɹobןnℲ", @@ -48,6 +50,8 @@ "block.cosmiccore.hp_steam_wiremill": "ןןıɯǝɹıM ɯɐǝʇS ǝɹnssǝɹԀ ɥbıH", "block.cosmiccore.hpca_indicator": "ɹoʇɐɔıpuI ⱯƆԀH", "block.cosmiccore.huge_sterilization_hatch": "ɥɔʇɐH uoıʇɐzןıɹǝʇS", + "block.cosmiccore.hv_ember_input_hatch": "ɥɔʇɐH ʇnduI ɹǝqɯƎ ΛH9§", + "block.cosmiccore.hv_ember_output_hatch": "ɥɔʇɐH ʇndʇnO ɹǝqɯƎ ΛH9§", "block.cosmiccore.hv_wireless_charger": "ɹǝbɹɐɥƆ ssǝןǝɹıM ΛH", "block.cosmiccore.industrial_chemical_vat": "ʇɐΛ ןɐɔıɯǝɥƆ ןɐıɹʇsnpuI", "block.cosmiccore.industrial_primitive_blast_furnace": "ǝɔɐuɹnℲ ʇsɐןᗺ ǝʌıʇıɯıɹԀ ןɐıɹʇsnpuI", @@ -68,6 +72,7 @@ "block.cosmiccore.large_combustion_engine_cc": "ɔƆ ǝuıbuƎ uoıʇsnqɯoƆ ǝbɹɐꞀ", "block.cosmiccore.large_laminator": "ɹoʇɐuıɯɐꞀ ǝbɹɐꞀƖ§", "block.cosmiccore.large_spooling_machine": "ǝuıɥɔɐW buıןoodS ǝbɹɐꞀ", + "block.cosmiccore.light_dawnstone_casing": "buısɐƆ ǝuoʇsuʍɐᗡ ʇɥbıꞀ", "block.cosmiccore.living_igniclad_coil_block": "ʞɔoןᗺ ןıoƆ pɐןɔıubI buıʌıꞀ", "block.cosmiccore.lp_steam_bender": "⟘SIXƎ ⟘ON Oᗡ I", "block.cosmiccore.lp_steam_wiremill": "⟘SIXƎ ⟘ON Oᗡ I", @@ -88,10 +93,14 @@ "block.cosmiccore.luv_wireless_charger": "ɹǝbɹɐɥƆ ssǝןǝɹıM ΛnꞀ", "block.cosmiccore.luv_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM ΛnꞀp§", "block.cosmiccore.luv_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM ΛnꞀp§", + "block.cosmiccore.lv_ember_input_hatch": "ɥɔʇɐH ʇnduI ɹǝqɯƎ ΛꞀㄥ§", + "block.cosmiccore.lv_ember_output_hatch": "ɥɔʇɐH ʇndʇnO ɹǝqɯƎ ΛꞀㄥ§", "block.cosmiccore.machine_casing_gearbox_naquadria": "ɐıɹpɐnbɐN xoqɹɐǝ⅁ buısɐƆ ǝuıɥɔɐW", "block.cosmiccore.machine_casing_gearbox_pthanterum": "ɯnɹǝʇuɐɥʇԀ xoqɹɐǝ⅁ buısɐƆ ǝuıɥɔɐW", "block.cosmiccore.mantle_bore": "ǝɹoᗺ ǝןʇuɐW", "block.cosmiccore.multi_purpose_interstellar_grade_casing": "buısɐƆ ǝpɐɹ⅁ ɹɐןןǝʇsɹǝʇuI ǝsodɹnԀ ıʇןnW", + "block.cosmiccore.mv_ember_input_hatch": "ɥɔʇɐH ʇnduI ɹǝqɯƎ ΛWq§", + "block.cosmiccore.mv_ember_output_hatch": "ɥɔʇɐH ʇndʇnO ɹǝqɯƎ ΛWq§", "block.cosmiccore.naquadah_pressure_resistant_casing": "buısɐƆ ʇuɐʇsısǝᴚ ǝɹnssǝɹԀ ɥɐpɐnbɐN", "block.cosmiccore.naquadric_superalloy_coil_block": "ʞɔoןᗺ ןıoƆ ʎoןןɐɹǝdnS ɔıɹpɐnbɐN", "block.cosmiccore.naquahine_pressure_reactor": "ɹoʇɔɐǝᴚ ǝɹnssǝɹԀ ǝuıɥɐnbɐN", @@ -122,6 +131,7 @@ "block.cosmiccore.pthanterum_wave_breakers": "sɹǝʞɐǝɹᗺ ǝʌɐM ɯnɹǝʇuɐɥʇԀ", "block.cosmiccore.radioactive_filter_casing": "buısɐƆ ɹǝʇןıℲ ǝʌıʇɔɐoıpɐᴚ", "block.cosmiccore.reflective_starmetal_casing": "buısɐƆ ןɐʇǝɯɹɐʇS ǝʌıʇɔǝןɟǝᴚ", + "block.cosmiccore.reinforced_dawnstone_casing": "buısɐƆ ǝuoʇsuʍɐᗡ pǝɔɹoɟuıǝᴚ", "block.cosmiccore.reinforced_naquadria_casing": "buısɐƆ ɐıɹpɐnbɐN pǝɔɹoɟuıǝᴚ", "block.cosmiccore.reinforced_trinavine_coil_block": "ʞɔoןᗺ ןıoƆ ǝuıʌɐuıɹ⟘ pǝɔɹoɟuıǝᴚ", "block.cosmiccore.resonant_virtue_meld_coil_block": "ʞɔoןᗺ ןıoƆ pןǝW ǝnʇɹıΛ ʇuɐuosǝᴚ", @@ -535,6 +545,7 @@ "item.cosmiccore.ethera": "]ɐɹǝɥʇƎ[ - ןıxǝΛ", "item.cosmiccore.etheric_spirit": "ʇıɹıdS ɔıɹǝɥʇƎ", "item.cosmiccore.ev_radio_module": "ǝןnpoW oıpɐᴚ ΛƎ", + "item.cosmiccore.ev_wildfire_core": "ǝɹoƆ ǝɹıɟpןıM ΛƎ", "item.cosmiccore.fermium_rad_charges": "ǝbɹɐɥƆ uoıʇɐıpɐᴚ ɯnıɯɹǝℲ", "item.cosmiccore.fireclay_ball": "ןןɐᗺ ʎɐןɔǝɹıℲ", "item.cosmiccore.flawed_resonant_wafer": "ɹǝɟɐM ɔıuoɯɹɐH pǝʍɐןℲ", @@ -551,15 +562,20 @@ "item.cosmiccore.harmonically_tuned_printed_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ pǝʇuıɹԀ pǝun⟘ ʎןןɐɔıuoɯɹɐH", "item.cosmiccore.heme_ring": "buıᴚ ǝɯǝH", "item.cosmiccore.hv_radio_module": "ǝןnpoW oıpɐᴚ ΛH", + "item.cosmiccore.hv_wildfire_core": "ǝɹoƆ ǝɹıɟpןıM ΛH", "item.cosmiccore.industrial_drone": "ǝuoɹᗡ ןɐıɹʇsnpuI", "item.cosmiccore.inert_fungal_spores": "sǝɹodS ןɐbunℲ ʇɹǝuI", "item.cosmiccore.infinite_spray_can": "uɐƆ ʎɐɹdS ǝʇıuıɟuIן§", "item.cosmiccore.iv_radio_module": "ǝןnpoW oıpɐᴚ ΛI", + "item.cosmiccore.iv_wildfire_core": "ǝɹoƆ ǝɹıɟpןıM ΛI", "item.cosmiccore.large_shard_of_perpetuity": "ʎʇınʇǝdɹǝԀ ɟo pɹɐɥS ǝbɹɐꞀ", "item.cosmiccore.linked_terminal": "ןɐuıɯɹǝ⟘ pǝʞuıꞀ", "item.cosmiccore.luv_radio_module": "ǝןnpoW oıpɐᴚ ΛnꞀ", + "item.cosmiccore.luv_wildfire_core": "ǝɹoƆ ǝɹıɟpןıM ΛnꞀ", + "item.cosmiccore.lv_wildfire_core": "ǝɹoƆ ǝɹıɟpןıM ΛꞀ", "item.cosmiccore.malice_spirit": "ʇıɹıdS ǝɔıןɐW", "item.cosmiccore.masked_crystal_chiplet_package": "ǝbɐʞɔɐԀ ʇǝןdıɥƆ ןɐʇsʎɹƆ pǝʞsɐW", + "item.cosmiccore.mv_wildfire_core": "ǝɹoƆ ǝɹıɟpןıM ΛW", "item.cosmiccore.mystrix": "]xıɹʇsʎW[ - uouıɯnꞀ", "item.cosmiccore.nano_scythe": "ǝɥʇʎɔS ouɐN", "item.cosmiccore.neuro_processing_assembly": "pɹɐoᗺ ʎןqɯǝssⱯ buıssǝɔoɹdoɹnǝN", @@ -707,6 +723,7 @@ "item.cosmiccore.wrench_head_cast": "ʇsɐƆ pɐǝH ɥɔuǝɹM", "item.cosmiccore.wrench_head_sand_cast": "ʇsɐƆ puɐS pɐǝH ɥɔuǝɹM", "item.cosmiccore.zpm_radio_module": "ǝןnpoW oıpɐᴚ WԀZ", + "item.cosmiccore.zpm_wildfire_core": "ǝɹoƆ ǝɹıɟpןıM WԀZ", "item.gtceu.tool.luv_meld_tool": "ןooʇıʇןnW pןǝW %s", "itemGroup.cosmiccore.creative_tab_tinker_tools": "ʇɐdɯoƆ sɹǝʞuı⟘ ǝɹoƆ ɔıɯsoƆ", "material.cosmiccore.causal_fabric": "ɔıɹqɐℲ ןɐsnɐƆ", diff --git a/src/generated/resources/assets/cosmiccore/lang/en_us.json b/src/generated/resources/assets/cosmiccore/lang/en_us.json index 12a0bfccd..4037aa373 100644 --- a/src/generated/resources/assets/cosmiccore/lang/en_us.json +++ b/src/generated/resources/assets/cosmiccore/lang/en_us.json @@ -20,13 +20,15 @@ "block.cosmiccore.cyclozine_chemically_repelling_casing": "Cyclozine Chemically Repelling Casing", "block.cosmiccore.cyclozine_chemically_repelling_pipe": "Cyclozine Chemically Repelling Pipe", "block.cosmiccore.cyclozine_high_rigidity_casing": "Cyclozine High Rigidity Casing", + "block.cosmiccore.dawn_forge": "Dawn Forge", "block.cosmiccore.dimensional_energy_capacitor": "Power Substation", "block.cosmiccore.dimensional_energy_interface": "Power Substation Dimensional Interface", "block.cosmiccore.drone_maintenance_interface": "Drone Maintenance Interface", "block.cosmiccore.drone_station": "Drone Station", "block.cosmiccore.drygmy_grove": "Drygmy Grove", "block.cosmiccore.dyson_solar_cell": "Dyson Solar Cell", - "block.cosmiccore.ember_tester": "Ember Tester", + "block.cosmiccore.ev_ember_input_hatch": "§5EV Ember Input Hatch", + "block.cosmiccore.ev_ember_output_hatch": "§5EV Ember Output Hatch", "block.cosmiccore.ev_wireless_charger": "EV Wireless Charger", "block.cosmiccore.extreme_combustion_engine_cc": "Extreme Combustion Engine Cc", "block.cosmiccore.fulgorinth_prime_casing": "Fulgorinth Prime Casing", @@ -48,6 +50,8 @@ "block.cosmiccore.hp_steam_wiremill": "High Pressure Steam Wiremill", "block.cosmiccore.hpca_indicator": "HPCA Indicator", "block.cosmiccore.huge_sterilization_hatch": "Sterilzation Hatch", + "block.cosmiccore.hv_ember_input_hatch": "§6HV Ember Input Hatch", + "block.cosmiccore.hv_ember_output_hatch": "§6HV Ember Output Hatch", "block.cosmiccore.hv_wireless_charger": "HV Wireless Charger", "block.cosmiccore.industrial_chemical_vat": "Industrial Chemical Vat", "block.cosmiccore.industrial_primitive_blast_furnace": "Industrial Primitive Blast Furnace", @@ -68,6 +72,7 @@ "block.cosmiccore.large_combustion_engine_cc": "Large Combustion Engine Cc", "block.cosmiccore.large_laminator": "§1Large Laminator", "block.cosmiccore.large_spooling_machine": "Large Spooling Machine", + "block.cosmiccore.light_dawnstone_casing": "Light Dawnstone Casing", "block.cosmiccore.living_igniclad_coil_block": "Living Igniclad Coil Block", "block.cosmiccore.lp_steam_bender": "I DO NOT EXIST", "block.cosmiccore.lp_steam_wiremill": "I DO NOT EXIST", @@ -88,10 +93,14 @@ "block.cosmiccore.luv_wireless_charger": "LuV Wireless Charger", "block.cosmiccore.luv_wireless_energy_dynamo": "§dLuV Wireless Energy Dynamo", "block.cosmiccore.luv_wireless_energy_hatch": "§dLuV Wireless Energy Hatch", + "block.cosmiccore.lv_ember_input_hatch": "§7LV Ember Input Hatch", + "block.cosmiccore.lv_ember_output_hatch": "§7LV Ember Output Hatch", "block.cosmiccore.machine_casing_gearbox_naquadria": "Machine Casing Gearbox Naquadria", "block.cosmiccore.machine_casing_gearbox_pthanterum": "Machine Casing Gearbox Pthanterum", "block.cosmiccore.mantle_bore": "Mantle Bore", "block.cosmiccore.multi_purpose_interstellar_grade_casing": "Multi Purpose Interstellar Grade Casing", + "block.cosmiccore.mv_ember_input_hatch": "§bMV Ember Input Hatch", + "block.cosmiccore.mv_ember_output_hatch": "§bMV Ember Output Hatch", "block.cosmiccore.naquadah_pressure_resistant_casing": "Naquadah Pressure Resistant Casing", "block.cosmiccore.naquadric_superalloy_coil_block": "Naquadric Superalloy Coil Block", "block.cosmiccore.naquahine_pressure_reactor": "Naquahine Pressure Reactor", @@ -122,6 +131,7 @@ "block.cosmiccore.pthanterum_wave_breakers": "Pthanterum Wave Breakers", "block.cosmiccore.radioactive_filter_casing": "Radioactive Filter Casing", "block.cosmiccore.reflective_starmetal_casing": "Reflective Starmetal Casing", + "block.cosmiccore.reinforced_dawnstone_casing": "Reinforced Dawnstone Casing", "block.cosmiccore.reinforced_naquadria_casing": "Reinforced Naquadria Casing", "block.cosmiccore.reinforced_trinavine_coil_block": "Reinforced Trinavine Coil Block", "block.cosmiccore.resonant_virtue_meld_coil_block": "Resonant Virtue Meld Coil Block", @@ -535,6 +545,7 @@ "item.cosmiccore.ethera": "Vexil - [Ethera]", "item.cosmiccore.etheric_spirit": "Etheric Spirit", "item.cosmiccore.ev_radio_module": "EV Radio Module", + "item.cosmiccore.ev_wildfire_core": "EV Wildfire Core", "item.cosmiccore.fermium_rad_charges": "Fermium Radiation Charge", "item.cosmiccore.fireclay_ball": "Fireclay Ball", "item.cosmiccore.flawed_resonant_wafer": "Flawed Harmonic Wafer", @@ -551,15 +562,20 @@ "item.cosmiccore.harmonically_tuned_printed_circuit_board": "Harmonically Tuned Printed Circuit Board", "item.cosmiccore.heme_ring": "Heme Ring", "item.cosmiccore.hv_radio_module": "HV Radio Module", + "item.cosmiccore.hv_wildfire_core": "HV Wildfire Core", "item.cosmiccore.industrial_drone": "Industrial Drone", "item.cosmiccore.inert_fungal_spores": "Inert Fungal Spores", "item.cosmiccore.infinite_spray_can": "§lInfinite Spray Can", "item.cosmiccore.iv_radio_module": "IV Radio Module", + "item.cosmiccore.iv_wildfire_core": "IV Wildfire Core", "item.cosmiccore.large_shard_of_perpetuity": "Large Shard of Perpetuity", "item.cosmiccore.linked_terminal": "Linked Terminal", "item.cosmiccore.luv_radio_module": "LuV Radio Module", + "item.cosmiccore.luv_wildfire_core": "LuV Wildfire Core", + "item.cosmiccore.lv_wildfire_core": "LV Wildfire Core", "item.cosmiccore.malice_spirit": "Malice Spirit", "item.cosmiccore.masked_crystal_chiplet_package": "Masked Crystal Chiplet Package", + "item.cosmiccore.mv_wildfire_core": "MV Wildfire Core", "item.cosmiccore.mystrix": "Luminon - [Mystrix]", "item.cosmiccore.nano_scythe": "Nano Scythe", "item.cosmiccore.neuro_processing_assembly": "Neuroprocessing Assembly Board", @@ -707,6 +723,7 @@ "item.cosmiccore.wrench_head_cast": "Wrench Head Cast", "item.cosmiccore.wrench_head_sand_cast": "Wrench Head Sand Cast", "item.cosmiccore.zpm_radio_module": "ZPM Radio Module", + "item.cosmiccore.zpm_wildfire_core": "ZPM Wildfire Core", "item.gtceu.tool.luv_meld_tool": "%s Meld Multitool", "itemGroup.cosmiccore.creative_tab_tinker_tools": "Cosmic Core Tinkers Compat", "material.cosmiccore.causal_fabric": "Causal Fabric", diff --git a/src/generated/resources/assets/cosmiccore/models/block/light_dawnstone_casing.json b/src/generated/resources/assets/cosmiccore/models/block/light_dawnstone_casing.json new file mode 100644 index 000000000..07fcf4f97 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/light_dawnstone_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/dawn_forge.json b/src/generated/resources/assets/cosmiccore/models/block/machine/dawn_forge.json new file mode 100644 index 000000000..ce57a93ee --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/dawn_forge.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:dawn_forge", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/ember_tester.json b/src/generated/resources/assets/cosmiccore/models/block/machine/ember_tester.json deleted file mode 100644 index 580dd1880..000000000 --- a/src/generated/resources/assets/cosmiccore/models/block/machine/ember_tester.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "parent": "minecraft:block/block", - "loader": "gtceu:machine", - "machine": "cosmiccore:ember_tester", - "texture_overrides": { - "all": "gtceu:block/casings/solid/machine_casing_inert_ptfe" - }, - "variants": { - "is_formed=false,recipe_logic_status=idle": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "gtceu:block/casings/solid/machine_casing_inert_ptfe", - "overlay_front": "gtceu:block/multiblock/coke_oven/overlay_front", - "overlay_front_emissive": "gtceu:block/multiblock/coke_oven/overlay_front_emissive" - } - } - }, - "is_formed=false,recipe_logic_status=suspend": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "gtceu:block/casings/solid/machine_casing_inert_ptfe", - "overlay_front": "gtceu:block/multiblock/coke_oven/overlay_front", - "overlay_front_emissive": "gtceu:block/multiblock/coke_oven/overlay_front_emissive" - } - } - }, - "is_formed=false,recipe_logic_status=waiting": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "gtceu:block/casings/solid/machine_casing_inert_ptfe", - "overlay_front": "gtceu:block/multiblock/coke_oven/overlay_front_active", - "overlay_front_emissive": "gtceu:block/multiblock/coke_oven/overlay_front_active_emissive" - } - } - }, - "is_formed=false,recipe_logic_status=working": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "gtceu:block/casings/solid/machine_casing_inert_ptfe", - "overlay_front": "gtceu:block/multiblock/coke_oven/overlay_front_active", - "overlay_front_emissive": "gtceu:block/multiblock/coke_oven/overlay_front_active_emissive" - } - } - }, - "is_formed=true,recipe_logic_status=idle": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "gtceu:block/casings/solid/machine_casing_inert_ptfe", - "overlay_front": "gtceu:block/multiblock/coke_oven/overlay_front", - "overlay_front_emissive": "gtceu:block/multiblock/coke_oven/overlay_front_emissive" - } - } - }, - "is_formed=true,recipe_logic_status=suspend": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "gtceu:block/casings/solid/machine_casing_inert_ptfe", - "overlay_front": "gtceu:block/multiblock/coke_oven/overlay_front", - "overlay_front_emissive": "gtceu:block/multiblock/coke_oven/overlay_front_emissive" - } - } - }, - "is_formed=true,recipe_logic_status=waiting": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "gtceu:block/casings/solid/machine_casing_inert_ptfe", - "overlay_front": "gtceu:block/multiblock/coke_oven/overlay_front_active", - "overlay_front_emissive": "gtceu:block/multiblock/coke_oven/overlay_front_active_emissive" - } - } - }, - "is_formed=true,recipe_logic_status=working": { - "model": { - "parent": "gtceu:block/machine/template/cube_all/sided", - "textures": { - "all": "gtceu:block/casings/solid/machine_casing_inert_ptfe", - "overlay_front": "gtceu:block/multiblock/coke_oven/overlay_front_active", - "overlay_front_emissive": "gtceu:block/multiblock/coke_oven/overlay_front_active_emissive" - } - } - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/ev_ember_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/ev_ember_input_hatch.json new file mode 100644 index 000000000..4f9cbacaf --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/ev_ember_input_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:ev_ember_input_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/ember_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/ev/bottom", + "side": "gtceu:block/casings/voltage/ev/side", + "top": "gtceu:block/casings/voltage/ev/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/ember_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/ev/bottom", + "side": "gtceu:block/casings/voltage/ev/side", + "top": "gtceu:block/casings/voltage/ev/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/ev_ember_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/ev_ember_output_hatch.json new file mode 100644 index 000000000..ef72baad8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/ev_ember_output_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:ev_ember_output_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/ember_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/ev/bottom", + "side": "gtceu:block/casings/voltage/ev/side", + "top": "gtceu:block/casings/voltage/ev/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/ember_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/ev/bottom", + "side": "gtceu:block/casings/voltage/ev/side", + "top": "gtceu:block/casings/voltage/ev/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/hv_ember_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_ember_input_hatch.json new file mode 100644 index 000000000..da6e67d96 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_ember_input_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:hv_ember_input_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/ember_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/hv/bottom", + "side": "gtceu:block/casings/voltage/hv/side", + "top": "gtceu:block/casings/voltage/hv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/ember_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/hv/bottom", + "side": "gtceu:block/casings/voltage/hv/side", + "top": "gtceu:block/casings/voltage/hv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/hv_ember_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_ember_output_hatch.json new file mode 100644 index 000000000..074d3b7aa --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_ember_output_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:hv_ember_output_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/ember_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/hv/bottom", + "side": "gtceu:block/casings/voltage/hv/side", + "top": "gtceu:block/casings/voltage/hv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/ember_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/hv/bottom", + "side": "gtceu:block/casings/voltage/hv/side", + "top": "gtceu:block/casings/voltage/hv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/lv_ember_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_ember_input_hatch.json new file mode 100644 index 000000000..3c9f43354 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_ember_input_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:lv_ember_input_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/ember_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/lv/bottom", + "side": "gtceu:block/casings/voltage/lv/side", + "top": "gtceu:block/casings/voltage/lv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/ember_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/lv/bottom", + "side": "gtceu:block/casings/voltage/lv/side", + "top": "gtceu:block/casings/voltage/lv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/lv_ember_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_ember_output_hatch.json new file mode 100644 index 000000000..2b6d0edb0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_ember_output_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:lv_ember_output_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/ember_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/lv/bottom", + "side": "gtceu:block/casings/voltage/lv/side", + "top": "gtceu:block/casings/voltage/lv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/ember_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/lv/bottom", + "side": "gtceu:block/casings/voltage/lv/side", + "top": "gtceu:block/casings/voltage/lv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/mv_ember_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_ember_input_hatch.json new file mode 100644 index 000000000..0d4ba2454 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_ember_input_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:mv_ember_input_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/ember_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/mv/bottom", + "side": "gtceu:block/casings/voltage/mv/side", + "top": "gtceu:block/casings/voltage/mv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/ember_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/mv/bottom", + "side": "gtceu:block/casings/voltage/mv/side", + "top": "gtceu:block/casings/voltage/mv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/mv_ember_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_ember_output_hatch.json new file mode 100644 index 000000000..6f009e1c1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_ember_output_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:mv_ember_output_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/ember_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/mv/bottom", + "side": "gtceu:block/casings/voltage/mv/side", + "top": "gtceu:block/casings/voltage/mv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/ember_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/mv/bottom", + "side": "gtceu:block/casings/voltage/mv/side", + "top": "gtceu:block/casings/voltage/mv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/steam_fluid_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/steam_fluid_input_hatch.json index be353f06b..f4d832cc9 100644 --- a/src/generated/resources/assets/cosmiccore/models/block/machine/steam_fluid_input_hatch.json +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/steam_fluid_input_hatch.json @@ -8,7 +8,7 @@ "side" ], "variants": { - "is_painted=false": { + "is_formed=false,is_painted=false": { "model": { "parent": "gtceu:block/machine/template/part/hatch_machine_emissive", "textures": { @@ -21,7 +21,33 @@ } } }, - "is_painted=true": { + "is_formed=false,is_painted=true": { + "model": { + "parent": "gtceu:block/machine/template/part/hatch_machine_emissive_color_ring", + "textures": { + "bottom": "gtceu:block/casings/steam/bronze/bottom", + "overlay": "gtceu:block/overlay/machine/overlay_pipe", + "overlay_emissive": "gtceu:block/overlay/machine/overlay_fluid_hatch", + "overlay_pipe": "gtceu:block/overlay/machine/overlay_fluid_hatch", + "side": "gtceu:block/casings/steam/bronze/side", + "top": "gtceu:block/casings/steam/bronze/top" + } + } + }, + "is_formed=true,is_painted=false": { + "model": { + "parent": "gtceu:block/machine/template/part/hatch_machine_emissive", + "textures": { + "bottom": "gtceu:block/casings/steam/bronze/bottom", + "overlay": "gtceu:block/overlay/machine/overlay_pipe", + "overlay_emissive": "gtceu:block/overlay/machine/overlay_fluid_hatch", + "overlay_pipe": "gtceu:block/overlay/machine/overlay_fluid_hatch", + "side": "gtceu:block/casings/steam/bronze/side", + "top": "gtceu:block/casings/steam/bronze/top" + } + } + }, + "is_formed=true,is_painted=true": { "model": { "parent": "gtceu:block/machine/template/part/hatch_machine_emissive_color_ring", "textures": { diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/steam_fluid_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/steam_fluid_output_hatch.json index 50743b592..22f20c335 100644 --- a/src/generated/resources/assets/cosmiccore/models/block/machine/steam_fluid_output_hatch.json +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/steam_fluid_output_hatch.json @@ -8,7 +8,7 @@ "side" ], "variants": { - "is_painted=false": { + "is_formed=false,is_painted=false": { "model": { "parent": "gtceu:block/machine/template/part/hatch_machine_emissive", "textures": { @@ -21,7 +21,33 @@ } } }, - "is_painted=true": { + "is_formed=false,is_painted=true": { + "model": { + "parent": "gtceu:block/machine/template/part/hatch_machine_emissive_color_ring", + "textures": { + "bottom": "gtceu:block/casings/steam/bronze/bottom", + "overlay": "gtceu:block/overlay/machine/overlay_pipe", + "overlay_emissive": "gtceu:block/overlay/machine/overlay_fluid_hatch", + "overlay_pipe": "gtceu:block/overlay/machine/overlay_fluid_hatch", + "side": "gtceu:block/casings/steam/bronze/side", + "top": "gtceu:block/casings/steam/bronze/top" + } + } + }, + "is_formed=true,is_painted=false": { + "model": { + "parent": "gtceu:block/machine/template/part/hatch_machine_emissive", + "textures": { + "bottom": "gtceu:block/casings/steam/bronze/bottom", + "overlay": "gtceu:block/overlay/machine/overlay_pipe", + "overlay_emissive": "gtceu:block/overlay/machine/overlay_fluid_hatch", + "overlay_pipe": "gtceu:block/overlay/machine/overlay_fluid_hatch", + "side": "gtceu:block/casings/steam/bronze/side", + "top": "gtceu:block/casings/steam/bronze/top" + } + } + }, + "is_formed=true,is_painted=true": { "model": { "parent": "gtceu:block/machine/template/part/hatch_machine_emissive_color_ring", "textures": { diff --git a/src/generated/resources/assets/cosmiccore/models/block/reinforced_dawnstone_casing.json b/src/generated/resources/assets/cosmiccore/models/block/reinforced_dawnstone_casing.json new file mode 100644 index 000000000..599362ab0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/reinforced_dawnstone_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/reinforced_dawnstone_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/dawn_forge.json b/src/generated/resources/assets/cosmiccore/models/item/dawn_forge.json new file mode 100644 index 000000000..7f928b6d5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/dawn_forge.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/dawn_forge" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ember_tester.json b/src/generated/resources/assets/cosmiccore/models/item/ember_tester.json deleted file mode 100644 index dac03ad02..000000000 --- a/src/generated/resources/assets/cosmiccore/models/item/ember_tester.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "cosmiccore:block/machine/ember_tester" -} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ev_ember_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/ev_ember_input_hatch.json new file mode 100644 index 000000000..9ebb131a3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ev_ember_input_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/ev_ember_input_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ev_ember_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/ev_ember_output_hatch.json new file mode 100644 index 000000000..929e72e6a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ev_ember_output_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/ev_ember_output_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ev_wildfire_core.json b/src/generated/resources/assets/cosmiccore/models/item/ev_wildfire_core.json new file mode 100644 index 000000000..b09aa4835 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ev_wildfire_core.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/ev_wildfire_core" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hv_ember_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/hv_ember_input_hatch.json new file mode 100644 index 000000000..1115eb1ff --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hv_ember_input_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/hv_ember_input_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hv_ember_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/hv_ember_output_hatch.json new file mode 100644 index 000000000..52cd066d6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hv_ember_output_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/hv_ember_output_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hv_wildfire_core.json b/src/generated/resources/assets/cosmiccore/models/item/hv_wildfire_core.json new file mode 100644 index 000000000..b83d3f1a0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hv_wildfire_core.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/hv_wildfire_core" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iv_wildfire_core.json b/src/generated/resources/assets/cosmiccore/models/item/iv_wildfire_core.json new file mode 100644 index 000000000..fb4e86351 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iv_wildfire_core.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/iv_wildfire_core" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/light_dawnstone_casing.json b/src/generated/resources/assets/cosmiccore/models/item/light_dawnstone_casing.json new file mode 100644 index 000000000..3f1d1e057 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/light_dawnstone_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/light_dawnstone_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/luv_wildfire_core.json b/src/generated/resources/assets/cosmiccore/models/item/luv_wildfire_core.json new file mode 100644 index 000000000..d52ce655f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/luv_wildfire_core.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/luv_wildfire_core" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lv_ember_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/lv_ember_input_hatch.json new file mode 100644 index 000000000..d5d591e22 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lv_ember_input_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/lv_ember_input_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lv_ember_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/lv_ember_output_hatch.json new file mode 100644 index 000000000..103538bea --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lv_ember_output_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/lv_ember_output_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lv_wildfire_core.json b/src/generated/resources/assets/cosmiccore/models/item/lv_wildfire_core.json new file mode 100644 index 000000000..1f2768ea4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lv_wildfire_core.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/lv_wildfire_core" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/mv_ember_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/mv_ember_input_hatch.json new file mode 100644 index 000000000..db02deede --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/mv_ember_input_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/mv_ember_input_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/mv_ember_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/mv_ember_output_hatch.json new file mode 100644 index 000000000..2f1285229 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/mv_ember_output_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/mv_ember_output_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/mv_wildfire_core.json b/src/generated/resources/assets/cosmiccore/models/item/mv_wildfire_core.json new file mode 100644 index 000000000..31126f647 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/mv_wildfire_core.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/mv_wildfire_core" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/reinforced_dawnstone_casing.json b/src/generated/resources/assets/cosmiccore/models/item/reinforced_dawnstone_casing.json new file mode 100644 index 000000000..635382b65 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/reinforced_dawnstone_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/reinforced_dawnstone_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/zpm_wildfire_core.json b/src/generated/resources/assets/cosmiccore/models/item/zpm_wildfire_core.json new file mode 100644 index 000000000..5b919d8e6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/zpm_wildfire_core.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/zpm_wildfire_core" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/sounds.json b/src/generated/resources/assets/cosmiccore/sounds.json index 39126ede1..db533c62a 100644 --- a/src/generated/resources/assets/cosmiccore/sounds.json +++ b/src/generated/resources/assets/cosmiccore/sounds.json @@ -17,6 +17,15 @@ ], "subtitle": "cosmiccore.subtitle.arcane_distil" }, + "dawnforge": { + "sounds": [ + { + "type": "file", + "name": "cosmiccore:dawnforge" + } + ], + "subtitle": "cosmiccore.subtitle.dawnforge" + }, "dying_star": { "sounds": [ { diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/light_dawnstone_casing.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/light_dawnstone_casing.json new file mode 100644 index 000000000..9f8ba03c9 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/light_dawnstone_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:light_dawnstone_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/light_dawnstone_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/reinforced_dawnstone_casing.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/reinforced_dawnstone_casing.json new file mode 100644 index 000000000..35fa1ed85 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_tables/blocks/reinforced_dawnstone_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:reinforced_dawnstone_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/reinforced_dawnstone_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/blocks/mineable/pickaxe_or_wrench.json b/src/generated/resources/data/gtceu/tags/blocks/mineable/pickaxe_or_wrench.json index 7d3f647b4..d880998c3 100644 --- a/src/generated/resources/data/gtceu/tags/blocks/mineable/pickaxe_or_wrench.json +++ b/src/generated/resources/data/gtceu/tags/blocks/mineable/pickaxe_or_wrench.json @@ -25,6 +25,8 @@ "cosmiccore:neutronium_buoy", "cosmiccore:pthanterum_wave_breakers", "cosmiccore:cyclozine_high_rigidity_casing", + "cosmiccore:light_dawnstone_casing", + "cosmiccore:reinforced_dawnstone_casing", "cosmiccore:bichromal_nevramite_casing", "cosmiccore:fulgorinth_prime_casing", "cosmiccore:oscillating_gilded_pthanterum_casings", diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/CosmicGuiTextures.java b/src/main/java/com/ghostipedia/cosmiccore/api/CosmicGuiTextures.java index a81846507..59cdf3744 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/api/CosmicGuiTextures.java +++ b/src/main/java/com/ghostipedia/cosmiccore/api/CosmicGuiTextures.java @@ -10,4 +10,8 @@ public class CosmicGuiTextures { "cosmiccore:textures/gui/overlay/sigil_overlay.png"); public static final ResourceTexture PROGRESS_BAR_HEAVY = new ResourceTexture( "cosmiccore:textures/gui/overlay/progress_bar_heavy_assembler.png"); + public static final ResourceTexture DAWN_FORGE = new ResourceTexture( + "cosmiccore:textures/gui/overlay/explosive_overlay.png"); + public static final ResourceTexture DAWN_FORGE_SLOT = new ResourceTexture( + "cosmiccore:textures/gui/overlay/dawnforge_slot.png"); } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicBlocks.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicBlocks.java index 2761ac71c..244cf7c38 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicBlocks.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicBlocks.java @@ -130,6 +130,15 @@ public class CosmicBlocks { public static final BlockEntry CYCLOZINE_HIGH_RIGIDITY_CASING = createCasingBlock( "cyclozine_high_rigidity_casing", CosmicCore.id("block/casings/solid/cyclozine_high_rigidity_casing")); + + public static final BlockEntry LIGHT_DAWNSTONE_CASING = createCasingBlock( + "light_dawnstone_casing", + CosmicCore.id("block/casings/solid/light_dawnstone_casing")); + + public static final BlockEntry REINFORCED_DAWNSTONE_CASING = createCasingBlock( + "reinforced_dawnstone_casing", + CosmicCore.id("block/casings/solid/reinforced_dawnstone_casing")); + // public static final BlockEntry SOMAPLASTIC_HEAVY_FRAMES = createCasingBlock("somaplastic_heavy_frames", // CosmicCore.id("block/casings/solid/cyclozine_high_rigidity_casing")); // public static final BlockEntry MOON_DIVE_CASING = createCasingBlock("moon_dive_casing", diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicItems.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicItems.java index d959df25d..054048e5a 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicItems.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicItems.java @@ -1789,6 +1789,50 @@ public boolean isFoil(ItemStack stack) { .defaultModel() .register(); + // WildFire Cores + public static final ItemEntry LV_WILDFIRE_CORE = REGISTRATE + .item("lv_wildfire_core", ComponentItem::create) + .lang("LV Wildfire Core") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry MV_WILDFIRE_CORE = REGISTRATE + .item("mv_wildfire_core", ComponentItem::create) + .lang("MV Wildfire Core") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry HV_WILDFIRE_CORE = REGISTRATE + .item("hv_wildfire_core", ComponentItem::create) + .lang("HV Wildfire Core") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry EV_WILDFIRE_CORE = REGISTRATE + .item("ev_wildfire_core", ComponentItem::create) + .lang("EV Wildfire Core") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry IV_WILDFIRE_CORE = REGISTRATE + .item("iv_wildfire_core", ComponentItem::create) + .lang("IV Wildfire Core") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry LUV_WILDFIRE_CORE = REGISTRATE + .item("luv_wildfire_core", ComponentItem::create) + .lang("LuV Wildfire Core") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry ZPM_WILDFIRE_CORE = REGISTRATE + .item("zpm_wildfire_core", ComponentItem::create) + .lang("ZPM Wildfire Core") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry WRENCH_CAST_GOLD = REGISTRATE .item("wrench_head_cast", ComponentItem::create) .lang("Wrench Head Cast") diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicMachines.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicMachines.java index 341341e3f..6b7b9b6bb 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicMachines.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicMachines.java @@ -502,6 +502,7 @@ private static MachineDefinition[] registerTieredMachines(String name, new ResourceLocation(GTCEu.MOD_ID, "block/overlay/machine/overlay_fluid_hatch"), new ResourceLocation(GTCEu.MOD_ID, "block/overlay/machine/overlay_fluid_hatch")) .tooltips(Component.translatable("gtceu.machine.steam_fluid_hatch_notice")) + .modelProperty(GTMachineModelProperties.IS_FORMED, false) .langValue("Fluid Input Hatch (Steam)") .register(); public static final MachineDefinition STEAM_EXPORT_HATCH = REGISTRATE @@ -511,6 +512,7 @@ private static MachineDefinition[] registerTieredMachines(String name, .colorOverlaySteamHullModel(new ResourceLocation(GTCEu.MOD_ID, "block/overlay/machine/overlay_pipe"), new ResourceLocation(GTCEu.MOD_ID, "block/overlay/machine/overlay_fluid_hatch"), new ResourceLocation(GTCEu.MOD_ID, "block/overlay/machine/overlay_fluid_hatch")) + .modelProperty(GTMachineModelProperties.IS_FORMED, false) .langValue("Fluid Output Hatch (Steam)") .register(); diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicSounds.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicSounds.java index 2a37eee19..6fe4940bc 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicSounds.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicSounds.java @@ -19,6 +19,7 @@ public class CosmicSounds { public static final SoundEntry ORBITAL_FORGE = REGISTRATE.sound(CosmicCore.id("orbital_forge")).build(); public static final SoundEntry CHEMVAT = REGISTRATE.sound(CosmicCore.id("icv")).build(); public static final SoundEntry VOARX = REGISTRATE.sound(CosmicCore.id("vorax")).build(); + public static final SoundEntry DAWN_FORGE_SFX = REGISTRATE.sound(CosmicCore.id("dawnforge")).build(); public static void init() {} } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicDataGenerators.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicDataGenerators.java index 04b10d110..108d462f8 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicDataGenerators.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicDataGenerators.java @@ -26,10 +26,10 @@ public static void gatherData(GatherDataEvent event) { generator.addProvider(server, new CosmicModifierProvider(packOutput)); -// TODO DATAGEN FOR Materials + stats + traits (server) -// generator.addProvider(server, new CosmicTinkersMaterials(packOutput)); -// generator.addProvider(server, new CosmicMaterialStats(packOutput)); -// generator.addProvider(server, new CosmicMaterialTraits(packOutput)); + // TODO DATAGEN FOR Materials + stats + traits (server) + // generator.addProvider(server, new CosmicTinkersMaterials(packOutput)); + // generator.addProvider(server, new CosmicMaterialStats(packOutput)); + // generator.addProvider(server, new CosmicMaterialTraits(packOutput)); if (event.includeClient()) { generator.addProvider(true, new SoundEntryBuilder.SoundEntryProvider(packOutput, CosmicCore.MOD_ID)); diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicTinkersMaterials.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicTinkersMaterials.java index 5673832e4..dc10c0254 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicTinkersMaterials.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicTinkersMaterials.java @@ -17,10 +17,9 @@ public CosmicTinkersMaterials(PackOutput out) { @Override protected void addMaterials() { - //todo figure this out + // todo figure this out } - @Override public String getName() { return ""; diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/DawnForge.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/DawnForge.java new file mode 100644 index 000000000..5786acc79 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/DawnForge.java @@ -0,0 +1,57 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.common.machine.multiblock.steam.WeakSteamParallelMultiBlockMachine; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; + +import static com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility.IMPORT_EMBER; +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.LIGHT_DAWNSTONE_CASING; +import static com.gregtechceu.gtceu.api.machine.multiblock.PartAbility.EXPORT_FLUIDS; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.api.pattern.util.RelativeDirection.*; +import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.ELECTRIC_OVERCLOCK; +import static com.rekindled.embers.RegistryManager.DAWNSTONE_ANVIL; + +public class DawnForge { + + public final static MultiblockMachineDefinition DAWN_FORGE = REGISTRATE + .multiblock("dawn_forge", WeakSteamParallelMultiBlockMachine::new) + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.DAWN_FORGE) + .appearanceBlock(LIGHT_DAWNSTONE_CASING) + .partAppearance((controller, part, side) -> LIGHT_DAWNSTONE_CASING.getDefaultState()) + .recipeModifier(ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK)) + .pattern(definition -> FactoryBlockPattern.start() + .aisle("ABBBA", "A A", "AA AA", " BBB ", " ") + .aisle("BAAAB", " ", "A A", "BABAB", " B ") + .aisle("BAAAB", " D ", " ", "BBABB", " BBB ") + .aisle("BAAAB", " ", "A A", "BABAB", " B ") + .aisle("ABQBA", "A A", "AA AA", " BBB ", " ") + .where(' ', any()) + .where("Q", controller(blocks(definition.getBlock()))) + .where('A', blocks(CosmicBlocks.REINFORCED_DAWNSTONE_CASING.get())) + .where('B', blocks(CosmicBlocks.LIGHT_DAWNSTONE_CASING.get()) + .or(abilities(PartAbility.IMPORT_ITEMS).setPreviewCount(1)) + .or(abilities(PartAbility.EXPORT_ITEMS).setPreviewCount(1)) + .or(abilities(PartAbility.IMPORT_FLUIDS).setPreviewCount(1)) + .or(abilities(EXPORT_FLUIDS).setPreviewCount(1)) + .or(abilities(IMPORT_EMBER).setPreviewCount(1)) + .or(Predicates.abilities(PartAbility.STEAM).setExactLimit(1))) + .where('D', blocks(DAWNSTONE_ANVIL.get())) + // + .build()) + .workableCasingModel(CosmicCore.id("block/casings/solid/light_dawnstone_casing"), + CosmicCore.id("block/multiblock/dawnforge")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/modular/MultiblockInit.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/modular/MultiblockInit.java index 16b5dffa1..e32e45c6e 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/modular/MultiblockInit.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/modular/MultiblockInit.java @@ -52,5 +52,6 @@ public static void init() { SteamMixer.init(); SufferingChamber.init(); TitanFusion.init(); + DawnForge.init(); } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/gtbridge/CosmicRecipeTypes.java b/src/main/java/com/ghostipedia/cosmiccore/gtbridge/CosmicRecipeTypes.java index 0be306e3f..ccb369f81 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/gtbridge/CosmicRecipeTypes.java +++ b/src/main/java/com/ghostipedia/cosmiccore/gtbridge/CosmicRecipeTypes.java @@ -233,6 +233,12 @@ public class CosmicRecipeTypes { } return ""; }); + public static final GTRecipeType DAWN_FORGE = GTRecipeTypes.register("dawn_forge", GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(8, 1, 2, 0) + .setSound(DAWN_FORGE_SFX) + .setMaxTooltips(5) + .setProgressBar(CosmicGuiTextures.DAWN_FORGE, ProgressTexture.FillDirection.ALWAYS_FULL); + public static final GTRecipeType STELLAR_IRIS = GTRecipeTypes.register("stellar_iris", GTRecipeTypes.MULTIBLOCK) .setMaxIOSize(16, 16, 16, 16) // .setSound(CosmicSounds.BLACK_HOLE_CRY) diff --git a/src/main/resources/assets/cosmiccore/sounds/dawnforge.ogg b/src/main/resources/assets/cosmiccore/sounds/dawnforge.ogg new file mode 100644 index 0000000000000000000000000000000000000000..e6c2f39522a41d7d10b5ec230b468a31ac1f489c GIT binary patch literal 88385 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/light_dawnstone_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/light_dawnstone_casing.png new file mode 100644 index 0000000000000000000000000000000000000000..05fa52388c3b11e927acb19e8c84e51fae613463 GIT binary patch literal 417 zcmV;S0bc%zP)ne*nEv$XA46TyO$HVa2c&t~j3*3A8k`Ia2i}4eaBwlf zHU0SZ4=x5`-@Eah!8244EXD#;1k!AgWDd6R;r-7He0&H4K(>J`ayEpz2x18cFd;kp z{ppJgCl0*Dsu@`x1O$b-AqHGR3M`OfbzKhZnqU6`^CjikP{M=>#sK*br_HbbFbImW zz}c|C1jPaqwvZ;I899KN&_kM#W^}*=OBf(iiO~!a16c+SL}G z4vS|{qQa#aCXZ|x3$lMe@qF|04{%grvl%9j5(Z$K6?wtQ6DIlm;V-x?AR1&C2*cz- zYEfJO@m`fHUwPi&rSV~n7#c6*xZ&s6l&-KI3ZWSaB)^1xJz_?V3 zQAui)NvIV)eW~aC)QB`& zTTsTh@HGF&fYAVQx&kFLC3OPzvvW8-dUoU6^XjzPz9DFFDEUS8)mV?t<-+4PIjV62 zg+OxL3BQ6oc#MXL@<3`p2sw8`xVtfS)eFykN2Yht3@5iv!^>xw$UK&F^7O={isig` zHAhYef#j~Z_Q8{25)+~1+-GX{Z$_NE@L734^4uOmPJ)hwagKQ&LoEwW^ISv>Ijy5z zQJif>GjK{U%NiD68r3RdAEt&?f9g)~qll7ga zAK=$5$!jT2amN_fu6j=Mv=g1#a^L|v_@sKUtWN+z)URb(PV;0m?t+)s5WKMa0iSx# zqaYS9{-Ym=!HfUs2V(FtwjYSa%h-M(7B51Wt3PF nUTRUgmF(^9SyY?5A3*M3=bZnHl}g+900000NkvXXu0mjf8k9`7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_dawnstone_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_dawnstone_casing.png new file mode 100644 index 0000000000000000000000000000000000000000..e5f6824872cb2f7f8b0039db1694e96c3c1a05f5 GIT binary patch literal 327 zcmV-N0l5B&P)TQn3ocKnzVoi=u)>2X*xa{04u{&vFtsLBYkr;--aK zdLTt{P!frz=UrV4lq2`@F0aW8mb2*tJh4g6Fd6ru4i8WHg_E?nRls9$g?(D`15`-) zC~h(~h#Pz^b~&JrEI|!iWZ|Gq(qxKZuTvotkv^$IAyJVg3rUA`)rwGxePsFtk?m55 z_T{h6c1^fG7?^J}PP(lK0L&YV+Yu1HN(`9t?yL#^;)B#9k@hT;cg=u&f;M39TZd~_ zs0;LP>dd9Lh61{#Uq}A(0ZFdgw^pc|@dLKMU5e~nIP3%3vjpv%c5TXx&yNpYUeQ6G ZcmiK@x2tOy7eoL6002ovPDHLkV1hY*hgARo literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_dawnstone_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_dawnstone_casing.png.mcmeta new file mode 100644 index 000000000..6efb52b31 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_dawnstone_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/reinforced_dawnstone_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_dawnstone_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_dawnstone_casing_ctm.png new file mode 100644 index 0000000000000000000000000000000000000000..aeba84212575a4e89dc36596fad3c0d2f6928aec GIT binary patch literal 670 zcmV;P0%84$P)ZPfVyA_jVr%Ckq_wv6 z4J>^HE5Xi6>=Z3U62wLW8gigPu{fCxbD7NT?(JRz`5@e8cfOsw`43JGS7X62Uz$qR zZ=Iji8Qt5fEr`eFr&?d$x5Q?(IB*B&gZz8@ORdkZUxnlfE2T*>SDsNqtf|t*2$^men3m-XhW2xxn zb9zoe&5AOnn4#_reSFT9<5zI5iLZNEd3Ny;jz~r4F`u zfc;`&A{7HB;5`yk4~hv7Mq51K9+i!{9|JGSWglLm)Q5(soWGq;xhe9wWnB0Gu$VCh zT>S_!K$Rmei;otQHlOKyZmStQ223%7`^o}5M@>15dkB8kTSv)S$44D~7eykpDR-&m zRH0AIXnR4!qlP2atFr?NUF!h8P;h&?o04!421+35Oh$=3uW1Pe3-E!& zWgY-P28P2ZH*vD&0m=^!YL%GRX9T1P{D&u?G~Ii4zWXxp#dpnK^ivrVp!9>K5W&&T zVoYJ7v2Lp~4K$P`?8UVbq47^st>a+JNmcoS*2NXD5GvD(q$llTRcvoBY z3kJRfRaWJzRWA>IiEUUhf4=^o`OR5}EyIJnOgy(-d$3nL|471GT|>87&m@u+S}xq< zY}~alfZI#+RbJ7#D~uuS*^GCLn(uyP`Yjk{;Id}MH=ciU?T$>&THN)3)i3%>#kUlJ qgevj;z6p*ArIlshESv8##LQe|wm2+s$vL3I7(8A5T-G@yGywpRJzFOL literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/dawnforge/overlay_front_active.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/dawnforge/overlay_front_active.png new file mode 100644 index 0000000000000000000000000000000000000000..5b9e6ea6739d56cd2a782cfb033e498966bbd628 GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85p<)L71^VC4M4MaHpq>V~B-+vc#_jL9fG&{r%_vKR-X;xpIX= zP|&2r)6;Y{ssb#I9Xs}azHK$z(?s^5pdg;~^YdC?I~y`&9IhA8{rsGtnV+9Of`@Hi z&Cf$0T3T7puFbx*$IovmddP6NK|yh$f}o&ap@ul?p32Y9p6)7tf6Z~{VO9g@Op6sh-D@mz z>YjekKYU`o!mfi;7BU`VyXbx{&XOsVi_IrMig^V`@e1P;jFJvKX^$Bs*bbOBH3*3` iGcY!{=_DjDFzmUdK5g$!T@j#*7(8A5T-G@yGywoJFi?pA literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/dawnforge/overlay_front_emissive.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/dawnforge/overlay_front_emissive.png new file mode 100644 index 0000000000000000000000000000000000000000..c60f7cd035c2699b0211b7ed6d7602d2bd685327 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G}!0G|+7AiccG_7+HONswPKgTu2MX+REVfk$L90|Vb-5N14{zaj-F$mi+e j7@`rJEWzs0(8$QZD8Rs&5z@mBlwt66^>bP0l+XkKe0Cr0 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/cosmiccore/textures/gui/overlay/dawnforge_slot.png b/src/main/resources/assets/cosmiccore/textures/gui/overlay/dawnforge_slot.png new file mode 100644 index 0000000000000000000000000000000000000000..f565b1b1377d277e63a049af752f8efe84ef8e99 GIT binary patch literal 814 zcmV+}1JV46P)BFXky;cgqV%QUbAGVT z`k)|K5iwL+L{dy*HEcITUslefXLEP5+hm);17UYFGk4D3k8@`|bp><|_M>uX&D;m! zSdAwWbN}kiJ1?&-FYkhv&-bF%y}RcA&bn`|r~QEn!chJAd6t`m&P$+vyBcp^y;+$J z^p)zKe9LQ2>1EwJ3eMH!&tLOjd-HyBbAdwfH73F&6sXA;7G>HYKyg2cmiE1n;(U6h2U{egP@{zK~6 z@%LWVvcwp2K_)D0GN)1r1Qt7B_-mwAL36`TokOp4QHv!Uv>YD7`ew)j9qSXP&1`?A1` zy?C-arx_F_P4TgH-4#-$TZodj7sL}Ckzi=k?4x-l%J6>!d1gF7$tCP(7hq4p6=1b# zTh}@0stox;$TQhrXy4;0$CgQ!;i^)+x3isDO^4mDUfh=(el4oqs>J;qUO4=6Fg1j)QOQe8}+r7)+9~PqrT--=1xc~qF07*qoM6N<$f

{O#lD@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/cosmiccore/textures/gui/overlay/explosive_overlay.png b/src/main/resources/assets/cosmiccore/textures/gui/overlay/explosive_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..233553ccac6228e51ebbe5b5242976fbc31c1cbd GIT binary patch literal 460 zcmV;-0WTGelg)fNB> zdC}TV8mFpQ?-RR+`S`mkIgFaVp1xUPvph^1tGFuPB#MeLwi(l=LB0?+$@yUdTxm8& zZrC(%V`qJA1z1=V78ZqtMPXr4SXdNWtwHd!9_L3y>2|OJ(?x88!P0eP39hguQFhI5 zNgpI=#N-bI)0}##1TxvVQLW0!s!_9Dyj(CE>1K1ykII*kQc`Q7{zTAG*_w z&DT^03lsf|&9PLi+P4L#%fDQm6uDAVRcz$N|AfQrRNI3KEYv1?bqymoP=nef2LQ%h(QQ4~EBT2hd-ppnt@Ok}o>HHwB z58cFrxqAq9hOuk68(Kz3&d?CKeF5#B4)pBrzI9&6!5^A5qMkNh~1e$ zz1@NC(*ZO%`f+12iqysz#RVZ%DhQ zh&GdeeP#=1KD@>3yCjaZ_|bbUf#9?O=e7m`FC;%>AxLQ?Y9kaTNZpWN1BZh%Q;9M>TUDu(MqDrOmhb`K`wrz482i0m7jYb1o08GomkKqu3 z=i!y_BbiJholf&~Os`F85QZT<&lB+Dg$1P6*6?C~AN5{O^6Y4YcDs#Er-Si$e7T6O z>k9Mj%}qSp*}=Q+4ZPXy;$^*#tMNGQ1c8t+*+mf1g&@51-u5=#UtT8q3i?J*>69K) zw*}(6*Bcv@Gfj%(=Asj@VCv*V^4@1a$1(I@J$&o}S7I>)qmjIchBje$97n9W<$1C* zkDY(g#fKx{v~d?V<8d4fhd4G(S;2MPX%P*>09*KJbrtUq4zRVdg4**0zPzLlg(=rQ540`gpg)Rs)Is}B-K(f7_ehounJab7p*8F zer;65g&=A-iYxzumTm+$uB_-r?81+Y&_$^z6lxnam_TAPXeu=|$=F1v>3k&g$-8uD z2eLA6Gmkf%^X@&r`vk@q8d;u()BwEBMo|>{_8#hBhGD}rt57p}fuD6MVJ3<``aeJS zjm{E@gxkOoU%zn_3t#h?cpk%GbQ{yxY^;ku^bg38q-Gd~&60^FGI1GnDq(i!Y!_a> z_>7OSMO^G@MJT)nm2wf~RRgbI#SxKP(be6?tK-25E(6o7B9;0@;+x0zA{aS!O(3np@AFa?tA^#Oz`Hd>p7zhB9~i!N8G+k(F@9?pNM$glenPt(LUwrtLNJ7g zv>BquG2omz!r9U~((w;C-YetI(?_@$pMlgOk~m#!!ikgnT_Jj$4IiFDUMJpfb0!G} z`wpT<4xy|YB<7ft$s7@Lmf*YvK8X=|7vrpdYZa7A73{SBP|v(<&YurhHmgyHbtjRN xu&f$6(kK^9>XY}(5%aUH1Y8yT?`rrp{sS#q^QkL4G`Ii&002ovPDHLkV1kcu54ZpT literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/cosmiccore/textures/item/luv_wildfire_core.png b/src/main/resources/assets/cosmiccore/textures/item/luv_wildfire_core.png new file mode 100644 index 0000000000000000000000000000000000000000..c31223ca826022c05e0203ce7d4a541b4eae01b0 GIT binary patch literal 603 zcmV-h0;K(kP)LQcY+RK@|RWO`*}Yl-T%Fq)>{*APBaH21ya3*h_P; z?Jc2~8t7rk#mjn0$f*$GB}qZhOA${(8d(p9Tog({u!w@CSz1y`#K6)`RU{QlN8Y3} z-BnNagBjk;d*3(neiX(SP6ChfP$(3bWm#x8o5I*m%Df^0U6vt|TmJU;w5u=yioH(DkJr))$b z5d;DOWHK54OAiImm+STVU*wN_FVU%XW4PxgE_jDgE1FocmkIH;Op`2);4N`Lv7Q$-@aSl=070p zAAXmis#A^fzt%g6(eXzpzIrUlAC{jYeCq|bDFr7K(MB4Q)rV~nO2z#425V3502`Z_ zT=YsZr7$wb(Rqe>f%@6m|j@~p*0 zh(I}?KILL_ACGZ002ovPDHLkV1kY&3G@H} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/cosmiccore/textures/item/lv_wildfire_core.png b/src/main/resources/assets/cosmiccore/textures/item/lv_wildfire_core.png new file mode 100644 index 0000000000000000000000000000000000000000..1ccabe4f0d685c4ef62033ef4f60ec2fac209bfd GIT binary patch literal 442 zcmV;r0Y(0aP)*Q%y?(VGw@SK15AujSh(*8Q~h_Zj|I6vMv?gq(cyN z@F#Ta(jVv&bnzw#UF-++3xW{)SRqnaTgj+HMfSaH5fkr1k=xouIy5jaGt4~m%)|R~ zM1*$C(bn{z0myQkBuS+2Idi+-PP^e$Dg~`zm@%tG2a@22pTR&CrNp&lAW0%kCla_h zc4Hzo4x`bH4!zHe-!B6Y1ObtVKrI0b!$3pzU?v$uCby2m^c!}Ec96?w!1F#h?))%} z*JjE@)a0TVrLpi7(E^AHYed`2q|Sk6Cl^T&!es4tST$fQm{p$uoYjESDk_hFv&;2! zyH!M4j#DDCWZs<4d$GE)h4KS%6j*`KKM1dfM<^5`P187A0A1HjwfBn$kVogSsrJCh zyWn^C;^Ml7Tbz6`v;|O<630{y27~aujG%f|H0x}0?S2pS`Z==MEcfd>D3>c7qY0?^ kq{?!(**eUO`~RQm1F=Y_F15N;p#T5?07*qoM6N<$g1`E|OaK4? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/cosmiccore/textures/item/mv_wildfire_core.png b/src/main/resources/assets/cosmiccore/textures/item/mv_wildfire_core.png new file mode 100644 index 0000000000000000000000000000000000000000..f19f4dbf81590d350e641edc4f225bb12d7937a4 GIT binary patch literal 591 zcmV-V0LlV3cZ zKK(fNch2|RbM93P!=RR_tBDQN{|yX`_>7{Sqo@}M2Lp=0+=E`jY-y3tgX1?PRvM-J z6$E+c!WEWQ(#!^K(A2s^;)2}Wcb+CwGqVqFF?rvwY!Pq|dX3)G*N8?Q5qlBh)XrY) zHan}CRWfTCrhdfPwcm-_ZX-7HaMN9VNl94#{Bco|N9`x+>h5A}d<=D)ig(D1_FCia zQW$ObJ~oPa^$?e*?#Ruq6D~=f9^D{l58=P(r%h|)uxT%;w+pPV<+loig8`+%Y{BVr z;=Ar+`oL2-=7w{_+_r|8n46%py;I(O`RuV$)q&a4Og5F3=Xe45kbrk_qIqa+Xp~u~ znzf=er94EDc2EAd3t`)93GpTeN!wMqJ&{iEN?ot0xbDyP7DR<}s!n7+LjS>j0zc2P ztc}oWX_e%d)yyH!^muS|ILPW*Np>B-#HYn46(K6+AJWl* zi-zbr|1Cw~Ym$8Ci^R9@vD4w`BN?5SEi62r+~idVh&kduBLT6cl(rBSwgo200{f@H d|4z++<1Z=e=+5P_p~e6J002ovPDHLkV1i=y9`pbJ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/cosmiccore/textures/item/zpm_wildfire_core.png b/src/main/resources/assets/cosmiccore/textures/item/zpm_wildfire_core.png new file mode 100644 index 0000000000000000000000000000000000000000..195017bb23e42521300a93783e1b91bc26f4420f GIT binary patch literal 642 zcmV-|0)737P)LQcY+RK@|RW&Dw2kn#Sg&EowDrMT;QV)}V;h>Zv9d z!BVXBRC>}&K~#$9N$~IDK|I8w9(wR#k;>ZG2qJ2gU_2;w9n) z?}9=6d^v$X4NH(!8O405GKyDq3$2X@(c;OB7Zr41=G$8$R{%;!(0j$tT>X9D9m(8 zK%y4NM1NZoQ=99=%|v!~w7^`{k$MwDcVQe3r@}?Di50wxFH2;iYNjn@{0cb3%}*g}vLm_~dAeG9`#Sc>f;Scc0>9 z64~6OVzlNH#yqhK@}d1_&~tU9a*R3MK+4c@Y&k-&{1nOB zNY80TuS}nvhmlO;SA3?zu=c|z(dO^P+;o_~gGb*Ze2hYXaM|bMr%9a-*v+B~sBC*q c2y6uZ0CSx+LAsrn+yDRo07*qoM6N<$f|rgZZ~y=R literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/cosmiccore/ui/recipe_type/dawn_forge.rtui b/src/main/resources/assets/cosmiccore/ui/recipe_type/dawn_forge.rtui new file mode 100644 index 0000000000000000000000000000000000000000..8f18e304eec4375e90c49e1d0742937c7f46c9a3 GIT binary patch literal 13478 zcmeHO-EQN?6&_lWEz|#t009y-^)8CG7loaylTBe1*-DmT8!KCetcBw%f)Ym(u{0@= zRJ86@E`>fpd(jtAAEOV_Cu!MlX2d^{`q{**#vAFz(r|`z&YAE0%sIz0A$hW4)27~~ zihJLsWVh`$Y42E5`=-*e>^7B2*0wA+PgV`}-s-s|ds)3K%Vg7`M(fIQbXT{`43XXv zLjH!o_xS4&ta9|f&0x|p4t~y&!N&f$u~Q?q1n`w@rDd`&{S8Qi!L&vi=@!?O_Z*ypG=oL zqAOiMPe+98V4sbqYF_o+bC=#ZQc_+|qI5mM{9Vmf`)3ve!i0jufJio7%Q9TOTc>Yb z2U1}S?lsiro3?HBOpOiqY<7f9R5`L{wOS5!zhe_~MAq-rHoalz^YRBauy$YN&&A`l zx3OPh=`DMPQ*By?WqbJKNZz(wm4Sdgl8M}~Y>nFNOe3c+MY)l%SI%jw24(xoWStW- zwqlI`9NFNr&NzhFx;)w9BNeMDw%-@fbp_MTVY{avHdKcmI)>#Qbj>!FWI4#U1&zvR zDulaFros5p&0S1Hs;OsL78)%9EUG=xtM|g+#W3Q>yD- zM+&ywYP)zBdm*ES;gB6kI!gXDLW#6Q$s5owIyQM98 zM7HE;!6@-P&Jrb$DK7c)|Adl@r7d|xw&be?qr|`Cyj-H>5uxP8f>DACAx{-7J=()ABeIA(m!=GGt4n%&$~U(~*9}N8lNe(VPjz zV8a~C=yrW5&z1GAk6i3ATQ!!A|0J4^{RH&i?gzylDYDLv9 z*c8Qqhb!B>gzcG9wuzE4R%zizYpl}pRnu}%w`*E9J&u)ISak|E?~uOj8Ym5ZPnFR~ z%*pRUo>tFpqU0!QHIVZrz3aO7?}2k>b$`a32L^uE2U;MMG-VO~Bk#|BcRvy=C26mJ z5SN95o`1lOOnz->hTb?pG422*UDvV?xFyArpf6{@^uP>WWHRjhs zxm3NmRO(gb_0jgdp&)aBM|6X@Xevp7XR@mJXi4e4i7LlB$+6eN|Dr@L6R9f#hn+hlzM8h$a*x$+ z*Py7LpYZ$`Zf26Z$L^=1L*_}6I36wka?InWDOi}eSx@{T8b(d02^mWBLv@q3g$$K6}3_E!cMx=s|fz``u z?V?Z#FtHgW9B5c=^jz0MH{QctQy6D)UShOQ>MmP}YWm7NwqZZIVt*dn@T(L&2m#En z1Q~doIb;ORr+EoHo38^edZuxc_a0oNFqqNcJ`uX}Xnzdu(-=jcXLvOrWQ7^8ImGwF z1Bq`E#NOTg>_#EBI}gOtBC=5Rr^1Yx?+xhWLS;1>YN`F1X%t6Jjok=JMX$MxUI$= z?h-7aVDwnw@6Rxl!HI9j3Bi%SnC*W>NSqqrLS@A`!mIyIvr;*-HHzVm&=cXxM5tT)-MWr5W5snojYXVYI#!}YS!ue>r~U=eqNCRom5@26Y(nGh{s=8E*(% zwD*ExpA!gRj^vb|?DAJF(8k2^GV^}(BP}q*AflhBqZe5`4jTvObXqIidaYIqUyGI3 zW$&!!K_BW$ty~)XLwc4Wn{}mFJ3l=WLmpF?wYqY1c3v+Jpl$ruX{}to92|LghUpbP zo4svN8e&5B>iqJR=N;keDqhCM`7ZcTIlm|m`oj``OR-Woc~yG$44dZocaML^Zp9i> zfP-Nl^RS4K42nVWMqMctYOnZ62_ImruH2R@mFf*>J7Vu)D?NYZ$!!5-_R(9rTCEi> zPs^S+VCv7gVK*~itgc)XPRp0|!eCe$V&c{7+Eu0O{hg7YRKO;f@xFNR#|)8$K)9rbL%ee|z~#*)6bOyY8SpvalZkD>#g=7q^0=Jj@Gv}n z7+4!_IN%$CG{N40v$r;4$P)|+`G8r-XFU*~$HkXr67nD+KLPh@va-Zvs literal 0 HcmV?d00001 From af84c7c496e7bd6716c42228211015be6e16664f Mon Sep 17 00:00:00 2001 From: Spicierspace153 <21964509+Spicierspace153@users.noreply.github.com> Date: Tue, 23 Sep 2025 21:00:38 -0600 Subject: [PATCH 16/17] modifiers (#144) * tried to get modifiers to work in tinkers * tried to get modifiers to work in tinkers * confict cleanup * got machine interaction to work with specific modifier/traits * timker wrenches now fully work on gt machines and pipes :3 * sounds and durability now work with the tool interactions and some clean up * more tools * clean up * start eu items for timkers * we have nbt :pepechill: * still no work. what the fuck this game is so shitty. * still takes damage :( * i hate mixins * oops wrong target * edit other mixins for discharging tool power * sportl --------- Co-authored-by: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> --- .../common/item/tcon/CosmicTinkerTools.java | 21 +- .../tcon/CosmicToolDefinitionProvider.java | 8 +- .../item/tcon/CosmicToolDefinitions.java | 8 +- .../common/item/tcon/TiconUtils.java | 12 ++ .../tcon/base/ChargableModifiableItem.java | 201 ++++++++++++++++++ .../tcon/modifiers/EUContainerModifier.java | 24 +++ .../mixin/gtceu/MetaMachineBlockMixin.java | 14 +- .../mixin/gtceu/MetaMachineMixin.java | 14 +- .../mixin/gtceu/PipeBlockEntityMixin.java | 43 ++-- .../mixin/gtceu/PipeBlockMixin.java | 14 +- .../mixin/tinkers/ToolHarvestLogicMixin.java | 49 +++++ 11 files changed, 381 insertions(+), 27 deletions(-) create mode 100644 src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/base/ChargableModifiableItem.java create mode 100644 src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/modifiers/EUContainerModifier.java create mode 100644 src/main/java/com/ghostipedia/cosmiccore/mixin/tinkers/ToolHarvestLogicMixin.java diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerTools.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerTools.java index b2a381072..effd7a24b 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerTools.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicTinkerTools.java @@ -1,6 +1,7 @@ package com.ghostipedia.cosmiccore.common.item.tcon; import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.item.tcon.base.ChargableModifiableItem; import com.ghostipedia.cosmiccore.common.item.tcon.modifiers.CosmicCoreModifiers; import net.minecraft.core.BlockPos; @@ -21,14 +22,26 @@ public class CosmicTinkerTools { private static final Item.Properties UNSTACKABLE_PROPS = new Item.Properties().stacksTo(1); + public static final ItemObject file = COSMIC_TINKER_ITEM.register("file", + () -> new ModifiableItem(UNSTACKABLE_PROPS, CosmicToolDefinitions.FILES)); + public static final ItemObject saw = COSMIC_TINKER_ITEM.register("saw", + () -> new ModifiableItem(UNSTACKABLE_PROPS, CosmicToolDefinitions.SAWS)); + public static final ItemObject drill = COSMIC_TINKER_ITEM.register("drill", + () -> new ModifiableItem(UNSTACKABLE_PROPS, CosmicToolDefinitions.DRILLS)); + public static final ItemObject screwdriver = COSMIC_TINKER_ITEM.register("screwdriver", + () -> new ModifiableItem(UNSTACKABLE_PROPS, CosmicToolDefinitions.SCREWDRIVERS)); + public static final ItemObject softMallet = COSMIC_TINKER_ITEM.register("soft_mallet", + () -> new ModifiableItem(UNSTACKABLE_PROPS, CosmicToolDefinitions.SOFT_MALLETS)); + public static final ItemObject plunger = COSMIC_TINKER_ITEM.register("plunger", + () -> new ModifiableItem(UNSTACKABLE_PROPS, CosmicToolDefinitions.PLUNGERS)); + public static final ItemObject crowbar = COSMIC_TINKER_ITEM.register("crowbar", + () -> new ModifiableItem(UNSTACKABLE_PROPS, CosmicToolDefinitions.CROWBARS)); + public static final ItemObject wireCutter = COSMIC_TINKER_ITEM.register("wire_cutter", () -> new ModifiableItem(UNSTACKABLE_PROPS, CosmicToolDefinitions.WIRE_CUTTERS)); - public static final ItemObject screwdriver = COSMIC_TINKER_ITEM.register("screwdriver", - () -> new ModifiableItem(UNSTACKABLE_PROPS, CosmicToolDefinitions.SCREWDRIVER)); - public static final ItemObject wrench = COSMIC_TINKER_ITEM.register("wrench", - () -> new ModifiableItem(UNSTACKABLE_PROPS, CosmicToolDefinitions.WRENCHES) { + () -> new ChargableModifiableItem(UNSTACKABLE_PROPS, CosmicToolDefinitions.WRENCHES) { @Override public boolean doesSneakBypassUse(ItemStack stack, LevelReader level, BlockPos pos, Player player) { diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitionProvider.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitionProvider.java index cbc819fd9..5e020a251 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitionProvider.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitionProvider.java @@ -57,9 +57,9 @@ protected void addToolDefinitions() { .module(new SetStatsModule(StatsNBT.builder() .set(ToolStats.ATTACK_SPEED, 0.9f) .build())) - .module(IsEffectiveModule.tag(CustomTags.MINEABLE_WITH_WIRE_CUTTER)); + .module(IsEffectiveModule.tag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WIRE_CUTTER)); - define(CosmicToolDefinitions.SCREWDRIVER) + define(CosmicToolDefinitions.SCREWDRIVERS) .module(PartStatsModule.parts() .part(screwdriverHead) .part(toolHandle) @@ -79,8 +79,8 @@ protected void addToolDefinitions() { .module(new SetStatsModule(StatsNBT.builder() .set(ToolStats.ATTACK_SPEED, 0.9f) .build())) - .module(IsEffectiveModule.tag(CustomTags.MINEABLE_WITH_WRENCH)) - .module(ToolTraitsModule.builder().trait(CosmicCoreModifiers.wrenchModeSwitch).build());; + .module(IsEffectiveModule.tag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WRENCH)) + .module(ToolTraitsModule.builder().trait(CosmicCoreModifiers.wrenchModeSwitch).build()); } @Override diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitions.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitions.java index 46d035d97..d2bd43b3f 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitions.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/CosmicToolDefinitions.java @@ -9,5 +9,11 @@ public class CosmicToolDefinitions { public static final ToolDefinition WIRE_CUTTERS = ToolDefinition.create(CosmicTinkerTools.wireCutter); public static final ToolDefinition WRENCHES = ToolDefinition.create(CosmicTinkerTools.wrench); - public static final ToolDefinition SCREWDRIVER = ToolDefinition.create(CosmicTinkerTools.screwdriver); + public static final ToolDefinition FILES = ToolDefinition.create(CosmicTinkerTools.file); + public static final ToolDefinition SAWS = ToolDefinition.create(CosmicTinkerTools.saw); + public static final ToolDefinition DRILLS = ToolDefinition.create(CosmicTinkerTools.drill); + public static final ToolDefinition SCREWDRIVERS = ToolDefinition.create(CosmicTinkerTools.screwdriver); + public static final ToolDefinition SOFT_MALLETS = ToolDefinition.create(CosmicTinkerTools.softMallet); + public static final ToolDefinition PLUNGERS = ToolDefinition.create(CosmicTinkerTools.plunger); + public static final ToolDefinition CROWBARS = ToolDefinition.create(CosmicTinkerTools.crowbar); } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/TiconUtils.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/TiconUtils.java index 171496493..51033c83d 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/TiconUtils.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/TiconUtils.java @@ -25,6 +25,18 @@ public static GTToolType getGTToolType(ToolDefinition def) { return GTToolType.WRENCH; } else if (def == CosmicToolDefinitions.WIRE_CUTTERS) { return GTToolType.WIRE_CUTTER; + } else if (def == CosmicToolDefinitions.SCREWDRIVERS) { + return GTToolType.SCREWDRIVER; + } else if (def == CosmicToolDefinitions.CROWBARS) { + return GTToolType.CROWBAR; + } else if (def == CosmicToolDefinitions.FILES) { + return GTToolType.FILE; + } else if (def == CosmicToolDefinitions.PLUNGERS) { + return GTToolType.PLUNGER; + } else if (def == CosmicToolDefinitions.SOFT_MALLETS) { + return GTToolType.SOFT_MALLET; + } else if (def == CosmicToolDefinitions.SAWS) { + return GTToolType.SAW; } return GTToolType.FILE; } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/base/ChargableModifiableItem.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/base/ChargableModifiableItem.java new file mode 100644 index 000000000..9ec7b0283 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/base/ChargableModifiableItem.java @@ -0,0 +1,201 @@ +package com.ghostipedia.cosmiccore.common.item.tcon.base; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.IElectricItem; + +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.CapabilityManager; +import net.minecraftforge.common.capabilities.CapabilityToken; +import net.minecraftforge.common.capabilities.ICapabilityProvider; +import net.minecraftforge.common.util.LazyOptional; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import slimeknights.tconstruct.library.tools.definition.ToolDefinition; +import slimeknights.tconstruct.library.tools.item.ModifiableItem; + +import java.util.List; + +public class ChargableModifiableItem extends ModifiableItem { + + public static final long ENERGY_COST = 8 * GTValues.V[1]; + public static final long CAPACITY = 100_000L; + private static final Capability ELECTRIC_CAP = CapabilityManager + .get(new CapabilityToken() {}); + + public ChargableModifiableItem(Properties properties, ToolDefinition toolDefinition) { + super(properties, toolDefinition); + } + + @Override + public @Nullable ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundTag nbt) { + // Example defaults: 100k max charge, LV tier, chargeable + return new ElectricCapability(stack, 100_000L, GTValues.LV, true); + } + + public static class ElectricCapability implements ICapabilityProvider, IElectricItem { + + private final ItemStack itemStack; + private final long baseMaxCharge; + private final int tier; + private final boolean chargeable; + + private final LazyOptional holder = LazyOptional.of(() -> this); + + public ElectricCapability(ItemStack stack, long maxCharge, int tier, boolean chargeable) { + this.itemStack = stack; + this.baseMaxCharge = maxCharge; + this.tier = tier; + this.chargeable = chargeable; + } + + private CompoundTag getOrCreateTag() { + return itemStack.getOrCreateTag(); + } + + public void setCharge(long charge) { + getOrCreateTag().putLong("charge", Math.max(0, Math.min(charge, getMaxCharge()))); + } + + public void setMaxChargeOverride(long charge) { + getOrCreateTag().putLong("maxCharge", charge); + } + + @Override + public @NotNull LazyOptional getCapability(@NotNull Capability capability, + @Nullable Direction direction) { + if (capability == ELECTRIC_CAP) return holder.cast(); + return LazyOptional.empty(); + } + + @Override + public int getTier() { + return this.tier; + } + + @Override + public boolean canProvideChargeExternally() { + return true; + } + + @Override + public boolean chargeable() { + return chargeable; + } + + @Override + public long charge(long amount, int chargerTier, boolean ignoreTransferLimit, boolean simulate) { + if (!chargeable) return 0; + if (chargerTier < tier) return 0; + + long transferLimit = ignoreTransferLimit ? amount : Math.min(amount, getTransferLimit()); + long current = getCharge(); + long max = getMaxCharge(); + long accepted = Math.min(max - current, transferLimit); + + if (!simulate && accepted > 0) { + setCharge(current + accepted); + } + return accepted; + } + + @Override + public long discharge(long amount, int dischargerTier, boolean ignoreTransferLimit, boolean externally, + boolean simulate) { + if (dischargerTier < tier) return 0; + + long transferLimit = ignoreTransferLimit ? amount : Math.min(amount, getTransferLimit()); + long current = getCharge(); + long extracted = Math.min(current, transferLimit); + + if (!simulate && extracted > 0) { + setCharge(current - extracted); + } + return extracted; + } + + @Override + public long getTransferLimit() { + return GTValues.V[getTier()]; + } + + @Override + public long getMaxCharge() { + var nbt = getOrCreateTag(); + if (nbt.contains("maxCharge", Tag.TAG_LONG)) { + return nbt.getLong("maxCharge"); + } + return baseMaxCharge; + } + + @Override + public long getCharge() { + var nbt = getOrCreateTag(); + if (nbt.getBoolean("infinite")) { + return getMaxCharge(); + } + if (nbt.contains("charge", Tag.TAG_LONG)) { + return nbt.getLong("charge"); + } + return 0; // default empty + } + } + + @Override + public boolean isBarVisible(ItemStack stack) { + return true; + } + + public long getCharge(ItemStack stack) { + return stack.getCapability(ELECTRIC_CAP) + .map(IElectricItem::getCharge) + .orElse(0L); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltip, TooltipFlag flag) { + super.appendHoverText(stack, level, tooltip, flag); + + stack.getCapability(ELECTRIC_CAP).ifPresent(cap -> { + long current = cap.getCharge(); + long max = cap.getMaxCharge(); + + // Format numbers with commas for readability + String currentFormatted = String.format("%,d", current); + String maxFormatted = String.format("%,d", max); + + tooltip.add(Component.literal("Charge: " + currentFormatted + " / " + maxFormatted + " EU")); + }); + } + + public long discharge(ItemStack stack, long amount, boolean simulate) { + // get the capability + return stack.getCapability(ELECTRIC_CAP) + .map(cap -> cap.discharge(amount, GTValues.LV, false, true, simulate)) + .orElse(0L); // if no capability, nothing extracted + } + + public long getCharge(ItemStack stack, long amount, boolean simulate) { + // get the capability + return stack.getCapability(ELECTRIC_CAP) + .map(IElectricItem::getCharge) + .orElse(0L); // if no capability, nothing extracted + } + + @Override + public int getBarWidth(ItemStack stack) { + return (int) Math.round(13.0 * getCharge(stack) / (double) CAPACITY); + } + + @Override + public int getBarColor(ItemStack stack) { + return 0x55D8FF; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/modifiers/EUContainerModifier.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/modifiers/EUContainerModifier.java new file mode 100644 index 000000000..c100a8413 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/tcon/modifiers/EUContainerModifier.java @@ -0,0 +1,24 @@ +package com.ghostipedia.cosmiccore.common.item.tcon.modifiers; + +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +import org.jetbrains.annotations.Nullable; +import slimeknights.tconstruct.library.modifiers.ModifierEntry; +import slimeknights.tconstruct.library.modifiers.hook.behavior.ToolDamageModifierHook; +import slimeknights.tconstruct.library.modifiers.hook.interaction.InventoryTickModifierHook; +import slimeknights.tconstruct.library.modifiers.impl.NoLevelsModifier; +import slimeknights.tconstruct.library.tools.nbt.IToolStackView; + +public class EUContainerModifier extends NoLevelsModifier implements ToolDamageModifierHook, InventoryTickModifierHook { + + @Override + public int onDamageTool(IToolStackView tool, ModifierEntry modifier, int amount, @Nullable LivingEntity holder) { + return 0; + } + + @Override + public void onInventoryTick(IToolStackView tool, ModifierEntry modifier, Level world, LivingEntity holder, + int itemSlot, boolean isSelected, boolean isCorrectSlot, ItemStack stack) {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/MetaMachineBlockMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/MetaMachineBlockMixin.java index 069d28089..6dba258ef 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/MetaMachineBlockMixin.java +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/MetaMachineBlockMixin.java @@ -2,6 +2,7 @@ import com.ghostipedia.cosmiccore.api.misc.IMetaMachineMixin; import com.ghostipedia.cosmiccore.common.item.tcon.TiconUtils; +import com.ghostipedia.cosmiccore.common.item.tcon.base.ChargableModifiableItem; import com.gregtechceu.gtceu.api.block.MetaMachineBlock; import com.gregtechceu.gtceu.api.item.tool.ToolHelper; @@ -44,7 +45,18 @@ public class MetaMachineBlockMixin { ToolHelper.playToolSound(TiconUtils.getGTToolType(result.getFirst()), serverPlayer); if (!serverPlayer.isCreative()) { - ToolDamageUtil.handleDamageItem(itemStack, 1, player, p -> {}); + if (ticonTool instanceof ChargableModifiableItem electricItem) { + + long energyCost = electricItem.ENERGY_COST; + long available = electricItem.getCharge(itemStack); + if (available >= energyCost) { + electricItem.discharge(itemStack, energyCost, false); + + } else { + ToolDamageUtil.handleDamageItem(itemStack, 1, player, p -> {}); + } + } + } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/MetaMachineMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/MetaMachineMixin.java index a2bee417d..47f2341a2 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/MetaMachineMixin.java +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/MetaMachineMixin.java @@ -3,6 +3,7 @@ import com.ghostipedia.cosmiccore.api.misc.IMetaMachineMixin; import com.ghostipedia.cosmiccore.common.item.tcon.CosmicToolDefinitions; import com.ghostipedia.cosmiccore.common.item.tcon.TiconUtils; +import com.ghostipedia.cosmiccore.common.item.tcon.base.ChargableModifiableItem; import com.ghostipedia.cosmiccore.common.item.tcon.modifiers.WrenchModeSwitchModifier; import com.gregtechceu.gtceu.api.capability.ICoverable; @@ -34,8 +35,19 @@ public class MetaMachineMixin implements IMetaMachineMixin { Direction gridSide = ICoverable.determineGridSideHit(hitResult); if (gridSide == null) gridSide = hitResult.getDirection(); if (context.getPlayer() == null) Pair.of(null, InteractionResult.PASS); - if (ticonItem.getToolDefinition() == CosmicToolDefinitions.WRENCHES) { + if (ticonItem instanceof ChargableModifiableItem electricItem) { + ItemStack stack = context.getItemInHand(); + long energyCost = electricItem.ENERGY_COST; + long available = electricItem.getCharge(stack); + if (available >= energyCost) { + electricItem.discharge(stack, energyCost, false); + return Pair.of(ticonItem.getToolDefinition(), + onWrenchClick(context.getPlayer(), context.getHand(), gridSide, hitResult)); + } else { + return Pair.of(ticonItem.getToolDefinition(), InteractionResult.PASS); + } + } return Pair.of(ticonItem.getToolDefinition(), onWrenchClick(context.getPlayer(), context.getHand(), gridSide, hitResult)); } diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/PipeBlockEntityMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/PipeBlockEntityMixin.java index 97ca41ae7..5f5cb7ecd 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/PipeBlockEntityMixin.java +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/PipeBlockEntityMixin.java @@ -2,6 +2,7 @@ import com.ghostipedia.cosmiccore.api.misc.IPipeBlockEntityMixin; import com.ghostipedia.cosmiccore.common.item.tcon.CosmicToolDefinitions; +import com.ghostipedia.cosmiccore.common.item.tcon.TiconUtils; import com.gregtechceu.gtceu.api.blockentity.PipeBlockEntity; import com.gregtechceu.gtceu.api.capability.ICoverable; @@ -9,7 +10,9 @@ import com.gregtechceu.gtceu.api.pipenet.PipeCoverContainer; import net.minecraft.core.Direction; +import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.phys.BlockHitResult; @@ -32,23 +35,33 @@ public class PipeBlockEntityMixin implements IPipeBlockEntityMixin { } var playerIn = context.getPlayer(); - if (ticonItem.getToolDefinition() == CosmicToolDefinitions.WRENCHES) { - var hitResult = new BlockHitResult(context.getClickLocation(), context.getClickedFace(), - context.getClickedPos(), false); - Direction gridSide = ICoverable.determineGridSideHit(hitResult); - CoverBehavior coverBehavior = gridSide == null ? null : coverContainer.getCoverAtSide(gridSide); - if (gridSide == null) gridSide = hitResult.getDirection(); - - if (playerIn.isShiftKeyDown() && ((PipeBlockEntity) (Object) this).canHaveBlockedFaces()) { - boolean isBlocked = ((PipeBlockEntity) (Object) this).isBlocked(gridSide); - ((PipeBlockEntity) (Object) this).setBlocked(gridSide, !isBlocked); - } else { - boolean isOpen = ((PipeBlockEntity) (Object) this).isConnected(gridSide); - ((PipeBlockEntity) (Object) this).setConnection(gridSide, !isOpen, false); + var hitResult = new BlockHitResult(context.getClickLocation(), context.getClickedFace(), + context.getClickedPos(), false); + Direction gridSide = ICoverable.determineGridSideHit(hitResult); + CoverBehavior coverBehavior = gridSide == null ? null : coverContainer.getCoverAtSide(gridSide); + var gtToolType = TiconUtils.getGTToolType(ticonItem.getToolDefinition()); + if (((PipeBlockEntity) (Object) this).getPipeTuneTool() == gtToolType) { + return Pair.of(ticonItem.getToolDefinition(), onTuneClick(playerIn, context.getHand(), hitResult)); + } else if (ticonItem.getToolDefinition() == CosmicToolDefinitions.SCREWDRIVERS) { + if (coverBehavior != null) { + return Pair.of(CosmicToolDefinitions.SCREWDRIVERS, + coverBehavior.onScrewdriverClick(playerIn, context.getHand(), hitResult)); } - return Pair.of(CosmicToolDefinitions.WRENCHES, - InteractionResult.sidedSuccess(playerIn.level().isClientSide)); } return Pair.of(null, InteractionResult.sidedSuccess(playerIn.level().isClientSide)); } + + public InteractionResult onTuneClick(Player player, InteractionHand hand, BlockHitResult hitResult) { + Direction gridSide = ICoverable.determineGridSideHit(hitResult); + if (gridSide == null) gridSide = hitResult.getDirection(); + if (player.isShiftKeyDown() && ((PipeBlockEntity) (Object) this).canHaveBlockedFaces()) { + boolean isBlocked = ((PipeBlockEntity) (Object) this).isBlocked(gridSide); + ((PipeBlockEntity) (Object) this).setBlocked(gridSide, !isBlocked); + } else { + boolean isOpen = ((PipeBlockEntity) (Object) this).isConnected(gridSide); + ((PipeBlockEntity) (Object) this).setConnection(gridSide, !isOpen, false); + } + + return InteractionResult.sidedSuccess(player.level().isClientSide); + } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/PipeBlockMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/PipeBlockMixin.java index 0e21dd00e..7db3e693c 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/PipeBlockMixin.java +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/PipeBlockMixin.java @@ -2,6 +2,7 @@ import com.ghostipedia.cosmiccore.api.misc.IPipeBlockEntityMixin; import com.ghostipedia.cosmiccore.common.item.tcon.TiconUtils; +import com.ghostipedia.cosmiccore.common.item.tcon.base.ChargableModifiableItem; import com.gregtechceu.gtceu.api.block.PipeBlock; import com.gregtechceu.gtceu.api.blockentity.PipeBlockEntity; @@ -43,7 +44,18 @@ public class PipeBlockMixin { ToolHelper.playToolSound(TiconUtils.getGTToolType(result.getFirst()), serverPlayer); if (!serverPlayer.isCreative()) { - ToolDamageUtil.handleDamageItem(itemStack, 1, player, p -> {}); + if (ticonTool instanceof ChargableModifiableItem electricItem) { + long energyCost = electricItem.ENERGY_COST; + long available = electricItem.getCharge(itemStack); + if (available >= energyCost) { + electricItem.discharge(itemStack, energyCost, false); + } else { + ToolDamageUtil.handleDamageItem(itemStack, 1, player, p -> {}); + + } + } else { + ToolDamageUtil.handleDamageItem(itemStack, 1, player, p -> {}); + } } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/tinkers/ToolHarvestLogicMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/tinkers/ToolHarvestLogicMixin.java new file mode 100644 index 000000000..d7ec1f3fc --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/tinkers/ToolHarvestLogicMixin.java @@ -0,0 +1,49 @@ +package com.ghostipedia.cosmiccore.mixin.tinkers; + +import com.ghostipedia.cosmiccore.common.item.tcon.base.ChargableModifiableItem; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.forge.GTCapability; + +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import org.spongepowered.asm.mixin.Debug; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import slimeknights.tconstruct.library.tools.helper.ToolHarvestLogic; +import slimeknights.tconstruct.library.tools.nbt.IToolStackView; +import slimeknights.tconstruct.library.tools.nbt.ToolStack; + +@Debug(export = true) +@Mixin(ToolHarvestLogic.class) +class ToolHarvestLogicMixin { + + @WrapOperation( + remap = false, + method = "breakBlock", + at = @At( + value = "INVOKE", + target = "Lslimeknights/tconstruct/library/tools/helper/ToolDamageUtil;damageAnimated(Lslimeknights/tconstruct/library/tools/nbt/IToolStackView;ILnet/minecraft/world/entity/LivingEntity;)Z")) + private static boolean cosmiccore$RedirectDurability(IToolStackView tool, int amount, LivingEntity entity, + Operation original) { + if (tool instanceof ToolStack toolStack) { + ItemStack stack = toolStack.createStack(); + if (stack.getItem() instanceof ChargableModifiableItem) { + return stack.getCapability(GTCapability.CAPABILITY_ELECTRIC_ITEM) + .map(cap -> { + long energyCost = (long) amount * GTValues.VA[GTValues.LV]; + long extracted = cap.discharge(energyCost, GTValues.LV, false, false, false); + if (extracted >= energyCost) { + return true; // skip durability + } + return original.call(tool, amount, entity); + }) + .orElseGet(() -> original.call(tool, amount, entity)); + } + } + return original.call(tool, amount, entity); + } +} From 57a22efe08b90e003549b2d1f072c83788be8e72 Mon Sep 17 00:00:00 2001 From: Spicierspace153 <21964509+Spicierspace153@users.noreply.github.com> Date: Wed, 15 Oct 2025 17:53:33 -0400 Subject: [PATCH 17/17] mixin to increase toughness of netherrack (#153) * mixin to increase toughness of netherrack * onion's ae2uel pr * cleanup and mixin finish * remap = true --- .../cosmiccore/mixin/BlocksMixin.java | 28 +++++++++++++++++++ src/main/resources/cosmiccore.mixins.json | 5 ++-- 2 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/ghostipedia/cosmiccore/mixin/BlocksMixin.java diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/BlocksMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/BlocksMixin.java new file mode 100644 index 000000000..6a8df1beb --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/BlocksMixin.java @@ -0,0 +1,28 @@ +package com.ghostipedia.cosmiccore.mixin; + +import net.minecraft.world.level.block.Blocks; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.*; + +/** + * @author SpicierSpace153 (kathryne) + * @reason change hardness so tinkers can aoe + */ + +@Unique +@Mixin(value = Blocks.class, remap = true) +public class BlocksMixin { + + @ModifyArg( + method = "", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;strength(F)Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;", + ordinal = 127), + index = 0) + private static float cosmiccore$modifyNetherrackHardness(float originalHardness) { + return .8f; + } +} diff --git a/src/main/resources/cosmiccore.mixins.json b/src/main/resources/cosmiccore.mixins.json index be136f4ec..35bee714f 100644 --- a/src/main/resources/cosmiccore.mixins.json +++ b/src/main/resources/cosmiccore.mixins.json @@ -20,6 +20,7 @@ "ApotheosisRecipeHelperMixin", "ApothSmithingCategoryMixin", "BlockPatternMixin", + "BlocksMixin", "ComponentItemMixin", "DivingHelmetItemMixin", "GTValuesMixin", @@ -39,15 +40,15 @@ "ae2.eudisplay.EUAddSettingMixin", "client.CosmicCoreRemainingAirOverlayMixin", "emi.EmiApiMixin", + "gtceu.MetaMachineBlockEntityMixin", "gtceu.MetaMachineBlockMixin", "gtceu.MetaMachineMixin", "gtceu.PipeBlockEntityMixin", "gtceu.PipeBlockMixin", "lso.FrostbiteEffectMixin", "lso.HeatstrokeEffectMixin", - "tinkers.ModifiableItemMixin", "lso.TemperatureCapabilityMixin", - "gtceu.MetaMachineBlockEntityMixin" + "tinkers.ModifiableItemMixin" ], "injectors": { "defaultRequire": 1,