diff --git a/src/main/java/refinedstorage/RefinedStorageGui.java b/src/main/java/refinedstorage/RefinedStorageGui.java index f698405bb..7608cf5d4 100755 --- a/src/main/java/refinedstorage/RefinedStorageGui.java +++ b/src/main/java/refinedstorage/RefinedStorageGui.java @@ -15,4 +15,5 @@ public final class RefinedStorageGui { public static final int INTERFACE = 13; public static final int WIRELESS_GRID = 14; public static final int CRAFTING_MONITOR = 15; + public static final int WIRELESS_TRANSMITTER = 16; } diff --git a/src/main/java/refinedstorage/block/BlockWirelessTransmitter.java b/src/main/java/refinedstorage/block/BlockWirelessTransmitter.java index 60078a54e..04461bfe5 100755 --- a/src/main/java/refinedstorage/block/BlockWirelessTransmitter.java +++ b/src/main/java/refinedstorage/block/BlockWirelessTransmitter.java @@ -1,8 +1,15 @@ package refinedstorage.block; import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import refinedstorage.RefinedStorage; +import refinedstorage.RefinedStorageGui; import refinedstorage.tile.TileWirelessTransmitter; public class BlockWirelessTransmitter extends BlockMachine { @@ -14,4 +21,13 @@ public class BlockWirelessTransmitter extends BlockMachine { public TileEntity createTileEntity(World world, IBlockState state) { return new TileWirelessTransmitter(); } + + @Override + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) { + if (!world.isRemote) { + player.openGui(RefinedStorage.INSTANCE, RefinedStorageGui.WIRELESS_TRANSMITTER, world, pos.getX(), pos.getY(), pos.getZ()); + } + + return true; + } } diff --git a/src/main/java/refinedstorage/container/ContainerWirelessTransmitter.java b/src/main/java/refinedstorage/container/ContainerWirelessTransmitter.java new file mode 100755 index 000000000..95b0d5867 --- /dev/null +++ b/src/main/java/refinedstorage/container/ContainerWirelessTransmitter.java @@ -0,0 +1,54 @@ +package refinedstorage.container; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import refinedstorage.RefinedStorageItems; +import refinedstorage.container.slot.IItemValidator; +import refinedstorage.container.slot.SlotFiltered; +import refinedstorage.item.ItemUpgrade; +import refinedstorage.tile.TileWirelessTransmitter; + +public class ContainerWirelessTransmitter extends ContainerBase { + public ContainerWirelessTransmitter(EntityPlayer player, TileWirelessTransmitter wirelessTransmitter) { + super(player); + + for (int i = 0; i < 9; ++i) { + addSlotToContainer(new SlotFiltered(wirelessTransmitter, i, 8 + (i * 18), 20, new IItemValidator() { + @Override + public boolean isValid(ItemStack stack) { + return stack.getItem() == RefinedStorageItems.UPGRADE && stack.getMetadata() == ItemUpgrade.TYPE_RANGE; + } + })); + } + + addPlayerInventory(8, 55); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int index) { + ItemStack stack = null; + + Slot slot = getSlot(index); + + if (slot != null && slot.getHasStack()) { + stack = slot.getStack().copy(); + + if (index < 8) { + if (!mergeItemStack(stack, 9, inventorySlots.size(), true)) { + return null; + } + } else if (!mergeItemStack(stack, 0, 9, false)) { + return null; + } + + if (stack.stackSize == 0) { + slot.putStack(null); + } else { + slot.onSlotChanged(); + } + } + + return stack; + } +} diff --git a/src/main/java/refinedstorage/gui/GuiHandler.java b/src/main/java/refinedstorage/gui/GuiHandler.java index a75e6a5a1..33671814e 100755 --- a/src/main/java/refinedstorage/gui/GuiHandler.java +++ b/src/main/java/refinedstorage/gui/GuiHandler.java @@ -44,6 +44,8 @@ public class GuiHandler implements IGuiHandler { return new ContainerInterface(player, (TileInterface) tile); case RefinedStorageGui.CRAFTING_MONITOR: return new ContainerCraftingMonitor(player); + case RefinedStorageGui.WIRELESS_TRANSMITTER: + return new ContainerWirelessTransmitter(player, (TileWirelessTransmitter) tile); default: return null; } @@ -107,6 +109,8 @@ public class GuiHandler implements IGuiHandler { return new GuiInterface((ContainerInterface) getContainer(ID, player, tile), (TileInterface) tile); case RefinedStorageGui.CRAFTING_MONITOR: return new GuiCraftingMonitor((ContainerCraftingMonitor) getContainer(ID, player, tile), (TileCraftingMonitor) tile); + case RefinedStorageGui.WIRELESS_TRANSMITTER: + return new GuiWirelessTransmitter((ContainerWirelessTransmitter) getContainer(ID, player, tile), (TileWirelessTransmitter) tile); default: return null; } diff --git a/src/main/java/refinedstorage/gui/GuiWirelessTransmitter.java b/src/main/java/refinedstorage/gui/GuiWirelessTransmitter.java new file mode 100755 index 000000000..8b200e9f5 --- /dev/null +++ b/src/main/java/refinedstorage/gui/GuiWirelessTransmitter.java @@ -0,0 +1,37 @@ +package refinedstorage.gui; + +import refinedstorage.container.ContainerWirelessTransmitter; +import refinedstorage.gui.sidebutton.SideButtonRedstoneMode; +import refinedstorage.tile.TileWirelessTransmitter; + +public class GuiWirelessTransmitter extends GuiBase { + private TileWirelessTransmitter wirelessTransmitter; + + public GuiWirelessTransmitter(ContainerWirelessTransmitter container, TileWirelessTransmitter wirelessTransmitter) { + super(container, 176, 137); + + this.wirelessTransmitter = wirelessTransmitter; + } + + @Override + public void init(int x, int y) { + addSideButton(new SideButtonRedstoneMode(wirelessTransmitter)); + } + + @Override + public void update(int x, int y) { + } + + @Override + public void drawBackground(int x, int y, int mouseX, int mouseY) { + bindTexture("gui/wireless_transmitter.png"); + + drawTexture(x, y, 0, 0, width, height); + } + + @Override + public void drawForeground(int mouseX, int mouseY) { + drawString(7, 7, t("gui.refinedstorage:wireless_transmitter", wirelessTransmitter.getRange())); + drawString(7, 43, t("container.inventory")); + } +} diff --git a/src/main/java/refinedstorage/item/ItemUpgrade.java b/src/main/java/refinedstorage/item/ItemUpgrade.java index fe07b31b0..dea5d0eac 100755 --- a/src/main/java/refinedstorage/item/ItemUpgrade.java +++ b/src/main/java/refinedstorage/item/ItemUpgrade.java @@ -15,6 +15,7 @@ public class ItemUpgrade extends ItemBase { setHasSubtypes(true); setMaxDamage(0); + setMaxStackSize(1); } @Override diff --git a/src/main/java/refinedstorage/item/ItemWirelessGrid.java b/src/main/java/refinedstorage/item/ItemWirelessGrid.java index b1bcb1f68..ee37a57fc 100755 --- a/src/main/java/refinedstorage/item/ItemWirelessGrid.java +++ b/src/main/java/refinedstorage/item/ItemWirelessGrid.java @@ -11,6 +11,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.*; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.TextComponentString; import net.minecraft.util.text.translation.I18n; import net.minecraft.world.World; import refinedstorage.RefinedStorage; @@ -32,8 +33,6 @@ public class ItemWirelessGrid extends ItemEnergyContainer { public static final String NBT_SORTING_DIRECTION = "SortingDirection"; public static final String NBT_SEARCH_BOX_MODE = "SearchBoxMode"; - public static final int RANGE = 64; - public static final int USAGE_OPEN = 30; public static final int USAGE_PULL = 3; public static final int USAGE_PUSH = 3; @@ -44,7 +43,7 @@ public class ItemWirelessGrid extends ItemEnergyContainer { addPropertyOverride(new ResourceLocation("connected"), new IItemPropertyGetter() { @Override public float apply(ItemStack stack, World world, EntityLivingBase entity) { - return canOpenWirelessGrid(world, entity, stack) ? 1.0f : 0.0f; + return (hasValidNBT(stack) && getDimensionId(stack) == entity.dimension) ? 1.0f : 0.0f; } }); @@ -97,7 +96,7 @@ public class ItemWirelessGrid extends ItemEnergyContainer { list.add(I18n.translateToLocalFormatted("misc.refinedstorage:energy_stored", getEnergyStored(stack), getMaxEnergyStored(stack))); } - if (canOpenWirelessGrid(player.worldObj, player, stack)) { + if (hasValidNBT(stack)) { list.add(I18n.translateToLocalFormatted("misc.refinedstorage:wireless_grid.tooltip.0", getX(stack))); list.add(I18n.translateToLocalFormatted("misc.refinedstorage:wireless_grid.tooltip.1", getY(stack))); list.add(I18n.translateToLocalFormatted("misc.refinedstorage:wireless_grid.tooltip.2", getZ(stack))); @@ -133,12 +132,14 @@ public class ItemWirelessGrid extends ItemEnergyContainer { @Override public ActionResult onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand) { - if (!world.isRemote && canOpenWirelessGrid(world, player, stack)) { + if (!world.isRemote && getDimensionId(stack) == player.dimension) { TileController tile = (TileController) world.getTileEntity(new BlockPos(getX(stack), getY(stack), getZ(stack))); - tile.onOpenWirelessGrid(player, hand); - - return new ActionResult(EnumActionResult.SUCCESS, stack); + if (tile.onOpenWirelessGrid(player, hand)) { + return new ActionResult(EnumActionResult.SUCCESS, stack); + } else { + player.addChatComponentMessage(new TextComponentString(I18n.translateToLocal("misc.refinedstorage:wireless_grid.out_of_range"))); + } } return new ActionResult(EnumActionResult.PASS, stack); @@ -172,31 +173,15 @@ public class ItemWirelessGrid extends ItemEnergyContainer { return stack.getTagCompound().getInteger(NBT_SEARCH_BOX_MODE); } - public static boolean isInRange(ItemStack stack, EntityLivingBase entity) { - return (int) Math.sqrt(Math.pow(getX(stack) - entity.posX, 2) + Math.pow(getY(stack) - entity.posY, 2) + Math.pow(getZ(stack) - entity.posZ, 2)) < RANGE; - } - - public static boolean canOpenWirelessGrid(World world, EntityLivingBase entity, ItemStack stack) { - if (entity != null && stack.hasTagCompound() + private static boolean hasValidNBT(ItemStack stack) { + return stack.hasTagCompound() && stack.getTagCompound().hasKey(NBT_CONTROLLER_X) && stack.getTagCompound().hasKey(NBT_CONTROLLER_Y) && stack.getTagCompound().hasKey(NBT_CONTROLLER_Z) && stack.getTagCompound().hasKey(NBT_DIMENSION_ID) && stack.getTagCompound().hasKey(NBT_SORTING_DIRECTION) && stack.getTagCompound().hasKey(NBT_SORTING_TYPE) - && stack.getTagCompound().hasKey(NBT_SEARCH_BOX_MODE)) { - if (world == null) { - world = entity.worldObj; - } - - int x = getX(stack); - int y = getY(stack); - int z = getZ(stack); - - return isInRange(stack, entity) && getDimensionId(stack) == entity.dimension && world.getTileEntity(new BlockPos(x, y, z)) instanceof TileController; - } - - return false; + && stack.getTagCompound().hasKey(NBT_SEARCH_BOX_MODE); } @Override diff --git a/src/main/java/refinedstorage/tile/TileController.java b/src/main/java/refinedstorage/tile/TileController.java index 85566b4f4..f2d77a587 100755 --- a/src/main/java/refinedstorage/tile/TileController.java +++ b/src/main/java/refinedstorage/tile/TileController.java @@ -66,6 +66,8 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor private EnergyStorage energy = new EnergyStorage(ENERGY_CAPACITY); private int energyUsage; + private int wirelessGridRange; + private boolean destroyed = false; private boolean machinesHavePosition(List tiles, BlockPos pos) { @@ -103,7 +105,13 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor } } + int range = 0; + for (TileMachine machine : newMachines) { + if (machine instanceof TileWirelessTransmitter) { + range += ((TileWirelessTransmitter) machine).getRange(); + } + if (!machinesHavePosition(machines, machine.getPos())) { machine.onConnected(this); } else { @@ -117,6 +125,8 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor } } + wirelessGridRange = range; + machines = newMachines; storages.clear(); @@ -201,6 +211,10 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor return EnumControllerType.NORMAL; } + public int getWirelessGridRange() { + return wirelessGridRange; + } + public void onDestroyed() { disconnectAll(); @@ -353,12 +367,20 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor return newStack; } - public void onOpenWirelessGrid(EntityPlayer player, EnumHand hand) { + public boolean onOpenWirelessGrid(EntityPlayer player, EnumHand hand) { + boolean inRange = (int) Math.sqrt(Math.pow(getPos().getX() - player.posX, 2) + Math.pow(getPos().getY() - player.posY, 2) + Math.pow(getPos().getZ() - player.posZ, 2)) < getWirelessGridRange(); + + if (!inRange) { + return false; + } + wirelessGridConsumers.add(new WirelessGridConsumer(player, hand, player.getHeldItem(hand))); player.openGui(RefinedStorage.INSTANCE, RefinedStorageGui.WIRELESS_GRID, worldObj, HandUtils.getIdFromHand(hand), 0, 0); drainEnergyFromWirelessGrid(player, ItemWirelessGrid.USAGE_OPEN); + + return true; } public void onCloseWirelessGrid(EntityPlayer player) { diff --git a/src/main/java/refinedstorage/tile/TileWirelessTransmitter.java b/src/main/java/refinedstorage/tile/TileWirelessTransmitter.java index daf216bae..b59080e73 100755 --- a/src/main/java/refinedstorage/tile/TileWirelessTransmitter.java +++ b/src/main/java/refinedstorage/tile/TileWirelessTransmitter.java @@ -1,19 +1,151 @@ package refinedstorage.tile; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.text.ITextComponent; +import refinedstorage.inventory.InventorySimple; +import refinedstorage.util.InventoryUtils; + +public class TileWirelessTransmitter extends TileMachine implements IInventory { + public static final int RANGE_PER_UPGRADE = 8; + public static final int RF_PER_UPGRADE = 8; + + private InventorySimple inventory = new InventorySimple("upgrades", 9, this); -public class TileWirelessTransmitter extends TileMachine { @Override public int getEnergyUsage() { - return 0; + return 8 + (getUpgrades() * RF_PER_UPGRADE); } @Override public void updateMachine() { } + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + + InventoryUtils.restoreInventory(inventory, 0, nbt); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + + InventoryUtils.saveInventory(inventory, 0, nbt); + } + + public int getRange() { + return 16 + (getUpgrades() * RANGE_PER_UPGRADE); + } + + private int getUpgrades() { + int upgrades = 0; + + for (int i = 0; i < 9; ++i) { + if (inventory.getStackInSlot(i) != null) { + upgrades++; + } + } + + return upgrades; + } + @Override public Class getContainer() { return null; } + + @Override + public IInventory getDroppedInventory() { + return inventory; + } + + @Override + public int getSizeInventory() { + return inventory.getSizeInventory(); + } + + @Override + public ItemStack getStackInSlot(int slot) { + return inventory.getStackInSlot(slot); + } + + @Override + public ItemStack decrStackSize(int slot, int count) { + return inventory.decrStackSize(slot, count); + } + + @Override + public ItemStack removeStackFromSlot(int slot) { + return inventory.removeStackFromSlot(slot); + } + + @Override + public void setInventorySlotContents(int slot, ItemStack stack) { + inventory.setInventorySlotContents(slot, stack); + } + + @Override + public int getInventoryStackLimit() { + return inventory.getInventoryStackLimit(); + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player) { + return inventory.isUseableByPlayer(player); + } + + @Override + public void openInventory(EntityPlayer player) { + inventory.openInventory(player); + } + + @Override + public void closeInventory(EntityPlayer player) { + inventory.closeInventory(player); + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack stack) { + return inventory.isItemValidForSlot(slot, stack); + } + + @Override + public int getField(int id) { + return inventory.getField(id); + } + + @Override + public void setField(int id, int value) { + inventory.setField(id, value); + } + + @Override + public int getFieldCount() { + return inventory.getFieldCount(); + } + + @Override + public void clear() { + inventory.clear(); + } + + @Override + public String getName() { + return inventory.getName(); + } + + @Override + public boolean hasCustomName() { + return inventory.hasCustomName(); + } + + @Override + public ITextComponent getDisplayName() { + return inventory.getDisplayName(); + } } diff --git a/src/main/java/refinedstorage/tile/grid/TileGrid.java b/src/main/java/refinedstorage/tile/grid/TileGrid.java index 9155a0db1..12b6d03c9 100755 --- a/src/main/java/refinedstorage/tile/grid/TileGrid.java +++ b/src/main/java/refinedstorage/tile/grid/TileGrid.java @@ -56,7 +56,7 @@ public class TileGrid extends TileMachine implements IGrid { private InventoryCrafting craftingInventory = new InventoryCrafting(craftingContainer, 3, 3); private InventorySimple craftingResultInventory = new InventorySimple("crafting_result", 1); - private InventorySimple patternsInventory = new InventorySimple("patterns", 2); + private InventorySimple patternsInventory = new InventorySimple("patterns", 2, this); private int sortingDirection = SORTING_DIRECTION_DESCENDING; private int sortingType = SORTING_TYPE_NAME; diff --git a/src/main/resources/assets/refinedstorage/lang/en_US.lang b/src/main/resources/assets/refinedstorage/lang/en_US.lang index ae06aee1b..18c3b9b1f 100755 --- a/src/main/resources/assets/refinedstorage/lang/en_US.lang +++ b/src/main/resources/assets/refinedstorage/lang/en_US.lang @@ -21,6 +21,7 @@ gui.refinedstorage:interface.import=Interface Import gui.refinedstorage:interface.export=Interface Export gui.refinedstorage:interface.patterns=Patterns gui.refinedstorage:crafting_monitor=Crafting Monitor +gui.refinedstorage:wireless_transmitter=Wireless Transmitter (%d blocks) misc.refinedstorage:energy_stored=%d / %d RF misc.refinedstorage:energy_usage=Usage: %d RF/t @@ -36,7 +37,6 @@ misc.refinedstorage:wireless_grid.tooltip.0=X: %d misc.refinedstorage:wireless_grid.tooltip.1=Y: %d misc.refinedstorage:wireless_grid.tooltip.2=Z: %d misc.refinedstorage:wireless_grid.out_of_range=Controller out of range. -misc.refinedstorage:wireless_grid.not_found=Controller not found. misc.refinedstorage:yes=Yes misc.refinedstorage:no=No diff --git a/src/main/resources/assets/refinedstorage/lang/nl_NL.lang b/src/main/resources/assets/refinedstorage/lang/nl_NL.lang index eadc942f9..9b04995b5 100755 --- a/src/main/resources/assets/refinedstorage/lang/nl_NL.lang +++ b/src/main/resources/assets/refinedstorage/lang/nl_NL.lang @@ -21,6 +21,7 @@ gui.refinedstorage:interface.import=Interface Import gui.refinedstorage:interface.export=Interface Export gui.refinedstorage:interface.patterns=Patronen gui.refinedstorage:crafting_monitor=Crafting Monitor +gui.refinedstorage:wireless_transmitter=Draadloze Zender (%d blokken) misc.refinedstorage:energy_stored=%d / %d RF misc.refinedstorage:energy_usage=Vebruik: %d RF/t @@ -36,7 +37,6 @@ misc.refinedstorage:wireless_grid.tooltip.0=X: %d misc.refinedstorage:wireless_grid.tooltip.1=Y: %d misc.refinedstorage:wireless_grid.tooltip.2=Z: %d misc.refinedstorage:wireless_grid.out_of_range=Controller buiten bereik. -misc.refinedstorage:wireless_grid.not_found=Controller werd niet gevonden. misc.refinedstorage:yes=Ja misc.refinedstorage:no=Nee diff --git a/src/main/resources/assets/refinedstorage/textures/gui/wireless_transmitter.png b/src/main/resources/assets/refinedstorage/textures/gui/wireless_transmitter.png index b7acef20a..15c68e0e7 100755 Binary files a/src/main/resources/assets/refinedstorage/textures/gui/wireless_transmitter.png and b/src/main/resources/assets/refinedstorage/textures/gui/wireless_transmitter.png differ