Vote System
Descripción general
Vote System añade votaciones a tu servidor. Una votación es una definición de voto: un título, una lista de opciones, una fecha de cierre opcional y un mensaje que se muestra cuando la votación se ha cerrado. Cada jugador puede votar una vez por votación, desde una acción de TypeWriter (una opción de diálogo, un NPC, un clic en un menú) o con un comando. Los votos se almacenan en un artefacto de TypeWriter.
Los resultados están disponibles como placeholders de PlaceholderAPI, por lo que puedes mostrarlos en un scoreboard, en un holograma o en un menú, y con un comando para el staff. Es una votación entre tus jugadores, no un enlace a sitios de votación de listas de servidores.
Características
- Votaciones con varias opciones: cada opción tiene su propio texto, que puede contener placeholders y colores.
- Un voto por jugador: se rechaza un segundo voto en la misma votación, salvo que definas un
cooldownSecondsde nuevo voto en Vote Config. - Fecha de cierre: cierra una votación automáticamente en una fecha y hora determinadas.
- Mensajes de cierre y de bloqueo — avisan a quien vota tarde de que la encuesta terminó, y a quien vuelve a votar demasiado pronto de que debe esperar. Ambos son MiniMessage.
- Acción de voto: emite un voto para el jugador que la activa y continúa tu secuencia solo cuando el voto se ha registrado.
- Mensaje de estado: envía un mensaje distinto según el jugador ya haya votado o no.
- Resultados en directo: totales, recuentos por opción y la opción elegida por el jugador, como placeholders.
- Comandos de staff: votar por un jugador, leer los resultados y reiniciar una votación.
Instalación
- Instala PlaceholderAPI si quieres mostrar los resultados con placeholders.
- Coloca el JAR de Vote System en
plugins/Typewriter/extensions/y reinicia el servidor.
Primeros pasos
Organiza una votación sobre la próxima temática del mapa:
- En el panel web de TypeWriter, abre una página de manifiesto y añade un artefacto Vote Data. Conserva el
artifactIdpor defecto (vote_storage). - Añade una Vote Definition. Establece
displayNameenNext map theme, añade tres elementos aoptions(por ejemploDesert,Snow,Jungle) y enlaza el artefacto endata. - Establece
endDateen una fecha y hora UTC como2026-12-31T23:00:00Z, yclosedMessageen un texto breve. DejaendDatevacío para una votación sin fin. - Abre una página de secuencia. Añade una Vote Action por cada opción: enlaza la
definitiony estableceoptionIndexen0,1o2. El índice de opción empieza en 0. - Conecta cada acción a una opción de diálogo, a una interacción con un NPC o a un botón de menú, y coloca tu mensaje de agradecimiento o tu recompensa en los
triggersde la acción. Solo se ejecutan cuando el voto se registra. - Opcionalmente, añade un Vote Message antes de las opciones, para recordárselo a los jugadores que ya han votado.
- Publica. Usa
%typewriter_vote_total_<definition id>%en un scoreboard para mostrar el número de votos.
Los votos de una votación se almacenan bajo una clave derivada del id de entrada de su definición de voto. Si eliminas la entrada o cambias su id, ya no se encuentran sus votos almacenados.
Comandos
Todos los comandos son subcomandos de /typewriter (alias /tw). <definition> es el id o el nombre de una definición de voto.
| Comando | Permiso | Descripción |
|---|---|---|
/typewriter vote <definition> <option> [target] | typewriter.vote.cast | Vota por una opción. Las opciones empiezan en 1. Con target, vota por los jugadores seleccionados. |
/typewriter vote stats [definition] | typewriter.vote.stats | Muestra los votos por opción y el total, de una votación o de todas. |
/typewriter vote reset <definition> | typewriter.vote.reset | Elimina todos los votos de una votación. |
Todos ellos necesitan también typewriter.vote.
Textos editables
Ningún texto que se muestra en el juego está fijado en el código. Los mensajes de una votación son campos de sus entradas: closedMessage de la Vote Definition y los dos mensajes de Vote Message. Lo que responden los comandos /typewriter vote es un snippet de TypeWriter, así que puedes reformularlo, traducirlo o cambiarle el color sin recompilar nada. Abre plugins/Typewriter/snippets.yml, busca la clave bajo content.vote, cambia el valor y ejecuta /tw reload. La extensión registra todos sus snippets con su texto por defecto al iniciarse, así que aparecen en el archivo tras el primer arranque. Si mantienes los valores por defecto, nada cambia.
Las respuestas de los comandos son MiniMessage. Se envían con el prefijo de respuesta de Typewriter (Typewriter »), que viene del motor y no forma parte de estos snippets. Un {name} en un texto se sustituye por el valor indicado en la tabla; un placeholder que no existe se queda tal cual, y un valor nunca se vuelve a examinar en busca de placeholders. El registro de la consola del servidor sigue en inglés.
Snippet (bajo content.vote.) | Por defecto | Placeholders |
|---|---|---|
usage | <gray>Usage: /tw vote <definition> <option> [target]</gray> | ninguno |
option_unavailable | <red>Option {option} is not available for {definition}.</red> | {option} (el número escrito), {definition} (el id de la votación) |
already_voted | <red>{player} cannot vote in {definition} yet.</red> | {player}, {definition} |
cast_option_fallback | option {number} | {number} (posición de la opción, desde 1) |
recorded_for_voter | Your vote for <blue>{definition}</blue> has been recorded as <green>{option}</green>. | {definition}, {option} (el texto de la opción) |
recorded_by_other | Recorded vote for <blue>{player}</blue> in {definition}: {option}. | {player}, {definition}, {option} |
recorded_for_self | Vote registered for {definition}: {option}. | {definition}, {option} |
cast_failed | <red>Unable to register the vote for {player} in {definition}.</red> | {player}, {definition} |
reset_done | <green>Votes reset for {definition}.</green> | {definition} |
no_definitions | There are no active vote definitions. | ninguno |
stats_line | Stats for {name} [{definition}]: {options} | total: {total} | {name} (el displayName, o el nombre de la entrada si está vacío), {definition}, {options}, {total} |
stats_option | {number}: {votes} ({label}) | {number}, {votes}, {label} (el texto de la opción) |
stats_option_fallback | Option {number} | {number} |
stats_separator | , | ninguno |
entry_not_found | Could not find entry {entry} | {entry} (lo que se escribió) |
entry_rejected | Entry did not pass filter | ninguno |
stats_option se repite una vez por opción y los resultados se unen con stats_separator para formar {options} de stats_line. stats_option_fallback es el {label} de una opción sin texto, y cast_option_fallback es el nombre de esa opción en los mensajes que se envían al registrar un voto. Los dos últimos snippets son errores de comando, que el juego muestra en rojo: son texto sin formato, sin MiniMessage.
Cuando la encuesta está cerrada, /tw vote muestra el closedMessage de la encuesta al miembro del staff (cast_failed solo se usa si ese mensaje está vacío). cast_failed también responde a una entrada de datos ausente o a una opción fuera de rango.
Permisos
| Permiso | Concede |
|---|---|
typewriter.vote | Acceso al comando /typewriter vote. |
typewriter.vote.cast | Emitir un voto con el comando. |
typewriter.vote.stats | Leer los resultados con el comando. |
typewriter.vote.reset | Reiniciar una votación. |
La acción de voto no comprueba estos permisos: solo necesita que se ejecute la entrada.
Placeholders
Sustituye <id> por el id de entrada de la definición de voto. Requieren PlaceholderAPI.
| Placeholder | Devuelve |
|---|---|
%typewriter_vote_display_<id>% | El displayName de la votación. |
%typewriter_vote_option_<id>_<n>% | El texto de la opción número n, empezando en 1. |
%typewriter_vote_total_<id>% | El número total de votos. |
%typewriter_vote_stats_<id>% | Los votos de cada opción, separados por comas. |
%typewriter_vote_stats_<id>_<n>% | Los votos de la opción número n, empezando en 1. |
%typewriter_vote_player_<id>% | El texto de la opción por la que votó el jugador, o nada si no ha votado. |
%typewriter_vote_has_voted_<id>% | 1 si el jugador no puede volver a votar por ahora (votó y la espera no ha terminado), si no 0. |
%typewriter_vote_closed_<id>% | 1 una vez pasada la fecha de fin, si no 0. |
%typewriter_vote_remaining_<id>% | Segundos enteros hasta la fecha de fin; 0 sin fecha de fin o una vez pasada. |
vote_votes_<id> funciona igual que vote_stats_<id>.
Entradas
7 entradas, generadas a partir del código fuente de la extensión.
Acciones2
- Vote ActionVote Action
- Vote MessageVote Message
Eventos1
- Vote Cast EventVote Cast Event
Hechos1
- Vote FactVote Fact
Artefactos1
- Vote DataVote Data
Manifiestos2
- Vote ConfigVote System Configuration
- Vote DefinitionVote Definition
Vote Cast Event y Vote Fact existen, pero todavía nada los lee: el evento nunca se dispara y el fact no se rellena con los votos. Vote Config sí se lee: fija el cooldown para votar de nuevo y el registro de depuración.
Resolución de problemas
El voto no se registra. La acción y el comando fallan en silencio cuando falta algo: la definición de voto debe tener un artefacto data enlazado, la opción debe existir, el jugador no debe haber votado ya (o su cooldown debe haber terminado, consulta Vote Config) y la votación no debe haber pasado su endDate. Cuando la votación está cerrada, se envía el closedMessage al jugador. Cuando el jugador debe esperar todavía, se envía el blockedMessage. Activa debug en Vote Config para registrar el motivo de cada rechazo.
La opción equivocada recibe el voto. La acción de voto cuenta las opciones desde 0, mientras que el comando y los placeholders las cuentan desde 1.
La votación nunca se cierra. endDate debe ser un instante ISO-8601 en UTC que termine en Z, como 2026-12-31T23:00:00Z. Un valor en otro formato se ignora y la votación sigue abierta.
Los resultados están vacíos después de renombrar la entrada. Los votos están ligados al id de entrada de la definición. Restaura el id anterior, o reinicia la votación y empieza de nuevo.
Un placeholder se muestra tal cual. Comprueba que PlaceholderAPI está instalado y que el id es el id de entrada de la definición. La extensión también encuentra una definición cuando se solicita un placeholder antes del primer voto.
Los colores de un mensaje se ven mal. Los mensajes de estado de Vote Message, el closedMessage y el blockedMessage se leen como MiniMessage tras resolver los placeholders: escribe <red>texto</red>, no códigos &c.
Los jugadores pueden votar dos veces. La comprobación es por jugador y por votación. Usar varias definiciones de voto con las mismas opciones crea votaciones independientes.