Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down
8 changes: 8 additions & 0 deletions src/main/java/de/cadentem/quality_food/core/Modification.java
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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<ItemStack> quality_food$applyQuality(final List<ItemStack> 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;
}
}
45 changes: 40 additions & 5 deletions src/main/java/de/cadentem/quality_food/util/QualityUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,9 @@ public static void applyQuality(final ItemStack stack, final Collection<ItemStac
QualityUtils.applyQuality(stack, selected);
}

/** Used for block drops */
/**
* Used for block drops
*/
public static void applyQuality(final ItemStack stack, final BlockState state, final Quality blockQuality, @Nullable final Player player, @Nullable final BlockState farmland) {
if (isRelevantCrop(state)) {
Quality selected = Quality.NONE;
Expand Down Expand Up @@ -117,7 +119,34 @@ public static void applyQuality(final ItemStack stack, final BlockState state, f
}
}

/** Generic if no further context is present */
/**
* Used when both the seed and the farmland are items (E.G. Botany Pots)
*/
public static void applyQuality(final ItemStack stack, final ItemStack seed, final ItemStack soil) {
Quality selected = Quality.NONE;

for (Quality quality : Quality.values()) {
if (quality.level() == 0) {
continue;
}

Quality cropQuality = QualityUtils.getQuality(seed);
double chance = QualityConfig.calculateChance(quality, QualityConfig.getWeight(cropQuality));

chance = Modification.harvestOrSeedMultiplier(quality, stack).apply(chance);
chance = Modification.farmland(seed, soil).apply(chance);

if (chance > 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;

Expand All @@ -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;
Expand Down Expand Up @@ -242,7 +275,9 @@ private static Pair<HashMap<Item, Integer>, 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;
Expand Down
159 changes: 80 additions & 79 deletions src/main/resources/quality_food.mixins.json
Original file line number Diff line number Diff line change
@@ -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
}
}