Contenido generado con IA — puede contener errores.

Referenciadev

API

JourneyService en la API de Exylia: iniciar, detener y reiniciar recorridos, leer el progreso, disparar claves CUSTOM y reproducir cinemáticas, más los cuatro eventos de recorrido.

ExyliaJourney registra net.exylia.lib.api.journey.JourneyService (API de Exylia 3.4.0, incluida en ExyliaLib) al activarse. Se obtiene con ExyliaAPI.get(JourneyService.class); está vacío en un servidor sin ExyliaJourney, así que el mismo código funciona en todas partes.

Añadirla a tu proyecto

El artefacto, el repositorio y la línea de plugin.yml son los mismos para todos los plugins de Exylia y están en la página de la API pública. Añade ExyliaJourney en softdepend para que se active antes.

// una función tuya avisa a los recorridos de que se ha usado
ExyliaAPI.get(JourneyService.class).ifPresent(journeys -> journeys.trigger(player, "shop:opened", 1));
 
// iniciar el tutorial de la tienda la primera vez que alguien la abre
ExyliaAPI.get(JourneyService.class).ifPresent(journeys -> {
    StartResult result = journeys.start(player, "shop-tutorial");
    if (result == StartResult.REQUIREMENTS_NOT_MET) { /* ... */ }
});
 
// mostrar dónde está el jugador
ExyliaAPI.get(JourneyService.class)
        .flatMap(journeys -> journeys.activeJourney(player))
        .ifPresent(p -> player.sendMessage("Step " + (p.stepIndex() + 1) + " of " + p.stepCount()));

JourneyService

Todos los métodos son seguros desde cualquier hilo. Lo que cambia el progreso se ejecuta en el hilo del propio jugador (su hilo de región en Folia) y puede completarse un tick después. El progreso se lee de memoria y solo se conoce para jugadores conectados.

MétodoQué hace
List<String> journeyIds()Todos los recorridos que conoce el servidor, activados o no.
boolean exists(String journeyId)Si un recorrido existe.
StartResult start(Player, String journeyId)Inicia un recorrido como lo haría un disparador: se comprueban requisitos, grupo y reglas de repetición, y se dispara JourneyStartEvent con la causa API.
boolean stop(Player, String journeyId)Detiene un recorrido en curso sin completarlo. Sin recompensas; puede volver a empezar. true si estaba en curso.
boolean complete(Player, String journeyId)Completa ya un recorrido en curso, dando sus recompensas de finalización y disparando JourneyCompleteEvent. Los pasos que faltan no se pagan.
boolean reset(UUID player, String journeyId)Olvida progreso, finalización y cooldown. Funciona con jugadores desconectados. true si el recorrido existe.
Optional<JourneyProgress> activeJourney(Player)El recorrido seguido: el que muestra la guía.
List<JourneyProgress> activeJourneys(Player)Todos los recorridos en curso, como mucho uno por grupo.
JourneyState state(Player, String journeyId)NOT_STARTED, ACTIVE, COMPLETED o SKIPPED. Un recorrido detenido se lee como NOT_STARTED, o COMPLETED si una vez anterior se terminó.
int trigger(Player, String key, int amount)Dispara una clave CUSTOM: cuenta para cada paso CUSTOM en curso que la espera (o espera una clave menos específica) e inicia los recorridos con un disparador CUSTOM que coincide. Devuelve cuántos pasos avanzó.
List<String> cinematicIds()Todas las cinemáticas.
boolean playCinematic(Player, String cinematicId)Reproduce una cinemática. Se rechaza (false) en combate, viendo otra, en otro mundo, o para un jugador de Java en un servidor sin PacketEvents. Un jugador de Bedrock recibe los subtítulos en el chat y devuelve true.

JourneyProgress es un record: journeyId, stepIndex (desde 0), stepCount, stepId, progress y goal (1 para un objetivo que se cumple o no).

StartResult

ValorSignificado
STARTEDEstá en curso.
UNKNOWN_JOURNEYNingún recorrido tiene ese id.
DISABLEDenabled: false.
ALREADY_ACTIVEYa está en curso para este jugador.
ALREADY_COMPLETEDNo es repetible y se completó — o el jugador lo saltó.
ON_COOLDOWNRepetible, pero todavía no.
REQUIREMENTS_NOT_METAl jugador le falta su permiso o su condición.
GROUP_BUSYOtro recorrido del mismo grupo está en curso.
CANCELLEDUn listener canceló JourneyStartEvent.
NOT_LOADEDEl progreso del jugador aún no ha terminado de cargarse.

Llamado desde un hilo que no es el del jugador, start responde desde memoria y los requisitos se comprueban un tick después en el hilo del jugador, así que un inicio respondido como STARTED todavía puede rechazarse allí.

Eventos

Todos en net.exylia.lib.api.journey.event, todos eventos de jugador disparados en el hilo del propio jugador.

EventoCuándoCampos
JourneyStartEventUn recorrido va a empezar, después de pasar todas las reglas y antes de escribir o mostrar nada. Cancelable: un inicio cancelado no deja nada detrás.getJourneyId(), getCause(): FIRST_JOIN, JOIN, COMMAND, REGION_ENTER, NPC_CLICK, JOURNEY_COMPLETE, PERMISSION, CUSTOM o API
JourneyStepCompleteEventSe completó un paso, después de sus recompensas y antes de que empiece el siguiente.getJourneyId(), getStepIndex(), getStepId(), isLastStep()
JourneyCompleteEventSe completó un recorrido entero, después de sus recompensas.getJourneyId(), getCompletions() (incluida esta), getDurationMillis()
JourneySkipEventSe saltó un paso o un recorrido entero.getJourneyId(), isWholeJourney(), getStepId() (null para un recorrido entero), getStepIndex()
@EventHandler
public void onJourneyStart(JourneyStartEvent event) {
    // nada de tutoriales dentro del mundo de la arena
    if (event.getPlayer().getWorld().getName().equals("arena")) event.setCancelled(true);
}
 
@EventHandler
public void onJourneyComplete(JourneyCompleteEvent event) {
    if (event.getJourneyId().equals("welcome") && event.getCompletions() == 1) {
        getLogger().info(event.getPlayer().getName() + " finished onboarding in "
                + event.getDurationMillis() / 1000 + "s");
    }
}

¿Falta algo en esta página? Dínoslo en Discord