diff --git a/resources/contenttweaker/lang/en_us.lang b/resources/contenttweaker/lang/en_us.lang index 87e6f9d4..fb2f4e81 100644 --- a/resources/contenttweaker/lang/en_us.lang +++ b/resources/contenttweaker/lang/en_us.lang @@ -3262,11 +3262,7 @@ tile.contenttweaker.quasar_charged_core_of_definition.name=Quasar-Charged Core o tile.contenttweaker.directed_miniature_quasar.name=Directed Miniature Quasar tile.contenttweaker.quasar_burst_director.name=Quasar Burst Director fluid.inquiring_abyssite=Inquiring Abyssite - - - - - - - - +# XP Bath +item.contenttweaker.xp_configurator.desc=Right-click to cycle mode +tile.modularmachinery.xp_assimilator.failure=No nearby player +tile.modularmachinery.xp_assimilator.desc=%d xp: Stand right on top of the controller inside the pool \ No newline at end of file diff --git a/scripts/ModularXPAssimilator.zs b/scripts/ModularXPAssimilator.zs deleted file mode 100644 index 8cd47735..00000000 --- a/scripts/ModularXPAssimilator.zs +++ /dev/null @@ -1,283 +0,0 @@ -import mods.modularmachinery.RecipeBuilder; -import mods.modularmachinery.RecipeEvent; -import mods.modularmachinery.MachineEvent; -import mods.modularmachinery.RecipeCheckEvent; -import mods.modularmachinery.RecipeFinishEvent; -import mods.modularmachinery.IMachineController; -import mods.contenttweaker.Commands; -import crafttweaker.server.IServer; -import crafttweaker.command.ICommandManager; -import crafttweaker.command.ICommandSender; - - -recipes.addShaped(.withTag({FluidName: "bewitched_essence_salts", Amount: 1000}), -[[, , ], -[, .withTag({FluidName: "mana", Amount: 1000}), ], -[, , ]]); - -recipes.addShaped(.withTag({display: {Lore: ["§d§o1X§r"]}}), -[[, , ], -[, , ], -[, , ]]); - -mods.chisel.Carving.addGroup("experienceconfig"); -mods.chisel.Carving.addVariation("experienceconfig", .withTag({display: {Lore: ["§d§o1X§r"]}})); -mods.chisel.Carving.addVariation("experienceconfig", .withTag({display: {Lore: ["§d§o64X§r"]}})); -mods.chisel.Carving.addVariation("experienceconfig", .withTag({display: {Lore: ["§d§o256X§r"]}})); -mods.chisel.Carving.addVariation("experienceconfig", .withTag({display: {Lore: ["§d§o1024X§r"]}})); - - - -var addxpsolidified1 = RecipeBuilder.newBuilder("addxpsolidified1","xp_assimilator",5); -addxpsolidified1.addItemInput(); -addxpsolidified1.addItemInput(.withTag({display: {Lore: ["§d§o1X§r"]}})); -addxpsolidified1.setChance(0.0); -addxpsolidified1.addPostCheckHandler(function(event as RecipeCheckEvent) { if (server.commandManager.executeCommand(server,"testfor @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + ",r=2]") == 0) {event.setFailed("No nearby player");} } ); -addxpsolidified1.addFinishHandler(function(event as RecipeFinishEvent) { server.commandManager.executeCommand(server,"xp 8 @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + "]"); } ); -addxpsolidified1.addRecipeTooltip("8 xp: Stand right on top of the controller inside the pool"); -addxpsolidified1.build(); - -var addxpsolidified2 = RecipeBuilder.newBuilder("addxpsolidified2","xp_assimilator",5); -addxpsolidified2.addItemInput(*64); -addxpsolidified2.addItemInput(.withTag({display: {Lore: ["§d§o64X§r"]}})); -addxpsolidified2.setChance(0.0); -addxpsolidified2.addPostCheckHandler(function(event as RecipeCheckEvent) { if (server.commandManager.executeCommand(server,"testfor @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + ",r=2]") == 0) {event.setFailed("No nearby player");} } ); -addxpsolidified2.addFinishHandler(function(event as RecipeFinishEvent) { server.commandManager.executeCommand(server,"xp 512 @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + "]"); } ); -addxpsolidified2.addRecipeTooltip("512 xp: Stand right on top of the controller inside the pool"); -addxpsolidified2.build(); - -var addxpsolidified3 = RecipeBuilder.newBuilder("addxpsolidified3","xp_assimilator",5); -addxpsolidified3.addItemInput(*256); -addxpsolidified3.addItemInput(.withTag({display: {Lore: ["§d§o256X§r"]}})); -addxpsolidified3.setChance(0.0); -addxpsolidified3.addPostCheckHandler(function(event as RecipeCheckEvent) { if (server.commandManager.executeCommand(server,"testfor @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + ",r=2]") == 0) {event.setFailed("No nearby player");} } ); -addxpsolidified3.addFinishHandler(function(event as RecipeFinishEvent) { server.commandManager.executeCommand(server,"xp 2048 @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + "]"); } ); -addxpsolidified3.addRecipeTooltip("2048 xp: Stand right on top of the controller inside the pool"); -addxpsolidified3.build(); - -var addxpsolidified4 = RecipeBuilder.newBuilder("addxpsolidified4","xp_assimilator",5); -addxpsolidified4.addItemInput(*1024); -addxpsolidified4.addItemInput(.withTag({display: {Lore: ["§d§o1024X§r"]}})); -addxpsolidified4.setChance(0.0); -addxpsolidified4.addPostCheckHandler(function(event as RecipeCheckEvent) { if (server.commandManager.executeCommand(server,"testfor @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + ",r=2]") == 0) {event.setFailed("No nearby player");} } ); -addxpsolidified4.addFinishHandler(function(event as RecipeFinishEvent) { server.commandManager.executeCommand(server,"xp 8196 @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + "]"); } ); -addxpsolidified4.addRecipeTooltip("8192 xp: Stand right on top of the controller inside the pool"); -addxpsolidified4.build(); - - - -var addxpoverworldian1 = RecipeBuilder.newBuilder("addxpoverworldian1","xp_assimilator",5); -addxpoverworldian1.addItemInput(); -addxpoverworldian1.addItemInput(.withTag({display: {Lore: ["§d§o1X§r"]}})); -addxpoverworldian1.setChance(0.0); -addxpoverworldian1.addPostCheckHandler(function(event as RecipeCheckEvent) { if (server.commandManager.executeCommand(server,"testfor @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + ",r=2]") == 0) {event.setFailed("No nearby player");} } ); -addxpoverworldian1.addFinishHandler(function(event as RecipeFinishEvent) { server.commandManager.executeCommand(server,"xp 10 @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + "]"); } ); -addxpoverworldian1.addRecipeTooltip("10 xp: Stand right on top of the controller inside the pool"); -addxpoverworldian1.build(); - -var addxpoverworldian2 = RecipeBuilder.newBuilder("addxpoverworldian2","xp_assimilator",5); -addxpoverworldian2.addItemInput(*64); -addxpoverworldian2.addItemInput(.withTag({display: {Lore: ["§d§o64X§r"]}})); -addxpoverworldian2.setChance(0.0); -addxpoverworldian2.addPostCheckHandler(function(event as RecipeCheckEvent) { if (server.commandManager.executeCommand(server,"testfor @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + ",r=2]") == 0) {event.setFailed("No nearby player");} } ); -addxpoverworldian2.addFinishHandler(function(event as RecipeFinishEvent) { server.commandManager.executeCommand(server,"xp 640 @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + "]"); } ); -addxpoverworldian2.addRecipeTooltip("640 xp: Stand right on top of the controller inside the pool"); -addxpoverworldian2.build(); - -var addxpoverworldian3 = RecipeBuilder.newBuilder("addxpoverworldian3","xp_assimilator",5); -addxpoverworldian3.addItemInput(*256); -addxpoverworldian3.addItemInput(.withTag({display: {Lore: ["§d§o256X§r"]}})); -addxpoverworldian3.setChance(0.0); -addxpoverworldian3.addPostCheckHandler(function(event as RecipeCheckEvent) { if (server.commandManager.executeCommand(server,"testfor @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + ",r=2]") == 0) {event.setFailed("No nearby player");} } ); -addxpoverworldian3.addFinishHandler(function(event as RecipeFinishEvent) { server.commandManager.executeCommand(server,"xp 2560 @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + "]"); } ); -addxpoverworldian3.addRecipeTooltip("2560 xp: Stand right on top of the controller inside the pool"); -addxpoverworldian3.build(); - -var addxpoverworldian4 = RecipeBuilder.newBuilder("addxpoverworldian4","xp_assimilator",5); -addxpoverworldian4.addItemInput(*1024); -addxpoverworldian4.addItemInput(.withTag({display: {Lore: ["§d§o1024X§r"]}})); -addxpoverworldian4.setChance(0.0); -addxpoverworldian4.addPostCheckHandler(function(event as RecipeCheckEvent) { if (server.commandManager.executeCommand(server,"testfor @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + ",r=2]") == 0) {event.setFailed("No nearby player");} } ); -addxpoverworldian4.addFinishHandler(function(event as RecipeFinishEvent) { server.commandManager.executeCommand(server,"xp 10240 @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + "]"); } ); -addxpoverworldian4.addRecipeTooltip("10240 xp: Stand right on top of the controller inside the pool"); -addxpoverworldian4.build(); - - - - -var addxphellish1 = RecipeBuilder.newBuilder("addxphellish1","xp_assimilator",5); -addxphellish1.addItemInput(); -addxphellish1.addItemInput(.withTag({display: {Lore: ["§d§o1X§r"]}})); -addxphellish1.setChance(0.0); -addxphellish1.addPostCheckHandler(function(event as RecipeCheckEvent) { if (server.commandManager.executeCommand(server,"testfor @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + ",r=2]") == 0) {event.setFailed("No nearby player");} } ); -addxphellish1.addFinishHandler(function(event as RecipeFinishEvent) { server.commandManager.executeCommand(server,"xp 14 @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + "]"); } ); -addxphellish1.addRecipeTooltip("14 xp: Stand right on top of the controller inside the pool"); -addxphellish1.build(); - -var addxphellish2 = RecipeBuilder.newBuilder("addxphellish2","xp_assimilator",5); -addxphellish2.addItemInput(*64); -addxphellish2.addItemInput(.withTag({display: {Lore: ["§d§o64X§r"]}})); -addxphellish2.setChance(0.0); -addxphellish2.addPostCheckHandler(function(event as RecipeCheckEvent) { if (server.commandManager.executeCommand(server,"testfor @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + ",r=2]") == 0) {event.setFailed("No nearby player");} } ); -addxphellish2.addFinishHandler(function(event as RecipeFinishEvent) { server.commandManager.executeCommand(server,"xp 896 @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + "]"); } ); -addxphellish2.addRecipeTooltip("896 xp: Stand right on top of the controller inside the pool"); -addxphellish2.build(); - -var addxphellish3 = RecipeBuilder.newBuilder("addxphellish3","xp_assimilator",5); -addxphellish3.addItemInput(*256); -addxphellish3.addItemInput(.withTag({display: {Lore: ["§d§o256X§r"]}})); -addxphellish3.setChance(0.0); -addxphellish3.addPostCheckHandler(function(event as RecipeCheckEvent) { if (server.commandManager.executeCommand(server,"testfor @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + ",r=2]") == 0) {event.setFailed("No nearby player");} } ); -addxphellish3.addFinishHandler(function(event as RecipeFinishEvent) { server.commandManager.executeCommand(server,"xp 3584 @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + "]"); } ); -addxphellish3.addRecipeTooltip("3584 xp: Stand right on top of the controller inside the pool"); -addxphellish3.build(); - -var addxphellish4 = RecipeBuilder.newBuilder("addxphellish4","xp_assimilator",5); -addxphellish4.addItemInput(*1024); -addxphellish4.addItemInput(.withTag({display: {Lore: ["§d§o1024X§r"]}})); -addxphellish4.setChance(0.0); -addxphellish4.addPostCheckHandler(function(event as RecipeCheckEvent) { if (server.commandManager.executeCommand(server,"testfor @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + ",r=2]") == 0) {event.setFailed("No nearby player");} } ); -addxphellish4.addFinishHandler(function(event as RecipeFinishEvent) { server.commandManager.executeCommand(server,"xp 14336 @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + "]"); } ); -addxphellish4.addRecipeTooltip("14336 xp: Stand right on top of the controller inside the pool"); -addxphellish4.build(); - - - - - -var addxpextraterr1 = RecipeBuilder.newBuilder("addxpextraterr1","xp_assimilator",5); -addxpextraterr1.addItemInput(); -addxpextraterr1.addItemInput(.withTag({display: {Lore: ["§d§o1X§r"]}})); -addxpextraterr1.setChance(0.0); -addxpextraterr1.addPostCheckHandler(function(event as RecipeCheckEvent) { if (server.commandManager.executeCommand(server,"testfor @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + ",r=2]") == 0) {event.setFailed("No nearby player");} } ); -addxpextraterr1.addFinishHandler(function(event as RecipeFinishEvent) { server.commandManager.executeCommand(server,"xp 20 @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + "]"); } ); -addxpextraterr1.addRecipeTooltip("20 xp: Stand right on top of the controller inside the pool"); -addxpextraterr1.build(); - -var addxpextraterr2 = RecipeBuilder.newBuilder("addxpextraterr2","xp_assimilator",5); -addxpextraterr2.addItemInput(*64); -addxpextraterr2.addItemInput(.withTag({display: {Lore: ["§d§o64X§r"]}})); -addxpextraterr2.setChance(0.0); -addxpextraterr2.addPostCheckHandler(function(event as RecipeCheckEvent) { if (server.commandManager.executeCommand(server,"testfor @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + ",r=2]") == 0) {event.setFailed("No nearby player");} } ); -addxpextraterr2.addFinishHandler(function(event as RecipeFinishEvent) { server.commandManager.executeCommand(server,"xp 1280 @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + "]"); } ); -addxpextraterr2.addRecipeTooltip("1280 xp: Stand right on top of the controller inside the pool"); -addxpextraterr2.build(); - -var addxpextraterr3 = RecipeBuilder.newBuilder("addxpextraterr3","xp_assimilator",5); -addxpextraterr3.addItemInput(*256); -addxpextraterr3.addItemInput(.withTag({display: {Lore: ["§d§o256X§r"]}})); -addxpextraterr3.setChance(0.0); -addxpextraterr3.addPostCheckHandler(function(event as RecipeCheckEvent) { if (server.commandManager.executeCommand(server,"testfor @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + ",r=2]") == 0) {event.setFailed("No nearby player");} } ); -addxpextraterr3.addFinishHandler(function(event as RecipeFinishEvent) { server.commandManager.executeCommand(server,"xp 5120 @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + "]"); } ); -addxpextraterr3.addRecipeTooltip("5120 xp: Stand right on top of the controller inside the pool"); -addxpextraterr3.build(); - -var addxpextraterr4 = RecipeBuilder.newBuilder("addxpextraterr4","xp_assimilator",5); -addxpextraterr4.addItemInput(*1024); -addxpextraterr4.addItemInput(.withTag({display: {Lore: ["§d§o1024X§r"]}})); -addxpextraterr4.setChance(0.0); -addxpextraterr4.addPostCheckHandler(function(event as RecipeCheckEvent) { if (server.commandManager.executeCommand(server,"testfor @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + ",r=2]") == 0) {event.setFailed("No nearby player");} } ); -addxpextraterr4.addFinishHandler(function(event as RecipeFinishEvent) { server.commandManager.executeCommand(server,"xp 20480 @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + "]"); } ); -addxpextraterr4.addRecipeTooltip("20480 xp: Stand right on top of the controller inside the pool"); -addxpextraterr4.build(); - - - -var addxptwilight1 = RecipeBuilder.newBuilder("addxptwilight1","xp_assimilator",5); -addxptwilight1.addItemInput(); -addxptwilight1.addItemInput(.withTag({display: {Lore: ["§d§o1X§r"]}})); -addxptwilight1.setChance(0.0); -addxptwilight1.addPostCheckHandler(function(event as RecipeCheckEvent) { if (server.commandManager.executeCommand(server,"testfor @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + ",r=2]") == 0) {event.setFailed("No nearby player");} } ); -addxptwilight1.addFinishHandler(function(event as RecipeFinishEvent) { server.commandManager.executeCommand(server,"xp 30 @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + "]"); } ); -addxptwilight1.addRecipeTooltip("30 xp: Stand right on top of the controller inside the pool"); -addxptwilight1.build(); - -var addxptwilight2 = RecipeBuilder.newBuilder("addxptwilight2","xp_assimilator",5); -addxptwilight2.addItemInput(*64); -addxptwilight2.addItemInput(.withTag({display: {Lore: ["§d§o64X§r"]}})); -addxptwilight2.setChance(0.0); -addxptwilight2.addPostCheckHandler(function(event as RecipeCheckEvent) { if (server.commandManager.executeCommand(server,"testfor @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + ",r=2]") == 0) {event.setFailed("No nearby player");} } ); -addxptwilight2.addFinishHandler(function(event as RecipeFinishEvent) { server.commandManager.executeCommand(server,"xp 1920 @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + "]"); } ); -addxptwilight2.addRecipeTooltip("1920 xp: Stand right on top of the controller inside the pool"); -addxptwilight2.build(); - -var addxptwilight3 = RecipeBuilder.newBuilder("addxptwilight3","xp_assimilator",5); -addxptwilight3.addItemInput(*256); -addxptwilight3.addItemInput(.withTag({display: {Lore: ["§d§o256X§r"]}})); -addxptwilight3.setChance(0.0); -addxptwilight3.addPostCheckHandler(function(event as RecipeCheckEvent) { if (server.commandManager.executeCommand(server,"testfor @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + ",r=2]") == 0) {event.setFailed("No nearby player");} } ); -addxptwilight3.addFinishHandler(function(event as RecipeFinishEvent) { server.commandManager.executeCommand(server,"xp 7680 @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + "]"); } ); -addxptwilight3.addRecipeTooltip("7680 xp: Stand right on top of the controller inside the pool"); -addxptwilight3.build(); - -var addxptwilight4 = RecipeBuilder.newBuilder("addxptwilight4","xp_assimilator",5); -addxptwilight4.addItemInput(*1024); -addxptwilight4.addItemInput(.withTag({display: {Lore: ["§d§o1024X§r"]}})); -addxptwilight4.setChance(0.0); -addxptwilight4.addPostCheckHandler(function(event as RecipeCheckEvent) { if (server.commandManager.executeCommand(server,"testfor @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + ",r=2]") == 0) {event.setFailed("No nearby player");} } ); -addxptwilight4.addFinishHandler(function(event as RecipeFinishEvent) { server.commandManager.executeCommand(server,"xp 30720 @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + "]"); } ); -addxptwilight4.addRecipeTooltip("30720 xp: Stand right on top of the controller inside the pool"); -addxptwilight4.build(); - - - - - -var addxpbeessence1 = RecipeBuilder.newBuilder("addxpbeessence1","xp_assimilator",5); -addxpbeessence1.addItemInput(); -addxpbeessence1.addItemInput(.withTag({display: {Lore: ["§d§o1X§r"]}})); -addxpbeessence1.setChance(0.0); -addxpbeessence1.addPostCheckHandler(function(event as RecipeCheckEvent) { if (server.commandManager.executeCommand(server,"testfor @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + ",r=2]") == 0) {event.setFailed("No nearby player");} } ); -addxpbeessence1.addFinishHandler(function(event as RecipeFinishEvent) { server.commandManager.executeCommand(server,"xp 1000 @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + "]"); } ); -addxpbeessence1.addRecipeTooltip("1000 xp: Stand right on top of the controller inside the pool"); -addxpbeessence1.build(); - -var addxpbeessence2 = RecipeBuilder.newBuilder("addxpbeessence2","xp_assimilator",5); -addxpbeessence2.addItemInput(*64); -addxpbeessence2.addItemInput(.withTag({display: {Lore: ["§d§o64X§r"]}})); -addxpbeessence2.setChance(0.0); -addxpbeessence2.addPostCheckHandler(function(event as RecipeCheckEvent) { if (server.commandManager.executeCommand(server,"testfor @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + ",r=2]") == 0) {event.setFailed("No nearby player");} } ); -addxpbeessence2.addFinishHandler(function(event as RecipeFinishEvent) { server.commandManager.executeCommand(server,"xp 64000 @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + "]"); } ); -addxpbeessence2.addRecipeTooltip("64000 xp: Stand right on top of the controller inside the pool"); -addxpbeessence2.build(); - -var addxpbeessence3 = RecipeBuilder.newBuilder("addxpbeessence3","xp_assimilator",5); -addxpbeessence3.addItemInput(*256); -addxpbeessence3.addItemInput(.withTag({display: {Lore: ["§d§o256X§r"]}})); -addxpbeessence3.setChance(0.0); -addxpbeessence3.addPostCheckHandler(function(event as RecipeCheckEvent) { if (server.commandManager.executeCommand(server,"testfor @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + ",r=2]") == 0) {event.setFailed("No nearby player");} } ); -addxpbeessence3.addFinishHandler(function(event as RecipeFinishEvent) { server.commandManager.executeCommand(server,"xp 256000 @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + "]"); } ); -addxpbeessence3.addRecipeTooltip("256000 xp: Stand right on top of the controller inside the pool"); -addxpbeessence3.build(); - -var addxpbeessence4 = RecipeBuilder.newBuilder("addxpbeessence4","xp_assimilator",5); -addxpbeessence4.addItemInput(*1024); -addxpbeessence4.addItemInput(.withTag({display: {Lore: ["§d§o1024X§r"]}})); -addxpbeessence4.setChance(0.0); -addxpbeessence4.addPostCheckHandler(function(event as RecipeCheckEvent) { if (server.commandManager.executeCommand(server,"testfor @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + ",r=2]") == 0) {event.setFailed("No nearby player");} } ); -addxpbeessence4.addFinishHandler(function(event as RecipeFinishEvent) { server.commandManager.executeCommand(server,"xp 1024000 @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + "]"); } ); -addxpbeessence4.addRecipeTooltip("1024000 xp: Stand right on top of the controller inside the pool"); -addxpbeessence4.build(); - - - -var cyfluid = RecipeBuilder.newBuilder("xpa_cyclic_experience","xp_assimilator",5); -cyfluid.addFluidInput( * 1000); -cyfluid.addPostCheckHandler(function(event as RecipeCheckEvent) { if (server.commandManager.executeCommand(server,"testfor @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + ",r=2]") == 0) {event.setFailed("No nearby player");} } ); -cyfluid.addFinishHandler(function(event as RecipeFinishEvent) { server.commandManager.executeCommand(server,"xp 50 @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + "]"); } ); -cyfluid.addRecipeTooltip("50 xp: Stand right on top of the controller inside the pool"); -cyfluid.build(); - -var iffluid = RecipeBuilder.newBuilder("xpa_industrial_foregoing_essence","xp_assimilator",5); -iffluid.addFluidInput( * 1000); -iffluid.addPostCheckHandler(function(event as RecipeCheckEvent) { if (server.commandManager.executeCommand(server,"testfor @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + ",r=2]") == 0) {event.setFailed("No nearby player");} } ); -iffluid.addFinishHandler(function(event as RecipeFinishEvent) { server.commandManager.executeCommand(server,"xp 50 @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + "]"); } ); -iffluid.addRecipeTooltip("50 xp: Stand right on top of the controller inside the pool"); -iffluid.build(); - -var tffluid = RecipeBuilder.newBuilder("xpa_thermal_foundation_essence_of_knowledge","xp_assimilator",5); -tffluid.addFluidInput( * 1000); -tffluid.addPostCheckHandler(function(event as RecipeCheckEvent) { if (server.commandManager.executeCommand(server,"testfor @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + ",r=2]") == 0) {event.setFailed("No nearby player");} } ); -tffluid.addFinishHandler(function(event as RecipeFinishEvent) { server.commandManager.executeCommand(server,"xp 50 @p[x=" + event.controller.pos.x + ",y=" + event.controller.pos.y + ",z=" + event.controller.pos.z + "]"); } ); -tffluid.addRecipeTooltip("50 xp: Stand right on top of the controller inside the pool"); -tffluid.build(); \ No newline at end of file diff --git a/scripts/advancedModulars/experience/ModularXPAssimilator.zs b/scripts/advancedModulars/experience/ModularXPAssimilator.zs new file mode 100644 index 00000000..0a85f56d --- /dev/null +++ b/scripts/advancedModulars/experience/ModularXPAssimilator.zs @@ -0,0 +1,92 @@ +import crafttweaker.liquid.ILiquidStack; +import crafttweaker.item.IItemStack; +import crafttweaker.player.IPlayer; +import crafttweaker.text.ITextComponent; +import mods.modularmachinery.IMachineController; +import mods.modularmachinery.RecipeBuilder; +import mods.modularmachinery.RecipeCheckEvent; +import mods.modularmachinery.RecipeFinishEvent; + +import scripts.advancedModulars.experience.XPConfigurator as Configurator; +import scripts.util.ModularEventUtils as Util; + +// Crafting recipes +recipes.addShaped(.withTag({FluidName: "bewitched_essence_salts", Amount: 1000}), +[[, , ], +[, .withTag({FluidName: "mana", Amount: 1000}), ], +[, , ]]); + +recipes.addShaped(Configurator.withMode(1), +[[, , ], +[, , ], +[, , ]]); + +// Item machine recipes +var xpSolidified = buildItemRecipes(, "xp_solidified", 8); +var xpOverworldian = buildItemRecipes(, "xp_overworldian", 10); +var xpHellish = buildItemRecipes(, "xp_hellish", 14); +var xpExtraterrestrial = buildItemRecipes(, "xp_extraterrestrial", 20); +var xpTwilight = buildItemRecipes(, "xp_twilight", 30); +var xpBeeEssence = buildItemRecipes(, "xp_bee_essence", 1000); + +// Fluid machine recipes +var xpCyclic = buildFluidRecipes(, "xp_cyclic", 50); +var xpIndustrialForegoing = buildFluidRecipes(, "xp_industrial_foregoing", 50); +var xpThermal = buildFluidRecipes(, "xp_thermal", 50); + +// Recipe builders +function buildItemRecipes(stack as IItemStack, baseName as string, baseXP as int) { + for mode in Configurator.modes { + var xp = baseXP * mode; + var itemXPRecipe = RecipeBuilder.newBuilder(`${baseName}_${mode}x`, "xp_assimilator", 5); + itemXPRecipe.addItemInput(stack * mode) + .addItemInput(Configurator.withMode(mode)) + .setChance(0.0) + .addPostCheckHandler(function(event as RecipeCheckEvent) { + checkForPlayer(event); + } + ) + .addFinishHandler(function(event as RecipeFinishEvent) { + giveXPToNearest(event.controller, xp); + } + ) + .addRecipeTooltip(ITextComponent.fromTranslation("tile.modularmachinery.xp_assimilator.desc", [xp]).formattedText) + .build(); + } +} + +function buildFluidRecipes(stack as ILiquidStack, baseName as string, baseXP as int) { + var xp = baseXP; + var fluidXPRecipe = RecipeBuilder.newBuilder(`${baseName}`, "xp_assimilator", 5); + fluidXPRecipe.addFluidInput(stack * 1000) + .addPostCheckHandler(function(event as RecipeCheckEvent) { + checkForPlayer(event); + } + ) + .addFinishHandler(function(event as RecipeFinishEvent) { + giveXPToNearest(event.controller, xp); + } + ) + .addRecipeTooltip(ITextComponent.fromTranslation("tile.modularmachinery.xp_assimilator.desc", [xp]).formattedText) + .build(); +} + +// Recipe logic +function checkForPlayer(event as RecipeCheckEvent) as void { + var pos = event.controller.pos; + // I think this is thread safe: doesn't modify world state and MMCE's task executor spins the main thread (?) during execution + var player = event.controller.world.getClosestPlayer(pos.x, pos.y, pos.z, 2, false) as IPlayer; + if (isNull(player)) { + var failureText = ITextComponent.fromTranslation("tile.modularmachinery.xp_assimilator.failure").formattedText; + event.setFailed(failureText); + } +} + +function giveXPToNearest(controller as IMachineController, xp as int) { + var sender = Util.getControllerSender(controller); + var pos = controller.pos; + var command = `xp ${xp} @p[x=${pos.x},y=${pos.y},z=${pos.z}]`; + Util.scheduleTask(controller, function() as void { + server.commandManager.executeCommand(sender, command); + }); +} \ No newline at end of file diff --git a/scripts/advancedModulars/experience/XPConfigurator.zs b/scripts/advancedModulars/experience/XPConfigurator.zs new file mode 100644 index 00000000..21963f3f --- /dev/null +++ b/scripts/advancedModulars/experience/XPConfigurator.zs @@ -0,0 +1,69 @@ +#priority 10 + +import crafttweaker.data.IData; +import crafttweaker.item.IItemStack; +import crafttweaker.text.ITextComponent; + +static modes as int[] = [1, 64, 256, 1024]; + +.itemRightClick = function(itemStack, world, player, hand) { + if (world.remote) { + return "PASS"; + } + if (hand == "MAIN_HAND") { + var nbt as IData = itemStack.tag; + var newNBT as IData = {}; + if (isNull(nbt) || isNull(nbt.mode)) { + // Set the default mode + newNBT = { + mode: modes[0] as int + } as IData; + } else if (!isNull(nbt.mode)) { + // Cycle the mode + newNBT = { + mode: cycle(nbt.mode) + } as IData; + } + // Update the mode + (itemStack as IItemStack).mutable().withTag(newNBT); + + var text = ITextComponent.fromTranslation("chat.contenttweaker.xp_configurator.mode", newNBT.mode); + text.style.color = "LIGHT_PURPLE"; + player.sendRichTextStatusMessage(text, true); + return "SUCCESS"; + } + return "PASS"; +}; +.addTooltip(ITextComponent.fromTranslation("item.contenttweaker.xp_configurator.desc").formattedText); +.addAdvancedTooltip(function(item) { + var nbt = item.tag; + if (!(isNull(nbt) || isNull(nbt.mode))) { + var text = ITextComponent.fromTranslation("chat.contenttweaker.xp_configurator.mode", nbt.mode); + text.style.color = "LIGHT_PURPLE"; + return text.formattedText; + } + return null; +}); + +function cycle(currentMode as int) as int { + for i in 0 to modes.length { + if (modes[i] == currentMode) { + return modes[(i + 1) % modes.length]; + } + } +} + +function withMode(modeIn as int) as IItemStack { + var nbt = { + mode: "Invalid mode, please report this bug!" + } as IData; + for mode in modes { + if (modeIn == mode) { + nbt = { + mode: modeIn + } as IData; + break; + } + } + return .withTag(nbt); +} \ No newline at end of file diff --git a/scripts/portals/BeeStargatePortalBlocks.zs b/scripts/advancedModulars/portals/BeeStargatePortalBlocks.zs similarity index 99% rename from scripts/portals/BeeStargatePortalBlocks.zs rename to scripts/advancedModulars/portals/BeeStargatePortalBlocks.zs index 55aa59ec..2c00a466 100644 --- a/scripts/portals/BeeStargatePortalBlocks.zs +++ b/scripts/advancedModulars/portals/BeeStargatePortalBlocks.zs @@ -9,6 +9,7 @@ import mods.contenttweaker.Commands; import mods.contenttweaker.VanillaFactory; import mods.zenutils.cotx.Block; +# Bee stargate portals var sednaportal = VanillaFactory.createExpandBlock("sedna_portal_block", ); setPortalProps(sednaportal); setPortalLogic(sednaportal, 147, true); @@ -29,25 +30,21 @@ setPortalProps(lunaportal); setPortalLogic(lunaportal, 145, true); lunaportal.register(); - var osirisportal = VanillaFactory.createExpandBlock("osiris_portal_block", ); setPortalProps(osirisportal); setPortalLogic(osirisportal, 148, true); osirisportal.register(); - var ptahportal = VanillaFactory.createExpandBlock("ptah_portal_block", ); setPortalProps(ptahportal); setPortalLogic(ptahportal, 149, true); ptahportal.register(); - var hatorportal = VanillaFactory.createExpandBlock("hator_portal_block", ); setPortalProps(hatorportal); setPortalLogic(hatorportal, 150, true); hatorportal.register(); - var europaportal = VanillaFactory.createExpandBlock("europa_portal_block", ); setPortalProps(europaportal); setPortalLogic(europaportal, 151, true); @@ -58,25 +55,21 @@ setPortalProps(oiportal); setPortalLogic(oiportal, 152, true); oiportal.register(); - var falacerportal = VanillaFactory.createExpandBlock("falacer_portal_block", ); setPortalProps(falacerportal); setPortalLogic(falacerportal, 160, true); falacerportal.register(); - var orcusportal = VanillaFactory.createExpandBlock("orcus_portal_block", ); setPortalProps(orcusportal); setPortalLogic(orcusportal, 161, true); orcusportal.register(); - var myrmexportal = VanillaFactory.createExpandBlock("myrmex_portal_block", ); setPortalProps(myrmexportal); setPortalLogic(myrmexportal, 164, true); myrmexportal.register(); - var pixoniaportal = VanillaFactory.createExpandBlock("pixonia_portal_block", ); setPortalProps(pixoniaportal); setPortalLogic(pixoniaportal, 165, true); @@ -87,17 +80,15 @@ setPortalProps(proximaportal); setPortalLogic(proximaportal, 166, true); proximaportal.register(); - -var zoiportal = VanillaFactory.createExpandBlock("zoi_portal_block", ); -setPortalProps(zoiportal); -setPortalLogic(zoiportal, 171, true); -zoiportal.register(); - var neroportal = VanillaFactory.createExpandBlock("nero_portal_block", ); setPortalProps(neroportal); setPortalLogic(neroportal, 170, true); neroportal.register(); +var zoiportal = VanillaFactory.createExpandBlock("zoi_portal_block", ); +setPortalProps(zoiportal); +setPortalLogic(zoiportal, 171, true); +zoiportal.register(); var akathartosportal = VanillaFactory.createExpandBlock("akathartos_portal_block", ); setPortalProps(akathartosportal); @@ -109,19 +100,13 @@ setPortalProps(pauramportal); setPortalLogic(pauramportal, 173, true); pauramportal.register(); - var alkemiaportal = VanillaFactory.createExpandBlock("alkemia_portal_block", ); setPortalProps(alkemiaportal); setPortalLogic(alkemiaportal, 174, true); alkemiaportal.register(); -var apichisiportal = VanillaFactory.createExpandBlock("apichisi_portal_block", ); -setPortalProps(apichisiportal); -setPortalLogic(apichisiportal, 184, false); -apichisiportal.register(); - - +# Wormhole generator portals var taerrapiattaportal = VanillaFactory.createExpandBlock("taerrapiatta_portal_block", ); setPortalProps(taerrapiattaportal); setPortalLogic(taerrapiattaportal, 180, false); @@ -142,6 +127,11 @@ setPortalProps(finemportal); setPortalLogic(finemportal, 185, false); finemportal.register(); +var apichisiportal = VanillaFactory.createExpandBlock("apichisi_portal_block", ); +setPortalProps(apichisiportal); +setPortalLogic(apichisiportal, 184, false); +apichisiportal.register(); + var lyndenwyrmportal = VanillaFactory.createExpandBlock("lyndenwyrm_portal_block", ); setPortalProps(lyndenwyrmportal); setPortalLogic(lyndenwyrmportal, 162, false); diff --git a/scripts/portals/ModularBeeStargate.zs b/scripts/advancedModulars/portals/ModularBeeStargate.zs similarity index 90% rename from scripts/portals/ModularBeeStargate.zs rename to scripts/advancedModulars/portals/ModularBeeStargate.zs index ed47708e..7c273136 100644 --- a/scripts/portals/ModularBeeStargate.zs +++ b/scripts/advancedModulars/portals/ModularBeeStargate.zs @@ -1,5 +1,3 @@ -import native.hellfirepvp.modularmachinery.common.crafting.command.ControllerCommandSender; -import native.hellfirepvp.modularmachinery.common.tiles.base.TileMultiblockMachineController; import native.net.minecraft.item.Item; import native.net.minecraft.item.ItemStack; @@ -9,16 +7,18 @@ import crafttweaker.world.IBlockPos; import mods.modularmachinery.RecipeBuilder; import mods.modularmachinery.MachineTickEvent; import mods.modularmachinery.RecipeStartEvent; -import mods.modularmachinery.RecipeFailureEvent; import mods.modularmachinery.MMEvents; import mods.modularmachinery.IMachineController; -// Ideally some code here should be shared with ModularWormholeField, but for some reason cross-script reference doesn't work. +// Shared code +import scripts.util.ModularEventUtils as Util; +static offset as Util.Offset = Util.Offset(5, -4); var portal = ; portal.addItems([ , , + , , , , @@ -62,6 +62,16 @@ stargaterhenia.addItemInput().setChance(0) .addRecipeTooltip(tooltip) .build(); +var stargatehaumea = RecipeBuilder.newBuilder("stargate_haumea", "bee_stargate", 100); +stargatehaumea.addItemInput().setChance(0) + .addFluidInput( * 100) + .addStartHandler(function(event as RecipeStartEvent) { + beeStargateRecipeStart(event.controller, "contenttweaker:haumea_portal_block", "Haumea"); + } + ) + .addRecipeTooltip(tooltip) + .build(); + var stargateluna = RecipeBuilder.newBuilder("stargate_luna", "bee_stargate", 100); stargateluna.addItemInput().setChance(0) .addFluidInput( * 100) @@ -224,9 +234,9 @@ stargatealkemia.addItemInput().setChance(0) // Do start up sound and message if no current portal, spawn portal if different recipe, or nothing if same portal: function beeStargateRecipeStart(controller as IMachineController, portalBlock as string, destination as string) { - var pos = getCenter(controller, 5, -4); - var sender = getControllerSender(controller); - controller.world.native.getMinecraftServer().addScheduledTask(function() { + var pos = offset.getCenter(controller); + var sender = Util.getControllerSender(controller); + Util.scheduleTask(controller, function() as void { var currentPortalBlock = controller.world.getBlockState(pos); if (currentPortalBlock != IBlockState.getBlockState(portalBlock,"")) { @@ -250,8 +260,8 @@ MMEvents.onMachinePostTick("bee_stargate", function(event as MachineTickEvent) { if (ctrl.world.time % 20 != 0 || ctrl.isWorking) { return; } - var pos = getCenter(ctrl, 5, -4); - ctrl.world.native.getMinecraftServer().addScheduledTask(function() { + var pos = offset.getCenter(ctrl); + Util.scheduleTask(ctrl, function() as void { var centerState = ctrl.world.getBlockState(pos); var itemBlock = ItemStack(Item.getItemFromBlock(centerState.block.native)); // Only clear blocks that aren't unbreakable or are known portal blocks. @@ -264,7 +274,7 @@ MMEvents.onMachinePostTick("bee_stargate", function(event as MachineTickEvent) { // Clear portal blocks. function beeStargateClear(controller as IMachineController, pos as IBlockPos) { - var sender = getControllerSender(controller); + var sender = Util.getControllerSender(controller); beeStargatePlacePortal(controller, "minecraft:air", pos, sender); var offlineText = '{"translate":"chat.contenttweaker.stargate.offline"}'; server.commandManager.executeCommand(sender, "playsound minecraft:entity.evocation_illager.cast_spell ambient @a " + pos.x + " " + pos.y + " " + pos.z + " 1 0.5"); @@ -281,14 +291,4 @@ function beeStargatePlacePortal(controller as IMachineController, portalBlock as if (facing == crafttweaker.world.IFacing.north() || facing == crafttweaker.world.IFacing.south()) { dx = 1; } else { dz = 1; } server.commandManager.executeCommand(sender, "fill " + (pos.x - dx) + " " + (pos.y - 1) + " " + (pos.z - dz) + " " + (pos.x + dx) + " " + (pos.y + 1) + " " + (pos.z + dz) + " " + portalBlock); -} - -function getCenter(ctrl as IMachineController, offsetUp as int, offsetFacing as int) as IBlockPos { - return ctrl.pos.getOffset(up, offsetUp).getOffset(ctrl.facing, offsetFacing); -} - -// The ICommandSender must have the correct associated world, so we're using ControllerCommandSender. -function getControllerSender(controller as IMachineController) as ICommandSender { - var sender = ControllerCommandSender(controller as TileMultiblockMachineController) as native.net.minecraft.command.ICommandSender; - return sender.wrapper; } \ No newline at end of file diff --git a/scripts/portals/ModularWormholeField.zs b/scripts/advancedModulars/portals/ModularWormholeField.zs similarity index 85% rename from scripts/portals/ModularWormholeField.zs rename to scripts/advancedModulars/portals/ModularWormholeField.zs index 82972028..ee240b9e 100644 --- a/scripts/portals/ModularWormholeField.zs +++ b/scripts/advancedModulars/portals/ModularWormholeField.zs @@ -1,5 +1,3 @@ -import native.hellfirepvp.modularmachinery.common.crafting.command.ControllerCommandSender; -import native.hellfirepvp.modularmachinery.common.tiles.base.TileMultiblockMachineController; import native.net.minecraft.item.Item; import native.net.minecraft.item.ItemStack; @@ -9,12 +7,13 @@ import crafttweaker.world.IBlockPos; import mods.modularmachinery.RecipeBuilder; import mods.modularmachinery.MachineTickEvent; import mods.modularmachinery.RecipeStartEvent; -import mods.modularmachinery.RecipeFailureEvent; import mods.modularmachinery.MMEvents; import mods.modularmachinery.IMachineController; -// Ideally some code here should be shared with ModularBeeStargate, but for some reason cross-script reference doesn't work. +// Shared code +import scripts.util.ModularEventUtils as Util; +static offset as Util.Offset = Util.Offset(4, -3); var portal = ; portal.addItems([ , @@ -102,9 +101,9 @@ wormholegallifrey.addItemInput().setChance(0) // Do start up sound and message if no current portal, spawn portal if different recipe, or nothing if same portal: function wormholeGeneratorRecipeStart(controller as IMachineController, portalBlock as string, destination as string) { - var pos = getCenter(controller, 4, -3); - var sender = getControllerSender(controller); - controller.world.native.getMinecraftServer().addScheduledTask(function() { + var pos = offset.getCenter(controller); + var sender = Util.getControllerSender(controller); + Util.scheduleTask(controller, function() as void { var currentPortalBlock = controller.world.getBlockState(pos); if (currentPortalBlock != IBlockState.getBlockState(portalBlock,"")) { @@ -128,8 +127,8 @@ MMEvents.onMachinePostTick("wormhole_field_generator", function(event as Machine if (ctrl.world.time % 20 != 0 || ctrl.isWorking) { return; } - var pos = getCenter(ctrl, 4, -3); - ctrl.world.native.getMinecraftServer().addScheduledTask(function() { + var pos = offset.getCenter(ctrl); + Util.scheduleTask(ctrl, function() as void { var centerState = ctrl.world.getBlockState(pos); var itemBlock = ItemStack(Item.getItemFromBlock(centerState.block.native)); // Only clear blocks that aren't unbreakable or are known portal blocks. @@ -142,7 +141,7 @@ MMEvents.onMachinePostTick("wormhole_field_generator", function(event as Machine // Clear portal blocks. function wormholeGeneratorClear(controller as IMachineController, pos as IBlockPos) { - var sender = getControllerSender(controller); + var sender = Util.getControllerSender(controller); wormholeGeneratorPlacePortal(controller, "minecraft:air", pos, sender); var offlineText = '{"translate":"chat.contenttweaker.wormhole_generator.offline"}'; server.commandManager.executeCommand(sender, "playsound minecraft:entity.evocation_illager.cast_spell ambient @a " + pos.x + " " + pos.y + " " + pos.z + " 1 0.5"); @@ -155,14 +154,4 @@ function wormholeGeneratorClear(controller as IMachineController, pos as IBlockP function wormholeGeneratorPlacePortal(controller as IMachineController, portalBlock as string, pos as IBlockPos, sender as ICommandSender) { var facing = controller.facing; server.commandManager.executeCommand(sender, "fill " + (pos.x - 1) + " " + (pos.y - 1) + " " + (pos.z - 1) + " " + (pos.x + 1) + " " + (pos.y + 1) + " " + (pos.z + 1) + " " + portalBlock); -} - -function getCenter(ctrl as IMachineController, offsetUp as int, offsetFacing as int) as IBlockPos { - return ctrl.pos.getOffset(up, offsetUp).getOffset(ctrl.facing, offsetFacing); -} - -// The ICommandSender must have the correct associated world, so we're using ControllerCommandSender. -function getControllerSender(controller as IMachineController) as ICommandSender { - var sender = ControllerCommandSender(controller as TileMultiblockMachineController) as native.net.minecraft.command.ICommandSender; - return sender.wrapper; } \ No newline at end of file diff --git a/scripts/util/ModularEventUtils.zs b/scripts/util/ModularEventUtils.zs new file mode 100644 index 00000000..daefaa7f --- /dev/null +++ b/scripts/util/ModularEventUtils.zs @@ -0,0 +1,47 @@ +#priority 10 + +import native.hellfirepvp.modularmachinery.common.crafting.command.ControllerCommandSender; +import native.hellfirepvp.modularmachinery.common.tiles.base.TileMultiblockMachineController; + +import crafttweaker.command.ICommandSender; +import crafttweaker.world.IBlockPos; +import mods.modularmachinery.IMachineController; + +/* +Utility functions for properly executing commands from a MMCE event. +*/ + +zenClass Offset { + val yOffset as int; + val facingOffset as int; + + zenConstructor(y as int, facing as int) { + yOffset = y; + facingOffset = facing; + } + + /* + Return the position of the center to use. + */ + function getCenter(ctrl as IMachineController) as IBlockPos { + return ctrl.pos.getOffset(up, yOffset).getOffset(ctrl.facing, facingOffset); + } +} + +/* +Return a command sender based on the MMCE controller. +Required in order to provide dimension context to commands. +*/ +function getControllerSender(controller as IMachineController) as ICommandSender { + var sender = ControllerCommandSender(controller as TileMultiblockMachineController) as native.net.minecraft.command.ICommandSender; + return sender.wrapper; +} + +/* +Schedule a task to run on the main thread. +You should use this for anything that modifies in-world objects. +The passed task must be `function() as void {...}`. +*/ +function scheduleTask(controller as IMachineController, task as function()void) { + controller.world.native.getMinecraftServer().addScheduledTask(task); +} \ No newline at end of file