チェストを使ったショップを作りたい

on right click on emerald block:
set {_chest} to block below clicked block
if {_chest} is a chest:
cancel event
set {_items} to {_chest}'s inventory
on right click on emerald block:
set {_chest} to block below clicked block
if {_chest} is a chest:
cancel event
set {_items} to {_chest}'s inventory
誰でも簡単に作成できるショップを開発していて、 チェストを用意し、画像の青の範囲に売りたいアイテム、その下のスロット(黄色の範囲)に値段を書いた紙を置く そしてその上にエメラルドブロックを置くことで、そのエメラルドブロックをクリックすると青の範囲のみUIが表示され、 そのアイテムに設定した値段が書いてあり、クリックすると購入できる というものを作成したいです。 しかし現状のコードから一切どうしてよいのかわからず、質問させていただきました サーバーver 1.20です (再現したいもの:https://ratami.com/?page_id=182
74 Replies
月猫ch(月雲)
1.12.2だけど
set {_inv} to inventory of チェストブロック
loop {_inv}:
broadcast "%loop-value%"
set {_inv} to inventory of チェストブロック
loop {_inv}:
broadcast "%loop-value%"
これインベントリの全アイテムを表示する奴
ir0h4_3
ir0h4_3OP3y ago
ご回答ありがとうございます。 ところが、エラーがでてしまいました。
ふぁたおくん
{_inv::*}かな?
ir0h4_3
ir0h4_3OP3y ago
こちらのコードで動作しますか?
on right click on emerald block:
set {_chest} to block below clicked block
if {_chest} is a chest:
cancel event
set {_inv} to inventory of {_chest}
loop {_inv::*}:
broadcast "%loop-value%"

else:
send "下にチェストがありません!" to player
on right click on emerald block:
set {_chest} to block below clicked block
if {_chest} is a chest:
cancel event
set {_inv} to inventory of {_chest}
loop {_inv::*}:
broadcast "%loop-value%"

else:
send "下にチェストがありません!" to player
ふぁたおくん
{_inv::*}をループするならその前のsetのとこのも書き換えなきゃいけないと思います
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
skriptプラグインのバージョンいくつですか?
ir0h4_3
ir0h4_3OP3y ago
2.7.0-β3です 変えてみましたが、<none>と表示されます。
ふぁたおくん
僕が言うことはもうありません😔
Melonium
Melonium3y ago
chestのslotを全部リスト変数にいれてloopしてみては
ふぁたおくん
多分ほぼ知識ない気がするので例文書いてあげないとわからないかもしれない
Melonium
Melonium3y ago
それか
ir0h4_3
ir0h4_3OP3y ago
申し訳ないです…
Melonium
Melonium3y ago
set {_inv::*} to inventory of チェストブロック
loop {_inv::*}:
broadcast "%loop-value%"
set {_inv::*} to inventory of チェストブロック
loop {_inv::*}:
broadcast "%loop-value%"
kamo
ふぁたおくん
set {_inv::*} to inventory of clicked itemでインベントリの全アイテム取得できるならいけると思うんだけどな… というか なんでもないです 笑
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
loop all items in inventory of チェスト の形にしてみてください
ir0h4_3
ir0h4_3OP3y ago
うまく反映されました。ありがとうございます。しかしまだ再現したいものとは程遠いため、 質問するかもしれないのですが、その場合ここの投稿のタイトルを変えてから質問をしたほうがよいでしょうか?
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
そのままでいいですよ 次のステップいこう
ir0h4_3
ir0h4_3OP3y ago
ありがとうございます。お手数をおかけしますが宜しくお願いします。
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
恐らく今後、アイテムの名前から数字だけを取得したくなる時が来ると思うので https://discord.com/channels/545926404785569793/587090563074097199/905456886608982047 この関数を載せておきます
ir0h4_3
ir0h4_3OP3y ago
ありがとうございます。 今、図のように9回ループさせ、{_sellSlot} (loop-number +1)と{_priceSlot}(loop-number + 9)してみようと思いやってみたものの、再現したいものを作るために、次どうすればよいかわかりません
on right click on emerald block:
set {_chest} to block below clicked block
set {_inv::*} to inventory of {_chest}
if {_chest} is a chest:
cancel event
loop 9 times:
loop all items in inventory of {_chest}:
set {_itemSlot} to loop-number + 1
set {_priceSlot} to loop-number + 9


else:
send "下にチェストがありません!" to player
on right click on emerald block:
set {_chest} to block below clicked block
set {_inv::*} to inventory of {_chest}
if {_chest} is a chest:
cancel event
loop 9 times:
loop all items in inventory of {_chest}:
set {_itemSlot} to loop-number + 1
set {_priceSlot} to loop-number + 9


else:
send "下にチェストがありません!" to player
No description
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
まず、slot番号は0から始まるため、itemSlotはloop-number - 1にしてください 同様に、priceSlotはloop-number + 8になります
ir0h4_3
ir0h4_3OP3y ago
抜けてるとこが多くて申し訳ないです
Melonium
Melonium3y ago
on right click on emerald block:
set {_chest} to block below clicked block
set {_inv::*} to inventory of {_chest}
if {_chest} is a chest:
cancel event
loop 9 times:
set {_itemSlot} to loop-number - 1
set {_priceSlot} to loop-number + 8
on right click on emerald block:
set {_chest} to block below clicked block
set {_inv::*} to inventory of {_chest}
if {_chest} is a chest:
cancel event
loop 9 times:
set {_itemSlot} to loop-number - 1
set {_priceSlot} to loop-number + 8

そこから
{inv::%{_itemSlot}%}
{inv::%{_itemSlot}%}
などでアイテムを取得というやり方がある
ir0h4_3
ir0h4_3OP3y ago
ありがとうございます。
on right click on emerald block:
set {_chest} to block below clicked block
set {_inv::*} to inventory of {_chest}
if {_chest} is a chest:
cancel event
loop 9 times:
set {_itemSlot} to loop-number - 1
set {_priceSlot} to loop-number + 8
send "%{_itemSlot}% => %{_priceSlot}%"
send "%{inv::%{_itemSlot}%}% => %{inv::%{_priceSlot}%}%"
else:
send "下にチェストがありません!" to player
on right click on emerald block:
set {_chest} to block below clicked block
set {_inv::*} to inventory of {_chest}
if {_chest} is a chest:
cancel event
loop 9 times:
set {_itemSlot} to loop-number - 1
set {_priceSlot} to loop-number + 8
send "%{_itemSlot}% => %{_priceSlot}%"
send "%{inv::%{_itemSlot}%}% => %{inv::%{_priceSlot}%}%"
else:
send "下にチェストがありません!" to player
やってみましたが、アイテム取得が<none>でした。 そして、もう1つ気になるのが、先ほどの名前取得時には「2 grasses」などとidではなく、個数と名前でした。 こちらはidとamountなどと取得できるものなのでしょうか?
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
skriptの仕様ですね アイテム名を取得したい場合はname of ○○
ir0h4_3
ir0h4_3OP3y ago
なるほど…
ふぁたおくん
リスト変数の仕様はよく知りませんが、アイテム取得の部分がnoneなのは、send部分のリスト変数の前に_がないからかもしれないと思いました。
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
う~ん 多分みんな勘違いしてるんだけど さっきアイテムをloopするためにitems in inventoryっていう指定をする必要があったってことは 単純に
{_var::*} to inventory
{_var::*} to inventory
じゃいけないわけで
set {_items::*} to all items in inventory of {_chest}
set {_items::*} to all items in inventory of {_chest}
とするといいのかもしれません
ir0h4_3
ir0h4_3OP3y ago
on right click on emerald block:
set {_chest} to block below clicked block
set {_inv::*} to inventory of {_chest}
if {_chest} is a chest:
cancel event
loop 9 times:
set {_itemSlot} to loop-number - 1
set {_priceSlot} to loop-number + 8
set {_items::*} to all items in inventory of {_chest}
send "%{_items::%{_itemSlot}%}% -> %{_items::%{_priceSlot}%}%"

else:
send "下にチェストがありません!" to player
on right click on emerald block:
set {_chest} to block below clicked block
set {_inv::*} to inventory of {_chest}
if {_chest} is a chest:
cancel event
loop 9 times:
set {_itemSlot} to loop-number - 1
set {_priceSlot} to loop-number + 8
set {_items::*} to all items in inventory of {_chest}
send "%{_items::%{_itemSlot}%}% -> %{_items::%{_priceSlot}%}%"

else:
send "下にチェストがありません!" to player
これを実行したところ、このようになりました。
No description
No description
ir0h4_3
ir0h4_3OP3y ago
airが飛ばされている?かと思うのですが、どうでしょうか…?
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
アイテムを変数に代入した際にindexの振り直しがあるのかな
on right click on emerald block:
set {_chest} to block below clicked block
if {_chest} is a chest:
cancel event
set {_items::*} to all items in inventory of {_chest}
loop {_items::*}:
send "%loop-index% : %loop-value%"
else:
send "下にチェストがありません!" to player
on right click on emerald block:
set {_chest} to block below clicked block
if {_chest} is a chest:
cancel event
set {_items::*} to all items in inventory of {_chest}
loop {_items::*}:
send "%loop-index% : %loop-value%"
else:
send "下にチェストがありません!" to player
このコードを実行して結果を載せて欲しいです
ir0h4_3
ir0h4_3OP3y ago
わかりました
ir0h4_3
ir0h4_3OP3y ago
エラーがでました…
ir0h4_3
ir0h4_3OP3y ago
あ 違いました
ir0h4_3
ir0h4_3OP3y ago
こうなりました。
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
ヨシ どうするかなこれ
ir0h4_3
ir0h4_3OP3y ago
loop-indexというのはなんですか?
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
リスト変数と言うものはご存知ですか?
ir0h4_3
ir0h4_3OP3y ago
ほぼわからないです 複数格納できる的なことしかわからないです (loop-numberとindexの違いがわからないです)
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
変数には大きく2種類あって、 ・変数 ・リスト変数 などと呼ばれます 変数は値を一つ、リスト変数は値を複数代入することができるのですが、複数代入する際に、 データ固有のID : データ と言う形で保存されます。 この固有のIDをindex、データの事をvalueといいます loop-numberは、loop n times: という構文を使用した際、現在が何周目なのかを教えてくれます
ir0h4_3
ir0h4_3OP3y ago
なるほど
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
これで一応アイテムの取得は可能になるんですが、商品が設定されていないスロットが飛ばされているのでちょっと扱いにくいですね
ir0h4_3
ir0h4_3OP3y ago
はい
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
どうしよかな
on right click on emerald block:
set {_chest} to block below clicked block
if {_chest} is a chest:
cancel event
loop 27 times:
set {_slot} to loop-number -1
set {_items::%{_slot}%} to slot {_slot} of inventory of {_chest}
loop {_items::*}:
send "%loop-index% : %loop-value%"
else:
send "下にチェストがありません!" to player
on right click on emerald block:
set {_chest} to block below clicked block
if {_chest} is a chest:
cancel event
loop 27 times:
set {_slot} to loop-number -1
set {_items::%{_slot}%} to slot {_slot} of inventory of {_chest}
loop {_items::*}:
send "%loop-index% : %loop-value%"
else:
send "下にチェストがありません!" to player
これを実行してみて欲しいです
ir0h4_3
ir0h4_3OP3y ago
すいません動きました。
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
よしよし ほんで今何をしたくてアイテムの取得に躍起になってんだ? 目標を明確にした方がいいな 今はエメラルドブロックをクリックした時に商品だけ表示したいのか
ir0h4_3
ir0h4_3OP3y ago
このシステムをどうしても再現したくて https://ratami.com/?page_id=182
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
プレイヤーにインベントリを開くコード
set {_inv} to chest inventory with 1 row named "表示したい文字"

set slot スロット番号 of {_inv} to 表示したいアイテム

open {_inv} to player
set {_inv} to chest inventory with 1 row named "表示したい文字"

set slot スロット番号 of {_inv} to 表示したいアイテム

open {_inv} to player
とりあえずこれを達成するためにはこれらの構文があれば十分かな これを用いて取得したアイテムを、インベントリを開くコードの表示したいアイテムとする、っていう考えを置いて寝ます 別の人に託す
ir0h4_3
ir0h4_3OP3y ago
ありがとうございます
月猫ch(月雲)
@ir0h4_3 今北産業 できる範囲で案だすよ
ir0h4_3
ir0h4_3OP3y ago
ありがとうございます
soramame_256
soramame_2563y ago
一つ聞きたいのはbuyの返り値は使うのかっていうことかな。 もし使わないんならbooleanにしてstop if buy(~) is falseをbuy(~)の代わりに置けばやり方は思いつくはずだよ
ir0h4_3
ir0h4_3OP3y ago
ありがとうございます 参考にします 保護については、何か案などありますか?
ir0h4_3
ir0h4_3OP3y ago
なるほど... ちなみにエメラルドをチェストの上に置いた際にそのチェストの名前を置いた人の名前にして名前を記録しています (他に方法が思いつきませんでした)
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
次に爆破を防ぐ際は、この構文を用いて爆破されたブロックを取得し、取得した際にショップを構成するブロックが含まれていたら除外する、という方針でいきます
ir0h4_3
ir0h4_3OP3y ago
なるほど
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
爆発以外による破壊の防止 https://skripthub.net/docs/?id=996
Skript Hub - Documentation
On Break / Mine (Event) - Skript
Called when a block is broken by a player. If you use 'on mine', only events where the broken block dropped something will call the trigger.
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
長期に渡って保存したい重要なデータは、名前で保存しない方が良いです mcid変更すると動かなくなってしまいます この場合、uuid of playerでuuidによるデータの保存を行うことを推奨します
ir0h4_3
ir0h4_3OP3y ago
なるほど、uuidをチェストの名前に保存するということですか? それとも他に保存方法がある感じですか...?
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
チェストの名前にしても問題は無いですが、その代わりショップを開いた時に〇〇のお店等といった表示ができなくなります 保護Skriptをしっかり作って第三者による破壊を完璧に防げるのであれば、変数に保存する方法があります これならばショップを開いた時の表示も自由にカスタマイズ可能です
ir0h4_3
ir0h4_3OP3y ago
UUIDから名前を取得することは不可能ですか?
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
可能です
set {_player} to "uuid" parsed as offline player
set {_player} to "uuid" parsed as offline player
ir0h4_3
ir0h4_3OP3y ago
変数とどちらがいいと思いますか?完璧に防げるのであれば〜がすこしよくわからなくて
月猫ch(月雲)
YMLファイルに座標指定で保存するという手もありますよ 変数にplayerUUIDその他もろもろを保存するとなると 例えば想定外の要因でチェストが破壊された時 チェストは無いのにshopデータだけが残り続けて制御不可能… と言ったようなことが起きかねない ってことかと
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
そういう事です ブロックとデータの同期って意外と大変なんです ただ自由度も利便性も変数に保存した時の方が圧倒的に上です
月猫ch(月雲)
正味 on loadで変数の中ぶん回してチェックすれば行けそうだけどね
tanoKun
tanoKun3y ago
block にdata 持たせられないんだっけ?
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
blockdataはあるけどあれってデータ追加できるんか 使ったことないからほぼ分からん
月猫ch(月雲)
loreが付いた状態で付与…?
ir0h4_3
ir0h4_3OP3y ago
そうです
set slot {s_itemslot} of {_inv} to {s_items::%{s_itemslot}%}
set lore of {s_items::%{s_itemslot}%} to "&r&a値段「%{_price::%{_slot}%}%」" and "&r&b在庫「%{_itemAmount}%」"
set slot {s_itemslot} of {_inv} to {s_items::%{s_itemslot}%}
set lore of {s_items::%{s_itemslot}%} to "&r&a値段「%{_price::%{_slot}%}%」" and "&r&b在庫「%{_itemAmount}%」"
です 解決しました
月猫ch(月雲)
該当部分どこ…?
ir0h4_3
ir0h4_3OP3y ago
送るの間違えてました
月猫ch(月雲)
あるある

Did you find this page helpful?