提供: Minecraft Modding Wiki
2013年6月26日 (水) 18:37時点における202.178.88.170 (トーク)による版 (作り方: ソースコード等を見る限り ClientProxy の位置がtutorial.generic.client.ClientProxyにあるのではないかと確認しましたところそんな感じだったのでそう修正しました。もし、コー...)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
移動先: 案内検索

このページはForge wiki内の[BascicModdingTutorials]の翻訳記事です。多くが意訳で、雑な翻訳であること、見やすさに応じて太字などは独自に変えられている場合がありますのでご注意ください。

Havvy's Minecraft Forge Tutorials(Basic Modding)

はじめに

MinecraftのMOD作成チュートリアルにようこそ!私達ModderはMinecraftに対してたくさんの制御ができますが、それにはたくさんのコードに圧倒されます。しかし、新しいブロックや機能をMinecraftに追加するのは非常に自由な経験です。もし、あなたにとってゲームの一部分が不満であるとすれば、変えてしまえばいいのです!もし、もっとたくさんのコンテンツが欲しいなら、追加すればいいのです!これらのチュートリアルは簡単にMOD開発を始めるためにほとんどのmodderたちに便利であろう基本的なMODづくりの概念を教えるためのものです。

終着点

  • どのようにマインクラフトのコードを編集すればいいのか理解する。
  • Eclipseでどのようにパッケージやクラスを作ればいいのか理解する。
  • MinecraftのMODのために例文集として理解し使えるようにする。

前提知識

  • Forgeの開発環境をインストールし終わっていること。
  • Javaでどのようにプログラムをするか理解していること。(もししていないなら、Javaを学ぶことから始めてください)MODを作成している間にわかってくるかもしれませんが、Minecraftのコミュニケーションチャンネルでは、Javaのヘルプを求めないでください。Javaを学ぶための本やオンラインのチュートリアルがたくさんネット上には存在します。

クレジット

このチュートリアルは、[Wuppy(注 英語)]の3番目、4番目のチュートリアルをよりわかりやすくしたものです。Wuppyのチュートリアルはコードこそあるものの、なぜそのコードで十分なのか解説していません。これらのチュートリアルはWuppyのチュートリアルと類似しております。

Generic modのソースは、リソースを含んだ状態で[GitHub]で見つけることが可能です。もし、GitHubのソースが動かないならば、バグのあるファイルを保存してしまったのでしょう。もし、ソースとwikiのソースが同期していないとすれば、バグのあるファイルを保存してしまったのでしょう。

Generic ModはHavvyによって作られたものです。そのため、あなたが質問があり、リアルタイムに返答を望むのであれば、Havvyを[MinecraftForge IRC Channel]で見つけることができるでしょう。彼は殆どの場合フレンドリーですが、基本的なJavaの質問をすれば、Javaを学んでくるように言うでしょう。

Eclipse

EclipseでForgeプロジェクトを開く

このチュートリアルではあなたがEclipseを使っていることが前提です。Eclipse以外でも、NetBeansやEmacs,Vimなどでも行うことができます。しかし、MinecraftのMODプログラマーはEclipseで始めることによって、かなりの恩恵をうけることができます。 もし、まだ準備していないのならば、Eclipseをダウンロードして下さい。残念なことにも、たくさんのファイルを含みますので、多くのシステムメモリが要求されることをご了承ください。しかし、どれだけシステムリソースをくおうとも、Eclipseは素晴らしいJavaのツールを提供してくれます。あなたが最初にEclipseを開くときは、Eclipseはワークスペースを訪ねてくるでしょう。それを、/forge/mcp/eclipseにすることをご理解ください。

間違ったワークスペースを設定してしまった際、違うワークスペースをすでにEclipseで用いている場合、ファイル→ワークスペースの切り替え→その他から切り替えることが可能です。

以上のことが完了したら、Eclipseは"Minecraft"プロジェクトがパッケージエクスプローラーによって開かれた状態で始まるでしょう。プロジェクトを見れば、"src"と名付けられたソースフォルダが見つかるはずです。それを開くと、とてもたくさんのMinecraftとMinecraft Forgeを構成するパッケージが見つかることでしょう。それらのクラスを変更する気がなくとも、Minecraftがどう動いているのかを理解するために自由にそれらのクラスを読んで構わないのです。

パッケージとクラスを作成する

Forgeを利用してMOD作成をすることは、新しいクラスの追加を用いて全てのMOD開発を行うことを意味します。あなたが、コアMODを作るか、相当良く出来た理由がない限り、他のクラスを編集する必要はありません。また、あなたが追加するクラスは、自分自身のパッケージ内に定義すべきです。 Eclipseでパッケージやクラスを作成するにあたって、パッケージエクスプローラーに含まれるものを右クリックすることにより、パッケージやクラスを追加することができます。パッケージであれば、srcディレクトリ、クラスであれば、所属するパッケージを右クリックして追加してください。パッケージエクスプローラーの要素を右クリックして、新規→パッケージ、もしくは新規→クラスを選ぶのです。

GenericMODの作成にあたっては、tutorial.genericをパッケージとして利用します。以下に示す方法で同様の環境を再現することが可能です。Minecraft/src内にtutorial.genericと名付けたパッケージを作成します。それが終われば、空のtutorial.genericパッケージが存在するはずです。次に、どのようなMODにおいても最初のクラスになるもの:Base MODファイルを作成しましょう。このクラスは、ForgeがMinecraftとあなたのMODを結びつけるためのフックを内包します。genericMODを作るためのこのチュートリアルでは、このクラスをGenericと名づけます。

tutorial.genericパッケージを右クリックし、新しいクラスを作ってください。出てくるダイアログの中で問題になるのは、ソースフォルダと、パッケージと名前だけです。ソースフォルダはMinecraft/srcで、パッケージはtutorial.generic、名前はGenericです。 ここまでの間に、Genericと名付けられたクラスがminecraft/src内に存在するtutorial.genericパッケージに存在するはずです。もしなっていないなら、もう一度トライしてください。

違う名前のパッケージネームを用いることもできます。実際に何かのMODを作る際には、パッケージネームとして、(あなたの名前).(あなたのMODの名前)または、(あなたの名前).minecraft.(あなたのMODの名前)とすることを名前の競合をしないためにも薦めます。

ソースの場所

あなたが作ったパッケージやクラスは、/forge/mcp/src/Minecraft内に見つけることが可能です。

Basic Mod Class

BaseMODクラスはForgeがロードするクラスです。他のクラスはBaseMODがForgeに登録することによって動作します。このため、BaseMODクラスはあなたのMODの名前と同じ名前にすることを提案します。それ故に、GenericMODを作成するこのチュートリアルでは、このクラスはGenericと名付けられています。

一つ前のセクションで、私たちは空のクラスを作りました。Eclipseが何を自動生成しても、以下のように置き換えてください。

package tutorial.generic;

import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.Init;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.Mod.PostInit;
import cpw.mods.fml.common.Mod.PreInit;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.network.NetworkMod;

@Mod(modid="Generic", name="Generic", version="0.0.0")
@NetworkMod(clientSideRequired=true, serverSideRequired=false)
public class Generic {

        /**Forgeが使うあなたのMODのインスタンスです。**/
        @Instance("Generic")
        public static Generic instance;
        
        // どこにクライアントとサーバーの'proxy'コードが有るか示します。
        @SidedProxy(clientSide="tutorial.generic.client.ClientProxy", serverSide="tutorial.generic.CommonProxy")
        public static CommonProxy proxy;
        
        @PreInit
        public void preInit(FMLPreInitializationEvent event) {
                // Stub Method
        }
        
        @Init
        public void load(FMLInitializationEvent event) {
                proxy.registerRenderers();
        }
        
        @PostInit
        public void postInit(FMLPostInitializationEvent event) {
                // Stub Method
        }
}

追加されるインポートリストはEclipseが自動的に編成します。そのため、特別にインポートに関しては何も言いません。 このコードを書いた時点では、エラーになるかもしれません。CommonProxyが赤いアンダーラインによって惹かれているかと思います。Proxy Classセッションで、このクラスを作るからです。

BaseModアノテーション

このBaseMODクラスに関して、質問があるでしょうが、このセクションではそれらに答えます。このセクションでは、BaseModクラスで使われていて、何を示しているのかを列挙します。

@Mod

ForgeにこのクラスがBaseModクラスであることを伝えます。3つのパラメータを持ちます。

 *modid

  あなたのMODに対しての一意の名前です。最初のリリース以降変えるべきではありません。

 *name

  人間の読めるMODの名前です。

 *version

  MODのバージョンを指します。好きなバージョンの書式を用いて構いません。

@NetworkMod

  *clientSideRequired

クライアント側でこのModが必要かを示します。trueであるべきです。

  *serverSideRequired

サーバー側でクライアント側と通信するために必要か示します。サーバー側に設置されていない場合入れないようにするには、trueに設定します。

@Instance

BaseModはSingletonです。(デザインパターンの1種)これはForgeが利用するあなたのクラスへの参照です。@Mod内のmodidと同じ引数を与える必要があります。さもなければ、デフォルトで空の文字列となりますが、同様に空の文字列となっているMODと競合を引き起こします。

@SidedProxy

このプロキシは、Forgeがサーバーかクライアントかどちらが走っていて走っていないかを判別するためにあります。このアノテーションはどのようなフィールドに対しても使用可能です。

  *clientSide

クライアントの実装されている完全修飾名を含みます

  *serverSide

サーバーの実装されている完全修飾名を含みます

@PreInit

このメソッドは、@Initの付けられたメソッドが呼ばれる前に呼び出されます。設定ファイルの読み込みなどに利用できます。

@Init

ここで一般的なMODの初期化を行います。ブロックやアイテムの登録、世界ジェネレータの登録、レシピの登録など、一般的なものはココで見つかります。

@PostInit

他のMODと一緒に働くために提供されています。例えば、初期のブロックidを他のmodに使われていないidに変更したりします。

Proxyクラス

前置き

Minecraftはシングルプレイモードであっても、クライアントとサーバーのセットアップを使います。クライアントがワールドをレンダリングする一方で、サーバーがワールドの状態をメンテナンスします。そのため、特別なことをしない限り、クライアントとサーバーが同時に動くこととなります。片方のサイドで動くコードのための2つのアノテーションが存在するのです。

@SidedProxyアノテーションは、サーバー側にクライアント側とは違うコンストラクタを呼ばせたいときに利用します。両方とも同じ型か、フィールドを継承している必要があります。また、それらのクラスの名前は、文字列として渡されます。baseModないでは、このアノテーションは以下のように利用されています。

@SidedProxy(clientSide="tutorial.generic.client.ClientProxy", serverSide="tutorial.generic.CommonProxy")
public static CommonProxy proxy;

いつ、どこでプロキシがインスタンス化されるかはわかりませんが、tutorial.generic.CommonProxyがサーバーサイドでは呼ばれ、tutorial.generic.ClientProxyがクライアントサイドでは呼ばれることになります。

作り方

最初に、サーバーサイドのプロキシを見てみましょう。上のコードを見る限り、このクラスはtutorial.generic.CommonProxyに見つかります。CommonProxyクラスをそのパッケージに作ってください。そして以下の例を書いて下さい。

package tutorial.generic;

public class CommonProxy {
        public static String ITEMS_PNG = "/tutorial/generic/items.png";
        public static String BLOCK_PNG = "/tutorial/generic/block.png";
        
        // Client stuff
        public void registerRenderers() {
                // Nothing here as the server doesn't render graphics!
        }
}

クライアントサイドのプロキシでは、tutorial.generic.client.ClientProxyにあります。同様にクラスを作ってください。また、以下のコードを利用してください。

package tutorial.generic.client;

import net.minecraftforge.client.MinecraftForgeClient;
import tutorial.generic.CommonProxy;

public class ClientProxy extends CommonProxy {
        
        @Override
        public void registerRenderers() {
                MinecraftForgeClient.preloadTexture(ITEMS_PNG);
                MinecraftForgeClient.preloadTexture(BLOCK_PNG);
        }
        
}

これらの中の、フィールドやregisterRenderメソッドの説明は、Icons and Texturesで見つかります。今では、これらのイメージは存在しません。

以上で終わりです

以上のことをすれば、パッケージエクスプローラーは以下のようになっているはずです。

  • Minecraft
    • src
      • tutorial.generic
        • Generic
        • CommonProxy
      • tutorial.generic.client
        • ClientProxy

以上で、あなたのコンテンツをForgeを用いて追加する準備が完了しました。

次に何をしましょう?