Vote System
Überblick
Vote System fügt deinem Server Umfragen hinzu. Eine Umfrage ist eine Vote Definition: ein Titel, eine Liste von Optionen, ein optionales Enddatum und eine Nachricht, die nach dem Schließen der Umfrage angezeigt wird. Jeder Spieler kann pro Umfrage einmal abstimmen, über eine TypeWriter-Aktion (eine Dialogoption, einen NPC, einen Menüklick) oder per Befehl. Die Stimmen werden in einem TypeWriter-Artifact gespeichert.
Die Ergebnisse stehen als PlaceholderAPI-Platzhalter zur Verfügung, sodass du sie auf einem Scoreboard, in einem Hologramm oder in einem Menü anzeigen kannst, sowie per Befehl für das Team. Es handelt sich um eine Abstimmung unter deinen Spielern, nicht um einen Link zu Server-Listen-Votingseiten.
Funktionen
- Umfragen mit mehreren Optionen — jede Option hat ihren eigenen Text, der Platzhalter und Farben enthalten kann.
- Eine Stimme pro Spieler — eine zweite Stimme bei derselben Umfrage wird abgelehnt, es sei denn, du legst in Vote Config ein
cooldownSecondsfür erneutes Abstimmen fest. - Enddatum — schließe eine Umfrage automatisch zu einem bestimmten Datum und einer bestimmten Uhrzeit.
- Nachrichten bei Schließung und Sperre — sagen späten Abstimmenden, dass die Umfrage vorbei ist, und Spielern, die zu früh erneut abstimmen, dass sie warten müssen. Beide sind MiniMessage.
- Vote-Aktion — gib eine Stimme für den auslösenden Spieler ab und setze deine Sequence nur fort, wenn die Stimme erfasst wurde.
- Statusnachricht — sende je nachdem, ob der Spieler bereits abgestimmt hat, eine andere Nachricht.
- Live-Ergebnisse — Summen, Zählungen pro Option und die vom Spieler gewählte Option als Platzhalter.
- Team-Befehle — für einen Spieler abstimmen, die Ergebnisse lesen und eine Umfrage zurücksetzen.
Installation
- Installiere PlaceholderAPI, wenn du Ergebnisse mit Platzhaltern anzeigen möchtest.
- Lege die Vote-System-JAR in
plugins/Typewriter/extensions/ab und starte den Server neu.
Erste Schritte
Führe eine Umfrage zum nächsten Karten-Thema durch:
- Öffne im TypeWriter-Web-Panel eine Manifest-Page und füge ein Vote Data-Artifact hinzu. Behalte die Standard-
artifactId(vote_storage) bei. - Füge eine Vote Definition hinzu. Setze
displayNameaufNext map theme, füge drei Einträge zuoptionshinzu (zum BeispielDesert,Snow,Jungle) und verknüpfe das Artifact indata. - Setze
endDateauf ein UTC-Datum mit Uhrzeit wie2026-12-31T23:00:00ZundclosedMessageauf einen kurzen Text. LassendDatefür eine Umfrage ohne Ende leer. - Öffne eine Sequence-Page. Füge für jede Option eine Vote Action hinzu: Verknüpfe die
definitionund setzeoptionIndexauf0,1oder2. Der Optionsindex beginnt bei 0. - Verbinde jede Aktion mit einer Dialogoption, einer NPC-Interaktion oder einem Menü-Button und lege deine Dankesnachricht oder Belohnung in die
triggersder Aktion. Sie werden nur ausgeführt, wenn die Stimme erfasst wird. - Füge optional vor den Optionen eine Vote Message hinzu, um Spieler, die bereits abgestimmt haben, daran zu erinnern.
- Veröffentliche. Verwende
%typewriter_vote_total_<definition id>%auf einem Scoreboard, um die Anzahl der Stimmen anzuzeigen.
Die Stimmen einer Umfrage werden unter einem Schlüssel gespeichert, der von der Entry-ID ihrer Vote Definition abgeleitet ist. Wenn du den Entry löschst oder seine ID änderst, werden die gespeicherten Stimmen nicht mehr gefunden.
Befehle
Alle Befehle sind Unterbefehle von /typewriter (Alias /tw). <definition> ist die ID oder der Name einer Vote Definition.
| Befehl | Berechtigung | Beschreibung |
|---|---|---|
/typewriter vote <definition> <option> [target] | typewriter.vote.cast | Für eine Option abstimmen. Optionen beginnen bei 1. Mit target für die ausgewählten Spieler abstimmen. |
/typewriter vote stats [definition] | typewriter.vote.stats | Zeigt die Stimmen pro Option und die Gesamtzahl, für eine Umfrage oder alle. |
/typewriter vote reset <definition> | typewriter.vote.reset | Löscht jede Stimme einer Umfrage. |
Alle benötigen zusätzlich typewriter.vote.
Anpassbare Texte
Kein im Spiel angezeigter Text ist im Code festgelegt. Die Nachrichten einer Abstimmung sind Felder ihrer Einträge: closedMessage der Vote Definition und die beiden Nachrichten von Vote Message. Was die /typewriter vote-Befehle antworten, ist ein TypeWriter-Snippet, du kannst es also umformulieren, übersetzen oder umfärben, ohne etwas neu zu bauen. Öffne plugins/Typewriter/snippets.yml, suche den Schlüssel unter content.vote, ändere den Wert und führe /tw reload aus. Die Erweiterung registriert beim Start alle ihre Snippets mit dem Standardtext, sie erscheinen also nach dem ersten Start in der Datei. Behältst du die Standardwerte, ändert sich nichts.
Die Befehlsantworten sind MiniMessage. Sie werden mit dem Typewriter-Antwortpräfix (Typewriter ») gesendet, das von der Engine stammt und nicht zu diesen Snippets gehört. Ein {name} in einem Text wird durch den in der Tabelle genannten Wert ersetzt; ein Platzhalter, den es nicht gibt, bleibt unverändert stehen, und ein Wert wird nie erneut nach Platzhaltern durchsucht. Das Log der Server-Konsole bleibt auf Englisch.
Snippet (unter content.vote.) | Standardwert | Platzhalter |
|---|---|---|
usage | <gray>Usage: /tw vote <definition> <option> [target]</gray> | keine |
option_unavailable | <red>Option {option} is not available for {definition}.</red> | {option} (die eingegebene Nummer), {definition} (die ID der Abstimmung) |
already_voted | <red>{player} cannot vote in {definition} yet.</red> | {player}, {definition} |
cast_option_fallback | option {number} | {number} (Position der Option, ab 1) |
recorded_for_voter | Your vote for <blue>{definition}</blue> has been recorded as <green>{option}</green>. | {definition}, {option} (der Text der Option) |
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. | keine |
stats_line | Stats for {name} [{definition}]: {options} | total: {total} | {name} (der displayName oder bei leerem Wert der Eintragsname), {definition}, {options}, {total} |
stats_option | {number}: {votes} ({label}) | {number}, {votes}, {label} (der Text der Option) |
stats_option_fallback | Option {number} | {number} |
stats_separator | , | keine |
entry_not_found | Could not find entry {entry} | {entry} (das Eingegebene) |
entry_rejected | Entry did not pass filter | keine |
stats_option wird einmal pro Option wiederholt, und die Ergebnisse werden mit stats_separator zu {options} von stats_line verbunden. stats_option_fallback ist das {label} einer Option ohne Text, und cast_option_fallback ist der Name einer solchen Option in den Nachrichten, die beim Erfassen einer Stimme gesendet werden. Die letzten beiden Snippets sind Befehlsfehler, die das Spiel in Rot anzeigt: Sie sind einfacher Text, ohne MiniMessage.
Ist die Umfrage geschlossen, zeigt /tw vote dem Teammitglied das closedMessage der Umfrage (cast_failed wird nur verwendet, wenn diese Nachricht leer ist). cast_failed antwortet auch bei fehlendem Daten-Eintrag oder einer Option außerhalb des Bereichs.
Berechtigungen
| Berechtigung | Gewährt |
|---|---|
typewriter.vote | Zugriff auf den Befehl /typewriter vote. |
typewriter.vote.cast | Eine Stimme per Befehl abgeben. |
typewriter.vote.stats | Ergebnisse per Befehl lesen. |
typewriter.vote.reset | Eine Umfrage zurücksetzen. |
Die Vote-Aktion prüft diese Berechtigungen nicht: Sie benötigt nur, dass der Entry ausgeführt wird.
Platzhalter
Ersetze <id> durch die Entry-ID der Vote Definition. Sie benötigen PlaceholderAPI.
| Platzhalter | Gibt zurück |
|---|---|
%typewriter_vote_display_<id>% | Den displayName der Umfrage. |
%typewriter_vote_option_<id>_<n>% | Den Text der Option Nummer n, ab 1. |
%typewriter_vote_total_<id>% | Die Gesamtzahl der Stimmen. |
%typewriter_vote_stats_<id>% | Die Stimmen jeder Option, durch Kommas getrennt. |
%typewriter_vote_stats_<id>_<n>% | Die Stimmen der Option Nummer n, ab 1. |
%typewriter_vote_player_<id>% | Den Text der Option, für die der Spieler gestimmt hat, oder nichts, wenn er nicht abgestimmt hat. |
%typewriter_vote_has_voted_<id>% | 1, wenn der Spieler vorerst nicht erneut abstimmen kann (er hat abgestimmt und die Wartezeit ist nicht vorbei), sonst 0. |
%typewriter_vote_closed_<id>% | 1, sobald das Enddatum überschritten ist, sonst 0. |
%typewriter_vote_remaining_<id>% | Ganze Sekunden bis zum Enddatum; 0 ohne Enddatum oder nach dessen Ablauf. |
vote_votes_<id> funktioniert wie vote_stats_<id>.
Entries
7 Einträge, aus dem Quellcode der Erweiterung generiert.
Aktionen2
- Vote ActionVote Action
- Vote MessageVote Message
Ereignisse1
- Vote Cast EventVote Cast Event
Fakten1
- Vote FactVote Fact
Artefakte1
- Vote DataVote Data
Manifeste2
- Vote ConfigVote System Configuration
- Vote DefinitionVote Definition
Vote Cast Event und Vote Fact existieren, aber nichts liest sie bisher aus: Das Event wird nie ausgelöst und der Fact wird nicht durch Stimmen befüllt. Vote Config wird gelesen: Es legt den Cooldown für erneutes Abstimmen und das Debug-Log fest.
Fehlerbehebung
Die Stimme wird nicht erfasst. Die Aktion und der Befehl schlagen stillschweigend fehl, wenn etwas fehlt: Die Vote Definition muss ein verknüpftes data-Artifact haben, die Option muss existieren, der Spieler darf noch nicht abgestimmt haben (oder sein Cooldown muss abgelaufen sein, siehe Vote Config), und die Umfrage darf ihr endDate nicht überschritten haben. Ist die Umfrage geschlossen, wird die closedMessage an den Spieler gesendet. Muss der Spieler noch warten, wird das blockedMessage gesendet. Aktiviere debug in Vote Config, um den Grund jeder Ablehnung zu protokollieren.
Die falsche Option erhält die Stimme. Die Vote-Aktion zählt Optionen ab 0, während der Befehl und die Platzhalter ab 1 zählen.
Die Umfrage schließt nie. endDate muss ein ISO-8601-Zeitpunkt in UTC sein, der auf Z endet, wie 2026-12-31T23:00:00Z. Ein Wert in einem anderen Format wird ignoriert, und die Umfrage bleibt offen.
Die Ergebnisse sind leer, nachdem ich den Entry umbenannt habe. Stimmen sind an die Entry-ID der Definition gebunden. Stelle die alte ID wieder her oder setze die Umfrage zurück und beginne von vorn.
Ein Platzhalter wird unverändert angezeigt. Prüfe, ob PlaceholderAPI installiert ist und ob die ID die Entry-ID der Definition ist. Die Erweiterung findet eine Definition auch dann, wenn ein Platzhalter vor der ersten Stimme angefragt wird.
Farben in einer Nachricht sehen falsch aus. Die Statusnachrichten von Vote Message, closedMessage und blockedMessage werden nach dem Auflösen der Platzhalter als MiniMessage gelesen: Schreibe <red>Text</red>, keine &c-Codes.
Spieler können zweimal abstimmen. Die Prüfung gilt pro Spieler und pro Umfrage. Mehrere Vote Definitions mit denselben Optionen erzeugen getrennte Umfragen.