概要
タイトルの通りです。プレイヤーのインベントリ内に、指定のアイテムがあれば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」を使用しています。
以前は自宅PCでホストしていましたが、PCの電源を切り忘れるストレスや、電気代を考慮して移行しました。シンVPSを選んだ決め手は、圧倒的なコストパフォーマンスです。
- 月額の安さ 4GBプランでも月額1,200円程度(長期契約なら1,000円以下)と維持費が安く済みます。
- 高速な読み込み 全プランでNVMe SSDを採用しており、ワールドの読み込みや重いコマンド処理でもラグを感じにくいです。
※最低利用期間が3ヶ月からという縛りはありますが、サーバーを長期で安定運用するならむしろ割安になります。
以下のリンクから申し込むと初回利用料金が10%OFFになります。
(1ヶ月以上の契約対象。「安くて速い」サーバーを探している方はぜひ試してみてください)
(10%OFF適用) マルチサーバーの立て方はこちら