Zum Hauptinhalt springen

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.

FeldBedeutung
isEnabledStandard: true; deaktivierte Definitionen werden nicht in den Katalog aufgenommen
nameErforderlicher einfacher Anzeigename
descriptionOptionale Beschreibung; standardmäßig leer
maxLevelPositive Stufenobergrenze beim Verzaubern; ausdrücklich definierte Items dürfen sie überschreiten
curseGibt an, ob die Verzauberung ein Fluch ist; Standard: false
validSlotsAusrüstungsslots: HEAD, CHEST, LEGS, FEET, MAINHAND, OFFHAND
itemTypesAkzeptierte Kategorien: SWORD, AXE, PICKAXE, SHOVEL, HOE, BOW, CROSSBOW, TRIDENT, MACE, SPEAR, HELMET, CHESTPLATE, LEGGINGS, BOOTS, SHIELD, FISHING_ROD, SHEARS, ELYTRA, WAND, STAFF, OTHER
attackKindsOptionaler Filter für magische Angriffe: WAND_MISSILE, STAFF_MELEE, STAFF_FIREBALL
requiresAnforderungen an Fähigkeiten des Providers
conflictsAndere kleingeschriebene Verzauberungs-IDs mit Namensraum
stackingStandard: source_item; alternativ sum_equipped_levels
scriptErforderlicher kleingeschriebener .lua-Dateiname ohne Verzeichnis
parametersBenannte skalare Werte oder Listen skalarer Werte pro Stufe
setOptional. 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.

KontextInhalt
context.enchantmentid und tatsächliches level
context.parametersFür diese Stufe aufgelöste Werte der Definition
context.inputSkalare Fakten der zuständigen Mechanik; die genauen Schlüssel findest du im mitgelieferten Effekt
context.targetTabelle einer Entität oder lebenden Entität, oder nil
context.playerAuslö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.

HookAkzeptierte Eingabe
on_attack_entityErfolgreicher, positiver nativer Nahkampfschaden mit dem Item in der Haupthand oder ein ausdrücklich vom Plugin verwalteter Angriff
on_projectile_hitErfolgreicher 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_damagePositiver Schaden am Spieler; geeignete ausgerüstete Slots werden geprüft
on_right_click, on_left_clickHandinteraktion ohne Schleichen
on_shift_right_click, on_shift_left_clickHandinteraktion beim Schleichen; ersetzt den entsprechenden gewöhnlichen Klick-Hook
on_break_blockAkzeptierter Blockabbau durch den Spieler mit dem Item in der Haupthand
on_chatAkzeptierter Chat, im Serverthread mit der Nachrichtenmomentaufnahme weitergeleitet
on_sneakBeginn des Schleichens; Ausrüstungsbeiträge werden pro Definition gesammelt
on_projectile_launchVerbrauchte verzauberte Munition, die aus einem Bogen-Event als Pfeil abgeschossen wird
on_game_tickTick, solange diese Aktivierung aktiv bleibt
on_zone_enter, on_zone_leaveSpieler ü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.

KontextInhalt
context.enchantmentid, level
context.parametersFür die Stufe aufgelöste Definitionsparameter
context.playerAktuelle Spielertabelle des Akteurs
context.targetAktuelle Tabelle der betroffenen lebenden Entität oder nil
context.sourceErfasste 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.itemHaltbarkeits- und Verbrauchsmethoden für den erfassten Slot, solange ein Inventaritem noch adressierbar ist; siehe Item-Methoden
context.actionid (Angriffs-UUID), instance (Aktivierungstoken), actor (UUID), world (Welt-UUID) und die folgenden Methoden
context.setFü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.

AktionsmethodeRückgabeVerhalten
stop()nilBeendet diese Aktivierung und räumt ihre verwaltete Arbeit auf
has_previous()boolPrüft auf eine andere aktive Instanz dieser Verzauberung für denselben Spieler
replace_previous()nilBeendet diese früheren Instanzen und behält die aktuelle bei
damage_target(target_uuid, amount)boolFordert den Provider auf, endlichen positiven Schaden mit der erfassten Quellenzuordnung anzuwenden; false bei Ablehnung
own_entity(uuid)boolRegistriert 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)boolStartet ein verwaltetes geskriptetes Projektil; Geschwindigkeit und Reichweite müssen endlich und positiv sein, ticks mindestens 1
attribute_projectile(uuid, callback, protect?=false)boolBindet den Schaden eines verwalteten nativen Projektils an einen eigenen Callback
place_block(x, y, z, expected_material, block_data)boolPlatziert über die Validierung von Spieler-Blockaktionen, sofern das aktuelle Material übereinstimmt
break_block(x, y, z, expected_material, drop_material?, amount?=1)boolBaut über die Validierung von Spieler-Blockaktionen ab, optional mit einem selbst definierten Item-Drop
break_naturally(x, y, z, expected_material)boolBaut 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)boolPrü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)boolStellt 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)boolStellt den von dieser Aktivierung übernommenen Trankeffekt vorzeitig wieder her
ride_rails(speed)boolSetzt 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-FeldBedeutung
piecesErforderlich. Ordnet Ausrüstungsslots Teilnamen zu. Ist validSlots gesetzt, muss es jeden Slot eines Teils enthalten
nameName, den $setName verwendet. Standardmäßig der name der Verzauberung; akzeptiert &-Farbcodes
loreDie Lore-Zeilen des Sets. Standardmäßig der Setname mit der Teileanzahl, danach eine Zeile pro Teil
equippedPieceZeile für ein getragenes Teil. Standard: &a✔ $pieceName
missingPieceZeile für ein fehlendes Teil. Standard: &c✘ $pieceName

Die Set-Lore akzeptiert diese Platzhalter:

PlatzhalterZeigt
$setNameDen Setnamen
$equippedPiecesWie viele Teile der Spieler trägt
$totalPiecesWie viele Teile das Set hat
$setPiecesEine Zeile pro Teil in Slot-Reihenfolge, aus equippedPiece oder missingPiece. Text rund um den Platzhalter wiederholt sich in jeder Zeile
$pieceName, $pieceSlotInnerhalb von equippedPiece und missingPiece den Teilnamen und seinen Slot, etwa Head oder Main Hand
$ifSetCompleteZeigt die Zeile nur, solange jedes Teil getragen wird
$ifSetIncompleteZeigt 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_entity oder on_break_block reagieren.
  • 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_damage setzt context.target auf den Angreifer, sofern es einen gibt.
  • context.source.item und context.item sind das erste Teil in Slot-Reihenfolge: HEAD, CHEST, LEGS, FEET, MAINHAND, OFFHAND. Lies context.source.equipment.MAINHAND für die gehaltene Waffe oder das gehaltene Werkzeug.
  • context.set.level ist die niedrigste Stufe unter den Teilen. context.set.pieces ist nach Slot geschlüsselt, mit name und inventory_slot jedes Teils.
  • stop_on_unequip: true beendet 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.