Minecraft Java Server Plugins Custom Model Data in 1.21.4+?

3 Antworten

Das geht leider nur über Umwege, da der Spielinhalt mehr oder weniger hardgecodet ist.

Da findet zwar ein Umdenken statt (die Material-Klasse ist z.B. keine enum mehr), aber so richtig Custom-Zeugs einfügen geht nach wie vor nicht wirklich.

Das Problem:

Fügst du z.B. einen Custom-Block serverseitig in die entsprechende Registry hinzu, muss dieses auch clientseitig geschehen, damit das funktioniert, wodurch ein normaler Vanilla-Client mit deinem Server nicht mehr kompatibel wäre. Und das kannst du vom Server aus nicht.

Das einzige clientseitige, das du serverseitig beeinflussen kannst, ist das Resource-Pack - und hier kommt CustomModelData ins Spiel.

Man muss tricksen:

  1. Du nimmst irgendein vorhandenes Item (z.B. Diamant-Schaufel) und flagst es zunächst mit einem Eintrag im PersistentDataContainer.
  2. Dann deaktivierst du die Vanilla-Funktion so weit möglich (u.a. indem du die Events abgreifst, die durch die Nutzung ausgelöst werden, das verwendete Item auf das Vorhandensein der Flag aus 1 prüfst und wenn es dein Custom-Item ist, cancelst du das Vanilla-Verhalten. z.B. im PlayerInteractEvent, so dass die Schaufel nicht mehr als Schaufel nutzbar ist.)
  3. Nun implementierst du die gewünschte neue Funktion des Items auf ähnliche Weise
  4. Dein Custom-Item funktioniert nun so, wie du es haben möchtest, aber es wird noch als normale Schaufel dargestellt. Daher gibst du ihm über CustomModelData (das ist nur ein Integer) einen Wert

Weiter geht es nun im Server-Resourcepack (musst eines erstellen und einbinden, falls noch nicht geschehen):

  1. Du erstellst ein Model und fügst es mitsamt der verwendeten Texturen in dein Resourcepack ein
  2. Du erstellst im Model des entsprechenden Vanilla-Item (hier die Diamand-Schaufel) einen Override, welches auf das Model aus Schritt 1 verweist.

Wenn du alles richtig gemacht hast, hast du nun dein Custom-Item erstellt, welches mit dem Vanilla-Client funktioniert.

Bei Entities ist das schwieriger: Hier musst du mit ArmorStands und/oder Display-Entities arbeiten, die du auf ähnliche Weise im PersistentDataContainer flaggst, wie beim Item. Du musst auch hier "deine" Entities "wiedererkennen" und entsprechenden Code implementieren, welches dem ganzen Leben einhaucht. Weil die Armorstand- und Displayentities auch wieder Nebenwirkungen haben und du ggf. mehrere benötigst, um ein komplexes Model mit Bewegung zu haben, ist es hier besser, mit Packets zu arbeiten (und serverseitig überhaupt gar keine echte Entitiy zu spawnen). Den ArmorStands und Display-Entities musst du dann Items hinzufügen, welche mit Custom-Texturen versehen sind, um das Entity-Model darzustellen.

Bei Blöcken ist nochmal schwieriger: Das sind nur passive Daten, wo du kaum Möglichkeiten hast, was eigenes "abzuzwacken". Auch hier muss mit Display-Entities gearbeitet werden (die du z.B. über einen Dirt-Block "rüberstülpst", um ihn mit einer Custom-Textur zu verkleiden).

Eine weiter (unsaubere) Möglichkeit: Die Notenblöcke haben ihre Noten und Instrumente als Blockdaten gespeichert. Wenn es dir irgendwie gelingt, alle Notenblöcke auf einen Blockzustand zu bringen und die ursprüngliche Notenblock-Funktionalität damit nachzubilden, werden die übrigen Blockzustände frei und du kannst diese (über einen entsprechenden Override im Resourcepack) mit Custom-Texturen zu versehen und deren gewünschtes Verhalten serverseitig implementieren. Ähnliches ist mit Pilzblöcken möglich.

Auch das Crafting usw. ist dann bisschen eklig.

Das ist alles hacky und sehr schwierig. Andere Optionen hast du nicht, wenn der Vanilla-Client funktionieren soll. Es gibt fertige Engine-Plugins, die all das für dich erledigen und eine API bereitstellen, die wesentlich einfacher zu handhaben ist, wie z.B. MythicMobs oder Item-Adder. Ich empfehle dir, sowas zu nutzen, wenn du kein "Magier" in der Programmierung bist. :)

Ich verstehe jetzt nicht genau was die Frage ist, deswegen erzähle ich dir einfach ein bisschen was über CustomModelData.

CustomModelData sind NBT Tags, welche auch Clientseitig übergeben werden und daher auch dort mit z.B. einem Resourcepack genutzt werden können.

In Java setzt du die CustonModel Data über die itemMeta und dann .setCustomModelData(Identifier).

Auslesen kann man den dann in einem Ressourcepack inetwa so

{
  "parent": "item/handheld",
  "textures": {
    "layer0": "item/wooden_sword"
  },
  "overrides": [
    {
      "predicate": {
        "custom_model_data": red
      },
      "model": "item/lightsaber_red"
    }
  ]
}

In diesem Beispiel wird ein Holzschwert, was als CustomModelData den Tag "red" hat mit einer neuen Textur welche ein rotes Lichtschwert ist, ersetzt.

Ich würde dir bei so welchen Fragen aber fast eher das SpigotMC Forum fragen, da dort mehr personen rumrennen, die Ahnung von dem Thema haben. Auch der PaperMC Discord ist ganz nett

Woher ich das weiß:eigene Erfahrung – Spiele seit der 1.7

Johannes2826 
Beitragsersteller
 30.05.2025, 16:16

Danke ich werde nochmal weiter im spigot forum weiter fragen

wenn nur Texturen geändert werden sollen kannst du ein Server texture pack in der server.propeties hinterlegen ansonsten wirds schwierig mit Vanilla denn neue Sachen die nicht Standart minecraf sind müssen immer beidseitig installiert sein