@Override
	public void run() {
		script.familiarFailed.set(false);
		renew(script);
		ctx.sleep(1000);

		if (script.familiarFailed.get()) {
			script.options.status = "Renewing familiar failed";
			final Tile start = ctx.players.local().tile();
			final List<Tile> tiles = familarTile(ctx);
			for (final Tile tile : tiles) {
				script.familiarFailed.set(false);
				if (ctx.movement.findPath(tile).traverse()) {
					if (Condition.wait(new Callable<Boolean>() {
						@Override
						public Boolean call() throws Exception {
							return IMovement.Euclidean(tile, ctx.players.local()) < 2.5;
						}
					}, Random.nextInt(400, 650), Random.nextInt(10, 15)) || !start.equals(start)) {
						renew(script);
						if (!script.familiarFailed.get()) {
							break;
						}
						ctx.sleep(900);
					}
				}
			}
		}

		if (ctx.summoning.summoned() && ctx.summoning.timeLeft() > nextRenew) {
			reset();
		}

		script.nextSummon.set(System.currentTimeMillis() + Random.nextInt(5000, 15000));
	}