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/util/ModularEventUtils.zs b/scripts/util/ModularEventUtils.zs index d929cf0d..daefaa7f 100644 --- a/scripts/util/ModularEventUtils.zs +++ b/scripts/util/ModularEventUtils.zs @@ -39,7 +39,7 @@ function getControllerSender(controller as IMachineController) as ICommandSender /* Schedule a task to run on the main thread. -You should do this for anything that involves in-world objects (like block state and commands). +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) {