Перейти к основному содержимому

Прежде чем начать!

FreeMinecraftModels (FMM) в настоящее время находится в активной разработке! Это означает, что некоторые функции еще не завершены и активно разрабатываются.

Однако на данный момент ядро плагина полностью функционально - конвертация bbmodel файлов, генерация ресурс-паков, появление сущностей в игре и управление их анимациями, возможность размещения постоянных prop-объектов - все это в основном работает.

Рассмотрите возможность поддержки разработки на https://www.patreon.com/magmaguy !

Экспортированное содержимое ресурс-паков лицензировано по лицензии CC0 со стороны FreeMinecraftModels, без сохранения прав. Вы можете свободно использовать, распространять, изменять для любых целей без ограничений или необходимости указания авторства.

Использование этого плагина

Что может делать FreeMinecraftModels (FMM) для администраторов Minecraft серверов?

Он может:

  • Импортировать .bbmodel или fmmodel (кастомный формат FFM) модели
  • Генерировать ресурс-паки с моделями, которые превышают обычные ограничения моделей ресурс-паков Minecraft (до 112x112x112 единиц или 7x7x7 блоков в игре, функционально неограниченно при использовании нескольких bones)
  • Отображать эти модели в игре, отправляя специальные bedrock-совместимые пакеты bedrock клиентам, а также отправляя display entities клиентам java 1.19.4+
  • Анимировать эти модели так, как они были настроены для анимации в Blockbench
  • Обрабатывать анимации состояний по умолчанию без необходимости других плагинов (walk, idle, death, attack, spawn)
  • Обрабатывать хитбоксы, которые вращаются вместе с базовой сущностью и имеют разные оси x и z
  • Управлять тремя типами моделей: static, dynamic и props
    • Props являются постоянными и могут быть размещены в мире таким образом, что сохранятся даже если сервер будет перезапущен, и можно распространять карты с props на другие серверы
    • Dynamic модели предназначены для моделей, которым нужна базовая живая сущность для функционирования, идеально используются плагинами кастомных боссов или плагинами питомцев
    • Static модели предназначены для непостоянных моделей, которые не должны передвигаться, то есть в основном временные декорации или эффекты

Как добавить существующую модель?

Чтобы импортировать модель, просто перетащите .bbmodel в папку imports и выполните /fmm reload. Это создаст .fmmodel файл в папке models и добавит модель в ресурс-пак в папке outputs.

Вам нужно будет использовать этот ресурс-пак, чтобы корректно просматривать модель! Это обычный ресурс-пак, поэтому все, что вам нужно сделать, это поместить его в папку с ресурс-паками. Серверы Minecraft имеют способ хостить ресурс-паки. Я рекомендую использовать мой плагин, ResourcePackManager, который автоматически захватывает файлы и хостит их удаленно для вас, даже объединяя их с файлами других плагинов.

Как просмотреть модель в игре?

Важно отметить, что хотя FreeMinecraftModels может использоваться как отдельный плагин для просмотра props (в основном кастомные модели, которые вы можете разместить в мире), плагин обычно работает лучше всего в паре с плагином, таким как EliteMobs, где модели активно используются для чего-то конкретного, в данном случае для боссов.

Существует три типа моделей: static, dynamic и props.

  • Props являются постоянными и могут быть размещены в мире таким образом, что сохранятся даже если сервер будет перезапущен, и можно распространять карты с props на другие серверы
  • Dynamic модели предназначены для моделей, которым нужна базовая живая сущность для функционирования, идеально используются плагинами кастомных боссов или плагинами питомцев
  • Static модели предназначены для непостоянных моделей, которые не должны передвигаться, то есть в основном временные декорации или эффекты

Просмотр static моделей в игре

Чтобы просмотреть static модели в игре, используйте команду /fmm spawn static <id>, где id - это имя файла модели в нижнем регистре и без расширения файла.

Просмотр dynamic моделей в игре

Чтобы просмотреть dynamic модели в игре, используйте команду /fmm spawn dynamic <id>, где id - это имя файла модели в нижнем регистре и без расширения файла.

Просмотр props в игре

Чтобы просмотреть dynamic модели в игре, используйте команду /fmm spawn prop <id>, где id - это имя файла модели в нижнем регистре и без расширения файла.

Что может делать FreeMinecraftModels (FMM) для моделеров?

FMM следует стандартным правилам ресурс-паков для генерации ресурс-паков. Кроме того, он пытается быть максимально совместимым с моделями, совместимыми с ModelEngine, чтобы попытаться стандартизировать создание моделей между плагинами.

Возможности / ограничения генерации моделей

Если вы когда-либо создавали модели для ModelEngine, вы будете знакомы со многими ограничениями генерации ресурс-паков Minecraft:

Cubes:

Cubes здесь такие же, как в Blockbench, это кубы, из которых состоит модель.

  • Cubes могут достигать 112x112x112 "пикселей" (единицы Blockbench) или 7x7x7 блоков в игре (обычные ограничения Minecraft обходятся с помощью размеров отображения, скоро будут еще больше обходиться для 1.19.4+ благодаря display entities)
  • Допустимые повороты для cubes: 0, 22.5, -22.5, 45 и -45. Никакие другие повороты не работают.
  • Cubes вращаются только по одной оси, то есть поворот [22.5, 0, 0] подходит, поворот [22.5, 0, 45] не будет полностью работать и будет вращаться только по одной оси.

Bones:

Bones - это то, что Blockbench называет "группами". Они служат для группировки cubes вместе и должны использоваться для группировки bones вместе для анимаций.

  • Bones могут достигать 112x112x112 "пикселей" (единицы Blockbench) или 7x7x7 блоков в игре. Обратите внимание, что размер bones определяется тем, что они содержат, поэтому если у вас есть cubes, которые находятся на расстоянии более 7 блоков друг от друга, вы, вероятно, превысите это ограничение размера. Обойти это ограничение так же просто, как поместить блоки в другой bone, не содержащийся в первом bone!
  • Могут иметь любой поворот! Однако рекомендуется избегать использования поворотов по умолчанию 90, -90, 180 и -180, так как они часто могут привести к неожиданному поведению. Обратите внимание, что это на самом деле не относится к анимациям, только к позиции покоя по умолчанию для bones.

Bones значительно более гибкие, чем cubes, но вы должны использовать как можно меньше bones! В FMM, из-за ограничений Minecraft, каждый bone является отдельной сущностью. В масштабе это довольно быстро повлияет на производительность! Всегда используйте как можно меньше bones и учитывайте, сколько этой модели вы планируете заспаунить - чем больше вы планируете иметь, тем меньше bones у вас должно быть!

Virtual Bones

Virtual Bones - это терминология model engine для bones, которые имеют специфические метаданные, обычно в виде специфического имени, которое используется для конкретной цели.

Следующие virtual bones были реализованы в FreeMinecraftModels:

  • Hitboxes / eye height: bone с именем "hitbox" с cube, который определяет границы, и имеет одинаковые значения x и z (будет выбрано наибольшее значение, если они не одинаковы) определяет hitbox. Уровень глаз устанавливается в точке поворота bone hitbox.
  • Name tag: bone, имя которого начинается с "tag_". Честно говоря, я бы предпочел быть более конкретным здесь и использовать "tag_name", чтобы использовать теги для других вещей, но это будет серьезно рассмотрено позже.
  • Head: bone, имя которого начинается с h_ . Это virtual bone, который используется для определения головы модели, которая будет вращаться в зависимости от поворота головы базовой сущности.

Более безопасное, простое, нередактируемое распространение файлов

Одна вещь, которую FMM пытается решить - это пользователи, переназначающие модели, которые они получили, чтобы редактировать их способами, которые создатель модели не хотел, чтобы они редактировали, особенно для того, чтобы изменить скин или иным образом слегка изменить модель и потенциально попытаться перепродать как оригинальное творение.

С этой целью FMM использует формат файла .fmmodel, который направлен на урезание файлов .bbmodel до точки, где они могут использоваться плагином, но не могут быть отредактированы в Blockbench.

Как моделер, теперь у вас есть выбор, хотите ли вы выпустить нередактируемый файл .fmmodel, редактируемый файл .bbmodel или даже сделать дифференцированное ценообразование или условия распространения для двух.

Генерация .fmmodel так же проста, как размещение вашего .bbmodel в папке ~/plugins/FreeMinecraftModels/imports и перезагрузка плагина с помощью /fmm reload или перезапуск сервера. Ваш .fmmodel затем будет в папке ~/plugins/FreeMinecraftModels/models.

Что может делать FreeMinecraftModels (FMM) для разработчиков, которые хотят интегрировать его в свои плагины?

FMM имеет 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'

Обратите внимание, что FreeMinecraftModels предназначен для использования в качестве API и потребует установки плагина на сервере. Не встраивайте его в свой плагин!

Использование API

FMM стремится быть максимально простым в использовании в качестве API.

На данный момент, если вы хотите использовать FreeMinecraftModels в качестве API для доступа к использованию кастомных моделей, есть только четыре класса, о которых вам нужно знать:

  • ModeledEntity - базовый класс для всех сущностей
  • StaticEntity - для когда вы хотите использовать непостоянную static модель
  • DynamicEntity - для когда вы хотите замаскировать другую живую сущность моделью
  • PropEntity - для когда вы хотите разместить модель в мире, которая сохраняется даже если сервер перезапущен

Вот фрагмент кода для обработки static модели:

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();
}
}

Имейте в виду, что static модели предназначены для того, чтобы оставаться на месте и действовать как декоративный элемент в фиксированном месте (анимации не считаются 'движением' здесь). Хотя можно их перемещать, подумайте, не захотите ли вы вместо этого использовать dynamic модель, если это ваша цель.

И вот как EliteMobs, мой плагин кастомных боссов, использует dynamic сущности:

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 модели построены поверх живой сущности, которая может быть предоставлена либо при использовании метода create, как в примере выше, либо при запуске метода spawn на Dynamic сущности.

Вклад в проект FreeMinecraftModels (FMM) в качестве разработчика

FMM распространяется под лицензией GPLV3, и вклад в код приветствуется. Вот основные рекомендации по вкладу:

  • Следуйте существующим соглашениям об именовании, поддерживайте существующий уровень детализации и добавляйте достаточно документации, чтобы ваш вклад был легко понятен
  • Сохраняйте вклады релевантными для области применения плагина. Если вы не знаете, будет ли это релевантно, не стесняйтесь спросить заранее.
  • Помните о влиянии вашего кода на производительность. Некоторые вклады могут быть отклонены, если они либо слишком неоптимизированы, либо иным образом вызывают слишком большое влияние на производительность.

Общая схема плагина

Чтобы сэкономить ваше время, вот краткая разбивка логического потока FMM:

  1. Чтение папки imports
  2. Перемещение файлов из папки imports в папку models. Если файл является .bbmodel, он конвертируется в .fmmodel в папке models.
  3. Чтение файлов в папке models.
  4. Интерпретация всех структур моделей, создание Skeletons, которые содержат группы Bones, и эти bones содержат группы дочерних Bones и Cubes. Cubes и Bones генерируют данные JSON ресурс-пака, с которыми они связаны. Это означает, что Cubes генерируют JSON, специфичный для cubes, а Bones генерируют схему и файлы отдельных bone. Обратите внимание, что один bone приводит к одному файлу ресурс-пака. Модели добавляются в список по мере их генерации.
  5. Все еще в Skeleton, интерпретация всех Animations в модели, если таковые имеются
  6. Все данные теперь инициализированы, ресурс-пак был сгенерирован в папке outputs, и плагин готов к использованию.

Трюки, используемые в этом плагине:

Трюки, используемые здесь, довольно хорошо установлены и стандартизированы, но все равно будут перечислены, потому что они могут быть неинтуитивными.

Обратите внимание, что эти трюки полностью невидимы для пользователей и создателей моделей; ограничения и обходные пути перечислены только для того, чтобы помочь вам понять, как FMM обходит различные ограничения Minecraft.

  • Все модели масштабируются в 4 раза, а затем размер и точка поворота корректируются в коде, чтобы расширить теоретический максимальный размер модели
  • Поскольку модели ресурс-паков могут иметь модели только от -16 до +32 по размеру, модели сдвигаются в фоновом режиме. Это полностью невидимо для игроков.
  • Кожаная конская броня используется для создания моделей с оттенком, на который можно влиять через код (т.е. для индикаций урона). Конская броня должна быть установлена на белый цвет для отображения правильных цветов!
  • Blockbench использует специфическую систему ID для текстур, но на самом деле читает текстуры последовательно из конфигурации. ID назначаются здесь на основе их позиции в списке текстур, следуя тому, как это делает Blockbench.
  • Каждый bone является отдельной сущностью из-за ограничений Minecraft
  • Кожаная конская броня находится в слоте головы стойки для брони
  • Как стойки для брони, так и display entities используются для статических предметов по умолчанию; bedrock клиенты получают стойки для брони, а клиенты 1.19.4+ получают display entities (старые клиенты получат стойки для брони)

Вклад в проект FreeMinecraftModels (FMM) в целом

FMM на самом деле финансируется за счет краудфандинга замечательными людьми на https://www.patreon.com/magmaguy ! Все вклады помогают больше, чем вы можете себе представить ;)

Текущие запланированные функции:

  • Генерация RSP для bedrock клиентов
  • Управление RSP с интеграцией geyser
  • tag_projectile как meta bones, из которых можно стрелять снарядами (может быть более одного на модель)

Текущие странные ограничения, которые было бы неплохо исправить:

  • TransformationMatrix - это беспорядок, но пока не было разработано лучших решений. Им нужна работа от кого-то, кто хорошо разбирается в матрицах.