Mireacul

Modular Chat Skript [1.21.11+]

Apr 19th, 2026 (edited)
258
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.96 KB | None | 0 0
  1. # ==========================================
  2. # CHAT AND PREFIX SYSTEM
  3. # Mireacul
  4. # ==========================================
  5.  
  6. options:
  7. P: &7[&eServer&7]
  8. perms: group.admin
  9.  
  10. # ==========================================
  11. # PREFIX MANAGEMENT — global registry
  12. # ==========================================
  13.  
  14. function createPrefix(name: text, prefixColor: text, bracketColor: text):
  15. if {prefixes::*} contains {_name}:
  16. stop
  17. add {_name} to {prefixes::*}
  18. set {prefixdata.color::%{_name}%} to {_prefixColor}
  19. set {prefixdata.brackets::%{_name}%} to {_bracketColor}
  20.  
  21. function setPrefixColor(name: text, prefixColor: text, bracketColor: text):
  22. if {prefixes::*} does not contain {_name}:
  23. stop
  24. set {prefixdata.color::%{_name}%} to {_prefixColor}
  25. set {prefixdata.brackets::%{_name}%} to {_bracketColor}
  26.  
  27. function deletePrefix(name: text):
  28. if {prefixes::*} does not contain {_name}:
  29. stop
  30. remove {_name} from {prefixes::*}
  31. delete {prefixdata.color::%{_name}%}
  32. delete {prefixdata.brackets::%{_name}%}
  33. loop all players:
  34. if {prefix.unlocked::%loop-player%::*} contains {_name}:
  35. remove {_name} from {prefix.unlocked::%loop-player%::*}
  36. if {prefix::%loop-player%} is {_name}:
  37. delete {prefix::%loop-player%}
  38.  
  39. function grantPrefix(p: player, name: text):
  40. if {prefixes::*} does not contain {_name}:
  41. stop
  42. if {prefix.unlocked::%{_p}%::*} contains {_name}:
  43. stop
  44. add {_name} to {prefix.unlocked::%{_p}%::*}
  45.  
  46. function revokePrefix(p: player, name: text):
  47. if {prefix.unlocked::%{_p}%::*} does not contain {_name}:
  48. stop
  49. remove {_name} from {prefix.unlocked::%{_p}%::*}
  50. if {prefix::%{_p}%} is {_name}:
  51. delete {prefix::%{_p}%}
  52.  
  53.  
  54. # ==========================================
  55. # OFFLINE PREFIX HANDLER
  56. # ==========================================
  57. on join:
  58. # Clean up any prefixes that no longer exist
  59. loop {prefix.unlocked::%player%::*}:
  60. if {prefixes::*} does not contain loop-value:
  61. remove loop-value from {prefix.unlocked::%player%::*}
  62. if {prefix::%player%} is set:
  63. if {prefixes::*} does not contain {prefix::%player%}:
  64. delete {prefix::%player%}
  65.  
  66. # ==========================================
  67. # CHAT FORMAT
  68. # ==========================================
  69.  
  70. on chat:
  71. cancel event
  72. set {_name} to player's name
  73. set {_msg} to message
  74.  
  75. # Mute checks
  76. if {muteall} is set:
  77. if player does not have permission "{@perms}":
  78. send "{@P} &fChat is muted!" to player
  79. stop
  80. if {mute::%player%} is set:
  81. send "{@P} &fYou are muted." to player
  82. stop
  83. # Cooldown check — staff bypass
  84. if player does not have permission "{@perms}":
  85. if {chatcooldown::%player%} is set:
  86. if difference between {chatcooldown::%player%} and now < 3 seconds:
  87. send "{@P} &fDo not spam." to player
  88. stop
  89. set {chatcooldown::%player%} to now
  90.  
  91. # Build name with optional bold and donor color
  92. set {_nameColor} to "&f"
  93. if {donor::%player%} is set:
  94. if {donor.namecolor::%player%} is set:
  95. set {_nameColor} to {donor.namecolor::%player%}
  96. if {bold.name::%player%} is set:
  97. set {_nameColor} to "%{_nameColor}%&l"
  98. set {_formattedName} to "%{_nameColor}%%{_name}%"
  99.  
  100. # Staff check — LuckPerms groups
  101. if player has permission "group.owner":
  102. set {_line} to "&7[&c&lOwner&7] %{_formattedName}% &7» &f%{_msg}%"
  103. broadcast coloured {_line}
  104. stop
  105. if player has permission "group.admin":
  106. set {_line} to "&7[&c&lAdmin&7] %{_formattedName}% &7» &f%{_msg}%"
  107. broadcast coloured {_line}
  108. stop
  109. if player has permission "group.staff":
  110. set {_line} to "&7[&cStaff&7] %{_formattedName}% &7» &f%{_msg}%"
  111. broadcast coloured {_line}
  112. stop
  113. if player has permission "group.helper":
  114. set {_line} to "&7[&aHelper&7] %{_formattedName}% &7» &f%{_msg}%"
  115. broadcast coloured {_line}
  116. stop
  117.  
  118. # Player with prefix
  119. if {prefix::%player%} is set:
  120. set {_prefName} to {prefix::%player%}
  121. set {_bColor} to {prefixdata.brackets::%{_prefName}%}
  122. set {_pColor} to {prefixdata.color::%{_prefName}%}
  123. if {_bColor} is not set:
  124. set {_bColor} to "&8"
  125. if {_pColor} is not set:
  126. set {_pColor} to "&c"
  127. set {_openB} to "%{_bColor}%["
  128. set {_closeB} to "%{_bColor}%]"
  129. if {bold.brackets::%player%} is set:
  130. set {_openB} to "%{_bColor}%&l["
  131. set {_closeB} to "%{_bColor}%&l]"
  132. set {_prefixText} to {_pColor}
  133. if {bold.prefix::%player%} is set:
  134. set {_prefixText} to "%{_pColor}%&l"
  135. set {_line} to "%{_openB}%%{_prefixText}%%{_prefName}%%{_closeB}% %{_formattedName}% &7» &f%{_msg}%"
  136. broadcast coloured {_line}
  137. stop
  138.  
  139. # Basic player — no prefix
  140. set {_line} to "%{_formattedName}% &7» &f%{_msg}%"
  141. broadcast coloured {_line}
  142.  
  143. # ==========================================
  144. # PREFIX GUI — /prefix command
  145. # ==========================================
  146.  
  147. command /prefix:
  148. trigger:
  149. openPrefixGUI(player, 1)
  150.  
  151. function openPrefixGUI(p: player, page: number):
  152. set {_gui} to chest inventory with 3 rows named "&8Prefix Menu — Page %{_page}%"
  153. set {_start} to ({_page} - 1) * 9
  154. set {_slot} to 0
  155. set {_count} to 0
  156. loop {prefix.unlocked::%{_p}%::*}:
  157. add 1 to {_count}
  158. if {_count} > {_start}:
  159. if {_slot} < 9:
  160. set {_pColor} to {prefixdata.color::%loop-value%}
  161. set {_bColor} to {prefixdata.brackets::%loop-value%}
  162. if {_pColor} is not set:
  163. set {_pColor} to "&c"
  164. if {_bColor} is not set:
  165. set {_bColor} to "&8"
  166. set {_display} to coloured "%{_bColor}%[%{_pColor}%%loop-value%%{_bColor}%]"
  167. set {_item} to name tag named {_display}
  168. set string tag "prefix_name" of custom nbt of {_item} to loop-value
  169. add "&7Click to equip" to lore of {_item}
  170. if {prefix::%{_p}%} is loop-value:
  171. enchant {_item} with unbreaking 1
  172. set lore of {_item} to "&aCurrently equipped" and "&7Click to unequip"
  173. set slot {_slot} of {_gui} to {_item}
  174. add 1 to {_slot}
  175. if {_slot} is 0:
  176. set {_empty} to gray stained glass pane named "&7No prefixes unlocked"
  177. set slot 4 of {_gui} to {_empty}
  178.  
  179. # Bold toggles — middle row (donor only)
  180. if {donor::%{_p}%} is set:
  181. set {_bracketsItem} to iron nugget named "&7Bold Brackets &8[ ]"
  182. if {bold.brackets::%{_p}%} is set:
  183. add "&aEnabled — click to disable" to lore of {_bracketsItem}
  184. enchant {_bracketsItem} with unbreaking 1
  185. else:
  186. add "&cDisabled — click to enable" to lore of {_bracketsItem}
  187. set slot 12 of {_gui} to {_bracketsItem}
  188.  
  189. set {_prefixItem} to iron nugget named "&7Bold Prefix"
  190. if {bold.prefix::%{_p}%} is set:
  191. add "&aEnabled — click to disable" to lore of {_prefixItem}
  192. enchant {_prefixItem} with unbreaking 1
  193. else:
  194. add "&cDisabled — click to enable" to lore of {_prefixItem}
  195. set slot 13 of {_gui} to {_prefixItem}
  196.  
  197. set {_nameItem} to iron nugget named "&7Bold Name"
  198. if {bold.name::%{_p}%} is set:
  199. add "&aEnabled — click to disable" to lore of {_nameItem}
  200. enchant {_nameItem} with unbreaking 1
  201. else:
  202. add "&cDisabled — click to enable" to lore of {_nameItem}
  203. set slot 14 of {_gui} to {_nameItem}
  204.  
  205. # Donor color selector
  206. if {donor::%{_p}%} is set:
  207. set {_colorItem} to gold ingot named "&6Name Color"
  208. add "&7Click to cycle colors" to lore of {_colorItem}
  209. if {donor.namecolor::%{_p}%} is set:
  210. set {_colorLore} to coloured "&7Current: %{donor.namecolor::%{_p}%}%This color"
  211. add {_colorLore} to lore of {_colorItem}
  212. set slot 22 of {_gui} to {_colorItem}
  213.  
  214. # Remove prefix button
  215. set {_removeItem} to barrier named "&cRemove Prefix"
  216. add "&7Click to unequip current prefix" to lore of {_removeItem}
  217. set slot 26 of {_gui} to {_removeItem}
  218.  
  219. # Page navigation
  220. set {_totalPrefixes} to size of {prefix.unlocked::%{_p}%::*}
  221. set {_totalPages} to ceil({_totalPrefixes} / 9)
  222. if {_page} > 1:
  223. set {_prevArrow} to arrow named "&ePrevious Page"
  224. set slot 18 of {_gui} to {_prevArrow}
  225. if {_page} < {_totalPages}:
  226. set {_nextArrow} to arrow named "&eNext Page"
  227. set slot 8 of {_gui} to {_nextArrow}
  228.  
  229. set {prefix.page::%{_p}%} to {_page}
  230. open {_gui} to {_p}
  231.  
  232. # ==========================================
  233. # PREFIX GUI — click handling
  234. # ==========================================
  235.  
  236. on inventory click:
  237. name of player's current inventory contains "Prefix Menu"
  238. cancel event
  239. event-item is not air
  240.  
  241. # Prefix selection — top row
  242. if index of clicked slot < 9:
  243. if event-item is a name tag:
  244. set {_clicked} to string tag "prefix_name" of custom nbt of event-item
  245. if {_clicked} is not set:
  246. stop
  247. if {prefix::%player%} is {_clicked}:
  248. delete {prefix::%player%}
  249. send "{@P} &ePrefix removed." to player
  250. else:
  251. set {prefix::%player%} to {_clicked}
  252. send "{@P} &ePrefix set to &c%{_clicked}%&e." to player
  253. openPrefixGUI(player, {prefix.page::%player%})
  254. stop
  255.  
  256. # Bold brackets toggle (donor only)
  257. if index of clicked slot is 12:
  258. if {donor::%player%} is not set:
  259. send "{@P} &cThis is a donor feature." to player
  260. stop
  261. if {bold.brackets::%player%} is set:
  262. delete {bold.brackets::%player%}
  263. else:
  264. set {bold.brackets::%player%} to true
  265. openPrefixGUI(player, {prefix.page::%player%})
  266. stop
  267.  
  268. # Bold prefix toggle (donor only)
  269. if index of clicked slot is 13:
  270. if {donor::%player%} is not set:
  271. send "{@P} &cThis is a donor feature." to player
  272. stop
  273. if {bold.prefix::%player%} is set:
  274. delete {bold.prefix::%player%}
  275. else:
  276. set {bold.prefix::%player%} to true
  277. openPrefixGUI(player, {prefix.page::%player%})
  278. stop
  279.  
  280. # Bold name toggle (donor only)
  281. if index of clicked slot is 14:
  282. if {donor::%player%} is not set:
  283. send "{@P} &cThis is a donor feature." to player
  284. stop
  285. if {bold.name::%player%} is set:
  286. delete {bold.name::%player%}
  287. else:
  288. set {bold.name::%player%} to true
  289. openPrefixGUI(player, {prefix.page::%player%})
  290. stop
  291.  
  292. # Donor color cycle
  293. if index of clicked slot is 22:
  294. if {donor::%player%} is set:
  295. set {_colors::*} to "&c", "&6", "&e", "&a", "&b", "&d", "&9", "&5"
  296. set {_current} to {donor.namecolor::%player%}
  297. if {_current} is not set:
  298. set {donor.namecolor::%player%} to "&c"
  299. else:
  300. set {_next} to false
  301. loop {_colors::*}:
  302. if {_next} is true:
  303. set {donor.namecolor::%player%} to loop-value
  304. set {_next} to "done"
  305. stop loop
  306. if loop-value is {_current}:
  307. set {_next} to true
  308. if {_next} is not "done":
  309. set {donor.namecolor::%player%} to "&c"
  310. openPrefixGUI(player, {prefix.page::%player%})
  311. stop
  312.  
  313. # Remove prefix
  314. if index of clicked slot is 26:
  315. delete {prefix::%player%}
  316. send "{@P} &ePrefix removed." to player
  317. openPrefixGUI(player, {prefix.page::%player%})
  318. stop
  319.  
  320. # Page navigation
  321. if event-item is an arrow:
  322.  
  323. if name of event-item contains "Next":
  324. openPrefixGUI(player, {prefix.page::%player%} + 1)
  325. if name of event-item contains "Previous":
  326. openPrefixGUI(player, {prefix.page::%player%} - 1)
  327.  
  328. # ==========================================
  329. # ADMIN COMMANDS
  330. # ==========================================
  331.  
  332. command /createprefix <text> <text> <text>:
  333. permission: {@perms}
  334. usage: /createprefix <prefixColor> <bracketColor> <name>
  335. trigger:
  336. createPrefix(arg-3, arg-1, arg-2)
  337. set {_line} to "{@P} &eCreated prefix &f%arg-3% &ewith color %arg-1%%arg-3% &eand brackets %arg-2%[ ]"
  338. send coloured {_line} to player
  339.  
  340. command /prefixcolor <text> <text> <text>:
  341. permission: {@perms}
  342. usage: /prefixcolor <prefixColor> <bracketColor> <name>
  343. trigger:
  344. setPrefixColor(arg-3, arg-1, arg-2)
  345. set {_line} to "{@P} &eUpdated &f%arg-3% &eto color %arg-1%%arg-3% &eand brackets %arg-2%[ ]"
  346. send coloured {_line} to player
  347.  
  348. command /deleteprefix <text>:
  349. permission: {@perms}
  350. trigger:
  351. deletePrefix(arg-1)
  352. send "{@P} &eDeleted prefix &f%arg-1% &efrom all players." to player
  353.  
  354. command /grantprefix <player> <text>:
  355. permission: {@perms}
  356. trigger:
  357. if {prefixes::*} does not contain arg-2:
  358. send "{@P} &cPrefix &f%arg-2% &cdoes not exist. Create it first." to player
  359. stop
  360. grantPrefix(arg-1, arg-2)
  361. send "{@P} &eGranted &c%arg-2% &eto %arg-1%." to player
  362. send "{@P} &eYou unlocked the prefix &c%arg-2%&e! Use /prefix to equip it." to arg-1
  363.  
  364. command /revokeprefix <player> <text>:
  365. permission: {@perms}
  366. trigger:
  367. revokePrefix(arg-1, arg-2)
  368. send "{@P} &eRevoked &c%arg-2% &efrom %arg-1%." to player
  369.  
  370. command /listprefixes:
  371. permission: {@perms}
  372. trigger:
  373. if {prefixes::*} is not set:
  374. send "{@P} &cNo prefixes exist." to player
  375. stop
  376. send "{@P} &eGlobal prefixes:" to player
  377. loop {prefixes::*}:
  378. set {_line} to " &7- %{prefixdata.brackets::%loop-value%}%[%{prefixdata.color::%loop-value%}%%loop-value%%{prefixdata.brackets::%loop-value%}%]"
  379. send coloured {_line} to player
  380.  
  381. command /setdonor <player>:
  382. permission: {@perms}
  383. trigger:
  384. if {donor::%arg-1%} is set:
  385. delete {donor::%arg-1%}
  386. delete {donor.namecolor::%arg-1%}
  387. send "{@P} &eRemoved donor status from %arg-1%." to player
  388. else:
  389. set {donor::%arg-1%} to true
  390. send "{@P} &eGranted donor status to %arg-1%." to player
  391.  
  392. # ==========================================
  393. # MODERATION
  394. # ==========================================
  395.  
  396. command /mute [<offlineplayer>] [<text>]:
  397. permission: {@perms}
  398. trigger:
  399. if arg-1 is not set:
  400. send "{@P} /mute <player> [reason]"
  401. stop
  402. if arg-2 is not set:
  403. if {mute::%arg-1%} is set:
  404. delete {mute::%arg-1%}
  405. send "&eYou are unmuted" to arg-1
  406. send "{@P} %arg-1% has been unmuted" to player
  407. else:
  408. set {mute::%arg-1%} to true
  409. send "&eYou are muted" to arg-1
  410. send "{@P} %arg-1% has been muted" to player
  411. else:
  412. if {mute::%arg-1%} is set:
  413. delete {mute::%arg-1%}
  414. send "&eYou have been unmuted because %arg-2%" to arg-1
  415. send "{@P} %arg-1% has been unmuted because %arg-2%" to player
  416. else:
  417. set {mute::%arg-1%} to true
  418. send "&eYou have been muted because %arg-2%" to arg-1
  419. send "{@P} %arg-1% has been muted because %arg-2%" to player
  420.  
  421. command /muteall:
  422. permission: {@perms}
  423. trigger:
  424. if {muteall} is set:
  425. broadcast "{@P} Chat is now unmuted"
  426. delete {muteall}
  427. else:
  428. set {muteall} to true
  429. broadcast "{@P} Chat is now muted"
Advertisement
Add Comment
Please, Sign In to add comment