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

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_310mo ago
No description
Tsukineko(月雲)
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_310mo ago
ご回答ありがとうございます。 ところが、エラーがでてしまいました。
ir0h4_3
ir0h4_310mo ago
No description
ふぁたおくん
{_inv::*}かな?
ir0h4_3
ir0h4_310mo 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_310mo ago
2.7.0-β3です 変えてみましたが、<none>と表示されます。
ふぁたおくん
僕が言うことはもうありません😔
Melonium
Melonium10mo ago
chestのslotを全部リスト変数にいれてloopしてみては
ふぁたおくん
多分ほぼ知識ない気がするので例文書いてあげないとわからないかもしれない
Melonium
Melonium10mo ago
それか
ir0h4_3
ir0h4_310mo ago
申し訳ないです…
Melonium
Melonium10mo 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_310mo ago
こうなってしまいます
No description
ふぁたおくん
set {_inv::*} to inventory of clicked itemでインベントリの全アイテム取得できるならいけると思うんだけどな… というか なんでもないです 笑
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
loop all items in inventory of チェスト の形にしてみてください
ir0h4_3
ir0h4_310mo ago
うまく反映されました。ありがとうございます。しかしまだ再現したいものとは程遠いため、 質問するかもしれないのですが、その場合ここの投稿のタイトルを変えてから質問をしたほうがよいでしょうか?
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
そのままでいいですよ 次のステップいこう
ir0h4_3
ir0h4_310mo ago
ありがとうございます。お手数をおかけしますが宜しくお願いします。
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
恐らく今後、アイテムの名前から数字だけを取得したくなる時が来ると思うので https://discord.com/channels/545926404785569793/587090563074097199/905456886608982047 この関数を載せておきます
ir0h4_3
ir0h4_310mo 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_310mo ago
抜けてるとこが多くて申し訳ないです
Melonium
Melonium10mo 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_310mo 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_310mo ago
なるほど…
ふぁたおくん
リスト変数の仕様はよく知りませんが、アイテム取得の部分がnoneなのは、send部分のリスト変数の前に_がないからかもしれないと思いました。
ir0h4_3
ir0h4_310mo 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_310mo 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_310mo 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_310mo ago
わかりました
ir0h4_3
ir0h4_310mo ago
No description
ir0h4_3
ir0h4_310mo ago
エラーがでました…
ir0h4_3
ir0h4_310mo ago
あ 違いました
ir0h4_3
ir0h4_310mo ago
No description
ir0h4_3
ir0h4_310mo ago
こうなりました。
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
ヨシ どうするかなこれ
ir0h4_3
ir0h4_310mo ago
loop-indexというのはなんですか?
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
リスト変数と言うものはご存知ですか?
ir0h4_3
ir0h4_310mo ago
ほぼわからないです 複数格納できる的なことしかわからないです (loop-numberとindexの違いがわからないです)
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
変数には大きく2種類あって、 ・変数 ・リスト変数 などと呼ばれます 変数は値を一つ、リスト変数は値を複数代入することができるのですが、複数代入する際に、 データ固有のID : データ と言う形で保存されます。 この固有のIDをindex、データの事をvalueといいます loop-numberは、loop n times: という構文を使用した際、現在が何周目なのかを教えてくれます
ir0h4_3
ir0h4_310mo ago
なるほど
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
これで一応アイテムの取得は可能になるんですが、商品が設定されていないスロットが飛ばされているのでちょっと扱いにくいですね
ir0h4_3
ir0h4_310mo 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_310mo ago
エラーがでました
No description
ir0h4_3
ir0h4_310mo ago
No description
ir0h4_3
ir0h4_310mo ago
すいません動きました。
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
よしよし ほんで今何をしたくてアイテムの取得に躍起になってんだ? 目標を明確にした方がいいな 今はエメラルドブロックをクリックした時に商品だけ表示したいのか
ir0h4_3
ir0h4_310mo 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_310mo ago
ありがとうございます
Tsukineko(月雲)
@ir0h4_3 今北産業 できる範囲で案だすよ
ir0h4_3
ir0h4_310mo ago
ありがとうございます
ir0h4_3
ir0h4_310mo ago
購入する際のシステムなのですが、functionで所持金がなかった場合にstopをかけたのですが、次のsend "aaa"が動いてしまい困っています。 本来ここ(send "aaa")で、アイテムの受け渡しをしようと思っています。
No description
ir0h4_3
ir0h4_310mo ago
そしてこの2つのブロックの保護についてどうしようか悩んでいます。 ・ホッパーでの在庫にアクセス ・爆破などでの破壊 ・普通に破壊など ・ピストンでの移動(エメラルドブロック) を防ぎたいです
No description
soramame_256
soramame_25610mo ago
一つ聞きたいのはbuyの返り値は使うのかっていうことかな。 もし使わないんならbooleanにしてstop if buy(~) is falseをbuy(~)の代わりに置けばやり方は思いつくはずだよ
ir0h4_3
ir0h4_310mo 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_310mo ago
なるほど... ちなみにエメラルドをチェストの上に置いた際にそのチェストの名前を置いた人の名前にして名前を記録しています (他に方法が思いつきませんでした)
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
次に爆破を防ぐ際は、この構文を用いて爆破されたブロックを取得し、取得した際にショップを構成するブロックが含まれていたら除外する、という方針でいきます
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
Skript Hub - Documentation
Exploded Blocks (Expression) - Skript
Get all the blocks that were destroyed in an explode event
ir0h4_3
ir0h4_310mo 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_310mo ago
なるほど、uuidをチェストの名前に保存するということですか? それとも他に保存方法がある感じですか...?
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
チェストの名前にしても問題は無いですが、その代わりショップを開いた時に〇〇のお店等といった表示ができなくなります 保護Skriptをしっかり作って第三者による破壊を完璧に防げるのであれば、変数に保存する方法があります これならばショップを開いた時の表示も自由にカスタマイズ可能です
ir0h4_3
ir0h4_310mo ago
UUIDから名前を取得することは不可能ですか?
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
可能です
set {_player} to "uuid" parsed as offline player
set {_player} to "uuid" parsed as offline player
ir0h4_3
ir0h4_310mo ago
変数とどちらがいいと思いますか?完璧に防げるのであれば〜がすこしよくわからなくて
Tsukineko(月雲)
YMLファイルに座標指定で保存するという手もありますよ 変数にplayerUUIDその他もろもろを保存するとなると 例えば想定外の要因でチェストが破壊された時 チェストは無いのにshopデータだけが残り続けて制御不可能… と言ったようなことが起きかねない ってことかと
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
そういう事です ブロックとデータの同期って意外と大変なんです ただ自由度も利便性も変数に保存した時の方が圧倒的に上です
Tsukineko(月雲)
正味 on loadで変数の中ぶん回してチェックすれば行けそうだけどね
tanoKun
tanoKun10mo ago
block にdata 持たせられないんだっけ?
mirageeeeeeeeeeeeeeeeeeeeeeeeeee
blockdataはあるけどあれってデータ追加できるんか 使ったことないからほぼ分からん
ir0h4_3
ir0h4_310mo ago
全く違うところで悩んでしまっています。 購入時に、チェストの中身のアイテムを1つだけ渡したいのですが、 なぜかloreがついた状態で付与してしまい、困っています。 あと、チェストの中(在庫)のアイテムを1個ずつ消したいです。
Tsukineko(月雲)
loreが付いた状態で付与…?
ir0h4_3
ir0h4_310mo 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_310mo 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
Tsukineko(月雲)
該当部分どこ…?
ir0h4_3
ir0h4_310mo ago
送るの間違えてました
Tsukineko(月雲)
あるある
Want results from more Discord servers?
Add your server
More Posts
チャットで装飾コードを使えなくしたいskriptのon shatで通常チャットを変えてるのですがそれをすると装飾コードが使えるようになり&kでチャットをすると文字化けして統合版でプレイしてる人が落ちたりします なので装飾コードを打てなく参加した時のゲームモード変更```on join: set join message to "&7[&9&lSV&7] &e&l%player%&7さんが&a&lログイン&7しました。" teleport theアマスタを触った時のイベント```on armor stand interact: if player is not op: send "you are not op" cancel evサーバーが落ちないようにプレイヤーに乗れるようにする```skript on right click: loop all players: if loop-player's vehicle is event-entity: 負荷がすくないランダムスポーンシステムの作成かつて `blocks within locA and locB`から毎tickランダムでブロックを取得し、そこにモブをスポーンできる(十分スペースがある、playerと近すぎない等々)場合spawnタブリストからプレイヤーを非表示にSkript 2.6.3でこれを行う方法はありますか???プレイヤーごとに役職を与えたい今僕はRPGサーバーを作っていて、RPGには欠かせない役職(戦士、魔法使いみたいな)を作りたいです。 具体的にどういう風な構想してるかというと、 村に必ずあるエンチャントテーブルを右クリック→GUIがリスト変数からの削除座標が複数入ってるリスト変数から特定の座標だけを消す方法が知りたいです。Mapの中心を設定プレイヤーが手持ちにマップを持っていた時に常にマップを更新してプレイヤーの位置がマップの中央に来るようにしたい マップの更新をする方法を教えてほしいです。height of %?%のアドオン名以下のアドオンの中で該当する構文を含んでいる物って何ですか https://gyazo.com/b63909cd21d78441f9f1685912651ed6