

# █▀█ █▀█ █▀█ ▀█▀ █ █  ▄																 		 #
# █▄█ █▄█ █▄▀  █  ▀▄▀ ▀█▀																		 #
# █   █ █ █ █  █   █   															 				 #


# █▀█ █ █   █▀▀ █▀▀ █▀█ █ █   █ ▀█▀ █▀▀     █▀▀												 ▀▀█ #
# █▀█ ▀▄▀   █▄▄ █▀▀ █ █ █ █   █  █  █▄▄     █  Please do not pass or sell this on as your own  █ # 
# █▄█  █    █▄▄ █   █ █ █ █▄▄ █  █  █▄▄     █▄▄												 ▄▄█ #  

options:

	# Language (en = english, nl = dutch)
	# Really don't trust me? :( Scroll all the way down to edit the messages.
	lang: en


	# General prefix (last color will be the color most of the messages are in (in this case &7))
	prefix: &6Party&6&l+ &8»&7
	

	# Chat prefix of Party Chat (same as above)
	chatprefix: &6Party&6&l+ &6Chat &8»&7
	

	# Time for invites to expire
	PartyTime: 15
	

	# %player% = player | %message% = message
	PartyChatFormat: &6Party&6&l+ &6Chat &8»&7 &6%player%&7: %message% 
	

	PartyUsage: &6Party&6&l+ &8»&7 &c/party %arg 1% <player>
	

	# Max players in a party || Max is 27, because of the /p menu GUI
	PartyMaxPlayers: 6 


	# Cooldown on invites (seconds)
	InvCooldown: 3


	# Do you want to disable party pvp?
	PartyPvp: false


	# Do you have bungee enabled?
	BungeeCord: false


	# Refresh on BungeeCord party chat messages (seconds)
	MsgRefresh: 2


	# Server you are running this on if BungeeCord is on
	Server: Lobby-1


	# If you have Skungee enabled, set this to true 
	Skungee: false
	# ! Also remove the hashtag (#) on line 184 to enable this. !


	 # Permission to add commands
	AdminPerm: lc.admin


	# Do you want to enable /party home?
	enableHome: true


	# Do you want to set this to enabled?
	enabledRegion: false


	regionCommandOnly: false # True = only when the party leader is in a region and does /party tphere all the players tp
							 # False = everytime the party leader enters a region, everyone will be teleported


function loadRegion():
	if {@enabledRegion} = true:
		clear {p.regionlist::*}
		wait 1 tick

	#	! Add regions here
		# add regions: add "region name in world %world%" to {p.regionlist::*}
		add "region1 in world Deathmatch" to {p.regionlist::*}
		add "region2 in world Example" to {p.regionlist::*}
		add "dd in world world" to {p.regionlist::*}






#--------------------------------------------------------------------#
#						ACTUAL SKRIPT START						   	 # 
#--------------------------------------------------------------------#







function partyCommand(p: player, c: text):
	loop {party.%{Ownerofparty.%{_p}%}%.list::*}:
		make loop-value execute command "/%{_c}%"

function partyWorld(p: player):
	if {@BungeeCord} = false:
		if {Ownerofparty.%{_p}%} is set:
			if {Ownerofparty.%{_p}%} is {_p}:
				loop {party.%{Ownerofparty.%{_p}%}%.list::*}:
					teleport loop-variable to {Ownerofparty.%{_p}%}

function bungeeChat():
	if {@BungeeCord} = true:
		loop all players:
			if {partymsg.%loop-player%} is set:
				send "{@prefix} %{partymsg.%loop-player%}%" to loop-player
				delete {partymsg.%loop-player%}

function partyChat(p: player):
	if {Ownerofparty.%{_p}%} is set:
		if {Partychat.%{_p}%} is true:
			set {Partychat.%{_p}%} to false
			send "%{PartyChatFalse}%" to {_p}
		else:
			set {Partychat.%{_p}%} to true
			send "%{PartyChatTrue}%" to {_p}
	else:
		send "%{PartyNotInParty}%" to {_p}

function regionExit(p: player):
	if {@enabledRegion} = true:
		if {@regionCommandOnly} = false:	
			if {Ownerofparty.%{_p}%} = {_p}:
				set {inRegion.%{_p}%} to false

function regionEnter(p: player, r: region):
	if {@enabledRegion} = true:
		if {@regionCommandOnly} = false:
			if {Ownerofparty.%{_p}%} = {_p}:
				set {inRegion.%{_p}%} to true
			loop {p.regionlist::*}:
				if "%loop-value%" contains "%{_r}%":
					if {Ownerofparty.%{_p}%} = {_p}:
						make {_p} execute command "/party warp"
		else if {@regionCommandOnly} = true:
			send "%{enteredRegion}%" to {_p}

function firstJoin(p: player):
	set {party.%{_p}%.pchatmute} to false

function join(p: player):
	if {@BungeeCord} = true:
		set {online.%{_p}%} to true
		set {server.%{_p}%} to "{@Server}"
		set {justjoined.%{_p}%} to true
		wait 20 ticks
		set {justjoined.%{_p}%} to true
		wait 20 ticks
		set {justjoined.%{_p}%} to true
		wait 20 ticks
		set {justjoined.%{_p}%} to true
		wait 20 ticks
		set {justjoined.%{_p}%} to true
		wait 20 ticks
		set {justjoined.%{_p}%} to false
	set {Partychat.%{_p}%} to false
	set {pwt.%{_p}%} to 0

function quit(p: player):
	if {Ownerofparty.%{_p}%} is set:
		if {Ownerofparty.%{_p}%} is {_p}:
			make {_p} execute command "/party disbandconfirm"
		else:
			make {_p} execute command "/party leave" 
	if {@BungeeCord} = true:
		if {justjoined.%{_p}%} is true:
			set {online.%{_p}%} to true
			loop {party.%{Ownerofparty.%{_p}%}%.list::*}:
				if {@Skungee} = true:
					send "w" to {_p}
#					bungeecord loop-value switch of server to "%{server.%{_p}%}%"
				else:
					bungeecord connect loop-value to "%{server.%{_p}%}%"
		else:
			set {Ownerofparty.%{_p}%} to ""
			set {server.%{_p}%} to ""
			set {online.%{_p}%} to false	

function partyHelp(p: player):
	if {lang} = "en":
		send "&7&m--------------&b Party Help &7&m--------------" to {_p}
		send "&b/party help &8» &7Prints this help message" to {_p}
		send "&b&l/party menu &8» &7Open the menu"  to {_p}
		if {@enableHome} = true:
			send "&b/party sethome &8» &7Set the party home" to {_p}
			send "&b/party home &8» &7Teleport to the party home" to {_p}
		send "&b/party chat &8» &7Enable or disable party chat" to {_p}
		send "&b/party mute &8» &7Mute party chat" to {_p}
		send "&b/party disband &8» &7Disband your party" to {_p}
		send "&b/party promote &8» &7Promote a player to leader" to {_p}
		send "&b/party invite <player> &8» &7Invite a player to your party" to {_p}
		send "&b/party kick <player> &8» &7Kick player from your party" to {_p}
		send "&b/party accept <player> &8» &7Accept a party invite" to {_p}
		send "&7&m--------------------------------------" to {_p}
	else if {lang} = "nl":
		send "&7&m--------------&b Party Help &7&m--------------" to {_p}
		send "&b/party help &8» &7Print dit help bericht" to {_p}
		send "&b&l/party menu &8» &7Open het menu"  to {_p}
		if {@enableHome} = true:
			send "&b/party sethome &8» &7Zet de party home naar jouw locatie" to {_p}
			send "&b/party home &8» &7Teleporteer naar de party home"  to {_p}
		send "&b/party chat &8» &7Zet de partychat aan of uit" to {_p}
		send "&b/party mute &8» &7Mute de party chat" to {_p}
		send "&b/party disband &8» &7Verwijder de party" to {_p}
		send "&b/party promote &8» &7Promoveer een speler naar leider" to {_p}
		send "&b/party invite <player> &8» &7Nodig een speler voor je party uit" to {_p}
		send "&b/party kick <player> &8» &7Haal een speler uit je party weg" to {_p}
		send "&b/party accept <player> &8» &7Accepteer een invite" to {_p}
		send "&7&m--------------------------------------" to {_p}

on load:
	loadRegion()

on first join:
	firstJoin(player)

on quit:
	quit(player)

on join:
	join(player)

on region enter:
	regionEnter(player, region)

on region exit:
	regionExit(player)

every {@MsgRefresh} seconds:
	bungeeChat()

on player world change:
	partyWorld(player)

command /partychat:
	aliases: /pchat
	trigger:
		partyChat(player)

on chat:
	if {Partychat.%player%} is true:
		if {Ownerofparty.%player%} is set:
			if {party.%player%.pchatmute} = false:
				cancel event
				loop {party.%{Ownerofparty.%player%}%.list::*}:
					if {party.%loop-value%.pchatmute} = false:
						if {@BungeeCord} = true:
							set {partymsg.%loop-value%} to "{@PartyChatFormat}"
						send "{@PartyChatFormat}" to loop-value
			else:
				send "%{PartyChatMuted}%"
		else:
			send "%{PartyNotInParty}%"

on command:
	if {CommandExec./%full command%} is true:
		if {Ownerofparty.%player%} is player:
			partyCommand(player, "%full command%")
		else:
			cancel event
			send "%{NoPartyLeader}%"
				
every second:
	loop all players:
		if {pwt.%loop-player%} > 0:
			remove 1 from {pwt.%loop-player%}

on damage of player:
	if {Ownerofparty.%victim%} is set:
		if {Ownerofparty.%attacker%} is set:
			if "%{p.%victim%.list::*}%" contains "%attacker%":
				cancel event
				send "%{CantAttackParty}%" to attacker

options:
	Command: /party

command /party [<text>] [<offline player>]:
	aliases: /p
	trigger:
		if arg-1 is "help":
			if {lang} = "nl":
				partyHelp(player)	
			else:
				partyHelp(player)
		else if arg-1 is not set:
			if {lang} = "nl":
				partyHelp(player)		
			else:
				partyHelp(player)
		else if arg 1 is "author":
			send "&7[&aParty+&7] by Efnilite"
		else if arg 1 = "chat":
			execute player command "/partychat"
		else if arg 1 = "sethome":
			if {@enableHome} = true:
				if {Ownerofparty.%player%} is set:
					if {Ownerofparty.%player%} is player:
						set {party.%player%.home} to location of player
						send "%{PartySetHome}% %{party.%player%.home}%" to player
						loop {party.%player%.list::*}:
							set {party.%loop-value%.home} to location of player
							send "%{PartyLeaderSetHome}% %player% %{PartyLeaderSetHome1}% %{party.%loop-value%.home}% %{PartyLeaderSetHome2}%" to loop-value
					else:
						send "%{PartyNotOwner}%"
				else:
					send "%{PartyNotInParty}%"
		else if arg 1 = "home":
			if {@enableHome} = true:
				if {Ownerofparty.%player%} is set:
					if {party.%player%.home} is set:
						teleport player to {party.%player%.home}
						send "%{PartyTPHome}%"
					else:
						send "%{PartyHomeNotSet}%"
				else:
					send "%{PartyNotInParty}%"
		else if arg 1 = "mute":
			if {Ownerofparty.%player%} is set:
				if {party.%player%.pchatmute} is true:
					set {party.%player%.pchatmute} to false
					send "%{PartyMuteDisabled}%" to player
				else:
					set {party.%player%.pchatmute} to true
					send "%{PartyMuteEnabled}%" to player
			else:
				send "%{PartyNotInParty}%"
		else if arg 1 is "create":
			if {Ownerofparty.%player%} is set:
				message "%{PartyAlreadyInParty}%" to player
			else:
				set {Ownerofparty.%player%} to player
				add player to {party.%player%.list::*}
				message "%{PartyCreate}%" to player
		else if arg 1 is "disband":
			if {Ownerofparty.%player%} is player:
				json("%player%", "%nl%%{DisbandSure}%||%nl%&2&lCONFIRM||ttp:&7Click me to disband!||cmd:/party disbandconfirm|| &7| ||&4&lDECLINE%nl%||ttp:&7Click me to decline!||cmd:/party disbanddecline")
			else:
				message "%{PartyNotOwner}%" to player
		else if arg 1 is "disbandconfirm":
			if {Ownerofparty.%player%} is player:
				loop {party.%{Ownerofparty.%player%}%.list::*}:
					delete {p.%loop-value%.list::*}
					add 1 to {_Number}
					delete {party.%loop-value%.home}
					delete {Ownerofparty.%loop-variable%}
					message "%{PartyDisbandKick}%" to loop-variable
				delete {Ownerofparty.%player%}
				clear {party.%player%.list::*}
				message "%{PartyDisband}%" to player
		else if arg 1 is "disbanddecline":
			send "%{DisbandDeclined}%"
		else if arg 1 is "invite":
			if arg 2 is set:
				if arg-2 is a player:
					if {Ownerofparty.%player%} is set:
						if {Ownerofparty.%player%} is player:
							if (size of {p.%player%.list::*}) < {@PartyMaxPlayers}:
								if {pwt.%player%} = 0:
									set {_Inviter} to sender
									set {pwt.%player%} to {@InvCooldown}
									add arg-2 to {invites.%player%.list::*}
									if {@BungeeCord} = true:
										set {inviter.%arg-2%} to "%sender%"
									add player to {invites.%arg-2%.list::*}
									set {_Command} to "{@Command}"
									set {Invited} to arg 2
									message "%{PartyInvitedPlayer}% %{Invited}%" to sender
									json("%arg 2%", "%{PartyInvite}% %{_Inviter}%%{PartyInvite1}%||ttp:%{PartyInviteTooltip}%||cmd:%{_Command}% accept %sender%")
									wait {@PartyTime} seconds
									remove player from {invites.%arg-2%.list::*}
								else:
									send "%{PartyInvCooldown}%" to player
							else:
								set {_MaxNumbers} to "{@PartyMaxPlayers}"
								message "%{PartyInviteExceedsPartyLimit}% %{_MaxNumber}%%{PartyInviteExceedsPartyLimit1}%" to player
						else:
							message "%{PartyNotOwner}%" to player
					else:
						send "%{notPartyYet}%"
						wait 5 tick
						execute player command "/party create"
						execute player command "/party invite %arg-2%"
				else:
					send "%{PlNotOnline}%"
			else:
				set {_Command} to "{@Command}"
				message "{@PartyUsage}" to player
		else if arg 1 is "accept":
			if arg 2 is set:
				if {Ownerofparty.%player%} is not set:
					if "%{invites.%arg-2%.list::*}%" contains "%player%":
						add player to {party.%arg-2%.list::*}
						set {Ownerofparty.%player%} to arg 2
						if {party.%arg-2%.home} is set:
							set {party.%player%.home} to {party.%arg 2%.home}
						loop {party.%{Ownerofparty.%player%}%.list::*}:
							set {p.%loop-value%.list::*} to {party.%{Ownerofparty.%player%}%.list::*}
						if {@BungeeCord} = true:
							set {accepted.%arg-2%} to "%sender%"
						message "%{PartyJoin}%" to player
						loop {party.%{Ownerofparty.%player%}%.list::*}:
							set {_Player} to sender
							message "%{PartyPlayerJoinedYourParty}% %{_Player}% %{PartyPlayerJoinedYourParty1}%" to loop-value
				else:
					message "%{PartyAlreadyInParty}%" to player
			else:
				message "{@PartyUsage}" to player
		else if arg 1 is "warp":
			if {Ownerofparty.%player%} = player:
				if {inRegion.%player%} = true:
					loop {party.%{Ownerofparty.%player%}%.list::*}:
						teleport loop-value to {Ownerofparty.%loop-value%}
						send "%{partyTpHere}%" to loop-value
		else if arg 1 is "leave":
			if {Ownerofparty.%player%} is set:
				if {Ownerofparty.%player%} is player:
					make player execute command "{@Command} disband"
				else:
					loop {party.%{Ownerofparty.%player%}%.list::*}:
						if loop-variable is player:
							message "%{PartyLeave}%" to player
						else:
							set {_Player} to player
							message "%{PartyPlayerLeftYourParty}% %{_Player}% %{PartyPlayerLeftYourParty1}%" to loop-variable
					remove player from {party.%{Ownerofparty.%player%}%.list::*}
					loop {party.%{Ownerofparty.%player%}%.list::*}:
						set {p.%loop-value%.list::*} to {party.%{Ownerofparty.%player%}%.list::*}
					wait 1 tick
					delete {p.%player%.list::*}
					delete {party.%player%.home}
					delete {Ownerofparty.%player%}
			else:
				message "%{PartyNotInParty}%" to player
		else if arg 1 is "promote":
			if arg 2 is set:
				if {Ownerofparty.%player%} is set:
					if {Ownerofparty.%player%} is player:
						if "%{p.%player%.list::*}%" contains "%arg-2%":
							loop {p.%player%.list::*}:
								set {Ownerofparty.%loop-value-2%} to arg-2
								set {_Player} to arg-2 
								set {_Exec} to sender
								send "%{PartyPromote}% %{_Exec}% %{PartyPromote1}% %{_Player}% %{PartyPromote2}%" to loop-value
					else:
						message "%{PartyNotOwner}%" to player
						stop
				else:
					message "%{PartyNotInParty}%" to player
					stop
			else:
				set {_Command} to "{@Command}"
				message "{@PartyUsage}" to player
		else if arg 1 is "menu":
			if {Ownerofparty.%player%} is set:
				open chest with 4 rows named "&bParty Menu" to player
				wait 2 ticks
				set {_list} to 0
				if {Ownerofparty.%player%} is player:
					loop {p.%player%.list::*}:
						set {_a.%loop-value%} to "%loop-value%" parsed as offlineplayer
						if {_a.%loop-value%} = {Ownerofparty.%loop-value%}:
							format slot {_list} of player with skull of {_a.%loop-value%} named "&bParty Owner &a%loop-value%" to be unstealable
						else:
							set {player.%{_a.%loop-value%}%} to "%loop-value%"
							format slot {_list} of player with skull of {_a.%loop-value%} named "&a%loop-value%" with lore "&7Click me to kick this player!" to close then run [make player execute "/party kick %loop-value%"]
						add 1 to {_list}
					format slot 35 of player with arrow named "&7Close menu" with lore "&7Click me to close||&7the menu!" to close
					if {Ownerofparty.%player%} is player:
						format slot 27 of player with redstone block named "&cDisband the party" with lore "&7Click me to disband||&7the party!" to close then run [make player execute "/party disband"]
					else:
						format slot 27 of player with redstone block named "&cLeave the party" with lore "&7Click me to leave||&7the party!" to close then run [make player execute "/party leave"]
					if {Partychat.%player%} is true:
						format slot 29 of player with name tag named "&cDisable Party Chat" with lore "&7Click me to enable/disable||&7party chat!" to close then run [make player execute "/partychat"]
					else:
						format slot 29 of player with name tag named "&aEnable Party Chat" with lore "&7Click me to enable/disable||&7party chat!" to close then run [make player execute "/partychat"]
					format slot 28 of player with glass block named "&bSee Party Help" with lore "&7Click me to go to||&7Party help!" to close then run [make player execute "/party help"]
				else:
					loop {p.%player%.list::*}:
						set {_a.%loop-value%} to "%loop-value%" parsed as offlineplayer
						if {_a.%loop-value%} = {Ownerofparty.%loop-value%}:
							format slot {_list} of player with skull of {_a.%loop-value%} named "&bParty Owner &a%loop-value%" to be unstealable
						else:
							format slot {_list} of player with skull of {_a.%loop-value%} named "&a%loop-value%" to be unstealable
						add 1 to {_list}
					format slot 35 of player with arrow named "&7Close menu" with lore "&7Click me to close||&7the menu!" to close
					if {Ownerofparty.%player%} is player:
						format slot 27 of player with redstone block named "&cDisband the party" with lore "&7Click me to disband||&7the party!" to close then run [make player execute "/party disband"]
					else:
						format slot 27 of player with redstone block named "&cLeave the party" with lore "&7Click me to leave||&7the party!" to close then run [make player execute "/party leave"]
					if {Partychat.%player%} is true:
						format slot 29 of player with name tag named "&cDisable Party Chat" with lore "&7Click me to enable/disable||&7party chat!" to close then run [make player execute "/partychat"]
					else:
						format slot 29 of player with name tag named "&aEnable Party Chat" with lore "&7Click me to enable/disable||&7party chat!" to close then run [make player execute "/partychat"]
					format slot 28 of player with glass block named "&bSee Party Help" with lore "&7Click me to go to||&7Party help!" to close then run [make player execute "/party help"]
			else:
				message "%{PartyNotInParty}%" to player
		else if arg 1 is "kick":
			if arg 2 is set:
				if {Ownerofparty.%player%} is set:
					if {Ownerofparty.%player%} is player:
						loop {party.%player%.list::*}:
							set {_players} to loop-variable
							if arg-2 is loop-variable:
								set {_Player} to arg-2
								message "%{PartyKicked}%%{_Player}%%{PartyKicked1}%" to player
								message "%{PartyKick}%" to arg-2
								make arg-2 execute command "/party leave"
					else:
						message "%{PartyNotOwner}%" to player
				else:
					message "%{PartyNotInParty}%" to player
			else:
				set {_Command} to "{@Command}"
				message "{@PartyUsage}" to player
		else:
			set {_Command} to "{@Command}"
			if {lang} = "nl":
				partyHelp(player)
			else:
				partyHelp(player)




on load:
	set {lang} to "{@lang}"
	wait 1 tick

	if {lang} = "en":

		# English language options (change these as much as you like)

		set {PartyCreate} to "{@prefix} &aYou created a party"
		set {PartyDisband} to "{@prefix} &cYou disbanded your party"
		set {PartyJoin} to "{@prefix} &aYou joined a party"
		set {PartyJoinNotInvited} to "{@prefix} &cYou have not been invited to this party."
		set {PartyLeave} to "{@prefix} &cYou left your party."
		set {PartyInvite} to "{@prefix} &aYou were invited to a party by&6&l"
		set {PartyInvite1} to "&r&a! &a&lClick me to join!"
		set {PartyInviteTooltip} to "{@prefix} &a&lClick me to join!"
		set {PartyInviteExceedsPartyLimit} to "{@prefix} &cYou already have"
		set {PartyInviteExceedsPartyLimit1} to " players in your party."
		set {PartyInvitedPlayer} to "{@prefix} &aYou have invited&6&l"
		set {PartyKick} to "{@prefix} &cYou were kicked from your party."
		set {PartyAlreadyInParty} to "{@prefix} &cYou are already in a party."
		set {PartyNotOwner} to "{@prefix} &cYou are not the owner of this party."
		set {PartyNotInParty} to "{@prefix} &cYou are not in a party."
		set {PartyDisbandKick} to "%nl%{@prefix} &c&lYour party was disbanded!%nl%"
		set {PartyPlayerLeftYourParty} to "{@prefix} &6&l" 
		set {PartyPlayerLeftYourParty1} to "&7left your party."
		set {PartyPlayerJoinedYourParty} to "{@prefix} &6&l"
		set {PartyPlayerJoinedYourParty1} to "&7joined your party!"
		set {PartyKicked} to "{@prefix} You kicked &6&l"
		set {PartyKicked1} to "&7."
		set {PartyPlayerNotInYourParty} to "{@prefix} This player is not in your party!"
		set {notPartyYet} to "{@prefix} &aI see you haven't joined a party yet.. I'm creating one for you!"	
		set {PlNotOnline} to "{@prefix} &cThat player is not online!"	
		set {DisbandSure} to "{@prefix} &aAre you sure you want to delete your party?"
		set {DisbandDeclined} to "{@prefix} &aRequest declined."
		set {PartyPromote} to "{@prefix}&6&l"
		set {PartyPromote1} to "&7has promoted&6&l"
		set {PartyPromote2} to "&7to leader!"
		set {PartyMuteEnabled} to "{@prefix} &7You have muted party chat!&7&o (Type again to disable)"
		set {PartyMuteDisabled} to "{@prefix} &7You have unmuted party chat! &7&o(Type again to enable)"
		set {PartyChatMuted} to "{@prefix} &cYou can't speak because you muted party chat!"
		set {PartySetHome} to "{@prefix} &cYou set the party home to"
		set {PartyLeaderSetHome} to "{@prefix} &c"
		set {PartyLeaderSetHome1} to "&7has set the party home to&c"
		set {PartyLeaderSetHome2} to "&7! &7&o(You can now do /p home!)"
		set {PartyHomeNotSet} to "{@prefix} &cThe party home has not been set yet!"
		set {PartyTPHome} to "{@prefix} &cYou have been teleported to the party home!"
		set {PartyInvCooldown} to "{@prefix} &cYou need to wait at least &l&c3 &r&cseconds before inviting someone again!"
		set {PartyChatFalse} to "{@chatprefix} You've &cdisabled &7party chat! &7&o(Type again to enable)"
		set {PartyChatTrue} to "{@chatprefix} You've &aenabled &7party chat&7! &7&o(Type again to disable)"
		set {partyTpHere} to "{@prefix} Your party was teleported to the leader!"
		set {enteredRegion} to "{@prefix} You entered a region! You can now type /p tphere to teleport your party to you!"
		set {NoPartyLeader} to "{@prefix}&c You are not the party owner! Type /p leave to leave the party."
		set {CantAttackParty} to "{@prefix} &cYou can't attack your own party!"

	if {lang} = "nl":

	# Nederlandse taalopties (Verander ze maar)

		set {PartyCreate} to "{@prefix} &aJe hebt een party aangemaakt"
		set {PartyDisband} to "{@prefix} &cJe hebt je party verlaten!"
		set {PartyJoin} to "{@prefix} &aJe hebt de party gejoined!"
		set {PartyJoinNotInvited} to "{@prefix} &cJe bent niet uitgenodigd voor deze party"
		set {PartyLeave} to "{@prefix} &cJe hebt je party verlaten"
		set {PartyInvite} to "{@prefix} &aJe bent uitgenodigd voor een party door&6&l"
		set {PartyInvite1} to " &r&a! &a&lKlik op mij om te joinen!"
		set {PartyInviteTooltip} to "{@prefix} &a&lClick op mij om te joinen!"
		set {PartyInviteExceedsPartyLimit} to "{@prefix} &cJe hebt het spelerlimiet behaald! (Maximaal"
		set {PartyInviteExceedsPartyLimit1} to ")"
		set {PartyInvitedPlayer} to "{@prefix} &aJe hebt uitgenodigd:&6&l"
		set {PartyKick} to "{@prefix} &cJe bent uit je party gezet!"
		set {PartyAlreadyInParty} to "{@prefix} &cJe zit al in een party!"
		set {PartyNotOwner} to "{@prefix} &cJe bent niet de party eigenaar! Doe /p leave om de party te verlaten"
		set {PartyNotInParty} to "{@prefix} &cJe zit niet in een party."
		set {PartyDisbandKick} to "%nl%{@prefix} &c&lJe party is verwijderd!%nl%"
		set {PartyPlayerLeftYourParty} to "{@prefix} &6&l"
		set {PartyPlayerLeftYourParty1} to "&7 heeft je party verlaten"
		set {PartyPlayerJoinedYourParty} to "{@prefix} &6&l"
		set {PartyPlayerJoinedYourParty} to "&7is bij je party aangesloten!"
		set {PartyKicked} to "{@prefix} &7Je hebt &6&l"
		set {PartyKicked1} to "&7 uit de party geschopt!"
		set {PartyPlayerNotInYourParty} to "{@prefix} Deze speler zit niet in je party!"
		set {notPartyYet} to "{@prefix} &aIk zie dat je geen party hebt.. Ik maak er wel een voor je aan!"		
		set {PlNotOnline} to "{@prefix} &cDie speler is niet online!"
		set {DisbandSure} to "{@prefix} &aWeet je zeker of je je party wil verwijderen?"	
		set {DisbandDeclined} to "{@prefix} &aVerzoek afgewezen."
		set {PartyPromote} to "{@prefix}&6&l"
		set {PartyPromote1} to "&7heeft&6&l"
		set {PartyPromote2} to "&7gepromoveerd tot leider!"
		set {PartyMuteEnabled} to "{@prefix} &7Je hebt party chat gemute! &7&o(Type opnieuw om te unmuten)"
		set {PartyMuteDisabled} to "{@prefix} &7Je hebt party chat niet meer gemute! &7&o(Type opnieuw om te muten)"
		set {PartyChatMuted} to "{@prefix} &cJe kan niet praten omdat je party chat hebt gemute!"
		set {PartySetHome} to "{@prefix} &cJe hebt de party home gezet naar:"
		set {PartyLeaderSetHome} to "{@prefix} &c"
		set {PartyLeaderSetHome1} to "&cheeft de party home gezet naar:"
		set {PartyLeaderSetHome2} to "&7&o(Je kan nu /p home doen!)"
		set {PartyHomeNotSet} to "{@prefix} &cDe party home is nog niet neergezet!"
		set {PartyTPHome} to "{@prefix} &cJe bent naar de party home geteleporteerd!"
		set {PartyInvCooldown} to "{@prefix} &cJe moet minstens &l&c3 &cseconden wachten voordat je weer iemand uitnodigd!"
		set {PartyChatFalse} to "{@chatprefix} Je hebt party chat &cuitgezet! &7&o(Type opnieuw om aan te zetten)"
		set {PartyChatTrue} to "{@chatprefix} Je hebt party chat &aaangezet&7! &7&o(Type opnieuw om uit te zetten)"
		set {partyTpHere} to "{@prefix} De party is geteleporteerd naar de leider!"
		set {enteredRegion} to "{@prefix} Je bent een 'region' binnengestapt! Doe /p tphere om de partyleden naar je toe te teleporteren."
		set {NoPartyLeader} to "{@prefix}&c Je bent niet de party eigenaar! Doe /p leave om de party te verlaten"
		set {CantAttackParty} to "{@prefix} &cJe kan je eigen party niet aanvallen!"

options:
    debug: false
    codes: 0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f|k|l|m|n|o|r
    
function removeColor(msg: text) :: text:
    set {_m::*} to {_msg} split at ""
    
    set {_color-codes} to "{@codes}"
    set {_colors::*} to {_color-codes} split at "|"
    
    set {_new} to ""
    
    loop {_m::*}:
        set {_char} to loop-value
        set {_prev} to the last character of {_new}
        
        if {_prev} is "&":
        
            loop {_colors::*}:
            
                if loop-value-2 is {_char}:
                    set {_skip} to true
                
        if {_skip} is set:
            delete {_skip}
            
        else:
            set {_new} to "%{_new}%%{_char}%"
                
    return {_new}
 
function jsonColorize(msg: text, default-color: text = "&r") :: text:
    set {_m::*} to {_msg} split at ""
    
    set {_color-codes} to "{@codes}"
    set {_colors::*} to {_color-codes} split at "|"
    
    set {_color} to colored {_default-color}
    set {_code} to the first character of {_color}
    
    set {_new} to ""
    set {_skip} to 0
    
    loop amount of {_m::*} times:
    
        if {_skip} is more than or equal to 1:
            subtract 1 from {_skip}
            
        else:
            set {_char} to {_m::%loop-number%}
            set {_next} to {_m::%loop-number + 1%}
            
            if {@debug} is true:
                broadcast "&a[Character Check] &r%loop-number%: &7%{_char}% &r&onext: &8%{_next}% &r[%{_color}%color&r]"
            
            if {_char} is "&" or {_code}:
            
                if {@debug} is true:
                    broadcast "&a[Color Check] &rFOUND: &o%{_char}%%{_next}% &7&m<--&7&o is it valid?"
            
                loop {_colors::*}:
                
                    if loop-value-2 is {_next}:
                        set {_color} to "%{_color}%%{_code}%%{_next}%"
                        
                        if {_next} is "r":
                            set {_color} to {_default-color}
                            
                        set {_new} to "%{_new}%%{_color}%"
                        set {_skip} to 1
                        
                if {_skip} is less than or equal to 0:
                    set {_new} to "%{_new}%%{_char}%"
                
            else if {_char} is " ":
                set {_new} to "%{_new}% %{_color}%"
            
            else:
                set {_new} to "%{_new}%%{_char}%"
                
    return {_new}

function jsonSanitize(msg: text) :: text:
    if {@debug} is true:
        broadcast "&a[Sanitize] &7&oSanitizing input..."
        
    set {_m::*} to {_msg} split at ""
    
    loop {_m::*}:
    
        if loop-value is """":
            set {_m::%loop-index%} to "\""" # """
            
        else if loop-value is "\":
            set {_m::%loop-index%} to "\\"
            
    set {_new} to join {_m::*} with ""
    return {_new}

function jsonFormat(msg: text, color: boolean = true) :: text:
    set {_m::*} to {_msg} split at "||"
    
    set {_current} to 1
    
    loop {_m::*}:
        if {_clusters::%{_current}%} is not set:
            set {_clusters::%{_current}%} to ""
        
        if {_clusters::%{_current}%::text} is not set:
            set {_clusters::%{_current}%::text} to jsonSanitize(loop-value)
            
        else:
            set {_tag} to the first 4 characters of loop-value
            set {_value} to subtext of loop-value from characters 5 to the length of loop-value
            
            if {_tag} is "ttp:":
                set {_clusters::%{_current}%::tooltip} to jsonSanitize({_value})
                
            else if {_tag} is "cmd:":
                set {_clusters::%{_current}%::command} to jsonSanitize({_value})
                
            else if {_tag} is "sgt:":
                set {_clusters::%{_current}%::suggest} to jsonSanitize({_value})
                
            else if {_tag} is "url:":
            
                if {_value} doesn't contain "http://" or "https://":
                    set {_value} to "http://%{_value}%"
                    
                set {_clusters::%{_current}%::url} to jsonSanitize({_value})
                
            else if {_tag} is "ins:":
                set {_clusters::%{_current}%::insertion} to jsonSanitize({_value})
                
            else:
                add 1 to {_current}
                set {_clusters::%{_current}%::text} to jsonSanitize(loop-value)
                set {_clusters::%{_current}%} to ""
                
            if {@debug} is true:
                broadcast "&a[Tag Check] &3cluster:&b%{_current}% &8(&f&o%{_tag}%&8)"
     
    loop {_clusters::*}:
    
        if {@debug} is true:
            broadcast "&a[Cluster Check] &7&oCluster ##%loop-index% exists."
            
        set {_i} to loop-index
        
        set {_text} to {_clusters::%{_i}%::text}
        
        if {_color} is true:
            set {_text} to jsonColorize({_text})
            
        if {_json} is not set:
            set {_json} to "{""text"":""%{_text}%"""
        else:
            set {_json} to "%{_json}%,{""text"":""%{_text}%"""
        
        if {_clusters::%{_i}%::tooltip} is set:
        
            if {_color} is true:
                set {_tooltip} to jsonColorize({_clusters::%{_i}%::tooltip})
                
            else:
                set {_tooltip} to {_clusters::%{_i}%::tooltip}
                
            set {_json} to "%{_json}%,""hoverEvent"":{""action"": ""show_text"",""value"": ""%{_tooltip}%""}"
        
        if {_clusters::%{_i}%::insertion} is set:
            set {_json} to "%{_json}%,""insertion"":""%{_clusters::%{_i}%::insertion}%"",""obfuscated"":false"
        
        if {_clusters::%{_i}%::command} is set:
            set {_clickable} to "%{_json}%,""clickEvent"":{""action"":""run_command"",""value"":""%{_clusters::%{_i}%::command}%""}"
            
        if {_clusters::%{_i}%::suggest} is set:
            set {_clickable} to "%{_json}%,""clickEvent"":{""action"": ""suggest_command"",""value"": ""%{_clusters::%{_i}%::suggest}%""}"
            
        if {_clusters::%{_i}%::url} is set:
            set {_clickable} to "%{_json}%,""clickEvent"":{""action"": ""open_url"",""value"": ""%{_clusters::%{_i}%::url}%""}"
            
        if {_clickable} is set:
            set {_json} to "%{_clickable}%}"
            delete {_clickable}
            
        else:
            set {_json} to "%{_json}%}"
    
    return "{""text"":"""", ""extra"":[%{_json}%]}"

function json(to: text, msg: text, color: boolean = true):
    set {_msg} to jsonFormat({_msg}, {_color})
    execute console command "/tellraw %{_to}% %{_msg}%"
    
    if {@debug} is true:
        set {_player} to {_to} parsed as offline player
        if {_player} is online:
            send uncolored {_msg} to {_player}