0からModを作りたい

Modding・サーバPlugin制作・ツール制作など、開発関連の質問があればこちらにお願い致します。
フォーラムルール
質問関連フォーラムで質問する時は、必ず次のトピックを一読/厳守お願い致します。
viewtopic.php?f=5&t=999
  • (PostNo.213675)

0からModを作りたい

投稿記事by Mod作りたい人 » 2015年1月25日(日) 23:22

マインクラフタ―として、だれもしがいつか思ったであろう「俺もModを作ってみたい」
そんな願いを、このトピックでかなえてもらいたいです。

まったくもって何の知識もない自分ですが、皆様お願いします。

modding wikiを参考にしようと思っていましたが、初心者の自分には説明がアバウトすぎて訳わかめでした…

Forge入りのマイクラで遊んでる人が「俺もModを作ってみたい」という時点からの
Mod開発環境を作る→他のModを参考にブロック、mob、アイテムなどを足すModを作れるようになる。という段階の説明をお願いします。

初めは1.7ら辺がいいと聞いたので、1.7.10で覚えていきたいです。
miyabi@運営チーム[運営宛のメッセージ(PM)を作成] 投稿フォーラム違いのため、トピックを移動しました。
質問:テクスチャ/MOD/その他ツール関係 → 質問:Mod/プラグイン制作関連
Mod作りたい人
ID:77d4d524
 

  • (PostNo.213688)

Re: 0からModを作りたい

投稿記事by elise_blacklab » 2015年1月26日(月) 01:26

このページが完成してくると、ここのページを見にくる人が多くなると思いますので、分かりやすく説明する必要が出てくるというわけですね。厳しい。

本来はwikiの記述を自分で噛み砕いてできる程度の知識や技量がないと厳しいのですが、とりあえずは分かりやすく書いておこうと思います。

手順は1.7.x〜1.8共通です。

1.
先ず、Forgeのダウンロードサイト(http://files.minecraftforge.net/)から、自分がMODを作りたいバージョンのForgeをダウンロードします。
MOD開発ですので、通常のMOD導入に使用する「Universal」ではなく「Src」をダウンロードします。と言っても、クリックする場所がUniversalではなくSrcになるだけです。

ダウンロードしたzipファイルを、「ファイルパスに日本語を含まない場所」に解凍します。できればC:\の直下が望ましいでしょう。

2.
次に、Oracle社のサイトから「Java Development Kit(JDK)」をダウンロード、インストールします。「JDK」の文字の下にある「DOWNLOAD」から進んでください。流石にこの辺の詳しい説明は省略したいなと。
※間違って「Server JRE」や「JRE」をダウンロードしないように
※使用するMinecraftバージョンが1.7.2か、もしくは1.7.10でForgeバージョンの末尾の数字が1217未満の場合は、Java 8(Java SE 8のJDK)を使用しないでください。

質問者様がどこまで進めているか分からないので、この辺で一旦切ります。
メイドつくってたりします.http://6docvc.net/
アバター
elise_blacklab
ID:c6548b6d
掘り廃人
 
記事: 2546
登録日時: 2014年6月25日(水) 18:30

  • (PostNo.213697)

Re: 0からModを作りたい

投稿記事by Mod作りたい人 » 2015年1月26日(月) 07:58

返信ありがとうございます。

自分の扱いたいバージョンのForgeのSrcをダウンロードし、念のため、C:\に解凍しました。

JavaのJDKも自分のPCにあった、Windowsx64をダウンロードしました。
Forgeバージョンの末尾が1230だったので、Java8のままで行きたいと思います。


自分はもう少し進みましたが、自信がないので、できれば順番に教えてもらいたいです。
Mod作りたい人
ID:988e7611
 

  • (PostNo.213702)

Re: 0からModを作りたい

投稿記事by elise_blacklab » 2015年1月26日(月) 10:40

ここからは統合開発環境(IDE)を導入するかしないかで若干手順が異なります。
eclipseなど、JavaのIDEを導入するとソース管理がしやすくなる、複数のコードを一画面で参照できる等メリットがありますが、必須のものではありませんので、IDEの導入方法は省きます。
IDEを導入しない場合は、メモ帳等のテキストエディタ(以後「エディタ」)を使って個別にソースファイルを編集することになります。以下も、IDEを使用しない前提で作業します。

※ただし、これ以降操作するファイル群は文字コード等の管理の観点から、ちょっとしたプログラミング機構のついたエディタを使うのが好ましい。

3.
ここからはForge srcを解凍したディレクトリ(以下、「作業ディレクトリ」)で操作します。
まず、gradlew.batをエディタで開き、2.でJDKをインストールしたパスを、以下のように記載しておきます。
コード: 全て選択
rem 冒頭にset〜が続いている箇所のすぐ下に追記します。
rem 以下はC:\Program Files\Java\jdk1.8.0_31にJDK 8 update 31をインストールした場合の例です。
set JAVA_HOME=C:\PROGRA~1\Java\jdk1.8.0_31

JAVA_HOME=の後ろに、JDKへのパスを記述します。
注意したいのは、通常のフルパスではなくショートネームを記載する点です。
ショートネームとは?
ショートネームは、コマンドプロンプトで「dir /x [ディレクトリ]」を実行した時に「PROGRA~1」(=Program Filesディレクトリを指します)などと出てきます。要は長過ぎる名前をまとめるってことです。
64bitマシンで64bitのJavaをインストールしたなら、例文の通りで問題ないと思いますが、念のためdir /x C:\で調べておきましょう。


4.
次に、以下の内容でinstall.batを作業ディレクトリに作成します。
コード: 全て選択
call gradlew setupDevWorkspace setupDecompWorkspace
pause


作成したらinstall.batをダブルクリックで実行してください。
「BUILD SUCCESSFUL」が表示されていれば成功です。
最後に編集したユーザー elise_blacklab [ 2015年1月27日(火) 02:13 ], 累計 1 回
メイドつくってたりします.http://6docvc.net/
アバター
elise_blacklab
ID:c6548b6d
掘り廃人
 
記事: 2546
登録日時: 2014年6月25日(水) 18:30

  • (PostNo.213821)

Re: 0からModを作りたい

投稿記事by Mod作りたい人 » 2015年1月27日(火) 01:06

ありがとうございます。

Forge srcを解凍し、gradlew.batをエディタで開き、自分はエリーゼさんの書いたコードで丁度よかったので[set JAVA_HOME=C:\PROGRA~1\Java\jdk1.8.0_31]を付け加えました。

install.batも新規作成からテキストドキュメントをbatにし、4番のコードを入れ作りました。

最初はeclipseを入れてたので、そのforge srcの解凍ファイル丸々消して、もう一度解凍から全部やったら、インストール中に何個か作業をスキップしてることがありましたが大丈夫でしょうか?

あと、テクスチャをいじるためにサクラエディタを入れていたのですがプログラミング機構のついたエディタなのでしょうか?別のエディタのほうがいいですか?
Mod作りたい人
ID:988e7611
 

  • (PostNo.213827)

Re: 0からModを作りたい

投稿記事by elise_blacklab » 2015年1月27日(火) 02:09

Mod作りたい人 さんが書きました:インストール中に何個か作業をスキップしてることがありましたが大丈夫でしょうか?

環境のビルドが成功していれば、何ら問題はありません。

Mod作りたい人 さんが書きました:あと、テクスチャをいじるためにサクラエディタを入れていたのですがプログラミング機構のついたエディタなのでしょうか?別のエディタのほうがいいですか?

最低限、「文字コードにSJISかUTF-8が扱えるもの」、「改行コードが変更できるもの」は用意しておいてください(UNIX等で出力されたファイルに改行コードの異なるものがあるため)。サクラエディタは両方指定できるので大丈夫です。
まあプログラミング機構とは言っても、いわゆる「色分け」の機能さえあれば良いのですが…
ちなみに自分は「notepad++」というエディタを使用しました。
メイドつくってたりします.http://6docvc.net/
アバター
elise_blacklab
ID:c6548b6d
掘り廃人
 
記事: 2546
登録日時: 2014年6月25日(水) 18:30

  • (PostNo.214002)

Re: 0からModを作りたい

投稿記事by Mod作りたい人 » 2015年1月27日(火) 22:50

ありがとうございます。

ビルドは成功していたので大丈夫みたいです。

念のため、notepad++を入れてみました。
Mod作りたい人
ID:988e7611
 

  • (PostNo.214008)

Re: 0からModを作りたい

投稿記事by elise_blacklab » 2015年1月27日(火) 23:12

ここからはMODのソースコードを書いていきます。

5.
ソースを書く前の準備として、作業ディレクトリにあるbuild.gradleをエディタで編集します。
コード: 全て選択
version = "1.0"
group= "com.yourname.modid" // http://maven.apache.org/guides/mini/guide-naming-conventions.html
archivesBaseName = "modid"
build.gradleのこの部分を編集します。ここ以外は何も編集しないこと。
  • version=の後にMODのバージョン(自分で分かりやすいものを使用してくだい)
  • group=の後にはプロジェクトのパッケージを指定します。後々MODとして出力するものを指定してください。
    一応↓
    パッケージとは?
    Cの名前空間に相当する、javaのソースコードが所属するグループみたいなもんです。あまり詳しいことはこのフォーラムの範疇を超えるので多くは語りませんが、MinecraftがMODを識別するのに必要なものだと思っていてください。
  • archivesBaseNameには、自分のMOD使用するID(ModID)を指定します。groupと同じく、MinecraftがMODを識別するうえで必要になります。自分で分かりやすいものを指定してください。
groupやarchiveBaseNameに指定した文字列はこれ以降も必要になりますので、一度決めたら固定してください。
また、イコール記号(=)の後の文字列をダブルクォーテーション(")で囲むのを忘れないでください。
※//(ダブルスラッシュ)以降、改行までの文字列はコメントで、「なくても良いもの」です。

例として、ここではcom.example.mymodというパッケージに、myfirstmodというModIDでMODを作るとします。
コード: 全て選択
version = "1.0"
group= "com.example.mymod"
archivesBaseName = "myfirstmod"


書けたら、build.gradleを保存します。

6.
ここからがコーディング作業です。
今更言うまでもありませんが、MODはJavaのコードで制作しますので、制作上の規則はそれに則ることになります。
まず、次のようにディレクトリを作成してください。
作業ディレクトリ
└src
 └main
  └java
この「java」ディレクトリの下にソースコードを配置します。
ソースコード(*.java)は、指定するパッケージに合わせてディレクトリを分けて配置してください。(ex.パッケージがcom.example.mymodなら作業ディレクトリ\src\main\java\com\example\mymodにソースコードを置きます)
ここで先ほどbuild.gradleで指定した「group」の内容が重要になってきます。
後々出力されるのは、「group」で指定したパッケージの下にある「archiveBaseName」で指定したModIDに合致するMODです。要は「先に決めておいたMODしか出力しないよ」、ってことです。したがって、MODのソースコードは、先程「group」で指定したパッケージにある必要があります。

コードの大まかな書き方は次回。
メイドつくってたりします.http://6docvc.net/
アバター
elise_blacklab
ID:c6548b6d
掘り廃人
 
記事: 2546
登録日時: 2014年6月25日(水) 18:30

  • (PostNo.214043)

Re: 0からModを作りたい

投稿記事by Mod作りたい人 » 2015年1月28日(水) 06:20

ありがとうございます!

versionは念のため1.7.10と使うバージョンに合わせたほうがいいんでしょうか?

build.gradleをエディタで、例のコードに編集しました。

ディレクトリを作成しようと思ったら、すでにいくつかディレクトリができていました。
作業ディレクトリ
└src
 └main
  └java
  |└com
  | └example
  |  └examplemod
  |   └ExampleMod.java
  └resouces
   └mcmod.info
この場合はexampleの中にmymodを作り、その中に今後作成するcom.example.mymodのソースコードを置く。という形であってますか?
Mod作りたい人
ID:988e7611
 

  • (PostNo.214044)

Re: 0からModを作りたい

投稿記事by elise_blacklab » 2015年1月28日(水) 07:25

Mod作りたい人 さんが書きました:versionは念のため1.7.10と使うバージョンに合わせたほうがいいんでしょうか?

いえ、ここで指定するバージョンはMOD自体のバージョンなので、むしろ「1.7.10」等を使わないほうがいいでしょう。MODのバージョンは固有のものを持っておくべきです。そうすると、「MODをアップデートしたということがユーザーにも分かるため」です。
あまり意図が無いなら「1.0」のままにするか、MC1.7.10用であると明示したい場合は「1.7.10-1.0」などとすると良いと思われます。

Mod作りたい人 さんが書きました:この場合はexampleの中にmymodを作り、その中に今後作成するcom.example.mymodのソースコードを置く。という形であってますか?

はい、それで問題ありません。
メイドつくってたりします.http://6docvc.net/
アバター
elise_blacklab
ID:6375cfe1
掘り廃人
 
記事: 2546
登録日時: 2014年6月25日(水) 18:30

  • (PostNo.214054)

Re: 0からModを作りたい

投稿記事by Mod作りたい人 » 2015年1月28日(水) 15:42

ありがとうございます。

では、初めてなので1.0のままにしておきます。

mymodも作り、準備できました。
Mod作りたい人
ID:988e7611
 

  • (PostNo.214133)

Re: 0からModを作りたい

投稿記事by elise_blacklab » 2015年1月28日(水) 23:01

7.
それではMODのソースコードの大まかな書き方です。

■MOD本体のクラス(Class)
MinecraftがMODを読み込む際、最初に参照するClassです。これがなければMODは作れません。
これまた多くは語りませんが、Javaでは一つのクラスにつき一つの.javaファイルを使用します。つまりMODだと認識させるために、一つのソースファイルを用意することになります。
そのソースファイルの書き方が以下。

例としてパッケージcom.example.mymodに、MyFirstModというクラスを用意し、これをMOD本体のクラスとすることを考えます。
Javaではクラス名とファイル名は同じにする規則があるので、ファイル名もMyFirstMod.javaとします。※大文字小文字を区別しますので注意してください

ファイルの置き方は、手順6に従って「作業ディレクトリ\src\main\java\com\example\mymod\MyFirstMod.java」となります。

ソースコード中のコメントにある*1等の数字は、その部分の説明を下に書いています。javaでも、//以降改行までの部分はコメントとみなされ無視されます。
コード: 全て選択
package com.example.mymod;//*1
 
//*2
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.event.FMLInitializationEvent;

//*3
@Mod(modid="myfirstmod", name="MyFirstMod", version="1.0")
public class MyFirstMod //*4
{
 
   @EventHandler
   public void preInit(FMLPreInitializationEvent event)
   {
      //*5 Called when Pre-Initialize
   }

   @EventHandler
   public void init(FMLInitializationEvent event)
   {
      //*5 Called when Initialize
   }
}

Java自体のあまり細かい文法規則の説明は省きます。

*1 パッケージ名です。クラスが所属するパッケージを書いてください(配置次第では必ずしも手順5.で指定したgroupのパッケージと同じとは限りませんが、今回はcom.example.mymodしか使用しないので、ソースにもこのパッケージを指定します)。

*2 Javaのソースコードで、外部のパッケージのクラスを参照するのに必要な部分です。import 〜に続いて、使用するクラスを指定します。後々事あるごとに追加することになります。MOD制作の上ではほぼ必須になりますので、不用意に消さないようにしてください

*3 この@Mod(〜と書かれた部分が、このクラスがMOD本体であることを認識させる記述です。
modidには、手順5.でarchiveBaseNameに指定したModIDを、nameにはMinecraftでのMODの表示名を、versionにはMODのバージョン(基本的に手順5で指定したものと同じ)を指定します。

*4 クラスの記述です。コードはこの後の{〜}で囲まれた部分に書きます。この辺はJavaの基本の部分です。

*5 この@EventHandlerがついたメソッドは、ForgeModLoaderによるイベントをハンドルする(通知を受け取って処理を行う)部分になります。メソッドの詳しい解説や文法規則はここでは割愛しますが、とりあえずは*5のコメントがある部分に行いたい処理を書くものだと思ってください。
preInitメソッドは、MODが読み込まれるときに「Pre-Initialize」のタイミングで、initは「Initialize」のタイミングで呼ばれます。
分かりやすく言うと、MOD読み込み時にpreInit()→init()の順番で、それぞれに書いた処理が実行されます。
やや難しい話になりますが、継承クラスのOverrideとは異なり、FMLのEventHandlerはメソッドの引数のみによって区別されます。initという名前でも引数がFMLPreInitializationEventだと、Pre-Initializeのタイミングで実行されてしまうので、間違えないように注意してください。
基本は、この例の形を崩さないようにすれば大丈夫です。


小難しい話が続きましたが、次回は実践としてブロックを一つ追加します。
メイドつくってたりします.http://6docvc.net/
アバター
elise_blacklab
ID:ea3f3f08
掘り廃人
 
記事: 2546
登録日時: 2014年6月25日(水) 18:30

  • (PostNo.214147)

Re: 0からModを作りたい

投稿記事by Mod作りたい人 » 2015年1月29日(木) 02:01

ありがとうございます。

今回から難しくなりましたね。

細かい説明もありがとうございます。
まだチンプンカンプンなので、何度も読んで理解してみます。

とりあえず、mymodの中にMyFirstMod.javaを作り、ソースコードも記入しました。

5.の[archivesBaseName = "myfirstmod"]というところと、
7.の[com.example.mymodに、MyFirstModというクラスを用意]
では、意図的に大文字と小文字に分けるということですね?
Mod作りたい人
ID:988e7611
 

  • (PostNo.214158)

Re: 0からModを作りたい

投稿記事by elise_blacklab » 2015年1月29日(木) 09:30

Mod作りたい人 さんが書きました:5.の[archivesBaseName = "myfirstmod"]というところと、
7.の[com.example.mymodに、MyFirstModというクラスを用意]
では、意図的に大文字と小文字に分けるということですね?
実際は大文字小文字の表記が同じでも動作しますが、今回の例では、不要な混乱を避けるため、ModIDの方はすべて小文字表記にして区別しています。

基本のJava文法を学びたいならこことかを参考にしてください。※リンク先の内容に関する質問はここではお控えください
メイドつくってたりします.http://6docvc.net/
アバター
elise_blacklab
ID:ea3f3f08
掘り廃人
 
記事: 2546
登録日時: 2014年6月25日(水) 18:30

  • (PostNo.214169)

Re: 0からModを作りたい

投稿記事by Mod作りたい人 » 2015年1月29日(木) 13:02

混乱防止ですね、ありがとうございます。

リンクもありがとうございます、吟味させていただきます。
Mod作りたい人
ID:988e7611
 

  • (PostNo.214586)

Re: 0からModを作りたい

投稿記事by elise_blacklab » 2015年1月31日(土) 23:42

それでは実際に追加要素を実装していきましょう(、、、と言うのは簡単ですが、MOBに関してはレンダラの知識が要るためハードルが高いので、ここでは単純なブロックとアイテムに追加にとどめます。)

ブロックの追加
ForgeにおいてBlockを追加するには、net.minecraft.block.Blockクラスを継承したクラスを作成し、登録します。

Blockクラス
1.7.xにおけるBlockクラスの書き方は以下の通りです。例としてMyBlockというクラスを用意するとします。
1.8では描画周りの実装が異なるので、差分はmodding wikiを参照のこと
コード: 全て選択
package com.example.mymod;
 
import java.util.Random;
 
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.world.World;

//*1
public class MyBlock extends Block
{
    public MyBlock() {
        super(Material.rock);//*2
        setCreativeTab(CreativeTabs.tabBlock);
        setBlockName("myBlock");//*3
        setBlockTextureName("myfirstmod:myblock");//*4
    }
 
    @Override
    public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float posX, float posY, float posZ){
        //*5
        return true;
    }
 
    @Override
    public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player){
        //*6
    }

    @Override
    public int quantityDropped(Random random){
        //*7
        return 1;
    }
}

*1 Blockを継承したクラスを作成します。
*2 Blockの性質を指定します。親クラスのコンストラクタを呼び出すため必須です。Material.rockは石です。
指定できるものは基本的にnet.minecraft.block.material.Material内のメンバになります。今回はお試しですので、特に変更しなくても大丈夫です。

*3 Blockの内部名称を指定します。これまた必須です。ここではクラス名の頭文字を小文字にし「myBlock」としました。
*4 テクスチャを指定します。置き場所等は後述します。今は特に何もしないで大丈夫です。
*5 ブロックを右クリックした時の処理です。
メソッドの返り値はbooleanであり、trueを返すと処理をハンドルしたものとして以降の処理を中断させます。どういうことかというと、ブロックの側面を右クリックしてブロックを置けなくなるということです。木材のように積み上げられなくなります(shift+右クリックなら置けます)。falseを返すと、右クリックでブロックを積み上げられます。

*6 ブロックを左クリックした時の処理です。
*7 ブロックを壊した際にドロップする量です。通常は1です。

書けたら、MyFirstModと同じ場所に保存します。
メイドつくってたりします.http://6docvc.net/
アバター
elise_blacklab
ID:ea3f3f08
掘り廃人
 
記事: 2546
登録日時: 2014年6月25日(水) 18:30

  • (PostNo.214619)

Re: 0からModを作りたい

投稿記事by Mod作りたい人 » 2015年2月01日(日) 02:11

お忙しいところありがとうございます。

クラスを作成し、MyFirstModと同じ場所に保存しました。

クラスの名前は【MyBlock.class】でいいのでしょうか?
それとも、【net.minecraft.block.Block】でしょうか?
はたまた、違うのでしょうか??
Mod作りたい人
ID:988e7611
 

  • (PostNo.214639)

Re: 0からModを作りたい

投稿記事by エリンギ » 2015年2月01日(日) 09:12

Mod作りたい人 さんが書きました:お忙しいところありがとうございます。

クラスを作成し、MyFirstModと同じ場所に保存しました。

クラスの名前は【MyBlock.class】でいいのでしょうか?
それとも、【net.minecraft.block.Block】でしょうか?
はたまた、違うのでしょうか??

MyBlock.classで構いません。net.minecraft.block.BlockはMyBlockが継承するクラスです。
アバター
エリンギ
ID:cfc14fd2
掘り廃人
 
記事: 1674
登録日時: 2013年11月30日(土) 17:18
お住まい: 豆腐建築

  • (PostNo.214645)

Re: 0からModを作りたい

投稿記事by elise_blacklab » 2015年2月01日(日) 09:50

一応言っておきますが、コードファイルの名前は【MyBlock.java】です。
*.classはコンパイル後の生成物なので、ソースコードファイルの名前に使用してはいけません。
メイドつくってたりします.http://6docvc.net/
アバター
elise_blacklab
ID:ea3f3f08
掘り廃人
 
記事: 2546
登録日時: 2014年6月25日(水) 18:30

  • (PostNo.214684)

Re: 0からModを作りたい

投稿記事by Mod作りたい人 » 2015年2月01日(日) 12:19

エリンギさん、トピックに返信&アドバイスしてくださってありがとうございます。



エリーゼさん返答ありがとうございます
.classはコンパイル後の生成物でしたか、初心者すぎる質問、失礼しました。
では、【MyBlock.java】という名前でコードファイルを作成しました。
Mod作りたい人
ID:988e7611
 

次へ

Return to 質問:開発・制作関連

x