123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328 |
- msg("dev", "Fractal_Maker has started.");
- event.load("block_place");
- event.load("block_break");
- event.load("item_air_click");
- event.load("chat");
- Undo_Map = map.new();
- built = false;
- FractalHelpMap = map.new();
- fractal.help_register("§e§lFractal§6§lPlace", "to start placing the pattern");
- fractal.help_register("§e§lFractal§6§lStart", "to start generating the fractal");
- fractal.help_register("§e§lFractal§6§lBuildHere", "to place the fractal at current location");
- fractal.help_register("§e§lFractal§6§lNew", "to start again");
- fractal.help_register("§e§lFractal§6§lUndo", "to undo placing your last fractal");
- fractal.help_register("§e§lFractal§6§lRedo", "to redo placing your last fractal");
- fractal.help_register("§e§lFractal§6§lIter", "to set the amount of iterations with km:digits");
- fractal.help_register("§e§lFractal§6§lPause", "to stop fractal/fractal-pattern placement");
- fractal.help_register("§e§lFractal§6§lResume", "to unpause");
- @Start
- Blocks = map.new();
- Block_Coords = list.new();
- Coords_X = list.new();
- Coords_Y = list.new();
- Coords_Z = list.new();
- start = false;
- build = false;
- set_iter = false;
- iterations = 3;
- pause = false;
- @wait
- wait();
- if(player.getname(player) == "SirTerence7"){
- ignoreGoto(event);
- }
- goto("wait");
- @block_place
- if(start && !pause){
- cancel=false;
- map.add(Blocks, block_loc, block_type);
- list.add(Block_Coords, block_loc);
- }
- elseif(build){
- cancel = true;
- player_loc = block_loc;
- goto("place_fractal");
- }
- goto("wait");
- @block_break
- if(start && !pause){
- if(map.contains(Blocks, block_loc)){
- cancel = false;
- map.remove(Blocks, block_loc);
- list.remove(Block_Coords, block_loc);
- }else{
- cancel = true;
- }
- }
- elseif(start && pause){
- if(map.contains(Blocks, block_loc)){
- cancel = true;
- }
- }
- goto("wait");
- @item_air_click
- if(set_iter){
- set_iter = false;
- Hand_Item = item.getType(entity.getEquip(player, "hand"));
- OffHand_Item = item.getType(entity.getEquip(player, "offhand"));
- old_iterations = iterations;
- if(Hand_Item == "km:digit_2" || OffHand_Item == "km:digit_2"){
- iterations = 2;
- }elseif(Hand_Item == "km:digit_3" || OffHand_Item == "km:digit_3"){
- iterations = 3;
- }elseif(Hand_Item == "km:digit_4" || OffHand_Item == "km:digit_4"){
- iterations = 4;
- }elseif(Hand_Item == "km:digit_5" || OffHand_Item == "km:digit_5"){
- iterations = 5;
- }elseif(Hand_Item == "km:digit_6" || OffHand_Item == "km:digit_6"){
- iterations = 6;
- }elseif(Hand_Item == "km:digit_7" || OffHand_Item == "km:digit_7"){
- iterations = 7;
- }else{
- goto("wait");
- }
- msg(player, "iterations set to: ", iterations);
- if(old_iterations != iterations && build){
- goto("iter_jump");
- }
- build = true;
- }
- goto("wait");
- @chat
- if(text.contains(message, "fractal")){
- ignoreGoto(message);
- }
- goto("wait");
- @fractalhelp
- temp = map.iterator(FractalHelpMap);
- while(hasNext(temp)){
- temp_key = map.getKey(next(temp));
- temp_value = map.get(FractalHelpMap, temp_key);
- fractal_command = text.hover(text.click(temp_key, temp_value), temp_value);
- msg(player, fractal_command);
- }
- cancel = true;
- goto("wait");
- @fractalplace
- cancel = true;
- msg(player, "You can place the pattern now.");
- start = true;
- goto("wait");
- @fractalstart
- cancel = true;
- if(start && map.getSize(Blocks) > 1){
- msg(player, "The Fractal will start generating now");
- @iter_jump
- loc = loc.getWorld(entity.getLocation(player));
- Relative_Fractal = fractal.create(Block_Coords, loc, Blocks, 2, iterations+1, Block_Coords);
- build = true;
- start = false;
- pause = false;
- msg(player, "The Fractal has generated, place a block or type \"fractalbuildhere\" to place it.");
- }else{
- msg(player, "You have not yet made a pattern.");
- }
- goto("wait");
- @fractalbuildhere
- cancel = true;
- if(build){
- player_loc = entity.getLocation(player);
- @place_fractal
- redo_loc = player_loc;
- msg(player, "Fractal will now generate with ", iterations, " iterations.");
- Undo_Map = fractal.build(Relative_Fractal, player_loc, player);
- built = true;
- }else{
- msg(player, "You have not yet generated a fractal.");
- }
- goto("wait");
- @fractalnew
- cancel = true;
- msg(player, "Restarting");
- goto("Start");
- goto("wait");
- @fractalundo
- cancel = true;
- if(built && map.getSize(Undo_Map) > 1){
- msg(player, "Undoing");
- redo = true;
- built = false;
- fractal.undo(Undo_Map);
- }else{
- msg(player, "Nothing to undo");
- }
- goto("wait");
- @fractalredo
- if(redo){
- msg(player, "Redoing");
- fractal.build(Relative_Fractal, redo_loc, player);
- redo = false;
- built = true;
- }else{
- msg(player, "Nothing to redo");
- }
- goto("wait");
- @fractaliter
- if(build){
- msg(player, "Click with a digit from 2-7 in hand.");
- set_iter = true;
- }else{
- msg(player, "You need to place a pattern first.");
- }
- goto("wait");
- @fractalpause
- if(pause){
- msg(player, "You have already paused, type \"fractalresume\" to continue.");
- goto("wait");
- }else{
- pause = true;
- build = false;
- msg(player, "You have paused the fractal-placement.");
- }
- goto("wait");
- @fractalresume
- if(pause){
- pause = false;
- build = true;
- msg(player, "You can resume placing now.");
- }else{
- msg(player, "You have not paused.");
- }
- goto("wait");
- function fractal.create(Block_Coords, world, Blocks, iter, iterations, Last_Block_Coords){
- List_Size = list.getSize(Last_Block_Coords);
- Coords_X = list.new();
- Coords_Y = list.new();
- Coords_Z = list.new();
- New_Block_Coords = list.new();
- relative_blocks = map.new();
- for(a = 0; a < List_Size; a++){
- block_loc = list.getIndex(Last_Block_Coords, a);
- list.add(Coords_X, loc.getX(block_loc));
- list.add(Coords_Y, loc.getY(block_loc));
- list.add(Coords_Z, loc.getZ(block_loc));
- }
- list.sort(Coords_X);
- list.sort(Coords_Y);
- list.sort(Coords_Z);
- Min_X = list.getIndex(Coords_X, 0);
- Min_Y = list.getIndex(Coords_Y, 0);
- Min_Z = list.getIndex(Coords_Z, 0);
- X_Size = math.abs(Min_X - list.getIndex(Coords_X, list.getSize(Coords_X) - 1))+1;
- Y_Size = math.abs(Min_Y - list.getIndex(Coords_Y, list.getSize(Coords_Y) - 1))+1;
- Z_Size = math.abs(Min_Z - list.getIndex(Coords_Z, list.getSize(Coords_Z) - 1))+1;
- a3 = 0;
- for(a = 0; a < math.pow(X_Size,iter); a = a + X_Size){
- b3 = 0;
- for(b = 0; b < math.pow(Y_Size,iter); b = b + Y_Size){
- c3 = 0;
- for(c = 0; c < math.pow(Z_Size,iter); c = c + Z_Size){
- location = loc.new(world, Min_X + a3, Min_Y + b3, Min_Z + c3);
- if(list.contains(Block_Coords, location)){
- for(a2 = a; a2 < X_Size + a; a2++){
- for(b2 = b; b2 < Y_Size + b; b2++){
- for(c2 = c; c2 < Z_Size + c; c2++){
- loc_place = loc.new(world, Min_X + a2, Min_Y + b2, Min_Z + c2);
- rel_loc = loc.new(world, a2, b2, c2);
- loc_set = loc.new(world, Min_X + a2 - a, Min_Y + b2 - b, Min_Z + c2 - c);
- Block_to_set = map.getOrDefault(Blocks, loc_set, "minecraft:air");
- rand_temp = math.random(0,100);
- if(Block_to_set != "minecraft:air" && rand_temp > 3){
- list.add(New_Block_Coords, loc_place);
- map.add(relative_blocks, rel_loc, Block_to_set);
- }
- }
- }
- }
- }
- c3++;
- }
- b3++;
- }
- a3++;
- }
- iter++;
- if(iter < iterations){
- relative_blocks = fractal.create(New_Block_Coords, world, Blocks, iter, iterations, Last_Block_Coords);
- }
- return(relative_blocks);
- }
- function fractal.build(Fractal, Position, Player){
- stop = false;
- Pos_X = math.round(loc.getX(Position));
- Pos_Y = math.round(loc.getY(Position));
- Pos_Z = math.round(loc.getZ(Position));
- World = loc.getWorld(Position);
- Coords_for_Undo = map.new();
- Coords_List = list.new();
- iterator = map.iterator(Fractal);
- while(hasNext(iterator)){
- list.add(Coords_List, map.getKey(next(iterator)));
- }
- for(a = 0; a < list.getSize(Coords_List); a++){
- rel_loc = list.getIndex(Coords_List, a);
- Temp_X = Pos_X + loc.getX(rel_loc);
- Temp_Y = Pos_Y + loc.getY(rel_loc);
- Temp_Z = Pos_Z + loc.getZ(rel_loc);
- abs_loc = loc.new(World, Temp_X, Temp_Y, Temp_Z);
- if(!block.isAir(abs_loc) && abs_loc != Position){
- msg(Player, "Block is in the Way, cannot paste Fractal here.", block.getType(abs_loc));
- stop = true;
- a = list.getSize(Coords_List) + 1;
- }else{
- stop = false;
- }
- }
- if(!stop){
- for(a = 0; a < list.getSize(Coords_List); a++){
- rel_loc = list.getIndex(Coords_List, a);
- Temp_X = Pos_X + loc.getX(rel_loc);
- Temp_Y = Pos_Y + loc.getY(rel_loc);
- Temp_Z = Pos_Z + loc.getZ(rel_loc);
- abs_loc = loc.new(World, Temp_X, Temp_Y, Temp_Z);
- Block_to_set = map.getOrDefault(Fractal, rel_loc, "minecraft:air");
- if(Block_to_set != "minecraft:air"){
- map.add(Coords_for_Undo, abs_loc, block.getType(abs_loc));
- block.set(abs_loc, Block_to_set);
- }
- }
- }
- return(Coords_for_Undo);
- }
- function fractal.undo(Coords_for_Undo){
- Coords_List = list.new();
- iterator = map.iterator(Coords_for_Undo);
- while(hasNext(iterator)){
- list.add(Coords_List, map.getKey(next(iterator)));
- }
- for(a = 0; a < list.getSize(Coords_List); a++){
- undo_loc = list.getIndex(Coords_List, a);
- undo_block = map.getOrDefault(Coords_for_Undo, undo_loc, "minecraft:air");
- if(undo_block == "minecraft:" || undo_block == ""){undo_block = "minecraft:air";}
- block.set(undo_loc, undo_block);
- }
- }
- function fractal.help_register(message, description){
- map.add($FractalHelpMap, message, description);
- }
|