Allow whitelist / blacklist and filters on destructors

This commit is contained in:
Raoul Van den Berge
2016-03-27 13:37:34 +02:00
parent c10f2054f5
commit 9cd7010c0a
8 changed files with 147 additions and 28 deletions

View File

@@ -1,28 +1,15 @@
package refinedstorage.container;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import refinedstorage.container.slot.SlotSpecimen;
import refinedstorage.container.slot.SlotSpecimenItemBlock;
import refinedstorage.tile.TileConstructor;
public class ContainerConstructor extends ContainerBase {
class SlotConstructor extends SlotSpecimen {
public SlotConstructor(IInventory inventory, int id, int x, int y) {
super(inventory, id, x, y, false);
}
@Override
public boolean isItemValid(ItemStack stack) {
return stack.getItem() instanceof ItemBlock;
}
}
public ContainerConstructor(EntityPlayer player, TileConstructor constructor) {
super(player);
addSlotToContainer(new SlotConstructor(constructor.getInventory(), 0, 80, 20));
addSlotToContainer(new SlotSpecimenItemBlock(constructor.getInventory(), 0, 80, 20));
addPlayerInventory(8, 55);
}

View File

@@ -1,11 +1,17 @@
package refinedstorage.container;
import net.minecraft.entity.player.EntityPlayer;
import refinedstorage.container.slot.SlotSpecimenItemBlock;
import refinedstorage.tile.TileDestructor;
public class ContainerDestructor extends ContainerBase {
public ContainerDestructor(EntityPlayer player) {
public ContainerDestructor(EntityPlayer player, TileDestructor destructor) {
super(player);
addPlayerInventory(8, 50);
for (int i = 0; i < 9; ++i) {
addSlotToContainer(new SlotSpecimenItemBlock(destructor.getInventory(), i, 8 + (18 * i), 20));
}
addPlayerInventory(8, 55);
}
}

View File

@@ -0,0 +1,16 @@
package refinedstorage.container.slot;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
public class SlotSpecimenItemBlock extends SlotSpecimen {
public SlotSpecimenItemBlock(IInventory inventory, int id, int x, int y) {
super(inventory, id, x, y, false);
}
@Override
public boolean isItemValid(ItemStack stack) {
return stack.getItem() instanceof ItemBlock;
}
}

View File

@@ -1,14 +1,17 @@
package refinedstorage.gui;
import refinedstorage.container.ContainerDestructor;
import refinedstorage.gui.sidebutton.SideButtonCompare;
import refinedstorage.gui.sidebutton.SideButtonMode;
import refinedstorage.gui.sidebutton.SideButtonRedstoneMode;
import refinedstorage.tile.TileDestructor;
import refinedstorage.util.InventoryUtils;
public class GuiDestructor extends GuiBase {
private TileDestructor destructor;
public GuiDestructor(ContainerDestructor container, TileDestructor destructor) {
super(container, 176, 131);
super(container, 176, 137);
this.destructor = destructor;
}
@@ -16,6 +19,11 @@ public class GuiDestructor extends GuiBase {
@Override
public void init(int x, int y) {
addSideButton(new SideButtonRedstoneMode(destructor));
addSideButton(new SideButtonMode(destructor));
addSideButton(new SideButtonCompare(destructor, InventoryUtils.COMPARE_DAMAGE));
addSideButton(new SideButtonCompare(destructor, InventoryUtils.COMPARE_NBT));
}
@Override
@@ -32,6 +40,6 @@ public class GuiDestructor extends GuiBase {
@Override
public void drawForeground(int mouseX, int mouseY) {
drawString(7, 7, t("gui.refinedstorage:destructor"));
drawString(7, 39, t("container.inventory"));
drawString(7, 43, t("container.inventory"));
}
}

View File

@@ -31,7 +31,7 @@ public class GuiHandler implements IGuiHandler {
case RefinedStorageGui.WIRELESS_TRANSMITTER:
return new ContainerWirelessTransmitter(player, (TileWirelessTransmitter) tile);
case RefinedStorageGui.DESTRUCTOR:
return new ContainerDestructor(player);
return new ContainerDestructor(player, (TileDestructor) tile);
case RefinedStorageGui.CONSTRUCTOR:
return new ContainerConstructor(player, (TileConstructor) tile);
case RefinedStorageGui.STORAGE:

View File

@@ -11,6 +11,8 @@ import refinedstorage.tile.settings.ICompareSetting;
import refinedstorage.util.InventoryUtils;
public class TileConstructor extends TileMachine implements ICompareSetting {
public static final int SPEED = 10;
public static final String NBT_COMPARE = "Compare";
private InventorySimple inventory = new InventorySimple("constructor", 1, this);
@@ -24,7 +26,7 @@ public class TileConstructor extends TileMachine implements ICompareSetting {
@Override
public void updateMachine() {
if (ticks % 10 == 0) {
if (ticks % SPEED == 0) {
BlockPos front = pos.offset(getDirection());
if ((worldObj.isAirBlock(front) || worldObj.getBlockState(front).getBlock().getMaterial(worldObj.getBlockState(front)).isLiquid()) && inventory.getStackInSlot(0) != null) {

View File

@@ -1,14 +1,31 @@
package refinedstorage.tile;
import io.netty.buffer.ByteBuf;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.math.BlockPos;
import refinedstorage.inventory.InventorySimple;
import refinedstorage.tile.settings.ICompareSetting;
import refinedstorage.tile.settings.IModeSetting;
import refinedstorage.tile.settings.ModeSettingUtils;
import refinedstorage.util.InventoryUtils;
import java.util.List;
public class TileDestructor extends TileMachine {
public class TileDestructor extends TileMachine implements ICompareSetting, IModeSetting {
public static final String NBT_COMPARE = "Compare";
public static final String NBT_MODE = "Mode";
public static final int SPEED = 10;
private InventorySimple inventory = new InventorySimple("destructor", 9, this);
private int compare = 0;
private int mode = 0;
@Override
public int getEnergyUsage() {
return 1;
@@ -16,23 +33,106 @@ public class TileDestructor extends TileMachine {
@Override
public void updateMachine() {
if (ticks % 10 == 0) {
if (ticks % SPEED == 0) {
BlockPos front = pos.offset(getDirection());
IBlockState frontBlockState = worldObj.getBlockState(front);
Block frontBlock = frontBlockState.getBlock();
if (!frontBlock.isAir(frontBlockState, worldObj, front)) {
List<ItemStack> drops = frontBlock.getDrops(worldObj, front, worldObj.getBlockState(front), 0);
if (ModeSettingUtils.doesNotViolateMode(inventory, this, compare, new ItemStack(frontBlock, 1, frontBlock.getMetaFromState(frontBlockState)))) {
List<ItemStack> drops = frontBlock.getDrops(worldObj, front, frontBlockState, 0);
worldObj.setBlockToAir(front);
worldObj.setBlockToAir(front);
for (ItemStack drop : drops) {
if (!getController().push(drop)) {
InventoryUtils.dropStack(worldObj, drop, front.getX(), front.getY(), front.getZ());
for (ItemStack drop : drops) {
if (!getController().push(drop)) {
InventoryUtils.dropStack(worldObj, drop, front.getX(), front.getY(), front.getZ());
}
}
}
}
}
}
@Override
public int getCompare() {
return compare;
}
@Override
public void setCompare(int compare) {
markDirty();
this.compare = compare;
}
@Override
public boolean isWhitelist() {
return mode == 0;
}
@Override
public boolean isBlacklist() {
return mode == 1;
}
@Override
public void setToWhitelist() {
markDirty();
this.mode = 0;
}
@Override
public void setToBlacklist() {
markDirty();
this.mode = 1;
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
if (nbt.hasKey(NBT_COMPARE)) {
compare = nbt.getInteger(NBT_COMPARE);
}
if (nbt.hasKey(NBT_MODE)) {
mode = nbt.getInteger(NBT_MODE);
}
InventoryUtils.restoreInventory(inventory, 0, nbt);
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
nbt.setInteger(NBT_COMPARE, compare);
nbt.setInteger(NBT_MODE, mode);
InventoryUtils.saveInventory(inventory, 0, nbt);
}
@Override
public void fromBytes(ByteBuf buf) {
super.fromBytes(buf);
compare = buf.readInt();
mode = buf.readInt();
}
@Override
public void toBytes(ByteBuf buf) {
super.toBytes(buf);
buf.writeInt(compare);
buf.writeInt(mode);
}
public IInventory getInventory() {
return inventory;
}
}