【マイクラ統合版】プレイヤーのインベントリ内のアイテムの有無を判定する関数【ScriptAPI】

概要

タイトルの通りです。プレイヤーのインベントリ内に、指定のアイテムがあればTrueを、そうでなければFalseを返す関数を作ってみました。

function has_item(itemName, player){
    for (let i=0;i<=35;i++){
        if(player.getComponent("minecraft:inventory").container.getSlot(i).typeId == itemName){
            return true;
        }
    }
    return false;
}

ご覧の通り、アイテムのidとplayerを引数にとります。

具体例

以下は、この関数の使用例です。プレイヤーのインベントリ内にリンゴがあれば「リンゴを持っています」と発し、そうでなければ「リンゴを持っていません」を発します。

server.system.afterEvents.scriptEventReceive.subscribe(ev => {
    if(ev.id == "lq:test"){
        let player = ev.sourceEntity;
        if(has_item("minecraft:apple",player)){
            player.runCommand("say リンゴを持っています");
        }else{
            player.runCommand("say リンゴを持っていません");
        }
    }
})

プレイヤーのフラグ管理に使うことができそうです。

おまけ

これを応用して、現在持っているアイテムの個数を取得することができそうです。

function get_item_amount(itemName, player){
    let amount = 0
    for (let i=0;i<=35;i++){
        let container_item = player.getComponent("minecraft:inventory").container.getSlot(i)
        try{
            if(container_item.typeId == itemName){
                amount += player.getComponent("minecraft:inventory").container.getSlot(i).amount;
            }   
        }
        catch(error){
            continue
        }
    }
    return amount;
}

これは先と同様にアイテムのidとplayerを引数として現在インベントリ内にあるアイテムの個数をint形式で返します。

今回解説したスクリプトを使って、友人・コミュニティー内で24時間いつでも遊べるマルチサーバーを構築したい場合は、VPS(レンタルサーバー)の導入が近道です。

私の開発・検証環境では「シンVPS」を使用しています。

シンVPS コントロールパネル画像

以前は自宅PCでホストしていましたが、PCの電源を切り忘れるストレスや、電気代を考慮して移行しました。シンVPSを選んだ決め手は、圧倒的なコストパフォーマンスです。

  • 月額の安さ 4GBプランでも月額1,200円程度(長期契約なら1,000円以下)と維持費が安く済みます。
  • 高速な読み込み 全プランでNVMe SSDを採用しており、ワールドの読み込みや重いコマンド処理でもラグを感じにくいです。
※最低利用期間が3ヶ月からという縛りはありますが、サーバーを長期で安定運用するならむしろ割安になります。

以下のリンクから申し込むと初回利用料金が10%OFFになります。
(1ヶ月以上の契約対象。「安くて速い」サーバーを探している方はぜひ試してみてください)

シンVPS 公式サイトを見てみる
(10%OFF適用)
マルチサーバーの立て方はこちら
close up photo of programming of codes
最新情報をチェックしよう!