diff --git a/gradle.properties b/gradle.properties index be8660f..d67dcc2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,7 @@ neo_version=26.1.2.44-beta mod_id=cakesticklib mod_name=CakeStickLib mod_license=Ora Et Labora License -mod_version=1.10.1 +mod_version=1.10.3 mod_group_id=com.devdyna.cakestick mod_authors=DevDyna mod_description=A standalone port of Synergy API to unify most of the code diff --git a/src/generated/resources/assets/cakesticklib/lang/en_us.json b/src/generated/resources/assets/cakesticklib/lang/en_us.json index 418efd6..0b083ee 100644 --- a/src/generated/resources/assets/cakesticklib/lang/en_us.json +++ b/src/generated/resources/assets/cakesticklib/lang/en_us.json @@ -42,6 +42,7 @@ "cakesticklib.item.placeable": "§7Can be placed", "cakesticklib.jei.copper_oxidation": "Copper Oxidation Info", "cakesticklib.jei.patina_drop": "§7Drop %s§7 items every scrape", + "cakesticklib.jei.strippable": "Block Strippable Info", "cakesticklib.provider.every_tick": "Generate %s %s every tick", "cakesticklib.provider.generic": "Generate %s %s every %d ticks", "cakesticklib.redstone_acid.tip": "§7Oxidize copper blocks", diff --git a/src/main/java/com/devdyna/cakesticklib/api/aspect/logic/UpgradeInstallable.java b/src/main/java/com/devdyna/cakesticklib/api/aspect/logic/UpgradeInstallable.java index 7cac989..7f274dd 100644 --- a/src/main/java/com/devdyna/cakesticklib/api/aspect/logic/UpgradeInstallable.java +++ b/src/main/java/com/devdyna/cakesticklib/api/aspect/logic/UpgradeInstallable.java @@ -11,7 +11,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; -import net.neoforged.neoforge.transfer.item.ItemStackResourceHandler; +import net.neoforged.neoforge.transfer.item.ItemStacksResourceHandler; public interface UpgradeInstallable { @@ -19,7 +19,7 @@ public interface UpgradeInstallable { Level getLevel(); - ItemStackResourceHandler getUpgradeItemStorage(); + ItemStacksResourceHandler getUpgradeItemStorage(); List getUpgradeSlots(); diff --git a/src/main/java/com/devdyna/cakesticklib/api/compat/jei/EntityJei.java b/src/main/java/com/devdyna/cakesticklib/api/compat/jei/EntityJei.java new file mode 100644 index 0000000..efd3143 --- /dev/null +++ b/src/main/java/com/devdyna/cakesticklib/api/compat/jei/EntityJei.java @@ -0,0 +1,63 @@ +package com.devdyna.cakesticklib.api.compat.jei; + +import java.util.function.Function; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.client.gui.screens.inventory.InventoryScreen; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.EntitySpawnReason; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; + +public class EntityJei { + + public static void renderEntity(EntityType type, + GuiGraphicsExtractor g, int x, int y, int xo, int yo, double mouseX, + double mouseY) { + renderEntity(type, g, x, y, xo, yo, e -> e, mouseX, mouseY); + } + + public static void renderEntity(EntityType type, + GuiGraphicsExtractor g, int x, int y, int xo, int yo, Function c, double mouseX, + double mouseY) { + + var level = Minecraft.getInstance().level; + + if (level == null) + return; + + var entity = type.create(level, EntitySpawnReason.EVENT); + + if (entity == null) + return; + + entity = c.apply(entity); + + xo = Math.max(xo, 1); + yo = Math.max(yo, 1); + + var pose = g.pose(); + var left = pose.m20(); + var top = pose.m21(); + + var x1 = (int) left + x; + var y1 = (int) top + y; + var x2 = (int) left + xo + x; + var y2 = (int) top + yo + y; + + var entH = entity.getBbHeight(); + var entW = entity.getBbWidth(); + + var scale = Mth.clamp( + Math.min((y2 - y1) / entH, (x2 - x1) / Mth.sqrt(entW * entW + entH * entH)), 6.0F, 18.0F); + + InventoryScreen.extractEntityInInventoryFollowsMouse( + g, + x1, y1, x2, y2, + (int) scale, + ((y2 - y1) - entH * scale) / 2 / scale, + (int) (mouseX + left), (int) (mouseY + top), + entity); + } +} diff --git a/src/main/java/com/devdyna/cakesticklib/api/gui/BaseScreen.java b/src/main/java/com/devdyna/cakesticklib/api/gui/BaseScreen.java index 7a07589..833b181 100644 --- a/src/main/java/com/devdyna/cakesticklib/api/gui/BaseScreen.java +++ b/src/main/java/com/devdyna/cakesticklib/api/gui/BaseScreen.java @@ -2,6 +2,8 @@ import javax.annotation.Nullable; +import com.devdyna.cakesticklib.api.utils.x; + import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.client.renderer.RenderPipelines; @@ -21,6 +23,8 @@ public BaseScreen(T menu, Inventory playerInventory, Component title) { return null; } + public static final Identifier furnace_arrow = x.mcLoc("container/furnace/burn_progress"); + protected boolean whenAnimateArrow() { return false; } @@ -29,7 +33,6 @@ protected int getScaledArrowProgress() { return 0; } - @Override public void extractBackground(GuiGraphicsExtractor graphics, int mouseX, int mouseY, float a) { super.extractBackground(graphics, mouseX, mouseY, a); @@ -40,9 +43,12 @@ public void extractBackground(GuiGraphicsExtractor graphics, int mouseX, int mou protected void renderArrow(GuiGraphicsExtractor guiGraphics) { if (arrow() != null && whenAnimateArrow()) - guiGraphics.blit(arrow(), getLeftPos() + 73, getTopPos() + 35, 0, 0, getScaledArrowProgress(), 16, 24, 16); + guiGraphics.blitSprite(RenderPipelines.GUI_TEXTURED, + arrow(), + 24, 16, + 0, 0, + getLeftPos() + 73, getTopPos() + 35, + getScaledArrowProgress(), 16); } - - } diff --git a/src/main/java/com/devdyna/cakesticklib/api/utils/ColorUtil.java b/src/main/java/com/devdyna/cakesticklib/api/utils/ColorUtil.java deleted file mode 100644 index 8505e2d..0000000 --- a/src/main/java/com/devdyna/cakesticklib/api/utils/ColorUtil.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.devdyna.cakesticklib.api.utils; - -import java.util.List; -import java.util.stream.Collectors; -import java.awt.Color; - -import net.minecraft.world.level.Level; - -/** - * @deprecated Use {@link ColorUtils} instead. - */ -@Deprecated(forRemoval = true) -public class ColorUtil { - - public static List colorList = List.of( - Color.WHITE, - Color.LIGHT_GRAY, - Color.GRAY, - Color.DARK_GRAY, - Color.BLACK, - Color.RED, - Color.PINK, - Color.ORANGE, - Color.YELLOW, - Color.GREEN, - Color.MAGENTA, - Color.CYAN, - Color.BLUE); - - public static List colorBlackWhiteList = List.of( - Color.WHITE, - Color.LIGHT_GRAY, - Color.GRAY, - Color.DARK_GRAY, - Color.BLACK); - - public static List colorfulColorList = colorList.stream().filter(i -> !colorBlackWhiteList.contains(i)) - .collect(Collectors.toList()); - - public static int rgbColor(Level level, int delay) { - return java.awt.Color.HSBtoRGB((level.getGameTime() % delay) / (delay * 1f), 1.0f, 1.0f) - & 0xFFFFFF; - } - - public static int rgbColor() { - return rgbColor((int) (TimeUtil.ONE_SECOND*2)); - } - - public static int rgbColor(int delay) { - return java.awt.Color.HSBtoRGB((System.currentTimeMillis() % delay) / (delay * 1f), 1.0f, 1.0f) - & 0xFFFFFF; - } - - public static int rgbColor(Level level) { - return rgbColor(level, 160); - } - - public static Color color(int red, int green, int blue) { - return new Color(red, green, blue); - } - - public static int pulseColor(Level level, int delay, int startColor, int endColor) { - - float t = (float) ((Math.sin((level.getGameTime() % delay) * (2 * Math.PI / delay)) + 1) / 2); - - int r1 = (startColor >> 16) & 0xFF; - int g1 = (startColor >> 8) & 0xFF; - int b1 = startColor & 0xFF; - - int r2 = (endColor >> 16) & 0xFF; - int g2 = (endColor >> 8) & 0xFF; - int b2 = endColor & 0xFF; - - int r = (int) (r1 + (r2 - r1) * t); - int g = (int) (g1 + (g2 - g1) * t); - int b = (int) (b1 + (b2 - b1) * t); - - return (r << 16) | (g << 8) | b; - } - - public static int pulseColor(Level level, int startColor, int endColor) { - return pulseColor(level, 160, startColor, endColor); - } - -} \ No newline at end of file diff --git a/src/main/java/com/devdyna/cakesticklib/api/utils/LootTableHelper.java b/src/main/java/com/devdyna/cakesticklib/api/utils/LootTableHelper.java new file mode 100644 index 0000000..4799cc1 --- /dev/null +++ b/src/main/java/com/devdyna/cakesticklib/api/utils/LootTableHelper.java @@ -0,0 +1,45 @@ +package com.devdyna.cakesticklib.api.utils; + +import java.util.List; + +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceKey; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.storage.loot.LootParams; +import net.minecraft.world.level.storage.loot.LootTable; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; + +public class LootTableHelper { + + public static LootTable getLootTable(Level level, Identifier rl) { + return level.getServer().reloadableRegistries() + .getLootTable(ResourceKey + .create(Registries.LOOT_TABLE, rl)); + } + + public static List getItemStackFromLootTable(ServerLevel level, Identifier rl) { + return getLootTable(level, rl).getRandomItems(new LootParams.Builder(level).create(LootContextParamSets.EMPTY)); + } + + public static List getItemStackFromLootTable(ServerLevel level, Identifier rl, LootParams p) { + return getLootTable(level, rl).getRandomItems(p); + } + + public static LootTable getLootTable(Level level, ResourceKey rk) { + return level.getServer().reloadableRegistries() + .getLootTable(rk); + } + + public static List getItemStackFromLootTable(ServerLevel level, ResourceKey rk) { + return getLootTable(level, rk).getRandomItems(new LootParams.Builder(level).create(LootContextParamSets.EMPTY)); + } + + public static List getItemStackFromLootTable(ServerLevel level, ResourceKey rk, + LootParams p) { + return getLootTable(level, rk).getRandomItems(p); + } + +} diff --git a/src/main/java/com/devdyna/cakesticklib/api/utils/x.java b/src/main/java/com/devdyna/cakesticklib/api/utils/x.java index 56af7de..0f7ae67 100644 --- a/src/main/java/com/devdyna/cakesticklib/api/utils/x.java +++ b/src/main/java/com/devdyna/cakesticklib/api/utils/x.java @@ -499,19 +499,22 @@ public static Item[] toItems(Block... blocks) { } public static List>> getBlocks(DataMapType datamap) { - return BuiltInRegistries.BLOCK.getDataMap(datamap).entrySet() - .stream() - .map(Map.Entry::getKey) - .map(ResourceKey::identifier) - .map(BuiltInRegistries.BLOCK::get).toList(); + return getFrom(BuiltInRegistries.BLOCK, datamap); } public static List>> getItems(DataMapType datamap) { - return BuiltInRegistries.ITEM.getDataMap(datamap).entrySet() + return getFrom(BuiltInRegistries.ITEM, datamap); + } + + public static List>> getFrom( + DefaultedRegistry registry, + DataMapType datamap) { + return registry.getDataMap(datamap).entrySet() .stream() .map(Map.Entry::getKey) .map(ResourceKey::identifier) - .map(BuiltInRegistries.ITEM::get).toList(); + .map(registry::get) + .toList(); } } diff --git a/src/main/java/com/devdyna/cakesticklib/setup/compat/jei/PluginJEI.java b/src/main/java/com/devdyna/cakesticklib/setup/compat/jei/PluginJEI.java index 935366d..57b1a51 100644 --- a/src/main/java/com/devdyna/cakesticklib/setup/compat/jei/PluginJEI.java +++ b/src/main/java/com/devdyna/cakesticklib/setup/compat/jei/PluginJEI.java @@ -7,6 +7,7 @@ import com.devdyna.cakesticklib.api.utils.x; import com.devdyna.cakesticklib.setup.Client; import com.devdyna.cakesticklib.setup.compat.jei.categories.CopperOxidationCategory; +import com.devdyna.cakesticklib.setup.compat.jei.categories.StrippableCategory; import com.devdyna.cakesticklib.setup.registry.*; import mezz.jei.api.IModPlugin; @@ -43,7 +44,8 @@ public void registerCategories(IRecipeCategoryRegistration r) { r.addRecipeCategories( - new CopperOxidationCategory(helper) + new CopperOxidationCategory(helper), + new StrippableCategory(helper) ); @@ -55,6 +57,8 @@ public void registerRecipes(IRecipeRegistration r) { r.addRecipes(CopperOxidationCategory.TYPE, getRecipes(LibRecipeTypes.COPPER_OXIDATION.getType())); + r.addRecipes(StrippableCategory.TYPE, StrippableCategory.getRecipes()); + } private > List> getRecipes(RecipeType type) { diff --git a/src/main/java/com/devdyna/cakesticklib/setup/compat/jei/categories/CopperOxidationCategory.java b/src/main/java/com/devdyna/cakesticklib/setup/compat/jei/categories/CopperOxidationCategory.java index 5ad50b1..d33ecc6 100644 --- a/src/main/java/com/devdyna/cakesticklib/setup/compat/jei/categories/CopperOxidationCategory.java +++ b/src/main/java/com/devdyna/cakesticklib/setup/compat/jei/categories/CopperOxidationCategory.java @@ -74,7 +74,7 @@ public Size setXY() { @Override public Identifier setBackGround() { - return x.rl(MODULE_ID, "textures/gui/jei/oxidation.png"); + return x.rl(MODULE_ID, "textures/gui/jei/catalyst.png"); } @Override diff --git a/src/main/java/com/devdyna/cakesticklib/setup/compat/jei/categories/StrippableCategory.java b/src/main/java/com/devdyna/cakesticklib/setup/compat/jei/categories/StrippableCategory.java new file mode 100644 index 0000000..cdcdd8d --- /dev/null +++ b/src/main/java/com/devdyna/cakesticklib/setup/compat/jei/categories/StrippableCategory.java @@ -0,0 +1,88 @@ +package com.devdyna.cakesticklib.setup.compat.jei.categories; + +import java.util.*; +import com.devdyna.cakesticklib.api.compat.jei.BaseCategory; +import com.devdyna.cakesticklib.api.primitive.Size; +import com.devdyna.cakesticklib.api.utils.x; +import com.devdyna.cakesticklib.setup.compat.jei.recipes.StrippableRecipe; +import static com.devdyna.cakesticklib.CakeStickLib.MODULE_ID; + +import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; +import mezz.jei.api.helpers.IGuiHelper; +import mezz.jei.api.recipe.IFocusGroup; +import mezz.jei.api.recipe.RecipeIngredientRole; +import mezz.jei.api.recipe.types.IRecipeType; +import net.minecraft.core.Holder.Reference; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.Identifier; +import net.minecraft.tags.ItemTags; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.ItemLike; +import net.neoforged.neoforge.registries.datamaps.builtin.NeoForgeDataMaps; + +public class StrippableCategory extends BaseCategory { + + @SuppressWarnings("deprecation") + public static final List getRecipes() { + return x.getBlocks(NeoForgeDataMaps.STRIPPABLES) + .stream() + .filter(Optional::isPresent) + .map(Optional::get) + .map(Reference::value) + .map(i -> new StrippableRecipe(i, + i.builtInRegistryHolder().getData(NeoForgeDataMaps.STRIPPABLES).strippedBlock())) + .toList(); + } + + public StrippableCategory(IGuiHelper h) { + super(h); + } + + public static final IRecipeType TYPE = IRecipeType + .create(x.rl(MODULE_ID, "strippable"), StrippableRecipe.class); + + @Override + public IRecipeType getRecipeType() { + return TYPE; + } + + @Override + public String getTraslationKey() { + return MODULE_ID + ".jei.strippable"; + } + + @Override + public ItemLike getIconItem() { + return Items.IRON_AXE; + } + + @Override + public Size setXY() { + return Size.of(77, 20); + } + + @Override + public Identifier setBackGround() { + return x.rl(MODULE_ID, "textures/gui/jei/catalyst.png"); + } + + @Override + public void setRecipe(IRecipeLayoutBuilder builder, StrippableRecipe recipe, IFocusGroup focuses) { + + super.setRecipe(builder, recipe, focuses); + + builder.addSlot(RecipeIngredientRole.INPUT, 2, 2) + .add(recipe.unstripped()); + + var axes = BuiltInRegistries.ITEM.get(ItemTags.AXES); + + if (axes.isPresent()) + builder.addSlot(RecipeIngredientRole.CRAFTING_STATION, 29, 2) + .add(x.itemIngredient(axes.get())); + + builder.addSlot(RecipeIngredientRole.OUTPUT, 59, 2) + .add(recipe.stripped()); + + } + +} \ No newline at end of file diff --git a/src/main/java/com/devdyna/cakesticklib/setup/compat/jei/recipes/StrippableRecipe.java b/src/main/java/com/devdyna/cakesticklib/setup/compat/jei/recipes/StrippableRecipe.java new file mode 100644 index 0000000..3f4da62 --- /dev/null +++ b/src/main/java/com/devdyna/cakesticklib/setup/compat/jei/recipes/StrippableRecipe.java @@ -0,0 +1,7 @@ +package com.devdyna.cakesticklib.setup.compat.jei.recipes; + +import net.minecraft.world.level.block.Block; + +public record StrippableRecipe(Block unstripped,Block stripped) { + +} diff --git a/src/main/java/com/devdyna/cakesticklib/setup/datagen/client/DataLang.java b/src/main/java/com/devdyna/cakesticklib/setup/datagen/client/DataLang.java index a239cd7..e17905a 100644 --- a/src/main/java/com/devdyna/cakesticklib/setup/datagen/client/DataLang.java +++ b/src/main/java/com/devdyna/cakesticklib/setup/datagen/client/DataLang.java @@ -85,6 +85,7 @@ protected void addTranslations() { LangUtils.advKey(this, MODULE_ID, "cake_stick", "The cake is(n't) a lie!", "The Cake stick is right!"); add(MODULE_ID + ".jei.copper_oxidation", "Copper Oxidation Info"); + add(MODULE_ID + ".jei.strippable", "Block Strippable Info"); add(MODULE_ID + ".jei.patina_drop", TIP_COLOR + "Drop %s" + TIP_COLOR + " items every scrape"); diff --git a/src/main/resources/assets/cakesticklib/textures/gui/jei/oxidation.png b/src/main/resources/assets/cakesticklib/textures/gui/jei/catalyst.png similarity index 100% rename from src/main/resources/assets/cakesticklib/textures/gui/jei/oxidation.png rename to src/main/resources/assets/cakesticklib/textures/gui/jei/catalyst.png