main() blog

プログラムやゲーム、旅、愛する家族について綴っていきます。

MacにHomebrewをインストールしてみよう!

MacPythonやGitなどをインストールする際に
公式のサイトからインストーラをダウンロードしてインストールする方法と、
Homebrewからインストールする方法などが紹介されています。

どちらでインストールした方がよいのか?
そもそもHomebrewってどういうものなのか?
その辺りを把握していなかったので今回Homebrewについて確認と、
Homebrew自体のインストールの手順をまとめてみました。

Homebrewとは?

f:id:takezoh_1127:20181115010511p:plain

macOS専用のパッケージ管理ソフトウェアです。
そもそもパッケージ管理ソフトウェアとは何でしょうか?
wikipediaには以下の様に書かれています。

パッケージ管理ソフトウェアとは各種のソフトウェアの導入と削除、そしてソフトウェア同士やライブラリとの依存関係を管理するシステムである。

Homebrewについては以下の様に書かれています。

Homebrew(ホームブルー)は、macOSオペレーティングシステム上でソフトウェアの導入を単純化するパッケージ管理システムのひとつである。MacPortsFinkと同様の目的と機能を備えている。LinuxDebianのAPTに似た使用感で急速に利用が広がっている。

HomebrewはMax Howellによって書かれ、Ruby on Railsコミュニティーで人気を得てきており、その拡張性を評価されている[1]。

そもそもmacOSのパッケージ管理ソフトウェアには以下のものがある様です。

パッケージ管理には、

  1. バイナリを取得するもの
  2. ソースコードを取得してビルドするもの

のパターンがあります。

バイナリを取得するものはあらかじめビルドされているパッケージのバイナリをダウンロードしてインストールします。
MacPortsは基本的にはこの方法ですが、足りない場合はビルドも行うようです。

Homebrewは基本的に必要なソースなどをダウンロードしてビルドを行います。
例えばGitをインストールする場合、Gitのパッケージに必要なソースをダウンロードして
自分の環境でビルドを行ってインストールを行うようです。

Homebrewのインストール

Homebrewをインストールするにはターミナルから以下のコマンドを入力します。

$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

このコマンドはHomebrewの公式サイトに書いてあります。

brew.sh

実行するとインストールが開始されます。

==> This script will install:
/usr/local/bin/brew
/usr/local/share/doc/homebrew
/usr/local/share/man/man1/brew.1
/usr/local/share/zsh/site-functions/_brew
/usr/local/etc/bash_completion.d/brew
/usr/local/Homebrew
==> The following existing directories will be made group writable:
/usr/local/share
==> The following existing directories will have their owner set to takezoh:
/usr/local/share
==> The following existing directories will have their group set to admin:
/usr/local/share
==> The following new directories will be created:
/usr/local/bin
/usr/local/etc
/usr/local/include
/usr/local/lib
/usr/local/sbin
/usr/local/var
/usr/local/opt
/usr/local/share/zsh
/usr/local/share/zsh/site-functions
/usr/local/var/homebrew
/usr/local/var/homebrew/linked
/usr/local/Cellar
/usr/local/Caskroom
/usr/local/Homebrew
/usr/local/Frameworks
==> The Xcode Command Line Tools will be installed.

Press RETURN to continue or any other key to abort

ここでリターンキーの入力を求められます。

==> /usr/bin/sudo /bin/chmod u+rwx /usr/local/share
Password:

次にパスワードの入力を求められるのでMacのユーザーアカウントのパスワードを入力します。

==> /usr/bin/sudo /bin/chmod g+rwx /usr/local/share
==> /usr/bin/sudo /usr/sbin/chown takezoh /usr/local/share
==> /usr/bin/sudo /usr/bin/chgrp admin /usr/local/share
==> /usr/bin/sudo /bin/mkdir -p /usr/local/bin /usr/local/etc /usr/local/include /usr/local/lib /usr/local/sbin /usr/local/var /usr/local/opt /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var/homebrew /usr/local/var/homebrew/linked /usr/local/Cellar /usr/local/Caskroom /usr/local/Homebrew /usr/local/Frameworks
==> /usr/bin/sudo /bin/chmod g+rwx /usr/local/bin /usr/local/etc /usr/local/include /usr/local/lib /usr/local/sbin /usr/local/var /usr/local/opt /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var/homebrew /usr/local/var/homebrew/linked /usr/local/Cellar /usr/local/Caskroom /usr/local/Homebrew /usr/local/Frameworks
==> /usr/bin/sudo /bin/chmod 755 /usr/local/share/zsh /usr/local/share/zsh/site-functions
==> /usr/bin/sudo /usr/sbin/chown takezoh /usr/local/bin /usr/local/etc /usr/local/include /usr/local/lib /usr/local/sbin /usr/local/var /usr/local/opt /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var/homebrew /usr/local/var/homebrew/linked /usr/local/Cellar /usr/local/Caskroom /usr/local/Homebrew /usr/local/Frameworks
==> /usr/bin/sudo /usr/bin/chgrp admin /usr/local/bin /usr/local/etc /usr/local/include /usr/local/lib /usr/local/sbin /usr/local/var /usr/local/opt /usr/local/share/zsh /usr/local/share/zsh/site-functions /usr/local/var/homebrew /usr/local/var/homebrew/linked /usr/local/Cellar /usr/local/Caskroom /usr/local/Homebrew /usr/local/Frameworks
==> /usr/bin/sudo /bin/mkdir -p /Users/takezoh/Library/Caches/Homebrew
==> /usr/bin/sudo /bin/chmod g+rwx /Users/takezoh/Library/Caches/Homebrew
==> /usr/bin/sudo /usr/sbin/chown takezoh /Users/takezoh/Library/Caches/Homebrew
==> /usr/bin/sudo /bin/mkdir -p /Library/Caches/Homebrew
==> /usr/bin/sudo /bin/chmod g+rwx /Library/Caches/Homebrew
==> /usr/bin/sudo /usr/sbin/chown takezoh /Library/Caches/Homebrew
==> Searching online for the Command Line Tools
==> /usr/bin/sudo /usr/bin/touch /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress
==> Installing Command Line Tools (macOS High Sierra version 10.13) for Xcode-10.1
==> /usr/bin/sudo /usr/sbin/softwareupdate -i Command\ Line\ Tools\ (macOS\ High\ Sierra\ version\ 10.13)\ for\ Xcode-10.1
Software Update Tool


Downloading Command Line Tools (macOS High Sierra version 10.13) for Xcode
Downloaded Command Line Tools (macOS High Sierra version 10.13) for Xcode
Installing Command Line Tools (macOS High Sierra version 10.13) for Xcode
Done with Command Line Tools (macOS High Sierra version 10.13) for Xcode
Done.
==> /usr/bin/sudo /bin/rm -f /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress
==> /usr/bin/sudo /usr/bin/xcode-select --switch /Library/Developer/CommandLineTools
==> Downloading and installing Homebrew...
remote: Enumerating objects: 26, done.
remote: Counting objects: 100% (26/26), done.
remote: Compressing objects: 100% (25/25), done.
remote: Total 114578 (delta 4), reused 9 (delta 1), pack-reused 114552
Receiving objects: 100% (114578/114578), 26.55 MiB | 1.33 MiB/s, done.
Resolving deltas: 100% (83753/83753), done.
From https://github.com/Homebrew/brew
 * [new branch]          master     -> origin/master
 * [new tag]             0.1        -> 0.1
 * [new tag]             0.2        -> 0.2
 * [new tag]             0.3        -> 0.3
 * [new tag]             0.4        -> 0.4
 * [new tag]             0.5        -> 0.5
 * [new tag]             0.6        -> 0.6
 * [new tag]             0.7        -> 0.7
 * [new tag]             0.7.1      -> 0.7.1
 * [new tag]             0.8        -> 0.8
 * [new tag]             0.8.1      -> 0.8.1
 * [new tag]             0.9        -> 0.9
 * [new tag]             0.9.1      -> 0.9.1
 * [new tag]             0.9.2      -> 0.9.2
 * [new tag]             0.9.3      -> 0.9.3
 * [new tag]             0.9.4      -> 0.9.4
 * [new tag]             0.9.5      -> 0.9.5
 * [new tag]             0.9.8      -> 0.9.8
 * [new tag]             0.9.9      -> 0.9.9
 * [new tag]             1.0.0      -> 1.0.0
 * [new tag]             1.0.1      -> 1.0.1
 * [new tag]             1.0.2      -> 1.0.2
 * [new tag]             1.0.3      -> 1.0.3
 * [new tag]             1.0.4      -> 1.0.4
 * [new tag]             1.0.5      -> 1.0.5
 * [new tag]             1.0.6      -> 1.0.6
 * [new tag]             1.0.7      -> 1.0.7
 * [new tag]             1.0.8      -> 1.0.8
 * [new tag]             1.0.9      -> 1.0.9
 * [new tag]             1.1.0      -> 1.1.0
 * [new tag]             1.1.1      -> 1.1.1
 * [new tag]             1.1.10     -> 1.1.10
 * [new tag]             1.1.11     -> 1.1.11
 * [new tag]             1.1.12     -> 1.1.12
 * [new tag]             1.1.13     -> 1.1.13
 * [new tag]             1.1.2      -> 1.1.2
 * [new tag]             1.1.3      -> 1.1.3
 * [new tag]             1.1.4      -> 1.1.4
 * [new tag]             1.1.5      -> 1.1.5
 * [new tag]             1.1.6      -> 1.1.6
 * [new tag]             1.1.7      -> 1.1.7
 * [new tag]             1.1.8      -> 1.1.8
 * [new tag]             1.1.9      -> 1.1.9
 * [new tag]             1.2.0      -> 1.2.0
 * [new tag]             1.2.1      -> 1.2.1
 * [new tag]             1.2.2      -> 1.2.2
 * [new tag]             1.2.3      -> 1.2.3
 * [new tag]             1.2.4      -> 1.2.4
 * [new tag]             1.2.5      -> 1.2.5
 * [new tag]             1.2.6      -> 1.2.6
 * [new tag]             1.3.0      -> 1.3.0
 * [new tag]             1.3.1      -> 1.3.1
 * [new tag]             1.3.2      -> 1.3.2
 * [new tag]             1.3.3      -> 1.3.3
 * [new tag]             1.3.4      -> 1.3.4
 * [new tag]             1.3.5      -> 1.3.5
 * [new tag]             1.3.6      -> 1.3.6
 * [new tag]             1.3.7      -> 1.3.7
 * [new tag]             1.3.8      -> 1.3.8
 * [new tag]             1.3.9      -> 1.3.9
 * [new tag]             1.4.0      -> 1.4.0
 * [new tag]             1.4.1      -> 1.4.1
 * [new tag]             1.4.2      -> 1.4.2
 * [new tag]             1.4.3      -> 1.4.3
 * [new tag]             1.5.0      -> 1.5.0
 * [new tag]             1.5.1      -> 1.5.1
 * [new tag]             1.5.10     -> 1.5.10
 * [new tag]             1.5.11     -> 1.5.11
 * [new tag]             1.5.12     -> 1.5.12
 * [new tag]             1.5.13     -> 1.5.13
 * [new tag]             1.5.14     -> 1.5.14
 * [new tag]             1.5.2      -> 1.5.2
 * [new tag]             1.5.3      -> 1.5.3
 * [new tag]             1.5.4      -> 1.5.4
 * [new tag]             1.5.5      -> 1.5.5
 * [new tag]             1.5.6      -> 1.5.6
 * [new tag]             1.5.7      -> 1.5.7
 * [new tag]             1.5.8      -> 1.5.8
 * [new tag]             1.5.9      -> 1.5.9
 * [new tag]             1.6.0      -> 1.6.0
 * [new tag]             1.6.1      -> 1.6.1
 * [new tag]             1.6.10     -> 1.6.10
 * [new tag]             1.6.11     -> 1.6.11
 * [new tag]             1.6.12     -> 1.6.12
 * [new tag]             1.6.13     -> 1.6.13
 * [new tag]             1.6.14     -> 1.6.14
 * [new tag]             1.6.15     -> 1.6.15
 * [new tag]             1.6.16     -> 1.6.16
 * [new tag]             1.6.17     -> 1.6.17
 * [new tag]             1.6.2      -> 1.6.2
 * [new tag]             1.6.3      -> 1.6.3
 * [new tag]             1.6.4      -> 1.6.4
 * [new tag]             1.6.5      -> 1.6.5
 * [new tag]             1.6.6      -> 1.6.6
 * [new tag]             1.6.7      -> 1.6.7
 * [new tag]             1.6.8      -> 1.6.8
 * [new tag]             1.6.9      -> 1.6.9
 * [new tag]             1.7.0      -> 1.7.0
 * [new tag]             1.7.1      -> 1.7.1
 * [new tag]             1.7.2      -> 1.7.2
 * [new tag]             1.7.3      -> 1.7.3
 * [new tag]             1.7.4      -> 1.7.4
 * [new tag]             1.7.5      -> 1.7.5
 * [new tag]             1.7.6      -> 1.7.6
 * [new tag]             1.7.7      -> 1.7.7
 * [new tag]             1.8.0      -> 1.8.0
 * [new tag]             1.8.1      -> 1.8.1
 * [new tag]             1.8.2      -> 1.8.2
HEAD is now at 323556c27 Merge pull request #5314 from RandomDSdevel/fix-brew-deps-include-optional-output-typo
==> Homebrew is run entirely by unpaid volunteers. Please consider donating:
  https://github.com/Homebrew/brew#donations
==> Tapping homebrew/core
Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core'...
remote: Enumerating objects: 4863, done.
remote: Counting objects: 100% (4863/4863), done.
remote: Compressing objects: 100% (4663/4663), done.
remote: Total 4863 (delta 50), reused 323 (delta 10), pack-reused 0
Receiving objects: 100% (4863/4863), 4.03 MiB | 888.00 KiB/s, done.
Resolving deltas: 100% (50/50), done.
Tapped 2 commands and 4649 formulae (4,905 files, 12.6MB).
==> Migrating /Library/Caches/Homebrew to /Users/takezoh/Library/Caches/Homebrew
==> Deleting /Library/Caches/Homebrew...
Already up-to-date.
==> Installation successful!

==> Homebrew has enabled anonymous aggregate formulae and cask analytics.
Read the analytics documentation (and how to opt-out) here:
  https://docs.brew.sh/Analytics.html

==> Homebrew is run entirely by unpaid volunteers. Please consider donating:
  https://github.com/Homebrew/brew#donations
==> Next steps:
- Run `brew help` to get started
- Further documentation: 
    https://docs.brew.sh

"Installation successful!"と表示されていればインストール完了です。
念のため正しくインストールされているかを確認してみましょう。

$ brew doctor

以下のように表示されれば正しくインストールされています。

Your system is ready to brew.

バージョンも確認してみましょう。

$ brew -v

Homebrew 1.8.2
Homebrew/homebrew-core (git revision 5099; last commit 2018-11-13)

これでHomebrewが無事にインストールできました。

参考

以下のサイトを参考にさせて頂きました。

ottan.xyz

aprico-media.com

ty-engineer.com

Minecraft MODでオリジナル「食料」を追加しよう!(Mac編)

今回は「食料」を追加してみます。

Forge MDK 1.12.2 の環境での説明になります。
環境のセットアップなどは過去の記事を参照してください。

www.main-function.com

www.main-function.com

「食料」を追加してみよう

新規にMyItemCustomFoodというクラスを追加します。

package testmod;

import net.minecraft.item.ItemFood;

public class MyItemCustomFood extends ItemFood {

    public MyItemCustomFood(String name, int amount, float saturation, boolean isWolfFood)
    {
        super(amount, saturation, isWolfFood);
        setUnlocalizedName(name);
        setRegistryName(name);
    }
}

ModItemsに以下のコードを追加します。

@Mod.EventBusSubscriber(modid=TestMod.MODID)
public class ModItems {
    
        :
    static Item myApple;

    public static void init()
    {       
            :
            :

        // オリジナルリンゴを追加.
        myApple = new MyItemCustomFood("my_apple", 5, 0.3f, false).setCreativeTab(CreativeTabs.FOOD);
    }
    
    @SubscribeEvent
    public static void registerItems(RegistryEvent.Register<Item> event)
    {
        event.getRegistry().registerAll(myIngot, myApple);
    }
    
    @SubscribeEvent
    public static void registerRenders(ModelRegistryEvent event)
    {
            :
            :
        registerRender(myApple);
    }
}

my_apple.jsonとmy_apple.pngも用意します。

{
    "parent": "item/generated",
    "textures": {
        "layer0": "testmod:items/my_apple"
     },
     
    "display": {
        "thirdperson": {
            "rotation": [-90,0,0],
            "translation": [0,1,-3],
            "scale": [0.55,0.55,0.55]
        },
        "firstperson": {
            "rotation": [0,-135,25],
            "translation": [0,4,2],
            "scale": [1.7,1.7,1.7]
        }
    }
}

実行すると食料のタブにオリジナルのリンゴが追加されています。
もちろん食べることも可能です。

f:id:takezoh_1127:20181110000526p:plain

「効果付き」の食料を追加してみよう

これだけど面白くないので食べたら何かしらの効果が付く食料を作ってみましょう。

新しくMyItemEffectFoodというクラスを作成します。

package testmod;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.MobEffects;
import net.minecraft.item.ItemStack;
import net.minecraft.potion.PotionEffect;
import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public class MyItemEffectFood extends MyItemCustomFood  {

    public MyItemEffectFood(String name, int amount, float saturation, boolean isWolfFood)
    {
        super(name, amount, saturation, isWolfFood);
        setAlwaysEdible();
    }
    
    // ↓食べたら呼ばれる関数.
    @Override
    protected void onFoodEaten(ItemStack stack, World worldIn, EntityPlayer player) {
        if(!worldIn.isRemote) {
            // ↓プレイヤーに跳躍力アップ(JUMP_BOOST)の効果を付ける.
            player.addPotionEffect(new PotionEffect(MobEffects.JUMP_BOOST, 60*20, 5, false, true));
        }
    }
    
    @SideOnly(Side.CLIENT)
    public boolean hasEffect(ItemStack stack)
    {
        return true;
    }
}

プレイヤーが食料を食べると onFoodEaten() という関数が呼ばれるので、
その中でプレイヤーに跳躍力アップの効果を付けてあげます。

ModItemsに以下のコードを追加します。

@Mod.EventBusSubscriber(modid=TestMod.MODID)
public class ModItems {
    
    static Item myIngot;
    static Item myApple;
    static Item myEffectApple;

    public static void init()
    {
            :
            :

        // 跳躍力アップの効果付き.
        myEffectApple = new MyItemEffectFood("my_effect_apple", 5, 0.3f, false).setCreativeTab(CreativeTabs.FOOD);
    }
    
    @SubscribeEvent
    public static void registerItems(RegistryEvent.Register<Item> event)
    {
        event.getRegistry().registerAll(myIngot, myApple, myEffectApple);
    }
    
    @SubscribeEvent
    public static void registerRenders(ModelRegistryEvent event)
    {
            :
            :
        registerRender(myEffectApple);
    }
}

my_effect_apple.jsonも用意します。

{
    "parent": "item/generated",
    "textures": {
        "layer0": "testmod:items/my_apple"
     },
     
    "display": {
        "thirdperson": {
            "rotation": [-90,0,0],
            "translation": [0,1,-3],
            "scale": [0.55,0.55,0.55]
        },
        "firstperson": {
            "rotation": [0,-135,25],
            "translation": [0,4,2],
            "scale": [1.7,1.7,1.7]
        }
    }
}

実行してみます。
食料タブに追加されているので食べみます。

f:id:takezoh_1127:20181110000622p:plain

f:id:takezoh_1127:20181110000936p:plain

跳躍力アップの効果が付いたことが確認できました。

Minecraft MODでオリジナル「素材」を追加しよう!(Mac編)

Forge MDK 1.12.2 の環境での説明になります。

続いてオリジナルの素材を追加してみます。

まずはJavaのソースを用意します。 MyItemというクラスを新規に追加します。 ソースは以下の様に書いてください。

package testmod;

import net.minecraft.item.Item;

public class MyItem extends Item{
    public MyItem(String name) {
        setUnlocalizedName(name);
        setRegistryName(name);
    }   
}

続いてModItemsというクラスを追加します。 ここで "my_ingot" という素材を登録します。

package testmod;

import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.Item;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraftforge.client.event.ModelRegistryEvent;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;

@Mod.EventBusSubscriber(modid=TestMod.MODID)
public class ModItems {
    
    static Item myIngot;

    public static void init()
    {
        // オリジナルインゴットを追加.
        myIngot = new MyItem("my_ingot").setCreativeTab(CreativeTabs.MATERIALS).setMaxStackSize(32);
    }
    
    @SubscribeEvent
    public static void registerItems(RegistryEvent.Register<Item> event)
    {
        event.getRegistry().registerAll(myIngot);
    }
    
    @SubscribeEvent
    public static void registerRenders(ModelRegistryEvent event)
    {
        registerRender(myIngot);
    }
    
    private static void registerRender(Item item)
    {
        ModelLoader.setCustomModelResourceLocation(item, 0, new ModelResourceLocation( item.getRegistryName(), "inventory"));
    }
}

resource以下に設定ファイルとテクスチャを用意します。

models/item以下に "my_ingot.json" を用意します。

{
    "parent": "item/generated",
    "textures": {
        "layer0": "testmod:items/my_ingot"
     },
     
    "display": {
        "thirdperson": {
            "rotation": [-90,0,0],
            "translation": [0,1,-3],
            "scale": [0.55,0.55,0.55]
        },
        "firstperson": {
            "rotation": [0,-135,25],
            "translation": [0,4,2],
            "scale": [1.7,1.7,1.7]
        }
    }
}

textures/items以下にpngを置きます。

f:id:takezoh_1127:20181108215626p:plain

はい、早速実行してみましょう。

起動したら[E]キーを押して持ち物画面を開きます。 その他のタブを選択して一番下までスクロールしてみます。 追加した素材が表示されています。

f:id:takezoh_1127:20181108215707p:plain

f:id:takezoh_1127:20181108215724p:plain

これで無事に素材を追加することができました。

Minecraft MODを弄ってみよう!前回の正しく表示されなかったブロックを正しく設定してみよう!(Mac編)

Forge MDK 1.12.2 の環境での説明になります。

blockをもう少し弄ってみたいと思います。
前回、blockを追加した際に正しく表示されていなかったので、正しく表示されるようにしてみましょう。

blockの追加方法は以下を参考にしてください。

www.main-function.com

以前のblockの実装で一部修正しました。
blokcの名前を小文字の "my_block" に変更しています。

   public static void init() {
        myBlock = new MyBlock("my_block",Material.ROCK).setCreativeTab(CreativeTabs.BUILDING_BLOCKS);
    }

レシピ同様、幾つか設定ファイルが必要になります。
assetsに以下のフォルダを作成しておきます。

assets/testmod/blockstates/ assets/testmod/models/block/ assets/testmod/models/item/ assets/testmod/textures/blocks/

テクスチャ以外のフォルダにブロック名と同じ "my_block.json" を用意しておきます。

blockstates以下のjsonファイルは以下の様に記述します。

{
    "variants": {
        "normal": [
            { "model": "testmod:my_block" }
        ]
    }
}

models/blockstates以下のjsonファイル。

{
    "parent": "block/cube_all",
    "textures": {
        "all": "testmod:blocks/my_block"
    }
}

models/item以下のjsonファイル。

{
    "parent": "testmod:block/my_block"
}

textures/blocks以下に 16x16 のpngファイルを用意します。

ModBlocks.javaに以下のコードを追加します。

public class ModBlocks {
    
    :
    :

    @SubscribeEvent
    public static void registerItemBlocks(RegistryEvent.Register<Item> event) {
        event.getRegistry().register(new ItemBlock(myBlock).setRegistryName(myBlock.getRegistryName()));  
    }
    
    @SubscribeEvent
    public static void registerRenders(ModelRegistryEvent event) {
        registerRender(Item.getItemFromBlock(myBlock));
    }
    
    public static void registerRender(Item item) {
        ModelLoader.setCustomModelResourceLocation(item, 0, new ModelResourceLocation( item.getRegistryName(), "inventory"));
    }
}

f:id:takezoh_1127:20181108003550p:plain

はい、早速実行してみましょう。

起動したら[E]キーを押して持ち物画面を開きます。
建築ブロックのタブの一番下にスクロールします。
追加したブロックが表示されていることを確認します。

f:id:takezoh_1127:20181108003516p:plain

f:id:takezoh_1127:20181108003530p:plain

これでブロックが正しく表示されるようになりました。

Minecraft MODでオリジナルの「レシピ」を追加してみよう!(Mac編)

Forge MDK 1.12.2 の環境での説明になります。

環境構築などについては下記のページを参考にしてください。

www.main-function.com

前回はオリジナルのブロックを追加したので、今回は新しいレシピを追加したいと思います。

新しいレシピを追加してみよう

レシピの追加についてはコーディングが不要となっています。
以前はコーディングして追加していたらしいです。

Forge MDKを展開したフォルダに以下のフォルダを追加します。

/forge-1.12.2-14.23.5.2768-mdk/src/main/resources/assets/testmod/recipes/

asset/とrecipes/は指定されたフォルダ名である必要があります。
testmod/については任意のフォルダ名でも大丈夫そうです。

recipes/の下にjsonファイルを追加します。
ファイル名は任意で大丈夫そうです。

試しに "土"一つで "ダイアモンド" を作るレシピを追加してみます。 jsonファイルに以下を入力してください。

{
    "type":"minecraft:crafting_shapeless",
    "ingredients": [
        {
            "item": "minecraft:dirt",
            "data": 0
        }
    ],
    "result": {
        "item": "minecraft:diamond",
        "data": 0,
        "count": 1
    }
}

キーがingredients(材料)に必要なアイテムを記述します。
配列指定なので土を一つ指定します。

result(結果)にダイアモンドを指定します。

Eclipseの "src/main/resources" のフォルダ以下にjsonファイルが追加されていることを確認します。

f:id:takezoh_1127:20181102194221p:plain

動かして確認してみよう

早速起動してみます。

起動したらゲームモードを切り替えます。
以下を入力してサバイバルモードに切り替えます。

/gamemode 0

地面を掘って土を入手します。

f:id:takezoh_1127:20181102194000p:plain

[E]キーを押して持ち物画面を開きます。
先程入手した "土" をクラフトにドラッグすると...

f:id:takezoh_1127:20181102194104p:plain

はい、"ダイアモンド" が生成されました。

f:id:takezoh_1127:20181102193852p:plain

無事にオリジナルレシピが追加されました。

Minecraft MODでオリジナルの「ブロック」を追加してみよう!(Mac編)

Forge MDK 1.12.2 の環境での説明になります。

環境構築などについては下記のページを参考にしてください。

www.main-function.com

新しいブロックを作ろう

f:id:takezoh_1127:20181101234054p:plain

"testmod"のPackageにクラスを追加します。
右クリック(もしくはメニューバーのFile)、New、Classで作成ダイアログが開きます。
今回はクラス名を "MyBlock" とします。
空のクラスが作成されました。

package testmod;

public class MyBlock {

}

ここにBlockの実装を追記していきます。
まずは以下のように入力してください。

package testmod;

import net.minecraft.block.Block;
import net.minecraft.block.material.Material;

public class MyBlock extends Block {
    public MyBlock(String name, Material materialIn) {
        super(materialIn);
        setUnlocalizedName(name);
        setRegistryName(name);
    }
}

簡単に説明をしていきます。
新しくBlockを作成するためにMinecraftのBlockクラスを継承する必要があります。
クラスをインポートして、Blockクラスを継承します。

// ↓Blockクラスをインポートする
import net.minecraft.block.Block;

// ↓extends BlockでBlockクラスを継承する
public class MyBlock extends Block {

次にMyBlockのコンストラクタを書きます。

// ↓Materialクラスをインポートする
import net.minecraft.block.material.Material;

  :

  // コンストラクタ
    public MyBlock(String name, Material materialIn) {
        super(materialIn);
        setUnlocalizedName(name);
        setRegistryName(name);
    }

ブロックの名前とマテリアルを引数で渡します。
Materialクラスを使用するのでインポートが必要です。
親クラスのコンストラクタを super(materialIn) で呼びます。
名前をセットしておきます。

これで新たに作成するBlockクラスが作成できました。

作ったブロックを登録しよう

次に新しく作ったBlockクラスを登録する処理を書きます。

先程と同様に "testmod" のPackageに "ModBlocks" というクラスを追加します。
以下のソースを書きます。

package testmod;

import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;

@Mod.EventBusSubscriber(modid=TestMod.MODID)
public class ModBlocks {
    public static Block myBlock = null;
    
    public static void init() {
        myBlock = new MyBlock("myBlock",Material.ROCK).setCreativeTab(CreativeTabs.BUILDING_BLOCKS);
    }
    
    @SubscribeEvent
    public static void registerBlocks(RegistryEvent.Register<Block> event) {
        event.getRegistry().registerAll(myBlock);
    }
    
    @SubscribeEvent
    public static void registerItemBlocks(RegistryEvent.Register<Item> event) {
        event.getRegistry().register(new ItemBlock(myBlock).setRegistryName(myBlock.getRegistryName()));  
    }
}

init()でMyBlockクラスのインスタンスを生成します。
引数に名前"myBlock"とマテリアル"ROCK"を渡して生成します。

Block登録時に呼ばれるイベント関数でBlockの登録を行います。

最後にModBlocksの初期化関数をTestModの初期化時に呼ぶようにします。

@Mod(modid=TestMod.MODID, version=TestMod.VERSION)
public class TestMod {
    public static final String MODID = "testmod";
    public static final String VERSION = "1.0";
        
    @EventHandler
    public void preInit(FMLPreInitializationEvent event) {
         // ↓ここを追加
        ModBlocks.init();
    }
    
    @EventHandler
    public void init(FMLInitializationEvent event) {      
    }
}

動かして確認してみよう

早速実行してみましょう。

起動したら[E]キーを押して持ち物画面を開きます。
建築ブロックのタブの一番下にスクロールします。
表示がおかしいですが新規に作成したBlockが追加されていることを確認します。

f:id:takezoh_1127:20181101233016p:plain

[R]キーを押してフィールドに配置もできます。

f:id:takezoh_1127:20181101233034p:plain

これで新規のBlockを追加することができました。

Minecraft MODを弄ってみよう!(Mac編)

Forge MDK 1.12.2 の環境での説明になります。

MODの環境構築については以下のページを参考に設定してください。

www.main-function.com

Eclipseを起動して以下のフォルダをワークスペースとして開きます。

minecraftmod/forge-1.12.2-14.23.5.2768-mdk/eclipse

MDKExampleの下のsrc/main/javaの下にPackageを作成します。
該当のフォルダを右クリック、New、Packageを選択するか、もしくはメニューバーのFile、New、Packageを選択します。

f:id:takezoh_1127:20181031014210p:plain

Package作成のダイアログが表示されるので任意の名前を入力します。

f:id:takezoh_1127:20181031014354p:plain

今回は"testmod"という名前でPackageを作成します。

その下にjavaのソースファイルを作成します。
該当のPackageを右クリック(もしくはメニューバーのFile)、New、Classを選択します。

f:id:takezoh_1127:20181031014518p:plain

Class作成のダイアログが開くので任意の名前を入力します。

f:id:takezoh_1127:20181031014627p:plain

今回は"TestMod"というクラス名で作成します。
作成すると空のクラスが書かれた "クラス名.java" ファイルが追加されます。

package testmod;

public class TestMod {

}

ここにMODの基本となる処理を書いていきます。

package testmod;

import net.minecraftforge.fml.common.Mod;

@Mod(modid=TestMod.MODID, version=TestMod.VERSION)
public class TestMod {
    public static final String MODID = "testmod";
    public static final String VERSION = "1.0";
}

上記のコードを書いて実行してみます。

タイトル画面が起動したらModsを選択してください。

f:id:takezoh_1127:20181031014709p:plain

左のMod Listに testmod が追加されていることを確認してください。

f:id:takezoh_1127:20181031014744p:plain

これでブロックやアイテムを弄れる準備が完了しました。