diff --git a/gradle.properties b/gradle.properties index 57af1e8..2542760 100644 --- a/gradle.properties +++ b/gradle.properties @@ -42,4 +42,4 @@ org.gradle.daemon=false org.gradle.caching=true # Common dependencies -cyclopscore_version=1.21.0-585 +cyclopscore_version=1.21.1-593 diff --git a/loader-fabric/src/main/java/org/cyclops/structuredcrafting/StructuredCraftingFabric.java b/loader-fabric/src/main/java/org/cyclops/structuredcrafting/StructuredCraftingFabric.java new file mode 100644 index 0000000..d222142 --- /dev/null +++ b/loader-fabric/src/main/java/org/cyclops/structuredcrafting/StructuredCraftingFabric.java @@ -0,0 +1,78 @@ +package org.cyclops.structuredcrafting; + +import net.fabricmc.api.ModInitializer; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.ItemStack; +import org.cyclops.cyclopscore.config.ConfigHandlerCommon; +import org.cyclops.cyclopscore.init.ModBaseFabric; +import org.cyclops.cyclopscore.proxy.IClientProxyCommon; +import org.cyclops.cyclopscore.proxy.ICommonProxyCommon; +import org.cyclops.structuredcrafting.block.BlockStructuredCrafterConfig; +import org.cyclops.structuredcrafting.blockentity.BlockEntityStructuredCrafterConfig; +import org.cyclops.structuredcrafting.craft.provider.IItemStackProviderRegistry; +import org.cyclops.structuredcrafting.craft.provider.InventoryItemStackProviderFabric; +import org.cyclops.structuredcrafting.craft.provider.ItemStackProviderRegistry; +import org.cyclops.structuredcrafting.craft.provider.WorldItemStackProviderFabric; +import org.cyclops.structuredcrafting.proxy.ClientProxyFabric; +import org.cyclops.structuredcrafting.proxy.CommonProxyFabric; + +/** + * The main mod class of this mod. + * @author rubensworks + */ +public class StructuredCraftingFabric extends ModBaseFabric implements ModInitializer, IStructuredCraftingMod { + + /** + * The unique instance of this mod. + */ + public static StructuredCraftingFabric _instance; + + public StructuredCraftingFabric() { + super(Reference.MOD_ID, (instance) -> { + _instance = instance; + IStructuredCraftingMod.MOD.set(instance); + }); + } + + @Override + protected IClientProxyCommon constructClientProxy() { + return new ClientProxyFabric(); + } + + @Override + protected ICommonProxyCommon constructCommonProxy() { + return new CommonProxyFabric(); + } + + @Override + protected boolean hasDefaultCreativeModeTab() { + return true; + } + + @Override + protected CreativeModeTab.Builder constructDefaultCreativeModeTab(CreativeModeTab.Builder builder) { + return super.constructDefaultCreativeModeTab(builder) + .icon(() -> new ItemStack(RegistryEntries.ITEM_STRUCTURED_CRAFTER)); + } + + @Override + public void onInitialize() { + getRegistryManager().addRegistry(IItemStackProviderRegistry.class, new ItemStackProviderRegistry()); + + super.onInitialize(); + + IItemStackProviderRegistry registry = getRegistryManager().getRegistry(IItemStackProviderRegistry.class); + registry.registerProvider(new InventoryItemStackProviderFabric()); + registry.registerProvider(new WorldItemStackProviderFabric()); + } + + @Override + protected void onConfigsRegister(ConfigHandlerCommon configHandler) { + super.onConfigsRegister(configHandler); + + configHandler.addConfigurable(new GeneralConfig(this)); + + configHandler.addConfigurable(new BlockStructuredCrafterConfig<>(this)); + configHandler.addConfigurable(new BlockEntityStructuredCrafterConfig<>(this)); + } +} diff --git a/loader-fabric/src/main/java/org/cyclops/structuredcrafting/craft/provider/InventoryItemStackProviderFabric.java b/loader-fabric/src/main/java/org/cyclops/structuredcrafting/craft/provider/InventoryItemStackProviderFabric.java new file mode 100644 index 0000000..1a8d295 --- /dev/null +++ b/loader-fabric/src/main/java/org/cyclops/structuredcrafting/craft/provider/InventoryItemStackProviderFabric.java @@ -0,0 +1,96 @@ +package org.cyclops.structuredcrafting.craft.provider; + +import net.fabricmc.fabric.api.transfer.v1.item.ItemStorage; +import net.fabricmc.fabric.api.transfer.v1.item.ItemVariant; +import net.fabricmc.fabric.api.transfer.v1.storage.Storage; +import net.fabricmc.fabric.api.transfer.v1.storage.StorageView; +import net.fabricmc.fabric.api.transfer.v1.transaction.Transaction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import org.cyclops.structuredcrafting.block.BlockStructuredCrafterConfig; + +import java.util.Iterator; + +/** + * Inventory that can provide itemstacks. + * @author rubensworks + */ +public class InventoryItemStackProviderFabric implements IItemStackProvider { + + @Override + public boolean canProvideInput() { + return BlockStructuredCrafterConfig.canTakeInputsFromInventory; + } + + @Override + public boolean canHandleOutput() { + return BlockStructuredCrafterConfig.canPlaceOutputsIntoInventory; + } + + @Override + public boolean isValidForResults(Level world, BlockPos pos, Direction side) { + return ItemStorage.SIDED.find(world, pos, side) != null; + } + + @Override + public boolean hasItemStack(Level world, BlockPos pos, Direction side) { + return ItemStorage.SIDED.find(world, pos, side) != null; + } + + @Override + public ItemStack getItemStack(Level world, BlockPos pos, Direction side) { + Storage storage = ItemStorage.SIDED.find(world, pos, side); + if (storage != null) { + Iterator> it = storage.nonEmptyIterator(); + if (it.hasNext()) { + return it.next().getResource().toStack(); + } + } + return ItemStack.EMPTY; + } + + @Override + public boolean reduceItemStack(Level world, BlockPos pos, Direction side, boolean simulate) { + Storage storage = ItemStorage.SIDED.find(world, pos, side); + if (storage != null) { + Iterator> it = storage.nonEmptyIterator(); + if (it.hasNext()) { + ItemStack firstStack = it.next().getResource().toStack(); + try (Transaction tx = Transaction.openOuter()) { + long extracted = storage.extract(ItemVariant.of(firstStack), 1, tx); + if (simulate) { + tx.abort(); + } else { + tx.commit(); + } + return extracted > 0; + } + } + } + return false; + } + + @Override + public boolean addItemStack(Level world, BlockPos pos, Direction side, ItemStack itemStack, boolean simulate) { + Storage storage = ItemStorage.SIDED.find(world, pos, side); + if (storage != null) { + try (Transaction tx = Transaction.openOuter()) { + long inserted = storage.insert(ItemVariant.of(itemStack), 1, tx); + if (simulate) { + tx.abort(); + } else { + tx.commit(); + } + return inserted > 0; + } + } + return false; + } + + @Override + public boolean setItemStack(Level world, BlockPos pos, Direction side, ItemStack itemStack, boolean simulate) { + return addItemStack(world, pos, side, itemStack, simulate); + } +} diff --git a/loader-fabric/src/main/java/org/cyclops/structuredcrafting/craft/provider/WorldItemStackProviderFabric.java b/loader-fabric/src/main/java/org/cyclops/structuredcrafting/craft/provider/WorldItemStackProviderFabric.java new file mode 100644 index 0000000..c45e81b --- /dev/null +++ b/loader-fabric/src/main/java/org/cyclops/structuredcrafting/craft/provider/WorldItemStackProviderFabric.java @@ -0,0 +1,36 @@ +package org.cyclops.structuredcrafting.craft.provider; + +import net.fabricmc.fabric.api.transfer.v1.item.ItemStorage; +import net.fabricmc.fabric.api.transfer.v1.item.ItemVariant; +import net.fabricmc.fabric.api.transfer.v1.storage.Storage; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; + +/** + * World that can provide an itemstack. + * @author rubensworks + */ +public class WorldItemStackProviderFabric extends WorldItemStackProviderBase { + + @Override + protected boolean hasEmptyItemHandler(Level world, BlockPos pos, Direction side) { + Storage itemHandler = ItemStorage.SIDED.find(world, pos, side); + if (itemHandler != null) { + return !itemHandler.nonEmptyIterator().hasNext(); + } + return true; + } + + @Override + public ItemStack getItemStack(Level world, BlockPos pos, Direction side) { + BlockState blockState = world.getBlockState(pos); + if(blockState != null && hasEmptyItemHandler(world, pos, side)) { + return blockState.getBlock().getCloneItemStack(world, pos, blockState); + } + return ItemStack.EMPTY; + } + +} diff --git a/loader-fabric/src/main/java/org/cyclops/structuredcrafting/proxy/ClientProxyFabric.java b/loader-fabric/src/main/java/org/cyclops/structuredcrafting/proxy/ClientProxyFabric.java new file mode 100644 index 0000000..0ac8f18 --- /dev/null +++ b/loader-fabric/src/main/java/org/cyclops/structuredcrafting/proxy/ClientProxyFabric.java @@ -0,0 +1,23 @@ +package org.cyclops.structuredcrafting.proxy; + +import org.cyclops.cyclopscore.init.ModBaseFabric; +import org.cyclops.cyclopscore.proxy.ClientProxyComponentFabric; +import org.cyclops.structuredcrafting.StructuredCraftingFabric; + +/** + * Proxy for the client side. + * + * @author rubensworks + * + */ +public class ClientProxyFabric extends ClientProxyComponentFabric { + + public ClientProxyFabric() { + super(new CommonProxyFabric()); + } + + @Override + public ModBaseFabric getMod() { + return StructuredCraftingFabric._instance; + } +} diff --git a/loader-fabric/src/main/java/org/cyclops/structuredcrafting/proxy/CommonProxyFabric.java b/loader-fabric/src/main/java/org/cyclops/structuredcrafting/proxy/CommonProxyFabric.java new file mode 100644 index 0000000..6a4dbfe --- /dev/null +++ b/loader-fabric/src/main/java/org/cyclops/structuredcrafting/proxy/CommonProxyFabric.java @@ -0,0 +1,19 @@ +package org.cyclops.structuredcrafting.proxy; + +import org.cyclops.cyclopscore.init.ModBaseFabric; +import org.cyclops.cyclopscore.proxy.CommonProxyComponentFabric; +import org.cyclops.structuredcrafting.StructuredCraftingFabric; + +/** + * Proxy for server and client side. + * @author rubensworks + * + */ +public class CommonProxyFabric extends CommonProxyComponentFabric { + + @Override + public ModBaseFabric getMod() { + return StructuredCraftingFabric._instance; + } + +} diff --git a/loader-fabric/src/main/resources/data/structuredcrafting/recipe/structured_crafter.json b/loader-fabric/src/main/resources/data/structuredcrafting/recipe/structured_crafter.json new file mode 100644 index 0000000..8d6c03e --- /dev/null +++ b/loader-fabric/src/main/resources/data/structuredcrafting/recipe/structured_crafter.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "pattern": [ + "SCS", + "IRI", + "SCS" + ], + "key": { + "S": { + "item": "minecraft:stick" + }, + "C": { + "tag": "forge:cobblestone" + }, + "I": { + "tag": "forge:ingots/iron" + }, + "R": { + "item": "minecraft:crafting_table" + } + }, + "result": { + "id": "structuredcrafting:structured_crafter" + } +} \ No newline at end of file diff --git a/loader-fabric/src/main/resources/fabric.mod.json b/loader-fabric/src/main/resources/fabric.mod.json new file mode 100644 index 0000000..d845bd0 --- /dev/null +++ b/loader-fabric/src/main/resources/fabric.mod.json @@ -0,0 +1,32 @@ +{ + "schemaVersion": 1, + "id": "${mod_id}", + "version": "${mod_version}", + + "name": "${mod_name}", + "description": "${description}", + "authors": [ + "${mod_author}" + ], + "contact": { + "homepage": "${display_url}", + "sources": "${issue_tracker_url}" + }, + + "license": "${license}", + "icon": "logo.png", + + "environment": "*", + "entrypoints": { + "main": [ + "org.cyclops.structuredcrafting.StructuredCraftingFabric" + ] + }, + + "depends": { + "cyclopscore": ">=${cyclopscore_version_semver}", + "fabricloader": ">=${fabric_loader_version}", + "fabric-api": ">=${fabric_version}", + "java": ">=${java_version}" + } +} \ No newline at end of file