1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ScriptAPIでチーム内チャットを作ってみよう

Posted at

「マイクラ アドオン チームチャット」と検索するといくつかの配布されたアドオンが見つかります。

 それぞれに得手不得手ありますが、どうしても自分の思い通りにはどうしてもなりませんし、そもそも自分が配布マップを作るとしたら、全部自分でやりたくなりません?

と、言うことで今回はチームごとにチャットを分ける、もといチャットの送信先を自分と同じチームのプレイヤーのみにする方法を解説していきます。

ScriptAPIやJavascript自体の使い方は説明しません、あらかじめご了承ください。

プレイヤーにメッセージを送る

Player.sendmessage("")を使用してメッセージを送信可能です。

チャット欄に自由にメッセージを送れます。String型Rawtext (tellrawのやつ)でメッセージ内容を指定できます。

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

const Players = world.getPlayers();
//プレイヤーを取得。

for(let _i=0;_i<Players.length;_i++){

Players[_i].sendMessage("テストサーバーにようこそ!!!アイテムを右クリックでメニューを開けます。")
}

world.getPlayers()でプレイヤー全員を取得して、forを利用してプレイヤー単体を取り出しています。もちろん、getPlayers()に限った話でなく返ってくるのが、同じものなら取得方法がどうであれ、プレイヤーにメッセージは送れます。

プレイヤーがチャットをしたことを検知する

worldクラスのchatSendで検知ができます。上記の物と組み合わせた場合は以下のようになります。

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

world.beforeEvents.chatSend.subscribe((event) => {
    event.cancel = true;
   //本来のチャット送信を止めるかどうか

    
//ここに処理

    const Players = world.getPlayers();
    //プレイヤーを取得。
    
    for(let _i=0;_i<Players.length;_i++){
    
    Players[_i].sendMessage("テストサーバーにようこそ!!!アイテムを右クリックでメニューを開けます。")
    //元のメッセージの変わりのメッセージ
}

});

beforeEventとafterEvents

これらの違いは、読み取り専用読み取りと書き込み両方可能かという違いがあります。

こう聞くと afterEvents のほうがよく見えますが、beforeEvent だとevent.cancelを使用して元のメッセージの送信キャンセルすることができるのです。時と場合に応じて使い分けてください。

この記事では キャンセルを使うためにbeforeEvent を使用します。

先程のコードを afterEventsで書くと以下のようになります。

world.afterEvents.chatSend.subscribe((event) => {
   //ここに処理


            event.cancel = true;

            //本来のチャット送信を止めるかどうか
           //afterEventsだとできない


   
           const Players = world.getPlayers();
           //プレイヤーを取得。
           
           for(let _i=0;_i<Players.length;_i++){
           
           Players[_i].sendMessage("テストサーバーにようこそ!!!アイテムを右クリックでメニューを開けます。")
   
}});

チャットの送信先の指定

今までコードではワールド内のすべてのプレイヤー伝えられてしまいますので同じチームのプレイヤーのみに、送信するようにしてみましょう。

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

world.beforeEvents.chatSend.subscribe((event) => {
    //ここに処理
+ if(event.sender.hasTag("RedTeam")){
+ //event.senderはチャットを送信したプレイヤー
            event.cancel = true;

            const Players = world.getPlayers(
+           {tags:["RedTeam"]});
            //タグ"RedTeam"がついた
            //プレイヤーを取得。
            
            for(let _i=0;_i<Players.length;_i++){
            
            Players[_i].sendMessage("テストサーバーにようこそ!!!アイテムを右クリックでメニューを開けます。")
             }
+           }

});

チームタグがついていないプレイヤーがチャットの送信ができないので、event.sender.hasTag()で該当するタグが付いている場合のみに処理を実行しています。

また、 Word.getplyers();内でEntityQueryOptions を使用することで対象を絞り込んでいます。

〇〇なタグを持つプレイヤーや、〇〇な名前かどうかで絞り込めます。絞り込む条件のリストはこちらの公式ドキュメントをご確認ください。

条件の例

tags:

「/tag」 コマンドでつけられるタグがついているかどうかで絞り込みます。配列でタグを指定でき、配列内の全てのタグがついているプレイヤーのみを返します。

const Players = Word.getplyers({tags:["Red","Blue","One","two"]})

name:

指定した名前をもつプレイヤーを返します。カスタムコマンドで送信先を手動で指定したりできます。

const Players = world.getPlayers({name:"ここにプレイヤーの名前"})

excludeNames:

配列内で名前を指定し、そのプレイヤー達を除外できます。

const Players = world.getPlayers({excludeNames:["ここにプレイヤーの名前","Steve","Alex"]})

書いたチャット内容を送信する

何を言っても歓迎のメッセージしか送られない状態になっているので元々のチャット内容を取得して送信します。


world.beforeEvents.chatSend.subscribe((event) => {
    //ここに処理

            
    if(event.sender.hasTag("RedTeam")){
        event.cancel = true;
      
        const Players = world.getPlayers(
        {tags:["RedTeam"]});
        //タグ"RedTeam"がついた
        //プレイヤーを取得。

+       const messege = event.message;

         
   
          
            
        for(let _i=0;_i<Players.length;_i++){
        
+       Players[_i].sendMessage(`${messege}`)
       
       }
      }
     }
    );

 

event.messege でチャット内容をそのまま取得し、それを同じチームのプレイヤーに返しています。プレイヤーが、「こんにちは」というと名前や所属チームが出て来ずに「こんにちは」だけが送信される状態です。

名前の取得

バニラのチャットのように見せるには、チャットを書いたプレイヤーの名前の取得は欠かせません。event.sender.nameで取得可能です。

world.beforeEvents.chatSend.subscribe((event) => {
  const Players = world.getPlayers(
  {tags:["RedTeam"]}
  //フィルターを設定。
  );
  //プレイヤーを取得。
  
  if(event.sender.hasTag("RedTeam")){
          event.cancel = true;
          
          const messege = event.message;
          const Name = event.sender.name
          
          for(let _i=0;_i<Players.length;_i++){
           
           Players[_i].sendMessage(`<${Name}> ${messege}`) 
          }
  
  
      }
  });
  

チームごとに文字色を変更する

今、どこのチームのプレイヤーとチャットしているかわかるように、チームによって名前が書かれる部分の文字色を変えてみましょう。

    world.beforeEvents.chatSend.subscribe((event) => {
        //ここに処理

           if(event.sender.hasTag("RedTeam")){
   
    
             event.cancel = true;

+            let color = "§r"//デフォルトの文字色
+    
+            
+            color = "§c"
+            
+            //赤チームのタグが付いているときに色を赤(コーラル)に変更
           

            const Players = world.getPlayers(
           {tags:["RedTeam"]});
            //タグ"RedTeam"がついた
            //プレイヤーを取得。
    
         
            
            for(let _i=0;_i<Players.length;_i++){
                const Name = event.sender.name
                const messege = event.message;
                
+                Players[_i].sendMessage(`<${color}${Name}§r>  ${messege}`) 
    
            }
           }
        })
    })

文字色の変更には、マイクラの §文字列 を使用しています。§記号の後に英数字を付けることで文字の色が変わるあれですね。

送信したプレイヤーにタグ"Redteam"付いている場合は 名前の前に§ 記号の後に「c」をつけて文字色を赤色に変更しています。名前のみを赤色にする為、§cで赤色にしてから §rを付けてリセット しています。

複数のチームに対応する

複数のチームに対応するには、チームごとにフィルターと文字色を切り替えます。




  world.beforeEvents.chatSend.subscribe((event) => {
  //ここに処理
  event.cancel = true; 
 

  
  let color = "§r"; // デフォルトの色(リセット)

+  let filter = {};

+  // 赤チームの場合の処理
+   if (event.sender.hasTag("RedTeam")) {
+      color = "§c"; // 色を赤(コーラル)に設定
+      filter = { tags: ["RedTeam"] }; // 赤チームのタグを持つプレイヤーをフィルター
+  }

+  // 青チームの場合の処理
+  if (event.sender.hasTag("BlueTeam")) {
+      color = "§b"; // 色を青(ライトブルー)に設定
+      filter = { tags: ["BlueTeam"] }; // 青チームのタグを持つプレイヤーをフィルター
+  }
+
+  // フィルター条件に一致するプレイヤーを取得
+  
+  const Players = world.getPlayers(filter);

  // プレイヤーごとにメッセージを送信

  for (let i = 0; i < Players.length; i++) {
      const Name = event.sender.name; // メッセージ送信者の名前
      const message = event.message; // メッセージ内容
      Players[i].sendMessage(`<${color}${Name}§r>  ${message}`);
      //変わりにメッセージを送信
  }

});

先ほどのコードでは対応したチーム以外では直接チャットを送信していましたが、こちらではチームに入っていなくともキャンセルされて、変わりのメッセージを送信するようになっています。

実際に試してみる

/tagコマンドで"Redteam"タグを付けて試してみましょう

/tag @s add Redteam

<Steve> Redteamタグをつけてこのように表示されていれば完成です。

まとめ

  • チャットしたことを取得するにはchatSendを使う

  • チャットにメッセージを送信するにはSendmessge()を使う

  • event.messge で元々のチャット内容を取得

今回はScriptAPIを使用して、チームチャットを作る方法を解説しました。誰かの為になれば幸いです。

参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?