最新版 |
編集中の文章 |
3行目: |
3行目: |
| | | |
| ==はじめに== | | ==はじめに== |
− | MinecraftのMOD作成チュートリアルにようこそ!私達ModderはMinecraftに対してたくさんの制御ができますが、それにはたくさんのコードに圧倒されます。しかし、新しいブロックや機能をMinecraftに追加するのは非常に自由な経験です。もし、あなたにとってゲームの一部分が不満であるとすれば、変えてしまえばいいのです!もし、もっとたくさんのコンテンツが欲しいなら、追加すればいいのです!これらのチュートリアルは簡単にMOD開発を始めるためにほとんどのmodderたちに便利であろう基本的なMODづくりの概念を教えるためのものです。
| + | MinecraftのMOD作成にようこそ!私達ModderはMinecraftに対してたくさんの制御ができますが、それにはたくさんのコードに圧倒されます。しかし、新しいブロックや機能をMinecraftに追加するのは非常に自由な経験です。もし、ゲームの一部分があなたが嫌いであるとすれば、変えればいいのです!もし、もっとたくさんのコンテンツが欲しいなら、追加すればいいのです!これらのチュートリアルは簡単にMOD開発を始めるためにほとんどのmodderたちに便利であろう基本的なMODづくりの概念を教えるためのものです。 |
| | | |
| ==終着点== | | ==終着点== |
− | *どのようにマインクラフトのコードを編集すればいいのか理解する。 | + | *どのようにMinecraftのコードを編集すればいいのか理解する。 |
| *Eclipseでどのようにパッケージやクラスを作ればいいのか理解する。 | | *Eclipseでどのようにパッケージやクラスを作ればいいのか理解する。 |
| *MinecraftのMODのために例文集として理解し使えるようにする。 | | *MinecraftのMODのために例文集として理解し使えるようにする。 |
17行目: |
17行目: |
| このチュートリアルは、[[http://wuppy29.blogspot.nl/2012/08/forge-modding-132.html Wuppy(注 英語)]]の3番目、4番目のチュートリアルをよりわかりやすくしたものです。Wuppyのチュートリアルはコードこそあるものの、なぜそのコードで十分なのか解説していません。これらのチュートリアルはWuppyのチュートリアルと類似しております。 | | このチュートリアルは、[[http://wuppy29.blogspot.nl/2012/08/forge-modding-132.html Wuppy(注 英語)]]の3番目、4番目のチュートリアルをよりわかりやすくしたものです。Wuppyのチュートリアルはコードこそあるものの、なぜそのコードで十分なのか解説していません。これらのチュートリアルはWuppyのチュートリアルと類似しております。 |
| | | |
− | Generic modのソースは、リソースを含んだ状態で[[https://github.com/havvy/Generic-Mod GitHub]]で見つけることが可能です。もし、GitHubのソースが動かないならば、バグのあるファイルを保存してしまったのでしょう。もし、ソースとwikiのソースが同期していないとすれば、バグのあるファイルを保存してしまったのでしょう。
| + | Genetic modのソースは、リソースを含んだ状態で[[https://github.com/havvy/Generic-Mod GitHub]]で見つけることが可能です。もし、GitHubのソースが動かないならば、バグのあるファイルを保存してしまったのでしょう。もし、ソースとwikiのソースが同期していないとすれば、バグのあるファイルを保存してしまったのでしょう。 |
| | | |
− | Generic ModはHavvyによって作られたものです。そのため、あなたが質問があり、リアルタイムに返答を望むのであれば、Havvyを[[http://widget.mibbit.com/?channel=%23minecraftforge&server=irc.esper.net MinecraftForge IRC Channel]]で見つけることができるでしょう。彼は殆どの場合フレンドリーですが、基本的なJavaの質問をすれば、Javaを学んでくるように言うでしょう。
| + | Genetic ModはHavvyによって作られたものです。そのため、あなたが質問があり、リアルタイムに返答を望むのであれば、Havvyを[[http://widget.mibbit.com/?channel=%23minecraftforge&server=irc.esper.net 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が何を自動生成しても、以下のように置き換えてください。
| |
− | | |
− | <source lang="java">
| |
− | 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
| |
− | }
| |
− | }
| |
− | </source>
| |
− | | |
− | 追加されるインポートリストは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ないでは、このアノテーションは以下のように利用されています。
| |
− | <source lang="java">
| |
− | @SidedProxy(clientSide="tutorial.generic.client.ClientProxy", serverSide="tutorial.generic.CommonProxy")
| |
− | public static CommonProxy proxy;
| |
− | </source>
| |
− | | |
− | いつ、どこでプロキシがインスタンス化されるかはわかりませんが、tutorial.generic.CommonProxyがサーバーサイドでは呼ばれ、tutorial.generic.ClientProxyがクライアントサイドでは呼ばれることになります。
| |
− | | |
− | ==作り方==
| |
− | | |
− | 最初に、サーバーサイドのプロキシを見てみましょう。上のコードを見る限り、このクラスはtutorial.generic.CommonProxyに見つかります。CommonProxyクラスをそのパッケージに作ってください。そして以下の例を書いて下さい。
| |
− | | |
− | <source lang="java">
| |
− | 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!
| |
− | }
| |
− | }
| |
− | </source>
| |
− | | |
− | クライアントサイドのプロキシでは、tutorial.generic.client.ClientProxyにあります。同様にクラスを作ってください。また、以下のコードを利用してください。
| |
− | <source lang="java">
| |
− | 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);
| |
− | }
| |
− |
| |
− | }
| |
− | </source>
| |
− | | |
− | これらの中の、フィールドやregisterRenderメソッドの説明は、[[Icons and Textures]]で見つかります。今では、これらのイメージは存在しません。
| |
− | | |
− | ==以上で終わりです==
| |
− | | |
− | 以上のことをすれば、パッケージエクスプローラーは以下のようになっているはずです。
| |
− | | |
− | *Minecraft
| |
− | **src
| |
− | ***tutorial.generic
| |
− | ****Generic
| |
− | ****CommonProxy
| |
− | ***tutorial.generic.client
| |
− | ****ClientProxy
| |
− | | |
− | 以上で、あなたのコンテンツをForgeを用いて追加する準備が完了しました。
| |
− | | |
− | ==次に何をしましょう?==
| |
− | | |
− | *[[Crafting and Smelting]] -新しいアイテムを使う最も優しい方法のチュートリアルです。
| |
− | *[[Basic items]]-基本的なアイテム作成
| |
− | *[[Basic blocks]]-基本的なブロックの作成
| |