#----- DiscoFloors, a script by PatoFrango -----# options: prefix: &e[DF] permission: discofloors on leftclick: {discoFloors::%player%::creating} is set player's tool is air cancel event set {discoFloors::%player%::pos::1} to location at clicked block send "{@prefix} &fFirst position set to (%x-pos of clicked block%, %y-pos of clicked block%, %z-pos of clicked block%)" on rightclick: {discoFloors::%player%::creating} is set player's tool is air cancel event set {discoFloors::%player%::pos::2} to location at clicked block send "{@prefix} &fSecond position set to (%x-pos of clicked block%, %y-pos of clicked block%, %z-pos of clicked block%)" command /discofloor [] [] []: aliases: /df permission: {@permission} trigger: if arg-1 is "create": send "{@prefix} &fDisco floor creation mode: &aON" set {discoFloors::%player%::creating} to true else if arg-1 is "off" or "exit" or "false": send "{@prefix} &fDisco floor creation mode: &cOFF" delete {discoFloors::%player%::*} else if arg-1 is "list": discoFloorList(player) else if arg-1 is "stopall": send "{@prefix} &fStopped all disco floors." loop {discoFloorIDs::*}: discoFloorStop(loop-value) else if arg-1 is "startall": send "{@prefix} &fStarted all disco floors." loop {discoFloorIDs::*}: discoFloorStart(loop-value) else if arg-1 is "set": if {discoFloors::%player%::creating} is not set: send "{@prefix} &cDo &e/df create &cto enter the disco floor editor!" stop arg-2, arg-3, arg-4 are set set {_speed} to arg-3 parsed as number {_speed} is a number # to make sure there wasn't a parsing error if discoFloorExists(arg-2) is false: set {_blocks::*} to discoFloorChangeBlocksFromString(arg-4) discoFloorCreate(arg-2, {discoFloors::%player%::pos::1}, {discoFloors::%player%::pos::2}, {_speed}, {_blocks::*}) delete {discoFloors::%player%::creating} and {discoFloors::%player%::pos::*} send "{@prefix} &fSuccessfully created disco floor &a%arg-2%&f!" else: send "{@prefix} &cThe disco floor &e%arg-2% &calready exists." else if arg-2 is not set: send "{@prefix} &cPlease specify the name of the disco floor." else if discoFloorExists(arg-2) is false: send "{@prefix} &cThe disco floor &e%arg-2% &cdoesn't exist." else if arg-1 is "remove" or "delete": send "{@prefix} &fDeleted disco floor &e%arg-2%" discoFloorDelete(arg-2) else if arg-1 is "start": if discoFloorIsPlaying(arg-2) is false: send "{@prefix} &fStarted disco floor &e%arg-2%" discoFloorStart(arg-2) else: send "{@prefix} &cThe disco floor &e%arg-2% &cis already playing." else if arg-1 is "stop": if discoFloorIsPlaying(arg-2) is true: send "{@prefix} &fStopped disco floor &e%arg-2%" discoFloorStop(arg-2) else: send "{@prefix} &cThe disco floor &e%arg-2% &cis not playing." else if arg-1 is "changeblocks": set {_blocks::*} to discoFloorChangeBlocksFromString(arg-3) send "{@prefix} &fChanged disco floor blocks of &e%arg-2% &fto &a%{_blocks::*}%" discoFloorChangeBlocks(arg-2, {_blocks::*}) else: send "{@prefix} &cUnknown arguments." function discoFloorList(p: player): loop {discoFloorIDs::*}: set {_size} to size of {discoFloorsDB::%loop-value%::locs::*} set {_pos1} to {discoFloorsDB::%loop-value%::pos1} set {_pos2} to {discoFloorsDB::%loop-value%::pos2} add "&e%loop-value%&f" to {_floors::*} send "{@prefix} &fList of created disco floors (hover over names for details): %{_floors::*}%" to {_p} on quit: delete {discoFloors::%player%::*} on skript start: loop {discoFloorIDs::*}: {discoFloorsDB::%loop-value%::playing} is set delete {discoFloorsDB::%loop-value%::playing} discoFloorStart(loop-value) on skript stop: delete {discoFloors::*} #----- API -----# function discoGetArea(pos1: location, pos2: location) :: locations: loop integers between floor(y-pos of {_pos1}) and floor(y-pos of {_pos2}): loop integers between floor(z-pos of {_pos1}) and floor(z-pos of {_pos2}): loop integers between floor(x-pos of {_pos1}) and floor(x-pos of {_pos2}): set {_loc} to location at loop-value-3, loop-value-1, loop-value-2 in world of {_pos1} add {_loc} to {_locs::*} return {_locs::*} function discoFloorCreate(id: text, pos1: location, pos2: location, speed: number, blocks: objects): add {_id} to {discoFloorIDs::*} set {discoFloorsDB::%{_id}%::locs::*} to discoGetArea({_pos1}, {_pos2}) discoFloorChangeBlocks({_id}, {_blocks::*}) set {discoFloorsDB::%{_id}%::speed} to {_speed} set {discoFloorsDB::%{_id}%::pos1} to {_pos1} set {discoFloorsDB::%{_id}%::pos2} to {_pos2} discoFloorStart({_id}) function discoFloorStart(id: text): discoFloorIsPlaying({_id}) is false set {discoFloorsDB::%{_id}%::playing} to true while {discoFloorsDB::%{_id}%::playing} is set: set {_times} to {discoFloorsDB::%{_id}%::speed} / 0.1 loop {discoFloorsDB::%{_id}%::locs::*}: set {_blocks::*} to {discoFloorsDB::%{_id}%::blocks::*} set {_block} to random element out of {_blocks::*} make all players where [world of input is world of loop-value] see block at loop-value as {_block} loop {_times} times: if {discoFloorsDB::%{_id}%::playing} is not set: stop loop wait 0.1 second function discoFloorStop(id: text): loop {discoFloorsDB::%{_id}%::locs::*}: make all players where [world of input is world of loop-value] see block at loop-value-1 as block at loop-value-1 delete {discoFloorsDB::%{_id}%::playing} function discoFloorExists(id: text) :: boolean: if {discoFloorsDB::%{_id}%::*} is set: return true return false function discoFloorIsPlaying(id: text) :: boolean: if {discoFloorsDB::%{_id}%::playing} is set: return true return false function discoFloorDelete(id: text): discoFloorStop({_id}) remove {_id} from {discoFloorIDs::*} delete {discoFloorsDB::%{_id}%::*} function discoFloorChangeBlocksFromString(string: text) :: items: set {_blocks::*} to {_string} split at "," set {_blocks::*} to discoFloorPreset({_blocks::*}) loop {_blocks::*}: set {_blocks::%loop-index%} to {_blocks::%loop-index%} parsed as item return {_blocks::*} function discoFloorPreset(blocks: objects) :: objects: if {_blocks::1} is "rainbow": return light green glass block, orange glass block, red glass block, light blue glass block, yellow glass block, white glass block and pink glass block return {_blocks::*} function discoFloorChangeBlocks(id: text, blocks: objects): {discoFloorsDB::%{_id}%::*} is set set {_blocks::*} to discoFloorPreset({_blocks::*}) set {discoFloorsDB::%{_id}%::blocks::*} to {_blocks::*} function discoFloorChangeWorld(id: text, world: world): loop {discoFloorsDB::%{_id}%::locs::*}: set world of {discoFloorsDB::%{_id}%::locs::%loop-index%} to {_world} function discoFloorChangeSpeed(id: text, speed: number): set {discoFloorsDB::%{_id}%::speed} to {_speed}