フォーラムへの返信
- 投稿者投稿
wakame11参加者https://github.com/wakame11/addon-file-maker/tree/main
自分が作ったアドオンのセットアップツールです。
これでバージョンとかmanifest.jsonの間違いは解決します。
ダウンロードして実行して指示に従ってみてください。作成したら、scripts/main.jsをエディターで開いて以下のコードをコピペしてみてください。
おそらく、ワールドを読み込んだ際と、棒を持って右クリックするとチャットにメッセージが表示されます。実際に試してないのでなんかエラー出たら教えてください。
import { world, system } from "@minecraft/server"; world.afterEvents.itemUse.subscribe(ev => { if (ev.itemStack.typeId === "minecraft:stick") { world.sendMessage("棒が使用されました"); } }); system.run(() => { world.sendMessage("読み込み完了"); });
wakame11参加者結果報告ありがとうございます!
お力になれたようでよかったです!
これからも頑張ってください
wakame11参加者1.統合版でアドオンを追加する方法はAPI限定なのか
もしそのアドオンがタイポで、タイトルの「アドオンでコマンドを追加する方法」のことであるなら、広く見ればあります。
方法はいくつかありますが、どれもスラッシュコマンドではありません。スラッシュコマンドを実装することは今のところ不可能です。
例えば、既に存在する[function]コマンドを利用して、.mcfunctionファイルに書き込んだコマンドを実行することができます。
これは複数行あっても一気に実行できますが、コマンドしか実行できなく、scriptApiのような広いことはできません。別の方法は、pythonなどの外部モジュールを使ってローカルサーバーを構築し、マインクラフト内でサーバーと接続し、チャットを検知する方法です。
この方法では[?help]などスラッシュコマンドではありませんが、特定の文字列を検知して、対象へ操作を実行することができます。
ただ、サーバーを開くために必要な知識や環境が誰にでもそろっているわけではないのでお勧めできません。一番おすすめなのはベータ版のscriptApiを使うことです。
scriptApiのベータ版でのみ使用できるイベントで、[before.chatSend]というものを使います。
このやり方なら、プレイヤーが送信したチャットを事前に内容などを把握し、キャンセルしてから好きなコードを実行することができます。
ですが、ベータ版なのでワールド作成時に実験的機能の[ベータAPI]をオンにする手間があります。
とりえあずこの方法のコードを書いておきます。話は戻って、質問がそのままの意味であるのなら、アドオンの作り方はscriptApiだけではありません。
自分はむしろメインはリソースパックとビヘイビアパックで自分でアイテムやモブを追加できる点だと思っています。
そこにscriptApiを使ってより自由な動作を追加できるということだと思ってます。2.構文
main.jsimport { world } from "@minecraft/server"; world.beforeEvents.chatSend.subscribe(ev => { if (ev.message === "?help") { ev.cancel = true; ev.sender.sendMessage("へるぷ"); } });manifest.json
{ "format_version": 2, "header": { "name": "アドオンの名前", "description": "アドオンの説明", "uuid": "b0fbb1fb-6151-42e6-9c0e-be864a3548a3", "version": [1,0,0], "min_engine_version": [1,20,0] }, "modules": [ { "type": "script", "language": "javascript", "uuid": "a1bdb4b6-4d2f-48e1-93cb-4bbb28cb6a11", "entry": "scripts/main.js", "version": [1,0,0] }, { "description": "アドオンの説明", "type": "data", "uuid": "31b93174-f46e-4c6b-960c-69a37143ca3b", "version": [1,0,0] } ], "dependencies": [ { "module_name": "@minecraft/server", "version": "2.10.0-beta" }, { "module_name": "@minecraft/server-ui", "version": "2.0.0" } ], "capabilities": [ "script_eval" ] }3.manifestのバージョン
manifestにはバージョンがいっぱい書かれてます。
アドオン:1.0.0
スクリプト:1.0.0
説明:1.0.0
@minecraft/server:2.10.0-beta
@minecraft/server-ui:2.0.0
それぞれこんな感じでいいと思います
上記のmain.jsがベータ版のみなので、ラスト2つは固定です。
wakame11参加者もし短縮して書いていたのであれば申し訳ないのですが、最後に記述されている「terrain.json」こちらは「terrain_texture.json」へファイル名の変更をし、blocksの中に保存されているか今一度ご確認ください。
次も同じくファイル名の誤りがあります。「block.json」ではなく「blocks.json」です「s」が抜けていました。
これらを試し、もしエラーが出る場合はまた言ってくださいね
wakame11参加者
wakame11参加者上は1種類のみ対応
下は数種類対応// importは省かせてください(world,system)
// ブロックを戻す時間(秒)
const blockresettime = 60;// 右クリックをチェックするブロック
const checkblock = “minecraft:iron_block”;// 与えるアイテム
const axes = [“minecraft:wooden_axe”,”minecraft:stone_axe”,”minecraft:iron_axe”,”minecraft:golden_axe”,”minecraft:diamond_axe”,”minecraft:netherite_axe”];// ランダムにアイテムを与える関数
function giverandomaxe(player) {
const random = Math.floor(Math.random()*axes.length); // ランダムな値を決める
player.dimension.runCommand(“gamerule sendcommandfeedback false”); // 念のためチャットへのコマンド実行通知をオフにする
// 前自分がやった時にこうしてたので、オンのままだと多分通知が来るんだと思います
player.dimension.runCommand(give ${player.nameTag} ${axes[random]} 1); // いじりやすいようにコマンドを実行する形にしときました
player.dimension.runCommand(“gamerule sendcommandfeedback true”); // 実行通知をオンへ戻す(不要ならこの行を削除してください)
console.warn(${player.nameTag}に${axes[random]}を付与しました}); // 邪魔にならないようにコンソールログへ
return;
}// イベントの登録(右クリックを検知する)
world.afterEvents.playerInteractWithBlock.subscribe(ev => {
if (ev.block.typeId !== checkblock) return; // チェックするブロックじゃなかったら何もしない
const player = ev.player;
const block = ev.block;
player.dimension.setBlockType(block.location,”minecraft:air”); // チェックしたブロックを空気に置き換える
giverandomaxe(player);
system.runTimeout(() => {
player.dimension.setBlockType(block.location,checkblock); // チェックブロックを設置する
},blockresettime*20);
return;
});ーーーーーーーーーーーーーーーーーーーーーー
// importは省かせてください(world,system)
// 設定 “(ブロックのid)”:{ resettime:(ブロックを戻す時間(秒)), giveitem:[“与えるアイテム1”,”アイテム2″…] }
const checkblocks = {
“minecraft:iron_block”:{
resettime:60,
giveitem:[“minecraft:wooden_axe”,”minecraft:stone_axe”] // 木と石の斧
},
“minecraft:diamond_block”:{
resettime:120, //2分
giveitem:[“minecraft:iron_axe”,”minecraft:diamond_axe”] // 鉄とダイヤの斧
}
}// ランダムに与える関数
function giverandomitem(player,blockid) {
const blockdata = checkblocks[blockid];
if (blockdata) {
const random = Math.floor(Math.random()*blockdata.giveitem.length);
player.dimension.runCommand(“gamerule sendcommandfeedback false”);
player.dimension.runCommand(give ${player.nameTag} ${blockdata.giveitem[random]} 1); // giveコマンド
player.dimension.runCommand(“gamerule sendcommandfeedback true”);
console.warn(${player.nameTag}へ${blockdata.giveitem[random]}を付与しました);
} else {
console.warn([giverandomitem] 未登録のblockid : ${blockid}); // 登録されていないブロックが関数へ渡された際のログ(別にいじらなくてもいい)
return;
}
}// イベントの登録
world.afterEvents.playerInteractWithBlock.subscribe(ev => {
const block = ev.block;
const player = ev.player;
if (block.typeId in checkblocks) {
player.dimension.setBlockType(block.location,”minecraft:air”);
giverandomitem(player,block.typeId);
system.runTimeout(() => {
player.dimension.setBlockType(block.location,block.typeId);
},checkblocks[block.typeId].resettime*20);
return;
} else {
return;
}
});
wakame11参加者俺もどうかと思います
wakame11参加者すみません、Xやってないので遠慮させていただきます。
掲示板利用ガイドラインにはそのような記載はないので連絡先を載せても問題はないと思います。
wakame11参加者ありがとうございます。助かりました
wakame11参加者どんな内容かによりますけど、多少なら知識あります。
- 投稿者投稿

