fraktal_maker.txt 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. msg("dev", "Fractal_Maker has started.");
  2. event.load("block_place");
  3. event.load("block_break");
  4. event.load("item_air_click");
  5. event.load("chat");
  6. Undo_Map = map.new();
  7. built = false;
  8. FractalHelpMap = map.new();
  9. fractal.help_register("§e§lFractal§6§lPlace", "to start placing the pattern");
  10. fractal.help_register("§e§lFractal§6§lStart", "to start generating the fractal");
  11. fractal.help_register("§e§lFractal§6§lBuildHere", "to place the fractal at current location");
  12. fractal.help_register("§e§lFractal§6§lNew", "to start again");
  13. fractal.help_register("§e§lFractal§6§lUndo", "to undo placing your last fractal");
  14. fractal.help_register("§e§lFractal§6§lRedo", "to redo placing your last fractal");
  15. fractal.help_register("§e§lFractal§6§lIter", "to set the amount of iterations with km:digits");
  16. fractal.help_register("§e§lFractal§6§lPause", "to stop fractal/fractal-pattern placement");
  17. fractal.help_register("§e§lFractal§6§lResume", "to unpause");
  18. @Start
  19. Blocks = map.new();
  20. Block_Coords = list.new();
  21. Coords_X = list.new();
  22. Coords_Y = list.new();
  23. Coords_Z = list.new();
  24. start = false;
  25. build = false;
  26. set_iter = false;
  27. iterations = 3;
  28. pause = false;
  29. @wait
  30. wait();
  31. if(player.getname(player) == "SirTerence7"){
  32. ignoreGoto(event);
  33. }
  34. goto("wait");
  35. @block_place
  36. if(start && !pause){
  37. cancel=false;
  38. map.add(Blocks, block_loc, block_type);
  39. list.add(Block_Coords, block_loc);
  40. }
  41. elseif(build){
  42. cancel = true;
  43. player_loc = block_loc;
  44. goto("place_fractal");
  45. }
  46. goto("wait");
  47. @block_break
  48. if(start && !pause){
  49. if(map.contains(Blocks, block_loc)){
  50. cancel = false;
  51. map.remove(Blocks, block_loc);
  52. list.remove(Block_Coords, block_loc);
  53. }else{
  54. cancel = true;
  55. }
  56. }
  57. elseif(start && pause){
  58. if(map.contains(Blocks, block_loc)){
  59. cancel = true;
  60. }
  61. }
  62. goto("wait");
  63. @item_air_click
  64. if(set_iter){
  65. set_iter = false;
  66. Hand_Item = item.getType(entity.getEquip(player, "hand"));
  67. OffHand_Item = item.getType(entity.getEquip(player, "offhand"));
  68. old_iterations = iterations;
  69. if(Hand_Item == "km:digit_2" || OffHand_Item == "km:digit_2"){
  70. iterations = 2;
  71. }elseif(Hand_Item == "km:digit_3" || OffHand_Item == "km:digit_3"){
  72. iterations = 3;
  73. }elseif(Hand_Item == "km:digit_4" || OffHand_Item == "km:digit_4"){
  74. iterations = 4;
  75. }elseif(Hand_Item == "km:digit_5" || OffHand_Item == "km:digit_5"){
  76. iterations = 5;
  77. }elseif(Hand_Item == "km:digit_6" || OffHand_Item == "km:digit_6"){
  78. iterations = 6;
  79. }elseif(Hand_Item == "km:digit_7" || OffHand_Item == "km:digit_7"){
  80. iterations = 7;
  81. }else{
  82. goto("wait");
  83. }
  84. msg(player, "iterations set to: ", iterations);
  85. if(old_iterations != iterations && build){
  86. goto("iter_jump");
  87. }
  88. build = true;
  89. }
  90. goto("wait");
  91. @chat
  92. if(text.contains(message, "fractal")){
  93. ignoreGoto(message);
  94. }
  95. goto("wait");
  96. @fractalhelp
  97. temp = map.iterator(FractalHelpMap);
  98. while(hasNext(temp)){
  99. temp_key = map.getKey(next(temp));
  100. temp_value = map.get(FractalHelpMap, temp_key);
  101. fractal_command = text.hover(text.click(temp_key, temp_value), temp_value);
  102. msg(player, fractal_command);
  103. }
  104. cancel = true;
  105. goto("wait");
  106. @fractalplace
  107. cancel = true;
  108. msg(player, "You can place the pattern now.");
  109. start = true;
  110. goto("wait");
  111. @fractalstart
  112. cancel = true;
  113. if(start && map.getSize(Blocks) > 1){
  114. msg(player, "The Fractal will start generating now");
  115. @iter_jump
  116. loc = loc.getWorld(entity.getLocation(player));
  117. Relative_Fractal = fractal.create(Block_Coords, loc, Blocks, 2, iterations+1, Block_Coords);
  118. build = true;
  119. start = false;
  120. pause = false;
  121. msg(player, "The Fractal has generated, place a block or type \"fractalbuildhere\" to place it.");
  122. }else{
  123. msg(player, "You have not yet made a pattern.");
  124. }
  125. goto("wait");
  126. @fractalbuildhere
  127. cancel = true;
  128. if(build){
  129. player_loc = entity.getLocation(player);
  130. @place_fractal
  131. redo_loc = player_loc;
  132. msg(player, "Fractal will now generate with ", iterations, " iterations.");
  133. Undo_Map = fractal.build(Relative_Fractal, player_loc, player);
  134. built = true;
  135. }else{
  136. msg(player, "You have not yet generated a fractal.");
  137. }
  138. goto("wait");
  139. @fractalnew
  140. cancel = true;
  141. msg(player, "Restarting");
  142. goto("Start");
  143. goto("wait");
  144. @fractalundo
  145. cancel = true;
  146. if(built && map.getSize(Undo_Map) > 1){
  147. msg(player, "Undoing");
  148. redo = true;
  149. built = false;
  150. fractal.undo(Undo_Map);
  151. }else{
  152. msg(player, "Nothing to undo");
  153. }
  154. goto("wait");
  155. @fractalredo
  156. if(redo){
  157. msg(player, "Redoing");
  158. fractal.build(Relative_Fractal, redo_loc, player);
  159. redo = false;
  160. built = true;
  161. }else{
  162. msg(player, "Nothing to redo");
  163. }
  164. goto("wait");
  165. @fractaliter
  166. if(build){
  167. msg(player, "Click with a digit from 2-7 in hand.");
  168. set_iter = true;
  169. }else{
  170. msg(player, "You need to place a pattern first.");
  171. }
  172. goto("wait");
  173. @fractalpause
  174. if(pause){
  175. msg(player, "You have already paused, type \"fractalresume\" to continue.");
  176. goto("wait");
  177. }else{
  178. pause = true;
  179. build = false;
  180. msg(player, "You have paused the fractal-placement.");
  181. }
  182. goto("wait");
  183. @fractalresume
  184. if(pause){
  185. pause = false;
  186. build = true;
  187. msg(player, "You can resume placing now.");
  188. }else{
  189. msg(player, "You have not paused.");
  190. }
  191. goto("wait");
  192. function fractal.create(Block_Coords, world, Blocks, iter, iterations, Last_Block_Coords){
  193. List_Size = list.getSize(Last_Block_Coords);
  194. Coords_X = list.new();
  195. Coords_Y = list.new();
  196. Coords_Z = list.new();
  197. New_Block_Coords = list.new();
  198. relative_blocks = map.new();
  199. for(a = 0; a < List_Size; a++){
  200. block_loc = list.getIndex(Last_Block_Coords, a);
  201. list.add(Coords_X, loc.getX(block_loc));
  202. list.add(Coords_Y, loc.getY(block_loc));
  203. list.add(Coords_Z, loc.getZ(block_loc));
  204. }
  205. list.sort(Coords_X);
  206. list.sort(Coords_Y);
  207. list.sort(Coords_Z);
  208. Min_X = list.getIndex(Coords_X, 0);
  209. Min_Y = list.getIndex(Coords_Y, 0);
  210. Min_Z = list.getIndex(Coords_Z, 0);
  211. X_Size = math.abs(Min_X - list.getIndex(Coords_X, list.getSize(Coords_X) - 1))+1;
  212. Y_Size = math.abs(Min_Y - list.getIndex(Coords_Y, list.getSize(Coords_Y) - 1))+1;
  213. Z_Size = math.abs(Min_Z - list.getIndex(Coords_Z, list.getSize(Coords_Z) - 1))+1;
  214. a3 = 0;
  215. for(a = 0; a < math.pow(X_Size,iter); a = a + X_Size){
  216. b3 = 0;
  217. for(b = 0; b < math.pow(Y_Size,iter); b = b + Y_Size){
  218. c3 = 0;
  219. for(c = 0; c < math.pow(Z_Size,iter); c = c + Z_Size){
  220. location = loc.new(world, Min_X + a3, Min_Y + b3, Min_Z + c3);
  221. if(list.contains(Block_Coords, location)){
  222. for(a2 = a; a2 < X_Size + a; a2++){
  223. for(b2 = b; b2 < Y_Size + b; b2++){
  224. for(c2 = c; c2 < Z_Size + c; c2++){
  225. loc_place = loc.new(world, Min_X + a2, Min_Y + b2, Min_Z + c2);
  226. rel_loc = loc.new(world, a2, b2, c2);
  227. loc_set = loc.new(world, Min_X + a2 - a, Min_Y + b2 - b, Min_Z + c2 - c);
  228. Block_to_set = map.getOrDefault(Blocks, loc_set, "minecraft:air");
  229. rand_temp = math.random(0,100);
  230. if(Block_to_set != "minecraft:air" && rand_temp > 3){
  231. list.add(New_Block_Coords, loc_place);
  232. map.add(relative_blocks, rel_loc, Block_to_set);
  233. }
  234. }
  235. }
  236. }
  237. }
  238. c3++;
  239. }
  240. b3++;
  241. }
  242. a3++;
  243. }
  244. iter++;
  245. if(iter < iterations){
  246. relative_blocks = fractal.create(New_Block_Coords, world, Blocks, iter, iterations, Last_Block_Coords);
  247. }
  248. return(relative_blocks);
  249. }
  250. function fractal.build(Fractal, Position, Player){
  251. stop = false;
  252. Pos_X = math.round(loc.getX(Position));
  253. Pos_Y = math.round(loc.getY(Position));
  254. Pos_Z = math.round(loc.getZ(Position));
  255. World = loc.getWorld(Position);
  256. Coords_for_Undo = map.new();
  257. Coords_List = list.new();
  258. iterator = map.iterator(Fractal);
  259. while(hasNext(iterator)){
  260. list.add(Coords_List, map.getKey(next(iterator)));
  261. }
  262. for(a = 0; a < list.getSize(Coords_List); a++){
  263. rel_loc = list.getIndex(Coords_List, a);
  264. Temp_X = Pos_X + loc.getX(rel_loc);
  265. Temp_Y = Pos_Y + loc.getY(rel_loc);
  266. Temp_Z = Pos_Z + loc.getZ(rel_loc);
  267. abs_loc = loc.new(World, Temp_X, Temp_Y, Temp_Z);
  268. if(!block.isAir(abs_loc) && abs_loc != Position){
  269. msg(Player, "Block is in the Way, cannot paste Fractal here.", block.getType(abs_loc));
  270. stop = true;
  271. a = list.getSize(Coords_List) + 1;
  272. }else{
  273. stop = false;
  274. }
  275. }
  276. if(!stop){
  277. for(a = 0; a < list.getSize(Coords_List); a++){
  278. rel_loc = list.getIndex(Coords_List, a);
  279. Temp_X = Pos_X + loc.getX(rel_loc);
  280. Temp_Y = Pos_Y + loc.getY(rel_loc);
  281. Temp_Z = Pos_Z + loc.getZ(rel_loc);
  282. abs_loc = loc.new(World, Temp_X, Temp_Y, Temp_Z);
  283. Block_to_set = map.getOrDefault(Fractal, rel_loc, "minecraft:air");
  284. if(Block_to_set != "minecraft:air"){
  285. map.add(Coords_for_Undo, abs_loc, block.getType(abs_loc));
  286. block.set(abs_loc, Block_to_set);
  287. }
  288. }
  289. }
  290. return(Coords_for_Undo);
  291. }
  292. function fractal.undo(Coords_for_Undo){
  293. Coords_List = list.new();
  294. iterator = map.iterator(Coords_for_Undo);
  295. while(hasNext(iterator)){
  296. list.add(Coords_List, map.getKey(next(iterator)));
  297. }
  298. for(a = 0; a < list.getSize(Coords_List); a++){
  299. undo_loc = list.getIndex(Coords_List, a);
  300. undo_block = map.getOrDefault(Coords_for_Undo, undo_loc, "minecraft:air");
  301. if(undo_block == "minecraft:" || undo_block == ""){undo_block = "minecraft:air";}
  302. block.set(undo_loc, undo_block);
  303. }
  304. }
  305. function fractal.help_register(message, description){
  306. map.add($FractalHelpMap, message, description);
  307. }