1
+ package li.angu.challengeplugin.listeners
2
+
3
+ import li.angu.challengeplugin.ChallengePluginPlugin
4
+ import org.bukkit.entity.Player
5
+ import org.bukkit.event.EventHandler
6
+ import org.bukkit.event.Listener
7
+ import org.bukkit.event.block.BlockBreakEvent
8
+ import org.bukkit.event.block.BlockPlaceEvent
9
+ import org.bukkit.event.player.PlayerInteractEvent
10
+ import org.bukkit.event.block.Action
11
+ import org.bukkit.event.entity.EntityDamageByEntityEvent
12
+ import org.bukkit.event.entity.EntityDamageEvent
13
+ import org.bukkit.event.player.PlayerDropItemEvent
14
+ import org.bukkit.event.inventory.InventoryClickEvent
15
+ import org.bukkit.event.player.PlayerPickupItemEvent
16
+ import org.bukkit.event.entity.FoodLevelChangeEvent
17
+ import org.bukkit.event.entity.EntityPickupItemEvent
18
+
19
+ /* *
20
+ * Protects the lobby world from player modifications and interactions.
21
+ * Prevents players from breaking, placing, or interacting with blocks in the lobby.
22
+ */
23
+ class LobbyProtectionListener (private val plugin : ChallengePluginPlugin ) : Listener {
24
+
25
+ @EventHandler
26
+ fun onBlockBreak (event : BlockBreakEvent ) {
27
+ val player = event.player
28
+ if (isInLobby(player)) {
29
+ event.isCancelled = true
30
+ }
31
+ }
32
+
33
+ @EventHandler
34
+ fun onBlockPlace (event : BlockPlaceEvent ) {
35
+ val player = event.player
36
+ if (isInLobby(player)) {
37
+ event.isCancelled = true
38
+ }
39
+ }
40
+
41
+ @EventHandler
42
+ fun onPlayerInteract (event : PlayerInteractEvent ) {
43
+ val player = event.player
44
+
45
+ // Allow interaction with the menu item
46
+ if (plugin.lobbyManager.isMenuItem(event.item)) {
47
+ return
48
+ }
49
+
50
+ if (isInLobby(player)) {
51
+ // Cancel interactions with blocks (except air)
52
+ if (event.action == Action .RIGHT_CLICK_BLOCK || event.action == Action .LEFT_CLICK_BLOCK ) {
53
+ event.isCancelled = true
54
+ }
55
+ }
56
+ }
57
+
58
+ @EventHandler
59
+ fun onEntityDamage (event : EntityDamageEvent ) {
60
+ val entity = event.entity
61
+ if (entity is Player && isInLobby(entity)) {
62
+ // Prevent all damage in lobby
63
+ event.isCancelled = true
64
+ }
65
+ }
66
+
67
+ @EventHandler
68
+ fun onEntityDamageByEntity (event : EntityDamageByEntityEvent ) {
69
+ val damager = event.damager
70
+ val damaged = event.entity
71
+
72
+ // Prevent players from damaging anything in lobby
73
+ if (damager is Player && isInLobby(damager)) {
74
+ event.isCancelled = true
75
+ }
76
+
77
+ // Prevent anything from damaging players in lobby
78
+ if (damaged is Player && isInLobby(damaged)) {
79
+ event.isCancelled = true
80
+ }
81
+ }
82
+
83
+ @EventHandler
84
+ fun onPlayerDropItem (event : PlayerDropItemEvent ) {
85
+ val player = event.player
86
+ if (isInLobby(player)) {
87
+ // Prevent dropping items in lobby
88
+ event.isCancelled = true
89
+ }
90
+ }
91
+
92
+ @EventHandler
93
+ fun onEntityPickupItem (event : EntityPickupItemEvent ) {
94
+ val entity = event.entity
95
+ if (entity is Player && isInLobby(entity)) {
96
+ // Prevent picking up items in lobby (except our menu item)
97
+ val item = event.item.itemStack
98
+ if (! plugin.lobbyManager.isMenuItem(item)) {
99
+ event.isCancelled = true
100
+ }
101
+ }
102
+ }
103
+
104
+ @EventHandler
105
+ fun onFoodLevelChange (event : FoodLevelChangeEvent ) {
106
+ val entity = event.entity
107
+ if (entity is Player && isInLobby(entity)) {
108
+ // Prevent hunger in lobby
109
+ event.isCancelled = true
110
+ }
111
+ }
112
+
113
+ @EventHandler
114
+ fun onInventoryClick (event : InventoryClickEvent ) {
115
+ val player = event.whoClicked as ? Player ? : return
116
+ if (isInLobby(player)) {
117
+ // Only allow clicking on the menu item
118
+ val item = event.currentItem
119
+ if (item != null && ! plugin.lobbyManager.isMenuItem(item)) {
120
+ // Allow moving the menu item around but prevent other interactions
121
+ if (event.slot != 0 ) {
122
+ event.isCancelled = true
123
+ }
124
+ }
125
+ }
126
+ }
127
+
128
+ /* *
129
+ * Check if a player is currently in the lobby world
130
+ */
131
+ private fun isInLobby (player : Player ): Boolean {
132
+ return plugin.lobbyManager.isLobbyWorld(player.world.name)
133
+ }
134
+ }
0 commit comments