summaryrefslogtreecommitdiff
path: root/src/main/kotlin/io/dico/parcels2/listener/WorldEditListener.kt
blob: 5bab29a37ba39c6bd95ff783c2060cfee6b62629 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package io.dico.parcels2.listener

import com.sk89q.worldedit.EditSession.Stage.BEFORE_REORDER
import com.sk89q.worldedit.WorldEdit
import com.sk89q.worldedit.bukkit.WorldEditPlugin
import com.sk89q.worldedit.event.extent.EditSessionEvent
import com.sk89q.worldedit.extent.AbstractDelegateExtent
import com.sk89q.worldedit.extent.Extent
import com.sk89q.worldedit.math.BlockVector2
import com.sk89q.worldedit.math.BlockVector3
import com.sk89q.worldedit.util.eventbus.EventHandler.Priority.VERY_EARLY
import com.sk89q.worldedit.util.eventbus.Subscribe
import com.sk89q.worldedit.world.biome.BaseBiome
import com.sk89q.worldedit.world.block.BlockStateHolder
import io.dico.parcels2.ParcelWorld
import io.dico.parcels2.ParcelsPlugin
import io.dico.parcels2.canBuildFast
import io.dico.parcels2.util.ext.hasPermBuildAnywhere
import io.dico.parcels2.util.ext.sendParcelMessage
import org.bukkit.entity.Player
import org.bukkit.plugin.Plugin

class WorldEditListener(val parcels: ParcelsPlugin, val worldEdit: WorldEdit) {

    @Subscribe(priority = VERY_EARLY)
    fun onEditSession(event: EditSessionEvent) {
        val worldName = event.world?.name ?: return
        val world = parcels.parcelProvider.getWorld(worldName) ?: return
        if (event.stage == BEFORE_REORDER) return

        val actor = event.actor
        if (actor == null || !actor.isPlayer) return

        val player = parcels.server.getPlayer(actor.uniqueId)
        if (player.hasPermBuildAnywhere) return

        event.extent = ParcelsExtent(event.extent, world, player)
    }

    private class ParcelsExtent(extent: Extent,
                                val world: ParcelWorld,
                                val player: Player) : AbstractDelegateExtent(extent) {
        private var messageSent = false

        private fun canBuild(x: Int, z: Int): Boolean {
            world.getParcelAt(x, z)?.let { parcel ->
                if (parcel.canBuildFast(player)) {
                    return true
                }
            }

            if (!messageSent) {
                messageSent = true
                player.sendParcelMessage(except = true, message = "You can't use WorldEdit there")
            }

            return false
        }

        override fun setBiome(coord: BlockVector2, biome: BaseBiome): Boolean {
            return canBuild(coord.blockX, coord.blockZ) && super.setBiome(coord, biome)
        }

        override fun <T : BlockStateHolder<T>> setBlock(location: BlockVector3, block: T): Boolean {
            return canBuild(location.blockX, location.blockZ) && super.setBlock(location, block)
        }
    }

    companion object {
        fun register(parcels: ParcelsPlugin, worldEditPlugin: Plugin) {
            if (worldEditPlugin !is WorldEditPlugin) return
            val worldEdit = worldEditPlugin.worldEdit
            val listener = WorldEditListener(parcels, worldEdit)
            worldEdit.eventBus.register(listener)
        }
    }

}