From 0255340626a2ff07b375fabc7321a39d8d2223f5 Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Fri, 4 Dec 2020 19:32:16 +0100 Subject: [PATCH] added random and round robin sorting modifiers Closes #52 --- .../java/de/ellpeck/prettypipes/Registry.java | 1 + .../de/ellpeck/prettypipes/items/IModule.java | 6 +-- .../ellpeck/prettypipes/items/ModuleItem.java | 11 ++-- .../prettypipes/network/PipeNetwork.java | 4 +- .../prettypipes/pipe/PipeTileEntity.java | 6 +++ .../pipe/modules/SortingModuleItem.java | 49 ++++++++++++++++++ .../assets/prettypipes/lang/en_us.json | 4 ++ .../models/item/random_sorting_modifier.json | 6 +++ .../item/round_robin_sorting_modifier.json | 6 +++ .../textures/item/random_sorting_modifier.png | Bin 0 -> 272 bytes .../item/round_robin_sorting_modifier.png | Bin 0 -> 317 bytes .../recipes/random_sorting_modifier.json | 22 ++++++++ .../recipes/round_robin_sorting_modifier.json | 22 ++++++++ 13 files changed, 130 insertions(+), 7 deletions(-) create mode 100644 src/main/java/de/ellpeck/prettypipes/pipe/modules/SortingModuleItem.java create mode 100644 src/main/resources/assets/prettypipes/models/item/random_sorting_modifier.json create mode 100644 src/main/resources/assets/prettypipes/models/item/round_robin_sorting_modifier.json create mode 100644 src/main/resources/assets/prettypipes/textures/item/random_sorting_modifier.png create mode 100644 src/main/resources/assets/prettypipes/textures/item/round_robin_sorting_modifier.png create mode 100644 src/main/resources/data/prettypipes/recipes/random_sorting_modifier.json create mode 100644 src/main/resources/data/prettypipes/recipes/round_robin_sorting_modifier.json diff --git a/src/main/java/de/ellpeck/prettypipes/Registry.java b/src/main/java/de/ellpeck/prettypipes/Registry.java index cb60a9f..7dbfd57 100644 --- a/src/main/java/de/ellpeck/prettypipes/Registry.java +++ b/src/main/java/de/ellpeck/prettypipes/Registry.java @@ -152,6 +152,7 @@ public final class Registry { registry.register(new RedstoneModuleItem("redstone_module")); registry.register(new FilterIncreaseModuleItem("filter_increase_modifier")); registry.registerAll(createTieredModule("crafting_module", CraftingModuleItem::new)); + registry.registerAll(Arrays.stream(SortingModuleItem.Type.values()).map(t -> new SortingModuleItem(t.name().toLowerCase(Locale.ROOT) + "_sorting_modifier", t)).toArray(Item[]::new)); ForgeRegistries.BLOCKS.getValues().stream() .filter(b -> b.getRegistryName().getNamespace().equals(PrettyPipes.ID)) diff --git a/src/main/java/de/ellpeck/prettypipes/items/IModule.java b/src/main/java/de/ellpeck/prettypipes/items/IModule.java index ed104ed..6481aa4 100644 --- a/src/main/java/de/ellpeck/prettypipes/items/IModule.java +++ b/src/main/java/de/ellpeck/prettypipes/items/IModule.java @@ -1,8 +1,7 @@ package de.ellpeck.prettypipes.items; -import de.ellpeck.prettypipes.misc.ItemEqualityType; -import de.ellpeck.prettypipes.pipe.containers.AbstractPipeContainer; import de.ellpeck.prettypipes.pipe.PipeTileEntity; +import de.ellpeck.prettypipes.pipe.containers.AbstractPipeContainer; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.item.ItemStack; @@ -11,7 +10,6 @@ import net.minecraftforge.items.IItemHandler; import java.util.List; import java.util.function.Consumer; -import java.util.function.Predicate; public interface IModule { @@ -40,4 +38,6 @@ public interface IModule { int getCraftableAmount(ItemStack module, PipeTileEntity tile, Consumer unavailableConsumer, ItemStack stack); ItemStack craft(ItemStack module, PipeTileEntity tile, BlockPos destPipe, Consumer unavailableConsumer, ItemStack stack); + + Integer getCustomNextNode(ItemStack module, PipeTileEntity tile, List nodes, int index); } diff --git a/src/main/java/de/ellpeck/prettypipes/items/ModuleItem.java b/src/main/java/de/ellpeck/prettypipes/items/ModuleItem.java index 3292189..8fd3541 100644 --- a/src/main/java/de/ellpeck/prettypipes/items/ModuleItem.java +++ b/src/main/java/de/ellpeck/prettypipes/items/ModuleItem.java @@ -2,16 +2,15 @@ package de.ellpeck.prettypipes.items; import de.ellpeck.prettypipes.Registry; import de.ellpeck.prettypipes.Utility; -import de.ellpeck.prettypipes.misc.ItemEqualityType; -import de.ellpeck.prettypipes.pipe.containers.AbstractPipeContainer; import de.ellpeck.prettypipes.pipe.PipeTileEntity; +import de.ellpeck.prettypipes.pipe.containers.AbstractPipeContainer; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.*; +import net.minecraft.util.text.ITextComponent; import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -20,6 +19,7 @@ import net.minecraftforge.items.IItemHandler; import javax.annotation.Nullable; import java.util.Collections; import java.util.List; +import java.util.Optional; import java.util.function.Consumer; public abstract class ModuleItem extends Item implements IModule { @@ -92,4 +92,9 @@ public abstract class ModuleItem extends Item implements IModule { public ItemStack craft(ItemStack module, PipeTileEntity tile, BlockPos destPipe, Consumer unavailableConsumer, ItemStack stack) { return stack; } + + @Override + public Integer getCustomNextNode(ItemStack module, PipeTileEntity tile, List nodes, int index) { + return null; + } } diff --git a/src/main/java/de/ellpeck/prettypipes/network/PipeNetwork.java b/src/main/java/de/ellpeck/prettypipes/network/PipeNetwork.java index 76a7a37..5400f9a 100644 --- a/src/main/java/de/ellpeck/prettypipes/network/PipeNetwork.java +++ b/src/main/java/de/ellpeck/prettypipes/network/PipeNetwork.java @@ -144,7 +144,9 @@ public class PipeNetwork implements ICapabilitySerializable, GraphL if (startPipe == null) return stack; this.startProfile("find_destination"); - for (BlockPos pipePos : this.getOrderedNetworkNodes(startPipePos)) { + List nodes = this.getOrderedNetworkNodes(startPipePos); + for (int i = 0; i < nodes.size(); i++) { + BlockPos pipePos = nodes.get(startPipe.getNextNode(nodes, i)); if (!this.world.isBlockLoaded(pipePos)) continue; PipeTileEntity pipe = this.getPipe(pipePos); diff --git a/src/main/java/de/ellpeck/prettypipes/pipe/PipeTileEntity.java b/src/main/java/de/ellpeck/prettypipes/pipe/PipeTileEntity.java index 749244c..f6b0574 100644 --- a/src/main/java/de/ellpeck/prettypipes/pipe/PipeTileEntity.java +++ b/src/main/java/de/ellpeck/prettypipes/pipe/PipeTileEntity.java @@ -390,6 +390,12 @@ public class PipeTileEntity extends TileEntity implements INamedContainerProvide return (this.world.getGameTime() + this.workRandomizer.get()) % speed == 0; } + public int getNextNode(List nodes, int index) { + return this.streamModules() + .map(m -> m.getRight().getCustomNextNode(m.getLeft(), this, nodes, index)) + .filter(Objects::nonNull).findFirst().orElse(index); + } + @Override public void remove() { super.remove(); diff --git a/src/main/java/de/ellpeck/prettypipes/pipe/modules/SortingModuleItem.java b/src/main/java/de/ellpeck/prettypipes/pipe/modules/SortingModuleItem.java new file mode 100644 index 0000000..e7f17c9 --- /dev/null +++ b/src/main/java/de/ellpeck/prettypipes/pipe/modules/SortingModuleItem.java @@ -0,0 +1,49 @@ +package de.ellpeck.prettypipes.pipe.modules; + +import de.ellpeck.prettypipes.items.IModule; +import de.ellpeck.prettypipes.items.ModuleItem; +import de.ellpeck.prettypipes.pipe.PipeTileEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.BlockPos; + +import java.util.List; + +public class SortingModuleItem extends ModuleItem { + + private final Type type; + + public SortingModuleItem(String name, Type type) { + super(name); + this.type = type; + this.setRegistryName(name); + } + + @Override + public boolean isCompatible(ItemStack module, PipeTileEntity tile, IModule other) { + return !(other instanceof SortingModuleItem); + } + + @Override + public boolean hasContainer(ItemStack module, PipeTileEntity tile) { + return false; + } + + @Override + public Integer getCustomNextNode(ItemStack module, PipeTileEntity tile, List nodes, int index) { + switch (this.type) { + case ROUND_ROBIN: + // store an ever-increasing index and choose destinations based on that + int next = module.hasTag() ? module.getTag().getInt("last") + 1 : 0; + module.getOrCreateTag().putInt("last", next); + return next % nodes.size(); + case RANDOM: + return tile.getWorld().rand.nextInt(nodes.size()); + } + return null; + } + + public enum Type { + ROUND_ROBIN, + RANDOM + } +} diff --git a/src/main/resources/assets/prettypipes/lang/en_us.json b/src/main/resources/assets/prettypipes/lang/en_us.json index 3abf314..7e03564 100644 --- a/src/main/resources/assets/prettypipes/lang/en_us.json +++ b/src/main/resources/assets/prettypipes/lang/en_us.json @@ -32,6 +32,8 @@ "item.prettypipes.mod_filter_modifier": "Mod Filter Modifier", "item.prettypipes.redstone_module": "Redstone Module", "item.prettypipes.filter_increase_modifier": "Filter Increase Modifier", + "item.prettypipes.random_sorting_modifier": "Random Sorting Modifier", + "item.prettypipes.round_robin_sorting_modifier": "Round Robin Sorting Modifier", "info.prettypipes.extraction_module": "Pulls items from adjacent inventories\nFilters and pull rates vary by tier\nHigh tiers prevent over-sending", "info.prettypipes.filter_module": "Restricts flow from pipes into adjacent inventories\nFilter amount varies by tier", "info.prettypipes.speed_module": "Increases speed of items exiting adjacent inventories\nSpeed varies by tier", @@ -49,6 +51,8 @@ "info.prettypipes.pressurizer": "Drastically increases item speed in the entire pipe network\nRequires FE (or RF) for each item transferred", "info.prettypipes.filter_increase_modifier": "Adds additional filter slots to the pipe\nSlots will be used by any module that filters items", "info.prettypipes.crafting_module": "Allows automatically crafting items into other items using the connected block\nDoesn't automatically extract from the block\nInput and output slots vary by tier\nSupports auto-filling from JEI if installed", + "info.prettypipes.random_sorting_modifier": "Causes extracted items to choose destinations randomly\nPriority modules will be ignored", + "info.prettypipes.round_robin_sorting_modifier": "Causes extracted items to choose destinations in a round robin fashion\nOrdering is based on distance and priority", "block.prettypipes.pipe": "Pipe", "block.prettypipes.item_terminal": "Item Terminal", "block.prettypipes.crafting_terminal": "Crafting Terminal", diff --git a/src/main/resources/assets/prettypipes/models/item/random_sorting_modifier.json b/src/main/resources/assets/prettypipes/models/item/random_sorting_modifier.json new file mode 100644 index 0000000..301f5ce --- /dev/null +++ b/src/main/resources/assets/prettypipes/models/item/random_sorting_modifier.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "prettypipes:item/random_sorting_modifier" + } +} diff --git a/src/main/resources/assets/prettypipes/models/item/round_robin_sorting_modifier.json b/src/main/resources/assets/prettypipes/models/item/round_robin_sorting_modifier.json new file mode 100644 index 0000000..eacb368 --- /dev/null +++ b/src/main/resources/assets/prettypipes/models/item/round_robin_sorting_modifier.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "prettypipes:item/round_robin_sorting_modifier" + } +} diff --git a/src/main/resources/assets/prettypipes/textures/item/random_sorting_modifier.png b/src/main/resources/assets/prettypipes/textures/item/random_sorting_modifier.png new file mode 100644 index 0000000000000000000000000000000000000000..aedd4bf7a12ab626fc348debed53686b21fdf3d7 GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|PIf7~7} zmN;lH#v~45v(`^sT09^;-@ZQa$Dg0vbNYD`OdA9ozNxuM z7yv=c&KgGT|Bsii=K+G2y$)OlvKso K&t;ucLK6TIqiGcY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/prettypipes/textures/item/round_robin_sorting_modifier.png b/src/main/resources/assets/prettypipes/textures/item/round_robin_sorting_modifier.png new file mode 100644 index 0000000000000000000000000000000000000000..df3c6334059ee3796e5ea90df4bd515ebc1c83d4 GIT binary patch literal 317 zcmV-D0mA-?P)Px#_en%SR5*>LQ#}g8Fc^K+X7MIny7Ux+gSRMHAw7UdDIGf)sGh^2;1#;KxOB6- z=-MSMbxKH+6crx?^7G#NzV|_ZKjDbYr92P62$!q1BMmO)d3Zcu28kYPu*kC-H1`Hc znmIH5fw)Aj6ZJul_2^#5Ocx7m*bN(Ylb!I68yv$x6|=|#i#+taos0nh?v$9g1YusG zhy$aldbV~T2)bBA5^<~sJ#Vd*reGKpaWFcIs$U!EEuW|__qJggLlg+}3UjhRm{+nh zTcnWz?>LA{z&nm24zN93jY#SMtr1j$Fqskq%4bUUyPrN&l4j0l))#mKM`>IQ5z*CT P00000NkvXXu0mjf3Tl0# literal 0 HcmV?d00001 diff --git a/src/main/resources/data/prettypipes/recipes/random_sorting_modifier.json b/src/main/resources/data/prettypipes/recipes/random_sorting_modifier.json new file mode 100644 index 0000000..12eadd8 --- /dev/null +++ b/src/main/resources/data/prettypipes/recipes/random_sorting_modifier.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " H ", + "RMR", + " R " + ], + "key": { + "R": { + "item": "minecraft:redstone" + }, + "H": { + "item": "minecraft:dispenser" + }, + "M": { + "item": "prettypipes:blank_module" + } + }, + "result": { + "item": "prettypipes:random_sorting_modifier" + } +} \ No newline at end of file diff --git a/src/main/resources/data/prettypipes/recipes/round_robin_sorting_modifier.json b/src/main/resources/data/prettypipes/recipes/round_robin_sorting_modifier.json new file mode 100644 index 0000000..8bc9a67 --- /dev/null +++ b/src/main/resources/data/prettypipes/recipes/round_robin_sorting_modifier.json @@ -0,0 +1,22 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + " H ", + "RMR", + " R " + ], + "key": { + "R": { + "item": "minecraft:redstone" + }, + "H": { + "item": "minecraft:arrow" + }, + "M": { + "item": "prettypipes:blank_module" + } + }, + "result": { + "item": "prettypipes:round_robin_sorting_modifier" + } +} \ No newline at end of file