private void traverseCage() {
		final GameObject gate = gate();

		if (!ctx.definitions.get(gate).name.equals("Gate")) {
			return;
		}

		if (ctx.camera.prepare(gate) && gate.interact("Open")) {
			Condition.wait(new Callable<Boolean>() {
				@Override
				public Boolean call() throws Exception {
					if (ctx.chat.visible(PASS_THROUGH_THE_GATE_AND_TALK_TO_THE_COMBAT)) {
						return npc().valid();
					}
					if (ctx.chat.visible(PASS_THROUGH_THE_GATE_AND_TALK_TO_THE_COMBAT)) {
						return rat().nearest().poll().valid();
					}
					return false;
				}
			}, 200, 20);
		}
	}