Added smart whitelist button to the whitelist laser relay that automatically adds items from adjacent chests to the whitelist

This commit is contained in:
Ellpeck 2016-05-14 13:13:35 +02:00
parent 1f2f0e7cbf
commit 1df694c8e9
3 changed files with 59 additions and 13 deletions

View file

@ -31,6 +31,7 @@ import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
@SideOnly(Side.CLIENT) @SideOnly(Side.CLIENT)
@ -55,8 +56,11 @@ public class GuiLaserRelayItemWhitelist extends GuiContainer{
this.whitelistLeft = new SmallerButton(0, this.guiLeft+3, this.guiTop+16, ""); this.whitelistLeft = new SmallerButton(0, this.guiLeft+3, this.guiTop+16, "");
this.whitelistRight = new SmallerButton(1, this.guiLeft+157, this.guiTop+16, ""); this.whitelistRight = new SmallerButton(1, this.guiLeft+157, this.guiTop+16, "");
SmallerButton smartWhitelist = new SmallerButton(2, this.guiLeft+80, this.guiTop+33, "S");
this.buttonList.add(this.whitelistLeft); this.buttonList.add(this.whitelistLeft);
this.buttonList.add(this.whitelistRight); this.buttonList.add(this.whitelistRight);
this.buttonList.add(smartWhitelist);
} }
@Override @Override
@ -87,6 +91,12 @@ public class GuiLaserRelayItemWhitelist extends GuiContainer{
list.addAll(infoList); list.addAll(infoList);
this.drawHoveringText(list, x, y); this.drawHoveringText(list, x, y);
} }
if(x >= this.guiLeft+80 && y >= this.guiTop+33 && x <= this.guiLeft+95 && y <= this.guiTop+46){
List<String> list = new ArrayList<String>();
list.add(TextFormatting.BOLD+StringUtil.localize("info."+ModUtil.MOD_ID+".gui.smart"));
list.addAll(this.fontRendererObj.listFormattedStringToWidth(StringUtil.localize("info."+ModUtil.MOD_ID+".gui.smartInfo"), 200));
this.drawHoveringText(list, x, y);
}
} }
@Override @Override

View file

@ -17,10 +17,7 @@ import de.ellpeck.actuallyadditions.mod.misc.LaserRelayConnectionHandler;
import de.ellpeck.actuallyadditions.mod.network.PacketParticle; import de.ellpeck.actuallyadditions.mod.network.PacketParticle;
import de.ellpeck.actuallyadditions.mod.network.gui.IButtonReactor; import de.ellpeck.actuallyadditions.mod.network.gui.IButtonReactor;
import de.ellpeck.actuallyadditions.mod.tile.TileEntityItemViewer.GenericItemHandlerInfo; import de.ellpeck.actuallyadditions.mod.tile.TileEntityItemViewer.GenericItemHandlerInfo;
import de.ellpeck.actuallyadditions.mod.util.PosUtil; import de.ellpeck.actuallyadditions.mod.util.*;
import de.ellpeck.actuallyadditions.mod.util.StringUtil;
import de.ellpeck.actuallyadditions.mod.util.Util;
import de.ellpeck.actuallyadditions.mod.util.WorldUtil;
import io.netty.util.internal.ConcurrentSet; import io.netty.util.internal.ConcurrentSet;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory; import net.minecraft.inventory.IInventory;
@ -132,6 +129,22 @@ public abstract class TileEntityLaserRelay extends TileEntityBase{
return true; return true;
} }
public List<IItemHandler> getAllHandlersAround(){
List<IItemHandler> handlers = new ArrayList<IItemHandler>();
for(int i = 0; i <= 5; i++){
EnumFacing side = WorldUtil.getDirectionBySidesInOrder(i);
BlockPos pos = WorldUtil.getCoordsFromSide(side, this.getPos(), 0);
TileEntity tile = this.worldObj.getTileEntity(pos);
if(tile != null && !(tile instanceof TileEntityItemViewer)){
IItemHandler handler = tile.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, side.getOpposite());
if(handler != null){
handlers.add(handler);
}
}
}
return handlers;
}
public List<GenericItemHandlerInfo> getItemHandlersInNetwork(LaserRelayConnectionHandler.Network network){ public List<GenericItemHandlerInfo> getItemHandlersInNetwork(LaserRelayConnectionHandler.Network network){
List<GenericItemHandlerInfo> handlers = new ArrayList<GenericItemHandlerInfo>(); List<GenericItemHandlerInfo> handlers = new ArrayList<GenericItemHandlerInfo>();
for(LaserRelayConnectionHandler.ConnectionPair pair : network.connections){ for(LaserRelayConnectionHandler.ConnectionPair pair : network.connections){
@ -143,17 +156,14 @@ public abstract class TileEntityLaserRelay extends TileEntityBase{
TileEntityLaserRelayItem relayTile = (TileEntityLaserRelayItem)aRelayTile; TileEntityLaserRelayItem relayTile = (TileEntityLaserRelayItem)aRelayTile;
if(!GenericItemHandlerInfo.containsTile(handlers, relayTile)){ if(!GenericItemHandlerInfo.containsTile(handlers, relayTile)){
GenericItemHandlerInfo info = new GenericItemHandlerInfo(relayTile); GenericItemHandlerInfo info = new GenericItemHandlerInfo(relayTile);
for(int i = 0; i <= 5; i++){
EnumFacing side = WorldUtil.getDirectionBySidesInOrder(i); List<IItemHandler> handlersAroundTile = relayTile.getAllHandlersAround();
BlockPos pos = WorldUtil.getCoordsFromSide(side, relay, 0); for(IItemHandler handler : handlersAroundTile){
TileEntity tile = this.worldObj.getTileEntity(pos); if(!GenericItemHandlerInfo.containsHandler(handlers, handler)){
if(tile != null && !(tile instanceof TileEntityItemViewer)){
IItemHandler handler = tile.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, side.getOpposite());
if(handler != null && !GenericItemHandlerInfo.containsHandler(handlers, handler)){
info.handlers.add(handler); info.handlers.add(handler);
} }
} }
}
handlers.add(info); handlers.add(info);
} }
} }
@ -346,6 +356,30 @@ public abstract class TileEntityLaserRelay extends TileEntityBase{
else if(buttonID == 1){ else if(buttonID == 1){
this.isRightWhitelist = !this.isRightWhitelist; this.isRightWhitelist = !this.isRightWhitelist;
} }
else if(buttonID == 2){
this.addWhitelistSmart();
}
}
private void addWhitelistSmart(){
List<IItemHandler> handlers = this.getAllHandlersAround();
for(IItemHandler handler : handlers){
for(int i = 0; i < handler.getSlots(); i++){
ItemStack stack = handler.getStackInSlot(i);
if(stack != null){
if(!ItemUtil.contains(this.slots, stack, false)){
for(int j = 0; j < this.slots.length; j++){
if(this.slots[j] == null || this.slots[j].stackSize <= 0){
ItemStack whitelistStack = stack.copy();
whitelistStack.stackSize = 1;
this.slots[j] = whitelistStack;
break;
}
}
}
}
}
}
} }
@Override @Override

View file

@ -535,6 +535,8 @@ info.actuallyadditions.gui.blacklist=Blacklist
info.actuallyadditions.gui.coffee=Coffee info.actuallyadditions.gui.coffee=Coffee
info.actuallyadditions.gui.ok=Ok info.actuallyadditions.gui.ok=Ok
info.actuallyadditions.gui.the=the info.actuallyadditions.gui.the=the
info.actuallyadditions.gui.smart=Smart Whitelist
info.actuallyadditions.gui.smartInfo=When pressing this, all items from inventories adjacent to this relay will be added to the white- and blacklist. First, the left side will be completely filled, and if there's more items, they will go to the right side.
info.actuallyadditions.inputter.info.1=This is the first Slot in the connected Inventory to <p> at. info.actuallyadditions.inputter.info.1=This is the first Slot in the connected Inventory to <p> at.
info.actuallyadditions.inputter.info.2=This is the slot after the last Slot in the connected Inventory to <p> at. What that means: If you, for example, write 2 in the field to the left and 5 in this one, it will <p> at Slot 2, 3, and 4. info.actuallyadditions.inputter.info.2=This is the slot after the last Slot in the connected Inventory to <p> at. What that means: If you, for example, write 2 in the field to the left and 5 in this one, it will <p> at Slot 2, 3, and 4.
info.actuallyadditions.inputter.whitelistInfo=This applies for this part of the white-/blacklist. The other side applies as well, so you can have some Items whitelisted and some blacklisted. Note that, if you have an empty blacklist or an item whitelisted on at least one side, it will always go through. info.actuallyadditions.inputter.whitelistInfo=This applies for this part of the white-/blacklist. The other side applies as well, so you can have some Items whitelisted and some blacklisted. Note that, if you have an empty blacklist or an item whitelisted on at least one side, it will always go through.