public static void castAbility(Ability ability) {
		if (ability != null && ability.getOwner() != null) {
			// create event for gameEventController
			Map<GameEventParameter, Object> eventParams = new HashMap<GameEventParameter, Object>();
			GameEventType eventType = null;

			eventParams.put(GameEventParameter.TRIGGERING_UNIT, ability.getOwner());
			eventParams.put(GameEventParameter.TRIGGERING_ABILITY, ability);
			switch (ability.getTargetType()) {
				case POINT_TARGET:
				case AREA_TARGET: {
					eventParams.put(GameEventParameter.ABILITY_TARGET_X, ability.getTargetX());
					eventParams.put(GameEventParameter.ABILITY_TARGET_Y, ability.getTargetY());
					eventParams.put(GameEventParameter.ABILITY_TARGET_RADIUS, ability.getRadius());
					eventType = GameEventType.UNIT_USE_ABILITY_POINT_TARGET;
					break;
				}
				case SINGLE_TARGET: {
					eventParams.put(GameEventParameter.ABILITY_TARGET_UNIT, ability.getTarget());
					eventType = GameEventType.UNIT_USE_ABILITY_UNIT_TARGET;
					break;
				}
				default: {
					// NO_TARGET ability type
					eventType = GameEventType.UNIT_USE_ABILITY_POINT_TARGET;
					break;
				}
			}

			GameEventHandler.INSTANCE.createAndDispatchEvent(eventType, ability.getOwner(), eventParams);
			ability.setTarget(null);
			if (LOGGER.isDebugEnabled())
				LOGGER.debug("Successfully casted ability '" + ability + "' of target type '" + ability.getTargetType() + "' and event type '" + eventType + "'");
		}
	}