はじめに
ご存知かと思いますが、マインクラフトには「エンチャント」という機能が存在します。これは、武器や道具に付与することでその機能を拡張することができるシステムのことですが、実はエンチャントを自作できることはあまり知られていません。本記事では、マイクラ統合版でエンチャントを自作する方法について、ScriptAPI(プログラミングでゲームシステムを改変する機能)を用いて解説します。
Youtube動画
この記事について解説したYoutube動画を作成しました。こちらより視聴可能です。
環境構築
ScriptAPIの使用にあたっては、環境構築が必要です。まだの方はこちらの記事をご覧ください:
本記事では、main.jsなど、スクリプトを記述できる環境にあることを前提に解説を続けます。
概要
エンチャントを自作といいましたが、あくまで「疑似的なエンチャント」に留まることにご留意ください。あくまでエンチャントと同じような挙動をするというだけであって、enchantコマンド等との互換性はない点にご留意ください。
さて、以下の記事を読むと、以下のようにアイテムに「Lore」と呼ばれる説明文を付与した上で、このLoreがついたアイテムでモブを攻撃したときに特殊な効果を起こすことが可能になります。
スクリプト
何はともあれ、まずはimport文を用いてminecraft/serverモジュールを呼び出しましょう。
- import * as server from "@minecraft/server"
続いて、Loreを検知してそのLoreがついたアイテムで敵を攻撃したときの挙動をスクリプト上で定義します。その例は以下。今回は「電撃の力」というLoreを設定し、それがついたアイテムで敵を叩くと雷が落ちるように設定しています。
server.world.afterEvents.entityHitEntity.subscribe(ev => {
let player = ev.damagingEntity;
if(player.typeId == "minecraft:player"){
let weapon = player.getComponent("minecraft:inventory").container.getItem(player.selectedSlotIndex);
if(weapon == undefined){return;}
if(weapon.getLore()[0] == "電撃の力"){
ev.hitEntity.runCommand("summon lightning_bolt ~ ~ ~");
ev.damagingEntity.runCommand("say 電撃の力で攻撃を与えた!");
}
}
})
上記のrunCommand関数内の引数部分で発動するコマンドを定義しています。従って、これを変更することで発動するコマンドをアレンジできます。
スクリプトの本体部分はこれで終わりなのですが、これだけでは実用的ではありません。何故なら「電撃の力」というLoreを持つアイテムがゲーム内で存在しないからです。続いて、「電撃の力」というLoreを持つアイテムをゲーム内で入手できるようにしましょう。今回は、scripteventコマンドと呼ばれる、コマンドを自作できる機能を用いてそれを定義しました。
server.system.afterEvents.scriptEventReceive.subscribe(ev => {
if(ev.id == "lq:ench"){
let player = ev.sourceEntity;
let weapon = player.getComponent("minecraft:inventory").container.getSlot(player.selectedSlotIndex);
if(weapon == undefined){return;}
if(weapon.typeId.endsWith("sword")){
weapon.setLore(["電撃の力"]);
}else{
player.sendMessage("電撃の力は付与できません");
}
}
})
これを保存後、以下のようなコマンドを実行することによって「電撃の力」というLoreを持つアイテムをゲーム内に追加できます。
なお、scripteventコマンドについての詳細は以下の記事をご覧ください。
これによって、「電撃の力」というLoreを持つ武器で攻撃をした場合、モブに雷が落ちることが確認できるでしょう。このようにして、実質的な「エンチャント」を作成できます。
問題点
さて、このエンチャントには「レベル」の概念がありません。単にTrueかFalseかの情報しか持っておらず、拡張性にやや欠けます。次回は、この「レベル」の概念をもったカスタムエンチャントの作成方法についてお話しします。