Lua-Scripting: Fehlerbehebung
Diese Seite behandelt häufige Probleme, die beim Schreiben oder Debuggen von FreeMinecraftModels-Prop-Skripten auftreten können, sowie Tipps zur Arbeit mit dem System der verzögerten Konfigurationsgenerierung. Funktionierende Beispiele finden Sie unter Beispiele & Muster. Wenn Sie gerade erst anfangen, lesen Sie Erste Schritte.
Häufige Probleme
1. Konfigurationsdatei wird nicht geladen / Skript nicht zugewiesen
Symptom: Das Prop erscheint, reagiert aber nicht auf Klicks oder irgendwelche Hooks.
Ursachen und Lösungen:
-
Es existiert noch keine
.yml-Konfigurationsdatei. FMM generiert die Konfiguration verzögert beim ersten Spawn des Props. Beim ersten Spawn eines Modells erstellt FMM die.yml-Konfiguration asynchron mit Standardwerten (aktiviert, keine Skripte). Sie müssen die generierte Konfiguration bearbeiten, um Ihre Skript-Dateinamen hinzuzufügen, und dann das Prop erneut spawnen. -
Die Konfiguration enthält
isEnabled: false. Öffnen Sie die.yml-Datei neben der Modelldatei und setzen SieisEnabled: true. -
Die
scripts:-Liste ist leer. Fügen Sie Ihre Skript-Dateinamen hinzu:isEnabled: true
scripts:
- my_script.lua -
Der
.yml-Dateiname stimmt nicht mit dem Modelldateinamen überein. Die Konfiguration muss denselben Basisnamen wie die Modelldatei haben. Zum Beispiel benötigttorch_01.fmmodeleinetorch_01.ymlim selben Verzeichnis.
2. Skriptdatei nicht gefunden
Symptom: Die Konsole zeigt: [FMM Scripts] Script 'my_script.lua' not found in scripts/ folder
Ursachen und Lösungen:
-
Falsches Verzeichnis. Skriptdateien müssen sich in
plugins/FreeMinecraftModels/scripts/befinden, nicht neben der Modelldatei. -
Dateiname stimmt nicht überein. Der Name in der
.yml-Konfiguration muss exakt mit dem Dateinamen imscripts/-Ordner übereinstimmen, einschließlich Groß-/Kleinschreibung und der.lua-Erweiterung. -
Datei nicht vorhanden. Überprüfen Sie, ob die
.lua-Datei tatsächlich imscripts/-Ordner existiert.
3. Skript wird überhaupt nicht geladen
Symptom: Kein Konsolenfehler, aber keine Hooks werden ausgelöst.
Überprüfen Sie die Serverkonsole auf Lua-Syntaxfehler beim Start. Die häufigsten Ursachen sind:
- Fehlendes
endzum Schließen einer Funktion oder einesif-Blocks - Nicht übereinstimmende Klammern
- Fehlende Kommas zwischen Hook-Definitionen in der zurückgegebenen Tabelle
- Datei endet nicht mit
.lua
Wenn ein Lua-Fehler vorliegt, gibt die Konsole einen [Lua]-Fehlerblock mit Dateiname, Zeilennummer und einer Beschreibung aus.
4. Hook wird nie ausgelöst
Symptom: Das Skript wird geladen (Sie sehen die Meldung [FMM Scripts] Bound script), aber ein bestimmter Hook wird nie ausgelöst.
Überprüfen Sie, ob der Hook-Name genau so geschrieben ist, wie in der Hook-Referenz aufgeführt. Häufige Fehler:
| Falscher Name | Korrekter Name |
|---|---|
on_click | on_right_click oder on_left_click |
on_interact | on_right_click |
on_hit | on_left_click |
on_tick | on_game_tick |
on_remove | on_destroy |
on_arrow_hit | on_projectile_hit |
Überprüfen Sie außerdem, ob das Prop tatsächlich eine Armor-Stand-Entity besitzt. Manche Prop-Konfigurationen erzeugen möglicherweise keine klickbare Entity.
5. Zeitüberschreitung / Ausführungsbudget überschritten
Symptom: Die Konsole zeigt eine Meldung wie:
[Lua] my_script.lua took 73ms in 'on_game_tick' (limit: 50ms) -- script disabled to prevent lag.
Das Skript hat in einem einzelnen Hook-Aufruf zu viel Arbeit verrichtet. Häufige Ursachen:
- Iteration über zu viele Entities in
on_game_tick - Erzeugung zu vieler Partikel pro Tick
- Ausführung aufwendiger Schleifen ohne Verteilung der Arbeit über mehrere Ticks
Lösung: Verschieben Sie aufwendige Arbeit hinter einen zustandsbasierten Cooldown oder verwenden Sie scheduler:run_repeating() mit einem angemessenen Intervall anstelle von on_game_tick.
6. context.event ist nil in einem Click-Hook
Dies sollte normalerweise bei on_left_click und on_right_click nicht vorkommen, aber schützen Sie sich immer mit:
if context.event then
context.event.cancel()
end
Innerhalb von Scheduler-Callbacks ist context.event immer nil -- dies ist erwartetes Verhalten. Event-Modifikation ist nur innerhalb des Event-Hooks selbst möglich.
7. Animation wird nicht abgespielt
Symptom: play_animation() gibt false zurück, oder es passiert nichts Sichtbares.
Ursachen und Lösungen:
-
Falscher Animationsname. Der Name muss exakt mit dem übereinstimmen, was in der Modelldatei definiert ist. Überprüfen Sie Ihre
.bbmodel- oder.fmmodel-Datei auf den korrekten Animationsnamen. -
Modell hat keine Animationen. Nicht alle Modelle haben Animationen. Überprüfen Sie, ob die Modelldatei tatsächlich Animationsdaten enthält.
-
Spieler sind nicht in Ressourcenpaket-Reichweite. Die Animation ist serverseitig, aber Spieler müssen das FMM-Ressourcenpaket geladen haben, um das Modell überhaupt sehen zu können.
8. Partikel erscheinen nicht
- Überprüfen Sie, ob der Partikelname ein gültiger Bukkit-
Particle-Enum-Wert in GROSSBUCHSTABEN ist:"FLAME", nicht"flame". - Überprüfen Sie, ob sich die Position in einem geladenen Chunk befindet. Wenn keine Spieler in der Nähe sind, ist der Chunk möglicherweise nicht geladen.
- Überprüfen Sie, ob
countmindestens 1 beträgt. - Einige Partikel (wie
DUST) benötigen spezifische Zusatzdaten, die das grundlegendespawn_particle()möglicherweise nicht unterstützt. Verwenden Sie Standard-Partikel wieFLAME,HEART,HAPPY_VILLAGER,NOTE,ENCHANTusw.
9. Sound wird nicht abgespielt
- Überprüfen Sie, ob der Soundname eine gültige Bukkit-
Sound-Enum-Konstante in GROSSBUCHSTABEN ist. Beispiel:"BLOCK_NOTE_BLOCK_HARP", nicht"block.note_block.harp". - Überprüfen Sie, ob die Positionskoordinaten korrekt sind (nicht alle Null oder NaN).
- Überprüfen Sie, ob die Lautstärke größer als 0 ist.
10. Zustand wird unerwartet zurückgesetzt
context.state ist pro Prop-Instanz und bleibt während der Lebensdauer des Props bestehen. Wenn der Zustand zurückgesetzt zu werden scheint:
- Das Prop wurde möglicherweise entfernt und erneut gespawnt (jeder Spawn erstellt eine neue Instanz).
- Sie lesen möglicherweise den Zustand in einem Scheduler-Callback mit der falschen Context-Variable. Verwenden Sie immer den eigenen Context-Parameter des Callbacks.
Funktionsweise der verzögerten Konfigurationsgenerierung
Das Verständnis des Systems der verzögerten Konfiguration hilft, Verwirrung bei der Einrichtung neuer Props zu vermeiden:
-
Erster Spawn: Wenn ein Prop gespawnt wird und keine zugehörige
.yml-Datei existiert, erstellt FMM die Konfiguration asynchron. Das bedeutet, die Datei wird in einem Hintergrund-Thread geschrieben und ist nicht sofort verfügbar. -
Standardwerte: Die generierte Konfiguration hat
isEnabled: trueund eine leerescripts: []-Liste. -
Keine Skripte beim ersten Spawn: Da die Konfiguration erstellt wird, nachdem das Prop bereits gespawnt wurde (und keine Skripte aufgelistet sind), hat das Prop beim ersten Spawn keine Skripte zugewiesen.
-
Bearbeiten und erneut spawnen: Nachdem FMM die Konfiguration erstellt hat, bearbeiten Sie sie, um Ihre Skript-Dateinamen hinzuzufügen. Beim nächsten Spawn des Props werden die Skripte geladen.
-
Speicherort der Konfiguration: Die
.yml-Datei wird im selben Verzeichnis wie die Modelldatei erstellt, mit demselben Basisnamen. Zum Beispiel:- Modell:
plugins/FreeMinecraftModels/models/fountain.fmmodel - Konfiguration:
plugins/FreeMinecraftModels/models/fountain.yml
- Modell:
- Modell in
models/ablegen - Skript in
scripts/ablegen - Das Prop einmal spawnen (generiert die
.yml) - Die
.ymlbearbeiten undscripts: [my_script.lua]hinzufügen - Das Prop erneut spawnen -- Skript ist jetzt aktiv
Fehlermeldungen lesen
Wenn etwas in einem Lua-Prop-Skript schiefgeht, gibt die Konsole einen [Lua]-Fehlerblock aus. Diese Meldungen sagen Ihnen genau, welche Datei, welche Zeile, welcher Hook und was in verständlicher Sprache schiefgelaufen ist.
Ein typischer Fehler sieht so aus:
[Lua] Error in 'my_door.lua' at line 12 during 'on_right_click':
[Lua] -> You tried to call a method or function that doesn't exist.
[Lua] -> Check the method name for typos, or make sure you're using ':' (colon) for method calls, not '.' (dot).
[Lua] -> Script has been disabled for this entity to prevent further errors.
Das System übersetzt häufige Lua-Fehler in verständliche Sprache:
| Roher Lua-Fehler | Was die Konsole Ihnen mitteilt |
|---|---|
attempt to call nil | Sie haben versucht, eine Methode oder Funktion aufzurufen, die nicht existiert. Prüfen Sie auf Tippfehler und die Verwendung von : vs. .. |
index expected, got nil | Sie haben versucht, auf ein Feld von etwas zuzugreifen, das nil ist. Prüfen Sie, ob es durch vorherigen Code initialisiert wurde. |
attempt to index | Sie haben versucht, auf eine Eigenschaft eines nil- oder ungültigen Werts zuzugreifen. |
bad argument | Eine Funktion hat den falschen Argumenttyp erhalten. Die Meldung zeigt den erwarteten und den tatsächlichen Typ. |
| Timeout | Ihr Skript hat Xms in 'hook_name' benötigt (Limit: 50ms) -- Skript wurde deaktiviert, um Lag zu verhindern. |
Lesen Sie immer die vollständige [Lua]-Fehlermeldung, bevor Sie in den Code eintauchen. Sie weist Sie in der Regel direkt auf die Lösung hin.
Gehen Sie nicht von undokumentierten Methoden aus
Die FMM-Lua-API stellt einen bestimmten Satz von Methoden bereit. Gehen Sie nicht davon aus, dass Kurznamen oder alternative Bezeichnungen existieren. Häufige Fehler:
context.prop:get_location()-- existiert nicht. Verwenden Siecontext.prop.current_location(ein Feld, keine Methode).context.prop:set_animation("open")-- existiert nicht. Verwenden Siecontext.prop:play_animation("open", true, true).context.event:setCancelled(true)-- existiert nicht. Verwenden Siecontext.event.cancel().context.cooldowns:check_local(...)-- existiert nicht in FMM. Verwenden Siecontext.statemitscheduler:run_later()für Cooldowns.context.player-- existiert nicht in FMM-Prop-Skripten. Verwenden Siecontext.world:get_nearby_players(), um Spieler in der Nähe des Props zu finden.context.boss-- existiert nicht. Das gehört zu EliteMobs. Verwenden Siecontext.propin FMM.
Im Zweifelsfall konsultieren Sie die Prop-API-Seite. Wenn es dort nicht dokumentiert ist, existiert es nicht.
Debug-Tipps
1. Verwenden Sie context.log:info() großzügig
Fügen Sie beim Debuggen an jeder Stelle Log-Meldungen hinzu:
on_right_click = function(context)
context.log:info("Right click received!")
context.log:info("Event present: " .. tostring(context.event ~= nil))
context.log:info("State is_open: " .. tostring(context.state.is_open))
end
2. Überprüfen Sie die Konsole beim Start
FMM protokolliert [FMM Scripts] Bound script 'X' to prop 'Y' für jede erfolgreiche Bindung. Wenn Sie diese Meldung nicht sehen, wurde die Konfiguration oder das Skript nicht geladen.
3. Überprüfen Sie den Modelldateipfad
Die .yml-Konfiguration muss eine Nachbardatei der Modelldatei sein (gleiches Verzeichnis, gleicher Basisname). Überprüfen Sie dies anhand von:
- Modelldateipfad:
plugins/FreeMinecraftModels/models/my_model.fmmodel - Konfigurationsdateipfad:
plugins/FreeMinecraftModels/models/my_model.yml
4. Testen Sie Hooks einzeln
Wenn Sie ein komplexes Skript erstellen, testen Sie zunächst jeden Hook einzeln. Fügen Sie jeweils einen Hook hinzu und überprüfen Sie, ob er ausgelöst wird, bevor Sie zum nächsten übergehen.
5. Prüfen Sie auf Tippfehler in Hook-Namen
Der häufigste Grund, warum ein Hook nicht ausgelöst wird, ist ein falsch geschriebener Hook-Name. Das Skript wird ohne Fehler geladen, aber die falsch geschriebene Hook-Funktion wird bei der Validierung abgelehnt.
Lernpfad für Einsteiger
Wenn Sie dieses System von Grund auf lernen möchten, funktioniert dieser Lernpfad gut:
- Schreiben Sie eine Datei mit nur
api_version = 1undon_spawn, das eine Nachricht protokolliert. - Fügen Sie das Skript einer Prop-Konfiguration hinzu und überprüfen Sie, ob die Log-Nachricht erscheint.
- Fügen Sie
on_right_clickhinzu und protokollieren Sie, wenn das Prop angeklickt wird. - Fügen Sie
on_left_clickmitcontext.event.cancel()für Unverwundbarkeit hinzu. - Spielen Sie eine Animation bei Rechtsklick ab.
- Fügen Sie einen Sound bei Rechtsklick hinzu.
- Fügen Sie Zustand und Umschaltverhalten hinzu.
- Fügen Sie eine Zonenüberwachung zur Näherungserkennung hinzu.
- Gehen Sie erst dann zu komplexen Multi-Hook-Skripten mit Schedulern über.
Jeder Schritt baut auf dem vorherigen auf, und Sie können in jedem Stadium testen.
Nächste Schritte
- Erste Schritte -- Dateistruktur, Hooks, Walkthrough zum ersten Skript, Kopiervorlagen
- Prop-API -- vollständige API-Referenz
- Beispiele & Muster -- vollständige funktionierende Skripte zum Studieren und Anpassen