Zum Hauptinhalt springen

Bevor du beginnst!

FreeMinecraftModels (FMM) befindet sich derzeit in aktiver Entwicklung! Das bedeutet, dass einige Funktionen noch nicht fertiggestellt sind und aktiv daran gearbeitet wird.

Der Kern des Plugins ist jedoch zu diesem Zeitpunkt voll funktionsfähig - das Konvertieren von bbmodel-Dateien, das Generieren von Resource Packs, das Spawnen von Entities im Spiel und die Verwaltung ihrer Animationen sowie die Möglichkeit, persistente Props zu platzieren, funktioniert alles größtenteils.

Unterstütze die Entwicklung unter https://www.patreon.com/magmaguy !

Die exportierten Resource Pack-Inhalte sind auf FreeMinecraftModels' Seite unter der CC0-Lizenz lizenziert, keine Rechte vorbehalten. Du kannst sie frei verwenden, verteilen und für beliebige Zwecke modifizieren, ohne Einschränkungen oder die Notwendigkeit einer Namensnennung.

Verwendung dieses Plugins

Was kann FreeMinecraftModels (FMM) für Minecraft-Serveradministratoren tun?

Es kann:

  • .bbmodel- oder fmmodel-Modelle (FFMs benutzerdefiniertes Format) importieren
  • Resource Packs mit Modellen generieren, die normale Minecraft Resource Pack-Modellgrenzen überschreiten (bis zu 112x112x112 Einheiten oder 7x7x7 Blöcke im Spiel, funktional unbegrenzt bei Verwendung mehrerer Bones)
  • Diese Modelle im Spiel anzeigen, wobei spezifische bedrock-kompatible Pakete an Bedrock-Clients und Display Entities an 1.19.4+ Java-Clients gesendet werden
  • Diese Modelle animieren, wie sie in Blockbench für die Animation konfiguriert wurden
  • Standardzustandsanimationen ohne andere Plugins handhaben (walk, idle, death, attack, spawn)
  • Hitboxen handhaben, die sich mit der zugrunde liegenden Entity drehen und unterschiedliche x- und z-Achsen haben
  • Drei Arten von Modellen verwalten: static, dynamic und props
    • Props sind persistent und können so in der Welt platziert werden, dass sie auch nach einem Serverneustart bestehen bleiben. Es ist möglich, Karten mit Props auf andere Server zu verteilen
    • Dynamic Modelle sind für Modelle gedacht, die eine zugrunde liegende lebende Entity benötigen, idealerweise verwendet von Custom-Boss-Plugins oder Pet-Plugins
    • Static Modelle sind für nicht-persistente Modelle, die sich nicht bewegen sollen, also grundsätzlich temporäre Dekorationen oder Effekte

Wie fügt man ein bestehendes Modell hinzu?

Um ein Modell zu importieren, ziehe einfach die .bbmodel-Datei in den imports-Ordner und führe /fmm reload aus. Dies generiert eine .fmmodel-Datei im models-Ordner und fügt das Modell zum Resource Pack im outputs-Ordner hinzu.

Du musst dieses Resource Pack verwenden, um das Modell korrekt anzuzeigen! Es ist ein normales Resource Pack, also musst du es nur in deinen Resource Pack-Ordner legen. Minecraft-Server haben eine Möglichkeit, Resource Packs zu hosten. Ich empfehle die Verwendung meines Plugins ResourcePackManager, das die Dateien automatisch abruft und remote für dich hostet, wobei es sie sogar mit den Dateien anderer Plugins zusammenführt.

Wie zeigt man das Modell im Spiel an?

Es ist wichtig zu beachten, dass FreeMinecraftModels zwar als eigenständiges Plugin zum Anzeigen von Props (im Grunde benutzerdefinierte Modelle, die du in der Welt platzieren kannst) verwendet werden kann, das Plugin jedoch normalerweise am besten ist, wenn es mit einem Plugin wie EliteMobs kombiniert wird, wo die Modelle aktiv für etwas Konkretes verwendet werden, in diesem Fall Bosskämpfe.

Es gibt drei Arten von Modellen: static, dynamic und props.

  • Props sind persistent und können so in der Welt platziert werden, dass sie auch nach einem Serverneustart bestehen bleiben. Es ist möglich, Karten mit Props auf andere Server zu verteilen
  • Dynamic Modelle sind für Modelle gedacht, die eine zugrunde liegende lebende Entity benötigen, idealerweise verwendet von Custom-Boss-Plugins oder Pet-Plugins
  • Static Modelle sind für nicht-persistente Modelle, die sich nicht bewegen sollen, also grundsätzlich temporäre Dekorationen oder Effekte

Static Modelle im Spiel anzeigen

Um Static Modelle im Spiel anzuzeigen, verwende den Befehl /fmm spawn static <id>, wobei die ID der Dateiname des Modells ist, in Kleinbuchstaben und ohne Dateierweiterung.

Dynamic Modelle im Spiel anzeigen

Um Dynamic Modelle im Spiel anzuzeigen, verwende den Befehl /fmm spawn dynamic <id>, wobei die ID der Dateiname des Modells ist, in Kleinbuchstaben und ohne Dateierweiterung.

Props im Spiel anzeigen

Um Dynamic Modelle im Spiel anzuzeigen, verwende den Befehl /fmm spawn prop <id>, wobei die ID der Dateiname des Modells ist, in Kleinbuchstaben und ohne Dateierweiterung.

Was kann FreeMinecraftModels (FMM) für Modeller tun?

FMM folgt den Standard-Resource-Pack-Regeln für die Resource-Pack-Generierung. Darüber hinaus versucht es, so kompatibel wie möglich mit Modellen zu sein, die mit ModelEngine kompatibel sind, um zu versuchen, die Modellerstellung über Plugins hinweg zu standardisieren.

Funktionen / Einschränkungen der Modellgenerierung

Wenn du jemals Modelle für ModelEngine erstellt hast, wirst du mit vielen der Minecraft Resource Pack-Generierungseinschränkungen vertraut sein:

Cubes:

Cubes sind hier dasselbe wie in Blockbench, sie sind die Würfel, aus denen das Modell besteht.

  • Cubes können bis zu 112x112x112 "Pixel" (Blockbench-Einheiten) oder 7x7x7 Blöcke im Spiel groß sein (normale Minecraft-Einschränkungen werden mithilfe von Display-Größen umgangen, bald durch Display Entities für 1.19.4+ weiter umgangen)
  • Zulässige Rotationen für Cubes sind 0, 22.5, -22.5, 45 und -45. Keine andere Rotation funktioniert.
  • Cubes rotieren nur in einer Achse, was bedeutet, dass eine Rotation von [22.5, 0, 0] in Ordnung ist, eine Rotation von [22.5, 0, 45] wird nicht vollständig funktionieren und sich nur auf einer Achse drehen.

Bones:

Bones sind das, was Blockbench "groups" nennt. Sie dienen dazu, die Cubes zusammenzufassen und sollten verwendet werden, um Bones für animationsBlueprint zusammenzufassen.

  • Bones können bis zu 112x112x112 "Pixel" (Blockbench-Einheiten) oder 7x7x7 Blöcke im Spiel groß sein. Bitte beachte, dass die Größe von Bones durch das bestimmt wird, was sie enthalten. Wenn du also Cubes hast, die mehr als 7 Blöcke voneinander entfernt sind, wirst du wahrscheinlich diese Größengrenze überschreiten. Das Umgehen dieser Grenze ist so einfach wie das Platzieren der Blöcke in einem anderen boneBlueprint, der nicht im ersten boneBlueprint enthalten ist!
  • Können jede Rotation haben! Es wird jedoch empfohlen, Standardrotationen von 90, -90, 180 und -180 zu vermeiden, da diese oft zu unerwartetem Verhalten führen können. Beachte, dass dies nicht wirklich für Animationen gilt, sondern nur für die standardmäßige Ruheposition der Bones.

Bones sind deutlich flexibler als Cubes, aber du solltest so wenige Bones wie möglich verwenden! In FMM ist aufgrund von Minecraft-Einschränkungen jeder Bone eine andere Entity. In großem Maßstab wird sich dies ziemlich schnell auf die Leistung auswirken! Verwende immer so wenige Bones wie möglich und sei dir bewusst, wie viele dieser Modelle du spawnen möchtest - je mehr du davon haben möchtest, desto weniger Bones solltest du haben!

Virtual Bones

Virtual Bones ist eine ModelEngine-Terminologie für Bones, die bestimmte Metadaten haben, normalerweise in Form eines bestimmten Namens, der für einen bestimmten Zweck verwendet wird.

Die folgenden Virtual Bones wurden in FreeMinecraftModels implementiert:

  • Hitboxes / eye height: ein Bone namens "hitbox" mit einem cubeBlueprint, der die Grenzen definiert und denselben x- und z-Wert hat (der größte Wert wird ausgewählt, wenn sie nicht gleich sind), definiert die Hitbox. Die Augenhöhe wird am Pivot-Punkt des boneBlueprint der Hitbox festgelegt.
  • Name tag: ein Bone, dessen Name mit "tag_" beginnt. Ehrlich gesagt würde ich es vorziehen, hier spezifischer zu sein und mit "tag_name" zu gehen, um Tags für andere Dinge zu verwenden, aber das wird später ernsthaft in Betracht gezogen.
  • Head: ein Bone, dessen Name mit h_ beginnt. Dies ist ein virtueller Bone, der verwendet wird, um den Kopf des Modells zu definieren, der sich basierend auf der Rotation des Kopfes der zugrunde liegenden Entity drehen wird.

Sicherere, einfachere, nicht bearbeitbare Dateiverteilung

Eine Sache, die FMM zu bewältigen versucht, ist, dass Benutzer Modelle, die sie erhalten haben, zweckentfremden, um sie auf Weise zu bearbeiten, die der Modellersteller nicht wollte, insbesondere um ein Modell neu zu gestalten oder anderweitig leicht zu verändern und möglicherweise zu versuchen, es als originelle Kreation weiterzuverkaufen.

Zu diesem Zweck verwendet FMM das .fmmodel-Dateiformat, das darauf abzielt, .bbmodel-Dateien so weit zu reduzieren, dass sie vom Plugin verwendet werden können, aber nicht in Blockbench bearbeitet werden können.

Als Modeller hast du nun die Wahl, ob du eine nicht bearbeitbare .fmmodel-Datei, eine bearbeitbare .bbmodel-Datei veröffentlichen oder sogar unterschiedliche Preise oder Vertriebsbedingungen für die beiden festlegen möchtest.

Das Generieren einer .fmmodel-Datei ist so einfach wie das Platzieren deiner .bbmodel-Datei im ~/plugins/FreeMinecraftModels/imports-Ordner und das Neuladen des Plugins mit /fmm reload oder dem Neustart des Servers. Deine .fmmodel-Datei befindet sich dann im ~/plugins/FreeMinecraftModels/models-Ordner.

Was kann FreeMinecraftModels (FMM) für Entwickler tun, die es in ihre Plugins integrieren möchten?

FMM hat ein Maven-Repository! Maven:


<repository>
<id>magmaguy-repo-releases</id>
<name>MagmaGuy's Repository</name>
<url>https://repo.magmaguy.com/releases</url>
</repository>

<dependency>
<groupId>com.magmaguy</groupId>
<artifactId>FreeMinecraftModels</artifactId>
<version>LATEST.VERSION.HERE</version>
</dependency>

Gradle:

maven {
name = "magmaguyRepoReleases"
url = uri("https://repo.magmaguy.com/releases")
}

compileOnly group : 'com.magmaguy', name: 'FreeMinecraftModels', version: 'LATEST.VERSION.HERE'

Beachte, dass FreeMinecraftModels als API verwendet werden soll und die Installation des Plugins auf dem Server erfordert. Shade es nicht in dein Plugin!

API-Verwendung

FMM zielt darauf ab, so einfach wie möglich als API zu verwenden.

Im Moment, wenn du FreeMinecraftModels als API verwenden möchtest, um Zugriff auf die Verwendung benutzerdefinierter Modelle zu haben, gibt es nur vier Klassen, die du kennen musst:

  • ModeledEntity - die Basisklasse für alle Entities
  • StaticEntity - wenn du ein nicht-permanentes statisches Modell verwenden möchtest
  • DynamicEntity - wenn du eine andere lebende Entity mit einem Modell tarnen möchtest
  • PropEntity - wenn du ein Modell in der Welt platzieren möchtest, das auch nach einem Serverneustart bestehen bleibt

Hier ist ein Snippet für die Handhabung eines statischen Modells:

import org.bukkit.Bukkit;

public class FreeMinecraftModelsModel {
private StaticEntity staticEntity = null;

//Create the model
public FreeMinecraftModelsModel(String id, Location location) {
//This spawns the entity!
staticEntity = StaticEntity.create(id, location);
//This checks if the entity spawned correctly
if (staticEntity == null) Bukkit.getLogger().warning(("FMM failed to find a model named " + id + " !"));
}

public void remove() {
//This removes the entity
staticEntity.remove();
}
}

Beachte, dass statische Modelle dazu gedacht sind, an Ort und Stelle zu bleiben und als dekoratives Element an einer festen Position zu fungieren (Animationen zählen hier nicht als 'Bewegung'). Obwohl es möglich ist, sie zu bewegen, überlege, ob du stattdessen ein dynamisches Modell verwenden möchtest, wenn das dein Zweck ist.

Und hier ist, wie EliteMobs, mein Custom-Bosses-Plugin, Dynamic Entities verwendet:

package com.magmaguy.elitemobs.thirdparty.custommodels.freeminecraftmodels;

import com.magmaguy.elitemobs.thirdparty.custommodels.CustomModelInterface;
import api.com.magmaguy.freeminecraftmodels.ModeledEntityManager;
import customentity.com.magmaguy.freeminecraftmodels.DynamicEntity;
import lombok.Getter;
import org.bukkit.entity.LivingEntity;

public class CustomModelFMM implements CustomModelInterface {
@Getter
private DynamicEntity dynamicEntity;

public CustomModelFMM(LivingEntity livingEntity, String modelName, String nametagName) {
dynamicEntity = DynamicEntity.create(modelName, livingEntity);
if (dynamicEntity == null) return;
dynamicEntity.setName(nametagName);
}

public static void reloadModels() {
ModeledEntityManager.reload();
}

public static boolean modelExists(String modelName) {
return ModeledEntityManager.modelExists(modelName);
}

@Override
public void shoot() {
if (dynamicEntity.hasAnimation("attack_ranged")) dynamicEntity.playAnimation("attack_ranged", false);
else dynamicEntity.playAnimation("attack", false);
}

@Override
public void melee() {
if (dynamicEntity.hasAnimation("attack_melee")) dynamicEntity.playAnimation("attack_melee", false);
else dynamicEntity.playAnimation("attack", false);
}

@Override
public void playAnimationByName(String animationName) {
dynamicEntity.playAnimation(animationName, false);
}

@Override
public void setName(String nametagName, boolean visible) {
dynamicEntity.setName(nametagName);
dynamicEntity.setNameVisible(visible);
}

@Override
public void setNameVisible(boolean visible) {
dynamicEntity.setNameVisible(visible);
}

@Override
public void switchPhase() {
dynamicEntity.stopCurrentAnimations();
}
}

Dynamic Modelle basieren auf einer lebenden Entity, die entweder bei Verwendung der create-Methode wie im obigen Beispiel oder bei Ausführung der spawn-Methode auf einer Dynamic Entity bereitgestellt werden kann.

Als Entwickler zum FreeMinecraftModels (FMM)-Projekt beitragen

FMM wird unter der GPLV3-Lizenz verteilt und Code-Beiträge sind willkommen. Hier sind die grundlegenden Beitragsrichtlinien:

  • Folge den bestehenden Namenskonventionen, behalte das bestehende Niveau an Ausführlichkeit bei und füge genügend Dokumentation hinzu, damit dein Beitrag leicht zu verstehen ist
  • Halte Beiträge für den Umfang des Plugins relevant. Wenn du nicht weißt, ob es relevant sein wird, frage gerne im Voraus.
  • Sei dir der Leistungsauswirkungen deines Codes bewusst. Einige Beiträge können abgelehnt werden, wenn sie entweder zu wenig optimiert sind oder anderweitig zu große Leistungseinbußen verursachen.

Allgemeiner Plugin-Überblick

Um dir etwas Zeit zu sparen, hier ist eine schnelle Aufschlüsselung des Logikflusses von FMM:

  1. Lese den imports-Ordner
  2. Verschiebe Dateien vom imports-Ordner in den models-Ordner. Wenn die Datei eine .bbmodel ist, wird sie im models-Ordner in .fmmodel konvertiert.
  3. Lese die Dateien im models-Ordner.
  4. Interpretiere alle Modellstrukturen und erstelle Skeletons, die Gruppen von Bones enthalten, und diese Bones enthalten Gruppen von untergeordneten Bones und Cubes. Cubes und Bones generieren die JSON-Resource-Pack-Daten, mit denen sie jeweils verbunden sind. Das bedeutet, dass Cubes das JSON spezifisch für Cubes generieren und Bones die Gliederung und einzelne boneBlueprint-Dateien generieren. Beachte, dass ein boneBlueprint zu einer Resource-Pack-Datei führt. Modelle werden zu einer Liste hinzugefügt, wenn sie generiert werden.
  5. Immer noch im Skeleton, interpretiere alle Animations im Modell, falls vorhanden
  6. Alle Daten wurden jetzt initialisiert, das Resource Pack wurde im outputs-Ordner generiert und das Plugin ist einsatzbereit.

In diesem Plugin verwendete Tricks:

Die hier verwendeten Tricks sind ziemlich gut etabliert und standardisiert, werden aber dennoch aufgelistet, weil sie kontraintuitiv sein können.

Bitte beachte, dass diese Tricks für Benutzer und Modellersteller völlig unsichtbar sind; Einschränkungen und Workarounds werden nur aufgelistet, um dir zu helfen, zu verstehen, wie FMM verschiedene Minecraft-Einschränkungen umgeht.

  • Alle Modelle werden um das 4-fache vergrößert und dann werden Größe und Pivot-Punkt im Code angepasst, um die theoretische maximale Größe des Modells zu erweitern
  • Da Resource-Pack-Modelle nur Modelle von -16 bis +32 in der Größe haben können, werden Modelle im Hintergrund verschoben. Dies ist für Spieler völlig unsichtbar.
  • Lederne Pferderüstung wird verwendet, um Modelle mit einem Farbton zu erstellen, der durch Code beeinflusst werden kann (z.B. für Schadensanzeigen). Die Pferderüstung muss auf Weiß gesetzt werden, um die richtigen Farben anzuzeigen!
  • Blockbench verwendet ein spezifisches System von IDs für die Texturen, liest die Texturen aber tatsächlich sequenziell aus der Konfiguration. IDs werden hier basierend auf ihrer Position in der Liste der Texturen zugewiesen, wie Blockbench es tut.
  • Jeder Bone ist aufgrund von Minecraft-Einschränkungen eine andere Entity
  • Lederne Pferderüstung befindet sich im Kopf-Slot des Armor Stands
  • Sowohl Armor Stands als auch Display Entities werden für die Standard-Static-Items verwendet; Bedrock-Clients erhalten die Armor Stands und 1.19.4+ Clients erhalten die Display Entities (ältere Clients erhalten Armor Stands)

Allgemein zum FreeMinecraftModels (FMM)-Projekt beitragen

FMM wird tatsächlich von den wunderbaren Menschen unter https://www.patreon.com/magmaguy crowdfinanziert! Alle Beiträge helfen mehr, als du dir vorstellen kannst ;)

Derzeit geplante Funktionen:

  • Bedrock-Client-RSP-Generierung
  • RSP-Verwaltung mit Geyser-Integration
  • tag_projectile als Meta-Bones, von denen Projektile abgeschossen werden können (kann mehr als einen pro Modell haben)

Aktuelle seltsame Einschränkungen, die es schön wäre zu beheben:

  • Die TransformationMatrix ist ein Durcheinander, aber es wurden noch keine besseren Lösungen entwickelt. Sie benötigen etwas Arbeit von jemandem, der gut mit Matrizen umgehen kann.