sirayasiki

ガチャ(chatGPT)

Nov 8th, 2025 (edited)
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.24 KB | None | 0 0
  1. ############################################
  2. # ガチャ管理 Skript(最適化版)
  3. # 要件: Skript 2.9+ / SkBee (GUI/Item) / Paper 1.20.6 推奨
  4. ############################################
  5.  
  6. # ---------- 初期化 ----------
  7. on load:
  8. # GUI用のテンプレアイテム
  9. set {gacha.item.config} to diamond named "&e&l景品設定"
  10. set {gacha.item.rename} to name tag named "&e&lガチャの名前変更"
  11. set {gacha.item.info} to writable book named "&e&lガチャの詳細設定"
  12. set {gacha.item.edit} to chest named "&e&lガチャアイテム変更"
  13. set {gacha.item.rarity} to emerald named "&e&lレアリティ設定"
  14. # プレイヤー一時状態は使うときにセットする(不要なら未定義のまま)
  15. # デフォルトで1つのガチャを作る(無ければ)
  16. if {gacha.list::*} is not set:
  17. add "&6&lガチャ1" to {gacha.list::*}
  18. set {gacha.rarity::1::0} to 1
  19. loop 9 times:
  20. set {gacha.rarity::1::%loop-number%} to "&f&lレアリティ%loop-number%"
  21. set {gacha.rarity.chance::1::%loop-number%} to 1
  22.  
  23. # ---------- ユーティリティ関数 ----------
  24. # 合計比率(有効/全体どちらも取れる)
  25. function gacha_total(g:int, onlyEnabled: boolean) :: number:
  26. set {_sum} to 0
  27. loop 9 times:
  28. if onlyEnabled is true:
  29. if {gacha.rarity::%g%::0} >= loop-number:
  30. add {gacha.rarity.chance::%g%::%loop-number%} to {_sum}
  31. else:
  32. add {gacha.rarity.chance::%g%::%loop-number%} to {_sum}
  33. return {_sum}
  34.  
  35. # 指定ガチャgのレアリティを確率に応じて抽選 -> 戻り値は選ばれたレアリティ番号(1..9)または 0 (失敗)
  36. function gacha_draw(g:int) :: number:
  37. set {_total} to gacha_total(g, true)
  38. if {_total} <= 0:
  39. return 0
  40. set {_r} to random integer between 1 and {_total}
  41. set {_acc} to 0
  42. loop 9 times:
  43. if {gacha.rarity::%g%::0} >= loop-number:
  44. add {gacha.rarity.chance::%g%::%loop-number%} to {_acc}
  45. if {_r} <= {_acc}:
  46. return loop-number
  47. return 0
  48.  
  49. # ガチャ名からインデックスを返す(見つからなければ 0)
  50. function gacha_index_by_name(name: text) :: number:
  51. loop {gacha.list::*}:
  52. if loop-value is name:
  53. return loop-index
  54. return 0
  55.  
  56. # ---------- コマンド: /gatya <list|create|reset> ----------
  57. command /gatya <text>:
  58. permission: op
  59. trigger:
  60. if arg 1 is "list":
  61. set {_inv} to chest with 6 rows named "&6&lガチャ一覧"
  62. loop {gacha.list::*}:
  63. set slot loop-index - 1 of {_inv} to chest named "%loop-value%"
  64. open {_inv} to player
  65. else if arg 1 is "create":
  66. set {_idx} to size of {gacha.list::*}
  67. set {_idx} to {_idx} + 1
  68. add "&6&lガチャ%{_idx}%" to {gacha.list::*}
  69. set {gacha.rarity::%{_idx}%::0} to 1
  70. loop 9 times:
  71. set {gacha.rarity::%{_idx}%::%loop-number%} to "&f&lレアリティ%loop-number%"
  72. set {gacha.rarity.chance::%{_idx}%::%loop-number%} to 1
  73. send "&aガチャ%{_idx}%を作成しました"
  74. else if arg 1 is "reset":
  75. delete {gacha.list::*}
  76. delete {gacha.rarity::*}
  77. delete {gacha.rarity.chance::*}
  78. send "&c全ガチャ設定をリセットしました"
  79. else:
  80. send "&c/ gatya [list|create|reset] を使用してください"
  81.  
  82. # ---------- チャット入力での状態処理 ----------
  83. on chat:
  84. # 比率入力モード
  85. if {gacha.state.changeChance.%player%} is true:
  86. cancel event
  87. if message is integer:
  88. set {_g} to {gacha.state.gacha.%player%}
  89. set {_idx} to {gacha.state.rarityIndex.%player%}
  90. set {gacha.rarity.chance::%{_g}%::%{_idx}%} to message parsed as integer
  91. send "&a&l%{gacha.rarity::%{_g}%::%{_idx}%}% の排出比率を &e%{message}% &aに設定しました"
  92. else:
  93. send "&c数字のみ入力可能です。再度 /gatya から設定してください"
  94. delete {gacha.state.changeChance.%player%}
  95. delete {gacha.state.gacha.%player%}
  96. delete {gacha.state.rarityIndex.%player%}
  97. stop
  98.  
  99. # レアリティ名変更モード
  100. if {gacha.state.renameRarity.%player%} is true:
  101. cancel event
  102. set {_g} to {gacha.state.gacha.%player%}
  103. set {_idx} to {gacha.state.rarityIndex.%player%}
  104. set {gacha.rarity::%{_g}%::%{_idx}%} to message
  105. send "&a&lレアリティ%{_idx}%の名前を「%message%」に変更しました"
  106. delete {gacha.state.renameRarity.%player%}
  107. delete {gacha.state.gacha.%player%}
  108. delete {gacha.state.rarityIndex.%player%}
  109. stop
  110.  
  111. # ガチャ名変更モード
  112. if {gacha.state.renameGacha.%player%} is true:
  113. cancel event
  114. set {_new} to message
  115. set {_g} to {gacha.state.gacha.%player%}
  116. # 重複チェック
  117. if gacha_index_by_name({_new}) is not 0:
  118. send "&c同名のガチャが存在します。別名で入力してください"
  119. else:
  120. set {gacha.list::%{_g}%} to {_new}
  121. send "&aガチャ名を「%{_new}%」に変更しました"
  122. delete {gacha.state.renameGacha.%player%}
  123. delete {gacha.state.gacha.%player%}
  124. stop
  125.  
  126. # ---------- インベントリクリック(GUI操作) ----------
  127. on inventory click:
  128. # ガチャ一覧GUI
  129. if name of player's current inventory contains "&6&lガチャ一覧":
  130. cancel event
  131. if event-item is chest:
  132. set {_name} to event-item's name
  133. set {_idx} to gacha_index_by_name({_name})
  134. if {_idx} > 0:
  135. set {gacha.setting.%player%} to {_idx}
  136. open chest with 1 rows named "&6&lガチャ設定 &f[%{_name}%]" to player
  137. # 設定スロット配置(0..3)
  138. set slot 0 of player's current inventory to {gacha.item.config}
  139. set slot 1 of player's current inventory to {gacha.item.rename}
  140. set slot 2 of player's current inventory to {gacha.item.edit}
  141. set slot 3 of player's current inventory to {gacha.item.rarity}
  142. # ガチャ景品設定(レアリティ選択)
  143. if name of player's current inventory contains "&6&lガチャ景品設定[レアリティ選択]":
  144. cancel event
  145. set {gacha.temp.itemSlot.%player%} to event-slot's index + 1
  146. set {_g} to {gacha.setting.%player%}
  147. set {_rarityName} to {gacha.rarity::%{_g}%::%{gacha.temp.itemSlot.%player%}%}
  148. # 開く景品一覧(6 rows)
  149. set {_inv} to chest with 6 rows named "&6&l景品設定[%{_rarityName}%]"
  150. loop {gacha.item::%{_g}%::%{gacha.temp.itemSlot.%player%}::*}:
  151. set slot loop-index - 1 of {_inv} to loop-value
  152. open {_inv} to player
  153.  
  154. # 設定GUI: 景品設定ボタン等
  155. if event-item is {gacha.item.config}:
  156. cancel event
  157. open chest with 1 rows named "&6&lガチャ景品設定[レアリティ選択]" to player
  158. loop 9 times:
  159. if {gacha.rarity::%{gacha.setting.%player%}%::0} >= loop-number:
  160. set slot loop-number - 1 of player's current inventory to chest named "%{gacha.rarity::%{gacha.setting.%player%}%::%loop-number%}%" with lore "&a有効"
  161. else:
  162. 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景品設定は可能(排出はされません)"
  163.  
  164. if event-item is {gacha.item.rename}:
  165. cancel event
  166. set {gacha.state.renameGacha.%player%} to true
  167. set {gacha.state.gacha.%player%} to {gacha.setting.%player%}
  168. send "&aガチャの名前をチャットで入力してください"
  169. close event-player's inventory
  170.  
  171. if event-item is {gacha.item.edit}:
  172. cancel event
  173. # プレイヤーに編集用のチェストを渡す(右クリックで開ける表現)
  174. give chest named "%{gacha.list::%{gacha.setting.%player%}%}%" with lore "&f右クリックで編集" to player
  175. close event-player's inventory
  176.  
  177. if event-item is {gacha.item.rarity}:
  178. cancel event
  179. open chest with 5 rows named "&6&lガチャレアリティ設定" to player
  180. # 全体/有効比率表示アイテム
  181. set {_all} to gacha_total({gacha.setting.%player%}, false)
  182. set {_enabled} to gacha_total({gacha.setting.%player%}, true)
  183. set slot 0 of player's current inventory to paper named "&f全体比率" with lore "&f合計比率:&a%{_all}%"
  184. set slot 1 of player's current inventory to paper named "&f有効比率" with lore "&f合計比率:&a%{_enabled}%"
  185. # 各レアリティ表示
  186. loop 9 times:
  187. set {_name} to {gacha.rarity::%{gacha.setting.%player%}%::%loop-number%}
  188. set {_size} to {gacha.rarity.chance::%{gacha.setting.%player%}%::%loop-number%}
  189. # 有効ならチェスト、無効ならエンダーチェストで表示
  190. if {gacha.rarity::%{gacha.setting.%player%}%::0} >= loop-number:
  191. set slot loop-number + 17 of player's current inventory to chest named "%{_name}%" with lore "&a有効"
  192. set slot loop-number + 8 of player's current inventory to yellow stained glass pane named "&f比率変更" with lore "&f現在:&e%{_size}%"
  193. set slot loop-number + 26 of player's current inventory to name tag named "&f名前の変更" with lore "&f現在%{_name}%"
  194. else:
  195. set slot loop-number + 17 of player's current inventory to ender chest named "%{_name}%" with lore "&c無効" and "&fクリックで有効化"
  196. set slot loop-number + 8 of player's current inventory to red stained glass pane named "&f比率変更" with lore "&f現在:&e%{_size}%"
  197. set slot loop-number + 26 of player's current inventory to name tag named "&f名前の変更" with lore "&f現在%{_name}%"
  198.  
  199. # レアリティ設定GUIでのクリック
  200. if name of player's current inventory contains "&6&lガチャレアリティ設定":
  201. cancel event
  202. # 名前変更(name tag)
  203. if event-item is name tag:
  204. set {gacha.state.renameRarity.%player%} to true
  205. set {gacha.state.gacha.%player%} to {gacha.setting.%player%}
  206. set {gacha.state.rarityIndex.%player%} to event-slot's index - 26
  207. send "&aレアリティの名前をチャットで入力してください"
  208. close event-player's inventory
  209. # 比率変更(glass pane)
  210. if event-item is yellow stained glass pane or event-item is red stained glass pane:
  211. set {gacha.state.changeChance.%player%} to true
  212. set {gacha.state.gacha.%player%} to {gacha.setting.%player%}
  213. set {gacha.state.rarityIndex.%player%} to event-slot's index - 8
  214. send "&a排出比率をチャットで入力してください(数字)"
  215. close event-player's inventory
  216. # 有効/無効切替(chest / ender chest)
  217. if event-item is chest or event-item is ender chest:
  218. set {_new} to event-slot's index - 17
  219. set {gacha.rarity::%{gacha.setting.%player%}%::0} to {_new}
  220. # 再描画(簡易):閉じて再度開く
  221. close event-player's inventory
  222. wait 1 tick
  223. open chest with 5 rows named "&6&lガチャレアリティ設定" to player
  224.  
  225. # ---------- インベントリクローズで景品保存 ----------
  226. on inventory close:
  227. # 景品リストを保存(景品設定のGUI名を判定)
  228. if name of event-inventory contains "&6&l景品設定[":
  229. # 例: "&6&l景品設定[レア名]"
  230. set {_g} to {gacha.setting.%player%}
  231. # 事前に何番目のレアリティを編集していたかを保持しておく必要がある(open時に set している)
  232. if {gacha.temp.itemSlot.%player%} is set:
  233. set {_slotIndex} to {gacha.temp.itemSlot.%player%}
  234. # いったん既存のリスト削除してから上書き
  235. delete {gacha.item::%{_g}%::%{_slotIndex%}::*}
  236. set {_count} to 1
  237. loop 54 times:
  238. set {_it} to slot loop-number - 1 of event-inventory
  239. if {_it} is not air:
  240. set {gacha.item::%{_g}%::%{_slotIndex}%::%{_count}%} to {_it}
  241. add 1 to {_count}
  242. delete {gacha.temp.itemSlot.%player%}
  243.  
  244. # ---------- ガチャ開封(右クリック:元スクリプトの挙動を踏襲) ----------
  245. on rightclick:
  246. if player's tool is chest:
  247. # プレイヤーが持ってるガチャの名前をアイテム名から取得
  248. if event-item is not air:
  249. set {_name} to event-item's name
  250. set {_g} to gacha_index_by_name({_name})
  251. if {_g} = 0:
  252. send "&cこのアイテムはガチャではありません"
  253. stop
  254. # アイテムを1つ消費
  255. remove 1 of event-item from player
  256. play sound "entity.experience_orb.pickup" with volume 0.5 pitch 1 to player
  257. # 抽選
  258. set {_rarity} to gacha_draw({_g})
  259. if {_rarity} = 0:
  260. send "&c排出設定が正しくありません(比率を確認してください)"
  261. stop
  262. # 景品をランダムに選択して配布
  263. set {_size} to size of {gacha.item::%{_g}%::%{_rarity%}::*}
  264. if {_size} <= 0:
  265. send "&c指定のレアリティに景品が設定されていません"
  266. stop
  267. set {_r2} to random integer between 1 and {_size}
  268. give {gacha.item::%{_g}%::%{_rarity}%::%{_r2}%} to player
  269. send "&a&l%{gacha.rarity::%{_g}%::%{_rarity}%}% を獲得しました!"
  270. stop
  271.  
  272. # ---------- デバッグ系(ツールで状態表示) ----------
  273. on leftclick:
  274. if player's tool is chest:
  275. # 左クリックで一覧を表示(元の挙動再現)
  276. set {_name} to event-item's name
  277. set {_g} to gacha_index_by_name({_name})
  278. if {_g} > 0:
  279. set {gacha.using.%player%} to {_g}
  280. open chest with 1 rows named "&6&lガチャ景品一覧" to player
  281. set {_enabledTotal} to gacha_total({_g}, true)
  282. loop 9 times:
  283. if {gacha.rarity::%{_g}%::0} >= loop-number:
  284. set {_size} to {gacha.rarity.chance::%{_g}%::%loop-number%}
  285. set {_percent} to 0
  286. if {_enabledTotal} > 0:
  287. set {_percent} to round({_size} / {_enabledTotal} * 100, 2)
  288. set slot loop-number - 1 of player's current inventory to chest named "%{gacha.rarity::%{_g}%::%loop-number%}%" with lore "&e&l排出確率:%{_percent}%%"
  289.  
Advertisement
Add Comment
Please, Sign In to add comment