@Override
 public boolean rawSetBlock(Vector pt, BaseBlock block) {
   boolean success = super.rawSetBlock(pt, block);
   if (success) {
     if (transaction != null) {
       factory.onTransactionBlockEdit(transaction, player, pt, block);
     } else {
       factory.onBlockEdit(player, pt, block);
     }
   }
   return success;
 }
 @Override
 public void flushQueue() {
   transaction = factory.getModel().groupUpdate();
   super.flushQueue();
   if (transaction != null) {
     transaction.finish();
     transaction = null;
   }
 }
 @Override
 public int setBlocks(Region region, Pattern pattern) throws MaxChangedBlocksException {
   boolean useTransaction = false;
   if (transaction == null) {
     transaction = factory.getModel().groupUpdate();
     useTransaction = true;
   }
   int ret;
   try {
     ret = super.setBlocks(region, pattern);
   } catch (MaxChangedBlocksException e) {
     transaction = null;
     throw e;
   }
   if (transaction != null && useTransaction) {
     transaction.finish();
     transaction = null;
   }
   return ret;
 }