package wtf.hak.survivalfabric.mixin; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.CropBlock; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.HoeItem; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.server.world.ServerWorld; import net.minecraft.stat.Stats; import net.minecraft.util.Hand; import net.minecraft.util.math.BlockPos; import net.minecraft.world.GameMode; import net.minecraft.world.World; 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.CallbackInfoReturnable; import wtf.hak.survivalfabric.config.ConfigManager; import java.util.List; @Mixin(Block.class) public abstract class BlockMixin { @Inject(method = "onBreak", at = @At("HEAD"), cancellable = true) public void onBreak(World world, BlockPos pos, BlockState state, PlayerEntity player, CallbackInfoReturnable cir) { if (world.isClient()) return; if (state.getBlock() instanceof CropBlock && ConfigManager.getConfig().replenishEnabled) { ItemStack mainHand = player.getStackInHand(Hand.MAIN_HAND); if (mainHand.getItem() instanceof HoeItem) { Item seedItem = state.getBlock().asItem(); Block seedBlock = state.getBlock(); List drops = Block.getDroppedStacks(state, (ServerWorld) world, pos, null, player, mainHand); if (removeIfAvailable(drops, seedItem)) { if (player.getGameMode() != GameMode.CREATIVE) { for (ItemStack drop : drops) { Block.dropStack(world, pos, drop); } } world.getServer().executeSync(() -> world.setBlockState(pos, seedBlock.getDefaultState())); player.incrementStat(Stats.USED.getOrCreateStat(seedItem)); cir.cancel(); } } } } private boolean removeIfAvailable(List drops, Item item) { for (ItemStack drop : drops) { if (drop.getItem() == item) { drop.decrement(1); return true; } } return false; } }