also add grassblock and nylium bonemeal check
This commit is contained in:
parent
fb3ec0a233
commit
d63b527c0f
@ -1,6 +1,6 @@
|
|||||||
Flan 1.7.7
|
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
|
Flan 1.7.6
|
||||||
================
|
================
|
||||||
|
@ -7,6 +7,7 @@ import net.minecraft.core.HolderSet;
|
|||||||
import net.minecraft.core.Registry;
|
import net.minecraft.core.Registry;
|
||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
import net.minecraft.server.MinecraftServer;
|
import net.minecraft.server.MinecraftServer;
|
||||||
|
import net.minecraft.world.item.BoneMealItem;
|
||||||
import net.minecraft.world.item.BucketItem;
|
import net.minecraft.world.item.BucketItem;
|
||||||
import net.minecraft.world.item.EnderpearlItem;
|
import net.minecraft.world.item.EnderpearlItem;
|
||||||
import net.minecraft.world.item.Item;
|
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.FenceGateBlock;
|
||||||
import net.minecraft.world.level.block.JukeboxBlock;
|
import net.minecraft.world.level.block.JukeboxBlock;
|
||||||
import net.minecraft.world.level.block.LeverBlock;
|
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.NetherPortalBlock;
|
||||||
import net.minecraft.world.level.block.NoteBlock;
|
import net.minecraft.world.level.block.NoteBlock;
|
||||||
import net.minecraft.world.level.block.RedStoneWireBlock;
|
import net.minecraft.world.level.block.RedStoneWireBlock;
|
||||||
@ -155,12 +155,12 @@ public class ObjectToPermissionMap {
|
|||||||
|| block instanceof TntBlock || block instanceof ChorusFlowerBlock, () -> PermissionRegistry.PROJECTILES);
|
|| block instanceof TntBlock || block instanceof ChorusFlowerBlock, () -> PermissionRegistry.PROJECTILES);
|
||||||
registerBlockPredicateMap(block -> block instanceof EnderChestBlock, () -> PermissionRegistry.ENDERCHEST);
|
registerBlockPredicateMap(block -> block instanceof EnderChestBlock, () -> PermissionRegistry.ENDERCHEST);
|
||||||
registerBlockPredicateMap(block -> block instanceof EnchantmentTableBlock, () -> PermissionRegistry.ENCHANTMENTTABLE);
|
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 EnderpearlItem, () -> PermissionRegistry.ENDERPEARL);
|
||||||
registerItemPredicateMap(item -> item instanceof BucketItem, () -> PermissionRegistry.BUCKET);
|
registerItemPredicateMap(item -> item instanceof BucketItem, () -> PermissionRegistry.BUCKET);
|
||||||
registerItemPredicateMap(item -> item == Items.END_CRYSTAL, () -> PermissionRegistry.ENDCRYSTALPLACE);
|
registerItemPredicateMap(item -> item == Items.END_CRYSTAL, () -> PermissionRegistry.ENDCRYSTALPLACE);
|
||||||
registerItemPredicateMap(item -> item == Items.CHORUS_FRUIT, () -> PermissionRegistry.CHORUSFRUIT);
|
registerItemPredicateMap(item -> item == Items.CHORUS_FRUIT, () -> PermissionRegistry.CHORUSFRUIT);
|
||||||
registerItemPredicateMap(item -> item == Items.LILY_PAD, () -> PermissionRegistry.PLACE);
|
registerItemPredicateMap(item -> item == Items.LILY_PAD, () -> PermissionRegistry.PLACE);
|
||||||
|
registerItemPredicateMap(item -> item instanceof BoneMealItem, () -> PermissionRegistry.PLACE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,11 +10,17 @@ import io.github.flemmli97.flan.player.PlayerClaimData;
|
|||||||
import net.minecraft.ChatFormatting;
|
import net.minecraft.ChatFormatting;
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.data.worldgen.features.CaveFeatures;
|
import net.minecraft.data.worldgen.features.CaveFeatures;
|
||||||
|
import net.minecraft.data.worldgen.features.NetherFeatures;
|
||||||
import net.minecraft.server.level.ServerPlayer;
|
import net.minecraft.server.level.ServerPlayer;
|
||||||
import net.minecraft.world.entity.player.Player;
|
import net.minecraft.world.entity.player.Player;
|
||||||
import net.minecraft.world.item.context.UseOnContext;
|
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.MossBlock;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
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 {
|
public class PlayerEvents {
|
||||||
|
|
||||||
@ -33,20 +39,41 @@ public class PlayerEvents {
|
|||||||
LogoutTracker.getInstance(player.getServer()).track(player.getUUID());
|
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) {
|
if (context.getPlayer() instanceof ServerPlayer serverPlayer) {
|
||||||
BlockState state = serverPlayer.level.getBlockState(context.getClickedPos());
|
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) {
|
if (state.getBlock() instanceof MossBlock) {
|
||||||
BlockPos.MutableBlockPos mutable = context.getClickedPos().mutable();
|
VegetationPatchConfiguration cfg = CaveFeatures.MOSS_PATCH_BONEMEAL.value().config();
|
||||||
int range = CaveFeatures.MOSS_PATCH_BONEMEAL.value().config()
|
range = cfg.xzRadius.getMaxValue() + 1;
|
||||||
.xzRadius.getMaxValue() + 1;
|
pos.set(pos.getX(), pos.getY() + cfg.verticalRange + 1, pos.getZ());
|
||||||
ClaimPermission perm = ObjectToPermissionMap.getFromBlock(state.getBlock());
|
} else if (state.getBlock() instanceof GrassBlock) {
|
||||||
if (perm != null && !ClaimStorage.get(serverPlayer.getLevel()).canInteract(mutable, range, serverPlayer, perm, false)) {
|
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);
|
serverPlayer.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.langManager.get("tooCloseClaim"), ChatFormatting.DARK_RED), true);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,7 @@ public class MossBlockCheckMixin {
|
|||||||
|
|
||||||
@Inject(method = "useOn", at = @At("HEAD"), cancellable = true)
|
@Inject(method = "useOn", at = @At("HEAD"), cancellable = true)
|
||||||
private void check(UseOnContext context, CallbackInfoReturnable<InteractionResult> info) {
|
private void check(UseOnContext context, CallbackInfoReturnable<InteractionResult> info) {
|
||||||
if (PlayerEvents.mossBonemeal(context)) {
|
if (PlayerEvents.growBonemeal(context)) {
|
||||||
info.setReturnValue(InteractionResult.PASS);
|
info.setReturnValue(InteractionResult.PASS);
|
||||||
info.cancel();
|
info.cancel();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user