NPC- und Boss-Patrouillen
EliteMobs kann konfigurierte NPCs und benutzerdefinierte Bosse mit der nativen Minecraft-Navigation auf erstellten Routen laufen lassen. Dasselbe System stellt Lua-Skripten walk_to, hold und teleport bereit.
Route schnell erstellen
- Spawne oder platziere den NPC bzw. benutzerdefinierten Boss.
- Sieh ihn aus höchstens 12 Blöcken direkt an und führe
/em patrol editaus. - Stelle dich an jedes Ziel und führe
/em patrol addaus. Neue Routen beginnen mit Knoten0am konfigurierten Spawnpunkt des Akteurs. - Mit
/em patrol mode LOOPwird der letzte Knoten mit dem ersten verbunden; mit/em patrol mode REVERSEläuft der Akteur die Liste rückwärts zurück. /em patrol savespeichert die Route und aktualisiert den Akteur.
Der Editor zeigt die Verbindungen zwischen Knoten und eine Vorschau des berechneten Laufwegs. /em patrol remove entfernt den letzten Knoten, /em patrol undo stellt eine vorherige Bearbeitung wieder her und /em patrol status zeigt den Zustand des Bearbeitungstreibers. /em patrol cancel beendet die Sitzung ohne Speicherung der Routenänderungen. Alle Bearbeitungsbefehle sind nur für Spieler und benötigen elitemobs.patrol.admin. Wegpunkte müssen in der Ursprungswelt liegen; der Editor lehnt Punkte in einer WorldGuard-Region mit elitemob-spawning auf deny ab.
Neue Routen verwenden relative Koordinaten. Beim Bearbeiten einer bestehenden Route behält der Editor deren Einstellung patrol.relative bei und speichert hinzugefügte Wegpunkte in diesem Format. Das Format legst du in der YAML-Konfiguration fest.
Enthält eine NPC- oder regionale Boss-Datei mehrere spawnLocations, erzeugt das Speichern für einen Akteur eine eigene Unterdatei für diesen Standort und entfernt den Standort aus der ursprünglichen Datei. So bleibt die Bearbeitung bei relativen wie absoluten Routen auf diesen Akteur beschränkt. Die Unterdatei erbt über extends von der ursprünglichen Datei. Eine Boss-Unterdatei kopiert außerdem leashRadius, powers und eliteScript aus dem Original, da extends diese nicht erbt.
Konfiguration
Patrouillenknoten sind x,y,z-Koordinaten. Mit relative: true, dem Standard, sind sie Versätze vom konfigurierten Spawnpunkt des Akteurs. Mit relative: false sind sie exakte Koordinaten in der Welt des Akteurs, einschließlich der Welt seiner aktiven Dungeon-Instanz. Absolute Knoten enthalten keinen Weltnamen.
patrol:
enabled: true
relative: true
mode: LOOP
speed: 1.0
virtualSpeed: 0.2
nodes:
- 0,0,0
- 1000,0,0
- 1000,0,250
| Schlüssel | Werte | Standard | Beschreibung |
|---|---|---|---|
patrol.enabled | true / false | true, wenn Knoten vorhanden sind | Aktiviert die Route. |
patrol.relative | true / false | true | Verwendet bei true Versätze vom konfigurierten Spawnpunkt, bei false exakte Koordinaten in der Welt des Akteurs. Gilt für jeden Knoten der Route. |
patrol.mode | LOOP / REVERSE | LOOP | LOOP verbindet den letzten Knoten mit Knoten 0; REVERSE kehrt auf der Liste um. |
patrol.speed | positive endliche Zahl | 1.0 | Geschwindigkeitsmultiplikator der nativen Navigation. |
patrol.virtualSpeed | positive endliche Zahl | Bewegungsattribut × Patrouillengeschwindigkeit | Blöcke pro Tick entlang des zwischengespeicherten berechneten Wegs, solange ein persistenter Akteur keinen geladenen Körper hat. Normalerweise nicht setzen. |
patrol.startNodeWaitSeconds | endliche Zahl, 0 oder größer | 0 | Sekunden, die der Akteur jedes Mal an Knoten 0 rastet, wenn er dorthin zurückkehrt: einmal pro Runde bei LOOP, einmal pro Hin- und Rückweg bei REVERSE. Ein Akteur, der an Knoten 0 spawnt, rastet auch vor seiner ersten Runde. Während der Rast blickt er in seine Spawn-Richtung. |
patrol.nodes | mindestens zwei Koordinaten | keiner | Geordnete Ziele, ausgewertet gemäß patrol.relative. Zeichenfolgen x,y,z und Zuordnungen mit x, y und z werden akzeptiert. Koordinaten müssen endlich und aufeinanderfolgende Knoten verschieden sein. |
Diese Route besucht zum Beispiel drei exakte Orte, bevor sie zum ersten zurückkehrt:
patrol:
enabled: true
relative: false
mode: LOOP
nodes:
- 299,91,215
- 286,91,213
- 279,91,230
Bestehende Routen ohne patrol.relative verwenden weiterhin Versätze. Eine Änderung des Schalters ändert die Auswertung aller Knoten, rechnet die gespeicherten Zahlen aber nicht um. Rechne die Knoten ebenfalls um, wenn du das Format einer bestehenden Route änderst.
Es gibt keine öffentliche maximale Segmentlänge. Ein Segment über 1.000 Blöcke ist gültig. Der alte experimentelle Schlüssel patrol.maxLegDistance ist veraltet und wirkungslos.
Der Editor behält beim Speichern die Navigationsgeschwindigkeit, einen ausdrücklich gesetzten virtualSpeed und die Rast am Startknoten bei. Bei Routen mit mehr als zwei Knoten wird eine abschließende Wiederholung des ersten Knotens beim Einlesen automatisch entfernt.
NPC-Pausen in Spielernähe
NPCs unterstützen zusätzlich patrol.pauseNearPlayersRadius (Standard 0, deaktiviert) und patrol.faceNearbyPlayers (Standard false). Ein positiver endlicher Radius pausiert die Patrouille nahe lebenden Spielern außerhalb des Zuschauermodus. Die Blickoption richtet den wartenden NPC auf den nächsten geeigneten Spieler aus. Die Nähe wird alle 20 Ticks geprüft. Ungültige oder negative Radien deaktivieren diese Pause.
Diese Einstellungen sind unabhängig von Dialogen und manuellen Patrouillen-Haltebefehlen in Lua. Sie gelten für NPCs und sind keine zusätzlichen Boss-Patrouillenfelder.
Rast am Startknoten
Mit patrol.startNodeWaitSeconds hält ein Akteur an Knoten 0, bevor er die nächste Runde beginnt. Die Rast läuft auch ab, während der Akteur entladen ist. Eine Pause durch Spielernähe oder Kampf hält den Countdown an, bis sie endet. walk_to, hold, teleport und patrol_resume() beenden die Rast sofort. Der Kampfausbilder der Gilde verwendet eine Rast von 60 Sekunden, damit Spieler ihn zwischen den Runden an seinem Stuhl finden.
Langstrecken-Wegfindung
Lange Segmente werden automatisch gelöst. EliteMobs fordert von MagmaCore schrittweise eine Route durch geladenes Gelände an, teilt sie in kurze native Navigationsziele und plant beim Vorankommen neu.
Geländezugriff und Routensuche sind bewusst getrennt:
- Snapshots geladener Chunks werden auf dem Serverthread über MagmaCores gemeinsames Workload-System mit Tick-Budget erfasst.
- Die begrenzte A*-Suche läuft asynchron auf diesen unveränderlichen Snapshots.
- Minecrafts nativer Pathfinding-Code prüft und läuft die endgültigen kurzen Segmente.
- Die Planung lädt niemals Chunks zwangsweise. Fehlt Gelände, wartet sie und versucht es erneut. Ein persistenter Akteur ohne Körper kann nur dem zwischengespeicherten berechneten Weg folgen und wartet an dessen Ende. Sein Körper kann nur in einem Bereich zurückkehren, in dem Entitäten ticken.
So sind Routen durch ganze Städte möglich, ohne alles in einem Tick zu scannen oder gerade durch ein ungeladenes Gebäude zu laufen. Flug- und Wassermobs verwenden Volumensuchen; Bodenmobs benötigen Halt und Freiraum und meiden übliche Gefahren.
Verhalten der Akteure
- NPC-Patrouillen aktivieren automatisch Körper-KI und Modellbewegungssynchronisierung.
syncMovementbleibt für Modelle ohne Patrouille relevant, ist aber kein zweiter Patrouillenschalter. - Benutzerdefinierte Bosse benötigen
ai: true, positive Bewegungsgeschwindigkeit und dürfen keine Passagiere sein. - Bosse pausieren die Patrouille im Kampf und setzen sie danach fort.
- Nicht instanzierte NPCs und persistente, nicht instanzierte Bosse speichern ihre sichere Position in
patrol-state.ymlüber Chunk-Ablösung und Reloads hinweg. Ändern sich die Knoten oder der Schalterrelativeder Route, wird eine gespeicherte Position verworfen, und der Akteur beginnt wieder bei Knoten0. - Ein Akteur erscheint nur wieder in einem Bereich, in dem Entitäten ticken. Ohne Körper kann seine gespeicherte Position noch entlang eines zuvor berechneten Wegs fortschreiten; neue Routen durch unbekanntes Gelände werden dabei nicht ermittelt.
- Ein Passagier kann keine Patrouille besitzen; route stattdessen sein Reittier.
Lua-Steuerung
Diese Methoden stehen auf context.npc und context.boss bereit; ihre Patrouillenoperationen benötigen einen konfigurierten Controller. Lua-Koordinaten bleiben unabhängig von patrol.relative Versätze vom konfigurierten Spawnpunkt des Akteurs; jeder Aufruf meldet, ob die Anfrage angenommen wurde. walk_to, hold und teleport benötigen außerdem einen lebenden Körper. Eine angenommene Laufanfrage belegt keine Ankunft: Kampf, Nähepausen, deaktivierte KI oder Wegfindungsfehler können den Lauf unterbrechen.
| Methode | Verhalten |
|---|---|
patrol_pause() | Stoppt die aktuelle Route, ohne die Konfiguration zu verlieren. |
patrol_resume() | Beendet einen Skript-Halt oder temporären Lauf und setzt die Patrouille fort. |
walk_to(x, y, z) | Läuft zum Versatz und setzt danach die Patrouille fort. |
hold(x, y, z) | Läuft zum Versatz und bleibt dort, bis patrol_resume() aufgerufen wird. |
teleport(x, y, z) | Teleportiert den lebenden Körper zum Versatz in derselben Welt, wenn am Ziel Entitäten ticken und Bukkit den Teleport annimmt. Bestehende Skriptpausen und temporäre Ziele bleiben erhalten; nutze patrol_resume(), um zur Route zurückzukehren. |
return {
api_version = 1,
on_npc_interact = function(context)
context.npc:walk_to(40, 0, -12)
end
}
walk_to nutzt denselben Langstreckenlöser; manuelle Zwischenziele sind nicht nötig.
Diagnose
Sieh außerhalb einer Bearbeitungssitzung den Akteur an und führe /em patrol status aus. Die Ausgabe enthält Zustand, aktuellen und Zielknoten, Routenfortschritt, logischen Ort, virtuelle Geschwindigkeit, die Anwesenheit eines Körpers und den Haltegrund. start_node_wait kennzeichnet die Rast am Startknoten. terrain_unavailable bedeutet, dass für die Bewegung ohne Körper kein berechneter Weg mehr verfügbar ist; ein geladener Akteur, der auf die Planung wartet, kann stattdessen yielded melden. Der logische Ort beschreibt den Routenfortschritt und kann von der sicheren gespeicherten Position zur Wiederherstellung des Körpers abweichen.
Der Patrouillencontroller wiederholt gewöhnliche Wegfehler einmal, bevor er zum nächsten Knoten weitergeht. Auch ein fehlgeschlagener temporärer Lauf oder Halteauftrag erhält einen erneuten Versuch. Das belegt nicht, dass das Ziel erreicht wurde. Prüfe Gelände und native Navigation, wenn der Akteur einen Wegpunkt überspringt oder stehen bleibt.