event.load("block_place"); event.load("block_break"); event.load("item_air_click"); event.load("inv_click"); event.load("chat"); decay_var = 3; iterations = 3; default_iterations = iterations; age = 0; default_age = age; Selected_Fractal = 1; default_Selected_Fractal = Selected_Fractal; Undo_List = list.new(); Redo_List = list.new(); Fractal_List = list.new(); FractalHelp = array.new(9, 2); FractalHelp[0,0] = "§e§lFractal§6§lPlace"; FractalHelp[0,1] = "to start placing the pattern"; FractalHelp[1,0] = "§e§lFractal§6§lStart"; FractalHelp[1,1] = "to start generating the fractal"; FractalHelp[2,0] = "§e§lFractal§6§lBuildHere"; FractalHelp[2,1] = "to place the fractal at current location"; FractalHelp[3,0] = "§e§lFractal§6§lNew"; FractalHelp[3,1] = "to start again"; FractalHelp[4,0] = "§e§lFractal§6§lUndo"; FractalHelp[4,1] = "to undo placing your last fractal"; FractalHelp[5,0] = "§e§lFractal§6§lRedo"; FractalHelp[5,1] = "to redo placing your last fractal"; FractalHelp[6,0] = "§e§lFractal§6§lPause"; FractalHelp[6,1] = "to stop fractal/fractal-pattern placement"; FractalHelp[7,0] = "§e§lFractal§6§lResume"; FractalHelp[7,1] = "to unpause"; FractalHelp[8,0] = "§e§lFractal§6§lSettings"; FractalHelp[8,1] = "open Fractal creation settings"; Settings_Inv = array.new(25); Settings_Inv[0] = read.item("minecraft:slime_ball",1,"Selected Fractal"); Settings_Inv[1] = read.item("km:refresh_red",1,"Set to default"); Settings_Inv[2] = read.item("km:arrow_left",1,"- 10"); Settings_Inv[3] = read.item("km:arrow_left",1,"- 1"); Settings_Inv[4] = read.item("km:digit_0"); Settings_Inv[5] = read.item(text.concat("km:digit_",text.number(Selected_Fractal))); Settings_Inv[6] = read.item("km:arrow_right",1,"+ 1"); Settings_Inv[7] = read.item("km:arrow_right",1,"+ 10"); Settings_Inv[8] = read.item("km:check_green",1,"Confirm"); Settings_Inv[9] = read.item("minecraft:slime_ball",1,"Iterations"); Settings_Inv[10] = read.item("km:refresh_red",1,"Set to default"); Settings_Inv[11] = read.item("km:arrow_left",1,"- 1"); Settings_Inv[12] = read.item("km:digit_0"); Settings_Inv[13] = read.item(text.concat("km:digit_",text.number(iterations))); Settings_Inv[14] = read.item("km:arrow_right",1,"+ 1"); Settings_Inv[15] = read.item("km:check_green",1,"Confirm"); Settings_Inv[16] = read.item("minecraft:slime_ball",1,"Decay"); Settings_Inv[17] = read.item("km:refresh_red",1,"Set to default"); Settings_Inv[18] = read.item("km:arrow_left",1,"- 10"); Settings_Inv[19] = read.item("km:arrow_left",1,"- 1"); Settings_Inv[20] = read.item("km:digit_0"); Settings_Inv[21] = read.item(text.concat("km:digit_",text.number(age))); Settings_Inv[22] = read.item("km:arrow_right",1,"+ 1"); Settings_Inv[23] = read.item("km:arrow_right",1,"+ 10"); Settings_Inv[24] = read.item("km:check_green",1,"Confirm"); numbers = map.new(); map.add(numbers, 0, read.item("km:digit_0")); map.add(numbers, 1, read.item("km:digit_1")); map.add(numbers, 2, read.item("km:digit_2")); map.add(numbers, 3, read.item("km:digit_3")); map.add(numbers, 4, read.item("km:digit_4")); map.add(numbers, 5, read.item("km:digit_5")); map.add(numbers, 6, read.item("km:digit_6")); map.add(numbers, 7, read.item("km:digit_7")); map.add(numbers, 8, read.item("km:digit_8")); map.add(numbers, 9, read.item("km:digit_9")); Fractal_Settings_Inv = inv.new("222222222220222202222222222"); F_S_I_ID = inv.getID(Fractal_Settings_Inv); //Fractal_Settings_Inv = inv.new("222222222 220222202 222222222"); for(a = 0; a < 25; a++){ inv.setItem(Fractal_Settings_Inv, a, Settings_Inv[a]); } @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; pause = false; setage = false; msg("dev", "§bFractalmaker §rloaded."); @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"); @inv_click if(inv_id == F_S_I_ID){ ignoreGoto(text.number(inv_slot)); goto("wait"); } @1 temp_Selected_Fractal = default_Selected_Fractal; setnumber(Fractal_Settings_Inv, 4, 5, temp_Selected_Fractal); if(temp_Selected_Fractal == Selected_Fractal){ inv.setItem(Fractal_Settings_Inv, 0, Settings_Inv[0]); }else{ inv.setItem(Fractal_Settings_Inv, 0, read.item("km:gem_stone",1,"Selected Fractal")); } inv.update(player); goto("wait"); @2 temp_Selected_Fractal -= 10; if(temp_Selected_Fractal < 1){ temp_Selected_Fractal = 1; }else{ setnumber(Fractal_Settings_Inv, 4, 5, temp_Selected_Fractal); if(temp_Selected_Fractal == Selected_Fractal){ inv.setItem(Fractal_Settings_Inv, 0, Settings_Inv[0]); }else{ inv.setItem(Fractal_Settings_Inv, 0, read.item("km:gem_stone",1,"Selected Fractal")); } } inv.update(player); goto("wait"); @3 temp_Selected_Fractal--; if(temp_Selected_Fractal < 1){ temp_Selected_Fractal = 1; }else{ setnumber(Fractal_Settings_Inv, 4, 5, temp_Selected_Fractal); if(temp_Selected_Fractal == Selected_Fractal){ inv.setItem(Fractal_Settings_Inv, 0, Settings_Inv[0]); }else{ inv.setItem(Fractal_Settings_Inv, 0, read.item("km:gem_stone",1,"Selected Fractal")); } } inv.update(player); goto("wait"); @6 temp_Selected_Fractal++; if(temp_Selected_Fractal > list.getSize(Fractal_List)){ temp_Selected_Fractal = temp_Selected_Fractal - 1; }else{ setnumber(Fractal_Settings_Inv, 4, 5, temp_Selected_Fractal); if(temp_Selected_Fractal == Selected_Fractal){ inv.setItem(Fractal_Settings_Inv, 0, Settings_Inv[0]); }else{ inv.setItem(Fractal_Settings_Inv, 0, read.item("km:gem_stone",1,"Selected Fractal")); } } inv.update(player); goto("wait"); @7 temp_Selected_Fractal += 10; if(temp_Selected_Fractal > list.getSize(Fractal_List)){ temp_Selected_Fractal = list.getSize(Fractal_List); }else{ setnumber(Fractal_Settings_Inv, 4, 5, temp_Selected_Fractal); if(temp_Selected_Fractal == Selected_Fractal){ inv.setItem(Fractal_Settings_Inv, 0, Settings_Inv[0]); }else{ inv.setItem(Fractal_Settings_Inv, 0, read.item("km:gem_stone",1,"Selected Fractal")); } } inv.update(player); goto("wait"); @8 Selected_Fractal = temp_Selected_Fractal; inv.setItem(Fractal_Settings_Inv, 0, Settings_Inv[0]); inv.update(player); if(build){ goto("iter_jump"); } goto("wait"); @10 temp_iterations = default_iterations; setnumber(Fractal_Settings_Inv, 12, 13, temp_iterations); if(temp_iterations == iterations){ inv.setItem(Fractal_Settings_Inv, 9, Settings_Inv[9]); }else{ inv.setItem(Fractal_Settings_Inv, 9, read.item("km:gem_stone",1,"Iterations")); } inv.update(player); goto("wait"); @11 temp_iterations--; if(temp_iterations < 2){ temp_iterations = 2; }else{ setnumber(Fractal_Settings_Inv, 12, 13, temp_iterations); if(temp_iterations == iterations){ inv.setItem(Fractal_Settings_Inv, 9, Settings_Inv[9]); }else{ inv.setItem(Fractal_Settings_Inv, 9, read.item("km:gem_stone",1,"Iterations")); } } inv.update(player); goto("wait"); @14 temp_iterations++; if(temp_iterations > 5){ temp_iterations = 5; }else{ setnumber(Fractal_Settings_Inv, 12, 13, temp_iterations); if(temp_iterations == iterations){ inv.setItem(Fractal_Settings_Inv, 9, Settings_Inv[9]); }else{ inv.setItem(Fractal_Settings_Inv, 9, read.item("km:gem_stone",1,"Iterations")); } } inv.update(player); goto("wait"); @15 iterations = temp_iterations; inv.setItem(Fractal_Settings_Inv, 9, Settings_Inv[9]); inv.update(player); if(build){ goto("iter_jump"); } goto("wait"); @17 temp_age = default_age; setnumber(Fractal_Settings_Inv, 20, 21, temp_age); if(temp_age == age){ inv.setItem(Fractal_Settings_Inv, 16, Settings_Inv[16]); }else{ inv.setItem(Fractal_Settings_Inv, 16, read.item("km:gem_stone",1,"Decay")); } inv.update(player); goto("wait"); @18 temp_age -= 10; if(temp_age < 0){ temp_age = 0; }else{ setnumber(Fractal_Settings_Inv, 20, 21, temp_age); if(temp_age == age){ inv.setItem(Fractal_Settings_Inv, 16, Settings_Inv[16]); }else{ inv.setItem(Fractal_Settings_Inv, 16, read.item("km:gem_stone",1,"Decay")); } } inv.update(player); goto("wait"); @19 temp_age--; if(temp_age < 0){ temp_age = 0; }else{ setnumber(Fractal_Settings_Inv, 20, 21, temp_age); if(temp_age == age){ inv.setItem(Fractal_Settings_Inv, 16, Settings_Inv[16]); }else{ inv.setItem(Fractal_Settings_Inv, 16, read.item("km:gem_stone",1,"Decay")); } } inv.update(player); goto("wait"); @22 temp_age++; if(temp_age > 99){ temp_age = 99; }else{ setnumber(Fractal_Settings_Inv, 20, 21, temp_age); if(temp_age == age){ inv.setItem(Fractal_Settings_Inv, 16, Settings_Inv[16]); }else{ inv.setItem(Fractal_Settings_Inv, 16, read.item("km:gem_stone",1,"Decay")); } } inv.update(player); goto("wait"); @23 temp_age += 10; if(temp_age > 99){ temp_age = 99; }else{ setnumber(Fractal_Settings_Inv, 20, 21, temp_age); if(temp_age == age){ inv.setItem(Fractal_Settings_Inv, 16, Settings_Inv[16]); }else{ inv.setItem(Fractal_Settings_Inv, 16, read.item("km:gem_stone",1,"Decay")); } } inv.update(player); goto("wait"); @24 age = temp_age; inv.setItem(Fractal_Settings_Inv, 16, Settings_Inv[16]); inv.update(player); if(build){ goto("iter_jump"); } goto("wait"); @chat if(text.contains(message, "%fractal")){ message = text.subString(message,1,text.length(message)); ignoreGoto(message); } goto("wait"); @fractalhelp temp_size = array.getSize(FractalHelp); for(a = 0; a < temp_size-1; a++){ temp_key = FractalHelp[a,0]; temp_value = FractalHelp[a,1]; fractal_command = text.hover(text.click(temp_key, temp_value), temp_value); msg(player, fractal_command); } goto("wait"); @fractalplace msg(player, "You can place the pattern now."); start = true; goto("wait"); @fractalstart if(start && map.getSize(Blocks) > 1){ msg(player, "The Fractal will start generating now"); @iter_jump loc = loc.getWorld(entity.getLocation(player)); list.add(Fractal_List, fractal.create(Block_Coords, loc, Blocks, 2, iterations+1, Block_Coords, age)); 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 if(build){ player_loc = entity.getLocation(player); @place_fractal redo_loc = player_loc; msg(player, "Fractal will now generate with ", iterations, " iterations."); list.add(Undo_List, fractal.build(list.getIndex(Fractal_List, list.getSize(Fractal_List) - Selected_Fractal), player_loc, player)); }else{ msg(player, "You have not yet generated a fractal."); } goto("wait"); @fractalnew msg(player, "Restarting"); goto("Start"); goto("wait"); @fractalundo temp_size = list.getSize(Undo_List); if(temp_size > 0){ msg(player, "Undoing"); list.add(Redo_List, fractal.undo(list.getIndex(Undo_List,temp_size-1))); list.removeIndex(Undo_List,temp_size-1); }else{ msg(player, "Nothing to undo"); } goto("wait"); @fractalredo temp_size = list.getSize(Redo_List); if(temp_size > 0){ msg(player, "Redoing"); list.add(Undo_List, fractal.undo(list.getIndex(Redo_List,temp_size-1))); list.removeIndex(Redo_List,temp_size-1); }else{ msg(player, "Nothing to redo"); } 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"); @fractalsettings temp_iterations = iterations; temp_age = age; temp_Selected_Fractal = Selected_Fractal; inv.open(Fractal_Settings_Inv, player, "Fractal Settings"); goto("wait"); function fractal.create(Block_Coords, world, Blocks, iter, iterations, Last_Block_Coords, fractalage){ 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 = list.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"); temparray = array.new(2); temparray[0] = rel_loc; temparray[1] = Block_to_set; rand_temp = math.random(0,100); if(Block_to_set != "minecraft:air" && rand_temp + 1 > fractalage){ list.add(New_Block_Coords, loc_place); list.add(relative_blocks, temparray); } } } } } c3++; } b3++; } a3++; } iter++; if(iter < iterations){ relative_blocks = fractal.create(New_Block_Coords, world, Blocks, iter, iterations, Last_Block_Coords, fractalage); } 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 = list.new(); for(a = 0; a < list.getSize(Fractal); a++){ temp_array = list.getIndex(Fractal, a); rel_loc = temp_array[0]; 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(Fractal) + 1; }else{ stop = false; } } if(!stop){ for(a = 0; a < list.getSize(Fractal); a++){ temp_array = list.getIndex(Fractal, a); rel_loc = temp_array[0]; 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 = temp_array[1]; if(Block_to_set != "minecraft:air"){ temp_array2 = array.new(2); temp_array2[0] = abs_loc; temp_array2[1] = block.getType(abs_loc); list.add(Coords_for_Undo, temp_array2); block.set(abs_loc, Block_to_set); } } } return(Coords_for_Undo); } function fractal.undo(Coords_List){ Coords_for_Redo = list.new(); for(a = 0; a < list.getSize(Coords_List); a++){ temp_array = list.getIndex(Coords_List, a); undo_loc = temp_array[0]; undo_block = temp_array[1]; if(undo_block == "minecraft:" || undo_block == ""){undo_block = "minecraft:air";} temp_array2 = array.new(2); temp_array2[0] = undo_loc; temp_array2[1] = block.getType(undo_loc); list.add(Coords_for_Redo, temp_array2); block.set(undo_loc, undo_block); } return(Coords_for_Redo); } function setnumber(Inv, First_Slot, Second_Slot, Number){ if(Number > 100){Number = 99;} First_Digit = map.get($numbers, math.roundDown(Number / 10)); Second_Digit = map.get($numbers, Number - 10 * math.roundDown(Number / 10)); inv.setItem(Inv, First_Slot, First_Digit); inv.setItem(Inv, Second_Slot, Second_Digit); }