From 17ee9d235504e6006222722c058efb09bc7e1177 Mon Sep 17 00:00:00 2001 From: Flemmli97 Date: Fri, 10 Mar 2023 23:12:35 +0100 Subject: [PATCH] prevent dragon block interaction near no permission claims fix #218 --- .../flemmli97/flan/claim/ClaimStorage.java | 12 +++- .../flemmli97/flan/config/LangManager.java | 1 + .../flan/mixin/DragonEggBlockMixin.java | 59 +++++++++++++++++++ common/src/main/resources/flan.mixins.json | 3 +- 4 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 common/src/main/java/io/github/flemmli97/flan/mixin/DragonEggBlockMixin.java diff --git a/common/src/main/java/io/github/flemmli97/flan/claim/ClaimStorage.java b/common/src/main/java/io/github/flemmli97/flan/claim/ClaimStorage.java index 93e36e4..02dfb3c 100644 --- a/common/src/main/java/io/github/flemmli97/flan/claim/ClaimStorage.java +++ b/common/src/main/java/io/github/flemmli97/flan/claim/ClaimStorage.java @@ -233,6 +233,8 @@ public class ClaimStorage implements IPermissionStorage { } public boolean canInteract(BlockPos pos, int radius, ServerPlayer player, ClaimPermission perm, boolean message) { + boolean realPlayer = player != null && player.getClass().equals(ServerPlayer.class); + message = message && realPlayer; ChunkPos c = new ChunkPos(new BlockPos(pos.getX() - radius, pos.getY(), pos.getZ() - radius)); List affected = new ArrayList<>(); for (int x = 0; SectionPos.sectionToBlockCoord(c.x + x) <= pos.getX() + radius; x++) { @@ -247,16 +249,22 @@ public class ClaimStorage implements IPermissionStorage { pos.getX() + radius, pos.getY(), pos.getZ() + radius)) { if (last != null) { if (last.insideClaim(ipos)) { - if (!last.canInteract(player, perm, ipos, message)) + if (!last.canInteract(player, perm, ipos, false)) { + if (message) + player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.langManager.get("noPermissionTooClose"), ChatFormatting.DARK_RED), true); return false; + } continue; } else last = null; } for (Claim claim : affected) { if (claim.insideClaim(ipos)) { last = claim; - if (!claim.canInteract(player, perm, ipos, message)) + if (!claim.canInteract(player, perm, ipos, message)) { + if (message) + player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.langManager.get("noPermissionTooClose"), ChatFormatting.DARK_RED), true); return false; + } } } } diff --git a/common/src/main/java/io/github/flemmli97/flan/config/LangManager.java b/common/src/main/java/io/github/flemmli97/flan/config/LangManager.java index 7065cbd..4a8e2cb 100644 --- a/common/src/main/java/io/github/flemmli97/flan/config/LangManager.java +++ b/common/src/main/java/io/github/flemmli97/flan/config/LangManager.java @@ -50,6 +50,7 @@ public class LangManager { this.defaultTranslation.put("noPermission", "You don't have the required permissions to do that here!"); this.defaultTranslation.put("noPermissionSimple", "Sorry you can't do that here!"); + this.defaultTranslation.put("noPermissionTooClose", "Sorry you are too close to a claim to do that here!"); this.defaultTranslation.put("tooCloseClaim", "You are too close to a protected area to do that!"); this.defaultTranslation.put("configReload", "Configs reloaded"); diff --git a/common/src/main/java/io/github/flemmli97/flan/mixin/DragonEggBlockMixin.java b/common/src/main/java/io/github/flemmli97/flan/mixin/DragonEggBlockMixin.java new file mode 100644 index 0000000..123abdc --- /dev/null +++ b/common/src/main/java/io/github/flemmli97/flan/mixin/DragonEggBlockMixin.java @@ -0,0 +1,59 @@ +package io.github.flemmli97.flan.mixin; + +import io.github.flemmli97.flan.api.permission.ClaimPermission; +import io.github.flemmli97.flan.api.permission.ObjectToPermissionMap; +import io.github.flemmli97.flan.api.permission.PermissionRegistry; +import io.github.flemmli97.flan.claim.ClaimStorage; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.DragonEggBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(DragonEggBlock.class) +public class DragonEggBlockMixin { + + @Unique + private Player flanTempPlayer; + + @Inject(method = "use", at = @At("HEAD")) + private void onUse(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit, CallbackInfoReturnable info) { + this.flanTempPlayer = player; + } + + @Inject(method = "use", at = @At("RETURN")) + private void onUseReturn(BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit, CallbackInfoReturnable info) { + this.flanTempPlayer = null; + } + + @Inject(method = "attack", at = @At("HEAD")) + private void onAttack(BlockState state, Level level, BlockPos pos, Player player, CallbackInfo info) { + this.flanTempPlayer = player; + } + + @Inject(method = "attack", at = @At("RETURN")) + private void onAttackReturn(BlockState state, Level level, BlockPos pos, Player player, CallbackInfo info) { + this.flanTempPlayer = null; + } + + @Inject(method = "teleport", at = @At("HEAD"), cancellable = true) + private void onTeleport(BlockState state, Level level, BlockPos pos, CallbackInfo info) { + if (this.flanTempPlayer instanceof ServerPlayer player) { + ClaimPermission perm = ObjectToPermissionMap.getFromBlock((DragonEggBlock) (Object) this); + if (perm == null) + perm = PermissionRegistry.INTERACTBLOCK; + if (!ClaimStorage.get(player.getLevel()).canInteract(pos, 16, player, perm, true)) + info.cancel(); + } + } +} diff --git a/common/src/main/resources/flan.mixins.json b/common/src/main/resources/flan.mixins.json index 2e929e3..dea0c84 100644 --- a/common/src/main/resources/flan.mixins.json +++ b/common/src/main/resources/flan.mixins.json @@ -28,7 +28,8 @@ "MossBlockCheckMixin", "EnderMitePearlCheck", "SculkSensorMixin", - "SculkShriekerMixin" + "SculkShriekerMixin", + "DragonEggBlockMixin" ], "server": [ ],