9
0
mirror of https://github.com/Auxilor/EcoMenus.git synced 2025-12-19 15:09:20 +00:00

Removed SlotType to only be based around the effects system, updated _example.yml

This commit is contained in:
Auxilor
2023-07-10 15:44:55 +01:00
parent fb0e6cdf94
commit aa871b8776
13 changed files with 60 additions and 234 deletions

View File

@@ -2,11 +2,18 @@ package com.willfp.ecomenus
import com.willfp.eco.core.command.impl.PluginCommand import com.willfp.eco.core.command.impl.PluginCommand
import com.willfp.ecomenus.commands.CommandEcoMenus import com.willfp.ecomenus.commands.CommandEcoMenus
import com.willfp.ecomenus.libreforge.EffectOpenMenu
import com.willfp.ecomenus.menus.EcoMenus import com.willfp.ecomenus.menus.EcoMenus
import com.willfp.libreforge.effects.Effects
import com.willfp.libreforge.loader.LibreforgePlugin import com.willfp.libreforge.loader.LibreforgePlugin
import com.willfp.libreforge.loader.configs.ConfigCategory import com.willfp.libreforge.loader.configs.ConfigCategory
import net.kyori.adventure.text.logger.slf4j.ComponentLogger
class EcoMenusPlugin : LibreforgePlugin() { class EcoMenusPlugin : LibreforgePlugin() {
override fun handleEnable() {
Effects.register(EffectOpenMenu)
}
override fun loadPluginCommands(): List<PluginCommand> { override fun loadPluginCommands(): List<PluginCommand> {
return listOf( return listOf(
CommandEcoMenus(this) CommandEcoMenus(this)

View File

@@ -1,6 +1,5 @@
package com.willfp.ecomenus.components package com.willfp.ecomenus.components
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.config.interfaces.Config import com.willfp.eco.core.config.interfaces.Config
import com.willfp.eco.core.fast.fast import com.willfp.eco.core.fast.fast
import com.willfp.eco.core.gui.menu.Menu import com.willfp.eco.core.gui.menu.Menu
@@ -13,16 +12,16 @@ import com.willfp.eco.core.items.Items
import com.willfp.eco.core.placeholder.context.placeholderContext import com.willfp.eco.core.placeholder.context.placeholderContext
import com.willfp.eco.core.placeholder.findPlaceholders import com.willfp.eco.core.placeholder.findPlaceholders
import com.willfp.eco.core.placeholder.translatePlaceholders import com.willfp.eco.core.placeholder.translatePlaceholders
import com.willfp.ecomenus.slots.SlotTypes
import com.willfp.libreforge.ConfigViolation import com.willfp.libreforge.ConfigViolation
import com.willfp.libreforge.EmptyProvidedHolder import com.willfp.libreforge.EmptyProvidedHolder
import com.willfp.libreforge.ViolationContext import com.willfp.libreforge.ViolationContext
import com.willfp.libreforge.conditions.Conditions import com.willfp.libreforge.conditions.Conditions
import com.willfp.libreforge.effects.Effects
import com.willfp.libreforge.effects.executors.impl.NormalExecutorFactory
import org.bukkit.entity.Player import org.bukkit.entity.Player
import org.bukkit.event.inventory.ClickType import org.bukkit.event.inventory.ClickType
class ConfigurableSlot( class ConfigurableSlot(
private val plugin: EcoPlugin,
baseContext: ViolationContext, baseContext: ViolationContext,
private val config: Config private val config: Config
) : PositionedComponent { ) : PositionedComponent {
@@ -74,19 +73,17 @@ class ConfigurableSlot(
}) { }) {
for (clickType in ClickType.values()) { for (clickType in ClickType.values()) {
val section = "${clickType.name.lowercase().replace("_", "-")}-click" val section = "${clickType.name.lowercase().replace("_", "-")}-click"
val actions = config.getSubsections(section)
for (action in actions) { val effects = Effects.compileChain(
val typeName = action.getString("type") config.getSubsections(section),
val type = SlotTypes[typeName] ?: continue NormalExecutorFactory.create(),
context.with(section)
) ?: continue
val function = type.create( onClick(clickType) { player, _, _, _ ->
action, if (conditions.areMet(player, EmptyProvidedHolder)) {
plugin, effects.trigger(player)
context.with(section).with(typeName) }
)?.toSlotAction(conditions) ?: continue
onClick(clickType, function)
} }
} }
} }

View File

@@ -0,0 +1,29 @@
package com.willfp.ecomenus.libreforge
import com.willfp.eco.core.config.interfaces.Config
import com.willfp.eco.util.openMenu
import com.willfp.ecomenus.menus.EcoMenus
import com.willfp.libreforge.NoCompileData
import com.willfp.libreforge.arguments
import com.willfp.libreforge.effects.Effect
import com.willfp.libreforge.triggers.TriggerData
import com.willfp.libreforge.triggers.TriggerParameter
object EffectOpenMenu : Effect<NoCompileData>("open_menu") {
override val parameters = setOf(
TriggerParameter.PLAYER
)
override val arguments = arguments {
require("menu", "You must specify the menu ID!")
}
override fun onTrigger(config: Config, data: TriggerData, compileData: NoCompileData): Boolean {
val player = data.player ?: return false
val menu = EcoMenus[config.getString("menu")] ?: return false
menu.forceOpen(player, player.openMenu)
return true
}
}

View File

@@ -41,7 +41,6 @@ fun buildMenu(plugin: EcoPlugin, menu: EcoMenu, config: Config): Menu {
for (slotConfig in config.getSubsections("slots")) { for (slotConfig in config.getSubsections("slots")) {
val slot = ConfigurableSlot( val slot = ConfigurableSlot(
plugin,
ViolationContext(plugin, "menu ${menu.id}"), ViolationContext(plugin, "menu ${menu.id}"),
slotConfig slotConfig
) )

View File

@@ -1,19 +0,0 @@
package com.willfp.ecomenus.slots
import com.willfp.eco.core.gui.menu.Menu
import com.willfp.eco.core.gui.slot.Slot
import com.willfp.ecomponent.SlotAction
import com.willfp.libreforge.EmptyProvidedHolder
import com.willfp.libreforge.conditions.ConditionList
import org.bukkit.entity.Player
import org.bukkit.event.inventory.InventoryClickEvent
interface SlotFunction {
fun execute(player: Player, event: InventoryClickEvent, slot: Slot, menu: Menu)
fun toSlotAction(conditions: ConditionList): SlotAction = { player, event, slot, menu ->
if (conditions.areMet(player, EmptyProvidedHolder)) {
this.execute(player, event, slot, menu)
}
}
}

View File

@@ -1,12 +0,0 @@
package com.willfp.ecomenus.slots
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.config.interfaces.Config
import com.willfp.eco.core.gui.slot.SlotBuilder
import com.willfp.eco.core.registry.KRegistrable
import com.willfp.ecomponent.SlotAction
import com.willfp.libreforge.ViolationContext
abstract class SlotType(override val id: String) : KRegistrable {
abstract fun create(config: Config, plugin: EcoPlugin, context: ViolationContext): SlotFunction?
}

View File

@@ -1,18 +0,0 @@
package com.willfp.ecomenus.slots
import com.willfp.eco.core.registry.Registry
import com.willfp.ecomenus.slots.impl.SlotTypeClose
import com.willfp.ecomenus.slots.impl.SlotTypeCommand
import com.willfp.ecomenus.slots.impl.SlotTypeConsoleCommand
import com.willfp.ecomenus.slots.impl.SlotTypeEffects
import com.willfp.ecomenus.slots.impl.SlotTypeMenu
object SlotTypes : Registry<SlotType>() {
init {
register(SlotTypeCommand)
register(SlotTypeConsoleCommand)
register(SlotTypeMenu)
register(SlotTypeClose)
register(SlotTypeEffects)
}
}

View File

@@ -1,28 +0,0 @@
package com.willfp.ecomenus.slots.impl
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.config.interfaces.Config
import com.willfp.eco.core.gui.menu.Menu
import com.willfp.eco.core.gui.slot.Slot
import com.willfp.ecomenus.menus.EcoMenu
import com.willfp.ecomenus.menus.EcoMenus
import com.willfp.ecomenus.menus.close
import com.willfp.ecomenus.menus.open
import com.willfp.ecomenus.slots.SlotFunction
import com.willfp.ecomenus.slots.SlotType
import com.willfp.libreforge.ViolationContext
import org.bukkit.Bukkit
import org.bukkit.entity.Player
import org.bukkit.event.inventory.InventoryClickEvent
object SlotTypeClose : SlotType("close") {
override fun create(config: Config, plugin: EcoPlugin, context: ViolationContext): SlotFunction {
return CloseSlotFunction
}
private object CloseSlotFunction : SlotFunction {
override fun execute(player: Player, event: InventoryClickEvent, slot: Slot, menu: Menu) {
menu.close(player)
}
}
}

View File

@@ -1,37 +0,0 @@
package com.willfp.ecomenus.slots.impl
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.config.interfaces.Config
import com.willfp.eco.core.gui.menu.Menu
import com.willfp.eco.core.gui.slot.Slot
import com.willfp.eco.core.placeholder.context.placeholderContext
import com.willfp.eco.core.placeholder.translatePlaceholders
import com.willfp.ecomenus.slots.SlotFunction
import com.willfp.ecomenus.slots.SlotType
import com.willfp.libreforge.ViolationContext
import org.bukkit.Bukkit
import org.bukkit.command.CommandSender
import org.bukkit.entity.Player
import org.bukkit.event.inventory.InventoryClickEvent
object SlotTypeCommand : SlotType("command") {
override fun create(config: Config, plugin: EcoPlugin, context: ViolationContext): SlotFunction {
val commands = config.getStrings("commands")
return CommandSlotFunction(commands)
}
}
class CommandSlotFunction(
private val commands: List<String>,
private val sender: CommandSender? = null
) : SlotFunction {
override fun execute(player: Player, event: InventoryClickEvent, slot: Slot, menu: Menu) {
for (command in commands) {
Bukkit.dispatchCommand(
sender ?: player,
command.translatePlaceholders(placeholderContext(player = player))
)
}
}
}

View File

@@ -1,20 +0,0 @@
package com.willfp.ecomenus.slots.impl
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.config.interfaces.Config
import com.willfp.eco.core.gui.menu.Menu
import com.willfp.eco.core.gui.slot.Slot
import com.willfp.ecomenus.slots.SlotFunction
import com.willfp.ecomenus.slots.SlotType
import com.willfp.libreforge.ViolationContext
import org.bukkit.Bukkit
import org.bukkit.entity.Player
import org.bukkit.event.inventory.InventoryClickEvent
object SlotTypeConsoleCommand : SlotType("console_command") {
override fun create(config: Config, plugin: EcoPlugin, context: ViolationContext): SlotFunction {
val commands = config.getStrings("commands")
return CommandSlotFunction(commands, Bukkit.getConsoleSender())
}
}

View File

@@ -1,38 +0,0 @@
package com.willfp.ecomenus.slots.impl
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.config.interfaces.Config
import com.willfp.eco.core.gui.menu.Menu
import com.willfp.eco.core.gui.slot.Slot
import com.willfp.ecomenus.slots.SlotFunction
import com.willfp.ecomenus.slots.SlotType
import com.willfp.libreforge.ViolationContext
import com.willfp.libreforge.effects.Chain
import com.willfp.libreforge.effects.Effects
import com.willfp.libreforge.effects.executors.ChainExecutors
import com.willfp.libreforge.triggers.DispatchedTrigger
import com.willfp.libreforge.triggers.Trigger
import com.willfp.libreforge.triggers.TriggerData
import com.willfp.libreforge.triggers.TriggerParameter
import org.bukkit.entity.Player
import org.bukkit.event.inventory.InventoryClickEvent
object SlotTypeEffects : SlotType("effects") {
override fun create(config: Config, plugin: EcoPlugin, context: ViolationContext): SlotFunction? {
val chain = Effects.compileChain(
config.getSubsections("effects"),
ChainExecutors.getByID(config.getString("run-type")),
context
) ?: return null
return SlotFunctionEffects(chain)
}
private class SlotFunctionEffects(
private val chain: Chain
) : SlotFunction {
override fun execute(player: Player, event: InventoryClickEvent, slot: Slot, menu: Menu) {
chain.trigger(player)
}
}
}

View File

@@ -1,27 +0,0 @@
package com.willfp.ecomenus.slots.impl
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.config.interfaces.Config
import com.willfp.eco.core.gui.menu.Menu
import com.willfp.eco.core.gui.slot.Slot
import com.willfp.ecomenus.menus.EcoMenu
import com.willfp.ecomenus.menus.EcoMenus
import com.willfp.ecomenus.menus.open
import com.willfp.ecomenus.slots.SlotFunction
import com.willfp.ecomenus.slots.SlotType
import com.willfp.libreforge.ViolationContext
import org.bukkit.Bukkit
import org.bukkit.entity.Player
import org.bukkit.event.inventory.InventoryClickEvent
object SlotTypeMenu : SlotType("menu") {
override fun create(config: Config, plugin: EcoPlugin, context: ViolationContext): SlotFunction? {
val ecoMenu = EcoMenus[config.getString("menu")] ?: return null
return object : SlotFunction {
override fun execute(player: Player, event: InventoryClickEvent, slot: Slot, menu: Menu) {
ecoMenu.open(player, menu)
}
}
}
}

View File

@@ -102,22 +102,14 @@ slots:
# If the item should be shown if the conditions are not met # If the item should be shown if the conditions are not met
show-if-not-met: false show-if-not-met: false
# Read https://plugins.auxilor.io/effects/configuring-an-effect
# The effects ran when the item is clicked
left-click: left-click:
- type: effects
effects:
- id: send_message - id: send_message
args: args:
message: "&cYou clicked the close button!" message: "&cYou clicked the close button!"
- type: close - id: close_inventory
commands: [ ]
- type: menu
menu: other_example_menu
- type: console_command
commands:
- "eco give %player% 100"
- item: player_head head:%player% name:"&f%player%" - item: player_head head:%player% name:"&f%player%"
location: location:
@@ -125,10 +117,11 @@ slots:
column: 5 column: 5
page: 1 page: 1
left-click: shift-right-click:
- type: menu - id: open_menu
args:
menu: other_example_menu menu: other_example_menu
- type: console_command - id: run_command
commands: args:
- "eco give %player% 100" command: "eco give %player% 100"