diff --git a/app.js b/app.js index 791205d..1ec4c01 100644 --- a/app.js +++ b/app.js @@ -6,15 +6,16 @@ var settings = require('./config/settings'); var commands = require('./config/commands'); var options = { - motd: settings.motd, + 'motd': settings.motd, 'max-players': settings.maxPlayers, - port: settings.port, + 'port': settings.port, 'online-mode': settings.onlineMode, gameMode:settings.gameMode, commands: commands, logging:settings.logging, kickTimeout:10*60*1000, - generation:settings.generation + generation:settings.generation, + 'modpe': settings.modpe }; mcServer.createMCServer(options); diff --git a/config/settings.json b/config/settings.json index 2b5aac6..2d9833f 100644 --- a/config/settings.json +++ b/config/settings.json @@ -11,5 +11,6 @@ "worldHeight":80 } }, - "favicon": "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TUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS4xLjIiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjE8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgICAgIDx0aWZmOkNvbXByZXNzaW9uPjU8L3RpZmY6Q29tcHJlc3Npb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj43MjwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjY0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT4xPC9leGlmOkNvbG9yU3BhY2U+CiAgICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj42NDwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPgogICAgICAgICA8ZGM6c3ViamVjdD4KICAgICAgICAgICAgPHJkZjpCYWcvPgogICAgICAgICA8L2RjOnN1YmplY3Q+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxMy0wMy0yOVQxNjowMzoxMjwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+UGl4ZWxtYXRvciAyLjEuNDwveG1wOkNyZWF0b3JUb29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KpCfligAAAwVJREFUeAHtm0+O1TAMh1s0azgBmhn2cAS4CMfjInAE2DMz4gSwHulRPeWzFLfG+SsE9Wz84sRu6t+XvCqvs14ul2Xm37quXRfY5rfOnN+Lmcn/hdzrKAJ6la4t1igygoBWAkoVf/54WytuNv7m01PWthqtRAQBtQRYyptKFypoKbsYBFlk1JIQBJQS4CpvKH1jSlvW8WwNS2T0khAEeASUKm8p7eW3BMa/XZ+PmRUyOkkIAiyFapW38mSyNTQev325Rt29fZ9FQ0YvCUGAVm648r8eMuVKG49PPw6V1/G9JAQBENCtfKPSWlFR/va17srbL++zdisJQYBFgDzbpyc8vucZL+XvVB7FyXfnKc9AbCMJ231cHzCCgK2Q2ZndbOW7FUd5bRtJOD0BLG1dz3170FrXaxwitH8/AceT5kc+Z7R0BwFSCucDle1WSl2HfLPyq8vtmkHAriSTHJbSf0t5bjMIoBKzraU0ZMy+vpU/CLAq0+pHaR1fq/SoPHoeuh0E6Iq0tlHs/t2HwxQPXz9f/R4Jo/IcTuLAGQQcFKXK5SlGMsi4/PyO69Ay7rBzc9JfSpSVB38QQCVaLYq0xrfGcV2PKC//6QmIAniI/O/98paY/l3AOhvc7b7pLI5zea9grFm+PRjP88H66g2uP1o5nVYnQewN3m+GcSqcyisEUO5ZJGjFtNKQsThE6TyQVKs893v6TXBHAJXpJYE8YtWpskkAAeqcH/fSueYlT/oQBMia0qVJ7VISCJe1jMOyWmFFiBWmySnd7a18QYBHAJXzSGAcPzUVk0CgY1FeFGe88ZbYdl/Hr5cRl2wQUEoAhfNI8AhASU2I5ZfrpidEIaBTefKengAEoyDDLE9oVkKr3/JbeXr9pyfAfBL0Klu6F+g8rGGNnuUnnn7+f0C/JV6665MPGwTUfgtQOaxHAuPEpt170f9fYPkJHLTrkw4bBPQSQCVNEhiQLGtXTpwcP+HE0W5d88Rjg4BRBFBRTQL+UXaU8swnCBhNAJUdTcJo5Znn6Qn4DdXUs/TSllinAAAAAElFTkSuQmCC" + "favicon": "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TUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS4xLjIiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjE8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgICAgIDx0aWZmOkNvbXByZXNzaW9uPjU8L3RpZmY6Q29tcHJlc3Npb24+CiAgICAgICAgIDx0aWZmOlhSZXNvbHV0aW9uPjcyPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj43MjwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjY0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT4xPC9leGlmOkNvbG9yU3BhY2U+CiAgICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj42NDwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPgogICAgICAgICA8ZGM6c3ViamVjdD4KICAgICAgICAgICAgPHJkZjpCYWcvPgogICAgICAgICA8L2RjOnN1YmplY3Q+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxMy0wMy0yOVQxNjowMzoxMjwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+UGl4ZWxtYXRvciAyLjEuNDwveG1wOkNyZWF0b3JUb29sPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KpCfligAAAwVJREFUeAHtm0+O1TAMh1s0azgBmhn2cAS4CMfjInAE2DMz4gSwHulRPeWzFLfG+SsE9Wz84sRu6t+XvCqvs14ul2Xm37quXRfY5rfOnN+Lmcn/hdzrKAJ6la4t1igygoBWAkoVf/54WytuNv7m01PWthqtRAQBtQRYyptKFypoKbsYBFlk1JIQBJQS4CpvKH1jSlvW8WwNS2T0khAEeASUKm8p7eW3BMa/XZ+PmRUyOkkIAiyFapW38mSyNTQev325Rt29fZ9FQ0YvCUGAVm648r8eMuVKG49PPw6V1/G9JAQBENCtfKPSWlFR/va17srbL++zdisJQYBFgDzbpyc8vucZL+XvVB7FyXfnKc9AbCMJ231cHzCCgK2Q2ZndbOW7FUd5bRtJOD0BLG1dz3170FrXaxwitH8/AceT5kc+Z7R0BwFSCucDle1WSl2HfLPyq8vtmkHAriSTHJbSf0t5bjMIoBKzraU0ZMy+vpU/CLAq0+pHaR1fq/SoPHoeuh0E6Iq0tlHs/t2HwxQPXz9f/R4Jo/IcTuLAGQQcFKXK5SlGMsi4/PyO69Ay7rBzc9JfSpSVB38QQCVaLYq0xrfGcV2PKC//6QmIAniI/O/98paY/l3AOhvc7b7pLI5zea9grFm+PRjP88H66g2uP1o5nVYnQewN3m+GcSqcyisEUO5ZJGjFtNKQsThE6TyQVKs893v6TXBHAJXpJYE8YtWpskkAAeqcH/fSueYlT/oQBMia0qVJ7VISCJe1jMOyWmFFiBWmySnd7a18QYBHAJXzSGAcPzUVk0CgY1FeFGe88ZbYdl/Hr5cRl2wQUEoAhfNI8AhASU2I5ZfrpidEIaBTefKengAEoyDDLE9oVkKr3/JbeXr9pyfAfBL0Klu6F+g8rGGNnuUnnn7+f0C/JV6665MPGwTUfgtQOaxHAuPEpt170f9fYPkJHLTrkw4bBPQSQCVNEhiQLGtXTpwcP+HE0W5d88Rjg4BRBFBRTQL+UXaU8swnCBhNAJUdTcJo5Znn6Qn4DdXUs/TSllinAAAAAElFTkSuQmCC", + "modpe": true } diff --git a/lib/modpePlugins/we.js b/lib/modpePlugins/we.js new file mode 100644 index 0000000..7198330 --- /dev/null +++ b/lib/modpePlugins/we.js @@ -0,0 +1,1974 @@ +allow_extra_data_values = true; +max_brush_radius = 5; + + +//use-inventory (not working): +enable = false; +allow_override = true; +creative_mode_overrides = false; + + +//super-pickaxe (not working): +drop_items = true; +many_drop_items = false; +max_super_pickaxe_size = 5; + + +//navigation-wand (not working): +navigation_item = 345; +max_distance = 100; + + +//history (not working): +size = 15; +expiration = 10; + + +//(working) +coloured_messages = false; +wand_item = 271; +toggle_wand = false; +show_help_on_first_use = true; + + + +/*############################## +VARIABLES +##############################*/ + +var first_use = false; + +var blocks = [["air", 0], ["stone", 1], ["grass", 2], ["dirt", 3], ["cobblestone", 4], ["wood", 5], ["planks", 5], ["sapling", 6], ["bedrock", 7], ["water", 8], ["flowing_water", 8], ["stationary_water", 9], ["lava", 10], ["flowing_lava", 10], ["stationary_water", 11], ["sand", 12], ["gravel", 13], ["gold_ore", 14], ["iron_ore", 15], ["coal_ore", 16], ["log", 17], ["leaves", 18], ["sponge", 19], ["glass", 20], ["lapis_lazuli_ore", 21], ["lapis_ore", 21], ["lapis_lazuli_block", 22], ["lapis_block", 22], ["sandstone", 24], ["bed", 26], ["powered_rail", 27], ["golden_rail", 27], ["web", 30], ["long_grass", 31], ["tallgrass", 31], ["dead_bush", 32], ["deadbush", 32], ["cloth", 35], ["wool", 35], ["yellow_flower", 37], ["red_flower", 38], ["brown_mushroom", 39], ["red_mushroom", 40], ["gold_block", 41], ["iron_block", 42], ["double_step", 43], ["double_stone_slab", 43], ["step",44 ], ["stone_slab", 44], ["brick", 45], ["brick_block", 45], ["tnt", 46], ["bookcase", 47], ["bookshelf", 47], ["mossy_cobblestone", 48], ["obsidian", 49], ["torch", 50], ["fire", 51], ["mob_spawner", 52], ["wooden_stairs", 53], ["oak_stairs", 53], ["oak_wood_stairs", 53], ["chest", 54], ["diamond_ore", 56], ["diamond_block", 57], ["workbench", 58], ["crafting_table", 58], ["crops", 59], ["wheat", 59], ["soil", 60], ["farmland", 60], ["furnace", 61], ["burning_furnace", 62], ["lit_furnace", 62], ["sign_post", 63], ["standing_sign", 63], ["wooden_door", 64], ["ladder", 65], ["minecart_tracks", 66], ["rails", 66], ["cobblestone_stairs", 67], ["stone_stairs", 67], ["wall_sign", 68], ["iron_door", 71], ["redstone_ore", 73], ["unlit_redstone_ore", 73], ["glowing_redstone_ore", 74], ["lit_redstone_ore", 74], ["snow_layer", 78], ["snow", 78], ["ice", 79], ["snow_block", 80], ["cactus", 81], ["clay", 82], ["reed", 83], ["reeds", 83], ["fence", 85], ["pumpkin", 86], ["netherstone", 87], ["netherrack", 87], ["lightstone", 89], ["glowstone", 89], ["jackolantern", 91], ["lit_pumpkin", 91], ["cake_block", 92], ["cake", 92], ["trap_door", 96], ["trapdoor", 96], ["silverfish_block", 97], ["monster_egg", 97], ["stone_brick", 98], ["stonebrick", 98], ["brown_mushroom_cap", 99], ["brown_mushroom_block", 99], ["red_mushroom_cap", 100], ["red_mushroom_block", 100], ["iron_bars", 101], ["glass_pane", 102], ["melon_block", 103], ["melon", 103], ["pumpkin_stem", 104], ["melon_stem", 105], ["vine", 106], ["fence_gate", 107], ["brick_stairs", 108], ["stone_brick_stairs", 109], ["myclium", 110], ["lily_pad", 111], ["waterlily", 111], ["nether_brick", 112], ["nether_brick_fence", 113], ["nether_brick_stairs", 114], ["end_portal_frame", 120], ["end_stone", 121], ["double_wooden_step", 125], ["double_wooden_slab", 125], ["wooden_step", 126], ["wooden_slab", 126], ["cocoa_plant", 127], ["cocoa", 127], ["sandstone_stairs", 128], ["emerald_ore", 129], ["emerald_block", 133], ["spruce_wood_stairs", 134], ["spruce_stairs", 134], ["birch_wood_stairs", 135], ["birch_stairs", 135], ["jungle_wood_stairs", 136], ["jungle_stairs", 136], ["cobblestone_wall", 139], ["carrots", 141], ["potatoes", 142], ["quartz_block", 155], ["quartz_stairs", 156], ["stained_clay", 159], ["stained_hardened_clay", 159], ["leaves2", 161], ["log2", 162], ["acacia_wood_stairs", 163], ["acacia_stairs", 163], ["dark_oak_wood_stairs", 164], ["dark_oak_stairs", 164], ["hay_block", 170], ["carpet", 171], ["hardened_clay", 172], ["coal_block", 173], ["packed_ice", 174], ["double_plant", 175], ["spruce_fence_gate", 183], ["birch_fence_gate", 184], ["jungle_fence_gate", 185], ["acacia_fence_gate", 186], ["dark_oak_fence_gate", 187], ["podzol", 243], ["beetroot", 244], ["stone_cutter", 245], ["stonecutter", 245], ["glowing_obsidian", 246], ["nether_reactor_core", 247], ["nether_reactor", 247]]; +//var ctx = com.mojang.minecraftpe.MainActivity.currentMainActivity.get(); +var BTN; + +var selector = 1; +var pos1 = null; +var pos2 = null; + +var minX, minY, minZ, maxX, maxY, maxZ; +c = []; +c1 = []; +c2 = []; +r = []; + +clipboard = []; + +undo = []; +var undoX, undoY, undoZ; + +brush = []; +mask = -1; +var count = 1; + + + +/*############################## +COMMAND REGISTRATION +##############################*/ + +function procCmd(command) { + var cmd = command.split(" "); + + if(cmd[1] && allow_extra_data_values == true) c = cmd[1].split(":"); + else c[0] = cmd[1]; + + if(cmd[2] && allow_extra_data_values == true) c1 = cmd[2].split(":"); + else c1[0] = cmd[2]; + + if(cmd[2]) r = cmd[2].split(","); + else { + r[0] = cmd[2]; + r[1] = cmd[2]; + } + + if(cmd[3] && allow_extra_data_values == true) c2 = cmd[3].split(":"); + else c2[0] = cmd[3]; + + switch(cmd[0]) { + +/*############ +HELP +############*/ + + case "help": + case "/help": + if(cmd[1]) showHelp(cmd[1]); + + else showHelp("1"); + break; + + +/*############ +WAND +############*/ + + case "wand": + case "/wand": + switch(Level.getGameMode()) { + case 0: + Player.addItemInventory(wand_item, 1, 0); + break; + + case 1: + Entity.setCarriedItem(getPlayerEnt(), wand_item, 1, 0); + break; + } + + if(show_help_on_first_use == true && first_use == false) { + first_use = true; + Msg("Destroy block: select pos #1; Tap block: select pos #2") + } + break; + + +/*############ +TOGGLEEDITWAND +############*/ + + case "toggleeditwand": + switch(toggle_wand) { + case false: + toggle_wand = true; + Msg("Edit wand disabled."); + break; + + case true: + toggle_wand = false; + Msg("Edit wand enabled."); + break; + } + break; + + +/*############ +SEL +############*/ + + case "/sel": + case ";": + case "/desel": + case "/deselect": + + if(!cmd[1]) { + pos1 = null; + pos2 = null; + Msg("Selection cleared."); + } + + switch(cmd[1]) { + case "cuboid": + selector = 1; + Msg("Cuboid: destroy block for point 1, tap block for point 2"); + break; + } + break; + + +/*############ +POSITIONS +############*/ + + case "/pos1": + if(cmd[1] && cmd[2] && cmd[3]) { + pos1 = [Math.round(cmd[1]), Math.round(cmd[2]), Math.round(cmd[3])]; + Msg("First Position set to (" + pos1[0] + ".0, " + pos1[1] + ".0, " + pos1[2] + ".0)."); + } + + else if(!cmd[1]) { + pos1 = [pX, Math.round(pY), pZ]; + Msg("First Position set to (" + pos1[0] + ".0, " + pos1[1] + ".0, " + pos1[2] + ".0)."); + } + + else if(cmd[1] && (!cmd[2] || !cmd[3])) Msg("§cYou must either specify 0 or 3 coordiante values."); + + else if(cmd[4]) Msg("§cToo many arguments."); + break; + + + case "/pos2": + if(cmd[1] && cmd[2] && cmd[3]) { + pos2 = [Math.round(cmd[1]), Math.round(cmd[2]), Math.round(cmd[3])]; + Msg("Second Position set to (" + pos2[0] + ".0, " + pos2[1] + ".0, " + pos2[2] + ".0)."); + } + + else if(!cmd[1]) { + pos2 = [pX, Math.round(pY), pZ]; + Msg("Second Position set to (" + pos2[0] + ".0, " + pos2[1] + ".0, " + pos2[2] + ".0)."); + } + + else if(cmd[1] && (!cmd[2] || !cmd[3])) Msg("§cYou must either specify 0 or 3 coordiante values."); + + else if(cmd[4]) Msg("§cToo many arguments."); + break; + + +/*############ +UNDO +############*/ + + case "undo": + case "/undo": + Undo(); + break; + + +/*############ +PASTE +############*/ + + case "/paste": + if(!cmd[1] && clipboard != null) { + saveUndoPaste(); + paste(0); + } + + else if(clipboard == null) Msg("§No clipboard content."); + + else if(cmd[1]) Msg("§cToo many arguments."); + break; + + +/*############ +CLEARCLIPBOARD +############*/ + + case "clearclipboard": + clipboard = null; + break; + + + default: + for(var i = 0; i < blocks.length; i++) { + if(blocks[i][0] == c[0]) c[0] = blocks[i][1]; + if(blocks[i][0] == c1[0]) c1[0] = blocks[i][1]; + if(blocks[i][0] == c2[0]) c2[0] = blocks[i][1]; + + if(i == blocks.length - 1) { + if(pos1 == null || pos2 == null || pos1 != null || pos2 != null) { + switch(cmd[0]) { + +/*############ +MASK +############*/ + + case "mask": + if(cmd[1] && cmd[1] >= 0 && cmd[1] <= 255) { + mask = c[0]; + Msg("Brush mask set."); + } + + else if(cmd[1] < 0 || cmd[1] > 255) Msg("§cNot a valid block id/name."); + + else if(!cmd[1]) { + mask = -1; + Msg("Brush mask disabled."); + } + break; + + +/*############ +BRUSH +############*/ + + case "/br": + if(Player.getCarriedItem() > 255) { + if(cmd[1]) { + switch(cmd[1]) { + case "c": + case "cyl": + case "cylinder": + if(c1[0] != "h" && c1[0] <= 255 && c1[0] >= 0) { + if(cmd[3] && !cmd[4] && cmd[3] <= max_brush_radius) { + brush = ["cylinder", c1[0], c1[1], cmd[3], 1, false]; + Msg("Cylinder brush shape equipped (" + cmd[3] + " by 1)."); + dismissBrushButton(); + openBrushButton(); + } + + else if(cmd[4] && c1[0] <= 255 && c1[0] >= 0 && !cmd[5] && cmd[3] <= max_brush_radius && cmd[4] <= max_brush_radius) { + brush = ["cylinder", c1[0], c1[1], cmd[3], cmd[4], false]; + Msg("Cylinder brush shape equipped (" + cmd[3] + " by " + cmd[4] + ")."); + dismissBrushButton(); + openBrushButton(); + } + + else if(cmd[3] > max_brush_radius || cmd[4] > max_brush_radius) Msg("§cThe radius must be smaller than " + max_brush_radius + "."); + + else if(cmd[5]) Msg("§cToo many arguments."); + + else if(!cmd[3]) Msg("§cYou need to specify a radius."); + } + + else if(cmd[2] == "h") { + if(c2[0] && c2[0] >= 0 && c2[0] <= 255) { + if(cmd[4] && !cmd[5] && cmd[4] <= max_brush_radius) { + brush = ["cylinder", c2[0], c2[1], cmd[4], 1, true]; + Msg("Hollow cylinder brush shape equipped (" + cmd[3] + " by 1)."); + dismissBrushButton(); + openBrushButton(); + } + + else if(cmd[5] && !cmd[6] && cmd[4] <= max_brush_radius && cmd[5] <= max_brush_radius) { + brush = ["cylinder", c2[0], c2[1], cmd[4], cmd[5], true]; + Msg("Hollow cylinder brush shape equipped (" + cmd[3] + " by " + cmd[4] + ")."); + dismissBrushButton(); + openBrushButton(); + } + + else if(cmd[4] > max_brush_radius || cmd[5] > max_brush_radius) Msg("§cThe radius must be smaller than " + max_brush_radius + "."); + + else if(cmd[6]) Msg("§cToo many arguments."); + + else Msg("§cYou need to specify a radius."); + } + + else if(c2[0] > 255 || c2[0] < 0) Msg("§cInvalid block id/name."); + + else if(!c2[0]) Msg("§cYou need to specify a block."); + } + + else if(c1[0] > 255 || c1[0] < 0) Msg("§cInvalid block id/name."); + + else if(!cmd[2]) Msg("§cYou need to specify a block."); + break; + + case "s": + case "sphere": + case "cylinder": + if(c1[0] != "h" && c1[0] <= 255 && c1[0] >= 0) { + if(cmd[3] && !cmd[4] && cmd[3] <= max_brush_radius) { + brush = ["sphere", c1[0], c1[1], cmd[3], 0, false]; + Msg("Sphere brush shape equipped (" + cmd[3] + ")."); + dismissBrushButton(); + openBrushButton(); + } + + else if(cmd[3] > max_brush_radius) Msg("§cThe radius must be smaller than " + max_brush_radius + "."); + + else if(cmd[4]) Msg("§cToo many arguments."); + + else if(!cmd[3]) Msg("§cYou need to specify a radius."); + } + + else if(cmd[2] == "h") { + if(c2[0] && c2[0] >= 0 && c2[0] <= 255) { + if(cmd[4] && !cmd[5] && cmd[4] <= max_brush_radius) { + brush = ["sphere", c2[0], c2[1], cmd[4], 0, true]; + Msg("Sphere brush shape equipped (" + cmd[4] + ")."); + dismissBrushButton(); + openBrushButton(); + } + + else if(cmd[4] > max_brush_radius) Msg("§cThe radius must be smaller than " + max_brush_radius + "."); + + else if(cmd[5]) Msg("§cToo many arguments."); + + else Msg("§cYou need to specify a radius."); + } + + else if(c2[0] > 255 || c2[0] < 0) Msg("§cInvalid block id/name."); + + else if(!c2[0]) Msg("§cYou need to specify a block."); + } + + else if(c1[0] > 255 || c1[0] < 0) Msg("§cInvalid block id/name."); + + else if(!cmd[2]) Msg("§cYou need to specify a block."); + break; + + default: + Msg("§cInvalid brush."); + break; + } + } else Msg("§cYou need to specify a brush."); + } else Msg("§cCan't bind tool to a block."); + break; + + +/*############ +CYLINDER +############*/ + + case "/cyl": + if(cmd[1]) { + if(cmd[2] && !cmd[3]) { + saveUndoCylinder(cmd[2] * 2, pY, cmd[2] * 2, cmd[2], 1); + cylinder(c[0], c[1], cmd[2], 1, 0, false); + } + + else if(cmd[3] && !cmd[4]) { + saveUndoCylinder(cmd[2] * 2, cmd[3], cmd[2] * 2, cmd[2], cmd[3]); + cylinder(c[0], c[1], cmd[2], cmd[3], 0, false); + } + + else if(cmd[4]) Msg("§cToo many arguments."); + + else Msg("§cYou need to specify a radius."); + } + + else Msg("§cYou need to specify a block."); + break; + + +/*############ +HOLLOW CYLINDER +############*/ + + case "/hcyl": + if(cmd[1]) { + if(cmd[2] && !cmd[3]) { + saveUndoCylinder(cmd[2] * 2, pY, cmd[2] * 2, cmd[2], 1); + cylinder(c[0], c[1], cmd[2], 1, 0, true); + } + + else if(cmd[3] && !cmd[4]) { + saveUndoCylinder(cmd[2] * 2, pY, cmd[2] * 2, cmd[2], 1); + cylinder(c[0], c[1], cmd[2], cmd[3], 0, true); + } + + else if(cmd[4]) Msg("§cToo many arguments."); + + else Msg("§cYou need to specify a radius."); + } + + else Msg("§cYou need to specify a block."); + break; + + +/*############ +SPHERE +############*/ + + case "/sphere": + if(cmd[1]) { + if(cmd[2] && !cmd[3]) { + saveUndoSphere(cmd[2] * 2, cmd[2] * 2, cmd[2] * 2, cmd[2]); + sphere(c[0], c[1], cmd[2], 0, false); + } + + else if(cmd[3]) Msg("§cToo many arguments."); + + else Msg("§cYou need to specify a radius."); + } + + else Msg("§cYou need to specify a block."); + break; + + +/*############ +HOLLOW SPHERE +############*/ + + case "/hsphere": + if(cmd[1]) { + if(cmd[2] && !cmd[3]) { + saveUndoSphere(cmd[2] * 2, cmd[2] * 2, cmd[2] * 2, cmd[2]); + sphere(c[0], c[1], cmd[2], 0, true); + } + + else if(cmd[3]) Msg("§cToo many arguments."); + + else Msg("§cYou need to specify a radius."); + } + + else Msg("§cYou need to specify a block."); + break; + + +/*############ +FORESTGEN +############*/ + + case "forestgen": + if(cmd[1] && !cmd[2]) { + saveUndoSphere(cmd[1] * 2, cmd[1] * 2, cmd[1] * 2, cmd[1]); + forestgen(cmd[1], "oak", 50, 0); + } + + else if(cmd[2] && !cmd[4]) { + switch(cmd[2]) { + case "oak": + case "tree": + case "regular": + saveUndoSphere(cmd[1] * 2, cmd[1] * 2, cmd[1] * 2, cmd[1]); + + if(cmd[3] && cmd[3] <= 100) forestgen(cmd[1], "oak", cmd[3], 0); + + else if(!cmd[3]) forestgen(cmd[1], "oak", 50, 0); + + else Msg("§cDensity must be smaller than 100."); + break; + + case "birch": + saveUndoSphere(cmd[1] * 2, cmd[1] * 2, cmd[1] * 2, cmd[1]); + + if(cmd[3] && cmd[3] <= 100) forestgen(cmd[1], "birch", cmd[3], 0); + + else if(!cmd[3]) forestgen(cmd[1], "birch", 50, 0); + + else Msg("§cDensity must be smaller than 100."); + break; + + case "spruce": + case "redwood": + case "sequoia": + saveUndoSphere(cmd[1] * 2, cmd[1] * 2, cmd[1] * 2, cmd[1]); + + if(cmd[3] && cmd[3] <= 100) forestgen(cmd[1], "spruce", cmd[3], 0); + + else if(!cmd[3]) forestgen(cmd[1], "spruce", 50, 0); + + else Msg("§cDensity must be smaller than 100."); + break; + + case "jungle": + case "smalljungle": + saveUndoSphere(cmd[1] * 2, cmd[1] * 2, cmd[1] * 2, cmd[1]); + + if(cmd[3] && cmd[3] <= 100) forestgen(cmd[1], "jungle", cmd[3], 0); + + else if(!cmd[3]) forestgen(cmd[1], "jungle", 50, 0); + + else Msg("§cDensity must be smaller than 100."); + break; + + default: + Msg("§cInvalid tree name."); + break; + } + } + + else if(cmd[4]) Msg("§cToo many arguments."); + + else Msg("§cYou need to specify a radius."); + break; + + +/*############ +PUMPKINS +############*/ + + case "pumpkins": + if(cmd[1] && !cmd[2]) { + saveUndoSphere(cmd[1] * 2, cmd[1] * 2, cmd[1] * 2, cmd[1]); + pumpkins(cmd[1], 0); + } + + else if(cmd[2]) Msg("§cToo many arguments."); + + else Msg("§cYou need to specify a radius."); + break; + + +/*############ +DEFAULT +############*/ + + case "undo": + case "/undo": + case "/count": + case "/copy": + case "/cut": + case "/paste": + case "/set": + case "/line": + case "/re": + case "/rep": + case "/replace": + case "/overlay": + case "/center": + case "/middle": + case "/walls": + case "/outline": + case "/faces": + case "/hollow": + case "/forest": + case "/flora": + if(pos1 == null || pos2 == null) Msg("§cYou need to make a selection first."); + break; + + default: + Msg("§cUnknown command. Type ''help'' for help."); + break; + } + } + + + if(pos1 != null && pos2 != null) { + switch(cmd[0]) { + +/*############ +COUNT +############*/ + + case "/count": + if(cmd[1] && !cmd[2]) { + if(c[0] >= 0 && c[0] <= 255) { + count(c[0], c[1], 0, false); + } + + else Msg("§cInvalid block id/name."); + } + + else if(cmd[2]) Msg("§cToo many arguments."); + + else Msg("§cYou need to specify a block."); + break; + + +/*############ +SIZE +############*/ + + case "/size": + + break; + + +/*############ +COPY +############*/ + + case "/copy": + if(cmd[1] && cmd[1] >= 0 && cmd[1] <= 255 && !cmd[2]) copy((maxX - minX) + 1, (maxY - minY) + 1, (maxZ - minZ) + 1, 0, cmd[1]); + + else if(cmd[1] < 0 && cmd[1] > 255) Msg("§cInvalid block id/name."); + + else if(cmd[2]) Msg("§cToo many arguments."); + + else copy((maxX - minX) + 1, (maxY - minY) + 1, (maxZ - minZ) + 1, 0, 0); + break; + + +/*############ +CUT +############*/ + + case "/cut": + if(cmd[1] && cmd[1] >= 0 && cmd[1] <= 255 && !cmd[2]) { + saveUndoDefault((maxX - minX) + 1, (maxY - minY) + 1, (maxZ - minZ) + 1); + cut((maxX - minX) + 1, (maxY - minY) + 1, (maxZ - minZ) + 1, 0, cmd[1]); + } + + else if(cmd[1] < 0 && cmd[1] > 255) Msg("§cInvalid block id/name."); + + else if(cmd[2]) Msg("§cToo many arguments."); + + else { + saveUndoDefault((maxX - minX) + 1, (maxY - minY) + 1, (maxZ - minZ) + 1); + cut((maxX - minX) + 1, (maxY - minY) + 1, (maxZ - minZ) + 1, 0, 0); + } + break; + + +/*############ +SET +############*/ + + case "/set": + if(cmd[1] && !cmd[2]) { + if(c[0] >= 0 && c[0] <= 255) { + saveUndoDefault((maxX - minX) + 1, (maxY - minY) + 1, (maxZ - minZ) + 1); + set(c[0], c[1], 0); + } + + else Msg("§cInvalid block id/name."); + } + + else if(cmd[2]) Msg("§cToo many arguments."); + + else Msg("§cYou need to specify a block."); + break; + + +/*############ +LINE +############*/ + + case "/line": + if(cmd[1] && !cmd[2]) { + if(c[0] >= 0 && c[0] <= 255) { + saveUndoDefault((maxX - minX) + 1, (maxY - minY) + 1, (maxZ - minZ) + 1); + line(c[0], c[1], 0); + } + + else Msg("§cInvalid block id/name."); + } + + else if(cmd[2]) Msg("§cToo many arguments."); + + else Msg("§cYou need to specify a block."); + break; + + +/*############ +REPLACE +############*/ + + case "/re": + case "/rep": + case "/replace": + if(cmd[1] && !cmd[2]) { + if(c[0] >= 0 && c[0] <= 255) { + saveUndoDefault((maxX - minX) + 1, (maxY - minY) + 1, (maxZ - minZ) + 1); + replace(c[0], c[1], 0); + } + + else Msg("§cInvalid block id/name."); + } + + else if(cmd[2] && !cmd[3]) { + if(c[0] >= 0 && c[0] <= 255) { + saveUndoDefault((maxX - minX) + 1, (maxY - minY) + 1, (maxZ - minZ) + 1); + replace1(c1[0], c1[1], c[0], 0); + } + + else Msg("§cInvalid block id/name."); + } + + else if(cmd[3]) Msg("§cToo many arguments."); + + else Msg("§cYou need to specify a block."); + break; + + +/*############ +OVERLAY +############*/ + + case "/overlay": + if(cmd[1] && !cmd[2]) { + if(c[0] >= 0 && c[0] <= 255) { + saveUndoDefault((maxX - minX) + 1, (maxY - minY) + 1, (maxZ - minZ) + 1); + overlay(c[0], c[1], 0); + } + + else Msg("§cInvalid block id/name."); + } + + else if(cmd[2]) Msg("§cToo many arguments."); + + else Msg("§cYou need to specify a block."); + break; + + +/*############ +CENTER +############*/ + + case "/center": + case "/middle": + if(cmd[1] && !cmd[2]) { + if(c[0] >= 0 && c[0] <= 255) { + saveUndoDefault((maxX - minX) + 1, (maxY - minY) + 1, (maxZ - minZ) + 1); + center(c[0], c[1], 0); + } + + else Msg("§cInvalid block id/name."); + } + + else if(cmd[2]) Msg("§cToo many arguments."); + + else Msg("§cYou need to specify a block."); + break; + + +/*############ +WALLS +############*/ + + case "/walls": + if(cmd[1] && !cmd[2]) { + if(c[0] >= 0 && c[0] <= 255) { + saveUndoDefault((maxX - minX) + 1, (maxY - minY) + 1, (maxZ - minZ) + 1); + walls(c[0], c[1], 0); + } + + else Msg("§cInvalid block id/name."); + } + + else if(cmd[2]) Msg("§cToo many arguments."); + + else Msg("§cYou need to specify a block."); + break; + + +/*############ +OUTLINE +############*/ + + case "/outline": + case "/faces": + if(cmd[1] && !cmd[2]) { + if(c[0] >= 0 && c[0] <= 255) { + saveUndoDefault((maxX - minX) + 1, (maxY - minY) + 1, (maxZ - minZ) + 1); + outline(c[0], c[1], 0); + } + + else Msg("§cInvalid block id/name."); + } + + else if(cmd[2]) Msg("§cToo many arguments."); + + else Msg("§cYou need to specify a block."); + break; + + +/*############ +HOLLOW +############*/ + + case "/hollow": + if(cmd[1] && !cmd[2]) { + if(c[0] >= 0 && c[0] <= 255) { + saveUndoDefault((maxX - minX) + 1, (maxY - minY) + 1, (maxZ - minZ) + 1); + hollow(c[0], c[1], 0); + } + + else Msg("§cInvalid block id/name."); + } + + else if(cmd[2]) Msg("§cToo many arguments."); + + else hollow(0, 0, 0); + break; + + +/*############ +FOREST +############*/ + + case "/forest": + if(cmd[1] && !cmd[3]) { + switch(cmd[1]) { + case "oak": + case "tree": + case "regular": + saveUndoTree((maxX- minX) + 1, (maxY - minY) + 1, (maxZ - minZ) + 1); + + if(cmd[2] && cmd[2] <= 100) forest("oak", cmd[2], 0); + + else if(!cmd[2]) forest("oak", 50, 0); + + else Msg("§cDensity must be smaller than 100."); + break; + + case "birch": + saveUndoTree((maxX- minX) + 1, (maxY - minY) + 1, (maxZ - minZ) + 1); + + if(cmd[2] && cmd[2] <= 100) forest("birch", cmd[2], 0); + + else if(!cmd[2]) forest("birch", 50, 0); + + else Msg("§cDensity must be smaller than 100."); + break; + + case "spruce": + case "redwood": + case "sequoia": + saveUndoTree((maxX- minX) + 1, (maxY - minY) + 1, (maxZ - minZ) + 1); + + if(cmd[2] && cmd[2] <= 100) forest("spruce", cmd[2], 0); + + else if(!cmd[2]) forest("spruce", 50, 0); + + else Msg("§cDensity must be smaller than 100."); + break; + + case "jungle": + case "smalljungle": + saveUndoTree((maxX- minX) + 1, (maxY - minY) + 1, (maxZ - minZ) + 1); + + if(cmd[2] && cmd[2] <= 100) forest("jungle", cmd[2], 0); + + else if(!cmd[2]) forest("jungle", 50, 0); + + else Msg("§cDensity must be smaller than 100."); + break; + + default: + Msg("§cInvalid tree name."); + break; + } + } + + else if(cmd[3]) Msg("§cToo many arguments."); + + else { + saveUndoTree((maxX- minX) + 1, (maxY - minY) + 1, (maxZ - minZ) + 1); + + if(cmd[2] && cmd[2] <= 100) forest("oak", cmd[2], 0); + + else if(!cmd[2]) forest("oak", 50, 0); + + else Msg("§cDensity must be smaller than 100."); + } + break; + + +/*############ +FLORA +############*/ + + case "/flora": + saveUndoDefault((maxX- minX) + 1, (maxY - minY) + 1, (maxZ - minZ) + 1); + + if(cmd[1] && !cmd[2] && cmd[1] <= 100) flora(cmd[1], 0); + + else if(!cmd[1]) flora(50, 0); + + else if(cmd[2]) Msg("§cToo many arguments."); + + else Msg("§cDensity must be smaller than 100."); + break; + } + } + } + } + break; + } +} + + + +/*############################## +POSITIONS +##############################*/ + +function useItem(x, y, z, item, block, side) { + if(item == wand_item && toggle_wand == false) { + preventDefault(); + + switch(selector) { + case 1: + pos2 = [x, y, z]; + Msg("Second Position set to (" + pos2[0] + ".0, " + pos2[1] + ".0, " + pos2[2] + ".0)."); + break; + } + } +} + + +function destroyBlock(x, y, z, side) { + if(getCarriedItem() == wand_item && toggle_wand == false) { + preventDefault(); + + if(Level.getGameMode() == 1) { + switch(selector) { + case 1: + pos1 = [x, y, z]; + Msg("First Position set to (" + pos1[0] + ".0, " + pos1[1] + ".0, " + pos1[2] + ".0)."); + break; + } + } + } +} + + +function startDestroyBlock(x, y, z, side) { + if(getCarriedItem() == wand_item && toggle_wand == false) { + if(Level.getGameMode() == 0) { + preventDefault(); + switch(selector) { + case 1: + pos1 = [x, y, z]; + Msg("First Position set to (" + pos1[0] + ".0, " + pos1[1] + ".0, " + pos1[2] + ".0)."); + break; + } + } + } +} + + + +/*############################## +NORMAL FUNCTIONS +##############################*/ + +function modTick() { + if(pos1 != null && pos2 != null) { + minX = Math.min(pos1[0], pos2[0]); + minY = Math.min(pos1[1], pos2[1]); + minZ = Math.min(pos1[2], pos2[2]); + maxX = Math.max(pos1[0], pos2[0]); + maxY = Math.max(pos1[1], pos2[1]); + maxZ = Math.max(pos1[2], pos2[2]); + } + + pX = Math.round(getPlayerX()); + pY = getPlayerY() - 1; + pZ = Math.round(getPlayerZ()); + + Dir();Dir();Dir();Dir();Dir();Dir();Dir();Dir();Dir();Dir();Dir();Dir();Dir();Dir();Dir();Dir();Dir();Dir(); Dir();Dir();Dir();Dir();Dir();Dir();Dir();Dir();Dir();Dir();Dir();Dir();Dir();Dir();Dir();Dir();Dir();Dir();Dir();Dir();Dir();Dir();Dir();Dir();Dir();Dir();Dir();Dir();Dir();Dir();Dir();Dir(); + + if(Player.getCarriedItem() < 256) dismissBrushButton(); +} + + +function Dir() { + var pitch = ((Entity.getPitch(getPlayerEnt()) + 90) * Math.PI) / 180; + var yaw = ((Entity.getYaw(getPlayerEnt()) + 90) * Math.PI) / 180; + var xYaw = pX + ((Math.sin(pitch) * Math.cos(yaw)) * count); + var yPitch = pY + ((Math.cos(pitch)) * count); + var zYaw = pZ + ((Math.sin(pitch) * Math.sin(yaw)) * count); +//WIP: Commented because of unfinished world +/* + if(getTile(xYaw, yPitch, zYaw) == 0 && count < 100) count++; + + else { + xDir = pX + ((Math.sin(pitch) * Math.cos(yaw)) * count); + yDir = pY + ((Math.cos(pitch)) * (count - 1)); + zDir = pZ + ((Math.sin(pitch) * Math.sin(yaw)) * count); + count = 1; + } +*/ +} + + + +/*############################## +WORLDEDIT FUNCTIONS +##############################*/ + +/*############ +HELP +############*/ + +function showHelp(Help) { + switch(Help) { + case "1": + Msg("Showing help page 1/6:"); + Msg(" //br [-h] [heigth]"); + Msg(" //center "); + Msg(" //copy [leave-block]"); + Msg(" //count "); + Msg(" //cut [leave-block]"); + break; + + case "2": + Msg("Showing help page 2/6:"); + Msg(" //cyl [height]"); + Msg(" //flora [density]"); + Msg(" //forest [type [density]]"); + Msg(" /forestgen [type [density]]"); + Msg(" /help [page/command name]"); + break; + + case "3": + Msg("Showing help page 3/6:"); + Msg(" //hcyl [height]"); + Msg(" //hollow [block]"); + Msg(" //hsphere ") + Msg(" //line "); + Msg(" //outline "); + break; + + case "4": + Msg("Showing help page 4/6:"); + Msg(" //overlay "); + Msg(" //paste"); + Msg(" /pumpkins "); + Msg(" //pos1 [x, y, z]") + Msg(" //pos2 [x, y, z]"); + break; + + case "5": + Msg("Showing help page 5/6:"); + Msg(" //replace "); + Msg(" //replace "); + Msg(" //sel [selector]"); + Msg(" //set "); + Msg(" //sphere "); + break; + + case "6": + Msg("Showing help page 6/6:"); + Msg(" /undo, //undo"); + Msg(" /toggleeditwand"); + Msg(" //walls "); + Msg(" /wand"); + break; + + default: + Msg("§cInvalid help."); + break; + } +} + + +/*############ +UNDO +############*/ + +function Undo() { + for(var a = 0; a < undo.length; a++) { + for(var b = 0; b < undo[0].length; b++) { + for(var c = 0; c < undo[0][0].length; c++) { + setTile(undoX + a, undoY + b, undoZ + c, undo[a][b][c][0], undo[a][b][c][1]); + } + } + } Msg("Undo successful."); +} + + +function saveUndoDefault(x, y, z) { + undoX = minX; + undoY = minY; + undoZ = minZ; + + undo = [x]; + for(var a = 0; a < x; a++) { + undo[a] = [y]; + for(var b = 0; b < y; b++) { + undo[a][b] = [z]; + for(var c = 0; c < z; c++) { + undo[a][b][c] = [getTile(minX + a, minY + b, minZ + c), Level.getData(minX + a, minY + b, minZ + c)]; + } + } + } +} + + +function saveUndoTree(x, y, z) { + undoX = minX; + undoY = minY; + undoZ = minZ; + + undo = [x]; + for(var a = -3; a < x + 3; a++) { + undo[a] = [y]; + for(var b = 0; b < y + 15; b++) { + undo[a][b] = [z]; + for(var c = -3; c < z + 3; c++) { + undo[a][b][c] = [getTile(minX + a, minY + b, minZ + c), Level.getData(minX + a, minY + b, minZ + c)]; + } + } + } +} + + +function saveUndoCylinder(x, y, z, Radius, Height) { + undoX = pX - Radius; + undoY = pY; + undoZ = pZ - Radius; + + undo = [x]; + for(var a = -x; a <= x; a++) { + undo[a] = [y]; + for(var b = 0; b < Height; b++) { + undo[a][b] = [z]; + for(var c = -z; c <= x; c++) { + undo[a][b][c] = [getTile(pX - Radius + a, pY + b, pZ - Radius + c), Level.getData(pX - Radius + a, pY + b, pZ - Radius + c)]; + } + } + } +} + + +function saveUndoSphere(x, y, z, Radius) { + undoX = pX - Radius; + undoY = pY - Radius; + undoZ = pZ - Radius; + + undo = [x]; + for(var a = -x; a < x; a++) { + undo[a] = [y]; + for(var b = -y; b < y; b++) { + undo[a][b] = [z]; + for(var c = -z; c < x; c++) { + undo[a][b][c] = [getTile(pX - Radius + a, pY - Radius + b, pZ - Radius + c), Level.getData(pX - Radius + a, pY - Radius + b, pZ - Radius + c)]; + } + } + } +} + + +function saveUndoPaste() { + x = clipboard.length; + y = clipboard[0].length; + z = clipboard[0][0].length; + undoX = pX; + undoY = pY; + undoZ = pZ; + + undo = [x]; + for(var a = 0; a <= x; a++) { + undo[a] = [y]; + for(var b = 0; b <= y; b++) { + undo[a][b] = [z]; + for(var c = 0; c <= z; c++) { + undo[a][b][c] = [getTile(pX + a, pY + b, pZ + c), Level.getData(pX + a, pY + b, pZ + c)]; + } + } + } +} + + +/*############ +COPY +############*/ + +function copy(x, y, z, affected, Block) { + clipboard = [x] + for(var a = 0; a < x; a++) { + clipboard[a] = [y] + for(var b = 0; b < y; b++) { + clipboard[a][b] = [z] + for(var c = 0; c < z; c++) { + if(getTile(minX + a, minY + b, minZ + c) == Block) clipboard[a][b][c] = [0, 0]; + + else clipboard[a][b][c] = [getTile(minX + a, minY + b, minZ + c), Level.getData(minX + a, minY + b, minZ + c)]; + affected++; + } + } + } Msg(affected + " block(s) were copied."); +} + + +/*############ +CUT +############*/ + +function cut(x, y, z, affected, Block) { + clipboard = [x] + for(var a = 0; a < x; a++) { + clipboard[a] = [y] + for(var b = 0; b < y; b++) { + clipboard[a][b] = [z] + for(var c = 0; c < z; c++) { + if(getTile(minX + a, minY + b, minZ + c) == Block) { + setTile(minX + a, minY + b, minZ + c, 0, 0); + clipboard[a][b][c] = [0, 0]; + } + + else { + setTile(minX + a, minY + b, minZ + c, 0, 0); + clipboard[a][b][c] = [getTile(minX + a, minY + b, minZ + c), Level.getData(minX + a, minY + b, minZ + c)]; + } + + affected++; + } + } + } Msg(affected + " block(s) were cutted."); +} + + +/*############ +PASTE +############*/ + +function paste(affected) { + for(var a = 0; a < clipboard.length; a++) { + for(var b = 0; b < clipboard[0].length; b++) { + for(var c = 0; c < clipboard[0][0].length; c++) { + setTile(pX + a, pY + b, pZ + c, clipboard[a][b][c][0], clipboard[a][b][c][1]); + affected++; + } + } + } Msg(affected + " block(s) were pasted."); +} + + +/*############ +CYLINDER +############*/ + +function cylinder(Block, Data, Radius, Height, affected, Hollow) { + for(var x = -Radius; x <= Radius; x++) { + for(var y = 0; y < Height; y++) { + for(var z = -Radius; z <= Radius; z++) { + if(x * x + z * z <= Radius * Radius) { + if(Hollow == false) { + setTile(pX + x, pY + y, pZ + z, Block, Data); + affected++; + } + + else { + if(x * x + z * z > (Radius - 1) * (Radius - 1)) { + setTile(pX + x, pY + y, pZ + z, Block, Data); + affected++; + } + } + } + } + } + } Msg(affected + " block(s) have been created."); +} + + +function brushCylinder(Block, Data, Radius, Height, Hollow, a, b, c) { + for(var x = -Radius; x <= Radius; x++) { + for(var y = 0; y < Height; y++) { + for(var z = -Radius; z <= Radius; z++) { + if(x * x + z * z <= Radius * Radius) { + if(mask == -1) { + if(Hollow == false) setTile(a + x, b + y - 1, c + z, Block, Data); + + else { + if(x * x + z * z > (Radius - 1) * (Radius - 1)) setTile(a + x, b + y - 1, c + z, Block, Data); + } + } + + else { + if(getTile(a + x, b + y, c + z) == mask) { + if(Hollow == false) setTile(a + x, b + y - 1, c + z, Block, Data); + + else { + if(x * x + z * z > (Radius - 1) * (Radius - 1)) setTile(a + x, b + y - 1, c + z, Block, Data); + } + } + } + } + } + } + } +} + + +/*############ +SPHERE +############*/ + +function sphere(Block, Data, Radius, affected, Hollow) { + for(var x = -Radius; x <= Radius; x++) { + for(var y = -Radius; y <= Radius; y++) { + for(var z = -Radius; z <= Radius; z++) { + if(x * x + y * y + z * z <= Radius * Radius) { + if(Hollow == false) { + setTile(pX + x, pY + y, pZ + z, Block, Data); + affected++; + } + + else { + if(x * x + y * y + z * z > (Radius - 1) * (Radius - 1)) { + setTile(pX + x, pY + y, pZ + z, Block, Data); + affected++; + } + } + } + } + } + } Msg(affected + " block(s) have been created."); +} + + +function brushSphere(Block, Data, Radius, Hollow, a, b, c) { + for(var x = -Radius; x <= Radius; x++) { + for(var y = -Radius; y <= Radius; y++) { + for(var z = -Radius; z <= Radius; z++) { + if(x * x + y * y + z * z <= Radius * Radius) { + if(mask == -1) { + if(Hollow == false) setTile(a + x, b + y - 1, c + z, Block, Data); + + else { + if(x * x + y * y + z * z > (Radius - 1) * (Radius - 1)) setTile(a + x, b + y - 1, c + z, Block, Data); + } + } + + else { + if(getTile(a + x, b + y, c + z) == mask) { + if(Hollow == false) setTile(a + x, b + y - 1, c + z, Block, Data); + + else { + if(x * x + y * y + z * z > (Radius - 1) * (Radius - 1)) setTile(a + x, b + y - 1, c + z, Block, Data); + } + } + } + } + } + } + } +} + + +/*############ +FORESTGEN +############*/ + +function forestgen(Radius, Type, Density, affected) { + for(var x = -Radius; x <= Radius; x++) { + for(var y = -Radius; y <= Radius; y++) { + for(var z = -Radius; z <= Radius; z++) { + if(Math.floor(Math.random() * 400) + 0 <= Density && (getTile(pX + x, pY + y - 1, pZ + z) == 2 || getTile(pX + x, pY + y - 1, pZ + z) == 3) && getTile(pX + x, pY + y, pZ + z) == 0) { + switch(Type) { + case "oak": + affected++; + forestOak(pX + x, pY + y - 1, pZ + z); + break; + + case "birch": + affected++; + forestBirch(pX + x, pY + y - 1, pZ + z); + break; + + case "spruce": + if(Math.floor(Math.random() * 10) + 1 == 1) { + affected++; + forestSpruce(pX + x, pY + y - 1, pZ + z); + } + break; + + case "jungle": + affected++; + forestJungle(pX + x, pY + y - 1, pZ + z); + break; + } + } + } + } + } Msg(affected + " tree(s) have been created."); +} + + +/*############ +PUMPKINS +############*/ + +function pumpkins(Radius, affected) { + for(var x = -Radius; x <= Radius; x++) { + for(var y = -Radius; y <= Radius; y++) { + for(var z = -Radius; z <= Radius; z++) { + if(Math.floor(Math.random() * 200) + 1 == 1 && (getTile(pX + x, pY + y - 1, pZ + z) == 2 || getTile(pX + x, pY + y - 1, pZ + z) == 3) && getTile(pX + x, pY + y, pZ + z) == 0) { + createPumpkins(pX + x, pY + y, pZ + z); + affected++; + } + } + } + } Msg(affected + " pumpkin patche(s) created."); +} + + +/*############ +COUNT +############*/ + +function count(Block, Data, affected, useData) { + for(var x = minX; x <= maxX; x++) { + for(var y = minY; y <= maxY; y++) { + for(var z = minZ; z <= maxZ; z++) { + if(useData == true) { + if(getTile(x, y, z) == Block && Level.getData(x, y, z) == Data) affected++; + } + + else { + if(getTile(x, y, z) == Block) affected++; + } + } + } + } Msg("Counted: " + affected); +} + + +/*############ +SET +############*/ + +function set(Block, Data, affected) { + for(var x = minX; x <= maxX; x++) { + for(var y = minY; y <= maxY; y++) { + for(var z = minZ; z <= maxZ; z++) { + setTile(x, y, z, Block, Data); + affected++; + } + } + } Msg(affected + " block(s) have been changed."); +} + + +/*############ +LINE +############*/ + +function line(Block, Data, affected) { + for(var x = minX; x <= maxX; x++) { + for(var y = minY; y <= maxY; y++) { + for(var z = minZ; z <= maxZ; z++) { + if((x == minX && y == minY) || (x == minX && z == minZ) || (x == minX && y == maxY) || (x == minX && z == maxZ) || (x == maxX && y == minY) || (x == maxX && z == minZ) || (x == maxX && y == maxY) || (x == maxX && z == maxZ) || (y == minY && z == minZ) || (y == minY && z == maxZ) || (y == maxY && z == minZ) || (y == maxY && z == maxZ)) { + setTile(x, y, z, Block, Data); + affected++; + } + } + } + } Msg(affected + " block(s) have been changed."); +} + + +/*############ +REPLACE +############*/ + +function replace(Block, Data, affected) { + for(var x = minX; x <= maxX; x++) { + for(var y = minY; y <= maxY; y++) { + for(var z = minZ; z <= maxZ; z++) { + if(getTile(x, y, z) != 0) { + setTile(x, y, z, Block, Data); + affected++; + } + } + } + } Msg(affected + " block(s) have been replaced."); +} + + +function replace1(Block, Data, RBlock, affected) { + for(var x = minX; x <= maxX; x++) { + for(var y = minY; y <= maxY; y++) { + for(var z = minZ; z <= maxZ; z++) { + if(getTile(x, y, z) == RBlock) { + setTile(x, y, z, Block, Data); + affected++; + } + } + } + } Msg(affected + " block(s) have been replaced."); +} + + +/*############ +OVERLAY +############*/ + +function overlay(Block, Data, affected) { + for(var x = minX; x <= maxX; x++) { + for(var z = minZ; z <= maxZ; z++) { + for(var y = maxY; y >= minY; y--) { + if(getTile(x, y, z) != 0 && getTile(x, y + 1, z) == 0) { + setTile(x, y + 1, z, Block, Data); + affected++; + break; + return y; + } + } + } + } Msg(affected + " block(s) have been overlaid."); +} + + +/*############ +CENTER +############*/ + +function center(Block, Data, affected) { + for(var x = minX; x <= maxX; x++) { + for(var y = minY; y <= maxY; y++) { + for(var z = minZ; z <= maxZ; z++) { + if(x == Math.round((minX + maxX) / 2) && y == Math.round((minY + maxY) / 2) && z == Math.round((minZ + maxZ) / 2)) { + setTile(x, y, z, Block, Data); + affected++; + } + } + } + } Msg("Center set (" + affected + " block(s) changed)."); +} + + +/*############ +WALLS +############*/ + +function walls(Block, Data, affected) { + for(var x = minX; x <= maxX; x++) { + for(var y = minY; y <= maxY; y++) { + for(var z = minZ; z <= maxZ; z++) { + if(x == minX || x == maxX || z == minZ || z == maxZ) { + setTile(x, y, z, Block, Data); + affected++; + } + } + } + } Msg(affected + " block(s) have been changed."); +} + + +/*############ +OUTLINE +############*/ + +function outline(Block, Data, affected) { + for(var x = minX; x <= maxX; x++) { + for(var y = minY; y <= maxY; y++) { + for(var z = minZ; z <= maxZ; z++) { + if(x == minX || x == maxX || y == minY || y == maxY || z == minZ || z == maxZ) { + setTile(x, y, z, Block, Data); + affected++; + } + } + } + } Msg(affected + " block(s) have been changed."); +} + + +/*############ +HOLLOW +############*/ + +function hollow(Block, Data, affected) { + for(var x = minX; x <= maxX; x++) { + for(var y = minY; y <= maxY; y++) { + for(var z = minZ; z <= maxZ; z++) { + if(x != minX && x != maxX && y != minY && y != maxY && z != minZ && z != maxZ) { + setTile(x, y, z, Block, Data); + affected++; + } + } + } + } Msg(affected + " block(s) have been changed."); +} + + +/*############ +FOREST +############*/ + +function forest(Type, Density, affected) { + for(var x = minX; x <= maxX; x++) { + for(var y = minY; y <= maxY; y++) { + for(var z = minZ; z <= maxZ; z++) { + if(Math.floor(Math.random() * 400) + 0 <= Density && (getTile(x, y - 1, z) == 2 || getTile(x, y - 1, z) == 3) && getTile(x, y, z) == 0) { + switch(Type) { + case "oak": + affected++; + forestOak(x, y - 1, z); + break; + + case "birch": + affected++; + forestBirch(x, y - 1, z); + break; + + case "spruce": + if(Math.floor(Math.random() * 10) + 1 == 1) { + affected++; + forestSpruce(x, y - 1, z); + } + break; + + case "jungle": + affected++; + forestJungle(x, y - 1, z); + break; + } + } + } + } + } Msg(affected + " tree(s) have been created."); +} + + +/*############ +FLORA +############*/ + +function flora(Density, affected) { + for(var x = minX; x <= maxX; x++) { + for(var y = minY; y <= maxY; y++) { + for(var z = minZ; z <= maxZ; z++) { + if(Math.floor(Math.random() * 150) + 0 <= Density && (getTile(x, y - 1, z) == 2 || getTile(x, y - 1, z) == 3) && getTile(x, y, z) == 0) { + if(Math.floor(Math.random() * 3) + 0 == 0) { + affected++; + setTile(x, y, z, 31, Math.floor(Math.random() * 2) + 0); + } + + else if(Math.floor(Math.random() * 3) + 0 == 1) { + affected++; + setTile(x, y, z, 37, 0); + } + + else if(Math.floor(Math.random() * 3) + 0 == 2) { + affected++; + setTile(x, y, z, 38, Math.floor(Math.random() * 9) + 0); + } + } + + else if(Math.floor(Math.random() * 150) + 0 <= Density && getTile(x, y - 1, z) == 12 && getTile(x, y, z) == 0) { + if(Math.floor(Math.random() * 2) + 0 == 0) { + affected++; + setTile(x, y, z, 81, 0); + } + + else if(Math.floor(Math.random() * 2) + 0 == 1) { + affected++; + setTile(x, y, z, 32, 0); + } + } + } + } + } Msg(affected + " flora created."); +} + + + +/*############################## +TREE GENERATION +##############################*/ + +function forestOak(x, y, z) { + var height = Math.floor(Math.random() * 3) + 1; + + for(var a = -2; a < 3; a++) { + for(var b = 1; b < 3; b++) { + for(var c = -2; c < 3; c++) { + if(getTile(x + a, y + b + height, z + c) == 0) { + setTile(x + a, y + b + height, z + c, 18, 0); + } + } + } + } + + for(var d = 0; d <= height + 2; d++) { + setTile(x, y + d + 1, z, 17, 0); + } + + setTile(x + 1, y + height + 3, z, 18, 0); + setTile(x - 1, y + height + 3, z, 18, 0); + setTile(x, y + height + 3, z + 1, 18, 0); + setTile(x, y + height + 3, z - 1, 18, 0); + setTile(x, y + height + 4, z, 18, 0); + setTile(x + 1, y + height + 4, z, 18, 0); + setTile(x - 1, y + height + 4, z, 18, 0); + setTile(x, y + height + 4, z + 1, 18, 0); + setTile(x, y + height + 4, z - 1, 18, 0); +} + + +function forestBirch(x, y, z) { + var height = Math.floor(Math.random() * 4) + 2; + + for(var a = -2; a < 3; a++) { + for(var b = 1; b < 3; b++) { + for(var c = -2; c < 3; c++) { + if(getTile(x + a, y + b + height, z + c) == 0) { + setTile(x + a, y + b + height, z + c, 18, 2); + } + } + } + } + + for(var d = 0; d <= height + 2; d++) { + setTile(x, y + d + 1, z, 17, 2); + } + + setTile(x + 1, y + height + 3, z, 18, 2); + setTile(x - 1, y + height + 3, z, 18, 2); + setTile(x, y + height + 3, z + 1, 18, 2); + setTile(x, y + height + 3, z - 1, 18, 2); + setTile(x, y + height + 4, z, 18, 2); + setTile(x + 1, y + height + 4, z, 18, 2); + setTile(x - 1, y + height + 4, z, 18, 2); + setTile(x, y + height + 4, z + 1, 18, 2); + setTile(x, y + height + 4, z - 1, 18, 2); +} + + +function forestSpruce(x, y, z) { + var height = 4; + + for(var a = -2; a < 3; a++) { + for(var b = 0; b < 1; b++) { + for(var c = -2; c < 3; c++) { + if(getTile(x + a, y + b + height + 1, z + c) == 0) { + setTile(x + a, y + b + height + 1, z + c, 18, 1); + setTile(x + 2, y + b + height + 1, z + 2, 0, 0); + setTile(x - 2, y + b + height + 1, z - 2, 0, 0); + setTile(x + 2, y + b + height + 1, z - 2, 0, 0); + setTile(x - 2, y + b + height + 1, z + 2, 0, 0); + } + } + } + } + + for(var a = -2; a < 3; a++) { + for(var b = 0; b < 1; b++) { + for(var c = -2; c < 3; c++) { + if(getTile(x + a, y + b + height - 1, z + c) == 0) { + setTile(x + a, y + b + height - 1, z + c, 18, 1); + setTile(x + 2, y + b + height - 1, z + 2, 0, 0); + setTile(x - 2, y + b + height - 1, z - 2, 0, 0); + setTile(x + 2, y + b + height - 1, z - 2, 0, 0); + setTile(x - 2, y + b + height - 1, z + 2, 0, 0); + } + } + } + } + + for(var a = -3; a < 4; a++) { + for(var b = 0; b < 1; b++) { + for(var c = -3; c < 4; c++) { + if(getTile(x + a, y + b + height - 2, z + c) == 0) { + setTile(x + a, y + b + height - 2, z + c, 18, 1); + setTile(x + 3, y + b + height - 2, z + 3, 0, 0); + setTile(x - 3, y + b + height - 2, z - 3, 0, 0); + setTile(x + 3, y + b + height - 2, z - 3, 0, 0); + setTile(x - 3, y + b + height - 2, z + 3, 0, 0); + setTile(x + 3, y + b + height - 2, z + 2, 0, 0); + setTile(x + 3, y + b + height - 2, z - 2, 0, 0); + setTile(x - 3, y + b + height - 2, z + 2, 0, 0); + setTile(x - 3, y + b + height - 2, z - 2, 0, 0); + setTile(x + 2, y + b + height - 2, z + 3, 0, 0); + setTile(x - 2, y + b + height - 2, z + 3, 0, 0); + setTile(x + 2, y + b + height - 2, z - 3, 0, 0); + setTile(x - 2, y + b + height - 2, z - 3, 0, 0); + } + } + } + } + + for(var d = 0; d <= height + 2; d++) { + setTile(x, y + d + 1, z, 17, 1); + } + + setTile(x + 1, y + height, z, 18, 1); + setTile(x - 1, y + height, z, 18, 1); + setTile(x, y + height, z + 1, 18, 1); + setTile(x, y + height, z - 1, 18, 1); + setTile(x + 1, y + height + 2, z, 18, 1); + setTile(x - 1, y + height + 2, z, 18, 1); + setTile(x, y + height + 2, z + 1, 18, 1); + setTile(x, y + height + 2, z - 1, 18, 1); + setTile(x, y + height + 3, z, 18, 1); + setTile(x + 1, y + height + 4, z, 18, 1); + setTile(x - 1, y + height + 4, z, 18, 1); + setTile(x, y + height + 4, z + 1, 18, 1); + setTile(x, y + height + 4, z - 1, 18, 1); + setTile(x, y + height + 4, z, 18, 1); +} + + +function forestJungle(x, y, z) { + var height = Math.floor(Math.random() * 6) + 2; + + for(var a = -2; a < 3; a++) { + for(var b = 1; b < 3; b++) { + for(var c = -2; c < 3; c++) { + if(getTile(x + a, y + b + height, z + c) == 0) { + setTile(x + a, y + b + height, z + c, 18, 3); + } + } + } + } + + for(var d = 0; d <= height + 2; d++) { + setTile(x, y + d + 1, z, 17, 3); + + switch(Math.floor(Math.random() * 10) + 1) { + case 1: + for(var e = 0; e <= height + 2; e++) { + if(getTile(x + 1, y + e, z) == 0) { + setTile(x + 1, y + e, z, 106, 2); + } + } + break; + + case 2: + for(var e = 0; e <= height + 2; e++) { + if(getTile(x - 1, y + e, z) == 0) { + setTile(x - 1, y + e, z, 106, 8); + } + } + break; + + case 3: + for(var e = 0; e <= height + 2; e++) { + if(getTile(x, y + e, z + 1) == 0) { + setTile(x, y + e, z + 1, 106, 4); + } + } + break; + + case 4: + for(var e = 0; e <= height + 2; e++) { + if(getTile(x, y + e, z - 1) == 0) { + setTile(x, y + e, z - 1, 106, 1); + } + } + break; + } + } + + setTile(x + 1, y + height + 3, z, 18, 3); + setTile(x - 1, y + height + 3, z, 18, 3); + setTile(x, y + height + 3, z + 1, 18, 3); + setTile(x, y + height + 3, z - 1, 18, 3); + setTile(x, y + height + 4, z, 18, 3); + setTile(x + 1, y + height + 4, z, 18, 3); + setTile(x - 1, y + height + 4, z, 18, 3); + setTile(x, y + height + 4, z + 1, 18, 3); + setTile(x, y + height + 4, z - 1, 18, 3); +} + + +function createPumpkins(x, y, z) { + switch(Math.floor(Math.random() * 3) + 1) { + case 1: + setTile(x, y, z, 86, 0); + setTile(x + 2, y, z, 86, 0); + setTile(x - 2, y, z - 1, 86, 0); + setTile(x + 3, y, z + 2, 86, 0); + setTile(x - 2, y, z + 3, 86, 0); + setTile(x, y, z - 3, 86, 0); + setTile(x, y, z + 2, 86, 0); + setTile(x + 1, y, z - 1, 18, 0); + setTile(x - 2, y, z + 1, 18, 0); + setTile(x + 1, y, z + 1, 18, 0); + setTile(x, y, z - 2, 18, 0); + break; + + case 2: + setTile(x + 3, y, z, 86, 0); + setTile(x + 2, y, z, 86, 0); + setTile(x - 1, y, z - 1, 86, 0); + setTile(x + 3, y, z + 2, 86, 0); + setTile(x - 4, y, z + 2, 86, 0); + setTile(x + 1, y, z - 2, 86, 0); + setTile(x + 1, y, z - 3, 18, 0); + setTile(x - 2, y, z + 1, 18, 0); + setTile(x + 1, y, z + 1, 18, 0); + setTile(x + 1, y, z - 2, 18, 0); + break; + + case 3: + setTile(x, y, z + 1, 86, 0); + setTile(x + 2, y, z, 86, 0); + setTile(x + 2, y, z - 1, 86, 0); + setTile(x + 3, y, z + 4, 86, 0); + setTile(x - 1, y, z + 3, 86, 0); + setTile(x + 1, y, z - 2, 86, 0); + setTile(x + 1, y, z - 1, 18, 0); + setTile(x - 2, y, z + 1, 18, 0); + setTile(x + 1, y, z, 18, 0); + setTile(x, y, z - 3, 18, 0); + break; + } +} + + + +/*############################## +MESSAGES +##############################*/ + +function Msg(msg) { + switch(coloured_messages) { + case false: + clientMessage(msg); + break; + + case true: + clientMessage("§d" + msg); + break; + } +} + + +/*############################## +GUI +##############################*/ + +function openBrushButton() { +} + + +function dismissBrushButton() { +} \ No newline at end of file diff --git a/lib/serverPlugins/modpe.js b/lib/serverPlugins/modpe.js new file mode 100644 index 0000000..f144f7f --- /dev/null +++ b/lib/serverPlugins/modpe.js @@ -0,0 +1,336 @@ +var vec3=require("vec3"); +var dir = require("node-dir"); +var fs = require("fs"); + +module.exports=inject; + +function requireFromString(src, filename) { + var Module = module.constructor; + var m = new Module(); + m._compile(src, filename); + return m.exports; +} + +function log(msg) { + console.log("[MODPE-NOINJECT] " + msg); +} + +function modpeApi() { + function euclideanMod(numerator, denominator) { + var result = numerator % denominator; + return result < 0 ? result + denominator : result; + } + + function Vec3(x, y, z) { + this.x = x; + this.y = y; + this.z = z; + } + Vec3.prototype.set = function (x, y, z) { + this.x = x; + this.y = y; + this.z = z; + return this; + }; + + Vec3.prototype.update = function (other) { + this.x = other.x; + this.y = other.y; + this.z = other.z; + return this; + }; + + Vec3.prototype.floored = function () { + return new Vec3(Math.floor(this.x), Math.floor(this.y), Math.floor(this.z)); + }; + + Vec3.prototype.floor = function () { + this.x = Math.floor(this.x); + this.y = Math.floor(this.y); + this.z = Math.floor(this.z); + return this; + }; + + Vec3.prototype.offset = function (dx, dy, dz) { + return new Vec3(this.x + dx, this.y + dy, this.z + dz); + }; + Vec3.prototype.translate = function (dx, dy, dz) { + this.x += dx; + this.y += dy; + this.z += dz; + return this; + }; + Vec3.prototype.add = function (other) { + this.x += other.x; + this.y += other.y; + this.z += other.z; + return this; + }; + Vec3.prototype.subtract = function (other) { + this.x -= other.x; + this.y -= other.y; + this.z -= other.z; + return this; + }; + Vec3.prototype.plus = function (other) { + return this.offset(other.x, other.y, other.z); + }; + Vec3.prototype.minus = function (other) { + return this.offset(-other.x, -other.y, -other.z); + }; + Vec3.prototype.scaled = function (scalar) { + return new Vec3(this.x * scalar, this.y * scalar, this.z * scalar); + }; + Vec3.prototype.abs = function () { + return new Vec3(Math.abs(this.x), Math.abs(this.y), Math.abs(this.z)); + }; + Vec3.prototype.volume = function () { + return this.x * this.y * this.z; + }; + Vec3.prototype.modulus = function (other) { + return new Vec3( + euclideanMod(this.x, other.x) + , euclideanMod(this.y, other.y) + , euclideanMod(this.z, other.z)); + }; + Vec3.prototype.distanceTo = function (other) { + var dx = other.x - this.x; + var dy = other.y - this.y; + var dz = other.z - this.z; + return Math.sqrt(dx * dx + dy * dy + dz * dz); + }; + Vec3.prototype.equals = function (other) { + return this.x === other.x && this.y === other.y && this.z === other.z; + }; + Vec3.prototype.toString = function () { + return "(" + this.x + ", " + this.y + ", " + this.z + ")"; + }; + Vec3.prototype.clone = function () { + return this.offset(0, 0, 0); + }; + Vec3.prototype.min = function (other) { + return new Vec3(Math.min(this.x, other.x), Math.min(this.y, other.y), Math.min(this.z, other.z)); + }; + Vec3.prototype.max = function (other) { + return new Vec3(Math.max(this.x, other.x), Math.max(this.y, other.y), Math.max(this.z, other.z)); + }; + vec3 = Vec3; + + var server = null; + var player = null; + + module.exports.startDestroyBlock = startDestroyBlock; + module.exports.destroyBlock = destroyBlock; + module.exports.newLevel = newLevel; + module.exports.procCmd = procCmd; + module.exports.exec = exec; + module.exports.modTick = modTick; + module.exports.useItem = useItem; + module.exports.initSquid = initSquid; + function modTick(){} + function newLevel(){} + + function useItem(x,y,z,itemId,blockId){} + function startDestroyBlock(x,y,z,side){} + function destroyBlock(x,y,z,side){} + function procCmd(command){} + function exec(code){eval(code)} + + function initSquid(pl1, srv) { + player = pl1; + server = srv; + } + + function clientMessage(message) { + console.log(message); + player.chat(message); + } + + function setTile(x, y, z, id, damage) { + server.setBlock(new vec3(x, y, z), id); + } + + function getTile(x, y, z) { + server.world.getBlockType(new vec3(x, y, z)); + } + + function preventDefault() { + } + + function getPlayerX() { + return player.entity.position.x/32; + } + + function getPlayerY() { + return player.entity.position.y/32; + } + + function getPlayerZ() { + return player.entity.position.z/32; + } + + function getPlayerEnt() { + return null; + } + + function getCarriedItem() { + return player.heldItem.blockId; + } + + var Player = { + getCarriedItem: function () { + return player.heldItem.blockId; + } + }; + var Entity = { + getPitch: function () { + return 1; + } + , getYaw: function () { + return 1; + } + }; + var Level = { + getGameMode: function () { + return player.gameMode; + } + , getData: function (x, y, z) { + return 0; + } + }; +} + +function convert(code) { + log("Started conversion..."); + var api = modpeApi.toString() + .split("\n"); + api[0] = ""; + api[api.length - 1] = ""; + var finapi = api.join("\n"); + code = finapi + code; + return code; +} + +function inject(serv,settings) +{ + function log(msg){ + serv.log("[MPE]: "+msg); + } + if(!settings.modpe){ + log("Modpe support is not enabled, disabling injecting..."); + return; + } + log("Modpe injection start..."); + var modPePluginsDir = "./lib/modpePlugins"; + log("Place your scripts in " + modPePluginsDir); + var modCount = 0; + var mods = []; + dir.readFiles(modPePluginsDir, { + match: /.js/ + , exclude: /^\./ + }, function (err, content, fname, next) { + if (err) throw err; + log("Converting " + fname); + content = convert(content); + var modname = fname.split("/")[fname.split("/") + .length - 1].split(".")[0]; + log("Loading mod " + modname); + mods.push(requireFromString(content)); + modCount++; + next(); + } + , function (err, files) { + if(err) return; + log('Loaded ' + modCount + " mods"); + }); + + serv.on("newPlayer", function (player) { + injectPlayer(serv, player); + }); + + function injectPlayer(serv, player) { + log("Injected into player"); + + initSquid(player, serv); + newLevel(); + + player._client.on("block_dig", function (packet) { + var pos = new vec3(packet.location); + var currentlyDugBlock = serv.world.getBlock(pos); + if (packet.status == 0 && player.gameMode != 1) + startDestroyBlock(pos.x, pos.y, pos.z, 0); + else if (packet.status == 2) + destroyBlock(pos.x, pos.y, pos.z, 0); + else if (packet.status == 1) + console.log("Unused in ModPE"); + else if (packet.status == 0 && player.gameMode == 1) + destroyBlock(pos.x, pos.y, pos.z, 0); + }); + + player._client.on('position', function (packet) { + modTick(); + }); + + player._client.on("block_place", function (packet) { + if (packet.location.y < 0) return; + useItem(packet.location.x, packet.location.y, packet.location.z, packet.heldItem.blockId, serv.world.getBlockType(new vec3(packet.location.x, packet.location.y, packet.location.z))); + }); + + player._client.on('chat', function (packet) { + if(packet.message[0]=="/") { + var command = packet.message.slice(1); + procCmd(command); + } + }); + + function newLevel() { + mods.forEach(function (element, index, array) { + element.newLevel(); + }); + } + + function useItem(x, y, z, itemId, blockId) { + mods.forEach(function (element, index, array) { + element.useItem(x, y, z, itemId, blockId); + element.exec("lastUsedItem=" + itemId); + }); + } + + function modTick() { + mods.forEach(function (element, index, array) { + element.modTick(); + }); + } + + function exec(code) { + mods.forEach(function (element, index, array) { + element.exec(code); + }); + } + + function procCmd(command) { + player.chat("§2######### MODPE #########"); + mods.forEach(function (element, index, array) { + element.procCmd(command); + }); + } + + function startDestroyBlock(x, y, z, side) { + mods.forEach(function (element, index, array) { + element.startDestroyBlock(x, y, z, side); + }); + } + + function destroyBlock(x, y, z, side) { + mods.forEach(function (element, index, array) { + element.destroyBlock(x, y, z, side); + }); + } + + function initSquid(pl, sr) { + mods.forEach(function (element, index, array) { + element.initSquid(pl, sr); + }); + } + } +} diff --git a/package.json b/package.json index 4267286..c98faea 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,8 @@ "request-promise": "^0.4.3", "requireindex": "~1.0.0", "vec3": "0.1.3", - "spiralloop": "1.0.2" + "spiralloop": "1.0.2", + "node-dir": "~0.1.9" }, "repository": { "type": "git", diff --git a/src/lib/playerPlugins/commands.js b/src/lib/playerPlugins/commands.js index fbdfd68..91e839d 100644 --- a/src/lib/playerPlugins/commands.js +++ b/src/lib/playerPlugins/commands.js @@ -5,6 +5,8 @@ module.exports = inject; function inject(serv, player, options) { function handleCommand(command) { var results; + if (options.modpe) + player.chat("§1######## VANILLA ########"); if (options.commands[command]) player.chat("" + options.commands[command]); else if (results = command.match(/^gamemode ([0-3])$/)) {