From 9489de24b1592dc42ede61e22e63b2b3b252ddc5 Mon Sep 17 00:00:00 2001 From: CubeBotFan <150861277+cubebotfan@users.noreply.github.com> Date: Sun, 23 Feb 2025 16:30:52 -0600 Subject: [PATCH] Add a jei category for alchemy --- .../jei_categories/_jei_category_helper.js | 18 +++ .../alchemy/alchemy_handlers.js | 103 ++++++++++++++++++ .../alchemy/alchemy_kubejs_events.js | 38 +++++++ .../mysterious_conversion.js | 5 - manifest.json | 5 + .../assets/cabin/textures/gui/jei/widgets.png | Bin 0 -> 1366 bytes 6 files changed, 164 insertions(+), 5 deletions(-) create mode 100644 kubejs/client_scripts/jei_categories/_jei_category_helper.js create mode 100644 kubejs/client_scripts/jei_categories/alchemy/alchemy_handlers.js create mode 100644 kubejs/client_scripts/jei_categories/alchemy/alchemy_kubejs_events.js rename kubejs/client_scripts/{ => jei_categories}/mysterious_conversion.js (59%) create mode 100644 resourcepacks/CABIN/assets/cabin/textures/gui/jei/widgets.png diff --git a/kubejs/client_scripts/jei_categories/_jei_category_helper.js b/kubejs/client_scripts/jei_categories/_jei_category_helper.js new file mode 100644 index 0000000..46c1515 --- /dev/null +++ b/kubejs/client_scripts/jei_categories/_jei_category_helper.js @@ -0,0 +1,18 @@ +// priority: 100 + +//Java imports +//Mysterious Conversion recipe type +const ConversionRecipe = Java.loadClass('com.simibubi.create.compat.jei.ConversionRecipe') +//Used for creating Drawable graphics for JEI +const ResourceLocation = Java.loadClass('net.minecraft.resources.ResourceLocation'); +const JEIIDrawableAnimated = Java.loadClass('mezz.jei.api.gui.drawable.IDrawableAnimated'); +//Used to make the FE energy tooltip when hovering over the energy bar +const ThermalStringHelper = Java.loadClass('cofh.lib.util.helpers.StringHelper'); +//Used for to draw block models in jei categories +const Boolean = Java.loadClass('java.lang.Boolean'); +const Axis = Java.loadClass('com.mojang.math.Axis'); +const BlockStateProperties = Java.loadClass('net.minecraft.world.level.block.state.properties.BlockStateProperties'); +const AnimatedKinetics = Java.loadClass('com.simibubi.create.compat.jei.category.animations.AnimatedKinetics'); + +//initialize globals +if (!global.jeiCategories) global.jeiCategories = {} \ No newline at end of file diff --git a/kubejs/client_scripts/jei_categories/alchemy/alchemy_handlers.js b/kubejs/client_scripts/jei_categories/alchemy/alchemy_handlers.js new file mode 100644 index 0000000..914a56b --- /dev/null +++ b/kubejs/client_scripts/jei_categories/alchemy/alchemy_handlers.js @@ -0,0 +1,103 @@ +if (!global.jeiCategories.alchemy) global.jeiCategories.alchemy = { + recipeType: null, + resources: { + energyEmpty: null, + energyFull: null, + alchemyArrow: null + }, + handlers: { + verifyRecipe: undefined, + setRecipe: undefined, + draw: undefined, + tooltips: undefined + }, + loadResources: undefined +}; + +global.jeiCategories.alchemy.loadResources = function(guiHelper) { + this.resources.energyEmpty = guiHelper.createDrawable( + new ResourceLocation("cabin:textures/gui/jei/widgets.png"), + 0, + 0, + 14, + 18 + ); + this.resources.energyFull = guiHelper.createAnimatedDrawable( + guiHelper.createDrawable(new ResourceLocation("cabin:textures/gui/jei/widgets.png"), 14, 0, 14, 18), + 40, + JEIIDrawableAnimated.StartDirection.BOTTOM, + false + ); + this.resources.alchemyArrow = guiHelper.createDrawable( + new ResourceLocation("cabin:textures/gui/jei/widgets.png"), + 28, + 0, + 42, + 18 + ); +} + +global.jeiCategories.alchemy.handlers.verifyRecipe = (jeiHelpers, recipe) => { + // IMPORTANT: Always return true or false. If you do not, it could crash the game or cause JEI to not work properly. + if (!recipe) return false; + if (!recipe.data) return false; + if (!recipe.data.input) return false; + if (!recipe.data.output) return false; + + return true; +} + +global.jeiCategories.alchemy.handlers.setRecipe = (jeiHelpers, builder, recipe, focuses) => { + let guiHelper = jeiHelpers.getGuiHelper() + let inputItems = recipe.data.input; + + for(let i=0;i { + global.jeiCategories.alchemy.resources.energyEmpty.draw(guiGraphics, 5, 44); + global.jeiCategories.alchemy.resources.energyFull.draw(guiGraphics, 5, 44); + global.jeiCategories.alchemy.resources.alchemyArrow.draw(guiGraphics, 60, 44); + + //I don't fully understand this matrix stuff, most of it is copied from Create + let matrixStack = guiGraphics.pose(); + matrixStack.pushPose(); + matrixStack.translate(2, 22, 200); + matrixStack.translate(75, 5, 0); + matrixStack.mulPose(Axis.XP.rotationDegrees(-15.5)); + matrixStack.mulPose(Axis.YP.rotationDegrees(22.5 + 90)); + + AnimatedKinetics.defaultBlockElement(Block.getBlock('thermal:machine_frame').defaultBlockState()) + .rotateBlock(0, 0, 0) + .scale(20) + .render(guiGraphics); + + matrixStack.translate(0, 20, 0); + + AnimatedKinetics.defaultBlockElement(Block.getBlock('createdeco:green_industrial_iron_lamp').defaultBlockState().setValue(BlockStateProperties.FACING, Direction.DOWN).setValue(BlockStateProperties.LIT, new Boolean(true))) + .rotateBlock(0, 0, 0) + .scale(20) + .render(guiGraphics); + + matrixStack.popPose(); +} + +global.jeiCategories.alchemy.handlers.tooltips = (jeiHelpers, recipe, recipeSlotsView, mouseX, mouseY) => { + if (mouseX>5&&mouseX<18&&mouseY>44&&mouseY<61) { + return [ThermalStringHelper.getTextComponent("info.cofh.energy").append(": " + ThermalStringHelper.format(recipe.data.energy) + " " + ThermalStringHelper.localize("info.cofh.unit_rf"))]; + } + return []; +} \ No newline at end of file diff --git a/kubejs/client_scripts/jei_categories/alchemy/alchemy_kubejs_events.js b/kubejs/client_scripts/jei_categories/alchemy/alchemy_kubejs_events.js new file mode 100644 index 0000000..65d4756 --- /dev/null +++ b/kubejs/client_scripts/jei_categories/alchemy/alchemy_kubejs_events.js @@ -0,0 +1,38 @@ +JEIAddedEvents.registerCategories((event) => { + event.custom("kubejs:alchemy", (category) => { + let guiHelper = category.jeiHelpers.getGuiHelper(); + global.jeiCategories.alchemy.recipeType = category.recipeType; + global.jeiCategories.alchemy.loadResources(guiHelper); + + category.title("Alchemical Laser") + .background(guiHelper.createBlankDrawable(146, 70)) + .icon(guiHelper.createDrawableItemStack(Item.of('kubejs:alchemical_laser'))) + .setIsRecipeHandledByCategory((recipe) => { + return global.jeiCategories.alchemy.handlers["verifyRecipe"](category.jeiHelpers, recipe); + }) + .setSetRecipeHandler((builder, recipe, focuses) => { + global.jeiCategories.alchemy.handlers["setRecipe"](category.jeiHelpers, builder, recipe, focuses); + }) + .setDrawHandler((recipe, recipeSlotsView, guiGraphics, mouseX, mouseY) => { + global.jeiCategories.alchemy.handlers["draw"](category.jeiHelpers, recipe, recipeSlotsView, guiGraphics, mouseX, mouseY); + }) + .setTooltipHandler((recipe, recipeSlotsView, mouseX, mouseY) => { + return global.jeiCategories.alchemy.handlers["tooltips"](category.jeiHelpers, recipe, recipeSlotsView, mouseX, mouseY); + }) + }); +}); + +JEIAddedEvents.registerRecipeCatalysts(event => { + let addRecipeCatalyst = function(ingredient, recipeTypes) { + return event.data["addRecipeCatalyst(net.minecraft.world.item.ItemStack,mezz.jei.api.recipe.RecipeType[])"](ingredient, recipeTypes); + } + addRecipeCatalyst(Item.of('thermal:machine_frame'), [global.jeiCategories.alchemy.recipeType]); + addRecipeCatalyst(Item.of('kubejs:alchemical_laser'), [global.jeiCategories.alchemy.recipeType]); + addRecipeCatalyst(Item.of('minecraft:hopper_minecart'), [global.jeiCategories.alchemy.recipeType]); +}) + +JEIAddedEvents.registerRecipes((event) => { + event.custom("kubejs:alchemy") + .add({input: ["thermal:flux_magnet", "minecraft:basalt"], output: "thermal:basalz_rod", energy: 80}) + .add({input: ["ae2:entropy_manipulator", "minecraft:snowball"], output: "thermal:blizz_rod", energy: 160}); +}); \ No newline at end of file diff --git a/kubejs/client_scripts/mysterious_conversion.js b/kubejs/client_scripts/jei_categories/mysterious_conversion.js similarity index 59% rename from kubejs/client_scripts/mysterious_conversion.js rename to kubejs/client_scripts/jei_categories/mysterious_conversion.js index 2b0645f..217cbce 100644 --- a/kubejs/client_scripts/mysterious_conversion.js +++ b/kubejs/client_scripts/jei_categories/mysterious_conversion.js @@ -1,12 +1,7 @@ -// let MysteriousItemConversionCategory = Java.loadClass('com.simibubi.create.compat.jei.category.MysteriousItemConversionCategory') -const ConversionRecipe = Java.loadClass('com.simibubi.create.compat.jei.ConversionRecipe') - //We have to brute force things since the kubejs create guide doesn't work at all JEIEvents.removeRecipes(event => { const mysteryConversion = global.jeiRuntime.jeiHelpers.getRecipeType('create:mystery_conversion').get() global.jeiRuntime.recipeManager.addRecipes(mysteryConversion, [ - //Chapter 3 singularity recipe - new ConversionRecipe.create('ae2:singularity', 'ae2:quantum_entangled_singularity'), //Refined radiance mysterious conversion new ConversionRecipe.create('create:chromatic_compound', 'create:refined_radiance'), new ConversionRecipe.create('create:chromatic_compound', 'create:shadow_steel') diff --git a/manifest.json b/manifest.json index 36c221f..d3c1292 100644 --- a/manifest.json +++ b/manifest.json @@ -546,6 +546,11 @@ "projectID": 238086, "required": true }, + { + "fileID": 5817338, + "projectID": 594387, + "required": true + }, { "fileID": 5404565, "projectID": 570630, diff --git a/resourcepacks/CABIN/assets/cabin/textures/gui/jei/widgets.png b/resourcepacks/CABIN/assets/cabin/textures/gui/jei/widgets.png new file mode 100644 index 0000000000000000000000000000000000000000..4537abcc99374e45083d6bcc55a7230dba71c906 GIT binary patch literal 1366 zcmd^<{WIGK9LK+3Ax0l}a;2%EYlDrRx+P6LOvFPyv{B2-;VRL&3QAn+N~G%i!?l0Fd)9})oY#r7H#n3J$LEC93=?E84d!o*e?p|Lao zIQZ8mgKdSWTGP%_SP=FSouHj2QeanMmU9Bw)GyXCd24UOPd}*}Nk+Do-dPKvbg5pf zB9ys{!N$Yq68lD<_*aKvLr)$zhm66d@Nu%ucU^(bFR!!tN0$9At`BtWP-=x|Nn)|? zAP$H7QSy!VPam$8mY1IrFl?KAZs=wr+pT;_QINK54IVBRG<7J3S2N&88&b2hZ=P

6aPOlY-MB=`_K0fNM z+|QwFv7w=$3KK_lUr-e#?rc7PhIl~jr#{U?MyQ#WsNM^?MI5fC2u*W7KUHNnJ-rv_ z@y|4`+kya#LV2WJtKLCuQg>b31+OY}YIgBh&7$i;!O`24*vlV(m7*{*%@i1jhQ6!+YmIA%eq6r>QSrduIkUEp3JZukP zbR3oQl$Q!nlov(^Hb`O~BQ_oq!(+2Lq0OP=H` zwC>y%Hm+FBl^4}>)!BO_ugou;)~|~(IH1hHIHLPNpGYSfUm?A`IFB7!-=1=J&r++^ z9T7Iowgwc)eQo1UlVJ+=WMLzJ8@*yo?8JLW$K#!I6RN%Ok!L=<-Ae(f-tGF`PbE|bl7 zU^^HFGV@9pB*AF|1u{9u{9(89tP;8iwU%CMpI^x<0Bx79qQJ}T)S9o`lFg2bC7xDy zUEd||&m_Xg`Kkg(%q>QAL7K0_(9cMcc4TCP>^MkM?1uWfSo_F4E%Nj8t6N%H$UmH= zug*yoGwrnJQ{D5V;pJ`fjQ73ws7po;hg1KEg+Tu?Ha3>!h3@%n>nJiC2N0Fe!?V!+ zD{6Z_dn~y7gLy_bA=<{@&keKr-v$7`xJRWC^I~#xvH^5u zLgR@xJrRBu$>^MPkx>-PIAjZaLMnBf=@?>1xEz&0}}512fC{~8vp