diff --git a/build.gradle b/build.gradle index 45201e9..1620c62 100644 --- a/build.gradle +++ b/build.gradle @@ -118,6 +118,10 @@ dependencies { implementation fg.deobf("curse.maven:farmers-delight-398521:5051242") // 1.2.4 implementation fg.deobf("curse.maven:miners-delight-plus-689630:5038950") // 1.2.3 + /* --- Compatibility (Botany Pots + addons) */ + implementation fg.deobf("curse.maven:bookshelf-228525:5423987") + implementation fg.deobf("curse.maven:botany-pots-353928:6348581") + /* --- Compatibility Test --- */ implementation fg.deobf("curse.maven:croptopia-415438:4997459") // 3.0.4 implementation fg.deobf("curse.maven:epherolib-885449:4889101") // 1.2.0 diff --git a/src/main/java/de/cadentem/quality_food/config/ServerConfig.java b/src/main/java/de/cadentem/quality_food/config/ServerConfig.java index 87f08a4..19c1183 100644 --- a/src/main/java/de/cadentem/quality_food/config/ServerConfig.java +++ b/src/main/java/de/cadentem/quality_food/config/ServerConfig.java @@ -5,6 +5,8 @@ import de.cadentem.quality_food.util.QualityUtils; import net.minecraft.core.RegistryAccess; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.common.ForgeConfigSpec; @@ -142,6 +144,12 @@ public static float getFarmlandMultiplier(final BlockState crop, final BlockStat return 1; } + public static float getFarmlandMultiplier(final ItemStack cropItem, final ItemStack farmlandItem) { + if(!(cropItem.getItem() instanceof BlockItem crop) || !(farmlandItem.getItem() instanceof BlockItem farmland)) return 1; + + return getFarmlandMultiplier(crop.getBlock().defaultBlockState(), farmland.getBlock().defaultBlockState()); + } + private static boolean validateRecipe(final Object object) { if (object instanceof String string) { return ResourceLocation.isValidResourceLocation(string); diff --git a/src/main/java/de/cadentem/quality_food/core/Modification.java b/src/main/java/de/cadentem/quality_food/core/Modification.java index 4a97ab9..0b8394b 100644 --- a/src/main/java/de/cadentem/quality_food/core/Modification.java +++ b/src/main/java/de/cadentem/quality_food/core/Modification.java @@ -54,6 +54,14 @@ public static Modification farmland(final BlockState crop, @Nullable final Block return Modification.multiplicative(ServerConfig.getFarmlandMultiplier(crop, farmland)); } + public static Modification farmland(final ItemStack crop, @Nullable final ItemStack farmland) { + if (farmland == null) { + return NONE; + } + + return Modification.multiplicative(ServerConfig.getFarmlandMultiplier(crop, farmland)); + } + public enum Type { ADDITIVE, MULTIPLICATIVE diff --git a/src/main/java/de/cadentem/quality_food/mixin/botanypots/BotanyPotHelperMixin.java b/src/main/java/de/cadentem/quality_food/mixin/botanypots/BotanyPotHelperMixin.java new file mode 100644 index 0000000..10485f8 --- /dev/null +++ b/src/main/java/de/cadentem/quality_food/mixin/botanypots/BotanyPotHelperMixin.java @@ -0,0 +1,28 @@ +package de.cadentem.quality_food.mixin.botanypots; + +import com.llamalad7.mixinextras.sugar.Local; +import de.cadentem.quality_food.util.QualityUtils; +import net.darkhax.botanypots.BotanyPotHelper; +import net.darkhax.botanypots.block.BlockEntityBotanyPot; +import net.minecraft.world.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; + +import java.util.List; + +@Mixin(value = BotanyPotHelper.class, remap = false) +public abstract class BotanyPotHelperMixin { + + @ModifyArg(method = "generateDrop", at = @At(value = "INVOKE", target = "Lnet/darkhax/botanypots/events/BotanyPotEventDispatcher;postCropDrops(Ljava/util/Random;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/darkhax/botanypots/block/BlockEntityBotanyPot;Lnet/darkhax/botanypots/data/recipes/crop/Crop;Ljava/util/List;)Ljava/util/List;")) + private static List quality_food$applyQuality(final List items, @Local(argsOnly = true) final BlockEntityBotanyPot pot) { + ItemStack crop = pot.getInventory().getCropStack(); + ItemStack soil = pot.getInventory().getSoilStack(); + + for (ItemStack item : items) { + QualityUtils.applyQuality(item, crop, soil); + } + + return items; + } +} diff --git a/src/main/java/de/cadentem/quality_food/util/QualityUtils.java b/src/main/java/de/cadentem/quality_food/util/QualityUtils.java index ebed668..09d369c 100644 --- a/src/main/java/de/cadentem/quality_food/util/QualityUtils.java +++ b/src/main/java/de/cadentem/quality_food/util/QualityUtils.java @@ -79,7 +79,9 @@ public static void applyQuality(final ItemStack stack, final Collection 0 && chance >= RANDOM.nextDouble()) { + selected = quality; + } + } + + QualityUtils.applyQuality(stack, selected); + } + + /** + * Generic if no further context is present + */ public static void applyQuality(final ItemStack stack, @Nullable final Player player) { Quality selected = Quality.NONE; @@ -137,12 +166,16 @@ public static void applyQuality(final ItemStack stack, @Nullable final Player pl QualityUtils.applyQuality(stack, selected); } - /** Applies the quality if its valid and the item has no existing quality */ + /** + * Applies the quality if its valid and the item has no existing quality + */ public static void applyQuality(final ItemStack stack, final Quality quality) { applyQuality(stack, quality, false); } - /** Applies the quality if its valid (if 'canUpgrade' is set to 'true' it can override the quality if its of a higher level */ + /** + * Applies the quality if its valid (if 'canUpgrade' is set to 'true' it can override the quality if its of a higher level + */ public static void applyQuality(final ItemStack stack, final Quality quality, boolean canUpgrade) { if (!isValidQuality(quality) || !Utils.isValidItem(stack)) { return; @@ -242,7 +275,9 @@ private static Pair, int[]> getContainerData(final Contai return Pair.of(items, qualities); } - /** Get the most fitting quality (if all items are diamond -> diamond / if 3 are diamond and 6 are gold -> gold) */ + /** + * Get the most fitting quality (if all items are diamond -> diamond / if 3 are diamond and 6 are gold -> gold) + */ private static Quality getQuality(final int[] qualities, int itemCount) { if (itemCount == 0) { return Quality.NONE; diff --git a/src/main/resources/quality_food.mixins.json b/src/main/resources/quality_food.mixins.json index d7e067b..ce5643d 100644 --- a/src/main/resources/quality_food.mixins.json +++ b/src/main/resources/quality_food.mixins.json @@ -1,82 +1,83 @@ { - "required": true, - "minVersion": "0.8", - "package": "de.cadentem.quality_food.mixin", - "compatibilityLevel": "JAVA_17", - "refmap": "quality_food.refmap.json", - "plugin": "de.cadentem.quality_food.mixin.ApplyMixinPlugin", - "mixins": [ - "AbstractFurnaceBlockEntityMixin", - "AbstractFurnaceMenuMixin", - "BlockItemMixin", - "BlockMixin", - "CakeBlockMixin", - "CraftingMenuMixin", - "EntityMixin", - "FurnaceResultSlotMixin", - "InventoryMenuMixin", - "ItemMixin", - "LevelMixin", - "ResultSlotMixin", - "SidedInvWrapperMixin", - "StemBlockMixin", - "SugarCaneBlockMixin", - "SweetBerryBushBlockMixin", - "ThrownEggMixin", - "collectorsreap.EffectCakeBlockMixin", - "collectorsreap.EffectCandleCakeBlockMixin", - "collectorsreap.FruitBushBlockMixin", - "create.BasinRecipeMixin", - "create.CrushingWheelControllerBlockEntityMixin", - "create.FanProcessingMixin", - "create.HarvesterMovementBehaviourMixin", - "create.MillstoneBlockEntityMixin", - "create.RecipeApplierMixin", - "create.SawBlockEntityMixin", - "farm_and_charm.EffectFoodBlockMixin", - "farm_and_charm.FoodBlockMixin", - "farm_and_charm.StrawberryCropBlockMixin", - "farm_and_charm.TomatoCropBlockMixin", - "farm_and_charm.TomatoCropHeadBlockMixin", - "farmersdelight.CookingPotBlockEntityMixin", - "farmersdelight.CookingPotMenuMixin", - "farmersdelight.CookingPotResultSlotMixin", - "farmersdelight.CuttingBoardBlockEntityMixin", - "farmersdelight.FeastBlockMixin", - "farmersdelight.RiceBlockMixin", - "farmersdelight.TextUtilsMixin", - "farmersdelight.TomatoVineBlockMixin", - "farmersdelight.WildCropBlockMixin", - "fastbench.CraftResultSlotExtMixin", - "fastbench.FastBenchUtilMixin", - "fastbench.ResultSlotAccess", - "fastentitytransfer.CommonUtilsMixin", - "fruitfulfun.FeastBlockMixin", - "fruitfulfun.FoodBlockMixin", - "fruitfulfun.FruitLeavesBlockMixin", - "jade.BlockAccessorImplMixin", - "majruszsenchantments.TelekinesisEnchantmentMixin", - "miners_delight.CopperPotBlockEntityMixin", - "miners_delight.CopperPotMenuMixin", - "miners_delight.CopperPotResultSlotMixin", - "quark.SimpleHarvestModuleMixin", - "rightclickharvest.RightClickHarvestModInitMixin", - "smarterfarmers.SFHarvestFarmlandMixin", - "sophisticatedcore.CompactedItemAccess", - "sophisticatedcore.CraftingUpgradeContainerAccess", - "sophisticatedcore.CraftingUpgradeContainerMixin", - "sophisticatedcore.RecipeHelperMixin", - "sophisticatedcore.StorageContainerMenuBaseMixin", - "toms_storage.CraftingTerminalBlockEntityMixin", - "toms_storage.CraftingTerminalMenuMixin", - "vinery.GrapeBushMixin", - "vinery.GrapeVineBlockMixin" - ], - "client": [ - "client.GuiGraphicsMixin", - "jade.BlockAccessorClientHandlerMixin" - ], - "injectors": { - "defaultRequire": 1 + "required": true, + "minVersion": "0.8", + "package": "de.cadentem.quality_food.mixin", + "compatibilityLevel": "JAVA_17", + "refmap": "quality_food.refmap.json", + "plugin": "de.cadentem.quality_food.mixin.ApplyMixinPlugin", + "mixins": [ + "AbstractFurnaceBlockEntityMixin", + "AbstractFurnaceMenuMixin", + "BlockItemMixin", + "BlockMixin", + "CakeBlockMixin", + "CraftingMenuMixin", + "EntityMixin", + "FurnaceResultSlotMixin", + "InventoryMenuMixin", + "ItemMixin", + "LevelMixin", + "ResultSlotMixin", + "SidedInvWrapperMixin", + "StemBlockMixin", + "SugarCaneBlockMixin", + "SweetBerryBushBlockMixin", + "ThrownEggMixin", + "botanypots.BotanyPotHelperMixin", + "collectorsreap.EffectCakeBlockMixin", + "collectorsreap.EffectCandleCakeBlockMixin", + "collectorsreap.FruitBushBlockMixin", + "create.BasinRecipeMixin", + "create.CrushingWheelControllerBlockEntityMixin", + "create.FanProcessingMixin", + "create.HarvesterMovementBehaviourMixin", + "create.MillstoneBlockEntityMixin", + "create.RecipeApplierMixin", + "create.SawBlockEntityMixin", + "farm_and_charm.EffectFoodBlockMixin", + "farm_and_charm.FoodBlockMixin", + "farm_and_charm.StrawberryCropBlockMixin", + "farm_and_charm.TomatoCropBlockMixin", + "farm_and_charm.TomatoCropHeadBlockMixin", + "farmersdelight.CookingPotBlockEntityMixin", + "farmersdelight.CookingPotMenuMixin", + "farmersdelight.CookingPotResultSlotMixin", + "farmersdelight.CuttingBoardBlockEntityMixin", + "farmersdelight.FeastBlockMixin", + "farmersdelight.RiceBlockMixin", + "farmersdelight.TextUtilsMixin", + "farmersdelight.TomatoVineBlockMixin", + "farmersdelight.WildCropBlockMixin", + "fastbench.CraftResultSlotExtMixin", + "fastbench.FastBenchUtilMixin", + "fastbench.ResultSlotAccess", + "fastentitytransfer.CommonUtilsMixin", + "fruitfulfun.FeastBlockMixin", + "fruitfulfun.FoodBlockMixin", + "fruitfulfun.FruitLeavesBlockMixin", + "jade.BlockAccessorImplMixin", + "majruszsenchantments.TelekinesisEnchantmentMixin", + "miners_delight.CopperPotBlockEntityMixin", + "miners_delight.CopperPotMenuMixin", + "miners_delight.CopperPotResultSlotMixin", + "quark.SimpleHarvestModuleMixin", + "rightclickharvest.RightClickHarvestModInitMixin", + "smarterfarmers.SFHarvestFarmlandMixin", + "sophisticatedcore.CompactedItemAccess", + "sophisticatedcore.CraftingUpgradeContainerAccess", + "sophisticatedcore.CraftingUpgradeContainerMixin", + "sophisticatedcore.RecipeHelperMixin", + "sophisticatedcore.StorageContainerMenuBaseMixin", + "toms_storage.CraftingTerminalBlockEntityMixin", + "toms_storage.CraftingTerminalMenuMixin", + "vinery.GrapeBushMixin", + "vinery.GrapeVineBlockMixin" + ], + "client": [ + "client.GuiGraphicsMixin", + "jade.BlockAccessorClientHandlerMixin" + ], + "injectors": { + "defaultRequire": 1 } }