diff --git a/common/src/generated/resources/assets/nirvana/lang/en_ud.json b/common/src/generated/resources/assets/nirvana/lang/en_ud.json index 2aef97d..d25f8f1 100644 --- a/common/src/generated/resources/assets/nirvana/lang/en_ud.json +++ b/common/src/generated/resources/assets/nirvana/lang/en_ud.json @@ -13,6 +13,7 @@ "item.nirvana.joint": "ʇuıoſ", "item.nirvana.music_disc_jam": "ɔsıᗡ ɔısnW", "item.nirvana.music_disc_jam.desc": "ɥɔɹıɟ - ɯɐſ", + "item.nirvana.old_pipe": "ǝdıԀ pןO", "item.nirvana.potion_bong": "buoᗺ uoıʇoԀ", "item.nirvana.potion_bong.effect.awkward": "buoᗺ pɹɐʍʞʍⱯ", "item.nirvana.potion_bong.effect.empty": "buoᗺ ʎʇdɯƎ", @@ -35,6 +36,7 @@ "item.nirvana.potion_bong.effect.water": "buoᗺ ɹǝʇɐM", "item.nirvana.potion_bong.effect.water_breathing": "buıɥʇɐǝɹᗺ ɹǝʇɐM ɟo buoᗺ", "item.nirvana.potion_bong.effect.weakness": "ssǝuʞɐǝM ɟo buoᗺ", + "item.nirvana.suspicious_pipe": "ǝdıԀ snoıɔıdsnS", "item.nirvana.weed": "pnᗺ pǝǝM", "item.nirvana.weed_brownie": "ǝıuʍoɹᗺ pǝǝM", "painting.nirvana.this_is_not_a_horn.author": "oʇʇǝdɐʎ", diff --git a/common/src/generated/resources/assets/nirvana/lang/en_us.json b/common/src/generated/resources/assets/nirvana/lang/en_us.json index 3f58f83..655f1ee 100644 --- a/common/src/generated/resources/assets/nirvana/lang/en_us.json +++ b/common/src/generated/resources/assets/nirvana/lang/en_us.json @@ -13,6 +13,7 @@ "item.nirvana.joint": "Joint", "item.nirvana.music_disc_jam": "Music Disc", "item.nirvana.music_disc_jam.desc": "Jam - firch", + "item.nirvana.old_pipe": "Old Pipe", "item.nirvana.potion_bong": "Potion Bong", "item.nirvana.potion_bong.effect.awkward": "Awkward Bong", "item.nirvana.potion_bong.effect.empty": "Empty Bong", @@ -35,6 +36,7 @@ "item.nirvana.potion_bong.effect.water": "Water Bong", "item.nirvana.potion_bong.effect.water_breathing": "Bong of Water Breathing", "item.nirvana.potion_bong.effect.weakness": "Bong of Weakness", + "item.nirvana.suspicious_pipe": "Suspicious Pipe", "item.nirvana.weed": "Weed Bud", "item.nirvana.weed_brownie": "Weed Brownie", "painting.nirvana.this_is_not_a_horn.author": "Yapetto", diff --git a/common/src/generated/resources/assets/nirvana/models/item/old_pipe.json b/common/src/generated/resources/assets/nirvana/models/item/old_pipe.json new file mode 100644 index 0000000..c5f9e57 --- /dev/null +++ b/common/src/generated/resources/assets/nirvana/models/item/old_pipe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "nirvana:item/old_pipe" + } +} \ No newline at end of file diff --git a/common/src/generated/resources/assets/nirvana/models/item/suspicious_pipe.json b/common/src/generated/resources/assets/nirvana/models/item/suspicious_pipe.json new file mode 100644 index 0000000..b2d33b9 --- /dev/null +++ b/common/src/generated/resources/assets/nirvana/models/item/suspicious_pipe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "nirvana:item/suspicious_pipe" + } +} \ No newline at end of file diff --git a/common/src/main/java/galena/nirvana/compat/NirvanaJeiCompat.java b/common/src/main/java/galena/nirvana/compat/NirvanaJeiCompat.java index 58cb2bf..5e73b28 100644 --- a/common/src/main/java/galena/nirvana/compat/NirvanaJeiCompat.java +++ b/common/src/main/java/galena/nirvana/compat/NirvanaJeiCompat.java @@ -1,10 +1,14 @@ package galena.nirvana.compat; import galena.nirvana.NirvanaConstants; +import galena.nirvana.world.item.SuspiciousItem; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.effect.MobEffect; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.alchemy.PotionUtils; +import java.util.StringJoiner; + public class NirvanaJeiCompat { public static final ResourceLocation ID = new ResourceLocation(NirvanaConstants.MOD_ID, "jei"); @@ -16,4 +20,18 @@ public static String interpretPotion(ItemStack ingredient, Object unused) { effects.forEach(it -> builder.append(";").append(it)); return builder.toString(); } + + public static String interpretSuspiciousItem(ItemStack ingredient, Object unused) { + var effects = SuspiciousItem.getEffects(ingredient, 1000); + + if(effects.isEmpty()) return ""; + + var joiner = new StringJoiner(",", "[", "]"); + effects.stream() + .map(it -> MobEffect.getId(it.getEffect()) + "." + it.getDuration()) + .forEach(joiner::add); + + return joiner.toString(); + } + } diff --git a/common/src/main/java/galena/nirvana/config/NirvanaCommonConfig.java b/common/src/main/java/galena/nirvana/config/NirvanaCommonConfig.java index ad5bd66..85092ab 100644 --- a/common/src/main/java/galena/nirvana/config/NirvanaCommonConfig.java +++ b/common/src/main/java/galena/nirvana/config/NirvanaCommonConfig.java @@ -37,4 +37,8 @@ public int browniesPeaceSeconds() { public int herbalSalveDuration() { return 160 * 3; } + + public int suspiciousPipeDuration() { + return 160 * 3; + } } diff --git a/common/src/main/java/galena/nirvana/index/NirvanaItems.java b/common/src/main/java/galena/nirvana/index/NirvanaItems.java index 0fa8582..74f0330 100644 --- a/common/src/main/java/galena/nirvana/index/NirvanaItems.java +++ b/common/src/main/java/galena/nirvana/index/NirvanaItems.java @@ -17,6 +17,7 @@ import galena.nirvana.world.item.LazyFoodItem; import galena.nirvana.world.item.ModdedRecordItem; import galena.nirvana.world.item.PotionBongItem; +import galena.nirvana.world.item.SuspiciousPipeItem; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.data.recipes.RecipeCategory; import net.minecraft.data.recipes.ShapelessRecipeBuilder; @@ -95,8 +96,8 @@ private static Consumer addPotionStack .forEach(modifier::accept); } - private static Consumer addSalveStacks() { - return modifier -> NirvanaRecipeTypes.getSalves() + private static Consumer addSuspiciousStack(ItemBuilder item) { + return modifier -> NirvanaRecipeTypes.getSuspiciousVariants(item.getEntry()) .map(Pair::getSecond) .forEach(modifier::accept); } @@ -107,12 +108,15 @@ private static Consumer addSalveStacks .color(() -> () -> NirvanaClient.POTION_COLOR) .properties(it -> it.durability(Services.CONFIG.common().getBongHits())) .properties(it -> it.craftRemainder(Items.GLASS_BOTTLE)) + .tag(NirvanaTags.SMOKING_ITEM) .model((c, p) -> p.generated(c, p.modLoc("item/bong_potion"), p.modLoc("item/bong_potion_overlay"))) .register(); + public static final ItemEntry JOINT = REGISTRATE .item("joint", Services.PLATFORM::createJointItem) .properties(it -> it.durability(Services.CONFIG.common().getJointHits())) .tag(NirvanaTags.NAUSEATING) + .tag(NirvanaTags.SMOKING_ITEM) .tag(NirvanaTags.ATTACHED_TO_HEAD) .tab(CreativeModeTabs.FOOD_AND_DRINKS) .model(Services.DATAGEN::joint) @@ -129,7 +133,7 @@ private static Consumer addSalveStacks .item("herbal_salve", HerbalSalveItem::new) .properties(it -> it.stacksTo(1)) .properties(it -> it.craftRemainder(Items.BOWL)) - .tab(CreativeModeTabs.FOOD_AND_DRINKS, NirvanaItems.addSalveStacks()) + .transform(it -> it.tab(CreativeModeTabs.FOOD_AND_DRINKS, NirvanaItems.addSuspiciousStack(it))) .register(); public static final ItemEntry DISC_JAM = REGISTRATE @@ -144,6 +148,21 @@ private static Consumer addSalveStacks }) .register(); + public static final ItemEntry EMPTY_PIPE = REGISTRATE + .item("old_pipe", Item::new) + .properties(it -> it.stacksTo(1)) + .properties(it -> it.rarity(Rarity.RARE)) + .tab(CreativeModeTabs.TOOLS_AND_UTILITIES) + .register(); + + public static final ItemEntry FILLED_PIPE = REGISTRATE + .item("suspicious_pipe", SuspiciousPipeItem::new) + .properties(it -> it.stacksTo(1)) + .properties(it -> it.rarity(Rarity.RARE)) + .tag(NirvanaTags.SMOKING_ITEM) + .transform(it -> it.tab(CreativeModeTabs.TOOLS_AND_UTILITIES, NirvanaItems.addSuspiciousStack(it))) + .register(); + public static void register() { // loads this class } diff --git a/common/src/main/java/galena/nirvana/index/NirvanaRecipeTypes.java b/common/src/main/java/galena/nirvana/index/NirvanaRecipeTypes.java index ad5a1d1..1781f5e 100644 --- a/common/src/main/java/galena/nirvana/index/NirvanaRecipeTypes.java +++ b/common/src/main/java/galena/nirvana/index/NirvanaRecipeTypes.java @@ -3,9 +3,8 @@ import com.mojang.datafixers.util.Pair; import com.tterrag.registrate.AbstractRegistrate; import com.tterrag.registrate.util.entry.RegistryEntry; -import galena.nirvana.NirvanaConstants; import galena.nirvana.platform.Services; -import galena.nirvana.world.recipe.HerbalSalveRecipe; +import galena.nirvana.world.recipe.SuspicousCraftingRecipe; import net.minecraft.core.Holder; import net.minecraft.core.HolderSet; import net.minecraft.core.NonNullList; @@ -21,32 +20,24 @@ import net.minecraft.world.item.crafting.CraftingBookCategory; import net.minecraft.world.item.crafting.CraftingRecipe; import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.item.crafting.Recipe; -import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.ShapelessRecipe; -import net.minecraft.world.item.crafting.SimpleCraftingRecipeSerializer; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.FlowerBlock; import java.util.List; +import java.util.function.Function; import java.util.stream.Stream; public class NirvanaRecipeTypes { - public static class SimpleRecipeType> implements RecipeType { - } - private static final AbstractRegistrate REGISTRATE = Services.PLATFORM.getRegistrate(); - //public static final RegistryEntry> HERBAL_SALVE_RECIPE_TYPE = REGISTRATE - // .generic("herbal_salve_crafting", Registries.RECIPE_TYPE, SimpleRecipeType::new) - // .register(); - - public static final RegistryEntry> HERBAL_SALVE_RECIPE_SERIALIZER = REGISTRATE - .generic("herbal_salve_crafting", Registries.RECIPE_SERIALIZER, () -> new SimpleCraftingRecipeSerializer<>(HerbalSalveRecipe::new)) + public static final RegistryEntry> SUSPICIOUS_RECIPE_SERIALIZER = REGISTRATE + .generic("suspicious_crafting", Registries.RECIPE_SERIALIZER, SuspicousCraftingRecipe.Serializer::new) .register(); - public static Stream> getSalves() { + public static Stream> getSuspiciousVariants(ItemLike output) { return BuiltInRegistries.ITEM.getTag(ItemTags.SMALL_FLOWERS) .stream() .flatMap(HolderSet.ListBacked::stream) @@ -56,29 +47,39 @@ public static Stream> getSalves() { .filter(FlowerBlock.class::isInstance) .map(FlowerBlock.class::cast) .map(flower -> { - ItemStack output = NirvanaItems.HERBAL_SALVE.asStack(); + var outputStack = new ItemStack(output); MobEffect mobeffect = flower.getSuspiciousEffect(); - SuspiciousStewItem.saveMobEffect(output, mobeffect, flower.getEffectDuration()); + SuspiciousStewItem.saveMobEffect(outputStack, mobeffect, flower.getEffectDuration()); - return new Pair<>(flower, output); + return new Pair<>(flower, outputStack); }); } - public static List createSalveRecipes() { - String group = "jei.herbal_salves"; - Ingredient bowl = Ingredient.of(Items.BOWL); - Ingredient weed = Ingredient.of(NirvanaItems.WEED); + private static Stream createSuspiciousRecipes(Ingredient base, ItemLike result, int flowerCount, int weedCount) { + var group = BuiltInRegistries.ITEM.getKey(result.asItem()); + var weed = Ingredient.of(NirvanaItems.WEED); - return getSalves().map(pair -> { - var flowerBlock = pair.getFirst().asItem(); - var output = pair.getSecond(); + return getSuspiciousVariants(result).map(pair -> { + var flowerBlock = pair.getFirst().asItem(); + var output = pair.getSecond(); + var type = BuiltInRegistries.ITEM.getKey(flowerBlock); + + Ingredient flower = Ingredient.of(flowerBlock); + NonNullList inputs = NonNullList.createWithCapacity(flowerCount + weedCount + 1); + for (int i = 0; i < flowerCount; i++) inputs.add(flower); + for (int i = 0; i < weedCount; i++) inputs.add(weed); + inputs.add(base); + + ResourceLocation id = group.withSuffix("/" + type.getNamespace() + "/" + type.getPath()); + return new ShapelessRecipe(id, group.toString(), CraftingBookCategory.MISC, output, inputs); + }); + } - Ingredient flower = Ingredient.of(flowerBlock); - NonNullList inputs = NonNullList.of(Ingredient.EMPTY, flower, flower, flower, weed, weed, weed, bowl); - ResourceLocation id = new ResourceLocation(NirvanaConstants.MOD_ID, group + flowerBlock.getDescriptionId()); - return new ShapelessRecipe(id, group, CraftingBookCategory.MISC, output, inputs); - }) - .toList(); + public static List createSuspiciousRecipes() { + return Stream.of( + createSuspiciousRecipes(Ingredient.of(Items.BOWL), NirvanaItems.HERBAL_SALVE, 3, 3), + createSuspiciousRecipes(Ingredient.of(NirvanaItems.EMPTY_PIPE), NirvanaItems.FILLED_PIPE, 6, 1) + ).flatMap(Function.identity()).toList(); } public static void register() { diff --git a/common/src/main/java/galena/nirvana/index/NirvanaTags.java b/common/src/main/java/galena/nirvana/index/NirvanaTags.java index cd8a859..cc7a3c0 100644 --- a/common/src/main/java/galena/nirvana/index/NirvanaTags.java +++ b/common/src/main/java/galena/nirvana/index/NirvanaTags.java @@ -20,4 +20,6 @@ public class NirvanaTags { public static final TagKey SHEARS = TagKey.create(Registries.ITEM, new ResourceLocation(NirvanaConstants.MOD_ID, "shears")); + public static final TagKey SMOKING_ITEM = TagKey.create(Registries.ITEM, new ResourceLocation(NirvanaConstants.MOD_ID, "smoking_item")); + } diff --git a/common/src/main/java/galena/nirvana/mixins/ItemInHandRendererMixin.java b/common/src/main/java/galena/nirvana/mixins/ItemInHandRendererMixin.java index b56a095..2e4f238 100644 --- a/common/src/main/java/galena/nirvana/mixins/ItemInHandRendererMixin.java +++ b/common/src/main/java/galena/nirvana/mixins/ItemInHandRendererMixin.java @@ -1,30 +1,26 @@ package galena.nirvana.mixins; -import com.mojang.blaze3d.vertex.PoseStack; -import galena.nirvana.world.item.SmokingItem; -import net.minecraft.client.player.AbstractClientPlayer; +import galena.nirvana.index.NirvanaTags; import net.minecraft.client.renderer.ItemInHandRenderer; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.world.InteractionHand; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.UseAnim; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(ItemInHandRenderer.class) public class ItemInHandRendererMixin { - @Inject( + @Redirect( method = "renderArmWithItem", - at = @At("HEAD"), - cancellable = true + at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;getUseAnimation()Lnet/minecraft/world/item/UseAnim;") ) - public void hideFirstPersonJoint(AbstractClientPlayer player, float f, float g, InteractionHand hand, float h, ItemStack stack, float i, PoseStack pose, MultiBufferSource multiBufferSource, int j, CallbackInfo ci) { - if(!(stack.getItem() instanceof SmokingItem)) return; - if(player.getUseItem() != stack) return; + public UseAnim hideFirstPersonJoint(ItemStack instance) { + var defaultAnimation = instance.getUseAnimation(); + if(!(instance.is(NirvanaTags.SMOKING_ITEM))) return defaultAnimation; + // if(player.getUseItem() != instance) return defaultAnimation; - ci.cancel(); + return UseAnim.BOW; } } diff --git a/common/src/main/java/galena/nirvana/world/item/HerbalSalveItem.java b/common/src/main/java/galena/nirvana/world/item/HerbalSalveItem.java index 5be7373..dbb789c 100644 --- a/common/src/main/java/galena/nirvana/world/item/HerbalSalveItem.java +++ b/common/src/main/java/galena/nirvana/world/item/HerbalSalveItem.java @@ -1,12 +1,8 @@ package galena.nirvana.world.item; -import com.google.common.collect.ImmutableList; import galena.nirvana.platform.Services; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; @@ -22,29 +18,8 @@ public HerbalSalveItem(Properties properties) { super(properties); } - public static List getEffects(ItemStack stack) { - var builder = ImmutableList.builder(); - - CompoundTag compoundTag = stack.getTag(); - - if (compoundTag != null && compoundTag.contains("Effects", 9)) { - ListTag listTag = compoundTag.getList("Effects", 10); - - for (int i = 0; i < listTag.size(); ++i) { - CompoundTag effectTag = listTag.getCompound(i); - int duration; - if (effectTag.contains("EffectDuration", 99)) { - duration = effectTag.getInt("EffectDuration"); - } else { - duration = Services.CONFIG.common().herbalSalveDuration(); - } - - MobEffect mobEffect = MobEffect.byId(effectTag.getInt("EffectId")); - if (mobEffect != null) builder.add(new MobEffectInstance(mobEffect, duration)); - } - } - - return builder.build(); + private static List getEffects(ItemStack stack) { + return SuspiciousItem.getEffects(stack, Services.CONFIG.common().herbalSalveDuration()); } @Override diff --git a/common/src/main/java/galena/nirvana/world/item/SuspiciousItem.java b/common/src/main/java/galena/nirvana/world/item/SuspiciousItem.java new file mode 100644 index 0000000..54dc57e --- /dev/null +++ b/common/src/main/java/galena/nirvana/world/item/SuspiciousItem.java @@ -0,0 +1,46 @@ +package galena.nirvana.world.item; + +import com.google.common.collect.ImmutableList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.item.ItemStack; + +import java.util.List; + +import static net.minecraft.world.item.SuspiciousStewItem.EFFECTS_TAG; +import static net.minecraft.world.item.SuspiciousStewItem.EFFECT_DURATION_TAG; +import static net.minecraft.world.item.SuspiciousStewItem.EFFECT_ID_TAG; + +public class SuspiciousItem { + + public static List getEffects(ItemStack stack, int defaultDuration) { + var builder = ImmutableList.builder(); + + CompoundTag compoundTag = stack.getTag(); + + if (compoundTag != null && compoundTag.contains(EFFECTS_TAG, 9)) { + ListTag listTag = compoundTag.getList(EFFECTS_TAG, 10); + + for (int i = 0; i < listTag.size(); ++i) { + CompoundTag effectTag = listTag.getCompound(i); + int duration; + if (effectTag.contains(EFFECT_DURATION_TAG, 99)) { + duration = effectTag.getInt(EFFECT_DURATION_TAG); + } else { + duration = defaultDuration; + } + + MobEffect mobEffect = MobEffect.byId(effectTag.getInt(EFFECT_ID_TAG)); + if (mobEffect != null) builder.add(new MobEffectInstance(mobEffect, duration)); + } + } + + return builder.build(); + } + + private SuspiciousItem() { + } + +} diff --git a/common/src/main/java/galena/nirvana/world/item/SuspiciousPipeItem.java b/common/src/main/java/galena/nirvana/world/item/SuspiciousPipeItem.java new file mode 100644 index 0000000..6efd977 --- /dev/null +++ b/common/src/main/java/galena/nirvana/world/item/SuspiciousPipeItem.java @@ -0,0 +1,54 @@ +package galena.nirvana.world.item; + +import galena.nirvana.index.NirvanaItems; +import galena.nirvana.platform.Services; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.SuspiciousStewItem; +import net.minecraft.world.item.UseAnim; +import net.minecraft.world.level.Level; + +import java.util.List; + +public class SuspiciousPipeItem extends SuspiciousStewItem { + + public SuspiciousPipeItem(Properties properties) { + super(properties); + } + + private static List getEffects(ItemStack stack) { + return SuspiciousItem.getEffects(stack, Services.CONFIG.common().suspiciousPipeDuration()); + } + + @Override + public UseAnim getUseAnimation(ItemStack stack) { + if (!getEffects(stack).isEmpty()) return UseAnim.SPYGLASS; + return super.getUseAnimation(stack); + } + + @Override + public InteractionResultHolder use(Level level, Player player, InteractionHand hand) { + var stack = player.getItemInHand(hand); + if (getEffects(stack).isEmpty()) return InteractionResultHolder.pass(stack); + player.startUsingItem(hand); + return InteractionResultHolder.consume(stack); + } + + @Override + public int getUseDuration(ItemStack itemStack) { + return 32; + } + + @Override + public ItemStack finishUsingItem(ItemStack stack, Level level, LivingEntity user) { + getEffects(stack).forEach(user::addEffect); + return user instanceof Player && ((Player) user).getAbilities().instabuild + ? stack + : new ItemStack(NirvanaItems.EMPTY_PIPE); + } + +} diff --git a/common/src/main/java/galena/nirvana/world/recipe/HerbalSalveRecipe.java b/common/src/main/java/galena/nirvana/world/recipe/HerbalSalveRecipe.java deleted file mode 100644 index 5df5827..0000000 --- a/common/src/main/java/galena/nirvana/world/recipe/HerbalSalveRecipe.java +++ /dev/null @@ -1,80 +0,0 @@ -package galena.nirvana.world.recipe; - -import galena.nirvana.index.NirvanaItems; -import galena.nirvana.index.NirvanaRecipeTypes; -import net.minecraft.core.RegistryAccess; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.tags.ItemTags; -import net.minecraft.world.inventory.CraftingContainer; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; -import net.minecraft.world.item.SuspiciousStewItem; -import net.minecraft.world.item.crafting.CraftingBookCategory; -import net.minecraft.world.item.crafting.CustomRecipe; -import net.minecraft.world.item.crafting.RecipeSerializer; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.SuspiciousEffectHolder; -import org.jetbrains.annotations.Nullable; - -public class HerbalSalveRecipe extends CustomRecipe { - - public HerbalSalveRecipe(ResourceLocation resourceLocation, CraftingBookCategory craftingBookCategory) { - super(resourceLocation, craftingBookCategory); - } - - @Override - public boolean matches(CraftingContainer container, Level level) { - @Nullable Item flowerType = null; - var flowerCount = 0; - var weedCount = 0; - var hasBowl = false; - - for (int i = 0; i < container.getContainerSize(); ++i) { - var stack = container.getItem(i); - - if (NirvanaItems.WEED.isIn(stack)) { - weedCount++; - } else if (stack.is(ItemTags.SMALL_FLOWERS)) { - if (flowerType == null) flowerType = stack.getItem(); - - if (stack.is(flowerType)) flowerCount++; - else return false; - } else if (stack.is(Items.BOWL) && !hasBowl) { - hasBowl = true; - } else if (!stack.isEmpty()) { - return false; - } - } - - return hasBowl && weedCount == 3 && flowerCount == 3; - } - - @Override - public ItemStack assemble(CraftingContainer container, RegistryAccess registryAccess) { - var result = NirvanaItems.HERBAL_SALVE.asStack(); - - for(int i = 0; i < container.getContainerSize(); ++i) { - ItemStack stack = container.getItem(i); - if (!stack.isEmpty()) { - SuspiciousEffectHolder suspiciousEffectHolder = SuspiciousEffectHolder.tryGet(stack.getItem()); - if (suspiciousEffectHolder != null) { - SuspiciousStewItem.saveMobEffect(result, suspiciousEffectHolder.getSuspiciousEffect(), suspiciousEffectHolder.getEffectDuration()); - break; - } - } - } - - return result; - } - - @Override - public boolean canCraftInDimensions(int i, int j) { - return i >= 3 && j >= 3; - } - - @Override - public RecipeSerializer getSerializer() { - return NirvanaRecipeTypes.HERBAL_SALVE_RECIPE_SERIALIZER.get(); - } -} diff --git a/common/src/main/java/galena/nirvana/world/recipe/SuspicousCraftingRecipe.java b/common/src/main/java/galena/nirvana/world/recipe/SuspicousCraftingRecipe.java new file mode 100644 index 0000000..ad3206a --- /dev/null +++ b/common/src/main/java/galena/nirvana/world/recipe/SuspicousCraftingRecipe.java @@ -0,0 +1,126 @@ +package galena.nirvana.world.recipe; + +import com.google.gson.JsonObject; +import galena.nirvana.index.NirvanaItems; +import galena.nirvana.index.NirvanaRecipeTypes; +import net.minecraft.core.RegistryAccess; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.ItemTags; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.SuspiciousStewItem; +import net.minecraft.world.item.crafting.CraftingBookCategory; +import net.minecraft.world.item.crafting.CustomRecipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.SuspiciousEffectHolder; +import org.jetbrains.annotations.Nullable; + +public class SuspicousCraftingRecipe extends CustomRecipe { + + private final Item result; + private final Item base; + private final int requiredFlowers; + private final int requiredWeed; + + public SuspicousCraftingRecipe(ResourceLocation id, CraftingBookCategory category, Item result, Item base, int requiredFlowers, int requiredWeed) { + super(id, category); + this.result = result; + this.base = base; + this.requiredFlowers = requiredFlowers; + this.requiredWeed = requiredWeed; + } + + @Override + public boolean matches(CraftingContainer container, Level level) { + @Nullable Item flowerType = null; + var flowerCount = 0; + var weedCount = 0; + var hasBase = false; + + for (int i = 0; i < container.getContainerSize(); ++i) { + var stack = container.getItem(i); + + if (NirvanaItems.WEED.isIn(stack)) { + weedCount++; + } else if (stack.is(ItemTags.SMALL_FLOWERS)) { + if (flowerType == null) flowerType = stack.getItem(); + + if (stack.is(flowerType)) flowerCount++; + else return false; + } else if (stack.is(base) && !hasBase) { + hasBase = true; + } else if (!stack.isEmpty()) { + return false; + } + } + + return hasBase && weedCount == requiredWeed && flowerCount == requiredFlowers; + } + + @Override + public ItemStack assemble(CraftingContainer container, RegistryAccess registryAccess) { + var result = new ItemStack(this.result); + + for(int i = 0; i < container.getContainerSize(); ++i) { + ItemStack stack = container.getItem(i); + if (!stack.isEmpty()) { + SuspiciousEffectHolder suspiciousEffectHolder = SuspiciousEffectHolder.tryGet(stack.getItem()); + if (suspiciousEffectHolder != null) { + SuspiciousStewItem.saveMobEffect(result, suspiciousEffectHolder.getSuspiciousEffect(), suspiciousEffectHolder.getEffectDuration()); + break; + } + } + } + + return result; + } + + @Override + public boolean canCraftInDimensions(int i, int j) { + return i >= 3 && j >= 3; + } + + @Override + public RecipeSerializer getSerializer() { + return NirvanaRecipeTypes.SUSPICIOUS_RECIPE_SERIALIZER.get(); + } + + public static class Serializer implements RecipeSerializer { + + @Override + public SuspicousCraftingRecipe fromJson(ResourceLocation id, JsonObject json) { + var category = CraftingBookCategory.CODEC.byName(GsonHelper.getAsString(json, "category", null), CraftingBookCategory.MISC); + var item = GsonHelper.getAsItem(json, "result"); + var base = GsonHelper.getAsItem(json, "base"); + var requiredFlowers = GsonHelper.getAsInt(json, "flowers", 1); + var requiredWeed = GsonHelper.getAsInt(json, "weed", 1); + return new SuspicousCraftingRecipe(id, category, item, base, requiredFlowers, requiredWeed); + } + + @Override + public SuspicousCraftingRecipe fromNetwork(ResourceLocation id, FriendlyByteBuf buffer) { + var category = buffer.readEnum(CraftingBookCategory.class); + var item = buffer.readById(BuiltInRegistries.ITEM); + var base = buffer.readById(BuiltInRegistries.ITEM); + var requiredFlowers = buffer.readInt(); + var requiredWeed = buffer.readInt(); + return new SuspicousCraftingRecipe(id, category, item, base, requiredFlowers, requiredWeed); + } + + @Override + public void toNetwork(FriendlyByteBuf buffer, SuspicousCraftingRecipe recipe) { + buffer.writeEnum(recipe.category()); + buffer.writeId(BuiltInRegistries.ITEM, recipe.result); + buffer.writeId(BuiltInRegistries.ITEM, recipe.base); + buffer.writeInt(recipe.requiredFlowers); + buffer.writeInt(recipe.requiredWeed); + } + + } + +} diff --git a/common/src/main/resources/data/nirvana/recipes/herbal_salve.json b/common/src/main/resources/data/nirvana/recipes/herbal_salve.json index 761a864..3e7a691 100644 --- a/common/src/main/resources/data/nirvana/recipes/herbal_salve.json +++ b/common/src/main/resources/data/nirvana/recipes/herbal_salve.json @@ -1,4 +1,8 @@ { - "type": "nirvana:herbal_salve_crafting", - "category": "misc" + "type": "nirvana:suspicious_crafting", + "category": "misc", + "result": "nirvana:herbal_salve", + "base": "minecraft:bowl", + "flowers": 3, + "weed": 3 } \ No newline at end of file diff --git a/common/src/main/resources/data/nirvana/recipes/suspicious_pipe.json b/common/src/main/resources/data/nirvana/recipes/suspicious_pipe.json new file mode 100644 index 0000000..592ec4d --- /dev/null +++ b/common/src/main/resources/data/nirvana/recipes/suspicious_pipe.json @@ -0,0 +1,8 @@ +{ + "type": "nirvana:suspicious_crafting", + "category": "misc", + "result": "nirvana:suspicious_pipe", + "base": "nirvana:old_pipe", + "flowers": 6, + "weed": 1 +} \ No newline at end of file diff --git a/fabric/src/main/java/galena/nirvana/fabric/compat/NirvanaJeiFabricPlugin.java b/fabric/src/main/java/galena/nirvana/fabric/compat/NirvanaJeiFabricPlugin.java index dceb65d..7e0b1c5 100644 --- a/fabric/src/main/java/galena/nirvana/fabric/compat/NirvanaJeiFabricPlugin.java +++ b/fabric/src/main/java/galena/nirvana/fabric/compat/NirvanaJeiFabricPlugin.java @@ -13,7 +13,7 @@ public class NirvanaJeiFabricPlugin implements IModPlugin { @Override public void registerRecipes(IRecipeRegistration registration) { - registration.addRecipes(RecipeTypes.CRAFTING, NirvanaRecipeTypes.createSalveRecipes()); + registration.addRecipes(RecipeTypes.CRAFTING, NirvanaRecipeTypes.createSuspiciousRecipes()); } @Override @@ -24,6 +24,8 @@ public ResourceLocation getPluginUid() { @Override public void registerItemSubtypes(ISubtypeRegistration registration) { registration.registerSubtypeInterpreter(NirvanaItems.POTION_BONG.get(), NirvanaJeiCompat::interpretPotion); + registration.registerSubtypeInterpreter(NirvanaItems.HERBAL_SALVE.get(), NirvanaJeiCompat::interpretSuspiciousItem); + registration.registerSubtypeInterpreter(NirvanaItems.FILLED_PIPE.get(), NirvanaJeiCompat::interpretSuspiciousItem); } } diff --git a/forge/src/main/java/galena/nirvana/forge/compat/NirvanaForgeJeiPlugin.java b/forge/src/main/java/galena/nirvana/forge/compat/NirvanaForgeJeiPlugin.java index 941bffe..760f14b 100644 --- a/forge/src/main/java/galena/nirvana/forge/compat/NirvanaForgeJeiPlugin.java +++ b/forge/src/main/java/galena/nirvana/forge/compat/NirvanaForgeJeiPlugin.java @@ -20,7 +20,7 @@ public void registerRecipes(IRecipeRegistration registration) { CreateCompat.addJeiRecipes(registration); } - registration.addRecipes(RecipeTypes.CRAFTING, NirvanaRecipeTypes.createSalveRecipes()); + registration.addRecipes(RecipeTypes.CRAFTING, NirvanaRecipeTypes.createSuspiciousRecipes()); } @Override @@ -31,6 +31,8 @@ public ResourceLocation getPluginUid() { @Override public void registerItemSubtypes(ISubtypeRegistration registration) { registration.registerSubtypeInterpreter(NirvanaItems.POTION_BONG.get(), NirvanaJeiCompat::interpretPotion); + registration.registerSubtypeInterpreter(NirvanaItems.HERBAL_SALVE.get(), NirvanaJeiCompat::interpretSuspiciousItem); + registration.registerSubtypeInterpreter(NirvanaItems.FILLED_PIPE.get(), NirvanaJeiCompat::interpretSuspiciousItem); } }