# ChatItem 1.9.1 by D4isDAVID # Find it on SpigotMC: https://spigotmc.org/resources/83479/ # Find it on skUnity Forums: https://forums.skunity.com/resources/1168/ # Find it on GitHub Gist: https://gist.github.com/D4isDAVID/57c7740c8eb835851ebee3eb8c6b00bf # Dependencies: # - Skript 2.6.4+ | https://github.com/SkriptLang/Skript/releases # - SkBee 2.15.0+ | https://github.com/ShaneBeee/SkBee/releases options: item format: &8[&r{name}&7 x{amount}&8] unstackable item format: &8[&r{name}&8] # when enabled, the item amount is counted from the entire inventory, instead of just from the held stack amount from inventory: false on load: # register keywords to use later set {chatitem::keywords::hand::*} to "[hand]", "[item]" and "[i]" set {chatitem::keywords::offhand::*} to "[offhand]" set {chatitem::keywords::helmet::*} to "[helmet]", "[helm]" and "[head]" set {chatitem::keywords::chestplate::*} to "[chestplate]" and "[chest]" set {chatitem::keywords::leggings::*} to "[leggings]" and "[legs]" set {chatitem::keywords::boots::*} to "[boots]", "[shoes]" and "[feet]" on chat: # get player items set {_items::hand} to player's held item set {_items::offhand} to player's offhand item set {_items::helmet} to player's helmet set {_items::chestplate} to player's chestplate set {_items::leggings} to player's leggings set {_items::boots} to player's boots # normalize chat format if message format contains formatted message: set message to formatted message else if message format contains colored message: set message to colored message else if message format contains unformatted message: set message to unformatted message set {_originalmessage} to message # search for keywords in message and remove duplicates loop indices of {chatitem::keywords::*}: set {_keyword} to {chatitem::keywords::%loop-value%::1} loop {chatitem::keywords::%loop-value%::*}: message contains loop-value-2 replace loop-value-2 in message with {_keyword} message contains {_keyword} set {_message::*} to split message at {_keyword} set {_message1} to {_message::1} delete {_message::1} set message to "%{_message1}%%{_keyword}%%join {_message::*} with ""%" {_items::%loop-value%} is set type of {_items::%loop-value%} is not air set {_keywords::%loop-value%} to {_keyword} if {_delim} is not set: # set a delimiter used for later splitting the message set {_delim} to {_keyword} # make the delimiter something that wouldn't exist in the message event is not cancelled # don't do anything if the chat event is already cancelled # cancel the event to send one with hover events later size of {_keywords::*} > 0 # replace old message in format replace all {_originalmessage} in chat format with message cancel event # replace keywords with an easily splittable string set {_message} to message loop {_keywords::*}: replace loop-value in {_message} with "%{_delim}%%loop-index%%{_delim}%" # get the message format for sending it later wait a tick # wait for other scripts or plugins to set the format set {_format} to chat format replace "[message]" in {_format} with message replace "[player]" in {_format} with player's display name set {_format::*} to split {_format} at message # get the message color from the format to use in the message set {_colors::*} to split {_format::1} at "§" delete {_colors::1} set {_color} to "" loop {_colors::*}: set {_color} to "%{_color}%&%first character of loop-value%" # split the message and replace keywords with the item and a hover event set {_message::*} to split {_message} at {_delim} set {_ignore} to true # otherwise sending "hand[hand]hand" will show the item thrice loop {_message::*}: if {_ignore} is true: set {_ignore} to false # add last message color set {_message} to "%colored {_color}%%loop-value%" # color remover for 2.6 since 2.7 removes them correctly parse if skript version starts with "2.6": while true = true: set {_colored} to false set {_colors::*} to split {_message} at "&" delete {_colors::1} loop {_colors::*}: set {_c} to first character of loop-value-2 "0123456789abcdefklmnorx" contains {_c} set {_colored} to true replace uncolored "&&%{_c}%%{_c}%" in {_message} with "" if {_colored} = false: exit loop # color-related stuff (too lazy to comment) set {_colors::*} to split {_message} at "§" add text component from uncolored {_colors::1} to {_components::*} delete {_colors::1} set {_newcolor} to "" loop {_colors::*}: set {_newcolor} to "%{_newcolor}%&%first character of loop-value-2%" add text component from colored "%{_newcolor}%&%uncolored loop-value-2%" to {_components::*} if size of {_colors::*} > 0: set {_color} to {_newcolor} continue {_keywords::%loop-value%} is set set {_ignore} to true set {_item} to {_items::%loop-value%} set {_name} to name of {_item} if {_name} is not set: set {_name} to a translate component from {_item} if {@amount from inventory} = true: set {_amount} to amount of {_item} in player's inventory else: set {_amount} to item amount of {_item} if max stack of {_item} is 1: set {_itemtext} to "{@unstackable item format}" else: set {_itemtext} to "{@item format}" replace "{name}" with "%{_name}%" in {_itemtext} replace "{amount}" with "%{_amount}%" in {_itemtext} set {_itemtext} to a text component of {_itemtext} set hover event of {_itemtext} to a hover event showing {_item} add {_itemtext} to {_components::*} delete {_name} # finally, send the message set {_format1} to text component from {_format::1} delete {_format::1} broadcast component (merge components {_format1}, {_components::*} and text component from "%{_color}%%join {_format::*} with message%") from player