Die Oberfläche

Jede Anzeige, die der Server für dich schreibt: Seitenleiste, Aktionsleiste, Namensschilder, fünf Chatkanäle, Profilkarte, GUIs und das Update-Buch.

Die Seitenleiste

Die Seitenleiste rechts auf deinem Bildschirm ist kein gemeinsames Board. Jeder Spieler bekommt sein eigenes, privates Scoreboard, damit die Zahlen darauf deine sein können und nicht die des Servers. Sie trägt zehn eigenständige Zeilen; sechs davon sind Live-Werte, der Rest sind Beschriftungen und Abstandshalter.

ZeileWas sie anzeigt
WalletDie Münzen, die du tatsächlich bei dir trägst.
BankDie Summe deiner Bankkonten. Sparguthaben zählt nicht mit, dieselbe Grundlage, nach der auch /baltop sortiert.
FactionDeine aktuelle Fraktion, oder nichts, wenn du keine hast.
VotesDeine Anzahl an Votes.
OnlineWie viele Spieler gerade auf dem Server sind.
TPSDie Tickrate des Servers, die das Plugin selbst mitschreibt.

Ein Durchlauf läuft alle 40 Ticks, also alle 2 Sekunden. Er zeichnet dein Board dabei nicht jedes Mal neu: Er baut eine kleine Momentaufnahme aus Fraktion, Wallet, Bank, TPS-Stufe, Spielerzahl und Votes, vergleicht sie mit der vorherigen und überspringt dich vollständig, wenn sich nichts verändert hat. TPS wird in Stufen geführt und nicht auf die Nachkommastelle gelesen, damit kleine Schwankungen das Board nicht dauernd neu schreiben.

Eine Folge davon solltest du kennen. Die Textzeile Faction hängt am 2-Sekunden-Durchlauf, das [TAG] über deinem Kopf dagegen nicht: Fraktionsänderungen werden sofort an jeden Betrachter geschickt. Wenn du einer Fraktion beitrittst und das Tag früher erscheint als die Zeile in der Seitenleiste, ist das so gewollt.

Wenn du eine Zahl sofort brauchst und nicht erst beim nächsten Durchlauf: /money zeigt Wallet, Hauptkonto und alle Konten, /tps die verfolgte Tickrate und /ping deine Latenz. Alle drei wirken unmittelbar.

Die Aktionsleiste

Die Zeile über deiner Hotbar wird von einem einzigen Bus versorgt. Nichts anderes im Plugin darf dorthin schreiben; eine Bauprüfung lässt den Build scheitern, wenn ein Feature die rohe Sendemethode direkt aufruft.

Entscheidend ist: Ein Beitrag trägt eine Zahl und eine Beschriftung, keinen fertigen Text. Formatiert wird erst beim Ausspielen. Genau das macht das Zusammenfassen möglich: Tötest du zwölf Mobs in einem Tick, bekommst du eine Zeile mit der Summe und nicht zwölf Abschnitte, die nebeneinander Hunter +12c lesen.

ZusammenführungWirkung
SUMBeiträge mit derselben Beschriftung werden zu einer Zeile mit der Summe.
MAXDer höchste Wert gewinnt.
REPLACEDer neueste Beitrag gewinnt.
RIDERGeld ohne eigene Beschriftung wird in die beschriftete Geldzeile mit der höchsten Priorität eingefaltet. Niemals in eine Firmenzeile, damit Buff-Geld nicht in der Abrechnung eines Unternehmens landet.

Frames werden nach Kanal und Quelle geschlüsselt; ein Feature, das unter einer ID sowohl eine Geldmeldung als auch eine Statusanzeige einreicht, hält beide getrennt. Die vier Kanäle sind MONEY, PROGRESS, STATUS und WARNING. Skill-XP kommt als STATUS-Beitrag über denselben Bus, statt einen eigenen Timer zu starten.

Die Zahl auf der Leiste ist die Zahl, die geflossen ist

Ein Geldbeitrag trägt das Auszahlungsergebnis mit sich und liest den gutgeschriebenen Betrag daraus ab. Du siehst also, was nach Fraktionssteuer und nach einem aktiven Booster bei dir angekommen ist, nicht das, was das Feature angefordert hat. Der Steuersatz daneben ist der gedeckelte Satz, mit dem tatsächlich abgerechnet wurde, nicht der roh gespeicherte Wert.

Bist du bei einem Unternehmen eingestempelt, gehen die Münzen an die Firma statt in dein Wallet. Die Leiste sagt das deutlich und nennt die Firma, und weil in deinem Wallet nichts besteuert wurde, wird auch keine Steuerzeile erfunden.

Eine Aktionsleiste verblasst nach etwa drei Sekunden, ein unveränderter Frame muss also trotzdem erneut gesendet werden. Der Flusher läuft jeden Tick, sendet einen unveränderten Frame aber nur alle 40 Ticks erneut, also einmal alle 2 Sekunden. Eine Sitzung mit zwanzigtausend Kills kostet damit eine Sendung alle zwei Sekunden, solange sie dauert, und nicht zwanzigtausend Sendungen.

Namensschilder und das Team-Modell

Der Name über deinem Kopf ist ein Scoreboard-Team. Das Modell ist bewusst ungewöhnlich: ein Team pro Spieler, pro Board. Niemand teilt sich ein Team mit jemand anderem. Die Team-ID ist bl_ plus die ersten zwölf Hexadezimalzeichen deiner UUID, insgesamt fünfzehn Zeichen, also stabil, eindeutig und umbenennungsfest.

Teil des TagsWas darin steht
PräfixDie Vanish-Markierung [V], wenn ein Teammitglied unsichtbar ist, danach dein gekaufter Titel.
SuffixDein Fraktions-[TAG].
FarbeZuerst die Beziehungsfarbe, dann deine gekaufte Namensfarbe, dann die Fraktionsfarbe, dann Weiß.
SchalterFriendly Fire, Kollisionsregel und Sichtbarkeit des Namensschilds.

Weil jedes Attribut ein Feld auf deinem eigenen Team ist und kein separates Team, kann dich nichts aus irgendetwas verdrängen. Die Beziehungsfarbe wird pro Betrachter bei jeder Auflösung neu berechnet, eine Bündnis- oder Kriegsfarbe kann also nicht veralten: Endet die Beziehung, ist die Farbe sofort weg, für alle, ohne Neuaufbau.

Gründen, Beitreten, Verlassen, Kicken, Übergeben, Auflösen, Beziehungswechsel und eine gekaufte Farbe wirken sofort, für dich und für jeden Umstehenden. Beförderungen und Degradierungen aktualisieren das Tag nicht, denn das Tag kodiert Titel, gekaufte Farbe und Fraktionssuffix, niemals den Rang. Den Rang liest du mit /f info.

Was ein Team pro Spieler kostet

Mehrere Vanilla-Verhalten sind zwischen Mitgliedern desselben Teams definiert und können in einem Modell, in dem sich keine zwei Spieler ein Team teilen, nicht bestehen. Das steht hier offen, statt später entdeckt zu werden.

  • Friendly Fire setzt das Plugin selbst um, gegen dieselbe Fraktionseinstellung, es geht also nichts verloren. Ein Unterschied: Vanilla verweigerte den Treffer, bevor überhaupt ein Event feuerte, das Plugin bricht ein Event ab, das die Kampfmarkierung schon gesehen hat. Ein Schlag gegen ein Fraktionsmitglied bei ausgeschaltetem Friendly Fire setzt dich also in den Kampfzustand.
  • canSeeFriendlyInvisibles hat keine Wirkung über Spieler hinweg mehr. Der Schalter wird weiterhin geschrieben, ohne gemeinsames Team kann er aber nichts bewirken.
  • Die Kollisionsregeln FOR_OWN_TEAM und FOR_OTHER_TEAMS laufen ins Leere. ALWAYS (die Voreinstellung) und NEVER sind nicht betroffen.
  • Die Gruppierung in der Tab-Liste entfällt. Der Client sortiert die Tab-Liste nach Teamnamen, Fraktionsmitglieder stehen daher nicht mehr beieinander. Das gilt für jedes Modell mit einem Team pro Spieler.

Deine gekaufte Namensfarbe kostet 25.000 Münzen und gilt im Chat, über deinem Kopf und in der Tab-Liste, mit oder ohne Fraktion. Auf Bedrock ist der Scoreboard-Eintrag immer dein roher Name samt Floodgate-Präfix ., weil der Client genau diese Form abgleicht.

Chatkanäle und private Nachrichten

Es gibt fünf Chatkanäle plus private Nachrichten. Die Kanalbefehle sind Schalter: Sie wirken in dem Moment, in dem du sie eingibst, ohne Rückfrage, und alles Weitere geht in diesen Kanal, bis du erneut wechselst.

KanalBefehlWer es hörtVoraussetzung
Global/gcAlle Online-Spielerkeine
Lokal/lcSpieler in deiner Nähekeine, aber auf Reichweite begrenzt
Fraktion/fcDeine Fraktiondu brauchst eine Fraktion
Verbündete/facDeine Fraktion und ihre Verbündetendu brauchst eine Fraktion
Team/scDas ServerteamHelper-Berechtigung
Privat/msg, /tell, /wEin genannter Spielerbraucht Name und Nachricht
Antwort/r, /replyDer zuletzt angeschriebene Spielerkeine Tab-Vervollständigung, also ausschreiben

Der globale Chat wird als [G] <tag> <Name> > <message> ausgegeben. Dein gekauftes Chat-Tag steht vor deinem Namen, deine gekaufte Namensfarbe umschließt den Namen selbst. Deine Farbe im Chat ist damit immer deine eigene und nie die eines anderen.

Angeboten werden sieben Chat-Tags und sieben Namensfarben. Beide Listen wurden von acht gekürzt, damit eine Reihe von sieben in einer neun Felder breiten Inventarzeile sauber zentriert; die Tags liegen auf den Feldern 10 bis 16, die Farben auf 28 bis 34. Wenn du das entfernte Tag ghost oder die entfernte Farbe blue bereits besitzt, bleibt sie bei dir aktiv, sie wird nur nicht mehr zur Neuauswahl angeboten.

Filter und Sperren

  • Für alle gilt eine Chat-Abklingzeit.
  • Stummschaltungen und der Wartungsmodus sperren den Chat und die chatnahen Befehle, eine Stummschaltung lässt sich also nicht durch einen Kanalwechsel umgehen.
  • Der Schimpfwortfilter läuft im Chat. Er läuft außerdem über deine eigene Todesnachricht: Der Text wird geprüft, bevor abgebucht wird, er muss den wörtlichen Platzhalter {player} enthalten und er muss sauber sein. Schlägt das fehl, bleibst du im Einrichtungsmodus und kannst neu tippen, ohne erneut zu zahlen.

Jede Nachricht, die du bekommst, läuft durch einen einzigen Trichter. Auf Java erhältst du die vollständige interaktive Komponente, ein Befehl in einer Nachricht ist also anklickbar. Auf Bedrock werden Klick- und Hover-Anteile entfernt, und der sichtbare Text eines Befehls ist immer der Befehl selbst: /faction accept statt einer Schaltfläche mit der Aufschrift [Accept]. Das ist Absicht, denn eine Beschriftung mit dahinter verstecktem Befehl ließe einen Bedrock-Spieler mit einem Wort zurück, das er nicht benutzen kann.

Die Profilkarte

/profile öffnet eine Karte mit 54 Feldern, die zusammenfasst, was sonst auf mehrere Befehle verteilt ist. Das Serverteam kann sie auch für andere Spieler öffnen, und das prägt eine ihrer Entwurfsentscheidungen.

Deine drei Berufsplätze liegen auf den Feldern 29, 31 und 33. Jeder Platz zeigt das Berufssymbol, den richtigen Anzeigenamen und eine Zeile Next: <Rang> (<XP> XP), gemessen an der Rangleiter.

RangXP-Schwelle
Apprentice0
Journeyman5.000
Expert20.000
Master60.000
Legend150.000

Der dritte Platz zeigt einen roten Sperrplatzhalter, bis du den dritten Berufsplatz im /shop für 150.000 Münzen kaufst. Danach ist er überall ein echter Platz: XP-Vergabe, Berufswechsel, Meisterschaft und Fähigkeitsauslöser berücksichtigen ihn.

Die Karte trägt außerdem deine Buff-Summen und eine nur lesbare Karte für den Mob-Drop-Modus, die den aktiven Modus und dessen Regel zeigt. Diese Karte ist bewusst nicht anklickbar. Weil das Team /profile bei anderen Spielern öffnet, würde ein Klick dort stillschweigend den eigenen Modus aus einem fremden Profil heraus ändern, und genau solche Überraschungen räumt dieses Plugin systematisch aus. Ändern kannst du ihn mit /mobdrops.

Die Klickzuordnung läuft über einen Inventar-Holder und nicht über den Fenstertitel, deshalb verhält sich der Bildschirm auf Bedrock genauso. Die Barriere auf Feld 53 schließt ihn.

Wie sich die GUIs verhalten

Fast jeder Bildschirm im Plugin folgt einer Formsprache: 54 Felder, eine Glaskopfzeile über die Felder 0 bis 8 mit der Titelkarte auf Feld 4, Inhalt nur in den Spalten 1 bis 7, eine Navigationszeile auf den Feldern 45 bis 53, und die Randfüllung zuletzt gemalt.

Inhaltsfelder werden nach Formel zentriert, und es gibt zwei Formeln, weil sich eine gerade und eine ungerade Anzahl nicht gleich zentrieren lassen.

Einträge in einer ReiheBelegte Felder
14
23, 5
33, 4, 5
42, 3, 5, 6
52, 3, 4, 5, 6
61, 2, 3, 5, 6, 7
71 bis 7

Spalte 4 ist nur bei ungerader Anzahl belegt. Vier Reihen zu sieben ergeben ein Inhaltsraster aus 28 Zellen, deshalb zeigen seitenweise Bildschirme wie /baltop oder das Marktbrett 28 Einträge pro Seite mit Pfeilen in der Navigationszeile.

Die Klickregeln

Jede dieser Regeln war in dieser Codebasis schon einmal ein ausgelieferter Fehler.

  • Klicks werden zuerst abgebrochen, noch vor jeder Weiterleitung.
  • DOUBLE_CLICK wird ignoriert, denn ein Doppelklick ist genau die Geste, mit der man einen Stapel von einem Bildschirm einsammelt.
  • Nur Klicks im oberen Inventar wirken. Ein Klick in dein eigenes Inventar wird abgebrochen und verworfen.
  • Navigation und Seitenwechsel werden vor jeder Rasterrechnung aufgelöst, ein Seitenwechsel kann also nie als Klick auf den Gegenstand gelesen werden, der danach dort liegt.
  • Die Identität kommt aus einer Markierung am Gegenstand oder aus einer geteilten gefilterten Liste, nie aus einem Index in eine lebende Liste.
  • Dein Zustand wird bei jedem Klick neu aufgelöst und nicht seit dem Öffnen für gültig gehalten.
  • Kein Bildschirm nimmt oder gibt Gegenstände, außer den wenigen, die wirklich ein Eingabefeld brauchen. Diese halten genau ein beschreibbares Feld, brechen alles andere ab und geben den Gegenstand bei jedem Schließen zurück, auch bei einem Verbindungsabbruch.
  • Ein anderer Bildschirm ersetzt das Fenster, statt es vorher zu schließen.
  • Jeder Klick gibt eine Rückmeldung, denn ein stiller Erfolg wirkt wie eine tote Schaltfläche.
  • Ziehbewegungen, die ein Feld im oberen Inventar berühren, werden abgebrochen. Ein Ziehen verteilt einen Stapel in einem einzigen Event über mehrere Felder und ist kein Klick, das Abbrechen von Klicks hilft dagegen also nicht.

Zahlen auf Karten werden live aus dem Dienst gelesen, der sie durchsetzt, statt fest eingetragen zu sein. Eine Hilfeseite kann also nicht von dem Preis abweichen, den sie nennt. Wo ein Wert wirklich nicht gemessen ist, sagt die Karte das, statt eine Null zu zeigen.

Bedrock: Tippen, Formulare und Rückfallebenen

Bedrock-Spieler erreichen den Server über Geyser und Floodgate, und die Oberfläche ist so gebaut, dass kein Bedienelement nur auf Java funktioniert.

Linksklick steuert alles. Neuere Bildschirme sind grundsätzlich reine Linksklick-Bildschirme: Beträge als Voreinstellungsknöpfe, Plus- und Minus-Schrittknöpfe, Umschalter und Bestätigungen. In den Bildschirmen für Banken, Fraktionssteuer, Kopfgeld, Unternehmen und NPCs gibt es weder Amboss-Umbenennung noch Schildeingabe. Wo wirklich ein freier Text nötig ist, etwa ein Firmenname, ein Zahlungsempfänger oder ein Steuerausdruck, gibt dir der Bildschirm einen tippbaren Befehl statt eines Textfelds.

Gesten gelten als unzuverlässig. Geyser sendet für ein Tippen den Klicktyp UNKNOWN, deshalb akzeptieren Bildschirme, die auf Java Shift-Klick als Geste nutzen, auf Bedrock jeden Klick für dieselbe Aktion. Seitenwechsel akzeptieren auf beiden Plattformen bewusst einen einfachen Linksklick, denn Shift für einen Seitenwechsel zu verlangen würde mit Shift als Auswahlgeste auf Java kollidieren.

Formulare gegen Kistenbildschirme

Manche Oberflächen haben ein echtes Bedrock-Formular. Ein Formular ist eine Liste von Schaltflächen, daraus folgen drei Dinge:

  • Bedrock kennt kein Hover, deshalb wird die gesamte Beschreibung einer Zeile in ihre Schaltflächenbeschriftung eingefaltet. Dort stehen Kosten und die Aussage, ob du es dir leisten kannst; ohne sie würde ein Bedrock-Spieler bei einem teuren Kauf blind tippen. Die Einfaltung ist auf 1600 Zeichen begrenzt.
  • Schaltflächen im Formular sind positionsgebunden, deshalb bekommt auch eine nicht anklickbare Zeile eine Schaltfläche. Ließe man eine weg, verschöbe sich jeder spätere Index und jeder Klick darunter liefe still ins Falsche.
  • Lässt sich ein Formular nicht senden, fällt der Bildschirm auf die Kistendarstellung zurück, statt dich ganz ohne Oberfläche zu lassen.

Ein Formular kann keinen Gegenstand annehmen, deshalb ist jeder Bildschirm mit Eingabefeld notwendigerweise eine echte Kisten-GUI: Verzauberungsstation, Werkbank und ähnliche Bildschirme werden von Geyser als Kisten dargestellt und lassen sich so vollständig bedienen. Für jeden davon gibt es zusätzlich einen tippbaren Befehlsweg.

Zwei bekannte Lücken, offen genannt statt versteckt. Die Bildschirme von /updates haben keine Formulardarstellung, auf Bedrock bekommst du also die von Geyser übersetzte Kiste; unerreichbar ist dadurch nichts, denn die Zustellung nutzt den Formularweg und /updates hat eine vollständige Chat-Rückfallebene. Und die Formulardarstellung der Writs schreibt "Seite 1 von 3" in den Text, ohne Seitenschaltflächen auszugeben, ein Bedrock-Spieler kommt dort also nicht auf Seite 2.

Das Update-Buch

Jede Veröffentlichung schreibt einen Eintrag in ein Änderungsprotokoll im Spiel. Bei Plugin-Version 1.28.8 sind es 62 Einträge, die IDs 0 bis 61, beginnend mit einem Willkommenseintrag bis zur neuesten Version. IDs werden nie neu vergeben, denn dein Lesestand zeigt in genau diesen Raum.

Wie ein Eintrag zu dir kommt

Betrittst du den Server mit ungelesenen Einträgen, passiert dreierlei in fester Reihenfolge:

  1. Zuerst geht eine Chatzeile heraus, deren sichtbarer Text /updates ist. Das ist Absicht: Sollte das Buch oder das Formular aus irgendeinem Grund nicht erscheinen, geht die Benachrichtigung selbst trotzdem nie verloren.
  2. Auf Java bekommst du ein vorübergehendes geschriebenes Buch in die Hand.
  3. Auf Bedrock bekommst du stattdessen ein Formular.

Dein Lesestand ist eine Höchstmarke: die höchste ID, die du gesehen hast. Sie wird nie gegen ein Maximum geprüft. Wird der Server je auf einen älteren Stand zurückgesetzt, existieren Einträge oberhalb deiner Marke schlicht noch nicht, und dir wird nichts gezeigt, statt dass du Gelesenes erneut bekommst.

Später nachlesen

/updates öffnet die Liste jederzeit. Es ist ein Standardbildschirm mit 54 Feldern: Zurück auf Feld 45, vorherige Seite auf 47, Schließen auf 49 und nächste Seite auf 53. Die Einträge sind für Spieler geschrieben und nicht für Betreiber, nennen ihre Befehle vollständig, damit der Text abtippbar ist, und tragen überall dort einen Bedrock-Hinweis, wo sich die beiden Plattformen unterscheiden.

Das Update-Buch ist ein Änderungsprotokoll, keine Einführung. Wenn du Schritt für Schritt durch das Schmiedesystem geführt werden willst, ist das /forge tutorial mit 10 Pfaden und 19 Schritten.

Was sonst noch auf deinen Bildschirm schreibt

Ein paar Oberflächen liegen außerhalb der vier großen. Sie sind kurz, aber es sind die, nach denen gefragt wird.

OberflächeWorum es geht
ServerlisteEin Paketlauscher schreibt die Nachricht des Tages und den Spieler-Hover um, bevor du überhaupt verbindest. Im Wartungsmodus erscheint eine Wartungsnachricht, damit du siehst, dass der Server geschlossen ist, statt es aus einem fehlgeschlagenen Login zu erraten. Deshalb ist ProtocolLib die eine harte Abhängigkeit.
Spawn-BildschirmEin zurückkehrender Spieler wird zum Spawn-Bildschirm gebracht und bekommt einen Countdown zurück an den Ausloggpunkt, abbrechbar mit /tpc. Der Countdown läuft nur, wenn tatsächlich ein Rückkehrort gespeichert war; ein echter erster Beitritt bleibt einfach am Spawn, ohne dass es etwas abzubrechen gäbe.
Rotierende AnsagenEine wiederkehrende Aufgabe schreibt Servermitteilungen in festgelegtem Abstand in den Chat.
BossleistenWerden dort genutzt, wo etwas herunterzählt. Stempelst du bei einem Unternehmen ein, bekommst du eine mit laufender Ansammlung und der echten Restzeit bis zur Lohnabrechnung. Bossleisten liegen nur im Speicher und werden beim Verlassen und beim Herunterfahren abgebaut, ein Absturz kann also keine auf deinem Bildschirm zurücklassen.
TitelBleiben den wenigen Momenten vorbehalten, für die sich eine Unterbrechung lohnt, etwa wenn du in Aufdeckungsreichweite eines Risses kommst und seine Koordinaten erfährst.

Verbinde dich auf Java über blacklight-network.de oder auf Bedrock über blacklight-network.de Port 19132. Der Server läuft auf Paper 26.1.2.

Ein großer Teil der neueren Arbeit an der Oberfläche ist in der Entwicklerdokumentation als geschrieben, aber nicht auf dem Server verifiziert markiert. Wo diese Seite eine Feldnummer, ein Intervall oder eine Schwelle nennt, ist das, was der Code tut; verhält sich ein Bildschirm anders, lohnt sich eine Meldung mehr als die Annahme, die Seite habe recht.