Wireless transmitters with range upgrades

This commit is contained in:
Raoul Van den Berge
2016-04-11 21:39:08 +02:00
parent 1bec48499b
commit 6afa1c3b24
13 changed files with 285 additions and 33 deletions

View File

@@ -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;
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}

View File

@@ -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"));
}
}

View File

@@ -15,6 +15,7 @@ public class ItemUpgrade extends ItemBase {
setHasSubtypes(true);
setMaxDamage(0);
setMaxStackSize(1);
}
@Override

View File

@@ -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<ItemStack> 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

View File

@@ -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<TileMachine> 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) {

View File

@@ -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<? extends Container> 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();
}
}

View File

@@ -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;