@Override
 public void resetHardness(org.getspout.spoutapi.material.Block block) {
   int id = block.getRawId();
   if (block instanceof CustomBlock) {
     id = ((CustomBlock) block).getBlockId();
   }
   int data = block.getRawData();
   if (originalHardness.containsKey(id, data)) {
     setHardness(block, originalHardness.get(id, data));
     originalHardness.remove(id, data);
   }
   updateBlockAttributes(id, (short) data); // invalidate cache
 }
 @Override
 public void setFriction(org.getspout.spoutapi.material.Block block, float friction) {
   int id = block.getRawId();
   if (block instanceof CustomBlock) {
     id = ((CustomBlock) block).getBlockId();
   }
   int data = block.getRawData();
   if (!originalFriction.containsKey(id, data)) {
     originalFriction.put(id, data, getFriction(block));
   }
   net.minecraft.server.Block.byId[id].frictionFactor = friction;
   updateBlockAttributes(id, (short) data); // invalidate cache
 }
  @Override
  public Set<org.getspout.spoutapi.material.Block> getModifiedBlocks() {
    // hit cache first
    if (cachedBlockData != null) {
      return cachedBlockData;
    }
    Set<org.getspout.spoutapi.material.Block> modified =
        new HashSet<org.getspout.spoutapi.material.Block>();
    TLongFloatIterator i = originalFriction.iterator();
    while (i.hasNext()) {
      i.advance();
      int id = TIntPairHashSet.longToKey1(i.key());
      int data = TIntPairHashSet.longToKey2(i.key());

      org.getspout.spoutapi.material.Block block = MaterialData.getBlock(id, (short) data);
      if (block != null) {
        modified.add(block);
      }
    }

    i = originalHardness.iterator();
    while (i.hasNext()) {
      i.advance();
      int id = TIntPairHashSet.longToKey1(i.key());
      int data = TIntPairHashSet.longToKey2(i.key());
      org.getspout.spoutapi.material.Block block = MaterialData.getBlock(id, (short) data);
      if (block != null) {
        modified.add(block);
      }
    }

    TIntIntIterator j = originalLight.iterator();
    while (j.hasNext()) {
      j.advance();
      org.getspout.spoutapi.material.Block block = MaterialData.getBlock(j.key());
      if (block != null) {
        modified.add(block);
      }
    }

    TIntByteIterator k = originalOpacity.iterator();
    while (k.hasNext()) {
      k.advance();
      org.getspout.spoutapi.material.Block block = MaterialData.getBlock(k.key());
      if (block != null) {
        modified.add(block);
      }
    }
    cachedBlockData = modified; // save to cache
    return modified;
  }
 @Override
 public void setHardness(org.getspout.spoutapi.material.Block block, float hardness) {
   int id = block.getRawId();
   if (block instanceof CustomBlock) {
     id = ((CustomBlock) block).getBlockId();
   }
   int data = block.getRawData();
   if (!originalHardness.containsKey(id, data)) {
     originalHardness.put(id, data, getHardness(block));
   }
   net.minecraft.server.Block b = net.minecraft.server.Block.byId[id];
   if (b instanceof CustomMCBlock) {
     ((CustomMCBlock) b).setHardness(hardness);
   }
   updateBlockAttributes(id, (short) data); // invalidate cache
 }