9
0
mirror of https://github.com/Auxilor/EcoJobs.git synced 2025-12-21 16:09:18 +00:00

Updated GUI

This commit is contained in:
Auxilor
2023-02-15 18:43:15 +00:00
parent 760c3ce707
commit dfbc77cd0a
7 changed files with 153 additions and 139 deletions

View File

@@ -49,7 +49,7 @@ allprojects {
dependencies { dependencies {
compileOnly 'com.willfp:eco:6.46.0' compileOnly 'com.willfp:eco:6.46.0'
implementation 'com.willfp:libreforge:3.129.1' implementation 'com.willfp:libreforge:3.129.1'
implementation 'com.willfp:ecomponent:1.0.0' implementation 'com.willfp:ecomponent:1.3.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,7 +2,9 @@ package com.willfp.ecojobs
import com.willfp.eco.core.command.impl.PluginCommand import com.willfp.eco.core.command.impl.PluginCommand
import com.willfp.eco.core.placeholder.PlayerPlaceholder import com.willfp.eco.core.placeholder.PlayerPlaceholder
import com.willfp.eco.util.toSingletonList import com.willfp.ecojobs.api.activeJobs
import com.willfp.ecojobs.api.getJobLevel
import com.willfp.ecojobs.api.jobLimit
import com.willfp.ecojobs.commands.CommandEcojobs import com.willfp.ecojobs.commands.CommandEcojobs
import com.willfp.ecojobs.commands.CommandJobs import com.willfp.ecojobs.commands.CommandJobs
import com.willfp.ecojobs.jobs.JobLevelListener import com.willfp.ecojobs.jobs.JobLevelListener
@@ -10,16 +12,15 @@ import com.willfp.ecojobs.jobs.JobTriggerXPGainListener
import com.willfp.ecojobs.jobs.Jobs import com.willfp.ecojobs.jobs.Jobs
import com.willfp.ecojobs.jobs.PriceHandler import com.willfp.ecojobs.jobs.PriceHandler
import com.willfp.ecojobs.jobs.ResetOnQuitListener import com.willfp.ecojobs.jobs.ResetOnQuitListener
import com.willfp.ecojobs.jobs.activeJob
import com.willfp.ecojobs.jobs.activeJobLevel
import com.willfp.ecojobs.jobs.getJobLevel
import com.willfp.libreforge.LibReforgePlugin import com.willfp.libreforge.LibReforgePlugin
import org.bukkit.event.Listener import org.bukkit.event.Listener
class EcoJobsPlugin : LibReforgePlugin() { class EcoJobsPlugin : LibReforgePlugin() {
init { init {
instance = this instance = this
registerHolderProvider { it.activeJobLevel?.toSingletonList() ?: emptyList() } registerHolderProvider { player ->
player.activeJobs.map { it.getLevel(player.getJobLevel(it)) }
}
} }
override fun handleEnableAdditional() { override fun handleEnableAdditional() {
@@ -27,18 +28,13 @@ class EcoJobsPlugin : LibReforgePlugin() {
PlayerPlaceholder( PlayerPlaceholder(
this, this,
"job" "limit"
) { it.activeJob?.name ?: "" }.register() ) { it.jobLimit.toString() }.register()
PlayerPlaceholder( PlayerPlaceholder(
this, this,
"job_level" "in_jobs"
) { it.activeJobLevel?.level?.toString() ?: "" }.register() ) { it.activeJobs.size.toString() }.register()
PlayerPlaceholder(
this,
"job_id"
) { it.activeJob?.id ?: "" }.register()
PlayerPlaceholder( PlayerPlaceholder(
this, this,

View File

@@ -36,7 +36,7 @@ class CommandJoin(plugin: EcoPlugin) : Subcommand(plugin, "join", "ecojobs.comma
} }
if (!player.canJoinJob(job)) { if (!player.canJoinJob(job)) {
player.sendMessage(plugin.langYml.getMessage("leave-current-job")) player.sendMessage(plugin.langYml.getMessage("cannot-join-job"))
return return
} }

View File

@@ -26,6 +26,7 @@ import com.willfp.ecojobs.api.getJobLevel
import com.willfp.ecojobs.api.getJobProgress import com.willfp.ecojobs.api.getJobProgress
import com.willfp.ecojobs.api.getJobXP import com.willfp.ecojobs.api.getJobXP
import com.willfp.ecojobs.api.getJobXPRequired import com.willfp.ecojobs.api.getJobXPRequired
import com.willfp.ecojobs.api.hasJobActive
import com.willfp.ecojobs.api.jobLimit import com.willfp.ecojobs.api.jobLimit
import com.willfp.libreforge.conditions.Conditions import com.willfp.libreforge.conditions.Conditions
import com.willfp.libreforge.conditions.ConfiguredCondition import com.willfp.libreforge.conditions.ConfiguredCondition
@@ -305,7 +306,9 @@ class Job(
).addLoreLines { ).addLoreLines {
injectPlaceholdersInto( injectPlaceholdersInto(
plugin.configYml.getStrings("gui.job-icon.lore"), player plugin.configYml.getStrings("gui.job-icon.lore"), player
) + if (player.canJoinJob(this)) { ) + if (player.hasJobActive(this)) {
plugin.configYml.getStrings("gui.job-icon.active-lore")
} else if (player.canJoinJob(this)) {
plugin.configYml.getStrings("gui.job-icon.join-lore") plugin.configYml.getStrings("gui.job-icon.join-lore")
} else if (player.activeJobs.size == player.jobLimit) { } else if (player.activeJobs.size == player.jobLimit) {
plugin.configYml.getStrings("gui.job-icon.too-many-jobs-lore") plugin.configYml.getStrings("gui.job-icon.too-many-jobs-lore")

View File

@@ -4,19 +4,28 @@ 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.onLeftClick
import com.willfp.eco.core.gui.onRightClick
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
import com.willfp.eco.core.gui.slot.MaskItems 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.core.items.builder.SkullBuilder
import com.willfp.eco.util.formatEco
import com.willfp.ecojobs.EcoJobsPlugin import com.willfp.ecojobs.EcoJobsPlugin
import com.willfp.ecojobs.api.activeJobs
import com.willfp.ecojobs.api.canJoinJob
import com.willfp.ecojobs.api.getJobLevel import com.willfp.ecojobs.api.getJobLevel
import com.willfp.ecojobs.api.hasJobActive
import com.willfp.ecojobs.api.joinJob
import com.willfp.ecojobs.jobs.Jobs.unlockedJobs import com.willfp.ecojobs.jobs.Jobs.unlockedJobs
import org.bukkit.Material import org.bukkit.Material
import org.bukkit.Sound import org.bukkit.Sound
import org.bukkit.entity.Player import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
import org.bukkit.inventory.meta.SkullMeta
import kotlin.math.ceil import kotlin.math.ceil
import kotlin.math.max import kotlin.math.max
import kotlin.math.min import kotlin.math.min
@@ -24,17 +33,6 @@ import kotlin.math.min
object JobsGUI { object JobsGUI {
private lateinit var menu: Menu private lateinit var menu: Menu
private val jobAreaSlots = mutableListOf<Pair<Int, Int>>() private val jobAreaSlots = mutableListOf<Pair<Int, Int>>()
private const val pageKey = "page"
private fun getPage(menu: Menu, player: Player): Int {
val pages = ceil(Jobs.values()
.filter { player.getJobLevel(it) > 0 }
.size.toDouble() / jobAreaSlots.size).toInt()
val page = menu.getState(player, pageKey) ?: 1
return max(min(pages, page + 1), 1)
}
@JvmStatic @JvmStatic
@ConfigUpdater @ConfigUpdater
@@ -55,18 +53,8 @@ object JobsGUI {
} }
private fun buildMenu(plugin: EcoJobsPlugin): Menu { private fun buildMenu(plugin: EcoJobsPlugin): Menu {
val jobInfoItemBuilder = { player: Player, _: Menu ->
val job = player.activeJob
job?.getJobInfoIcon(player)
?: ItemStackBuilder(Items.lookup(plugin.configYml.getString("gui.job-info.no-active.item")))
.setDisplayName(plugin.configYml.getFormattedString("gui.job-info.no-active.name"))
.addLoreLines(plugin.configYml.getFormattedStrings("gui.job-info.no-active.lore"))
.build()
}
val jobIconBuilder = { player: Player, menu: Menu, index: Int -> val jobIconBuilder = { player: Player, menu: Menu, index: Int ->
val page = getPage(menu, player) val page = menu.getPage(player)
val unlockedJobs = player.unlockedJobs val unlockedJobs = player.unlockedJobs
@@ -87,13 +75,46 @@ object JobsGUI {
) )
setSlot( setSlot(
plugin.configYml.getInt("gui.job-info.row"), plugin.configYml.getInt("gui.player-info.row"),
plugin.configYml.getInt("gui.job-info.column"), plugin.configYml.getInt("gui.player-info.column"),
slot(jobInfoItemBuilder) { slot { player, _ ->
onLeftClick { event, _, _ -> val skullBuilder = SkullBuilder()
val player = event.whoClicked as Player .setDisplayName(
player.activeJob?.levelGUI?.open(player) plugin.configYml.getString("gui.player-info.name")
.replace("%player%", player.displayName)
.formatEco(player, true)
)
if (player.activeJobs.isEmpty()) {
skullBuilder.addLoreLines(
plugin.configYml.getStrings("gui.player-info.no-jobs")
.formatEco(player, true)
)
} else {
skullBuilder.addLoreLines(
plugin.configYml.getStrings("gui.player-info.has-jobs")
.flatMap {
if (it == "%jobs%") {
player.activeJobs.flatMap { job ->
job.injectPlaceholdersInto(
plugin.configYml.getStrings("gui.player-info.job-line"),
player
)
} }
} else {
listOf(it)
}
}
.formatEco(player, true)
)
}
val skull = skullBuilder.build()
val meta = skull.itemMeta as SkullMeta
meta.owningPlayer = player
skull.itemMeta = meta
skull
} }
) )
@@ -101,10 +122,8 @@ 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) }) {
onLeftClick { event, _, _ -> onLeftClick { player, _, _, menu ->
val player = event.whoClicked as Player val page = menu.getPage(player)
val page = getPage(menu, player)
val unlockedJobs = player.unlockedJobs val unlockedJobs = player.unlockedJobs
@@ -112,10 +131,22 @@ object JobsGUI {
val job = unlockedJobs.getOrNull(pagedIndex) ?: return@onLeftClick val job = unlockedJobs.getOrNull(pagedIndex) ?: return@onLeftClick
if (player.activeJob == null) { if (player.hasJobActive(job)) {
player.activeJob = job job.levelGUI.open(player)
} else { } else {
player.sendMessage(plugin.langYml.getMessage("leave-current-job")) if (player.canJoinJob(job)) {
player.joinJob(job)
if (player.hasJobActive(job)) {
player.sendMessage(
plugin.langYml.getMessage("joined-job")
.replace("%job%", job.name)
)
}
} else {
player.sendMessage(plugin.langYml.getMessage("cannot-join-job"))
return@onLeftClick
}
} }
player.playSound( player.playSound(
@@ -125,51 +156,57 @@ object JobsGUI {
plugin.configYml.getDouble("gui.job-icon.click.pitch").toFloat() plugin.configYml.getDouble("gui.job-icon.click.pitch").toFloat()
) )
} }
onRightClick { player, _, _, menu ->
val page = menu.getPage(player)
val unlockedJobs = player.unlockedJobs
val pagedIndex = ((page - 1) * jobAreaSlots.size) + index
val job = unlockedJobs.getOrNull(pagedIndex) ?: return@onRightClick
if (player.hasJobActive(job)) {
job.leaveGUI.open(player)
player.playSound(
player.location,
Sound.valueOf(plugin.configYml.getString("gui.job-icon.click.sound").uppercase()),
1f,
plugin.configYml.getDouble("gui.job-icon.click.pitch").toFloat()
)
}
}
}) })
} }
setSlot( addComponent(
plugin.configYml.getInt("gui.prev-page.location.row"), plugin.configYml.getInt("gui.prev-page.location.row"),
plugin.configYml.getInt("gui.prev-page.location.column"), plugin.configYml.getInt("gui.prev-page.location.column"),
slot( PageChanger(
ItemStackBuilder(Items.lookup(plugin.configYml.getString("gui.prev-page.item"))) ItemStackBuilder(Items.lookup(plugin.configYml.getString("gui.prev-page.item")))
.setDisplayName(plugin.configYml.getString("gui.prev-page.name")) .setDisplayName(plugin.configYml.getString("gui.prev-page.name"))
.build() .build(),
) { PageChanger.Direction.BACKWARDS
onLeftClick { event, _, menu -> )
val player = event.whoClicked as Player
val page = getPage(menu, player)
val newPage = max(1, page - 1)
menu.setState(player, pageKey, newPage)
}
}
) )
setSlot( addComponent(
plugin.configYml.getInt("gui.next-page.location.row"), plugin.configYml.getInt("gui.next-page.location.row"),
plugin.configYml.getInt("gui.next-page.location.column"), plugin.configYml.getInt("gui.next-page.location.column"),
slot( PageChanger(
ItemStackBuilder(Items.lookup(plugin.configYml.getString("gui.next-page.item"))) ItemStackBuilder(Items.lookup(plugin.configYml.getString("gui.next-page.item")))
.setDisplayName(plugin.configYml.getString("gui.next-page.name")) .setDisplayName(plugin.configYml.getString("gui.next-page.name"))
.build() .build(),
) { PageChanger.Direction.FORWARDS
onLeftClick { event, _, menu -> )
val player = event.whoClicked as Player )
val pages = ceil(Jobs.values() maxPages { player ->
ceil(Jobs.values()
.filter { player.getJobLevel(it) > 0 } .filter { player.getJobLevel(it) > 0 }
.size.toDouble() / jobAreaSlots.size).toInt() .size.toDouble() / jobAreaSlots.size).toInt()
val page = getPage(menu, player)
val newPage = min(pages, page + 1)
menu.setState(player, pageKey, newPage)
} }
}
)
setSlot(plugin.configYml.getInt("gui.close.location.row"), setSlot(plugin.configYml.getInt("gui.close.location.row"),
plugin.configYml.getInt("gui.close.location.column"), plugin.configYml.getInt("gui.close.location.column"),
@@ -182,19 +219,6 @@ object JobsGUI {
} }
) )
setSlot(plugin.configYml.getInt("gui.deactivate-job.location.row"),
plugin.configYml.getInt("gui.deactivate-job.location.column"),
slot(
ItemStackBuilder(Items.lookup(plugin.configYml.getString("gui.deactivate-job.item")))
.setDisplayName(plugin.configYml.getString("gui.deactivate-job.name"))
.build()
) {
onLeftClick { player, _, _, _ ->
player.activeJob?.leaveGUI?.open(player)
}
}
)
for (config in plugin.configYml.getSubsections("gui.custom-slots")) { for (config in plugin.configYml.getSubsections("gui.custom-slots")) {
setSlot( setSlot(
config.getInt("row"), config.getInt("row"),

View File

@@ -24,49 +24,44 @@ gui:
materials: materials:
- black_stained_glass_pane - black_stained_glass_pane
pattern: pattern:
- "111101111"
- "111111111" - "111111111"
- "101000001" - "100000001"
- "111000001" - "100000001"
- "101000001" - "100000001"
- "111111111" - "111101111"
- "111100011"
job-area: job-area:
top-left: top-left:
row: 2 row: 3
column: 4 column: 2
bottom-right: bottom-right:
row: 4 row: 5
column: 8 column: 8
job-info: player-info:
row: 2 row: 2
column: 2 column: 2
no-active: name: "%player%&f's Jobs:"
name: "&cNo Active Job"
lore: no-jobs:
- "" - ""
- "&cYou do not currently have a job active" - "&cYou do not currently have a job active"
- "&fPick one from the options below!" - "&fPick one from the options below!"
- "" - ""
item: player_head texture:eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYmFkYzA0OGE3Y2U3OGY3ZGFkNzJhMDdkYTI3ZDg1YzA5MTY4ODFlNTUyMmVlZWQxZTNkYWYyMTdhMzhjMWEifX19 - "&fYou can have up to &a%ecojobs_limit% &fjobs at once"
# %join_price% and %leave_price% are also available as placeholders
active:
name: "%job% &fLvl. &a%level%"
lore:
- "%description%"
- "&f"
- "&fJob Rewards:"
- "%effects%"
- "" - ""
- "&fProgress:"
- "&8» &e%percentage_progress%%" has-jobs:
- "&8» &e%current_xp%&8/&7%required_xp% &fXP"
- "" - ""
- "&eClick to view Level Progression!" - "%jobs%"
- ""
- "&fJob slots in use: &a%ecojobs_in_jobs%&r/&a%ecojobs_limit%"
- ""
job-line:
- " %job% &fLvl. &a%level%"
job-icon: job-icon:
name: "%job% &fLvl. &a%level%" name: "%job% &fLvl. &a%level%"
@@ -80,9 +75,12 @@ gui:
- "&8» &e%percentage_progress%%" - "&8» &e%percentage_progress%%"
- "&8» &e%current_xp%&8/&7%required_xp% &fXP" - "&8» &e%current_xp%&8/&7%required_xp% &fXP"
# %join_price% and %leave_price% are also available as placeholders
active-lore: active-lore:
- "" - ""
- "&cYou've already joined this job!" - "&eClick to view Level Progression!"
- "&eRight-click to leave this job!"
too-many-jobs-lore: too-many-jobs-lore:
- "" - ""
@@ -101,28 +99,21 @@ gui:
name: "&fPrevious Page" name: "&fPrevious Page"
location: location:
row: 6 row: 6
column: 5 column: 4
next-page: next-page:
item: arrow item: arrow
name: "&fNext Page" name: "&fNext Page"
location: location:
row: 6 row: 6
column: 7 column: 6
close: close:
item: barrier item: barrier
name: "&cClose" name: "&cClose"
location: location:
row: 6 row: 6
column: 6 column: 5
deactivate-job:
item: player_head texture:eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTRiZDlhNDViOTY4MWNlYTViMjhjNzBmNzVhNjk1NmIxZjU5NGZlYzg0MGI5NjA3Nzk4ZmIxZTcwNzc2NDQzMCJ9fX0=
name: "&cDeactivate Job"
location:
row: 4
column: 2
# 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: [ ]

View File

@@ -33,7 +33,7 @@ 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!" cannot-join-job: "&cYou are already in too many jobs, please leave one!"
cant-leave-job: "&cYou can't leave the %job%&f job!" cant-leave-job: "&cYou can't leave the %job%&f job!"
dont-have-job: "&cYou don't have this job unlocked!" dont-have-job: "&cYou don't have this job unlocked!"
not-in-job: "&cYou are not in this job!" not-in-job: "&cYou are not in this job!"