diff --git a/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java b/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java index b352bc3f..e91bceab 100644 --- a/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java +++ b/src/main/java/ru/betterend/mixin/common/BoneMealItemMixin.java @@ -1,7 +1,5 @@ package ru.betterend.mixin.common; -import java.util.Random; - import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -9,7 +7,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; -import net.minecraft.core.Direction; +import net.minecraft.core.Vec3i; import net.minecraft.world.InteractionResult; import net.minecraft.world.item.BoneMealItem; import net.minecraft.world.item.context.UseOnContext; @@ -23,12 +21,13 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndTags; import ru.betterend.util.BlocksHelper; import ru.betterend.util.BonemealUtil; +import ru.betterend.util.MHelper; import ru.betterend.world.biome.EndBiome; @Mixin(BoneMealItem.class) public class BoneMealItemMixin { - private static final Direction[] DIR = BlocksHelper.makeHorizontal(); private static final MutableBlockPos POS = new MutableBlockPos(); + private static final Vec3i[] DIR; @Inject(method = "useOn", at = @At("HEAD"), cancellable = true) private void be_onUse(UseOnContext context, CallbackInfoReturnable info) { @@ -149,22 +148,29 @@ public class BoneMealItemMixin { return null; } - private void be_shuffle(Random random) { - for (int i = 0; i < 4; i++) { - int j = random.nextInt(4); - Direction d = DIR[i]; - DIR[i] = DIR[j]; - DIR[j] = d; - } - } - private BlockState be_getNylium(Level world, BlockPos pos) { - be_shuffle(world.random); - for (Direction dir : DIR) { - BlockState state = world.getBlockState(pos.relative(dir)); - if (BlocksHelper.isEndNylium(state)) + MHelper.shuffle(DIR, world.getRandom()); + for (Vec3i dir : DIR) { + BlockPos p = pos.offset(dir); + BlockState state = world.getBlockState(p); + if (BlocksHelper.isEndNylium(state) && !world.getBlockState(p.above()).is(EndTags.END_GROUND)) { return state; + } } return null; } + + static { + int index = 0; + DIR = new Vec3i[3 * 3 * 3 - 1]; + for (int x = -1; x <= 1; x++) { + for (int y = -1; y <= 1; y++) { + for (int z = -1; z <= 1; z++) { + if (x != 0 || y != 0 || z != 0) { + DIR[index++] = new Vec3i(x, y, z); + } + } + } + } + } } \ No newline at end of file