Re-add the Crafter
This commit is contained in:
		| @@ -99,6 +99,15 @@ public class ClientSetup { | ||||
|             ).disableCache()); | ||||
|         } | ||||
|  | ||||
|         bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "crafter"), (base, registry) -> new FullbrightBakedModel( | ||||
|             base, | ||||
|             new ResourceLocation(RS.ID, "block/crafter/cutouts/side_connected"), | ||||
|             new ResourceLocation(RS.ID, "block/crafter/cutouts/side_connected_90"), | ||||
|             new ResourceLocation(RS.ID, "block/crafter/cutouts/side_connected_180"), | ||||
|             new ResourceLocation(RS.ID, "block/crafter/cutouts/side_connected_270"), | ||||
|             new ResourceLocation(RS.ID, "block/crafter/cutouts/front_connected") | ||||
|         )); | ||||
|  | ||||
|         bakedModelOverrideRegistry.add(new ResourceLocation(RS.ID, "pattern"), (base, registry) -> new PatternBakedModel(base)); | ||||
|  | ||||
|         ModelLoader.addSpecialModel(new ResourceLocation(RS.ID + ":block/disks/disk")); | ||||
| @@ -172,6 +181,7 @@ public class ClientSetup { | ||||
|         ScreenManager.registerFactory(RSContainers.CONSTRUCTOR, ConstructorScreen::new); | ||||
|         ScreenManager.registerFactory(RSContainers.DESTRUCTOR, DestructorScreen::new); | ||||
|         ScreenManager.registerFactory(RSContainers.DISK_MANIPULATOR, DiskManipulatorScreen::new); | ||||
|         ScreenManager.registerFactory(RSContainers.CRAFTER, CrafterScreen::new); | ||||
|  | ||||
|         ClientRegistry.registerKeyBinding(RSKeyBindings.OPEN_WIRELESS_GRID); | ||||
|         ClientRegistry.registerKeyBinding(RSKeyBindings.OPEN_WIRELESS_FLUID_GRID); | ||||
|   | ||||
| @@ -29,6 +29,7 @@ import com.raoulvdberge.refinedstorage.container.factory.PositionalTileContainer | ||||
| import com.raoulvdberge.refinedstorage.item.*; | ||||
| import com.raoulvdberge.refinedstorage.item.blockitem.*; | ||||
| import com.raoulvdberge.refinedstorage.item.group.MainItemGroup; | ||||
| import com.raoulvdberge.refinedstorage.loottable.CrafterLootFunctionSerializer; | ||||
| import com.raoulvdberge.refinedstorage.loottable.PortableGridBlockLootFunctionSerializer; | ||||
| import com.raoulvdberge.refinedstorage.loottable.StorageBlockLootFunctionSerializer; | ||||
| import com.raoulvdberge.refinedstorage.network.NetworkHandler; | ||||
| @@ -131,6 +132,7 @@ public final class RS { | ||||
|         API.instance().getNetworkNodeRegistry().add(ConstructorNetworkNode.ID, (tag, world, pos) -> readAndReturn(tag, new ConstructorNetworkNode(world, pos))); | ||||
|         API.instance().getNetworkNodeRegistry().add(DestructorNetworkNode.ID, (tag, world, pos) -> readAndReturn(tag, new DestructorNetworkNode(world, pos))); | ||||
|         API.instance().getNetworkNodeRegistry().add(DiskManipulatorNetworkNode.ID, (tag, world, pos) -> readAndReturn(tag, new DiskManipulatorNetworkNode(world, pos))); | ||||
|         API.instance().getNetworkNodeRegistry().add(CrafterNetworkNode.ID, (tag, world, pos) -> readAndReturn(tag, new CrafterNetworkNode(world, pos))); | ||||
|  | ||||
|         API.instance().getGridManager().add(GridBlockGridFactory.ID, new GridBlockGridFactory()); | ||||
|         API.instance().getGridManager().add(WirelessGridGridFactory.ID, new WirelessGridGridFactory()); | ||||
| @@ -143,6 +145,7 @@ public final class RS { | ||||
|  | ||||
|         LootFunctionManager.registerFunction(new StorageBlockLootFunctionSerializer()); | ||||
|         LootFunctionManager.registerFunction(new PortableGridBlockLootFunctionSerializer()); | ||||
|         LootFunctionManager.registerFunction(new CrafterLootFunctionSerializer()); | ||||
|     } | ||||
|  | ||||
|     private INetworkNode readAndReturn(CompoundNBT tag, NetworkNode node) { | ||||
| @@ -194,6 +197,7 @@ public final class RS { | ||||
|         e.getRegistry().register(new DiskManipulatorBlock()); | ||||
|         e.getRegistry().register(new PortableGridBlock(PortableGridBlockItem.Type.NORMAL)); | ||||
|         e.getRegistry().register(new PortableGridBlock(PortableGridBlockItem.Type.CREATIVE)); | ||||
|         e.getRegistry().register(new CrafterBlock()); | ||||
|     } | ||||
|  | ||||
|     @SubscribeEvent | ||||
| @@ -234,6 +238,7 @@ public final class RS { | ||||
|         e.getRegistry().register(registerTileDataParameters(TileEntityType.Builder.create(ConstructorTile::new, RSBlocks.CONSTRUCTOR).build(null).setRegistryName(RS.ID, "constructor"))); | ||||
|         e.getRegistry().register(registerTileDataParameters(TileEntityType.Builder.create(DestructorTile::new, RSBlocks.DESTRUCTOR).build(null).setRegistryName(RS.ID, "destructor"))); | ||||
|         e.getRegistry().register(registerTileDataParameters(TileEntityType.Builder.create(DiskManipulatorTile::new, RSBlocks.DISK_MANIPULATOR).build(null).setRegistryName(RS.ID, "disk_manipulator"))); | ||||
|         e.getRegistry().register(registerTileDataParameters(TileEntityType.Builder.create(CrafterTile::new, RSBlocks.CRAFTER).build(null).setRegistryName(RS.ID, "crafter"))); | ||||
|  | ||||
|         e.getRegistry().register(registerTileDataParameters(TileEntityType.Builder.create(() -> new PortableGridTile(PortableGridBlockItem.Type.CREATIVE), RSBlocks.CREATIVE_PORTABLE_GRID).build(null).setRegistryName(RS.ID, "creative_portable_grid"))); | ||||
|         e.getRegistry().register(registerTileDataParameters(TileEntityType.Builder.create(() -> new PortableGridTile(PortableGridBlockItem.Type.NORMAL), RSBlocks.PORTABLE_GRID).build(null).setRegistryName(RS.ID, "portable_grid"))); | ||||
| @@ -269,6 +274,7 @@ public final class RS { | ||||
|         e.getRegistry().register(IForgeContainerType.create(new PositionalTileContainerFactory<ConstructorContainer, ConstructorTile>((windowId, inv, tile) -> new ConstructorContainer(tile, inv.player, windowId))).setRegistryName(RS.ID, "constructor")); | ||||
|         e.getRegistry().register(IForgeContainerType.create(new PositionalTileContainerFactory<DestructorContainer, DestructorTile>((windowId, inv, tile) -> new DestructorContainer(tile, inv.player, windowId))).setRegistryName(RS.ID, "destructor")); | ||||
|         e.getRegistry().register(IForgeContainerType.create(new PositionalTileContainerFactory<DiskManipulatorContainer, DiskManipulatorTile>((windowId, inv, tile) -> new DiskManipulatorContainer(tile, inv.player, windowId))).setRegistryName(RS.ID, "disk_manipulator")); | ||||
|         e.getRegistry().register(IForgeContainerType.create(new PositionalTileContainerFactory<CrafterContainer, CrafterTile>((windowId, inv, tile) -> new CrafterContainer(tile, inv.player, windowId))).setRegistryName(RS.ID, "crafter")); | ||||
|     } | ||||
|  | ||||
|     @SubscribeEvent | ||||
| @@ -353,6 +359,7 @@ public final class RS { | ||||
|         e.getRegistry().register(BlockUtils.createBlockItemFor(RSBlocks.CONSTRUCTOR)); | ||||
|         e.getRegistry().register(BlockUtils.createBlockItemFor(RSBlocks.DESTRUCTOR)); | ||||
|         e.getRegistry().register(BlockUtils.createBlockItemFor(RSBlocks.DISK_MANIPULATOR)); | ||||
|         e.getRegistry().register(BlockUtils.createBlockItemFor(RSBlocks.CRAFTER)); | ||||
|  | ||||
|         e.getRegistry().register(new WirelessGridItem(WirelessGridItem.Type.NORMAL)); | ||||
|         e.getRegistry().register(new WirelessGridItem(WirelessGridItem.Type.CREATIVE)); | ||||
|   | ||||
| @@ -78,8 +78,9 @@ public final class RSBlocks { | ||||
|     public static final PortableGridBlock PORTABLE_GRID = null; | ||||
|     @ObjectHolder(RS.ID + ":creative_portable_grid") | ||||
|     public static final PortableGridBlock CREATIVE_PORTABLE_GRID = null; | ||||
|     @ObjectHolder(RS.ID + ":crafter") | ||||
|     public static final CrafterBlock CRAFTER = null; | ||||
|  | ||||
|     public static final BlockCraftingMonitor CRAFTING_MONITOR = null; | ||||
|     public static final BlockCrafter CRAFTER = null; | ||||
|     public static final BlockCrafterManager CRAFTER_MANAGER = null; | ||||
| } | ||||
| @@ -45,9 +45,9 @@ public final class RSContainers { | ||||
|     public static final ContainerType<DestructorContainer> DESTRUCTOR = null; | ||||
|     @ObjectHolder(RS.ID + ":disk_manipulator") | ||||
|     public static final ContainerType<DiskManipulatorContainer> DISK_MANIPULATOR = null; | ||||
|  | ||||
|     //@ObjectHolder(RS.ID + ":crafter") | ||||
|     @ObjectHolder(RS.ID + ":crafter") | ||||
|     public static final ContainerType<CrafterContainer> CRAFTER = null; | ||||
|  | ||||
|     //@ObjectHolder(RS.ID + ":crafter_manager") | ||||
|     public static final ContainerType<CrafterContainer> CRAFTER_MANAGER = null; | ||||
|     //@ObjectHolder(RS.ID + ":crafting_monitor") | ||||
|   | ||||
| @@ -2,8 +2,6 @@ package com.raoulvdberge.refinedstorage; | ||||
|  | ||||
| public class RSOldConfig { | ||||
|     //region Energy | ||||
|     public int crafterUsage; | ||||
|     public int crafterPerPatternUsage; | ||||
|     public int craftingMonitorUsage; | ||||
|     public int crafterManagerUsage; | ||||
|     //endregion | ||||
| @@ -28,8 +26,6 @@ public class RSOldConfig { | ||||
|  | ||||
|     /*private void loadConfig() { | ||||
|         //region Energy | ||||
|         crafterUsage = config.getInt("crafter", ENERGY, 2, 0, Integer.MAX_VALUE, "The base energy used by Crafters"); | ||||
|         crafterPerPatternUsage = config.getInt("crafterPerPattern", ENERGY, 1, 0, Integer.MAX_VALUE, "The additional energy used per Pattern in a Crafter"); | ||||
|         craftingMonitorUsage = config.getInt("craftingMonitor", ENERGY, 2, 0, Integer.MAX_VALUE, "The energy used by Crafting Monitors"); | ||||
|         crafterManagerUsage = config.getInt("crafterManager", ENERGY, 4, 0, Integer.MAX_VALUE, "The energy used by Crafter Managers"); | ||||
|         //endregion | ||||
|   | ||||
| @@ -78,11 +78,11 @@ public class RSTiles { | ||||
|     public static final TileEntityType<PortableGridTile> PORTABLE_GRID = null; | ||||
|     @ObjectHolder(RS.ID + ":creative_portable_grid") | ||||
|     public static final TileEntityType<PortableGridTile> CREATIVE_PORTABLE_GRID = null; | ||||
|      | ||||
|     //@ObjectHolder(RS.ID + ":crafter") | ||||
|     public static final TileEntityType<TileCrafter> CRAFTER = null; | ||||
|     @ObjectHolder(RS.ID + ":crafter") | ||||
|     public static final TileEntityType<CrafterTile> CRAFTER = null; | ||||
|  | ||||
|     //@ObjectHolder(RS.ID + ":crafter_manager") | ||||
|     public static final TileEntityType<TileCrafter> CRAFTER_MANAGER = null; | ||||
|     public static final TileEntityType<CrafterTile> CRAFTER_MANAGER = null; | ||||
|     //@ObjectHolder(RS.ID + ":crafting_monitor") | ||||
|     public static final TileEntityType<TileCraftingMonitor> CRAFTING_MONITOR = null; | ||||
| } | ||||
|   | ||||
| @@ -3,6 +3,7 @@ package com.raoulvdberge.refinedstorage.api.autocrafting; | ||||
| import net.minecraft.tileentity.TileEntity; | ||||
| import net.minecraft.util.Direction; | ||||
| import net.minecraft.util.math.BlockPos; | ||||
| import net.minecraft.util.text.ITextComponent; | ||||
| import net.minecraftforge.fluids.capability.IFluidHandler; | ||||
| import net.minecraftforge.items.IItemHandler; | ||||
| import net.minecraftforge.items.IItemHandlerModifiable; | ||||
| @@ -15,15 +16,6 @@ import java.util.UUID; | ||||
|  * Represents a network node that contains crafting patterns. | ||||
|  */ | ||||
| public interface ICraftingPatternContainer { | ||||
|     /** | ||||
|      * @deprecated Use {@link #getUpdateInterval()} and/or {@link #getMaximumSuccessfulCraftingUpdates()} | ||||
|      * @return the amount of speed upgrades in the container | ||||
|      */ | ||||
|     @Deprecated | ||||
|     default int getSpeedUpgradeCount() { | ||||
|         return 0; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the interval of when a crafting step with a pattern in this container can update. | ||||
|      * Minimum value is 0 (each tick). | ||||
| @@ -89,12 +81,10 @@ public interface ICraftingPatternContainer { | ||||
|  | ||||
|     /** | ||||
|      * The name of this container for categorizing in the Crafting Manager GUI. | ||||
|      * Can be a localized or unlocalized name. | ||||
|      * If it's unlocalized, it will automatically localize the name. | ||||
|      * | ||||
|      * @return the name of this container | ||||
|      */ | ||||
|     String getName(); | ||||
|     ITextComponent getName(); | ||||
|  | ||||
|     /** | ||||
|      * @return the position of this container | ||||
|   | ||||
| @@ -374,7 +374,8 @@ public class CraftingManager implements ICraftingManager { | ||||
|  | ||||
|             IItemHandlerModifiable handler = container.getPatternInventory(); | ||||
|             if (handler != null) { | ||||
|                 this.containerInventories.computeIfAbsent(container.getName(), k -> new ArrayList<>()).add(handler); | ||||
|                 // TODO: Maybe use ITextComponent instead of string... | ||||
|                 this.containerInventories.computeIfAbsent(container.getName().getFormattedText(), k -> new ArrayList<>()).add(handler); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|   | ||||
| @@ -17,9 +17,12 @@ import com.raoulvdberge.refinedstorage.util.WorldUtils; | ||||
| import net.minecraft.item.ItemStack; | ||||
| import net.minecraft.nbt.CompoundNBT; | ||||
| import net.minecraft.tileentity.TileEntity; | ||||
| import net.minecraft.util.Direction; | ||||
| import net.minecraft.util.INameable; | ||||
| import net.minecraft.util.ResourceLocation; | ||||
| import net.minecraft.util.math.BlockPos; | ||||
| import net.minecraft.util.text.ITextComponent; | ||||
| import net.minecraft.util.text.TranslationTextComponent; | ||||
| import net.minecraft.world.World; | ||||
| import net.minecraft.world.server.ServerWorld; | ||||
| import net.minecraftforge.fluids.capability.IFluidHandler; | ||||
| @@ -33,7 +36,7 @@ import java.util.List; | ||||
| import java.util.Optional; | ||||
| import java.util.UUID; | ||||
| 
 | ||||
| public class NetworkNodeCrafter extends NetworkNode implements ICraftingPatternContainer { | ||||
| public class CrafterNetworkNode extends NetworkNode implements ICraftingPatternContainer { | ||||
|     public enum CrafterMode { | ||||
|         IGNORE, | ||||
|         SIGNAL_UNLOCKS_AUTOCRAFTING, | ||||
| @@ -51,7 +54,7 @@ public class NetworkNodeCrafter extends NetworkNode implements ICraftingPatternC | ||||
| 
 | ||||
|     public static final ResourceLocation ID = new ResourceLocation(RS.ID, "crafter"); | ||||
| 
 | ||||
|     public static final String DEFAULT_NAME = "gui.refinedstorage:crafter"; | ||||
|     private static final ITextComponent DEFAULT_NAME = new TranslationTextComponent("gui.refinedstorage.crafter"); | ||||
| 
 | ||||
|     private static final String NBT_DISPLAY_NAME = "DisplayName"; | ||||
|     private static final String NBT_UUID = "CrafterUuid"; | ||||
| @@ -81,7 +84,8 @@ public class NetworkNodeCrafter extends NetworkNode implements ICraftingPatternC | ||||
| 
 | ||||
|     private List<ICraftingPattern> patterns = new ArrayList<>(); | ||||
| 
 | ||||
|     private UpgradeItemHandler upgrades = (UpgradeItemHandler) new UpgradeItemHandler(4 /* TODO, ItemUpgrade.TYPE_SPEED*/).addListener(new NetworkNodeInventoryListener(this)); | ||||
|     private UpgradeItemHandler upgrades = (UpgradeItemHandler) new UpgradeItemHandler(4, UpgradeItem.Type.SPEED) | ||||
|         .addListener(new NetworkNodeInventoryListener(this)); | ||||
| 
 | ||||
|     // Used to prevent infinite recursion on getRootContainer() when there's e.g. two crafters facing each other. | ||||
|     private boolean visited = false; | ||||
| @@ -90,15 +94,13 @@ public class NetworkNodeCrafter extends NetworkNode implements ICraftingPatternC | ||||
|     private boolean locked = false; | ||||
|     private boolean wasPowered; | ||||
| 
 | ||||
|     private boolean reading; | ||||
| 
 | ||||
|     @Nullable | ||||
|     private String displayName; | ||||
|     private ITextComponent displayName; | ||||
| 
 | ||||
|     @Nullable | ||||
|     private UUID uuid = null; | ||||
| 
 | ||||
|     public NetworkNodeCrafter(World world, BlockPos pos) { | ||||
|     public CrafterNetworkNode(World world, BlockPos pos) { | ||||
|         super(world, pos); | ||||
|     } | ||||
| 
 | ||||
| @@ -120,7 +122,7 @@ public class NetworkNodeCrafter extends NetworkNode implements ICraftingPatternC | ||||
| 
 | ||||
|     @Override | ||||
|     public int getEnergyUsage() { | ||||
|         return RS.INSTANCE.config.crafterUsage + upgrades.getEnergyUsage() + (RS.INSTANCE.config.crafterPerPatternUsage * patterns.size()); | ||||
|         return RS.SERVER_CONFIG.getCrafter().getUsage() + upgrades.getEnergyUsage() + (RS.SERVER_CONFIG.getCrafter().getPatternUsage() * patterns.size()); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
| @@ -161,8 +163,10 @@ public class NetworkNodeCrafter extends NetworkNode implements ICraftingPatternC | ||||
|             .forEach(task -> network.getCraftingManager().cancel(task.getId())); | ||||
|     } | ||||
| 
 | ||||
|     // @TODO @Override | ||||
|     protected void onDirectionChanged() { | ||||
|     @Override | ||||
|     public void onDirectionChanged(Direction direction) { | ||||
|         super.onDirectionChanged(direction); | ||||
| 
 | ||||
|         if (network != null) { | ||||
|             network.getCraftingManager().rebuild(); | ||||
|         } | ||||
| @@ -172,19 +176,14 @@ public class NetworkNodeCrafter extends NetworkNode implements ICraftingPatternC | ||||
|     public void read(CompoundNBT tag) { | ||||
|         super.read(tag); | ||||
| 
 | ||||
|         // Fix cascading crafter invalidates while reading patterns | ||||
|         this.reading = true; | ||||
| 
 | ||||
|         StackUtils.readItems(patternsInventory, 0, tag); | ||||
| 
 | ||||
|         this.invalidate(); | ||||
| 
 | ||||
|         this.reading = false; | ||||
|         invalidate(); | ||||
| 
 | ||||
|         StackUtils.readItems(upgrades, 1, tag); | ||||
| 
 | ||||
|         if (tag.contains(NBT_DISPLAY_NAME)) { | ||||
|             displayName = tag.getString(NBT_DISPLAY_NAME); | ||||
|             displayName = ITextComponent.Serializer.fromJson(tag.getString(NBT_DISPLAY_NAME)); | ||||
|         } | ||||
| 
 | ||||
|         if (tag.hasUniqueId(NBT_UUID)) { | ||||
| @@ -217,7 +216,7 @@ public class NetworkNodeCrafter extends NetworkNode implements ICraftingPatternC | ||||
|         StackUtils.writeItems(upgrades, 1, tag); | ||||
| 
 | ||||
|         if (displayName != null) { | ||||
|             tag.putString(NBT_DISPLAY_NAME, displayName); | ||||
|             tag.putString(NBT_DISPLAY_NAME, ITextComponent.Serializer.toJson(displayName)); | ||||
|         } | ||||
| 
 | ||||
|         if (uuid != null) { | ||||
| @@ -312,7 +311,7 @@ public class NetworkNodeCrafter extends NetworkNode implements ICraftingPatternC | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public String getName() { | ||||
|     public ITextComponent getName() { | ||||
|         if (displayName != null) { | ||||
|             return displayName; | ||||
|         } | ||||
| @@ -320,22 +319,22 @@ public class NetworkNodeCrafter extends NetworkNode implements ICraftingPatternC | ||||
|         TileEntity facing = getConnectedTile(); | ||||
| 
 | ||||
|         if (facing instanceof INameable && ((INameable) facing).getName() != null) { | ||||
|             return ((INameable) facing).getName().getString(); // TODO: DOes this even work | ||||
|             return ((INameable) facing).getName(); | ||||
|         } | ||||
| 
 | ||||
|         if (facing != null) { | ||||
|             return world.getBlockState(facing.getPos()).getBlock().getTranslationKey() + ".name"; | ||||
|             return new TranslationTextComponent(world.getBlockState(facing.getPos()).getBlock().getTranslationKey()); | ||||
|         } | ||||
| 
 | ||||
|         return DEFAULT_NAME; | ||||
|     } | ||||
| 
 | ||||
|     public void setDisplayName(String displayName) { | ||||
|     public void setDisplayName(ITextComponent displayName) { | ||||
|         this.displayName = displayName; | ||||
|     } | ||||
| 
 | ||||
|     @Nullable | ||||
|     public String getDisplayName() { | ||||
|     public ITextComponent getDisplayName() { | ||||
|         return displayName; | ||||
|     } | ||||
| 
 | ||||
| @@ -1,88 +0,0 @@ | ||||
| package com.raoulvdberge.refinedstorage.block; | ||||
|  | ||||
| import net.minecraft.util.BlockRenderLayer; | ||||
|  | ||||
| import javax.annotation.Nullable; | ||||
|  | ||||
| public class BlockCrafter extends NetworkNodeBlock { | ||||
|     public BlockCrafter(Properties props) { | ||||
|         super(props); | ||||
|     } | ||||
|  | ||||
|     /* | ||||
|     @Override | ||||
|     @OnlyIn(Dist.CLIENT) | ||||
|     public void registerModels(IModelRegistration modelRegistration) { | ||||
|         modelRegistration.setModel(this, 0, new ModelResourceLocation(info.getId(), "connected=false,direction=north")); | ||||
|  | ||||
|         modelRegistration.addBakedModelOverride(info.getId(), base -> new FullbrightBakedModel( | ||||
|             base, | ||||
|             new ResourceLocation(RS.ID, "blocks/crafter/cutouts/side_connected"), | ||||
|             new ResourceLocation(RS.ID, "blocks/crafter/cutouts/side_connected_90"), | ||||
|             new ResourceLocation(RS.ID, "blocks/crafter/cutouts/side_connected_180"), | ||||
|             new ResourceLocation(RS.ID, "blocks/crafter/cutouts/side_connected_270"), | ||||
|             new ResourceLocation(RS.ID, "blocks/crafter/cutouts/front_connected") | ||||
|         )); | ||||
|     }*/ | ||||
|  | ||||
|     @Override | ||||
|     public BlockRenderLayer getRenderLayer() { | ||||
|         return BlockRenderLayer.CUTOUT; | ||||
|     } | ||||
|  | ||||
|     //@Override | ||||
|     @Nullable | ||||
|     public BlockDirection getDirection() { | ||||
|         return BlockDirection.ANY_FACE_PLAYER; | ||||
|     } | ||||
|  | ||||
|     /* TODO | ||||
|     @Override | ||||
|     public void onBlockPlacedBy(World world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) { | ||||
|         super.onBlockPlacedBy(world, pos, state, placer, stack); | ||||
|  | ||||
|         if (!world.isRemote) { | ||||
|             TileEntity tile = world.getTileEntity(pos); | ||||
|  | ||||
|             if (tile instanceof TileCrafter && stack.hasDisplayName()) { | ||||
|                 ((TileCrafter) tile).getNode().setDisplayName(stack.getDisplayName().getFormattedText()); // TODO getFormattedText | ||||
|                 ((TileCrafter) tile).getNode().markDirty(); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { | ||||
|         return super.onBlockActivated(state, worldIn, pos, player, handIn, hit); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean onBlockActivated(World world, BlockPos pos, BlockState state, PlayerEntity player, EnumHand hand, Direction side, float hitX, float hitY, float hitZ) { | ||||
|         return openNetworkGui(RSGui.CRAFTER, player, world, pos, side); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public List<ItemStack> getDrops(BlockState state, LootContext.Builder builder) { | ||||
|         return super.getDrops(state, builder); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void getDrops(NonNullList<ItemStack> drops, IBlockAccess world, BlockPos pos, BlockState state, int fortune) { | ||||
|         super.getDrops(drops, world, pos, state, fortune); | ||||
|  | ||||
|         String displayName = ((TileCrafter) world.getTileEntity(pos)).getNode().getDisplayName(); | ||||
|  | ||||
|         if (displayName != null) { | ||||
|             for (ItemStack drop : drops) { | ||||
|                 if (drop.getItem() == Item.getItemFromBlock(this)) { | ||||
|                     drop.setStackDisplayName(displayName); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     }*/ | ||||
|  | ||||
|     @Override | ||||
|     public boolean hasConnectedState() { | ||||
|         return true; | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,84 @@ | ||||
| package com.raoulvdberge.refinedstorage.block; | ||||
|  | ||||
| import com.raoulvdberge.refinedstorage.RS; | ||||
| import com.raoulvdberge.refinedstorage.container.CrafterContainer; | ||||
| import com.raoulvdberge.refinedstorage.container.factory.PositionalTileContainerProvider; | ||||
| import com.raoulvdberge.refinedstorage.tile.CrafterTile; | ||||
| import com.raoulvdberge.refinedstorage.util.BlockUtils; | ||||
| import com.raoulvdberge.refinedstorage.util.NetworkUtils; | ||||
| import net.minecraft.block.BlockState; | ||||
| import net.minecraft.entity.LivingEntity; | ||||
| import net.minecraft.entity.player.PlayerEntity; | ||||
| import net.minecraft.entity.player.ServerPlayerEntity; | ||||
| import net.minecraft.item.ItemStack; | ||||
| import net.minecraft.tileentity.TileEntity; | ||||
| import net.minecraft.util.BlockRenderLayer; | ||||
| import net.minecraft.util.Hand; | ||||
| import net.minecraft.util.math.BlockPos; | ||||
| import net.minecraft.util.math.BlockRayTraceResult; | ||||
| import net.minecraft.world.IBlockReader; | ||||
| import net.minecraft.world.World; | ||||
| import net.minecraftforge.fml.network.NetworkHooks; | ||||
|  | ||||
| import javax.annotation.Nullable; | ||||
|  | ||||
| public class CrafterBlock extends NetworkNodeBlock { | ||||
|     public CrafterBlock() { | ||||
|         super(BlockUtils.DEFAULT_ROCK_PROPERTIES); | ||||
|  | ||||
|         this.setRegistryName(RS.ID, "crafter"); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public BlockRenderLayer getRenderLayer() { | ||||
|         return BlockRenderLayer.CUTOUT; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public BlockDirection getDirection() { | ||||
|         return BlockDirection.ANY_FACE_PLAYER; | ||||
|     } | ||||
|  | ||||
|     @Nullable | ||||
|     @Override | ||||
|     public TileEntity createTileEntity(BlockState state, IBlockReader world) { | ||||
|         return new CrafterTile(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onBlockPlacedBy(World world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) { | ||||
|         super.onBlockPlacedBy(world, pos, state, placer, stack); | ||||
|  | ||||
|         if (!world.isRemote) { | ||||
|             TileEntity tile = world.getTileEntity(pos); | ||||
|  | ||||
|             if (tile instanceof CrafterTile && stack.hasDisplayName()) { | ||||
|                 ((CrafterTile) tile).getNode().setDisplayName(stack.getDisplayName()); | ||||
|                 ((CrafterTile) tile).getNode().markDirty(); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     @SuppressWarnings("deprecation") | ||||
|     public boolean onBlockActivated(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) { | ||||
|         if (!world.isRemote) { | ||||
|             return NetworkUtils.attemptModify(world, pos, hit.getFace(), player, () -> NetworkHooks.openGui( | ||||
|                 (ServerPlayerEntity) player, | ||||
|                 new PositionalTileContainerProvider<CrafterTile>( | ||||
|                     ((CrafterTile) world.getTileEntity(pos)).getNode().getName(), | ||||
|                     (tile, windowId, inventory, p) -> new CrafterContainer(tile, player, windowId), | ||||
|                     pos | ||||
|                 ), | ||||
|                 pos | ||||
|             )); | ||||
|         } | ||||
|  | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean hasConnectedState() { | ||||
|         return true; | ||||
|     } | ||||
| } | ||||
| @@ -31,6 +31,7 @@ public class ServerConfig { | ||||
|     private Destructor destructor; | ||||
|     private DiskManipulator diskManipulator; | ||||
|     private PortableGrid portableGrid; | ||||
|     private Crafter crafter; | ||||
|  | ||||
|     public ServerConfig() { | ||||
|         upgrades = new Upgrades(); | ||||
| @@ -58,6 +59,7 @@ public class ServerConfig { | ||||
|         destructor = new Destructor(); | ||||
|         diskManipulator = new DiskManipulator(); | ||||
|         portableGrid = new PortableGrid(); | ||||
|         crafter = new Crafter(); | ||||
|  | ||||
|         spec = builder.build(); | ||||
|     } | ||||
| @@ -162,6 +164,10 @@ public class ServerConfig { | ||||
|         return portableGrid; | ||||
|     } | ||||
|  | ||||
|     public Crafter getCrafter() { | ||||
|         return crafter; | ||||
|     } | ||||
|  | ||||
|     public ForgeConfigSpec getSpec() { | ||||
|         return spec; | ||||
|     } | ||||
| @@ -787,4 +793,26 @@ public class ServerConfig { | ||||
|             return usage.get(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public class Crafter { | ||||
|         private final ForgeConfigSpec.IntValue usage; | ||||
|         private final ForgeConfigSpec.IntValue patternUsage; | ||||
|  | ||||
|         public Crafter() { | ||||
|             builder.push("crafter"); | ||||
|  | ||||
|             usage = builder.comment("The energy used by the Crafter").defineInRange("usage", 4, 0, Integer.MAX_VALUE); | ||||
|             patternUsage = builder.comment("The energy used for every Pattern in the Crafter").defineInRange("patternUsage", 1, 0, Integer.MAX_VALUE); | ||||
|  | ||||
|             builder.pop(); | ||||
|         } | ||||
|  | ||||
|         public int getUsage() { | ||||
|             return usage.get(); | ||||
|         } | ||||
|  | ||||
|         public int getPatternUsage() { | ||||
|             return patternUsage.get(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,12 +1,12 @@ | ||||
| package com.raoulvdberge.refinedstorage.container; | ||||
|  | ||||
| import com.raoulvdberge.refinedstorage.RSContainers; | ||||
| import com.raoulvdberge.refinedstorage.tile.TileCrafter; | ||||
| import com.raoulvdberge.refinedstorage.tile.CrafterTile; | ||||
| import net.minecraft.entity.player.PlayerEntity; | ||||
| import net.minecraftforge.items.SlotItemHandler; | ||||
|  | ||||
| public class CrafterContainer extends BaseContainer { | ||||
|     public CrafterContainer(TileCrafter crafter, PlayerEntity player, int windowId) { | ||||
|     public CrafterContainer(CrafterTile crafter, PlayerEntity player, int windowId) { | ||||
|         super(RSContainers.CRAFTER, crafter, player, windowId); | ||||
|  | ||||
|         for (int i = 0; i < 9; ++i) { | ||||
|   | ||||
| @@ -0,0 +1,27 @@ | ||||
| package com.raoulvdberge.refinedstorage.loottable; | ||||
|  | ||||
| import com.raoulvdberge.refinedstorage.apiimpl.network.node.CrafterNetworkNode; | ||||
| import com.raoulvdberge.refinedstorage.tile.CrafterTile; | ||||
| import net.minecraft.item.ItemStack; | ||||
| import net.minecraft.tileentity.TileEntity; | ||||
| import net.minecraft.world.storage.loot.LootContext; | ||||
| import net.minecraft.world.storage.loot.LootParameters; | ||||
| import net.minecraft.world.storage.loot.functions.ILootFunction; | ||||
|  | ||||
| public class CrafterLootFunction implements ILootFunction { | ||||
|     @Override | ||||
|     public ItemStack apply(ItemStack stack, LootContext lootContext) { | ||||
|         TileEntity tile = lootContext.get(LootParameters.BLOCK_ENTITY); | ||||
|  | ||||
|         CrafterNetworkNode removedNode = ((CrafterTile) tile).getRemovedNode(); | ||||
|         if (removedNode == null) { | ||||
|             removedNode = ((CrafterTile) tile).getNode(); | ||||
|         } | ||||
|  | ||||
|         if (removedNode.getDisplayName() != null) { | ||||
|             stack.setDisplayName(removedNode.getDisplayName()); | ||||
|         } | ||||
|  | ||||
|         return stack; | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,24 @@ | ||||
| package com.raoulvdberge.refinedstorage.loottable; | ||||
|  | ||||
| import com.google.gson.JsonDeserializationContext; | ||||
| import com.google.gson.JsonObject; | ||||
| import com.google.gson.JsonSerializationContext; | ||||
| import com.raoulvdberge.refinedstorage.RS; | ||||
| import net.minecraft.util.ResourceLocation; | ||||
| import net.minecraft.world.storage.loot.functions.ILootFunction; | ||||
|  | ||||
| public class CrafterLootFunctionSerializer extends ILootFunction.Serializer<CrafterLootFunction> { | ||||
|     public CrafterLootFunctionSerializer() { | ||||
|         super(new ResourceLocation(RS.ID, "crafter"), CrafterLootFunction.class); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void serialize(JsonObject jsonObject, CrafterLootFunction crafterLootFunction, JsonSerializationContext jsonSerializationContext) { | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public CrafterLootFunction deserialize(JsonObject jsonObject, JsonDeserializationContext jsonDeserializationContext) { | ||||
|         return new CrafterLootFunction(); | ||||
|     } | ||||
| } | ||||
| @@ -2,14 +2,14 @@ package com.raoulvdberge.refinedstorage.screen; | ||||
| 
 | ||||
| import com.raoulvdberge.refinedstorage.RS; | ||||
| import com.raoulvdberge.refinedstorage.container.CrafterContainer; | ||||
| import com.raoulvdberge.refinedstorage.tile.TileCrafter; | ||||
| import com.raoulvdberge.refinedstorage.util.RenderUtils; | ||||
| import net.minecraft.client.resources.I18n; | ||||
| import net.minecraft.entity.player.PlayerInventory; | ||||
| import net.minecraft.util.text.ITextComponent; | ||||
| 
 | ||||
| public class GuiCrafter extends BaseScreen<CrafterContainer> { | ||||
|     public GuiCrafter(CrafterContainer container, PlayerInventory inventory) { | ||||
|         super(container, 211, 137, inventory, null); | ||||
| public class CrafterScreen extends BaseScreen<CrafterContainer> { | ||||
|     public CrafterScreen(CrafterContainer container, PlayerInventory inventory, ITextComponent title) { | ||||
|         super(container, 211, 137, inventory, title); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
| @@ -29,7 +29,7 @@ public class GuiCrafter extends BaseScreen<CrafterContainer> { | ||||
| 
 | ||||
|     @Override | ||||
|     public void renderForeground(int mouseX, int mouseY) { | ||||
|         renderString(7, 7, RenderUtils.shorten(I18n.format(TileCrafter.NAME.getValue()), 26)); | ||||
|         renderString(7, 7, RenderUtils.shorten(title.getFormattedText(), 26)); | ||||
|         renderString(7, 43, I18n.format("container.inventory")); | ||||
|     } | ||||
| } | ||||
| @@ -7,7 +7,7 @@ public class TileDataParameterClientListenerCrafter implements TileDataParameter | ||||
|     @Override | ||||
|     public void onChanged(boolean initial, Boolean hasRoot) { | ||||
|         if (!hasRoot) { | ||||
|             BaseScreen.executeLater(GuiCrafter.class, gui -> { | ||||
|             BaseScreen.executeLater(CrafterScreen.class, gui -> { | ||||
|                 gui.addSideButton(new CrafterModeSideButton(gui)); | ||||
|             }); | ||||
|         } | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| package com.raoulvdberge.refinedstorage.screen.widget.sidebutton; | ||||
|  | ||||
| import com.raoulvdberge.refinedstorage.screen.BaseScreen; | ||||
| import com.raoulvdberge.refinedstorage.tile.TileCrafter; | ||||
| import com.raoulvdberge.refinedstorage.tile.CrafterTile; | ||||
| import com.raoulvdberge.refinedstorage.tile.data.TileDataManager; | ||||
| import net.minecraft.client.resources.I18n; | ||||
| import net.minecraft.util.text.TextFormatting; | ||||
| @@ -13,16 +13,16 @@ public class CrafterModeSideButton extends SideButton { | ||||
|  | ||||
|     @Override | ||||
|     public String getTooltip() { | ||||
|         return I18n.format("sidebutton.refinedstorage.crafter_mode") + "\n" + TextFormatting.GRAY + I18n.format("sidebutton.refinedstorage.crafter_mode." + TileCrafter.MODE.getValue()); | ||||
|         return I18n.format("sidebutton.refinedstorage.crafter_mode") + "\n" + TextFormatting.GRAY + I18n.format("sidebutton.refinedstorage.crafter_mode." + CrafterTile.MODE.getValue()); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected void renderButtonIcon(int x, int y) { | ||||
|         screen.blit(x, y, TileCrafter.MODE.getValue() * 16, 0, 16, 16); | ||||
|         screen.blit(x, y, CrafterTile.MODE.getValue() * 16, 0, 16, 16); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onPress() { | ||||
|         TileDataManager.setParameter(TileCrafter.MODE, TileCrafter.MODE.getValue() + 1); | ||||
|         TileDataManager.setParameter(CrafterTile.MODE, CrafterTile.MODE.getValue() + 1); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -0,0 +1,47 @@ | ||||
| package com.raoulvdberge.refinedstorage.tile; | ||||
|  | ||||
| import com.raoulvdberge.refinedstorage.RSTiles; | ||||
| import com.raoulvdberge.refinedstorage.apiimpl.network.node.CrafterNetworkNode; | ||||
| import com.raoulvdberge.refinedstorage.screen.TileDataParameterClientListenerCrafter; | ||||
| import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter; | ||||
| import net.minecraft.network.datasync.DataSerializers; | ||||
| import net.minecraft.util.Direction; | ||||
| import net.minecraft.util.math.BlockPos; | ||||
| import net.minecraft.world.World; | ||||
| import net.minecraftforge.common.capabilities.Capability; | ||||
| import net.minecraftforge.common.util.LazyOptional; | ||||
| import net.minecraftforge.items.CapabilityItemHandler; | ||||
| import net.minecraftforge.items.IItemHandler; | ||||
|  | ||||
| import javax.annotation.Nonnull; | ||||
| import javax.annotation.Nullable; | ||||
|  | ||||
| public class CrafterTile extends NetworkNodeTile<CrafterNetworkNode> { | ||||
|     public static final TileDataParameter<Integer, CrafterTile> MODE = new TileDataParameter<>(DataSerializers.VARINT, CrafterNetworkNode.CrafterMode.IGNORE.ordinal(), t -> t.getNode().getMode().ordinal(), (t, v) -> t.getNode().setMode(CrafterNetworkNode.CrafterMode.getById(v))); | ||||
|     private static final TileDataParameter<Boolean, CrafterTile> HAS_ROOT = new TileDataParameter<>(DataSerializers.BOOLEAN, false, t -> t.getNode().getRootContainerNotSelf().isPresent(), null, (t, v) -> new TileDataParameterClientListenerCrafter().onChanged(t, v)); | ||||
|  | ||||
|     private LazyOptional<IItemHandler> patternsCapability = LazyOptional.of(() -> getNode().getPatternItems()); | ||||
|  | ||||
|     public CrafterTile() { | ||||
|         super(RSTiles.CRAFTER); | ||||
|  | ||||
|         dataManager.addWatchedParameter(MODE); | ||||
|         dataManager.addParameter(HAS_ROOT); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     @Nonnull | ||||
|     public CrafterNetworkNode createNode(World world, BlockPos pos) { | ||||
|         return new CrafterNetworkNode(world, pos); | ||||
|     } | ||||
|  | ||||
|     @Nonnull | ||||
|     @Override | ||||
|     public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction direction) { | ||||
|         if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { | ||||
|             return patternsCapability.cast(); | ||||
|         } | ||||
|  | ||||
|         return super.getCapability(cap, direction); | ||||
|     } | ||||
| } | ||||
| @@ -1,45 +0,0 @@ | ||||
| package com.raoulvdberge.refinedstorage.tile; | ||||
|  | ||||
| import com.raoulvdberge.refinedstorage.RSTiles; | ||||
| import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNodeCrafter; | ||||
| import com.raoulvdberge.refinedstorage.screen.TileDataParameterClientListenerCrafter; | ||||
| import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter; | ||||
| import net.minecraft.network.datasync.DataSerializers; | ||||
| import net.minecraft.util.math.BlockPos; | ||||
| import net.minecraft.world.World; | ||||
|  | ||||
| import javax.annotation.Nonnull; | ||||
|  | ||||
| public class TileCrafter extends NetworkNodeTile<NetworkNodeCrafter> { | ||||
|     public static final TileDataParameter<String, TileCrafter> NAME = new TileDataParameter<>(DataSerializers.STRING, NetworkNodeCrafter.DEFAULT_NAME, t -> t.getNode().getName()); | ||||
|     public static final TileDataParameter<Integer, TileCrafter> MODE = new TileDataParameter<>(DataSerializers.VARINT, NetworkNodeCrafter.CrafterMode.IGNORE.ordinal(), t -> t.getNode().getMode().ordinal(), (t, v) -> t.getNode().setMode(NetworkNodeCrafter.CrafterMode.getById(v))); | ||||
|     private static final TileDataParameter<Boolean, TileCrafter> HAS_ROOT = new TileDataParameter<>(DataSerializers.BOOLEAN, false, t -> t.getNode().getRootContainerNotSelf().isPresent(), null, (t, v) -> new TileDataParameterClientListenerCrafter().onChanged(t, v)); | ||||
|  | ||||
|     public TileCrafter() { | ||||
|         super(RSTiles.CRAFTER); | ||||
|  | ||||
|         dataManager.addWatchedParameter(NAME); | ||||
|         dataManager.addWatchedParameter(MODE); | ||||
|         dataManager.addParameter(HAS_ROOT); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     @Nonnull | ||||
|     public NetworkNodeCrafter createNode(World world, BlockPos pos) { | ||||
|         return new NetworkNodeCrafter(world, pos); | ||||
|     } | ||||
|  | ||||
|     /* TODO @Override | ||||
|     public boolean hasCapability(@Nonnull Capability<?> capability, @Nullable Direction facing) { | ||||
|         return capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY || super.hasCapability(capability, facing); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public <T> T getCapability(@Nonnull Capability<T> capability, @Nullable Direction facing) { | ||||
|         if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { | ||||
|             return CapabilityItemHandler.ITEM_HANDLER_CAPABILITY.cast(getNode().getPatternItems()); | ||||
|         } | ||||
|  | ||||
|         return super.getCapability(capability, facing); | ||||
|     }*/ | ||||
| } | ||||
							
								
								
									
										175
									
								
								src/main/resources/assets/refinedstorage/blockstates/crafter.json
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										175
									
								
								src/main/resources/assets/refinedstorage/blockstates/crafter.json
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							| @@ -1,135 +1,52 @@ | ||||
| { | ||||
|   "forge_marker": 1, | ||||
|   "defaults": { | ||||
|     "model": "refinedstorage:cube_cutout", | ||||
|     "textures": { | ||||
|       "particle": "refinedstorage:blocks/crafter/side", | ||||
|       "side": "refinedstorage:blocks/crafter/side", | ||||
|       "side_90": "refinedstorage:blocks/crafter/side_90", | ||||
|       "side_180": "refinedstorage:blocks/crafter/side_180", | ||||
|       "side_270": "refinedstorage:blocks/crafter/side_270", | ||||
|       "cutout_side": "refinedstorage:blocks/crafter/cutouts/side_disconnected", | ||||
|       "cutout_side_90": "refinedstorage:blocks/crafter/cutouts/side_disconnected_90", | ||||
|       "cutout_side_180": "refinedstorage:blocks/crafter/cutouts/side_disconnected_180", | ||||
|       "cutout_side_270": "refinedstorage:blocks/crafter/cutouts/side_disconnected_270", | ||||
|       "front": "refinedstorage:blocks/crafter/front", | ||||
|       "cutout_front": "refinedstorage:blocks/crafter/cutouts/front_disconnected" | ||||
|     }, | ||||
|     "uvlock": true | ||||
|   }, | ||||
|   "variants": { | ||||
|     "connected": { | ||||
|       "true": { | ||||
|         "textures": { | ||||
|           "cutout_side": "refinedstorage:blocks/crafter/cutouts/side_connected", | ||||
|           "cutout_side_90": "refinedstorage:blocks/crafter/cutouts/side_connected_90", | ||||
|           "cutout_side_180": "refinedstorage:blocks/crafter/cutouts/side_connected_180", | ||||
|           "cutout_side_270": "refinedstorage:blocks/crafter/cutouts/side_connected_270", | ||||
|           "cutout_front": "refinedstorage:blocks/crafter/cutouts/front_connected" | ||||
|         } | ||||
|       }, | ||||
|       "false": { | ||||
|         "textures": { | ||||
|         } | ||||
|       } | ||||
|     "connected=false,direction=north": { | ||||
|       "model": "refinedstorage:block/crafter/disconnected/north", | ||||
|       "uvlock": true | ||||
|     }, | ||||
|     "direction": { | ||||
|       "north": { | ||||
|         "textures": { | ||||
|           "down": "#side_180", | ||||
|           "up": "#side", | ||||
|           "north": "#front", | ||||
|           "east": "#side_90", | ||||
|           "south": "refinedstorage:blocks/crafter/bottom", | ||||
|           "west": "#side_270", | ||||
|           "cutout_down": "#cutout_side_180", | ||||
|           "cutout_up": "#cutout_side", | ||||
|           "cutout_north": "#cutout_front", | ||||
|           "cutout_east": "#cutout_side_90", | ||||
|           "cutout_south": "refinedstorage:blocks/crafter/bottom", | ||||
|           "cutout_west": "#cutout_side_270" | ||||
|         } | ||||
|       }, | ||||
|       "east": { | ||||
|         "textures": { | ||||
|           "down": "#side_90", | ||||
|           "up": "#side_90", | ||||
|           "north": "#side_270", | ||||
|           "east": "#front", | ||||
|           "south": "#side_90", | ||||
|           "west": "refinedstorage:blocks/crafter/bottom", | ||||
|           "cutout_down": "#cutout_side_90", | ||||
|           "cutout_up": "#cutout_side_90", | ||||
|           "cutout_north": "#cutout_side_270", | ||||
|           "cutout_east": "#cutout_front", | ||||
|           "cutout_south": "#cutout_side_90", | ||||
|           "cutout_west": "refinedstorage:blocks/crafter/bottom" | ||||
|         } | ||||
|       }, | ||||
|       "south": { | ||||
|         "textures": { | ||||
|           "down": "#side", | ||||
|           "up": "#side_180", | ||||
|           "north": "refinedstorage:blocks/crafter/bottom", | ||||
|           "east": "#side_270", | ||||
|           "south": "#front", | ||||
|           "west": "#side_90", | ||||
|           "cutout_down": "#cutout_side", | ||||
|           "cutout_up": "#cutout_side_180", | ||||
|           "cutout_north": "refinedstorage:blocks/crafter/bottom", | ||||
|           "cutout_east": "#cutout_side_270", | ||||
|           "cutout_south": "#cutout_front", | ||||
|           "cutout_west": "#cutout_side_90" | ||||
|         } | ||||
|       }, | ||||
|       "west": { | ||||
|         "textures": { | ||||
|           "down": "#side_270", | ||||
|           "up": "#side_270", | ||||
|           "north": "#side_90", | ||||
|           "east": "refinedstorage:blocks/crafter/bottom", | ||||
|           "south": "#side_270", | ||||
|           "west": "#front", | ||||
|           "cutout_down": "#cutout_side_270", | ||||
|           "cutout_up": "#cutout_side_270", | ||||
|           "cutout_north": "#cutout_side_90", | ||||
|           "cutout_east": "refinedstorage:blocks/crafter/bottom", | ||||
|           "cutout_south": "#cutout_side_270", | ||||
|           "cutout_west": "#cutout_front" | ||||
|         } | ||||
|       }, | ||||
|       "up": { | ||||
|         "textures": { | ||||
|           "down": "refinedstorage:blocks/crafter/bottom", | ||||
|           "up": "#front", | ||||
|           "north": "#side", | ||||
|           "east": "#side", | ||||
|           "south": "#side", | ||||
|           "west": "#side", | ||||
|           "cutout_down": "refinedstorage:blocks/crafter/bottom", | ||||
|           "cutout_up": "#cutout_front", | ||||
|           "cutout_north": "#cutout_side", | ||||
|           "cutout_east": "#cutout_side", | ||||
|           "cutout_south": "#cutout_side", | ||||
|           "cutout_west": "#cutout_side" | ||||
|         } | ||||
|       }, | ||||
|       "down": { | ||||
|         "textures": { | ||||
|           "down": "#front", | ||||
|           "up": "refinedstorage:blocks/crafter/bottom", | ||||
|           "north": "#side_180", | ||||
|           "east": "#side_180", | ||||
|           "south": "#side_180", | ||||
|           "west": "#side_180", | ||||
|           "cutout_down": "#cutout_front", | ||||
|           "cutout_up": "refinedstorage:blocks/crafter/bottom", | ||||
|           "cutout_north": "#cutout_side_180", | ||||
|           "cutout_east": "#cutout_side_180", | ||||
|           "cutout_south": "#cutout_side_180", | ||||
|           "cutout_west": "#cutout_side_180" | ||||
|         } | ||||
|       } | ||||
|     "connected=false,direction=east": { | ||||
|       "model": "refinedstorage:block/crafter/disconnected/east", | ||||
|       "uvlock": true | ||||
|     }, | ||||
|     "connected=false,direction=south": { | ||||
|       "model": "refinedstorage:block/crafter/disconnected/south", | ||||
|       "uvlock": true | ||||
|     }, | ||||
|     "connected=false,direction=west": { | ||||
|       "model": "refinedstorage:block/crafter/disconnected/west", | ||||
|       "uvlock": true | ||||
|     }, | ||||
|     "connected=false,direction=up": { | ||||
|       "model": "refinedstorage:block/crafter/disconnected/up", | ||||
|       "uvlock": true | ||||
|     }, | ||||
|     "connected=false,direction=down": { | ||||
|       "model": "refinedstorage:block/crafter/disconnected/down", | ||||
|       "uvlock": true | ||||
|     }, | ||||
|     "connected=true,direction=north": { | ||||
|       "model": "refinedstorage:block/crafter/connected/north", | ||||
|       "uvlock": true | ||||
|     }, | ||||
|     "connected=true,direction=east": { | ||||
|       "model": "refinedstorage:block/crafter/connected/east", | ||||
|       "uvlock": true | ||||
|     }, | ||||
|     "connected=true,direction=south": { | ||||
|       "model": "refinedstorage:block/crafter/connected/south", | ||||
|       "uvlock": true | ||||
|     }, | ||||
|     "connected=true,direction=west": { | ||||
|       "model": "refinedstorage:block/crafter/connected/west", | ||||
|       "uvlock": true | ||||
|     }, | ||||
|     "connected=true,direction=up": { | ||||
|       "model": "refinedstorage:block/crafter/connected/up", | ||||
|       "uvlock": true | ||||
|     }, | ||||
|     "connected=true,direction=down": { | ||||
|       "model": "refinedstorage:block/crafter/connected/down", | ||||
|       "uvlock": true | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @@ -46,7 +46,7 @@ | ||||
|   "gui.refinedstorage:crafting_monitor.crafter_is_locked": "Crafter is locked", | ||||
|   "gui.refinedstorage.wireless_transmitter": "Wireless Transmitter", | ||||
|   "gui.refinedstorage.wireless_transmitter.distance": "%d block(s)", | ||||
|   "gui.refinedstorage:crafter": "Crafter", | ||||
|   "gui.refinedstorage.crafter": "Crafter", | ||||
|   "gui.refinedstorage.filter": "Filter", | ||||
|   "gui.refinedstorage.filter.compare_nbt": "NBT", | ||||
|   "gui.refinedstorage.filter.mod_filter": "Mod filter", | ||||
| @@ -205,7 +205,7 @@ | ||||
|   "block.refinedstorage:crafting_monitor": "Crafting Monitor", | ||||
|   "block.refinedstorage.wireless_transmitter": "Wireless Transmitter", | ||||
|   "block.refinedstorage.wireless_transmitter.tooltip": "Must be placed on %s.", | ||||
|   "block.refinedstorage:crafter": "Crafter", | ||||
|   "block.refinedstorage.crafter": "Crafter", | ||||
|   "block.refinedstorage.network_receiver": "Network Receiver", | ||||
|   "block.refinedstorage.network_transmitter": "Network Transmitter", | ||||
|   "block.refinedstorage.fluid_interface": "Fluid Interface", | ||||
|   | ||||
| @@ -0,0 +1,18 @@ | ||||
| { | ||||
|   "parent": "refinedstorage:block/cube_cutout", | ||||
|   "textures": { | ||||
|     "particle": "refinedstorage:block/crafter/side", | ||||
|     "down": "refinedstorage:block/crafter/front", | ||||
|     "up": "refinedstorage:block/crafter/bottom", | ||||
|     "north": "refinedstorage:block/crafter/side_180", | ||||
|     "east": "refinedstorage:block/crafter/side_180", | ||||
|     "south": "refinedstorage:block/crafter/side_180", | ||||
|     "west": "refinedstorage:block/crafter/side_180", | ||||
|     "cutout_down": "refinedstorage:block/crafter/cutouts/front_connected", | ||||
|     "cutout_up": "refinedstorage:block/crafter/bottom", | ||||
|     "cutout_north": "refinedstorage:block/crafter/cutouts/side_connected_180", | ||||
|     "cutout_east": "refinedstorage:block/crafter/cutouts/side_connected_180", | ||||
|     "cutout_south": "refinedstorage:block/crafter/cutouts/side_connected_180", | ||||
|     "cutout_west": "refinedstorage:block/crafter/cutouts/side_connected_180" | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,18 @@ | ||||
| { | ||||
|   "parent": "refinedstorage:block/cube_cutout", | ||||
|   "textures": { | ||||
|     "particle": "refinedstorage:block/crafter/side", | ||||
|     "down": "refinedstorage:block/crafter/side_90", | ||||
|     "up": "refinedstorage:block/crafter/side_90", | ||||
|     "north": "refinedstorage:block/crafter/side_270", | ||||
|     "east": "refinedstorage:block/crafter/front", | ||||
|     "south": "refinedstorage:block/crafter/side_90", | ||||
|     "west": "refinedstorage:block/crafter/bottom", | ||||
|     "cutout_down": "refinedstorage:block/crafter/cutouts/side_connected_90", | ||||
|     "cutout_up": "refinedstorage:block/crafter/cutouts/side_connected_90", | ||||
|     "cutout_north": "refinedstorage:block/crafter/cutouts/side_connected_270", | ||||
|     "cutout_east": "refinedstorage:block/crafter/cutouts/front_connected", | ||||
|     "cutout_south": "refinedstorage:block/crafter/cutouts/side_connected_90", | ||||
|     "cutout_west": "refinedstorage:block/crafter/bottom" | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,18 @@ | ||||
| { | ||||
|   "parent": "refinedstorage:block/cube_cutout", | ||||
|   "textures": { | ||||
|     "particle": "refinedstorage:block/crafter/side", | ||||
|     "down": "refinedstorage:block/crafter/side_180", | ||||
|     "up": "refinedstorage:block/crafter/side", | ||||
|     "north": "refinedstorage:block/crafter/front", | ||||
|     "east": "refinedstorage:block/crafter/side_90", | ||||
|     "south": "refinedstorage:block/crafter/bottom", | ||||
|     "west": "refinedstorage:block/crafter/side_270", | ||||
|     "cutout_down": "refinedstorage:block/crafter/cutouts/side_connected_180", | ||||
|     "cutout_up": "refinedstorage:block/crafter/cutouts/side_connected", | ||||
|     "cutout_north": "refinedstorage:block/crafter/cutouts/front_connected", | ||||
|     "cutout_east": "refinedstorage:block/crafter/cutouts/side_connected_90", | ||||
|     "cutout_south": "refinedstorage:block/crafter/bottom", | ||||
|     "cutout_west": "refinedstorage:block/crafter/cutouts/side_connected_270" | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,18 @@ | ||||
| { | ||||
|   "parent": "refinedstorage:block/cube_cutout", | ||||
|   "textures": { | ||||
|     "particle": "refinedstorage:block/crafter/side", | ||||
|     "down": "refinedstorage:block/crafter/side", | ||||
|     "up": "refinedstorage:block/crafter/side_180", | ||||
|     "north": "refinedstorage:block/crafter/bottom", | ||||
|     "east": "refinedstorage:block/crafter/side_270", | ||||
|     "south": "refinedstorage:block/crafter/front", | ||||
|     "west": "refinedstorage:block/crafter/side_90", | ||||
|     "cutout_down": "refinedstorage:block/crafter/cutouts/side_connected", | ||||
|     "cutout_up": "refinedstorage:block/crafter/cutouts/side_connected_180", | ||||
|     "cutout_north": "refinedstorage:block/crafter/bottom", | ||||
|     "cutout_east": "refinedstorage:block/crafter/cutouts/side_connected_270", | ||||
|     "cutout_south": "refinedstorage:block/crafter/cutouts/front_connected", | ||||
|     "cutout_west": "refinedstorage:block/crafter/cutouts/side_connected_90" | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,18 @@ | ||||
| { | ||||
|   "parent": "refinedstorage:block/cube_cutout", | ||||
|   "textures": { | ||||
|     "particle": "refinedstorage:block/crafter/side", | ||||
|     "down": "refinedstorage:block/crafter/bottom", | ||||
|     "up": "refinedstorage:block/crafter/front", | ||||
|     "north": "refinedstorage:block/crafter/side", | ||||
|     "east": "refinedstorage:block/crafter/side", | ||||
|     "south": "refinedstorage:block/crafter/side", | ||||
|     "west": "refinedstorage:block/crafter/side", | ||||
|     "cutout_down": "refinedstorage:block/crafter/bottom", | ||||
|     "cutout_up": "refinedstorage:block/crafter/cutouts/front_connected", | ||||
|     "cutout_north": "refinedstorage:block/crafter/cutouts/side_connected", | ||||
|     "cutout_east": "refinedstorage:block/crafter/cutouts/side_connected", | ||||
|     "cutout_south": "refinedstorage:block/crafter/cutouts/side_connected", | ||||
|     "cutout_west": "refinedstorage:block/crafter/cutouts/side_connected" | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,18 @@ | ||||
| { | ||||
|   "parent": "refinedstorage:block/cube_cutout", | ||||
|   "textures": { | ||||
|     "particle": "refinedstorage:block/crafter/side", | ||||
|     "down": "refinedstorage:block/crafter/side_270", | ||||
|     "up": "refinedstorage:block/crafter/side_270", | ||||
|     "north": "refinedstorage:block/crafter/side_90", | ||||
|     "east": "refinedstorage:block/crafter/bottom", | ||||
|     "south": "refinedstorage:block/crafter/side_270", | ||||
|     "west": "refinedstorage:block/crafter/front", | ||||
|     "cutout_down": "refinedstorage:block/crafter/cutouts/side_connected_270", | ||||
|     "cutout_up": "refinedstorage:block/crafter/cutouts/side_connected_270", | ||||
|     "cutout_north": "refinedstorage:block/crafter/cutouts/side_connected_90", | ||||
|     "cutout_east": "refinedstorage:block/crafter/bottom", | ||||
|     "cutout_south": "refinedstorage:block/crafter/cutouts/side_connected_270", | ||||
|     "cutout_west": "refinedstorage:block/crafter/cutouts/front_connected" | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,18 @@ | ||||
| { | ||||
|   "parent": "refinedstorage:block/cube_cutout", | ||||
|   "textures": { | ||||
|     "particle": "refinedstorage:block/crafter/side", | ||||
|     "down": "refinedstorage:block/crafter/front", | ||||
|     "up": "refinedstorage:block/crafter/bottom", | ||||
|     "north": "refinedstorage:block/crafter/side_180", | ||||
|     "east": "refinedstorage:block/crafter/side_180", | ||||
|     "south": "refinedstorage:block/crafter/side_180", | ||||
|     "west": "refinedstorage:block/crafter/side_180", | ||||
|     "cutout_down": "refinedstorage:block/crafter/cutouts/front_disconnected", | ||||
|     "cutout_up": "refinedstorage:block/crafter/bottom", | ||||
|     "cutout_north": "refinedstorage:block/crafter/cutouts/side_disconnected_180", | ||||
|     "cutout_east": "refinedstorage:block/crafter/cutouts/side_disconnected_180", | ||||
|     "cutout_south": "refinedstorage:block/crafter/cutouts/side_disconnected_180", | ||||
|     "cutout_west": "refinedstorage:block/crafter/cutouts/side_disconnected_180" | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,18 @@ | ||||
| { | ||||
|   "parent": "refinedstorage:block/cube_cutout", | ||||
|   "textures": { | ||||
|     "particle": "refinedstorage:block/crafter/side", | ||||
|     "down": "refinedstorage:block/crafter/side_90", | ||||
|     "up": "refinedstorage:block/crafter/side_90", | ||||
|     "north": "refinedstorage:block/crafter/side_270", | ||||
|     "east": "refinedstorage:block/crafter/front", | ||||
|     "south": "refinedstorage:block/crafter/side_90", | ||||
|     "west": "refinedstorage:block/crafter/bottom", | ||||
|     "cutout_down": "refinedstorage:block/crafter/cutouts/side_disconnected_90", | ||||
|     "cutout_up": "refinedstorage:block/crafter/cutouts/side_disconnected_90", | ||||
|     "cutout_north": "refinedstorage:block/crafter/cutouts/side_disconnected_270", | ||||
|     "cutout_east": "refinedstorage:block/crafter/cutouts/front_disconnected", | ||||
|     "cutout_south": "refinedstorage:block/crafter/cutouts/side_disconnected_90", | ||||
|     "cutout_west": "refinedstorage:block/crafter/bottom" | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,18 @@ | ||||
| { | ||||
|   "parent": "refinedstorage:block/cube_cutout", | ||||
|   "textures": { | ||||
|     "particle": "refinedstorage:block/crafter/side", | ||||
|     "down": "refinedstorage:block/crafter/side_180", | ||||
|     "up": "refinedstorage:block/crafter/side", | ||||
|     "north": "refinedstorage:block/crafter/front", | ||||
|     "east": "refinedstorage:block/crafter/side_90", | ||||
|     "south": "refinedstorage:block/crafter/bottom", | ||||
|     "west": "refinedstorage:block/crafter/side_270", | ||||
|     "cutout_down": "refinedstorage:block/crafter/cutouts/side_disconnected_180", | ||||
|     "cutout_up": "refinedstorage:block/crafter/cutouts/side_disconnected", | ||||
|     "cutout_north": "refinedstorage:block/crafter/cutouts/front_disconnected", | ||||
|     "cutout_east": "refinedstorage:block/crafter/cutouts/side_disconnected_90", | ||||
|     "cutout_south": "refinedstorage:block/crafter/bottom", | ||||
|     "cutout_west": "refinedstorage:block/crafter/cutouts/side_disconnected_270" | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,18 @@ | ||||
| { | ||||
|   "parent": "refinedstorage:block/cube_cutout", | ||||
|   "textures": { | ||||
|     "particle": "refinedstorage:block/crafter/side", | ||||
|     "down": "refinedstorage:block/crafter/side", | ||||
|     "up": "refinedstorage:block/crafter/side_180", | ||||
|     "north": "refinedstorage:block/crafter/bottom", | ||||
|     "east": "refinedstorage:block/crafter/side_270", | ||||
|     "south": "refinedstorage:block/crafter/front", | ||||
|     "west": "refinedstorage:block/crafter/side_90", | ||||
|     "cutout_down": "refinedstorage:block/crafter/cutouts/side_disconnected", | ||||
|     "cutout_up": "refinedstorage:block/crafter/cutouts/side_disconnected_180", | ||||
|     "cutout_north": "refinedstorage:block/crafter/bottom", | ||||
|     "cutout_east": "refinedstorage:block/crafter/cutouts/side_disconnected_270", | ||||
|     "cutout_south": "refinedstorage:block/crafter/cutouts/front_disconnected", | ||||
|     "cutout_west": "refinedstorage:block/crafter/cutouts/side_disconnected_90" | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,18 @@ | ||||
| { | ||||
|   "parent": "refinedstorage:block/cube_cutout", | ||||
|   "textures": { | ||||
|     "particle": "refinedstorage:block/crafter/side", | ||||
|     "down": "refinedstorage:block/crafter/bottom", | ||||
|     "up": "refinedstorage:block/crafter/front", | ||||
|     "north": "refinedstorage:block/crafter/side", | ||||
|     "east": "refinedstorage:block/crafter/side", | ||||
|     "south": "refinedstorage:block/crafter/side", | ||||
|     "west": "refinedstorage:block/crafter/side", | ||||
|     "cutout_down": "refinedstorage:block/crafter/bottom", | ||||
|     "cutout_up": "refinedstorage:block/crafter/cutouts/front_disconnected", | ||||
|     "cutout_north": "refinedstorage:block/crafter/cutouts/side_disconnected", | ||||
|     "cutout_east": "refinedstorage:block/crafter/cutouts/side_disconnected", | ||||
|     "cutout_south": "refinedstorage:block/crafter/cutouts/side_disconnected", | ||||
|     "cutout_west": "refinedstorage:block/crafter/cutouts/side_disconnected" | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,18 @@ | ||||
| { | ||||
|   "parent": "refinedstorage:block/cube_cutout", | ||||
|   "textures": { | ||||
|     "particle": "refinedstorage:block/crafter/side", | ||||
|     "down": "refinedstorage:block/crafter/side_270", | ||||
|     "up": "refinedstorage:block/crafter/side_270", | ||||
|     "north": "refinedstorage:block/crafter/side_90", | ||||
|     "east": "refinedstorage:block/crafter/bottom", | ||||
|     "south": "refinedstorage:block/crafter/side_270", | ||||
|     "west": "refinedstorage:block/crafter/front", | ||||
|     "cutout_down": "refinedstorage:block/crafter/cutouts/side_disconnected_270", | ||||
|     "cutout_up": "refinedstorage:block/crafter/cutouts/side_disconnected_270", | ||||
|     "cutout_north": "refinedstorage:block/crafter/cutouts/side_disconnected_90", | ||||
|     "cutout_east": "refinedstorage:block/crafter/bottom", | ||||
|     "cutout_south": "refinedstorage:block/crafter/cutouts/side_disconnected_270", | ||||
|     "cutout_west": "refinedstorage:block/crafter/cutouts/front_disconnected" | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,3 @@ | ||||
| { | ||||
|   "parent": "refinedstorage:block/crafter/disconnected/north" | ||||
| } | ||||
| @@ -0,0 +1,24 @@ | ||||
| { | ||||
|   "type": "minecraft:block", | ||||
|   "pools": [ | ||||
|     { | ||||
|       "rolls": 1, | ||||
|       "entries": [ | ||||
|         { | ||||
|           "type": "minecraft:item", | ||||
|           "name": "refinedstorage:crafter", | ||||
|           "functions": [ | ||||
|             { | ||||
|               "function": "refinedstorage:crafter" | ||||
|             } | ||||
|           ] | ||||
|         } | ||||
|       ], | ||||
|       "conditions": [ | ||||
|         { | ||||
|           "condition": "minecraft:survives_explosion" | ||||
|         } | ||||
|       ] | ||||
|     } | ||||
|   ] | ||||
| } | ||||
| @@ -10,16 +10,16 @@ | ||||
|       "item": "refinedstorage:quartz_enriched_iron" | ||||
|     }, | ||||
|     "C": { | ||||
|       "item": "#construction_core" | ||||
|       "item": "refinedstorage:construction_core" | ||||
|     }, | ||||
|     "A": { | ||||
|       "item": "#advanced_processor" | ||||
|       "item": "refinedstorage:advanced_processor" | ||||
|     }, | ||||
|     "M": { | ||||
|       "item": "refinedstorage:machine_casing" | ||||
|     }, | ||||
|     "D": { | ||||
|       "item": "#destruction_core" | ||||
|       "item": "refinedstorage:destruction_core" | ||||
|     } | ||||
|   }, | ||||
|   "result": { | ||||
		Reference in New Issue
	
	Block a user
	 raoulvdberge
					raoulvdberge