Skip to content

Commit 247a378

Browse files
committed
protect lobby
1 parent bab22e3 commit 247a378

File tree

4 files changed

+140
-4
lines changed

4 files changed

+140
-4
lines changed

src/main/kotlin/li/angu/challengeplugin/ChallengePluginPlugin.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import li.angu.challengeplugin.listeners.PlayerHealthListener
1515
import li.angu.challengeplugin.listeners.BlockDropListener
1616
import li.angu.challengeplugin.listeners.PortalListener
1717
import li.angu.challengeplugin.listeners.ExperienceBorderListener
18+
import li.angu.challengeplugin.listeners.LobbyProtectionListener
1819
import li.angu.challengeplugin.tasks.TimerTask
1920
import li.angu.challengeplugin.utils.LanguageManager
2021

@@ -97,6 +98,7 @@ open class ChallengePluginPlugin : JavaPlugin() {
9798
server.pluginManager.registerEvents(PlayerConnectionListener(this), this)
9899
server.pluginManager.registerEvents(PlayerHealthListener(this), this)
99100
server.pluginManager.registerEvents(PortalListener(this), this)
101+
server.pluginManager.registerEvents(LobbyProtectionListener(this), this)
100102
blockDropListener = BlockDropListener(this)
101103
server.pluginManager.registerEvents(blockDropListener, this)
102104

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
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+
}

src/main/kotlin/li/angu/challengeplugin/listeners/PlayerConnectionListener.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ class PlayerConnectionListener(private val plugin: ChallengePluginPlugin) : List
6161
if (plugin.lobbyManager.isLobbyWorld(toWorld.name)) {
6262
// Check if the player isn't coming from a challenge world
6363
if (challenge == null) {
64-
// Set player to creative mode and give them the menu item
65-
player.gameMode = org.bukkit.GameMode.CREATIVE
64+
// Set player to survival mode and give them the menu item
65+
player.gameMode = org.bukkit.GameMode.SURVIVAL
6666
plugin.lobbyManager.setupLobbyInventory(player)
6767
}
6868
}

src/main/kotlin/li/angu/challengeplugin/managers/LobbyManager.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ class LobbyManager(private val plugin: ChallengePluginPlugin) {
8787
}
8888

8989
/**
90-
* Teleport a player to the lobby and set their gamemode to creative
90+
* Teleport a player to the lobby and set their gamemode to survival
9191
* Note: This method does not automatically leave challenges - that should be handled
9292
* by the calling code if needed.
9393
*/
@@ -101,7 +101,7 @@ class LobbyManager(private val plugin: ChallengePluginPlugin) {
101101
// Teleport to lobby spawn
102102
lobbySpawnLocation?.let { spawn ->
103103
player.teleport(spawn)
104-
player.gameMode = GameMode.CREATIVE
104+
player.gameMode = GameMode.SURVIVAL
105105
setupLobbyInventory(player)
106106

107107
// Send welcome message only for new players

0 commit comments

Comments
 (0)