9
0
mirror of https://github.com/Auxilor/EcoJobs.git synced 2025-12-20 15:39:26 +00:00

Compare commits

...

28 Commits

Author SHA1 Message Date
Auxilor
2a72f7d6ce libreforge-updater 2022-12-09 17:00:49 +00:00
Auxilor
762a871354 libreforge-updater 2022-12-05 10:49:59 +00:00
Auxilor
b101e23a86 libreforge-updater 2022-11-30 17:37:48 +00:00
Auxilor
07e1cb7797 libreforge-updater 2022-11-27 21:43:56 +00:00
Auxilor
409a84aea8 libreforge-updater 2022-11-26 19:19:52 +00:00
Auxilor
886b2e0c06 libreforge-updater 2022-11-24 14:29:42 +00:00
Auxilor
0ff5dcf670 libreforge-updater 2022-11-23 17:24:43 +00:00
Auxilor
1b93969d3b libreforge-updater 2022-11-21 16:02:22 +00:00
Auxilor
af5f5cfba6 Updated to 1.26.2 2022-11-21 12:59:11 +00:00
Auxilor
2c726fd9ac Fixed jumberjack 2022-11-21 12:59:03 +00:00
Auxilor
8dbe453bc5 Fix 2022-11-21 12:57:23 +00:00
Auxilor
768d2218d0 Fix 2022-11-21 11:45:20 +00:00
Auxilor
e212762951 Fix 2022-11-21 11:45:05 +00:00
Auxilor
c5d7e07d49 Updated to 1.26.1 2022-11-21 11:41:54 +00:00
Auxilor
88d118cdd7 Added /jobs <job> 2022-11-21 11:41:46 +00:00
Auxilor
b08616b01e libreforge-updater 2022-11-17 08:37:53 +00:00
Auxilor
3811e46fac libreforge-updater 2022-11-12 17:33:55 +00:00
Auxilor
b16905e435 Improved default config 2022-11-07 12:49:10 +00:00
Auxilor
e0084d61f7 Added %join_lore% and %leave_lore% 2022-11-07 12:47:15 +00:00
Auxilor
3606d5f12b Updated to 1.24.0 2022-11-07 12:36:37 +00:00
Auxilor
599b2800d8 Added confirmation GUI, improved prices 2022-11-07 12:36:28 +00:00
Auxilor
e4af959945 libreforge-updater 2022-11-06 19:51:41 +00:00
Auxilor
d1af2e25e7 Reworked Level GUI to use ecomponent 2022-11-06 15:29:38 +00:00
Auxilor
1eb0bdb639 libreforge-updater 2022-11-01 16:22:52 +00:00
Will FP
85e117ba78 Merge pull request #12 from 0ft3n/master
/jobs join tabcompletion fix (hardest fix in my life)
2022-11-01 16:18:08 +00:00
_OfTeN_
e27077dd71 Hardest fix in my life 2022-10-29 15:49:50 +03:00
Auxilor
17f471228d libreforge-updater 2022-10-28 11:34:14 +01:00
Auxilor
14d0997690 libreforge-updater 2022-10-26 22:10:07 +01:00
23 changed files with 525 additions and 247 deletions

View File

@@ -42,12 +42,14 @@ allprojects {
shadowJar { shadowJar {
relocate('com.willfp.libreforge', 'com.willfp.ecojobs.libreforge') relocate('com.willfp.libreforge', 'com.willfp.ecojobs.libreforge')
relocate('com.willfp.ecomponent', 'com.willfp.ecojobs.ecomponent')
relocate('org.joml', 'com.willfp.ecojobs.libreforge.joml') relocate('org.joml', 'com.willfp.ecojobs.libreforge.joml')
} }
dependencies { dependencies {
compileOnly 'com.willfp:eco:6.44.0' compileOnly 'com.willfp:eco:6.46.0'
implementation 'com.willfp:libreforge:3.115.1' implementation 'com.willfp:libreforge:3.126.0'
implementation 'com.willfp:ecomponent:1.0.0'
implementation 'org.joml:joml:1.10.4' implementation 'org.joml:joml:1.10.4'
compileOnly 'org.jetbrains:annotations:23.0.0' compileOnly 'org.jetbrains:annotations:23.0.0'

View File

@@ -2,9 +2,11 @@ package com.willfp.ecojobs.commands
import com.willfp.eco.core.EcoPlugin import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.command.impl.PluginCommand import com.willfp.eco.core.command.impl.PluginCommand
import com.willfp.ecojobs.jobs.Jobs
import com.willfp.ecojobs.jobs.JobsGUI import com.willfp.ecojobs.jobs.JobsGUI
import org.bukkit.command.CommandSender import com.willfp.ecojobs.jobs.hasJob
import org.bukkit.entity.Player import org.bukkit.entity.Player
import org.bukkit.util.StringUtil
class CommandJobs(plugin: EcoPlugin) : PluginCommand(plugin, "jobs", "ecojobs.command.jobs", true) { class CommandJobs(plugin: EcoPlugin) : PluginCommand(plugin, "jobs", "ecojobs.command.jobs", true) {
init { init {
@@ -12,8 +14,44 @@ class CommandJobs(plugin: EcoPlugin) : PluginCommand(plugin, "jobs", "ecojobs.co
.addSubcommand(CommandLeave(plugin)) .addSubcommand(CommandLeave(plugin))
} }
override fun onExecute(player: CommandSender, args: List<String>) { override fun onExecute(player: Player, args: List<String>) {
player as Player if (args.isEmpty()) {
JobsGUI.open(player) JobsGUI.open(player)
return
}
val id = args[0].lowercase()
val job = Jobs.getByID(id)
if (job == null) {
player.sendMessage(plugin.langYml.getMessage("invalid-job"))
return
}
if (!player.hasJob(job)) {
player.sendMessage(plugin.langYml.getMessage("dont-have-job"))
return
}
job.levelGUI.open(player)
}
override fun tabComplete(player: Player, args: List<String>): List<String> {
val completions = mutableListOf<String>()
if (args.isEmpty()) {
return Jobs.values().filter { player.hasJob(it) }.map { it.id }
}
if (args.size == 1) {
StringUtil.copyPartialMatches(
args[0],
Jobs.values().filter { player.hasJob(it) }.map { it.id },
completions
)
return completions
}
return emptyList()
} }
} }

View File

@@ -33,6 +33,11 @@ class CommandJoin(plugin: EcoPlugin) : Subcommand(plugin, "join", "ecojobs.comma
return return
} }
if (player.activeJob != null) {
player.sendMessage(plugin.langYml.getMessage("leave-current-job"))
return
}
player.sendMessage( player.sendMessage(
plugin.langYml.getMessage("joined-job", StringUtils.FormatOption.WITHOUT_PLACEHOLDERS) plugin.langYml.getMessage("joined-job", StringUtils.FormatOption.WITHOUT_PLACEHOLDERS)
.replace("%job%", job.name) .replace("%job%", job.name)
@@ -47,13 +52,12 @@ class CommandJoin(plugin: EcoPlugin) : Subcommand(plugin, "join", "ecojobs.comma
val completions = mutableListOf<String>() val completions = mutableListOf<String>()
if (args.isEmpty()) { if (args.isEmpty()) {
// Currently, this case is not ever reached
return Jobs.values().filter { sender.hasJob(it) }.map { it.id } return Jobs.values().filter { sender.hasJob(it) }.map { it.id }
} }
if (args.size == 1) { if (args.size == 1) {
StringUtil.copyPartialMatches( StringUtil.copyPartialMatches(
args[1], args[0],
Jobs.values().filter { sender.hasJob(it) }.map { it.id }, Jobs.values().filter { sender.hasJob(it) }.map { it.id },
completions completions
) )

View File

@@ -2,7 +2,6 @@ package com.willfp.ecojobs.commands
import com.willfp.eco.core.EcoPlugin import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.command.impl.Subcommand import com.willfp.eco.core.command.impl.Subcommand
import com.willfp.eco.util.StringUtils
import com.willfp.ecojobs.jobs.activeJob import com.willfp.ecojobs.jobs.activeJob
import org.bukkit.command.CommandSender import org.bukkit.command.CommandSender
import org.bukkit.entity.Player import org.bukkit.entity.Player
@@ -16,11 +15,20 @@ class CommandLeave(plugin: EcoPlugin) : Subcommand(plugin, "leave", "ecojobs.com
return return
} }
player.sendMessage( val job = player.activeJob ?: return
plugin.langYml.getMessage("left-job", StringUtils.FormatOption.WITHOUT_PLACEHOLDERS)
.replace("%job%", player.activeJob?.name ?: "")
)
player.activeJob = null player.activeJob = null
if (player.activeJob == null) {
player.sendMessage(
plugin.langYml.getMessage("left-job")
.replace("%job%", job.name)
)
} else {
player.sendMessage(
plugin.langYml.getMessage("cant-leave-job")
.replace("%job%", job.name)
)
}
} }
} }

View File

@@ -10,6 +10,8 @@ import com.willfp.eco.core.items.builder.ItemStackBuilder
import com.willfp.eco.core.placeholder.PlayerPlaceholder import com.willfp.eco.core.placeholder.PlayerPlaceholder
import com.willfp.eco.core.placeholder.PlayerStaticPlaceholder import com.willfp.eco.core.placeholder.PlayerStaticPlaceholder
import com.willfp.eco.core.placeholder.PlayerlessPlaceholder import com.willfp.eco.core.placeholder.PlayerlessPlaceholder
import com.willfp.eco.core.price.ConfiguredPrice
import com.willfp.eco.core.price.impl.PriceEconomy
import com.willfp.eco.util.NumberUtils import com.willfp.eco.util.NumberUtils
import com.willfp.eco.util.formatEco import com.willfp.eco.util.formatEco
import com.willfp.eco.util.toNiceString import com.willfp.eco.util.toNiceString
@@ -18,7 +20,6 @@ import com.willfp.ecojobs.api.event.PlayerJobExpGainEvent
import com.willfp.ecojobs.api.event.PlayerJobJoinEvent import com.willfp.ecojobs.api.event.PlayerJobJoinEvent
import com.willfp.ecojobs.api.event.PlayerJobLeaveEvent import com.willfp.ecojobs.api.event.PlayerJobLeaveEvent
import com.willfp.ecojobs.api.event.PlayerJobLevelUpEvent import com.willfp.ecojobs.api.event.PlayerJobLevelUpEvent
import com.willfp.ecojobs.jobs.Jobs.unlockedJobs
import com.willfp.libreforge.conditions.Conditions import com.willfp.libreforge.conditions.Conditions
import com.willfp.libreforge.conditions.ConfiguredCondition import com.willfp.libreforge.conditions.ConfiguredCondition
import com.willfp.libreforge.effects.ConfiguredEffect import com.willfp.libreforge.effects.ConfiguredEffect
@@ -29,7 +30,7 @@ import org.bukkit.Bukkit
import org.bukkit.OfflinePlayer import org.bukkit.OfflinePlayer
import org.bukkit.entity.Player import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
import java.util.* import java.util.Objects
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
import kotlin.math.abs import kotlin.math.abs
@@ -42,8 +43,16 @@ class Job(
val description = config.getFormattedString("description") val description = config.getFormattedString("description")
val isUnlockedByDefault = config.getBool("unlocked-by-default") val isUnlockedByDefault = config.getBool("unlocked-by-default")
val resetsOnQuit = config.getBool("reset-on-quit") val resetsOnQuit = config.getBool("reset-on-quit")
val joinPrice = config.getDouble("join-price")
val leavePrice = config.getDouble("leave-price") val joinPrice = ConfiguredPrice.create(config.getSubsection("join-price")) ?: ConfiguredPrice(
PriceEconomy(config.getDouble("join-price")),
""
)
val leavePrice = ConfiguredPrice.create(config.getSubsection("leave-price")) ?: ConfiguredPrice(
PriceEconomy(config.getDouble("leave-price")),
""
)
val levelKey: PersistentDataKey<Int> = PersistentDataKey( val levelKey: PersistentDataKey<Int> = PersistentDataKey(
EcoJobsPlugin.instance.namespacedKeyFactory.create("${id}_level"), EcoJobsPlugin.instance.namespacedKeyFactory.create("${id}_level"),
@@ -63,6 +72,8 @@ class Job(
val levelGUI = JobLevelGUI(plugin, this) val levelGUI = JobLevelGUI(plugin, this)
val leaveGUI = JobLeaveGUI(plugin, this)
private val baseItem: ItemStack = Items.lookup(config.getString("icon")).item private val baseItem: ItemStack = Items.lookup(config.getString("icon")).item
private val effects: Set<ConfiguredEffect> private val effects: Set<ConfiguredEffect>
@@ -248,6 +259,24 @@ class Job(
} }
} }
private fun getLeaveLore(level: Int, whitespace: Int = 0): List<String> =
this.config.getStrings("leave-lore")
.map {
levelPlaceholders.format(it, level)
}
.map {
" ".repeat(whitespace) + it
}
private fun getJoinLore(level: Int, whitespace: Int = 0): List<String> =
this.config.getStrings("join-lore")
.map {
levelPlaceholders.format(it, level)
}
.map {
" ".repeat(whitespace) + it
}
fun injectPlaceholdersInto(lore: List<String>, player: Player, forceLevel: Int? = null): List<String> { fun injectPlaceholdersInto(lore: List<String>, player: Player, forceLevel: Int? = null): List<String> {
val withPlaceholders = lore val withPlaceholders = lore
.map { .map {
@@ -264,8 +293,8 @@ class Job(
.replace("%description%", this.description) .replace("%description%", this.description)
.replace("%job%", this.name) .replace("%job%", this.name)
.replace("%level%", (forceLevel ?: player.getJobLevel(this)).toString()) .replace("%level%", (forceLevel ?: player.getJobLevel(this)).toString())
.replace("%join_price%", NumberUtils.format(this.joinPrice)) .replace("%join_price%", this.joinPrice.getDisplay(player))
.replace("%leave_price%", NumberUtils.format(this.leavePrice)) .replace("%leave_price%", this.leavePrice.getDisplay(player))
} }
.toMutableList() .toMutableList()
@@ -281,6 +310,10 @@ class Job(
getRewardsDescription(forceLevel ?: player.getJobLevel(this), whitespace) getRewardsDescription(forceLevel ?: player.getJobLevel(this), whitespace)
} else if (s.contains("%level_up_messages%")) { } else if (s.contains("%level_up_messages%")) {
getLevelUpMessages(forceLevel ?: player.getJobLevel(this), whitespace) getLevelUpMessages(forceLevel ?: player.getJobLevel(this), whitespace)
} else if (s.contains("%leave_lore%")) {
getLeaveLore(forceLevel ?: player.getJobLevel(this), whitespace)
} else if (s.contains("%join_lore%")) {
getJoinLore(forceLevel ?: player.getJobLevel(this), whitespace)
} else { } else {
listOf(s) listOf(s)
} }
@@ -294,7 +327,6 @@ class Job(
val base = baseItem.clone() val base = baseItem.clone()
val level = player.getJobLevel(this) val level = player.getJobLevel(this)
val isActive = player.activeJob == this
return ItemStackBuilder(base) return ItemStackBuilder(base)
.setDisplayName( .setDisplayName(
@@ -304,8 +336,11 @@ class Job(
) )
.addLoreLines { .addLoreLines {
injectPlaceholdersInto(plugin.configYml.getStrings("gui.job-icon.lore"), player) + injectPlaceholdersInto(plugin.configYml.getStrings("gui.job-icon.lore"), player) +
if (isActive) plugin.configYml.getStrings("gui.job-icon.active-lore") else when (player.activeJob) {
plugin.configYml.getStrings("gui.job-icon.not-active-lore") this -> plugin.configYml.getStrings("gui.job-icon.active-lore")
null -> plugin.configYml.getStrings("gui.job-icon.join-lore")
else -> emptyList()
}
} }
.build() .build()
} }

View File

@@ -0,0 +1,85 @@
package com.willfp.ecojobs.jobs
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.gui.menu
import com.willfp.eco.core.gui.onLeftClick
import com.willfp.eco.core.gui.slot
import com.willfp.eco.core.gui.slot.FillerMask
import com.willfp.eco.core.gui.slot.MaskItems
import com.willfp.eco.core.items.Items
import com.willfp.eco.core.items.builder.ItemStackBuilder
import com.willfp.eco.util.formatEco
import org.bukkit.entity.Player
class JobLeaveGUI(
plugin: EcoPlugin,
job: Job
) {
private val menu = menu(plugin.configYml.getInt("leave-gui.rows")) {
val maskPattern = plugin.configYml.getStrings("leave-gui.mask.pattern").toTypedArray()
val maskItems = MaskItems.fromItemNames(plugin.configYml.getStrings("leave-gui.mask.materials"))
title = plugin.configYml.getString("leave-gui.title")
.replace("%job%", job.name)
.formatEco()
setMask(
FillerMask(
maskItems,
*maskPattern
)
)
setSlot(
plugin.configYml.getInt("leave-gui.cancel.location.row"),
plugin.configYml.getInt("leave-gui.cancel.location.column"),
slot({ player, _ ->
ItemStackBuilder(Items.lookup(plugin.configYml.getString("leave-gui.cancel.item")))
.setDisplayName(plugin.configYml.getString("leave-gui.cancel.name").replace("%job%", job.name))
.addLoreLines(
job.injectPlaceholdersInto(plugin.configYml.getStrings("leave-gui.cancel.lore"), player)
)
.build()
}) {
onLeftClick { player, _, _, _ ->
JobsGUI.open(player)
}
}
)
setSlot(
plugin.configYml.getInt("leave-gui.confirm.location.row"),
plugin.configYml.getInt("leave-gui.confirm.location.column"),
slot({ player, _ ->
ItemStackBuilder(Items.lookup(plugin.configYml.getString("leave-gui.confirm.item")))
.setDisplayName(plugin.configYml.getString("leave-gui.confirm.name").replace("%job%", job.name))
.addLoreLines(
job.injectPlaceholdersInto(plugin.configYml.getStrings("leave-gui.confirm.lore"), player)
)
.build()
}) {
onLeftClick { player, _, _, _ ->
player.activeJob = null
if (player.activeJob == null) {
player.sendMessage(
plugin.langYml.getMessage("left-job")
.replace("%job%", job.name)
)
} else {
player.sendMessage(
plugin.langYml.getMessage("cant-leave-job")
.replace("%job%", job.name)
)
}
JobsGUI.open(player)
}
}
)
}
fun open(player: Player) {
menu.open(player)
}
}

View File

@@ -3,6 +3,9 @@ package com.willfp.ecojobs.jobs
import com.willfp.eco.core.EcoPlugin import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.gui.menu import com.willfp.eco.core.gui.menu
import com.willfp.eco.core.gui.menu.Menu import com.willfp.eco.core.gui.menu.Menu
import com.willfp.eco.core.gui.menu.MenuLayer
import com.willfp.eco.core.gui.onLeftClick
import com.willfp.eco.core.gui.page.PageChanger
import com.willfp.eco.core.gui.slot import com.willfp.eco.core.gui.slot
import com.willfp.eco.core.gui.slot.ConfigSlot import com.willfp.eco.core.gui.slot.ConfigSlot
import com.willfp.eco.core.gui.slot.FillerMask import com.willfp.eco.core.gui.slot.FillerMask
@@ -10,63 +13,61 @@ import com.willfp.eco.core.gui.slot.MaskItems
import com.willfp.eco.core.items.Items import com.willfp.eco.core.items.Items
import com.willfp.eco.core.items.builder.ItemStackBuilder import com.willfp.eco.core.items.builder.ItemStackBuilder
import com.willfp.eco.util.NumberUtils import com.willfp.eco.util.NumberUtils
import org.bukkit.Material import com.willfp.ecomponent.components.LevelComponent
import com.willfp.ecomponent.components.LevelState
import org.bukkit.entity.Player import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
import kotlin.math.ceil
import kotlin.math.max
import kotlin.math.min
import kotlin.properties.Delegates
class JobLevelGUI( class JobLevelGUI(
plugin: EcoPlugin, plugin: EcoPlugin,
private val job: Job private val job: Job
) { ) {
private val menu: Menu private val menu: Menu
private val pageKey = "page"
private var levelsPerPage by Delegates.notNull<Int>()
private var pages by Delegates.notNull<Int>()
private fun getPage(menu: Menu, player: Player): Int {
val page = menu.getState(player, pageKey) ?: 1
return min(pages, max(page, 1))
}
init { init {
val maskPattern = plugin.configYml.getStrings("level-gui.mask.pattern").toTypedArray() val maskPattern = plugin.configYml.getStrings("level-gui.mask.pattern").toTypedArray()
val maskItems = MaskItems.fromItemNames(plugin.configYml.getStrings("level-gui.mask.materials")) val maskItems = MaskItems.fromItemNames(plugin.configYml.getStrings("level-gui.mask.materials"))
val progressionOrder = "123456789abcdefghijklmnopqrstuvwxyz"
val progressionPattern = plugin.configYml.getStrings("level-gui.progression-slots.pattern") val progressionPattern = plugin.configYml.getStrings("level-gui.progression-slots.pattern")
val progressionSlots = mutableMapOf<Int, Pair<Int, Int>>() val component = object : LevelComponent(progressionPattern, job.maxLevel) {
override fun getLevelItem(player: Player, menu: Menu, level: Int, levelState: LevelState): ItemStack {
val key = levelState.name.lowercase().replace("_", "-")
var x = 0 return ItemStackBuilder(Items.lookup(plugin.configYml.getString("level-gui.progression-slots.$key.item")))
for (row in progressionPattern) { .setDisplayName(
x++ plugin.configYml.getFormattedString("level-gui.progression-slots.$key.name")
var y = 0 .replace("%job%", job.name)
for (char in row) { .replace("%level%", level.toString())
y++ .replace("%level_numeral%", NumberUtils.toNumeral(level))
if (char == '0') { )
continue .addLoreLines(
job.injectPlaceholdersInto(
plugin.configYml.getFormattedStrings("level-gui.progression-slots.$key.lore"),
player,
forceLevel = level
)
)
.setAmount(
if (plugin.configYml.getBool("level-gui.progression-slots.level-as-amount")) level else 1
)
.build()
} }
val pos = progressionOrder.indexOf(char) override fun getLevelState(player: Player, level: Int): LevelState {
return when {
if (pos == -1) { level <= player.getJobLevel(job) -> LevelState.UNLOCKED
continue level == player.getJobLevel(job) + 1 -> LevelState.IN_PROGRESS
} else -> LevelState.LOCKED
}
progressionSlots[pos + 1] = Pair(x, y)
} }
} }
levelsPerPage = progressionSlots.size
pages = ceil(job.maxLevel.toDouble() / levelsPerPage).toInt()
menu = menu(plugin.configYml.getInt("level-gui.rows")) { menu = menu(plugin.configYml.getInt("level-gui.rows")) {
title = job.name title = job.name
maxPages(component.pages)
setMask( setMask(
FillerMask( FillerMask(
maskItems, maskItems,
@@ -74,58 +75,11 @@ class JobLevelGUI(
) )
) )
for ((level, value) in progressionSlots) { addComponent(1, 1, component)
setSlot(
value.first,
value.second,
slot(ItemStack(Material.BLACK_STAINED_GLASS_PANE)) {
setUpdater { player, menu, _ ->
val page = getPage(menu, player)
val slotLevel = ((page - 1) * levelsPerPage) + level // Instead of the page changer, this will show up when on the first page
addComponent(
fun getItem(section: String) = MenuLayer.LOWER,
ItemStackBuilder(Items.lookup(plugin.configYml.getString("level-gui.progression-slots.$section.item")))
.setDisplayName(
plugin.configYml.getFormattedString("level-gui.progression-slots.$section.name")
.replace("%job%", job.name)
.replace("%level%", slotLevel.toString())
.replace("%level_numeral%", NumberUtils.toNumeral(slotLevel))
)
.addLoreLines(
job.injectPlaceholdersInto(
plugin.configYml.getFormattedStrings("level-gui.progression-slots.$section.lore"),
player,
forceLevel = slotLevel
)
)
.build()
if (slotLevel > job.maxLevel) {
maskItems.items[0].item
} else {
val item = when {
slotLevel <= player.getJobLevel(job) -> {
getItem("unlocked")
}
slotLevel == player.getJobLevel(job) + 1 -> {
getItem("in-progress")
}
else -> {
getItem("locked")
}
}
if (plugin.configYml.getBool("level-gui.progression-slots.level-as-amount")) {
item.amount = slotLevel
}
item
}
}
}
)
}
setSlot(
plugin.configYml.getInt("level-gui.progression-slots.prev-page.location.row"), plugin.configYml.getInt("level-gui.progression-slots.prev-page.location.row"),
plugin.configYml.getInt("level-gui.progression-slots.prev-page.location.column"), plugin.configYml.getInt("level-gui.progression-slots.prev-page.location.column"),
slot( slot(
@@ -133,38 +87,30 @@ class JobLevelGUI(
.setDisplayName(plugin.configYml.getString("level-gui.progression-slots.prev-page.name")) .setDisplayName(plugin.configYml.getString("level-gui.progression-slots.prev-page.name"))
.build() .build()
) { ) {
onLeftClick { event, _, menu -> onLeftClick { player, _, _, _ -> JobsGUI.open(player) }
val player = event.whoClicked as Player
val page = getPage(menu, player)
val newPage = max(0, page - 1)
if (newPage == 0) {
JobsGUI.open(player)
} else {
menu.setState(player, pageKey, newPage)
}
}
} }
) )
setSlot(
addComponent(
plugin.configYml.getInt("level-gui.progression-slots.prev-page.location.row"),
plugin.configYml.getInt("level-gui.progression-slots.prev-page.location.column"),
PageChanger(
ItemStackBuilder(Items.lookup(plugin.configYml.getString("level-gui.progression-slots.prev-page.material")))
.setDisplayName(plugin.configYml.getString("level-gui.progression-slots.prev-page.name"))
.build(),
PageChanger.Direction.BACKWARDS
)
)
addComponent(
plugin.configYml.getInt("level-gui.progression-slots.next-page.location.row"), plugin.configYml.getInt("level-gui.progression-slots.next-page.location.row"),
plugin.configYml.getInt("level-gui.progression-slots.next-page.location.column"), plugin.configYml.getInt("level-gui.progression-slots.next-page.location.column"),
slot( PageChanger(
ItemStackBuilder(Items.lookup(plugin.configYml.getString("level-gui.progression-slots.next-page.material"))) ItemStackBuilder(Items.lookup(plugin.configYml.getString("level-gui.progression-slots.next-page.material")))
.setDisplayName(plugin.configYml.getString("level-gui.progression-slots.next-page.name")) .setDisplayName(plugin.configYml.getString("level-gui.progression-slots.next-page.name"))
.build() .build(),
) { PageChanger.Direction.FORWARDS
onLeftClick { event, _, menu -> )
val player = event.whoClicked as Player
val page = getPage(menu, player)
val newPage = min(pages, page + 1)
menu.setState(player, pageKey, newPage)
}
}
) )
setSlot( setSlot(

View File

@@ -3,6 +3,7 @@ package com.willfp.ecojobs.jobs
import com.willfp.eco.core.config.updating.ConfigUpdater import com.willfp.eco.core.config.updating.ConfigUpdater
import com.willfp.eco.core.gui.menu import com.willfp.eco.core.gui.menu
import com.willfp.eco.core.gui.menu.Menu import com.willfp.eco.core.gui.menu.Menu
import com.willfp.eco.core.gui.onLeftClick
import com.willfp.eco.core.gui.slot import com.willfp.eco.core.gui.slot
import com.willfp.eco.core.gui.slot.ConfigSlot import com.willfp.eco.core.gui.slot.ConfigSlot
import com.willfp.eco.core.gui.slot.FillerMask import com.willfp.eco.core.gui.slot.FillerMask
@@ -99,10 +100,6 @@ object JobsGUI {
val (row, column) = pair val (row, column) = pair
setSlot(row, column, slot({ p, m -> jobIconBuilder(p, m, index) }) { setSlot(row, column, slot({ p, m -> jobIconBuilder(p, m, index) }) {
setUpdater { p, m, _ ->
jobIconBuilder(p, m, index)
}
onLeftClick { event, _, _ -> onLeftClick { event, _, _ ->
val player = event.whoClicked as Player val player = event.whoClicked as Player
@@ -114,8 +111,10 @@ object JobsGUI {
val job = unlockedJobs.getOrNull(pagedIndex) ?: return@onLeftClick val job = unlockedJobs.getOrNull(pagedIndex) ?: return@onLeftClick
if (player.activeJob != job) { if (player.activeJob == null) {
player.activeJob = job player.activeJob = job
} else {
player.sendMessage(plugin.langYml.getMessage("leave-current-job"))
} }
player.playSound( player.playSound(
@@ -189,9 +188,8 @@ object JobsGUI {
.setDisplayName(plugin.configYml.getString("gui.deactivate-job.name")) .setDisplayName(plugin.configYml.getString("gui.deactivate-job.name"))
.build() .build()
) { ) {
onLeftClick { event, _ -> onLeftClick { player, _, _, _ ->
val player = event.whoClicked as Player player.activeJob?.leaveGUI?.open(player)
player.activeJob = null
} }
} }
) )

View File

@@ -1,8 +1,8 @@
package com.willfp.ecojobs.jobs package com.willfp.ecojobs.jobs
import com.willfp.eco.core.integrations.economy.balance
import com.willfp.ecojobs.api.event.PlayerJobJoinEvent import com.willfp.ecojobs.api.event.PlayerJobJoinEvent
import com.willfp.ecojobs.api.event.PlayerJobLeaveEvent import com.willfp.ecojobs.api.event.PlayerJobLeaveEvent
import org.bukkit.entity.Player
import org.bukkit.event.EventHandler import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority import org.bukkit.event.EventPriority
import org.bukkit.event.Listener import org.bukkit.event.Listener
@@ -13,19 +13,16 @@ object PriceHandler : Listener {
ignoreCancelled = true ignoreCancelled = true
) )
fun onJoin(event: PlayerJobJoinEvent) { fun onJoin(event: PlayerJobJoinEvent) {
val player = event.player val player = event.player as? Player ?: return
val job = event.job val job = event.job
val price = job.joinPrice val price = job.joinPrice
if (price > 0) { if (!price.canAfford(player)) {
val hasMoney = player.balance >= price
if (!hasMoney) {
event.isCancelled = true event.isCancelled = true
return
} }
player.balance -= price price.pay(player)
}
} }
@EventHandler( @EventHandler(
@@ -33,18 +30,15 @@ object PriceHandler : Listener {
ignoreCancelled = true ignoreCancelled = true
) )
fun onLeave(event: PlayerJobLeaveEvent) { fun onLeave(event: PlayerJobLeaveEvent) {
val player = event.player val player = event.player as? Player ?: return
val job = event.job val job = event.job
val price = job.leavePrice val price = job.leavePrice
if (price > 0) { if (!price.canAfford(player)) {
val hasMoney = player.balance >= price
if (!hasMoney) {
event.isCancelled = true event.isCancelled = true
return
} }
player.balance -= price price.pay(player)
}
} }
} }

View File

@@ -78,11 +78,11 @@ gui:
active-lore: active-lore:
- "" - ""
- "&cThis job is already active!" - "&cYou've already joined this job!"
not-active-lore: join-lore:
- "" - ""
- "&eClick to activate this job!" - "&eClick to join this job!"
click: click:
sound: ui_button_click sound: ui_button_click
@@ -216,6 +216,53 @@ level-gui:
# Custom GUI slots; see here for a how-to: https://plugins.auxilor.io/all-plugins/custom-gui-slots # Custom GUI slots; see here for a how-to: https://plugins.auxilor.io/all-plugins/custom-gui-slots
custom-slots: [ ] custom-slots: [ ]
leave-gui:
rows: 3
title: "Confirm Leaving %job%"
mask:
# The way the mask works is by having a list of materials
# And then a pattern to use those materials.
# The pattern is the rows in the GUI
# Each line must be 9 long, and the amount of rows should be the amount of rows in the GUI
# A zero represents nothing
# A 1 represents the first material
# A 2 represents the second material
# And so on, you can add up to 9.
materials:
- black_stained_glass_pane
pattern:
- "111111111"
- "110111011"
- "111111111"
cancel:
item: arrow
name: "&eCancel"
lore:
- ""
- "&fGo back to the Jobs menu"
location:
row: 2
column: 3
confirm:
item: player_head texture:eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTRiZDlhNDViOTY4MWNlYTViMjhjNzBmNzVhNjk1NmIxZjU5NGZlYzg0MGI5NjA3Nzk4ZmIxZTcwNzc2NDQzMCJ9fX0=
name: "&cLeave %job%"
lore:
- ""
- "&cAre you sure?"
- "%leave_lore%"
location:
row: 2
column: 7
# Custom GUI slots; see here for a how-to: https://plugins.auxilor.io/all-plugins/custom-gui-slots
custom-slots: [ ]
level-up: level-up:
message: message:
enabled: true enabled: true

View File

@@ -16,9 +16,28 @@ unlocked-by-default: true
# If job progress should be reset when quitting # If job progress should be reset when quitting
reset-on-quit: false reset-on-quit: false
# The price to join or leave this job (set to 0 to disable) # The price to join this job (set to 0 to disable)
join-price: 0 # Read here for more: https://plugins.auxilor.io/all-plugins/prices
leave-price: 0 join-price:
value: 0
type: coins
display: "&a$%value%"
# Lore shown when clicking on the job icon to join it
# Reference with %join_lore%
join-lore: []
# The price to leave this job (set to 0 to disable)
# Read here for more: https://plugins.auxilor.io/all-plugins/prices
leave-price:
value: 20000
type: coins
display: "&a$%value%"
# Lore shown on the confirm leave button
# Reference with %leave_lore%
leave-lore:
- " &8» This will cost %leave_price%"
# The xp requirements for each job level - add new levels by adding more to this list # The xp requirements for each job level - add new levels by adding more to this list
level-xp-requirements: level-xp-requirements:

View File

@@ -5,8 +5,20 @@ unlocked-by-default: true
reset-on-quit: false reset-on-quit: false
join-price: 0 join-price:
leave-price: 0 value: 0
type: coins
display: "&a$%value%"
join-lore: []
leave-price:
value: 0
type: coins
display: "&a$%value%"
leave-lore:
- ""
level-xp-requirements: level-xp-requirements:
- 100 - 100

View File

@@ -5,8 +5,20 @@ unlocked-by-default: true
reset-on-quit: false reset-on-quit: false
join-price: 0 join-price:
leave-price: 0 value: 0
type: coins
display: "&a$%value%"
join-lore: []
leave-price:
value: 0
type: coins
display: "&a$%value%"
leave-lore:
- ""
level-xp-requirements: level-xp-requirements:
- 100 - 100

View File

@@ -1,12 +1,24 @@
name: "&#7A54FBEnchanter" name: "&#7A54FBEnchanter"
description: "&7&oLevel up by enchanting items" description: "&8&oLevel up by enchanting items"
unlocked-by-default: true unlocked-by-default: true
reset-on-quit: false reset-on-quit: false
join-price: 0 join-price:
leave-price: 0 value: 0
type: coins
display: "&a$%value%"
join-lore: []
leave-price:
value: 0
type: coins
display: "&a$%value%"
leave-lore:
- ""
level-xp-requirements: level-xp-requirements:
- 100 - 100

View File

@@ -5,8 +5,20 @@ unlocked-by-default: true
reset-on-quit: false reset-on-quit: false
join-price: 0 join-price:
leave-price: 0 value: 0
type: coins
display: "&a$%value%"
join-lore: []
leave-price:
value: 0
type: coins
display: "&a$%value%"
leave-lore:
- ""
level-xp-requirements: level-xp-requirements:
- 100 - 100

View File

@@ -5,8 +5,20 @@ unlocked-by-default: true
reset-on-quit: false reset-on-quit: false
join-price: 0 join-price:
leave-price: 0 value: 0
type: coins
display: "&a$%value%"
join-lore: []
leave-price:
value: 0
type: coins
display: "&a$%value%"
leave-lore:
- ""
level-xp-requirements: level-xp-requirements:
- 100 - 100

View File

@@ -1,12 +1,24 @@
name: "&#FB8810Lumberjack" name: "&#FD9113Lumberjack"
description: "&7&oLevel up by chopping wood" description: "&7&oLevel up by chopping wood"
unlocked-by-default: true unlocked-by-default: true
reset-on-quit: false reset-on-quit: false
join-price: 0 join-price:
leave-price: 0 value: 0
type: coins
display: "&a$%value%"
join-lore: []
leave-price:
value: 0
type: coins
display: "&a$%value%"
leave-lore:
- ""
level-xp-requirements: level-xp-requirements:
- 100 - 100
@@ -62,56 +74,57 @@ level-xp-requirements:
xp-gain-methods: xp-gain-methods:
- trigger: mine_block - trigger: mine_block
multiplier: 0.5 multiplier: 0.5
conditions: [ ]
filters: filters:
items: blocks:
- "*oak_log" - oak_log
- "*spruce_log" - spruce_log
- "*birch_log" - birch_log
- "*jungle_log" - jungle_log
- "*acacia_log" - acacia_log
- "*dark_oak_log" - dark_oak_log
- "*mangrove_log" - mangrove_log
- "*crimson_stem" - crimson_stem
- "*warped_stem" - warped_stem
player_placed: false
conditions: [ ]
level-placeholders: level-placeholders:
- id: "money" - id: "money"
value: "%level% * 0.4" value: "%level% * 3.0"
effects-description: effects-description:
1: 1:
- "&8» &8Earn &a$%money%&8 for each log chopped." - "&8» &7Earn &a$%money%&7 for each log chopped."
rewards-description: rewards-description:
1: 1:
- "&8» &8Earn &a$%money%&8 for each log chopped." - "&8» &7Earn &a$%money%&7 for each log chopped."
level-up-messages: level-up-messages:
1: 1:
- "&8» &8Earn &a$%money%&8 for each log chopped." - "&8» &7Earn &a$%money%&7 for each log chopped."
level-commands: [ ] level-commands: [ ]
effects: effects:
- id: give_money - id: give_money
args: args:
every: "ceil(10 - %level% / 10)" amount: "%level% * 3.0"
amount: "0.4 * %level%"
filters:
items:
- "*oak_log"
- "*spruce_log"
- "*birch_log"
- "*jungle_log"
- "*acacia_log"
- "*dark_oak_log"
- "*mangrove_log"
- "*crimson_stem"
- "*warped_stem"
triggers: triggers:
- mine_block - mine_block
filters:
blocks:
- oak_log
- spruce_log
- birch_log
- jungle_log
- acacia_log
- dark_oak_log
- mangrove_log
- crimson_stem
- warped_stem
player_placed: false
conditions: [ ] conditions: [ ]
icon: player_head texture:basehead-eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvN2E2MjA3MDJmODBiZDJjMjI0MmUyZjEzMWMzZjlhMjU5NDAyYjdmYTg5NzRjODZjZjM0NTBmZjczZTc3MDU5NSJ9fX0= icon: player_head texture:eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZjk4NWEwNWQyYTMzOWExYzFiZDdlMmE3OWFlMDAyNWI5YTEwZTg0ZGI5OWFkZjQzNThkNmViZTgzNThhZDJkOCJ9fX0=

View File

@@ -5,8 +5,20 @@ unlocked-by-default: true
reset-on-quit: false reset-on-quit: false
join-price: 0 join-price:
leave-price: 0 value: 0
type: coins
display: "&a$%value%"
join-lore: []
leave-price:
value: 0
type: coins
display: "&a$%value%"
leave-lore:
- ""
level-xp-requirements: level-xp-requirements:
- 100 - 100

View File

@@ -5,8 +5,20 @@ unlocked-by-default: true
reset-on-quit: false reset-on-quit: false
join-price: 0 join-price:
leave-price: 0 value: 0
type: coins
display: "&a$%value%"
join-lore: []
leave-price:
value: 0
type: coins
display: "&a$%value%"
leave-lore:
- ""
level-xp-requirements: level-xp-requirements:
- 100 - 100

View File

@@ -1,12 +1,24 @@
name: "&#4B4736Smelter" name: "&#4B4736Smelter"
description: "&7&oLevel up by smelting items" description: "&8&oLevel up by smelting items"
unlocked-by-default: true unlocked-by-default: true
reset-on-quit: false reset-on-quit: false
join-price: 0 join-price:
leave-price: 0 value: 0
type: coins
display: "&a$%value%"
join-lore: []
leave-price:
value: 0
type: coins
display: "&a$%value%"
leave-lore:
- ""
level-xp-requirements: level-xp-requirements:
- 100 - 100

View File

@@ -7,20 +7,27 @@
# The display name of the job # The display name of the job
name: "&#0047b3Toolsmith" name: "&#0047b3Toolsmith"
# The description of the job
description: "&8&oLevel up by crafting tools" description: "&8&oLevel up by crafting tools"
# If the job should be unlocked by default
unlocked-by-default: true unlocked-by-default: true
# If job progress should be reset when quitting
reset-on-quit: false reset-on-quit: false
# The price to join or leave this job (set to 0 to disable) join-price:
join-price: 0 value: 0
leave-price: 0 type: coins
display: "&a$%value%"
join-lore: []
leave-price:
value: 0
type: coins
display: "&a$%value%"
leave-lore:
- ""
# The xp requirements for each job level - add new levels by adding more to this list
level-xp-requirements: level-xp-requirements:
- 100 - 100
- 120 - 120
@@ -72,9 +79,6 @@ level-xp-requirements:
- 580000 - 580000
- 750000 - 750000
# An XP Gain method takes a trigger, a multiplier, conditions, and filters.
# The multiplier takes the value produced by the trigger and multiplies it
# by some value to calculate the experience that should be given
xp-gain-methods: xp-gain-methods:
- trigger: craft - trigger: craft
multiplier: 2 multiplier: 2
@@ -113,36 +117,24 @@ xp-gain-methods:
- "*shears" - "*shears"
- "*spyglass" - "*spyglass"
# Custom placeholders to be used in descriptions,
# Don't add % to the IDs, this is done automatically
# The value takes a %level% placeholder and is a mathematical expression
level-placeholders: level-placeholders:
- id: "money" - id: "money"
value: "%level% * 2" value: "%level% * 2"
# The text shown with the %effects% placeholder
# The number dictates the minimum level for this text to show for
# Adding new levels will override this text on those levels or above
effects-description: effects-description:
1: 1:
- "&8» &8Earn &a$%money%&8 for each tool crafted" - "&8» &8Earn &a$%money%&8 for each tool crafted"
# Same as above, but for %rewards%
rewards-description: rewards-description:
1: 1:
- "&8» &8Earn &a$%money%&8 for each tool crafted" - "&8» &8Earn &a$%money%&8 for each tool crafted"
# Same as above, but for %level_up_messages%
level-up-messages: level-up-messages:
1: 1:
- "&8» &8Earn &a$%money%&8 for each tool crafted" - "&8» &8Earn &a$%money%&8 for each tool crafted"
# Commands to be sent on levelup, can be formatted two ways:
# level:command (e.g. 10:eco give %player% 1000), which would execute that command for level 10
# command (e.g. eco give %player% 5000), which would execute that command for all levels
level-commands: [ ] level-commands: [ ]
# The effects for the job, has %level% as a placeholder
effects: effects:
- id: give_money - id: give_money
args: args:
@@ -183,8 +175,6 @@ effects:
triggers: triggers:
- craft - craft
# The conditions for the job, also has %level% as a placeholder
conditions: [ ] conditions: [ ]
# The icon in GUIs
icon: player_head texture:eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvODk2ZDRjODM4YTE2MDZhYzc1Nzc1NDIzMjA4NjE0OTcwOGI3OWFiYTAxYmU5NTNjNjUzOTkxMDFlODk0M2RhZiJ9fX0= icon: player_head texture:eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvODk2ZDRjODM4YTE2MDZhYzc1Nzc1NDIzMjA4NjE0OTcwOGI3OWFiYTAxYmU5NTNjNjUzOTkxMDFlODk0M2RhZiJ9fX0=

View File

@@ -33,6 +33,9 @@ messages:
joined-job: "&fYou have joined the %job%&f job!" joined-job: "&fYou have joined the %job%&f job!"
left-job: "&fYou have left the %job%&f job!" left-job: "&fYou have left the %job%&f job!"
job-already-joined: "&cYou already have this job!" job-already-joined: "&cYou already have this job!"
leave-current-job: "&cYou must leave your current job before joining a new one!"
cant-leave-job: "&cYou can't leave the %job%&f job!"
dont-have-job: "&cYou don't have this job unlocked!"
menu: menu:
title: "Jobs" title: "Jobs"

View File

@@ -1,4 +1,4 @@
#libreforge-updater #libreforge-updater
#Wed Oct 26 22:09:18 BST 2022 #Fri Dec 09 17:00:49 GMT 2022
version=1.20.1 version=1.32.0
plugin-name=EcoJobs plugin-name=EcoJobs