added the filter increase modifier

This commit is contained in:
Ell 2020-10-14 04:28:58 +02:00
parent e3cbbae905
commit 6fbedff388
10 changed files with 162 additions and 20 deletions

View file

@ -4,7 +4,7 @@ import de.ellpeck.prettypipes.entities.PipeFrameEntity;
import de.ellpeck.prettypipes.entities.PipeFrameRenderer;
import de.ellpeck.prettypipes.items.*;
import de.ellpeck.prettypipes.misc.ItemEqualityType;
import de.ellpeck.prettypipes.pipe.modules.FilterModifierModule;
import de.ellpeck.prettypipes.pipe.modules.FilterModifierModuleItem;
import de.ellpeck.prettypipes.pipe.modules.LowPriorityModuleItem;
import de.ellpeck.prettypipes.pipe.modules.RedstoneModuleItem;
import de.ellpeck.prettypipes.pipe.modules.SpeedModuleItem;
@ -15,6 +15,9 @@ import de.ellpeck.prettypipes.network.PipeNetwork;
import de.ellpeck.prettypipes.packets.PacketHandler;
import de.ellpeck.prettypipes.pipe.*;
import de.ellpeck.prettypipes.pipe.containers.*;
import de.ellpeck.prettypipes.pipe.modules.filter.FilterIncreaseModuleContainer;
import de.ellpeck.prettypipes.pipe.modules.filter.FilterIncreaseModuleGui;
import de.ellpeck.prettypipes.pipe.modules.filter.FilterIncreaseModuleItem;
import de.ellpeck.prettypipes.pipe.modules.insertion.FilterModuleContainer;
import de.ellpeck.prettypipes.pipe.modules.insertion.FilterModuleGui;
import de.ellpeck.prettypipes.pipe.modules.insertion.FilterModuleItem;
@ -110,6 +113,7 @@ public final class Registry {
public static ContainerType<FilterModuleContainer> filterModuleContainer;
public static ContainerType<RetrievalModuleContainer> retrievalModuleContainer;
public static ContainerType<StackSizeModuleContainer> stackSizeModuleContainer;
public static ContainerType<FilterIncreaseModuleContainer> filterIncreaseModuleContainer;
@SubscribeEvent
public static void registerBlocks(RegistryEvent.Register<Block> event) {
@ -135,8 +139,9 @@ public final class Registry {
registry.registerAll(createTieredModule("low_priority_module", LowPriorityModuleItem::new));
registry.registerAll(createTieredModule("retrieval_module", RetrievalModuleItem::new));
registry.register(new StackSizeModuleItem("stack_size_module"));
registry.registerAll(Arrays.stream(ItemEqualityType.values()).map(t -> new FilterModifierModule(t.name().toLowerCase(Locale.ROOT) + "_filter_modifier", t)).toArray(Item[]::new));
registry.registerAll(Arrays.stream(ItemEqualityType.values()).map(t -> new FilterModifierModuleItem(t.name().toLowerCase(Locale.ROOT) + "_filter_modifier", t)).toArray(Item[]::new));
registry.register(new RedstoneModuleItem("redstone_module"));
registry.register(new FilterIncreaseModuleItem("filter_increase_modifier"));
ForgeRegistries.BLOCKS.getValues().stream()
.filter(b -> b.getRegistryName().getNamespace().equals(PrettyPipes.ID))
@ -170,7 +175,8 @@ public final class Registry {
extractionModuleContainer = createPipeContainer("extraction_module"),
filterModuleContainer = createPipeContainer("filter_module"),
retrievalModuleContainer = createPipeContainer("retrieval_module"),
stackSizeModuleContainer = createPipeContainer("stack_size_module")
stackSizeModuleContainer = createPipeContainer("stack_size_module"),
filterIncreaseModuleContainer = createPipeContainer("filter_increase_module")
);
}
@ -220,6 +226,7 @@ public final class Registry {
ScreenManager.registerFactory(filterModuleContainer, FilterModuleGui::new);
ScreenManager.registerFactory(retrievalModuleContainer, RetrievalModuleGui::new);
ScreenManager.registerFactory(stackSizeModuleContainer, StackSizeModuleGui::new);
ScreenManager.registerFactory(filterIncreaseModuleContainer, FilterIncreaseModuleGui::new);
}
}
}

View file

@ -4,11 +4,11 @@ import com.mojang.blaze3d.matrix.MatrixStack;
import de.ellpeck.prettypipes.PrettyPipes;
import de.ellpeck.prettypipes.packets.PacketButton;
import de.ellpeck.prettypipes.pipe.PipeTileEntity;
import de.ellpeck.prettypipes.pipe.modules.FilterModifierModule;
import de.ellpeck.prettypipes.pipe.modules.FilterModifierModuleItem;
import de.ellpeck.prettypipes.pipe.modules.filter.FilterIncreaseModuleItem;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.widget.Widget;
import net.minecraft.client.gui.widget.button.Button;
import net.minecraft.client.resources.I18n;
import net.minecraft.inventory.container.Slot;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
@ -77,8 +77,10 @@ public class ItemFilter extends ItemStackHandler {
if (id == 0 && this.canModifyWhitelist) {
this.isWhitelist = !this.isWhitelist;
this.modified = true;
this.save();
} else if (id == 1 && this.canPopulateFromInventories) {
// populate filter from inventories
List<ItemFilter> filters = this.getAllFilters();
for (Direction direction : Direction.values()) {
IItemHandler handler = this.pipe.getItemHandler(direction, null);
if (handler == null)
@ -89,12 +91,16 @@ public class ItemFilter extends ItemStackHandler {
continue;
ItemStack copy = stack.copy();
copy.setCount(1);
ItemHandlerHelper.insertItem(this, copy, false);
// try inserting into ourselves and any filter increase modifiers
for (ItemStackHandler filter : filters) {
if (ItemHandlerHelper.insertItem(filter, copy, false).isEmpty())
break;
}
}
}
this.modified = true;
for (ItemFilter filter : filters)
filter.save();
}
this.save();
}
public boolean isAllowed(ItemStack stack) {
@ -103,21 +109,34 @@ public class ItemFilter extends ItemStackHandler {
private boolean isFiltered(ItemStack stack) {
ItemEqualityType[] types = this.getEqualityTypes();
for (int i = 0; i < this.getSlots(); i++) {
ItemStack filter = this.getStackInSlot(i);
if (filter.isEmpty())
continue;
if (ItemEqualityType.compareItems(stack, filter, types))
return true;
// also check if any filter increase modules have the item we need
for (ItemStackHandler handler : this.getAllFilters()) {
for (int i = 0; i < handler.getSlots(); i++) {
ItemStack filter = handler.getStackInSlot(i);
if (filter.isEmpty())
continue;
if (ItemEqualityType.compareItems(stack, filter, types))
return true;
}
}
return false;
}
private List<ItemFilter> getAllFilters() {
List<ItemFilter> filters = this.pipe.streamModules()
.filter(p -> p.getRight() instanceof FilterIncreaseModuleItem)
.map(p -> new ItemFilter(18, p.getLeft(), this.pipe))
.collect(Collectors.toList());
// add ourselves to the front
filters.add(0, this);
return filters;
}
public ItemEqualityType[] getEqualityTypes() {
return this.pipe.streamModules()
.map(Pair::getRight)
.filter(m -> m instanceof FilterModifierModule)
.map(m -> ((FilterModifierModule) m).type)
.filter(m -> m instanceof FilterModifierModuleItem)
.map(m -> ((FilterModifierModuleItem) m).type)
.toArray(ItemEqualityType[]::new);
}
@ -131,14 +150,16 @@ public class ItemFilter extends ItemStackHandler {
@Override
public CompoundNBT serializeNBT() {
CompoundNBT nbt = super.serializeNBT();
nbt.putBoolean("whitelist", this.isWhitelist);
if (this.canModifyWhitelist)
nbt.putBoolean("whitelist", this.isWhitelist);
return nbt;
}
@Override
public void deserializeNBT(CompoundNBT nbt) {
super.deserializeNBT(nbt);
this.isWhitelist = nbt.getBoolean("whitelist");
if (this.canModifyWhitelist)
this.isWhitelist = nbt.getBoolean("whitelist");
}
@Override

View file

@ -15,11 +15,11 @@ import java.util.List;
import java.util.Set;
import java.util.function.BiFunction;
public class FilterModifierModule extends ModuleItem {
public class FilterModifierModuleItem extends ModuleItem {
public final ItemEqualityType type;
public FilterModifierModule(String name, ItemEqualityType type) {
public FilterModifierModuleItem(String name, ItemEqualityType type) {
super(name);
this.type = type;
this.setRegistryName(name);

View file

@ -0,0 +1,38 @@
package de.ellpeck.prettypipes.pipe.modules.filter;
import de.ellpeck.prettypipes.misc.FilterSlot;
import de.ellpeck.prettypipes.misc.ItemFilter;
import de.ellpeck.prettypipes.pipe.containers.AbstractPipeContainer;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.inventory.container.ContainerType;
import net.minecraft.inventory.container.Slot;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.items.ItemStackHandler;
public class FilterIncreaseModuleContainer extends AbstractPipeContainer<FilterIncreaseModuleItem> implements ItemFilter.IFilteredContainer {
public ItemFilter filter;
public FilterIncreaseModuleContainer(ContainerType<?> type, int id, PlayerEntity player, BlockPos pos, int moduleIndex) {
super(type, id, player, pos, moduleIndex);
}
@Override
protected void addSlots() {
this.filter = new ItemFilter(18, this.moduleStack, this.tile);
this.filter.canModifyWhitelist = false;
for (Slot slot : this.filter.getSlots(8, 49))
this.addSlot(slot);
}
@Override
public void onContainerClosed(PlayerEntity playerIn) {
super.onContainerClosed(playerIn);
this.filter.save();
}
@Override
public ItemFilter getFilter() {
return this.filter;
}
}

View file

@ -0,0 +1,11 @@
package de.ellpeck.prettypipes.pipe.modules.filter;
import de.ellpeck.prettypipes.pipe.containers.AbstractPipeGui;
import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.util.text.ITextComponent;
public class FilterIncreaseModuleGui extends AbstractPipeGui<FilterIncreaseModuleContainer> {
public FilterIncreaseModuleGui(FilterIncreaseModuleContainer screenContainer, PlayerInventory inv, ITextComponent titleIn) {
super(screenContainer, inv, titleIn);
}
}

View file

@ -0,0 +1,35 @@
package de.ellpeck.prettypipes.pipe.modules.filter;
import de.ellpeck.prettypipes.Registry;
import de.ellpeck.prettypipes.items.IModule;
import de.ellpeck.prettypipes.items.ModuleItem;
import de.ellpeck.prettypipes.misc.ItemFilter;
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;
import net.minecraftforge.items.ItemStackHandler;
public class FilterIncreaseModuleItem extends ModuleItem {
public FilterIncreaseModuleItem(String name) {
super(name);
this.setRegistryName(name);
}
@Override
public boolean isCompatible(ItemStack module, PipeTileEntity tile, IModule other) {
return true;
}
@Override
public boolean hasContainer(ItemStack module, PipeTileEntity tile) {
return true;
}
@Override
public AbstractPipeContainer<?> getContainer(ItemStack module, PipeTileEntity tile, int windowId, PlayerInventory inv, PlayerEntity player, int moduleIndex) {
return new FilterIncreaseModuleContainer(Registry.filterIncreaseModuleContainer, windowId, player, tile.getPos(), moduleIndex);
}
}

View file

@ -23,6 +23,7 @@
"item.prettypipes.nbt_filter_modifier": "Data Filter Modifier",
"item.prettypipes.tag_filter_modifier": "Tag Filter Modifier",
"item.prettypipes.redstone_module": "Redstone Module",
"item.prettypipes.filter_increase_modifier": "Filter Increase 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",
@ -36,6 +37,7 @@
"info.prettypipes.item_terminal": "Allows viewing and requesting all items in a pipe network\nAlso has slots for putting items into the network",
"info.prettypipes.crafting_terminal": "Allows requesting ingredients for crafting recipes\nSupports auto-filling from JEI if installed",
"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",
"block.prettypipes.pipe": "Pipe",
"block.prettypipes.item_terminal": "Item Terminal",
"block.prettypipes.crafting_terminal": "Crafting Terminal",

View file

@ -0,0 +1,6 @@
{
"parent": "item/generated",
"textures": {
"layer0": "prettypipes:item/filter_increase_modifier"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 410 B

View file

@ -0,0 +1,22 @@
{
"type": "minecraft:crafting_shaped",
"pattern": [
" B ",
"RMR",
" R "
],
"key": {
"R": {
"item": "minecraft:redstone"
},
"B": {
"item": "minecraft:iron_bars"
},
"M": {
"item": "prettypipes:blank_module"
}
},
"result": {
"item": "prettypipes:filter_increase_modifier"
}
}