¡Antes de comenzar!
FreeMinecraftModels (FMM) está actualmente en desarrollo activo! Esto significa que algunas funciones aún no están completas y están siendo trabajadas activamente.
Sin embargo, en este momento, el núcleo del plugin está completamente funcional - convertir archivos bbmodel, generar paquetes de recursos, generar entidades en el juego y gestionar sus animaciones, la capacidad de colocar props persistentes, todo está mayormente funcionando.
¡Considera apoyar el desarrollo en https://www.patreon.com/magmaguy !
Los contenidos del paquete de recursos exportado están licenciados bajo la licencia CC0 por parte de FreeMinecraftModels, sin derechos reservados. Eres libre de usar, distribuir, modificar para cualquier propósito sin restricciones o necesidad de atribución.
Usando este plugin
¿Qué puede hacer FreeMinecraftModels (FMM) para los administradores de servidores de Minecraft?
Puede:
- Importar modelos .bbmodel o fmmodel (formato personalizado de FFM)
- Generar paquetes de recursos con modelos que exceden los límites normales de los paquetes de recursos de Minecraft (hasta 112x112x112 unidades o 7x7x7 bloques en el juego, funcionalmente ilimitado al usar múltiples bones)
- Mostrar estos modelos en el juego, enviando paquetes específicos compatibles con bedrock a clientes bedrock mientras también envía display entities a clientes java 1.19.4+
- Animar estos modelos como fueron configurados para ser animados en Blockbench
- Manejar animaciones de estado por defecto sin requerir otros plugins (walk, idle, death, attack, spawn)
- Manejar hitboxes que rotan con la entidad subyacente y tienen un eje x y z diferente
- Gestionar tres tipos de modelos: static, dynamic y props
- Props son persistentes y pueden ser colocados en el mundo de tal manera que persistirán incluso si el servidor se reinicia, y es posible distribuir mapas con props a otros servidores
- Dynamic models son para modelos que necesitan una entidad viviente subyacente para funcionar, idealmente usados por plugins de jefes personalizados o plugins de mascotas
- Static models son para modelos no persistentes que no deberían moverse, así que básicamente decoraciones temporales o efectos
¿Cómo añadir un modelo existente?
Para importar un modelo, simplemente arrastra el .bbmodel a la carpeta imports y ejecuta /fmm reload. Esto generará un archivo .fmmodel en la carpeta models y añadirá el modelo al paquete de recursos en la carpeta outputs.
¡Necesitarás usar ese paquete de recursos para ver el modelo correctamente! Es un paquete de recursos normal, así que todo lo que necesitas hacer es ponerlo en tu carpeta de paquetes de recursos. Los servidores de Minecraft tienen una manera de alojar paquetes de recursos. Recomiendo usar mi plugin, ResourcePackManager, que automáticamente toma los archivos y los aloja remotamente para ti, incluso fusionándolos con los archivos de otros plugins.
¿Cómo ver el modelo en el juego?
Es importante notar que aunque FreeMinecraftModels puede ser usado como un plugin independiente para ver props (básicamente modelos personalizados que puedes colocar en el mundo), el plugin usualmente está en su mejor momento cuando se empareja con un plugin como EliteMobs donde los modelos son activamente usados para algo concreto, en este caso peleas de jefes.
Hay tres tipos de modelos: static, dynamic y props.
- Props son persistentes y pueden ser colocados en el mundo de tal manera que persistirán incluso si el servidor se reinicia, y es posible distribuir mapas con props a otros servidores
- Dynamic models son para modelos que necesitan una entidad viviente subyacente para funcionar, idealmente usados por plugins de jefes personalizados o plugins de mascotas
- Static models son para modelos no persistentes que no deberían moverse, así que básicamente decoraciones temporales o efectos
Visualizar static models en el juego
Para ver static models en el juego, usa el comando /fmm spawn static <id> donde el id es el nombre del archivo del modelo, en minúsculas y sin la extensión del archivo.
Visualizar dynamic models en el juego
Para ver dynamic models en el juego, usa el comando /fmm spawn dynamic <id> donde el id es el nombre del archivo del modelo, en minúsculas y sin la extensión del archivo.
Visualizar props en el juego
Para ver dynamic models en el juego, usa el comando /fmm spawn prop <id> donde el id es el nombre del archivo del modelo, en minúsculas y sin la extensión del archivo.
¿Qué puede hacer FreeMinecraftModels (FMM) para los modeladores?
FMM sigue las reglas estándar de paquetes de recursos para la generación de paquetes de recursos. Además, intenta ser tan compatible como sea posible con modelos compatibles con ModelEngine para tratar de estandarizar la creación de modelos entre plugins.
Características / restricciones de generación de modelos
Si alguna vez has creado modelos para ModelEngine, estarás familiarizado con muchas de las restricciones de generación de paquetes de recursos de Minecraft:
Cubes:
Los Cubes son lo mismo aquí que en Blockbench, son los cubos que componen el modelo.
- Los Cubes pueden llegar hasta 112x112x112 "píxeles" (unidades de Blockbench) o 7x7x7 bloques en el juego (restricciones normales de Minecraft evitadas usando tamaños de display, pronto se evitarán más para 1.19.4+ gracias a display entities)
- Las rotaciones legales para cubos son 0, 22.5, -22.5, 45 y -45. Ninguna otra rotación funciona.
- Los Cubes solo rotan en un eje, lo que significa que una rotación de [22.5, 0, 0] está bien, una rotación de [22.5, 0, 45] no funcionará completamente y solo rotará en un eje.
Bones:
Bones es como Blockbench llama a los "grupos". Sirven para agrupar los cubos juntos, y deben ser usados para agrupar bones juntos para animationsBlueprint.
- Los Bones pueden llegar hasta 112x112x112 "píxeles" (unidades de Blockbench) o 7x7x7 bloques en el juego. Por favor nota que el tamaño de los bones está determinado por lo que contienen, así que si tienes cubos que están a más de 7 bloques de distancia, probablemente excederás este límite de tamaño. Evitar este límite es tan fácil como poner los bloques en un boneBlueprint diferente no contenido en el primer boneBlueprint!
- ¡Pueden tener cualquier rotación! Sin embargo, se recomienda evitar usar rotaciones por defecto de 90, -90, 180 y -180, ya que estas pueden a menudo llevar a comportamientos inesperados. Nota que esto realmente no aplica a las animaciones, solo a la posición de reposo por defecto de los bones.
Los Bones son significativamente más flexibles que los cubos, pero ¡deberías usar la menor cantidad de bones posible! En FMM, debido a las limitaciones de Minecraft, cada bone es una entidad diferente. A escala, ¡esto afectará el rendimiento bastante rápido! Siempre usa la menor cantidad de bones que puedas, y ten en cuenta cuántos de ese modelo planeas generar - ¡cuanto más planees tener, menos bones deberías tener!
Virtual Bones
Virtual Bones es terminología de model engine para bones que tienen un metadato específico, usualmente en la forma de un nombre específico, que se usa para un propósito específico.
Los siguientes virtual bones han sido implementados en FreeMinecraftModels:
- Hitboxes / eye height: un bone llamado "hitbox" con un cubeBlueprint que define los límites, y tiene el mismo valor x y z (el valor más grande será elegido si no son iguales) define el hitbox. El nivel de los ojos se establece en el pivot point del boneBlueprint del hitbox.
- Name tag: un bone cuyo nombre comienza con "tag_". Honestamente preferiría ser más específico aquí y usar "tag_name" para usar tags para otras cosas, pero eso será seriamente considerado más adelante.
- Head: un bone cuyo nombre comienza con h_ . Este es un virtual bone que se usa para definir la cabeza del modelo, que rotará basándose en la rotación de la cabeza de la entidad subyacente.
Distribución de archivos más segura, más fácil y no editable
Una cosa que FMM intenta abordar es que los usuarios reutilicen modelos que han obtenido para editarlos de maneras que el creador del modelo no quería que editaran, específicamente para cambiar la apariencia u alterar ligeramente un modelo y potencialmente intentar revenderlo como una creación original.
Para ese fin, FMM usa el formato de archivo .fmmodel que tiene como objetivo reducir los archivos .bbmodel hasta el punto donde puedan ser usados por el plugin pero no puedan ser editados en Blockbench.
Como modelador, ahora tienes la opción de si quieres lanzar un archivo .fmmodel no editable, un archivo .bbmodel editable o incluso hacer precios diferenciales o términos de servicio de distribución para los dos.
Generar un .fmmodel es tan simple como poner tu .bbmodel en la carpeta ~/plugins/FreeMinecraftModels/imports y recargar el plugin con /fmm reload o reiniciar el servidor. Tu .fmmodel estará entonces en la carpeta ~/plugins/FreeMinecraftModels/models.
¿Qué puede hacer FreeMinecraftModels (FMM) para desarrolladores que quieran integrarlo en sus plugins?
¡FMM tiene un repositorio maven! 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'
Nota: FreeMinecraftModels está destinado a ser usado como una API, y requerirá la instalación del plugin en el servidor. ¡No lo incluyas en tu plugin usando shade!
Uso de la API
FMM tiene como objetivo ser tan fácil como sea posible de usar como una API.
Ahora mismo, si deseas usar FreeMinecraftModels como una API para tener acceso al uso de modelos personalizados, solo hay cuatro clases que necesitas conocer:
ModeledEntity- la clase base para todas las entidadesStaticEntity- para cuando quieras usar un modelo estático no permanenteDynamicEntity- para cuando quieras disfrazar otra entidad viviente con un modeloPropEntity- para cuando quieras colocar un modelo en el mundo que persista incluso si el servidor se reinicia
Aquí hay un fragmento para manejar un modelo estático:
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();
}
}
Ten en cuenta que los static models están destinados a permanecer en su lugar y actuar como un elemento decorativo en una ubicación fija (las animaciones no cuentan como 'movimiento' aquí). Aunque es posible moverlos, considera si en su lugar podrías querer usar un dynamic model si ese es tu propósito.
Y aquí está cómo EliteMobs, mi plugin de jefes personalizados, usa dynamic entities:
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();
}
}
Los Dynamic models están construidos sobre una entidad viviente, que puede ser proporcionada ya sea al usar el método create como en el ejemplo anterior, o al ejecutar el método spawn en una entidad Dynamic.
Contribuir al proyecto FreeMinecraftModels (FMM) como desarrollador
FMM está distribuido bajo la licencia GPLV3 y las contribuciones de código son bienvenidas. Aquí están las pautas básicas de contribución:
- Sigue las convenciones de nomenclatura existentes, mantén el nivel de verbosidad existente y añade suficiente documentación para que tu contribución sea fácil de entender
- Mantén las contribuciones relevantes al alcance del plugin. Si no sabes si será relevante, no dudes en preguntar con anticipación.
- Ten en cuenta el impacto de rendimiento de tu código. Algunas contribuciones pueden ser rechazadas si son demasiado poco optimizadas o de otra manera causan un impacto de rendimiento demasiado grande.
Esquema general del plugin
Para ahorrarte algo de tiempo, aquí hay un desglose rápido del flujo lógico de FMM:
- Leer la carpeta
imports - Mover archivos de la carpeta
importsa la carpetamodels. Si el archivo es un.bbmodel, se convierte a.fmmodelen la carpetamodels. - Leer los archivos en la carpeta
models. - Interpretar todas las estructuras de modelos, creando
Skeletons que contienen grupos deBones, y estos bones contienen grupos deBones hijos yCubes.Cubes yBones generan los datos JSON del paquete de recursos con los que cada uno está relacionado. Esto significa que losCubes generan el JSON específico para cubos y losBones generan el esquema y archivos de boneBlueprint individuales. Nota que un boneBlueprint resulta en un archivo de paquete de recursos. Los modelos se añaden a una lista a medida que se generan. - Todavía en el
Skeleton, interpretar todas lasAnimationsen el modelo, si las hay - Todos los datos han sido ahora inicializados, el paquete de recursos fue generado en la carpeta
outputsy el plugin está listo para ser usado.
Trucos usados en este plugin:
Los trucos usados aquí están bastante bien establecidos y estandarizados, pero se listarán de todos modos porque pueden ser contra-intuitivos.
Por favor nota que estos trucos son completamente invisibles para los usuarios y creadores de modelos; las restricciones y soluciones solo se listan para ayudarte a entender cómo FMM evita varias limitaciones de Minecraft.
- Todos los modelos son escalados 4x y luego el tamaño y pivot point son reajustados en el código para extender el tamaño máximo teórico del modelo
- Debido a que los modelos de paquetes de recursos solo pueden tener modelos que van de -16 a +32 en tamaño, los modelos se desplazan en segundo plano. Esto es completamente invisible para los jugadores.
- La armadura de caballo de cuero se usa para crear modelos con un tono que puede ser influenciado a través del código (es decir, para indicaciones de daño). ¡La armadura de caballo debe estar configurada en blanco para mostrar los colores correctos!
- Blockbench usa un sistema específico de IDs para las texturas, pero en realidad lee las texturas secuencialmente desde la configuración. Los IDs se asignan aquí basándose en su posición en la lista de texturas, siguiendo cómo lo hace Blockbench.
- Cada bone es una entidad diferente debido a las limitaciones de Minecraft
- La armadura de caballo de cuero está en el slot de cabeza del armor stand
- Tanto armor stands como display entities se usan para los items estáticos por defecto; los clientes bedrock obtienen los armor stands, y los clientes 1.19.4+ obtienen las display entities (los clientes más antiguos obtendrán armor stands)
Contribuir al proyecto FreeMinecraftModels (FMM) en general
¡FMM está en realidad financiado colectivamente por la gente encantadora en https://www.patreon.com/magmaguy ! Todas las contribuciones ayudan más de lo que imaginas ;)
Funciones actualmente planificadas:
- Generación de RSP para clientes Bedrock
- Gestión de RSP con integración de geyser
- tag_projectile como meta bones desde los cuales se pueden disparar proyectiles (puede haber más de uno por modelo)
Limitaciones raras actuales que sería bueno arreglar:
- La TransformationMatrix es un desastre, pero no se han desarrollado mejores soluciones todavía. Necesitan algo de trabajo de alguien que sea bueno con matrices.