@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
 public void onBlockPhysics(BlockPhysicsEvent event) {
   final Block block = event.getBlock();
   final Material type = block.getType();
   if (MaterialUtil.ISSIGN.get(type)) {
     if (Util.isSupported(block)) {
       // Check for potential redstone changes
       updateRedstonePower(block);
     } else {
       // Remove from block power storage
       poweredBlocks.remove(block);
     }
   } else if (MaterialUtil.ISREDSTONETORCH.get(type)) {
     // Send proper update events for all signs around this power source
     for (BlockFace face : FaceUtil.RADIAL) {
       final Block rel = event.getBlock().getRelative(face);
       if (MaterialUtil.ISSIGN.get(rel)) {
         CommonUtil.nextTick(
             new Runnable() {
               public void run() {
                 updateRedstonePower(rel);
               }
             });
       }
     }
   }
 }
 @EventHandler(priority = EventPriority.HIGHEST)
 public void onBlockRedstoneChange(BlockRedstoneEvent event) {
   if (TrainCarts.isWorldDisabled(event)) {
     return;
   }
   Material type = event.getBlock().getType();
   if (BlockUtil.isType(type, Material.LEVER)) {
     Block up = event.getBlock().getRelative(BlockFace.UP);
     Block down = event.getBlock().getRelative(BlockFace.DOWN);
     if (MaterialUtil.ISSIGN.get(up)) {
       updateRedstonePower(up, event.getNewCurrent() > 0);
     }
     if (MaterialUtil.ISSIGN.get(down)) {
       updateRedstonePower(down, event.getNewCurrent() > 0);
     }
     ignoreOutputLever(event.getBlock());
   } else if (MaterialUtil.ISSIGN.get(type)) {
     updateRedstonePower(event.getBlock(), event.getNewCurrent() > 0);
   }
 }
 /**
  * Ignores signs of current-tick redstone changes caused by the lever
  *
  * @param lever to ignore
  */
 public void ignoreOutputLever(Block lever) {
   // Ignore signs that are attached to the block the lever is attached to
   Block att = BlockUtil.getAttachedBlock(lever);
   for (BlockFace face : FaceUtil.ATTACHEDFACES) {
     Block signblock = att.getRelative(face);
     if (MaterialUtil.ISSIGN.get(signblock)
         && BlockUtil.getAttachedFace(signblock) == face.getOppositeFace()) {
       if (ignoredSigns.isEmpty()) {
         // clear this the next tick
         CommonUtil.nextTick(
             new Runnable() {
               public void run() {
                 ignoredSigns.clear();
               }
             });
       }
       ignoredSigns.add(signblock);
     }
   }
 }