mirror of
https://github.com/5vl/Skymining.git
synced 2025-05-24 01:47:03 +00:00
Added the plugin itself.
This commit is contained in:
parent
0753070703
commit
ffa76a87df
127
pom.xml
Normal file
127
pom.xml
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<groupId>com.fivevl</groupId>
|
||||||
|
<artifactId>skymines</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
|
<name>SkyMines</name>
|
||||||
|
|
||||||
|
<description>Skymines but kotlin</description>
|
||||||
|
<properties>
|
||||||
|
<java.version>1.8</java.version>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
<kotlin.version>1.6.10</kotlin.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-shade-plugin</artifactId>
|
||||||
|
<version>3.2.4</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>shade</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<createDependencyReducedPom>false</createDependencyReducedPom>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.jetbrains.kotlin</groupId>
|
||||||
|
<artifactId>kotlin-maven-plugin</artifactId>
|
||||||
|
<version>${kotlin.version}</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>compile</id>
|
||||||
|
<phase>compile</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>compile</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
<execution>
|
||||||
|
<id>test-compile</id>
|
||||||
|
<phase>test-compile</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>test-compile</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
<configuration>
|
||||||
|
<jvmTarget>1.8</jvmTarget>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>3.8.1</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>compile</id>
|
||||||
|
<phase>compile</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>compile</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
<execution>
|
||||||
|
<id>testCompile</id>
|
||||||
|
<phase>test-compile</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>testCompile</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
<configuration>
|
||||||
|
<source>${java.version}</source>
|
||||||
|
<target>${java.version}</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
<resources>
|
||||||
|
<resource>
|
||||||
|
<directory>src/main/resources</directory>
|
||||||
|
<filtering>true</filtering>
|
||||||
|
</resource>
|
||||||
|
</resources>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<id>papermc-repo</id>
|
||||||
|
<url>https://papermc.io/repo/repository/maven-public/</url>
|
||||||
|
</repository>
|
||||||
|
<repository>
|
||||||
|
<id>sonatype</id>
|
||||||
|
<url>https://oss.sonatype.org/content/groups/public/</url>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.papermc.paper</groupId>
|
||||||
|
<artifactId>paper-api</artifactId>
|
||||||
|
<version>1.17.1-R0.1-SNAPSHOT</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jetbrains.kotlin</groupId>
|
||||||
|
<artifactId>kotlin-stdlib-jdk8</artifactId>
|
||||||
|
<version>${kotlin.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jetbrains.kotlin</groupId>
|
||||||
|
<artifactId>kotlin-test-junit</artifactId>
|
||||||
|
<version>${kotlin.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</project>
|
25
src/main/java/com/fivevl/skymines/Compressors.kt
Normal file
25
src/main/java/com/fivevl/skymines/Compressors.kt
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
package com.fivevl.skymines
|
||||||
|
|
||||||
|
import org.bukkit.Material
|
||||||
|
import org.bukkit.inventory.ItemStack
|
||||||
|
|
||||||
|
enum class Compressors(val item: ItemStack, val compress: Items) {
|
||||||
|
STONE_COMPRESSOR(getCompressor("&7Stone"), Items.COMPRESSED_STONE),
|
||||||
|
COAL_COMPRESSOR(getCompressor("&8Coal"), Items.COMPRESSED_COAL),
|
||||||
|
GOLD_COMPRESSOR(getCompressor("&6Gold"), Items.COMPRESSED_GOLD),
|
||||||
|
IRON_COMPRESSOR(getCompressor("&7Iron"), Items.COMPRESSED_IRON),
|
||||||
|
DIAMOND_COMPRESSOR(getCompressor("&bDiamond"), Items.COMPRESSED_DIAMOND),
|
||||||
|
EMERALD_COMPRESSOR(getCompressor("&aEmerald"), Items.COMPRESSED_EMERALD),
|
||||||
|
REDSTONE_COMPRESSOR(getCompressor("&cRedstone"), Items.COMPRESSED_REDSTONE),
|
||||||
|
LAPIS_COMPRESSOR(getCompressor("&3Lapis"), Items.COMPRESSED_LAPIS),
|
||||||
|
ICE_COMPRESSOR(getCompressor("&bIce"), Items.COMPRESSED_ICE),
|
||||||
|
SNOW_COMPRESSOR(getCompressor("&fSnow"), Items.COMPRESSED_SNOW)
|
||||||
|
}
|
||||||
|
@Suppress("deprecation")
|
||||||
|
private fun getCompressor(name: String): ItemStack {
|
||||||
|
val item = ItemStack(Material.DISPENSER)
|
||||||
|
val meta = item.itemMeta
|
||||||
|
meta.setDisplayName(Utils.hex("$name Autocompressor"))
|
||||||
|
item.itemMeta = meta
|
||||||
|
return item
|
||||||
|
}
|
30
src/main/java/com/fivevl/skymines/Items.kt
Normal file
30
src/main/java/com/fivevl/skymines/Items.kt
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
package com.fivevl.skymines
|
||||||
|
|
||||||
|
import org.bukkit.Material
|
||||||
|
import org.bukkit.enchantments.Enchantment
|
||||||
|
import org.bukkit.inventory.ItemFlag
|
||||||
|
import org.bukkit.inventory.ItemStack
|
||||||
|
|
||||||
|
enum class Items(val item: ItemStack) {
|
||||||
|
COMPRESSED_STONE(getCompressedItem(Material.STONE, "&7Compressed Stone")),
|
||||||
|
COMPRESSED_COAL(getCompressedItem(Material.COAL, "&8Compressed Coal")),
|
||||||
|
COMPRESSED_GOLD(getCompressedItem(Material.GOLD_INGOT, "&6Compressed Gold")),
|
||||||
|
COMPRESSED_IRON(getCompressedItem(Material.IRON_INGOT, "&7Compressed Iron")),
|
||||||
|
COMPRESSED_DIAMOND(getCompressedItem(Material.DIAMOND, "&bCompressed Diamond")),
|
||||||
|
COMPRESSED_EMERALD(getCompressedItem(Material.EMERALD, "&aCompressed Emerald")),
|
||||||
|
COMPRESSED_REDSTONE(getCompressedItem(Material.REDSTONE, "&cCompressed Redstone")),
|
||||||
|
COMPRESSED_LAPIS(getCompressedItem(Material.LAPIS_LAZULI, "&3Compressed Lapis")),
|
||||||
|
COMPRESSED_ICE(getCompressedItem(Material.PACKED_ICE, "&bCompressed Ice")),
|
||||||
|
COMPRESSED_SNOW(getCompressedItem(Material.SNOW_BLOCK, "&fCompressed Snow"))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Suppress("deprecation")
|
||||||
|
private fun getCompressedItem(mat: Material, name: String): ItemStack {
|
||||||
|
val item = ItemStack(mat)
|
||||||
|
val meta = item.itemMeta
|
||||||
|
meta.setDisplayName(Utils.hex(name))
|
||||||
|
meta.addEnchant(Enchantment.DURABILITY, 1, true)
|
||||||
|
meta.addItemFlags(ItemFlag.HIDE_ENCHANTS)
|
||||||
|
item.itemMeta = meta
|
||||||
|
return item
|
||||||
|
}
|
125
src/main/java/com/fivevl/skymines/Main.kt
Normal file
125
src/main/java/com/fivevl/skymines/Main.kt
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
package com.fivevl.skymines
|
||||||
|
|
||||||
|
import com.fivevl.skymines.commands.CompressorCommand
|
||||||
|
import com.fivevl.skymines.commands.ResetMineCommand
|
||||||
|
import com.fivevl.skymines.commands.ScrollCommand
|
||||||
|
import com.fivevl.skymines.commands.SpawnCommand
|
||||||
|
import com.fivevl.skymines.listeners.*
|
||||||
|
import com.fivevl.skymines.tabcomplete.ResetMineTabComplete
|
||||||
|
import org.bukkit.Bukkit
|
||||||
|
import org.bukkit.Location
|
||||||
|
import org.bukkit.Material
|
||||||
|
import org.bukkit.World
|
||||||
|
import org.bukkit.configuration.ConfigurationSection
|
||||||
|
import org.bukkit.configuration.file.YamlConfiguration
|
||||||
|
import org.bukkit.plugin.java.JavaPlugin
|
||||||
|
import java.io.File
|
||||||
|
import java.io.IOException
|
||||||
|
import java.util.stream.Collectors
|
||||||
|
|
||||||
|
|
||||||
|
class Main : JavaPlugin() {
|
||||||
|
override fun onEnable() {
|
||||||
|
Utils.mainInstance = this
|
||||||
|
if (dataFolder.mkdir()) {
|
||||||
|
logger.info("Data folder created!")
|
||||||
|
}
|
||||||
|
createPlayerData()
|
||||||
|
registerMines()
|
||||||
|
registerCommands()
|
||||||
|
registerListeners()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun registerCommands() {
|
||||||
|
getCommand("resetmine")?.setExecutor(ResetMineCommand())
|
||||||
|
getCommand("resetmine")?.tabCompleter = ResetMineTabComplete()
|
||||||
|
getCommand("spawn")?.setExecutor(SpawnCommand())
|
||||||
|
getCommand("compressor")?.setExecutor(CompressorCommand())
|
||||||
|
getCommand("scroll")?.setExecutor(ScrollCommand())
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun registerListeners() {
|
||||||
|
val plm = Bukkit.getPluginManager()
|
||||||
|
plm.registerEvents(MineListener(), this)
|
||||||
|
plm.registerEvents(PlayerJoinListener(), this)
|
||||||
|
plm.registerEvents(PlayerMoveListener(), this)
|
||||||
|
plm.registerEvents(CommandBlock(), this)
|
||||||
|
plm.registerEvents(ClickListener(), this)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun createPlayerData() {
|
||||||
|
val file = File(dataFolder, "playerdata.yml")
|
||||||
|
try {
|
||||||
|
if (file.createNewFile()) {
|
||||||
|
logger.info("Created new playerdata.yml file.")
|
||||||
|
}
|
||||||
|
} catch (e: IOException) {
|
||||||
|
logger.info("Could not create new playerdata.yml file.")
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun registerMines() {
|
||||||
|
createMinesYaml()
|
||||||
|
val file = File(dataFolder, "mines.yml")
|
||||||
|
val yamlConfig = YamlConfiguration.loadConfiguration(file)
|
||||||
|
val minesList: List<ConfigurationSection?> =
|
||||||
|
yamlConfig.getConfigurationSection("")?.getKeys(false)?.stream()
|
||||||
|
?.map(yamlConfig::getConfigurationSection)?.collect(Collectors.toList()) as List<ConfigurationSection?>
|
||||||
|
for (sect in minesList) {
|
||||||
|
if (!sect!!.name.equals("ExampleMine", ignoreCase = true)) {
|
||||||
|
val world: World? = sect.getString("World")?.let { Bukkit.getWorld(it) }
|
||||||
|
val corner1 = sect.getConfigurationSection("Corner1")
|
||||||
|
val corner2 = sect.getConfigurationSection("Corner2")
|
||||||
|
assert(corner1 != null)
|
||||||
|
val loc1 = Location(world, corner1!!.getInt("x").toDouble(), corner1.getInt("y").toDouble(), corner1.getInt("z").toDouble()
|
||||||
|
)
|
||||||
|
assert(corner2 != null)
|
||||||
|
val loc2 = Location(world, corner2!!.getInt("x").toDouble(), corner2.getInt("y").toDouble(), corner2.getInt("z").toDouble()
|
||||||
|
)
|
||||||
|
val mat1 = sect.getString("75PercentOfMine")?.let { Material.matchMaterial(it) }
|
||||||
|
val mat2 = sect.getString("25PercentOfMine")?.let { Material.matchMaterial(it) }
|
||||||
|
Utils.mines[sect.name] = Mine(loc1, loc2, mat1!!, mat2!!)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
autoResetMines()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun autoResetMines() {
|
||||||
|
val sched = Bukkit.getScheduler()
|
||||||
|
sched.scheduleSyncRepeatingTask(this, {
|
||||||
|
if (!Bukkit.getOnlinePlayers().isEmpty()) {
|
||||||
|
for (mine in Utils.mines.values) {
|
||||||
|
mine.resetMine()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, 0, (15 * 20).toLong())
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun createMinesYaml() {
|
||||||
|
val file = File(dataFolder, "mines.yml")
|
||||||
|
try {
|
||||||
|
if (file.createNewFile()) {
|
||||||
|
logger.info("Created new mines.yml file.")
|
||||||
|
val yamlConfig = YamlConfiguration.loadConfiguration(file)
|
||||||
|
val exampleMineSect = yamlConfig.createSection("ExampleMine")
|
||||||
|
exampleMineSect["World"] = "world"
|
||||||
|
val corner1Sect = exampleMineSect.createSection("Corner1")
|
||||||
|
corner1Sect["x"] = 0
|
||||||
|
corner1Sect["y"] = 80
|
||||||
|
corner1Sect["z"] = 0
|
||||||
|
val corner2Sect = exampleMineSect.createSection("Corner2")
|
||||||
|
corner2Sect["x"] = 20
|
||||||
|
corner2Sect["y"] = 100
|
||||||
|
corner2Sect["z"] = 20
|
||||||
|
exampleMineSect["75PercentOfMine"] = "STONE"
|
||||||
|
exampleMineSect["25PercentOfMine"] = "COBBLESTONE"
|
||||||
|
yamlConfig.save(file)
|
||||||
|
}
|
||||||
|
} catch (e: IOException) {
|
||||||
|
logger.severe("Could not create new mines.yml file.")
|
||||||
|
e.printStackTrace()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
31
src/main/java/com/fivevl/skymines/Mine.kt
Normal file
31
src/main/java/com/fivevl/skymines/Mine.kt
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
package com.fivevl.skymines
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit
|
||||||
|
import org.bukkit.Location
|
||||||
|
import org.bukkit.Material
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
|
||||||
|
class Mine(private var loc1: Location, private var loc2: Location, private var b75: Material, private var b25: Material) {
|
||||||
|
fun resetMine() {
|
||||||
|
val rand = Random()
|
||||||
|
for (x in loc1.blockX.coerceAtMost(loc2.blockX)..loc1.blockX.coerceAtLeast(loc2.blockX)) {
|
||||||
|
for (y in loc1.blockY.coerceAtMost(loc2.blockY)..loc1.blockY.coerceAtLeast(loc2.blockY)) {
|
||||||
|
for (z in loc1.blockZ.coerceAtMost(loc2.blockZ)..loc1.blockZ.coerceAtLeast(loc2.blockZ)) {
|
||||||
|
for (p in Bukkit.getOnlinePlayers()) {
|
||||||
|
val pLoc = p.location
|
||||||
|
if (pLoc.blockX == x && pLoc.blockY == y && pLoc.blockZ == z) {
|
||||||
|
p.teleport(pLoc.add(0.0, 1.0, 0.0))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val block = rand.nextInt(100)
|
||||||
|
if (block < 75) {
|
||||||
|
Location(Bukkit.getWorld("world"), x.toDouble(), y.toDouble(), z.toDouble()).block.type = b75
|
||||||
|
} else {
|
||||||
|
Location(Bukkit.getWorld("world"), x.toDouble(), y.toDouble(), z.toDouble()).block.type = b25
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
23
src/main/java/com/fivevl/skymines/Scrolls.kt
Normal file
23
src/main/java/com/fivevl/skymines/Scrolls.kt
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
package com.fivevl.skymines
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit
|
||||||
|
import org.bukkit.Location
|
||||||
|
import org.bukkit.Material
|
||||||
|
import org.bukkit.enchantments.Enchantment
|
||||||
|
import org.bukkit.inventory.ItemFlag
|
||||||
|
import org.bukkit.inventory.ItemStack
|
||||||
|
|
||||||
|
enum class Scrolls(val item: ItemStack, val location: Location) {
|
||||||
|
ICE_SCROLL(getScroll("Ice"), Location(Bukkit.getWorld("world"), -165.5, 82.0, -52.5, 0F, 0F)),
|
||||||
|
DESERT_SCROLL(getScroll("Desert"), Location(Bukkit.getWorld("world"), -256.5, 92.0, -78.5, 180F, 0F))
|
||||||
|
}
|
||||||
|
@Suppress("deprecation")
|
||||||
|
fun getScroll(name: String): ItemStack {
|
||||||
|
val item = ItemStack(Material.PAPER)
|
||||||
|
val meta = item.itemMeta
|
||||||
|
meta.setDisplayName(Utils.hex("&bTravel Scroll - $name"))
|
||||||
|
meta.addEnchant(Enchantment.DURABILITY, 1, true)
|
||||||
|
meta.addItemFlags(ItemFlag.HIDE_ENCHANTS)
|
||||||
|
item.itemMeta = meta
|
||||||
|
return item
|
||||||
|
}
|
28
src/main/java/com/fivevl/skymines/Utils.kt
Normal file
28
src/main/java/com/fivevl/skymines/Utils.kt
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
package com.fivevl.skymines
|
||||||
|
|
||||||
|
import net.md_5.bungee.api.ChatColor
|
||||||
|
import org.bukkit.Bukkit
|
||||||
|
import org.bukkit.Location
|
||||||
|
import java.util.regex.Pattern
|
||||||
|
|
||||||
|
|
||||||
|
object Utils {
|
||||||
|
var mainInstance: Main? = null
|
||||||
|
var mines: HashMap<String, Mine> = HashMap()
|
||||||
|
var spawn = Location(Bukkit.getWorld("world"), 0.5, 73.0, 0.5, 180F, 0F)
|
||||||
|
fun hex(s: String): String {
|
||||||
|
var s2 = s
|
||||||
|
val pattern = Pattern.compile("#[a-fA-F0-9]{6}")
|
||||||
|
var match = pattern.matcher(s)
|
||||||
|
while (match.find()) {
|
||||||
|
val color = s.substring(match.start(), match.end())
|
||||||
|
s2 = s2.replace(color, ChatColor.of(color).toString() + "")
|
||||||
|
match = pattern.matcher(s2)
|
||||||
|
}
|
||||||
|
return ChatColor.translateAlternateColorCodes('&', s2)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun hasCooldown(time: Long): Boolean {
|
||||||
|
return time < System.currentTimeMillis()
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
package com.fivevl.skymines.commands
|
||||||
|
|
||||||
|
import com.fivevl.skymines.Compressors
|
||||||
|
import com.fivevl.skymines.Utils
|
||||||
|
import org.bukkit.command.Command
|
||||||
|
import org.bukkit.command.CommandExecutor
|
||||||
|
import org.bukkit.command.CommandSender
|
||||||
|
import org.bukkit.entity.Player
|
||||||
|
import java.util.StringJoiner
|
||||||
|
|
||||||
|
class CompressorCommand : CommandExecutor {
|
||||||
|
override fun onCommand(sender: CommandSender, command: Command, label: String, args: Array<out String>): Boolean {
|
||||||
|
if (sender !is Player) {
|
||||||
|
sender.sendMessage(Utils.hex("&cYou can only run this command as a player!"))
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if (!sender.hasPermission("sm.bypass")) {
|
||||||
|
sender.sendMessage(Utils.hex("&cYou do not have permission to execute this command!"))
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if (args.size != 1) {
|
||||||
|
sender.sendMessage(Utils.hex("&cCorrect command usage: /compressor [compressor type]"))
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
val comp: Compressors?
|
||||||
|
try {
|
||||||
|
comp = Compressors.valueOf("${args[0].uppercase()}_COMPRESSOR")
|
||||||
|
} catch (ex: IllegalArgumentException) {
|
||||||
|
val joiner = StringJoiner("\n")
|
||||||
|
for (c in Compressors.values()) {
|
||||||
|
joiner.add("&c" + c.name.substring(0, c.name.length - 11))
|
||||||
|
}
|
||||||
|
sender.sendMessage(Utils.hex("&cThat is not a valid compressor! \n&cCorrect compressors: \n${joiner}"))
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
sender.inventory.addItem(comp.item)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,45 @@
|
|||||||
|
package com.fivevl.skymines.commands
|
||||||
|
|
||||||
|
import org.bukkit.command.Command
|
||||||
|
import org.bukkit.command.CommandExecutor
|
||||||
|
import org.bukkit.command.CommandSender
|
||||||
|
import org.bukkit.entity.Player
|
||||||
|
import com.fivevl.skymines.Utils
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
|
||||||
|
class ResetMineCommand : CommandExecutor {
|
||||||
|
private val resetMineCooldown = HashMap<Player, Long>()
|
||||||
|
override fun onCommand(sender: CommandSender, command: Command, label: String, args: Array<String>): Boolean {
|
||||||
|
if (!sender.hasPermission("sm.mines.reset")) {
|
||||||
|
sender.sendMessage(Utils.hex("&cYou do not have permission to execute this command!"))
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if (sender is Player && resetMineCooldown.containsKey(sender) && resetMineCooldown[sender]?.let {
|
||||||
|
Utils.hasCooldown(
|
||||||
|
it
|
||||||
|
)
|
||||||
|
} == true) {
|
||||||
|
sender.sendMessage(Utils.hex("&cThis command is on cooldown!"))
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
val mineNames = StringJoiner(" ")
|
||||||
|
for (name in Utils.mines.keys) {
|
||||||
|
mineNames.add(name)
|
||||||
|
}
|
||||||
|
if (args.size != 1) {
|
||||||
|
sender.sendMessage(Utils.hex("&cCorrect command usage: /resetmine [mine] \n&cAll correct mines: $mineNames"))
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if (!Utils.mines.containsKey(args[0])) {
|
||||||
|
sender.sendMessage(Utils.hex("&cThat is not a correct mine! \n&cAll correct mines: $mineNames"))
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
Utils.mines[args[0]]?.resetMine()
|
||||||
|
sender.sendMessage(Utils.hex("&aSuccessfully reset mine '" + args[0] + "'!"))
|
||||||
|
if (sender is Player && !sender.hasPermission("sm.mines.reset.bypass")) {
|
||||||
|
resetMineCooldown[sender] = System.currentTimeMillis() + (60 * 1000)
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
53
src/main/java/com/fivevl/skymines/commands/ScrollCommand.kt
Normal file
53
src/main/java/com/fivevl/skymines/commands/ScrollCommand.kt
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
package com.fivevl.skymines.commands
|
||||||
|
|
||||||
|
import com.fivevl.skymines.Scrolls
|
||||||
|
import com.fivevl.skymines.Utils
|
||||||
|
import org.bukkit.Bukkit
|
||||||
|
import org.bukkit.command.Command
|
||||||
|
import org.bukkit.command.CommandExecutor
|
||||||
|
import org.bukkit.command.CommandSender
|
||||||
|
import java.util.StringJoiner
|
||||||
|
|
||||||
|
class ScrollCommand : CommandExecutor {
|
||||||
|
override fun onCommand(sender: CommandSender, command: Command, label: String, args: Array<out String>): Boolean {
|
||||||
|
if (!sender.hasPermission("sm.givescroll")) {
|
||||||
|
sender.sendMessage(Utils.hex("&cYou do not have permission to execute this command!"))
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if (args.size != 3) {
|
||||||
|
sender.sendMessage(Utils.hex("&cCorrect command usage: /scroll [player] [scroll] [amount]"))
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
val gp = Bukkit.getPlayer(args[0])
|
||||||
|
if (gp == null) {
|
||||||
|
sender.sendMessage(Utils.hex("&cThat is not a correct player!"))
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
var scroll: Scrolls? = null
|
||||||
|
for (name in Scrolls.values()) {
|
||||||
|
if (args[1].uppercase() == name.toString().substring(0, name.toString().length - 7)) {
|
||||||
|
scroll = name
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (scroll == null) {
|
||||||
|
val join = StringJoiner("\n")
|
||||||
|
for (name in Scrolls.values()) {
|
||||||
|
join.add(name.toString().substring(0, name.toString().length - 7))
|
||||||
|
}
|
||||||
|
sender.sendMessage(Utils.hex("&cThat is not a correct scroll! Correct scrolls:\n$join"))
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
val amount: Int
|
||||||
|
try {
|
||||||
|
amount = args[2].toInt()
|
||||||
|
} catch (e: NumberFormatException) {
|
||||||
|
sender.sendMessage(Utils.hex("&cThat is not a correct amount!"))
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
val item = scroll.item
|
||||||
|
item.amount = amount
|
||||||
|
gp.inventory.addItem(item)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
24
src/main/java/com/fivevl/skymines/commands/SpawnCommand.kt
Normal file
24
src/main/java/com/fivevl/skymines/commands/SpawnCommand.kt
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
package com.fivevl.skymines.commands
|
||||||
|
|
||||||
|
import org.bukkit.command.Command
|
||||||
|
import org.bukkit.command.CommandExecutor
|
||||||
|
import org.bukkit.command.CommandSender
|
||||||
|
import org.bukkit.entity.Player
|
||||||
|
import com.fivevl.skymines.Utils
|
||||||
|
|
||||||
|
|
||||||
|
class SpawnCommand : CommandExecutor {
|
||||||
|
override fun onCommand(sender: CommandSender, command: Command, label: String, args: Array<String>): Boolean {
|
||||||
|
if (sender !is Player) {
|
||||||
|
sender.sendMessage(Utils.hex("&cOnly players may execute this command!"))
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if (!sender.hasPermission("sm.spawn")) {
|
||||||
|
sender.sendMessage(Utils.hex("&cYou do not have permission to execute this command!"))
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
sender.teleport(Utils.spawn)
|
||||||
|
sender.sendMessage(Utils.hex("&aYou have been teleported to spawn!"))
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
24
src/main/java/com/fivevl/skymines/listeners/ClickListener.kt
Normal file
24
src/main/java/com/fivevl/skymines/listeners/ClickListener.kt
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
package com.fivevl.skymines.listeners
|
||||||
|
|
||||||
|
import com.fivevl.skymines.Scrolls
|
||||||
|
import org.bukkit.event.EventHandler
|
||||||
|
import org.bukkit.event.Listener
|
||||||
|
import org.bukkit.event.player.PlayerInteractEvent
|
||||||
|
import org.bukkit.inventory.EquipmentSlot
|
||||||
|
|
||||||
|
class ClickListener : Listener {
|
||||||
|
@EventHandler
|
||||||
|
fun onClick(e: PlayerInteractEvent) {
|
||||||
|
if (e.hand != EquipmentSlot.HAND) return
|
||||||
|
val p = e.player
|
||||||
|
for (scroll in Scrolls.values()) {
|
||||||
|
if (p.inventory.itemInMainHand.isSimilar(scroll.item)) {
|
||||||
|
p.teleport(scroll.location)
|
||||||
|
val new = scroll.item
|
||||||
|
new.amount = p.inventory.itemInMainHand.amount - 1
|
||||||
|
p.inventory.setItemInMainHand(new)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
17
src/main/java/com/fivevl/skymines/listeners/CommandBlock.kt
Normal file
17
src/main/java/com/fivevl/skymines/listeners/CommandBlock.kt
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
package com.fivevl.skymines.listeners
|
||||||
|
|
||||||
|
import org.bukkit.event.EventHandler
|
||||||
|
import org.bukkit.event.Listener
|
||||||
|
import org.bukkit.event.player.PlayerCommandPreprocessEvent
|
||||||
|
|
||||||
|
class CommandBlock : Listener {
|
||||||
|
@EventHandler
|
||||||
|
fun onBlockedCommand(e: PlayerCommandPreprocessEvent) {
|
||||||
|
val cmds = arrayOf("/pl", "/bukkit:pl", "/minecraft:me", "/me")
|
||||||
|
for (s in cmds) {
|
||||||
|
if (e.message.startsWith(s)) {
|
||||||
|
e.isCancelled = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
155
src/main/java/com/fivevl/skymines/listeners/MineListener.kt
Normal file
155
src/main/java/com/fivevl/skymines/listeners/MineListener.kt
Normal file
@ -0,0 +1,155 @@
|
|||||||
|
package com.fivevl.skymines.listeners
|
||||||
|
|
||||||
|
import com.fivevl.skymines.Compressors
|
||||||
|
import org.bukkit.Material
|
||||||
|
import org.bukkit.enchantments.Enchantment
|
||||||
|
import org.bukkit.entity.Player
|
||||||
|
import org.bukkit.event.EventHandler
|
||||||
|
import org.bukkit.event.Listener
|
||||||
|
import org.bukkit.event.block.BlockBreakEvent
|
||||||
|
import org.bukkit.inventory.ItemStack
|
||||||
|
import com.fivevl.skymines.Utils
|
||||||
|
import java.util.*
|
||||||
|
import kotlin.math.pow
|
||||||
|
import kotlin.math.roundToInt
|
||||||
|
|
||||||
|
|
||||||
|
class MineListener : Listener {
|
||||||
|
@EventHandler
|
||||||
|
fun onMine(e: BlockBreakEvent) {
|
||||||
|
val p = e.player
|
||||||
|
if (p.inventory.firstEmpty() == -1) {
|
||||||
|
p.sendMessage(Utils.hex("&cYour inventory is full!"))
|
||||||
|
e.isCancelled = true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
val blockType = e.block.type
|
||||||
|
var cancel = false
|
||||||
|
when (p.inventory.itemInMainHand.type) {
|
||||||
|
Material.WOODEN_PICKAXE -> {
|
||||||
|
when (blockType) {
|
||||||
|
Material.STONE, Material.COBBLESTONE, Material.COAL_ORE, Material.COAL_BLOCK -> {}
|
||||||
|
else -> cancel = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Material.STONE_PICKAXE -> {
|
||||||
|
when (blockType) {
|
||||||
|
Material.STONE, Material.COBBLESTONE, Material.COAL_ORE, Material.COAL_BLOCK, Material.GOLD_ORE, Material.GOLD_BLOCK -> {}
|
||||||
|
else -> cancel = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Material.GOLDEN_PICKAXE -> {
|
||||||
|
when (blockType) {
|
||||||
|
Material.STONE, Material.COBBLESTONE, Material.COAL_ORE, Material.COAL_BLOCK, Material.GOLD_ORE, Material.GOLD_BLOCK, Material.IRON_ORE, Material.IRON_BLOCK -> {}
|
||||||
|
else -> cancel = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Material.IRON_PICKAXE -> {
|
||||||
|
when (blockType) {
|
||||||
|
Material.STONE, Material.COBBLESTONE, Material.COAL_ORE, Material.COAL_BLOCK, Material.GOLD_ORE, Material.GOLD_BLOCK, Material.IRON_ORE, Material.IRON_BLOCK, Material.DIAMOND_ORE, Material.DIAMOND_BLOCK -> {}
|
||||||
|
else -> cancel = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Material.DIAMOND_PICKAXE -> {
|
||||||
|
when (blockType) {
|
||||||
|
Material.STONE, Material.COBBLESTONE, Material.COAL_ORE, Material.COAL_BLOCK, Material.GOLD_ORE, Material.GOLD_BLOCK, Material.IRON_ORE, Material.IRON_BLOCK, Material.DIAMOND_ORE, Material.DIAMOND_BLOCK, Material.EMERALD_ORE, Material.EMERALD_BLOCK, Material.REDSTONE_ORE, Material.REDSTONE_BLOCK, Material.LAPIS_ORE, Material.LAPIS_BLOCK -> {}
|
||||||
|
else -> cancel = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Material.NETHERITE_PICKAXE -> {
|
||||||
|
cancel = blockType == Material.SNOW_BLOCK
|
||||||
|
}
|
||||||
|
Material.WOODEN_SHOVEL -> {
|
||||||
|
cancel = blockType != Material.SNOW_BLOCK
|
||||||
|
}
|
||||||
|
else -> cancel = true
|
||||||
|
}
|
||||||
|
if (cancel && !p.hasPermission("sm.bypass")) {
|
||||||
|
e.isCancelled = true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (!cancel) {
|
||||||
|
calculateItems(p, blockType)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun calculateItems(p: Player, inBlock: Material) {
|
||||||
|
var block = inBlock
|
||||||
|
val hand = p.inventory.itemInMainHand
|
||||||
|
var amount = 1.0
|
||||||
|
val compressor: Compressors
|
||||||
|
if (hand.containsEnchantment(Enchantment.LOOT_BONUS_BLOCKS)) {
|
||||||
|
val level = hand.getEnchantmentLevel(Enchantment.LOOT_BONUS_BLOCKS)
|
||||||
|
amount *= level.toDouble().pow(1.01)
|
||||||
|
val rand = Random()
|
||||||
|
amount = if (rand.nextInt(100) < 50) {
|
||||||
|
amount + 0.5
|
||||||
|
} else {
|
||||||
|
amount - 0.5
|
||||||
|
}
|
||||||
|
}
|
||||||
|
when (block) {
|
||||||
|
Material.STONE -> {
|
||||||
|
compressor = Compressors.STONE_COMPRESSOR
|
||||||
|
}
|
||||||
|
Material.COAL_ORE -> {
|
||||||
|
block = Material.COAL
|
||||||
|
compressor = Compressors.COAL_COMPRESSOR
|
||||||
|
}
|
||||||
|
Material.GOLD_ORE -> {
|
||||||
|
block = Material.RAW_GOLD
|
||||||
|
compressor = Compressors.GOLD_COMPRESSOR
|
||||||
|
}
|
||||||
|
Material.IRON_ORE -> {
|
||||||
|
block = Material.RAW_IRON
|
||||||
|
compressor = Compressors.IRON_COMPRESSOR
|
||||||
|
}
|
||||||
|
Material.DIAMOND_ORE -> {
|
||||||
|
block = Material.DIAMOND
|
||||||
|
compressor = Compressors.DIAMOND_COMPRESSOR
|
||||||
|
}
|
||||||
|
Material.EMERALD_ORE -> {
|
||||||
|
block = Material.EMERALD
|
||||||
|
compressor = Compressors.EMERALD_COMPRESSOR
|
||||||
|
}
|
||||||
|
Material.REDSTONE_ORE -> {
|
||||||
|
block = Material.REDSTONE
|
||||||
|
amount *= 2.0
|
||||||
|
compressor = Compressors.REDSTONE_COMPRESSOR
|
||||||
|
}
|
||||||
|
Material.LAPIS_ORE -> {
|
||||||
|
block = Material.LAPIS_LAZULI
|
||||||
|
amount *= 2.0
|
||||||
|
compressor = Compressors.LAPIS_COMPRESSOR
|
||||||
|
}
|
||||||
|
Material.BLUE_ICE -> {
|
||||||
|
compressor = Compressors.ICE_COMPRESSOR
|
||||||
|
}
|
||||||
|
Material.SNOW_BLOCK -> {
|
||||||
|
compressor = Compressors.SNOW_COMPRESSOR
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
val str = block.toString()
|
||||||
|
if (str.endsWith("_BLOCK") || str == "STONE" || str == "COBBLESTONE") {
|
||||||
|
if (str == "GRASS_BLOCK") return
|
||||||
|
p.inventory.addItem(ItemStack(block, 1))
|
||||||
|
return
|
||||||
|
} else return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
getCompressedItem(p, compressor, block, amount)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getCompressedItem(p: Player, comp: Compressors?, block: Material, amount: Double) {
|
||||||
|
p.inventory.addItem(ItemStack(block, amount.roundToInt()))
|
||||||
|
if (comp == null) return
|
||||||
|
if (p.inventory.contains(block) && p.inventory.contains(comp.item)) {
|
||||||
|
for (i in p.inventory.contents) {
|
||||||
|
if (i != null && i.amount >= 64 && i.type == block && !i.itemMeta.hasEnchants()) {
|
||||||
|
p.inventory.remove(ItemStack(block, 64))
|
||||||
|
p.inventory.addItem(comp.compress.item)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,45 @@
|
|||||||
|
package com.fivevl.skymines.listeners
|
||||||
|
|
||||||
|
import org.bukkit.event.EventHandler
|
||||||
|
import org.bukkit.event.Listener
|
||||||
|
import org.bukkit.event.player.PlayerJoinEvent
|
||||||
|
import com.fivevl.skymines.Utils
|
||||||
|
import org.bukkit.Bukkit
|
||||||
|
import org.bukkit.Material
|
||||||
|
import org.bukkit.configuration.file.YamlConfiguration
|
||||||
|
import org.bukkit.event.player.PlayerQuitEvent
|
||||||
|
import org.bukkit.inventory.ItemFlag
|
||||||
|
import org.bukkit.inventory.ItemStack
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
|
||||||
|
class PlayerJoinListener : Listener {
|
||||||
|
@EventHandler
|
||||||
|
@Suppress("deprecation")
|
||||||
|
fun onJoin(e: PlayerJoinEvent) {
|
||||||
|
e.player.teleport(Utils.spawn)
|
||||||
|
val file = File(Utils.mainInstance?.dataFolder, "playerdata.yml")
|
||||||
|
val config = YamlConfiguration.loadConfiguration(file)
|
||||||
|
if (config.getConfigurationSection(e.player.uniqueId.toString()) == null) {
|
||||||
|
config.createSection(e.player.uniqueId.toString())
|
||||||
|
e.player.inventory.addItem(ItemStack(Material.COOKED_BEEF, 16), getPick())
|
||||||
|
config.save(file)
|
||||||
|
Bukkit.broadcastMessage(Utils.hex("&eWelcome ${e.player.name} to the server!"))
|
||||||
|
}
|
||||||
|
e.joinMessage(null)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getPick(): ItemStack {
|
||||||
|
val item = ItemStack(Material.WOODEN_PICKAXE)
|
||||||
|
val meta = item.itemMeta
|
||||||
|
meta.isUnbreakable = true
|
||||||
|
meta.addItemFlags(ItemFlag.HIDE_UNBREAKABLE)
|
||||||
|
item.itemMeta = meta
|
||||||
|
return item
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
fun onLeave(e: PlayerQuitEvent) {
|
||||||
|
e.quitMessage(null)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
package com.fivevl.skymines.listeners
|
||||||
|
|
||||||
|
import org.bukkit.event.EventHandler
|
||||||
|
import org.bukkit.event.Listener
|
||||||
|
import org.bukkit.event.player.PlayerMoveEvent
|
||||||
|
import com.fivevl.skymines.Utils
|
||||||
|
|
||||||
|
|
||||||
|
class PlayerMoveListener : Listener {
|
||||||
|
@EventHandler
|
||||||
|
fun onMove(e: PlayerMoveEvent) {
|
||||||
|
val p = e.player
|
||||||
|
if (p.location.y <= 0) {
|
||||||
|
p.teleport(Utils.spawn)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
package com.fivevl.skymines.tabcomplete
|
||||||
|
|
||||||
|
import org.bukkit.command.Command
|
||||||
|
import org.bukkit.command.CommandSender
|
||||||
|
import org.bukkit.command.TabCompleter
|
||||||
|
import com.fivevl.skymines.Utils
|
||||||
|
|
||||||
|
|
||||||
|
class ResetMineTabComplete : TabCompleter {
|
||||||
|
override fun onTabComplete(sender: CommandSender, command: Command, alias: String, args: Array<String>): List<String> {
|
||||||
|
val list = ArrayList<String>()
|
||||||
|
if (sender.hasPermission("sm.mines.reset")) {
|
||||||
|
for (mines in Utils.mines.keys) {
|
||||||
|
list.add(mines)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return list
|
||||||
|
}
|
||||||
|
}
|
15
src/main/resources/plugin.yml
Normal file
15
src/main/resources/plugin.yml
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
name: SkyMines
|
||||||
|
version: '${project.version}'
|
||||||
|
main: com.fivevl.skymines.Main
|
||||||
|
api-version: 1.17
|
||||||
|
authors: [ 5vl ]
|
||||||
|
description: Skymines plugin made by 5vl.
|
||||||
|
commands:
|
||||||
|
resetmine:
|
||||||
|
description: Reset a mine.
|
||||||
|
spawn:
|
||||||
|
description: Go to spawn.
|
||||||
|
compressor:
|
||||||
|
description: Get compressor.
|
||||||
|
scroll:
|
||||||
|
description: Get a scroll.
|
Loading…
x
Reference in New Issue
Block a user