11package dev.slne.surf.protect.paper.listener.listeners
22
3+ import com.jeff_media.morepersistentdatatypes.DataType
34import com.sk89q.worldguard.protection.flags.Flags
45import com.sk89q.worldguard.protection.flags.StateFlag
6+ import dev.slne.surf.api.paper.util.namespacedKey
57import dev.slne.surf.protect.paper.region.flags.ProtectionFlagsRegistry
68import dev.slne.surf.protect.paper.util.getProtectedRegions
79import dev.slne.surf.protect.paper.util.isGlobalRegion
810import org.bukkit.Location
911import org.bukkit.Tag
1012import org.bukkit.block.Block
1113import org.bukkit.entity.FallingBlock
14+ import org.bukkit.entity.minecart.HopperMinecart
1215import org.bukkit.event.EventHandler
1316import org.bukkit.event.EventPriority
1417import org.bukkit.event.Listener
@@ -18,6 +21,8 @@ import org.bukkit.event.block.BlockIgniteEvent
1821import org.bukkit.event.block.BlockIgniteEvent.IgniteCause
1922import org.bukkit.event.entity.EntityChangeBlockEvent
2023import org.bukkit.event.entity.EntityExplodeEvent
24+ import org.bukkit.event.entity.EntityPlaceEvent
25+ import org.bukkit.event.inventory.InventoryMoveItemEvent
2126
2227
2328object RegionListener : Listener {
@@ -82,6 +87,46 @@ object RegionListener : Listener {
8287 }
8388 }
8489
90+ private val creator = namespacedKey(" creator" )
91+
92+ @EventHandler(ignoreCancelled = true , priority = EventPriority .HIGH )
93+ fun onMinecartPlace (event : EntityPlaceEvent ) {
94+ val vehicle = event.entity
95+ if (vehicle !is HopperMinecart ) return
96+
97+ val player = event.player ? : return
98+
99+ vehicle.persistentDataContainer.set(
100+ creator,
101+ DataType .UUID ,
102+ player.uniqueId
103+ )
104+ }
105+
106+ @EventHandler(ignoreCancelled = true , priority = EventPriority .HIGH )
107+ fun onInvMove (event : InventoryMoveItemEvent ) {
108+ val sourceHolder = event.source.holder
109+ val destHolder = event.destination.holder
110+
111+ val minecart = sourceHolder as ? HopperMinecart ? : destHolder as ? HopperMinecart ? : return
112+
113+ val protection = (event.destination.location ? : event.source.location)
114+ ?.getProtectedRegions()
115+ ?.firstOrNull()
116+ ? : return
117+
118+ val ownerUuid =
119+ minecart.persistentDataContainer.get(creator, DataType .UUID ) ? : return
120+
121+ val allowed =
122+ protection.members.contains(ownerUuid) ||
123+ protection.owners.contains(ownerUuid)
124+
125+ if (! allowed) {
126+ event.isCancelled = true
127+ }
128+ }
129+
85130 private fun gravityDeniedAt (location : Location ) = location.getProtectedRegions().any {
86131 (it.getFlag(ProtectionFlagsRegistry .SURF_BLOCK_GRAVITY )
87132 ? : StateFlag .State .ALLOW ) == StateFlag .State .DENY
0 commit comments