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}%"