# Positive X = East; Negative X = West;
# Positive Z = South; Negative Z = North;
options:
wand: iron sword of unbreaking 10 named "&f&lSelection Wand"
on join:
clear {playerdata::%player%::blockhistory::*}
# Clears and removes variables from particles for safety
if {playerdata::%player%::visualizer::pointA} is set:
set {_temp::*} to split "ABCDEFGHIJKL" at ""
loop {_temp::*}:
stopEffect "selectionvisualizer::pointA::%loop-value%::%player%"
clear {playerdata::%player%::visualizer::pointB}
if {playerdata::%player%::visualizer::pointB} is set:
set {_temp::*} to split "ABCDEFGHIJKL" at ""
loop {_temp::*}:
stopEffect "selectionvisualizer::pointB::%loop-value%::%player%"
clear {playerdata::%player%::visualizer::pointB}
on quit:
clear {playerdata::%player%::blockhistory::*}
# Clears and removes variables from particles for safety
if {playerdata::%player%::visualizer::pointA} is set:
set {_temp::*} to split "ABCDEFGHIJKL" at ""
loop {_temp::*}:
stopEffect "selectionvisualizer::pointA::%loop-value%::%player%"
clear {playerdata::%player%::visualizer::pointB}
if {playerdata::%player%::visualizer::pointB} is set:
set {_temp::*} to split "ABCDEFGHIJKL" at ""
loop {_temp::*}:
stopEffect "selectionvisualizer::pointB::%loop-value%::%player%"
clear {playerdata::%player%::visualizer::pointB}
on leftclick:
if player's tool is {@wand}:
if clicked block is not air:
# Sets a point with a visual effect
set {playerdata::%player%::pointA} to location of clicked block
drawLine particle redstone, RGB 10, 0, 255, center location of block 1 north 1 west of clicked block, target location of block 1 north 1 east of clicked block, id "selectionvisualizer::pointA::A::%player%", onlyFor player, rainbowMode false, solid true, density 5, length 2, zigZag count 0, height 0, visibleRange 32, displacementXYZ 0, 2, 0, pulseDelay 1
drawLine particle redstone, RGB 10, 0, 255, center location of block 1 north 1 east of clicked block, target location of block 1 south 1 east of clicked block, id "selectionvisualizer::pointA::B::%player%", onlyFor player, rainbowMode false, solid true, density 5, length 2, zigZag count 0, height 0, visibleRange 32, displacementXYZ 0, 2, 0, pulseDelay 1
drawLine particle redstone, RGB 10, 0, 255, center location of block 1 south 1 east of clicked block, target location of block 1 south 1 west of clicked block, id "selectionvisualizer::pointA::C::%player%", onlyFor player, rainbowMode false, solid true, density 5, length 2, zigZag count 0, height 0, visibleRange 32, displacementXYZ 0, 2, 0, pulseDelay 1
drawLine particle redstone, RGB 10, 0, 255, center location of block 1 south 1 west of clicked block, target location of block 1 north 1 west of clicked block, id "selectionvisualizer::pointA::D::%player%", onlyFor player, rainbowMode false, solid true, density 5, length 2, zigZag count 0, height 0, visibleRange 32, displacementXYZ 0, 2, 0, pulseDelay 1
drawLine particle redstone, RGB 10, 0, 255, center location of block 1 north 1 west of clicked block, target location of block above clicked block, id "selectionvisualizer::pointA::E::%player%", onlyFor player, rainbowMode false, solid true, density 5, length 2, zigZag count 0, height 0, visibleRange 32, displacementXYZ 0, 2, 0, pulseDelay 1
drawLine particle redstone, RGB 10, 0, 255, center location of block 1 north 1 east of clicked block, target location of block above clicked block, id "selectionvisualizer::pointA::F::%player%", onlyFor player, rainbowMode false, solid true, density 5, length 2, zigZag count 0, height 0, visibleRange 32, displacementXYZ 0, 2, 0, pulseDelay 1
drawLine particle redstone, RGB 10, 0, 255, center location of block 1 south 1 east of clicked block, target location of block above clicked block, id "selectionvisualizer::pointA::G::%player%", onlyFor player, rainbowMode false, solid true, density 5, length 2, zigZag count 0, height 0, visibleRange 32, displacementXYZ 0, 2, 0, pulseDelay 1
drawLine particle redstone, RGB 10, 0, 255, center location of block 1 south 1 west of clicked block, target location of block above clicked block, id "selectionvisualizer::pointA::H::%player%", onlyFor player, rainbowMode false, solid true, density 5, length 2, zigZag count 0, height 0, visibleRange 32, displacementXYZ 0, 2, 0, pulseDelay 1
drawLine particle redstone, RGB 10, 0, 255, center location of block 1 north 1 west of clicked block, target location of block below clicked block, id "selectionvisualizer::pointA::I::%player%", onlyFor player, rainbowMode false, solid true, density 5, length 2, zigZag count 0, height 0, visibleRange 32, displacementXYZ 0, 2, 0, pulseDelay 1
drawLine particle redstone, RGB 10, 0, 255, center location of block 1 north 1 east of clicked block, target location of block below clicked block, id "selectionvisualizer::pointA::J::%player%", onlyFor player, rainbowMode false, solid true, density 5, length 2, zigZag count 0, height 0, visibleRange 32, displacementXYZ 0, 2, 0, pulseDelay 1
drawLine particle redstone, RGB 10, 0, 255, center location of block 1 south 1 east of clicked block, target location of block below clicked block, id "selectionvisualizer::pointA::K::%player%", onlyFor player, rainbowMode false, solid true, density 5, length 2, zigZag count 0, height 0, visibleRange 32, displacementXYZ 0, 2, 0, pulseDelay 1
drawLine particle redstone, RGB 10, 0, 255, center location of block 1 south 1 west of clicked block, target location of block below clicked block, id "selectionvisualizer::pointA::L::%player%", onlyFor player, rainbowMode false, solid true, density 5, length 2, zigZag count 0, height 0, visibleRange 32, displacementXYZ 0, 2, 0, pulseDelay 1
set {playerdata::%player%::visualizer::pointA} to now
send "&7(&a!&7) &7Set point &aA&7 at location <tooltip:Click to teleport to this location.><cmd:/sktp %player% %x-coord of clicked block% %y-coord of clicked block% %z-coord of clicked block% %world of clicked block%>&f(%location of clicked block%)." to player
on rightclick:
if player's tool is {@wand}:
if clicked block is not air:
# Sets a point with a visual effect
set {playerdata::%player%::pointB} to location of clicked block
drawLine particle redstone, RGB 255, 0, 10, center location of block 1 north 1 west of clicked block, target location of block 1 north 1 east of clicked block, id "selectionvisualizer::pointB::A::%player%", onlyFor player, rainbowMode false, solid true, density 5, length 2, zigZag count 0, height 0, visibleRange 32, displacementXYZ 0, 2, 0, pulseDelay 1
drawLine particle redstone, RGB 255, 0, 10, center location of block 1 north 1 east of clicked block, target location of block 1 south 1 east of clicked block, id "selectionvisualizer::pointB::B::%player%", onlyFor player, rainbowMode false, solid true, density 5, length 2, zigZag count 0, height 0, visibleRange 32, displacementXYZ 0, 2, 0, pulseDelay 1
drawLine particle redstone, RGB 255, 0, 10, center location of block 1 south 1 east of clicked block, target location of block 1 south 1 west of clicked block, id "selectionvisualizer::pointB::C::%player%", onlyFor player, rainbowMode false, solid true, density 5, length 2, zigZag count 0, height 0, visibleRange 32, displacementXYZ 0, 2, 0, pulseDelay 1
drawLine particle redstone, RGB 255, 0, 10, center location of block 1 south 1 west of clicked block, target location of block 1 north 1 west of clicked block, id "selectionvisualizer::pointB::D::%player%", onlyFor player, rainbowMode false, solid true, density 5, length 2, zigZag count 0, height 0, visibleRange 32, displacementXYZ 0, 2, 0, pulseDelay 1
drawLine particle redstone, RGB 255, 0, 10, center location of block 1 north 1 west of clicked block, target location of block above clicked block, id "selectionvisualizer::pointB::E::%player%", onlyFor player, rainbowMode false, solid true, density 5, length 2, zigZag count 0, height 0, visibleRange 32, displacementXYZ 0, 2, 0, pulseDelay 1
drawLine particle redstone, RGB 255, 0, 10, center location of block 1 north 1 east of clicked block, target location of block above clicked block, id "selectionvisualizer::pointB::F::%player%", onlyFor player, rainbowMode false, solid true, density 5, length 2, zigZag count 0, height 0, visibleRange 32, displacementXYZ 0, 2, 0, pulseDelay 1
drawLine particle redstone, RGB 255, 0, 10, center location of block 1 south 1 east of clicked block, target location of block above clicked block, id "selectionvisualizer::pointB::G::%player%", onlyFor player, rainbowMode false, solid true, density 5, length 2, zigZag count 0, height 0, visibleRange 32, displacementXYZ 0, 2, 0, pulseDelay 1
drawLine particle redstone, RGB 255, 0, 10, center location of block 1 south 1 west of clicked block, target location of block above clicked block, id "selectionvisualizer::pointB::H::%player%", onlyFor player, rainbowMode false, solid true, density 5, length 2, zigZag count 0, height 0, visibleRange 32, displacementXYZ 0, 2, 0, pulseDelay 1
drawLine particle redstone, RGB 255, 0, 10, center location of block 1 north 1 west of clicked block, target location of block below clicked block, id "selectionvisualizer::pointB::I::%player%", onlyFor player, rainbowMode false, solid true, density 5, length 2, zigZag count 0, height 0, visibleRange 32, displacementXYZ 0, 2, 0, pulseDelay 1
drawLine particle redstone, RGB 255, 0, 10, center location of block 1 north 1 east of clicked block, target location of block below clicked block, id "selectionvisualizer::pointB::J::%player%", onlyFor player, rainbowMode false, solid true, density 5, length 2, zigZag count 0, height 0, visibleRange 32, displacementXYZ 0, 2, 0, pulseDelay 1
drawLine particle redstone, RGB 255, 0, 10, center location of block 1 south 1 east of clicked block, target location of block below clicked block, id "selectionvisualizer::pointB::K::%player%", onlyFor player, rainbowMode false, solid true, density 5, length 2, zigZag count 0, height 0, visibleRange 32, displacementXYZ 0, 2, 0, pulseDelay 1
drawLine particle redstone, RGB 255, 0, 10, center location of block 1 south 1 west of clicked block, target location of block below clicked block, id "selectionvisualizer::pointB::L::%player%", onlyFor player, rainbowMode false, solid true, density 5, length 2, zigZag count 0, height 0, visibleRange 32, displacementXYZ 0, 2, 0, pulseDelay 1
set {playerdata::%player%::visualizer::pointB} to now
send "&7(&a!&7) &7Set point &aB&7 at location <tooltip:Click to teleport to this location.><cmd:/sktp %player% %x-coord of clicked block% %y-coord of clicked block% %z-coord of clicked block% %world of clicked block%>&f(%location of clicked block%)." to player
every second:
loop all players:
# Clearing visual effects
if {playerdata::%loop-player%::visualizer::pointA} is set:
if difference between {playerdata::%loop-player%::visualizer::pointA} and now > 3 seconds:
set {_temp::*} to split "ABCDEFGHIJKL" at ""
loop {_temp::*}:
stopEffect "selectionvisualizer::pointA::%loop-value-2%::%loop-player%"
clear {playerdata::%loop-player%::visualizer::pointA}
if {playerdata::%loop-player%::visualizer::pointB} is set:
if difference between {playerdata::%loop-player%::visualizer::pointB} and now > 3 seconds:
set {_temp::*} to split "ABCDEFGHIJKL" at ""
loop {_temp::*}:
stopEffect "selectionvisualizer::pointB::%loop-value-2%::%loop-player%"
clear {playerdata::%loop-player%::visualizer::pointB}
command /sktp [<player>] [<number>] [<number>] [<number>] [<text>]:
permission: skript.selection
trigger:
set {_w} to world("%arg-5%")
teleport arg-1 to location(arg-2, arg-3, arg-4, {_w})
command /manualselection [<text>] [<number>] [<number>] [<number>] [<text>]:
permission: skript.selection
trigger:
if arg-1 = "pointA":
arg-2 is set
arg-3 is set
arg-4 is set
if arg-5 is set:
set {_w} to world("%arg-5%")
set {playerdata::%player%::pointA} to location(arg-2, arg-3, arg-4, {_w})
send "&7(&a!&7) &7Set point &aA&7 at location <tooltip:Click to teleport to this location.><cmd:/sktp %player% %x-coord of {playerdata::%player%::pointA}% %y-coord of {playerdata::%player%::pointA}% %z-coord of {playerdata::%player%::pointA}% %world of {playerdata::%player%::pointA}%>&f(%location of {playerdata::%player%::pointA}%)." to player
else:
send "&7(&a!&7) Usage /manualselection (pointA/pointB) (x) (y) (z) (world)" to player
if arg-1 = "pointB":
arg-2 is set
arg-3 is set
arg-4 is set
if arg-5 is set:
set {_w} to world("%arg-5%")
set {playerdata::%player%::pointB} to location(arg-2, arg-3, arg-4, {_w})
send "&7(&a!&7) &7Set point &aB&7 at location <tooltip:Click to teleport to this location.><cmd:/sktp %player% %x-coord of {playerdata::%player%::pointB}% %y-coord of {playerdata::%player%::pointB}% %z-coord of {playerdata::%player%::pointB}% %world of {playerdata::%player%::pointB}%>&f(%location of {playerdata::%player%::pointB}%)." to player
else:
send "&7(&a!&7) Usage /manualselection (pointA/pointB) (x) (y) (z) (world)" to player
else:
send "&7(&a!&7) Usage /manualselection (pointA/pointB) (x) (y) (z) (world)" to player
command /selection [<text>] [<number>] [<text>]:
permission: skript.selection
trigger:
if arg-1 is "wand":
give {@wand} to player
if arg-1 is "analyze":
if arg-2 is not set:
if arg-3 is not set:
send "&7(&a!&7) &7Usage /selection analyze (number) &nor&7 (slow/normal/fast)" to player
if arg-2 is a number:
if arg-2 >= 150:
send "&7(&a!&7) &7Unsafe value input. This input will loop &f150 &7blocks per &fTICK&7." to player
if arg-2 < 150:
analyzeSelection(player, {playerdata::%player%::pointA}, {playerdata::%player%::pointB}, arg-2)
if arg-3 is "ultraslow":
analyzeSelection(player, {playerdata::%player%::pointA}, {playerdata::%player%::pointB}, 1)
if arg-3 is "slow":
analyzeSelection(player, {playerdata::%player%::pointA}, {playerdata::%player%::pointB}, 10)
if arg-3 is "normal":
analyzeSelection(player, {playerdata::%player%::pointA}, {playerdata::%player%::pointB}, 20)
if arg-3 is "fast":
analyzeSelection(player, {playerdata::%player%::pointA}, {playerdata::%player%::pointB}, 30)
if arg-3 is "ultrafast":
analyzeSelection(player, {playerdata::%player%::pointA}, {playerdata::%player%::pointB}, 50)
if arg-1 is "history":
if {playerdata::%player%::blockhistory::*} is set:
send "&8-----------------------------------------------------" to player
loop {playerdata::%player%::blockhistory::*}:
send "&7➥ &f%loop-index%: &7%loop-value%" to player
send "&8-----------------------------------------------------" to player
if {playerdata::%player%::blockhistory::*} is not set:
send "&8-----------------------------------------------------" to player
send "&8&7➥ &fNo blocks loaded in history!" to player
send "&8-----------------------------------------------------" to player
function analyzeSelection(p: player, pointA: location, pointB: location, speed: number):
if world of {_pointA} != world of {_pointB}:
send "&7&l(&5&l!&7&l)&7 Points are located in two different worlds!" to {_p}
stop
clear {playerdata::%{_p}%::blockhistory::*}
set {_time} to now
set {_world} to world of {_pointA}
# Takes given locations and finds new fixed cuboid points
set {_x1} to floor(x-coordinate of {_pointA})
set {_y1} to floor(y-coordinate of {_pointA})
set {_z1} to floor(z-coordinate of {_pointA})
set {_x2} to floor(x-coordinate of {_pointB})
set {_y2} to floor(y-coordinate of {_pointB})
set {_z2} to floor(z-coordinate of {_pointB})
if {_z1} > {_z2}:
set {_northZ} to {_z2}
set {_southZ} to {_z1}
if {_z1} < {_z2}:
set {_northZ} to {_z1}
set {_southZ} to {_z2}
if {_x1} > {_x2}:
set {_eastX} to {_x1}
set {_westX} to {_x2}
if {_x1} < {_x2}:
set {_eastX} to {_x2}
set {_westX} to {_x1}
if {_y1} > {_y2}:
set {_highestY} to {_y1}
set {_lowestY} to {_y2}
if {_y1} < {_y2}:
set {_highestY} to {_y2}
set {_lowestY} to {_y1}
if {_x1} = {_x2}:
set {_eastX} to {_x1}
set {_westX} to {_x1}
if {_y1} = {_y2}:
set {_highestY} to {_y1}
set {_lowestY} to {_y1}
if {_z1} = {_z2}:
set {_northZ} to {_z1}
set {_southZ} to {_z1}
# Sets optimal cuboid selection points based off input locations
set {_fixedpointA} to location({_westX}, {_lowestY}, {_southZ}, {_world})
set {_fixedpointB} to location({_eastX}, {_highestY}, {_northZ}, {_world})
broadcast "&7(&a!&7) &7Analyzing..."
# Adds the first block because it starts at this one...
set {_currentlocation} to {_fixedpointA}
add 1 to {_blockcount}
set {_loopX} to {_westX}
set {_loopY} to {_lowestY}
set {_loopZ} to {_southZ}
set {_block} to "%block at {_currentlocation}%"
add 1 to {playerdata::%{_p}%::blockhistory::%{_block}%}
add 1 to {_lagcounter}
# Loops the south-western-lowest most block until the it reaches the north-western-highest most block
# Loops west to east, south to north, then up the Z coordinate
while {_currentlocation} != {_fixedpointB}:
# Lag measures...
if {_lagcounter} >= {_speed}:
clear {_lagcounter}
wait 1 tick
if {_loopX} != {_eastX}:
add 1 to {_blockcount}
add 1 to {_loopX}
set {_currentlocation} to location({_loopX}, {_loopY}, {_loopZ}, {_world})
set {_block} to "%block at {_currentlocation}%"
add 1 to {playerdata::%{_p}%::blockhistory::%{_block}%}
if {_loopX} = {_eastX}:
if {_loopZ} != {_northZ}:
add 1 to {_blockcount}
add 1 to {_lagcounter}
set {_loopX} to {_westX}
remove 1 from {_loopZ}
set {_currentlocation} to location({_loopX}, {_loopY}, {_loopZ}, {_world})
set {_block} to "%block at {_currentlocation}%"
add 1 to {playerdata::%{_p}%::blockhistory::%{_block}%}
else if {_loopZ} = {_northZ}:
if {_loopY} < {_highestY}:
add 1 to {_blockcount}
add 1 to {_lagcounter}
set {_loopX} to {_westX}
set {_loopZ} to {_southZ}
add 1 to {_loopY}
set {_currentlocation} to location({_loopX}, {_loopY}, {_loopZ}, {_world})
set {_block} to "%block at {_currentlocation}%"
add 1 to {playerdata::%{_p}%::blockhistory::%{_block}%}
else if {_loopY} >= {_highestY}:
broadcast "&7(&a!&7) &7Finished analyzing blocks! Took &a%difference between {_time} and now% &7to analyze."
if {_currentlocation} = {_fixedpointB}:
send "&4█&c█&6█&e█&2█&a█&b█&9█&1█&d█&5█&4█&c█&6█&e█&2█&a█&b█&9█&1█&d█&5█&4█&c█&6█&e█&2█&a█&b█&9█&1█&d█&5█&4█&c█" to {_p}
send "&7➥ &fTotal blocks in selection: &7%{_blockcount}%" to {_p}
send "&7➥ &fDifferent types of blocks: &7%size of {playerdata::%{_p}%::blockhistory::*}%" to {_p}
send "&7➥ <tooltip:Click me!><cmd:/selection history>&7[Click to view types of blocks]" to {_p}
send "&4█&c█&6█&e█&2█&a█&b█&9█&1█&d█&5█&4█&c█&6█&e█&2█&a█&b█&9█&1█&d█&5█&4█&c█&6█&e█&2█&a█&b█&9█&1█&d█&5█&4█&c█" to {_p}
# Positive X = East; Negative X = West;
# Positive Z = South; Negative Z = North;