Compare commits

..

2 commits

2 changed files with 34 additions and 27 deletions

View file

@ -7,10 +7,7 @@ import ch.offbeatwit.bestbuds.util.error
import io.papermc.paper.entity.Leashable import io.papermc.paper.entity.Leashable
import io.papermc.paper.event.player.PlayerNameEntityEvent import io.papermc.paper.event.player.PlayerNameEntityEvent
import org.bukkit.block.data.type.Fence import org.bukkit.block.data.type.Fence
import org.bukkit.entity.AbstractHorse import org.bukkit.entity.*
import org.bukkit.entity.LeashHitch
import org.bukkit.entity.Player
import org.bukkit.entity.Tameable
import org.bukkit.event.EventHandler import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority import org.bukkit.event.EventPriority
import org.bukkit.event.Listener import org.bukkit.event.Listener
@ -18,6 +15,8 @@ import org.bukkit.event.block.BlockBreakEvent
import org.bukkit.event.entity.EntityDamageByEntityEvent import org.bukkit.event.entity.EntityDamageByEntityEvent
import org.bukkit.event.entity.PlayerLeashEntityEvent import org.bukkit.event.entity.PlayerLeashEntityEvent
import org.bukkit.event.player.PlayerInteractEntityEvent import org.bukkit.event.player.PlayerInteractEntityEvent
import org.bukkit.event.player.PlayerUnleashEntityEvent
import org.bukkit.util.BoundingBox
class AntiGriefModule(ctx: Context) : BestBudsModule(ctx), Listener { class AntiGriefModule(ctx: Context) : BestBudsModule(ctx), Listener {
fun isAllowed(source: Player, target: Tameable): Boolean { fun isAllowed(source: Player, target: Tameable): Boolean {
@ -60,18 +59,26 @@ class AntiGriefModule(ctx: Context) : BestBudsModule(ctx), Listener {
@EventHandler @EventHandler
fun onLeashed(ev: PlayerLeashEntityEvent) { fun onLeashed(ev: PlayerLeashEntityEvent) {
val source = ev.player if (checkLeash(ev.player, ev.entity)) {
val target = ev.entity ev.isCancelled = true
ev.player.sendActionBar(error("Can't leash another player's pet!"))
}
}
if (target is Tameable @EventHandler
fun onRemoveLeash(ev: PlayerUnleashEntityEvent) {
if (checkLeash(ev.player, ev.entity)) {
ev.isCancelled = true
ev.player.sendActionBar(error("Can't unleash another player's pet!"))
}
}
fun checkLeash(source: Player, target: Entity): Boolean {
return (target is Tameable
&& target.isTamed && target.isTamed
&& !source.isOwnerOf(target) && !source.isOwnerOf(target)
&& !source.hasPermission(Permissions.LEASH_OTHERS) && !source.hasPermission(Permissions.LEASH_OTHERS)
&& !isAllowed(source, target) && !isAllowed(source, target))
) {
ev.isCancelled = true
source.sendActionBar(error("Can't leash another player's pet!"))
}
} }
@EventHandler @EventHandler
@ -81,19 +88,14 @@ class AntiGriefModule(ctx: Context) : BestBudsModule(ctx), Listener {
val leashHitch = ev.block.location.getNearbyEntitiesByType(LeashHitch::class.java, 1.0) val leashHitch = ev.block.location.getNearbyEntitiesByType(LeashHitch::class.java, 1.0)
.firstOrNull() ?: return .firstOrNull() ?: return
val source = ev.player val aabb = BoundingBox.of(leashHitch.boundingBox.center, 32.0, 32.0, 32.0)
val target = leashHitch.world.getNearbyEntitiesByType(Leashable::class.java, leashHitch.location, 32.0, 32.0) { val target = leashHitch.world.getNearbyEntities(aabb) {
it.leashHolder == leashHitch it is Leashable && it.isLeashed && it.leashHolder == leashHitch
} }.firstOrNull()
if (target is Tameable if (target != null && checkLeash(ev.player, target)) {
&& target.isTamed
&& !source.isOwnerOf(target)
&& !source.hasPermission(Permissions.LEASH_OTHERS)
&& !isAllowed(source, target)
) {
ev.isCancelled = true ev.isCancelled = true
source.sendActionBar(error("Can't unleash another player's pet!")) ev.player.sendActionBar(error("Can't unleash another player's pet!"))
} }
} }

View file

@ -24,15 +24,20 @@ import org.joml.Vector3f
import kotlin.time.Duration.Companion.seconds import kotlin.time.Duration.Companion.seconds
class InteractionModule(ctx: Context) : BestBudsModule(ctx), Listener { class InteractionModule(ctx: Context) : BestBudsModule(ctx), Listener {
val infoItem = Material.SPYGLASS
val manageItem = Material.STICK
@EventHandler(priority = EventPriority.HIGH) @EventHandler(priority = EventPriority.HIGH)
fun onClickPet(ev: PlayerInteractEntityEvent) { fun onClickPet(ev: PlayerInteractEntityEvent) {
if (ev.isCancelled) return if (ev.isCancelled) return
if (!ev.player.isSneaking) return if (!ev.player.isSneaking) return
val target = ev.rightClicked val target = ev.rightClicked
val holdingSpyglass = ev.player.inventory.getItem(ev.hand).type == Material.SPYGLASS val handItem = ev.player.inventory.getItem(ev.hand).type
val holdingManage = handItem == manageItem
val holdingEither = handItem == infoItem || holdingManage
if (target is ChestedHorse && !holdingSpyglass) { if (target is ChestedHorse && !holdingEither) {
// Sneak-clicking usually accesses these mobs' GUI // Sneak-clicking usually accesses these mobs' GUI
return return
} }
@ -40,7 +45,7 @@ class InteractionModule(ctx: Context) : BestBudsModule(ctx), Listener {
if (target is Tameable && target.isTamed) { if (target is Tameable && target.isTamed) {
ev.isCancelled = true ev.isCancelled = true
if (ev.player.isOwnerOf(target) && !holdingSpyglass) { if (ev.player.isOwnerOf(target) && holdingManage) {
ev.player.showDialog(InfoDialog(target).get()) ev.player.showDialog(InfoDialog(target).get())
} else { } else {
ev.player.showPetInfo(target) ev.player.showPetInfo(target)