main() blog

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

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

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

複数のバージョンのXcodeのインストール方法

macOS Mojaveの公開に伴いXcodeも10.0にバージョンアップされました。

iPhoneのバージョンアップを行なっていなかった為にXcode10でビルドしたアプリケーションが動作しなくなってしまったので、
以前のバージョンをインストールしてビルドする必要が出てきました。
今回はXcodeの複数のバージョンをインストールする方法を紹介します。

Apple Developersからインストールする方法

以前のバージョンをダウンロードするには以下のサイトからダウンロードします。

Sign in with your Apple ID - Apple Developer

インストールするXcodeのバージョンを選択してダウンロードします。

f:id:takezoh_1127:20181030002610p:plain

展開されたフォルダをアプリケーションフォルダに移動する際にリネームしておきます。

Xcodeのバージョンを確認する

現在のXcodeのバージョンを確認する場合、以下のコマンドで確認することができます。

$ xcodebuild -version

f:id:takezoh_1127:20181030002520p:plain

Xcodeのバージョンを変更する

以下のコマンドでXcodeを切り替えることができます。

$ sudo xcode-select -switch /Applications/Xcode_9.4.1/Contents/Developer/

もう一度バージョンを確認します。

$ xcodebuild -version

f:id:takezoh_1127:20181030002534p:plain

これで無事に切り替えることができました。