さば2号のgametest(scriptAPI)備忘録【不定期更新】

スポンサーリンク

タイトル通り

注意:投稿者は本職でもなんでもなく、完全趣味であるため間違えることがあります

import文

import { world } from “@minecraft/server”;
import { ModalFormData,ActionFormData,MessageFormData } from “@minecraft/server-ui”

//import { world } from “mojang-minecraft”;
//import { ModalFormData,ActionFormData,MessageFormData } from “mojang-minecraft-ui”

使えるいい感じのイベント

①beforeChat
チャットを実行した時に発生するイベント。メッセージの内容も編集できる。
https://learn.microsoft.com/en-us/minecraft/creator/scriptapi/minecraft/server/beforechatevent

②itemUse
アイテムを使用した時に発生するイベント。一番使う。
https://learn.microsoft.com/en-us/minecraft/creator/scriptapi/minecraft/server/itemuseevent

③itemUseOn
ブロックに触った時に発生するイベント。チェストを開く動作をキャンセルできたりする。
https://learn.microsoft.com/en-us/minecraft/creator/scriptapi/minecraft/server/beforeitemuseonevent

④blockBreak
ブロックを破壊した時に発生するイベント。破壊したブロックと座標とかも当然取れる。
https://learn.microsoft.com/en-us/minecraft/creator/scriptapi/minecraft/server/blockbreakevent

⑤blockPlace
ブロックを設置した時に発生するイベント。
https://learn.microsoft.com/en-us/minecraft/creator/scriptapi/minecraft/server/blockplaceevent

⑥entityHurt
ダメージを受けたときに発生するイベント。与えたモブ受けたモブ、ダメージ量とか取れる。
https://learn.microsoft.com/en-us/minecraft/creator/scriptapi/minecraft/server/entityhurtevent

⑦entityHit
近接攻撃した時に発生するイベント。攻撃したブロックも取得できる。⑥と違い攻撃を当てなくても無条件で発生する。
https://learn.microsoft.com/en-us/minecraft/creator/scriptapi/minecraft/server/entityhitevent

⑧projectileHit
投擲物(矢とか)がエンティティかブロックに命中したときに発生するイベント。
https://learn.microsoft.com/en-us/minecraft/creator/scriptapi/minecraft/server/projectilehitevent

⑨tick
1tick(0.05秒)ずつ常に実行するイベント。他とは違い常に動いている。
※このイベントは削除予定。代替品であるsytem.runScheduleを推奨
https://learn.microsoft.com/en-us/minecraft/creator/scriptapi/minecraft/server/tickevent

【1.19.60追加】/scriptevent 

・gametest版 /function みたいなコマンド。コマンドで起動できるのでフォーム開くのとか便利だと思う。

◇jsの構文
system.events.scriptEventReceive.subscribe( ev => {
    //処理
});

◇コマンドの構文
/scriptevents saba:sayEvent(識別子) メッセージ(任意)

JS側で識別子を取得できるのでswitchとかで分岐して関数を実行したり、メッセージで値を受け取れる

フォームのテンプレ用

ActionForm

async function showActionForm(player) {
    const actionForm = new ActionFormData()
        .title(“設定フォーム”)
        .body(“説明”)
        .button(“ボタン”,icon);
    const response = await actionForm.show(player);
    if(response.canceled) return;
    response.selection //選んだボタン番号(0から)
}

ModalForm

async function showModalForm(player) {
    const modalForm = new ModalFormData()
        .title(“設定フォーム”)
        .textField(“ラベル”,”プレースホルダ”,”初期値”)
        .dropdown(“ラベル”,配列,初期値(num))
        .toggle(“ラベル”,初期値(boolean))
        .slider(“ラベル”,最小値,最大値,ステップ,初期値(num));
    const response = await modalForm.show(player);
    if(response.canceled) return;
    response.formValues[0] //回答の配列
}

MessageForm

async function showMessageForm(player) {
    const messageForm = new MessageFormData()
        .title(“〇〇設定フォーム”)
        .body(“説明”)
        .button1(“ボタン1”)
        .button2(“ボタン2”);
    const response = await messageForm.show(player);
    if(response.canceled) return;
    response.selection //button1> 1 ,button2 > 0
}

扱える変数

・JSの変数で管理する方法
〇メリット
・最強
△デメリット
・ワールドを開き直したり、/relodeをしたりするとデータが初期化される

以下開き直してもデータが残るもの

・dynamicPropertiesで管理する方法
〇メリット
・文字列、数値、boolean、を変数で扱える
・ワールド、各エンティティごとに変数が扱える
・ユーザ側にあまり影響を及ぼさない
・メソッドがあるため操作しやすい
△デメリット
・文字列は1000文字までしか代入できないためエラーになる可能性がある
アドオンを抜いてしまうとデータが失われる

・tagで管理する方法
〇メリット
・文字列で扱え、文字数制限がない
アドオンを抜いてもデータが保持される
・各エンティティごとに変数が扱える
・ワールド内での確認がしやすい
・メソッドがあるため操作しやすい
△デメリット
・タグとして残るため、/tagので表示されると邪魔になる
・アマスタ等のタグで記録だとユーザ側に初期設定の手間がある
・メソッドがあるとは言え、取得がめんどくさい

・scoreboardのオブジェクトIDで管理する方法
〇メリット
・文字列で扱え、文字数制限がないアドオンを抜いてもデータが保持される
・ワールド自体に設定できるので、ユーザ側の手間がいらない
・ユーザ側に見えにくい
△デメリット
・スコアボードのオブジェクト名として残るため、表示されると邪魔

・個人的使い分け
1000文字以上データを保存しそうな場合 → タグを使う or オブジェクトID
アドオンの入れ直しがある場合 → タグを使う or オブジェクトID
それ以外 → dynamicを使う

最近のアプデで、オブジェクトIDの文字数制限がなくなったので、その方法でもデータを管理できます。

dynamicPropertiesの設定

定義するとき

world.events.worldInitialize.subscribe(ev => {  
  const test = new DynamicPropertiesDefinition;
  test.defineString(“名前”,900);
  test.defineNumber(“変数名”);
  test.defineBoolean(“変数名”);
  ev.propertyRegistry.registerWorldDynamicProperties(test); //ワールドに定義
  ev.propertyRegistry.registerEntityTypeDynamicProperties(test,MinecraftEntityTypes.player) //エンティティに定義
})

取得と設定

・ワールド
world.getDynamicProperties(“変数名”);
world.setDynamicProperties(“変数名”,値);

・プレイヤー(エンティティ)※playerはプレイヤークラス
player.getDynamicProperties(“変数名”);
player.setDynamicProperities(“変数名”);

String(文字列)を配列とかオブジェクトとして扱うとき

文字列 → 配列とかオブジェクト
JSON.stringify(“文字列”);

配列とかオブジェクト → 文字列
JSON.JSON.parse(変数);

sytem.runScheduleとか

system.runSchedule( function(){
  //処理
} , 1)

・使うときは sytem をインポートするのを忘れない
・最後の1はティック間隔

スコアの取得

・エンティティスコア
const score = world.scoreboard.getObjective(“オブジェクト”).getScore(player.scoreboard);

・仮想スコア
const score = world.scoreboard.getObjective(“オブジェクト”).getScores().find(score => score.participant.displayName == “スコア名”).score;

インベントリの取得

・インベントリのアイテム
const item = player.getComponent(“inventory”).container.getItem(スロット数);

・手に持ってるアイテム
const item = player.getComponent(“inventory”).container.getItem(player.selectedSlot);

スロットの番号

%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-2023-02-04-164708-1.png

プレイヤークラスとかの取得方法

①イベントから取る(sourceとかsenderとか)

beforeChat → sender
itemUse → source

②ワールドクラスから取る

const players = […world.getPlayers()]; //プレイヤークラスの配列を受け取る
const player = players[0];

getPlayers() は()の中にクエリを入れると条件をつけて取得できる
https://learn.microsoft.com/ja-jp/minecraft/creator/scriptapi/minecraft/server/entityqueryoptions

const players = […world.getPlayers({excludeTag:[“oni”]})] //oniタグを持っていない人を取得する

プレイヤー(エンティティ)クラスから多分取得できるもの、メソッド

minecraft/server.Player Class
Contents of the @minecraft/server.Player class.

プロパティ

よく使うものだけ

・名前
const name = player.name;

・頭上の名前(名札でつけれるやつとか) 変更可能
var nameTag = player.nameTag;

・ID(数値の識別値、たぶん不変なのでプレイヤーの識別に使える)
var id = player.id;

・種族、minecraft:zombie みたいな感じ
const typeId = player.typeId;

・座標
const location = player.location;
const { x , y , z} = location; //x,y,z座標が入る

・視点の方向
const rotation = player.rotation;
const { x , y } = rotation; // x,yが入る

・スニークしているか(true/false)
const isSneaking = player.isSneaking

メソッド

・コマンドを実行する(一番使う)
player.runCommandAsync(“コマンド”);

・タグを持っているか(true/false)
player.hasTag(“タグ名”);

・持っているタグ(配列)
player.getTags();

・コンポーネント(いろいろ)
inventoryならインベントリ、minecraft:healthを入れたら体力とかいろいろ取得できる
player.getComponent(“component”);

・OP権限を持っているか(true/false)
player.isOp();

・dynamicPropertiesの取得と設定
player.getDynamicProperty(“変数名”);
player.setDynamicProperty(“変数名”,値);

配列で使えそうなメソッドとか

・プレイヤークラスの配列の取得
const players = […world.getPlayers()];

・forEach() :各要素ごとに実行する。困ったらこれを使う
全てのプレイヤーが挨拶をする
players.forEach(player => {
  player.runCommandAsync(”say こんにちは”);
})

・find() :条件に一致する要素を取り出す。一部を取り出すときに使う
名前が「Steve」のプレイヤークラスを取り出す
const steve = players.find(player => player.name == “Steve”);

・map() : 各要素ごとに実行した配列を作り出す。プロパティの情報の配列を作る時に使う
全てのプレイヤーの名前の配列を作る
const playerNames = players.map(player => player.name);

・filter() :条件に一致する要素から、配列を作り出す。一部(複数)を取り出すときに使う
タグ「killer」を持ったプレイヤークラスの配列を作る
const killers = players.filter(player => player.hasTag(“killer”));

・some() :条件からtrue/falseを返す。条件式で使う
名前が「Steve」のプレイヤーがいたらメッセージを送る
if(players.some(player => player.name == “Steve”)) {
  world.say(“Steveがいるよ!!1);
}

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

コメント

コメント通報
タイトルとURLをコピーしました