minecraft
Forgeで基本ブロックを作成する
サーチ…
前書き
Forgeでシンプルで装飾的なブロックを作成することは、夢のモダンが学ばなければならない最初の課題の1つです。それを行う方法は、さまざまなバージョンのMinecraftで変更されており、間違いやすい簡単な数のために、おそらく1.7.10の「中程度の」難易度である。
備考
何かがうまくいかず、カスタムブロック(配置されているか保持されているかのいずれか)に欠けているテクスチャ(黒色/紫色)またはモデル(保持されているときは大きすぎるデフォルトキューブ)がある場合はログを確認します。物事を正しく登録していれば、この種の問題はほとんどの場合ログに表示されます。
最初に表示されるのは、 "Exception loading model for variant..."
行または同様のもので、どのブロックまたは項目が正しく読み込まれなかったかを示します。 at...
始まる十数行ほどの行が、別の行が始まるCaused by...
となりCaused by...
この「原因」行は重要な行です。どのファイルが正しく読み込まれなかったかを示し、次のようないくつかのエラーの1つになることがあります。
- 不正な形式のJSON(JSONファイルが無効で、タイプミスがあります)
- ファイルが見つかりません(Minecraftが探しているファイルの名前が適切でないか、正しい場所にありません)
- 不足しているバリアント例外(ブロックステートJSONが不完全)
1回の間違いで2つ以上のエラーが発生することさえあります。問題のブロックが分からない場合は、動作しているすべてのブロックとアイテムをコメントアウトし、問題のブロック(またはブロック)までエラーリストを減らしてください。あなたはこれを何度もしなければならないかもしれません。
さらに、ミキシングテクスチャは、特定のドメイン(mod ID)の欠落しているリソースのすべてを単純なリストとして表示する方法とは異なります。
ブロッククラス
まず、ブロックを表すクラスが必要です
public class CustomBlock extends Block {
public CustomBlock () {
super(Material.ROCK);
setHardness(1.0f);
setHarvestLevel("pickaxe", 0);
setResistance(1.0f);
setCreativeTab(CreativeTabs.DECORATIONS);
this.setSoundType(SoundType.STONE);
}
}
ここでもいくつかの変更が可能です:材料(ピストンによって押されることができ、手で壊すことができるかどうかといったいくつかの特性を支配する)、硬度(破損するまでの時間)、収穫レベル材料:この場合は木製ピクサク)、耐性(爆発と比較して)、クリエイティブメニューに表示されるタブ、そしてどのような踏み音であるかを示します。
これは、ファンシーな機能ブロックが必要となる場所ですが、今のところ、ブロックが素敵に見えるので、完了しました。
ブロックモデルJSON
次に、Minecraftにブロックを見せたいものを伝える必要があります。
{
"parent": "block/cube_all",
"textures": {
"all": "example:blocks/decorative"
}
}
ブロックが登録されると、それが動作するために必要なことはほぼすべてです。唯一重要なのは、 ファイル名がブロックを登録するために使用されたレジストリ名と一致し、すべて小文字であることです(1.11+ファイル名は大文字小文字を区別する前に小文字である必要があります)。
モデルJSONファイルの名前をmy_block.json
( my_block.json
するレジストリ名と一致する)、 src\main\resources\assets\example\models\block\
保存します( example
は、メインModクラスの@Modアノテーション)。
ここのブロックモデルは、ブロック/ cube_allの親を使用します。つまり、単一のテクスチャがすべての面で使用されます。その他のデフォルトモデルもあります:
- ブロック/キューブ(6つすべての面が個別に割り当てられています)
- block / cube_bottom_top(両側から独立した上下の面)
- ブロック/方向付け可能(方向性のあるブロック、例えば炉)
- ブロック/クロス(花、背の高い草)
- ブロック/作物(コムギ、ニンジン)
各モデルが使用するテクスチャを名前ID(例: "all"
または"top"
)で指定することに注意してください。不確実な場合は、親モデルを参照してその名前が何であるかを判断してください。テクスチャが正しく指定されていないと、テクスチャの問題が発生していないことをエラーで報告することがあります。
また、完全なカスタムモデルを作成したり、カスタムの親モデルを作成したりすることもできます。しかし今のところこれで十分でしょう。
テクスチャを作成して、その名前にdecorative.png
(JSONファイルが指定したもの)という名前をdecorative.png
て、 src\main\resources\assets\example\textures\blocks\
ブロック登録
ブロックの登録は、メインmodクラス、またはpreInit中にメインmodクラスから呼び出されたModBlocksクラスメソッドから実行されます。
Block myBlock = new CustomBlock();
string registryname = "my_block";
block.setRegistryName(registryname);
block.setUnlocalizedName(block.getRegistryName().toString());
GameRegistry.register(block);
block.setUnlocalizedName(block.getRegistryName().toString());
を使用する重要な理由がありblock.setUnlocalizedName(block.getRegistryName().toString());
同様に!これは、あなたのブロック(およびアイテム)のローカライズされていない名前がmod間の言語ファイルの競合を避けるためにmod IDを含むことを保証します。
ああ、アイテムのバージョンもあまりにもあなたの在庫に存在することができますか?これは1.7.10以降に別途作成されており、次のように実行されます:
ItemBlock ib = new ItemBlock(block);
ib.setRegistryName(registryname);
GameRegistry.register(ib);
ItemBlockのレジストリ名をブロックと同じ文字列に設定することに注意してください。これは、ブロックをItemBlockの対応物に、またはその逆にする方法です。
しかし、待って、もっと!
ブロックにアイテムフォームがあるかもしれませんが、そのアイテムにはまだモデルやテクスチャがありません!モデルは自動的にブロック用に登録されますが、アイテムには登録されません。これはクライアントプロキシからのみ呼び出すことができ 、バリアント(羊毛や葉など)のブロックはカバーしません。
ModelLoader.setCustomModelResourceLocation(
ib , 0, new ModelResourceLocation(ib.getRegistryName(),"normal"));
一般的に言えば、ForgeとしてItem Model JSONは必要なく、代わりにバニラがブロックのモデルに戻りますが、これは必ずしも当てはまりません。 ItemモデルJSONが必要な場合は、ブロックJSONに親をsrc\main\resources\assets\example\models\item\
し、ブロックのレジストリ名と同じファイル名でsrc\main\resources\assets\example\models\item\
保存します。
{
"parent": "example:block/my_block"
}