options: prefix: &3&lTab &8>> function tabPlaceholderParse(triggers: text, from: string, replacers: text) :: string: set {_triggers::*} to split {_triggers} by ", " set {_replacers::*} to split {_replacers} by ", " loop (size of {_triggers::*}) times: replace {_triggers::%loop-num%} with {_replacers::%loop-num%} in {_from} return {_from} #Getters function getTabName(player: string, world: world) :: strings: if file "plugins/Tab/Names.yml" exists: if yml path "%{_player}%.%{_world}%.name" in file "plugins/Tab/Names.yml" exists: set {_return::*} to yml list "%{_player}%.%{_world}%.name" of file "plugins/Tab/Names.yml" return {_return::*} function getTabUpdate(type: string, world: world, player: string = "") :: timespan: if {_type} = "name": if file "plugins/Tab/Names.yml" exists: if yml path "%{_player}%.%{_world}%.name" in file "plugins/Tab/%{_world}%.yml" exists: set {_return} to yml value "%{_player}%.%{_world}%.updateTime" of file "plugins/Tab/Names.yml" return {_return} parsed as timespan else: if file "plugins/Tab/%{_world}%.yml" exists: if yml path "updateTime" in file "plugins/Tab/%{_world}%.yml" exists: set {_return} to yml value "updateTime" of file "plugins/Tab/%{_world}%.yml" return {_return} parsed as timespan function getTabFormat(world: world) :: string: if file "plugins/Tab/%{_world}%.yml" exists: if yml path "format" in file "plugins/Tab/%{_world}%.yml" exists: set {_return} to yml value "format" of file "plugins/Tab/%{_world}%.yml" replace "§" with "&" in {_return} return {_return} function getTabHeader(world: world) :: strings: if file "plugins/Tab/%{_world}%.yml" exists: if yml path "animations.Header" in file "plugins/Tab/%{_world}%.yml" exists: set {_return::*} to yml list "animations.Header" of file "plugins/Tab/%{_world}%.yml" loop {_return::*}: replace "§" with "&" in {_return::%loop-index%} return {_return::*} function getTabFooter(world: world) :: strings: if file "plugins/Tab/%{_world}%.yml" exists: if yml path "animations.Footer" in file "plugins/Tab/%{_world}%.yml" exists: set {_return::*} to yml list "animations.Footer" of file "plugins/Tab/%{_world}%.yml" loop {_return::*}: replace "§" with "&" in {_return::%loop-index%} return {_return::*} function packetJson(text: text) :: jsonobject: set {_t::*} to {_text} split by "" loop {_t::*}: if loop-value = """": set {_t::%loop-index%} to "\""" else if loop-value = "\": if {_t::%loop-index parsed as int + 1%} != "n": set {_t::%loop-index%} to "\\" set {_text} to join {_t::*} by "" if {_json} isn't set: set {_json} to "{""text"":""%{_text}%""" else: set {_json} to "%{_json}%,{""text"":""%{_text}%""" return json of string "{""extra"":[%{_json}%}],""text"":""""}" #Setters function setTabHandF(header: text, footer: text, player: player): set {_packet} to new play_server_player_list_header_footer packet set "chatcomponent" pjson 0 of {_packet} to packetJson({_header}) set "chatcomponent" pjson 1 of {_packet} to packetJson({_footer}) send {_player} packet {_packet} function setTabName(player: string, world: world): set {_tab::player} to {_player} parsed as player set {_tab::name::frame::*} to getTabName({_player}, {_world}) set {_tab::update} to getTabUpdate("name", {_world}, {_player}) set {_tab::name::next} to 1 while {_tab::player} is in {_world}: if {_tab::player} is online: set {_tab::format} to getTabFormat({_world}) set {_tab::format} to tabPlaceholderParse("[name], [world], [prefix], [suffix], [displayname]", {_tab::format}, "%{_tab::name::frame::%{_tab::name::next}%}%, %{_world}%, %{_tab::player}'s prefix%, %{_tab::player}'s suffix%, %{_tab::player}'s display name%") set {_tab::player}'s tablist name to colored {_tab::format} if {_tab::name::next} = size of {_tab::name::frame::*}: set {_tab::name::next} to 1 add 1 to {_tab::name::next} else: exit loop wait {_tab::update} function setTab(player: string, world: world): set {_tab::player} to {_player} parsed as player set {_tab::header::frame::*} to getTabHeader({_world}) set {_tab::footer::frame::*} to getTabFooter({_world}) set {_tab::update} to getTabUpdate("tablist", {_world}) set {_tab::header::next} to 1 set {_tab::footer::next} to 1 while {_tab::player} is in {_world}: if {_tab::player} is online: set {_tab::header::frame::%{_tab::header::next}%} to colored tabPlaceholderParse("[world], [worldonline], [online], [prefix], [suffix], [name], [displayname], [nl]", {_tab::header::frame::%{_tab::header::next}%}, "%{_world}%, %size of players in {_world}%, %size of players%, %{_tab::player}'s prefix%, %{_tab::player}'s suffix%, %{_tab::player}%, %{_tab::player}'s display name%, \\\n") set {_tab::footer::frame::%{_tab::footer::next}%} to colored tabPlaceholderParse("[world], [worldonline], [online], [prefix], [suffix], [name], [displayname], [nl]", {_tab::footer::frame::%{_tab::footer::next}%}, "%{_world}%, %size of players in {_world}%, %size of players%, %{_tab::player}'s prefix%, %{_tab::player}'s suffix%, %{_tab::player}%, %{_tab::player}'s display name%, \\\n") setTabHandF("%{_tab::header::frame::%{_tab::header::next}%}%", "%{_tab::footer::frame::%{_tab::footer::next}%}%", {_tab::player}) if {_tab::header::next} = size of {_tab::header::frame::*}: set {_tab::header::frame::*} to getTabHeader({_world}) set {_tab::header::next} to 1 else: add 1 to {_tab::header::next} if {_tab::footer::next} = size of {_tab::footer::frame::*}: set {_tab::footer::frame::*} to getTabFooter({_world}) set {_tab::footer::next} to 1 else: add 1 to {_tab::footer::next} else: exit loop wait {_tab::update} on load: if dir "plugins/Tab" exists: stop create dir "plugins/Tab" if file "plugins/Tab/example.yml" doesn't exist: create file "plugins/Tab/example.yml" set {_configLines::*} to "updateTime: 3 ticks", "format: '[prefix]&e[name][suffix]'", "", "animations:", " header:", " - '&6&lT&e&lab'", " - '&e&lT&6&la&e&lb'", " - '&e&lTa&6&lb'", " - '&e&lT&6&la&e&lb'", " - '&6&lT&e&lab'", " - '&e&lTab'", " - '&5&lTab'", " - '&f&lTab'", " - '&a&lTab'", " - '&d&lTab'", " - '&c&lTab'", " Footer:", " - '&7Players&8: &b[online][nl][nl]&3Enjoy your stay in the server &e[name]&7!'", " - '&7Players&8: &b[online][nl][nl]&3Enjoy your stay in the server &5[name]&7!'", " - '&7Players&8: &b[online][nl][nl]&3Enjoy your stay in the server &f[name]&7!'", " - '&7Players&8: &b[online][nl][nl]&3Enjoy your stay in the server &a[name]&7!'", " - '&7Players&8: &b[online][nl][nl]&3Enjoy your stay in the server &d[name]&7!'" and " - '&7Players&8: &b[online][nl][nl]&3Enjoy your stay in the server &c[name]&7!'" set "plugins/Tab/example.yml"'s file contents to {_configLines::*} on join: wait 3 ticks if file "plugins/Tab/%world%.yml" exists: setTab(player's uuid, event-world) if yml path "%player's uuid%.%world%.name" in file "plugins/Tab/Names.yml" exists: setTabName(player's uuid, event-world) on teleport: if event-world != future world: set {_world::future} to future world wait 3 ticks setTab(player's uuid, {_world::future}) setTabName(player's uuid, {_world::future}) command /tab [] []: permission: tab.use trigger: if arg-1 is "add": if arg-2 and arg-3 are set: if sender has permission "tab.cmd.add": if arg-2 has played before: if yml path "%arg-2's uuid%.%event-world%" in file "plugins/Tab/Names.yml" doesn't exist: set yml value "%arg-2's uuid%.%event-world%.updateTime" of file "plugins/Tab/Names.yml" to "3 ticks" set yml value "%arg-2's uuid%.%event-world%.realName" of file "plugins/Tab/Names.yml" to "%arg-2%" add arg-3 to yml list "%arg-2's uuid%.%event-world%.name" of file "plugins/Tab/Names.yml" send "{@prefix} &aSuccesfully added the frame &e""%colored arg-3%&e"" &ato &6%arg-2% &ain world &6%world%&7." if arg-2 is online: send "{@prefix} &aRelog for see the changes&7." else: send "{@prefix} &cThat player doesn't played never on this server&7." else: send "{@prefix} &cYou don't have permission for this&7." else: send "{@prefix} &cCorrect usage&7: /&ctab set &7<&cplayer&7> <&cname&7>" else if arg-1 is "remove": if arg-2 is set: if sender has permission "tab.cmd.remove": if yml path "%arg-2's uuid%.%event-world%.name" in file "plugins/Tab/Names.yml" exists: if arg-2 has played before: set {_tab::name::frame::*} to getTabName(arg-2's uuid, world) remove {_tab::name::frame::%arg-3%} from yml list "%arg-2's uuid%.%event-world%.Name" of file "plugins/Tab/Names.yml" send "{@prefix} &aSuccessfully removed the frame &e""%colored {_tab::name::frame::%arg-3%}%&e"" &afrom the name of &6%arg-2%&7." if arg-2 is online: send "{@prefix} &aRelog for see the changes&7." else: send "{@prefix} &cThat player doesn't played never on this server&7." else: send "{@prefix} &cThat player doesn't have a custom name&7." else: send "{@prefix} &cYou don't have permission for this&7." else: send "{@prefix} &cCorrect usage&7: /&ctab remove &7<&cplayer&7>" else if arg-1 is "help": send "&a&m------------------------&r &e&lTab &a&m------------------------", "", "&7/&etab add &7<&eplayer&7> <&eframe&7>", "", "&eDescription&7:" and "&5- &c&oAdd a frame to the specified player custom name&7." sender is op or console: send "" and "&ePermission&7: &c&otab.cmd.add" send "", "&7/&etab remove &7<&eplayer&7> &7[&eframe number&7]", "", "&eDescription&7:", "&5- &c&oRemove the name of the specified player from the tablist&7&o.", "&5- &c&oremove a specified frame from the custom name of the specified player too&7&o." and "&5- &7&o(&c&oDon&7&o'&c&ot remove the player from the tablist&7&o)" sender is op or console: send "" and "&ePermission&7: &c&otab.cmd.remove" send "" and "&a&m-----------------------------------------------------" else: send "{@prefix} &cCorrect usage&7: /&ctab &7<&cset&7/&cremove&7/&chelp&7>"