also add grassblock and nylium bonemeal check

This commit is contained in:
Flemmli97 2022-05-12 20:34:24 +02:00
parent fb3ec0a233
commit d63b527c0f
4 changed files with 40 additions and 13 deletions

View File

@ -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
================

View File

@ -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);
}
}

View File

@ -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;

View File

@ -14,7 +14,7 @@ public class MossBlockCheckMixin {
@Inject(method = "useOn", at = @At("HEAD"), cancellable = true)
private void check(UseOnContext context, CallbackInfoReturnable<InteractionResult> info) {
if (PlayerEvents.mossBonemeal(context)) {
if (PlayerEvents.growBonemeal(context)) {
info.setReturnValue(InteractionResult.PASS);
info.cancel();
}