Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ############################################
- # ガチャ管理 Skript(最適化版)
- # 要件: Skript 2.9+ / SkBee (GUI/Item) / Paper 1.20.6 推奨
- ############################################
- # ---------- 初期化 ----------
- on load:
- # GUI用のテンプレアイテム
- set {gacha.item.config} to diamond named "&e&l景品設定"
- set {gacha.item.rename} to name tag named "&e&lガチャの名前変更"
- set {gacha.item.info} to writable book named "&e&lガチャの詳細設定"
- set {gacha.item.edit} to chest named "&e&lガチャアイテム変更"
- set {gacha.item.rarity} to emerald named "&e&lレアリティ設定"
- # プレイヤー一時状態は使うときにセットする(不要なら未定義のまま)
- # デフォルトで1つのガチャを作る(無ければ)
- if {gacha.list::*} is not set:
- add "&6&lガチャ1" to {gacha.list::*}
- set {gacha.rarity::1::0} to 1
- loop 9 times:
- set {gacha.rarity::1::%loop-number%} to "&f&lレアリティ%loop-number%"
- set {gacha.rarity.chance::1::%loop-number%} to 1
- # ---------- ユーティリティ関数 ----------
- # 合計比率(有効/全体どちらも取れる)
- function gacha_total(g:int, onlyEnabled: boolean) :: number:
- set {_sum} to 0
- loop 9 times:
- if onlyEnabled is true:
- if {gacha.rarity::%g%::0} >= loop-number:
- add {gacha.rarity.chance::%g%::%loop-number%} to {_sum}
- else:
- add {gacha.rarity.chance::%g%::%loop-number%} to {_sum}
- return {_sum}
- # 指定ガチャgのレアリティを確率に応じて抽選 -> 戻り値は選ばれたレアリティ番号(1..9)または 0 (失敗)
- function gacha_draw(g:int) :: number:
- set {_total} to gacha_total(g, true)
- if {_total} <= 0:
- return 0
- set {_r} to random integer between 1 and {_total}
- set {_acc} to 0
- loop 9 times:
- if {gacha.rarity::%g%::0} >= loop-number:
- add {gacha.rarity.chance::%g%::%loop-number%} to {_acc}
- if {_r} <= {_acc}:
- return loop-number
- return 0
- # ガチャ名からインデックスを返す(見つからなければ 0)
- function gacha_index_by_name(name: text) :: number:
- loop {gacha.list::*}:
- if loop-value is name:
- return loop-index
- return 0
- # ---------- コマンド: /gatya <list|create|reset> ----------
- command /gatya <text>:
- permission: op
- trigger:
- if arg 1 is "list":
- set {_inv} to chest with 6 rows named "&6&lガチャ一覧"
- loop {gacha.list::*}:
- set slot loop-index - 1 of {_inv} to chest named "%loop-value%"
- open {_inv} to player
- else if arg 1 is "create":
- set {_idx} to size of {gacha.list::*}
- set {_idx} to {_idx} + 1
- add "&6&lガチャ%{_idx}%" to {gacha.list::*}
- set {gacha.rarity::%{_idx}%::0} to 1
- loop 9 times:
- set {gacha.rarity::%{_idx}%::%loop-number%} to "&f&lレアリティ%loop-number%"
- set {gacha.rarity.chance::%{_idx}%::%loop-number%} to 1
- send "&aガチャ%{_idx}%を作成しました"
- else if arg 1 is "reset":
- delete {gacha.list::*}
- delete {gacha.rarity::*}
- delete {gacha.rarity.chance::*}
- send "&c全ガチャ設定をリセットしました"
- else:
- send "&c/ gatya [list|create|reset] を使用してください"
- # ---------- チャット入力での状態処理 ----------
- on chat:
- # 比率入力モード
- if {gacha.state.changeChance.%player%} is true:
- cancel event
- if message is integer:
- set {_g} to {gacha.state.gacha.%player%}
- set {_idx} to {gacha.state.rarityIndex.%player%}
- set {gacha.rarity.chance::%{_g}%::%{_idx}%} to message parsed as integer
- send "&a&l%{gacha.rarity::%{_g}%::%{_idx}%}% の排出比率を &e%{message}% &aに設定しました"
- else:
- send "&c数字のみ入力可能です。再度 /gatya から設定してください"
- delete {gacha.state.changeChance.%player%}
- delete {gacha.state.gacha.%player%}
- delete {gacha.state.rarityIndex.%player%}
- stop
- # レアリティ名変更モード
- if {gacha.state.renameRarity.%player%} is true:
- cancel event
- set {_g} to {gacha.state.gacha.%player%}
- set {_idx} to {gacha.state.rarityIndex.%player%}
- set {gacha.rarity::%{_g}%::%{_idx}%} to message
- send "&a&lレアリティ%{_idx}%の名前を「%message%」に変更しました"
- delete {gacha.state.renameRarity.%player%}
- delete {gacha.state.gacha.%player%}
- delete {gacha.state.rarityIndex.%player%}
- stop
- # ガチャ名変更モード
- if {gacha.state.renameGacha.%player%} is true:
- cancel event
- set {_new} to message
- set {_g} to {gacha.state.gacha.%player%}
- # 重複チェック
- if gacha_index_by_name({_new}) is not 0:
- send "&c同名のガチャが存在します。別名で入力してください"
- else:
- set {gacha.list::%{_g}%} to {_new}
- send "&aガチャ名を「%{_new}%」に変更しました"
- delete {gacha.state.renameGacha.%player%}
- delete {gacha.state.gacha.%player%}
- stop
- # ---------- インベントリクリック(GUI操作) ----------
- on inventory click:
- # ガチャ一覧GUI
- if name of player's current inventory contains "&6&lガチャ一覧":
- cancel event
- if event-item is chest:
- set {_name} to event-item's name
- set {_idx} to gacha_index_by_name({_name})
- if {_idx} > 0:
- set {gacha.setting.%player%} to {_idx}
- open chest with 1 rows named "&6&lガチャ設定 &f[%{_name}%]" to player
- # 設定スロット配置(0..3)
- set slot 0 of player's current inventory to {gacha.item.config}
- set slot 1 of player's current inventory to {gacha.item.rename}
- set slot 2 of player's current inventory to {gacha.item.edit}
- set slot 3 of player's current inventory to {gacha.item.rarity}
- # ガチャ景品設定(レアリティ選択)
- if name of player's current inventory contains "&6&lガチャ景品設定[レアリティ選択]":
- cancel event
- set {gacha.temp.itemSlot.%player%} to event-slot's index + 1
- set {_g} to {gacha.setting.%player%}
- set {_rarityName} to {gacha.rarity::%{_g}%::%{gacha.temp.itemSlot.%player%}%}
- # 開く景品一覧(6 rows)
- set {_inv} to chest with 6 rows named "&6&l景品設定[%{_rarityName}%]"
- loop {gacha.item::%{_g}%::%{gacha.temp.itemSlot.%player%}::*}:
- set slot loop-index - 1 of {_inv} to loop-value
- open {_inv} to player
- # 設定GUI: 景品設定ボタン等
- if event-item is {gacha.item.config}:
- cancel event
- open chest with 1 rows named "&6&lガチャ景品設定[レアリティ選択]" to player
- loop 9 times:
- if {gacha.rarity::%{gacha.setting.%player%}%::0} >= loop-number:
- set slot loop-number - 1 of player's current inventory to chest named "%{gacha.rarity::%{gacha.setting.%player%}%::%loop-number%}%" with lore "&a有効"
- else:
- set slot loop-number - 1 of player's current inventory to ender chest named "%{gacha.rarity::%{gacha.setting.%player%}%::%loop-number%}%" with lore "&c無効" and "&f景品設定は可能(排出はされません)"
- if event-item is {gacha.item.rename}:
- cancel event
- set {gacha.state.renameGacha.%player%} to true
- set {gacha.state.gacha.%player%} to {gacha.setting.%player%}
- send "&aガチャの名前をチャットで入力してください"
- close event-player's inventory
- if event-item is {gacha.item.edit}:
- cancel event
- # プレイヤーに編集用のチェストを渡す(右クリックで開ける表現)
- give chest named "%{gacha.list::%{gacha.setting.%player%}%}%" with lore "&f右クリックで編集" to player
- close event-player's inventory
- if event-item is {gacha.item.rarity}:
- cancel event
- open chest with 5 rows named "&6&lガチャレアリティ設定" to player
- # 全体/有効比率表示アイテム
- set {_all} to gacha_total({gacha.setting.%player%}, false)
- set {_enabled} to gacha_total({gacha.setting.%player%}, true)
- set slot 0 of player's current inventory to paper named "&f全体比率" with lore "&f合計比率:&a%{_all}%"
- set slot 1 of player's current inventory to paper named "&f有効比率" with lore "&f合計比率:&a%{_enabled}%"
- # 各レアリティ表示
- loop 9 times:
- set {_name} to {gacha.rarity::%{gacha.setting.%player%}%::%loop-number%}
- set {_size} to {gacha.rarity.chance::%{gacha.setting.%player%}%::%loop-number%}
- # 有効ならチェスト、無効ならエンダーチェストで表示
- if {gacha.rarity::%{gacha.setting.%player%}%::0} >= loop-number:
- set slot loop-number + 17 of player's current inventory to chest named "%{_name}%" with lore "&a有効"
- set slot loop-number + 8 of player's current inventory to yellow stained glass pane named "&f比率変更" with lore "&f現在:&e%{_size}%"
- set slot loop-number + 26 of player's current inventory to name tag named "&f名前の変更" with lore "&f現在%{_name}%"
- else:
- set slot loop-number + 17 of player's current inventory to ender chest named "%{_name}%" with lore "&c無効" and "&fクリックで有効化"
- set slot loop-number + 8 of player's current inventory to red stained glass pane named "&f比率変更" with lore "&f現在:&e%{_size}%"
- set slot loop-number + 26 of player's current inventory to name tag named "&f名前の変更" with lore "&f現在%{_name}%"
- # レアリティ設定GUIでのクリック
- if name of player's current inventory contains "&6&lガチャレアリティ設定":
- cancel event
- # 名前変更(name tag)
- if event-item is name tag:
- set {gacha.state.renameRarity.%player%} to true
- set {gacha.state.gacha.%player%} to {gacha.setting.%player%}
- set {gacha.state.rarityIndex.%player%} to event-slot's index - 26
- send "&aレアリティの名前をチャットで入力してください"
- close event-player's inventory
- # 比率変更(glass pane)
- if event-item is yellow stained glass pane or event-item is red stained glass pane:
- set {gacha.state.changeChance.%player%} to true
- set {gacha.state.gacha.%player%} to {gacha.setting.%player%}
- set {gacha.state.rarityIndex.%player%} to event-slot's index - 8
- send "&a排出比率をチャットで入力してください(数字)"
- close event-player's inventory
- # 有効/無効切替(chest / ender chest)
- if event-item is chest or event-item is ender chest:
- set {_new} to event-slot's index - 17
- set {gacha.rarity::%{gacha.setting.%player%}%::0} to {_new}
- # 再描画(簡易):閉じて再度開く
- close event-player's inventory
- wait 1 tick
- open chest with 5 rows named "&6&lガチャレアリティ設定" to player
- # ---------- インベントリクローズで景品保存 ----------
- on inventory close:
- # 景品リストを保存(景品設定のGUI名を判定)
- if name of event-inventory contains "&6&l景品設定[":
- # 例: "&6&l景品設定[レア名]"
- set {_g} to {gacha.setting.%player%}
- # 事前に何番目のレアリティを編集していたかを保持しておく必要がある(open時に set している)
- if {gacha.temp.itemSlot.%player%} is set:
- set {_slotIndex} to {gacha.temp.itemSlot.%player%}
- # いったん既存のリスト削除してから上書き
- delete {gacha.item::%{_g}%::%{_slotIndex%}::*}
- set {_count} to 1
- loop 54 times:
- set {_it} to slot loop-number - 1 of event-inventory
- if {_it} is not air:
- set {gacha.item::%{_g}%::%{_slotIndex}%::%{_count}%} to {_it}
- add 1 to {_count}
- delete {gacha.temp.itemSlot.%player%}
- # ---------- ガチャ開封(右クリック:元スクリプトの挙動を踏襲) ----------
- on rightclick:
- if player's tool is chest:
- # プレイヤーが持ってるガチャの名前をアイテム名から取得
- if event-item is not air:
- set {_name} to event-item's name
- set {_g} to gacha_index_by_name({_name})
- if {_g} = 0:
- send "&cこのアイテムはガチャではありません"
- stop
- # アイテムを1つ消費
- remove 1 of event-item from player
- play sound "entity.experience_orb.pickup" with volume 0.5 pitch 1 to player
- # 抽選
- set {_rarity} to gacha_draw({_g})
- if {_rarity} = 0:
- send "&c排出設定が正しくありません(比率を確認してください)"
- stop
- # 景品をランダムに選択して配布
- set {_size} to size of {gacha.item::%{_g}%::%{_rarity%}::*}
- if {_size} <= 0:
- send "&c指定のレアリティに景品が設定されていません"
- stop
- set {_r2} to random integer between 1 and {_size}
- give {gacha.item::%{_g}%::%{_rarity}%::%{_r2}%} to player
- send "&a&l%{gacha.rarity::%{_g}%::%{_rarity}%}% を獲得しました!"
- stop
- # ---------- デバッグ系(ツールで状態表示) ----------
- on leftclick:
- if player's tool is chest:
- # 左クリックで一覧を表示(元の挙動再現)
- set {_name} to event-item's name
- set {_g} to gacha_index_by_name({_name})
- if {_g} > 0:
- set {gacha.using.%player%} to {_g}
- open chest with 1 rows named "&6&lガチャ景品一覧" to player
- set {_enabledTotal} to gacha_total({_g}, true)
- loop 9 times:
- if {gacha.rarity::%{_g}%::0} >= loop-number:
- set {_size} to {gacha.rarity.chance::%{_g}%::%loop-number%}
- set {_percent} to 0
- if {_enabledTotal} > 0:
- set {_percent} to round({_size} / {_enabledTotal} * 100, 2)
- set slot loop-number - 1 of player's current inventory to chest named "%{gacha.rarity::%{_g}%::%loop-number%}%" with lore "&e&l排出確率:%{_percent}%%"
Advertisement
Add Comment
Please, Sign In to add comment