@Override
  public void executeRitual(
      EntityPlayer player, ItemStack stack, final World world, final BlockPos pos) {
    if (stack.getItem() == ItemManager.itemEarthRod) {
      if (world.getBlockState(pos).getBlock() == Blocks.EMERALD_ORE) {
        if (ItemEarthRod.isRodInfused(stack)) {
          final EarthStoneOuter outer = new EarthStoneOuter();
          final EarthStoneInner inner = new EarthStoneInner();

          ParticleSystem infuseSystem = createInfuseSystem();
          final ParticleSystem finishSystem = createFinishSystem();

          if (outer.checkMatrix(world, pos, false, true)
              && inner.checkMatrix(world, pos, false, true)) {
            ParticleSystemManager.INSTANCE.addSpawnForTimeWithDelay(
                infuseSystem, 2000, world, pos, 20);
            DelayUtil.INSTANCE.postDelayed(
                2000,
                new DelayUtil.DelayedAction() {
                  @Override
                  public void execute() {
                    if (outer.checkMatrix(world, pos, true, true)
                        && inner.checkMatrix(world, pos, false, true)) {
                      outer.placeBlocks(world, pos, false, true);
                      ParticleSystemManager.INSTANCE.addSpawnForTime(finishSystem, 50, world, pos);
                    }
                  }
                });
          }
        }
      }
    }
  }
  @Override
  public boolean canExecuteRitual(EntityPlayer player, ItemStack stack, World world, BlockPos pos) {
    if (stack.getItem() == ItemManager.itemEarthRod) {
      if (world.getBlockState(pos).getBlock() == Blocks.EMERALD_ORE) {
        if (ItemEarthRod.isRodInfused(stack)) {
          EarthStoneOuter outer = new EarthStoneOuter();
          EarthStoneInner inner = new EarthStoneInner();

          if (outer.checkMatrix(world, pos, false, true)
              && inner.checkMatrix(world, pos, false, true)) return true;
        }
      }
    }
    return false;
  }