Compare commits

..

No commits in common. "a0e9e6c3c0dbd15a98850e26fd66483e72e70a4f" and "39fb6b9db007998ea60fe0522784039d2c92c2b4" have entirely different histories.

2 changed files with 27 additions and 34 deletions

View file

@ -7,7 +7,10 @@ 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.* 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.EventHandler
import org.bukkit.event.EventPriority import org.bukkit.event.EventPriority
import org.bukkit.event.Listener 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.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 {
@ -59,26 +60,18 @@ class AntiGriefModule(ctx: Context) : BestBudsModule(ctx), Listener {
@EventHandler @EventHandler
fun onLeashed(ev: PlayerLeashEntityEvent) { fun onLeashed(ev: PlayerLeashEntityEvent) {
if (checkLeash(ev.player, ev.entity)) { val source = ev.player
ev.isCancelled = true val target = ev.entity
ev.player.sendActionBar(error("Can't leash another player's pet!"))
}
}
@EventHandler if (target is Tameable
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
@ -88,14 +81,19 @@ 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 aabb = BoundingBox.of(leashHitch.boundingBox.center, 32.0, 32.0, 32.0) val source = ev.player
val target = leashHitch.world.getNearbyEntities(aabb) { val target = leashHitch.world.getNearbyEntitiesByType(Leashable::class.java, leashHitch.location, 32.0, 32.0) {
it is Leashable && it.isLeashed && it.leashHolder == leashHitch it.leashHolder == leashHitch
}.firstOrNull() }
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.isCancelled = true
ev.player.sendActionBar(error("Can't unleash another player's pet!")) source.sendActionBar(error("Can't unleash another player's pet!"))
} }
} }

View file

@ -24,20 +24,15 @@ 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 handItem = ev.player.inventory.getItem(ev.hand).type val holdingSpyglass = ev.player.inventory.getItem(ev.hand).type == Material.SPYGLASS
val holdingManage = handItem == manageItem
val holdingEither = handItem == infoItem || holdingManage
if (target is ChestedHorse && !holdingEither) { if (target is ChestedHorse && !holdingSpyglass) {
// Sneak-clicking usually accesses these mobs' GUI // Sneak-clicking usually accesses these mobs' GUI
return return
} }
@ -45,7 +40,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) && holdingManage) { if (ev.player.isOwnerOf(target) && !holdingSpyglass) {
ev.player.showDialog(InfoDialog(target).get()) ev.player.showDialog(InfoDialog(target).get())
} else { } else {
ev.player.showPetInfo(target) ev.player.showPetInfo(target)