9
0
mirror of https://github.com/Auxilor/EcoQuests.git synced 2026-01-06 15:52:00 +00:00

Added libreforge integration and improved API

This commit is contained in:
Auxilor
2023-08-08 22:39:23 +01:00
parent 21959b5430
commit 97e86946da
20 changed files with 416 additions and 7 deletions

View File

@@ -7,18 +7,45 @@ import com.willfp.ecoquests.commands.CommandEcoQuests
import com.willfp.ecoquests.commands.CommandQuests
import com.willfp.ecoquests.gui.PreviousQuestsGUI
import com.willfp.ecoquests.gui.QuestsGUI
import com.willfp.ecoquests.libreforge.ConditionHasCompletedQuest
import com.willfp.ecoquests.libreforge.ConditionHasCompletedTask
import com.willfp.ecoquests.libreforge.EffectGainTaskXp
import com.willfp.ecoquests.libreforge.EffectGiveTaskXp
import com.willfp.ecoquests.libreforge.EffectStartQuest
import com.willfp.ecoquests.libreforge.FilterQuest
import com.willfp.ecoquests.libreforge.FilterTask
import com.willfp.ecoquests.libreforge.TriggerCompleteQuest
import com.willfp.ecoquests.libreforge.TriggerCompleteTask
import com.willfp.ecoquests.libreforge.TriggerGainTaskXp
import com.willfp.ecoquests.libreforge.TriggerStartQuest
import com.willfp.ecoquests.quests.QuestCompleteDisplay
import com.willfp.ecoquests.quests.QuestStartDisplay
import com.willfp.ecoquests.quests.Quests
import com.willfp.ecoquests.tasks.Tasks
import com.willfp.libreforge.conditions.Conditions
import com.willfp.libreforge.effects.Effects
import com.willfp.libreforge.filters.Filters
import com.willfp.libreforge.loader.LibreforgePlugin
import com.willfp.libreforge.loader.configs.ConfigCategory
import com.willfp.libreforge.triggers.Triggers
import org.bukkit.Bukkit
import org.bukkit.event.Listener
class EcoQuestsPlugin : LibreforgePlugin() {
override fun handleEnable() {
Conditions.register(ConditionHasCompletedQuest)
Conditions.register(ConditionHasCompletedTask)
Effects.register(EffectGainTaskXp)
Effects.register(EffectGiveTaskXp)
Effects.register(EffectStartQuest)
Filters.register(FilterQuest)
Filters.register(FilterTask)
Triggers.register(TriggerCompleteQuest)
Triggers.register(TriggerCompleteTask)
Triggers.register(TriggerGainTaskXp)
Triggers.register(TriggerStartQuest)
PlayerlessPlaceholder(this, "quests_amount") {
Quests.values().size.toString()
}

View File

@@ -7,8 +7,10 @@ import org.bukkit.event.player.PlayerEvent
class PlayerQuestCompleteEvent(
who: Player,
val quest: Quest
): PlayerEvent(who) {
override val quest: Quest
): PlayerEvent(who), QuestEvent {
override val player: Player = super.player
override fun getHandlers(): HandlerList {
return HANDLERS
}

View File

@@ -7,8 +7,10 @@ import org.bukkit.event.player.PlayerEvent
class PlayerQuestStartEvent(
who: Player,
val quest: Quest
): PlayerEvent(who) {
override val quest: Quest
): PlayerEvent(who), QuestEvent {
override val player: Player = super.player
override fun getHandlers(): HandlerList {
return HANDLERS
}

View File

@@ -7,8 +7,10 @@ import org.bukkit.event.player.PlayerEvent
class PlayerTaskCompleteEvent(
who: Player,
val task: Task
): PlayerEvent(who) {
override val task: Task
): PlayerEvent(who), TaskEvent {
override val player: Player = super.player
override fun getHandlers(): HandlerList {
return HANDLERS
}

View File

@@ -0,0 +1,38 @@
package com.willfp.ecoquests.api.event
import com.willfp.ecoquests.tasks.Task
import org.bukkit.entity.Player
import org.bukkit.event.Cancellable
import org.bukkit.event.HandlerList
import org.bukkit.event.player.PlayerEvent
class PlayerTaskExpGainEvent(
who: Player,
override val task: Task,
var amount: Double
) : PlayerEvent(who), TaskEvent, Cancellable {
private var cancelled = false
override fun isCancelled(): Boolean {
return cancelled
}
override fun setCancelled(cancel: Boolean) {
cancelled = cancel
}
override val player: Player = super.player
override fun getHandlers(): HandlerList {
return HANDLERS
}
companion object {
private val HANDLERS = HandlerList()
@JvmStatic
fun getHandlerList(): HandlerList {
return HANDLERS
}
}
}

View File

@@ -0,0 +1,10 @@
package com.willfp.ecoquests.api.event
import com.willfp.ecoquests.quests.Quest
import org.bukkit.entity.Player
interface QuestEvent {
val quest: Quest
val player: Player
}

View File

@@ -0,0 +1,11 @@
package com.willfp.ecoquests.api.event
import com.willfp.ecoquests.quests.Quest
import com.willfp.ecoquests.tasks.Task
import org.bukkit.entity.Player
interface TaskEvent {
val task: Task
val player: Player
}

View File

@@ -0,0 +1,20 @@
package com.willfp.ecoquests.libreforge
import com.willfp.eco.core.config.interfaces.Config
import com.willfp.ecoquests.quests.Quests
import com.willfp.libreforge.NoCompileData
import com.willfp.libreforge.arguments
import com.willfp.libreforge.conditions.Condition
import org.bukkit.entity.Player
object ConditionHasCompletedQuest : Condition<NoCompileData>("has_completed_quest") {
override val arguments = arguments {
require("quest", "You must specify the quest ID!")
}
override fun isMet(player: Player, config: Config, compileData: NoCompileData): Boolean {
val quest = Quests[config.getString("quest")] ?: return false
return quest.hasCompleted(player)
}
}

View File

@@ -0,0 +1,21 @@
package com.willfp.ecoquests.libreforge
import com.willfp.eco.core.config.interfaces.Config
import com.willfp.ecoquests.quests.Quests
import com.willfp.ecoquests.tasks.Tasks
import com.willfp.libreforge.NoCompileData
import com.willfp.libreforge.arguments
import com.willfp.libreforge.conditions.Condition
import org.bukkit.entity.Player
object ConditionHasCompletedTask : Condition<NoCompileData>("has_completed_task") {
override val arguments = arguments {
require("task", "You must specify the task ID!")
}
override fun isMet(player: Player, config: Config, compileData: NoCompileData): Boolean {
val task = Tasks[config.getString("task")] ?: return false
return task.hasCompleted(player)
}
}

View File

@@ -0,0 +1,33 @@
package com.willfp.ecoquests.libreforge
import com.willfp.eco.core.config.interfaces.Config
import com.willfp.ecoquests.tasks.Tasks
import com.willfp.libreforge.NoCompileData
import com.willfp.libreforge.arguments
import com.willfp.libreforge.effects.Effect
import com.willfp.libreforge.getDoubleFromExpression
import com.willfp.libreforge.triggers.TriggerData
import com.willfp.libreforge.triggers.TriggerParameter
import org.bukkit.entity.Player
object EffectGainTaskXp : Effect<NoCompileData>("gain_task_xp") {
override val parameters = setOf(
TriggerParameter.PLAYER
)
override val arguments = arguments {
require("task", "You must specify the task ID!")
require("xp", "You must specify the amount of xp to gain!")
}
override fun onTrigger(config: Config, data: TriggerData, compileData: NoCompileData): Boolean {
val player = data.player ?: return false
val task = Tasks[config.getString("task")] ?: return false
val xp = config.getDoubleFromExpression("xp", data)
task.gainExperience(player, xp)
return true
}
}

View File

@@ -0,0 +1,33 @@
package com.willfp.ecoquests.libreforge
import com.willfp.eco.core.config.interfaces.Config
import com.willfp.ecoquests.tasks.Tasks
import com.willfp.libreforge.NoCompileData
import com.willfp.libreforge.arguments
import com.willfp.libreforge.effects.Effect
import com.willfp.libreforge.getDoubleFromExpression
import com.willfp.libreforge.triggers.TriggerData
import com.willfp.libreforge.triggers.TriggerParameter
import org.bukkit.entity.Player
object EffectGiveTaskXp : Effect<NoCompileData>("give_task_xp") {
override val parameters = setOf(
TriggerParameter.PLAYER
)
override val arguments = arguments {
require("task", "You must specify the task ID!")
require("xp", "You must specify the amount of xp to give!")
}
override fun onTrigger(config: Config, data: TriggerData, compileData: NoCompileData): Boolean {
val player = data.player ?: return false
val task = Tasks[config.getString("task")] ?: return false
val xp = config.getDoubleFromExpression("xp", data)
task.giveExperience(player, xp)
return true
}
}

View File

@@ -0,0 +1,32 @@
package com.willfp.ecoquests.libreforge
import com.willfp.eco.core.config.interfaces.Config
import com.willfp.ecoquests.quests.Quests
import com.willfp.ecoquests.tasks.Tasks
import com.willfp.libreforge.NoCompileData
import com.willfp.libreforge.arguments
import com.willfp.libreforge.effects.Effect
import com.willfp.libreforge.getDoubleFromExpression
import com.willfp.libreforge.triggers.TriggerData
import com.willfp.libreforge.triggers.TriggerParameter
import org.bukkit.entity.Player
object EffectStartQuest : Effect<NoCompileData>("start_quest") {
override val parameters = setOf(
TriggerParameter.PLAYER
)
override val arguments = arguments {
require("quest", "You must specify the quest!")
}
override fun onTrigger(config: Config, data: TriggerData, compileData: NoCompileData): Boolean {
val player = data.player ?: return false
val quest = Quests[config.getString("quest")] ?: return false
quest.start(player)
return true
}
}

View File

@@ -0,0 +1,21 @@
package com.willfp.ecoquests.libreforge
import com.willfp.eco.core.config.interfaces.Config
import com.willfp.ecoquests.api.event.QuestEvent
import com.willfp.libreforge.NoCompileData
import com.willfp.libreforge.filters.Filter
import com.willfp.libreforge.triggers.TriggerData
object FilterQuest : Filter<NoCompileData, Collection<String>>("quest") {
override fun getValue(config: Config, data: TriggerData?, key: String): Collection<String> {
return config.getStrings(key)
}
override fun isMet(data: TriggerData, value: Collection<String>, compileData: NoCompileData): Boolean {
val event = data.event as? QuestEvent ?: return true
return value.any { questID ->
questID.equals(event.quest.id, ignoreCase = true)
}
}
}

View File

@@ -0,0 +1,22 @@
package com.willfp.ecoquests.libreforge
import com.willfp.eco.core.config.interfaces.Config
import com.willfp.ecoquests.api.event.QuestEvent
import com.willfp.ecoquests.api.event.TaskEvent
import com.willfp.libreforge.NoCompileData
import com.willfp.libreforge.filters.Filter
import com.willfp.libreforge.triggers.TriggerData
object FilterTask : Filter<NoCompileData, Collection<String>>("task") {
override fun getValue(config: Config, data: TriggerData?, key: String): Collection<String> {
return config.getStrings(key)
}
override fun isMet(data: TriggerData, value: Collection<String>, compileData: NoCompileData): Boolean {
val event = data.event as? TaskEvent ?: return true
return value.any { taskID ->
taskID.equals(event.task.id, ignoreCase = true)
}
}
}

View File

@@ -0,0 +1,28 @@
package com.willfp.ecoquests.libreforge
import com.willfp.ecoquests.api.event.PlayerQuestCompleteEvent
import com.willfp.ecoquests.api.event.PlayerQuestStartEvent
import com.willfp.libreforge.triggers.Trigger
import com.willfp.libreforge.triggers.TriggerData
import com.willfp.libreforge.triggers.TriggerParameter
import org.bukkit.event.EventHandler
object TriggerCompleteQuest : Trigger("complete_quest") {
override val parameters = setOf(
TriggerParameter.PLAYER,
TriggerParameter.EVENT
)
@EventHandler
fun handle(event: PlayerQuestCompleteEvent) {
val player = event.player
this.dispatch(
player,
TriggerData(
player = player,
event = event
)
)
}
}

View File

@@ -0,0 +1,27 @@
package com.willfp.ecoquests.libreforge
import com.willfp.ecoquests.api.event.PlayerTaskCompleteEvent
import com.willfp.libreforge.triggers.Trigger
import com.willfp.libreforge.triggers.TriggerData
import com.willfp.libreforge.triggers.TriggerParameter
import org.bukkit.event.EventHandler
object TriggerCompleteTask : Trigger("complete_task") {
override val parameters = setOf(
TriggerParameter.PLAYER,
TriggerParameter.EVENT
)
@EventHandler
fun handle(event: PlayerTaskCompleteEvent) {
val player = event.player
this.dispatch(
player,
TriggerData(
player = player,
event = event
)
)
}
}

View File

@@ -0,0 +1,30 @@
package com.willfp.ecoquests.libreforge
import com.willfp.ecoquests.api.event.PlayerTaskExpGainEvent
import com.willfp.libreforge.triggers.Trigger
import com.willfp.libreforge.triggers.TriggerData
import com.willfp.libreforge.triggers.TriggerParameter
import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority
object TriggerGainTaskXp : Trigger("gain_task_xp") {
override val parameters = setOf(
TriggerParameter.PLAYER,
TriggerParameter.EVENT,
TriggerParameter.VALUE
)
@EventHandler
fun handle(event: PlayerTaskExpGainEvent) {
val player = event.player
this.dispatch(
player,
TriggerData(
player = player,
event = event,
value = event.amount
)
)
}
}

View File

@@ -0,0 +1,27 @@
package com.willfp.ecoquests.libreforge
import com.willfp.ecoquests.api.event.PlayerQuestStartEvent
import com.willfp.libreforge.triggers.Trigger
import com.willfp.libreforge.triggers.TriggerData
import com.willfp.libreforge.triggers.TriggerParameter
import org.bukkit.event.EventHandler
object TriggerStartQuest : Trigger("start_quest") {
override val parameters = setOf(
TriggerParameter.PLAYER,
TriggerParameter.EVENT
)
@EventHandler
fun handle(event: PlayerQuestStartEvent) {
val player = event.player
this.dispatch(
player,
TriggerData(
player = player,
event = event
)
)
}
}

View File

@@ -83,6 +83,10 @@ class Quest(
)
init {
PlayerlessPlaceholder(plugin, "quest_${id}_name") {
this.name
}
PlayerPlaceholder(plugin, "quest_${id}_started") {
hasStarted(it).toNiceString()
}

View File

@@ -13,6 +13,7 @@ import com.willfp.eco.util.formatEco
import com.willfp.eco.util.lineWrap
import com.willfp.eco.util.toNiceString
import com.willfp.ecoquests.api.event.PlayerTaskCompleteEvent
import com.willfp.ecoquests.api.event.PlayerTaskExpGainEvent
import com.willfp.ecoquests.quests.Quests
import com.willfp.libreforge.ViolationContext
import com.willfp.libreforge.counters.Accumulator
@@ -44,7 +45,7 @@ class Task(
private val accumulator = object : Accumulator {
override fun accept(player: Player, count: Double) {
this@Task.giveExperience(player, count)
this@Task.gainExperience(player, count)
}
}
@@ -114,6 +115,24 @@ class Task(
return config.getDoubleFromExpression("required-xp", player)
}
/**
* Gain experience naturally.
*/
fun gainExperience(player: Player, amount: Double) {
val event = PlayerTaskExpGainEvent(player, this, amount)
Bukkit.getPluginManager().callEvent(event)
if (event.isCancelled) {
return
}
giveExperience(player, event.amount)
}
/**
* Give experience directly
*/
fun giveExperience(player: Player, amount: Double) {
val requiredXp = getExperienceRequired(player)
val newXp = player.profile.read(xpKey) + amount