Haustier-Verhaltensmodule
Ein Haustier-Verhaltensmodul ist eine Lua-Datei, die Haustieren sagt, was sie tun sollen: ihrem Besitzer folgen, driften, ein Lagerfeuer umkreisen, stechen. Jede Haustier-Artdatei listet die Module auf, die ihre Haustiere ausführen, und gibt ihnen Einstellungen. Diese Seite richtet sich an Kreaturen-Autoren, die ein Modul ändern oder ein neues schreiben wollen. Um die mitgelieferten Module zu verwenden und anzupassen, siehe Haustiere.
Module verwenden denselben Lua-Dialekt wie die EliteMobs-Verhaltensprogramme: ai.module, ai.behavior, ai.sensor, ai.controls, typisierte Speicherwerte und den Kontext c.memory, c.perception, c.actuator und c.entity. Jene Seite behandelt die gemeinsamen Regeln. Diese Seite behandelt, was Haustiere hinzufügen: die Moduldateien, c.pet, c.settings und die Grenzen, unter denen Haustiere laufen.
Dateien
- Module liegen in
plugins/FreeMinecraftModels/pet_behaviors/, in diesem Ordner oder einem beliebigen Unterordner. Jede.lua-Datei dort ist ein Modul. - Der Name eines Moduls ist sein Dateiname ohne
.lua, kleingeschrieben. Er darf nur Buchstaben, Ziffern,.,_und-enthalten. Haustierdateien listen Module unter diesem Namen auf. - Die
ideines Moduls mussfmm:pet/gefolgt von seinem Namen sein,pet_behaviors/mine/slow_drift.luadeklariert alsoid = 'fmm:pet/slow_drift'. Ein Modul, dessen ID nicht zu seinem Dateinamen passt, wird mit einer Warnung übersprungen. - Teilen sich zwei Dateien einen Namen, wird die geladen, deren Pfad zuerst sortiert, und die Konsole meldet zur anderen die Warnung
Duplicate content filename. Eine byteidentische Kopie wird stillschweigend übersprungen. - Eine Datei oder ein Ordner, der aus
pet_behaviors/hinausverweist, wird übersprungen. - FreeMinecraftModels schreibt jedes seiner 15 mitgelieferten Module, wenn nirgends im Ordner eine Datei dieses Namens existiert. Ein gelöschtes kommt beim nächsten Laden mit der aktuellen mitgelieferten Version zurück. Eine bereits vorhandene Datei wird nie überschrieben, bearbeitet oder nicht, auch nicht, nachdem du sie in einen Unterordner verschoben hast. Sie behält also deine Änderungen und verpasst auch spätere Updates des mitgelieferten Moduls.
/fmm reloadliest jedes Modul und jede Haustierdatei neu ein, holt die Haustiere aus der Welt und bringt sie mit den neuen Modulen zurück. Ihre Speicherwerte beginnen leer. Du musst dierevisioneines Moduls nach dem Bearbeiten nicht erhöhen.
Von einer Kopie ausgehen
Die mitgelieferten Module sind die besten Beispiele: drift.lua bewegt einen Flieger, wander.lua läuft, night_glow.lua ist ein einzelner Sensor und sting.lua hat zwei. Beginne mit dem, das deinem Ziel am nächsten kommt.
- Kopiere es unter einem neuen Namen, zum Beispiel
pet_behaviors/mine/slow_drift.luaausdrift.lua. - Ändere seine
idzufmm:pet/slow_drift. - Benenne seine Speicherwerte, Verhalten und Sensoren so um, dass sie mit dem neuen Namen beginnen:
drift_towird zuslow_drift_to, inmemoriesund in jedem Aufruf vonc.memory, und dieid = 'fmm:pet/drift'des Verhaltens wird zufmm:pet/slow_drift. Zwei Module auf einer Kreatur können sich keinen Speichernamen, keine Verhaltens-ID und keine Sensor-ID teilen; das zweite aufgelistete wird mit einer Warnung ausgelassen. Durch das Umbenennen kann die Kopie neben dem Original laufen. - Liste es in der Haustierdatei anstelle des Originals auf:
- slow_drift, oder mit Einstellungen- slow_drift: { speed: 0.03 }. - Führe
/fmm reloadaus und prüfe die Konsole.
Ein mitgeliefertes Modul an Ort und Stelle zu bearbeiten funktioniert auch, ändert aber jede Art, die es auflistet.
Eine Moduldatei
Dieses Modul ist klein, aber vollständig. Nachts lässt sich das Haustier auf einer Stelle nahe seinem Anker nieder, statt zu driften, und spielt ab dem Moment, in dem es diese Stelle wählt, alle 10 Sekunden eine Animation ab.
-- At night: settles on one spot near its anchor (its owner, or home when wild) and plays an animation now and then.
return ai.module {
id = 'fmm:pet/night_rest', revision = 1,
-- radius: blocks around the anchor. speed: blocks per tick for a flyer, at species speed 1.
settings = { radius = 3, speed = 0.04, animation = 'interact' },
memories = { night_rest_to = 'position', night_rest_retry = 'integer' },
behaviors = {
ai.behavior {
id = 'fmm:pet/night_rest', priority = 12, probe_interval = 10,
controls = { ai.controls.move, ai.controls.look },
can_start = function(c)
return c.pet.night and not c.pet.staying and c.pet.anchor ~= nil
and c.tick >= (c.memory:get('night_rest_retry') or 0)
end,
can_continue = function(c)
return c.pet.night and not c.pet.staying and c.memory:contains('night_rest_to')
end,
start = function(c)
local anchor = c.pet.anchor
local to = anchor and c.pet:rest_point(anchor, c.settings.radius)
if to ~= nil then
c.memory:set('night_rest_to', to)
else
-- Nothing fits here: look again in 5 seconds instead of every tick.
c.memory:set('night_rest_retry', c.tick + 100)
end
end,
tick = function(c)
local to = c.memory:get('night_rest_to')
if to ~= nil then c.pet:steer_to(to, c.settings.speed * c.pet.species.speed) end
end,
stop = function(c)
c.memory:forget('night_rest_to')
c.pet:stop()
end
}
},
sensors = {
ai.sensor {
id = 'fmm:pet/night_rest_animation', interval = 200,
sense = function(c)
if c.memory:contains('night_rest_to') then c.pet:play_animation(c.settings.animation) end
end
}
}
}
Eine Haustierdatei listet es dann als - night_rest auf, oder als - night_rest: { radius: 5, animation: idle }.
| Feld | Hinweise |
|---|---|
id | Erforderlich. fmm:pet/ und der Dateiname |
revision | Erforderlich. Eine beliebige positive ganze Zahl |
settings | Optional. Die Standardwerte, die Haustierdateien ändern können. Der Typ jedes Standardwerts ist der Typ, den eine Haustierdatei angeben muss: eine Zahl, true/false, Text oder eine Liste aus Text. Siehe Einstellungswerte |
memories | Optional. Was sich das Modul für jedes Haustier merkt, nach Name und Typ: integer, number, boolean, string, uuid oder position. Beginne jeden Namen mit dem Namen des Moduls. Siehe Speicherwerte |
dependencies | Optional. IDs anderer Module in pet_behaviors/, die dieses braucht. Sie laufen auf jeder Kreatur, die dieses auflistet, mit ihren Standardeinstellungen, sofern die Haustierdatei sie nicht ebenfalls auflistet |
behaviors | Optional. Einträge ai.behavior { ... }, die das Haustier bewegen oder drehen |
sensors | Optional. Einträge ai.sensor { ... }, die das Haustier nie bewegen |
Code oberhalb von return, etwa lokale Funktionen und Konstanten, ist erlaubt; wander.lua und idle_look.lua enthalten solchen Code.
Was ein Callback erhält
| Name | Was es ist |
|---|---|
c.pet | Das Haustier, nur lesbar. Siehe c.pet |
c.settings | Die Einstellungen dieses Moduls: seine Standardwerte, überlagert von den Werten der Haustierdatei und der Variante, wie in c.settings.radius. Jedes Haustier hat seine eigene Kopie, Schreiben darauf ändert also nur dieses Haustier |
c.memory | get(name), set(name, value), forget(name) und contains(name) für die Namen in memories. Jedes Haustier hat seine eigenen |
c.tick | Der aktuelle Spiel-Tick, für Timer |
c.perception, c.actuator, c.entity | Der Mind-Kontext von MagmaCore, wie in den EliteMobs-Verhaltensprogrammen. c.entity ist der verborgene Körper, nicht das Modell. Siehe Kontext eines Mind-Programms. idle_look.lua verwendet c.perception:nearest_player(range) und c.actuator:look_at(point) |
c.pet
Ein Punkt ist eine Tabelle mit x, y und z und optional world, wie c.pet.position. Ein Punkt ohne world liegt in der Welt des Haustiers. Ein Punkt in einer anderen Welt zählt als nichts: Methoden antworten nil, false oder 0, und distance_to antwortet math.huge. Die Punkte, die c.pet zurückgibt, liegen immer in der Welt des Haustiers, und einer, der woanders läge, wird als nil gelesen.
- Methoden werden mit einem Doppelpunkt aufgerufen:
c.pet:distance_to(point). - Zahlenargumente müssen endlich sein. Radien, Tiefen, Höhen, Verstärker, Dauern und die anderen Bereiche sind wie unten aufgeführt begrenzt. Keine Methode lädt einen Chunk.
c.petundc.pet.speciessind nur lesbar. Eine Zuweisung darauf löst einen Fehler aus; halte Werte pro Haustier inc.memory.- Die Eigenschaften und
route_target()sind eine Momentaufnahme: Jede wird einmal pro Haustier-Tick gelesen und bleibt in jedem Callback dieses Ticks gleich.c.pet:teleport_near_ownerundc.pet:stopaktualisieren sie. Eine auf andere Weise vorgenommene Bewegung, etwa durchc.entity:teleport, zeigt sich im nächsten Tick.speedist die Ausnahme und wird immer frisch gelesen. - Jedes Lesen einer Position liefert eine neue Tabelle, die das Modul ändern darf.
Eigenschaften
| Name | Typ | Wert |
|---|---|---|
wild | bool | true für ein wildes Haustier, false für eines im Besitz |
staying | bool | Ihm wurde befohlen zu bleiben |
settled | bool | Frei umherstreifend: Ihm wurde nicht befohlen zu bleiben, und es ist wild oder innerhalb von follow.distance seines Besitzers |
baby | bool | Ein Baby |
migrating | bool | Fliegt eine nächtliche Wanderroute |
model | string | Das Modell seiner Variante. Ein Baby mit babyModel liest weiterhin seine Variante |
position | point | Wo sein Körper ist |
home | point/nil | Wo ein wildes Haustier lebt; nil bei einem Haustier im Besitz |
anchor | point/nil | Worum es streift: sein Besitzer, bei einem wilden Haustier seine Heimat oder, falls es keine hat, sein aktueller Ort. nil, wenn der Besitzer offline oder in einer anderen Welt ist |
stay_anchor | point/nil | Der Platz, an dem es bleiben sollte; nil, wenn es nicht bleibt |
owner_location | point/nil | nil bei einem wilden Haustier oder wenn der Besitzer offline, tot oder in einer anderen Welt ist |
owner_distance | number | Blöcke bis zum Besitzer; math.huge, wenn es in dieser Welt keinen gibt |
night, day | bool | day nur bei Tageslicht in einer normalen Welt; Abenddämmerung, Morgendämmerung, der Nether und das End zählen als night |
raining | bool | Regen fällt auf das Haustier, höchstens alle 10 Ticks geprüft |
speed | number | Die aktuelle Geschwindigkeit seines Körpers in Blöcken pro Tick |
route_cruise | number | Die Reisegeschwindigkeit seines Schwarms bei einer Wanderung, sonst 0 |
species | table | Die Zahlen aus der Haustierdatei, unten |
c.pet.species enthält:
| Feld | Schlüssel der Haustierdatei |
|---|---|
id | species |
speed | follow.speed |
hover_height | float.hoverHeight |
hover_variance | float.hoverVariance |
roam_radius | follow.roamRadius |
follow_distance | follow.distance |
leash_distance | follow.leashDistance |
teleport_distance | follow.teleportDistance |
scale | scale |
baby_scale | babyScale |
Bewegung
Rufe diese nur aus start, tick oder stop eines Verhaltens auf, in einem Verhalten, dessen controls das Nötige auflisten. Aus can_start oder einem Sensor lösen steer_to und stop einen Fehler aus, der sagt, wohin sie gehören.
| Methode | Gibt zurück | Was sie tut |
|---|---|---|
steer_to(point, cruise) | bool | Ein Tick in Richtung des Punktes, rufe sie also in jedem Tick auf. Braucht move und look. Ein Flieger fliegt mit cruise Blöcken pro Tick (0 bis 4) und wird beim Ankommen langsamer. Ein Läufer oder Schwimmer findet dorthin nativ seinen Weg mit dem 4 × cruise-Fachen der Bewegungsgeschwindigkeit seines Körpertyps, nie unter einem Viertel davon; ein cruise von 0 hält ihn an und gibt false zurück. false, wenn es dort nicht hingelangen kann |
stop() | nil | Hört auf, sich zu bewegen. Braucht move |
teleport_near_owner(radius) | bool | Setzt den Körper neben seinen Besitzer, innerhalb von radius Blöcken (bis zu 64), in seinem eigenen Medium; ein Schwimmer sucht Wasser innerhalb von radius oder 6 Blöcken, je nachdem, was größer ist. Ein Läufer oder Schwimmer landet mindestens einen Block vom Besitzer entfernt. false, wenn der Besitzer fort oder in einer anderen Welt ist, nichts passt oder der Ort nicht mindestens einen Block näher am Besitzer liegt, als das Haustier ist. Sie braucht keine Steuerung, rufe sie aber aus einem Verhalten auf, das move hält, wie es follow_owner tut, damit sie das Haustier nicht von einem anderen Verhalten wegzieht |
Orte und Entfernungen
Diese funktionieren aus jedem Callback. Die, die einen Punkt zurückgeben, geben nil zurück, wenn nichts passt oder der Chunk nicht geladen ist. Radien reichen bis 64.
| Methode | Gibt zurück | Was sie tut |
|---|---|---|
hover_point(center, radius) | point/nil | Ein Punkt in seinem Schwebebereich innerhalb von radius |
rest_point(center, radius) | point/nil | Ein Ruheplatz in seinem eigenen Medium: der Schwebebereich bei einem Flieger, Standboden bei einem Läufer oder einem stationären Körper, Wasser bei einem Schwimmer (auf der Höhe von center, wenn center im Wasser liegt, sonst 0,5 bis 2 Blöcke unter der Oberfläche) und Boden oder sonst Wasser bei einem amphibischen Körper |
ground_point(center, radius) | point/nil | Ein Standplatz, von etwa 5 Blöcken unter bis 4 über center. nil über Flüssigkeit oder einem tiefen Fall |
water_point(center, radius, min_depth, max_depth) | point/nil | Eine Schwimmstelle zwischen den beiden Tiefen unter der Oberfläche (0 bis 16) |
ground_below(point, depth) | number/nil | Die Höhe der Oberseite des Bodens innerhalb von depth Blöcken nach unten (1 bis 64). Eine Wasser- oder Lavaoberfläche zählt als Boden, außer die Art ist AQUATIC. Ohne Boden in Reichweite die Höhe des Punktes minus depth |
trail_point(back, height) | point/nil | back Blöcke hinter der Blickrichtung des Besitzers, height über seinen Füßen bei einer FLYING-Art und sonst an seinen Füßen. nil, wenn der Besitzer fort oder in einer anderen Welt ist |
distance_to(point) | number | Blöcke von seinem Körper |
route_target() | point/nil | Wohin seine Wanderroute es in diesem Tick haben will. nil, wenn es nicht wandert oder die Route zu Ende ist |
find_perch(height, radius) | point/nil | height Blöcke (0 bis 8) über dem nächsten Laub unter ihm, bis zu radius Blöcke (0 bis 4) zur Seite, oder über dem Boden direkt unter ihm. Ein Haustier im Besitz erhält nur einen Sitzplatz innerhalb von follow.distance seines Besitzers |
nearest_campfire(radius, keep_ticks, blocks, soul_variants, height) | point/nil | Der Block des nächsten brennenden Feuers, das es innerhalb von radius (1 bis 32) nutzen darf. blocks listet die Feuerarten auf, die es nimmt, CAMPFIRE, SOUL_CAMPFIRE oder beide, und eine Liste, die keine von beiden nennt, nimmt beide; soul_variants listet die Modelle auf, die nur Seelen-Lagerfeuer nehmen, und jedes andere Modell nimmt dann nur normale. Ein Haustier im Besitz nimmt nur ein Feuer, dessen Punkt height darüber innerhalb von follow.distance minus 1 von seinem Besitzer liegt. Die Suche jedes Chunks wird keep_ticks (20 bis 1200) lang gehalten und von allen Haustieren geteilt |
campfire_usable(fire, blocks, soul_variants, height) | bool | Ob ein zuvor gefundenes Feuer noch brennt und noch passt |
Effekte
Diese funktionieren aus jedem Callback; Sensoren sind der übliche Ort.
| Methode | Gibt zurück | Was sie tut |
|---|---|---|
set_glow(light, lantern_bone, animation) | nil | Beleuchtet die Anzeige-Bones des Modells mit light (0 bis 15), für Java-Spieler. Ein Modell mit einem Bone namens lantern_bone loopt außerdem animation. Die letzten beiden sind optional |
clear_glow() | nil | Zurück zum Weltlicht, beendet diese Animation |
scale_toward(target, span, ticks, elapsed) | nil | Lässt die Größe des Körpers sanft auf target mal seine Basisgröße zugehen. Eine volle Änderung von 1 auf span dauert ticks (mindestens 2); elapsed sind die Ticks seit dem letzten Aufruf. Multiplikatoren 0.1 bis 16 |
sting_contacts(on, effect, duration, amplifier, damage, cooldown) | number | Sticht die Spieler, deren Berührung das Modell eines wilden Haustiers in der letzten Sekunde erreicht hat, nie einen im Kreativ- oder Zuschauermodus, und gibt zurück, wie viele. Sie löscht die Berührungen auch bei on gleich false. Haustiere im Besitz zeichnen keine Berührungen auf |
sting_enemies(reach, effect, duration, amplifier, damage, cooldown) | number | Sticht feindliche Mobs innerhalb von reach Blöcken (0 bis 4) von der Hitbox des Modells, nie Spieler oder Haustiere, und gibt zurück, wie viele |
drizzle(depth, chance) | bool | Schwebt das Haustier ruhig über einer Nutzpflanze innerhalb von depth Blöcken (1 bis 8), gibt es Wasserpartikel und eine Wahrscheinlichkeit chance (0 bis 1), dass die Pflanze eine Stufe wächst. true, wenn es über einer Nutzpflanze ist |
owner_effect(effect, duration, amplifier, range) | bool | Gibt dem Besitzer den Trankeffekt für duration Ticks (1 bis 6000), wenn er sich innerhalb von range Blöcken befindet, ohne Partikel. Ein Effekt, den der Besitzer schon hat und der mindestens gleich stark ist und mindestens gleich lange hält, bleibt unangetastet. false, wenn der Besitzer fort, in einer anderen Welt oder außer Reichweite ist oder der Effekt nicht existiert |
play_animation(name) | bool | Spielt eine der Animationen des Modells einmal ab. false, wenn das Modell sie nicht hat |
Bei beiden Stichen ist effect ein Trankeffektname oder NONE, duration in Ticks (1 bis 6000), amplifier 0 ist Stufe I (bis zu 255), damage in halben Herzen, und cooldown sind die Ticks (mindestens 1), bevor dieses Haustier dasselbe Opfer erneut stechen kann. Ein Stich zeigt Funken und spielt ein Bienenstich-Geräusch ab, und ein ausgewachsenes Tier spielt seine Animation attack ab. Zu einem Trankeffektnamen, den es nicht gibt, erscheint pro Art und Name einmal eine Warnung, und er wendet nichts an.
Verhalten und Sensoren
- Ein Verhalten bewegt oder dreht das Haustier. Es listet die Steuerungen auf, die es braucht,
ai.controls.moveundai.controls.lookfür die Bewegungsaufrufe vonc.pet, und nur ein Verhalten hält eine Steuerung gleichzeitig. Solange es gestoppt ist, fragt MagmaCore seincan_start. Gibt dastruezurück und sind die Steuerungen frei, übernimmt es sie und führtstartaus, dann in jedem Ticktick, solangecan_continuetruezurückgibt (ohnecan_continueentscheidetcan_start), dannstop. Siehe Lebenszyklus. - Die niedrigere
priority-Zahl kommt zuerst. Ein Verhalten nimmt einem laufenden mit einer höheren Zahl die Steuerungen ab, dessenstopdann läuft. Die12aus dem Beispiel lässt Folgen und Bleiben vor dem Modul stehen und stellt es vor Driften und Schweben, aber auch vorcampfire; ein Haustier, das beide auflistet, besucht nachts also nie ein Feuer. Eine Zahl über15würde das Feuer gewinnen lassen. - Ein Verhalten konkurriert nur um die Steuerungen, die es auflistet.
idle_looknimmt nurlook, läuft also, solange kein Verhalten den Blick hält; jedes mitgelieferte Bewegungsverhalten nimmtlookebenfalls, daher gewinnt Bewegung immer darüber. - Eine Haustierdatei kann keine Priorität ändern. Zum Umordnen kopiere das Modul und ändere die Zahl.
probe_intervalist optional, in Ticks: Solange das Verhalten gestoppt ist, wirdcan_startnur alle so vielen Ticks gefragt, auf der eigenen Phase jedes Haustiers. Das spart Serverzeit, wenn viele Haustiere draußen sind, auf Kosten eines um bis zu so viele Ticks verspäteten Starts. Der Standard ist1; Werte über200zählen als200. Ein laufendes Verhalten läuft weiterhin in jedem Tick.- Ein Sensor bewegt das Haustier nie. Er führt
senseim ersten Tick aus, in dem der Körper des Haustiers tickt, dann alleintervalTicks auf der eigenen Phase des Haustiers, egal was die Verhalten gerade tun. Leuchten, Anschwellen, Stiche, Nieselregen und Besitzereffekte sind Sensoren.
Die mitgelieferten Module verwenden:
| Modul | Priorität | probe_interval | Sensor-interval |
|---|---|---|---|
migrate | 1 | 10 | |
stay | 5 | 4 | |
follow_owner | 10 | 4 | |
campfire | 15 | 10 | |
day_perch | 18 | 10 | |
rain_bloom | 19 | 10 | 4 (Anschwellen) |
drift, wander, swim | 20 | 10 | |
hover | 30 | 4 | |
idle_look | 30 | 10 | |
night_glow | 40 | ||
sting | 4 (Spieler), 10 (Mobs) | ||
crop_drizzle | 20 | ||
owner_effect | 20 |
Regeln
- Rufe
steer_toundstopnur ausstart,tickoderstopeines Verhaltens auf, in einem Verhalten, das die Steuerungen auflistet, die sie brauchen. - Halte Zustand pro Haustier in
c.memory, deklariert untermemories, mit Namen, die mit dem Namen des Moduls beginnen. - Schreibe nicht in
c.pet; eine Zuweisung darauf löst einen Fehler aus. - Halte Callbacks kurz. Jedes Haustier läuft unter diesen festen Grenzen, die Module und Haustierdateien nicht ändern können:
| Grenze | Wert |
|---|---|
| Ein Callback | 1,5 ms |
| Die Callbacks eines Haustiers in einem Tick | 3 ms, höchstens 32 Callbacks |
| Die Callbacks aller Haustiere in einem Tick | 10 ms |
| CPU-Zeit eines Callbacks, harte Grenze | 20 ms |
| Lua-Anweisungen eines Callbacks, harte Grenze | 20.000 |
Erreicht ein Haustier eine der ersten drei Grenzen, warten seine übrigen Callbacks auf den nächsten Tick. Ein Callback, der eine harte Grenze überschreitet, wird gestoppt und schlägt wie ein Fehler fehl. Siehe Budgets.
Wenn etwas nicht stimmt
Nichts hiervon stoppt den Server oder die anderen Kreaturen. Suche in der Konsole nach pet behavior, pet_behaviors und .pet.yml, um diese Warnungen zu finden.
- Ein Modul wird nicht geladen. Ein Modul, das nicht kompiliert, dessen ID nicht zu seinem Dateinamen passt oder dessen Dateiname andere Zeichen enthält, wird mit einer Warnung übersprungen, die die Datei nennt, bei einem Lua-Fehler auch die Zeile. Jedes andere Modul wird weiterhin geladen.
- Eine Haustierdatei nennt ein Modul, das es nicht gibt. Die Warnung nennt die Haustierdatei und schlägt den nächstliegenden Modulnamen vor, wenn einer nur um ein oder zwei Buchstaben abweicht. Die Kreatur wird ohne es geladen. Existiert das Modul, ließ sich aber nicht laden, verweist die Warnung auf die Warnung zu seiner Datei.
- Eine Einstellung ist falsch. Eine Einstellung, die das Modul nicht hat, oder ein Wert des falschen Typs wird mit dem Namen der Haustierdatei gemeldet, und der Standardwert bleibt. Siehe Einstellungswerte.
- Zwei Module kollidieren. Deklarieren zwei Module einer Kreatur denselben Speichernamen, dieselbe Verhaltens-ID oder dieselbe Sensor-ID, behält die Kreatur das erste in der Liste und läuft mit einer Warnung ohne das andere.
- Ein Callback schlägt fehl, während Haustiere laufen. Das wird bis zum nächsten Reload einmal pro Programm, Callback und Fehlerart protokolliert. Programme heißen
fmm:pet/creature/<species>/<variant>, und Callbacks nach ihrer Verhaltens- oder Sensor-ID, etwafmm:pet/drift.tick. Ein fehlgeschlagenes Verhalten wird gestoppt oder nicht gestartet und ab dem nächsten Tick erneut versucht; solange es weiter fehlschlägt, laufen Verhalten mit höheren Prioritätszahlen, die das Haustier bewegen oder drehen, womöglich nicht. Ein fehlgeschlagener Sensor läuft in seinem nächsten Intervall erneut. - Ein Aufruf von
c.petschlägt in FreeMinecraftModels fehl. Die Ursache wird einmal pro Art und Aufruf mit ihrem Stacktrace protokolliert, und der Callback schlägt mitc.pet:<method> failed; the server log has the causefehl. - Ein Trankeffektname existiert nicht. Dazu erscheint einmal pro Art und Name eine Warnung, und der Aufruf wendet keinen Effekt an.
Führe nach einer Korrektur /fmm reload aus.