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)
}
}
}
|