diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..53c9a3c --- /dev/null +++ b/.gitignore @@ -0,0 +1,32 @@ +# ---> Java +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +replay_pid* + +# idea +.idea/* +# build sources +target/* +# spigot test server +spigot/* diff --git a/LICENSE b/LICENSE index 8e79163..f372bf8 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2024 sh-edraft.de +Copyright (c) 2023 sh-edraft.de Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: diff --git a/README.md b/README.md index f71a68c..0d60cf7 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,26 @@ -# drunken_miner +# spigot_ontime_handler +Spigot plugin to send Minecraft derivates to OnMemberJoin, OnMemberRemove & OnMessage to the KDB-API to be processed +accordingly + +## Execute + +### Install dependencies: + +Install ```spigot server``` in folder ```./spigot``` first!! + +```bash +mvn install +``` + +### Build and Run the plugin: + +```bash +./run.sh +``` + +### Build only: + +```bash +./build.sh +``` \ No newline at end of file diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..0c35637 --- /dev/null +++ b/build.sh @@ -0,0 +1 @@ +mvn package -f pom.xml \ No newline at end of file diff --git a/drunken_miner_spigot.iml b/drunken_miner_spigot.iml new file mode 100644 index 0000000..665aa89 --- /dev/null +++ b/drunken_miner_spigot.iml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + SPIGOT + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..05dd9df --- /dev/null +++ b/pom.xml @@ -0,0 +1,130 @@ + + + 4.0.0 + + drunken_miner + de.sh-edraft + 1.0-SNAPSHOT + jar + + drunken_miner + + + UTF-8 + official + 1.8 + + + + + spigot-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + + + + org.spigotmc + spigot-api + 1.21.1-R0.1-SNAPSHOT + provided + + + org.jetbrains.kotlin + kotlin-test-junit5 + 1.7.21 + test + + + org.junit.jupiter + junit-jupiter-engine + 5.8.2 + test + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + 1.7.21 + + + org.jetbrains.kotlin + kotlin-compiler + 1.7.21 + + + org.json + json + 20220924 + + + com.google.okhttp + okhttp + 20120626 + + + + + src/main/kotlin + src/test/kotlin + + + org.jetbrains.kotlin + kotlin-maven-plugin + 1.7.21 + + + compile + compile + + compile + + + + test-compile + test-compile + + test-compile + + + + + + org.codehaus.mojo + exec-maven-plugin + 1.6.0 + + OntimeHandlerPlugin + + + + org.apache.maven.plugins + maven-compiler-plugin + + 11 + 11 + + + + maven-assembly-plugin + + + package + + single + + + + + + jar-with-dependencies + + ${project.artifactId}-${project.version} + false + + + + + + \ No newline at end of file diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..b86da72 --- /dev/null +++ b/run.sh @@ -0,0 +1,5 @@ +bash build.sh +cp target/drunken_miner-*-SNAPSHOT.jar spigot/plugins +cd spigot +export PLUGIN_ENVIRONMENT=development +java -Xms1G -Xmx8G -jar spigot.jar --nogui \ No newline at end of file diff --git a/src/main/kotlin/de/sh_edraft/DrunkenMiner.kt b/src/main/kotlin/de/sh_edraft/DrunkenMiner.kt new file mode 100644 index 0000000..b451095 --- /dev/null +++ b/src/main/kotlin/de/sh_edraft/DrunkenMiner.kt @@ -0,0 +1,47 @@ +package de.sh_edraft + +import de.sh_edraft.commands.DebugCommand +import de.sh_edraft.commands.DifficultyCommand +import de.sh_edraft.commands.DisableCommand +import de.sh_edraft.commands.EnableCommand +import de.sh_edraft.events.BlockListener +import de.sh_edraft.events.DimensionListener +import de.sh_edraft.events.EntityListener +import de.sh_edraft.events.PlayerListener +import de.sh_edraft.service.Barkeeper +import org.bukkit.Bukkit +import org.bukkit.plugin.java.JavaPlugin + +open class DrunkenMiner() : JavaPlugin() { + + + private lateinit var barkeeper: Barkeeper + + override fun onEnable() { + logger.info("DrunkenMiner enabled :D") + + this.barkeeper = Barkeeper(logger) + this.barkeeper.enableDebug(true) + + server.pluginManager.registerEvents(BlockListener(barkeeper), this) + server.pluginManager.registerEvents(PlayerListener(barkeeper), this) + server.pluginManager.registerEvents(DimensionListener(barkeeper), this) + server.pluginManager.registerEvents(EntityListener(barkeeper), this) + getCommand("dmDifficulty")?.setExecutor(DifficultyCommand(barkeeper)) + getCommand("dmDebug")?.setExecutor(DebugCommand(barkeeper)) + getCommand("dmEnable")?.setExecutor(EnableCommand(barkeeper)) + getCommand("dmDisable")?.setExecutor(DisableCommand(barkeeper)) + } + + override fun onDisable() { + try { + for (player in Bukkit.getOnlinePlayers()) { + logger.info("Logout player ${player.displayName}") + } + } catch (ex: Exception) { + logger.severe(ex.message) + } + + logger.info("DrunkenMiner disabled :(") + } +} \ No newline at end of file diff --git a/src/main/kotlin/de/sh_edraft/commands/debug.kt b/src/main/kotlin/de/sh_edraft/commands/debug.kt new file mode 100644 index 0000000..b350272 --- /dev/null +++ b/src/main/kotlin/de/sh_edraft/commands/debug.kt @@ -0,0 +1,18 @@ +package de.sh_edraft.commands + +import de.sh_edraft.service.Barkeeper +import org.bukkit.command.Command +import org.bukkit.command.CommandExecutor +import org.bukkit.command.CommandSender + +class DebugCommand(private val barkeeper: Barkeeper) : CommandExecutor { + override fun onCommand(sender: CommandSender, command: Command, label: String, args: Array): Boolean { + if (!sender.isOp) { + sender.sendMessage("Permission denied") + return false + } + this.barkeeper.enableDebug(!this.barkeeper.debug) + sender.sendMessage("Debugger set to " + this.barkeeper.debug.toString()) + return true + } +} \ No newline at end of file diff --git a/src/main/kotlin/de/sh_edraft/commands/difficulty.kt b/src/main/kotlin/de/sh_edraft/commands/difficulty.kt new file mode 100644 index 0000000..bb1895f --- /dev/null +++ b/src/main/kotlin/de/sh_edraft/commands/difficulty.kt @@ -0,0 +1,52 @@ +package de.sh_edraft.commands + +import de.sh_edraft.model.Difficulty +import de.sh_edraft.service.Barkeeper +import org.bukkit.command.Command +import org.bukkit.command.CommandExecutor +import org.bukkit.command.CommandSender + + +class DifficultyCommand(private val barkeeper: Barkeeper) : CommandExecutor { + override fun onCommand(sender: CommandSender, command: Command, label: String, args: Array): Boolean { + if (!sender.isOp) { + sender.sendMessage("Permission denied") + } + + if (args.isEmpty()) { + sender.sendMessage("Usage: /mycommand ") + return true + } + + val arg = args[0].lowercase() + + when (arg) { + "comfy" -> { + sender.sendMessage("You selected Comfy!") + this.barkeeper.setDifficulty(Difficulty.Comfy) + } + "casual" -> { + sender.sendMessage("You selected Casual!") + this.barkeeper.setDifficulty(Difficulty.Casual) + } + "alcoholic" -> { + sender.sendMessage("You selected Alcoholic!") + this.barkeeper.setDifficulty(Difficulty.Alcoholic) + } + "1" -> { + sender.sendMessage("You selected Comfy!") + this.barkeeper.setDifficulty(Difficulty.Comfy) + } + "2" -> { + sender.sendMessage("You selected Casual!") + this.barkeeper.setDifficulty(Difficulty.Casual) + } + "3" -> { + sender.sendMessage("You selected Alcoholic!") + this.barkeeper.setDifficulty(Difficulty.Alcoholic) + } + else -> sender.sendMessage("Invalid argument! Use: Comfy(1), Casual(2), or Alcoholic(3).") + } + return true + } +} \ No newline at end of file diff --git a/src/main/kotlin/de/sh_edraft/commands/disable.kt b/src/main/kotlin/de/sh_edraft/commands/disable.kt new file mode 100644 index 0000000..9e0648d --- /dev/null +++ b/src/main/kotlin/de/sh_edraft/commands/disable.kt @@ -0,0 +1,18 @@ +package de.sh_edraft.commands + +import de.sh_edraft.service.Barkeeper +import org.bukkit.command.Command +import org.bukkit.command.CommandExecutor +import org.bukkit.command.CommandSender + +class DisableCommand(private val barkeeper: Barkeeper) : CommandExecutor { + override fun onCommand(sender: CommandSender, command: Command, label: String, args: Array): Boolean { + if (!sender.isOp) { + sender.sendMessage("Permission denied") + return false + } + this.barkeeper.disable() + sender.sendMessage("Disabled") + return true + } +} \ No newline at end of file diff --git a/src/main/kotlin/de/sh_edraft/commands/enable.kt b/src/main/kotlin/de/sh_edraft/commands/enable.kt new file mode 100644 index 0000000..ba12337 --- /dev/null +++ b/src/main/kotlin/de/sh_edraft/commands/enable.kt @@ -0,0 +1,18 @@ +package de.sh_edraft.commands + +import de.sh_edraft.service.Barkeeper +import org.bukkit.command.Command +import org.bukkit.command.CommandExecutor +import org.bukkit.command.CommandSender + +class EnableCommand(private val barkeeper: Barkeeper) : CommandExecutor { + override fun onCommand(sender: CommandSender, command: Command, label: String, args: Array): Boolean { + if (!sender.isOp) { + sender.sendMessage("Permission denied") + return false + } + this.barkeeper.enable() + sender.sendMessage("Enabled") + return true + } +} \ No newline at end of file diff --git a/src/main/kotlin/de/sh_edraft/events/BlockListener.kt b/src/main/kotlin/de/sh_edraft/events/BlockListener.kt new file mode 100644 index 0000000..a07edc6 --- /dev/null +++ b/src/main/kotlin/de/sh_edraft/events/BlockListener.kt @@ -0,0 +1,18 @@ +package de.sh_edraft.events + +import de.sh_edraft.service.Barkeeper +import org.bukkit.event.EventHandler +import org.bukkit.event.Listener +import org.bukkit.event.block.BlockBreakEvent + +class BlockListener( + private val barkeeper: Barkeeper +) : Listener { + @EventHandler + fun onBlockBreak(e: BlockBreakEvent) { + if (e.player.player == null) { + return; + } + this.barkeeper.order(e, e.player); + } +} \ No newline at end of file diff --git a/src/main/kotlin/de/sh_edraft/events/DimensionListener.kt b/src/main/kotlin/de/sh_edraft/events/DimensionListener.kt new file mode 100644 index 0000000..eec2fa7 --- /dev/null +++ b/src/main/kotlin/de/sh_edraft/events/DimensionListener.kt @@ -0,0 +1,32 @@ +package de.sh_edraft.events + +import de.sh_edraft.service.Barkeeper +import org.bukkit.Bukkit +import org.bukkit.event.EventHandler +import org.bukkit.event.Listener +import org.bukkit.event.block.BlockBreakEvent +import org.bukkit.event.entity.PlayerDeathEvent +import org.bukkit.event.player.PlayerJoinEvent +import org.bukkit.event.player.PlayerPortalEvent + +class DimensionListener( + private val barkeeper: Barkeeper +) : Listener { + + @EventHandler + fun onJoin(e: PlayerJoinEvent) { + if (e.player.player == null) { + return + } + this.barkeeper.sayHello(e.player) + this.barkeeper.order(e, e.player) + } + + @EventHandler + fun onJoin(e: PlayerPortalEvent) { + if (e.player.player == null) { + return + } + this.barkeeper.order(e, e.player) + } +} \ No newline at end of file diff --git a/src/main/kotlin/de/sh_edraft/events/EntityListener.kt b/src/main/kotlin/de/sh_edraft/events/EntityListener.kt new file mode 100644 index 0000000..d59831c --- /dev/null +++ b/src/main/kotlin/de/sh_edraft/events/EntityListener.kt @@ -0,0 +1,31 @@ +package de.sh_edraft.events + +import de.sh_edraft.service.Barkeeper +import org.bukkit.Bukkit +import org.bukkit.entity.EnderDragon +import org.bukkit.entity.Player +import org.bukkit.entity.Wither +import org.bukkit.event.EventHandler +import org.bukkit.event.Listener +import org.bukkit.event.block.BlockBreakEvent +import org.bukkit.event.entity.EntityDeathEvent +import org.bukkit.event.entity.PlayerDeathEvent +import org.bukkit.event.player.PlayerJoinEvent + +class EntityListener( + private val barkeeper: Barkeeper +) : Listener { + + @EventHandler + fun onDeath(e: EntityDeathEvent) { + // filter if entity is not a dragon or wither + if (e.entity !is EnderDragon && e.entity !is Wither) { + return + } + + if (e.entity.killer == null || e.entity.killer !is Player) { + return + } + this.barkeeper.order(e, e.entity.killer as Player) + } +} \ No newline at end of file diff --git a/src/main/kotlin/de/sh_edraft/events/PlayerListener.kt b/src/main/kotlin/de/sh_edraft/events/PlayerListener.kt new file mode 100644 index 0000000..ee8edb8 --- /dev/null +++ b/src/main/kotlin/de/sh_edraft/events/PlayerListener.kt @@ -0,0 +1,30 @@ +package de.sh_edraft.events + +import de.sh_edraft.service.Barkeeper +import org.bukkit.Bukkit +import org.bukkit.entity.Player +import org.bukkit.event.EventHandler +import org.bukkit.event.Listener +import org.bukkit.event.block.BlockBreakEvent +import org.bukkit.event.entity.EntityDamageEvent +import org.bukkit.event.entity.PlayerDeathEvent +import org.bukkit.event.player.PlayerJoinEvent + +class PlayerListener( + private val barkeeper: Barkeeper +) : Listener { + + @EventHandler + fun onDamage(e: EntityDamageEvent) { + if (e.entity !is Player) { + return + } + this.barkeeper.order(e, e.entity as Player); + } + + @EventHandler + fun onDeath(e: PlayerDeathEvent) { + val player = e.entity.player ?: return; + this.barkeeper.order(e, player); + } +} \ No newline at end of file diff --git a/src/main/kotlin/de/sh_edraft/model/Difficulty.kt b/src/main/kotlin/de/sh_edraft/model/Difficulty.kt new file mode 100644 index 0000000..b4bc80b --- /dev/null +++ b/src/main/kotlin/de/sh_edraft/model/Difficulty.kt @@ -0,0 +1,7 @@ +package de.sh_edraft.model + +enum class Difficulty { + Comfy, + Casual, + Alcoholic +} \ No newline at end of file diff --git a/src/main/kotlin/de/sh_edraft/service/Barkeeper.kt b/src/main/kotlin/de/sh_edraft/service/Barkeeper.kt new file mode 100644 index 0000000..1bb8d9b --- /dev/null +++ b/src/main/kotlin/de/sh_edraft/service/Barkeeper.kt @@ -0,0 +1,137 @@ +package de.sh_edraft.service + +import de.sh_edraft.model.Difficulty +import org.bukkit.entity.Player +import org.bukkit.event.Event +import org.bukkit.event.block.BlockBreakEvent +import org.bukkit.event.entity.EntityDeathEvent +import java.util.logging.Logger + + +enum class AudienceType { + SELF, + ALL +} + +data class Serving( + val amount: Int, + val audience: AudienceType +) + +class Barkeeper( + private val logger: Logger +) { + var debug: Boolean = false + private var enabled: Boolean = false + private var difficulty = Difficulty.Comfy + + val drinksByEvent = mapOf( + "EntityDamageEvent" to Serving(amount = 1, audience = AudienceType.SELF), + "PlayerDeathEvent" to Serving(amount = 1, audience = AudienceType.ALL), + "PlayerJoinEvent" to Serving(amount = 1, audience = AudienceType.ALL), + "entityOnDeath" to mapOf( + "Wither" to Serving(amount = 2, audience = AudienceType.ALL), + "EnderDragon" to Serving(amount = 3, audience = AudienceType.ALL) + ), + "blockBreak" to mapOf( + "ANCIENT_DEBRIS" to Serving(amount = 2, audience = AudienceType.ALL), + + "LEGACY_DIAMOND_ORE" to Serving(amount = 1, audience = AudienceType.ALL), + "DEEPSLATE_DIAMOND_ORE" to Serving(amount = 1, audience = AudienceType.ALL), + "DIAMOND_ORE" to Serving(amount = 1, audience = AudienceType.ALL), + + "LEGACY_IRON_ORE" to Serving(amount = 1, audience = AudienceType.SELF), + "DEEPSLATE_IRON_ORE" to Serving(amount = 1, audience = AudienceType.SELF), + "IRON_ORE" to Serving(amount = 1, audience = AudienceType.SELF), + + "LEGACY_COAL_ORE" to Serving(amount = 1, audience = AudienceType.SELF), + "DEEPSLATE_COAL_ORE" to Serving(amount = 1, audience = AudienceType.SELF), + "COAL_ORE" to Serving(amount = 1, audience = AudienceType.SELF), + + "LEGACY_GOLD_ORE" to Serving(amount = 1, audience = AudienceType.SELF), + "DEEPSLATE_GOLD_ORE" to Serving(amount = 1, audience = AudienceType.SELF), + "GOLD_ORE" to Serving(amount = 1, audience = AudienceType.SELF), + + "LEGACY_EMERALD_ORE" to Serving(amount = 1, audience = AudienceType.SELF), + "DEEPSLATE_EMERALD_ORE" to Serving(amount = 1, audience = AudienceType.SELF), + "EMERALD_ORE" to Serving(amount = 1, audience = AudienceType.SELF), + ), + ) + + fun enableDebug(debug: Boolean) { + this.debug = debug; + } + + fun enable() { + this.enabled = true; + } + + fun disable() { + this.enabled = false; + } + + fun sayHello(p: Player) { + p.sendMessage("Hello, I'm the Barkeeper! Hope you have a good time here :D\nHave plenty of drinks ready") + } + + fun setDifficulty(difficulty: Difficulty) { + this.difficulty = difficulty; + } + + fun order(sourceEvent: Event, sourcePlayer: Player) { + if (!this.enabled) return; + val serving = getDrinkAmount(sourceEvent) ?: return; + + val toServeDrinkAmount = serving.amount * (difficulty.ordinal + 1); + var message = "Drink $toServeDrinkAmount" + + if (serving.audience == AudienceType.SELF) { + val selfMessage = message + val allMessage = "Player ${sourcePlayer.displayName} drinks $toServeDrinkAmount" + + sourcePlayer.server.onlinePlayers.forEach { player -> + if (player == sourcePlayer) { + this.sendMessage(sourceEvent, player, selfMessage) + return + } + this.sendMessage(sourceEvent, player, allMessage) + } + return + } + + message = "Everyone has to drink $toServeDrinkAmount" + sourcePlayer.server.onlinePlayers.forEach { player -> + this.sendMessage(sourceEvent, player, message) + } + } + + private fun sendMessage(sourceEvent: Event, player: Player, message: String) { + var toSendMessage = message + if (debug) { + toSendMessage = sourceEvent.eventName + " $message" + } + player.sendMessage(toSendMessage) + } + + private fun getDrinkAmount(event: Event): Serving? { + if (event is BlockBreakEvent) { + logger.info("BlockBreakEvent " + event.block.type) + val drinkByEvent = drinksByEvent["blockBreak"] ?: return null; + val drink = (drinkByEvent as Map)[event.block.type.name] ?: return null; + return drink; + } + + if (event is EntityDeathEvent) { + logger.info("EntityDeathEvent " + event.entity.name) + val drinkByEvent = drinksByEvent["entityOnDeath"] ?: return null; + val drink = (drinkByEvent as Map)[event.entity.name] ?: return null; + return drink; + } + + val drinkByEvent = drinksByEvent[event.eventName] ?: return null; + if (drinkByEvent is Serving) { + return drinkByEvent; + } + return null; + } +} \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..56d6259 --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,22 @@ +name: sh_edraft.DrunkenMiner +version: 1.0 +api-version: '1.20.5' +main: de.sh_edraft.DrunkenMiner + +commands: + dmDebug: + description: 'DrunkenMiner toggle debug' + usage: / + + dmDifficulty: + description: 'DrunkenMiner difficulty' + usage: "Usage: / < Comfy(1) | Casual(2) | Alcoholic(3)>" + + + dmEnable: + description: 'DrunkenMiner enable' + usage: / + + dmDisable: + description: 'DrunkenMiner disable' + usage: / \ No newline at end of file