mirror of
https://github.com/5vl/Skymining.git
synced 2025-05-23 21:57:01 +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