#gametestのformを出したい

1 messages · Page 1 of 1 (latest)

tepid grove
#

ActionForm,ModalFormなどがありますけどどういうのを出したいか言ってくれませんか?

fallow siren
#

はい少し待っていてください。。

#

アクションフォームのほうです!!

tepid grove
#

まずjsするときに最初に書くのは分かりますか?

hybrid sail
#

GameTestに触れた事ないのであれば初めにここ読むのを推奨します
#よくあるqa message

fallow siren
#

すみません。わかりません

tepid grove
#

まずworldとActionFormDataをインポートしましょう

#
import { world } from '@minecraft/server'
import { ActionFormData } from '@minecraft/server-ui'```
こんな感じにしてください
#

manifestも分かりますか?

fallow siren
#

マニフェストなら少し

tepid grove
#

gametest専用の奴も必要なんですよ、その事は知ってますか?

fallow siren
#

マジですか。。

#

知りませんでした

tepid grove
#

modulesという奴とdependenciesが必要です

#

headerの後に

  "modules": [
    {
      "type": "script",
      "language": "javascript",
      "description": "説明(無くてもいい)",
      "version": [1,0,1],
      "uuid": "",
      "entry": "scripts/ファイルの名前.js"
    }
  ],
  "dependencies": [
    {
      "module_name": "@minecraft/server",
      "version": "1.1.0-beta"
    },
    {
      "module_name": "@minecraft/server-ui",
      "version": "1.0.0-beta"
    }
  ]

をつけたら良いです

#

全体要りますか?

fallow siren
#

全体ほしいです。

tepid grove
#

uuidも分かりますか?

fallow siren
#

それはわかります

tepid grove
#
{
  "format_version": 2,
  "header": {
    "name": "名前",
    "description": "説明",
    "version": [1,0,1],
    "uuid": "",
    "min_engine_version": [1,19,70]
  },
  "modules": [
    {
      "type": "script",
      "language": "javascript",
      "description": "",
      "version": [1,0,1],
      "uuid": "",
      "entry": "scripts/index.js"
    }
  ],
  "dependencies": [
    {
      "module_name": "@minecraft/server",
      "version": "1.1.0-beta"
    },
    {
      "module_name": "@minecraft/server-ui",
      "version": "1.0.0-beta"
    }
  ]
}

全体です

#

index.jsはさっきのやつと同じです

#

ちなみに

#

formを出すには@minecrart/server-uiが必須です

#

分からないとこはないですね?

fallow siren
#

uuidまでいけました

tepid grove
#

良かったです

#

あとはコードですね

fallow siren
#

はい!

tepid grove
#

拡張子は何か分かりますか?

fallow siren
#

マニフェストは.jsonでスクリプトは.jsですよね?

tepid grove
#

そうです

fallow siren
#

よかったです

wooden nacelle
#

※どうでもいいけどどんな拡張子でも動くあほみたいな仕様があります

tepid grove
#

ご飯なので少し待っててもらって良いですか?

fallow siren
#

はい

tepid grove
#

戻ってきました

fallow siren
#

はい

tepid grove
#

最初に書くのは覚えてますか?

fallow siren
#

import { world } from '@minecraft/server'
import { ActionFormData } from '@minecraft/server-ui' のことですか?

tepid grove
#

そです

#

まず

#

何をしたときに出したいですか?

fallow siren
#

特定のアイテムを右クリックしたときです

tepid grove
#

beforeItemUseイベントですね

fallow siren
#

idはそうですけど、アイテム名でも指定できませんか?名前とidで

tepid grove
#

名前ですかー...

fallow siren
#

難しいならいいです

tepid grove
#

なんで名前とidにしたいんですか?

hybrid sail
#

item.nameTagでアイテム名取れるよ

tepid grove
#

なるほど

#

item定義して例えば
const itemName = item.nameTagとか良いんですか?

hybrid sail
#

いえす

tepid grove
#

ありがとうございます

fallow siren
#

会話についていけない。。

hybrid sail
#

typeIdが一致かつnameTagが一致してることを条件にすればいい

tepid grove
fallow siren
#

わかりません

hybrid sail
fallow siren
#

ちょっと読みます

#

constならちょっとだけ知ってます。使い方は知りません。。。

tepid grove
#

じゃあそれで良いです

fallow siren
#

constは使っているとこを見たことあります。

hybrid sail
#

constは後から書き換えることができない 定数
letが普通の 変数
みたいな認識でいいと思う

tepid grove
#

じゃあまず使ったアイテムと使った人を定義しましょう

fallow siren
#

はい

tepid grove
#

複数定義するときはどうするか分かりますか?または1つ1つ定義する方法もありますよ

fallow siren
#

わかりません

tepid grove
#

{}で囲んでそこに定義したい名前を入れてください

#

例えば

#

const { aaa , bbb } = なんとかー
見たいな感じでやってください

wooden nacelle
#

分割代入から教えるのもどうかと思うけど

tepid grove
#

あー

#

確蟹

wooden nacelle
#

せめてもう少し細かく説明しないと

tepid grove
#

語彙力カスなので俺は向いてないと思うな()

wooden nacelle
#

なら出しちゃダメでしょ

tepid grove
#

じゃあどうしよ()

wooden nacelle
tepid grove
#

なるほど

fallow siren
#

なるほど

wooden nacelle
#
const object = { name: '名前' };
const { name } = object;

と書き

const name = object.name;

と同等の処理となります

tepid grove
#

そうなのか)

fallow siren
#

続けましょう。

tepid grove
#

じゃあ俺はどう書けば()

fallow siren
#

定義のほうに行きましょう

tepid grove
#

使ったアイテムと使った人はイベントからとれます

fallow siren
#

はい

tepid grove
#

importのあとに
world.events.beforeItemUse.subscribe(変数名 => {
と書き

wooden nacelle
#

その書き方は語弊があるかと

tepid grove
#

#

俺もう無理だ()

wooden nacelle
#

イベント名ではなく任意の変数名

tepid grove
#

間違えた普通に

fallow siren
#

どうすれば;_;

tepid grove
#

constで
const 任意な名前 = イベントの変数名;
見たいな感じで使ったアイテムが定義出来ます~~(あってる?))~~

fallow siren
#

つまり?

wooden nacelle
#

使ったアイテムの定義なら

const { item } = 任意の変数名;

const item = 任意の変数名.item;
fallow siren
#

できました。

tepid grove
#

じゃあ次は使った人ですね

fallow siren
#

ok

tepid grove
#

const { 任意な名前 } = 任意な変数名;
または
const 任意な名前 = 任意な変数名.source;
ですね~~(合ってるか不安になる))~~

wooden nacelle
#

任意な名前ではなく変数に入っているオブジェクトが持つプロパティ名

tepid grove
#

( ;´・ω・`)

hybrid sail
#

const { ここがプロパティ名 } = ...

tepid grove
#

もうやだ死にたい()

wooden nacelle
#

分割代入はオブジェクトの持つプロパティを指定して取り出すものってさっき説明した

tepid grove
#

すぐ忘れちゃうわ...

#

ってことは
const source = 変数名.source
ってことで良いってことか

wooden nacelle
#

そっちは別に任意の変数名でいい

tepid grove
#

泣きたい(

#

const { source } = 変数名.source
ってことか!(

wooden nacelle
#

それでは変数名.source.sourceになってしまう

tepid grove
#

泣きそう()

fallow siren
#

結論どうすればいいでしょう?

wooden nacelle
#
const { source } = 任意の変数名;
#

あるいは

#
const 任意の変数名2 = 任意の変数名.source;
fallow siren
#

じゃあこれでok?

hybrid sail
#

イベントぉぉ

wooden nacelle
#

最初の話が抜けてしまってる

#

あと説明のために日本語使ってるだけなのでできれば英語で

fallow siren
#

任意のとこですか?

wooden nacelle
#

はい

#

一目で何の変数なのかわかる命名が望ましいです

wooden nacelle
#

一般的にはイベントのデータが入るのでeventData event ev eなどなどが使用されています まあ任意です

fallow siren
#

やりやすいようにconst~~~から書いてもらえませんか?知識まじないです

wooden nacelle
#

ここまでのをまとめますね

fallow siren
#

はい

wooden nacelle
#
import { world } from '@minecraft/server';
import { ActionFormData } from '@minecraft/server-ui';

world.events.beforeItemUse.subscribe(event => {
  const { item, source } = event;
});
fallow siren
#

まじあざす!!

wooden nacelle
#

分割代入はまとめて定義が可能なので例としてまとめておきました

tepid grove
#

あとはformを出す作業だけかな?

wooden nacelle
#

アイテムの種類や名前を条件に分岐する作業が先

tepid grove
#

あー

#

すっかり忘れてた

wooden nacelle
#

常に情報をまとめて考えてどうぞ(適当)

#

こちとらゲームにコーディングに忙しいんで忘れてるのを指摘する側になって

tepid grove
#

なるほど

fallow siren
#

アイテム指定いきましょぉ

tepid grove
#

まず使ったアイテムは何ですか?

fallow siren
#

アイテムはコンパスです

tepid grove
#

じゃあアイテムがコンパスなのかをやりましょう

fallow siren
#

はい

tepid grove
#

条件をつけるにはifを使いましょう

fallow siren
#

はい

wooden nacelle
#

私チョットコンビニ行ってくるので任せますよ

tepid grove
#

怖いな...()

wooden nacelle
#

スマホから見てはいるので

fallow siren
#

がんばりましょう

#

!!

tepid grove
#

ifの使い方はifのあとに()で囲んで

#

その中に条件を入れます

fallow siren
#

ok

tepid grove
#

例えばアイテムが石なら

wooden nacelle
#

コンパスって言ってるんだからコンパスでいいのに

tepid grove
#

()

#

じゃあそうしまそ

fallow siren
#

ok

tepid grove
#

if(item.typeId == "minecraft:compass")
ってやってください

#

または

#

if(item.typeId !== "minecraft:compass") return;
でコンパスではないならやめるー見たいな感じの方法があります

fallow siren
#

前者でいきます

wooden nacelle
#

ちなみに==2つのみは等価演算子 ===3つは厳密等価演算子と呼ばれます !==も厳密です

tepid grove
#

入力中で恐怖する()

wooden nacelle
#

補足も出します

tepid grove
#

if(条件){
//処理
}
でいいんだっけ(不安)

wooden nacelle
#

まあ大体は

#

ネストが深くなるのでifを多用する時は早めのreturnがオススメです
まあ今回は別にどっちでもいいです

tepid grove
#

二つとか恐怖すぎる()

fallow siren
#

次行きましょ

tepid grove
#

じゃあ

#

あとは

wooden nacelle
#

考えることはみな同じ

tepid grove
#

アイテムがコンパス と 名前が何か
ですね

#

○○ と ○○
の "と" の部分は&&を使いましょう(不安x2)

hybrid sail
#

&& かつ
|| または

tepid grove
#

そういいたかった...(

wooden nacelle
#

&&はand演算子
||がor演算子

tepid grove
fallow siren
#

おk

tepid grove
#

名前はなんですか?

fallow siren
#

とりまtestで

tepid grove
#

じゃあ
if(item.typeId == "minecraft:compass" && item.nameTag == "test")
と書きましょう

fallow siren
#

書きました

tepid grove
#

そしたら次はformを出す作業ですね

fallow siren
#

おk

tepid grove
#

formを出すにはnew ActionFormData();を使いましょ

fallow siren
#

あ、あの学生なので寝なきゃなんです。明日とかいけます?

tepid grove
#

あ、わかりました

fallow siren
#

すみません

wooden nacelle
#

とりあえずここまでのまとめ

import { world } from '@minecraft/server';
import { ActionFormData } from '@minecraft/server-ui';

world.events.beforeItemUse.subscribe(event => {
  const { item, source } = event;
  if(item.typeId === 'minecraft:compass'
  && item.nameTag === 'test') {
    
  }
});
fallow siren
#

hey

wooden nacelle
#

不在です

fallow siren
#

ook

tepid grove
#

ん?

fallow siren
#

#

come

tepid grove
#

ちょっと待っててください

#

えーと次formを出す作業ですね

#

formを出すにはnew ActionFormData();を使って出します

#

大丈夫な感じですか?

fallow siren
#

めっちゃ放置してました。まじ申し訳ないですm(_ _)m

#

今からならいつでも

tepid grove
#

const 任意な名前 = new ActionFormData();
でフォームを出せます

wooden nacelle
#

※出る訳ではありません

tepid grove
#

まぁそうなんですけど()

hybrid sail
#

フォームを作る の方が正しいかな

tepid grove
#

そうですね

fallow siren
#

ほぉ

tepid grove
#

で他の機能でbody、button等があります

#

どんな感じにしたいですか?

fallow siren
#

あ~

hybrid sail
#

少なくともボタンは1つ以上つける必要があります

wooden nacelle
#

titleも必須

fallow siren
#

今ざっと調べてみたんですけどテキストを打つテキストフィールド?なるものはできますか?

hybrid sail
#

そちらはActionFormでなくModalFormの方です

fallow siren
#

ほぉほぉ

#

とりあえずボタンを作りたいです。

#

その前にボディやらタイトルやらが必要なようですが。。

tepid grove
#

任意な名.button("")
見たいな感じで追加出来ます

wooden nacelle
#

せめて変数名統一せい

tepid grove
#

じゃあformでいいかな

hybrid sail
#

変数名にformを使うのであれば

const form = new ActionFormData();
form.button("ラベル");

のようになります

fallow siren
#

ラベルの名前はそのままボタンの名前になるんですか?

hybrid sail
#

そうですね

fallow siren
#

あ、そうだあのモダルフォームデータとアクションフォームデータってどっちも同時に使うことってできますか?

wooden nacelle
#

どちらも使うことはできますが同時出しは出来ません

hybrid sail
#

なのでボタンとテキストエリア同時使いとかはできないです

fallow siren
#

モダルフォームデータはどのような機能が使えるんでしょう。

wooden nacelle
#

textField slider dropdown toggle ですね

tepid grove
#

actionformdataの進化版みたいなやつ
だけどボタンは追加できない

fallow siren
#

ボタンをおしてべつのフォームはってできますか?(アクションからモダルとか)

wooden nacelle
#

もちろん可能です

fallow siren
#

それってめっちゃ複雑~とかになったりします?

wooden nacelle
#

そうでもないかと

fallow siren
#

https://youtu.be/5mL9nEin_Sc
この動画のようにテキストで送信ってやって処理を行うにはどうすれば?

アドオンのgametestと言うものを用いて、パスワード式のチェストを作ってみました!爆発や、ピストンによる移動などからはチェストを守れますが、破壊、ホッパーなどによるアイテムの吸い出しには対応出来ないため、まだ不完全な状態です!

▶ Play video
tepid grove
#

ちょっと落ちますすいません...

wooden nacelle
#

送信にかんしてはmodalFormDataでtextFieldを用意するだけで大丈夫です

fallow siren
#

まじすか~^^

#

とりあえず最低限のボタンなどでフォームを作ってみたいです。

tepid grove
#

そこまで難しくないと思いますが

hybrid sail
#

まずはActionFormにボタンとタイトルを追加してみましょ

fallow siren
#

はい

hybrid sail
#

(定義だけなら一番外側でもいいですが)

fallow siren
#

ほい

#

で、どうすれば?

hybrid sail
#

変数名をformにしたのであれば

form.title("タイトル");
form.button("ボタン");

のようにして追加します

#

form.button()は追加したいボタンの数だけ使うことができます

fallow siren
#

ボディってのは必要ですか?

hybrid sail
#

あってもなくても良いです

#

つけるなら form.body("ボディ");

fallow siren
#

`import { world } from '@minecraft/server';
import { ActionFormData } from '@minecraft/server-ui';

world.events.beforeItemUse.subscribe(event => {
const { item, source } = event;
if(item.typeId === 'minecraft:compass'
&& item.nameTag === 'test') {

}
});

const form = new ActionFormData();
form.title("タイトル");
form.button("ボタン");`
この文で実行できますか?

hybrid sail
#

一番外側でも良いですがif文よりは上に書く必要があります

#

その中のformを表示する処理で使うので

fallow siren
#

ほぉ@

hybrid sail
#

まあ分かりやすいからifの中に書いた方いいかも

fallow siren
#

この文を最適に直すならどのように

hybrid sail
#
import { world } from '@minecraft/server';
import { ActionFormData } from '@minecraft/server-ui';

world.events.beforeItemUse.subscribe(event => {
  const { item, source } = event;
  if(item.typeId === 'minecraft:compass'
  && item.nameTag === 'test') {
    const form = new ActionFormData();
    form.title("タイトル");
    form.button("ボタン");
  }
});
fallow siren
#

ありがたく参考にさせていただきます。

hybrid sail
#

これで表示するformはできたので次はプレイヤーに表示させる処理です

fallow siren
#

はい

hybrid sail
#

form.show(source);
で変数sourceに入っているエンティティにformを表示します

#

ですがこれだと表示しただけなのでどのボタンを押したかも取れるようにします

#
form.show(source).then(response => { // 表示
  const { canceled, selection } = response;
});
#

thenはプレイヤーがボタンを押すまで待つためのおまじないです

#

その下で変数responseに入ったformの応答に関する情報からcanceled, selectionプロパティを取得します

#

canceledにはプレイヤーがformをキャンセルしたかどうかのboolean(主に右上のxボタン)
selectionにはn番目(0番目スタート)のボタンを押したかの数字が入っています

fallow siren
#

form.show(source).then(response => { // 表示 const { canceled, selection } = response; });
ってどこに書いても実行されますか?

hybrid sail
#

form.buttonの下に続けて書いてください

wooden nacelle
#

formがきちんと定義されていれば一応どこでも動きます

#

イベント外やchat系イベントだと出ない可能性が高いですが

fallow siren
#

開いたことを検知とかってできます(開くとイベント)

wooden nacelle
#

何を開くとですか

fallow siren
#

フォームをです。

wooden nacelle
#

フォームは開こうとして開くものなので検知も何もないと思いますが

#

ちなみに開けなかったことは検出できます

fallow siren
#

あっ違ったifでクリックを検知したときに別のイベントも実行させたいんです。

wooden nacelle
#

というと

fallow siren
#

world.events.beforeItemUse.subscribe(event => {
const { item, source } = event;
if(item.typeId === 'minecraft:compass'
&& item.nameTag === 'test')
ここで検知したやつです

wooden nacelle
#

別のイベントがいまいちわかりません

fallow siren
#

コマンドを実行できます?

wooden nacelle
#

できます

fallow siren
#

どう書けばいいでしょう?

wooden nacelle
#

Entityクラス(Player含む)かdimensionクラスに生えているrunCommandAsyncメソッドを使います

fallow siren
#

ほ、ほう

hybrid sail
#

昨日あたりに #script-api で同じようなことしてましたね

fallow siren
#

見てみます。

#

ボタンを押したらべつのフォームに移したいのですが

wooden nacelle
#

再度定義してshowでいいです