Eclipse+Forgeでマイクラのmod開発～身に着けられる防具（サングラス）を作ってみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191672/0c9d3696-fe6f-fbc7-7c25-dd755ae779ec.png)

最近職場が変わって多忙してました。。なのでかなり久々の記事。忙しいのは変わらないので当分ペースが落ちそうｗ

## 環境

* OS: Windows10
* Jdk: openjdk version "15.0.2" 2021-01-19 ※16.xでもいいかもだけどgradleやらなにやら色々変わってしまって心配だったので今回は15で。
* IDE: Eclipse IDE for Java Developers (Version 4.19.0)
* Buildship(Eclipseのgradleプラグイン) : 3.0
* Minecraft: Java版 1.16.5
* Forge: 1.16.5
* paint.net V4.2.16

## Javaのコード

前回の記事([Eclipse+Forgeでマイクラのmod開発～単純なアイテムの追加](https://qiita.com/kawamune/items/9a58fa6a3e0752ac55f5))の内容をベースに改造していきます。

まずはコード。

```java:ItemTest.java
package jp.munecraft.mod.itemtestmod;

//import文は省略

@Mod(ItemTest.MOD_ID)
public class ItemTest {

	public static final String MOD_ID = "itemtestmod"; 
	private static final Logger LOGGER = LogManager.getLogger();

	private List<Item> items = new LinkedList<Item>();
	private String[] itemIDs = {
		"sunglasses",
	};
	
	public ItemTest() {
		LOGGER.info("Hello item test mod");
		FMLJavaModLoadingContext.get().getModEventBus().register(this);
		createItems();
	}

	protected void createItems() {
		for (String itemID : itemIDs) {
			Item item = createItem(itemID);
			items.add(item);
		}
	}

	protected Item createItem(String id) {
		return createBlockItem(id, null);
	}

	protected Item createBlockItem(String id, Block block) {
		
		Item item = null;
		Item.Properties itemProperties = new Item.Properties();
		itemProperties.tab(ItemGroup.TAB_MATERIALS);
		if (block == null) {
			// ★ここだけ改造
			item = new ArmorItem(SunglassesMaterial.BLACK_GLASS, EquipmentSlotType.HEAD, itemProperties);
		}
		else {
			item = new BlockItem(block, itemProperties);
		}
		item.setRegistryName(MOD_ID, id);
		return item;
	}

	@SubscribeEvent
	public void onRegisterItem(RegistryEvent.Register<Item> event) {
		LOGGER.info("onRegisterItem");
		IForgeRegistry<Item> registry = event.getRegistry();
		for (Item item : items) {
			registry.register(item);
		}
	}
}
```

mod本体のクラスは前回からほとんど変わってません。変更したのは`// ★ここだけ改造`のコメントを入れたところだけ。前回は`new Item()`していたのを`new AmorItem()`にしています。最初の引数では防具の素材（Material）、第二引数では装備する部位（今回は頭）を指定しています。
次のクラスは上のコードで指定した素材（`SunglassesMaterial`）のコードです。中身はほとんど空っぽですがｗ

```java:SunglassesMaterial.java
package jp.munecraft.mod.itemtestmod;

import net.minecraft.inventory.EquipmentSlotType;
import net.minecraft.item.IArmorMaterial;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.util.SoundEvent;

public class SunglassesMaterial implements IArmorMaterial {

	public SunglassesMaterial() {
	}

	@Override
	public int getDurabilityForSlot(EquipmentSlotType p_200896_1_) {
		return 0;
	}

	@Override
	public int getDefenseForSlot(EquipmentSlotType p_200902_1_) {
		return 0;
	}

	@Override
	public int getEnchantmentValue() {
		return 0;
	}

	@Override
	public SoundEvent getEquipSound() {
		return null;
	}

	@Override
	public Ingredient getRepairIngredient() {
		return null;
	}

	@Override
	public String getName() {
		return ItemTest.MOD_ID + ":sunglasses";
	}

	@Override
	public float getToughness() {
		return 0;
	}

	@Override
	public float getKnockbackResistance() {
		return 0;
	}
}
```
とりあえずサングラスをかけられるようにしたかっただけなのでかなり適当。。。ポイントは`getName()`。ここでは`MOD_ID:[防具のID]`を指定。これが後で出てくるテクスチャの指定する際のキーになります。そのほかのパラメータについては概要だけ。

* `getDurabilityForSlot()`: 部位ごとの耐久性。部位は引数で渡される。
* `getDefenseForSlot()`: 部位ごとの防御力。部位は引数で渡される。
* `getEnchantmentValue()`: よくわからない。今後調べてわかったら。。
* `getEquipSound()`: 装備した時の効果音。
* `getRepairIngredient()`: 修理のために使う素材。
* `getToughness()`: 強度。
* `getKnockbackResistance()`: ノックバック体制の有無。ネザライトの防具はデフォでついてる。

強度とか防御力とかややこしいですが、実際ダメージをどれだけ軽減するのかはこれらを組み合わせたちょっと複雑な式で計算されている模様。まぁ、今回メインで書きたい内容ではないのでまたいずれ。。

## リソースファイル

続いて今回登場するリソースファイル。すでに過去記事等で説明済み＆変更がないものは省略します。

```shell
├─java
│  └─jp
│      └─munecraft
│          └─mod
│              └─itemtestmod
│                      ItemTest.java
│                      SunglassesMaterial.java
│
└─resources
    │  pack.mcmeta
    │
    ├─assets
    │  └─itemtestmod
    │      ├─lang
    │      │      en_us.json
    │      │
    │      ├─models
    │      │  └─item
    │      │          sunglasses.json
    │      │
    │      └─textures
    │          └─item
    │          │      sunglasses.png
    │          │
    │          └─models
    │              └─armor
    │                      sunglasses_layer_1.png
    │                      sunglasses_layer_2.png
    └─META-INF
            mods.toml
```

追加しているのは先ほど説明済みの`SunglassesMaterial.java`以外は、`sunglasses_layer_1.png`、`sunglasses_layer_2.png`。この2つのpngファイルがアイテムを装備した時のテクスチャになります。ファイル名と中身には規則がありますが、とりあえずここではファイル名は素材クラスで指定した`MOD_ID:[防具のID]`の`[防具のID]_layer_1.png`と`[防具のID]_layer_2.png`になる点だけ覚えておけばいいです。
テクスチャの編集方法は次に書きます。

## 防具のテクスチャ

### テクスチャの中身

`[防具のID]_layer_1.png`はこんなpngファイルです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191672/14a91a62-5883-3af7-b3e3-60cc36d25804.png" width="500">

なんとなくわかると思いますが、上半分のパーツがヘルメット、下に並んでいるのがチェストです。ヘルメットのしたに飛び地になっている正方形がありますが、これは右肩の上ですね。
続いて`[防具のID]_layer_2.png`

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191672/d89d4bf5-4c7d-299e-832a-c692e149d3a4.png" width="500">

こちらもなんとなくわかると思います。左側がレギンス、右側がブーツですね。それぞれのパーツで6面必要なのに数が合わない。。。と思うのは右足と左足でテクスチャを共有してるから見たい。やってみりゃすぐわかるはずですがまぁ、それも追々。。このpngはテンプレとして今後防具を作るときに活用できるので末尾に載せておきます。

### サングラスを描いてみる

頑張って書くだけ。テンプレのヘルメットの前面にポチポチドット絵を描いていきます。チェストは今回要らないのでチェストの部分は全部消しました（残してても問題ないけど）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191672/c7a8c8ab-9d8c-7b79-892f-9bfdfec593d5.png)

## 動かしてみる

さて、ようやく準備完了。では身に着けてみよ～

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191672/8a6ec062-5dc5-9fe7-dd46-5b5a2619f81a.png">

サングラスのアイテムをドラッグして。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191672/f1356aaf-eedf-ebd7-6600-a0a2a34b3787.png)

装備！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191672/05402545-daab-806b-6832-b13d3e34bf83.png)

じゃーん！

てなわけでうまくサングラスをかけることができましたね。なんかサングラスっぽくないけど。。。というわけで今回はおしまい。以降に今回追加したテクスチャと防具のテンプレを張っておくのでご活用くださいませ。

## リソース

今回作ったサングラスのテクスチャファイル`sunglasses_layer_1.png`
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191672/b5ed2a97-4922-909b-16e2-ae524e90e0c4.png" width="200">

テンプレ1 (xxxx_leyer_1.png用)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191672/3ccaed8d-5d23-3dce-9177-887257f2a7c2.png" width="200">

テンプレ2 (xxxx_leyer_2.png用)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191672/0ffdca34-2026-259e-93e3-b75c7e485152.png" width="200">