skript-edit.sk

Created by LimeGlass

Just so you know, we don't know the file format for every file. If it's just a bunch of random characters, it's probably a .zip or .jar.


options:
	# The max amount of edit session saves a player is allowed in the database.
	max-session-saves: 25
	# How often a wait a tick will be placed in a session.
	# Setting this to higher values will make it work faster at the cost of server performance.
	time-delay: 5 seconds
	# If a player is kicked from the server should the edit session stop?
	cancel-player-timeout-kicks: false
	# remove the checkMaxSessions() function checks in the unload and quit events below if you don't want to remove edit session data.
	# Careful this can make big database files.

on script unload:
	loop {skript-edit::temp::player::*}:
		set {_player} to loop-index parsed as offlineplayer
		checkMaxSessions(uuid of {_player})
	delete {skript-edit::temp::*}

on quit:
	if {@cancel-player-timeout-kicks} is true:
		set {skript-edit::temp::player::%player%::cancel} to true
		wait a second
	delete {skript-edit::temp::player::%player%::*}
	checkMaxSessions(uuid of player)

function checkMaxSessions(uuid: text):
	size of indices of {skript-edit::player::%{_uuid}%::redo::*} is greater than {@max-session-saves}
	set {_index} to 1
	loop size of {skript-edit::player::%{_uuid}%::redo::%{_index}%::blocks::*} - {@max-session-saves} times:
		delete {skript-edit::player::%{_uuid}%::redo::%{_index}%::locations::*}
		delete {skript-edit::player::%{_uuid}%::redo::%{_index}%::blocks::*}
		delete {skript-edit::player::%{_uuid}%::redo::%{_index}%::data::*}
		delete {skript-edit::player::%{_uuid}%::undo::%{_index}%::locations::*}
		delete {skript-edit::player::%{_uuid}%::undo::%{_index}%::blocks::*}
		delete {skript-edit::player::%{_uuid}%::undo::%{_index}%::data::*}
		add 1 to {_index}
	set {_new} to 1
	loop {@max-session-saves} times:
		set {skript-edit::player::%{_uuid}%::redo::%{_new}%::locations::*} to {skript-edit::player::%{_uuid}%::redo::%{_index}%::locations::*}
		set {skript-edit::player::%{_uuid}%::redo::%{_new}%::blocks::*} to {skript-edit::player::%{_uuid}%::redo::%{_index}%::blocks::*}
		set {skript-edit::player::%{_uuid}%::redo::%{_new}%::data::*} to {skript-edit::player::%{_uuid}%::redo::%{_index}%::data::*}
		set {skript-edit::player::%{_uuid}%::undo::%{_new}%::locations::*} to {skript-edit::player::%{_uuid}%::undo::%{_index}%::locations::*}
		set {skript-edit::player::%{_uuid}%::undo::%{_new}%::blocks::*} to {skript-edit::player::%{_uuid}%::undo::%{_index}%::blocks::*}
		set {skript-edit::player::%{_uuid}%::undo::%{_new}%::data::*} to {skript-edit::player::%{_uuid}%::undo::%{_index}%::data::*}
		delete {skript-edit::player::%{_uuid}%::redo::%{_index}%::locations::*}
		delete {skript-edit::player::%{_uuid}%::redo::%{_index}%::blocks::*}
		delete {skript-edit::player::%{_uuid}%::redo::%{_index}%::data::*}
		delete {skript-edit::player::%{_uuid}%::undo::%{_index}%::locations::*}
		delete {skript-edit::player::%{_uuid}%::undo::%{_index}%::blocks::*}
		delete {skript-edit::player::%{_uuid}%::undo::%{_index}%::data::*}
		add 1 to {_new} and {_index}

function setBlock(session: number, player: player, location: location, text: text):
	set {_uuid} to uuid of {_player}
	set {_block} to block at {_location}
	add type of {_block} to {skript-edit::player::%{_uuid}%::undo::%{_session}%::blocks::*}
	add block data of {_block} to {skript-edit::player::%{_uuid}%::undo::%{_session}%::data::*}
	add {_location} to {skript-edit::player::%{_uuid}%::undo::%{_session}%::locations::*}
	if {_text} doesn't contain ";":
		if {_text} doesn't contain "%%":
			set {_item} to {_text} parsed as item
			if {_item} is not set:
				if parse error is set:
					message "&c%{_text}% is not a valid item. Error: %last parse error%" to {_player}
				else:
					message "&c%{_text}% is not a valid item." to {_player}
				stop
			{_block} is not {_item}
			set {_block} to {_item}
		else:
			set {_item} to {_text} parsed as item
			if {_item} is not set:
				if parse error is set:
					message "&c%{_text}% is not a valid item. Error: %last parse error%" to {_player}
				else:
					message "&c%{_text}% is not a valid item." to {_player}
				stop
			set {_values::*} to {_text} split at "%%"
			set {_chance} to {_values::1} parsed as number
			if {_chance} is not set:
				if parse error is set:
					message "&c%{_values::1}% is not a valid number. Error: %last parse error%" to {_player}
				else:
					message "&c%{_values::1}% is not a valid number." to {_player}
				stop
			set {_item} to {_values::2} parsed as item
			if {_item} is not set:
				if parse error is set:
					message "&c%{_values::2}% is not a valid item. Error: %last parse error%" to {_player}
				else:
					message "&c%{_values::2}% is not a valid item." to {_player}
				stop
			chance of {_chance}%:
				{_block} is not {_item}
				set {_block} to {_item}
	else:
		loop {_text} split at ";":
			clear {_values::*}, {_chance} and {_item}
			set {_values::*} to loop-value split at "%%"
			set {_chance} to {_values::1} parsed as number
			if {_chance} is not set:
				if parse error is set:
					message "&c%{_values::1}% is not a valid number. Error: %last parse error%" to {_player}
				else:
					message "&c%{_values::1}% is not a valid number." to {_player}
				stop
			set {_item} to {_values::2} parsed as item
			if {_item} is not set:
				if parse error is set:
					message "&c%{_values::2}% is not a valid item. Error: %last parse error%" to {_player}
				else:
					message "&c%{_values::2}% is not a valid item." to {_player}
				stop
			loop {_chance} times:
				add {_item} to {_list::*}
		set block at {_location} to random item out of {_list::*}
	set {skript-edit::temp::player::%{_player}%::complete} to now
	set {_block} to block at {_location}
	add type of {_block} to {skript-edit::player::%{_uuid}%::redo::%{_session}%::blocks::*}
	add block data of {_block} to {skript-edit::player::%{_uuid}%::redo::%{_session}%::data::*}
	add {_location} to {skript-edit::player::%{_uuid}%::redo::%{_session}%::locations::*}

command //pos1:
	permission: skript-edit.position
	aliases: //position1
	trigger:
		set {skript-edit::temp::player::%player%::pos1} to location of block at player
		message "&eYou have set position 1 to %{skript-edit::temp::player::%player%::pos1}%"

command //pos2:
	permission: skript-edit.position
	aliases: //position2
	trigger:
		set {skript-edit::temp::player::%player%::pos2} to location of block at player
		message "&eYou have set position 2 to %{skript-edit::temp::player::%player%::pos2}%"

command //set <text>:
	permission: skript-edit.set
	trigger:
		if {skript-edit::temp::player::%player%::pos1} is not set:
			message "&cYou don't have position 1 set."
			stop
		if {skript-edit::temp::player::%player%::pos2} is not set:
			message "&cYou don't have position 2 set."
			stop
		set {_time} and {_timeout} to now
		set {_session} to 1
		while {skript-edit::player::%uuid of player%::session::%{_session}%::*} is set:
			add 1 to {_session}
		loop blocks within {skript-edit::temp::player::%player%::pos1} to {skript-edit::temp::player::%player%::pos2}:
			if {skript-edit::temp::player::%player%::select::*} is set:
				if {skript-edit::temp::player::%player%::select::*} contains type of loop-block:
					clear {skript-edit::temp::player::%player%::complete}
					setBlock({_session}, player, location of loop-block, argument)
					if {skript-edit::temp::player::%player%::complete} is not set:
						stop
					add 1 to {_count}
			else:
				clear {skript-edit::temp::player::%player%::complete}
				setBlock({_session}, player, location of loop-block, argument)
				if {skript-edit::temp::player::%player%::complete} is not set:
					stop
				add 1 to {_count}
			if difference between {_timeout} and now is greater than {@time-delay}:
				wait a tick
				set {_timeout} to now
			if {skript-edit::temp::player::%player%::cancel} is set:
				delete {skript-edit::temp::player::%player%::cancel}
				stop
		message "&6%{_count}% &eblocks have been changed in %difference between {_time} and now%&e."

command //replace <item> <text>:
	permission: skript-edit.replace
	trigger:
		if {skript-edit::temp::player::%player%::pos1} is not set:
			message "&cYou don't have position 1 set."
			stop
		if {skript-edit::temp::player::%player%::pos2} is not set:
			message "&cYou don't have position 2 set."
			stop
		set {skript-edit::temp::player::%player%::select::*} to argument-1
		execute player command "//set %argument-2%"

command //sel [<items>]:
	permission: skript-edit.select
	usage: Selects blocks in the cuboid to modify.
	aliases: //sel
	trigger:
		if argument-1 is not set:
			delete {skript-edit::temp::player::%player%::select::*}
			message "&cSelection has been cleared."
			stop
		set {skript-edit::temp::player::%player%::select::*} to argument
		message "&eYou have set the selection to %{skript-edit::temp::player::%player%::select::*}%"

command //undo [<number>] [<offlineplayer>]:
	trigger:
		set {_uuid} to uuid of player
		if argument-2 is set:
			if player doesn't have permission "skript-edit.undo.others":
				message "&cYou don't have permission to undo others edits."
				stop
			set {_uuid} to uuid of argument-2
		if argument-1 is not set:
			set {_count} to 1
		else:
			set {_count} to argument-1
		set {_last} to last element out of indices of {skript-edit::player::%{_uuid}%::undo::*} parsed as number
		add 1 to {_last}
		loop {_count} times:
			set {_session} to {_last} - loop-number
			{skript-edit::player::%{_uuid}%::undo::%{_session}%::*} is set
			set {_time} and {_timeout} to now
			loop size of {skript-edit::player::%{_uuid}%::undo::%{_session}%::locations::*} times:
				set {_block} to block at {skript-edit::player::%{_uuid}%::undo::%{_session}%::locations::%loop-number-2%}
				set block at {_block} to {skript-edit::player::%{_uuid}%::undo::%{_session}%::blocks::%loop-number-2%}
				set block data of block at {_block} to {skript-edit::player::%{_uuid}%::undo::%{_session}%::data::%loop-number-2%}
				add 1 to {_count}
				if difference between {_timeout} and now is greater than {@time-delay}:
					wait a tick
					set {_timeout} to now
				if {skript-edit::temp::player::%player%::cancel} is set:
					delete {skript-edit::temp::player::%player%::cancel}
					stop
		message "&eActions have been reverted. &6%{_count}% &eblocks in %difference between {_time} and now%&e."

command //redo [<number>] [<offlineplayer>]:
	trigger:
		set {_uuid} to uuid of player
		if argument-2 is set:
			if player doesn't have permission "skript-edit.redo.others":
				message "&cYou don't have permission to redo others edits."
				stop
			set {_uuid} to uuid of argument-2
		if argument-1 is not set:
			set {_count} to 1
		else:
			set {_count} to argument-1
		set {_session} to last element out of indices of {skript-edit::player::%{_uuid}%::redo::*} parsed as number
		loop {_count} times:
			{skript-edit::player::%{_uuid}%::redo::%{_session}%::*} is set
			set {_time} and {_timeout} to now
			loop size of {skript-edit::player::%{_uuid}%::redo::%{_session}%::locations::*} times:
				set {_block} to block at {skript-edit::player::%{_uuid}%::redo::%{_session}%::locations::%loop-number-2%}
				set block at {_block} to {skript-edit::player::%{_uuid}%::redo::%{_session}%::blocks::%loop-number-2%}
				set block data of block at {_block} to {skript-edit::player::%{_uuid}%::redo::%{_session}%::data::%loop-number-2%}
				add 1 to {_count}
				if difference between {_timeout} and now is greater than {@time-delay}:
					wait a tick
					set {_timeout} to now
				if {skript-edit::temp::player::%player%::cancel} is set:
					delete {skript-edit::temp::player::%player%::cancel}
					stop
			subtract 1 from {_session}
		message "&eActions have been redone. &6%{_count}% &eblocks in %difference between {_time} and now%&e."

command //cancel:
	trigger:
		set {skript-edit::temp::player::%player%::cancel} to true
		message "&cCancelling current session."

command //wand:
	permission: skript-edit.wand
	trigger:
		add a blaze rod named "&5Edit wand" with lore "&aLeft-click &7to select a pos1", "&6Right-click &7to select pos2", "&7Doing so from a distance will yield a distance selection.", "" and "&fYour goal is to make a cuboid with the two block locations" to player
		message "&5You have been given an edit Wand."

on right click with a blaze rod:
	player has permission "skript-edit.wand"
	name of event-item is "&5Edit wand"
	cancel event
	if clicked block is not set:
		target block is set
		set {skript-edit::temp::player::%player%::pos2} to location of target block
		message "&eYou have set position 2 to %{skript-edit::temp::player::%player%::pos2}%"
	else:
		set {skript-edit::temp::player::%player%::pos2} to location of clicked block
		message "&eYou have set position 2 to %{skript-edit::temp::player::%player%::pos2}%"

on left click with a blaze rod:
	player has permission "skript-edit.wand"
	name of event-item is "&5Edit wand"
	cancel event
	if clicked block is not set:
		target block is set
		set {skript-edit::temp::player::%player%::pos1} to location of target block
		message "&eYou have set position 1 to %{skript-edit::temp::player::%player%::pos1}%"
	else:
		set {skript-edit::temp::player::%player%::pos1} to location of clicked block
		message "&eYou have set position 1 to %{skript-edit::temp::player::%player%::pos1}%"