スポンサーリンク

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

138(週:38 月:138) 0 -
いいね!
読み込み中...

タイトル通り

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

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

フォームのテンプレ用

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ので表示されると邪魔になる
・アマスタ等のタグで記録だとユーザ側に初期設定の手間がある
・メソッドがあるとは言え、取得がめんどくさい

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

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をコピーしました