Zum Hauptinhalt springen

MiniGame

Minigame-Framework: 26 Spielmodi, Arenen, Lobbymenüs, Parkour, Rekorde und Quest-Integration.

Privatv0.1.0Kampf & Mobs
BenötigtTypeWriter0.9.0-beta-177 (BTC build)GUIQuestRegionMiniPlaceholdersoptional

Für das BornToCraft-Netzwerk entwickelt. Diese Erweiterung ist zu Referenzzwecken dokumentiert und wird nicht verteilt.

Überblick​

MiniGame ist ein einziges Framework, das viele Arten von Minispielen aus TypeWriter-Entries heraus betreibt. Du beschreibst im Web-Panel eine Arena: den Spielmodus, die Lobby- und Spiel-Spawns, Spielerlimits, Teams, Kit, Runden und Nachrichten. Spieler treten dann über Action-Entries und Menüs bei. Die Erweiterung kümmert sich um die Lobby, die Bereitschaftsprüfung, den Countdown, das Spiel selbst, das Siegerpodest und das Aufräumen.

Jedes Spiel durchläuft dieselbe Phasenfolge: Lobby, Countdown, Playing, Ending, Cleanup. Jedes laufende Spiel besitzt einen Kontext, der seine Spieler, Teams, Punktestände und seinen Zustand speichert, sodass sich Runden, Teams und Scoreboards in jedem Modus gleich verhalten. Inventare werden vor dem Spiel gespeichert und danach wiederhergestellt. Spieleränderungen verwenden regionssicheres Scheduling, sodass die Erweiterung auf Paper und Folia läuft.

Ergebnisse werden in Artifacts gehalten (Siege, Punktestände, Bestzeiten, Ranglisten) und über Quest-Objectives, Facts, Trigger und Platzhalter dem Rest deines Servers zur Verfügung gestellt. Parkour, das früher eine eigene Erweiterung war, ist jetzt einer der Spielmodi. Diese Erweiterung ist zur Referenz dokumentiert und läuft auf dem BTC-Build von TypeWriter.

Funktionen​

  • 26 Spielmodi — PvP, Parkour und Bewegung, Survival, Strategie, Party- und Arcade-Modi, alle über das Feld gameType einer Arena gewählt.
  • Phasen-Engine — Lobby, Countdown, Playing, Ending und Cleanup, mit Bereitschaftsprüfung, Mindestspielerzahl, spätem Beitritt und Zuschauern.
  • Teams — NONE, SOLO, RED_BLUE oder eigene Teams mit eigenen Namen, im Lobby-Menü gewählt oder automatisch ausbalanciert.
  • Runden und Power-ups — optionale Runden, die Spieler zwischen den Runden wiederbeleben, und zeitgesteuerte Power-up-Drops für die regelbasierten Modi.
  • Parkour — Startpunkte, geordnete Checkpoints und Endpunkte mit Partikeln, Fehlschlag-Aktionen, Timern sowie persönlichen und Arena-Rekorden.
  • Eigene Arenen — zusätzliche Konfigurations-Entries für Parkour, Dé à Coudre und Bogenschießen.
  • Menüs — Spielbrowser, Arenaauswahl, Lobby, Teamauswahl, Statistik- und Ergebnismenüs.
  • Persistenz — Siege, Niederlagen, Punktestände, Bestzeiten und Top-Zeiten werden in Artifacts gespeichert, asynchron gesichert.
  • Quest-Integration — ein Abschluss-Objective und -Fact sowie Trigger für Spielstart, -ende, Beitritt, Ausscheiden, Rundenstart und Rekorde.
  • Scoreboard und Nachrichten — konfigurierbare Scoreboard-Zeilen sowie Nachrichten für Beitritt, Verlassen, Ausscheiden und Sieg mit Spiel-Platzhaltern.

Installation​

  1. Betreibe den BTC-Build von TypeWriter (BTC Core, Paper oder Folia).
  2. Installiere die Erweiterungen, von denen MiniGame abhängt: die BTC-Erweiterung GUI (alle Menüs verwenden sie), Quest und Region.
  3. Lege die MiniGame-JAR in plugins/Typewriter/extensions/ ab und starte den Server neu.
  4. Installiere MiniPlaceholders, wenn du die Platzhalter <minigame_...> außerhalb des Scoreboards möchtest. Sie werden über die BTC-MiniPlaceholders-Bridge veröffentlicht, nicht über PlaceholderAPI.
  5. Baue die Arenen in der Welt, erstelle eine Schutzregion, wo ein Entry eine verlangt (zum Beispiel das Becken einer Dé-à-Coudre-Arena), und konfiguriere dann die Entries im Web-Panel.

Erste Schritte​

Diese Anleitung richtet eine Spleef-Arena mit persistenten Statistiken ein.

  1. Öffne im TypeWriter-Web-Panel eine Manifest-Page und füge ein Wins statistics-Artifact hinzu. Gib ihm eine artifactId, zum Beispiel spleef_wins.
  2. Füge auf derselben Page einen Minigame Arena-Entry hinzu. Setze gameType auf SPLEEF, dann lobbySpawn, gameSpawn, spectatorSpawn und endTeleport mit dem Positionswähler.
  3. Setze minPlayers und maxPlayers, autoStartCountdown (Sekunden bis zum Spielstart) und maxGameDuration (Sekunden).
  4. Aktiviere useRounds und setze maxRounds, wenn du mehrere Runden möchtest (Spieler werden wiederbelebt und in jeder Runde bei gameSpawn neu platziert). Füge Items zu kitItems hinzu und lass giveKit aktiviert.
  5. Verknüpfe winStatArtifact mit dem Artifact aus Schritt 1.
  6. Öffne eine Sequence-Page. Füge eine Open the minigame browser-Aktion hinzu und löse sie über einen NPC-Dialog, ein Item oder einen Befehl aus. Oder verwende Join a minigame mit arena auf deine Arena gesetzt, um den Spieler direkt in die Lobby zu bringen.
  7. Veröffentliche, tritt der Arena bei, klicke im Lobby-Menü auf Ready und warte auf den Countdown. Wenn das Spiel endet, wird der Gewinner verkündet und die Statistik gespeichert.
Mit einem Spieler starten

Die Lobby zählt erst herunter, wenn mindestens minPlayers Spieler auf Ready geklickt haben. Setze minPlayers auf 1, solange du allein testest.

Funktionsweise​

  1. Lobby. Spieler warten bei lobbySpawn. Der Countdown beginnt nach einigen Sekunden, wenn die Zahl der als bereit markierten Spieler minPlayers erreicht. Später beitreten ist nach der Lobby nur möglich, wenn allowLateJoin aktiviert ist.
  2. Countdown. Dauert autoStartCountdown Sekunden mit Chatnachrichten. Verlassen Spieler den Server und die Zahl sinkt unter das Minimum, kehrt das Spiel in die Lobby zurück.
  3. Playing. Spieler werden zu gameSpawn teleportiert, ihr Inventar wird gespeichert, und das Kit wird vergeben. Die Phase endet spätestens nach maxGameDuration Sekunden. onGameStart wird ausgelöst.
  4. Ending. Der Gewinner und die drei Besten werden verkündet. Diese Phase dauert etwa ein Sechzigstel von maxGameDuration, begrenzt auf 5 bis 60 Sekunden.
  5. Cleanup. Inventare, Spielmodus und Leben werden wiederhergestellt, die Ergebnisse in die Artifacts geschrieben, onGameEnd wird ausgelöst, und die Spieler kehren zu endTeleport zurück.

Ausgeschiedene Spieler werden zu Zuschauern und zu spectatorSpawn bewegt, wenn allowSpectate aktiviert und ein Zuschauer-Spawn gesetzt ist.

Spielmodi​

Das Feld gameType der Arena akzeptiert die 26 Werte unten. Drei Modi haben eigenen Code. Die 23 anderen sind regelbasiert: Sie teilen sich eine Engine, die von einem Ausscheidungsmodus und einer Siegbedingung gesteuert wird. Ein regelbasierter Modus liefert dir die Regeln, die Lobby, Runden und die Punktewertung. Inhalte, die zum Namen des Spiels gehören (eine Flagge, Mob-Wellen, ein steigender Lavaboden, TNT-Blöcke, Dispenser), werden nicht generiert: Du baust sie in der Welt und verdrahtest sie mit Kits, Regionen und Triggern.

ModusKategorieStandard-SpielerAusscheidenSiegbedingung
SumoPvP / Kampf2-8HerunterfallenLetzter Überlebender
GladiatorPvP / Kampf2-12GetötetLetzter Überlebender, Power-ups alle 20 s
DuelsPvP / Kampf2GetötetLetzter Überlebender
KOTHPvP / Kampf2-16ZeitablaufZuerst Punkte erreichen, Power-ups
PaintballPvP / Kampf2-16GetötetMeiste Punkte
One in the ChamberPvP / Kampf2-12GetötetMeiste Punkte
ParkourParkour / Bewegung1Eigener CodeDen Endpunkt erreichen
Block PartyParkour / Bewegung2-16Boden verschwundenLetzter Überlebender, bis zu 5 Runden
TNT RunParkour / Bewegung2-16HerunterfallenLetzter Überlebender
Floor is LavaParkour / Bewegung2-16HerunterfallenLetzter Überlebender, bis zu 3 Runden
Falling BlocksPvE / Survival1-16Herunterfallen120 s überleben
Wave SurvivalPvE / Survival1-8Getötet180 s überleben, Power-ups
Zombie ApocalypsePvE / Survival1-8Getötet300 s überleben, Power-ups
Dodge the ArrowsPvE / Survival1-16GetötetLetzter Überlebender
Defend the CorePvE / Survival1-8GetötetLetztes überlebendes Team, 240 s
Capture the FlagStrategie4-16GetötetZuerst Punkte erreichen, 300 s
InfectionStrategie2-16MarkiertLetzter Überlebender
SpleefStrategie2-16Boden verschwundenLetzter Überlebender, bis zu 5 Runden
Sheep HuntStrategie4-16MarkiertMeiste Markierungen, 180 s
TPP (Tag)Party / Spaß2-16MarkiertLetzter Überlebender
Freeze TagParty / Spaß2-16MarkiertLetzter Überlebender
Hot PotatoParty / Spaß2-16ZeitablaufLetzter Überlebender, 60 s
Dé à CoudreParty / Spaß2-16Eigener CodeLetzter Spieler oder letztes Team am Leben
Musical ChairsParty / Spaß2-16ZeitablaufLetzter Überlebender, bis zu 10 Runden
ArcheryReflex / Arcade1-16Eigener CodeZuerst die Zielanzahl erreichen oder beste Punktzahl im Zeitlimit
QuakeReflex / Arcade2-16GetötetMeiste Punkte

Das Standardminimum wird nur verwendet, wenn minPlayers der Arena nicht über null liegt. Das Maximum stammt immer aus maxPlayers der Arena.

Wie die regelbasierten Modi entscheiden​

  • Getötet: Ein einziger Treffer eines anderen Spielers scheidet das Opfer aus, egal wie hoch der Schaden ist, und gibt dem Angreifer einen Punkt. Schützen mit Projektilen zählen.
  • Markiert: Ein einziger Treffer eines anderen Spielers scheidet das Opfer aus und gibt dem Fänger einen Punkt. Teamkameraden sind geschützt, wenn Friendly Fire aus ist.
  • Herunterfallen: Ein Spieler scheidet aus, wenn er zehn Blöcke unter gameSpawn fällt.
  • Boden verschwunden: Ein Spieler scheidet aus, wenn der Block unter ihm Luft ist.
  • Zeitablauf: Kein Timer scheidet von sich aus einen Spieler aus. Runden mit einer Dauer enden einfach, wenn die Zeit abgelaufen ist, und die Punktestände oder Überlebenden entscheiden über den Gewinner.
  • Power-ups: Ist powerUpEnabled aktiviert, fällt alle powerUpInterval Sekunden (mindestens 5) ein zufälliges Power-up-Item. Die acht Typen sind Speed, Jump, Invisibility, Heal, Shield, Explosive Snowball, Double Jump und Super Strength.
  • Runden: Mit aktiviertem useRounds werden ausgeschiedene Spieler wiederbelebt und alle für jede Runde bei gameSpawn neu platziert, bis zu maxRounds. Die Erweiterung baut zwischen den Runden keine Blöcke wieder auf: Stelle einen zerstörten Boden selbst wieder her. onRoundStart wird in jeder Runde ausgelöst.

Parkour​

Parkour ist ein Einzelspieler-Modus mit eigenem Konfigurations-Entry. Eine Parkour Arena verweist auf eine Minigame Arena vom Typ PARKOUR und listet ihre Startpunkte, Checkpoints und Endpunkte auf. Ein Spieler startet den Lauf, indem er auf einem Startpunkt steht, muss die Checkpoints in aufsteigender order passieren und erreicht dann einen Endpunkt.

  • failAction legt fest, was ein Fehlschlag bewirkt: START teleportiert zurück zum Start, LAST_CHECKPOINT zum letzten Checkpoint, QUIT bricht den Lauf ab.
  • timerType ist NONE, GLOBAL (eine feste time in Sekunden) oder CHECKPOINT (time plus checkpointBonus Sekunden bei jedem Checkpoint). Das Ablaufen der Zeit ist ein Fehlschlag.
  • Ein Lauf schlägt außerdem fehl, wenn der Spieler die Welt wechselt, mehr als 5 Blöcke unter den Start fällt oder mehr als 10 Blöcke vom letzten Checkpoint entfernt ist.
  • Beim Abschluss wird die Zeit für Rekorde eingereicht: persönliche Bestzeit, Arena-Rangliste und die Trigger onPersonalBest und onWorldRecord an der Arena. Die Arena endet dann, weil niemand mehr läuft.

Dé à Coudre​

Eine Dé à Coudre Arena fügt eine Beckenregion, einen Sprungort und einen Spawn hinzu. mode ist SINGLE (Spieler springen nacheinander), CONCURRENT (alle springen gleichzeitig) oder TEAM. Spieler starten ohne Ersatzleben: Ein verfehlter Sprung scheidet den Spieler aus, und ein perfekter Sprung (Landung zwischen vier bereits benutzten Blöcken) bringt ein Leben ein. Die Platzhalter lives, turn und queue zeigen den Zustand.

Archery​

Eine Archery Arena listet Zielpositionen und Schießzonen auf. mode ist MAX_TARGET (zuerst targetsToWin Treffer) oder TIME_ATTACK (beste Punktzahl innerhalb von timeLimitSeconds). Die Erweiterung platziert den targetBlock, ersetzt ihn bei einem Treffer durch hitBlock und gibt bowItem und arrowItem.

Menüs​

Die Menüs sind Truhenmenüs mit 54 Slots, die von der GUI-Erweiterung gerendert werden. Sie bleiben leer, bis du einen Action-Entry hinzufügst, der sie öffnet.

MenüGeöffnet durchInhalt
SpielbrowserOpen the minigame browserEine Reihe der sechs Kategorien, dann die Spiele der gewählten Kategorie. Ein Spiel ist nur verfügbar, wenn eine Arena dieses Typs existiert.
ArenaauswahlOpen arena selection oder ein Klick im BrowserDie Arenen eines Spieltyps mit ihrem Status (frei, wartend, voll, im Spiel) und Spielerzahlen. Ein Klick tritt bei.
LobbyOpen the lobby menu oder automatisch nach dem Beitritt über die MenüsDie Arena-Beschreibung, Spielerliste mit Bereitschaftsstatus und Team, die Buttons Ready, Team, Start the game und Leave sowie deine eigenen Buttons.
TeamauswahlDer Button TeamEin Team wählen oder zufällig eines zugewiesen bekommen.
StatistikOpen statisticsSiege, Niederlagen, gespielte Spiele und eine Top 10, pro Arena oder arenaübergreifend. Benötigt winStatArtifact an den Arenen.
ErgebnisseOpen the results screenGewinner, Dauer, Spielerzahl und Siegerpodest. Verdrahte die Aktion mit dem Trigger onGameEnd der Arena.

Der Button Start the game wird nur Spielern mit der Berechtigung minigame.start angezeigt. Ein Lobby Menu-Entry passt den Titel an, blendet Teile des Menüs aus und fügt Buttons mit einem slot von 0 bis 53 und einer showCondition hinzu.

Persistenz und Rekorde​

Artifacts werden beim Start geladen und asynchron geschrieben, sodass das Speichern nie einen Spiel-Tick blockiert. Gespeicherte Daten werden pro Arena und pro Spieler geführt.

  • Wins statistics speichert Siege, Niederlagen und gespielte Spiele, beim Cleanup für jeden Spieler des Spiels gesichert.
  • Scores statistics addiert beim Cleanup den Punktestand jedes Spielers, wenn er über null liegt.
  • Minigame state wird beim Cleanup mit der letzten Phase, der Spielerzahl und dem Gewinner geschrieben.
  • Best time und Top times speichern persönliche Bestzeiten und die Rangliste; topTimesLimit legt fest, wie viele Zeiten behalten werden. Derzeit erzeugt nur Parkour Zeiten.

Reset records löscht die Rekorde einer Arena für den auslösenden Spieler (PLAYER) oder für alle (ARENA).

Quest-Integration​

Das Objective Complete minigames zählt abgeschlossene Zeitläufe. Lass arena leer, um jede Arena zu zählen, oder setze es, um eine zu zählen. Es speichert seinen Fortschritt in einem von dir bereitgestellten Fact und kann onComplete auslösen. Der Fact Minigame completions zählt Abschlüsse getrennt für jede Arena, in der sich der Spieler befindet, sodass ein Fact ein ganzes Netzwerk aus Arenen bedienen kann. Beide reagieren derzeit nur auf Parkour-Abschlüsse.

Berechtigungen​

BerechtigungGewährt
minigame.startZeigt den Button Start the game im Lobby-Menü an und erlaubt ihn.

Es gibt keine Befehle: Alles wird über Entries und Menüs gesteuert.

Platzhalter​

Spiel-Platzhalter gibt es in zwei Formen. In Nachrichten und Scoreboard-Zeilen einer Arena kannst du %name%-Tokens verwenden. Anderswo auf dem Server veröffentlicht die BTC-MiniPlaceholders-Bridge dieselben Werte als <minigame_name> für einen Spieler, der in einem Spiel ist.

PlatzhalterGibt zurück
arena und arena_idDen Arena-Namen und die Entry-ID.
game_idDie ID des laufenden Spiels.
phaseDen Namen der aktuellen Phase.
players und aliveSpieler im Spiel und noch lebende Spieler.
max_playersDas Spielerlimit der Arena.
winnerDen Namen des Gewinners oder „Personne“, solange es keinen gibt.
scoreDie Punktzahl des Spielers.
alive_statusalive oder eliminated.
rankDen Rang des Spielers nach Punktzahl oder -.
lives, turn und queueLeben, aktueller Springer und Sprungreihenfolge, nur für Dé à Coudre. In anderen Modi -.
%player% (nur Nachrichten)Den Spielernamen, in Nachrichten zu Beitritt, Verlassen und Ausscheiden.

Entries​

24 Einträge, aus dem Quellcode der Erweiterung generiert.

Aktionen9
Ziele1
Fakten1
Artefakte5
Manifeste5
Definitionen3

Fehlerbehebung​

Menüs bewirken nichts oder sind leer. Die Menüs benötigen die GUI-Erweiterung und einen Action-Entry, der sie öffnet. Prüfe, ob eine Arena mit dem richtigen gameType existiert: Der Browser markiert einen Spieltyp als nicht verfügbar, wenn keine Arena ihn verwendet.

Das Spiel bleibt ewig in der Lobby. Der Countdown beginnt erst, wenn mindestens minPlayers Spieler auf Ready geklickt haben, nicht schon, wenn sie anwesend sind. Senke minPlayers oder verwende Force start a minigame, um den Countdown zu starten.

„Vous êtes déjà dans une partie“. Ein Spieler kann sich nur in einem Spiel befinden. Verwende zuerst Leave a minigame. Das Verlassen, Trennen und Beenden eines Spiels gibt den Spieler jeweils frei.

In KILL- oder TAG-Modi scheidet nie jemand aus. Teste im Überlebensmodus mit einem Spieler, der Schaden nehmen kann: Im Kreativmodus sind Spieler unverwundbar. Ausscheidungen in diesen Modi entstehen durch Schaden eines anderen Spielers, einschließlich Pfeilen und Schneebällen.

Statistiken, Kills oder das State-Artifact bleiben leer. Eine Arena schreibt nur in die Artifacts, auf die sie verweist: Setze winStatArtifact, scoreArtifact und stateArtifact und gib jedem Artifact eine artifactId. Kills und Tode werden vom aktuellen Code nicht erfasst und zeigen 0. Bestzeiten und Top-Zeiten werden nur von Parkour geschrieben.

Ein Parkour-Lauf schlägt ständig fehl. Jeder Checkpoint muss innerhalb von 10 Blöcken vom vorherigen liegen, und der Lauf schlägt 5 Blöcke unter dem Startpunkt fehl. Checkpoints müssen in aufsteigender order erreicht werden, und der Endpunkt zählt erst nach dem letzten Checkpoint. Bei radius auf 0 muss der Spieler genau auf dem Block stehen.

Ein Spieler kann den Lobby-Bereich nicht verlassen. Während des Wartens (Phasen Lobby und Countdown) hindert lobbyRadius (Standard 10 Blöcke um lobbySpawn) die Spieler daran, sich zu entfernen; es teleportiert nicht, und ein Spieler, der bereits außerhalb steht, darf immer zurückgehen. Setze 0 für keine Begrenzung.

Ein Spieler wird ohne erkennbaren Grund eliminiert. region ist die Spielzone der regelbasierten Modi: Verlässt ein Spieler sie während einer Partie, wird er eliminiert (die Region wird in Archery, Parkour und Dé à Coudre, die eigene Phasen haben, nicht erzwungen). In den Modi, in denen der Boden verschwindet (Spleef, Block Party), listet floorMaterial die Bukkit-Materialnamen auf, die als Boden zählen, durch Kommas getrennt: Ein Spieler wird eliminiert, sobald der Block unter seinen Füßen keiner davon ist. Leer bedeutet, dass jeder Block außer Luft ein Boden ist; unbekannte Namen werden ignoriert und mit einer Warnung in der Konsole gemeldet. Böden werden nicht aus floorMaterial generiert; du baust sie selbst.

Die Siegesnachricht ist nicht die erwartete. winMessage wird am Ende der Partie angekündigt, wobei %winner% durch den Gewinner ersetzt wird.

Ein Spieler kann der Arena nicht beitreten. Wenn jede offene Lobby einer Arena maxPlayers Spieler enthält, ist die Arena voll und der Beitritt wird abgelehnt: Es wird keine zweite Partie parallel geöffnet. Die Aktion Join a minigame sendet dann ihre fullMessage.

Verwandte Erweiterungen​