Initial commit

This commit is contained in:
2025-07-03 01:28:39 -07:00
commit a3c6af4e54
25 changed files with 1721 additions and 0 deletions

View File

@@ -0,0 +1,87 @@
package xyz.lncvrt.chaosmclobby
import net.kyori.adventure.text.minimessage.MiniMessage
import org.bukkit.GameMode
import org.bukkit.Location
import org.bukkit.Material
import org.bukkit.attribute.Attribute
import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack
import org.bukkit.plugin.java.JavaPlugin
import org.bukkit.potion.PotionEffect
import org.bukkit.potion.PotionEffectType
import org.sayandev.stickynote.loader.bukkit.StickyNoteBukkitLoader
import xyz.lncvrt.chaosmcapi.utils.MessageFormat
import xyz.lncvrt.chaosmclobby.command.DiscordCommand
import xyz.lncvrt.chaosmclobby.command.WebsiteCommand
import xyz.lncvrt.chaosmclobby.event.*
import java.util.*
class ChaosMCLobbyPlugin : JavaPlugin() {
val jumpPadCooldowns = HashMap<UUID, Long>()
val cooldowns = HashMap<Player, MutableMap<String, Long>>()
override fun onEnable() {
StickyNoteBukkitLoader(this)
DiscordCommand
WebsiteCommand
registerEvents()
}
private fun registerEvents() {
val pluginManager = server.pluginManager
pluginManager.registerEvents(InventoryClickListener(), this)
pluginManager.registerEvents(PlayerAdvancementCriterionGrantListener(), this)
pluginManager.registerEvents(PlayerGameModeChangeListener(this), this)
pluginManager.registerEvents(PlayerInteractListener(this), this)
pluginManager.registerEvents(PlayerItemDamageListener(), this)
pluginManager.registerEvents(PlayerItemHeldListener(), this)
pluginManager.registerEvents(PlayerJoinListener(this), this)
pluginManager.registerEvents(PlayerMoveListener(this), this)
pluginManager.registerEvents(PlayerSwapHandItemsListener(), this)
pluginManager.registerEvents(PlayerToggleFlightListener(), this)
pluginManager.registerEvents(ProjectileLaunchListener(), this)
}
internal fun resetPlayer(player: Player, teleport: Boolean, setGamemode: Boolean) {
val miniMessage: MiniMessage = MiniMessage.miniMessage()
val effect = PotionEffect(PotionEffectType.SPEED, PotionEffect.INFINITE_DURATION, 1, false, false)
player.inventory.clear()
player.inventory.heldItemSlot = 4
val discordItem = ItemStack(Material.DIAMOND)
val discordMeta = discordItem.itemMeta
discordMeta.displayName(miniMessage.deserialize(MessageFormat.setPrimaryColor("<italic:false>Our Socials ${MessageFormat.setSecondaryColor("(Right Click)")}</italic>")))
discordItem.setItemMeta(discordMeta)
player.inventory.setItem(1, discordItem)
val serverSelectorItem = ItemStack(Material.NETHER_STAR)
val serverSelectorMeta = serverSelectorItem.itemMeta
serverSelectorMeta.displayName(miniMessage.deserialize(MessageFormat.setPrimaryColor("<italic:false>Server Selector ${MessageFormat.setSecondaryColor("(Right Click)")}</italic>")))
serverSelectorItem.setItemMeta(serverSelectorMeta)
player.inventory.setItem(4, serverSelectorItem)
val fireworkItem = ItemStack(Material.FIREWORK_ROCKET)
val fireworkMeta = fireworkItem.itemMeta
fireworkMeta.displayName(miniMessage.deserialize(MessageFormat.setPrimaryColor("<italic:false>Elytra ${MessageFormat.setSecondaryColor("(Fly around the lobby!)")}</italic>")))
fireworkItem.setItemMeta(fireworkMeta)
player.inventory.setItem(7, fireworkItem)
player.health = player.getAttribute(Attribute.GENERIC_MAX_HEALTH)?.value ?: 20.0
player.foodLevel = 20
player.saturation = 20f
player.clearActivePotionEffects()
player.addPotionEffect(effect)
if (setGamemode) player.gameMode = GameMode.ADVENTURE
if (teleport) {
val world = server.getWorld("world")
player.teleport(Location(world, 0.5, 65.0, 0.5, 0F, 0F))
}
}
internal fun resetPlayer(player: Player, teleport: Boolean) {
resetPlayer(player, teleport, true)
}
}

View File

@@ -0,0 +1,16 @@
package xyz.lncvrt.chaosmclobby.command
import org.incendo.cloud.kotlin.MutableCommandBuilder
import org.sayandev.stickynote.bukkit.command.BukkitCommand
import org.sayandev.stickynote.bukkit.command.BukkitSender
import org.sayandev.stickynote.bukkit.extension.sendComponent
import xyz.lncvrt.chaosmcapi.utils.MessageFormat
object DiscordCommand : BukkitCommand("discord") {
override fun rootBuilder(builder: MutableCommandBuilder<BukkitSender>) {
builder.handler { context ->
val player = context.sender().player() ?: return@handler
player.sendComponent(MessageFormat.setPrefix(MessageFormat.setPrimaryColor("Click ${MessageFormat.setSecondaryColor("<u><click:open_url:'https://chaos.lncvrt.xyz/discord'>HERE</click></u>")} to join our Discord Server!")))
}
}
}

View File

@@ -0,0 +1,16 @@
package xyz.lncvrt.chaosmclobby.command
import org.incendo.cloud.kotlin.MutableCommandBuilder
import org.sayandev.stickynote.bukkit.command.BukkitCommand
import org.sayandev.stickynote.bukkit.command.BukkitSender
import org.sayandev.stickynote.bukkit.extension.sendComponent
import xyz.lncvrt.chaosmcapi.utils.MessageFormat
object WebsiteCommand : BukkitCommand("website") {
override fun rootBuilder(builder: MutableCommandBuilder<BukkitSender>) {
builder.handler { context ->
val player = context.sender().player() ?: return@handler
player.sendComponent(MessageFormat.setPrefix(MessageFormat.setPrimaryColor("Click ${MessageFormat.setSecondaryColor("<u><click:open_url:'https://chaos.lncvrt.xyz'>HERE</click></u>")} to view our Website!")))
}
}
}

View File

@@ -0,0 +1,17 @@
package xyz.lncvrt.chaosmclobby.event
import org.bukkit.GameMode
import org.bukkit.entity.Player
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.inventory.InventoryClickEvent
class InventoryClickListener : Listener {
@EventHandler
fun onInventoryClickEvent(event: InventoryClickEvent) {
val entity = event.whoClicked
if (entity is Player) {
if (entity.gameMode != GameMode.CREATIVE) event.isCancelled = true
}
}
}

View File

@@ -0,0 +1,12 @@
package xyz.lncvrt.chaosmclobby.event
import com.destroystokyo.paper.event.player.PlayerAdvancementCriterionGrantEvent
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
class PlayerAdvancementCriterionGrantListener : Listener {
@EventHandler
fun onPlayerAdvancementCriterionGrantEvent(event: PlayerAdvancementCriterionGrantEvent) {
event.isCancelled = true
}
}

View File

@@ -0,0 +1,22 @@
package xyz.lncvrt.chaosmclobby.event
import org.bukkit.GameMode
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.player.PlayerGameModeChangeEvent
import xyz.lncvrt.chaosmclobby.ChaosMCLobbyPlugin
class PlayerGameModeChangeListener(val plugin: ChaosMCLobbyPlugin) : Listener {
@EventHandler
fun onPlayerGameModeChangeEvent(event: PlayerGameModeChangeEvent) {
val player = event.getPlayer()
if (event.newGameMode === GameMode.CREATIVE) {
player.inventory.clear()
} else if (event.newGameMode === GameMode.ADVENTURE) {
return
} else {
event.isCancelled = true
player.gameMode = GameMode.ADVENTURE
}
}
}

View File

@@ -0,0 +1,37 @@
package xyz.lncvrt.chaosmclobby.event
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.block.Action
import org.bukkit.event.player.PlayerInteractEvent
import org.sayandev.stickynote.bukkit.extension.sendComponent
import xyz.lncvrt.chaosmcapi.utils.CommandHelper
import xyz.lncvrt.chaosmcapi.utils.MessageFormat
import xyz.lncvrt.chaosmclobby.ChaosMCLobbyPlugin
class PlayerInteractListener(val plugin: ChaosMCLobbyPlugin) : Listener {
@EventHandler
fun onPlayerInteractEvent(event: PlayerInteractEvent) {
if (event.getAction() !== Action.RIGHT_CLICK_AIR && event.getAction() !== Action.RIGHT_CLICK_BLOCK) {
return
}
val player = event.getPlayer()
val item = player.inventory.itemInMainHand
val name = PlainTextComponentSerializer.plainText().serialize(item.displayName().asComponent())
val playerCooldowns = plugin.cooldowns.computeIfAbsent(player) { HashMap() }
val currentTime = System.currentTimeMillis()
if (playerCooldowns.containsKey(name) && currentTime - playerCooldowns[name]!! < 1000) return
when (name) {
"[Our Socials (Right Click)]" -> player.sendComponent(MessageFormat.setPrefix(MessageFormat.setPrimaryColor("Click ${MessageFormat.setSecondaryColor("<u><click:open_url:'https://chaos.lncvrt.xyz/discord'>HERE</click></u>")} to join our Discord Server, or click ${MessageFormat.setSecondaryColor("<u><click:open_url:'https://chaos.lncvrt.xyz'>HERE</click></u>")} to view our Website!")))
"[Server Selector (Right Click)]" -> CommandHelper().executeAsConsole("dmenu open serverselector ${player.name}")
}
playerCooldowns.put(name, currentTime)
}
}

View File

@@ -0,0 +1,12 @@
package xyz.lncvrt.chaosmclobby.event
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.player.PlayerItemDamageEvent
class PlayerItemDamageListener : Listener {
@EventHandler
fun onItemDurabilityChange(event: PlayerItemDamageEvent) {
event.isCancelled = true
}
}

View File

@@ -0,0 +1,22 @@
package xyz.lncvrt.chaosmclobby.event
import org.bukkit.GameMode
import org.bukkit.Material
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.player.PlayerItemHeldEvent
import org.bukkit.inventory.ItemStack
class PlayerItemHeldListener : Listener {
@EventHandler
fun onPlayerItemHeldEvent(event: PlayerItemHeldEvent) {
val player = event.getPlayer()
if (player.gameMode == GameMode.ADVENTURE) {
if (event.newSlot == 7) {
player.inventory.chestplate = ItemStack(Material.ELYTRA)
} else {
player.inventory.chestplate = null
}
}
}
}

View File

@@ -0,0 +1,29 @@
package xyz.lncvrt.chaosmclobby.event
import org.bukkit.GameMode
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.player.PlayerJoinEvent
import org.sayandev.stickynote.bukkit.extension.sendComponent
import xyz.lncvrt.chaosmcapi.utils.MessageFormat
import xyz.lncvrt.chaosmclobby.ChaosMCLobbyPlugin
class PlayerJoinListener(val plugin: ChaosMCLobbyPlugin) : Listener {
@EventHandler
fun onPlayerJoinEvent(event: PlayerJoinEvent) {
val player = event.getPlayer()
plugin.resetPlayer(player, true)
player.gameMode = GameMode.ADVENTURE
plugin.server.scheduler.runTaskLater(plugin, Runnable {
player.sendComponent("<dark_gray><strikethrough>+---------------------***---------------------+")
player.sendMessage("")
player.sendComponent("<gray>Welcome to ${MessageFormat.name()}, ${MessageFormat.setPrimaryColor("<underlined>${player.name}</underlined>")}!</gray>")
player.sendMessage("")
player.sendComponent("${MessageFormat.setPrimaryColor("<bold>WEBSITE</bold><gray>:</gray>")} ${MessageFormat.setSecondaryColor("<click:open_url:'https://galaxy.lncvrt.xyz'>galaxy.lncvrt.xyz</click>")}")
player.sendComponent("${MessageFormat.setPrimaryColor("<bold>DISCORD</bold><gray>:</gray>")} ${MessageFormat.setSecondaryColor("<click:open_url:'https://galaxy.lncvrt.xyz/discord'>galaxy.lncvrt.xyz/discord</click>")}")
player.sendMessage("")
player.sendComponent("<dark_gray><strikethrough>+---------------------***---------------------+")
}, 5)
}
}

View File

@@ -0,0 +1,89 @@
package xyz.lncvrt.chaosmclobby.event
import org.bukkit.GameMode
import org.bukkit.Material
import org.bukkit.Sound
import org.bukkit.World
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.player.PlayerMoveEvent
import org.bukkit.util.Vector
import org.sayandev.stickynote.bukkit.extension.sendComponent
import xyz.lncvrt.chaosmcapi.utils.MessageFormat
import xyz.lncvrt.chaosmclobby.ChaosMCLobbyPlugin
class PlayerMoveListener(val plugin: ChaosMCLobbyPlugin) : Listener {
@EventHandler
fun onPlayerMove(event: PlayerMoveEvent) {
val player = event.getPlayer()
val location = player.location
if (location.y < 0) {
plugin.resetPlayer(player, true)
player.sendComponent(MessageFormat.setPrefix("<rainbow>You happy with yourself?</rainbow>"))
} else if (player.world.maxHeight < location.y) {
location.y = player.world.maxHeight.toDouble()
player.teleport(location)
player.sendComponent(MessageFormat.setPrefix(MessageFormat.setPrimaryColor("You can't go that high!")))
}
}
@EventHandler
fun onPlayerMoveLaunchPad(event: PlayerMoveEvent) {
val player = event.getPlayer()
val world: World? = plugin.server.getWorld("world")
if (world == null) return
val playerBlock = world.getBlockAt(player.location)
val playerId = player.uniqueId
val currentTime = System.currentTimeMillis()
if (plugin.jumpPadCooldowns.containsKey(playerId)) {
val lastActivation: Long = plugin.jumpPadCooldowns.get(playerId)!!
if (currentTime - lastActivation < 1000) return
}
if (playerBlock.type === Material.MANGROVE_PRESSURE_PLATE) {
plugin.jumpPadCooldowns.put(playerId, currentTime)
if (player.gameMode == GameMode.ADVENTURE && player.inventory.heldItemSlot == 7) {
player.velocity = Vector(0, 1, 0)
player.playSound(player.location, Sound.ENTITY_FIREWORK_ROCKET_BLAST, 2.0f, 1.0f)
player.sendComponent(MessageFormat.setPrefix("<rainbow>Hacks!?!?!?!</rainbow>"))
val scheduler = plugin.server.scheduler
scheduler.runTaskLater(plugin, Runnable {
player.velocity = Vector(0, 2, 0)
player.playSound(player.location, Sound.ENTITY_FIREWORK_ROCKET_BLAST, 2.0f, 1.0f)
}, 10)
scheduler.runTaskLater(plugin, Runnable {
player.velocity = Vector(0, 2, 0)
player.playSound(player.location, Sound.ENTITY_FIREWORK_ROCKET_BLAST, 2.0f, 1.0f)
}, 20)
scheduler.runTaskLater(plugin, Runnable {
player.velocity = Vector(0, 2, 0)
player.playSound(player.location, Sound.ENTITY_FIREWORK_ROCKET_BLAST, 2.0f, 1.0f)
}, 30)
scheduler.runTaskLater(plugin, Runnable {
player.velocity = Vector(0, 5, 0)
player.playSound(player.location, Sound.ENTITY_FIREWORK_ROCKET_BLAST, 2.0f, 1.25f)
}, 40)
return
}
player.velocity = Vector(0.0, 0.75, 1.5)
player.playSound(player.location, Sound.ENTITY_BAT_TAKEOFF, 1.0f, 1.0f)
}
}
@EventHandler
fun onPlayerMoveDoubleJump(event: PlayerMoveEvent) {
val player = event.getPlayer()
if (!player.isFlying && player.gameMode == GameMode.ADVENTURE) {
if (player.inventory.heldItemSlot == 7) {
player.allowFlight = false
return
}
player.allowFlight = true
}
}
}

View File

@@ -0,0 +1,13 @@
package xyz.lncvrt.chaosmclobby.event
import org.bukkit.GameMode
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.player.PlayerSwapHandItemsEvent
class PlayerSwapHandItemsListener : Listener {
@EventHandler
fun onPlayerSwapHandItemsEvent(event: PlayerSwapHandItemsEvent) {
if (event.getPlayer().gameMode != GameMode.CREATIVE) event.isCancelled = true
}
}

View File

@@ -0,0 +1,26 @@
package xyz.lncvrt.chaosmclobby.event
import org.bukkit.GameMode
import org.bukkit.Sound
import org.bukkit.entity.Player
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.player.PlayerToggleFlightEvent
class PlayerToggleFlightListener : Listener {
@EventHandler
fun onPlayerToggleFlightEvent(event: PlayerToggleFlightEvent) {
val player: Player = event.getPlayer()
if (!player.isFlying && player.gameMode == GameMode.ADVENTURE && player.inventory.heldItemSlot != 7) {
val direction = player.location.direction.setY(0).normalize()
event.isCancelled = true
player.allowFlight = false
direction.multiply(1.75f)
direction.setY(1.25f)
player.velocity = direction
player.playSound(player.location, Sound.ENTITY_ENDER_DRAGON_FLAP, 1.0f, 1.0f)
}
}
}

View File

@@ -0,0 +1,29 @@
package xyz.lncvrt.chaosmclobby.event
import net.kyori.adventure.text.minimessage.MiniMessage
import org.bukkit.Material
import org.bukkit.entity.Firework
import org.bukkit.entity.Player
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.entity.ProjectileLaunchEvent
import org.bukkit.inventory.ItemStack
import xyz.lncvrt.chaosmcapi.utils.MessageFormat
class ProjectileLaunchListener() : Listener {
@EventHandler
fun onProjectileLaunchEvent(event: ProjectileLaunchEvent) {
val firework = event.getEntity()
val player = firework.shooter
if (firework is Firework) {
if (player is Player) {
val fireworkItem = ItemStack(Material.FIREWORK_ROCKET)
val fireworkMeta = fireworkItem.itemMeta
fireworkMeta.displayName(MiniMessage.miniMessage().deserialize(MessageFormat.setPrimaryColor("<italic:false>Elytra ${MessageFormat.setSecondaryColor("(Fly around the lobby!)")}</italic>")))
fireworkItem.setItemMeta(fireworkMeta)
player.inventory.setItem(7, fireworkItem)
player.setCooldown(fireworkItem.type, 20)
}
}
}
}