#gametestのformを出したい
1 messages · Page 1 of 1 (latest)
まずjsするときに最初に書くのは分かりますか?
GameTestに触れた事ないのであれば初めにここ読むのを推奨します
#よくあるqa message
すみません。わかりません
まずworldとActionFormDataをインポートしましょう
import { world } from '@minecraft/server'
import { ActionFormData } from '@minecraft/server-ui'```
こんな感じにしてください
manifestも分かりますか?
マニフェストなら少し
gametest専用の奴も必要なんですよ、その事は知ってますか?
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"
}
]
をつけたら良いです
全体要りますか?
全体ほしいです。
uuidも分かりますか?
それはわかります
{
"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が必須です
分からないとこはないですね?
uuidまでいけました
はい!
拡張子は何か分かりますか?
マニフェストは.jsonでスクリプトは.jsですよね?
そうです
よかったです
※どうでもいいけどどんな拡張子でも動くあほみたいな仕様があります
ご飯なので少し待っててもらって良いですか?
はい
戻ってきました
はい
最初に書くのは覚えてますか?
import { world } from '@minecraft/server'
import { ActionFormData } from '@minecraft/server-ui' のことですか?
特定のアイテムを右クリックしたときです
beforeItemUseイベントですね
idはそうですけど、アイテム名でも指定できませんか?名前とidで
名前ですかー...
難しいならいいです
なんで名前とidにしたいんですか?
item.nameTagでアイテム名取れるよ
いえす
ありがとうございます
会話についていけない。。
typeIdが一致かつnameTagが一致してることを条件にすればいい
じゃあまず定義の仕方わかります?
わかりません
軽くここ読んだ方が早いと思うよ
https://jsprimer.net/basic/variables/
JavaScriptの変数宣言する方法についてを紹介します。変数を宣言する方法にはconst,let,varがあります。これらの動作の違いや使い分けについてを紹介します。
じゃあそれで良いです
constは使っているとこを見たことあります。
constは後から書き換えることができない 定数
letが普通の 変数
みたいな認識でいいと思う
じゃあまず使ったアイテムと使った人を定義しましょう
はい
複数定義するときはどうするか分かりますか?または1つ1つ定義する方法もありますよ
わかりません
分割代入から教えるのもどうかと思うけど
せめてもう少し細かく説明しないと
語彙力カスなので俺は向いてないと思うな()
なら出しちゃダメでしょ
じゃあどうしよ()
この書き方は分割代入とよれるものでオブジェクトのプロパティ名を直接指定してその名前のまま定義したり任意の名前で定義できる書き方です
なるほど
なるほど
const object = { name: '名前' };
const { name } = object;
と書き
const name = object.name;
と同等の処理となります
そうなのか)
続けましょう。
じゃあ俺はどう書けば()
定義のほうに行きましょう
使ったアイテムと使った人はイベントからとれます
はい
importのあとに
world.events.beforeItemUse.subscribe(変数名 => {
と書き
その書き方は語弊があるかと
イベント名ではなく任意の変数名
間違えた普通に
どうすれば;_;
constで
const 任意な名前 = イベントの変数名;
見たいな感じで使ったアイテムが定義出来ます~~(あってる?))~~
つまり?
使ったアイテムの定義なら
const { item } = 任意の変数名;
か
const item = 任意の変数名.item;
できました。
じゃあ次は使った人ですね
ok
const { 任意な名前 } = 任意な変数名;
または
const 任意な名前 = 任意な変数名.source;
ですね~~(合ってるか不安になる))~~
任意な名前ではなく変数に入っているオブジェクトが持つプロパティ名
( ;´・ω・`)
const { ここがプロパティ名 } = ...
もうやだ死にたい()
分割代入はオブジェクトの持つプロパティを指定して取り出すものってさっき説明した
そっちは別に任意の変数名でいい
それでは変数名.source.sourceになってしまう
泣きそう()
結論どうすればいいでしょう?
じゃあこれでok?
イベントぉぉ
任意のとこですか?
とこれが必要です
一般的にはイベントのデータが入るのでeventData event ev eなどなどが使用されています まあ任意です
やりやすいようにconst~~~から書いてもらえませんか?知識まじないです
ここまでのをまとめますね
はい
import { world } from '@minecraft/server';
import { ActionFormData } from '@minecraft/server-ui';
world.events.beforeItemUse.subscribe(event => {
const { item, source } = event;
});
まじあざす!!
分割代入はまとめて定義が可能なので例としてまとめておきました
あとはformを出す作業だけかな?
アイテムの種類や名前を条件に分岐する作業が先
なるほど
アイテム指定いきましょぉ
まず使ったアイテムは何ですか?
アイテムはコンパスです
じゃあアイテムがコンパスなのかをやりましょう
はい
条件をつけるにはifを使いましょう
はい
私チョットコンビニ行ってくるので任せますよ
怖いな...()
スマホから見てはいるので
ok
例えばアイテムが石なら
コンパスって言ってるんだからコンパスでいいのに
ok
if(item.typeId == "minecraft:compass")
ってやってください
または
if(item.typeId !== "minecraft:compass") return;
でコンパスではないならやめるー見たいな感じの方法があります
前者でいきます
ちなみに==2つのみは等価演算子 ===3つは厳密等価演算子と呼ばれます !==も厳密です
入力中で恐怖する()
補足も出します
if(条件){
//処理
}
でいいんだっけ(不安)
二つとか恐怖すぎる()
次行きましょ
また思考が似た
考えることはみな同じ
&& かつ
|| または
そういいたかった...(
&&はand演算子
||がor演算子
そしてアイテムの名前はこれでとれるのでifでその名前かをしましょう
おk
名前はなんですか?
とりまtestで
じゃあ
if(item.typeId == "minecraft:compass" && item.nameTag == "test")
と書きましょう
書きました
そしたら次はformを出す作業ですね
おk
formを出すにはnew ActionFormData();を使いましょ
あ、あの学生なので寝なきゃなんです。明日とかいけます?
あ、わかりました
すみません
とりあえずここまでのまとめ
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') {
}
});
hey
不在です
ook
ん?
const 任意な名前 = new ActionFormData();
でフォームを出せます
※出る訳ではありません
まぁそうなんですけど()
フォームを作る の方が正しいかな
そうですね
ほぉ
あ~
少なくともボタンは1つ以上つける必要があります
titleも必須
今ざっと調べてみたんですけどテキストを打つテキストフィールド?なるものはできますか?
そちらはActionFormでなくModalFormの方です
任意な名.button("")
見たいな感じで追加出来ます
せめて変数名統一せい
じゃあformでいいかな
ラベルの名前はそのままボタンの名前になるんですか?
そうですね
あ、そうだあのモダルフォームデータとアクションフォームデータってどっちも同時に使うことってできますか?
どちらも使うことはできますが同時出しは出来ません
なのでボタンとテキストエリア同時使いとかはできないです
モダルフォームデータはどのような機能が使えるんでしょう。
textField slider dropdown toggle ですね
actionformdataの進化版みたいなやつ
だけどボタンは追加できない
ボタンをおしてべつのフォームはってできますか?(アクションからモダルとか)
もちろん可能です
それってめっちゃ複雑~とかになったりします?
そうでもないかと
https://youtu.be/5mL9nEin_Sc
この動画のようにテキストで送信ってやって処理を行うにはどうすれば?
アドオンのgametestと言うものを用いて、パスワード式のチェストを作ってみました!爆発や、ピストンによる移動などからはチェストを守れますが、破壊、ホッパーなどによるアイテムの吸い出しには対応出来ないため、まだ不完全な状態です!
ちょっと落ちますすいません...
送信にかんしてはmodalFormDataでtextFieldを用意するだけで大丈夫です
そこまで難しくないと思いますが
まずはActionFormにボタンとタイトルを追加してみましょ
はい
特定のアイテムを条件にするのでここのifの中にActionFormDataを定義します
(定義だけなら一番外側でもいいですが)
変数名をformにしたのであれば
form.title("タイトル");
form.button("ボタン");
のようにして追加します
form.button()は追加したいボタンの数だけ使うことができます
ボディってのは必要ですか?
`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("ボタン");`
この文で実行できますか?
ほぉ@
まあ分かりやすいからifの中に書いた方いいかも
この文を最適に直すならどのように
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("ボタン");
}
});
ありがたく参考にさせていただきます。
これで表示するformはできたので次はプレイヤーに表示させる処理です
はい
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番目スタート)のボタンを押したかの数字が入っています
form.show(source).then(response => { // 表示 const { canceled, selection } = response; });
ってどこに書いても実行されますか?
form.buttonの下に続けて書いてください
開いたことを検知とかってできます(開くとイベント)
何を開くとですか
フォームをです。
あっ違ったifでクリックを検知したときに別のイベントも実行させたいんです。
というと
world.events.beforeItemUse.subscribe(event => {
const { item, source } = event;
if(item.typeId === 'minecraft:compass'
&& item.nameTag === 'test')
ここで検知したやつです
別のイベントがいまいちわかりません
コマンドを実行できます?
できます
どう書けばいいでしょう?
Entityクラス(Player含む)かdimensionクラスに生えているrunCommandAsyncメソッドを使います
ほ、ほう
https://youtu.be/QdwepyNQvTQ
この動画のようなプレイヤーリストってどうすれば。。。
TN-AntiCheat用の管理画面です
昨日あたりに #script-api で同じようなことしてましたね
再度定義してshowでいいです