From d63b527c0fe9700663b0ded9e2aa9b6144339fd8 Mon Sep 17 00:00:00 2001 From: Flemmli97 Date: Thu, 12 May 2022 20:34:24 +0200 Subject: [PATCH] also add grassblock and nylium bonemeal check --- Changelog.md | 2 +- .../api/permission/ObjectToPermissionMap.java | 4 +- .../flemmli97/flan/event/PlayerEvents.java | 45 +++++++++++++++---- .../flan/mixin/MossBlockCheckMixin.java | 2 +- 4 files changed, 40 insertions(+), 13 deletions(-) diff --git a/Changelog.md b/Changelog.md index 3e9db69..5a2f4fa 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,6 +1,6 @@ Flan 1.7.7 ================ -- Prevent moss bonemealing if too close to a claim without permission +- Prevent moss/grassblock/nylium bonemealing if too close to a claim without permission Flan 1.7.6 ================ diff --git a/common/src/main/java/io/github/flemmli97/flan/api/permission/ObjectToPermissionMap.java b/common/src/main/java/io/github/flemmli97/flan/api/permission/ObjectToPermissionMap.java index ed82c4e..4afc825 100644 --- a/common/src/main/java/io/github/flemmli97/flan/api/permission/ObjectToPermissionMap.java +++ b/common/src/main/java/io/github/flemmli97/flan/api/permission/ObjectToPermissionMap.java @@ -7,6 +7,7 @@ import net.minecraft.core.HolderSet; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; +import net.minecraft.world.item.BoneMealItem; import net.minecraft.world.item.BucketItem; import net.minecraft.world.item.EnderpearlItem; import net.minecraft.world.item.Item; @@ -29,7 +30,6 @@ import net.minecraft.world.level.block.FarmBlock; import net.minecraft.world.level.block.FenceGateBlock; import net.minecraft.world.level.block.JukeboxBlock; import net.minecraft.world.level.block.LeverBlock; -import net.minecraft.world.level.block.MossBlock; import net.minecraft.world.level.block.NetherPortalBlock; import net.minecraft.world.level.block.NoteBlock; import net.minecraft.world.level.block.RedStoneWireBlock; @@ -155,12 +155,12 @@ public class ObjectToPermissionMap { || block instanceof TntBlock || block instanceof ChorusFlowerBlock, () -> PermissionRegistry.PROJECTILES); registerBlockPredicateMap(block -> block instanceof EnderChestBlock, () -> PermissionRegistry.ENDERCHEST); registerBlockPredicateMap(block -> block instanceof EnchantmentTableBlock, () -> PermissionRegistry.ENCHANTMENTTABLE); - registerBlockPredicateMap(block -> block instanceof MossBlock, () -> PermissionRegistry.PLACE); registerItemPredicateMap(item -> item instanceof EnderpearlItem, () -> PermissionRegistry.ENDERPEARL); registerItemPredicateMap(item -> item instanceof BucketItem, () -> PermissionRegistry.BUCKET); registerItemPredicateMap(item -> item == Items.END_CRYSTAL, () -> PermissionRegistry.ENDCRYSTALPLACE); registerItemPredicateMap(item -> item == Items.CHORUS_FRUIT, () -> PermissionRegistry.CHORUSFRUIT); registerItemPredicateMap(item -> item == Items.LILY_PAD, () -> PermissionRegistry.PLACE); + registerItemPredicateMap(item -> item instanceof BoneMealItem, () -> PermissionRegistry.PLACE); } } diff --git a/common/src/main/java/io/github/flemmli97/flan/event/PlayerEvents.java b/common/src/main/java/io/github/flemmli97/flan/event/PlayerEvents.java index 8ea66cb..4dc1ae0 100644 --- a/common/src/main/java/io/github/flemmli97/flan/event/PlayerEvents.java +++ b/common/src/main/java/io/github/flemmli97/flan/event/PlayerEvents.java @@ -10,11 +10,17 @@ import io.github.flemmli97.flan.player.PlayerClaimData; import net.minecraft.ChatFormatting; import net.minecraft.core.BlockPos; import net.minecraft.data.worldgen.features.CaveFeatures; +import net.minecraft.data.worldgen.features.NetherFeatures; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.GrassBlock; import net.minecraft.world.level.block.MossBlock; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.configurations.NetherForestVegetationConfig; +import net.minecraft.world.level.levelgen.feature.configurations.TwistingVinesConfig; +import net.minecraft.world.level.levelgen.feature.configurations.VegetationPatchConfiguration; public class PlayerEvents { @@ -33,18 +39,39 @@ public class PlayerEvents { LogoutTracker.getInstance(player.getServer()).track(player.getUUID()); } - public static boolean mossBonemeal(UseOnContext context) { + public static boolean growBonemeal(UseOnContext context) { if (context.getPlayer() instanceof ServerPlayer serverPlayer) { BlockState state = serverPlayer.level.getBlockState(context.getClickedPos()); + BlockPos.MutableBlockPos pos = context.getClickedPos().mutable(); + ClaimPermission perm = ObjectToPermissionMap.getFromItem(context.getItemInHand().getItem()); + /** + * Like {@link ItemInteractEvents#onItemUseBlock}. + * Sadly need to check again. In case its used in a claim. Less expensive than aoe check + */ + if (ClaimStorage.get(serverPlayer.getLevel()).getForPermissionCheck(pos).canInteract(serverPlayer, perm, pos, false)) + return false; + int range = 0; if (state.getBlock() instanceof MossBlock) { - BlockPos.MutableBlockPos mutable = context.getClickedPos().mutable(); - int range = CaveFeatures.MOSS_PATCH_BONEMEAL.value().config() - .xzRadius.getMaxValue() + 1; - ClaimPermission perm = ObjectToPermissionMap.getFromBlock(state.getBlock()); - if (perm != null && !ClaimStorage.get(serverPlayer.getLevel()).canInteract(mutable, range, serverPlayer, perm, false)) { - serverPlayer.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.langManager.get("tooCloseClaim"), ChatFormatting.DARK_RED), true); - return true; - } + VegetationPatchConfiguration cfg = CaveFeatures.MOSS_PATCH_BONEMEAL.value().config(); + range = cfg.xzRadius.getMaxValue() + 1; + pos.set(pos.getX(), pos.getY() + cfg.verticalRange + 1, pos.getZ()); + } else if (state.getBlock() instanceof GrassBlock) { + range = 4; + } else if (state.is(Blocks.CRIMSON_NYLIUM)) { + NetherForestVegetationConfig cfg = NetherFeatures.CRIMSON_FOREST_VEGETATION_BONEMEAL.value().config(); + range = cfg.spreadWidth; + pos.set(pos.getX(), pos.getY() + cfg.spreadHeight + 1, pos.getZ()); + } else if (state.is(Blocks.WARPED_NYLIUM)) { + NetherForestVegetationConfig cfg = NetherFeatures.WARPED_FOREST_VEGETATION_BONEMEAL.value().config(); + NetherForestVegetationConfig cfg2 = NetherFeatures.NETHER_SPROUTS_BONEMEAL.value().config(); + TwistingVinesConfig cfg3 = NetherFeatures.TWISTING_VINES_BONEMEAL.value().config(); + range = Math.max(Math.max(cfg.spreadWidth, cfg2.spreadWidth), cfg3.spreadWidth()); + int y = Math.max(Math.max(cfg.spreadHeight, cfg2.spreadHeight), cfg3.spreadHeight()); + pos.set(pos.getX(), pos.getY() + y + 1, pos.getZ()); + } + if (range > 0 && perm != null && !ClaimStorage.get(serverPlayer.getLevel()).canInteract(pos, range, serverPlayer, perm, false)) { + serverPlayer.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.langManager.get("tooCloseClaim"), ChatFormatting.DARK_RED), true); + return true; } } return false; diff --git a/common/src/main/java/io/github/flemmli97/flan/mixin/MossBlockCheckMixin.java b/common/src/main/java/io/github/flemmli97/flan/mixin/MossBlockCheckMixin.java index 11c2ad5..cfa68f5 100644 --- a/common/src/main/java/io/github/flemmli97/flan/mixin/MossBlockCheckMixin.java +++ b/common/src/main/java/io/github/flemmli97/flan/mixin/MossBlockCheckMixin.java @@ -14,7 +14,7 @@ public class MossBlockCheckMixin { @Inject(method = "useOn", at = @At("HEAD"), cancellable = true) private void check(UseOnContext context, CallbackInfoReturnable info) { - if (PlayerEvents.mossBonemeal(context)) { + if (PlayerEvents.growBonemeal(context)) { info.setReturnValue(InteractionResult.PASS); info.cancel(); }