提供: Minecraft Modding Wiki
2017年3月10日 (金) 00:48時点におけるSwallow794 (トーク | 投稿記録)による版 (見出し、冒頭テキストの修正)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
移動先: 案内検索

この記事は"Minecraft Forge Universal 13.19.0.xxx~"を前提MODとしています。

Wood pickaxe.png
初心者向けのチュートリアルです。
C none.png
Soundに関係のあるチュートリアルです。

サウンドの追加[編集]

メインハンドまたはオフハンドで右クリックすることにより、独自サウンド2種類のいずれかをゲーム内で再生することのできるアイテム1種類を追加する。

ソースコード[編集]

SampleMod.java

import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.*;
import net.minecraft.world.World;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.registry.GameRegistry;

@Mod(modid = SampleMod.MOD_ID, name = SampleMod.MOD_NAME, version = SampleMod.MOD_VERSION)
public class SampleMod {
    public static final String MOD_ID = "samplemod";
    public static final String MOD_NAME = "SampleMod";
    public static final String MOD_VERSION = "0.1.0";

    /*
     * @GameRegistry.ObjectHolder を付けたクラスやフィールドには自動的にForgeRegistryに登録されたオブジェクトが代入されます。
     * 例えば、SampleMod.Items.sample_bellの場合、クラスSampleMod.Itemsで指定されたドメイン名(samplemod)で登録された、
     * フィールドの型(Item、サブクラスでは動かない?)と名前(sample_bell)に対応したオブジェクトが自動代入されます。
     */
    @GameRegistry.ObjectHolder(MOD_ID)
    public static class Items {
        public static final Item sample_bell = null;
    }

    @GameRegistry.ObjectHolder(MOD_ID)
    public static class SoundEvents {
        public static final SoundEvent sample_sound_1 = null;
        public static final SoundEvent sample_sound_2 = null;
    }

    @Mod.EventHandler
    private void preInit(FMLPreInitializationEvent event) {
        if (event.getSide().isClient()) {
            ModelLoader.setCustomModelResourceLocation(Items.sample_bell, 0, new ModelResourceLocation(Items.sample_bell.getRegistryName(), "inventory"));
        }
    }

    /*
     * @Mod.EventBusSubscriberを付けたクラスは @SubscribeEvent に対応した static なメソッドを呼び出すよう登録されます
     */
    @Mod.EventBusSubscriber
    public static class Registration {
        @SubscribeEvent
        protected static void registerItems(RegistryEvent.Register<Item> event) {
            event.getRegistry().registerAll(
                new ItemSampleBell()
                        .setCreativeTab(CreativeTabs.MISC)
                        .setRegistryName(new ResourceLocation(MOD_ID, "sample_bell"))
                        .setUnlocalizedName(MOD_ID + ".sample_bell")
            );
        }

        @SubscribeEvent
        protected static void registerSoundEvents(RegistryEvent.Register<SoundEvent> event) {
            ResourceLocation rl_sample_sound_1 = new ResourceLocation(MOD_ID, "sample_sound_1");
            ResourceLocation rl_sample_sound_2 = new ResourceLocation(MOD_ID, "sample_sound_2");

            event.getRegistry().registerAll(
                    new SoundEvent(rl_sample_sound_1).setRegistryName(rl_sample_sound_1),
                    new SoundEvent(rl_sample_sound_2).setRegistryName(rl_sample_sound_2)
            );
        }
    }

    public static class ItemSampleBell extends Item {
        @Override
        public ActionResult<ItemStack> onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand handIn) {
            /*
             * メインハンドのときsample_sound_1を、オフハンドのときsample_sound_2を鳴らします。
             */
            final SoundEvent sound = handIn == EnumHand.MAIN_HAND ? SoundEvents.sample_sound_1 : SoundEvents.sample_sound_2;

            /*
             * 第1引数は音が鳴ったことを通知するパケット送信先から除外するプレイヤーです。つまり、音を鳴らしたクライアント(のプレイヤー)が該当します。
             * 第2から第4引数は音が鳴る中心座標です。距離と音量(第7引数)に応じて自動で減衰します。
             * 第5引数はサウンドを指定しています。
             * 第6引数はボリューム設定の各音量に対応しています。
             * 第7引数は音量(volume)です。
             * 第8引数はピッチ(pitch)です。
             */
            worldIn.playSound(playerIn, playerIn.posX, playerIn.posY, playerIn.posZ, sound, SoundCategory.RECORDS, 3f, 1f);

            return ActionResult.newResult(EnumActionResult.SUCCESS, playerIn.getHeldItem(handIn));
        }
    }
}

リソース[編集]

mcmod.info
(省略)

assets\samplemod\en_US.lang

# Sample Translation File [en_US]

item.samplemod.sample_bell.name=Sample Bell

samplemod.subtitle.sample_sound_1=Sample Sound 1
samplemod.subtitle.sample_sound_2=Sample Sound 2

assets\samplemod\models\item\sample_bell.json

{
  "parent": "item/generated",
  "textures": {
    "layer0": "items/apple"
  }
}

assets\samplemod\sounds.json

{
  "sample_sound_1": {
    "subtitle": "samplemod.subtitle.sample_sound_1",
    "sounds": ["samplemod:sample_sound_1"]
  },
  "sample_sound_2": {
    "subtitle": "samplemod.subtitle.sample_sound_2",
    "sounds": ["samplemod:sample_sound_2"]
  }
}


assets\samplemod\sounds\sample_sound_1.ogg
(省略)

assets\samplemod\sounds\sample_sound_2.ogg
(省略)

解説[編集]