Skip to content

Commit

Permalink
Fix gourd growth onto TerraformFarmlandBlock. Resolves #22
Browse files Browse the repository at this point in the history
- Allow gourds to grow onto our Farmland blocks
- Refactor Farmland mixins a bit more to be consistent
  • Loading branch information
gniftygnome committed Oct 12, 2023
1 parent 5069ce0 commit a7d4e81
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 53 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,11 @@ public class MixinCropBlock {
at = @At(value = "INVOKE", target = "Lnet/minecraft/block/BlockState;isOf(Lnet/minecraft/block/Block;)Z")
)
@SuppressWarnings("unused")
private static boolean terraformDirt$isOfFarmlandTag(BlockState instance, Block block, Operation<Boolean> original) {
return original.call(instance, block) || (block == Blocks.FARMLAND && instance.isIn(TerraformDirtBlockTags.FARMLAND));
private static boolean terraformDirt$isOnFarmland(BlockState instance, Block block, Operation<Boolean> original) {
if (Blocks.FARMLAND.equals(block) && instance.isIn(TerraformDirtBlockTags.FARMLAND)) {
return true;
}

return original.call(instance, block);
}
}
Original file line number Diff line number Diff line change
@@ -1,23 +1,19 @@
package com.terraformersmc.terraform.dirt.mixin;

import com.terraformersmc.terraform.dirt.TerraformDirtBlockTags;
import net.minecraft.block.*;
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 net.minecraft.block.AttachedStemBlock;
import net.minecraft.block.BlockState;
import net.minecraft.block.CropBlock;
import net.minecraft.block.FarmlandBlock;
import net.minecraft.block.StemBlock;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.BlockView;

@Mixin({AttachedStemBlock.class, CropBlock.class, StemBlock.class})
@Mixin({AttachedStemBlock.class, CropBlock.class, PitcherCropBlock.class, StemBlock.class})
public class MixinPlantingOnFarmland {
@Inject(method = "canPlantOnTop", at = @At("HEAD"), cancellable = true)
private void terraformDirt$onCanPlantOnTop(BlockState floor, BlockView view, BlockPos pos, CallbackInfoReturnable<Boolean> cir) {
private void terraformDirt$isOnFarmland(BlockState floor, BlockView view, BlockPos pos, CallbackInfoReturnable<Boolean> cir) {
if (floor.getBlock() instanceof FarmlandBlock && floor.isIn(TerraformDirtBlockTags.FARMLAND)) {
cir.setReturnValue(true);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,43 +1,24 @@
package com.terraformersmc.terraform.dirt.mixin;

import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import com.terraformersmc.terraform.dirt.TerraformDirtBlockTags;
import net.minecraft.block.*;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;

import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.CarrotsBlock;
import net.minecraft.block.FarmlandBlock;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.WorldView;

@Mixin(targets = "net.minecraft.entity.passive.RabbitEntity$EatCarrotCropGoal")
public class MixinRabbitEntity {
@Shadow
private boolean wantsCarrots;

@Shadow
private boolean hasTarget;

@Inject(method = "isTargetPos",
at = @At(value = "FIELD", target = "Lnet/minecraft/block/Blocks;FARMLAND:Lnet/minecraft/block/Block;"),
cancellable = true,
locals = LocalCapture.CAPTURE_FAILHARD
@WrapOperation(
method = "isTargetPos",
at = @At(value = "INVOKE", target = "Lnet/minecraft/block/BlockState;isOf(Lnet/minecraft/block/Block;)Z")
)
private void terraformDirt$onIsTargetBlock(WorldView world, BlockPos pos, CallbackInfoReturnable<Boolean> cir, BlockState state) {
Block block = state.getBlock();
if (block instanceof FarmlandBlock && state.isIn(TerraformDirtBlockTags.FARMLAND) && this.wantsCarrots && !this.hasTarget) {
state = world.getBlockState(pos.up());
block = state.getBlock();

if (block instanceof CarrotsBlock && ((CarrotsBlock) block).isMature(state)) {
this.hasTarget = true;
cir.setReturnValue(true);
}
@SuppressWarnings("unused")
private boolean terraformDirt$isOnFarmland(BlockState instance, Block block, Operation<Boolean> operation) {
if (Blocks.FARMLAND.equals(block) && instance.isIn(TerraformDirtBlockTags.FARMLAND)) {
return true;
}

return operation.call(instance, block);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.terraformersmc.terraform.dirt.mixin;

import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import com.terraformersmc.terraform.dirt.TerraformDirtBlockTags;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.StemBlock;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;

@Mixin(StemBlock.class)
public class MixinStemBlock {
@WrapOperation(
method = "randomTick",
at = @At(value = "INVOKE", target = "Lnet/minecraft/block/BlockState;isOf(Lnet/minecraft/block/Block;)Z")
)
@SuppressWarnings("unused")
private boolean terraformDirt$isOnFarmland(BlockState instance, Block block, Operation<Boolean> operation) {
if (Blocks.FARMLAND.equals(block) && instance.isIn(TerraformDirtBlockTags.FARMLAND)) {
return true;
}

return operation.call(instance, block);
}
}
27 changes: 14 additions & 13 deletions terraform-dirt-api-v1/src/main/resources/mixins.terraform-dirt.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,21 @@
"package": "com.terraformersmc.terraform.dirt.mixin",
"compatibilityLevel": "JAVA_17",
"mixins": [
"MixinAlterGroundTreeDecorator",
"MixinAnimalEntity",
"MixinCropBlock",
"MixinEatGrassGoal",
"MixinFarmlandBlock",
"MixinFeature",
"MixinPlantBlock",
"MixinPlantingOnFarmland",
"MixinRabbitEntity",
"MixinSpreadableBlock",
"MixinSugarCaneBlock",
"MixinTrunkPlacer"
"MixinAlterGroundTreeDecorator",
"MixinAnimalEntity",
"MixinCropBlock",
"MixinEatGrassGoal",
"MixinFarmlandBlock",
"MixinFeature",
"MixinPlantBlock",
"MixinPlantingOnFarmland",
"MixinRabbitEntity",
"MixinSpreadableBlock",
"MixinStemBlock",
"MixinSugarCaneBlock",
"MixinTrunkPlacer"
],
"injectors": {
"defaultRequire": 1
"defaultRequire": 1
}
}

0 comments on commit a7d4e81

Please sign in to comment.