チェストを使ったショップを作りたい
誰でも簡単に作成できるショップを開発していて、
チェストを用意し、画像の青の範囲に売りたいアイテム、その下のスロット(黄色の範囲)に値段を書いた紙を置く
そしてその上にエメラルドブロックを置くことで、そのエメラルドブロックをクリックすると青の範囲のみUIが表示され、
そのアイテムに設定した値段が書いてあり、クリックすると購入できる というものを作成したいです。
しかし現状のコードから一切どうしてよいのかわからず、質問させていただきました
サーバーver 1.20です
(再現したいもの:https://ratami.com/?page_id=182 )
89 Replies
1.12.2だけど
これインベントリの全アイテムを表示する奴
ご回答ありがとうございます。
ところが、エラーがでてしまいました。
{_inv::*}かな?
こちらのコードで動作しますか?
{_inv::*}をループするならその前のsetのとこのも書き換えなきゃいけないと思います
skriptプラグインのバージョンいくつですか?
2.7.0-β3です
変えてみましたが、<none>と表示されます。
僕が言うことはもうありません😔
chestのslotを全部リスト変数にいれてloopしてみては
多分ほぼ知識ない気がするので例文書いてあげないとわからないかもしれない
それか
申し訳ないです…
kamo
こうなってしまいます
set {_inv::*} to inventory of clicked itemでインベントリの全アイテム取得できるならいけると思うんだけどな…
というか
なんでもないです
笑
loop all items in inventory of チェスト
の形にしてみてください
うまく反映されました。ありがとうございます。しかしまだ再現したいものとは程遠いため、
質問するかもしれないのですが、その場合ここの投稿のタイトルを変えてから質問をしたほうがよいでしょうか?
そのままでいいですよ
次のステップいこう
ありがとうございます。お手数をおかけしますが宜しくお願いします。
恐らく今後、アイテムの名前から数字だけを取得したくなる時が来ると思うので
https://discord.com/channels/545926404785569793/587090563074097199/905456886608982047
この関数を載せておきます
ありがとうございます。
今、図のように9回ループさせ、{_sellSlot} (loop-number +1)と{_priceSlot}(loop-number + 9)してみようと思いやってみたものの、再現したいものを作るために、次どうすればよいかわかりません
まず、slot番号は0から始まるため、itemSlotはloop-number - 1にしてください
同様に、priceSlotはloop-number + 8になります
抜けてるとこが多くて申し訳ないです
そこからなどでアイテムを取得というやり方がある
ありがとうございます。
やってみましたが、アイテム取得が<none>でした。
そして、もう1つ気になるのが、先ほどの名前取得時には「2 grasses」などとidではなく、個数と名前でした。
こちらはidとamountなどと取得できるものなのでしょうか?
skriptの仕様ですね
アイテム名を取得したい場合はname of ○○
なるほど…
リスト変数の仕様はよく知りませんが、アイテム取得の部分がnoneなのは、send部分のリスト変数の前に_がないからかもしれないと思いました。
修正してみたところ、itemSlotの1だけ一番最初のときのログが出るようになりました
う~ん
多分みんな勘違いしてるんだけど
さっきアイテムをloopするためにitems in inventoryっていう指定をする必要があったってことは
単純に
じゃいけないわけで
とするといいのかもしれません
これを実行したところ、このようになりました。
airが飛ばされている?かと思うのですが、どうでしょうか…?
アイテムを変数に代入した際にindexの振り直しがあるのかな
このコードを実行して結果を載せて欲しいです
わかりました
エラーがでました…
おォん
あ
違いました
こうなりました。
ヨシ
どうするかなこれ
loop-indexというのはなんですか?
リスト変数と言うものはご存知ですか?
ほぼわからないです
複数格納できる的なことしかわからないです
(loop-numberとindexの違いがわからないです)
変数には大きく2種類あって、
・変数
・リスト変数
などと呼ばれます
変数は値を一つ、リスト変数は値を複数代入することができるのですが、複数代入する際に、
データ固有のID
: データ
と言う形で保存されます。
この固有のIDをindex、データの事をvalueといいます
loop-numberは、loop n times:
という構文を使用した際、現在が何周目なのかを教えてくれますなるほど
これで一応アイテムの取得は可能になるんですが、商品が設定されていないスロットが飛ばされているのでちょっと扱いにくいですね
はい
どうしよかな
これを実行してみて欲しいです
エラーがでました
すいません動きました。
よしよし
ほんで今何をしたくてアイテムの取得に躍起になってんだ?
目標を明確にした方がいいな
今はエメラルドブロックをクリックした時に商品だけ表示したいのか
このシステムをどうしても再現したくて https://ratami.com/?page_id=182
プレイヤーにインベントリを開くコード
とりあえずこれを達成するためにはこれらの構文があれば十分かな
これを用いて取得したアイテムを、インベントリを開くコードの表示したいアイテムとする、っていう考えを置いて寝ます
別の人に託す
ありがとうございます
@ir0h4_3 今北産業
できる範囲で案だすよ
ありがとうございます
購入する際のシステムなのですが、functionで所持金がなかった場合にstopをかけたのですが、次のsend "aaa"が動いてしまい困っています。
本来ここ(send "aaa")で、アイテムの受け渡しをしようと思っています。
そしてこの2つのブロックの保護についてどうしようか悩んでいます。
・ホッパーでの在庫にアクセス
・爆破などでの破壊
・普通に破壊など
・ピストンでの移動(エメラルドブロック)
を防ぎたいです
一つ聞きたいのはbuyの返り値は使うのかっていうことかな。
もし使わないんならbooleanにしてstop if buy(~) is falseをbuy(~)の代わりに置けばやり方は思いつくはずだよ
ありがとうございます
参考にします
保護については、何か案などありますか?
まず初めに、保護を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...
なるほど...
ちなみにエメラルドをチェストの上に置いた際にそのチェストの名前を置いた人の名前にして名前を記録しています
(他に方法が思いつきませんでした)
次に爆破を防ぐ際は、この構文を用いて爆破されたブロックを取得し、取得した際にショップを構成するブロックが含まれていたら除外する、という方針でいきます
Skript Hub - Documentation
Exploded Blocks (Expression) - Skript
Get all the blocks that were destroyed in an explode event
なるほど
爆発以外による破壊の防止
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.
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.
長期に渡って保存したい重要なデータは、名前で保存しない方が良いです
mcid変更すると動かなくなってしまいます
この場合、uuid of playerでuuidによるデータの保存を行うことを推奨します
なるほど、uuidをチェストの名前に保存するということですか?
それとも他に保存方法がある感じですか...?
チェストの名前にしても問題は無いですが、その代わりショップを開いた時に〇〇のお店等といった表示ができなくなります
保護Skriptをしっかり作って第三者による破壊を完璧に防げるのであれば、変数に保存する方法があります
これならばショップを開いた時の表示も自由にカスタマイズ可能です
UUIDから名前を取得することは不可能ですか?
可能です
変数とどちらがいいと思いますか?完璧に防げるのであれば〜がすこしよくわからなくて
YMLファイルに座標指定で保存するという手もありますよ
変数にplayerUUIDその他もろもろを保存するとなると
例えば想定外の要因でチェストが破壊された時
チェストは無いのにshopデータだけが残り続けて制御不可能…
と言ったようなことが起きかねない
ってことかと
そういう事です
ブロックとデータの同期って意外と大変なんです
ただ自由度も利便性も変数に保存した時の方が圧倒的に上です
正味
on loadで変数の中ぶん回してチェックすれば行けそうだけどね
block にdata 持たせられないんだっけ?
blockdataはあるけどあれってデータ追加できるんか
使ったことないからほぼ分からん
loreが付いた状態で付与…?
そうです
です
解決しました
これを実行したいのですが、写真のようにエラーがでます
対処法を教えてください…
該当部分どこ…?
送るの間違えてました
あるある