【統合版アドオン】part-5│ScriptAPIでタグによってチャットを彩ろう!

スポンサーリンク

初めに

どうも餅わらびすとです。この記事では究極の機能、ScriptAPI(gametestとも言う)でのタグによってチャットに色を付ける方法について解説します。

例えば、アドミンだけチャットの色を変えたいとします。もちろん直接チャットで §aこんにちは! ということも出来るんですが、やる人が毎回文の初めにセクション書かなきゃいけないし名前の前にセクションは置けないしで少し使い勝手が悪いです。
しかし、今回の方法を使えばそのような手間が少なくなります!

「まずScriptAPIについて知らない」、という方はこちらの、「【統合版アドオン】part-1│究極の機能、ScriptAPIを徹底解説!」で基本的な使い方を解説しているので、見ていない方は見てください。ここでは、リンクの記事の内容を理解していることを前提にしているので、記事を見た後に来るのを推奨します。

この記事が役に立つものになれば嬉しいです。

~おすすめドキュメント~
https://jaylydev.github.io/scriptapi-docs/#documentation

準備

始める前に前提として、カスタムコマンドを作るのに必要なクラスを@minecraft/serverモジュールからインポートします。

import { world } from "@minecraft/server";

今回使用するのはworldです。

そして、今回のコードで使用していく機能(ChatSendBeforeEvent)は執筆時2024/04/25では@minecraft/serverのバージョンはbetaでしか使えません。適切なバージョンに設定してください。

解説

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-04-25-142007.png

今回のコードの全体像はこんなん。
この中の要素を解説していきます。

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の部分で処理が終わっています。

最後に

ここまで読んでくださりありがとうございました!役に立ったと思ってもらえたら嬉しいです。

なにか質問があるときはこちらのディスコードから受け付けています。どんな人も大歓迎!

それでは良いアドオンライフを!

※投稿記事に含まれるファイルやリンクにより発生した被害についてクラフターズコロニーは責任を取りません
投稿通報

コメント

コメント通報