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

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
89 Replies
ir0h4_3
ir0h4_3OP16mo ago
No description
月猫ch
月猫ch16mo ago
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_3OP16mo ago
ご回答ありがとうございます。 ところが、エラーがでてしまいました。
ir0h4_3
ir0h4_3OP16mo ago
No description
ふぁたおくん
{_inv::*}かな?
ir0h4_3
ir0h4_3OP16mo 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_3OP16mo ago
2.7.0-β3です 変えてみましたが、<none>と表示されます。
ふぁたおくん
僕が言うことはもうありません😔
Melonium
Melonium16mo ago
chestのslotを全部リスト変数にいれてloopしてみては
ふぁたおくん
多分ほぼ知識ない気がするので例文書いてあげないとわからないかもしれない
Melonium
Melonium16mo ago
それか
ir0h4_3
ir0h4_3OP16mo ago
申し訳ないです…
Melonium
Melonium16mo ago
set {_inv::*} to inventory of チェストブロック
loop {_inv::*}:
broadcast "%loop-value%"
set {_inv::*} to inventory of チェストブロック
loop {_inv::*}:
broadcast "%loop-value%"
kamo
ir0h4_3
ir0h4_3OP16mo ago
こうなってしまいます
No description
ふぁたおくん
set {_inv::*} to inventory of clicked itemでインベントリの全アイテム取得できるならいけると思うんだけどな… というか なんでもないです 笑
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
loop all items in inventory of チェスト の形にしてみてください
ir0h4_3
ir0h4_3OP16mo ago
うまく反映されました。ありがとうございます。しかしまだ再現したいものとは程遠いため、 質問するかもしれないのですが、その場合ここの投稿のタイトルを変えてから質問をしたほうがよいでしょうか?
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
そのままでいいですよ 次のステップいこう
ir0h4_3
ir0h4_3OP16mo ago
ありがとうございます。お手数をおかけしますが宜しくお願いします。
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
恐らく今後、アイテムの名前から数字だけを取得したくなる時が来ると思うので https://discord.com/channels/545926404785569793/587090563074097199/905456886608982047 この関数を載せておきます
ir0h4_3
ir0h4_3OP16mo 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_3OP16mo ago
抜けてるとこが多くて申し訳ないです
Melonium
Melonium16mo 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_3OP16mo 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_3OP16mo ago
なるほど…
ふぁたおくん
リスト変数の仕様はよく知りませんが、アイテム取得の部分がnoneなのは、send部分のリスト変数の前に_がないからかもしれないと思いました。
ir0h4_3
ir0h4_3OP16mo ago
修正してみたところ、itemSlotの1だけ一番最初のときのログが出るようになりました
No description
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_3OP16mo 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_3OP16mo 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_3OP16mo ago
わかりました
ir0h4_3
ir0h4_3OP16mo ago
No description
ir0h4_3
ir0h4_3OP16mo ago
エラーがでました…
ir0h4_3
ir0h4_3OP16mo ago
あ 違いました
ir0h4_3
ir0h4_3OP16mo ago
No description
ir0h4_3
ir0h4_3OP16mo ago
こうなりました。
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
ヨシ どうするかなこれ
ir0h4_3
ir0h4_3OP16mo ago
loop-indexというのはなんですか?
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
リスト変数と言うものはご存知ですか?
ir0h4_3
ir0h4_3OP16mo ago
ほぼわからないです 複数格納できる的なことしかわからないです (loop-numberとindexの違いがわからないです)
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
変数には大きく2種類あって、 ・変数 ・リスト変数 などと呼ばれます 変数は値を一つ、リスト変数は値を複数代入することができるのですが、複数代入する際に、 データ固有のID : データ と言う形で保存されます。 この固有のIDをindex、データの事をvalueといいます loop-numberは、loop n times: という構文を使用した際、現在が何周目なのかを教えてくれます
ir0h4_3
ir0h4_3OP16mo ago
なるほど
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
これで一応アイテムの取得は可能になるんですが、商品が設定されていないスロットが飛ばされているのでちょっと扱いにくいですね
ir0h4_3
ir0h4_3OP16mo 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_3OP16mo ago
エラーがでました
No description
ir0h4_3
ir0h4_3OP16mo ago
No description
ir0h4_3
ir0h4_3OP16mo ago
すいません動きました。
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
よしよし ほんで今何をしたくてアイテムの取得に躍起になってんだ? 目標を明確にした方がいいな 今はエメラルドブロックをクリックした時に商品だけ表示したいのか
ir0h4_3
ir0h4_3OP16mo 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_3OP16mo ago
ありがとうございます
月猫ch
月猫ch16mo ago
@ir0h4_3 今北産業 できる範囲で案だすよ
ir0h4_3
ir0h4_3OP16mo ago
ありがとうございます
ir0h4_3
ir0h4_3OP16mo ago
購入する際のシステムなのですが、functionで所持金がなかった場合にstopをかけたのですが、次のsend "aaa"が動いてしまい困っています。 本来ここ(send "aaa")で、アイテムの受け渡しをしようと思っています。
No description
ir0h4_3
ir0h4_3OP16mo ago
そしてこの2つのブロックの保護についてどうしようか悩んでいます。 ・ホッパーでの在庫にアクセス ・爆破などでの破壊 ・普通に破壊など ・ピストンでの移動(エメラルドブロック) を防ぎたいです
No description
soramame_256
soramame_25616mo ago
一つ聞きたいのはbuyの返り値は使うのかっていうことかな。 もし使わないんならbooleanにしてstop if buy(~) is falseをbuy(~)の代わりに置けばやり方は思いつくはずだよ
ir0h4_3
ir0h4_3OP16mo ago
ありがとうございます 参考にします 保護については、何か案などありますか?
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
まず初めに、保護を1から作るのは中々大変だという事を伝えておきます 1つずつ対処しましょう まずホッパーについて、以下の構文が使えます https://skripthub.net/docs/?id=8200
Skript Hub - Documentation
On Inventory Move Item (Event) - SkBee
Called when some entity or block (e.g. hopper) tries to move items directly from one inventory to another. NOTE: This has nothing to do with a player's inventory!!! When this event is called, the initiator may already have removed the item from the source inventory and is ready to move it into the destination inventory. If this event is cance...
ir0h4_3
ir0h4_3OP16mo ago
なるほど... ちなみにエメラルドをチェストの上に置いた際にそのチェストの名前を置いた人の名前にして名前を記録しています (他に方法が思いつきませんでした)
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
次に爆破を防ぐ際は、この構文を用いて爆破されたブロックを取得し、取得した際にショップを構成するブロックが含まれていたら除外する、という方針でいきます
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
Skript Hub - Documentation
Exploded Blocks (Expression) - Skript
Get all the blocks that were destroyed in an explode event
ir0h4_3
ir0h4_3OP16mo 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
Skript Hub - Documentation
On Block Piston Push (Event) - MorkazSk
Called when block is pulled by piston. Cancelling this event will prevent piston from pulling.
Skript Hub - Documentation
On Block Piston Pull (Event) - MorkazSk
Called when block is pulled by piston. Cancelling this event will prevent piston from pulling.
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
長期に渡って保存したい重要なデータは、名前で保存しない方が良いです mcid変更すると動かなくなってしまいます この場合、uuid of playerでuuidによるデータの保存を行うことを推奨します
ir0h4_3
ir0h4_3OP16mo ago
なるほど、uuidをチェストの名前に保存するということですか? それとも他に保存方法がある感じですか...?
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
チェストの名前にしても問題は無いですが、その代わりショップを開いた時に〇〇のお店等といった表示ができなくなります 保護Skriptをしっかり作って第三者による破壊を完璧に防げるのであれば、変数に保存する方法があります これならばショップを開いた時の表示も自由にカスタマイズ可能です
ir0h4_3
ir0h4_3OP16mo ago
UUIDから名前を取得することは不可能ですか?
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
可能です
set {_player} to "uuid" parsed as offline player
set {_player} to "uuid" parsed as offline player
ir0h4_3
ir0h4_3OP16mo ago
変数とどちらがいいと思いますか?完璧に防げるのであれば〜がすこしよくわからなくて
月猫ch
月猫ch16mo ago
YMLファイルに座標指定で保存するという手もありますよ 変数にplayerUUIDその他もろもろを保存するとなると 例えば想定外の要因でチェストが破壊された時 チェストは無いのにshopデータだけが残り続けて制御不可能… と言ったようなことが起きかねない ってことかと
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
そういう事です ブロックとデータの同期って意外と大変なんです ただ自由度も利便性も変数に保存した時の方が圧倒的に上です
月猫ch
月猫ch16mo ago
正味 on loadで変数の中ぶん回してチェックすれば行けそうだけどね
tanoKun
tanoKun16mo ago
block にdata 持たせられないんだっけ?
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
blockdataはあるけどあれってデータ追加できるんか 使ったことないからほぼ分からん
ir0h4_3
ir0h4_3OP16mo ago
全く違うところで悩んでしまっています。 購入時に、チェストの中身のアイテムを1つだけ渡したいのですが、 なぜかloreがついた状態で付与してしまい、困っています。 あと、チェストの中(在庫)のアイテムを1個ずつ消したいです。
月猫ch
月猫ch16mo ago
loreが付いた状態で付与…?
ir0h4_3
ir0h4_3OP16mo 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}%」"
です 解決しました
ir0h4_3
ir0h4_3OP16mo ago
on inventory move item:
if type of past event-inventory = hopper inventory:
set {_det_chest} to block above future event-inventory
if {_det_chest} is emerald_block:
cancel event
on inventory move item:
if type of past event-inventory = hopper inventory:
set {_det_chest} to block above future event-inventory
if {_det_chest} is emerald_block:
cancel event
これを実行したいのですが、写真のようにエラーがでます 対処法を教えてください…
No description
月猫ch
月猫ch16mo ago
該当部分どこ…?
ir0h4_3
ir0h4_3OP16mo ago
送るの間違えてました
月猫ch
月猫ch16mo ago
あるある
Want results from more Discord servers?
Add your server