【マイクラ統合版】自作アイテムに耐久値をつける方法とスクリプトを解説

はじめに

マインクラフトでオリジナルの武器を制作したとき、耐久値を設定したくなる時があります。そこで本記事では、耐久値を設定する方法について解説していきます。

Character
アイテムや武器に、手軽に制限をつけることができます
  • 前提として、オリジナルの武器・ツールが必要です

オリジナルの武器やツールがない場合、先に以下の記事をご覧ください。カスタムアイテムの制作方法について解説しています:

用意

まずは、アイテムそのものに耐久値の設定をつけなければなりません。itemを定義しているjsonファイルを開き、components内に以下を追加しましょう:

Copied!
      "minecraft:durability":{
        "max_durability":60
      },

ここの”max_durability“にてこのアイテムの耐久値を定義しています。今回は60ですね。この数字はご自身のアイテムに合わせて変更してください。

Character
ちなみに、木の剣の耐久値は59らしいです

さて、実際にゲーム内にて挙動を確認してみましょう。サバイバルモードにて敵を攻撃するなどすると、実際に耐久値が減少していることが分かると思います:

Character
一番左の剣の耐久値、減ってますよね

さて、ここまでは大きな問題はないと思います。

特殊な条件で耐久値を減らす

問題はここからです。オリジナルの武器を作成すると、こう思う時があると思います:

Character
使った時に耐久値を消費して、特殊効果を発動させたい!

すなわち、「敵に対する攻撃」以外の場合にも耐久値を減らしたくなるわけです。しかし、今の段階では「敵への攻撃」以外で耐久値が減ることはありません。どうしましょう…?

これを実装するのが、「ScriptAPI」なのです。

ScriptAPIというのは、簡単に言うとJavaScriptという言語を用いてマインクラフトのゲームシステムを改変する機能を指します。jsonを用いた単なるアイテムの追加に留まらず、そのアイテムの具体的な挙動についてスクリプトを用いて定義できるようになるわけですね。

  • ScriptAPIの環境構築が必要です

ScriptAPIの環境構築については、こちらの記事で解説しています:

以下ではScriptAPIを書くのに必要なmain.jsが既にあることを前提にスクリプトを説明していきます。

Character
尤も、武器の特殊効果を定義する時点でScriptAPIが必須なわけですが

スクリプト

以下は、アイテムを持っているプレイヤー、耐久値を減らしたいアイテムスタック、減らす耐久値数を引数にとって、耐久値を任意の数だけ減らす関数です:

Copied!
/**
 * @param {server.Player} player アイテムを持っているプレイヤー
 * @param {server.ItemStack} itemStack 耐久値を減らしたいアイテムスタック
 * @param {number} amount 減らす耐久値の量 (デフォルトは1)
 * @returns {boolean} アイテムが壊れなかった場合はtrue、壊れた場合はfalseを返す
 */
function reduceDurability(player, itemStack, amount = 1) {
    const durability = itemStack.getComponent(server.ItemComponentTypes.Durability);
    if (!durability) {
        // 耐久コンポーネントがなければ何もしない
        return true; 
    }

    const enchantments = itemStack.getComponent(server.ItemComponentTypes.Enchantable);
    
    const unbreakingEnchant = enchantments?.getEnchantment("unbreaking");
    const unbreakingLevel = unbreakingEnchant ? unbreakingEnchant.level : 0;

    const chanceToTakeDamage = 1 / (1 + unbreakingLevel);

    if (Math.random() > chanceToTakeDamage) {
        return true; // 耐久値が減らなかった(壊れてもいない)
    }

    const inventory = player.getComponent(server.EntityComponentTypes.Inventory).container;
    const slot = player.selectedSlotIndex;

    // 耐久ダメージが最大値以上になるかチェック
    if (durability.damage + amount >= durability.maxDurability) {
        // アイテム破壊処理
        inventory.setItem(slot, undefined);
        player.playSound("random.break");
        return false; // 壊れた
    } else {
        // 耐久値を減らす
        durability.damage += amount;
        inventory.setItem(slot, itemStack);
        return true; // 壊れなかった
    }
}

一応、Boolean型を返しています。耐久値を減らす処理に成功したらtrueを、失敗したらfalseを返すわけですね。これを用いると、例えば以下のように耐久値を減らす処理を実行した上で、この実行結果をもとに挙動を変更することもできます。

Copied!
if (reduceDurability(player, itemStack, 1)) {
    player.playSound("item.axe.use");
} else {
    player.playSound("item.axe.break");
}

この関数の使用例を示します。CustomComponent(カスタムコンポーネント)と相性がいいかと思いますので、それと併用する例としました:

Copied!
TORCH_SWORD_ID = "このアイテムのIDを入力"

server.world.beforeEvents.worldInitialize.subscribe(initEvent => {
  initEvent.itemComponentRegistry.registerCustomComponent(TORCH_SWORD_ID, {
    onUse(arg){
        const player = arg.source;
        const itemStack = arg.itemStack;
        reduceDurability(player, itemStack, 1);
        }
    }
}

これはアイテムを右クリックしたら耐久値を1減らすという、シンプルなプログラムですね。実際にはここに様々な効果を追記していくことになると思います。カスタムコンポーネントの詳細についてはこちらの記事が詳しいです:

おしまい

ということで、本記事では任意のカスタムアイテムについて耐久値を任意の数だけ減らす方法について解説しました。これを使えば、同様に耐久値を増やす操作も可能になりますので、理論上は任意の耐久値に設定することもできるはずです。是非、お試しください。

最新情報をチェックしよう!