diff --git a/src/main/kotlin/ch/offbeatwit/bestbuds/modules/AntiGriefModule.kt b/src/main/kotlin/ch/offbeatwit/bestbuds/modules/AntiGriefModule.kt index 1746066..62a4c3b 100644 --- a/src/main/kotlin/ch/offbeatwit/bestbuds/modules/AntiGriefModule.kt +++ b/src/main/kotlin/ch/offbeatwit/bestbuds/modules/AntiGriefModule.kt @@ -7,7 +7,10 @@ import ch.offbeatwit.bestbuds.util.error import io.papermc.paper.entity.Leashable import io.papermc.paper.event.player.PlayerNameEntityEvent import org.bukkit.block.data.type.Fence -import org.bukkit.entity.* +import org.bukkit.entity.AbstractHorse +import org.bukkit.entity.LeashHitch +import org.bukkit.entity.Player +import org.bukkit.entity.Tameable import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority import org.bukkit.event.Listener @@ -15,8 +18,6 @@ import org.bukkit.event.block.BlockBreakEvent import org.bukkit.event.entity.EntityDamageByEntityEvent import org.bukkit.event.entity.PlayerLeashEntityEvent import org.bukkit.event.player.PlayerInteractEntityEvent -import org.bukkit.event.player.PlayerUnleashEntityEvent -import org.bukkit.util.BoundingBox class AntiGriefModule(ctx: Context) : BestBudsModule(ctx), Listener { fun isAllowed(source: Player, target: Tameable): Boolean { @@ -59,28 +60,20 @@ class AntiGriefModule(ctx: Context) : BestBudsModule(ctx), Listener { @EventHandler fun onLeashed(ev: PlayerLeashEntityEvent) { - if (checkLeash(ev.player, ev.entity)) { - ev.isCancelled = true - ev.player.sendActionBar(error("Can't leash another player's pet!")) - } - } + val source = ev.player + val target = ev.entity - @EventHandler - fun onRemoveLeash(ev: PlayerUnleashEntityEvent) { - if (checkLeash(ev.player, ev.entity)) { + if (target is Tameable + && target.isTamed + && !source.isOwnerOf(target) + && !source.hasPermission(Permissions.LEASH_OTHERS) + && !isAllowed(source, target) + ) { ev.isCancelled = true - ev.player.sendActionBar(error("Can't unleash another player's pet!")) + source.sendActionBar(error("Can't leash another player's pet!")) } } - fun checkLeash(source: Player, target: Entity): Boolean { - return (target is Tameable - && target.isTamed - && !source.isOwnerOf(target) - && !source.hasPermission(Permissions.LEASH_OTHERS) - && !isAllowed(source, target)) - } - @EventHandler fun onBreakLeash(ev: BlockBreakEvent) { if (ev.block.blockData !is Fence) return @@ -88,14 +81,19 @@ class AntiGriefModule(ctx: Context) : BestBudsModule(ctx), Listener { val leashHitch = ev.block.location.getNearbyEntitiesByType(LeashHitch::class.java, 1.0) .firstOrNull() ?: return - val aabb = BoundingBox.of(leashHitch.boundingBox.center, 32.0, 32.0, 32.0) - val target = leashHitch.world.getNearbyEntities(aabb) { - it is Leashable && it.isLeashed && it.leashHolder == leashHitch - }.firstOrNull() + val source = ev.player + val target = leashHitch.world.getNearbyEntitiesByType(Leashable::class.java, leashHitch.location, 32.0, 32.0) { + it.leashHolder == leashHitch + } - if (target != null && checkLeash(ev.player, target)) { + if (target is Tameable + && target.isTamed + && !source.isOwnerOf(target) + && !source.hasPermission(Permissions.LEASH_OTHERS) + && !isAllowed(source, target) + ) { ev.isCancelled = true - ev.player.sendActionBar(error("Can't unleash another player's pet!")) + source.sendActionBar(error("Can't unleash another player's pet!")) } } diff --git a/src/main/kotlin/ch/offbeatwit/bestbuds/modules/InteractionModule.kt b/src/main/kotlin/ch/offbeatwit/bestbuds/modules/InteractionModule.kt index 792299a..0895db5 100644 --- a/src/main/kotlin/ch/offbeatwit/bestbuds/modules/InteractionModule.kt +++ b/src/main/kotlin/ch/offbeatwit/bestbuds/modules/InteractionModule.kt @@ -24,20 +24,15 @@ import org.joml.Vector3f import kotlin.time.Duration.Companion.seconds class InteractionModule(ctx: Context) : BestBudsModule(ctx), Listener { - val infoItem = Material.SPYGLASS - val manageItem = Material.STICK - @EventHandler(priority = EventPriority.HIGH) fun onClickPet(ev: PlayerInteractEntityEvent) { if (ev.isCancelled) return if (!ev.player.isSneaking) return val target = ev.rightClicked - val handItem = ev.player.inventory.getItem(ev.hand).type - val holdingManage = handItem == manageItem - val holdingEither = handItem == infoItem || holdingManage + val holdingSpyglass = ev.player.inventory.getItem(ev.hand).type == Material.SPYGLASS - if (target is ChestedHorse && !holdingEither) { + if (target is ChestedHorse && !holdingSpyglass) { // Sneak-clicking usually accesses these mobs' GUI return } @@ -45,7 +40,7 @@ class InteractionModule(ctx: Context) : BestBudsModule(ctx), Listener { if (target is Tameable && target.isTamed) { ev.isCancelled = true - if (ev.player.isOwnerOf(target) && holdingManage) { + if (ev.player.isOwnerOf(target) && !holdingSpyglass) { ev.player.showDialog(InfoDialog(target).get()) } else { ev.player.showPetInfo(target)