EternalTD-Wellen & Gegner
Eine Wellen-Datei unter plugins/EternalTD/waves/ definiert das gesamte Gegneraufgebot für ein Level, einschließlich normaler Wellen, Sudden-Death-Wellen und optionaler Vorwellen- oder Wellennachrichten. Jede Level-Konfiguration verweist über wavesConfigFile: auf eine Wellen-Datei.
Felder auf oberster Ebene
| Feld | Typ | Standard | Hinweise |
|---|---|---|---|
isEnabled | bool | true | Deaktivierte Wellendateien werden nicht geladen; abhängige Level können ohne diese Wellenkonfiguration nicht starten |
baseMobAmount | int | 20 | Standardmenge, die verwendet wird, wenn ein Eintrag kein amount= angibt |
waveEntities | string list | erforderlich | Gegnereinträge für jede Welle |
suddenDeathWaveEntities | string list | optional | Optionaler zyklischer Wellenpool, der nach Erschöpfung der konfigurierten Wellen läuft |
prewaveMessages | list of maps | optional | Nachrichten nach aktuellem Zähler: 0 beim Eintritt, N nach dem Ende von Welle N |
waveMessages | list of maps | optional | Nachrichten, die zu Beginn einer Welle angezeigt werden |
Ohne Sudden-Death-Einträge endet die Sitzung, wenn der Übergang zur nächsten Welle keinen konfigurierten Eintrag findet. Normalerweise geschieht das nach dem letzten Baufenster, sofern der Spieler nicht früher weitergeht.
Format der Wellen-Entity-Einträge
Jede Zeile in waveEntities (oder suddenDeathWaveEntities) ist ein durch Doppelpunkte getrennter Eintrag:
- wave=1:entityType=ZOMBIE:healthMultiplier=1.0:amount=10
- wave=2:entityType=SKELETON:fast:treasure
- wave=5:entityType=WITHER_SKELETON:boss
- wave=8:entityType=PHANTOM:air:horde
| Schlüssel | Typ | Hinweise |
|---|---|---|
wave | int | Erforderlich. Nummer der Welle, zu der dieser Eintrag gehört |
entityType | enum | Erforderlich. Exakter Bukkit-EntityType-Enum-Wert; wähle eine spawnbare lebende Entität |
healthMultiplier | double | Optional, Standard 1.0. Multipliziert die maximale Lebensenergie der Entität |
amount | int | Optional. Überschreibt baseMobAmount für diesen Eintrag |
name | string | Optional. Benutzerdefinierter Namens-String. Wird geparst und gespeichert, das Plugin wendet ihn derzeit aber nicht auf den gespawnten Mob an (Namensschilder sind stattdessen die Lebens-/Rüstungsleisten) |
resist | flag | Markiert die Entität als immun gegen Verlangsamung |
fast | flag | Erhöht die Bewegungsgeschwindigkeit |
treasure | flag | Verdoppelt das Gold-Kopfgeld bei der Tötung |
boss | flag | Verwendet die unten erklärte Bossmenge, skalierte Lebensenergie und eine Bossleiste pro Boss |
horde | flag | Verdoppelt amount und halbiert die Lebensenergie |
air | flag | Die Entität spawnt 4 Blöcke über dem Pfad und ignoriert Bodenmauern |
Verwende Schlüssel und Flags ohne umgebende Leerzeichen, Entitätstypen in Großbuchstaben sowie positive Wellennummern, Mengen und Lebensmultiplikatoren. Der Parser entfernt keine Leerzeichen und lehnt nicht jeden ungültigen Wertebereich ab. Unbekannte Schlüssel werden ignoriert. Ein fehlerhafter normaler Eintrag deaktiviert die Wellenkonfiguration; ein fehlerhafter Sudden-Death-Eintrag erzeugt eine Warnung und kann zuvor eingelesene Einträge im Pool belassen. Erfolgreiches Einlesen beweist nicht, dass die Entitäten spawnen können.
Interne Mengenberechnung
amountwird umwave / 10erhöht und anschließend auf eine ganze Zahl abgeschnitten, sodass ein Eintrag mitamount=20bei Welle 15 21 Mobs und bei Welle 20 22 Mobs ergibt.boss-Einträge überschreibenamountaufmax(1, floor(wave / 10)).horde-Einträge verdoppeln den finalenamount.- Zusätzlich zur Menge pro Eintrag fügt die Wellen-Laufzeit beim Aufbau der Welle Duplikate hinzu. Beachte, dass die Liste, in die dabei indiziert wird, die vollständig expandierte Mob-Liste ist — der Konfigurationsparser hat bereits ein Objekt pro Mob erzeugt, sodass eine einzelne
amount=20-Zeile 20 aufeinanderfolgende Indizes beisteuert, nicht einen. Für jeden geraden Indexi(0, 2, 4, ...), der sowohl ein gültiger Index in dieser expandierten Liste als auch kleiner als die Wellennummer ist, wird ein zusätzlicher Klon des Mobs an Indexihinzugefügt. Boss-Einträge werden auf diese Weise nie geklont. Die Anzahl der Bonus-Mobs beträgt also ungefährceil(min(waveNumber, listSize) / 2): 1 zusätzlicher Mob bei Welle 1, 2 bei den Wellen 3–4, 5 bei den Wellen 9–10, 8 bei den Wellen 15–16 und so weiter, bis die Wellennummer über die Liste hinauswächst.
Das Spawn-Intervall beträgt min(floor(200 / totalEntities), 20) Ticks. Bei normalen Spawns muss der Zähler das Doppelte dieses Intervalls überschreiten. Bei Horde-Spawns muss er das Doppelte des zuvor ganzzahlig halbierten Intervalls überschreiten. Durch den strikten Vergleich kommt ein zusätzlicher Zählertick hinzu; der Abstand ist also nicht exakt doppelt so groß wie das Intervall. Die Horde-Taktung richtet sich nach dem ersten verbleibenden Mob in der Wellenliste. Gemischte Horde- und gewöhnliche Einträge können die Taktung deshalb im Verlauf der Liste verändern. Jeder Mob wählt beim Spawnen zufällig eines der Startfelder des Levels.
Nachrichtenblockformat
Sowohl prewaveMessages als auch waveMessages akzeptieren eine Liste von Maps:
prewaveMessages:
- wave: 0
message:
- "&aWelcome! Build a couple of basic towers along the path."
- wave: 4
message:
- "&6Heads up: a boss is coming next wave."
prewaveMessages[0] wird beim Eintritt ausgeführt. Nach Welle N läuft prewaveMessages[N] während der Bauphase für die nächste Welle: Verwende Schlüssel 4 für eine Warnung vor Welle 5. waveMessages[N] läuft beim Beginn von Welle N. Die Schlüssel verwenden den angezeigten Sitzungszähler, auch in Sudden Death. Mehrere Nachrichteneinträge mit demselben Schlüssel überschreiben die vorherigen.
Lebenszyklus einer Welle
Eine Sitzung durchläuft folgende Zustände:
STARTING— bevor der Spieler/etd startzum ersten Mal ausführt.CONSTRUCTION_PHASE— 10-sekündiges Baufenster zwischen Verteidigungsphasen.DEFENSIVE_PHASE— Gegner spawnen und laufen den Pfad entlang.ENDING— der Spieler hat aufgegeben, verloren oder das Level ist ohne Wellen.
Der normale Bautimer dauert 10 Sekunden. /etd start oder das Werkzeug Next Wave können früher weitergehen, beachten aber weiterhin die Tutorialanforderungen (siehe Sonderfall Tutorial-Level). Die anfängliche Startphase wartet auf eine Startaktion; das Tutorial kann weitergehen, sobald seine letzte Anforderung akzeptiert wurde.
Verhalten am Wellenende:
- Das Abschließen einer Welle gewährt
waveNumber * 10Gold. - Wenn du während der Welle keine Leben verloren hast, erhältst du einen "Perfekt"-Bonus in Höhe der Hälfte des Wellenbonus (
waveNumber * 10 * 0.5). Die angekündigte Zahl und das tatsächlich gewährte Gold stimmen jetzt überein. - Jede Welle kann nur einmal auszahlen — eine Welle, die aus irgendeinem Grund zweimal als abgeschlossen gemeldet wird, wird beim zweiten Mal ignoriert, und sobald die Sitzung endet, findet überhaupt keine Auszahlung mehr statt.
- Nach dem Wellenende wird die Modifikatorzeichenfolge der nächsten Welle angekündigt, wenn sie nicht leer ist. Sie stammt vom ersten konfigurierten Gegner, nicht von allen Einträgen einer gemischten Welle.
Wann ein Level endet
Die Sitzung rückt nur vor, wenn die nächste Wellennummer als Schlüssel in waveEntities existiert, daher müssen die Wellennummern lückenlos ab 1 laufen. Fehlt die nächste Nummer:
- geht der Lauf in Sudden Death über, wenn die Datei
suddenDeathWaveEntitiesdefiniert; - andernfalls endet das Level sofort, ohne die nie gelaufene Welle mitzuzählen. Der gespeicherte Highscore und der Abschlusstitel verwenden die letzte Welle, die der Spieler tatsächlich gespielt hat.
Sudden Death
Wenn suddenDeathWaveEntities definiert ist, läuft das Level über die konfigurierte Wellenliste hinaus weiter.
Der Sudden-Death-Pool durchläuft die konfigurierten Wellennummern. Bei Bedarf wählt EternalTD den kleinsten nicht negativen Schlüssel oberhalb des aktuellen Poolschlüssels oder springt zum kleinsten zurück, wenn kein höherer existiert. Der Poolzähler beginnt bei 0: Ein konfigurierter Schlüssel 0 wird beim ersten Durchlauf übersprungen, wenn positive Schlüssel vorhanden sind. Verwende positive Schlüssel; Lücken sind erlaubt, und Schlüssel 0 eignet sich auch nicht für die Lebensformel unten.
Der angezeigte Wellenzähler steigt weiter. Lebensenergie, Rüstung, Geschwindigkeit, Grundkopfgeld und Splitterlingsschwellen verwenden den konfigurierten wave=-Wert des gewählten Eintrags; sie skalieren nicht automatisch mit dem angezeigten Zähler. Zusätzliche Laufzeitklone und Elementarwürfe verwenden dagegen den angezeigten Zähler. Pooleinträge 10 und 20 behalten beispielsweise ihre Skalierungswerte auch bei angezeigter Welle 100. Die Suche nach der nächsten Welle prüft bei jeder angezeigten Nummer weiterhin auf einen regulären Eintrag. Nach einer früheren Lücke kann daher ein späterer regulärer Schlüssel verwendet werden.
Elementare Ausrichtung bei Welleneinheiten
Jede Welle hat ihre eigene elementare Ausrichtung, die pro Welle rotiert:
- Welle 1 → Feuer
- Welle 2 → Luft
- Welle 3 → Wasser
- Welle 4 → Erde
- (dann wiederholt sich das)
Beim Spawn einer normalen Welleneinheit beträgt die Chance auf das Wellenelement die angezeigte waveNumber / 100; ab angezeigter Welle 100 gelingt der Wurf immer. Ein farbiges Tag zeigt das Element an. Splitterlinge werden separat erzeugt und erhalten diesen Wurf nicht.
Die Regeln für elementaren Schaden werden von der DamageTower-Klasse des Turms verwaltet:
- Gleiche Ausrichtung Angreifer gegen gleiche Ausrichtung Ziel — 0,5× Schaden (Resistenz).
- Entgegengesetzte einzelne Elemente (Feuer gegen Wasser, Luft gegen Erde) — 2× Schaden (Krit).
- Fusionsausrichtungen folgen der Tabelle unten. Andere Kombinationen ohne Übereinstimmung verursachen 1× Schaden.
- Ein Turm ohne Ausrichtung verursacht 1× Schaden gegen alle.
| Turmausrichtung | 2× Schaden gegen | 0,5× Schaden gegen |
|---|---|---|
| Magma | Luft, Wasser | Erde, Feuer, Magma |
| Druckwelle | Erde, Wasser | Luft, Feuer, Druckwelle |
| Sturm | Feuer, Erde | Luft, Wasser, Sturm |
| Schlamm | Feuer, Luft | Erde, Wasser, Schlamm |
Fusionsausrichtungen entstehen, wenn ein Basisturm von Unterstützungstürmen mit kombinierbaren elementaren Ausrichtungen berührt wird:
| Kombination | Resultierende Fusion |
|---|---|
| Feuer + Erde | Magma |
| Feuer + Luft | Druckwelle |
| Wasser + Luft | Sturm |
| Wasser + Erde | Schlamm |
Die Konfliktregeln sind enger gefasst, als sie aussehen:
- Erde + Luft am selben Turm setzt ihn immer auf „Ohne Ausrichtung" zurück, ganz gleich, was sonst noch anliegt.
- Feuer + Wasser setzt nur dann auf „Ohne Ausrichtung" zurück, wenn drei oder mehr verschiedene Ausrichtungen im Spiel sind. Ein Turm, der von genau einem Feuer- und einem Wasser-Unterstützungsturm berührt wird, behält willkürlich eine der beiden, weil der Code auf „nimm die erste Ausrichtung in der Menge" durchfällt und diese Menge ungeordnet ist.
- Unterstützungstürme ohne Ausrichtung (Fernrohrturm, Goldmine) beeinflussen das Ergebnis nie; sie fallen aus der Menge heraus, sobald irgendein ausgerichteter Turm anliegt.
Jede Neuberechnung beginnt beim eigenen Element „Ohne Ausrichtung“ des Basisturms. Das Entfernen der letzten elementaren Unterstützung setzt den Turm daher auf „Ohne Ausrichtung“ zurück.
Skalierung von Lebensenergie, Rüstung und Kopfgeld
WaveEntity führt beim Spawn diese Schritte mit seiner konfigurierten Wellennummer aus (bei Splitterlingen der halbierten Welle des Ursprungsmobs), in dieser Reihenfolge:
- Die Grundlebensenergie beginnt bei
0.5und wächst mit der Welle:health = 0.5 + ((wave - 1)^1.2) / 2. - Boss-Entitäten multiplizieren das mit
baseMobAmount × 0.5. - Horde-Entitäten halbieren es.
- Hier wird das Kopfgeld berechnet, als
ceil(health)— vorhealthMultiplierund vor der Luft-Halbierung.treasure-Einträge verdoppeln es anschließend. maxHealth = health × healthMultiplier.- Luft-Entitäten halbieren
maxHealthnoch einmal. - Rüstung erscheint erst ab Welle 10 und ist auf
maxHealth / 80gesetzt.
Die Reihenfolge in Schritt 4 ist entscheidend: Ein healthMultiplier von 3.0 verdreifacht die Lebensenergie ohne Änderung des Grundkopfgelds. Luftgegner zahlen trotz halber Lebensenergie dasselbe Grundkopfgeld wie entsprechende Bodengegner. Die Goldmine addiert ihren Bonus beim tödlichen Schlag und schneidet das Ergebnis auf eine ganze Zahl ab; kleine Kopfgelder können deshalb kein zusätzliches Gold bringen.
Die Bewegungsgeschwindigkeit beträgt:
speed = 0.3 × (1 - slow)
× 1.5 × (1 - slow) if fast
× 0.5 if air
+ wave / 1000
Der abschließende Term wave / 1000 verwendet die konfigurierte Gegnerwelle und wird nach den Luft- und Verlangsamungsmultiplikatoren addiert. Dieser Wert steuert das Bewegungsgeschwindigkeitsattribut von Mobs. Der Ersatzpfad für Entitäten, die keine Mob sind, teleportiert stattdessen pro Bewegungstick 0.1 Blöcke zum nächsten Ziel. Die Formel ist daher keine allgemeine Geschwindigkeit in Blöcken pro Tick.
Splitterlinge
Ab Welle 20 spawnen Nicht-Luft-Gegner beim Tod zusätzliche kleine Mobs ("Splitterlinge").
- Anzahl:
floor(wave / 20)pro Tötung. - War das Elternteil ein
CAVE_SPIDER, sind die SplitterlingeSILVERFISH. Andernfalls sind esCAVE_SPIDER. - Splitterlinge verwenden
floor(parentWave / 2)und übernehmen die aktuelle Position auf der Route. Sie verwenden den Lebensmultiplikator 0.5 ihres Konstruktors und erben weder Flags noch elementare Ausrichtung des Ursprungsmobs. Bei ausreichend hohen konfigurierten Wellen können sie beim Tod weitere Splitterlinge erzeugen. - Splitterlinge geben beim Tod 0 Gold, und Luft-Gegner spawnen niemals Splitterlinge.
Sonderfall Tutorial-Level
Das Level tutorial.yml verwendet ein fest codiertes Skript, das an seine Kartenkoordinaten gebunden ist:
- Die verlangten Turmtypen müssen auf den markierten Feldern platziert oder dort verbessert werden, wenn der passende Turm bereits steht. Ein falscher Turm auf einem verlangten Feld darf verkauft werden; andere Platzierungen, Verkäufe und Verbesserungen werden während dieser Skriptstufe abgelehnt. Die letzte akzeptierte Anforderung fordert sofort die nächste Welle an.
- Farbiger Beton markiert die verlangten Felder. Sind FMM und das Modell
reddownarrowverfügbar, zeigt ein roter Pfeil über jedem Feld den verlangten Turm oder die Verbesserung an. - Beim Eintritt in die Bauphase nach den Wellen 1, 2 und 3 fügt das Tutorial
+100Gold hinzu, nach Welle 4+200. Das ist zusätzliches Einkommen, keine Garantie ausreichenden Goldes. Andere Wellennummern erhalten keine Zugabe. - Jedes benötigte Turmfeld ist nach dem gewünschten Turm eingefärbt: grüner Beton für den Basisturm, braun für die Barrikade, weiß für Zucker, cyan für das Fernrohr, gelb für den Strahlengenerator, rot für die Explosionsfabrik, blau für die Eisbox, grau für den Rüstungsbrecher, orange für die Goldmine, violett für den Obsidiansteinbruch, schwarz für alles andere.
- Während jeder geskripteten Stufe zählt eine grüne Bossleiste die platzierten benötigten Türme als
Build towers! done/total!. Alle zwei Minuten erinnert dich das Tutorial daran, dass du mit/etd quitgehen kannst, und wiederholt, solange noch Anforderungen offen sind, die aktuelle Nachricht vor der Welle.
Spielerleben und Gold
- Startleben: 20.
- Startgold: 150.
- Boss-Mobs kosten 5 Leben, wenn sie das Ende erreichen. Alle anderen Mobs kosten 1 Leben.
- Jedes Umschalten von
/etd cheat, auch das Ausschalten, setzt Gold auf10,000,000und Leben auf1,000,000zurück. Die Sitzung bleibt dauerhaft von Highscores ausgeschlossen. /etd setwave <n>ändert den Sitzungszähler und die Belohnungssperre und markiert den Lauf als gecheatet. Es ersetzt keine aktiven Gegner und startet diese Welle nicht sofort. Der nächste Übergang verwendetn + 1.
Highscore-Tracking
Jede Level-Konfiguration speichert highscoreWave und highscorePlayerName. Am Ende einer Nicht-Cheat-Sitzung speichert das Plugin die neue Wellennummer in der Level-Datei und sendet eine serverweite Nachricht, wenn der bisherige Punktestand übertroffen wurde.