20200804のJavaに関する記事は10件です。

【アルゴリズム】予算

問題説明

A社では各部署に必要なモノを支援するため、部署ごとにモノを買うのにいくら必要なのかを調べました。
でも、全体予算は決められているためすべての部署にモノを提供はできません。
それで、最大限に多い部署にモノが買えるようにしようと思っています。

モノを買うときは各部署が申請して金額全部を支援しなければなりません。
例えば1,000円を申請した部署には必ず1,000円を支援すべきであり、1,000より少なくは支援できません。

部署ごとに申請した金額が入っている配列dとbudgetがパラメータとして与えられる場合、最大いくつの部署にモノが支援できるかがreturnされるようにsolutionメソッドを作成してください。

条件

  • dは部署ごとに申請した金額が入っている配列であり、長さ(全体の部署数)は1以上100以下です。
    • 例)d.length = 2の場合、部署数は2。
    • 例)d[0]= 3の場合、部署1の申請金額は3。
  • dの値は部署ごとに申請した金額です。申請金額は1以上、100,000以下の自然数です。
  • budgetは予算です。予算は1以上、10,000,000以下の自然数です。

入出力の例

d budget result
[1,3,2,5,4] 9 3
[2,2,3,3] 10 4

解説

※解説は私が作成したコードなので、もっといいアルゴリズム等々ありましたら、共有してください!

import java.util.Arrays;

class Solution {
    public int solution(int[] d, int budget) {

        Arrays.sort(d); // 昇順ソート

        int cnt = 0; // 支援できる部署のカウンター用
        for (; cnt < d.length; cnt++) {
            budget -= d[cnt]; // 支援するたびに、予算から削減していく

            if (budget < 0) break;
        }

        return cnt;
    }
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

オブジェクト指向を軽く勉強してみた

自己紹介

Javaを勉強したての社会人一年目です。
Javaのオブジェクト指向を理解するため、このような記事を書きました(メモする感じで笑笑)。
Javaに関するアドバイス等募集中です。

オブジェクト指向とは

さっそく、本題に入っていきましょう。
そもそもオブジェクト指向ってなんやねんっ最初感じますよね!?(自分もそうやったので...)

オブジェクト指向は、プログラミングを行う上での数多くある考え方の一つみたいです笑笑
オブジェクト指向によって、以下の3つを実現しているそうです。
  1. プログラムの「独立性
  2. プログラムの「再利用性
  3. プログラムの「拡張性

「独立性」を実現するには

オブジェクト指向で「独立性」を実現する考え方として、「カプセル化」というのがあるみたい。

カプセル化
調べたところ、データ(属性)とメソッド(手続き)を1つのオブジェクトにまとめて、その内容を隠蔽する考え方だそうです....
簡単に言っちゃうと(言っちゃていいのか分からないが笑笑)、外からプログラムの処理が見えないようにする考え方かな。

「再利用性」を実現するには

オブジェクト指向で「再利用性」を実現する考え方として、「メソッド」と「継承」というのがあるみたい。

メソッド
プログラムの一連の処理をまとめたもの。「手続き」とも言われているみたいです。

継承
あるクラスの変数やメソッドを別のクラスで使用できるようにする考え方...

「拡張性」を実現するには

オブジェクト指向で「拡張性」を実現する考え方として、「抽象化」というのがあるみたい。

抽象化
複数クラスの共通部分を抜き出して、他は無視する考え方みたいです...

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[自分用メモ]オブジェクト指向を軽く勉強してみた

自己紹介

Javaを勉強したての社会人一年目です。
Javaのオブジェクト指向を理解するため、このような記事を書きました(メモする感じで笑笑)。
Javaに関するアドバイス等募集中です。

オブジェクト指向とは

さっそく、本題に入っていきましょう。
そもそもオブジェクト指向ってなんやねんっ最初感じますよね!?(自分もそうやったので...)

オブジェクト指向は、プログラミングを行う上での数多くある考え方の一つみたいです笑笑
オブジェクト指向によって、以下の3つを実現しているそうです。
  1. プログラムの「独立性
  2. プログラムの「再利用性
  3. プログラムの「拡張性

「独立性」を実現するには

オブジェクト指向で「独立性」を実現する考え方として、「カプセル化」というのがあるみたい。

カプセル化
調べたところ、データ(属性)とメソッド(手続き)を1つのオブジェクトにまとめて、その内容を隠蔽する考え方だそうです....
簡単に言っちゃうと(言っちゃていいのか分からないが笑笑)、外からプログラムの処理が見えないようにする考え方かな。

「再利用性」を実現するには

オブジェクト指向で「再利用性」を実現する考え方として、「メソッド」と「継承」というのがあるみたい。

メソッド
プログラムの一連の処理をまとめたもの。「手続き」とも言われているみたいです。

継承
あるクラスの変数やメソッドを別のクラスで使用できるようにする考え方...

「拡張性」を実現するには

オブジェクト指向で「拡張性」を実現する考え方として、「抽象化」というのがあるみたい。

抽象化
複数クラスの共通部分を抜き出して、他は無視する考え方みたいです...

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Java で Amazon SES SMTP を使用してメールを送信する

会員がログインパスワードを忘れたとき、登録してあるメールアドレスにメールを送信してその中のリンクを押すとパスワードがリセットされる、というのをやりたかったので、AWS 上のWebアプリにメール送信機能を実装。

メール送信機能は jar ファイルにして部品化。

プログラミングより AWS の設定が面倒臭い気がしました。

1.環境

VS Code
Java Extension Pack
Spring Boot Extension Pack

2.SMTP認証情報の習得

以下の URL の内容の通り、AWS のコンソールにログインして「Amazon SES コンソールを使用して Amazon SES SMTP 認証情報を取得する」の1~6を実施してSMTPユーザー名とSMTPパスワードを取得します。

取得するとメールサーバー名とポート番号も表示されます。

https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/smtp-credentials.html

3.Gradle Project の作成

VS Code のコマンドパレットで「Spring Initializr: Generate a Gradle Project」 → 「Java」 → 「任意のGroupId」 → 「任意のArtifactId」 → 「任意のバージョン」 → 「dependenceies は空白」を選択して Gradle Project を作成します。
(別に Spring Boot じゃなくてもいいですけど…)

4.依存関係の追加とか

Amazon SES SMTP を使用してメールを送信するために必要な javax.mail.jar を取得するため、build.gradle ファイルに依存関係を追加します。

build.gradle
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'com.sun.mail:javax.mail:1.6.2' //←追加★
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
}

//↓ついでに追加★
bootJar {
    enabled = false
}
jar {
    enabled = true
    baseName = 'aws-ses-send'
    version = ''
    from configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}

5.実装

AWSのサイトのコードをほぼそのまま使います。

AmazonSES.java
package com.xxx.aws;

import java.util.Properties;

import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class AmazonSES {

    // Replace sender@example.com with your "From" address.
    // This address must be verified.
    static final String FROM = "送信元メールアドレス";
    static final String FROMNAME = "送信元名";

    // Replace recipient@example.com with a "To" address. If your account 
    // is still in the sandbox, this address must be verified.
    // static final String TO = "recipient@example.com";

    // Replace smtp_username with your Amazon SES SMTP user name.
    static final String SMTP_USERNAME = "SMTPユーザー名";

    // Replace smtp_password with your Amazon SES SMTP password.
    static final String SMTP_PASSWORD = "SMTPパスワード";

    // The name of the Configuration Set to use for this message.
    // If you comment out or remove this variable, you will also need to
    // comment out or remove the header below.
    // static final String CONFIGSET = "ConfigSet"; //←不要ならコメントアウト★

    // Amazon SES SMTP host name. This example uses the 米国西部 (オレゴン) region.
    // See https://docs.aws.amazon.com/ses/latest/DeveloperGuide/regions.html#region-endpoints
    // for more information.
    static final String HOST = "メールサーバー名";

    // The port you will connect to on the Amazon SES SMTP endpoint. 
    static final int PORT = ポート番号;

    // static final String SUBJECT = "Amazon SES test (SMTP interface accessed using Java)";

    // static final String BODY = String.join(
    //      System.getProperty("line.separator"),
    //      "<h1>Amazon SES SMTP Email Test</h1>",
    //      "<p>This email was sent with Amazon SES using the ", 
    //      "<a href='https://github.com/javaee/javamail'>Javamail Package</a>",
    //      " for <a href='https://www.java.com'>Java</a>."
    //  );

    public void send(String to,
                                String subject,
                                String body) throws Exception {

        // Create a Properties object to contain connection configuration information.
        Properties props = System.getProperties();
        props.put("mail.transport.protocol", "smtp");
        props.put("mail.smtp.port", PORT); 
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.auth", "true");

        // Create a Session object to represent a mail session with the specified properties. 
        Session session = Session.getDefaultInstance(props);

        // Create a message with the specified information. 
        MimeMessage msg = new MimeMessage(session);
        msg.setFrom(new InternetAddress(FROM,FROMNAME));
        msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
        msg.setSubject(subject);
        msg.setContent(body,"text/html");

        // Add a configuration set header. Comment or delete the 
        // next line if you are not using a configuration set
        // msg.setHeader("X-SES-CONFIGURATION-SET", CONFIGSET);//←不要ならコメントアウト★

        // Create a transport.
        Transport transport = session.getTransport();

        // Send the message.
        try
        {
            System.out.println("Sending...");

            // Connect to Amazon SES using the SMTP username and password you specified above.
            transport.connect(HOST, SMTP_USERNAME, SMTP_PASSWORD);

            // Send the email.
            transport.sendMessage(msg, msg.getAllRecipients());
            System.out.println("Email sent!");
        }
        catch (Exception ex) {
            System.out.println("The email was not sent.");
            System.out.println("Error message: " + ex.getMessage());
        }
        finally
        {
            // Close and terminate the connection.
            transport.close();
        }
    }
}

https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/send-using-smtp-java.html

6.送信元として有効なメールアドレスをAWSに登録する

以下の URL の内容の通り、AWS のコンソールにログインして「Amazon SES コンソールを使用して E メールアドレスを検証する」の1~7を実施して、送信元として有効なメールアドレスを登録します。

この手順が終わったメールアドレスのみ送信元メールアドレスとして使えます。

https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/verify-email-addresses-procedure.html

7.送信先の制限を外す

この状態だと、送信先を自由に選択してメールを送ることはできません。

送信先のメールアドレスも送信元同様、送信先としてメールを送信できるか事前に検証してOKになってないる必要があります。

「サンドボックスの中にいる」という状況です。

送信先を自由に選択してメールを送るには「サンドボックスの外に出る」必要があります。

以下の URL の内容の通り、AWS のコンソールにログインして「Amazon SES サンドボックス外への移動」の1~9を実施して、サポートセンターから許可をもらいます。

https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/request-production-access.html

許可がもらえれば送信先の事前検証は不要になります。

8.実行

VS Code のターミナルから以下のコマンドを実装して、jar ファイルを作成します。

.\gradlew build

作成した jar ファイルを呼び出し元のプロジェクトに配置して、実装した send メソッドを呼べばメール送信できます。

以上です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Java]MinecraftのModを作成しよう 1.14.4【番外編】

(この記事は一連の解説記事の一つになります)

先頭記事:入門編

参考になるサイト

・Minecraft Forge Forums
ユーザーフォーラム。後述。
・Forge Documentation
公式のドキュメンテーションなので一応乗せたけど、実装という点では正直あんまり参考にならない。もちろん正しいことが書いてあるし、概念の理解には役に立つ。
・Minecraft Forge Modding 目次
Qiita記事。日本語。この記事を書くにあたって大部分をこの記事から参考にした。まずはこれらをコピペするだけでも動くので、"何ができるのか"を確認するために一通りやるのもよい。
・初心者modderの備忘録
[1.12/1.15] 個人ブログ。日本語。チュートリアル的な内容がコードともに書かれている。バージョン差異に注意。
・Jabelar's Minecraft Forge Modding Tutorials
[1.12] 個人サイト。英語。実装の指針について詳しい。コードは参考程度に。バージョン差異に注意。
・CurseForge
最近主流(?)なMod配布所。Modの多くはソースコードをgithubで公開しているので、一定の人気があるModのソースコードを見ると非常に役に立つ。
・その他
実はyoutubeにチュートリアル動画が結構ある。「minecraft modding 1.14」等で検索。動画ベースというのが苦手で今回は省略したが、必要に応じて見るとよい。

問題解決ためのTips

わかんないことはバニラのコードに聞け(重要)

ブラウザにそれっぽい参考サイトのタブが無限に増えていくのに全く問題が解決されない、そんな状況になることもあるかと思います。色んなバージョン、色んな人の書き方を見比べてどれが今の自分に正しいのか混乱したり。
そういう言うときはまずバニラのコードを見に行くのが大正義です。大抵のものはバニラの拡張で書けると考えていいです。プログラム的に言えば継承です。これができるようになると飛躍的に理解が深まると思います。

で、それってどこにあるの?
 → プロジェクト -> 外部プロジェクト -> Gradle:net.minecraft.forge:VERSION -> forge-VERSION-recomp.jar

ググり方

わざわざ書くまでもないと思いますが初学者想定なので
基本は「minecraft forge (知りたいこと)」英語資料がアテなので英語で
例えば木を追加したいなら「minecraft forge custom tree」「minecraft forge how to add tree」など 「custom (対象)」がHITしやすいかと思います
こうなるはず物がならないみたいなとき、文法とか気にせず「(対象) not (動詞原型)」でいいです 「tree not generate」「leaves not decay」
バージョンまで指定したいですが、資料が少ないので他バージョンでも見てみて真似できそうなら真似してみるくらいがいいと思います(それでよく罠にはまるんですけど)

フォーラム検索

何度かググってると大抵はForgeのユーザーフォーラムであることに気付くと思います。なのではじめからこっちで検索をかけてもよいです。完全一致検索を利用しましょう(「custom tree」ではなく「"custom tree"」で検索)。フォーラムという性質上、悩みやすい問題に関しては結構見つかります。が、全く参考にならないまま閉じたスレッドも多いので期待しすぎは禁物。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Java]MinecraftのModを作成しよう 1.14.4【3. クリエイティブタブの追加】

(この記事は一連の解説記事の一つになります)

先頭記事:入門編
前の記事:2. ブロックの追加
次の記事:4. ツールの追加

クリエイティブタブの追加

ここまでアイテムとブロックを追加してきましたが、クリエイティブにおいてバニラ1 のアイテムとおなじタブに表示されるのは少し変な気がします。 それに、追加アイテムは独自のタブにまとまっていた方が何かと便利です。ここでは自分のMod用のクリエイティブタブを追加します。

\src\main\java\jp\koteko\example_mod\
   ├ ExampleItemGroup.java
   ├ ExampleMod.java
   └ lists
ExampleItemGroup.java
package jp.koteko.example_mod;

import jp.koteko.example_mod.lists.ItemList;
import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemStack;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;

public class ExampleItemGroup extends ItemGroup {
    public static final ExampleItemGroup DEFAULT = new ExampleItemGroup();

    public ExampleItemGroup() {
        super("example_mod");
    }

    @Override
    @OnlyIn(Dist.CLIENT)
    public ItemStack createIcon() {
        return new ItemStack(ItemList.ExampleIngot);
    }
}

ItemGroupを継承した独自のクラスを定義します。createIconでタブのアイコンを設定します(このメソッドは必須です)。なお、ここで指定した"example_mod"はModIDではなく、このItemGroupの内部IDです。

このタブを使うように、既存の追加アイテムの設定を変更します。

ItemList.java
// ...
import jp.koteko.example_mod.ExampleItemGroup; // 追加
//import net.minecraft.item.ItemGroup; // 削除
// ...
@Mod.EventBusSubscriber(modid = ExampleMod.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD)
public class ItemList {
    // groupの引数を変更
    public static Item ExampleIngot = new Item(new Item.Properties().group(ExampleItemGroup.DEFAULT))
            .setRegistryName(new ResourceLocation(ExampleMod.MOD_ID, "example_ingot"));
    // ...
}

BlockList.java
// ...
import jp.koteko.example_mod.ExampleItemGroup; // 追加
//import net.minecraft.item.ItemGroup; // 削除
// ...
@Mod.EventBusSubscriber(modid = ExampleMod.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD)
public class BlockList {
    // ...
    // groupの引数を変更
    @SubscribeEvent
    public static void registerBlockItems(RegistryEvent.Register<Item> event) {
        event.getRegistry().registerAll(
                new BlockItem(ExampleBlock, new Item.Properties().group(ExampleItemGroup.DEFAULT))
                        .setRegistryName(new ResourceLocation(ExampleMod.MOD_ID, "example_block"))
        );
    }
}

続いて、このままだと表示名が設定されていないので、langファイルに追加します。

en_us.json
{
  "itemGroup.example_mod": "Example Mod",
  "item.example_mod.example_ingot": "Example Ingot",
  "block.example_mod.example_block": "Example Block"
}
ja_jp.json
{
  "itemGroup.example_mod": "例Mod",
  "item.example_mod.example_ingot": "例インゴット",
  "block.example_mod.example_block": "例ブロック"
}

ゲームを起動します。
キャプチャ.PNG
自分のModだけの新しいタブが追加できました。

次の記事

4. ツールの追加

参考

Minecraft 1.14.4 Forge Modの作成 その5 【クリエイティブタブの追加】


  1. Modが入っていない素のマイクラのこと 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Java]MinecraftのModを作成しよう 1.14.4【2. ブロックの追加】

(この記事は一連の解説記事の一つになります)

先頭記事:入門編
前の記事:1. アイテムの追加
次の記事:3. クリエイティブタブの追加

ブロックの追加

ブロックの追加を行います。ブロックの追加はアイテムの追加と近い作業なので簡単です!
アイテムのとき同様にブロックを管理するクラスを作る方法をとります。

\src\main\java\jp\koteko\example_mod\
   ├ ExampleMod.java
   └ lists
      ├ BlockList.java
      └ ItemList.java
BlockList.java
package jp.koteko.example_mod.lists;

import jp.koteko.example_mod.ExampleMod;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.item.BlockItem;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;

@Mod.EventBusSubscriber(modid = ExampleMod.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD)
public class BlockList {
    public static Block ExampleBlock = new Block(Block.Properties.create(Material.IRON))
            .setRegistryName(new ResourceLocation(ExampleMod.MOD_ID, "example_block"));

    @SubscribeEvent
    public static void registerBlocks(RegistryEvent.Register<Block> event) {
        event.getRegistry().registerAll(
                ExampleBlock
        );
    }

    @SubscribeEvent
    public static void registerBlockItems(RegistryEvent.Register<Item> event) {
        event.getRegistry().registerAll(
                new BlockItem(ExampleBlock, new Item.Properties().group(ItemGroup.BUILDING_BLOCKS))
                        .setRegistryName(new ResourceLocation(ExampleMod.MOD_ID, "example_block"))
        );
    }
}

ついでにメインファイルに最初から準備されている登録用の記述は消しておきましょう。

ExampleMod.java
//...
public class ExampleMod
{
    //...

    // ここから削除
    //@Mod.EventBusSubscriber(bus=Mod.EventBusSubscriber.Bus.MOD)
    //public static class RegistryEvents {
    //    @SubscribeEvent
    //    public static void onBlocksRegistry(final RegistryEvent.Register<Block> blockRegistryEvent) {
    //        // register a new block here
    //        LOGGER.info("HELLO from Register Block");
    //    }
    //}
    // ここまで削除
}

さてゲームを起動してみます。
キャプチャ.PNG
キャプチャ2.PNG
ブロックが追加されています!

コードを見てもらうとわかるように、ブロックの追加はアイテムの追加と基本的に同じですが、一つ注意してほしいのは、ブロックはブロックとして存在すると同時にアイテムとしても存在するので、その登録も必要であるという点です。

コードの簡単な説明
ブロックの登録を行う部分
public class BlockList {
    // メンバ変数としてブロックを宣言、初期化しておく
    // Material.IRONはブロックのプロパティとして鉄のようなものを指定
    // setRegistryNameで登録するブロックIDの設定をしている
    // "example_block"の部分が登録されるブロックID 小文字
    public static Block ExampleBlock = new Block(Block.Properties.create(Material.IRON))
            .setRegistryName(new ResourceLocation(ExampleMod.MOD_ID, "example_block"));

    // ブロックの登録
    @SubscribeEvent
    public static void registerBlocks(RegistryEvent.Register<Block> event) {
        event.getRegistry().registerAll(
                ExampleBlock
        );
    }

    // アイテムの登録
    // BlockItemクラスがあるのでこれでnewして登録する 引数は(Block, Item.Propaties)
    @SubscribeEvent
    public static void registerBlockItems(RegistryEvent.Register<Item> event) {
        event.getRegistry().registerAll(
                new BlockItem(ExampleBlock, new Item.Properties().group(ItemGroup.BUILDING_BLOCKS))
                        .setRegistryName(new ResourceLocation(ExampleMod.MOD_ID, "example_block"))
        );
    }
}


無事ブロックが追加されていることを確認したら細かな設定を行っていきます。
アイテムの時の各項目に加え、blockstatesの設定が増えていることに注意してください。

\src\main\resources
   └ assets
      └ example_mod
         ├ blockstates
         │  └ example_block.json
         ├ lang
         │  └ en_us.json
         │  └ ja_jp.json
         ├ models
         │  ├ block
         │  │  └ example_block.json
         │  └ item
         │     └ example_block.json
         └ textures
            ├ blocks
            │  └ example_block.png
            └ items
blockstates\example_block.json
{
  "variants": {
    "": { "model": "example_mod:block/example_block" }
  }
}

"MOD_ID:block/[モデルファイル名]"
ブロックの持つ状態値(state)ごとにテクスチャを設定したりできますが、ここでは省略します。

en_us.json
{
  "item.example_mod.example_ingot": "Example Ingot",
  "block.example_mod.example_block": "Example Block"
}
ja_jp.json
{
  "item.example_mod.example_ingot": "例インゴット",
  "block.example_mod.example_block": "例ブロック"
}
models\block\example_block.json
{
  "parent": "block/cube_all",
  "textures": {
    "all": "example_mod:blocks/example_block"
  }
}

"parent":"block/cube_all"によって単純な立方体を指定。
"all"で全面にテクスチャを指定。

models\item\example_block.json
{
  "parent": "example_mod:block/example_block"
}

"parent"にブロックのモデルファイルを指定。

再度ゲームを起動してみます。
キャプチャ.PNG
キャプチャ.PNG

アイテムの追加ができました!

発展

Q. 壊してもアイテム化しないんだけど?
A. loottableを設定しましょう。

\src\main\resources
   ├ assets
   └ data
      └ example_mod
         └ loot_tables
            └ blocks
               └ example_block.json
example_block.json
{
  "type": "minecraft:block",
  "pools": [
    {
      "rolls": 1,
      "entries": [
        {
          "type": "minecraft:item",
          "name": "example_mod:example_block"
        }
      ]
    }
  ]
}

Q. 光源にしたい
Q. 破壊ツールの設定をしたい
A. net.minecraft.block.Blockを観察しましょう。

Block.java
// ...
   public static class Properties {
      private Material material;
      private MaterialColor mapColor;
      private boolean blocksMovement = true;
      private SoundType soundType = SoundType.STONE;
      private int lightValue;
      private float resistance;
      private float hardness;
      // ...

      // ...
      public Block.Properties doesNotBlockMovement() {
         this.blocksMovement = false;
         return this;
      }

      public Block.Properties slipperiness(float slipperinessIn) {
         this.slipperiness = slipperinessIn;
         return this;
      }

      public Block.Properties sound(SoundType soundTypeIn) {
         this.soundType = soundTypeIn;
         return this;
      }

      public Block.Properties lightValue(int lightValueIn) {
         this.lightValue = lightValueIn;
         return this;
      }

      public Block.Properties hardnessAndResistance(float hardnessIn, float resistanceIn) {
         this.hardness = hardnessIn;
         this.resistance = Math.max(0.0F, resistanceIn);
         return this;
      }
// ...

コンストラクタに与える引数のBlock.Propertiesはブロックの特性にかかわる値を保持しています。またそれらの値のアクセサも定義されています。
これらを参考に以下に例を示します。

BlockList.java
public class BlockList {
    public static Block ExampleBlock = new Block(
            Block.Properties.create(Material.IRON)
                    .hardnessAndResistance(2.0f, 3.0f)
                    .lightValue(15)
                    .harvestLevel(3)
                    .harvestTool(ToolType.SHOVEL))
            .setRegistryName(new ResourceLocation(ExampleMod.MOD_ID, "example_block"));
}

キャプチャ.PNG

Q. 機能を付けたい
A. 発展的な内容のため解説記事は未定です。

次の記事

3. クリエイティブタブの追加

参考

Minecraft 1.14.4 Forge Modの作成 その4 【ブロックの追加】
[Solved][1.14.2] Custom Blocks not dropping Items - Modder Support - Forge Forums

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Java]MinecraftのModを作成しよう 1.14.4【1. アイテムの追加】

(この記事は一連の解説記事の一つになります)

先頭記事:入門編
前の記事:0. 基本ファイル
次の記事:2. ブロックの追加

アイテムの追加

まずはマイクラのModdingにおける「Hello, World!」である、無機能アイテムの追加をしてみましょう。
メインのファイルに書いても勿論いいのですが、増えていくと後々ごちゃごちゃするので、アイテムを管理するクラスを作ってそちらに書いていきます。

\src\main\java\jp\koteko\example_mod\
   ├ ExampleMod.java
   └ lists
      └ ItemList.java
ItemList.java
package jp.koteko.example_mod.lists;

import jp.koteko.example_mod.ExampleMod;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;

@Mod.EventBusSubscriber(modid = ExampleMod.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD)
public class ItemList {
    public static Item ExampleIngot = new Item(new Item.Properties().group(ItemGroup.MISC))
            .setRegistryName(new ResourceLocation(ExampleMod.MOD_ID, "example_ingot"));

    @SubscribeEvent
    public static void registerItems(RegistryEvent.Register<Item> event) {
        event.getRegistry().registerAll(
                ExampleIngot
        );
    }
}

また、メインファイルにも少し変更を加えます。

ExampleMod.java
//...
@Mod(ExampleMod.MOD_ID) // 変更
public class ExampleMod
{
    public static final String MOD_ID = "example_mod"; // 追記
    //...
}

さてゲームを起動してみましょう。
キャプチャ.PNG
クリエイティブでアイテムを確認するとなにやら怪しげな黒と紫のitem.example_mod.example_ingotなるアイテムが増えているのが確認できると思います。これから嫌というほど見ることになるこの黒紫は、対応するテクスチャが見つからなかった時の表示です。

コードの簡単な説明
アイテムの登録を行う部分
// @で始まる行(アノテーション) 書いておくといい感じに色々してくれるらしい
@Mod.EventBusSubscriber(modid = ExampleMod.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD)
public class ItemList {
    // メンバ変数としてアイテムを宣言、初期化しておく
    // group()でクリエイティブタブの設定 ItemGroup.MISCはMiscellaneous(その他)
    // setRegistryNameで登録するアイテムIDの設定をしている
    // "example_ingot"の部分が登録されるアイテムID 小文字
    public static Item ExampleIngot = new Item(new Item.Properties().group(ItemGroup.MISC))
            .setRegistryName(new ResourceLocation(ExampleMod.MOD_ID, "example_ingot"));

    @SubscribeEvent
    public static void registerItems(RegistryEvent.Register<Item> event) {
        // registerAll()で引数に渡されたItemクラスのインスタンスを登録する
        // 引数はカンマ区切りで複数渡せる
        event.getRegistry().registerAll(
                ExampleIngot
        );
    }
}


さて、黒紫を直し、正しいアイテム名を表示するために設定をしましょう。先に追加するファイルとツリー構造を示します。単数・複数形に注意してください。

\src\main\resources
   └ assets
      └ example_mod
         ├ lang
         │  └ en_us.json
         │  └ ja_jp.json
         ├ models
         │  └ item
         │     └ example_ingot.json
         └ textures
            └ items
               └ example_ingot.png

lang以下のjsonファイルでは、各言語における表示を定めます。プログラム中ではIDで管理し、ディスプレイネームはこちらで記述する形です。
models以下のjsonファイルは、テクスチャをどう適用するかを定めます。ファイル名は[対応するアイテムID].jsonとします。
textures以下にはテクスチャファイルを配置します。

次に中身を書いていきましょう。

en_us.json
{
  "item.example_mod.example_ingot": "Example Ingot"
}
en_us.json
{
  "item.example_mod.example_ingot": "例インゴット"
}

"item.MOD_ID.アイテムID": "表示名"

example_ingot.json
{
  "parent": "item/generated",
  "textures": {
    "layer0": "example_mod:items/example_ingot"
  }
}

MOD_ID:items/[テクスチャファイル名]
表示の細かい設定にはモデルファイルが重要になりますが、ここでは省略します。
example_ingot.pngを適当に用意して配置したら再度ゲームを起動してみます。

キャプチャ.PNG
キャプチャ2.PNG

アイテムの追加ができました!

発展

Q. ツールを作りたい
A. 「4. ツールの追加」で解説予定です。

Q. 対応したレシピを作りたい
A. 「6. レシピの追加」で解説予定です。

Q. 食べ物を作りたい
A. 未定です(どこかで書きたい)。

次の記事

2. ブロックの追加

参考

Minecraft 1.14.4 Forge Modの作成 その3 【無機能アイテムの追加】

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Java]MinecraftのModを作成しよう 1.14.4【0. 基本ファイル】

(この記事は一連の解説記事の一つになります)

先頭記事:入門編
前の記事:入門編
次の記事:1. アイテムの追加

基本ファイル

開発環境が整い、ようやくスタートラインに立てました。これからあなたがModdingを進めていくための下準備をしましょう。この辺りは今は深く考えず真似すればいいと思います。

GroupIdとArtifactId

まずはGroupIdおよびArtifactIdを設定します。これはMinecraftどうこうではなく、Javaの方の要求っぽいですが詳しくないので省略します。

パッケージの名前の付け方には一般的な決め方があります。

  • GroupId: 組織名のこと。一般的にはドメインを逆から書く形式
  • ArtifactId: プロジェクトの名前

とのことなので、以下のようにしました。

項目
GroupId jp.koteko
ArtifactId example_mod

適宜自分に合わせて変更してくださいね。これをもとにフォルダをリネームします。

変更前
D:\projects\mc_example_mod\src\main\java
  └ com
      └ example
          └ examplemod
              └ ExampleMod.java
変更後
D:\projects\mc_example_mod\src\main\java
  └ jp
     └ koteko
          └ example_mod
              └ ExampleMod.java

assetsフォルダ

次にテクスチャや効果音などのファイルを配置する assets\example_mod フォルダを作成しておきます。

D:\projects\mc_example_mod\src\main\resources
   ├ assets
   │  └ example_mod
   ├ META-INF
   │   └ mods.toml
   └ pack.mcmeta

pack.mcmeta

さて、すでに配置されているファイルは何なのでしょうか?一つずつ見ていきましょう。

pack.mcmeta
{
    "pack": {
        "description": "examplemod resources",
        "pack_format": 4,
        "_comment": "A pack_format of 4 requires json lang files. Note: we require v4 pack meta for all mods."
    }
}

pack.mcmeta ファイルはリソースパックの詳細を記載するファイルです。
詳しくはWikiを参照しましょう。description は自由に変え、 _comment の行は不要なので消してしまいましょう。

変更後
{
    "pack": {
        "description": "Example Mod resources",
        "pack_format": 4
    }
}

mods.toml

mods.toml
# This is an example mods.toml file. It contains the data relating to the loading mods.
# There are several mandatory fields (#mandatory), and many more that are optional (#optional).
# The overall format is standard TOML format, v0.5.0.
# Note that there are a couple of TOML lists in this file.
# Find more information on toml format here:  https://github.com/toml-lang/toml
# The name of the mod loader type to load - for regular FML @Mod mods it should be javafml
modLoader="javafml" #mandatory
# A version range to match for said mod loader - for regular FML @Mod it will be the forge version
loaderVersion="[28,)" #mandatory (28 is current forge version)
# A URL to refer people to when problems occur with this mod
issueTrackerURL="http://my.issue.tracker/" #optional
# A list of mods - how many allowed here is determined by the individual mod loader
[[mods]] #mandatory
# The modid of the mod
modId="examplemod" #mandatory
# The version number of the mod - there's a few well known ${} variables useable here or just hardcode it
version="${file.jarVersion}" #mandatory
 # A display name for the mod
displayName="Example Mod" #mandatory
# A URL to query for updates for this mod. See the JSON update specification <here>
updateJSONURL="http://myurl.me/" #optional
# A URL for the "homepage" for this mod, displayed in the mod UI
displayURL="http://example.com/" #optional
# A file name (in the root of the mod JAR) containing a logo for display
logoFile="examplemod.png" #optional
# A text field displayed in the mod UI
credits="Thanks for this example mod goes to Java" #optional
# A text field displayed in the mod UI
authors="Love, Cheese and small house plants" #optional
# The description text for the mod (multi line!) (#mandatory)
description='''
This is a long form description of the mod. You can write whatever you want here

Have some lorem ipsum.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed mollis lacinia magna. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed sagittis luctus odio eu tempus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque volutpat ligula eget lacus auctor sagittis. In hac habitasse platea dictumst. Nunc gravida elit vitae sem vehicula efficitur. Donec mattis ipsum et arcu lobortis, eleifend sagittis sem rutrum. Cras pharetra quam eget posuere fermentum. Sed id tincidunt justo. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
'''
# A dependency - use the . to indicate dependency for a specific modid. Dependencies are optional.
[[dependencies.examplemod]] #optional
    # the modid of the dependency
    modId="forge" #mandatory
    # Does this dependency have to exist - if not, ordering below must be specified
    mandatory=true #mandatory
    # The version range of the dependency
    versionRange="[28,)" #mandatory
    # An ordering relationship for the dependency - BEFORE or AFTER required if the relationship is not mandatory
    ordering="NONE"
    # Side this dependency is applied on - BOTH, CLIENT or SERVER
    side="BOTH"
# Here's another dependency
[[dependencies.examplemod]]
    modId="minecraft"
    mandatory=true
    versionRange="[1.14.4]"
    ordering="NONE"
    side="BOTH"

mods.toml ファイルはMod情報を記載するファイルです。
依存などの情報に加え、mod導入時の画面に表示される情報もここに含まれるため、必要に応じて変更しましょう。
キャプチャ.PNG

長いですが、各項目の説明がコメントで書かれているだけなので消しましょう(必要になった時参照できるようにはしておきましょう)。mandatory は必須、 optional は任意項目です。以下に適当に編集した例を示します。

変更後
modLoader="javafml"
loaderVersion="[28,)"
[[mods]]
modId="example_mod"
version="${file.jarVersion}"
displayName="Example Mod"
logoFile="logo.png"
description='''
ここに
    説明を
        入力
'''

[[dependencies.example_mod]]
    modId="forge"
    mandatory=true
    versionRange="[28,)"
    ordering="NONE"
    side="BOTH"

[[dependencies.example_mod]]
    modId="minecraft"
    mandatory=true
    versionRange="[1.14.4]"
    ordering="NONE"
    side="BOTH"

また、Modのロゴ画像として logo.pngresources 直下に配置しました。

D:\projects\mc_example_mod\src\main\resources
   ├ assets
   │  └ example_mod
   ├ META-INF
   │   └ mods.toml
   ├ logo.png
   └ pack.mcmeta

これによって画面表示は以下のように変わりました。
キャプチャ.PNG

メインファイル

TestMod.java
package jp.koteko.example_mod;

import net.minecraft.block.Block;
import net.minecraft.block.Blocks;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.InterModComms;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.fml.event.lifecycle.InterModEnqueueEvent;
import net.minecraftforge.fml.event.lifecycle.InterModProcessEvent;
import net.minecraftforge.fml.event.server.FMLServerStartingEvent;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.util.stream.Collectors;

// The value here should match an entry in the META-INF/mods.toml file
@Mod("example_mod")
public class ExampleMod
{
    // Directly reference a log4j logger.
    private static final Logger LOGGER = LogManager.getLogger();

    public ExampleMod() {
        // Register the setup method for modloading
        FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup);
        // Register the enqueueIMC method for modloading
        FMLJavaModLoadingContext.get().getModEventBus().addListener(this::enqueueIMC);
        // Register the processIMC method for modloading
        FMLJavaModLoadingContext.get().getModEventBus().addListener(this::processIMC);
        // Register the doClientStuff method for modloading
        FMLJavaModLoadingContext.get().getModEventBus().addListener(this::doClientStuff);

        // Register ourselves for server and other game events we are interested in
        MinecraftForge.EVENT_BUS.register(this);
    }

    private void setup(final FMLCommonSetupEvent event)
    {
        // some preinit code
        LOGGER.info("HELLO FROM PREINIT");
        LOGGER.info("DIRT BLOCK >> {}", Blocks.DIRT.getRegistryName());
    }

    private void doClientStuff(final FMLClientSetupEvent event) {
        // do something that can only be done on the client
        LOGGER.info("Got game settings {}", event.getMinecraftSupplier().get().gameSettings);
    }

    private void enqueueIMC(final InterModEnqueueEvent event)
    {
        // some example code to dispatch IMC to another mod
        InterModComms.sendTo("examplemod", "helloworld", () -> { LOGGER.info("Hello world from the MDK"); return "Hello world";});
    }

    private void processIMC(final InterModProcessEvent event)
    {
        // some example code to receive and process InterModComms from other mods
        LOGGER.info("Got IMC {}", event.getIMCStream().
                map(m->m.getMessageSupplier().get()).
                collect(Collectors.toList()));
    }
    // You can use SubscribeEvent and let the Event Bus discover methods to call
    @SubscribeEvent
    public void onServerStarting(FMLServerStartingEvent event) {
        // do something when the server starts
        LOGGER.info("HELLO from server starting");
    }

    // You can use EventBusSubscriber to automatically subscribe events on the contained class (this is subscribing to the MOD
    // Event bus for receiving Registry Events)
    @Mod.EventBusSubscriber(bus=Mod.EventBusSubscriber.Bus.MOD)
    public static class RegistryEvents {
        @SubscribeEvent
        public static void onBlocksRegistry(final RegistryEvent.Register<Block> blockRegistryEvent) {
            // register a new block here
            LOGGER.info("HELLO from Register Block");
        }
    }
}

これがmodのメインとなるファイルです。まずはそのまま使って、ある程度理解が進んできたら随時書き換えなど行えばよいと思います。
ここで注意したいのは、ファイル名(ExampleMod.java)とクラス名(public class ExampleMod)およびコンストラクタ(public ExampleMod())が一致しているかという点と、modIdの指定(@Mod("examplemod"))が mods.toml での指定と同じであるかという点です。違った場合修正しましょう。

次の記事

1. アイテムの追加

参考

Minecraft 1.14.4 Forge Modの作成 その2 【基本的なファイルの配置】

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Java]MinecraftのModを作成しよう 1.14.4【入門編】

TL;DR

・何か「うごいている」感のあるものを作りたい
・じゃああの人気ゲームMinecraftのMOD作成をしてみよう!
意外と簡単にグラフィカルなものが出来上がるので最適!
・チュートリアルを実際に作ってみよう
・もっと界隈が盛り上がってほしい(切実)

(この記事は一連の解説記事の導入になります)

はじめに

皆様こんにちは!楽しくコード書いてますか?
楽しく書けている方はおめでとうございます!すばらしい!
あんまり…な方はようこそいらっしゃいました!ぜひ記事を読んで新しいワクワクを見つけていってくださいね。

これから一連の記事で言わずと知れた超人気ゲームであるMinecraftのMOD作成についてご紹介しようと思います。

言わずと知れてない人
立方体のブロックで構成された世界でサバイバルしたり、建物を建てたり、自由に暮らすゲーム。Mojang社開発。(公式)

MODとは?
Modificationの略。モッド。主にパソコンゲームで用いられる改造用データのこと。日本語で改造というとやや後ろめたい印象があるかもしれないが、ユーザーも参加してゲームを盛り上げていくものとして、海外ではより盛んな文化[要出典]である。MinecraftではMODの使用が公式に許可されているので安心してほしい。

キャプチャ.PNG
キャプチャ2.PNG
様々なMODによって新しいものが増えている様子

ゲームを作るのは難しそう…」と感じる方もいるかと思いますが、実はMOD作成というのは「ゲーム上で動くものを導入すること」なので、ゲームを作るわけじゃないし思ってるほど難しくないです。そう身構えずにまずは触れてみるのが大事だと思います。
また、この記事では初学者に優しく書くことを心掛け丁寧に記述したつもりです(わからないところは遠慮なくご質問ください!)。

0から初めてチュートリアル的なMOD作成、実際にMinecraftに導入するところをゴールとします。一通り終了したときに、自分のつくりたいMODに向けて何をしたらいいか見通しがつくようになることが目標です。

最後に、解説に移る前に大事な点についていくつか述べておきます。
まず一つ目に、これからModdingに取り組むにあたって、必ず自分の開発環境と参考にするサイトのMinecraft本体およびMinecraft Forge(後述)のバージョンを確認してください。バージョンが異なれば実装も(時に大きく)異なります。残念なことに、私がここで共有できるのはそう新しくない一つのバージョンにおけるModdingの知識のみです。あなたが明確な目標を持っているのでなければ、本記事での環境に合わせることで不要なトラブルは避けられるため、これを推奨します。
二つ目として、はしごを外すようで申し訳ないですが、非常に残念なことに、現状MinecraftのModdingに関する参考資料は決して充実しているとはいい難いです。特に日本語資料に関してはほとんどありません。そのため知りたいことがなかなか見つからず苦労することもあると思います。そうした場合のTipsなどはまた別記事に書きますが、問題解決能力はエンジニアの素養でもありますので各自頑張ってみてください。そして願わくは(本記事も含め)あなたが得た知見を是非記録として残してください!たとえ扱うものが同じでも、あなたの言葉で焼き直すことに価値があります。それがいつか誰かの助けになります。
そして3つ目に、解説をする私自身Javaは初学者なので、言語に関して不正確な場合がありますが、その点ご了承ください。

前置きが長くなりましたが、次項からModdingをはじめていきましょう!

環境構築

環境

まずは開発環境を用意しましょう。本記事では以下のバージョンのツール群を用います。

tool / library version
OS Winsows 10 Home
JDK 8u212
Minecraft 1.14.4
Minecraft Forge 1.14.4 (28.1.0)
InteliJ IDEA 2020.1.3 (CE)

Minecraftのバージョンをはじめ、各々でそこそこ古いバージョンを用いていますが、これは参考記事と同じ環境で行ったためです。必要があれば(自信があれば)より新しいバージョンを利用しても構いませんが、互換性の問題は各自で対処してください。また、以降の記述が一部または全部当てはまらない前提で記事をご覧ください。

JDK (Java Development Kit)

Minecraft(Java edition)はJavaで動いているため、Javaの開発環境が必要です。
規約に同意したうえでこちらからダウンロードします。
キャプチャ.PNG
(かなり下の方です)

ただし、ダウンロードにはOracleプロファイル(アカウント)が必要ですので、ない場合は(というか多分ないので)作ります。めんd
登録の際に会社名や部署の入力を求められますが、学生の場合、部署・役職名には「学生」、会社名には学校名、住所には学校の住所を用いればよいでしょう。

ダウンロードしたexeを実行してインストールします。

InteliJ IDEA

次に統合開発環境を入手します。
規約に同意したうえでこちらからダウンロードします。キャプチャ.PNG

ダウンロードしたexeを実行してインストールします。
再度インストールするのが手間なので細かい画面を出せませんが(すみません)、基本的に何も変更する必要はありません。
初回起動時に初期設定画面が出ますが、こちらも適当で大丈夫です。機能改善のためのデータ提供なんかは切っておいてもよいでしょう。

また、デフォルトで言語が英語なので、必要に応じて日本語化を行いましょう(→参考記事)。以降は日本語化済みとして話を進めさせてもらいます。

Minecraft Forge MDK

最後に、MinecraftのMod界隈においてデファクトスタンダードな前提Mod、Minecraft ForgeのDeveloping Kitを入手します。ForgeはModの開発および導入に際して用いる様々な機能を、包括的に提供するAPIです。
規約に同意したうえでこちらからダウンロードします。
キャプチャ.PNG
多分Recommendedでもいい(というかそのほうがいい)と思うけれど、前述の通り参考記事にバージョンを合わせます。下部のShow all Versionsクリックで展開します。
キャプチャ2.PNG
該当のMdkをダウンロードします。ダウンロードしたZipファイルは展開しておきましょう。

任意の場所にプロジェクトフォルダを作成します(例えば、 D:\projects\mc_example_mod 、以降必要に応じてパスは読み替えてください)。
先ほど展開したForgeのフォルダから、プロジェクトフォルダに以下の項目をコピーします。(展開したフォルダごとコピー、あるいはリネームしてそのまま用いてもよいです。ここではREADMEなどを除きました。)

D:\projects\mc_example_mod
 ├ build.gradle
 ├ gradlew
 ├ gradlew.bat
 ├ gradle
 │ └ wrapper
 │   └ gradle-wrapper.jar
 │   └ gradle-wrapper.properties
 └ src
   └ main
     ├ java
     │  └ com
     │     └ example
     │        └ examplemod
     │           └ ExampleMod.java
     └ resources
        ├ META-INF
        │   └ mods.toml
        └ pack.mcmeta

実行構成

IntelliJ IDEA向けの実行構成を作成します。PowerShellを起動し、プロジェクトディレクトリに移動して以下のコマンドを実行しましょう。

PS D:\projects\mc_example_mod> .\gradlew genIntellijRuns

BUILD SUCCESSFULが表示されたら完了です。結構時間がかかるので気長に待ちましょう。

Gradle プロジェクトのインポート

InteliJを起動して「開く」よりプロジェクトディレクトリを開きます。
右下のポップアップ通知あるいは下部イベントログに「Gradleプロジェクトのインポート」を促されると思いますので、これをクリックします。

通知を見失ったら
ctrl+shift+"a" でアクションの検索を開き、「Gradleプロジェクトのインポート」を検索して選択してください。

開いたウィンドウで特に変更せず「OK」をクリック。インポートが開始されますので待ちましょう。
finishedが表示されインポートが完了したら、画面右側にGradleが表示されていると思います。

起動

Gradleメニューから mc_example_mod\Tasks\fg_runs\runClient を右クリック->実行で、ついに見慣れたMinecraftの画面…ではなくデバッグ用に色々表示されてるMinecraftが起動します。
キャプチャ.PNG
キャプチャ.PNG
キャプチャ2.PNG

おめでとうございます!!これであなたも立派なModderです!

まとめ

まずは事前準備として開発環境の準備を紹介しました。いよいよMod作成を進めていきますが、すべて書いていくと記事が長くなりすぎるので、トピックごとに別記事とします。順次各記事にリンクをつなげていくので、一つずつ順番に読んでいただけると幸いです。

余談

折り畳み

実は以前(たしか1.7とかの頃)にもModdingに挑戦したことがありましたが、その時はあえなく挫折。時はたち何かやりたいなーという気分でいたところに、参考記事に出会ったことで再び挑戦する運びとなりました。とても丁寧に書かれていたおかげで今回は挫折せずに基礎的内容を学習することができました。本当にありがとうございます。
さて写経でできる基礎を超えて、いざ自分のやりたいことに手をだそうとしたら、チュートリアルは見つからず参考になりそうな記事も…。しかも気付いたらマイクラの非公式日本フォーラムが閉鎖しているではありませんか。当時マイクラキッズだった自分としては非常にショックでした。Mod製作者はもともとせまいコミュニティではあったと思いますが、フォーラムなき今余計に界隈全体としての活気が感じられず寂しい気持ちでした。
だからこそ自分がとおもい、気合を入れて本記事を書いています。一人でもこれを読んで興味を持つ人がいれば幸いです。
Modを完成させる自信は正直ないですが、しばらくあれこれ遊んでみて、あわよくば完成したModを公開してみたいなぁなどと思っております。

参考記事

Minecraft 1.14.4 Forge Modの作成 その1 【開発環境の準備 IntelliJ IDEA】

各解説目次

【入門編】←イマココ
0. 基本ファイル
1. アイテムの追加
2. ブロックの追加
3. クリエイティブタブの追加
4. ツールの追加
5. 防具の追加
【番外編】

追加予定の解説

6. レシピの追加
7. 実績の追加
8. 鉱石の追加と生成
9. 木の追加と生成

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む