初めに
どうも餅わらびすとです。この記事では究極の機能、ScriptAPI(gametestとも言う)でのタグによってチャットに色を付ける方法について解説します。
例えば、アドミンだけチャットの色を変えたいとします。もちろん直接チャットで §aこんにちは! ということも出来るんですが、やる人が毎回文の初めにセクション書かなきゃいけないし名前の前にセクションは置けないしで少し使い勝手が悪いです。
しかし、今回の方法を使えばそのような手間が少なくなります!
「まずScriptAPIについて知らない」、という方はこちらの、「【統合版アドオン】part-1│究極の機能、ScriptAPIを徹底解説!」で基本的な使い方を解説しているので、見ていない方は見てください。ここでは、リンクの記事の内容を理解していることを前提にしているので、記事を見た後に来るのを推奨します。
この記事が役に立つものになれば嬉しいです。
~おすすめドキュメント~
・https://jaylydev.github.io/scriptapi-docs/#documentation
~前回~
・https://minecraft-mcworld.com/71042/
準備
始める前に前提として、カスタムコマンドを作るのに必要なクラスを@minecraft/serverモジュールからインポートします。
import { world } from "@minecraft/server";
今回使用するのはworldです。
そして、今回のコードで使用していく機能(ChatSendBeforeEvent)は執筆時2024/04/25では@minecraft/serverのバージョンはbetaでしか使えません。適切なバージョンに設定してください。
解説
今回のコードの全体像はこんなん。
この中の要素を解説していきます。
world.beforeEvents.chatSend.subscribe(ev => {…
ここでは、始めにインポートしたworldの中にある、beforeEventsというプロパティの中の、chatSendプロパティの中のsubscribeというメソッドを実行しています。
この処理での{}の中では、evに様々な情報が入っています。
const { message, sender } = ev;
ここでは、evにあるmessageというプロパティとsenderというプロパティ2つをその名前で取り出しています。
簡単に言うとev.sender.sendMessage(“hello”);みたいに書かなければいけないものをsender.sendMessage(“hello”);だけで済ませられるようになります。コードが長引くと結構恩恵受けるかも。
const tags = [{…}, {…}, {…}];
ここでは、タグの名前と色のコード(セクションの後の文字)をまとめたオブジェクトが3つ入った配列をtagsに代入しています。
for (const tag of tags) {…}
ここでは、tagsの要素を1つ1つループでtagに入れています。tagsの中の要素全てに処理を加えているっていえばイメージしやすいですかね。
if (!sender.hasTag(tag.name)) continue;
ここでは、もしもsender(チャットをしたプレイヤー)に引数へtag.name(ループ時のtagにあるnameプロパティの中身)を入れたhasTagメソッドを実行しtrueが返ってきたら、という条件を!で反転し、trueを返されたらループの次の処理へ飛ぶという意味です。ここでfor内での以降のコードは実行されません。
つまりはtag.nameと同じタグを持っていなかったら次のループ処理移るよってことですね。
ev.cancel = true;
ev.cancelにtrueを代入しています。ここにtrueが入ったらイベントはキャンセルされます。チャットを送信しないってことです。
return world.sendMessage(`§${tag.color}<${sender.name}> ${message}`);
ここでは、worldのsendMessageメソッドで世界にメッセージを送信しています。
`§${tag.color}<${sender.name}> ${message}`は、バッククォートを使用して${値}で文字列に値を埋め込めるという機能を使いチャットを再現したものに色をつけたものです。
例えば、blueタグを持ったsteveという名前のプレイヤーが「こんにちは」とチャットしたとします。
そうすると、tag.colorの中にはタグに応じた色コードが入っていてひとつ前にセクションがあるため§b<${sender.name}> ${message}となり、sender.nameにはsteveが入っているため§b<steve> ${message}となり、messageにはこんにちはが入っているため最終的には§b<steve> こんにちは と送信されるわけです。
returnの部分で処理が終わっています。
最後に
ここまで読んでいただきありがとうございます!役に立ったと思ってもらえたら嬉しいです。
なにか質問があるときはこちらのディスコードサーバーから受け付けています。どんな人も大歓迎!一応ここでも受け付けますが内容が複雑になると判断した質問はサーバーでしか受け付けません。
まだScriptAPIについて知らないことも少なくないので、間違っているところがあれば教えてほしいです。
それでは良いアドオンライフを!
コメント
自分用メモ
part-4.5 ScriptAPIでエンティティをセレクターで取得する
https://minecraft-mcworld.com/71042/
part-6 ScriptAPIで出てくる非同期処理の話
https://minecraft-mcworld.com/76440/
ないすです!私事ではありますが、たすかります!
jsonメッセージが%%苦手で、あまり理解がしがたいです…
私事ではありますがもう少しまとめてくれると%%嬉しいです
アドバイスありがとうございます。
具体的にどの部分が分かりづらいか、どの部分をどのように変えればより分かりやすくなるかを伝えて頂ければこちらとしても対応しやすいです。
よろしくお願いします。