Merge pull request #10 from NotAlexNoyle/main

Merge changes from upstream
This commit was merged in pull request #10.
This commit is contained in:
NotAlexNoyle authored and GitHub committed 2025-06-18 13:08:55 -04:00
commit 64c92bb027
16 files changed
+241 -198

No files matched your search

+10
View File
@@ -3,6 +3,7 @@ import java.io.BufferedReader
plugins {
kotlin("jvm") version "2.1.21"
id("com.gradleup.shadow") version "8.3.6"
id("com.diffplug.spotless") version "7.0.4"
}
val commitHash = Runtime
@@ -59,6 +60,7 @@ kotlin {
}
tasks.build {
dependsOn(tasks.spotlessApply)
dependsOn(tasks.shadowJar)
}
@@ -98,3 +100,11 @@ java {
vendor = JvmVendorSpec.GRAAL_VM
}
}
spotless {
kotlin {
ktfmt().kotlinlangStyle().configure {
it.setMaxWidth(120)
}
}
}
@@ -8,12 +8,7 @@ import org.bukkit.command.CommandSender
import org.bukkit.entity.Player
class ClaimQuest : CommandExecutor {
override fun onCommand(
sender: CommandSender,
command: Command,
label: String,
args: Array<out String>?
): Boolean {
override fun onCommand(sender: CommandSender, command: Command, label: String, args: Array<out String>?): Boolean {
if (sender !is Player) {
sender.sendMessage("You can only execute this command as a player.")
return true
@@ -50,10 +45,12 @@ class ClaimQuest : CommandExecutor {
var requirementsMessage = ""
for (requirement in requirements) {
if (requirement is BooleanRequirement) {
requirementsMessage += "${if (requirement.met) "<green>" else "<red>"}${requirement.name}: ${requirement.met}<reset> |"
requirementsMessage +=
"${if (requirement.met) "<green>" else "<red>"}${requirement.name}: ${requirement.met}<reset> |"
}
if (requirement is ProgressRequirement) {
requirementsMessage += "${if (requirement.current >= requirement.target) "<green>" else "<red>"}${requirement.name}: ${requirement.current}/${requirement.target}<reset> | "
requirementsMessage +=
"${if (requirement.current >= requirement.target) "<green>" else "<red>"}${requirement.name}: ${requirement.current}/${requirement.target}<reset> | "
}
}
sender.sendMessage(QuestsOG.mm.deserialize(requirementsMessage))
@@ -61,5 +58,4 @@ class ClaimQuest : CommandExecutor {
}
return true
}
}
}
@@ -1,21 +1,18 @@
package net.trueog.questsOG
import org.bukkit.configuration.file.YamlConfiguration
import java.io.File
import org.bukkit.configuration.file.YamlConfiguration
class Config {
lateinit var redisUrl: String
/**
* @return True if successful
*/
/** @return True if successful */
fun load(): Boolean {
val file = File(QuestsOG.plugin.dataFolder, "config.yml")
if (!file.exists()) {
QuestsOG.plugin.saveDefaultConfig()
}
val config = YamlConfiguration.loadConfiguration(file)
config.save(file)
try {
redisUrl = config.get("redisUrl") as String
@@ -26,4 +23,4 @@ class Config {
return true
}
}
}
@@ -22,12 +22,16 @@ class Events : Listener {
val translatableDeathMessageArgs = translatableDeathMessage.args()
if (translatableDeathMessage.key() == "death.attack.hotFloor.player" && translatableDeathMessageArgs.size >= 2 && (translatableDeathMessageArgs[1] as TranslatableComponent).key() == "entity.minecraft.zoglin") {
if (
translatableDeathMessage.key() == "death.attack.hotFloor.player" &&
translatableDeathMessageArgs.size >= 2 &&
(translatableDeathMessageArgs[1] as TranslatableComponent).key() == "entity.minecraft.zoglin"
) {
QuestsOG.redis.setValue(
"questsog:${event.player.uniqueId}:deaths:diedToMagmaBlockWhileFightingZoglin",
"true"
"true",
)
return
}
}
}
}
@@ -1,9 +1,9 @@
package net.trueog.questsOG
import kotlinx.coroutines.suspendCancellableCoroutine
import org.bukkit.Bukkit
import kotlin.coroutines.resume
import kotlin.coroutines.resumeWithException
import kotlinx.coroutines.suspendCancellableCoroutine
import org.bukkit.Bukkit
object MainThreadBlock {
suspend fun <T> runOnMainThread(block: () -> T): T {
@@ -11,14 +11,18 @@ object MainThreadBlock {
block()
} else {
suspendCancellableCoroutine { cont ->
Bukkit.getScheduler().runTask(QuestsOG.plugin, Runnable {
try {
cont.resume(block())
} catch (e: Throwable) {
cont.resumeWithException(e)
}
})
Bukkit.getScheduler()
.runTask(
QuestsOG.plugin,
Runnable {
try {
cont.resume(block())
} catch (e: Throwable) {
cont.resumeWithException(e)
}
},
)
}
}
}
}
}
@@ -11,7 +11,6 @@ import org.bukkit.Bukkit
import org.bukkit.plugin.Plugin
import org.bukkit.plugin.java.JavaPlugin
class QuestsOG : JavaPlugin() {
companion object {
val scope = CoroutineScope(Dispatchers.Default + SupervisorJob())
@@ -23,14 +22,10 @@ class QuestsOG : JavaPlugin() {
lateinit var luckPerms: LuckPerms
lateinit var duels: Duels
lateinit var mobHeads: Plugin
var mm = MiniMessage.builder()
.tags(
TagResolver.builder()
.resolver(StandardTags.color())
.resolver(StandardTags.reset())
.build()
)
.build()
var mm =
MiniMessage.builder()
.tags(TagResolver.builder().resolver(StandardTags.color()).resolver(StandardTags.reset()).build())
.build()
}
override fun onEnable() {
@@ -49,8 +44,7 @@ class QuestsOG : JavaPlugin() {
return
}
val diamondBankAPIProvider =
server.servicesManager.getRegistration(DiamondBankAPIKotlin::class.java)
val diamondBankAPIProvider = server.servicesManager.getRegistration(DiamondBankAPIKotlin::class.java)
if (diamondBankAPIProvider == null) {
logger.severe("DiamondBank-OG API is null")
Bukkit.getPluginManager().disablePlugin(this)
@@ -91,8 +85,6 @@ class QuestsOG : JavaPlugin() {
scope.cancel()
runBlocking {
scope.coroutineContext[Job]?.join()
}
runBlocking { scope.coroutineContext[Job]?.join() }
}
}
+2 -4
View File
@@ -6,9 +6,7 @@ import io.lettuce.core.RedisConnectionException
class Redis {
private val redisClient: RedisClient = RedisClient.create(QuestsOG.config.redisUrl)
/**
* @return True if successful
*/
/** @return True if successful */
fun testConnection(): Boolean {
try {
val connection = redisClient.connect()
@@ -37,4 +35,4 @@ class Redis {
fun shutdown() {
redisClient.shutdown()
}
}
}
@@ -4,4 +4,4 @@ open class Requirement(val name: String)
class ProgressRequirement(name: String, val current: Int, val target: Int) : Requirement(name)
class BooleanRequirement(name: String, val met: Boolean) : Requirement(name)
class BooleanRequirement(name: String, val met: Boolean) : Requirement(name)
@@ -8,7 +8,9 @@ object HomesProgression : Progression {
override fun getNextQuest(player: Player): Quest? {
val homePermission =
player.effectivePermissions.singleOrNull { permission -> permission.permission.startsWith("essentials.sethome.multiple.homes-") }
player.effectivePermissions.singleOrNull { permission ->
permission.permission.startsWith("essentials.sethome.multiple.homes-")
}
val nextQuestIndex = homePermission?.permission?.takeLast(1)?.toInt()?.minus(1) ?: 0
if (nextQuestIndex + 1 > quests.size) {
@@ -17,4 +19,4 @@ object HomesProgression : Progression {
return quests[nextQuestIndex]
}
}
}
@@ -7,4 +7,4 @@ interface Progression {
val quests: Array<Quest>
fun getNextQuest(player: Player): Quest?
}
}
@@ -31,25 +31,34 @@ class HomesFive : Quest {
val levels: Int,
val fishCaught: Int,
val hasVillagerHead: Boolean,
val duelsWins: Int
val duelsWins: Int,
)
val customMobHeadKey = NamespacedKey(QuestsOG.mobHeads, "customMobHead")
private val cutestPredatorAdvancement = Bukkit.getServer().advancementIterator().asSequence()
.single { advancement -> advancement.key.toString() == "minecraft:husbandry/axolotl_in_a_bucket" }
private val twoByTwoAdvancement = Bukkit.getServer().advancementIterator().asSequence()
.single { advancement -> advancement.key.toString() == "minecraft:husbandry/bred_all_animals" }
private val completeCatalogueAdvancement = Bukkit.getServer().advancementIterator().asSequence()
.single { advancement -> advancement.key.toString() == "minecraft:husbandry/complete_catalogue" }
private val monstersHuntedAdvancement = Bukkit.getServer().advancementIterator().asSequence()
.single { advancement -> advancement.key.toString() == "minecraft:adventure/kill_all_mobs" }
private val cutestPredatorAdvancement =
Bukkit.getServer().advancementIterator().asSequence().single { advancement ->
advancement.key.toString() == "minecraft:husbandry/axolotl_in_a_bucket"
}
private val twoByTwoAdvancement =
Bukkit.getServer().advancementIterator().asSequence().single { advancement ->
advancement.key.toString() == "minecraft:husbandry/bred_all_animals"
}
private val completeCatalogueAdvancement =
Bukkit.getServer().advancementIterator().asSequence().single { advancement ->
advancement.key.toString() == "minecraft:husbandry/complete_catalogue"
}
private val monstersHuntedAdvancement =
Bukkit.getServer().advancementIterator().asSequence().single { advancement ->
advancement.key.toString() == "minecraft:adventure/kill_all_mobs"
}
private suspend fun fetchRequirements(player: Player): Requirements? {
val playerShardsResult = QuestsOG.diamondBankAPI.getPlayerShards(player.uniqueId, PostgreSQL.ShardType.ALL)
val playerShards = playerShardsResult.getOrElse {
return null
}
val playerShards =
playerShardsResult.getOrElse {
return null
}
if (playerShards.isNeededShardTypeNull(PostgreSQL.ShardType.ALL)) {
return null
}
@@ -81,10 +90,11 @@ class HomesFive : Quest {
val fishCaught = player.getStatistic(Statistic.FISH_CAUGHT)
val hasVillagerHead = player.inventory.filterNotNull().any {
val data = it.itemMeta.persistentDataContainer.get(customMobHeadKey, PersistentDataType.STRING)
data?.startsWith("VILLAGER") == true
}
val hasVillagerHead =
player.inventory.filterNotNull().any {
val data = it.itemMeta.persistentDataContainer.get(customMobHeadKey, PersistentDataType.STRING)
data?.startsWith("VILLAGER") == true
}
val duelsWins = QuestsOG.duels.userManager.get(player.uniqueId)?.wins ?: 0
@@ -104,7 +114,7 @@ class HomesFive : Quest {
player.level,
fishCaught,
hasVillagerHead,
duelsWins
duelsWins,
)
}
@@ -116,21 +126,21 @@ class HomesFive : Quest {
}
return requirements.totalShards >= 2500 * 9 &&
requirements.ticksPlayed / 20.0 / 60.0 / 60.0 / 24.0 >= 15 &&
requirements.pigOneCm / 100000.0 >= 5 &&
requirements.striderOneCm / 100000.0 >= 1 &&
requirements.dolphinKills >= 50 &&
requirements.zoglinKills >= 50 &&
requirements.hasCutestPredator &&
requirements.hasTwoByTwo &&
requirements.hasCompleteCatalogue &&
requirements.hasMonstersHunted &&
requirements.hasDiedToFellWhileClimbing &&
requirements.hasDiedToMagmaBlockWhileFightingZoglin &&
requirements.levels >= 200 &&
requirements.fishCaught >= 2000 &&
requirements.hasVillagerHead &&
requirements.duelsWins >= 150
requirements.ticksPlayed / 20.0 / 60.0 / 60.0 / 24.0 >= 15 &&
requirements.pigOneCm / 100000.0 >= 5 &&
requirements.striderOneCm / 100000.0 >= 1 &&
requirements.dolphinKills >= 50 &&
requirements.zoglinKills >= 50 &&
requirements.hasCutestPredator &&
requirements.hasTwoByTwo &&
requirements.hasCompleteCatalogue &&
requirements.hasMonstersHunted &&
requirements.hasDiedToFellWhileClimbing &&
requirements.hasDiedToMagmaBlockWhileFightingZoglin &&
requirements.levels >= 200 &&
requirements.fishCaught >= 2000 &&
requirements.hasVillagerHead &&
requirements.duelsWins >= 150
}
override suspend fun consumeQuestItems(player: Player): Boolean {
@@ -140,9 +150,7 @@ class HomesFive : Quest {
return false
}
runOnMainThread {
player.level -= 200
}
runOnMainThread { player.level -= 200 }
return true
}
@@ -178,12 +186,12 @@ class HomesFive : Quest {
BooleanRequirement("Died to \"fell while climbing\"", requirements.hasDiedToFellWhileClimbing),
BooleanRequirement(
"Died to \"walked into the danger zone due to Zoglin\"",
requirements.hasDiedToMagmaBlockWhileFightingZoglin
requirements.hasDiedToMagmaBlockWhileFightingZoglin,
),
ProgressRequirement("Levels", requirements.levels, 200),
ProgressRequirement("Fish Caught", requirements.fishCaught, 2000),
BooleanRequirement("Has Villager Head", requirements.hasVillagerHead),
ProgressRequirement("Duels Wins", requirements.duelsWins, 150)
ProgressRequirement("Duels Wins", requirements.duelsWins, 150),
)
}
}
}
@@ -20,19 +20,24 @@ class HomesFour : Quest {
val hasSeriousDedication: Boolean,
val levels: Int,
val hasDiedToFellAccidentWater: Boolean,
val duelsWins: Int
val duelsWins: Int,
)
private val furiousCocktailAdvancement = Bukkit.getServer().advancementIterator().asSequence()
.single { it.key.toString() == "minecraft:nether/all_potions" }
private val seriousDedicationAdvancement = Bukkit.getServer().advancementIterator().asSequence()
.single { it.key.toString() == "minecraft:husbandry/obtain_netherite_hoe" }
private val furiousCocktailAdvancement =
Bukkit.getServer().advancementIterator().asSequence().single {
it.key.toString() == "minecraft:nether/all_potions"
}
private val seriousDedicationAdvancement =
Bukkit.getServer().advancementIterator().asSequence().single {
it.key.toString() == "minecraft:husbandry/obtain_netherite_hoe"
}
private suspend fun fetchRequirements(player: Player): Requirements? {
val playerShardsResult = QuestsOG.diamondBankAPI.getPlayerShards(player.uniqueId, PostgreSQL.ShardType.ALL)
val playerShards = playerShardsResult.getOrElse {
return null
}
val playerShards =
playerShardsResult.getOrElse {
return null
}
if (playerShards.isNeededShardTypeNull(PostgreSQL.ShardType.ALL)) {
return null
}
@@ -55,7 +60,19 @@ class HomesFour : Quest {
val swimOneCm = player.getStatistic(Statistic.SWIM_ONE_CM)
val striderOneCm = player.getStatistic(Statistic.STRIDER_ONE_CM)
val totalCm =
walkOneCm + walkOnWaterOneCm + climbOneCm + walkUnderWaterOneCm + minecartOneCm + boatOneCm + pigOneCm + horseOneCm + sprintOneCm + crouchOneCm + aviateOneCm + swimOneCm + striderOneCm
walkOneCm +
walkOnWaterOneCm +
climbOneCm +
walkUnderWaterOneCm +
minecartOneCm +
boatOneCm +
pigOneCm +
horseOneCm +
sprintOneCm +
crouchOneCm +
aviateOneCm +
swimOneCm +
striderOneCm
val furiousCocktailAdvancementProgress = player.getAdvancementProgress(furiousCocktailAdvancement)
@@ -74,7 +91,7 @@ class HomesFour : Quest {
seriousDedicationAdvancementProgress.isDone,
player.level,
hasDiedToFellAccidentWater,
duelsWins
duelsWins,
)
}
@@ -86,13 +103,13 @@ class HomesFour : Quest {
}
return requirements.totalShards >= 1000 * 9 &&
requirements.ticksPlayed / 20.0 / 60.0 / 60.0 / 24.0 >= 10 &&
requirements.totalCm / 100.0 >= 200000 &&
requirements.hasFuriousCocktail &&
requirements.hasSeriousDedication &&
requirements.levels >= 150 &&
requirements.hasDiedToFellAccidentWater &&
requirements.duelsWins >= 50
requirements.ticksPlayed / 20.0 / 60.0 / 60.0 / 24.0 >= 10 &&
requirements.totalCm / 100.0 >= 200000 &&
requirements.hasFuriousCocktail &&
requirements.hasSeriousDedication &&
requirements.levels >= 150 &&
requirements.hasDiedToFellAccidentWater &&
requirements.duelsWins >= 50
}
override suspend fun consumeQuestItems(player: Player): Boolean {
@@ -102,9 +119,7 @@ class HomesFour : Quest {
return false
}
runOnMainThread {
player.level -= 150
}
runOnMainThread { player.level -= 150 }
return true
}
@@ -134,7 +149,7 @@ class HomesFour : Quest {
BooleanRequirement("Serious Dedication", requirements.hasSeriousDedication),
ProgressRequirement("Levels", requirements.levels, 150),
BooleanRequirement("Died to \"death.fell.accident.water\"", requirements.hasDiedToFellAccidentWater),
ProgressRequirement("Duels Wins", requirements.duelsWins, 50)
ProgressRequirement("Duels Wins", requirements.duelsWins, 50),
)
}
}
}
@@ -20,35 +20,37 @@ class HomesSix : Quest {
val walkUnderWaterOneCm: Int,
val stoneLikePickedUp: Int,
val discs: Int,
// val hasLeftConfinesOfWorldWhileFightingEnderDragon: Boolean,
// val hasLeftConfinesOfWorldWhileFightingEnderDragon: Boolean,
val finishedAdvancements: Int,
val obsidianMined: Int,
val dragonEggs: Int,
val levels: Int,
val duelsWins: Int
val duelsWins: Int,
)
private val neededDiscs = setOf(
Material.MUSIC_DISC_13,
Material.MUSIC_DISC_CAT,
Material.MUSIC_DISC_BLOCKS,
Material.MUSIC_DISC_CHIRP,
Material.MUSIC_DISC_FAR,
Material.MUSIC_DISC_MALL,
Material.MUSIC_DISC_MELLOHI,
Material.MUSIC_DISC_STAL,
Material.MUSIC_DISC_STRAD,
Material.MUSIC_DISC_WARD,
Material.MUSIC_DISC_11,
Material.MUSIC_DISC_WAIT,
Material.MUSIC_DISC_5
)
private val neededDiscs =
setOf(
Material.MUSIC_DISC_13,
Material.MUSIC_DISC_CAT,
Material.MUSIC_DISC_BLOCKS,
Material.MUSIC_DISC_CHIRP,
Material.MUSIC_DISC_FAR,
Material.MUSIC_DISC_MALL,
Material.MUSIC_DISC_MELLOHI,
Material.MUSIC_DISC_STAL,
Material.MUSIC_DISC_STRAD,
Material.MUSIC_DISC_WARD,
Material.MUSIC_DISC_11,
Material.MUSIC_DISC_WAIT,
Material.MUSIC_DISC_5,
)
private suspend fun fetchRequirements(player: Player): Requirements? {
val playerShardsResult = QuestsOG.diamondBankAPI.getPlayerShards(player.uniqueId, PostgreSQL.ShardType.ALL)
val playerShards = playerShardsResult.getOrElse {
return null
}
val playerShards =
playerShardsResult.getOrElse {
return null
}
if (playerShards.isNeededShardTypeNull(PostgreSQL.ShardType.ALL)) {
return null
}
@@ -65,15 +67,17 @@ class HomesSix : Quest {
val cobblestoneMined = player.getStatistic(Statistic.MINE_BLOCK, Material.COBBLESTONE)
val stoneLikeMined = stoneMined + cobblestoneMined
val discs = player.inventory
.filterNotNull()
.filter { it.type in neededDiscs }.distinctBy { it.type }
val discs = player.inventory.filterNotNull().filter { it.type in neededDiscs }.distinctBy { it.type }
// val hasLeftConfinesOfWorldWhileFightingEnderDragon =
// QuestsOG.redis.getValue("questsog:${player.uniqueId}:deaths:leftConfinesOfWorldWhileFightingEnderDragon") == "true"
// val hasLeftConfinesOfWorldWhileFightingEnderDragon =
//
// QuestsOG.redis.getValue("questsog:${player.uniqueId}:deaths:leftConfinesOfWorldWhileFightingEnderDragon") ==
// "true"
val finishedAdvancements = Bukkit.getServer().advancementIterator().asSequence().filterNotNull()
.filter { player.getAdvancementProgress(it).isDone }
val finishedAdvancements =
Bukkit.getServer().advancementIterator().asSequence().filterNotNull().filter {
player.getAdvancementProgress(it).isDone
}
val obsidianMined = player.getStatistic(Statistic.MINE_BLOCK, Material.OBSIDIAN)
@@ -88,12 +92,12 @@ class HomesSix : Quest {
walkUnderWaterOneCm,
stoneLikeMined,
discs.size,
// hasLeftConfinesOfWorldWhileFightingEnderDragon,
// hasLeftConfinesOfWorldWhileFightingEnderDragon,
finishedAdvancements.count(),
obsidianMined,
dragonEggs,
player.level,
duelsWins
duelsWins,
)
}
@@ -105,16 +109,16 @@ class HomesSix : Quest {
}
return requirements.totalShards >= 5000 * 9 &&
requirements.ticksPlayed / 20.0 / 60.0 / 60.0 / 24.0 >= 30 &&
requirements.walkOnWaterOneCm / 100000.0 >= 10 &&
requirements.walkUnderWaterOneCm / 100000.0 >= 10 &&
requirements.discs >= 13 &&
// requirements.hasLeftConfinesOfWorldWhileFightingEnderDragon &&
requirements.finishedAdvancements >= 1179 &&
requirements.obsidianMined >= 1500 &&
requirements.dragonEggs >= 5 &&
requirements.levels >= 250 &&
requirements.duelsWins >= 300
requirements.ticksPlayed / 20.0 / 60.0 / 60.0 / 24.0 >= 30 &&
requirements.walkOnWaterOneCm / 100000.0 >= 10 &&
requirements.walkUnderWaterOneCm / 100000.0 >= 10 &&
requirements.discs >= 13 &&
// requirements.hasLeftConfinesOfWorldWhileFightingEnderDragon &&
requirements.finishedAdvancements >= 1179 &&
requirements.obsidianMined >= 1500 &&
requirements.dragonEggs >= 5 &&
requirements.levels >= 250 &&
requirements.duelsWins >= 300
}
override suspend fun consumeQuestItems(player: Player): Boolean {
@@ -169,7 +173,7 @@ class HomesSix : Quest {
ProgressRequirement("Obsidian Mined", requirements.obsidianMined, 1500),
ProgressRequirement("Dragon Eggs", requirements.dragonEggs, 5),
ProgressRequirement("Levels", requirements.levels, 250),
ProgressRequirement("Duels Wins", requirements.duelsWins, 300)
ProgressRequirement("Duels Wins", requirements.duelsWins, 300),
)
}
}
}
@@ -18,17 +18,20 @@ class HomesThree : Quest {
val totalCm: Int,
val hasBeaconator: Boolean,
val levels: Int,
val duelsWins: Int
val duelsWins: Int,
)
private val beaconatorAdvancement = Bukkit.getServer().advancementIterator().asSequence()
.single { it.key.toString() == "minecraft:nether/create_full_beacon" }
private val beaconatorAdvancement =
Bukkit.getServer().advancementIterator().asSequence().single {
it.key.toString() == "minecraft:nether/create_full_beacon"
}
private suspend fun fetchRequirements(player: Player): Requirements? {
val playerShardsResult = QuestsOG.diamondBankAPI.getPlayerShards(player.uniqueId, PostgreSQL.ShardType.ALL)
val playerShards = playerShardsResult.getOrElse {
return null
}
val playerShards =
playerShardsResult.getOrElse {
return null
}
if (playerShards.isNeededShardTypeNull(PostgreSQL.ShardType.ALL)) {
return null
}
@@ -51,20 +54,25 @@ class HomesThree : Quest {
val swimOneCm = player.getStatistic(Statistic.SWIM_ONE_CM)
val striderOneCm = player.getStatistic(Statistic.STRIDER_ONE_CM)
val totalCm =
walkOneCm + walkOnWaterOneCm + climbOneCm + walkUnderWaterOneCm + minecartOneCm + boatOneCm + pigOneCm + horseOneCm + sprintOneCm + crouchOneCm + aviateOneCm + swimOneCm + striderOneCm
walkOneCm +
walkOnWaterOneCm +
climbOneCm +
walkUnderWaterOneCm +
minecartOneCm +
boatOneCm +
pigOneCm +
horseOneCm +
sprintOneCm +
crouchOneCm +
aviateOneCm +
swimOneCm +
striderOneCm
val advancementProgress = player.getAdvancementProgress(beaconatorAdvancement)
val duelsWins = QuestsOG.duels.userManager.get(player.uniqueId)?.wins ?: 0
return Requirements(
totalShards,
ticksPlayed,
totalCm,
advancementProgress.isDone,
player.level,
duelsWins
)
return Requirements(totalShards, ticksPlayed, totalCm, advancementProgress.isDone, player.level, duelsWins)
}
override suspend fun isEligible(player: Player): Boolean? {
@@ -75,11 +83,11 @@ class HomesThree : Quest {
}
return requirements.totalShards >= 250 * 9 &&
requirements.ticksPlayed / 20.0 / 60.0 / 60.0 / 24.0 >= 5 &&
requirements.totalCm / 100.0 >= 50000 && // 100k?
requirements.hasBeaconator &&
requirements.levels >= 100 &&
requirements.duelsWins >= 20
requirements.ticksPlayed / 20.0 / 60.0 / 60.0 / 24.0 >= 5 &&
requirements.totalCm / 100.0 >= 50000 && // 100k?
requirements.hasBeaconator &&
requirements.levels >= 100 &&
requirements.duelsWins >= 20
}
override suspend fun consumeQuestItems(player: Player): Boolean {
@@ -89,9 +97,7 @@ class HomesThree : Quest {
return false
}
runOnMainThread {
player.level -= 100
}
runOnMainThread { player.level -= 100 }
return true
}
@@ -119,7 +125,7 @@ class HomesThree : Quest {
ProgressRequirement("Total Cm Travelled", requirements.totalCm, 5000000),
BooleanRequirement("Beaconator", requirements.hasBeaconator),
ProgressRequirement("Levels", requirements.levels, 100),
ProgressRequirement("Duels Wins", requirements.duelsWins, 20)
ProgressRequirement("Duels Wins", requirements.duelsWins, 20),
)
}
}
}
@@ -15,14 +15,15 @@ class HomesTwo : Quest {
val ticksPlayed: Int,
val totalCm: Int,
val levels: Int,
val duelsWins: Int
val duelsWins: Int,
)
private suspend fun fetchRequirements(player: Player): Requirements? {
val playerShardsResult = QuestsOG.diamondBankAPI.getPlayerShards(player.uniqueId, PostgreSQL.ShardType.ALL)
val playerShards = playerShardsResult.getOrElse {
return null
}
val playerShards =
playerShardsResult.getOrElse {
return null
}
if (playerShards.isNeededShardTypeNull(PostgreSQL.ShardType.ALL)) {
return null
}
@@ -45,7 +46,19 @@ class HomesTwo : Quest {
val swimOneCm = player.getStatistic(Statistic.SWIM_ONE_CM)
val striderOneCm = player.getStatistic(Statistic.STRIDER_ONE_CM)
val totalCm =
walkOneCm + walkOnWaterOneCm + climbOneCm + walkUnderWaterOneCm + minecartOneCm + boatOneCm + pigOneCm + horseOneCm + sprintOneCm + crouchOneCm + aviateOneCm + swimOneCm + striderOneCm
walkOneCm +
walkOnWaterOneCm +
climbOneCm +
walkUnderWaterOneCm +
minecartOneCm +
boatOneCm +
pigOneCm +
horseOneCm +
sprintOneCm +
crouchOneCm +
aviateOneCm +
swimOneCm +
striderOneCm
val duelsWins = QuestsOG.duels.userManager.get(player.uniqueId)?.wins ?: 0
@@ -60,10 +73,10 @@ class HomesTwo : Quest {
}
return requirements.totalShards >= 100 * 9 &&
requirements.ticksPlayed / 20.0 / 60.0 / 60.0 >= 24 &&
requirements.totalCm / 100.0 >= 10000 &&
requirements.levels >= 50 &&
requirements.duelsWins >= 10
requirements.ticksPlayed / 20.0 / 60.0 / 60.0 >= 24 &&
requirements.totalCm / 100.0 >= 10000 &&
requirements.levels >= 50 &&
requirements.duelsWins >= 10
}
override suspend fun consumeQuestItems(player: Player): Boolean {
@@ -73,9 +86,7 @@ class HomesTwo : Quest {
return false
}
runOnMainThread {
player.level -= 100
}
runOnMainThread { player.level -= 100 }
return true
}
@@ -83,9 +94,7 @@ class HomesTwo : Quest {
override fun reward(player: Player) {
val homesTwoNode = PermissionNode.builder("essentials.sethome.multiple.homes-2").build()
QuestsOG.luckPerms.userManager.modifyUser(player.uniqueId) { user ->
user.data().add(homesTwoNode)
}
QuestsOG.luckPerms.userManager.modifyUser(player.uniqueId) { user -> user.data().add(homesTwoNode) }
}
override suspend fun getRequirements(player: Player): Array<Requirement>? {
@@ -98,7 +107,7 @@ class HomesTwo : Quest {
return arrayOf(
ProgressRequirement("Total Shards", requirements.totalShards, 100 * 9),
ProgressRequirement("Ticks Played", requirements.ticksPlayed, 1728000),
ProgressRequirement("Total Cm Travelled", requirements.totalCm, 1000000)
ProgressRequirement("Total Cm Travelled", requirements.totalCm, 1000000),
)
}
}
}
@@ -6,12 +6,10 @@ import org.bukkit.entity.Player
interface Quest {
suspend fun isEligible(player: Player): Boolean?
/**
* @return True if successful
*/
/** @return True if successful */
suspend fun consumeQuestItems(player: Player): Boolean
fun reward(player: Player)
suspend fun getRequirements(player: Player): Array<Requirement>?
}
}