From ebaae73dada43cf142e01eccb1a4ea8119ded0ed Mon Sep 17 00:00:00 2001 From: Flanks255 <32142731+Flanks255@users.noreply.github.com> Date: Mon, 4 Mar 2024 13:38:11 -0600 Subject: [PATCH] Adding my util classes --- .../actuallyadditions/mod/util/CapHelper.java | 33 +++++++++++++++ .../mod/util/NoAdvRecipeOutput.java | 29 +++++++++++++ .../mod/util/RecipeInjector.java | 32 ++++++++++++++ .../mod/util/RecipeUnlocker.java | 42 +++++++++++++++++++ 4 files changed, 136 insertions(+) create mode 100644 src/main/java/de/ellpeck/actuallyadditions/mod/util/CapHelper.java create mode 100644 src/main/java/de/ellpeck/actuallyadditions/mod/util/NoAdvRecipeOutput.java create mode 100644 src/main/java/de/ellpeck/actuallyadditions/mod/util/RecipeInjector.java create mode 100644 src/main/java/de/ellpeck/actuallyadditions/mod/util/RecipeUnlocker.java diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/util/CapHelper.java b/src/main/java/de/ellpeck/actuallyadditions/mod/util/CapHelper.java new file mode 100644 index 000000000..f860355b0 --- /dev/null +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/util/CapHelper.java @@ -0,0 +1,33 @@ +package de.ellpeck.actuallyadditions.mod.util; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.neoforged.neoforge.capabilities.Capabilities; +import net.neoforged.neoforge.items.IItemHandler; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.Optional; + +public class CapHelper { + @Nonnull + public static Optional getItemHandler(@Nonnull Level level, @Nonnull BlockPos pos, @Nullable Direction side) { + BlockState blockState = level.getBlockState(pos); + if (blockState.hasBlockEntity()) { + BlockEntity blockEntity = level.getBlockEntity(pos); + if (blockEntity != null) { + return Optional.ofNullable(level.getCapability(Capabilities.ItemHandler.BLOCK, pos, level.getBlockState(pos), blockEntity, side)); + } + } + return Optional.empty(); + } + + @Nonnull + public static Optional getItemHandler(ItemStack stack) { + return Optional.ofNullable(stack.getCapability(Capabilities.ItemHandler.ITEM)); + } +} diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/util/NoAdvRecipeOutput.java b/src/main/java/de/ellpeck/actuallyadditions/mod/util/NoAdvRecipeOutput.java new file mode 100644 index 000000000..d60d01639 --- /dev/null +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/util/NoAdvRecipeOutput.java @@ -0,0 +1,29 @@ +package de.ellpeck.actuallyadditions.mod.util; + +import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.AdvancementHolder; +import net.minecraft.data.recipes.RecipeOutput; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.Recipe; +import net.neoforged.neoforge.common.conditions.ICondition; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +public class NoAdvRecipeOutput implements RecipeOutput { + private final RecipeOutput inner; + public NoAdvRecipeOutput(RecipeOutput output) { + inner = output; + } + + @Nonnull + @Override + public Advancement.Builder advancement() { + return inner.advancement(); + } + + @Override + public void accept(@Nonnull ResourceLocation resourceLocation, @Nonnull Recipe recipe, @Nullable AdvancementHolder advancementHolder, @Nonnull ICondition... iConditions) { + inner.accept(resourceLocation, recipe, null, iConditions); + } +} diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/util/RecipeInjector.java b/src/main/java/de/ellpeck/actuallyadditions/mod/util/RecipeInjector.java new file mode 100644 index 000000000..0d87a6f47 --- /dev/null +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/util/RecipeInjector.java @@ -0,0 +1,32 @@ +package de.ellpeck.actuallyadditions.mod.util; + +import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.AdvancementHolder; +import net.minecraft.data.recipes.RecipeOutput; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.crafting.Recipe; +import net.neoforged.neoforge.common.conditions.ICondition; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.function.Function; +@SuppressWarnings("unchecked") +public class RecipeInjector> implements RecipeOutput { + private final RecipeOutput inner; + private final Function constructor; + public RecipeInjector(RecipeOutput output, Function constructorIn) { + inner = output; + this.constructor = constructorIn; + } + + @Nonnull + @Override + public Advancement.Builder advancement() { + return inner.advancement(); + } + + @Override + public void accept(@Nonnull ResourceLocation resourceLocation, @Nonnull Recipe recipe, @Nullable AdvancementHolder advancementHolder, @Nonnull ICondition... iConditions) { + inner.accept(resourceLocation, constructor.apply((T) recipe), advancementHolder, iConditions); + } +} diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/util/RecipeUnlocker.java b/src/main/java/de/ellpeck/actuallyadditions/mod/util/RecipeUnlocker.java new file mode 100644 index 000000000..e868fb58d --- /dev/null +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/util/RecipeUnlocker.java @@ -0,0 +1,42 @@ +package de.ellpeck.actuallyadditions.mod.util; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.event.entity.player.PlayerEvent; + +import java.util.ArrayList; + +public class RecipeUnlocker { + private static String modtag; + private static int version; + private static String MODID; + + public static void register(String modid, IEventBus bus, int recipeversion) { + modtag = modid + "_unlocked"; + version = recipeversion; + MODID = modid; + bus.addListener(RecipeUnlocker::onPlayerLoggedIn); + } + + private static void onPlayerLoggedIn(PlayerEvent.PlayerLoggedInEvent event) { + Player player = event.getEntity(); + + CompoundTag tag = player.getPersistentData(); + if (tag.contains(modtag) && tag.getInt(modtag) >= version) { + return; + } + + if (player instanceof ServerPlayer) { + MinecraftServer server = player.getServer(); + if (server != null) { + var recipes = new ArrayList<>(server.getRecipeManager().getRecipes()); + recipes.removeIf((recipe -> !recipe.id().getNamespace().contains(MODID))); + player.awardRecipes(recipes); + tag.putInt(modtag, version); + } + } + } +}