はじめに
今回は、マイクラのMod開発としてオリジナルのブロックに特殊な機能を追加していきたいと思います。
前提
ドロップ作成の前提として、以下記事を参考にModの開発環境が構築されていること。
【参照】
【開発環境構築】VSCodeでMinecraft(Java版)のMOD作成環境を構築する – SEもりのLog (selifemorizo.com)
【Java + Mod開発】オリジナルのアイテムを追加してみる – SEもりのLog (selifemorizo.com)
【Java + Mod開発】オリジナルのブロックをMinecraftで追加してみる – SEもりのLog (selifemorizo.com)
ブロックに機能を追加する
追加する機能は以下です。
・しゃがんでいる場合、ブロックに対してブロックを設置できる
・しゃがんでいない場合、ブロックに対してブロックを設置できない
フォルダ構成
赤字のフォルダ・ファイルが今回必要な追加・修正対象になります。
└─src
├─generated
│ └─resources
│ └─.cache
├─main
│ ├─java
│ │ └─com
│ │ └─mori
│ │ └─morimod
│ │ │ Config.java
│ │ │ MoriMod.java
│ │ │
│ │ ├─blocks
│ │ │ │ MoriModBlock.java
│ │ │ │
│ │ │ └─customize
│ │ │ HiraganaBlock.java
│ │ │
│ │ └─items
│ │ │ MoriModCreativeModeTabs.java
│ │ │ MoriModFood.java
│ │ │ MoriModItem.java
│ │ │
│ │ └─customize
│ │ IronSearcherItem.java
│ │ JudgeItem.java
│ │
│ └─resources
│ │ pack.mcmeta
│ │
│ ├─assets
│ │ └─morimod
│ │ ├─blockstates
│ │ │ a_block.json
│ │ │ moriblock.json
│ │ │ mo_block.json
│ │ │ ri_block.json
│ │ │
│ │ ├─lang
│ │ │ en_us.json
│ │ │ ja_jp.json
│ │ │
│ │ ├─models
│ │ │ ├─block
│ │ │ │ a_block.json
│ │ │ │ moriblock.json
│ │ │ │ mo_block.json
│ │ │ │ ri_block.json
│ │ │ │
│ │ │ └─item
│ │ │ a_block.json
│ │ │ humbarger.json
│ │ │ iron_searcher.json
│ │ │ judge_rod.json
│ │ │ moriblock.json
│ │ │ moriitem.json
│ │ │ moriitem2.json
│ │ │ mo_block.json
│ │ │ ri_block.json
│ │ │
│ │ └─textures
│ │ ├─block
│ │ │ a_block.png
│ │ │ moriblock.png
│ │ │ mo_block.png
│ │ │ ri_block.png
│ │ │
│ │ └─item
│ │ humbarger.png
│ │ iron_searcher.png
│ │ judge_rod.png
│ │ moriitem.png
│ │ moriitem2.png
│ │
│ ├─data
│ │ ├─minecraft
│ │ │ └─tags
│ │ │ └─blocks
│ │ │ │ needs_diamond_tool.json
│ │ │ │ needs_iron_tool.json
│ │ │ │ needs_stone_tool.json
│ │ │ │
│ │ │ └─mineable
│ │ │ axe.json
│ │ │ hoe.json
│ │ │ pickaxe.json
│ │ │ shovel.json
│ │ │
│ │ └─morimod
│ │ ├─loot_tables
│ │ │ └─blocks
│ │ │ moriblock.json
│ │ │ mo_block.json
│ │ │ ri_block.json
│ │ │
│ │ └─recipes
│ │ humbarger.json
│ │ moriblock.json
│ │ moriitem_from_block.json
│ │
│ └─META-INF
│ mods.toml
ソース編集
HiraganaBlock.java
ブロックに対しての挙動を記載するクラスを用意します。
package com.mori.morimod.blocks.customize;
import org.slf4j.Logger;
import com.mojang.logging.LogUtils;
import com.mori.morimod.blocks.MoriModBlock;
import net.minecraft.core.BlockPos;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.BlockHitResult;
public class HiraganaBlock extends Block {
private static final Logger LOGGER = LogUtils.getLogger();
public HiraganaBlock(Properties properties) {
super(properties);
}
@Override
/**
* 右クリック時のイベント
*/
public InteractionResult use(BlockState p_60503_, Level p_60504_, BlockPos p_60505_, Player p_60506_,
InteractionHand p_60507_, BlockHitResult p_60508_) {
if (!p_60504_.isClientSide() && p_60507_ == InteractionHand.MAIN_HAND) {
LOGGER.info("サーバーサイド処理", p_60508_);
// あブロックの場合
if (p_60503_.is(MoriModBlock.A_BLOCK.get())) {
LOGGER.info("あブロック", p_60508_);
// しゃがんでいる場合の処理は、ブロック情報を返却
if (p_60506_.isCrouching()) {
return super.use(p_60503_, p_60504_, p_60505_, p_60506_, p_60507_, p_60508_);
}
return InteractionResult.SUCCESS;
}
}
return super.use(p_60503_, p_60504_, p_60505_, p_60506_, p_60507_, p_60508_);
}
}
MoriModItem.java
ブロック自体の定義を実施する。
package com.mori.morimod.blocks;
import java.util.function.Supplier;
import com.mori.morimod.MoriMod;
import com.mori.morimod.blocks.customize.HiraganaBlock;
import com.mori.morimod.items.MoriModItem;
import net.minecraft.util.valueproviders.UniformInt;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.Item;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.DropExperienceBlock;
import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.material.MapColor;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;
/**
* ブロックMod用クラス
*/
public class MoriModBlock {
// MODIDは自身で設定したものを指定します
public static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, MoriMod.MODID);
// 既存ブロックの設定をコピーしたブロックの設定が可能(↓は鉄ブロック)
// public static final RegistryObject<Block> MORIBLOCK = registerBlock("moriblock",
// () -> new Block(BlockBehaviour.Properties.copy(Blocks.IRON_BARS)));
// ブロックの設定(下は草ブロックの設定をパクってきたもの)
public static final RegistryObject<Block> MORIBLOCK =
registerBlock("moriblock",
() -> new Block(BlockBehaviour.Properties.of()
.mapColor(MapColor.GRASS)
.randomTicks()
.strength(0.6F)
.sound(SoundType.GRASS)));
// あブロック
public static final RegistryObject<Block> A_BLOCK =
registerBlock("a_block",
() -> new HiraganaBlock(BlockBehaviour.Properties.copy(Blocks.IRON_BLOCK)));
private static <T extends Block> RegistryObject<T> registerBlock(String name, Supplier<T> block) {
RegistryObject<T> returnObj = BLOCKS.register(name, block);
registerBlockItem(name, returnObj);
return returnObj;
}
/**
* ブロックをアイテムとして登録するメソッド
*/
private static <T extends Block> RegistryObject<Item> registerBlockItem(String name, RegistryObject<T> block) {
return MoriModItem.ITEMS.register(name, () -> new BlockItem(block.get(), new Item.Properties()));
}
public static void register(IEventBus eventBus) {
BLOCKS.register(eventBus);
}
}
設定の追加
blockstates/a_block.json
{
"variants": {
"": {
"model": "morimod:block/a_block"
}
}
}
models/block/a_block.json
どのテクスチャをどういう形式で出力させるかを設定するファイルです。
ファイル名は自身でつけたアイテムのIDを設定します。
{
"parent": "block/cube_all",
"textures":{
"all": "morimod:block/a_block"
}
}
models/item/a_block.json
{
"parent": "morimod:block/a_block"
}
textures
テクスチャ(画像データ)を格納します。
ja_jp.json
ゲーム内で表示するアイテム名を指定します。
{
"item.morimod.moriitem": "もり アイテム",
"item.morimod.moriitem2": "もり アイテム2",
"item.morimod.iron_searcher": "鉄探知",
"item.morimod.judge_rod": "ブロック鑑定",
"block.morimod.moriblock": "もり ブロック",
"block.morimod.mo_block": "も ブロック",
"block.morimod.ri_block": "り ブロック",
"block.morimod.a_block": "あ ブロック",
"item.morimod.humbarger": "ハンバーガー",
"creativetab.moritab": "もり タブ"
}
実行確認
実際にブロックの挙動を確認してみます。
挙動が確認できたら今回は完了です。
公式サイト
最後に
以上、ログになります。
これからも継続していきましょう!!
コメント