public boolean createAndDispatchEvent(GameEventType type, GameObject source, Map<GameEventParameter, Object> params) {
		if (source != null && params != null) {
			// check if all parameters for the event are set correctly
			List<GameEventParameter> availableParameters = type.getAvailableParameters();
			for (GameEventParameter param : availableParameters) {
				if (!params.containsKey(param) || !param.getClassType().isInstance(params.get(param))) {
					LOGGER.error("Trying to create an event of type '" + type + "' with invalid parameter: " + param);
					return false;
				}
			}

			// all parameters for the event are correct
			// --> create it and notify listeners
			if (eventListeners.containsKey(type)) {
				GameEvent event = new GameEvent(type, source, params);
				Map<Integer, Set<IGameEventListener>> listeners = eventListeners.get(type);
				if (listeners.size() > 0) {
					for (Map.Entry<Integer, Set<IGameEventListener>> entry : listeners.entrySet()) {
						for (IGameEventListener listener : entry.getValue()) {
							if (LOGGER.isDebugEnabled())
								LOGGER.debug("Dispatching event '" + event + "' of type '" + type + "' for listener '" + listener + "' (priority: " + entry.getKey() + ")");
							// check if event should not be processed anymore
							if (!listener.onEvent(type, event)) {
								if (LOGGER.isDebugEnabled())
									LOGGER.debug("Successfully processed event (abrupt ending)'" + event + "'");
								return true;
							}
						}
					}

					if (LOGGER.isDebugEnabled())
						LOGGER.debug("Successfully processed event '" + event + "'");
					return true;
				}
			}
		}

		return false;
	}