@Override
 public void writeToNBT(NBTTagCompound tagCompound) {
   super.writeToNBT(tagCompound);
   if (link != null) {
     NBTTagCompound linkTag = new NBTTagCompound();
     link.writeToNBT(linkTag);
     tagCompound.setTag("link", linkTag);
   }
   tagCompound.setBoolean("noEnergy", noEnergy);
   storage.writeToNBT(tagCompound);
 }
  public void onStepped(Entity stepper) {
    if (worldObj.isRemote || link == null) return;

    if (here == null) here = Vector3.getNewVector().set(this);
    if (linkPos == null) {
      linkPos = Vector3.getNewVector().set(link.x, link.y, link.z);
    }

    double distSq = 0;
    long time = worldObj.getTotalWorldTime();
    long lastStepped = stepper.getEntityData().getLong("lastWarpPadUse");
    boolean tele =
        link != null
            && !link.isEmpty()
            && lastStepped + COOLDOWN <= time
            && (MAXRANGE < 0 || (distSq = here.distToSq(linkPos)) < MAXRANGE * MAXRANGE);
    if (tele && Config.instance.warpPadEnergy && !noEnergy) {
      int energy = (int) (distSq);
      tele = storage.extractEnergy(energy, false) == energy;

      if (!tele) {
        worldObj.playSoundEffect(
            getPos().getX(), getPos().getY(), getPos().getZ(), "note.bd", 1.0F, 1.0F);
        stepper.getEntityData().setLong("lastWarpPadUse", time);
      }
    }

    if (tele) {
      worldObj.playSoundEffect(
          getPos().getX(), getPos().getY(), getPos().getZ(), "mob.endermen.portal", 1.0F, 1.0F);
      PacketBuffer buff = new PacketBuffer(Unpooled.buffer());
      buff.writeByte(9);
      here.writeToBuff(buff);
      MessageClient packet = new MessageClient(buff);
      PokecubePacketHandler.sendToAllNear(packet, here, stepper.dimension, 20);
      stepper.getEntityData().setLong("lastWarpPadUse", time);
      TeleDest d = new TeleDest(link);
      Vector3 loc = d.getLoc();
      int dim = d.getDim();
      if (stepper instanceof EntityPlayer) {
        Transporter.teleportEntity(stepper, loc, dim, false);
      } else if (dim == d.getDim()) {
        stepper.setPositionAndUpdate(loc.x, loc.y, loc.z);
      } else {
        return;
      }
      worldObj.playSoundEffect(loc.x, loc.y, loc.z, "mob.endermen.portal", 1.0F, 1.0F);
      buff = new PacketBuffer(Unpooled.buffer());
      buff.writeByte(9);
      linkPos.writeToBuff(buff);
      packet = new MessageClient(buff);
      PokecubePacketHandler.sendToAllNear(packet, linkPos, stepper.dimension, 20);
    }
  }
 @Callback(
     doc =
         "function(x:number, y:number, z:number, w:number) - Sets the 4-vector destination, w is the dimension")
 @Optional.Method(modid = "OpenComputers")
 public Object[] setDestination(Context context, Arguments args) throws Exception {
   if (args.isDouble(0) && args.isDouble(1) && args.isDouble(2) && args.isDouble(3)) {
     float x = (float) args.checkDouble(0);
     float y = (float) args.checkDouble(1);
     float z = (float) args.checkDouble(2);
     float w = (float) args.checkDouble(3);
     if (link == null) {
       link = new Vector4(x, y, z, w);
     } else {
       link.set(x, y, z, w);
     }
     return new Object[] {link.x, link.y, link.z, link.w};
   }
   throw new Exception("invalid arguments, expected number,number,number,number");
 }