始める前に!
FreeMinecraftModels(FMM)は現在活発に開発中です!これは、一部の機能がまだ完成しておらず、積極的に開発が進められていることを意味します。
しかし、現時点でプラグインのコア機能は完全に動作しています - bbmodelファイルの変換、リソースパックの生成、ゲーム内でのエンティティのスポーンとアニメーション管理、永続的なpropの配置機能など、すべてほぼ正常に動作しています。
開発を支援したい方は https://www.patreon.com/magmaguy をご覧ください!
エクスポートされたリソースパックのコンテンツは、FreeMinecraftModels側ではCC0ライセンスの下でライセンスされており、権利は留保されていません。帰属表示や制限なしに、あらゆる目的で自由に使用、配布、改変できます。
このプラグインの使用方法
FreeMinecraftModels(FMM)はMinecraftサーバー管理者に何ができますか?
以下のことができます:
- .bbmodelまたはfmmodel(FFMのカスタム形式)モデルのインポート
- 通常のMinecraftリソースパックのモデル制限を超えるモデルを含むリソースパックの生成(最大112x112x112単位、つまり7x7x7のゲーム内ブロック、複数のボーンを使用する場合は実質無制限)
- これらのモデルをゲーム内で表示し、Bedrockクライアントには特定のBedrock互換パケットを送信し、1.19.4以降のJavaクライアントにはdisplay entityを送信
- Blockbenchで設定されたとおりにこれらのモデルをアニメーション化
- 他のプラグインを必要とせずにデフォルトの状態アニメーションを処理(歩行、待機、死亡、攻撃、スポーン)
- 基礎となるエンティティとともに回転し、xとz軸が異なるヒットボックスを処理
- 3種類のモデルを管理:static、dynamic、props
- Propsは永続的で、サーバーが再起動しても持続する方法でワールドに配置でき、propsを含むマップを他のサーバーに配布することも可能
- Dynamicモデルは、機能するために基礎となる生きているエンティティを必要とするモデル用で、カスタムボスプラグインやペットプラグインでの使用に最適
- Staticモデルは、移動しない非永続的なモデル用で、基本的に一時的な装飾やエフェクト用
既存のモデルを追加する方法は?
モデルをインポートするには、.bbmodelファイルをimportsフォルダにドラッグして/fmm reloadを実行するだけです。これにより、modelsフォルダに.fmmodelファイルが生成され、outputsフォルダのリソースパックにモデルが追加されます。
モデルを正しく表示するには、そのリソースパックを使用する必要があります! これは通常のリソースパックなので、リソースパックフォルダに入れるだけです。Minecraftサーバーにはリソースパックをホストする方法があります。私のプラグインResourcePackManagerの使用をお勧めします。このプラグインは自動的にファイルを取得してリモートでホストし、他のプラグインのファイルとマージすることもできます。
ゲーム内でモデルを表示する方法は?
FreeMinecraftModelsは、props(基本的にワールドに配置できるカスタムモデル)を表示するためのスタンドアロンプラグインとして使用できますが、通常はEliteMobsのようなプラグインと組み合わせたときに最高のパフォーマンスを発揮します。このケースでは、モデルがボス戦などの具体的な目的に積極的に使用されます。
モデルには3つのタイプがあります: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制限はdisplayサイズを使用してバイパスされ、1.19.4以降ではdisplay entityのおかげでさらにバイパスされる予定)
- Cubesの有効な回転は0、22.5、-22.5、45、-45です。他の回転は機能しません。
- Cubesは1つの軸でのみ回転します。つまり、[22.5, 0, 0]の回転は問題ありませんが、[22.5, 0, 45]の回転は完全には機能せず、1つの軸でのみ回転します。
Bones:
Bonesは、Blockbenchが「groups」と呼ぶものです。キューブをグループ化するために使用され、animationsBlueprint用にボーンをグループ化するために使用されるべきです。
- Bonesは最大112x112x112「ピクセル」(Blockbench単位)または7x7x7のゲーム内ブロックまで可能です。ボーンのサイズは含まれる内容によって設定されるため、7ブロック以上離れたキューブがある場合、おそらくこのサイズ制限を超えるでしょう。この制限をバイパスするのは簡単で、最初のboneBlueprintに含まれていない別のboneBlueprintにブロックを配置するだけです!
- 任意の回転が可能です!ただし、90、-90、180、-180のデフォルト回転の使用は避けることをお勧めします。これらは予期しない動作につながることがよくあります。これはアニメーションには実際には適用されず、ボーンのデフォルトの静止位置にのみ適用されます。
BonesはCubesよりもはるかに柔軟ですが、できるだけ少ないボーンを使用するべきです!FMMでは、Minecraftの制限により、各ボーンは異なるエンティティです。大規模になると、これはかなり早くパフォーマンスに影響します!常にできるだけ少ないボーンを使用し、そのモデルをいくつスポーンする予定かに注意してください - 多くスポーンする予定であるほど、ボーンは少なくするべきです!
Virtual Bones
Virtual Bonesは、特定のメタデータ(通常は特定の名前の形式)を持つボーンに対するModelEngineの用語で、特定の目的に使用されます。
FreeMinecraftModelsでは、以下のvirtual bonesが実装されています:
- Hitboxes / eye height:境界を定義するcubeBlueprintを持つ「hitbox」という名前のボーンで、同じxとz値を持ちます(異なる場合は大きい方の値が選択されます)。目の高さは、hitboxのboneBlueprintのピボットポイントに設定されます。
- Name tag:名前が「tag_」で始まるボーン。正直なところ、他の目的でタグを使用するために「tag_name」にしてもっとモード固有にしたいところですが、これは後で真剣に検討されます。
- Head:名前が「h_」で始まるボーン。これは、基礎となるエンティティの頭の回転に基づいて回転する、モデルの頭を定義するために使用されるvirtual boneです。
より安全で簡単な、編集不可能なファイル配布
FMMが取り組もうとしている1つのことは、ユーザーが取得したモデルを、モデル作成者が望まない方法で編集するために再利用することです。特に、モデルのリスキンやその他のわずかな変更を行い、オリジナルの作品として再販しようとすることを防ぎます。
そのため、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として使用したい場合、知っておく必要があるクラスは4つだけです:
ModeledEntity- すべてのエンティティの基底クラスStaticEntity- 非永続的なstaticモデルを使用する場合DynamicEntity- 別の生きているエンティティをモデルで変装させたい場合PropEntity- サーバーが再起動しても持続するモデルをワールドに配置したい場合
staticモデルを処理するためのコードスニペットは次のとおりです:
import org.bukkit.Bukkit;
public class FreeMinecraftModelsModel {
private StaticEntity staticEntity = null;
//モデルを作成
public FreeMinecraftModelsModel(String id, Location location) {
//これでエンティティがスポーンします!
staticEntity = StaticEntity.create(id, location);
//これでエンティティが正しくスポーンしたかどうかをチェックします
if (staticEntity == null) Bukkit.getLogger().warning(("FMM failed to find a model named " + id + " !"));
}
public void remove() {
//これでエンティティを削除します
staticEntity.remove();
}
}
staticモデルは、固定位置に留まり、装飾要素として機能することを意図していることに注意してください(アニメーションはここでの「移動」にはカウントされません)。移動させることは可能ですが、その目的であればdynamicモデルを使用した方がよいかどうかを検討してください。
そして、これは私のカスタムボスプラグインであるEliteMobsがdynamic entityを使用する方法です:
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メソッドを使用するとき、またはDynamic entity上でspawnメソッドを実行するときに提供できます。
開発者としてFreeMinecraftModels(FMM)プロジェクトに貢献する
FMMはGPLV3ライセンスの下で配布されており、コードの貢献を歓迎します。基本的な貢献ガイドラインは次のとおりです:
- 既存の命名規則に従い、既存の冗長性レベルを維持し、貢献が理解しやすいように十分なドキュメントを追加してください
- 貢献をプラグインの範囲に関連するものにしてください。関連するかどうかわからない場合は、事前にお気軽にお問い合わせください。
- コードのパフォーマンスへの影響に注意してください。最適化されていない、またはパフォーマンスへの影響が大きすぎる貢献は、却下される場合があります。
一般的なプラグインの概要
時間を節約するために、FMMのロジックフローの簡単な内訳を以下に示します:
importsフォルダを読み取るimportsフォルダからmodelsフォルダにファイルを移動する。ファイルが.bbmodelの場合、modelsフォルダ内で.fmmodelに変換される。modelsフォルダ内のファイルを読み取る。- すべてのモデル構造を解釈し、
Boneのグループを含むSkeletonを作成し、これらのボーンには子BoneとCubeのグループが含まれます。CubeとBoneは、それぞれが関連するJSONリソースパックデータを生成します。つまり、Cubeはキューブ固有のJSONを生成し、Boneはアウトラインと個別のboneBlueprintファイルを生成します。1つのboneBlueprintは1つのリソースパックファイルになることに注意してください。モデルは生成時にリストに追加されます。 Skeleton内で、モデル内のすべてのAnimationsを解釈します(存在する場合)- すべてのデータが初期化され、リソースパックが
outputsフォルダに生成され、プラグインは使用可能になります。
このプラグインで使用されるトリック:
ここで使用されるトリックはかなり確立されており標準化されていますが、直感に反する可能性があるため、リストアップします。
これらのトリックはすべて、ユーザーとモデル作成者には完全に見えないことに注意してください。制限と回避策は、FMMがさまざまなMinecraft制限をどのようにバイパスするかを理解するのを助けるためだけにリストされています。
- すべてのモデルは4倍に拡大され、その後サイズとピボットポイントがコード内で再調整され、モデルの理論上の最大サイズが拡張されます
- リソースパックモデルは-16から+32のサイズまでしかモデルを持つことができないため、モデルはバックグラウンドでシフトされます。これはプレイヤーには完全に見えません。
- 革の馬の鎧は、コードを通じて影響を受ける色合いを持つモデルを作成するために使用されます(つまり、ダメージ表示用)。正しい色を表示するには、馬の鎧を白に設定する必要があります!
- Blockbenchはテクスチャに特定のIDシステムを使用しますが、実際にはconfigからテクスチャを順次読み取ります。IDは、Blockbenchの方法に従って、テクスチャのリスト内の位置に基づいて割り当てられます。
- Minecraftの制限により、各ボーンは異なるエンティティです
- 革の馬の鎧はアーマースタンドのヘッドスロットにあります
- デフォルトのstaticアイテムには、アーマースタンドとdisplay entityの両方が使用されます。Bedrockクライアントはアーマースタンドを取得し、1.19.4以降のクライアントはdisplay entityを取得します(古いクライアントはアーマースタンドを取得します)
一般的にFreeMinecraftModels(FMM)プロジェクトに貢献する
FMMは実際には https://www.patreon.com/magmaguy の素晴らしい人々によってクラウドファンディングされています!すべての貢献は、想像以上に役立ちます ;)
現在計画されている機能:
- Bedrockクライアント用のRSP生成
- geyser統合によるRSP管理
- tag_projectileを発射可能な投射物のメタボーンとして(モデルごとに複数持つことが可能)
修正したい現在の奇妙な制限事項:
- TransformationMatrixは混乱していますが、より良い解決策はまだ開発されていません。マトリックスに詳しい人の助けが必要です。