Compare commits
2 commits
39fb6b9db0
...
a0e9e6c3c0
| Author | SHA1 | Date | |
|---|---|---|---|
| a0e9e6c3c0 | |||
| 56de63e89e |
2 changed files with 34 additions and 27 deletions
|
|
@ -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!"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue