Eigene Verzauberungen
EliteMobs und FreeMinecraftModels stellen eigene Verzauberungen über ein gemeinsames MagmaCore-System bereit. Jedes Plugin verwaltet seine Definitionen und Lua-Effekte in seinem eigenen Ordner enchantments/. Native Minecraft-Verzauberungen bleiben im Namensraum minecraft:.
Mitgelieferte Definitionen aktualisieren
Der Katalog stellt fehlende mitgelieferte YAML- und Lua-Dateien wieder her und ergänzt fehlende Standardfelder in vorhandenen mitgelieferten Definitionen. Bereits konfigurierte Werte und vorhandener Lua-Quelltext bleiben erhalten. Das funktioniert auch, wenn das Verzeichnis enchantments/ bereits existiert.
Das zuständige Plugin kann zuvor Dateien archivieren, die einem ausgemusterten Format entsprechen. EliteMobs sichert beispielsweise Verzauberungs-YAML mit maxLevelV2, bevor es die aktuellen Standarddateien erzeugt. EliteMobs archiviert außerdem unbearbeitete Kopien früherer mitgelieferter Verzauberungsskripte, etwa ein altes grappling_hook.lua, damit an ihrer Stelle die aktuelle Standardversion geschrieben wird; ein von dir bearbeitetes Skript bleibt erhalten. Prüfe deine Einstellungen im Konfigurationsarchiv und übertrage sie in die aktuellen Felder. Aktualisierte DLC-Effekte oder eigene Effekte benötigen weiterhin ihre jeweils passende Definition und Lua-Datei.
Item-Referenzen
Eigene Effekte verwenden eine kleingeschriebene ID mit Namensraum und eine positive ganzzahlige Stufe. Dieses Beispiel ist eine FMM-Item-Definition:
enchantments:
- "minecraft:unbreaking,3"
- "elitemobs:critical_strikes,2"
Beispielsweise definiert critical_strikes.yml im Verzauberungskatalog von EliteMobs die ID elitemobs:critical_strikes. Eine FMM-Definition verwendet freeminecraftmodels:. Unterordner werden nicht Teil der ID; gib Inhaltsdateien eindeutige Dateinamen.
Die YAML-Konfiguration eigener EliteMobs-Items behält Bukkit-Namen wie UNBREAKING,3 für native Verzauberungen bei, erfordert aber IDs mit Namensraum für eigene Effekte. Kopiere FMMs Syntax für native Item-Verzauberungen nicht in ein anderes Plugin, ohne dessen Item-Format zu prüfen.
Der installierte Provider muss die ID erkennen. Kompatibilität, Item-Typ, Slot, Konflikte und erforderliche Fähigkeiten ergeben sich aus seiner Definition. Das Entfernen eines Providers verwandelt dessen eigenen Effekt nicht in eine native Verzauberung.
Definitionsformat
Dies ist die mit FMM gelieferte Definition Ignition, die mit ignition.lua im selben Verzauberungskatalog zusammengehört:
isEnabled: true
name: Ignition
description: Sets surviving targets on fire after a staff fireball hits.
maxLevel: 3
curse: false
validSlots: [MAINHAND]
itemTypes: [STAFF]
attackKinds: [STAFF_FIREBALL]
requires: []
conflicts: []
stacking: source_item
script: ignition.lua
parameters:
base_ticks: 20
ticks_per_level: 20
return {
api_version = 1,
on_ignition_ticks = function(context)
return math.max(0, math.min(200, context.parameters.base_ticks
+ context.parameters.ticks_per_level * context.enchantment.level))
end
}
Diese Abfrage gibt eine Brenndauer an FMM zurück. Sie läuft weder als Prop-Skript noch als Skript für ein ausgerüstetes Item.
| Feld | Bedeutung |
|---|---|
isEnabled | Standard: true; deaktivierte Definitionen werden nicht in den Katalog aufgenommen |
name | Erforderlicher einfacher Anzeigename |
description | Optionale Beschreibung; standardmäßig leer |
maxLevel | Positive Stufenobergrenze beim Verzaubern; ausdrücklich definierte Items dürfen sie überschreiten |
curse | Gibt an, ob die Verzauberung ein Fluch ist; Standard: false |
validSlots | Ausrüstungsslots: HEAD, CHEST, LEGS, FEET, MAINHAND, OFFHAND |
itemTypes | Akzeptierte Kategorien: SWORD, AXE, PICKAXE, SHOVEL, HOE, BOW, CROSSBOW, TRIDENT, MACE, SPEAR, HELMET, CHESTPLATE, LEGGINGS, BOOTS, SHIELD, FISHING_ROD, SHEARS, ELYTRA, WAND, STAFF, OTHER |
attackKinds | Optionaler Filter für magische Angriffe: WAND_MISSILE, STAFF_MELEE, STAFF_FIREBALL |
requires | Anforderungen an Fähigkeiten des Providers |
conflicts | Andere kleingeschriebene Verzauberungs-IDs mit Namensraum |
stacking | Standard: source_item; alternativ sum_equipped_levels |
script | Erforderlicher kleingeschriebener .lua-Dateiname ohne Verzeichnis |
parameters | Benannte skalare Werte oder Listen skalarer Werte pro Stufe |
set | Optional. Macht diese Verzauberung zu einem Itemset |
Eine Liste mit Werten pro Stufe muss genau maxLevel Einträge enthalten. Oberhalb dieser Stufe bleibt der letzte Listenwert erhalten, während das Skript weiterhin die tatsächliche Verzauberungsstufe erhält. Parameter gehören zum jeweiligen Effekt; ein beliebiger zusätzlicher Schlüssel erzeugt keine neue Mechanik.
Unbekannte Felder auf oberster Ebene, doppelte IDs, fehlende Skripte und nicht unterstützte Hooks führen zur Ablehnung des Katalogkandidaten. Korrigiere die in der Fehlermeldung genannte Datei vor dem Neuladen. Ein fehlerhafter Kandidat ersetzt den aktiven Katalog nicht.
Zuständigkeit für Effekte
Beginne mit einem Effekt, den das Plugin mitliefert, das deine neue Definition verwalten soll. Seine unterstützten Hooks und Fachoperationen bestimmen die Möglichkeiten. Abfrage-Hooks geben Werte wie Geschossanzahl, Chance auf kritische Treffer oder Bedrohungsbonus zurück. Aktions-Hooks verarbeiten akzeptierte Item-Eingaben und können zeitlich begrenzte Effekte verwalten.
Die alte FMM-API context.item und ihr Lebenszyklus beim An- und Ablegen gelten hier nicht. Verzauberungsskripte verwenden ihre eigenen Tabellen context.enchantment und context.parameters, erfasste Quelldaten und Aktionsoperationen. Benenne ein altes Item-Skript nicht einfach um und erwarte, dass sein Kontext kompatibel ist.
Bücher und Ambosse
Eigene verzauberte Bücher verwenden dieselben Provider-Definitionen wie ausgerüstete Items. Ein Amboss validiert das Ausgangsitem, das Buch und das vollständige Ergebnis einschließlich nativer Verzauberungen. Gleiche Stufen eigener Verzauberungen werden zur nächsten Stufe kombiniert; bei ungleichen Stufen bleibt die höhere erhalten. Jede geänderte eigene Verzauberung erhöht die nativen Reparaturkosten um ihre Ergebnisstufe. Diese Stufe muss die Prüfungen der Definition für Amboss-Stufenlimit, Slot, Typ, Fähigkeiten und Konflikte bestehen.
Gemischte Bücher müssen neben ihren eigenen Einträgen alle vom Server akzeptierten nativen Einträge übertragen. Lehnt der Server einen nativen Eintrag ab, wird die eigene Operation abgelehnt, statt diesen Teil des Buchs still zu verwerfen. Ungültige oder nicht verfügbare Definitionen verhindern ebenfalls die Vorschau. Eingaben und Provider-Zustand werden beim Entnehmen erneut geprüft; eine sichtbare Vorschau ist keine Reservierung, die einen Katalogwechsel überdauert.
Lua-Abfragereferenz
Numerische Abfragen führen eine neue Skript-Instanz aus und schließen sie sofort nach dem Ergebnis. Gib eine endliche Zahl oder nil für keinen Beitrag zurück. Zustand und geplante Arbeit überdauern die Abfrage nicht. Eine fehlgeschlagene Definition wird bis zu einem erfolgreichen Katalog-Reload gesperrt; das Ausschöpfen des verbleibenden Budgets des Aufrufers allein sperrt die Definition nicht.
| Kontext | Inhalt |
|---|---|
context.enchantment | id und tatsächliches level |
context.parameters | Für diese Stufe aufgelöste Werte der Definition |
context.input | Skalare Fakten der zuständigen Mechanik; die genauen Schlüssel findest du im mitgelieferten Effekt |
context.target | Tabelle einer Entität oder lebenden Entität, oder nil |
context.player | Auslösender Spieler, sofern die Abfrage einen hat |
FMM stellt on_missile_count, on_missile_damage_factor, on_blast_radius_factor und on_ignition_ticks bereit. Andere Provider bieten ihre eigenen numerischen Hooks. Eine Definition darf nur Hooks deklarieren, die ihr Provider akzeptiert.
Lua-Aktionsreferenz
Aktionsskripte verwenden die gemeinsamen Tabellen für Scheduler, Cooldowns, Welt, Zonen, Spieler und Events. Sie laufen für eine akzeptierte Eingabe oder einen Angriff und verwenden für spätere Callbacks eine erfasste Quelle. Chat erstellt während des Chat-Events eine Momentaufnahme der Nachricht und erfasst die Ausrüstung erst bei der Weiterleitung im Serverthread. Ein optionales parameters.lifetime_ticks muss eine positive ganze Zahl sein; ohne diesen Parameter lebt die Aktivierung einen Tick. Für geplante Effekte muss eine ausreichend lange Lebensdauer definiert werden.
Aktivierungen enden beim Ablauf ihrer Lebensdauer, beim Tod, Verlassen des Servers oder Weltwechsel des Akteurs, beim Entladen der zuständigen Welt oder eines Chunks mit einer ihrer verwalteten Entitäten sowie beim Neuladen oder Deaktivieren des Providers. Sie können früher enden, wenn nach der letzten Eingabe keine verwaltete Arbeit mehr übrig ist. parameters.stop_on_unequip: true beendet eine Aktivierung außerdem, sobald ihr erfasstes Item nicht mehr ausgerüstet ist. Lokale Cooldowns gehören zum Spieler und zur Verzauberungs-ID; globale Cooldowns gehören zum Spieler innerhalb des Providers. Beide überdauern Ausrüstungswechsel, abgeschlossene Aktivierungen, Weltwechsel und gültige Reloads. Sie werden beim Verlassen des Servers oder Herunterfahren des Providers geleert.
| Hook | Akzeptierte Eingabe |
|---|---|
on_attack_entity | Erfolgreicher, positiver nativer Nahkampfschaden mit dem Item in der Haupthand oder ein ausdrücklich vom Plugin verwalteter Angriff |
on_projectile_hit | Erfolgreicher Schaden an einem lebenden Ziel durch ein erfasstes Bogengeschoss, einmal pro Projektil und Ziel weitergeleitet, oder ein ausdrücklich vom Plugin verwalteter Einschlag |
on_take_damage | Positiver Schaden am Spieler; geeignete ausgerüstete Slots werden geprüft |
on_right_click, on_left_click | Handinteraktion ohne Schleichen |
on_shift_right_click, on_shift_left_click | Handinteraktion beim Schleichen; ersetzt den entsprechenden gewöhnlichen Klick-Hook |
on_break_block | Akzeptierter Blockabbau durch den Spieler mit dem Item in der Haupthand |
on_chat | Akzeptierter Chat, im Serverthread mit der Nachrichtenmomentaufnahme weitergeleitet |
on_sneak | Beginn des Schleichens; Ausrüstungsbeiträge werden pro Definition gesammelt |
on_projectile_launch | Verbrauchte verzauberte Munition, die aus einem Bogen-Event als Pfeil abgeschossen wird |
on_game_tick | Tick, solange diese Aktivierung aktiv bleibt |
on_zone_enter, on_zone_leave | Spieler überqueren die Grenze einer von dieser Aktivierung überwachten Zone |
Diese Hooks erzeugen keine Skriptlaufzeit für das An- und Ablegen. Auch eine Definition nur mit Tick-Verhalten benötigt einen Eingabe-Hook, um ihre Aktivierung zu starten. Native Angriffs-, Schadens-, Chat- und Abbau-Hooks beobachten bereits akzeptierte Eingaben; sie können das ursprüngliche Event nicht abbrechen. Die vier Interaktions-Hooks stellen ein synchrones Abbruch-Flag bereit: context.event:cancel() verweigert die zugehörige Item- und Blockinteraktion. Geplante Callbacks können eine Eingabe nicht nachträglich abbrechen.
| Kontext | Inhalt |
|---|---|
context.enchantment | id, level |
context.parameters | Für die Stufe aufgelöste Definitionsparameter |
context.player | Aktuelle Spielertabelle des Akteurs |
context.target | Aktuelle Tabelle der betroffenen lebenden Entität oder nil |
context.source | Erfasste Fakten: item, slot, inventory_slot, equipment, attack_kind, providers; manche Eingaben liefern außerdem ammunition, projectile, message, block, drop_items, sneaking oder equipped_levels |
context.item | Haltbarkeits- und Verbrauchsmethoden für den erfassten Slot, solange ein Inventaritem noch adressierbar ist; siehe Item-Methoden |
context.action | id (Angriffs-UUID), instance (Aktivierungstoken), actor (UUID), world (Welt-UUID) und die folgenden Methoden |
context.set | Für ein Itemset: id, name, level und pieces; sonst nil |
Item-Momentaufnahmen enthalten material, amount und enchantments. Sie sind Daten und keine aktuellen Inventarobjekte. UUIDs in Quelldaten sind Strings. Beim Abbauen enthält source.block die Felder x, y, z und ein kleingeschriebenes material.
| Aktionsmethode | Rückgabe | Verhalten |
|---|---|---|
stop() | nil | Beendet diese Aktivierung und räumt ihre verwaltete Arbeit auf |
has_previous() | bool | Prüft auf eine andere aktive Instanz dieser Verzauberung für denselben Spieler |
replace_previous() | nil | Beendet diese früheren Instanzen und behält die aktuelle bei |
damage_target(target_uuid, amount) | bool | Fordert den Provider auf, endlichen positiven Schaden mit der erfassten Quellenzuordnung anzuwenden; false bei Ablehnung |
own_entity(uuid) | bool | Registriert eine gültige Nichtspieler-Entität derselben Welt zur Entfernung beim Aufräumen; nach dem Spawnen verwenden |
launch_projectile(location, direction, speed, range, ticks, impact, visual?, protected_path?=false) | bool | Startet ein verwaltetes geskriptetes Projektil; Geschwindigkeit und Reichweite müssen endlich und positiv sein, ticks mindestens 1 |
attribute_projectile(uuid, callback, protect?=false) | bool | Bindet den Schaden eines verwalteten nativen Projektils an einen eigenen Callback |
place_block(x, y, z, expected_material, block_data) | bool | Platziert über die Validierung von Spieler-Blockaktionen, sofern das aktuelle Material übereinstimmt |
break_block(x, y, z, expected_material, drop_material?, amount?=1) | bool | Baut über die Validierung von Spieler-Blockaktionen ab, optional mit einem selbst definierten Item-Drop |
break_naturally(x, y, z, expected_material) | bool | Baut mit dem erfassten Werkzeug und den Drop-Regeln des ursprünglichen Abbau-Events ab |
temporary_block(x, y, z, block_data, ticks?=0) | bool | Übernimmt einen geladenen Block vorübergehend und stellt ihn beim Aufräumen oder nach einer positiven Tickzahl wieder her; null gilt bis zum Aufräumen |
can_own_block(x, y, z) | bool | Prüft geladene Koordinaten und ob eine vorübergehende Übernahme verfügbar ist |
temporary_gravity(uuid, enabled) | bool | Übernimmt den Schwerkraftzustand vorübergehend und stellt ihn beim Aufräumen wieder her |
restore_gravity(uuid) | bool | Stellt die von dieser Aktivierung übernommene Schwerkraft vorzeitig wieder her |
temporary_scale(uuid, scale) | bool | Übernimmt die Skalierung einer lebenden Entität bis zum Aufräumen |
temporary_potion(uuid, type, ticks, amplifier) | bool | Übernimmt einen Trankeffekt für eine positive Tickzahl mit einem nicht negativen Verstärker |
restore_potion(uuid, type) | bool | Stellt den von dieser Aktivierung übernommenen Trankeffekt vorzeitig wieder her |
ride_rails(speed) | bool | Setzt den Spieler in ein Minecart, das nur Clients sehen, und lässt es mit speed Blöcken pro Tick (über 0, höchstens 2) auf den verbundenen Schienen im Block des Spielers in die Richtung fahren, in die er blickt; false, wenn dort keine Schiene liegt, der Spieler bereits fährt oder der NMS-Adapter des Servers nicht verfügbar ist |
Eine Schienenfahrt ist verwaltete Arbeit ihrer Aktivierung. Schleichen, das Ende der Strecke, ein Teleport, Tod, Verlassen des Servers oder alles andere, was den Spieler mehr als einen Block vom Minecart wegbewegt, beendet die Fahrt und danach die Aktivierung; der Spieler wird dort abgesetzt, wo das Minecart angehalten hat, außer nach einem Teleport, Tod oder Verlassen des Servers. Auch das Beenden der Aktivierung, unter anderem durch replace_previous(), setzt den Spieler ab. Das lifetime_ticks der Aktivierung gilt weiterhin, plane also genug Zeit für die längste Strecke ein.
Projektil-Einschlag-Callbacks erhalten (fresh_context, target_or_nil, location); visuelle Callbacks erhalten (fresh_context, location). Schadens-Callbacks nativer Projektile erhalten im nächsten Tick (fresh_context, target, native_damage). Sie ersetzen die native Schadensanwendung und müssen den beabsichtigten Schaden ausdrücklich anwenden, normalerweise über fresh_context.action:damage_target(target.uuid, amount). Bei nativen Projektilen filtert protect=true geschützte Explosionsblöcke und Entzündungen. Bei geskripteten Projektilen absorbiert protected_path=true Flüge, die geschützte oder ungeladene Positionen durchqueren.
Das Aufräumen verwalteter Arbeit ist auf Operationen begrenzt, die eine Zuständigkeit registrieren. Gewöhnliche Aufrufe von world:spawn_entity, entity:set_gravity und world:set_block_at werden nicht automatisch durch die Aktion aufgeräumt. Methoden für temporäre Zustände verwalten die Wiederherstellung; sie ersetzen keine Prüfung, ob ein feindlicher Effekt oder eine Blockänderung erlaubt ist.
Itemsets
Ein set-Abschnitt macht aus einer Verzauberung ein Itemset. Setze dieselbe Verzauberung auf jedes Teil. Das Set ist vollständig, solange jeder unter pieces aufgeführte Slot ein Item mit dieser Verzauberung enthält. Ein vollständiges Set führt seine Hooks einmal pro Ereignis aus. Fehlt ein Teil, läuft nichts.
name: Crooked's Full Set
maxLevel: 1
validSlots: [HEAD, CHEST, LEGS, FEET]
itemTypes: [HELMET, CHESTPLATE, LEGGINGS, BOOTS]
script: crooked_set.lua
parameters:
lifetime_ticks: 620
stop_on_unequip: true
set:
pieces:
HEAD: Crooked's Hex-Brim
CHEST: Crooked's Warded Wrap
LEGS: Crooked's Bent Hosen
FEET: Crooked's Wayward Soles
lore:
- "&5Crooked's Full Set &7($equippedPieces/$totalPieces)"
- "$setPieces"
- "&7When damaged, has a 5% chance to grant Regeneration I."
return {
api_version = 1,
on_take_damage = function(context)
-- Runs only while all four pieces are worn, once per hit.
context.action:temporary_potion(context.player.uuid, "REGENERATION", 100, 0)
end
}
| Set-Feld | Bedeutung |
|---|---|
pieces | Erforderlich. Ordnet Ausrüstungsslots Teilnamen zu. Ist validSlots gesetzt, muss es jeden Slot eines Teils enthalten |
name | Name, den $setName verwendet. Standardmäßig der name der Verzauberung; akzeptiert &-Farbcodes |
lore | Die Lore-Zeilen des Sets. Standardmäßig der Setname mit der Teileanzahl, danach eine Zeile pro Teil |
equippedPiece | Zeile für ein getragenes Teil. Standard: &a✔ $pieceName |
missingPiece | Zeile für ein fehlendes Teil. Standard: &c✘ $pieceName |
Die Set-Lore akzeptiert diese Platzhalter:
| Platzhalter | Zeigt |
|---|---|
$setName | Den Setnamen |
$equippedPieces | Wie viele Teile der Spieler trägt |
$totalPieces | Wie viele Teile das Set hat |
$setPieces | Eine Zeile pro Teil in Slot-Reihenfolge, aus equippedPiece oder missingPiece. Text rund um den Platzhalter wiederholt sich in jeder Zeile |
$pieceName, $pieceSlot | Innerhalb von equippedPiece und missingPiece den Teilnamen und seinen Slot, etwa Head oder Main Hand |
$ifSetComplete | Zeigt die Zeile nur, solange jedes Teil getragen wird |
$ifSetIncomplete | Zeigt die Zeile nur, solange ein Teil fehlt |
Set-Items zeigen diesen Abschnitt anstelle einer Zeile in der Liste eigener Verzauberungen. Setze in EliteMobs $itemSet in itemLoreStructureV2 in der ItemSettings.yml oder in die eigene lore eines Custom Items. Ohne beides folgt das Set der eigenen Lore des Items. $ifItemSet zeigt eine Strukturzeile nur auf Set-Items. FMM-Custom-Items zeigen das Set in der Lore-Zeile mit $itemSet oder nach ihrer Lore.
Der Abschnitt zeigt, was der Spieler trägt, der das Item bei sich hat, und wird neu gezeichnet, sobald er ein Teil anlegt oder ablegt. Ein Item, das außerhalb eines Spielerinventars liegt, behält den Zustand, den es zeigte, als es das Inventar verließ.
Set-Hooks unterscheiden sich in einigen Punkten von gewöhnlichen Verzauberungs-Hooks:
- Jeder Aktions-Hook in der Tabelle oben erreicht ein vollständiges Set, unabhängig davon, welche Slots seine Teile belegen. Ein Rüstungsset kann auf
on_attack_entityoderon_break_blockreagieren. - Die Vollständigkeit wird geprüft, wenn das Ereignis eintritt. Ein Projektil prüft die Sets, die beim Aufschlag getragen werden, und jedes Projektil zählt, nicht nur Bogenpfeile.
on_take_damagesetztcontext.targetauf den Angreifer, sofern es einen gibt.context.source.itemundcontext.itemsind das erste Teil in Slot-Reihenfolge:HEAD,CHEST,LEGS,FEET,MAINHAND,OFFHAND. Liescontext.source.equipment.MAINHANDfür die gehaltene Waffe oder das gehaltene Werkzeug.context.set.levelist die niedrigste Stufe unter den Teilen.context.set.piecesist nach Slot geschlüsselt, mitnameundinventory_slotjedes Teils.stop_on_unequip: truebeendet eine Set-Aktivierung, sobald ein beliebiges Teil abgelegt wird.- Numerische Abfragen, etwa EliteMobs-Bedrohung und kritische Trefferchance oder FMM-Zauber-Modifikatoren, zählen ein Set nur einmal und nur, solange es vollständig ist.
Bestehende Inhalte aktualisieren
FMM überspringt eigene Items mit einer nicht leeren scripts:-Liste oder ausgemusterten Verzauberungseinträgen ohne Namensraum. Ersetze diese Item-Definitionen durch Verzauberungen mit Namensraum; Prop-Skripte werden weiterhin unterstützt.
Eigene EliteMobs-Effekte verwenden jetzt maxLevel und effektspezifische parameters in der Provider-YAML. Die Konfiguration nativer Verzauberungen und Elite-Level-Verzauberungen hat ein eigenes Format. Folge der EliteMobs-Verzauberungsreferenz, statt eine alte Datei mit maxLevelV2 in eine Provider-Definition zu kopieren.