diff options
Diffstat (limited to 'src/main/kotlin/io/dico/parcels2/listener/ParcelListeners.kt')
-rw-r--r-- | src/main/kotlin/io/dico/parcels2/listener/ParcelListeners.kt | 102 |
1 files changed, 57 insertions, 45 deletions
diff --git a/src/main/kotlin/io/dico/parcels2/listener/ParcelListeners.kt b/src/main/kotlin/io/dico/parcels2/listener/ParcelListeners.kt index fa5ccb4..e39583c 100644 --- a/src/main/kotlin/io/dico/parcels2/listener/ParcelListeners.kt +++ b/src/main/kotlin/io/dico/parcels2/listener/ParcelListeners.kt @@ -3,11 +3,9 @@ package io.dico.parcels2.listener import gnu.trove.TLongCollection import io.dico.dicore.ListenerMarker import io.dico.dicore.RegistratorListener -import io.dico.parcels2.Parcel -import io.dico.parcels2.ParcelProvider -import io.dico.parcels2.ParcelWorld -import io.dico.parcels2.statusKey -import io.dico.parcels2.util.* +import io.dico.parcels2.* +import io.dico.parcels2.storage.Storage +import io.dico.parcels2.util.ext.* import org.bukkit.Material.* import org.bukkit.World import org.bukkit.block.Biome @@ -16,6 +14,7 @@ import org.bukkit.block.data.Directional import org.bukkit.block.data.type.Bed import org.bukkit.entity.* import org.bukkit.entity.minecart.ExplosiveMinecart +import org.bukkit.event.EventPriority import org.bukkit.event.EventPriority.NORMAL import org.bukkit.event.block.* import org.bukkit.event.entity.* @@ -26,11 +25,17 @@ import org.bukkit.event.inventory.InventoryInteractEvent import org.bukkit.event.player.* import org.bukkit.event.vehicle.VehicleMoveEvent import org.bukkit.event.weather.WeatherChangeEvent +import org.bukkit.event.world.ChunkLoadEvent import org.bukkit.event.world.StructureGrowEvent import org.bukkit.inventory.InventoryHolder +import java.util.EnumSet @Suppress("NOTHING_TO_INLINE") -class ParcelListeners(val parcelProvider: ParcelProvider, val entityTracker: ParcelEntityTracker) { +class ParcelListeners( + val parcelProvider: ParcelProvider, + val entityTracker: ParcelEntityTracker, + val storage: Storage +) { private inline fun Parcel?.canBuildN(user: Player) = isPresentAnd { canBuild(user) } || user.hasBuildAnywhere /** @@ -54,7 +59,7 @@ class ParcelListeners(val parcelProvider: ParcelProvider, val entityTracker: Par val parcel = parcelProvider.getParcelAt(event.to) ?: return@l if (parcel.isBanned(user.statusKey)) { parcelProvider.getParcelAt(event.from)?.also { - user.teleport(it.world.getHomeLocation(it.id)) + user.teleport(it.homeLocation) user.sendParcelMessage(nopermit = true, message = "You are banned from this parcel") } ?: run { event.to = event.from } } @@ -165,6 +170,7 @@ class ParcelListeners(val parcelProvider: ParcelProvider, val entityTracker: Par if (ppa.isNullOr { hasBlockVisitors }) event.isCancelled = true } + private val bedTypes = EnumSet.copyOf(getMaterialsWithWoodTypePrefix("BED").toList()) /* * Prevents players from placing liquids, using flint and steel, changing redstone components, * using inputs (unless allowed by the plot), @@ -186,49 +192,33 @@ class ParcelListeners(val parcelProvider: ParcelProvider, val entityTracker: Par when (event.action) { Action.RIGHT_CLICK_BLOCK -> run { - when (clickedBlock.type) { - REPEATER, - COMPARATOR -> run { - if (!parcel.canBuildN(user)) { - event.isCancelled = true; return@l - } - } - LEVER, - STONE_BUTTON, - ANVIL, - TRAPPED_CHEST, - OAK_BUTTON, BIRCH_BUTTON, SPRUCE_BUTTON, JUNGLE_BUTTON, ACACIA_BUTTON, DARK_OAK_BUTTON, - OAK_FENCE_GATE, BIRCH_FENCE_GATE, SPRUCE_FENCE_GATE, JUNGLE_FENCE_GATE, ACACIA_FENCE_GATE, DARK_OAK_FENCE_GATE, - OAK_DOOR, BIRCH_DOOR, SPRUCE_DOOR, JUNGLE_DOOR, ACACIA_DOOR, DARK_OAK_DOOR, - OAK_TRAPDOOR, BIRCH_TRAPDOOR, SPRUCE_TRAPDOOR, JUNGLE_TRAPDOOR, ACACIA_TRAPDOOR, DARK_OAK_TRAPDOOR - -> run { - if (!user.hasBuildAnywhere && !parcel.isNullOr { canBuild(user) || allowInteractInputs }) { - user.sendParcelMessage(nopermit = true, message = "You cannot use inputs in this parcel") - event.isCancelled = true; return@l - } - } + val type = clickedBlock.type + val interactable = parcel.effectiveInteractableConfig.isInteractable(type) || parcel.isPresentAnd { canBuild(user) } + if (!interactable) { + val interactableClassName = Interactables[type]!!.name + user.sendParcelMessage(nopermit = true, message = "You cannot interact with $interactableClassName in this parcel") + event.isCancelled = true + return@l + } - WHITE_BED, ORANGE_BED, MAGENTA_BED, LIGHT_BLUE_BED, YELLOW_BED, LIME_BED, PINK_BED, GRAY_BED, LIGHT_GRAY_BED, CYAN_BED, PURPLE_BED, BLUE_BED, BROWN_BED, GREEN_BED, RED_BED, BLACK_BED - -> run { - if (world.options.disableExplosions) { - val bed = clickedBlock.blockData as Bed - val head = if (bed == Bed.Part.FOOT) clickedBlock.getRelative(bed.facing) else clickedBlock - when (head.biome) { - Biome.NETHER, Biome.THE_END -> run { - user.sendParcelMessage(nopermit = true, message = "You cannot use this bed because it would explode") - event.isCancelled = true; return@l - } + if (bedTypes.contains(type)) { + val bed = clickedBlock.blockData as Bed + val head = if (bed == Bed.Part.FOOT) clickedBlock.getRelative(bed.facing) else clickedBlock + when (head.biome) { + Biome.NETHER, Biome.THE_END -> { + if (world.options.disableExplosions || parcel.isNullOr { !canBuild(user) }) { + user.sendParcelMessage(nopermit = true, message = "You cannot use this bed because it would explode") + event.isCancelled = true; return@l } - } - } } + onPlayerInteractEvent_RightClick(event, world, parcel) } Action.RIGHT_CLICK_AIR -> onPlayerInteractEvent_RightClick(event, world, parcel) - Action.PHYSICAL -> if (!user.hasBuildAnywhere && !parcel.isPresentAnd { canBuild(user) || allowInteractInputs }) { + Action.PHYSICAL -> if (!user.hasBuildAnywhere && !parcel.isPresentAnd { canBuild(user) || interactableConfig("pressure_plates") }) { user.sendParcelMessage(nopermit = true, message = "You cannot use inputs in this parcel") event.isCancelled = true; return@l } @@ -317,7 +307,7 @@ class ParcelListeners(val parcelProvider: ParcelProvider, val entityTracker: Par @field:ListenerMarker(priority = NORMAL) val onPlayerDropItemEvent = RegistratorListener<PlayerDropItemEvent> l@{ event -> val (wo, ppa) = getWoAndPPa(event.itemDrop.location.block) ?: return@l - if (!ppa.canBuildN(event.player) && !ppa.isPresentAnd { allowInteractInventory }) event.isCancelled = true + if (!ppa.canBuildN(event.player) && !ppa.isPresentAnd { interactableConfig("containers") }) event.isCancelled = true } /* @@ -338,7 +328,7 @@ class ParcelListeners(val parcelProvider: ParcelProvider, val entityTracker: Par val user = event.whoClicked as? Player ?: return@l if ((event.inventory ?: return@l).holder === user) return@l // inventory null: hotbar val (wo, ppa) = getWoAndPPa(event.inventory.location.block) ?: return@l - if (ppa.isNullOr { !canBuild(user) && !allowInteractInventory }) { + if (ppa.isNullOr { !canBuild(user) && !interactableConfig("containers") }) { event.isCancelled = true } } @@ -380,10 +370,10 @@ class ParcelListeners(val parcelProvider: ParcelProvider, val entityTracker: Par val cancel: Boolean = when (event.newState.type) { - // prevent ice generation from Frost Walkers enchantment + // prevent ice generation from Frost Walkers enchantment FROSTED_ICE -> player != null && !ppa.canBuild(player) - // prevent snow generation from weather + // prevent snow generation from weather SNOW -> !hasEntity && wo.options.preventWeatherBlockChanges else -> false @@ -575,4 +565,26 @@ class ParcelListeners(val parcelProvider: ParcelProvider, val entityTracker: Par } } + /** + * Updates owner signs of parcels that get loaded if it is marked outdated + */ + @ListenerMarker(priority = EventPriority.NORMAL) + val onChunkLoadEvent = RegistratorListener<ChunkLoadEvent> l@{ event -> + val world = parcelProvider.getWorld(event.chunk.world) ?: return@l + val parcels = world.blockManager.getParcelsWithOwnerBlockIn(event.chunk) + if (parcels.isEmpty()) return@l + + parcels.forEach { id -> + val parcel = world.getParcelById(id)?.takeIf { it.ownerSignOutdated } ?: return@forEach + world.blockManager.setOwnerBlock(parcel.id, parcel.owner) + parcel.ownerSignOutdated = false + } + + } + + @ListenerMarker + val onPlayerJoinEvent = RegistratorListener<PlayerJoinEvent> l@{ event -> + storage.updatePlayerName(event.player.uuid, event.player.name) + } + }
\ No newline at end of file |