diff --git a/dependencies.gradle b/dependencies.gradle index 3d1caadf..bdc75955 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -38,7 +38,7 @@ dependencies { // TODO: remove MUI1 dep when the implicit dependency // TODO: in IItemHandlerModifiable is removed api("com.github.GTNewHorizons:ModularUI:1.3.1:dev") - api("com.github.GTNewHorizons:ModularUI2:2.3.23-1.7.10:dev") + api("com.github.GTNewHorizons:ModularUI2:2.3.63-1.7.10:dev") api("com.github.GTNewHorizons:CraftTweaker:3.4.2:dev") api('curse.maven:cofh-lib-220333:2388748') compileOnly('thaumcraft:Thaumcraft:1.7.10-4.2.3.5:dev') diff --git a/gradlew b/gradlew old mode 100755 new mode 100644 diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java index 8e9eab1a..b713d741 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModBlocks.java @@ -1,5 +1,11 @@ package com.fouristhenumber.utilitiesinexcess; +import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe.BlockCrossoverPipe; +import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe.BlockFilterPipe; +import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe.BlockHyperRationingPipe; +import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe.BlockModSortingPipe; +import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe.BlockRationingPipe; +import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe.BlockSortingPipe; import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.item.Item; @@ -53,13 +59,13 @@ import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockRedstoneGenerator; import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockSolarGenerator; import com.fouristhenumber.utilitiesinexcess.common.blocks.generators.BlockTNTGenerator; -import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockRetrievalNode; +//import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockRetrievalNode; import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockRetrievalNodeFluid; import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockTransferNode; import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockTransferNodeEnergy; -import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockTransferNodeFluid; +//import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockTransferNodeFluid; import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockTransferNodeHyperEnergy; -import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockTransferPipe; +import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe.BlockTransferPipe; import com.fouristhenumber.utilitiesinexcess.config.blocks.BlockConfig; import com.fouristhenumber.utilitiesinexcess.config.blocks.CursedEarthConfig; import com.fouristhenumber.utilitiesinexcess.config.blocks.EnderLotusConfig; @@ -166,11 +172,17 @@ public enum ModBlocks { DECORATIVE_BLOCKS(BlockConfig.enableDecorativeBlocks, new BlockDecorative(), BlockDecorative.ItemBlockDecorative.class, "decorative_block"), //TODO: Config TRANSFER_PIPE(true, new BlockTransferPipe(), "transfer_pipe"), + CROSSOVER_PIPE(true, new BlockCrossoverPipe(), "crossover_pipe"), + SORTING_PIPE(true, new BlockSortingPipe(), "sorting_pipe"), + MOD_SORTING_PIPE(true, new BlockModSortingPipe(), "mod_sorting_pipe"), + RATIONING_PIPE(true, new BlockRationingPipe(), "rationing_pipe"), + HYPER_RATIONING_PIPE(true, new BlockHyperRationingPipe(), "hyper_rationing_pipe"), + FILTER_PIPE(true, new BlockFilterPipe(), "filter_pipe"), TRANSFER_NODE(true, new BlockTransferNode(), "transfer_node"), - TRANSFER_NODE_FLUID(true, new BlockTransferNodeFluid(), "transfer_node_fluid"), +// TRANSFER_NODE_FLUID(true, new BlockTransferNodeFluid(), "transfer_node_fluid"), TRANSFER_NODE_ENERGY(true, new BlockTransferNodeEnergy(), "transfer_node_energy"), TRANSFER_NODE_HYPER_ENERGY(true, new BlockTransferNodeHyperEnergy(), "transfer_node_hyper_energy"), - RETRIEVAL_NODE(true, new BlockRetrievalNode(), "retrieval_node"), +// RETRIEVAL_NODE(true, new BlockRetrievalNode(), "retrieval_node"), RETRIEVAL_NODE_FLUID(true, new BlockRetrievalNodeFluid(), "retrieval_node_fluid"), CHANDELIER(BlockConfig.chandelier.enableChandelier, new BlockChandelier(), BlockChandelier.ItemBlockChandelier.class, "chandelier"), GIGA_TORCH(BlockConfig.gigaTorch.enableGigaTorch, new BlockGigaTorch(), BlockGigaTorch.ItemBlockGigaTorch.class, "giga_torch"), diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModItems.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModItems.java index d6f361a8..a86e383a 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/ModItems.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/ModItems.java @@ -40,6 +40,7 @@ import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.ReversingHoeConfig; import cpw.mods.fml.common.registry.GameRegistry; +import net.minecraftforge.oredict.OreDictionary; // Credit to Et Futurum (Requiem) public enum ModItems { @@ -61,7 +62,7 @@ public enum ModItems { INVERSION_SIGIL_ACTIVE(InversionConfig.enableInversionSigil, new ItemInversionSigilActive(), "inversion_sigil_active"), PSEUDO_INVERSION_SIGIL(InversionConfig.enableInversionSigil, new ItemPseudoInversionSigil(), "pseudo_inversion_sigil"), INVERTED_INGOT(InversionConfig.enableInvertedIngot, new ItemInvertedIngot(), "inverted_ingot"), - INVERTED_NUGGET(InversionConfig.enableInvertedIngot, new ItemInvertedIngot.InvertedNugget(), "inverted_nugget"), + INVERTED_NUGGET(InversionConfig.enableInvertedIngot, new ItemInvertedIngot.InvertedNugget(), "inverted_nugget", "nuggetInverted"), ARCHITECTS_WAND(ItemConfig.enableArchitectsWand, new ItemArchitectsWand(ItemConfig.architectsWandBuildLimit).setTextureName("utilitiesinexcess:architects_wand"), "architects_wand"), SUPER_ARCHITECTS_WAND(ItemConfig.enableSuperArchitectsWand, new ItemArchitectsWand(ItemConfig.superArchitectsWandBuildLimit).setTextureName("utilitiesinexcess:super_architects_wand"), "super_architects_wand"), BEDROCKIUM_INGOT(ItemConfig.enableBedrockium, new ItemBedrockiumIngot().setUnlocalizedName("bedrockium_ingot").setTextureName("utilitiesinexcess:bedrockium_ingot"), "bedrockium_ingot"), @@ -91,13 +92,21 @@ public static void init() { private final Item theItem; private final String name; private final ItemDisabled disabledVersion; + private final String[] oreDictNames; - ModItems(boolean enabled, Item item, String name) { + ModItems(boolean enabled, Item item, String name, String... oreDictNames) { this.isEnabled = enabled; theItem = item; this.name = name; - if (ItemConfig.registerDisabledItems) disabledVersion = new ItemDisabled(theItem); - else disabledVersion = null; + this.oreDictNames = oreDictNames; + if (ItemConfig.registerDisabledItems) + { + disabledVersion = new ItemDisabled(theItem); + } + else + { + disabledVersion = null; + } } public boolean isEnabled() { @@ -119,4 +128,16 @@ public ItemStack newItemStack(int count) { public ItemStack newItemStack(int count, int meta) { return new ItemStack(this.get(), count, meta); } + + public static void registerOreDict() { + for (ModItems item : VALUES) { + if (!item.isEnabled()) continue; + if (item.oreDictNames == null) continue; + + for (String oreName : item.oreDictNames) { + OreDictionary.registerOre(oreName, item.newItemStack()); + } + } + } + } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java index b6dde939..06843936 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/UtilitiesInExcess.java @@ -1,5 +1,14 @@ package com.fouristhenumber.utilitiesinexcess; +import codechicken.lib.world.TileChunkLoadHook; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityCrossoverPipe; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityFilterPipe; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityHyperRationingPipe; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityModSortingPipe; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityRationingPipe; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntitySortingPipe; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityTransferPipe; +import com.fouristhenumber.utilitiesinexcess.utils.ColoredSlots; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -50,9 +59,7 @@ import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityRedstoneGenerator; import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntitySolarGenerator; import com.fouristhenumber.utilitiesinexcess.common.tileentities.generators.TileEntityTNTGenerator; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNode; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNodeFluid; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferPipe; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityItemTransferNode; import com.fouristhenumber.utilitiesinexcess.common.worldgen.WorldGenEnderLotus; import com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.FMPRecipeLoader; import com.fouristhenumber.utilitiesinexcess.compat.ForgeMultipart.multipart.Content; @@ -113,7 +120,7 @@ public void preInit(FMLPreInitializationEvent event) { @Mod.EventHandler public void init(FMLInitializationEvent event) { proxy.init(event); - + TileChunkLoadHook.init(); RecipeLoader.run(); MinecraftForge.EVENT_BUS.register(new ForgeEventHandler()); @@ -164,8 +171,15 @@ public void init(FMLInitializationEvent event) { GameRegistry.registerTileEntity(TileEntityPacifistsBench.class, "TileEntityPacifistsBenchUIE"); GameRegistry.registerTileEntity(TileEntityTradingPost.class, "TileEntityTradingPostUIE"); GameRegistry.registerTileEntity(TileEntityTransferPipe.class, "TileEntityTransferPipeUIE"); - GameRegistry.registerTileEntity(TileEntityTransferNode.class, "TileEntityTransferNodeUIE"); - GameRegistry.registerTileEntity(TileEntityTransferNodeFluid.class, "TileEntityTransferNodeFluidUIE"); + GameRegistry.registerTileEntity(TileEntityCrossoverPipe.class, "TileEntityCrossoverPipeUIE"); + GameRegistry.registerTileEntity(TileEntitySortingPipe.class, "TileEntitySortingPipeUIE"); + GameRegistry.registerTileEntity(TileEntityRationingPipe.class, "TileEntityRationingPipeUIE"); + GameRegistry.registerTileEntity(TileEntityHyperRationingPipe.class, "TileEntityHyperRationingPipe"); + GameRegistry.registerTileEntity(TileEntityFilterPipe.class, "TileEntityFilterPipe"); + GameRegistry.registerTileEntity(TileEntityModSortingPipe.class, "TileEntityModSortingPipe"); +// GameRegistry.registerTileEntity(TileEntityRetrievalNode.class,"TileEntityRetrievalNodeUIE"); // not sure if i did the naming correctly + GameRegistry.registerTileEntity(TileEntityItemTransferNode.class, "TileEntityTransferNodeUIE"); +// GameRegistry.registerTileEntity(TileEntityTransferNodeFluid.class, "TileEntityTransferNodeFluidUIE"); lapisAetheriusRenderID = RenderingRegistry.getNextAvailableRenderId(); RenderingRegistry.registerBlockHandler(new LapisAetheriusRenderer()); @@ -178,6 +192,8 @@ public void init(FMLInitializationEvent event) { transferNodeRenderID = RenderingRegistry.getNextAvailableRenderId(); RenderingRegistry.registerBlockHandler(new TransferNodeRenderer()); + ColoredSlots.init(); + GameRegistry.registerWorldGenerator(new WorldGenEnderLotus(), 10); if (ModItems.ENDER_LOTUS_SEED.isEnabled()) { diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockRetrievalNode.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockRetrievalNode.java index 25c613c0..78369c9d 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockRetrievalNode.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockRetrievalNode.java @@ -1,25 +1,27 @@ -package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer; - -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; - -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNode; - -public class BlockRetrievalNode extends BlockTransferNodeBase { - - public BlockRetrievalNode() { - super(); - setBlockName("retrieval_node"); - } - - @Override - public String getTopIcon() { - return "utilitiesinexcess:retrieval_node_top"; - } - - // TODO: new TE - @Override - public TileEntity createNewTileEntity(World world, int metadata) { - return new TileEntityTransferNode(); - } -} +//package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer; +// +//import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityRetrievalNode; +//import net.minecraft.tileentity.TileEntity; +//import net.minecraft.world.World; +// +//import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNode; +// +//public class BlockRetrievalNode extends BlockTransferNodeBase { +// +// public BlockRetrievalNode() { +// super(); +// setBlockName("retrieval_node"); +// } +// +// @Override +// public String getTopIcon() { +// return "utilitiesinexcess:retrieval_node_top"; +// } +// +// // TODO: new TE +// // yes zir! +// @Override +// public TileEntity createNewTileEntity(World world, int metadata) { +// return new TileEntityRetrievalNode(); +// } +//} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockRetrievalNodeFluid.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockRetrievalNodeFluid.java index ef1121a9..6c8d7899 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockRetrievalNodeFluid.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockRetrievalNodeFluid.java @@ -1,10 +1,9 @@ package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityItemTransferNode; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNode; - public class BlockRetrievalNodeFluid extends BlockTransferNodeBase { public BlockRetrievalNodeFluid() { @@ -20,6 +19,6 @@ public String getTopIcon() { // TODO: new TE @Override public TileEntity createNewTileEntity(World world, int metadata) { - return new TileEntityTransferNode(); + return new TileEntityItemTransferNode(); } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferBase.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferBase.java new file mode 100644 index 00000000..46b47701 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferBase.java @@ -0,0 +1,32 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNodeBase; +import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public abstract class BlockTransferBase extends BlockContainer +{ + protected BlockTransferBase(Material mat) + { + super(mat); + } + + @Override + public void onNeighborBlockChange(World worldIn, int x, int y, int z, Block neighbor) + { + TileEntity te = worldIn.getTileEntity(x, y, z); + + if (te instanceof ITransferNetworkComponent component) + { + component.updateExternalConnections(); + if (component instanceof TileEntityTransferNodeBase nodeComponent) + { + nodeComponent.updateSourceInventory(); + } + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNode.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNode.java index a41f718c..b08b218d 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNode.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNode.java @@ -3,7 +3,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNode; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityItemTransferNode; public class BlockTransferNode extends BlockTransferNodeBase { @@ -14,6 +14,6 @@ public BlockTransferNode() { @Override public TileEntity createNewTileEntity(World world, int metadata) { - return new TileEntityTransferNode(); + return new TileEntityItemTransferNode(); } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeBase.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeBase.java index 6a96b2be..b5f50ea7 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeBase.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeBase.java @@ -2,6 +2,7 @@ import static com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess.transferNodeRenderID; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; @@ -21,18 +22,13 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -public class BlockTransferNodeBase extends BlockContainer { +public abstract class BlockTransferNodeBase extends BlockTransferBase { protected BlockTransferNodeBase() { super(Material.iron); setBlockTextureName(getTopIcon()); } - @Override - public TileEntity createNewTileEntity(World worldIn, int meta) { - return null; - } - @Override public boolean renderAsNormalBlock() { return false; @@ -56,18 +52,6 @@ public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer return true; } - protected void updateConnections(World world, int x, int y, int z) { - if (!world.isRemote) { - TileEntityTransferNodeBase te = (TileEntityTransferNodeBase) world.getTileEntity(x, y, z); - if (te != null) { - boolean changed = te.updateConnections(world, x, y, z); - if (changed) { - world.markBlockForUpdate(x, y, z); - } - } - } - } - @Override public int onBlockPlaced(World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int meta) { return ForgeDirection.getOrientation(side) @@ -80,12 +64,6 @@ public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase p super.onBlockPlacedBy(world, x, y, z, placer, stack); int meta = world.getBlockMetadata(x, y, z); world.setBlockMetadataWithNotify(x, y, z, meta, 2); - updateConnections(world, x, y, z); - } - - @Override - public void onNeighborBlockChange(World world, int x, int y, int z, Block neighbor) { - updateConnections(world, x, y, z); } @Override diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeEnergy.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeEnergy.java index cda3940b..3c3bc3ad 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeEnergy.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeEnergy.java @@ -1,10 +1,9 @@ package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityItemTransferNode; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNode; - public class BlockTransferNodeEnergy extends BlockTransferNodeBase { public BlockTransferNodeEnergy() { @@ -19,7 +18,8 @@ public String getTopIcon() { // TODO: new TE @Override - public TileEntity createNewTileEntity(World world, int metadata) { - return new TileEntityTransferNode(); + public TileEntity createNewTileEntity(World world, int metadata) + { + return new TileEntityItemTransferNode(); } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeFluid.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeFluid.java index df147a79..28690297 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeFluid.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeFluid.java @@ -1,24 +1,24 @@ -package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer; - -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; - -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNodeFluid; - -public class BlockTransferNodeFluid extends BlockTransferNodeBase { - - public BlockTransferNodeFluid() { - super(); - setBlockName("transfer_node_fluid"); - } - - @Override - public String getTopIcon() { - return "utilitiesinexcess:transfer_node_fluid_top"; - } - - @Override - public TileEntity createNewTileEntity(World world, int metadata) { - return new TileEntityTransferNodeFluid(); - } -} +//package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer; +// +//import net.minecraft.tileentity.TileEntity; +//import net.minecraft.world.World; +// +//import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNodeFluid; +// +//public class BlockTransferNodeFluid extends BlockTransferNodeBase { +// +// public BlockTransferNodeFluid() { +// super(); +// setBlockName("transfer_node_fluid"); +// } +// +// @Override +// public String getTopIcon() { +// return "utilitiesinexcess:transfer_node_fluid_top"; +// } +// +// @Override +// public TileEntity createNewTileEntity(World world, int metadata) { +// return new TileEntityTransferNodeFluid(); +// } +//} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeHyperEnergy.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeHyperEnergy.java index a2476fcd..3c7273d2 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeHyperEnergy.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferNodeHyperEnergy.java @@ -1,10 +1,9 @@ package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityItemTransferNode; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferNode; - public class BlockTransferNodeHyperEnergy extends BlockTransferNodeBase { public BlockTransferNodeHyperEnergy() { @@ -20,6 +19,6 @@ public String getTopIcon() { // TODO: new TE @Override public TileEntity createNewTileEntity(World world, int metadata) { - return new TileEntityTransferNode(); + return new TileEntityItemTransferNode(); } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferPipe.java deleted file mode 100644 index c3c9b919..00000000 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/BlockTransferPipe.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer; - -import static com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess.transferPipeRenderID; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; -import net.minecraft.block.material.Material; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; - -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferPipe; - -public class BlockTransferPipe extends BlockContainer { - - public BlockTransferPipe() { - super(Material.iron); - this.setBlockName("transfer_pipe"); - this.setBlockTextureName("utilitiesinexcess:transfer_pipe"); - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - public boolean hasTileEntity(int metadata) { - return true; - } - - @Override - public TileEntity createNewTileEntity(World world, int metadata) { - return new TileEntityTransferPipe(); - } - - @Override - public void onNeighborBlockChange(World world, int x, int y, int z, Block neighbor) { - updateConnections(world, x, y, z); - } - - @Override - public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase placer, ItemStack itemIn) { - updateConnections(world, x, y, z); - } - - protected void updateConnections(World world, int x, int y, int z) { - if (!world.isRemote) { - TileEntityTransferPipe te = (TileEntityTransferPipe) world.getTileEntity(x, y, z); - if (te != null) { - boolean changed = te.updateConnections(world, x, y, z); - if (changed) { - world.markBlockForUpdate(x, y, z); - } - } - } - } - - @Override - public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) { - TileEntityTransferPipe te = (TileEntityTransferPipe) world.getTileEntity(x, y, z); - if (te == null) return; - int mask = te.getConnectionsMask(); - - float minX = (mask & 1 << 1) != 0 ? 0F : 0.375F; - float maxX = (mask & 1) != 0 ? 1F : 0.625F; - float minY = (mask & 1 << 3) != 0 ? 0F : 0.375F; - float maxY = (mask & 1 << 2) != 0 ? 1F : 0.625F; - float minZ = (mask & 1 << 5) != 0 ? 0F : 0.375F; - float maxZ = (mask & 1 << 4) != 0 ? 1F : 0.625F; - this.setBlockBounds(minX, minY, minZ, maxX, maxY, maxZ); - } - - @Override - public int getRenderType() { - return transferPipeRenderID; - } -} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockCrossoverPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockCrossoverPipe.java new file mode 100644 index 00000000..85073180 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockCrossoverPipe.java @@ -0,0 +1,20 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe; + +import net.minecraft.block.material.Material; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityCrossoverPipe; + +public class BlockCrossoverPipe extends BlockPipeBase +{ + public BlockCrossoverPipe() { + super(Material.iron); + this.setBlockName("crossover_pipe"); + this.setBlockTextureName("utilitiesinexcess:transfer_pipe"); + } + + @Override + public TileEntity createNewTileEntity(World worldIn, int meta) { + return new TileEntityCrossoverPipe(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockFilterPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockFilterPipe.java new file mode 100644 index 00000000..fd44deff --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockFilterPipe.java @@ -0,0 +1,55 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe; + +import com.cleanroommc.modularui.factory.GuiFactories; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityFilterPipe; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + + +public class BlockFilterPipe extends BlockPipeBase +{ + public IIcon[] icons = new IIcon[6]; + + public BlockFilterPipe() { + super(Material.iron); + this.setBlockName("filter_pipe"); + } + + @Override + public TileEntity createNewTileEntity(World worldIn, int meta) { + return new TileEntityFilterPipe(); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister reg) + { + for (int i = 0; i < 6; i++) + { + icons[i] = reg.registerIcon("utilitiesinexcess:filter_pipe_" + i); + } + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) + { + return icons[side]; + } + + @Override + public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, + float subY, float subZ) { + if (!worldIn.isRemote) + { + GuiFactories.tileEntity().open(player, x, y, z); + } + return true; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockHyperRationingPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockHyperRationingPipe.java new file mode 100644 index 00000000..9d2d67fe --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockHyperRationingPipe.java @@ -0,0 +1,20 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe; + +import net.minecraft.block.material.Material; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityHyperRationingPipe; + +public class BlockHyperRationingPipe extends BlockPipeBase +{ + public BlockHyperRationingPipe() { + super(Material.iron); + this.setBlockName("hyper_rationing_pipe"); + this.setBlockTextureName("utilitiesinexcess:hyper_rationing_pipe"); + } + + @Override + public TileEntity createNewTileEntity(World worldIn, int meta) { + return new TileEntityHyperRationingPipe(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockModSortingPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockModSortingPipe.java new file mode 100644 index 00000000..27202b25 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockModSortingPipe.java @@ -0,0 +1,20 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityModSortingPipe; +import net.minecraft.block.material.Material; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public class BlockModSortingPipe extends BlockPipeBase +{ + public BlockModSortingPipe() { + super(Material.iron); + this.setBlockName("hyper_rationing_pipe"); + this.setBlockTextureName("utilitiesinexcess:hyper_rationing_pipe"); + } + + @Override + public TileEntity createNewTileEntity(World worldIn, int meta) { + return new TileEntityModSortingPipe(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockPipeBase.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockPipeBase.java new file mode 100644 index 00000000..792085ee --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockPipeBase.java @@ -0,0 +1,117 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe; + +import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.BlockTransferBase; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityNetworkComponentBase; +import com.fouristhenumber.utilitiesinexcess.transfer.collision.PipeCollision; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +import java.util.List; + +import static com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess.transferPipeRenderID; + +public abstract class BlockPipeBase extends BlockTransferBase +{ + + protected BlockPipeBase(Material mat) { + super(mat); + } + + @Override + public boolean renderAsNormalBlock() + { + return false; + } + + @Override + public boolean isOpaqueCube() + { + return false; + } + + @Override + public boolean hasTileEntity(int metadata) + { + return true; + } + + @Override + public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z) + { + TileEntityNetworkComponentBase te = (TileEntityNetworkComponentBase) world.getTileEntity(x, y, z); + if (te == null) return; + + int mask = te.getRawConnectionMask(); + + float minY = (mask & (1 << 0)) != 0 ? 0F : 0.375F; // DOWN (-Y) + float maxY = (mask & (1 << 1)) != 0 ? 1F : 0.625F; // UP (+Y) + + float minZ = (mask & (1 << 2)) != 0 ? 0F : 0.375F; // NORTH (-Z) + float maxZ = (mask & (1 << 3)) != 0 ? 1F : 0.625F; // SOUTH (+Z) + + float minX = (mask & (1 << 4)) != 0 ? 0F : 0.375F; // WEST (-X) + float maxX = (mask & (1 << 5)) != 0 ? 1F : 0.625F; // EAST (+X) + + this.setBlockBounds(minX, minY, minZ, maxX, maxY, maxZ); + } + + @Override + public void addCollisionBoxesToList(World worldIn, int x, int y, int z, AxisAlignedBB mask, List list, Entity collider) + { + TileEntityNetworkComponentBase te = (TileEntityNetworkComponentBase) worldIn.getTileEntity(x, y, z); + if (te == null) return; + + int connectionMask = te.getRawConnectionMask(); + + AxisAlignedBB boundingBox = PipeCollision.MIDDLE.getBoundingBox().copy().offset(x, y, z); + if (boundingBox.intersectsWith(mask)) + { + list.add(boundingBox); + } + + boundingBox = PipeCollision.DOWN.getBoundingBox().copy().offset(x, y, z); + if ((connectionMask & (1 << 0)) != 0 && boundingBox.intersectsWith(mask)) + { + list.add(boundingBox); + } + + boundingBox = PipeCollision.UP.getBoundingBox().copy().offset(x, y, z); + if ((connectionMask & (1 << 1)) != 0 && boundingBox.intersectsWith(mask)) + { + list.add(boundingBox); + } + + boundingBox = PipeCollision.NORTH.getBoundingBox().copy().offset(x, y, z); + if ((connectionMask & (1 << 2)) != 0 && boundingBox.intersectsWith(mask)) + { + list.add(boundingBox); + } + + boundingBox = PipeCollision.SOUTH.getBoundingBox().copy().offset(x, y, z); + if ((connectionMask & (1 << 3)) != 0 && boundingBox.intersectsWith(mask)) + { + list.add(boundingBox); + } + + boundingBox = PipeCollision.WEST.getBoundingBox().copy().offset(x, y, z); + if ((connectionMask & (1 << 4)) != 0 && boundingBox.intersectsWith(mask)) + { + list.add(boundingBox); + } + + boundingBox = PipeCollision.EAST.getBoundingBox().copy().offset(x, y, z); + if ((connectionMask & (1 << 5)) != 0 && boundingBox.intersectsWith(mask)) + { + list.add(boundingBox); + } + } + + @Override + public int getRenderType() + { + return transferPipeRenderID; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockRationingPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockRationingPipe.java new file mode 100644 index 00000000..1f650a47 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockRationingPipe.java @@ -0,0 +1,21 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe; + +import net.minecraft.block.material.Material; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityRationingPipe; + +public class BlockRationingPipe extends BlockPipeBase +{ + public BlockRationingPipe() { + super(Material.iron); + this.setBlockName("rationing_pipe"); + this.setBlockTextureName("utilitiesinexcess:rationing_pipe"); + } + + @Override + public TileEntity createNewTileEntity(World worldIn, int meta) { + return new TileEntityRationingPipe(); + } + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockSortingPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockSortingPipe.java new file mode 100644 index 00000000..2ee5e7bc --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockSortingPipe.java @@ -0,0 +1,21 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntitySortingPipe; +import net.minecraft.block.material.Material; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public class BlockSortingPipe extends BlockPipeBase +{ + public BlockSortingPipe() { + super(Material.iron); + this.setBlockName("sorting_pipe"); + this.setBlockTextureName("utilitiesinexcess:sorting_pipe"); + } + + @Override + public TileEntity createNewTileEntity(World world, int metadata) + { + return new TileEntitySortingPipe(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockTransferPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockTransferPipe.java new file mode 100644 index 00000000..3521fc9a --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/blocks/transfer/pipe/BlockTransferPipe.java @@ -0,0 +1,21 @@ +package com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe; + +import net.minecraft.block.material.Material; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe.TileEntityTransferPipe; + +public class BlockTransferPipe extends BlockPipeBase +{ + public BlockTransferPipe() { + super(Material.iron); + this.setBlockName("transfer_pipe"); + this.setBlockTextureName("utilitiesinexcess:transfer_pipe"); + } + + @Override + public TileEntity createNewTileEntity(World world, int metadata) + { + return new TileEntityTransferPipe(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemUpgrade.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemUpgrade.java index 96347fae..4ead893b 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemUpgrade.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/items/ItemUpgrade.java @@ -2,10 +2,32 @@ import java.util.List; +import com.cleanroommc.modularui.api.IGuiHolder; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.factory.GuiFactories; +import com.cleanroommc.modularui.factory.PlayerInventoryGuiData; +import com.cleanroommc.modularui.factory.inventory.InventoryTypes; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.ModularScreen; +import com.cleanroommc.modularui.screen.UISettings; +import com.cleanroommc.modularui.utils.item.IItemHandler; +import com.cleanroommc.modularui.utils.item.InvWrapper; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widgets.layout.Flow; +import com.cleanroommc.modularui.widgets.slot.ModularSlot; +import com.cleanroommc.modularui.widgets.slot.PhantomItemSlot; +import com.cleanroommc.modularui.widgets.slot.SlotGroup; +import com.fouristhenumber.utilitiesinexcess.transfer.upgrade.AdvancedFilterMode; +import com.fouristhenumber.utilitiesinexcess.utils.ItemStackInventory; +import com.fouristhenumber.utilitiesinexcess.utils.ItemStackInventoryContainer; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.ChatComponentText; import net.minecraft.util.IIcon; import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; @@ -13,8 +35,83 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; -public class ItemUpgrade extends Item { +public class ItemUpgrade extends Item implements IGuiHolder, ItemStackInventoryContainer +{ + public enum FilterMode { + INVERTED("Inverted"), + FUZZYNBT("Fuzzy - Ignores NBT"), + FUZZYMETA("Fuzzy - Ignores Metadata"); + + private final String label; + + FilterMode(String label) + { + this.label = label; + } + + public String getLabel() + { + return label; + } + + public static boolean isInverted(ItemStack stack) + { + if (stack.stackTagCompound != null && stack.stackTagCompound.hasKey("Mode")) + { + int mode = stack.stackTagCompound.getInteger("Mode"); + return (mode & (1 << INVERTED.ordinal())) != 0; + } + return false; + } + + public static boolean isInverted(int mode) + { + return (mode & (1 << INVERTED.ordinal())) != 0; + } + + public static boolean isIgnoringMeta(ItemStack stack) + { + if (stack.stackTagCompound != null && stack.stackTagCompound.hasKey("Mode")) + { + int mode = stack.stackTagCompound.getInteger("Mode"); + return (mode & (1 << FUZZYMETA.ordinal())) != 0; + } + return false; + } + + public static boolean isIgnoringMeta(int mode) + { + return (mode & (1 << FUZZYMETA.ordinal())) != 0; + } + + public static boolean isIgnoringNBT(ItemStack stack) + { + if (stack.stackTagCompound != null && stack.stackTagCompound.hasKey("Mode")) + { + int mode = stack.stackTagCompound.getInteger("Mode"); + return (mode & (1 << FUZZYNBT.ordinal())) != 0; + } + return false; + } + + public static boolean isIgnoringNBT(int mode) + { + return (mode & (1 << FUZZYNBT.ordinal())) != 0; + } + + public static int getModesFromStack(ItemStack stack) + { + if (stack.stackTagCompound != null && stack.stackTagCompound.hasKey("Mode")) + { + return stack.stackTagCompound.getInteger("Mode"); + } + return 0; + } + + } private static final IIcon[] ICONS = new IIcon[TransferUpgrade.VALUES.length]; @@ -23,17 +120,17 @@ public ItemUpgrade() { setHasSubtypes(true); } + public String getInventoryName() + { + return "gui.title.filter.name"; + } + @SideOnly(Side.CLIENT) @Override public IIcon getIconFromDamage(int meta) { return ICONS[meta]; } - @Override - public int getMetadata(int meta) { - return meta; - } - @Override public String getUnlocalizedName(ItemStack stack) { return super.getUnlocalizedName(stack) + "_" + TransferUpgrade.VALUES[stack.getItemDamage()].getName(); @@ -43,7 +140,7 @@ public String getUnlocalizedName(ItemStack stack) { @Override public void registerIcons(IIconRegister register) { for (TransferUpgrade upgrade : TransferUpgrade.VALUES) { - ICONS[upgrade.ordinal()] = register.registerIcon(UtilitiesInExcess.MODID + ":" + upgrade.getName()); + ICONS[upgrade.ordinal()] = register.registerIcon(UtilitiesInExcess.MODID + ":upgrade_" + upgrade.getName()); } } @@ -53,4 +150,203 @@ public void getSubItems(Item item, CreativeTabs tab, List items) { items.add(new ItemStack(item, 1, upgrade.ordinal())); } } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) + { + if (!world.isRemote && TransferUpgrade.getUpgrade(stack) == TransferUpgrade.FILTER) // SERVER side only + { + GuiFactories.playerInventory().open(player, InventoryTypes.PLAYER, player.inventory.currentItem); + } + else if (!world.isRemote && TransferUpgrade.getUpgrade(stack) == TransferUpgrade.ADV_FILTER) + { + AdvancedFilterMode mode; + if (player.isSneaking()) + { + mode = cycleAdvancedFilter(stack, false); + } + else + { + mode = cycleAdvancedFilter(stack, true); + } + player.addChatMessage(new ChatComponentText("Filter Mode: " + mode.getLabel())); + } + + return stack; + } + + private AdvancedFilterMode cycleAdvancedFilter(ItemStack stack, boolean up) + { + if (stack.hasTagCompound()) + { + if (stack.stackTagCompound.hasKey("AdvMode")) + { + if (up) + { + stack.stackTagCompound.setByte("AdvMode", (byte) ((stack.stackTagCompound.getByte("AdvMode") + 1) % AdvancedFilterMode.values().length)); + } + else + { + byte mode = stack.stackTagCompound.getByte("AdvMode"); + if (mode == 0) + { + stack.stackTagCompound.setByte("AdvMode", (byte) (AdvancedFilterMode.values().length - 1)); + } + else + { + stack.stackTagCompound.setByte("AdvMode", (byte) (mode - 1)); + } + } + } + else + { + stack.stackTagCompound.setByte("AdvMode", (byte) 1); + } + } + else + { + stack.stackTagCompound = new NBTTagCompound(); + stack.stackTagCompound.setByte("AdvMode", (byte) 0); + } + return AdvancedFilterMode.values()[stack.stackTagCompound.getByte("AdvMode")]; + } + + @Override + public ModularPanel buildUI(PlayerInventoryGuiData data, PanelSyncManager syncManager, UISettings settings) { + ModularPanel panel = new ModularPanel("panel").height(125); + panel.bindPlayerInventory(); + + int usedSlot = data.getPlayer().inventory.currentItem; + if (data.getInventoryType() == InventoryTypes.PLAYER) + { + syncManager.bindPlayerInventory(data.getPlayer(), + (inv, index) -> + index == usedSlot ? new ModularSlot(inv, index).accessibility(false, false) : new ModularSlot(inv, index)); + } + + SlotGroup filterGroup = new SlotGroup("filter_slots", 1); + ItemStackInventory itemInventory; + + ItemStack heldStack = data.getPlayer().getHeldItem(); + itemInventory = new ItemStackInventory(heldStack, 9, 1); + + IItemHandler handler = new InvWrapper(itemInventory); + + panel.child( + IKey.str(StatCollector.translateToLocal(getInventoryName())) + .asWidget() + .marginLeft(5) + .marginRight(5) + .marginTop(5) + .marginBottom(-15) + ); + + Flow flow = Flow.row().size(18*9, 18).horizontalCenter().marginTop(16); + + for (int i = 0; i < this.getInventorySize(); i++) + { + flow.child(new PhantomItemSlot().slot(new ModularSlot(handler,i).slotGroup(filterGroup))); + } + + panel.child(flow); + syncManager.addCloseListener(itemInventory::writeInventoryToHeldStack); + + return panel; + } + + @Override + @SideOnly(Side.CLIENT) + public ModularScreen createScreen(PlayerInventoryGuiData data, ModularPanel mainPanel) { + return new ModularScreen(UtilitiesInExcess.MODID, mainPanel); + } + + @Override + public int getInventorySize() { + return 9; + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean advanced) + { + addInformationHelper(stack, list, "", true); + } + + @SuppressWarnings("unchecked") + public void addInformationHelper(ItemStack stack, List list, String indent, boolean root) + { + if (TransferUpgrade.getUpgrade(stack) == TransferUpgrade.FILTER) + { + if (stack.hasTagCompound()) + { + int filterMode = FilterMode.getModesFromStack(stack); + if (filterMode != 0) + { + for (int i = 0; i < 3; i++) + { + if ((filterMode & (1 << i)) != 0) + { + if (root) + { + list.add(indent + FilterMode.values()[i].getLabel()); + } + else + { + list.add(indent + " " + FilterMode.values()[i].getLabel()); + } + } + } + if (!root) + { + indent += " "; + } + } + + if (stack.stackTagCompound.hasKey("Items")) + { + NBTTagList tagList = stack.stackTagCompound.getTagList("Items", 10); + for (int i = 0; i < tagList.tagCount(); i++) + { + NBTTagCompound itemTag = tagList.getCompoundTagAt(i); + ItemStack filteredStack = ItemStack.loadItemStackFromNBT(itemTag); + if (filteredStack != null) { + if (filteredStack.getItem() instanceof ItemUpgrade) + { + if (filteredStack.getItemDamage() == TransferUpgrade.FILTER.ordinal()) + { + list.add(indent + " Item Filter"); + addInformationHelper(filteredStack, list, indent + " ", false); + } + else if (filteredStack.getItemDamage() == TransferUpgrade.ADV_FILTER.ordinal()) + { + list.add(indent + " AdvancedFilter: " + AdvancedFilterMode.values()[filteredStack.getItemDamage()].getLabel()); + } + } + else + { + list.add(indent + " " + filteredStack.getDisplayName()); + } + } + } + } + } + } + else if (TransferUpgrade.getUpgrade(stack) == TransferUpgrade.ADV_FILTER) + { + if (stack.hasTagCompound()) + { + if (stack.stackTagCompound.hasKey("AdvMode")) + { + byte advFilterMode = stack.stackTagCompound.getByte("AdvMode"); + if (advFilterMode >= 0 && advFilterMode < AdvancedFilterMode.values().length) + { + list.add(AdvancedFilterMode.values()[advFilterMode].getLabel()); + list.add(AdvancedFilterMode.values()[advFilterMode].getDescription()); + } + } + } + } + } + } + + diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/NBTPreservingRecipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/NBTPreservingRecipe.java new file mode 100644 index 00000000..b4111045 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/NBTPreservingRecipe.java @@ -0,0 +1,53 @@ +package com.fouristhenumber.utilitiesinexcess.common.recipe; + +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.ShapelessRecipes; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagInt; + +import java.util.List; +import java.util.Objects; + +public class NBTPreservingRecipe extends ShapelessRecipes +{ + + // Which item in the input items to take the NBT from + int slot; + + public NBTPreservingRecipe(ItemStack outputItem, List inputItems, int slot) + { + super(outputItem, inputItems); + this.slot = slot; + } + + @Override + public ItemStack getCraftingResult(InventoryCrafting inv) { + ItemStack result = super.getCraftingResult(inv); + + for (int i = 0; i < inv.getSizeInventory(); i++) { + ItemStack stack = inv.getStackInSlot(i); + + if (stack != null && stack.isItemEqual(recipeItems.get(slot)) && stack.hasTagCompound()) + { + NBTTagCompound incomingTag = stack.getTagCompound(); + + for (String key : incomingTag.func_150296_c()) + { + // Merge mode tags + if (Objects.equals(key, "Mode")) + { + result.stackTagCompound.setTag(key, new NBTTagInt(result.getTagCompound().getInteger(key) | incomingTag.getInteger(key))); + } + else + { + result.stackTagCompound.setTag(key, incomingTag.getTag(key)); + } + } + break; + } + } + + return result; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeLoader.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeLoader.java index 2ce5d2e0..52b6f2ef 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeLoader.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/recipe/RecipeLoader.java @@ -2,9 +2,15 @@ import static net.minecraft.item.Item.getItemFromBlock; +import com.fouristhenumber.utilitiesinexcess.common.items.ItemUpgrade; +import com.fouristhenumber.utilitiesinexcess.config.transfer.TransferConfig; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagByte; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagInt; import net.minecraftforge.oredict.OreDictionary; import com.fouristhenumber.utilitiesinexcess.ModBlocks; @@ -18,6 +24,10 @@ import cpw.mods.fml.common.registry.GameRegistry; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + public class RecipeLoader { public static void run() { @@ -35,6 +45,7 @@ public static void run() { loadDecorativeBlocksRecipes(); loadColoredBlockRecipes(); loadTransferNodeRecipes(); + loadFilterVariantRecipes(); // Pacifist's Bench addShapedRecipe( @@ -1306,8 +1317,55 @@ private static void loadTransferUpgradeRecipes() { TransferUpgrade.FILTER.getStack()); } - private static void loadTransferPipeRecipes() { + private static void loadTransferPipeRecipes() + { + + } + + private static void loadFilterVariantRecipes() + { + if (TransferConfig.EnableTransferSystem) + { + GameRegistry.addRecipe( + new NBTPreservingRecipe( + setNBTForItem(TransferUpgrade.FILTER.getStack(1), "Mode", new NBTTagInt((byte) 1 << ItemUpgrade.FilterMode.INVERTED.ordinal())).theStack, + Arrays.asList( + TransferUpgrade.FILTER.getStack(1).theStack, + new ItemStack(Blocks.redstone_torch) + ), + 0)); + + GameRegistry.addRecipe( + new NBTPreservingRecipe( + setNBTForItem(TransferUpgrade.FILTER.getStack(1), "Mode", new NBTTagInt((byte) 1 << ItemUpgrade.FilterMode.FUZZYNBT.ordinal())).theStack, + Arrays.asList( + TransferUpgrade.FILTER.getStack(1).theStack, + new ItemStack(Blocks.wool) + ), + 0)); + + GameRegistry.addRecipe( + new NBTPreservingRecipe( + setNBTForItem(TransferUpgrade.FILTER.getStack(1), "Mode", new NBTTagInt((byte) 1 << ItemUpgrade.FilterMode.FUZZYMETA.ordinal())).theStack, + Arrays.asList( + TransferUpgrade.FILTER.getStack(1).theStack, + new ItemStack(Items.stick) + ), + 0)); + GameRegistry.addRecipe( + new NBTPreservingRecipe( + setNBTForItem(TransferUpgrade.ADV_FILTER.getStack(1), "Mode", new NBTTagInt((byte) ItemUpgrade.FilterMode.INVERTED.ordinal())).theStack, + Arrays.asList( + TransferUpgrade.ADV_FILTER.getStack(1).theStack, + new ItemStack(Blocks.redstone_torch) + ), + 0)); + + // Clears NBT + addShapelessRecipe(TransferUpgrade.FILTER.getStack(1), TransferUpgrade.FILTER.getStack(1)); + addShapelessRecipe(TransferUpgrade.ADV_FILTER.getStack(1), TransferUpgrade.ADV_FILTER.getStack(1)); + } } private static boolean addShapedRecipe(Object outputObject, Object... params) { @@ -1350,4 +1408,14 @@ private static void loadCompressedBlockRecipes() { } } } + + private static DisableableItemStack setNBTForItem(DisableableItemStack in, String key, NBTBase tag) + { + if (!in.theStack.hasTagCompound()) + { + in.theStack.stackTagCompound = new NBTTagCompound(); + } + in.theStack.stackTagCompound.setTag(key, tag); + return in; + } } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/transfer/TransferNodeRenderer.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/transfer/TransferNodeRenderer.java index 166c50ec..c659fbb8 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/transfer/TransferNodeRenderer.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/transfer/TransferNodeRenderer.java @@ -4,6 +4,7 @@ import static com.fouristhenumber.utilitiesinexcess.common.renderers.transfer.TransferPipeRenderer.RenderPipes; import static com.fouristhenumber.utilitiesinexcess.utils.RenderUtils.renderInventoryCube; +import com.fouristhenumber.utilitiesinexcess.ModBlocks; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; @@ -126,9 +127,9 @@ public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block b TileEntityTransferNodeBase te = (TileEntityTransferNodeBase) world.getTileEntity(x, y, z); if (te == null) return false; - int mask = te.getConnectionsMask(); + int mask = te.getRawConnectionMask(); - RenderPipes(mask, x, y, z, renderer, mask != 0); + RenderPipes(mask, x, y, z, ModBlocks.TRANSFER_PIPE.get(), renderer, mask != 0); return true; } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/transfer/TransferPipeRenderer.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/transfer/TransferPipeRenderer.java index 8ee5a40d..4a41d2a4 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/transfer/TransferPipeRenderer.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/renderers/transfer/TransferPipeRenderer.java @@ -3,13 +3,13 @@ import static com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess.transferPipeRenderID; import static com.fouristhenumber.utilitiesinexcess.utils.RenderUtils.renderInventoryCube; +import com.fouristhenumber.utilitiesinexcess.common.blocks.transfer.pipe.BlockCrossoverPipe; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityNetworkComponentBase; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; import net.minecraft.world.IBlockAccess; -import com.fouristhenumber.utilitiesinexcess.ModBlocks; -import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityTransferPipe; import com.gtnewhorizons.angelica.api.ThreadSafeISBRH; import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; @@ -17,43 +17,55 @@ @ThreadSafeISBRH(perThread = false) public class TransferPipeRenderer implements ISimpleBlockRenderingHandler { - public static void RenderPipes(int mask, int x, int y, int z, RenderBlocks renderer, boolean renderCenter) { - - Block block = ModBlocks.TRANSFER_PIPE.get(); + public static void RenderPipes(int mask, int x, int y, int z, Block block, RenderBlocks renderer, boolean renderCenter) { if (renderCenter) { - renderer.setRenderBounds(0.375, 0.375, 0.375, 0.625, 0.625, 0.625); - renderer.renderStandardBlock(block, x, y, z); + if (block instanceof BlockCrossoverPipe) + { + renderer.setRenderBounds(0.3125, 0.3125, 0.3125, 0.6875, 0.6875, 0.6875); + renderer.renderStandardBlock(block, x, y, z); + } + else + { + renderer.setRenderBounds(0.375, 0.375, 0.375, 0.625, 0.625, 0.625); + renderer.renderStandardBlock(block, x, y, z); + } + } - // +X + // -Y (down) if ((mask & (1)) != 0) { - renderer.setRenderBounds(0.625, 0.375, 0.375, 1.0, 0.625, 0.625); + renderer.setRenderBounds(0.375, 0.0, 0.375, 0.625, 0.375, 0.625); renderer.renderStandardBlock(block, x, y, z); } - // -X + + // +Y (up) if ((mask & (1 << 1)) != 0) { - renderer.setRenderBounds(0.0, 0.375, 0.375, 0.375, 0.625, 0.625); + renderer.setRenderBounds(0.375, 0.625, 0.375, 0.625, 1.0, 0.625); renderer.renderStandardBlock(block, x, y, z); } - // +Y + + // -Z (north) if ((mask & (1 << 2)) != 0) { - renderer.setRenderBounds(0.375, 0.625, 0.375, 0.625, 1.0, 0.625); + renderer.setRenderBounds(0.375, 0.375, 0.0, 0.625, 0.625, 0.375); renderer.renderStandardBlock(block, x, y, z); } - // -Y + + // +Z (south) if ((mask & (1 << 3)) != 0) { - renderer.setRenderBounds(0.375, 0.0, 0.375, 0.625, 0.375, 0.625); + renderer.setRenderBounds(0.375, 0.375, 0.625, 0.625, 0.625, 1.0); renderer.renderStandardBlock(block, x, y, z); } - // +Z + + // -X (west) if ((mask & (1 << 4)) != 0) { - renderer.setRenderBounds(0.375, 0.375, 0.625, 0.625, 0.625, 1.0); + renderer.setRenderBounds(0.0, 0.375, 0.375, 0.375, 0.625, 0.625); renderer.renderStandardBlock(block, x, y, z); } - // -Z + + // +X (east) if ((mask & (1 << 5)) != 0) { - renderer.setRenderBounds(0.375, 0.375, 0.0, 0.625, 0.625, 0.375); + renderer.setRenderBounds(0.625, 0.375, 0.375, 1.0, 0.625, 0.625); renderer.renderStandardBlock(block, x, y, z); } } @@ -65,10 +77,16 @@ public void renderInventoryBlock(Block block, int metadata, int modelId, RenderB tess.startDrawingQuads(); tess.setNormal(0, 1, 0); - renderer.setRenderBounds(0.375, 0.375, 0.375, 0.625, 0.625, 0.625); - renderInventoryCube(renderer, block, metadata); - renderer.setRenderBounds(0.625, 0.375, 0.375, 1.0, 0.625, 0.625); - renderInventoryCube(renderer, block, metadata); + if (block instanceof BlockCrossoverPipe) + { + renderer.setRenderBounds(0.3125, 0.3125, 0.3125, 0.6875, 0.6875, 0.6875); + renderInventoryCube(renderer, block, metadata); + } + else + { + renderer.setRenderBounds(0.625, 0.375, 0.375, 1.0, 0.625, 0.625); + renderInventoryCube(renderer, block, metadata); + } renderer.setRenderBounds(0.0, 0.375, 0.375, 0.375, 0.625, 0.625); renderInventoryCube(renderer, block, metadata); renderer.setRenderBounds(0.375, 0.625, 0.375, 0.625, 1.0, 0.625); @@ -86,10 +104,10 @@ public void renderInventoryBlock(Block block, int metadata, int modelId, RenderB @Override public boolean renderWorldBlock(IBlockAccess worldAccess, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { - TileEntityTransferPipe te = (TileEntityTransferPipe) worldAccess.getTileEntity(x, y, z); + TileEntityNetworkComponentBase te = (TileEntityNetworkComponentBase) worldAccess.getTileEntity(x, y, z); if (te == null) return false; - RenderPipes(te.getConnectionsMask(), x, y, z, renderer, true); + RenderPipes(te.getRawConnectionMask(), x, y, z, block, renderer, true); return true; } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java index 87c468c4..1404964c 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/ITransferNetworkComponent.java @@ -1,11 +1,42 @@ package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.Connection; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.IWalkingComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.TransportType; +import com.fouristhenumber.utilitiesinexcess.utils.MaskedArrayView; +import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public interface ITransferNetworkComponent { +import java.util.List; - boolean canConnectFrom(ForgeDirection side); - boolean canConnectTo(World world, int x, int y, int z, int side); +public interface ITransferNetworkComponent +{ + void addNeighbor(ForgeDirection direction, ITransferNetworkComponent neighbor); + void removeNeighbor(ForgeDirection direction); + + void addExternal(ForgeDirection direction, Connection neighbor); + void removeExternal(ForgeDirection direction); + + Connection[] getValidExternalNeighbors(ForgeDirection fromDirection, IWalkingComponent walking); + ITransferNetworkComponent[] getNetworkNeighbors(); + + MaskedArrayView getWalkableDirs(TransportType targetType, ForgeDirection fromDirection, IWalkingComponent walkingComponent); + + int getRawConnectionMask(); + + World getWorld(); + + int getX(); + int getY(); + int getZ(); + + boolean canConnectToSide(ForgeDirection side); + + void updateExternalConnections(); + + int getInsertLimit(); + + void markHostDirty(); } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityItemTransferNode.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityItemTransferNode.java new file mode 100644 index 00000000..7f28f87c --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityItemTransferNode.java @@ -0,0 +1,167 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer; + +import com.cleanroommc.modularui.screen.ModularScreen; +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.IWalkingComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.ItemTransferNodeLogic; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; + +import com.cleanroommc.modularui.api.IGuiHolder; +import com.cleanroommc.modularui.factory.PosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.UISettings; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; + + +public class TileEntityItemTransferNode extends TileEntityTransferNodeBase + implements IGuiHolder, IWalkingComponent +{ + + public TileEntityItemTransferNode() + { + logic = new ItemTransferNodeLogic(this); + } + + @Override + public void updateEntity() + { + this.logic.updateEntity(this); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) + { + super.writeToNBT(nbt); + this.logic.writeToNBT(nbt); + } + + @Override + public void readFromNBT(NBTTagCompound nbt) + { + super.readFromNBT(nbt); + this.logic.readFromNBT(nbt); + } + + @Override + public int getSizeInventory() + { + return logic.getSizeInventory(); + } + + @Override + public ItemStack getStackInSlot(int slotIn) + { + return logic.getStackInSlot(slotIn); + } + + @Override + public ItemStack decrStackSize(int index, int count) + { + return logic.decrStackSize(index, count); + } + + @Override + public ItemStack getStackInSlotOnClosing(int index) + { + return logic.getStackInSlotOnClosing(index); + } + + @Override + public void setInventorySlotContents(int index, ItemStack stack) + { + logic.setInventorySlotContents(index, stack); + } + + @Override + public String getInventoryName() + { + return logic.getInventoryName(); + } + + @Override + public boolean hasCustomInventoryName() + { + return logic.hasCustomInventoryName(); + } + + @Override + public int getInventoryStackLimit() + { + return logic.getInventoryStackLimit(); + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player) + { + return logic.isUseableByPlayer(player); + } + + @Override + public void openInventory() + { + } + + @Override + public void closeInventory() + { + } + + @Override + public boolean isItemValidForSlot(int index, ItemStack stack) + { + return logic.isItemValidForSlot(index, stack); + } + + @Override + public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) + { + return logic.buildUI(data, syncManager, settings, this); + } + + @Override + @SideOnly(Side.CLIENT) + public ModularScreen createScreen(PosGuiData data, ModularPanel mainPanel) { + return logic.createScreen(data, mainPanel); + } + + @Override + public int[] getAccessibleSlotsFromSide(int side) + { + if (ForgeDirection.getOrientation(side).getOpposite().ordinal() == blockMetadata) + { + return null; + } + return new int[] + { + 0 + }; + } + + @Override + public boolean canInsertItem(int slot, ItemStack stack, int side) + { + return side != blockMetadata; + } + + @Override + public boolean canExtractItem(int slot, ItemStack stack, int side) + { + return false; + } + + @Override + public void updateSourceInventory() + { + logic.updateSourceInventory(this); + } + + @Override + public ItemStack getWalkingObject() { + return logic.getStackInSlot(0); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityNetworkComponentBase.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityNetworkComponentBase.java new file mode 100644 index 00000000..7355ebba --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityNetworkComponentBase.java @@ -0,0 +1,130 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer; + +import codechicken.lib.world.IChunkLoadTile; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.Connection; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.ITransferNetworkLogic; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.IWalkingComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.TransportType; +import com.fouristhenumber.utilitiesinexcess.utils.MaskedArrayView; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + + +public abstract class TileEntityNetworkComponentBase extends TileEntity implements ITransferNetworkComponent, IChunkLoadTile +{ + protected T logic; + + /// See implemented class IChunkLoadTile for why we need to implement all of these. + @Override + public void invalidate() + { + super.invalidate(); + logic.separateWorld(); + } + + @Override + public void onChunkUnload() + { + logic.separateWorld(); + } + + @Override + public void validate() + { + super.validate(); + logic.tryJoinWorld(); + } + + @Override + public void onChunkLoad() { + logic.tryJoinWorld(); + } + + @Override + public World getWorld() { + return this.worldObj; + } + + @Override + public int getX() { + return this.xCoord; + } + + @Override + public int getY() { + return this.yCoord; + } + + @Override + public int getZ() { + return this.zCoord; + } + + @Override + public void addNeighbor(ForgeDirection direction, ITransferNetworkComponent neighbor) + { + logic.addNeighbor(direction, neighbor); + } + + @Override + public void addExternal(ForgeDirection direction, Connection neighbor) + { + logic.addExternal(direction, neighbor); + } + + @Override + public void removeExternal(ForgeDirection direction) + { + logic.removeExternal(direction); + } + + @Override + public void removeNeighbor(ForgeDirection direction) + { + logic.removeNeighbor(direction); + } + + @Override + public void updateExternalConnections() + { + logic.updateExternalConnections(); + } + + @Override + public Connection[] getValidExternalNeighbors(ForgeDirection fromDirection, IWalkingComponent walker) + { + return logic.getValidExternalConnections(fromDirection, walker); + } + + @Override + public ITransferNetworkComponent[] getNetworkNeighbors() + { + return logic.getNetworkConnections(); + } + + // TODO make better + @Override + public MaskedArrayView getWalkableDirs(TransportType targetType, ForgeDirection fromDirection, IWalkingComponent walkingComponent) + { + return logic.getWalkableDirs(targetType, fromDirection, walkingComponent); + } + + @Override + public int getRawConnectionMask() + { + logic.updateExternalConnections(); + return logic.getNetworkMask() | logic.getExternalMask(); + } + + @Override + public int getInsertLimit() { + return logic.getMaxInsertable(); + } + + @Override + public void markHostDirty() + { + this.markDirty(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityRetrievalNode.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityRetrievalNode.java new file mode 100644 index 00000000..0f8adfc3 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityRetrievalNode.java @@ -0,0 +1,181 @@ +//package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer; +// +//import com.cleanroommc.modularui.api.IGuiHolder; +//import com.cleanroommc.modularui.api.drawable.IKey; +//import com.cleanroommc.modularui.factory.PosGuiData; +//import com.cleanroommc.modularui.screen.ModularPanel; +//import com.cleanroommc.modularui.screen.UISettings; +//import com.cleanroommc.modularui.utils.item.IItemHandler; +//import com.cleanroommc.modularui.utils.item.InvWrapper; +//import com.cleanroommc.modularui.value.sync.PanelSyncManager; +//import com.cleanroommc.modularui.widget.ParentWidget; +//import com.cleanroommc.modularui.widgets.layout.Grid; +//import com.cleanroommc.modularui.widgets.slot.ItemSlot; +//import com.cleanroommc.modularui.widgets.slot.ModularSlot; +//import com.cleanroommc.modularui.widgets.slot.SlotGroup; +//import net.minecraft.entity.player.EntityPlayer; +//import net.minecraft.inventory.IInventory; +//import net.minecraft.inventory.ISidedInventory; +//import net.minecraft.item.ItemStack; +//import net.minecraft.tileentity.TileEntity; +//import net.minecraft.util.StatCollector; +//import net.minecraft.world.World; +//import net.minecraftforge.common.util.ForgeDirection; +// +//import java.util.ArrayList; +// +//public class TileEntityRetrievalNode extends TileEntityTransferNode +// implements ISidedInventory, IGuiHolder { +// +// ItemStack buffer; +// IInventory connectedInventory; +// +// public TileEntityRetrievalNode() +// { +// System.out.println("CALLED"); +// } +// +// boolean foundEntity = false; +// +// @Override +// public void updateEntity() { +// //tick+=2+(2*0); //0 is speedupgrade +// //if (tick<=20) {return;} +// //tick=0; +// +//// if (this.worldObj.isRemote || this.worldObj.getTotalWorldTime() % 20 != 0) +//// { +//// return; +//// } +//// if (buffer != null && buffer.stackSize >= 64) +//// { +//// return; +//// } +//// if (connectedInventory == null) +//// { +//// ForgeDirection facing = ForgeDirection.getOrientation(getBlockMetadata()); +//// TileEntity neighbor = worldObj +//// .getTileEntity(xCoord + facing.offsetX, yCoord + facing.offsetY, zCoord + facing.offsetZ); +//// if (neighbor instanceof IInventory inventory) { +//// connectedInventory = inventory; +//// } +//// } +//// +//// if (connectedInventory != null) +//// { +//// exportItems(); +//// } +//// +//// if (!foundEntity) +//// { +//// Walker.step(); +//// } +//// +//// TileEntity pipe = Walker.getCurrentTileEntity(); +//// +//// ArrayList ents = Walker.getItemEntities(); +//// +//// foundEntity = false; +//// +//// for (TileEntity entity : ents) +//// { +//// boolean side = true; +//// +//// if (pipe instanceof TileEntityTransferNodeBase node) { +//// side = node.canConnectFrom(Walker.getDirectionFromCurrent(entity)); +//// } +//// +//// +//// if (side) +//// { +//// IInventory iEntity=(IInventory)entity; +//// ArrayList validSlots=new ArrayList<>(0); +//// for (int i = 0; i < iEntity.getSizeInventory(); i++) { +//// ItemStack slot = iEntity.getStackInSlot(i); +//// if (slot==null || (buffer!=null && !buffer.isItemEqual(slot))) {continue;} +//// if (buffer==null) { buffer=new ItemStack(slot.getItem(),0);} +//// foundEntity=true; +//// slot.stackSize-=1; +//// buffer.stackSize+=1; +//// this.setInventorySlotContents(0,buffer); +//// if (slot.stackSize==0) +//// { +//// slot=null; +//// iEntity.setInventorySlotContents(i,null); +//// } +//// break; +//// } +//// +//// if (true) //TODO: LINK WITH Round Robin +//// { +//// if (!foundEntity) +//// { +//// Walker.reset(); +//// } +//// } else +//// { +//// break; +//// } +//// +//// +//// } +//// } +// } +// // TODO: Swap to ExportItems 🤤 - Should be done now +// public void exportItems() { +// ArrayList validSlots=new ArrayList<>(0); +// for (int i = 0; i < connectedInventory.getSizeInventory(); i++) { +// ItemStack slot = connectedInventory.getStackInSlot(i); +// if (buffer==null || slot==null || (slot.isItemEqual(buffer) && slot.getMaxStackSize()-slot.stackSize==0)) {continue;} +// validSlots.add(i); +// } +// for (int i = 0; i < connectedInventory.getSizeInventory(); i++) { // could compress into another array and do .addall +// ItemStack slot = connectedInventory.getStackInSlot(i); +// if (slot!=null) {continue;} +// validSlots.add(i); +// } +// +// for (int slot: validSlots) { +// ItemStack stackInSlot = connectedInventory.getStackInSlot(slot); +// if (buffer!=null) { +// if (stackInSlot == null) { +// stackInSlot = buffer.splitStack(1); +// if (buffer.stackSize <= 0) { +// buffer=null; +// } +// connectedInventory.setInventorySlotContents(slot,stackInSlot); +// break; +// } else if (buffer.isItemEqual(stackInSlot)) { +// //if (stackInSlot.stackSize==stackInSlot.getMaxStackSize()) {continue;} +// buffer.splitStack(1); +// stackInSlot.stackSize += 1; +// if (buffer.stackSize <= 0) { +// buffer=null; +// this.setInventorySlotContents(0,null); +// } +// connectedInventory.setInventorySlotContents(slot,stackInSlot); +// break; +// } +// } +// } +// } +// +// @Override +// public String getInventoryName() +// { +// return "gui.title.transfer_node.name"; +// } +// +// @Override +// public boolean canInsertItem(int slot, ItemStack stack, int side) +// { +// return false; +// } +// +// @Override +// public boolean canExtractItem(int slot, ItemStack stack, int side) +// { +// return side != blockMetadata; +// } +// +//} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNode.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNode.java deleted file mode 100644 index ad057d2e..00000000 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNode.java +++ /dev/null @@ -1,187 +0,0 @@ -package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.ISidedInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.StatCollector; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -import com.cleanroommc.modularui.api.IGuiHolder; -import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.factory.PosGuiData; -import com.cleanroommc.modularui.screen.ModularPanel; -import com.cleanroommc.modularui.screen.UISettings; -import com.cleanroommc.modularui.utils.item.IItemHandler; -import com.cleanroommc.modularui.utils.item.InvWrapper; -import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import com.cleanroommc.modularui.widget.ParentWidget; -import com.cleanroommc.modularui.widgets.layout.Grid; -import com.cleanroommc.modularui.widgets.slot.ItemSlot; -import com.cleanroommc.modularui.widgets.slot.ModularSlot; -import com.cleanroommc.modularui.widgets.slot.SlotGroup; - -public class TileEntityTransferNode extends TileEntityTransferNodeBase - implements ISidedInventory, IGuiHolder { - - ItemStack buffer; - IInventory connectedInventory; - - @Override - public boolean canConnectTo(World world, int x, int y, int z, int side) { - if (side == blockMetadata) return false; - - TileEntity te = world.getTileEntity(x, y, z); - - if (te instanceof ITransferNetworkComponent transfer) { - return transfer.canConnectFrom(ForgeDirection.getOrientation(side)); - } - - if (te instanceof ISidedInventory sided) { - int[] slots = sided.getAccessibleSlotsFromSide(side); - return slots != null && slots.length > 0; - } else return te instanceof IInventory; - } - - @Override - public void updateEntity() { - if (this.worldObj.isRemote || this.worldObj.getTotalWorldTime() % 20 != 0) return; - if (buffer != null && buffer.stackSize >= 64) return; - if (connectedInventory == null) { - ForgeDirection facing = ForgeDirection.getOrientation(getBlockMetadata()); - TileEntity neighbor = worldObj - .getTileEntity(xCoord + facing.offsetX, yCoord + facing.offsetY, zCoord + facing.offsetZ); - if (neighbor instanceof IInventory inventory) { - connectedInventory = inventory; - } - } - if (connectedInventory != null) importItems(); - } - - public void importItems() { - for (int slot = 0; slot < connectedInventory.getSizeInventory(); slot++) { - ItemStack stackInSlot = connectedInventory.getStackInSlot(slot); - if (stackInSlot != null) { - if (buffer == null) { - buffer = stackInSlot.splitStack(1); - break; - } else if (buffer.isItemEqual(stackInSlot)) { - stackInSlot.splitStack(1); - buffer.stackSize += 1; - if (stackInSlot.stackSize <= 0) { - connectedInventory.setInventorySlotContents(slot, null); - } - break; - } - } - } - } - - @Override - public int getSizeInventory() { - return 1; - } - - @Override - public ItemStack getStackInSlot(int slotIn) { - return buffer; - } - - @Override - public ItemStack decrStackSize(int index, int count) { - if (buffer == null) return null; - return buffer.splitStack(count); - } - - @Override - public ItemStack getStackInSlotOnClosing(int index) { - return buffer; - } - - @Override - public void setInventorySlotContents(int index, ItemStack stack) { - buffer = stack; - } - - @Override - public String getInventoryName() { - return "gui.title.transfer_node.name"; - } - - @Override - public boolean hasCustomInventoryName() { - return false; - } - - @Override - public int getInventoryStackLimit() { - return 64; - } - - @Override - public boolean isUseableByPlayer(EntityPlayer player) { - return true; - } - - @Override - public void openInventory() {} - - @Override - public void closeInventory() {} - - @Override - public boolean isItemValidForSlot(int index, ItemStack stack) { - return true; - } - - @Override - public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { - - SlotGroup slotGroup = new SlotGroup("transfer_node_buffer", 1); - - ModularPanel panel = new ModularPanel("panel"); - panel.bindPlayerInventory(); - - panel.child( - new ParentWidget<>().coverChildren() - .topRelAnchor(0, 1) - .child( - IKey.str(StatCollector.translateToLocal(getInventoryName())) - .asWidget() - .marginLeft(5) - .marginRight(5) - .marginTop(5) - .marginBottom(-15))); - - IItemHandler itemHandler = new InvWrapper(this); - ModularSlot slot = new ModularSlot(itemHandler, 0).slotGroup(slotGroup); - - panel.child( - new Grid().coverChildren() - .pos(79, 34) - .mapTo(1, 1, index -> new ItemSlot().slot(slot))); - - return panel; - } - - @Override - public int[] getAccessibleSlotsFromSide(int side) { - if (ForgeDirection.getOrientation(side) - .getOpposite() - .ordinal() == blockMetadata) return null; - return new int[] { 0 }; - } - - @Override - public boolean canInsertItem(int slot, ItemStack stack, int side) { - return side != blockMetadata; - } - - @Override - public boolean canExtractItem(int slot, ItemStack stack, int side) { - return false; - } - -} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNodeBase.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNodeBase.java index 67dd1b85..2c8577e9 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNodeBase.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNodeBase.java @@ -1,58 +1,19 @@ package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer; - +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.INodeLogicHost; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.ITransferNetworkLogic; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetworkManager; import net.minecraft.network.Packet; import net.minecraft.network.play.server.S35PacketUpdateTileEntity; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityTransferNodeBase extends TileEntity implements ITransferNetworkComponent { - - private int connectionsMask = 0; - - public int getConnectionsMask() { - return connectionsMask; - } - - public boolean updateConnections(World world, int x, int y, int z) { - int old = connectionsMask; - int mask = 0; - if (canConnectTo(world, x + 1, y, z, 5)) mask |= 1; - if (canConnectTo(world, x - 1, y, z, 4)) mask |= 1 << 1; - if (canConnectTo(world, x, y + 1, z, 1)) mask |= 1 << 2; - if (canConnectTo(world, x, y - 1, z, 0)) mask |= 1 << 3; - if (canConnectTo(world, x, y, z + 1, 3)) mask |= 1 << 4; - if (canConnectTo(world, x, y, z - 1, 2)) mask |= 1 << 5; - - connectionsMask = mask; - if (old != mask) { - markDirty(); - return true; - } - return false; - } - - @Override - public boolean canConnectTo(World world, int x, int y, int z, int side) { - return false; - } +public abstract class TileEntityTransferNodeBase extends TileEntityNetworkComponentBase + implements INodeLogicHost +{ @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - nbt.setInteger("connectionsMask", connectionsMask); - } - - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - connectionsMask = nbt.getInteger("connectionsMask"); - } - - @Override - public Packet getDescriptionPacket() { + public Packet getDescriptionPacket() + { NBTTagCompound nbt = new NBTTagCompound(); writeToNBT(nbt); return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 1, nbt); @@ -67,8 +28,15 @@ public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { } @Override - public boolean canConnectFrom(ForgeDirection side) { - return side.getOpposite() - .ordinal() != blockMetadata; + public boolean canConnectToSide(ForgeDirection side) + { + return worldObj.getBlockMetadata(xCoord, yCoord, zCoord) != side.ordinal(); } + + @Override + public ForgeDirection getFacing() { + return ForgeDirection.getOrientation(worldObj.getBlockMetadata(xCoord, yCoord, zCoord)); + } + + public abstract void updateSourceInventory(); } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNodeFluid.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNodeFluid.java index 37c5ff43..54570e34 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNodeFluid.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferNodeFluid.java @@ -1,91 +1,92 @@ -package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer; - -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.StatCollector; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.FluidTank; -import net.minecraftforge.fluids.IFluidHandler; - -import com.cleanroommc.modularui.api.IGuiHolder; -import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.factory.PosGuiData; -import com.cleanroommc.modularui.screen.ModularPanel; -import com.cleanroommc.modularui.screen.UISettings; -import com.cleanroommc.modularui.value.sync.FluidSlotSyncHandler; -import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import com.cleanroommc.modularui.widget.ParentWidget; -import com.cleanroommc.modularui.widgets.layout.Grid; -import com.cleanroommc.modularui.widgets.slot.FluidSlot; - -public class TileEntityTransferNodeFluid extends TileEntityTransferNodeBase implements IGuiHolder { - - FluidTank buffer = new FluidTank(8000); - IFluidHandler connectedInventory; - - @Override - public boolean canConnectTo(World world, int x, int y, int z, int side) { - if (side == blockMetadata) return false; - - TileEntity te = world.getTileEntity(x, y, z); - - if (te instanceof ITransferNetworkComponent transfer) { - return transfer.canConnectFrom(ForgeDirection.getOrientation(side)); - } - - return te instanceof IFluidHandler; - } - - @Override - public void updateEntity() { - if (this.worldObj.isRemote || this.worldObj.getTotalWorldTime() % 20 != 0) return; - if (buffer != null && buffer.getFluidAmount() >= buffer.getCapacity()) return; - if (connectedInventory == null) { - ForgeDirection facing = ForgeDirection.getOrientation(getBlockMetadata()); - TileEntity neighbor = worldObj - .getTileEntity(xCoord + facing.offsetX, yCoord + facing.offsetY, zCoord + facing.offsetZ); - if (neighbor instanceof IFluidHandler inventory) { - connectedInventory = inventory; - } - } - if (connectedInventory != null) importFluids(); - } - - public void importFluids() { - FluidStack canDrain = connectedInventory.drain(ForgeDirection.UP, 200, false); - if (canDrain != null && canDrain.amount > 0) { - int filled = buffer.fill(canDrain, true); - if (filled > 0) { - connectedInventory.drain(ForgeDirection.UP, filled, true); - } - } - } - - @Override - public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { - - ModularPanel panel = new ModularPanel("panel"); - panel.bindPlayerInventory(); - - panel.child( - new ParentWidget<>().coverChildren() - .topRelAnchor(0, 1) - .child( - IKey.str(StatCollector.translateToLocal("gui.title.transfer_node_fluid.name")) - .asWidget() - .marginLeft(5) - .marginRight(5) - .marginTop(5) - .marginBottom(-15))); - - FluidSlotSyncHandler fluidSync = new FluidSlotSyncHandler(buffer); - - panel.child( - new Grid().coverChildren() - .pos(79, 34) - .mapTo(1, 1, index -> new FluidSlot().syncHandler(fluidSync))); - - return panel; - } -} +//package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer; +// +//import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +//import net.minecraft.tileentity.TileEntity; +//import net.minecraft.util.StatCollector; +//import net.minecraft.world.World; +//import net.minecraftforge.common.util.ForgeDirection; +//import net.minecraftforge.fluids.FluidStack; +//import net.minecraftforge.fluids.FluidTank; +//import net.minecraftforge.fluids.IFluidHandler; +// +//import com.cleanroommc.modularui.api.IGuiHolder; +//import com.cleanroommc.modularui.api.drawable.IKey; +//import com.cleanroommc.modularui.factory.PosGuiData; +//import com.cleanroommc.modularui.screen.ModularPanel; +//import com.cleanroommc.modularui.screen.UISettings; +//import com.cleanroommc.modularui.value.sync.FluidSlotSyncHandler; +//import com.cleanroommc.modularui.value.sync.PanelSyncManager; +//import com.cleanroommc.modularui.widget.ParentWidget; +//import com.cleanroommc.modularui.widgets.layout.Grid; +//import com.cleanroommc.modularui.widgets.slot.FluidSlot; +// +//public class TileEntityTransferNodeFluid extends TileEntityTransferNodeBase implements IGuiHolder { +// +// FluidTank buffer = new FluidTank(8000); +// IFluidHandler connectedInventory; +// +// @Override +// public boolean canConnectTo(World world, int x, int y, int z, int side) { +// if (side == blockMetadata) return false; +// +// TileEntity te = world.getTileEntity(x, y, z); +// +// if (te instanceof ITransferNetworkComponent transfer) { +// return transfer.canConnectFrom(ForgeDirection.getOrientation(side)); +// } +// +// return te instanceof IFluidHandler; +// } +// +// @Override +// public void updateEntity() { +// if (this.worldObj.isRemote || this.worldObj.getTotalWorldTime() % 20 != 0) return; +// if (buffer != null && buffer.getFluidAmount() >= buffer.getCapacity()) return; +// if (connectedInventory == null) { +// ForgeDirection facing = ForgeDirection.getOrientation(getBlockMetadata()); +// TileEntity neighbor = worldObj +// .getTileEntity(xCoord + facing.offsetX, yCoord + facing.offsetY, zCoord + facing.offsetZ); +// if (neighbor instanceof IFluidHandler inventory) { +// connectedInventory = inventory; +// } +// } +// if (connectedInventory != null) importFluids(); +// } +// +// public void importFluids() { +// FluidStack canDrain = connectedInventory.drain(ForgeDirection.UP, 200, false); +// if (canDrain != null && canDrain.amount > 0) { +// int filled = buffer.fill(canDrain, true); +// if (filled > 0) { +// connectedInventory.drain(ForgeDirection.UP, filled, true); +// } +// } +// } +// +// @Override +// public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { +// +// ModularPanel panel = new ModularPanel("panel"); +// panel.bindPlayerInventory(); +// +// panel.child( +// new ParentWidget<>().coverChildren() +// .topRelAnchor(0, 1) +// .child( +// IKey.str(StatCollector.translateToLocal("gui.title.transfer_node_fluid.name")) +// .asWidget() +// .marginLeft(5) +// .marginRight(5) +// .marginTop(5) +// .marginBottom(-15))); +// +// FluidSlotSyncHandler fluidSync = new FluidSlotSyncHandler(buffer); +// +// panel.child( +// new Grid().coverChildren() +// .pos(79, 34) +// .mapTo(1, 1, index -> new FluidSlot().syncHandler(fluidSync))); +// +// return panel; +// } +//} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferPipe.java deleted file mode 100644 index 6e72ffca..00000000 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/TileEntityTransferPipe.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer; - -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.ISidedInventory; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.NetworkManager; -import net.minecraft.network.Packet; -import net.minecraft.network.play.server.S35PacketUpdateTileEntity; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.IFluidHandler; - -import cofh.api.energy.IEnergyReceiver; - -public class TileEntityTransferPipe extends TileEntity implements ITransferNetworkComponent { - - private int connectionsMask = 0; - - public int getConnectionsMask() { - return connectionsMask; - } - - public boolean updateConnections(World world, int x, int y, int z) { - int old = connectionsMask; - int mask = 0; - if (canConnectTo(world, x + 1, y, z, 5)) mask |= 1; - if (canConnectTo(world, x - 1, y, z, 4)) mask |= 1 << 1; - if (canConnectTo(world, x, y + 1, z, 1)) mask |= 1 << 2; - if (canConnectTo(world, x, y - 1, z, 0)) mask |= 1 << 3; - if (canConnectTo(world, x, y, z + 1, 3)) mask |= 1 << 4; - if (canConnectTo(world, x, y, z - 1, 2)) mask |= 1 << 5; - - connectionsMask = mask; - if (old != mask) { - markDirty(); - return true; - } - return false; - } - - @Override - public boolean canConnectTo(World world, int x, int y, int z, int side) { - TileEntity te = world.getTileEntity(x, y, z); - - if (te instanceof ITransferNetworkComponent transfer) { - return transfer.canConnectFrom(ForgeDirection.getOrientation(side)); - } - - if (te instanceof ISidedInventory sided) { - int[] slots = sided.getAccessibleSlotsFromSide(side); - if (slots != null && slots.length > 0) return true; - } else if (te instanceof IInventory) return true; - - if (te instanceof IEnergyReceiver energy && energy.canConnectEnergy(ForgeDirection.getOrientation(side))) { - return true; - } - - return te instanceof IFluidHandler; - } - - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - nbt.setInteger("connectionsMask", connectionsMask); - } - - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - connectionsMask = nbt.getInteger("connectionsMask"); - } - - @Override - public Packet getDescriptionPacket() { - NBTTagCompound nbt = new NBTTagCompound(); - writeToNBT(nbt); - return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 1, nbt); - } - - @Override - public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { - readFromNBT(pkt.func_148857_g()); - if (worldObj != null) { - worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); - } - } - - @Override - public boolean canConnectFrom(ForgeDirection side) { - return true; - } -} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityCrossoverPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityCrossoverPipe.java new file mode 100644 index 00000000..e7d653f9 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityCrossoverPipe.java @@ -0,0 +1,37 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe; + +import cofh.api.energy.IEnergyReceiver; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityNetworkComponentBase; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.pipe.CrossOverPipeLogic; +import net.minecraft.inventory.IInventory; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.IFluidHandler; + +public class TileEntityCrossoverPipe extends TileEntityNetworkComponentBase +{ + public TileEntityCrossoverPipe() + { + logic = new CrossOverPipeLogic(this); + } + + @Override + public boolean canConnectToSide(ForgeDirection side) + { + ForgeDirection oppositeSide = side.getOpposite(); + + int xOffset = xCoord + oppositeSide.offsetX; + int yOffset = yCoord + oppositeSide.offsetY; + int zOffset = zCoord + oppositeSide.offsetZ; + if (worldObj.blockExists(xOffset, yOffset, zOffset)) + { + TileEntity candidateTE = worldObj.getChunkFromBlockCoords(xOffset, zOffset).getTileEntityUnsafe(xOffset & 15, yOffset, zOffset & 15); + if (candidateTE instanceof TileEntityNetworkComponentBase networkableTE) + { + return networkableTE.canConnectToSide(side); + } + return candidateTE instanceof IInventory || candidateTE instanceof IFluidHandler || candidateTE instanceof IEnergyReceiver; + } + return false; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityFilterPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityFilterPipe.java new file mode 100644 index 00000000..71dc75ba --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityFilterPipe.java @@ -0,0 +1,107 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe; + +import com.cleanroommc.modularui.api.IGuiHolder; +import com.cleanroommc.modularui.factory.PosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.UISettings; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityNetworkComponentBase; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.pipe.FilterPipeLogic; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityFilterPipe extends TileEntityNetworkComponentBase + implements IGuiHolder, IInventory +{ + + public TileEntityFilterPipe() + { + logic = new FilterPipeLogic(this); + } + + @Override + public void readFromNBT(NBTTagCompound compound) + { + logic.readFromNBT(compound); + super.readFromNBT(compound); + } + + @Override + public void writeToNBT(NBTTagCompound compound) + { + super.writeToNBT(compound); + logic.writeToNBT(compound); + } + + @Override + public boolean canConnectToSide(ForgeDirection side) { + return true; + } + + @Override + public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) + { + return logic.buildUI(data, syncManager, settings, this); + } + + @Override + public int getSizeInventory() { + return logic.getSizeInventory(); + } + + @Override + public ItemStack getStackInSlot(int slotIn) { + return logic.getStackInSlot(slotIn); + } + + @Override + public ItemStack decrStackSize(int index, int count) { + return logic.decrStackSize(index, count); + } + + @Override + public ItemStack getStackInSlotOnClosing(int index) { + return logic.getStackInSlotOnClosing(index); + } + + @Override + public void setInventorySlotContents(int index, ItemStack stack) { + logic.setInventorySlotContents(index, stack); + } + + @Override + public String getInventoryName() { + return logic.getInventoryName(); + } + + @Override + public boolean hasCustomInventoryName() { + return logic.hasCustomInventoryName(); + } + + @Override + public int getInventoryStackLimit() { + return logic.getInventoryStackLimit(); + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player) { + return logic.isUseableByPlayer(player); + } + + @Override + public void openInventory() + {} + + @Override + public void closeInventory() + {} + + @Override + public boolean isItemValidForSlot(int index, ItemStack stack) { + return logic.isItemValidForSlot(index, stack); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityHyperRationingPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityHyperRationingPipe.java new file mode 100644 index 00000000..13760f97 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityHyperRationingPipe.java @@ -0,0 +1,18 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityNetworkComponentBase; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.pipe.HyperRationingPipeLogic; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityHyperRationingPipe extends TileEntityNetworkComponentBase +{ + public TileEntityHyperRationingPipe() + { + logic = new HyperRationingPipeLogic(this); + } + + @Override + public boolean canConnectToSide(ForgeDirection side) { + return true; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityModSortingPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityModSortingPipe.java new file mode 100644 index 00000000..c1605f9a --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityModSortingPipe.java @@ -0,0 +1,20 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityNetworkComponentBase; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.pipe.ModSortingPipeLogic; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityModSortingPipe extends TileEntityNetworkComponentBase +{ + + public TileEntityModSortingPipe() + { + logic = new ModSortingPipeLogic(this); + } + + @Override + public boolean canConnectToSide(ForgeDirection side) + { + return false; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityRationingPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityRationingPipe.java new file mode 100644 index 00000000..a105d60e --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityRationingPipe.java @@ -0,0 +1,18 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityNetworkComponentBase; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.pipe.RationingPipeLogic; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityRationingPipe extends TileEntityNetworkComponentBase +{ + public TileEntityRationingPipe() + { + logic = new RationingPipeLogic(this); + } + + @Override + public boolean canConnectToSide(ForgeDirection side) { + return true; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntitySortingPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntitySortingPipe.java new file mode 100644 index 00000000..686b5310 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntitySortingPipe.java @@ -0,0 +1,20 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityNetworkComponentBase; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.pipe.SortingPipeLogic; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntitySortingPipe extends TileEntityNetworkComponentBase +{ + + public TileEntitySortingPipe() + { + logic = new SortingPipeLogic(this); + } + + @Override + public boolean canConnectToSide(ForgeDirection side) + { + return true; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityTransferPipe.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityTransferPipe.java new file mode 100644 index 00000000..69fcbf86 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/common/tileentities/transfer/pipe/TileEntityTransferPipe.java @@ -0,0 +1,20 @@ +package com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.pipe; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityNetworkComponentBase; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.pipe.PipeLogic; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityTransferPipe extends TileEntityNetworkComponentBase +{ + + public TileEntityTransferPipe() + { + logic = new PipeLogic(this); + } + + @Override + public boolean canConnectToSide(ForgeDirection side) + { + return true; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/tradingpost/SearchBar.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/tradingpost/SearchBar.java index 61f3f8ba..6198bd71 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/tradingpost/SearchBar.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/compat/mui/tradingpost/SearchBar.java @@ -36,7 +36,7 @@ public SearchBar() { @Override public void drawBackground(ModularGuiContext context, WidgetThemeEntry widgetTheme) { - IDrawable bg = getCurrentBackground(context.getTheme(), widgetTheme); + IDrawable bg = getCurrentBackground(widgetTheme); if (bg != null) { bg.draw(context, 2, -1, getArea().width - 4, getArea().height + 1, widgetTheme.getTheme()); } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/ItemConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/ItemConfig.java index 25379e21..e38cee53 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/ItemConfig.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/items/ItemConfig.java @@ -2,6 +2,7 @@ import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; import com.fouristhenumber.utilitiesinexcess.config.items.unstabletools.UnstableTools; +import com.fouristhenumber.utilitiesinexcess.config.transfer.TransferConfig; import com.gtnewhorizon.gtnhlib.config.Config; import com.gtnewhorizon.gtnhlib.config.ConfigException; import com.gtnewhorizon.gtnhlib.config.ConfigurationManager; @@ -18,6 +19,7 @@ public static void registerConfig() throws ConfigException { ConfigurationManager.registerConfig(WateringCanConfig.class); ConfigurationManager.registerConfig(InversionConfig.class); ConfigurationManager.registerConfig(FireBatteryConfig.class); + ConfigurationManager.registerConfig(TransferConfig.class); } @Config.DefaultBoolean(true) diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/config/transfer/TransferConfig.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/transfer/TransferConfig.java new file mode 100644 index 00000000..106e8244 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/config/transfer/TransferConfig.java @@ -0,0 +1,13 @@ +package com.fouristhenumber.utilitiesinexcess.config.transfer; + +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.gtnewhorizon.gtnhlib.config.Config; + +@Config(modid = UtilitiesInExcess.MODID, category = "transfer") +public class TransferConfig { + + @Config.Comment("Should the transfer system be enabled.") + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean EnableTransferSystem; +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/Connection.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/Connection.java new file mode 100644 index 00000000..7fac1b37 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/Connection.java @@ -0,0 +1,25 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic; + +import com.github.bsideup.jabel.Desugar; +import net.minecraft.tileentity.TileEntity; + +@Desugar +public record Connection(TileEntity target, int flags, int side) +{ + public boolean canConnectItem() + { + return (flags & 1) != 0; + } + + public boolean canConnectEnergy() + { + return false; + } + + public boolean canConnectFluid() + { + return false; + } +} + + diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/INodeLogicHost.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/INodeLogicHost.java new file mode 100644 index 00000000..e96c7f37 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/INodeLogicHost.java @@ -0,0 +1,14 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +// Class that is implemented by +public interface INodeLogicHost extends ISidedInventory, ITransferNetworkComponent +{ + World getWorld(); + + ForgeDirection getFacing(); +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ITransferNetworkLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ITransferNetworkLogic.java new file mode 100644 index 00000000..da9fc662 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ITransferNetworkLogic.java @@ -0,0 +1,38 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.TransportType; +import com.fouristhenumber.utilitiesinexcess.utils.MaskedArrayView; +import net.minecraftforge.common.util.ForgeDirection; + +public interface ITransferNetworkLogic +{ + void separateWorld(); + + void tryJoinWorld(); + void updateExternalConnections(); + + void addExternal(ForgeDirection direction, Connection neighbor); + void removeExternal(ForgeDirection direction); + + void removeNeighbor(ForgeDirection direction); + void addNeighbor(ForgeDirection direction, ITransferNetworkComponent neighbor); + + // I really don't like this method, but I have no idea what is the best way to fix the inheritance chain here. + MaskedArrayView getWalkableDirs(TransportType transPortType, ForgeDirection direction, IWalkingComponent walkingComponent); + + int getNetworkMask(); + int getExternalMask(); + + void setNetworkMask(int mask); + void setExternalMask(int mask); + + boolean canConnectEnergy(); + boolean canConnectFluid(); + boolean canConnectItem(); + + Connection[] getValidExternalConnections(ForgeDirection fromDirection, IWalkingComponent walker); + ITransferNetworkComponent[] getNetworkConnections(); + + int getMaxInsertable(); +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/IWalkingComponent.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/IWalkingComponent.java new file mode 100644 index 00000000..c6efd890 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/IWalkingComponent.java @@ -0,0 +1,7 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic; + +// Honestly I don't like how I'm doing this with the inheritance. +public interface IWalkingComponent extends INodeLogicHost +{ + T getWalkingObject(); +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ItemTransferNodeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ItemTransferNodeLogic.java new file mode 100644 index 00000000..d7c9fab5 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/ItemTransferNodeLogic.java @@ -0,0 +1,627 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic; + +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.factory.PlayerInventoryGuiData; +import com.cleanroommc.modularui.factory.PosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.ModularScreen; +import com.cleanroommc.modularui.screen.UISettings; +import com.cleanroommc.modularui.utils.item.IItemHandler; +import com.cleanroommc.modularui.utils.item.InvWrapper; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.value.sync.StringSyncValue; +import com.cleanroommc.modularui.widget.ParentWidget; +import com.cleanroommc.modularui.widgets.layout.Flow; +import com.cleanroommc.modularui.widgets.layout.Grid; +import com.cleanroommc.modularui.widgets.slot.ItemSlot; +import com.cleanroommc.modularui.widgets.slot.ModularSlot; +import com.cleanroommc.modularui.widgets.slot.SlotGroup; +import com.fouristhenumber.utilitiesinexcess.UtilitiesInExcess; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.ItemWalker; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper.TargetResolver; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import it.unimi.dsi.fastutil.ints.IntArrayList; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.StatCollector; +import net.minecraftforge.common.util.ForgeDirection; + +import java.util.List; + +public class ItemTransferNodeLogic extends NetworkLogic implements IInventory +{ + + ItemStack[] buffer = new ItemStack[getSizeInventory()]; + + IInventory connectedInventory; + public ItemWalker walker; + + public ItemTransferNodeLogic(IWalkingComponent host) + { + super(host); + walker = new ItemWalker(host); + } + + // Note that I did write quite length insertion logic for this. I felt that it is more important to keep the + // logic consise and fast for the cases where there is no rationing pipe. + public void updateEntity(INodeLogicHost host) + { + if (host.getWorld().isRemote || host.getWorld().getTotalWorldTime() % 20 != 0) + { + return; + } + + // TODO perhaps this can be moved to NetworkLogic + if (connectedInventory == null) { + updateSourceInventory(host); + } + + if (connectedInventory != null) { + importItems(); + } + + if (buffer[0] == null) + { + walker.reset(); + return; + } + + List> targets = walker.getValidTargets(); + if (!targets.isEmpty()) + { + // As mentioned elsewhere some pipes have a maximum insertion limit. + int insertLimit = walker.getInsertLimit(); + if (insertLimit == -1) // Unlimited insert logic + { + for (TargetResolver.Target target : targets) // Need to loop through because sometimes the full stack cannot fit in one inventory + { + if (target.handler instanceof ISidedInventory sidedInventory) // Sided logic + { + buffer[0] = TryInsertItemSided(sidedInventory, buffer[0], target.side); + } + else // Basic logic + { + buffer[0] = TryInsertItem(target.handler, buffer[0]); + } + if (buffer[0] == null) + { + break; + } + } + } + else // Limited insert logic + { + for (TargetResolver.Target target : targets) // Need to loop through because sometimes the full stack cannot fit in one inventory + { + if (target.handler instanceof ISidedInventory sidedInventory) // Sided logic + { + buffer[0] = TryInsertItemSidedLimited(sidedInventory, buffer[0], target.side, insertLimit); + } + else // Basic logic + { + buffer[0] = TryInsertItemLimited(target.handler, buffer[0], insertLimit); + } + if (buffer[0] == null) + { + break; + } + } + } + } + walker.step(); + } + + public void importItems() { + for (int slot = 0; slot < connectedInventory.getSizeInventory(); slot++) + { + ItemStack stackInSlot = connectedInventory.getStackInSlot(slot); + if (stackInSlot != null) + { + if (buffer[0] == null) + { + buffer[0] = stackInSlot.splitStack(1); + if (stackInSlot.stackSize <= 0) + { + connectedInventory.setInventorySlotContents(slot, null); + } + break; + } + else if (buffer[0].isItemEqual(stackInSlot)) + { + stackInSlot.splitStack(1); + buffer[0].stackSize += 1; + if (stackInSlot.stackSize <= 0) + { + connectedInventory.setInventorySlotContents(slot, null); + } + break; + } + } + } + } + + // Insertion logic for non-sided inventories where there's a maxAllowed in the inventory + public ItemStack TryInsertItemLimited(IInventory inventory, ItemStack stack, int maxAllowed) + { + if (stack == null || stack.stackSize <= 0) + { + return null; + } + + int size = inventory.getSizeInventory(); + + // I'm using IntArrayLists to be the fastest. + // Even entries are slot numbers and subsequent odd entries are the amount of items that can be put into them. + IntArrayList mergeableSlots = new IntArrayList(); + IntArrayList emptySlots = new IntArrayList(); + + int found = 0; + + for (int slot = 0; slot < size; slot++) + { + if (!inventory.isItemValidForSlot(slot, stack)) + { + continue; + } + + ItemStack existing = inventory.getStackInSlot(slot); + if (existing == null) + { + emptySlots.add(slot); + emptySlots.add(inventory.getInventoryStackLimit()); + } + else if (canStacksMerge(existing, stack)) + { + found += existing.stackSize; + if (found >= maxAllowed) + { + return stack; + } + + int max = Math.min(existing.getMaxStackSize(), inventory.getInventoryStackLimit()); + int space = max - existing.stackSize; + if (space > 0) + { + mergeableSlots.add(slot); + mergeableSlots.add(space); + } + } + } + + int preMergeStackSize = stack.stackSize; + // Once for mergeable slots first, then the empty slots. + StackToInventoryMergingHelperLimited(mergeableSlots, inventory, stack, found, maxAllowed); + if (stack.stackSize <= 0) + { + return null; + } + found += preMergeStackSize - stack.stackSize; + return StackToInventoryMergingHelperLimited(emptySlots, inventory, stack, found, maxAllowed); + } + + // Insertion logic for sided inventories where there's a maxAllowed in the inventory + public ItemStack TryInsertItemSidedLimited(ISidedInventory inventory, ItemStack stack, int side, int maxAllowed) + { + if (stack == null || stack.stackSize <= 0) + { + return null; + } + + int[] slots = inventory.getAccessibleSlotsFromSide(side); + + // I'm using IntArrayLists to be the fastest. + // Even entries are slot numbers and subsequent odd entries are the amount of items that can be put into them. + IntArrayList mergeableSlots = new IntArrayList(); + IntArrayList emptySlots = new IntArrayList(); + + int found = 0; + for (int slot : slots) + { + if (!inventory.canInsertItem(slot, stack, side)) + { + continue; + } + + ItemStack existing = inventory.getStackInSlot(slot); + if (existing == null) + { + emptySlots.add(slot); + emptySlots.add(inventory.getInventoryStackLimit()); + } + else if (canStacksMerge(existing, stack)) + { + found += existing.stackSize; + if (found >= maxAllowed) + { + return stack; + } + + int max = Math.min(existing.getMaxStackSize(), inventory.getInventoryStackLimit()); + int space = max - existing.stackSize; + if (space > 0) + { + mergeableSlots.add(slot); + mergeableSlots.add(space); + } + } + } + + // Once for mergeable slots first, then the empty slots. + int preMergeStackSize = stack.stackSize; + StackToInventoryMergingHelperLimited(mergeableSlots, inventory, stack, found, maxAllowed); + if (stack.stackSize <= 0) + { + return null; + } + found += preMergeStackSize - stack.stackSize; + return StackToInventoryMergingHelperLimited(emptySlots, inventory, stack, found, maxAllowed); + } + + // Helper for consistent inventory insertion/merging + private ItemStack StackToInventoryMergingHelperLimited(IntArrayList slotInfo, IInventory inventory, ItemStack insertionStack, int currentItemsInInventory, int maxAllowedInInventory) + { + int insertAmount = maxAllowedInInventory - currentItemsInInventory; + for (int i = 0; i < slotInfo.size(); i += 2) + { + int slot = slotInfo.getInt(i); + int amountInsertable = Math.min(slotInfo.getInt(i + 1), Math.min(insertionStack.stackSize, insertAmount)); + insertionStack.stackSize -= amountInsertable; + currentItemsInInventory += amountInsertable; + if (inventory.getStackInSlot(slot) == null) + { + ItemStack newStack = insertionStack.copy(); + newStack.stackSize = amountInsertable; + inventory.setInventorySlotContents(slot, newStack); + } + else + { + inventory.getStackInSlot(slot).stackSize += amountInsertable; + } + + if (currentItemsInInventory == maxAllowedInInventory) + { + if (insertionStack.stackSize <= 0) + { + return null; + } + else + { + return insertionStack; + } + } + if (insertionStack.stackSize <= 0) + { + return null; + } + } + return insertionStack; + } + + // Default sided insertion logic + public ItemStack TryInsertItemSided(ISidedInventory inventory, ItemStack stack, int side) + { + if (stack == null || stack.stackSize <= 0) + { + return null; + } + + int[] slots = inventory.getAccessibleSlotsFromSide(side); + + IntArrayList mergeableSlots = new IntArrayList(); + IntArrayList emptySlots = new IntArrayList(); + + // Note that we have to iterate the whole inventory first or we won't know if there's mergable slots + for (int slot : slots) + { + if (!inventory.canInsertItem(slot, stack, side)) + { + continue; + } + + ItemStack existing = inventory.getStackInSlot(slot); + if (existing == null) + { + emptySlots.add(slot); + emptySlots.add(inventory.getInventoryStackLimit()); + } + else if (canStacksMerge(existing, stack)) + { + int max = Math.min(existing.getMaxStackSize(), inventory.getInventoryStackLimit()); + int space = max - existing.stackSize; + if (space > 0) + { + mergeableSlots.add(slot); + mergeableSlots.add(space); + } + } + } + StackToInventoryMergingHelper(mergeableSlots, inventory, stack); + if (stack.stackSize <= 0) + { + return null; + } + return StackToInventoryMergingHelper(emptySlots, inventory, stack); + } + + // Default insertion logic + public ItemStack TryInsertItem(IInventory inventory, ItemStack stack) + { + if (stack == null || stack.stackSize <= 0) + { + return null; + } + + int size = inventory.getSizeInventory(); + + // I'm using IntArrayLists to be the fastest. + // Even entries are slot numbers and subsequent odd entries are the amount of items that can be put into them. + IntArrayList mergeableSlots = new IntArrayList(); + IntArrayList emptySlots = new IntArrayList(); + + for (int slot = 0; slot < size; slot++) + { + if (!inventory.isItemValidForSlot(slot, stack)) + { + continue; + } + + ItemStack existing = inventory.getStackInSlot(slot); + if (existing == null) + { + emptySlots.add(slot); + emptySlots.add(inventory.getInventoryStackLimit()); + } + else if (canStacksMerge(existing, stack)) + { + + + int max = Math.min(existing.getMaxStackSize(), inventory.getInventoryStackLimit()); + int space = max - existing.stackSize; + if (space > 0) + { + mergeableSlots.add(slot); + mergeableSlots.add(space); + } + } + } + StackToInventoryMergingHelper(mergeableSlots, inventory, stack); + if (stack.stackSize <= 0) + { + return null; + } + return StackToInventoryMergingHelper(emptySlots, inventory, stack); + } + + // Helper for consistent inventory insertion/merging + private ItemStack StackToInventoryMergingHelper(IntArrayList slotInfo, IInventory inventory, ItemStack insertionStack) + { + for (int i = 0; i < slotInfo.size(); i += 2) + { + int slot = slotInfo.getInt(i); + int amountInsertable = Math.min(slotInfo.getInt(i + 1), insertionStack.stackSize); + insertionStack.stackSize -= amountInsertable; + if (inventory.getStackInSlot(slot) == null) + { + ItemStack newStack = insertionStack.copy(); + newStack.stackSize = amountInsertable; + inventory.setInventorySlotContents(slot, newStack); + } + else + { + inventory.getStackInSlot(slot).stackSize += amountInsertable; + } + + if (insertionStack.stackSize <= 0) + { + return null; + } + } + return insertionStack; + } + + // Not sure if this is the correct way to do this tbh. I don't know if any of the built in + // itemstack stuff is better. + private static boolean canStacksMerge(ItemStack a, ItemStack b) + { + return a.getItem() == b.getItem() + && a.getItemDamage() == b.getItemDamage() + && ItemStack.areItemStackTagsEqual(a, b); + } + + public void writeToNBT(NBTTagCompound nbt) + { + NBTTagList nbttaglist = new NBTTagList(); + + for (int i = 0; i < this.buffer.length; ++i) + { + if (this.buffer[i] != null) + { + NBTTagCompound nbttagcompound1 = new NBTTagCompound(); + nbttagcompound1.setByte("Slot", (byte)i); + this.buffer[i].writeToNBT(nbttagcompound1); + nbttaglist.appendTag(nbttagcompound1); + } + } + + nbt.setTag("Items", nbttaglist); + } + + public void readFromNBT(NBTTagCompound nbt) + { + NBTTagList nbttaglist = nbt.getTagList("Items", 10); + this.buffer = new ItemStack[this.getSizeInventory()]; + + for (int i = 0; i < nbttaglist.tagCount(); ++i) + { + NBTTagCompound compound = nbttaglist.getCompoundTagAt(i); + int slot = compound.getByte("Slot") & 255; + + if (slot < this.buffer.length) + { + this.buffer[slot] = ItemStack.loadItemStackFromNBT(compound); + } + } + } + + @Override + public int getSizeInventory() + { + return 7; + } + + @Override + public ItemStack getStackInSlot(int slotIn) + { + return buffer[slotIn]; + } + + @Override + public ItemStack decrStackSize(int index, int count) + { + if (buffer[index] == null) + { + return null; + } + return buffer[index].splitStack(count); + } + + @Override + public ItemStack getStackInSlotOnClosing(int index) + { + return buffer[index]; + } + + @Override + public void setInventorySlotContents(int index, ItemStack stack) + { + buffer[index] = stack; + this.markDirty(); + } + + @Override + public String getInventoryName() + { + return "gui.title.transfer_node.name"; + } + + @Override + public boolean hasCustomInventoryName() + { + return false; + } + + @Override + public int getInventoryStackLimit() + { + return 64; + } + + @Override + public void markDirty() { + host.markHostDirty(); + } + + public boolean isUseableByPlayer(EntityPlayer player) + { + return true; + } + + @Override + public void openInventory() { + + } + + @Override + public void closeInventory() { + + } + + @Override + public boolean isItemValidForSlot(int index, ItemStack stack) + { + return true; + } + + public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings, INodeLogicHost host) + { + StringSyncValue searchLocationSyncer = new StringSyncValue(() -> walker.getLocationString()); + syncManager.syncValue("searchLocationSyncer", searchLocationSyncer); + + SlotGroup slotGroup = new SlotGroup("transfer_node_buffer[0]", 1); + SlotGroup slotGroup1 = new SlotGroup("transfer_node_upgrades", 1); + + ModularPanel panel = new ModularPanel("panel"); + panel.bindPlayerInventory(); + + panel.child( + new ParentWidget<>().coverChildren() + .topRelAnchor(0, 1) + .child( + IKey.str(StatCollector.translateToLocal(getInventoryName())) + .asWidget() + .marginLeft(5) + .marginRight(5) + .marginTop(5) + .marginBottom(-15))); + + IItemHandler itemHandler = new InvWrapper(host); + + panel.child( + IKey.dynamic(() -> "Search Location: " + searchLocationSyncer.getStringValue()) + .asWidget() + .marginTop(20) + .horizontalCenter() + ); + + Flow flow = Flow.row(); + flow.pos(34,60).size(108,18); + for (int i = 0; i < 6; i++) + { + flow.child(new ItemSlot().slot(new ModularSlot(itemHandler,i + 1).slotGroup(slotGroup1))); + } + panel.child(flow); + ModularSlot slot = new ModularSlot(itemHandler, 0).slotGroup(slotGroup); + + panel.child( + new Grid().coverChildren() + .pos(79, 34) + .mapTo(1, 1, index -> new ItemSlot().slot(slot))); + + return panel; + } + + @SideOnly(Side.CLIENT) + public ModularScreen createScreen(PosGuiData data, ModularPanel mainPanel) { + return new ModularScreen(UtilitiesInExcess.MODID, mainPanel); + } + + @Override + public boolean canConnectEnergy() { + return true; + } + + @Override + public boolean canConnectFluid() { + return true; + } + + @Override + public boolean canConnectItem() { + return true; + } + + public void updateSourceInventory(INodeLogicHost host) + { + ForgeDirection facing = host.getFacing(); + TileEntity neighbor = host.getWorld().getTileEntity(host.getX() + facing.offsetX, host.getY() + facing.offsetY, host.getZ() + facing.offsetZ); + if (neighbor instanceof IInventory inventory) { + connectedInventory = inventory; + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/NetworkLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/NetworkLogic.java new file mode 100644 index 00000000..6d254e13 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/NetworkLogic.java @@ -0,0 +1,213 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic; + +import cofh.api.energy.IEnergyReceiver; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.TransportType; +import com.fouristhenumber.utilitiesinexcess.utils.MaskedArrayView; +import net.minecraft.inventory.IInventory; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.IFluidHandler; + +// TODO is it really safe to be doing all of this stuff on world join/separation??? +public abstract class NetworkLogic implements ITransferNetworkLogic +{ + protected ITransferNetworkComponent host; + + protected ITransferNetworkComponent[] networkNeighbors = new ITransferNetworkComponent[6]; + protected int networkMask = 0; + + protected Connection[] externalConnections = new Connection[6]; + protected int externalConnectionMask = 0; + + + private boolean joined = false; + public NetworkLogic(ITransferNetworkComponent host) + { + this.host = host; + } + + @Override + public void tryJoinWorld() + { + World world = host.getWorld(); + int x = host.getX(); + int y = host.getY(); + int z = host.getZ(); + if (!joined && world != null && world.blockExists(x, y, z)) + { + joined = true; + updateNetworkConnections(world, x, y, z); + updateExternalConnections(); + } + } + + public void updateExternalConnections() + { + for (int i = 0; i < 6; i++) { + ForgeDirection dir = ForgeDirection.getOrientation(i); + int xOffset = host.getX() + dir.offsetX; + int yOffset = host.getY() + dir.offsetY; + int zOffset = host.getZ() + dir.offsetZ; + World world = host.getWorld(); + + if (world.blockExists(xOffset, yOffset, zOffset) && host.canConnectToSide(dir)) + { + TileEntity neighborTE = world.getChunkFromBlockCoords(xOffset, zOffset).getTileEntityUnsafe(xOffset & 15, yOffset, zOffset & 15); + if (neighborTE instanceof ITransferNetworkComponent) + { + continue; + } + + // Just update the externals because it's way more painful to check if everything is the same. + // Just assume we're just now getting placed. + int flags = resolveExternalConnection(neighborTE); + if (flags != 0) + { + addExternal(dir, new Connection(neighborTE, flags, i)); + } + else + { + removeExternal(dir); + } + } + } + } + + protected int resolveExternalConnection(TileEntity neighborTE) + { + int flags = 0; + if (neighborTE != null) { + if (neighborTE instanceof IInventory) { + flags |= 1; + } + if (neighborTE instanceof IFluidHandler) { + flags |= 2; + } + if (neighborTE instanceof IEnergyReceiver) { + flags |= 4; + } + } + return flags; + } + + public void updateNetworkConnections(World world, int x, int y, int z) + { + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) + { + int xOffset = x + dir.offsetX; + int yOffset = y + dir.offsetY; + int zOffset = z + dir.offsetZ; + if (world.blockExists(xOffset, yOffset, zOffset) && + world.getChunkFromBlockCoords(xOffset, zOffset).getTileEntityUnsafe(xOffset & 15, yOffset, zOffset & 15) + instanceof ITransferNetworkComponent component) + { + if (component.canConnectToSide(dir.getOpposite()) && host.canConnectToSide(dir)) + { + component.addNeighbor(dir.getOpposite(), host); + addNeighbor(dir, component); + } + } + } + } + + @Override + public void separateWorld() + { + for(int i = 0; i < networkNeighbors.length; i++) + { + if (networkNeighbors[i] != null) + { + networkNeighbors[i].removeNeighbor(ForgeDirection.getOrientation(i).getOpposite()); + } + } + } + + @Override + public void addNeighbor(ForgeDirection direction, ITransferNetworkComponent neighbor) + { + networkNeighbors[direction.ordinal()] = neighbor; + networkMask |= (1 << direction.ordinal()); + host.getWorld().markBlockForUpdate(host.getX(), host.getY(), host.getZ()); + } + + @Override + public void removeNeighbor(ForgeDirection direction) + { + networkNeighbors[direction.ordinal()] = null; + networkMask &= ~(1 << direction.ordinal()); + host.getWorld().markBlockForUpdate(host.getX(), host.getY(), host.getZ()); + } + + @Override + public void addExternal(ForgeDirection direction, Connection neighbor) + { + externalConnections[direction.ordinal()] = neighbor; + externalConnectionMask |= (1 << direction.ordinal()); + host.getWorld().markBlockForUpdate(host.getX(), host.getY(), host.getZ()); + } + + @Override + public void removeExternal(ForgeDirection direction) + { + externalConnections[direction.ordinal()] = null; + externalConnectionMask &= ~(1 << direction.ordinal()); + host.getWorld().markBlockForUpdate(host.getX(), host.getY(), host.getZ()); + } + + @Override + public MaskedArrayView getWalkableDirs(TransportType transportType, ForgeDirection incomingDirection, IWalkingComponent walkingComponent) + { + int mask; + if (incomingDirection != null) + { + mask = networkMask & ~(1 << incomingDirection.ordinal()); + } + else + { + mask = networkMask; + } + return new MaskedArrayView<>(mask, networkNeighbors); + } + + @Override + public int getNetworkMask() { + return networkMask; + } + + @Override + public int getExternalMask() { + return externalConnectionMask; + } + + @Override + public void setNetworkMask(int mask) + { + networkMask = mask; + } + + @Override + public void setExternalMask(int mask) + { + externalConnectionMask = mask; + } + + @Override + public Connection[] getValidExternalConnections(ForgeDirection fromDirection, IWalkingComponent walker) + { + return externalConnections; + } + + @Override + public ITransferNetworkComponent[] getNetworkConnections() + { + return networkNeighbors; + } + + @Override + public int getMaxInsertable() + { + return -1; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/CrossOverPipeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/CrossOverPipeLogic.java new file mode 100644 index 00000000..0521dae9 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/CrossOverPipeLogic.java @@ -0,0 +1,212 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.pipe; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.Connection; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.IWalkingComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.NetworkLogic; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.TransportType; +import com.fouristhenumber.utilitiesinexcess.utils.MaskedArrayView; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +// Crossover pipes are unique in that they are the only pipe that when they are updated they will affect neighbor status +// of blocks that are not directly adjacent, thus they must have special neighbor logic. +public class CrossOverPipeLogic extends NetworkLogic +{ + public CrossOverPipeLogic(ITransferNetworkComponent host) { + super(host); + } + + @Override + public boolean canConnectEnergy() { + return true; + } + + @Override + public boolean canConnectFluid() { + return true; + } + + @Override + public boolean canConnectItem() { + return true; + } + + @Override + public void addNeighbor(ForgeDirection dir, ITransferNetworkComponent neighbor) + { + ForgeDirection opp = dir.getOpposite(); + + // Add our original neighbor + networkNeighbors[dir.ordinal()] = neighbor; + networkMask |= (1 << dir.ordinal()); + + World world = host.getWorld(); + + // Gets the block on the opposite side of the crossover pipe. + int x = host.getX(); + int y = host.getY(); + int z = host.getZ(); + + int xOffset = x + opp.offsetX; + int yOffset = y + opp.offsetY; + int zOffset = z + opp.offsetZ; + + // Since we know that the only time this is called is when the opposite item is valid to connect too. + // So we should add that item. + // What we don't know is if that item is a network connection or an external connection. So we need to check for it. + if (world.blockExists(xOffset, yOffset, zOffset)) + { + TileEntity candidate = world.getChunkFromBlockCoords(xOffset, zOffset).getTileEntityUnsafe(xOffset & 15, yOffset, zOffset & 15); + + if (candidate instanceof ITransferNetworkComponent component) + { + if (component.canConnectToSide(dir)) + { + component.addNeighbor(dir, host); + networkNeighbors[opp.ordinal()] = component; + networkMask |= (1 << opp.ordinal()); + } + } + else + { + int connectionFlags = resolveExternalConnection(candidate); + if (connectionFlags != 0) // Pretty sure this should never happen but might as well check. + { + externalConnections[opp.ordinal()] = new Connection(candidate, connectionFlags, opp.ordinal()); + externalConnectionMask |= (1 << opp.ordinal()); + } + } + } + world.markBlockForUpdate(x, y, z); + } + + @Override + public void removeNeighbor(ForgeDirection dir) + { + ForgeDirection opp = dir.getOpposite(); + + networkNeighbors[dir.ordinal()] = null; + networkMask &= ~(1 << dir.ordinal()); + + World world = host.getWorld(); + + // Gets the block on the opposite side of the crossover pipe. + int x = host.getX(); + int y = host.getY(); + int z = host.getZ(); + + int xOffset = x + opp.offsetX; + int yOffset = y + opp.offsetY; + int zOffset = z + opp.offsetZ; + + // Since we know that the only time this is called is when the opposite neighbor is no longer valid to connect to + // So we should remove that + if (world.blockExists(xOffset, yOffset, zOffset) && + world.getChunkFromBlockCoords(xOffset, zOffset).getTileEntityUnsafe(xOffset & 15, yOffset, zOffset & 15) + instanceof ITransferNetworkComponent component) + { + component.removeNeighbor(dir); + networkNeighbors[opp.ordinal()] = null; + networkMask &= ~(1 << opp.ordinal()); + } + else // We can just blindly remove this because even if it's there (which it should certainly be) It needs to be null no matter what. + { + externalConnections[opp.ordinal()] = null; + externalConnectionMask &= ~(1 << opp.ordinal()); + } + world.markBlockForUpdate(x, y, z); + } + + @Override + public void addExternal(ForgeDirection dir, Connection neighbor) + { + ForgeDirection opp = dir.getOpposite(); + + // Gets the block on the opposite side of the crossover pipe. + + World world = host.getWorld(); + + int x = host.getX(); + int y = host.getY(); + int z = host.getZ(); + + int xOffset = x + opp.offsetX; + int yOffset = y + opp.offsetY; + int zOffset = z + opp.offsetZ; + + // Same deal as with network neighbors. We need to check if there's an opposing network neighbor that needs to be added (which there should be) + // when we add this external connection. + // I see no reason to support external to external connections with a crossover pipe. + if (world.blockExists(xOffset, yOffset, zOffset)) + { + TileEntity candidate = world.getChunkFromBlockCoords(xOffset, zOffset).getTileEntityUnsafe(xOffset & 15, yOffset, zOffset & 15); + if (candidate instanceof ITransferNetworkComponent component) + { + if (component.canConnectToSide(dir) && host.canConnectToSide(opp)) + { + component.addNeighbor(dir, host); + + // Only add the connection if the connection is not external to external + externalConnections[dir.ordinal()] = neighbor; + externalConnectionMask |= (1 << dir.ordinal()); + + networkNeighbors[opp.ordinal()] = component; + networkMask |= (1 << opp.ordinal()); + } + } + } + host.getWorld().markBlockForUpdate(host.getX(), host.getY(), host.getZ()); + } + + @Override + public void removeExternal(ForgeDirection dir) + { + ForgeDirection opp = dir.getOpposite(); + + // Same deal as with network neighbors. We need to check if there's an opposing network neighbor that needs to be removed + // when we remove this external connection + externalConnections[dir.ordinal()] = null; + externalConnectionMask &= ~(1 << dir.ordinal()); + + World world = host.getWorld(); + + // Gets the block on the opposite side of the crossover pipe. + int x = host.getX(); + int y = host.getY(); + int z = host.getZ(); + + int xOffset = x + opp.offsetX; + int yOffset = y + opp.offsetY; + int zOffset = z + opp.offsetZ; + + if (world.blockExists(xOffset, yOffset, zOffset) && + world.getChunkFromBlockCoords(xOffset, zOffset).getTileEntityUnsafe(xOffset & 15, yOffset, zOffset & 15) + instanceof ITransferNetworkComponent component) + { + component.removeNeighbor(dir); + networkNeighbors[opp.ordinal()] = null; + networkMask &= ~(1 << opp.ordinal()); + } + + host.getWorld().markBlockForUpdate(host.getX(), host.getY(), host.getZ()); + } + + // Only valid walkable neighbor is across from the fromDirection + @Override + public MaskedArrayView getWalkableDirs(TransportType transportType, ForgeDirection incomingDirection, IWalkingComponent walkingComponent) + { + int mask = 0; + mask |= (1 << incomingDirection.getOpposite().ordinal()); + return new MaskedArrayView<>(mask, networkNeighbors); + } + + // Only valid external connection is across from the fromDirection + @Override + public Connection[] getValidExternalConnections(ForgeDirection fromDirection, IWalkingComponent walker) + { + return new Connection[]{externalConnections[fromDirection.getOpposite().ordinal()]}; + } + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/EnergyPipeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/EnergyPipeLogic.java new file mode 100644 index 00000000..d911c50f --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/EnergyPipeLogic.java @@ -0,0 +1,4 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.pipe; + +public class EnergyPipeLogic { +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/FilterPipeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/FilterPipeLogic.java new file mode 100644 index 00000000..3409c115 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/FilterPipeLogic.java @@ -0,0 +1,395 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.pipe; + +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.factory.PosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.UISettings; +import com.cleanroommc.modularui.utils.item.IItemHandler; +import com.cleanroommc.modularui.utils.item.InvWrapper; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widgets.layout.Flow; +import com.cleanroommc.modularui.widgets.slot.ModularSlot; +import com.cleanroommc.modularui.widgets.slot.PhantomItemSlot; +import com.fouristhenumber.utilitiesinexcess.common.items.ItemUpgrade; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.Connection; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.IWalkingComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.NetworkLogic; +import com.fouristhenumber.utilitiesinexcess.transfer.upgrade.AdvancedFilterMode; +import com.fouristhenumber.utilitiesinexcess.transfer.upgrade.TransferUpgrade; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.TransportType; +import com.fouristhenumber.utilitiesinexcess.utils.filter.ItemFilter; +import com.fouristhenumber.utilitiesinexcess.utils.MaskedArrayView; +import com.fouristhenumber.utilitiesinexcess.utils.filter.MatchMode; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.StatCollector; +import net.minecraftforge.common.util.ForgeDirection; + +import java.util.List; + +import static com.fouristhenumber.utilitiesinexcess.common.items.ItemUpgrade.FilterMode.getModesFromStack; +import static com.fouristhenumber.utilitiesinexcess.common.items.ItemUpgrade.FilterMode.isInverted; +import static com.fouristhenumber.utilitiesinexcess.transfer.upgrade.AdvancedFilterMode.getAdvFilterMode; +import static com.fouristhenumber.utilitiesinexcess.utils.ColoredSlots.CYAN_SLOT; +import static com.fouristhenumber.utilitiesinexcess.utils.ColoredSlots.GREEN_SLOT; +import static com.fouristhenumber.utilitiesinexcess.utils.ColoredSlots.ORANGE_SLOT; +import static com.fouristhenumber.utilitiesinexcess.utils.ColoredSlots.PINK_SLOT; +import static com.fouristhenumber.utilitiesinexcess.utils.ColoredSlots.PURPLE_SLOT; +import static com.fouristhenumber.utilitiesinexcess.utils.ColoredSlots.YELLOW_SLOT; +import static com.fouristhenumber.utilitiesinexcess.utils.ItemStackInventory.getInventoryContentsFromStack; + +public class FilterPipeLogic extends NetworkLogic implements IInventory +{ + // This is the actual items in the filter. + private final ItemStack[] filters = new ItemStack[6]; + + // This is the logic that those items represent. + private final ItemFilter[] logicalFilter = new ItemFilter[6]; + + public FilterPipeLogic(ITransferNetworkComponent host) { + super(host); + } + + @Override + public boolean canConnectEnergy() { + return true; + } + + @Override + public boolean canConnectFluid() { + return true; + } + + @Override + public boolean canConnectItem() { + return true; + } + + public void readFromNBT(NBTTagCompound compound) + { + NBTTagList list = compound.getTagList("Items", 10); + + for (int i = 0; i < list.tagCount(); i++) + { + NBTTagCompound itemTag = list.getCompoundTagAt(i); + + int slot = itemTag.getByte("Slot") & 255; + + if (slot >= 0 && slot < this.getSizeInventory()) + { + filters[slot] = ItemStack.loadItemStackFromNBT(itemTag); + } + } + parseInventoryToFilter(); + } + + public void writeToNBT(NBTTagCompound compound) + { + NBTTagList itemList = new NBTTagList(); + for (int i = 0; i < filters.length; i++) + { + ItemStack stack = filters[i]; + if (stack != null) + { + NBTTagCompound itemCompound = new NBTTagCompound(); + itemCompound.setByte("Slot", (byte) i); + stack.writeToNBT(itemCompound); + itemList.appendTag(itemCompound); + } + } + compound.setTag("Items", itemList); + } + + @Override + public int getSizeInventory() { + return 6; + } + + @Override + public ItemStack getStackInSlot(int slotIn) + { + return filters[slotIn]; + } + + @Override + public ItemStack decrStackSize(int index, int count) + { + if (filters[index] == null) + { + return null; + } + return filters[index].splitStack(count); + } + + @Override + public ItemStack getStackInSlotOnClosing(int index) + { + return filters[index]; + } + + @Override + public void setInventorySlotContents(int index, ItemStack stack) + { + filters[index] = stack; + this.markDirty(); + } + + public String getInventoryName() + { + return "gui.title.filter_pipe.name"; + } + + @Override + public boolean hasCustomInventoryName() { + return false; + } + + @Override + public int getInventoryStackLimit() { + return 1; + } + + @Override + public void markDirty() { + host.markHostDirty(); + } + + public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings, IInventory host) + { + ModularPanel panel = new ModularPanel("panel"); + panel.bindPlayerInventory(); + panel.height(192); + + panel.child( + IKey.str(StatCollector.translateToLocal(getInventoryName())) + .asWidget() + .marginLeft(5) + .marginRight(5) + .marginTop(5) + .marginBottom(-15) + ); + + IItemHandler itemHandler = new InvWrapper(host); + + Flow parentRow = Flow.row(); + parentRow.top(15); + parentRow.size(18*5); + + Flow leftCol = Flow.col(); + leftCol.child(new PhantomItemSlot().slot(new ModularSlot(itemHandler, 2)).widgetTheme(PINK_SLOT.get())); + leftCol.child(new PhantomItemSlot().slot(new ModularSlot(itemHandler, 4)).widgetTheme(ORANGE_SLOT.get())); + leftCol.childPadding(18); + leftCol.width(18); + leftCol.top(18); + parentRow.child(leftCol); + + Flow midCol = Flow.col(); + midCol.child(new PhantomItemSlot().slot(new ModularSlot(itemHandler, 1)).widgetTheme(CYAN_SLOT.get())); + midCol.child(new PhantomItemSlot().slot(new ModularSlot(itemHandler, 0)).widgetTheme(YELLOW_SLOT.get())); + midCol.childPadding(3*18); + midCol.width(18); + parentRow.child(midCol); + + Flow rightCol = Flow.col(); + rightCol.child(new PhantomItemSlot().slot(new ModularSlot(itemHandler, 3)).widgetTheme(GREEN_SLOT.get())); + rightCol.child(new PhantomItemSlot().slot(new ModularSlot(itemHandler, 5)).widgetTheme(PURPLE_SLOT.get())); + rightCol.childPadding(18); + rightCol.width(18); + rightCol.top(18); + parentRow.child(rightCol); + + panel.child(parentRow); + + parentRow.horizontalCenter(); + parentRow.childPadding(18); + syncManager.addCloseListener(this::closeListener); + + return panel; + } + + public void closeListener(EntityPlayer player) + { + if (!player.worldObj.isRemote) + { + parseInventoryToFilter(); + } + } + public void parseInventoryToFilter() + { + for (int i = 0; i < filters.length; i++) + { + logicalFilter[i] = null; + if (filters[i] != null) + { + logicalFilter[i] = new ItemFilter(); + if (filters[i].getItem() instanceof ItemUpgrade) + { + if (TransferUpgrade.getUpgrade(filters[i]) == TransferUpgrade.FILTER) // Case where it's a filter + { + parseFilterItem(filters[i], i, 0); + } + else if (TransferUpgrade.getUpgrade(filters[i]) == TransferUpgrade.ADV_FILTER) // Case where it's an advanced filter + { + logicalFilter[i].addToPredicates( + AdvancedFilterMode.values()[getAdvFilterMode(filters[i])]::matches, + ItemUpgrade.FilterMode.isInverted(filters[i]) + ); + } + } + else + { + logicalFilter[i].addToRuleList(filters[i], false, MatchMode.DEFAULT); + } + } + } + } + + // ParentFilterMask is the settings of the parent. This is needed because if the parent says inverted + // and the child says inverted then they cancel out and the items in the child are NOT inverted. + // On the other hand, metadata and NBT ignoring behaviors are propagated to children, but do not cancel each other out. + private void parseFilterItem(ItemStack filter, int slot, int parentMode) + { + // This next block basically does the following: XOR bit 0, then OR bit 1 and 2. + int extractedMode = parentMode & 0b110; + int mode = getModesFromStack(filter) | extractedMode; + boolean inverted = isInverted(parentMode) ^ isInverted(mode); + if (!inverted) + { + mode = mode & 0b110; + } + + List containedItems = getInventoryContentsFromStack(filter); + if (containedItems == null) + { + return; + } + for (ItemStack containedItem : containedItems) + { + if (containedItem.getItem() instanceof ItemUpgrade) + { + if (TransferUpgrade.getUpgrade(containedItem) == TransferUpgrade.FILTER) + { + parseFilterItem(containedItem, slot, mode); + } + else if (TransferUpgrade.getUpgrade(containedItem) == TransferUpgrade.ADV_FILTER) + { + logicalFilter[slot].addToPredicates(AdvancedFilterMode.values()[getAdvFilterMode(containedItem)]::matches, inverted); + } + } + else + { + switch(mode & 0b110) + { + case (0b000): + { + logicalFilter[slot].addToRuleList(containedItem, inverted, MatchMode.DEFAULT); + break; + } + case (0b010): + { + logicalFilter[slot].addToRuleList(containedItem, inverted, MatchMode.IGNORE_NBT); + break; + } + case (0b100): + { + logicalFilter[slot].addToRuleList(containedItem, inverted, MatchMode.IGNORE_META); + break; + } + case (0b110): + { + logicalFilter[slot].addToRuleList(containedItem, inverted, MatchMode.IGNORE_NBT_MET); + break; + } + } + } + } + } + + @Override + public MaskedArrayView getWalkableDirs(TransportType transportType, ForgeDirection incomingDirection, IWalkingComponent walkingComponent) + { + Object walkingObject = walkingComponent.getWalkingObject(); + if (walkingObject instanceof ItemStack stack) + { + return new MaskedArrayView<>(getValidMask(incomingDirection, stack, networkMask), networkNeighbors); + } + return super.getWalkableDirs(transportType, incomingDirection, walkingComponent); + } + + @Override + public Connection[] getValidExternalConnections(ForgeDirection fromDirection, IWalkingComponent walker) + { + Object walkingObject = walker.getWalkingObject(); + if (walkingObject instanceof ItemStack stack) + { + int validMask = getValidMask(fromDirection, stack, externalConnectionMask); + Connection[] retCons = new Connection[Integer.bitCount(validMask)]; + int conIter = 0; + for (int i = 0; i < 6; i++) + { + if ((validMask & (1 << i)) != 0) + { + retCons[conIter] = externalConnections[i]; + } + } + return retCons; + } + return super.getValidExternalConnections(fromDirection, walker); + } + + private int getValidMask(ForgeDirection incomingDirection, ItemStack stack, int inputMask) + { + int mask = 0; + int filteredMask = 0; + boolean filtered = false; + for (int i = 0; i < filters.length; i++) + { + if (incomingDirection.ordinal() != i) + { + if ((inputMask & (1 << i)) != 0) // No reason to look in non-networked directions + { + if (filters[i] == null) // If a direction is unfiltered and has a network connection. + { + mask = mask | (1 << i); + } + else if (logicalFilter[i] != null && logicalFilter[i].matches(stack))// We're filtered + { + filtered = true; + filteredMask = filteredMask | (1 << i); + } + } + } + } + // This is an annoying edge case where something is filtered in two different slots they need to be both selectable given a walker. + if (filtered) + { + return filteredMask; + } + return mask; + } + + public boolean isUseableByPlayer(EntityPlayer player) + { + return true; + } + + @Override + public void openInventory() { + + } + + @Override + public void closeInventory() { + + } + + public boolean isItemValidForSlot(int index, ItemStack stack) + { + return true; + } + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/HyperRationingPipeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/HyperRationingPipeLogic.java new file mode 100644 index 00000000..4c6d5efa --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/HyperRationingPipeLogic.java @@ -0,0 +1,33 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.pipe; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.NetworkLogic; + +public class HyperRationingPipeLogic extends NetworkLogic +{ + + public HyperRationingPipeLogic(ITransferNetworkComponent host) { + super(host); + } + + @Override + public boolean canConnectEnergy() { + return true; + } + + @Override + public boolean canConnectFluid() { + return true; + } + + @Override + public boolean canConnectItem() { + return true; + } + + @Override + public int getMaxInsertable() + { + return 1; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/ModSortingPipeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/ModSortingPipeLogic.java new file mode 100644 index 00000000..36b389ba --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/ModSortingPipeLogic.java @@ -0,0 +1,96 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.pipe; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityItemTransferNode; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.Connection; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.IWalkingComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.NetworkLogic; +import cpw.mods.fml.common.registry.GameRegistry; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; + +public class ModSortingPipeLogic extends NetworkLogic +{ + + public ModSortingPipeLogic(ITransferNetworkComponent host) { + super(host); + } + + @Override + public boolean canConnectEnergy() { + return true; + } + + @Override + public boolean canConnectFluid() { + return true; + } + + @Override + public boolean canConnectItem() { + return true; + } + + // Only valid external connection is across from the fromDirection + @Override + public Connection[] getValidExternalConnections(ForgeDirection fromDirection, IWalkingComponent walker) + { + { + // If we have an item Node we need to just return the valid connections + Object walkingObject = walker.getWalkingObject(); + if (walkingObject instanceof ItemStack stack) + { + Connection[] ret = new Connection[6]; + for (int i = 0; i < 6; i++) + { + Connection conn = externalConnections[i]; + if (conn != null && conn.canConnectItem()) + { + if (conn.target() instanceof IInventory inventory) + { + if (containsModItemOrEmpty(inventory, stack)) + { + ret[i] = conn; + continue; + } + } + } + ret[i] = null; + } + return ret; + } + // Just return everything because there's no rules for a non-ItemTransferNode + return externalConnections; + } + } + + private boolean containsModItemOrEmpty(IInventory inv, ItemStack target) + { + boolean empty = true; + for (int i = 0; i < inv.getSizeInventory(); i++) + { + ItemStack slot = inv.getStackInSlot(i); + + if (slot == null) + { + continue; + } + empty = false; + if (slot.getItem() == target.getItem() && + slot.getItemDamage() == target.getItemDamage()) + { + GameRegistry.UniqueIdentifier idA = GameRegistry.findUniqueIdentifierFor(target.getItem()); + GameRegistry.UniqueIdentifier idB = GameRegistry.findUniqueIdentifierFor(slot.getItem()); + + if (idA == null || idB == null) + { + return false; + } + + return idA.modId.equals(idB.modId); + } + } + return empty; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/PipeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/PipeLogic.java new file mode 100644 index 00000000..8e56cb9d --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/PipeLogic.java @@ -0,0 +1,28 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.pipe; + + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.NetworkLogic; + +public class PipeLogic extends NetworkLogic +{ + + public PipeLogic(ITransferNetworkComponent host) { + super(host); + } + + @Override + public boolean canConnectEnergy() { + return true; + } + + @Override + public boolean canConnectFluid() { + return true; + } + + @Override + public boolean canConnectItem() { + return true; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/RationingPipeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/RationingPipeLogic.java new file mode 100644 index 00000000..00ce167a --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/RationingPipeLogic.java @@ -0,0 +1,33 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.pipe; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.NetworkLogic; + +public class RationingPipeLogic extends NetworkLogic +{ + public RationingPipeLogic(ITransferNetworkComponent host) { + super(host); + } + + @Override + public boolean canConnectEnergy() { + return true; + } + + @Override + public boolean canConnectFluid() { + return true; + } + + @Override + public boolean canConnectItem() { + return true; + } + + @Override + public int getMaxInsertable() + { + return 64; + } + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/SortingPipeLogic.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/SortingPipeLogic.java new file mode 100644 index 00000000..6745ba9b --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/SharedNodeLogic/pipe/SortingPipeLogic.java @@ -0,0 +1,86 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.pipe; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.TileEntityItemTransferNode; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.Connection; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.IWalkingComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.NetworkLogic; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; + +public class SortingPipeLogic extends NetworkLogic +{ + + public SortingPipeLogic(ITransferNetworkComponent host) { + super(host); + } + + @Override + public boolean canConnectEnergy() { + return true; + } + + @Override + public boolean canConnectFluid() { + return true; + } + + @Override + public boolean canConnectItem() { + return true; + } + + @Override + public Connection[] getValidExternalConnections(ForgeDirection fromDirection, IWalkingComponent walker) + { + // If we have an item Node we need to just return the valid connections + if (walker instanceof TileEntityItemTransferNode itemNodeTE) + { + Connection[] ret = new Connection[6]; + for (int i = 0; i < 6; i++) + { + Connection conn = externalConnections[i]; + if (conn != null && conn.canConnectItem()) + { + if (conn.target() instanceof IInventory inventory) + { + if (containsItemOrEmpty(inventory, itemNodeTE.getStackInSlot(0))) + { + ret[i] = conn; + continue; + } + } + } + ret[i] = null; + } + return ret; + } + // Just return everything because there's no rules for a non-ItemTransferNode + return externalConnections; + } + + public static boolean containsItemOrEmpty(IInventory inv, ItemStack target) + { + boolean empty = true; + for (int i = 0; i < inv.getSizeInventory(); i++) + { + ItemStack slot = inv.getStackInSlot(i); + + if (slot == null) + { + continue; + } + empty = false; + if (slot.getItem() == target.getItem() && + slot.getItemDamage() == target.getItemDamage()) + { + if (ItemStack.areItemStackTagsEqual(slot, target)) + { + return true; + } + } + } + return empty; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/collision/PipeCollision.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/collision/PipeCollision.java new file mode 100644 index 00000000..900a386c --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/collision/PipeCollision.java @@ -0,0 +1,72 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.collision; + +import net.minecraft.util.AxisAlignedBB; + +public enum PipeCollision +{ + MIDDLE { + private static final AxisAlignedBB BOX = + AxisAlignedBB.getBoundingBox(0.375, 0.375, 0.375, 0.625, 0.625, 0.625); + + @Override + public AxisAlignedBB getBoundingBox() { + return BOX; + } + }, + NORTH { + private static final AxisAlignedBB BOX = + AxisAlignedBB.getBoundingBox(0.375, 0.375, 0.0, 0.625, 0.625, 0.375); + + @Override + public AxisAlignedBB getBoundingBox() { + return BOX; + } + }, + SOUTH { + private static final AxisAlignedBB BOX = + AxisAlignedBB.getBoundingBox(0.375, 0.375, 0.625, 0.625, 0.625, 1.0); + + @Override + public AxisAlignedBB getBoundingBox() { + return BOX; + } + }, + EAST { + private static final AxisAlignedBB BOX = + AxisAlignedBB.getBoundingBox(0.625, 0.375, 0.375, 1.0, 0.625, 0.625); + + @Override + public AxisAlignedBB getBoundingBox() { + return BOX; + } + }, + WEST { + private static final AxisAlignedBB BOX = + AxisAlignedBB.getBoundingBox(0.0, 0.375, 0.375, 0.375, 0.625, 0.625); + + @Override + public AxisAlignedBB getBoundingBox() { + return BOX; + } + }, + UP { + private static final AxisAlignedBB BOX = + AxisAlignedBB.getBoundingBox(0.375, 0.625, 0.375, 0.625, 1.0, 0.625); + + @Override + public AxisAlignedBB getBoundingBox() { + return BOX; + } + }, + DOWN { + private static final AxisAlignedBB BOX = + AxisAlignedBB.getBoundingBox(0.375, 0.0, 0.375, 0.625, 0.375, 0.625); + + @Override + public AxisAlignedBB getBoundingBox() { + return BOX; + } + }; + + public abstract AxisAlignedBB getBoundingBox(); +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/filter/ITransferFilter.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/filter/ITransferFilter.java deleted file mode 100644 index b455d1f8..00000000 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/filter/ITransferFilter.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.fouristhenumber.utilitiesinexcess.transfer.filter; - -public interface ITransferFilter { -} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/AdvancedFilterMode.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/AdvancedFilterMode.java new file mode 100644 index 00000000..e4cd43e2 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/AdvancedFilterMode.java @@ -0,0 +1,312 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.upgrade; + +import cofh.api.energy.IEnergyContainerItem; +import com.fouristhenumber.utilitiesinexcess.utils.OreDictionaryUtils; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemFood; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.FurnaceRecipes; +import net.minecraft.util.RegistryDefaulted; + +import static net.minecraft.block.BlockDispenser.dispenseBehaviorRegistry; + +public enum AdvancedFilterMode +{ + DEFAULT("Default.exe", "Does nothing") { + @Override + public boolean matches(ItemStack stack) + { + return true; + } + }, + ITEMS("Items.exe", "Filters Items") { + @Override + public boolean matches(ItemStack stack) + { + return !(stack.getItem() instanceof ItemBlock); + } + }, + BLOCKS("Blocks.exe", "Filters Blocks") { + @Override + public boolean matches(ItemStack stack) + { + return stack.getItem() instanceof ItemBlock; + } + }, + HASSUBTYPES("HasSubTypes.exe", "Filters items that have subtypes e.g. wool, or have Meta Items") { + @Override + public boolean matches(ItemStack stack) + { + Item item = stack.getItem(); + if (item == null) + { + return false; + } + return stack.getItem().getHasSubtypes(); + } + }, + STACKSIZE1("StackSize1.exe", "Filters items that have a maximum stack size of 1") { + @Override + public boolean matches(ItemStack stack) + { + return stack.getMaxStackSize() == 1; + } + }, + STACKSIZE64("StackSize64.exe", "Filters items that have a maximum stack size of 64") { + @Override + public boolean matches(ItemStack stack) + { + return stack.getMaxStackSize() == 64; + } + }, + OREDICTORE("OreDictOre.exe", "Filters items that are ore dictionaried to Ore") { + @Override + public boolean matches(ItemStack stack) + { + return OreDictionaryUtils.IsDictUnder(stack, "ore"); + } + }, + OREDICTINGOT("OreDictIngot.exe", "Filters items that are ore dictionaried to Ingot") { + @Override + public boolean matches(ItemStack stack) + { + return OreDictionaryUtils.IsDictUnder(stack, "ingot"); + } + }, + OREDICTNUGGET("OreDictNugget.exe", "Filters items that are ore dictionaried to Nugget") { + @Override + public boolean matches(ItemStack stack) + { + return OreDictionaryUtils.IsDictUnder(stack, "nugget"); + } + }, + OREDICTGEM("OreDictGem.exe", "Filters items that are ore dictionaried to Gem") { + @Override + public boolean matches(ItemStack stack) + { + return OreDictionaryUtils.IsDictUnder(stack, "gem"); + } + }, + OREDICTDUST("OreDictDust.exe", "Filters items that are ore dictionaried to Dust") { + @Override + public boolean matches(ItemStack stack) + { + return OreDictionaryUtils.IsDictUnder(stack, "dust"); + } + }, + OREDICTBLOCK("OreDictBlock.exe", "Filters items that are ore dictionaried to resource Blocks") { + @Override + public boolean matches(ItemStack stack) + { + return OreDictionaryUtils.IsDictUnder(stack, "block"); + } + }, + ENERGYITEM("EnergyItem.exe", "Filters items that can contain RF energy") { + @Override + public boolean matches(ItemStack stack) + { + return stack.getItem() instanceof IEnergyContainerItem; + } + }, + ENERGYITEMEMPTY("EnergyItemEmpty.exe", "Filters items that can contain RF energy and are empty") { + @Override + public boolean matches(ItemStack stack) + { + if (stack.getItem() instanceof IEnergyContainerItem energyItem) + { + return energyItem.getEnergyStored(stack) == 0; + } + return false; + } + }, + ENERGYITEMLESSTHAN50("EnergyItem<50.exe", "Filters items that can contain RF energy and contain less than 50% energy") { + @Override + public boolean matches(ItemStack stack) + { + if (stack.getItem() instanceof IEnergyContainerItem energyItem) + { + return energyItem.getEnergyStored(stack) < (energyItem.getMaxEnergyStored(stack) / 2); + } + return false; + } + }, + ENERGYITEMFULL("EnergyItemFull.exe", "Filters items that can contain RF energy and are full of energy") { + @Override + public boolean matches(ItemStack stack) + { + if (stack.getItem() instanceof IEnergyContainerItem energyItem) + { + return energyItem.getEnergyStored(stack) == energyItem.getMaxEnergyStored(stack); + } + return false; + } + }, + FOOD("Food.exe", "Filters food items") { + @Override + public boolean matches(ItemStack stack) + { + return stack != null && stack.getItem() instanceof ItemFood; + } + }, + SMELTABLE("Smeltable.exe", "Filters items that are smeltable") { + @Override + public boolean matches(ItemStack stack) + { + return FurnaceRecipes.smelting().getSmeltingResult(stack) != null; + } + }, + ENCHANTED("Enchanted.exe", "Filters items that are enchanted") { + @Override + public boolean matches(ItemStack stack) + { + return stack != null && stack.isItemEnchanted(); + } + }, + ENCHANTABLE("Enchantable.exe", "Filters items that can be enchanted") { + @Override + public boolean matches(ItemStack stack) + { + if (stack != null && stack.getItem() != null) { + return stack.getItem().getItemEnchantability() > 0; + } + return false; + } + }, + HASCONTAINERITEM("HasContainerItem.exe", "Filters items that have a container, e.g. water buckets") { + @Override + public boolean matches(ItemStack stack) { + if (stack != null && stack.getItem() != null) + { + return stack.getItem().hasContainerItem(stack); + } + return false; + } + }, + HASDURABILITYBARSHOWN("HasDurabilityBarShow.exe", "Filters items that have a durability bar that can be seen") { + @Override + public boolean matches(ItemStack stack) { + return stack != null && stack.isItemStackDamageable() && stack.getItemDamage() != 0; + } + }, + HASDURABILITYBARFULL("HasDurabilityBarFull.exe", "Filters items that have a durability bar and aren't damaged") { + @Override + public boolean matches(ItemStack stack) + { + return stack != null && stack.isItemStackDamageable() && stack.getItemDamage() == 0; + } + }, + DURABILITYBARLESSTHAN90("DurabilityBar<90.exe", "Filters items with less than 90% durability") { + @Override + public boolean matches(ItemStack stack) + { + float d = getDurabilityPercent(stack); + return d >= 0 && d < 0.90f; + } + }, + DURABILITYBARLESSTHAN50("DurabilityBar<50.exe", "Filters items with less than 50% durability") { + @Override + public boolean matches(ItemStack stack) + { + float d = getDurabilityPercent(stack); + return d >= 0 && d < 0.50f; + } + }, + DURABILITYBARLESSTHAN10("DurabilityBar<10.exe", "Filters items with less than 10% durability") { + @Override + public boolean matches(ItemStack stack) + { + float d = getDurabilityPercent(stack); + return d >= 0 && d < 0.10f; + } + }, + DURABLITYBAREMPTY("DurabilityBarEmpty.exe", "Filters items that are at max damage") { + @Override + public boolean matches(ItemStack stack) + { + return stack != null && stack.isItemStackDamageable() && stack.getItemDamage() >= stack.getMaxDamage(); + } + }, + HASDISPLAYNAME("HasDisplayName.exe", "Filters items with unique display text such as named items") { + @Override + public boolean matches(ItemStack stack) + { + return stack.hasDisplayName(); + } + }, + REPAIRABLE("Repairable.exe", "Filters items that are repairable in an anvil") { + @Override + public boolean matches(ItemStack stack) + { + if (stack == null || stack.getItem() == null) + { + return false; + } + Item item = stack.getItem(); + return item.isRepairable() && item.isDamageable(); + } + }, + HASDISPENSERBEHAVIOR("HasDispenserBehavior.exe", "Filters items that have unique usages in dispensers") { + @Override + public boolean matches(ItemStack stack) + { + return ((RegistryDefaulted) dispenseBehaviorRegistry).containsKey(stack.getItem()); + } + }, + PLANTABLE("Plantable.exe", "Filters items that are plantable on the ground or tilled soil") { + @Override + public boolean matches(ItemStack stack) { + return false; // God knows how to do this... I don't see how to do this without a registry. It's gonna be case by case. + } + }; + + private final String label; + + // I've added a description for these filter modes because personally it took me so long + // to figure some of them out I can assume most players have no idea. Some I still can't figureout. + private final String description; + AdvancedFilterMode(String label, String description) + { + this.label = label; + this.description = description; + } + + public String getLabel() + { + return label; + } + + public String getDescription() + { + return description; + } + + public static int getAdvFilterMode(ItemStack stack) + { + if (stack.stackTagCompound != null && stack.stackTagCompound.hasKey("AdvMode")) + { + return stack.stackTagCompound.getInteger("AdvMode"); + } + return DEFAULT.ordinal(); + } + + public abstract boolean matches(ItemStack stack); + + public boolean invMatches(ItemStack stack) + { + return !matches(stack); + } + + private static float getDurabilityPercent(ItemStack stack) + { + if (stack == null || !stack.isItemStackDamageable()) { + return -1f; + } + + int max = stack.getMaxDamage(); + if (max <= 0) return -1f; + + return (max - stack.getItemDamage()) / (float) max; + } + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/TransferUpgrade.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/TransferUpgrade.java index 229e549e..de9e4437 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/TransferUpgrade.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/TransferUpgrade.java @@ -5,10 +5,6 @@ import com.fouristhenumber.utilitiesinexcess.ModItems; import com.fouristhenumber.utilitiesinexcess.common.items.ItemUpgrade; import com.fouristhenumber.utilitiesinexcess.common.recipe.DisableableItemStack; -import com.fouristhenumber.utilitiesinexcess.transfer.walk.BreadthWalker; -import com.fouristhenumber.utilitiesinexcess.transfer.walk.DepthWalker; -import com.fouristhenumber.utilitiesinexcess.transfer.walk.ITransferWalker; -import com.fouristhenumber.utilitiesinexcess.transfer.walk.RoundRobinWalker; public enum TransferUpgrade { @@ -22,7 +18,7 @@ public enum TransferUpgrade { ENDER_RECEIVER(null), SEARCH_DEPTH(UpgradeType.WALKER), SEARCH_BREADTH(UpgradeType.WALKER), - SEARCH_ROUND_ROBIN(UpgradeType.WALKER), + SEARCH_ROUND_ROBIN(null), ADV_FILTER(UpgradeType.FILTER), ; @@ -51,15 +47,6 @@ public boolean isWalkerUpgrade() { return this.type == UpgradeType.WALKER; } - public ITransferWalker getWalker() { - return switch (this) { - case SEARCH_DEPTH -> new DepthWalker(); - case SEARCH_BREADTH -> new BreadthWalker(); - case SEARCH_ROUND_ROBIN -> new RoundRobinWalker(); - default -> null; - }; - } - public boolean isFilterUpgrade() { return this.type == UpgradeType.FILTER; } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/UpgradeInventory.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/UpgradeInventory.java deleted file mode 100644 index 0d7ade98..00000000 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/upgrade/UpgradeInventory.java +++ /dev/null @@ -1,178 +0,0 @@ -package com.fouristhenumber.utilitiesinexcess.transfer.upgrade; - -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.ItemStack; - -import org.jetbrains.annotations.Nullable; - -import com.fouristhenumber.utilitiesinexcess.transfer.filter.ITransferFilter; -import com.fouristhenumber.utilitiesinexcess.transfer.walk.ITransferWalker; -import com.fouristhenumber.utilitiesinexcess.transfer.walk.StandardWalker; - -public class UpgradeInventory implements IInventory { - - private final List inv; - - public UpgradeInventory(int slots) { - this.inv = Stream.generate(UpgradeData::new) - .limit(slots) - .collect(Collectors.toList()); - } - - public ITransferWalker getWalker() { - TransferUpgrade upgrade = getWalkerUpgrade(); - return upgrade == null ? new StandardWalker() : upgrade.getWalker(); - } - - private TransferUpgrade getWalkerUpgrade() { - return inv.stream() - .map(UpgradeData::getUpgrade) - .filter(TransferUpgrade::isWalkerUpgrade) - .findAny() - .orElse(null); - } - - @Nullable - public ITransferFilter getFilter() { - return null; // todo - } - - // IInventory - - @Override - public int getSizeInventory() { - return this.inv.size(); - } - - @Override - public ItemStack getStackInSlot(int index) { - if (index < 0) return null; - if (index > this.inv.size()) return null; - - return this.inv.get(index) - .getStack(); - } - - @Override - public ItemStack decrStackSize(int index, int count) { - if (index < 0) return null; - if (index > this.inv.size()) return null; - - UpgradeData data = this.inv.get(index); - if (data == null) return null; - - ItemStack stack = data.getStack(); - int toMove = Math.min(stack.stackSize, count); - ItemStack newStack = stack.copy(); - newStack.stackSize = toMove; - stack.stackSize -= toMove; - if (stack.stackSize == 0) { - data.clear(); - } - markDirty(); - return newStack; - } - - @Override - public void setInventorySlotContents(int index, ItemStack stack) { - if (index < 0) return; - if (index > this.inv.size()) return; - - UpgradeData data = this.inv.get(index); - data.set(stack); - markDirty(); - } - - @Override - public boolean isItemValidForSlot(int index, ItemStack stack) { - if (stack == null) return true; // allow stuff to be removed - TransferUpgrade upgrade = TransferUpgrade.getUpgrade(stack); - if (upgrade == null) return false; - - // Handle special cases - int walkerIndex = -1; - int filterIndex = -1; - for (int i = 0; i < this.inv.size(); i++) { - UpgradeData data = this.inv.get(i); - if (data.isEmpty()) continue; - - if (data.upgrade.isWalkerUpgrade()) walkerIndex = i; - if (data.upgrade.isFilterUpgrade()) filterIndex = i; - } - - if (upgrade.isWalkerUpgrade()) return walkerIndex == -1 || walkerIndex == index; - if (upgrade.isFilterUpgrade()) return walkerIndex == -1 || filterIndex == index; - return true; - } - - @Override - public void markDirty() { - // todo - } - - @Override - public String getInventoryName() { - return ""; - } - - @Override - public boolean hasCustomInventoryName() { - return false; - } - - @Override - public int getInventoryStackLimit() { - return 64; - } - - @Override - public boolean isUseableByPlayer(EntityPlayer player) { - return true; - } - - // IInventory - Unused for this inventory - - @Override - public ItemStack getStackInSlotOnClosing(int index) { - return null; - } - - @Override - public void openInventory() {} - - @Override - public void closeInventory() {} - - private static class UpgradeData { - - private ItemStack stack; - private TransferUpgrade upgrade; - - public void set(ItemStack stack) { - this.stack = stack; - this.upgrade = TransferUpgrade.getUpgrade(stack); - } - - public ItemStack getStack() { - return this.stack; - } - - public TransferUpgrade getUpgrade() { - return this.upgrade; - } - - public boolean isEmpty() { - return this.stack == null; - } - - public void clear() { - this.stack = null; - this.upgrade = null; - } - } -} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/DepthWalker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/DepthWalker.java deleted file mode 100644 index fe5fd8a1..00000000 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/DepthWalker.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.fouristhenumber.utilitiesinexcess.transfer.walk; - -public class DepthWalker implements ITransferWalker { -} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ITransferWalker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ITransferWalker.java deleted file mode 100644 index bbc96776..00000000 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ITransferWalker.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.fouristhenumber.utilitiesinexcess.transfer.walk; - -public interface ITransferWalker { -} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ItemWalker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ItemWalker.java new file mode 100644 index 00000000..a231abc3 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/ItemWalker.java @@ -0,0 +1,48 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.walk; + +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.IWalkingComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper.ItemTargetResolver; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper.RandomStepper; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper.StepStrategy; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper.TargetResolver; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; + +import java.util.List; + +public class ItemWalker extends WalkerBase +{ + StepStrategy stepper; + TargetResolver targeter = new ItemTargetResolver(); + + public ItemWalker(IWalkingComponent originComponent) + { + super(originComponent); + stepper = new RandomStepper(TransportType.ITEM); + } + + @Override + public void step() + { + currentComponent = stepper.step(currentComponent, walkingComponent); + } + + @Override + public List> getValidTargets() + { + return targeter.getValidTargets(currentComponent, walkingComponent, stepper.fromDirection); + } + + // Gets the amount of items that can be put into an inventory by a certain component. This is relevant + // for rationing pipes. If result is -1, the limit is ignored. + @Override + public int getInsertLimit() { + return currentComponent.getInsertLimit(); + } + + @Override + public void reset() + { + currentComponent = stepper.reset(currentComponent, walkingComponent); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/RoundRobinWalker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/RoundRobinWalker.java deleted file mode 100644 index e394349b..00000000 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/RoundRobinWalker.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.fouristhenumber.utilitiesinexcess.transfer.walk; - -public class RoundRobinWalker implements ITransferWalker { -} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/StandardWalker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/StandardWalker.java deleted file mode 100644 index d7770ebb..00000000 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/StandardWalker.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.fouristhenumber.utilitiesinexcess.transfer.walk; - -public class StandardWalker implements ITransferWalker { -} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/BreadthWalker.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/TransportType.java similarity index 51% rename from src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/BreadthWalker.java rename to src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/TransportType.java index 3e47ddd6..a4c798c7 100644 --- a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/BreadthWalker.java +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/TransportType.java @@ -1,4 +1,8 @@ package com.fouristhenumber.utilitiesinexcess.transfer.walk; -public class BreadthWalker implements ITransferWalker { +public enum TransportType { + + ITEM, + FLUID, + ENERGY } diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/WalkerBase.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/WalkerBase.java new file mode 100644 index 00000000..182a9132 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/WalkerBase.java @@ -0,0 +1,44 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.walk; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.IWalkingComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper.TargetResolver; + +import java.util.List; +import java.util.Random; + +public abstract class WalkerBase +{ + protected IWalkingComponent walkingComponent; + protected ITransferNetworkComponent currentComponent; + + Random rand = new Random(); + WalkerBase(IWalkingComponent walkingComponent) + { + this.walkingComponent = walkingComponent; + this.currentComponent = walkingComponent; + } + public abstract void step(); + + public String getLocationString() + { + if (currentComponent == null) + { + return ""; + } + StringBuilder location = new StringBuilder(); + location.append("x: "); + location.append(currentComponent.getX() - walkingComponent.getX()); + location.append(" y: "); + location.append(currentComponent.getY() - walkingComponent.getY()); + location.append(" z: "); + location.append(currentComponent.getZ() - walkingComponent.getZ()); + return location.toString(); + } + + public abstract void reset(); + + public abstract List> getValidTargets(); + + public abstract int getInsertLimit(); +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/BFSStepper.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/BFSStepper.java new file mode 100644 index 00000000..fdbe1ce4 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/BFSStepper.java @@ -0,0 +1,25 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.IWalkingComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.TransportType; + +public class BFSStepper extends StepStrategy +{ + + public BFSStepper(TransportType transporting) { + super(transporting); + } + + @Override + public ITransferNetworkComponent step(ITransferNetworkComponent currentComponent, IWalkingComponent walkingComponent) + { + return null; + } + + @Override + public ITransferNetworkComponent reset(ITransferNetworkComponent currentComponent, IWalkingComponent walkingComponent) + { + return null; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/DFSStepper.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/DFSStepper.java new file mode 100644 index 00000000..e6297d7b --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/DFSStepper.java @@ -0,0 +1,23 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.IWalkingComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.TransportType; + +public class DFSStepper extends StepStrategy +{ + + public DFSStepper(TransportType transporting) { + super(transporting); + } + + @Override + public ITransferNetworkComponent step(ITransferNetworkComponent currentComponent, IWalkingComponent walkingComponent) { + return null; + } + + @Override + public ITransferNetworkComponent reset(ITransferNetworkComponent currentComponent, IWalkingComponent walkingComponent) { + return null; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/ItemTargetResolver.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/ItemTargetResolver.java new file mode 100644 index 00000000..302b72e9 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/ItemTargetResolver.java @@ -0,0 +1,29 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.Connection; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.IWalkingComponent; +import net.minecraft.inventory.IInventory; +import net.minecraftforge.common.util.ForgeDirection; + +import java.util.ArrayList; +import java.util.List; + +public class ItemTargetResolver implements TargetResolver { + + @Override + public List> getValidTargets(ITransferNetworkComponent from, IWalkingComponent walking, ForgeDirection fromDir) + { + Connection[] conns = from.getValidExternalNeighbors(fromDir, walking); + + List> validTargets = new ArrayList<>(); + for (Connection conn : conns) + { + if (conn != null && conn.canConnectItem()) + { + validTargets.add(new Target<>((IInventory) conn.target(), conn.side())); + } + } + return validTargets; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/RandomStepper.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/RandomStepper.java new file mode 100644 index 00000000..05a1db2d --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/RandomStepper.java @@ -0,0 +1,42 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.IWalkingComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.TransportType; +import com.fouristhenumber.utilitiesinexcess.utils.MaskedArrayView; +import net.minecraftforge.common.util.ForgeDirection; + +import java.util.Random; + +public class RandomStepper extends StepStrategy +{ + Random rand = new Random(); + + public RandomStepper(TransportType transporting) { + super(transporting); + } + + @Override + public ITransferNetworkComponent step(ITransferNetworkComponent currentComponent, IWalkingComponent walkingComponent) + { + ITransferNetworkComponent newComponent; + MaskedArrayView options = currentComponent.getWalkableDirs(transporting, fromDirection, walkingComponent); + if (options.size() != 0) + { + int direction = rand.nextInt(options.size()); + newComponent = options.get(direction); + fromDirection = ForgeDirection.getOrientation(options.actualLocation(direction)).getOpposite(); + } + else + { + newComponent = walkingComponent; + fromDirection = null; + } + return newComponent; + } + + @Override + public ITransferNetworkComponent reset(ITransferNetworkComponent currentComponent, IWalkingComponent walkingComponent) { + return currentComponent; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/RoundRobinStepper.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/RoundRobinStepper.java new file mode 100644 index 00000000..24221050 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/RoundRobinStepper.java @@ -0,0 +1,22 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.IWalkingComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.TransportType; + +public class RoundRobinStepper extends StepStrategy +{ + public RoundRobinStepper(TransportType transporting) { + super(transporting); + } + + @Override + public ITransferNetworkComponent step(ITransferNetworkComponent currentComponent, IWalkingComponent walkingComponent) { + return null; + } + + @Override + public ITransferNetworkComponent reset(ITransferNetworkComponent currentComponent, IWalkingComponent walkingComponent) { + return null; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/StepStrategy.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/StepStrategy.java new file mode 100644 index 00000000..06c0c554 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/StepStrategy.java @@ -0,0 +1,28 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.IWalkingComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.walk.TransportType; +import net.minecraftforge.common.util.ForgeDirection; + +public abstract class StepStrategy +{ + public ForgeDirection fromDirection; + public TransportType transporting; + + public enum Strategy + { + RANDOM, + BFS, + DFS, + ROUND_ROBIN + } + + StepStrategy(TransportType type) + { + this.transporting = type; + } + + public abstract ITransferNetworkComponent step(ITransferNetworkComponent currentComponent, IWalkingComponent walkingComponent); + public abstract ITransferNetworkComponent reset(ITransferNetworkComponent currentComponent, IWalkingComponent walkingComponent); +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/TargetResolver.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/TargetResolver.java new file mode 100644 index 00000000..efa36c17 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/transfer/walk/stepper/TargetResolver.java @@ -0,0 +1,25 @@ +package com.fouristhenumber.utilitiesinexcess.transfer.walk.stepper; + +import com.fouristhenumber.utilitiesinexcess.common.tileentities.transfer.ITransferNetworkComponent; +import com.fouristhenumber.utilitiesinexcess.transfer.SharedNodeLogic.IWalkingComponent; +import net.minecraftforge.common.util.ForgeDirection; + +import java.util.List; + +public interface TargetResolver +{ + List> getValidTargets( + ITransferNetworkComponent from, IWalkingComponent walking, ForgeDirection fromDir); + + class Target + { + public final T handler; + public final int side; + + public Target(T handler, int side) + { + this.handler = handler; + this.side = side; + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ColoredSlots.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ColoredSlots.java new file mode 100644 index 00000000..6dc2b9c9 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ColoredSlots.java @@ -0,0 +1,34 @@ +package com.fouristhenumber.utilitiesinexcess.utils; + +import com.cleanroommc.modularui.api.IThemeApi; +import com.cleanroommc.modularui.drawable.GuiTextures; +import com.cleanroommc.modularui.theme.SlotTheme; +import com.cleanroommc.modularui.theme.WidgetThemeKey; +import com.cleanroommc.modularui.utils.Color; + +public enum ColoredSlots +{ + PINK_SLOT(0xee90ad), + ORANGE_SLOT(0xf17716), + PURPLE_SLOT(0x4c17a9), + GREEN_SLOT(0x556e1c), + CYAN_SLOT(0x3cb0da), + YELLOW_SLOT(0xf1af15); + + public static void init() {}; + + + public WidgetThemeKey SLOT_KEY; + + ColoredSlots(int color) + { + SLOT_KEY = IThemeApi.get().widgetThemeKeyBuilder(this.toString(), SlotTheme.class) + .defaultTheme(new SlotTheme(18, 18, GuiTextures.SLOT_ITEM, color, 0xFF404040, false, color, Color.withAlpha(color, 0x60))) + .register(); + } + + public WidgetThemeKey get() + { + return SLOT_KEY; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackInventory.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackInventory.java new file mode 100644 index 00000000..fec67e0e --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackInventory.java @@ -0,0 +1,182 @@ +package com.fouristhenumber.utilitiesinexcess.utils; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; + +import java.util.ArrayList; +import java.util.List; + +public class ItemStackInventory implements IInventory +{ + private final int size; + private final ItemStack[] filters; + private final int stackLimit; + private boolean dirty = false; + + public ItemStackInventory(ItemStack stack, int size, int stackLimit) + { + this.stackLimit = stackLimit; + NBTTagCompound nbt = stack.getTagCompound(); + if (nbt == null) + { + nbt = new NBTTagCompound(); + stack.setTagCompound(nbt); + } + + this.size = nbt.hasKey("size") ? nbt.getInteger("size") : size; + this.filters = new ItemStack[this.size]; + + NBTTagList list = nbt.getTagList("Items", 10); + + for (int i = 0; i < list.tagCount(); i++) + { + NBTTagCompound itemTag = list.getCompoundTagAt(i); + + int slot = itemTag.getByte("Slot") & 255; + + if (slot >= 0 && slot < this.size) + { + filters[slot] = ItemStack.loadItemStackFromNBT(itemTag); + } + } + } + + public void writeInventoryToHeldStack(EntityPlayer player) + { + if (!dirty || player.getEntityWorld().isRemote) + { + return; + } + ItemStack heldStack = player.getHeldItem(); + if (heldStack == null) + { + return; // This can happen if you don't lock the slot the inventory is from. + } + if (heldStack.stackTagCompound == null) + { + heldStack.stackTagCompound = new NBTTagCompound(); + } + NBTTagCompound compound = heldStack.stackTagCompound; + compound.setInteger("size", filters.length); + NBTTagList itemList = new NBTTagList(); + for (int i = 0; i < filters.length; i++) + { + ItemStack stack = filters[i]; + if (stack != null) + { + NBTTagCompound itemCompound = new NBTTagCompound(); + itemCompound.setByte("Slot", (byte) i); + stack.writeToNBT(itemCompound); + itemList.appendTag(itemCompound); + } + } + compound.setTag("Items", itemList); + } + + public static List getInventoryContentsFromStack(ItemStack itemInventory) + { + if (itemInventory == null || !itemInventory.hasTagCompound()) + { + return null; + } + + NBTTagCompound compound = itemInventory.stackTagCompound; + + if (!compound.hasKey("Items")) + { + return null; + } + + int size = compound.getInteger("size"); + List contents = new ArrayList(size); + + NBTTagList itemList = compound.getTagList("Items", 10); // 10 = NBTTagCompound + + for (int i = 0; i < itemList.tagCount(); i++) + { + NBTTagCompound itemCompound = itemList.getCompoundTagAt(i); + contents.add(ItemStack.loadItemStackFromNBT(itemCompound)); + } + + return contents; + } + + @Override + public int getSizeInventory() { + return size; + } + + @Override + public ItemStack getStackInSlot(int slotIn) { + return filters[slotIn]; + } + + @Override + public ItemStack decrStackSize(int index, int count) + { + if (filters[index] == null) + { + return null; + } + markDirty(); + return filters[index].splitStack(count); + } + + @Override + public ItemStack getStackInSlotOnClosing(int index) + { + return filters[index]; + } + + @Override + public void setInventorySlotContents(int index, ItemStack stack) + { + filters[index] = stack; + markDirty(); + } + + @Override + public String getInventoryName() { + return "upgrade_inventory"; + } + + @Override + public boolean hasCustomInventoryName() { + return false; + } + + @Override + public int getInventoryStackLimit() { + return stackLimit; + } + + @Override + public void markDirty() { + this.dirty = true; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player) { + return false; + } + + @Override + public void openInventory() { + + } + + @Override + public void closeInventory() { + + } + + @Override + public boolean isItemValidForSlot(int index, ItemStack stack) { + return true; + } + + +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackInventoryContainer.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackInventoryContainer.java new file mode 100644 index 00000000..cd061197 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/ItemStackInventoryContainer.java @@ -0,0 +1,6 @@ +package com.fouristhenumber.utilitiesinexcess.utils; + +public interface ItemStackInventoryContainer +{ + int getInventorySize(); +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/MaskedArrayView.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/MaskedArrayView.java new file mode 100644 index 00000000..45de2506 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/MaskedArrayView.java @@ -0,0 +1,54 @@ +package com.fouristhenumber.utilitiesinexcess.utils; + +public class MaskedArrayView +{ + private int mask = 0; + private final T[] array; + + public MaskedArrayView(int mask, T[] array) + { + this.mask = mask; + this.array = array; + } + + public int size() + { + return Integer.bitCount(mask); + } + + public T get(int i) + { + int count = 0; + + for (int bit = 0; bit < array.length; bit++) + { + if ((mask & (1 << bit)) != 0) + { + if (count == i) + { + return array[bit]; + } + count++; + } + } + + throw new IndexOutOfBoundsException(); + } + + public int actualLocation(int index) + { + int location = 0; + for (int bit = 0; bit < array.length; bit++) + { + if ((mask & (1 << bit)) != 0) + { + if (location == index) + { + return bit; + } + location++; + } + } + throw new IndexOutOfBoundsException(); + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/OreDictionaryUtils.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/OreDictionaryUtils.java new file mode 100644 index 00000000..ff20cb05 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/OreDictionaryUtils.java @@ -0,0 +1,19 @@ +package com.fouristhenumber.utilitiesinexcess.utils; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.OreDictionary; + +public class OreDictionaryUtils +{ + public static boolean IsDictUnder(ItemStack stack, String dictionaryTerm) { + if (stack == null) return false; + + for (int id : OreDictionary.getOreIDs(stack)) { + if (OreDictionary.getOreName(id).startsWith(dictionaryTerm)) { + return true; + } + } + + return false; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/filter/ItemFilter.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/filter/ItemFilter.java new file mode 100644 index 00000000..c19f6f6a --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/filter/ItemFilter.java @@ -0,0 +1,87 @@ +package com.fouristhenumber.utilitiesinexcess.utils.filter; + +import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +import java.util.function.Predicate; + +public class ItemFilter +{ + private final Reference2ObjectOpenHashMap itemRules = new Reference2ObjectOpenHashMap<>(); + private final PredicateRules predicateRules = new PredicateRules(); + + // Blacklists override whitelists. If an item is found in the blacklist it doesn't matter if the item + // has been whitelisted, but we do need to know if there are whitelists at all so we do need a flag here. + // Counts for both predicates whitelists and item whitelists. + boolean hasWhitelist = false; + + // Heavily commented because this logic is fucking confusing for me. + public boolean matches(ItemStack stack) + { + // If there's no rules in the whole filter, just do nothing. + // Don't think this can happen, but guarding anyway. + if (itemRules.isEmpty() && predicateRules.isEmpty()) + { + return true; + } + + // If we have a rule, check it, otherwise if there's no rule for the item we return if no specific whitelist or predicate whitelist + // exists on the whole filter. This means we have blacklist only filter, and we can accept the item. + ItemRules rules = itemRules.get(stack.getItem()); + if (rules == null) + { + // so here we couldn't find a rule for this block, now we check if there is actually no rules at all + if (itemRules.isEmpty()) + { + // If there are no rules check the predicates of this filter + if (predicateRules.matchesBlackLists(stack)) + { + return false; + } + else if (predicateRules.matchesWhiteLists(stack)) + { + return true; + } + } + return !hasWhitelist; + } + + // Check the blacklists + if (rules.matchesBlacklists(stack) || predicateRules.matchesBlackLists(stack)) + { + return false; + } + + // Check the whitelists + return rules.matchesWhitelists(stack) && predicateRules.matchesWhiteLists(stack); + } + + public void addToRuleList(ItemStack stack, boolean inverted, MatchMode mode) + { + if (stack.getItem() != null) + { + ItemRules rules = itemRules.get(stack.getItem()); + if (rules == null) + { + rules = new ItemRules(); + itemRules.put(stack.getItem(), rules); + } + rules.addRule(stack, inverted, mode); + + if (!inverted) + { + hasWhitelist = true; + } + } + } + + public void addToPredicates(Predicate pred, boolean inverted) + { + predicateRules.add(pred, inverted); + if (!inverted) + { + hasWhitelist = true; + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/filter/ItemRule.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/filter/ItemRule.java new file mode 100644 index 00000000..9eb87657 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/filter/ItemRule.java @@ -0,0 +1,29 @@ +package com.fouristhenumber.utilitiesinexcess.utils.filter; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public class ItemRule +{ + private MatchMode mode; + private int meta; + private NBTTagCompound nbt; + + public ItemRule(MatchMode mode, int meta, NBTTagCompound nbt) + { + this.mode = mode; + this.meta = meta; + this.nbt = nbt; + } + + // This matches function is called after we've already matched on the item so no need to compare it. + boolean matches(ItemStack stack) + { + return switch (mode) { + case DEFAULT -> stack.stackTagCompound == nbt && stack.getItemDamage() == meta; + case IGNORE_NBT -> stack.getItemDamage() == meta; + case IGNORE_META -> stack.stackTagCompound == nbt; + case IGNORE_NBT_MET -> true; + }; + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/filter/ItemRules.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/filter/ItemRules.java new file mode 100644 index 00000000..3e78496f --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/filter/ItemRules.java @@ -0,0 +1,50 @@ +package com.fouristhenumber.utilitiesinexcess.utils.filter; + +import net.minecraft.item.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class ItemRules +{ + + private final List blacklists = new ArrayList<>(); + private final List whitelists = new ArrayList<>(); + + public boolean matchesBlacklists(ItemStack stack) { + + for (ItemRule rule : blacklists) { + if (rule.matches(stack)) { + return true; + } + } + return false; + } + + public boolean matchesWhitelists(ItemStack stack) + { + if (whitelists.isEmpty()) { + return true; + } + + for (ItemRule rule : whitelists) { + if (rule.matches(stack)) { + return true; + } + } + + return false; + } + + public void addRule(ItemStack stack, boolean inverted, MatchMode mode) + { + if (inverted) + { + blacklists.add(new ItemRule(mode, stack.getItemDamage(), stack.stackTagCompound)); + } + else + { + whitelists.add(new ItemRule(mode, stack.getItemDamage(), stack.stackTagCompound)); + } + } +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/filter/MatchMode.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/filter/MatchMode.java new file mode 100644 index 00000000..ef69005e --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/filter/MatchMode.java @@ -0,0 +1,9 @@ +package com.fouristhenumber.utilitiesinexcess.utils.filter; + +public enum MatchMode +{ + IGNORE_META, + IGNORE_NBT, + IGNORE_NBT_MET, + DEFAULT +} diff --git a/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/filter/PredicateRules.java b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/filter/PredicateRules.java new file mode 100644 index 00000000..8145ab57 --- /dev/null +++ b/src/main/java/com/fouristhenumber/utilitiesinexcess/utils/filter/PredicateRules.java @@ -0,0 +1,56 @@ +package com.fouristhenumber.utilitiesinexcess.utils.filter; + +import net.minecraft.item.ItemStack; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Predicate; + +public class PredicateRules +{ + private final List> whiteListPredicates = new ArrayList<>(); + private final List> blackListPredicates = new ArrayList<>(); + + public boolean isEmpty() + { + return whiteListPredicates.isEmpty() && blackListPredicates.isEmpty(); + } + + // All whitelists must match to pass + public boolean matchesWhiteLists(ItemStack stack) + { + for (Predicate whiteListPredicate : whiteListPredicates) + { + if (!whiteListPredicate.test(stack)) + { + return false; + } + } + return true; + } + + // Only one blacklist must match to fail + public boolean matchesBlackLists(ItemStack stack) + { + for (Predicate blackListPredicate : blackListPredicates) + { + if (blackListPredicate.test(stack)) + { + return true; + } + } + return false; + } + + public void add(Predicate pred, boolean inverted) + { + if (inverted) + { + blackListPredicates.add(pred); + } + else + { + whiteListPredicates.add(pred); + } + } +} diff --git a/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang index 4bdcb2df..fe93775f 100644 --- a/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang +++ b/src/main/resources/assets/utilitiesinexcess/lang/en_US.lang @@ -561,3 +561,5 @@ ue_wall.name=%s Wall ue_fence.name=%s Fence ue_sphere.name=%s Impossible Object +gui.title.filter_pipe.name=Filter Pipe +gui.title.filter.name=Filter diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_0.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_0.png new file mode 100644 index 00000000..9902598b Binary files /dev/null and b/src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_0.png differ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_1.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_1.png new file mode 100644 index 00000000..9902598b Binary files /dev/null and b/src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_1.png differ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_2.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_2.png new file mode 100644 index 00000000..6b770953 Binary files /dev/null and b/src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_2.png differ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_3.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_3.png new file mode 100644 index 00000000..6b770953 Binary files /dev/null and b/src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_3.png differ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_4.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_4.png new file mode 100644 index 00000000..13727e9f Binary files /dev/null and b/src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_4.png differ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_5.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_5.png new file mode 100644 index 00000000..13727e9f Binary files /dev/null and b/src/main/resources/assets/utilitiesinexcess/textures/blocks/filter_pipe_5.png differ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/hyper_rationing_pipe.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/hyper_rationing_pipe.png new file mode 100644 index 00000000..d8af78b0 Binary files /dev/null and b/src/main/resources/assets/utilitiesinexcess/textures/blocks/hyper_rationing_pipe.png differ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/mod_sorting_pipe.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/mod_sorting_pipe.png new file mode 100644 index 00000000..91a93923 Binary files /dev/null and b/src/main/resources/assets/utilitiesinexcess/textures/blocks/mod_sorting_pipe.png differ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/rationing_pipe.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/rationing_pipe.png new file mode 100644 index 00000000..0ef812e0 Binary files /dev/null and b/src/main/resources/assets/utilitiesinexcess/textures/blocks/rationing_pipe.png differ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/sorting_pipe.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/sorting_pipe.png new file mode 100644 index 00000000..df14b4b1 Binary files /dev/null and b/src/main/resources/assets/utilitiesinexcess/textures/blocks/sorting_pipe.png differ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/blocks/transfer_pipe.png b/src/main/resources/assets/utilitiesinexcess/textures/blocks/transfer_pipe.png index 63449450..a009fbda 100644 Binary files a/src/main/resources/assets/utilitiesinexcess/textures/blocks/transfer_pipe.png and b/src/main/resources/assets/utilitiesinexcess/textures/blocks/transfer_pipe.png differ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_adv_filter.png b/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_adv_filter.png new file mode 100644 index 00000000..14c48c90 Binary files /dev/null and b/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_adv_filter.png differ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_creative.png b/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_creative.png new file mode 100644 index 00000000..9f4108b2 Binary files /dev/null and b/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_creative.png differ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_ender_receiver.png b/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_ender_receiver.png new file mode 100644 index 00000000..77aec087 Binary files /dev/null and b/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_ender_receiver.png differ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_ender_transmitter.png b/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_ender_transmitter.png new file mode 100644 index 00000000..fbc5421f Binary files /dev/null and b/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_ender_transmitter.png differ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_filter.png b/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_filter.png new file mode 100644 index 00000000..15328962 Binary files /dev/null and b/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_filter.png differ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_search_breadth.png b/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_search_breadth.png new file mode 100644 index 00000000..9a9cec83 Binary files /dev/null and b/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_search_breadth.png differ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_search_depth.png b/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_search_depth.png new file mode 100644 index 00000000..b60337e5 Binary files /dev/null and b/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_search_depth.png differ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_search_round_robin.png b/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_search_round_robin.png new file mode 100644 index 00000000..2f6f312f Binary files /dev/null and b/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_search_round_robin.png differ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_speed.png b/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_speed.png new file mode 100644 index 00000000..18ce4d3d Binary files /dev/null and b/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_speed.png differ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_stack.png b/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_stack.png new file mode 100644 index 00000000..9210c768 Binary files /dev/null and b/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_stack.png differ diff --git a/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_world_interaction.png b/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_world_interaction.png new file mode 100644 index 00000000..34d4aa67 Binary files /dev/null and b/src/main/resources/assets/utilitiesinexcess/textures/items/upgrade_world_interaction.png differ