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

Compare commits

..

52 Commits

Author SHA1 Message Date
Auxilor
72aa54a9e3 libreforge-updater 2022-10-24 17:04:52 +01:00
Auxilor
d9487300d7 Merge branch 'Kristopherrr_master'
# Conflicts:
#	build.gradle
#	eco-core/core-plugin/src/main/kotlin/com/willfp/ecojobs/EcoJobsPlugin.kt
2022-10-24 17:02:44 +01:00
Auxilor
9911244f34 PR Cleanup 2022-10-24 17:02:25 +01:00
Auxilor
2447dc0279 Lots of cleanup 2022-10-24 17:01:43 +01:00
Will FP
3b949c0119 Merge pull request #8
Added placeholder to get total number of players with specific job
2022-10-24 16:50:12 +01:00
Auxilor
a8f11ffb44 libreforge-updater 2022-10-21 19:25:32 +01:00
Auxilor
3829e326ba libreforge-updater 2022-10-19 20:43:19 +01:00
Auxilor
26d44fb2d9 libreforge-updater 2022-10-18 14:12:39 +01:00
Auxilor
5cba64d19f libreforge-updater 2022-10-16 23:26:32 +01:00
Auxilor
52f3230307 libreforge-updater 2022-10-13 20:11:59 +01:00
ItsMeKrisK
ad16872efd Job Changes n Additions
Added Enchanter/ Lumberjack/ Smelter job and fixed some things in beekeeper
2022-10-11 19:25:54 +03:00
ItsMeKrisK
21ab58b425 Placeholder for the total levels of player's jobs
**The placeholder:** 😉
• `%ecojobs_total_jobs_level%`
2022-10-11 03:11:24 +03:00
Bruno de Araujo Alves
c80dd2371c Added placeholder to get total number of players with specific job
- %ecojobs_<id>_total_players%
2022-10-10 18:50:05 -03:00
Auxilor
e0b2ae4f40 libreforge-updater 2022-10-10 21:03:58 +01:00
Auxilor
b9f7d6db42 libreforge-updater 2022-10-09 15:02:04 +01:00
Will FP
f62476c1d4 Merge pull request #7 from badomensurvival/master
Job level placeholder
2022-10-09 14:50:32 +01:00
Will FP
ca25f78c60 Merge pull request #6 from 0ft3n/master
Fixed default builder.yml
2022-10-09 14:50:17 +01:00
devbaraus
765d7ee7e2 Job level placeholder 2022-10-09 10:26:34 -03:00
0ft3n
850e1ec888 Fixed default builder.yml 2022-10-09 01:26:47 +03:00
Auxilor
fe29bb611f libreforge-updater 2022-10-07 19:50:42 +01:00
Auxilor
87c8c6755a Updated to 1.14.1 2022-10-06 14:09:00 +01:00
Auxilor
964d668713 Added more default jobs 2022-10-06 14:08:52 +01:00
Auxilor
d8113c3819 libreforge-updater 2022-10-06 12:02:41 +01:00
Auxilor
2e655ffbb8 libreforge-updater 2022-10-04 15:52:50 +01:00
Auxilor
88a44777e1 libreforge-updater 2022-10-03 18:28:56 +01:00
Auxilor
bd7305fae1 libreforge-updater 2022-10-02 14:57:36 +01:00
Auxilor
25b78106ee libreforge-updater 2022-09-28 17:52:31 +01:00
Auxilor
1b75ba0098 Updated to 1.10.0 2022-09-28 12:41:01 +01:00
Auxilor
b4b235f1b5 Added custom GUI slots 2022-09-28 12:40:05 +01:00
Auxilor
c7ec273747 Updated to 1.9.0 2022-09-28 09:09:05 +01:00
Auxilor
9991f9b683 Added /jobs join and /jobs leave 2022-09-28 09:08:51 +01:00
Auxilor
921f086f49 libreforge-updater 2022-09-26 18:27:06 +01:00
Auxilor
b0c882dc21 libreforge-updater 2022-09-26 14:41:23 +01:00
Auxilor
59a528689d libreforge-updater 2022-09-26 10:51:36 +01:00
Auxilor
16be3a8b69 libreforge-updater 2022-09-22 17:30:04 +01:00
Auxilor
8e1200f293 Fixed version 2022-09-21 15:41:13 +01:00
Auxilor
301b4d35f3 libreforge-updater 2022-09-21 15:28:18 +01:00
Auxilor
ff84afdc7d libreforge-updater 2022-09-20 10:39:39 +01:00
Auxilor
0239447b61 libreforge-updater 2022-09-17 15:45:43 +01:00
Auxilor
8b0b2f861f libreforge-updater 2022-09-15 12:16:24 +01:00
Auxilor
d2fd661ba3 libreforge-updater 2022-09-15 12:10:05 +01:00
Auxilor
238962bb4f libreforge-updater 2022-09-14 18:53:41 +01:00
Auxilor
6b7df691de libreforge-updater 2022-09-14 15:12:49 +01:00
Auxilor
28b7279a88 libreforge-updater 2022-09-14 15:09:55 +01:00
Auxilor
36f6765942 Fixed bug 2022-09-14 13:32:05 +01:00
Auxilor
b96d6c3388 Added leave price 2022-09-14 13:26:59 +01:00
Auxilor
7c06eb5c18 Added Join Price and Reset on Quit 2022-09-14 13:23:22 +01:00
Auxilor
e33d3264d8 Added PlayerJobJoinEvent and PlayerJobLeaveEvent 2022-09-14 13:12:47 +01:00
Auxilor
3780370caf libreforge-updater 2022-09-14 12:59:57 +01:00
Auxilor
e82eacf5b6 libreforge-updater 2022-09-13 19:15:37 +01:00
Auxilor
5a519aa263 libreforge-updater 2022-09-12 21:21:37 +01:00
Auxilor
4b9283c6de libreforge-updater 2022-09-12 17:15:34 +01:00
34 changed files with 1150 additions and 237 deletions

View File

@@ -46,8 +46,8 @@ allprojects {
} }
dependencies { dependencies {
compileOnly 'com.willfp:eco:6.37.1' compileOnly 'com.willfp:eco:6.43.6'
implementation 'com.willfp:libreforge:3.97.0' implementation 'com.willfp:libreforge:3.115.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

@@ -1,184 +0,0 @@
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
"https://checkstyle.org/dtds/configuration_1_3.dtd">
<!--
Checkstyle configuration that checks the sun coding conventions from:
- the Java Language Specification at
https://docs.oracle.com/javase/specs/jls/se11/html/index.html
- the Sun Code Conventions at https://www.oracle.com/java/technologies/javase/codeconventions-contents.html
- the Javadoc guidelines at
https://www.oracle.com/technical-resources/articles/java/javadoc-tool.html
- the JDK Api documentation https://docs.oracle.com/en/java/javase/11/
- some best practices
Checkstyle is very configurable. Be sure to read the documentation at
https://checkstyle.org (or in your downloaded distribution).
Most Checks are configurable, be sure to consult the documentation.
To completely disable a check, just comment it out or delete it from the file.
To suppress certain violations please review suppression filters.
Finally, it is worth reading the documentation.
-->
<module name="Checker">
<module name="SuppressionFilter">
<property name="file" value="config/checkstyle/suppression.xml"/>
</module>
<!--
If you set the basedir property below, then all reported file
names will be relative to the specified directory. See
https://checkstyle.org/config.html#Checker
<property name="basedir" value="${basedir}"/>
-->
<property name="severity" value="error"/>
<property name="fileExtensions" value="java, properties, xml"/>
<!-- Excludes all 'module-info.java' files -->
<!-- See https://checkstyle.org/config_filefilters.html -->
<module name="BeforeExecutionExclusionFileFilter">
<property name="fileNamePattern" value="module\-info\.java$"/>
</module>
<!-- Checks whether files end with a new line. -->
<!-- See https://checkstyle.org/config_misc.html#NewlineAtEndOfFile -->
<module name="NewlineAtEndOfFile"/>
<!-- Checks that property files contain the same keys. -->
<!-- See https://checkstyle.org/config_misc.html#Translation -->
<module name="Translation"/>
<!-- Checks for Size Violations. -->
<!-- See https://checkstyle.org/config_sizes.html -->
<module name="FileLength"/>
<module name="LineLength">
<property name="fileExtensions" value="java"/>
<property name="max" value="200"/>
</module>
<!-- Checks for whitespace -->
<!-- See https://checkstyle.org/config_whitespace.html -->
<module name="FileTabCharacter"/>
<!-- Miscellaneous other checks. -->
<!-- See https://checkstyle.org/config_misc.html -->
<module name="RegexpSingleline">
<property name="format" value="\s+$"/>
<property name="minimum" value="0"/>
<property name="maximum" value="0"/>
<property name="message" value="Line has trailing spaces."/>
</module>
<!-- Checks for Headers -->
<!-- See https://checkstyle.org/config_header.html -->
<!-- <module name="Header"> -->
<!-- <property name="headerFile" value="${checkstyle.header.file}"/> -->
<!-- <property name="fileExtensions" value="java"/> -->
<!-- </module> -->
<module name="TreeWalker">
<!-- Checks for Javadoc comments. -->
<!-- See https://checkstyle.org/config_javadoc.html -->
<module name="InvalidJavadocPosition"/>
<module name="JavadocMethod"/>
<module name="JavadocType"/>
<module name="JavadocVariable"/>
<module name="JavadocStyle"/>
<module name="MissingJavadocMethod"/>
<!-- Checks for Naming Conventions. -->
<!-- See https://checkstyle.org/config_naming.html -->
<module name="ConstantName"/>
<module name="LocalFinalVariableName"/>
<module name="LocalVariableName"/>
<module name="MemberName"/>
<module name="MethodName"/>
<module name="PackageName"/>
<module name="ParameterName"/>
<module name="StaticVariableName"/>
<module name="TypeName"/>
<!-- Checks for imports -->
<!-- See https://checkstyle.org/config_imports.html -->
<module name="AvoidStarImport"/>
<module name="IllegalImport"/> <!-- defaults to sun.* packages -->
<module name="RedundantImport"/>
<module name="UnusedImports">
<property name="processJavadoc" value="true"/>
</module>
<!-- Checks for Size Violations. -->
<!-- See https://checkstyle.org/config_sizes.html -->
<!-- <module name="MethodLength"/> -->
<module name="ParameterNumber"/>
<!-- Checks for whitespace -->
<!-- See https://checkstyle.org/config_whitespace.html -->
<module name="EmptyForIteratorPad"/>
<module name="GenericWhitespace"/>
<module name="MethodParamPad"/>
<module name="NoWhitespaceAfter"/>
<module name="NoWhitespaceBefore"/>
<module name="OperatorWrap"/>
<module name="ParenPad"/>
<module name="TypecastParenPad"/>
<module name="WhitespaceAfter"/>
<module name="WhitespaceAround"/>
<!-- Modifier Checks -->
<!-- See https://checkstyle.org/config_modifiers.html -->
<module name="ModifierOrder"/>
<module name="RedundantModifier"/>
<!-- Checks for blocks. You know, those {}'s -->
<!-- See https://checkstyle.org/config_blocks.html -->
<module name="AvoidNestedBlocks"/>
<module name="EmptyBlock"/>
<module name="LeftCurly"/>
<module name="NeedBraces"/>
<module name="RightCurly"/>
<!-- Checks for common coding problems -->
<!-- See https://checkstyle.org/config_coding.html -->
<module name="EmptyStatement"/>
<module name="EqualsHashCode"/>
<module name="IllegalInstantiation"/>
<module name="InnerAssignment"/>
<!-- <module name="MagicNumber"/> -->
<module name="MissingSwitchDefault"/>
<module name="MultipleVariableDeclarations"/>
<module name="SimplifyBooleanExpression"/>
<module name="SimplifyBooleanReturn"/>
<!-- Checks for class design -->
<!-- See https://checkstyle.org/config_design.html -->
<!-- <module name="DesignForExtension"/> -->
<module name="FinalClass"/>
<!-- <module name="HideUtilityClassConstructor"/> -->
<module name="InterfaceIsType"/>
<module name="VisibilityModifier"/>
<module name="RequireThis"/>
<!-- Miscellaneous other checks. -->
<!-- See https://checkstyle.org/config_misc.html -->
<module name="ArrayTypeStyle"/>
<module name="FinalParameters"/>
<module name="TodoComment"/>
<module name="UpperEll"/>
</module>
</module>

View File

@@ -1,12 +0,0 @@
<?xml version="1.0"?>
<!DOCTYPE suppressions PUBLIC
"-//Puppy Crawl//DTD Suppressions 1.1//EN"
"http://www.puppycrawl.com/dtds/suppressions_1_1.dtd">
<suppressions>
<!-- Fields don't need javadoc -->
<suppress files="Effects.java" checks="JavadocVariable"/>
<suppress files="Skills.java" checks="JavadocVariable"/>
<suppress files="Stats.java" checks="JavadocVariable"/>
</suppressions>

View File

@@ -7,8 +7,12 @@ 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
import com.willfp.ecojobs.jobs.JobTriggerXPGainListener import com.willfp.ecojobs.jobs.JobTriggerXPGainListener
import com.willfp.ecojobs.jobs.Jobs
import com.willfp.ecojobs.jobs.PriceHandler
import com.willfp.ecojobs.jobs.ResetOnQuitListener
import com.willfp.ecojobs.jobs.activeJob import com.willfp.ecojobs.jobs.activeJob
import com.willfp.ecojobs.jobs.activeJobLevel 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
@@ -26,10 +30,26 @@ class EcoJobsPlugin : LibReforgePlugin() {
"job" "job"
) { it.activeJob?.name ?: "" }.register() ) { it.activeJob?.name ?: "" }.register()
PlayerPlaceholder(
this,
"job_level"
) { it.activeJobLevel?.level?.toString() ?: "" }.register()
PlayerPlaceholder( PlayerPlaceholder(
this, this,
"job_id" "job_id"
) { it.activeJob?.id ?: "" }.register() ) { it.activeJob?.id ?: "" }.register()
PlayerPlaceholder(
this,
"total_job_level"
) {
var level = 0
for (job in Jobs.values()) {
level += it.getJobLevel(job)
}
level.toString()
}.register()
} }
override fun loadPluginCommands(): List<PluginCommand> { override fun loadPluginCommands(): List<PluginCommand> {
@@ -42,7 +62,9 @@ class EcoJobsPlugin : LibReforgePlugin() {
override fun loadListeners(): List<Listener> { override fun loadListeners(): List<Listener> {
return listOf( return listOf(
JobLevelListener(this), JobLevelListener(this),
JobTriggerXPGainListener JobTriggerXPGainListener,
ResetOnQuitListener,
PriceHandler
) )
} }

View File

@@ -0,0 +1,30 @@
package com.willfp.ecojobs.api.event
import com.willfp.ecojobs.jobs.Job
import org.bukkit.OfflinePlayer
import org.bukkit.event.Cancellable
import org.bukkit.event.Event
import org.bukkit.event.HandlerList
class PlayerJobJoinEvent(
val player: OfflinePlayer,
val job: Job,
val oldJob: Job?
) : Event(), Cancellable {
private var cancelled = false
override fun isCancelled() = this.cancelled
override fun setCancelled(cancelled: Boolean) {
this.cancelled = cancelled
}
override fun getHandlers(): HandlerList {
return handlerList
}
companion object {
@JvmStatic
val handlerList = HandlerList()
}
}

View File

@@ -0,0 +1,29 @@
package com.willfp.ecojobs.api.event
import com.willfp.ecojobs.jobs.Job
import org.bukkit.OfflinePlayer
import org.bukkit.event.Cancellable
import org.bukkit.event.Event
import org.bukkit.event.HandlerList
class PlayerJobLeaveEvent(
val player: OfflinePlayer,
val job: Job
) : Event(), Cancellable {
private var cancelled = false
override fun isCancelled() = this.cancelled
override fun setCancelled(cancelled: Boolean) {
this.cancelled = cancelled
}
override fun getHandlers(): HandlerList {
return handlerList
}
companion object {
@JvmStatic
val handlerList = HandlerList()
}
}

View File

@@ -2,14 +2,28 @@ 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.libreforge.LibReforgePlugin
import com.willfp.libreforge.lrcdb.CommandExport
import com.willfp.libreforge.lrcdb.CommandImport
import com.willfp.libreforge.lrcdb.ExportableConfig
import org.bukkit.command.CommandSender import org.bukkit.command.CommandSender
class CommandEcojobs(plugin: EcoPlugin) : PluginCommand(plugin, "ecojobs", "ecojobs.command.ecojobs", false) { class CommandEcojobs(plugin: LibReforgePlugin) : PluginCommand(plugin, "ecojobs", "ecojobs.command.ecojobs", false) {
init { init {
this.addSubcommand(CommandReload(plugin)) this.addSubcommand(CommandReload(plugin))
.addSubcommand(CommandUnlock(plugin)) .addSubcommand(CommandUnlock(plugin))
.addSubcommand(CommandGiveXP(plugin)) .addSubcommand(CommandGiveXP(plugin))
.addSubcommand(CommandReset(plugin)) .addSubcommand(CommandReset(plugin))
.addSubcommand(CommandImport("jobs", plugin))
.addSubcommand(CommandExport(plugin) {
Jobs.values().map {
ExportableConfig(
it.id,
it.config
)
}
})
} }
override fun onExecute(sender: CommandSender, args: List<String>) { override fun onExecute(sender: CommandSender, args: List<String>) {
@@ -17,4 +31,4 @@ class CommandEcojobs(plugin: EcoPlugin) : PluginCommand(plugin, "ecojobs", "ecoj
plugin.langYml.getMessage("invalid-command") plugin.langYml.getMessage("invalid-command")
) )
} }
} }

View File

@@ -7,7 +7,6 @@ import com.willfp.eco.util.savedDisplayName
import com.willfp.eco.util.toNiceString import com.willfp.eco.util.toNiceString
import com.willfp.ecojobs.jobs.Jobs import com.willfp.ecojobs.jobs.Jobs
import com.willfp.ecojobs.jobs.giveExactJobExperience import com.willfp.ecojobs.jobs.giveExactJobExperience
import com.willfp.ecojobs.jobs.giveJobExperience
import com.willfp.ecojobs.jobs.hasJob import com.willfp.ecojobs.jobs.hasJob
import org.bukkit.Bukkit import org.bukkit.Bukkit
import org.bukkit.command.CommandSender import org.bukkit.command.CommandSender

View File

@@ -7,6 +7,11 @@ import org.bukkit.command.CommandSender
import org.bukkit.entity.Player import org.bukkit.entity.Player
class CommandJobs(plugin: EcoPlugin) : PluginCommand(plugin, "jobs", "ecojobs.command.jobs", true) { class CommandJobs(plugin: EcoPlugin) : PluginCommand(plugin, "jobs", "ecojobs.command.jobs", true) {
init {
this.addSubcommand(CommandJoin(plugin))
.addSubcommand(CommandLeave(plugin))
}
override fun onExecute(player: CommandSender, args: List<String>) { override fun onExecute(player: CommandSender, args: List<String>) {
player as Player player as Player
JobsGUI.open(player) JobsGUI.open(player)

View File

@@ -0,0 +1,65 @@
package com.willfp.ecojobs.commands
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.command.impl.Subcommand
import com.willfp.eco.util.StringUtils
import com.willfp.ecojobs.jobs.Jobs
import com.willfp.ecojobs.jobs.activeJob
import com.willfp.ecojobs.jobs.hasJob
import org.bukkit.command.CommandSender
import org.bukkit.entity.Player
import org.bukkit.util.StringUtil
class CommandJoin(plugin: EcoPlugin) : Subcommand(plugin, "join", "ecojobs.command.join", true) {
override fun onExecute(player: CommandSender, args: List<String>) {
player as Player
if (args.isEmpty()) {
player.sendMessage(plugin.langYml.getMessage("needs-job"))
return
}
val id = args[0]
val job = Jobs.getByID(id)
if (job == null || !player.hasJob(job)) {
player.sendMessage(plugin.langYml.getMessage("invalid-job"))
return
}
if (player.activeJob == job) {
player.sendMessage(plugin.langYml.getMessage("job-already-joined"))
return
}
player.sendMessage(
plugin.langYml.getMessage("joined-job", StringUtils.FormatOption.WITHOUT_PLACEHOLDERS)
.replace("%job%", job.name)
)
player.activeJob = job
}
override fun tabComplete(sender: CommandSender, args: List<String>): List<String> {
if (sender !is Player) {
return emptyList()
}
val completions = mutableListOf<String>()
if (args.isEmpty()) {
// Currently, this case is not ever reached
return Jobs.values().filter { sender.hasJob(it) }.map { it.id }
}
if (args.size == 1) {
StringUtil.copyPartialMatches(
args[1],
Jobs.values().filter { sender.hasJob(it) }.map { it.id },
completions
)
return completions
}
return emptyList()
}
}

View File

@@ -0,0 +1,26 @@
package com.willfp.ecojobs.commands
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.command.impl.Subcommand
import com.willfp.eco.util.StringUtils
import com.willfp.ecojobs.jobs.activeJob
import org.bukkit.command.CommandSender
import org.bukkit.entity.Player
class CommandLeave(plugin: EcoPlugin) : Subcommand(plugin, "leave", "ecojobs.command.leave", true) {
override fun onExecute(player: CommandSender, args: List<String>) {
player as Player
if (player.activeJob == null) {
player.sendMessage(plugin.langYml.getMessage("no-job"))
return
}
player.sendMessage(
plugin.langYml.getMessage("left-job", StringUtils.FormatOption.WITHOUT_PLACEHOLDERS)
.replace("%job%", player.activeJob?.name ?: "")
)
player.activeJob = null
}
}

View File

@@ -7,8 +7,7 @@ import com.willfp.eco.util.savedDisplayName
import com.willfp.ecojobs.jobs.Jobs import com.willfp.ecojobs.jobs.Jobs
import com.willfp.ecojobs.jobs.activeJob import com.willfp.ecojobs.jobs.activeJob
import com.willfp.ecojobs.jobs.hasJob import com.willfp.ecojobs.jobs.hasJob
import com.willfp.ecojobs.jobs.setJobLevel import com.willfp.ecojobs.jobs.resetJob
import com.willfp.ecojobs.jobs.setJobXP
import org.bukkit.Bukkit import org.bukkit.Bukkit
import org.bukkit.command.CommandSender import org.bukkit.command.CommandSender
@@ -48,8 +47,7 @@ class CommandReset(plugin: EcoPlugin) : Subcommand(plugin, "reset", "ecojobs.com
if (player.activeJob == job) { if (player.activeJob == job) {
player.activeJob = null player.activeJob = null
} }
player.setJobXP(job, 0.0) player.resetJob(job)
player.setJobLevel(job, 1)
sender.sendMessage( sender.sendMessage(
plugin.langYml.getMessage("reset-xp", StringUtils.FormatOption.WITHOUT_PLACEHOLDERS) plugin.langYml.getMessage("reset-xp", StringUtils.FormatOption.WITHOUT_PLACEHOLDERS)

View File

@@ -15,7 +15,10 @@ import com.willfp.eco.util.formatEco
import com.willfp.eco.util.toNiceString import com.willfp.eco.util.toNiceString
import com.willfp.ecojobs.EcoJobsPlugin import com.willfp.ecojobs.EcoJobsPlugin
import com.willfp.ecojobs.api.event.PlayerJobExpGainEvent import com.willfp.ecojobs.api.event.PlayerJobExpGainEvent
import com.willfp.ecojobs.api.event.PlayerJobJoinEvent
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
@@ -38,6 +41,9 @@ class Job(
val name = config.getFormattedString("name") val name = config.getFormattedString("name")
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 joinPrice = config.getDouble("join-price")
val leavePrice = 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"),
@@ -161,11 +167,18 @@ class Job(
}.register() }.register()
PlayerPlaceholder( PlayerPlaceholder(
plugin, plugin,
"${id}_level" "${id}_level"
) { ) {
it.getJobLevel(this).toString() it.getJobLevel(this).toString()
}.register() }.register()
PlayerPlaceholder(
plugin,
"${id}_total_players"
) {
Bukkit.getOfflinePlayers().count { it.activeJob == this }.toString()
}.register()
} }
fun getLevel(level: Int): JobLevel = levels.get(level) { fun getLevel(level: Int): JobLevel = levels.get(level) {
@@ -251,6 +264,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("%leave_price%", NumberUtils.format(this.leavePrice))
} }
.toMutableList() .toMutableList()
@@ -365,7 +380,33 @@ private val activeJobKey: PersistentDataKey<String> = PersistentDataKey(
var OfflinePlayer.activeJob: Job? var OfflinePlayer.activeJob: Job?
get() = Jobs.getByID(this.profile.read(activeJobKey)) get() = Jobs.getByID(this.profile.read(activeJobKey))
set(value) = this.profile.write(activeJobKey, value?.id ?: "") set(job) {
val oldJob = this.activeJob
if (oldJob != job) {
// Have to check for oldJob too to have null safety
if (job == null && oldJob != null) {
val event = PlayerJobLeaveEvent(this, oldJob)
Bukkit.getPluginManager().callEvent(event)
if (event.isCancelled) {
return
}
}
// Not using else because null safety as well
if (job != null) {
val event = PlayerJobJoinEvent(this, job, oldJob)
Bukkit.getPluginManager().callEvent(event)
if (event.isCancelled) {
return
}
}
}
this.profile.write(activeJobKey, job?.id ?: "")
}
val OfflinePlayer.activeJobLevel: JobLevel? val OfflinePlayer.activeJobLevel: JobLevel?
get() { get() {
@@ -379,6 +420,11 @@ fun OfflinePlayer.getJobLevel(job: Job): Int =
fun OfflinePlayer.setJobLevel(job: Job, level: Int) = fun OfflinePlayer.setJobLevel(job: Job, level: Int) =
this.profile.write(job.levelKey, level) this.profile.write(job.levelKey, level)
fun OfflinePlayer.resetJob(job: Job) {
this.setJobLevel(job, 1)
this.setJobXP(job, 0.0)
}
fun OfflinePlayer.getJobProgress(job: Job): Double { fun OfflinePlayer.getJobProgress(job: Job): Double {
val currentXP = this.getJobXP(job) val currentXP = this.getJobXP(job)
val requiredXP = job.getExpForLevel(this.getJobLevel(job) + 1) val requiredXP = job.getExpForLevel(this.getJobLevel(job) + 1)

View File

@@ -4,6 +4,7 @@ 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.slot import com.willfp.eco.core.gui.slot
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
@@ -65,7 +66,7 @@ class JobLevelGUI(
pages = ceil(job.maxLevel.toDouble() / levelsPerPage).toInt() pages = ceil(job.maxLevel.toDouble() / levelsPerPage).toInt()
menu = menu(plugin.configYml.getInt("level-gui.rows")) { menu = menu(plugin.configYml.getInt("level-gui.rows")) {
setTitle(job.name) title = job.name
setMask( setMask(
FillerMask( FillerMask(
maskItems, maskItems,
@@ -141,7 +142,7 @@ class JobLevelGUI(
if (newPage == 0) { if (newPage == 0) {
JobsGUI.open(player) JobsGUI.open(player)
} else { } else {
menu.addState(player, pageKey, newPage) menu.setState(player, pageKey, newPage)
} }
} }
} }
@@ -161,10 +162,11 @@ class JobLevelGUI(
val newPage = min(pages, page + 1) val newPage = min(pages, page + 1)
menu.addState(player, pageKey, newPage) menu.setState(player, pageKey, newPage)
} }
} }
) )
setSlot( setSlot(
plugin.configYml.getInt("level-gui.progression-slots.close.location.row"), plugin.configYml.getInt("level-gui.progression-slots.close.location.row"),
plugin.configYml.getInt("level-gui.progression-slots.close.location.column"), plugin.configYml.getInt("level-gui.progression-slots.close.location.column"),
@@ -178,8 +180,18 @@ class JobLevelGUI(
} }
} }
) )
for (config in plugin.configYml.getSubsections("level-gui.custom-slots")) {
setSlot(
config.getInt("row"),
config.getInt("column"),
ConfigSlot(config)
)
}
} }
} }
fun open(player: Player) = menu.open(player) fun open(player: Player) {
menu.open(player)
}
} }

View File

@@ -4,6 +4,7 @@ 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.slot import com.willfp.eco.core.gui.slot
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
@@ -55,14 +56,11 @@ object JobsGUI {
val jobInfoItemBuilder = { player: Player, _: Menu -> val jobInfoItemBuilder = { player: Player, _: Menu ->
val job = player.activeJob val job = player.activeJob
if (job == null) { job?.getJobInfoIcon(player)
ItemStackBuilder(Items.lookup(plugin.configYml.getString("gui.job-info.no-active.item"))) ?: ItemStackBuilder(Items.lookup(plugin.configYml.getString("gui.job-info.no-active.item")))
.setDisplayName(plugin.configYml.getFormattedString("gui.job-info.no-active.name")) .setDisplayName(plugin.configYml.getFormattedString("gui.job-info.no-active.name"))
.addLoreLines(plugin.configYml.getFormattedStrings("gui.job-info.no-active.lore")) .addLoreLines(plugin.configYml.getFormattedStrings("gui.job-info.no-active.lore"))
.build() .build()
} else {
job.getJobInfoIcon(player)
}
} }
val jobIconBuilder = { player: Player, menu: Menu, index: Int -> val jobIconBuilder = { player: Player, menu: Menu, index: Int ->
@@ -77,7 +75,7 @@ object JobsGUI {
} }
return menu(plugin.configYml.getInt("gui.rows")) { return menu(plugin.configYml.getInt("gui.rows")) {
setTitle(plugin.langYml.getString("menu.title")) title = plugin.langYml.getString("menu.title")
setMask( setMask(
FillerMask( FillerMask(
@@ -144,7 +142,7 @@ object JobsGUI {
val newPage = max(1, page - 1) val newPage = max(1, page - 1)
menu.addState(player, pageKey, newPage) menu.setState(player, pageKey, newPage)
} }
} }
) )
@@ -168,7 +166,7 @@ object JobsGUI {
val newPage = min(pages, page + 1) val newPage = min(pages, page + 1)
menu.addState(player, pageKey, newPage) menu.setState(player, pageKey, newPage)
} }
} }
) )
@@ -197,6 +195,14 @@ object JobsGUI {
} }
} }
) )
for (config in plugin.configYml.getSubsections("gui.custom-slots")) {
setSlot(
config.getInt("row"),
config.getInt("column"),
ConfigSlot(config)
)
}
} }
} }

View File

@@ -0,0 +1,50 @@
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.PlayerJobLeaveEvent
import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority
import org.bukkit.event.Listener
object PriceHandler : Listener {
@EventHandler(
priority = EventPriority.LOW,
ignoreCancelled = true
)
fun onJoin(event: PlayerJobJoinEvent) {
val player = event.player
val job = event.job
val price = job.joinPrice
if (price > 0) {
val hasMoney = player.balance >= price
if (!hasMoney) {
event.isCancelled = true
}
player.balance -= price
}
}
@EventHandler(
priority = EventPriority.LOW,
ignoreCancelled = true
)
fun onLeave(event: PlayerJobLeaveEvent) {
val player = event.player
val job = event.job
val price = job.leavePrice
if (price > 0) {
val hasMoney = player.balance >= price
if (!hasMoney) {
event.isCancelled = true
}
player.balance -= price
}
}
}

View File

@@ -0,0 +1,19 @@
package com.willfp.ecojobs.jobs
import com.willfp.ecojobs.api.event.PlayerJobLeaveEvent
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
object ResetOnQuitListener : Listener {
@EventHandler(
ignoreCancelled = true
)
fun onQuit(event: PlayerJobLeaveEvent) {
val player = event.player
val job = event.job
if (job.resetsOnQuit) {
player.resetJob(job)
}
}
}

View File

@@ -48,12 +48,14 @@ gui:
- "" - ""
item: player_head texture:eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYmFkYzA0OGE3Y2U3OGY3ZGFkNzJhMDdkYTI3ZDg1YzA5MTY4ODFlNTUyMmVlZWQxZTNkYWYyMTdhMzhjMWEifX19 item: player_head texture:eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYmFkYzA0OGE3Y2U3OGY3ZGFkNzJhMDdkYTI3ZDg1YzA5MTY4ODFlNTUyMmVlZWQxZTNkYWYyMTdhMzhjMWEifX19
# %join_price% and %leave_price% are also available as placeholders
active: active:
name: "%job% &fLvl. &a%level%" name: "%job% &fLvl. &a%level%"
lore: lore:
- "%description%" - "%description%"
- "&f" - "&f"
- "&fEffects:" - "&fJob Rewards:"
- "%effects%" - "%effects%"
- "" - ""
- "&fProgress:" - "&fProgress:"
@@ -67,7 +69,7 @@ gui:
lore: lore:
- "%description%" - "%description%"
- "&f" - "&f"
- "&fEffects:" - "&fJob Rewards:"
- "%effects%" - "%effects%"
- "" - ""
- "&fProgress:" - "&fProgress:"
@@ -114,6 +116,9 @@ gui:
row: 4 row: 4
column: 2 column: 2
# Custom GUI slots; see here for a how-to: https://plugins.auxilor.io/all-plugins/custom-gui-slots
custom-slots: []
level-gui: level-gui:
rows: 6 rows: 6
@@ -208,6 +213,9 @@ level-gui:
row: 6 row: 6
column: 5 column: 5
# 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
@@ -247,12 +255,18 @@ cannot-afford-type:
sound: "BLOCK_NOTE_BLOCK_PLING" sound: "BLOCK_NOTE_BLOCK_PLING"
pitch: 0.5 pitch: 0.5
cannot-afford-price:
in-actionbar: true
sound:
enabled: true
sound: "BLOCK_NOTE_BLOCK_PLING"
pitch: 0.5
point-names: # If you have point names that look ugly (eg g_souls) then you can map them to nice names to be shown to players. point-names: # If you have point names that look ugly (eg g_souls) then you can map them to nice names to be shown to players.
example_point: "Nicely Formatted Point" example_point: "Nicely Formatted Point"
use-faster-move-trigger: true # Disable if you want move trigger to detect sub-1-block movements use-faster-move-trigger: true # Disable if you want move trigger to detect sub-1-block movements
raytrace-distance: 80 # The distance that alt_click should check for a location raytrace-distance: 80 # The distance that alt_click should check for a location
block-item-drop-place-check: true # If the block_item_drop trigger should only fire on naturally placed blocks (prevents dupes)
potions: potions:
icon: icon:

View File

@@ -13,6 +13,13 @@ description: "&8&oLevel up by mining blocks"
# If the job should be unlocked by default # 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
# The price to join or leave this job (set to 0 to disable)
join-price: 0
leave-price: 0
# 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:
- 100 - 100

View File

@@ -0,0 +1,111 @@
name: "&#FD9113Beekeeper"
description: "&8&oLevelling up by breeding bees, but don't drink any honey!"
unlocked-by-default: true
reset-on-quit: false
join-price: 0
leave-price: 0
level-xp-requirements:
- 100
- 120
- 150
- 180
- 210
- 250
- 300
- 360
- 430
- 520
- 620
- 740
- 890
- 1000
- 1300
- 1500
- 1900
- 2200
- 2700
- 3200
- 3800
- 4600
- 5500
- 6600
- 7900
- 9500
- 11500
- 14000
- 17000
- 19000
- 24000
- 29000
- 34000
- 41000
- 50000
- 60000
- 70000
- 85000
- 100000
- 120000
- 150000
- 180000
- 210000
- 250000
- 300000
- 360000
- 440000
- 580000
- 750000
xp-gain-methods:
- trigger: breed
multiplier: 20.0
filters:
entities:
- bee
conditions: [ ]
level-placeholders:
- id: "money"
value: "%level% * 5"
effects-description:
1:
- "&8» &8Earn &a$%money%&8 for each bee you breed"
rewards-description:
1:
- "&8» &8Earn &a$%money%&8 for each bee you breed"
level-up-messages:
1:
- "&8» &8Earn &a$%money%&8 for each bee you breed"
level-commands: [ ]
effects:
- id: give_money
args:
amount: "%v% * %level% * 2.0"
triggers:
- breed
filters:
entities:
- bee
- id: take_money
args:
amount: "%v% * %level% * 5.0"
triggers:
- consume
filters:
items:
- honey_bottle
conditions: [ ]
icon: player_head texture:eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZjY0MjgyZWQxOTc4NzQ4YjM5OTUwOTkxNDAwZjBiN2U0YTM5ZjJlN2Q5ZWNlNjA3NmFmNWQxMzUxYzExNzc3ZiJ9fX0=

View File

@@ -3,6 +3,11 @@ description: "&8&oLevel up by placing blocks"
unlocked-by-default: true unlocked-by-default: true
reset-on-quit: false
join-price: 0
leave-price: 0
level-xp-requirements: level-xp-requirements:
- 100 - 100
- 120 - 120
@@ -84,14 +89,6 @@ effects:
args: args:
every: "ceil(12 - %level% / 8)" every: "ceil(12 - %level% / 8)"
amount: "1.2 * %level%" amount: "1.2 * %level%"
filters:
items:
- "*wooden_pickaxe"
- "*stone_pickaxe"
- "*iron_pickaxe"
- "*golden_pickaxe"
- "*diamond_pickaxe"
- "*netherite_pickaxe"
triggers: triggers:
- place_block - place_block

View File

@@ -0,0 +1,94 @@
name: "&#7A54FBEnchanter"
description: "&7&oLevel up by enchanting items"
unlocked-by-default: true
reset-on-quit: false
join-price: 0
leave-price: 0
level-xp-requirements:
- 100
- 120
- 150
- 180
- 210
- 250
- 300
- 360
- 430
- 520
- 620
- 740
- 890
- 1000
- 1300
- 1500
- 1900
- 2200
- 2700
- 3200
- 3800
- 4600
- 5500
- 6600
- 7900
- 9500
- 11500
- 14000
- 17000
- 19000
- 24000
- 29000
- 34000
- 41000
- 50000
- 60000
- 70000
- 85000
- 100000
- 120000
- 150000
- 180000
- 210000
- 250000
- 300000
- 360000
- 440000
- 580000
- 750000
xp-gain-methods:
- trigger: enchant_item
multiplier: 0.5
conditions: [ ]
level-placeholders:
- id: "money"
value: "%level% * 0.25"
effects-description:
1:
- "&8» &8Earn &a$%money%&8 for each enchanted item"
rewards-description:
1:
- "&8» &8Earn &a$%money%&8 for each enchanted item"
level-up-messages:
1:
- "&8» &8Earn &a$%money%&8 for each enchanted item"
level-commands: [ ]
effects:
- id: give_money
args:
amount: "%level% * 0.25"
triggers:
- enchant_item
conditions: [ ]
icon: player_head texture:eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDJjOGU3NmZjZGRlOWExNWFlMzkyOWI4NGJmNmZmYTRjMTc3N2IxZTI2YjdkNmQ4OTM4ZjBlZjA0ZTg0ODc0YyJ9fX0=

View File

@@ -3,6 +3,11 @@ description: "&8&oLevel up by farming crops"
unlocked-by-default: true unlocked-by-default: true
reset-on-quit: false
join-price: 0
leave-price: 0
level-xp-requirements: level-xp-requirements:
- 100 - 100
- 120 - 120
@@ -80,15 +85,15 @@ level-placeholders:
effects-description: effects-description:
1: 1:
- "&8» &8Earn &a$%money%&8 for each crop you farm" - "&8» &8Earn &a$%money%&8 for each crop farmed"
rewards-description: rewards-description:
1: 1:
- "&8» &8Earn &a$%money%&8 for each crop you farm" - "&8» &8Earn &a$%money%&8 for each crop farmed"
level-up-messages: level-up-messages:
1: 1:
- "&8» &8Earn &a$%money%&8 for each crop you farm" - "&8» &8Earn &a$%money%&8 for each crop farmed"
level-commands: [ ] level-commands: [ ]

View File

@@ -0,0 +1,94 @@
name: "&#adf3fdFisherman"
description: "&8&oLevel up by fishing"
unlocked-by-default: true
reset-on-quit: false
join-price: 0
leave-price: 0
level-xp-requirements:
- 100
- 120
- 150
- 180
- 210
- 250
- 300
- 360
- 430
- 520
- 620
- 740
- 890
- 1000
- 1300
- 1500
- 1900
- 2200
- 2700
- 3200
- 3800
- 4600
- 5500
- 6600
- 7900
- 9500
- 11500
- 14000
- 17000
- 19000
- 24000
- 29000
- 34000
- 41000
- 50000
- 60000
- 70000
- 85000
- 100000
- 120000
- 150000
- 180000
- 210000
- 250000
- 300000
- 360000
- 440000
- 580000
- 750000
xp-gain-methods:
- trigger: catch_fish
multiplier: 20.0
conditions: [ ]
level-placeholders:
- id: "money"
value: "%level% * 5"
effects-description:
1:
- "&8» &8Earn &a$%money%&8 for each fish caught"
rewards-description:
1:
- "&8» &8Earn &a$%money%&8 for each fish caught"
level-up-messages:
1:
- "&8» &8Earn &a$%money%&8 for each fish caught"
level-commands: [ ]
effects:
- id: give_money
args:
amount: "%v% * %level% * 2.0"
triggers:
- catch_fish
conditions: [ ]
icon: player_head texture:eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDgwNGU0MmVjOWIwN2ZjZTFjZTAwNThiNzhkZjU3NjNmNmU0MTBkOWNlODJlZjFlYmI5NTk3YTE1MmI2ZDRjOCJ9fX0=

View File

@@ -0,0 +1,117 @@
name: "&#FB8810Lumberjack"
description: "&7&oLevel up by chopping wood"
unlocked-by-default: true
reset-on-quit: false
join-price: 0
leave-price: 0
level-xp-requirements:
- 100
- 120
- 150
- 180
- 210
- 250
- 300
- 360
- 430
- 520
- 620
- 740
- 890
- 1000
- 1300
- 1500
- 1900
- 2200
- 2700
- 3200
- 3800
- 4600
- 5500
- 6600
- 7900
- 9500
- 11500
- 14000
- 17000
- 19000
- 24000
- 29000
- 34000
- 41000
- 50000
- 60000
- 70000
- 85000
- 100000
- 120000
- 150000
- 180000
- 210000
- 250000
- 300000
- 360000
- 440000
- 580000
- 750000
xp-gain-methods:
- trigger: mine_block
multiplier: 0.5
conditions: [ ]
filters:
items:
- "*oak_log"
- "*spruce_log"
- "*birch_log"
- "*jungle_log"
- "*acacia_log"
- "*dark_oak_log"
- "*mangrove_log"
- "*crimson_stem"
- "*warped_stem"
level-placeholders:
- id: "money"
value: "%level% * 0.4"
effects-description:
1:
- "&8» &8Earn &a$%money%&8 for each log chopped."
rewards-description:
1:
- "&8» &8Earn &a$%money%&8 for each log chopped."
level-up-messages:
1:
- "&8» &8Earn &a$%money%&8 for each log chopped."
level-commands: [ ]
effects:
- id: give_money
args:
every: "ceil(10 - %level% / 10)"
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:
- mine_block
conditions: [ ]
icon: player_head texture:basehead-eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvN2E2MjA3MDJmODBiZDJjMjI0MmUyZjEzMWMzZjlhMjU5NDAyYjdmYTg5NzRjODZjZjM0NTBmZjczZTc3MDU5NSJ9fX0=

View File

@@ -3,6 +3,11 @@ description: "&8&oLevel up by mining blocks"
unlocked-by-default: true unlocked-by-default: true
reset-on-quit: false
join-price: 0
leave-price: 0
level-xp-requirements: level-xp-requirements:
- 100 - 100
- 120 - 120

View File

@@ -3,6 +3,11 @@ description: "&8&oLevel up by killing mobs"
unlocked-by-default: true unlocked-by-default: true
reset-on-quit: false
join-price: 0
leave-price: 0
level-xp-requirements: level-xp-requirements:
- 100 - 100
- 120 - 120

View File

@@ -0,0 +1,94 @@
name: "&#4B4736Smelter"
description: "&7&oLevel up by smelting items"
unlocked-by-default: true
reset-on-quit: false
join-price: 0
leave-price: 0
level-xp-requirements:
- 100
- 120
- 150
- 180
- 210
- 250
- 300
- 360
- 430
- 520
- 620
- 740
- 890
- 1000
- 1300
- 1500
- 1900
- 2200
- 2700
- 3200
- 3800
- 4600
- 5500
- 6600
- 7900
- 9500
- 11500
- 14000
- 17000
- 19000
- 24000
- 29000
- 34000
- 41000
- 50000
- 60000
- 70000
- 85000
- 100000
- 120000
- 150000
- 180000
- 210000
- 250000
- 300000
- 360000
- 440000
- 580000
- 750000
xp-gain-methods:
- trigger: smelt
multiplier: 0.5
conditions: [ ]
level-placeholders:
- id: "money"
value: "%level% * 0.25"
effects-description:
1:
- "&8» &8Earn &a$%money%&8 for each smelted item"
rewards-description:
1:
- "&8» &8Earn &a$%money%&8 for each smelted item"
level-up-messages:
1:
- "&8» &8Earn &a$%money%&8 for each smelted item"
level-commands: [ ]
effects:
- id: give_money
args:
amount: "%level% * 0.25"
triggers:
- smelt
conditions: [ ]
icon: player_head texture:eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvODdjMDc0ODM2MmU5YTYzZTA3YWEyYjA4YjVmN2QxMDFlNTM5NWFhMjE1MzJhNDc2NzIyZGJkZDk4YzJmMiJ9fX0=

View File

@@ -0,0 +1,190 @@
# The ID of the job is the name of the .yml file,
# for example miner.yml has the ID of miner
# You can place jobs anywhere in this folder,
# including in subfolders if you want to organize your job configs
# _example.yml is not loaded.
# The display name of the job
name: "&#0047b3Toolsmith"
# The description of the job
description: "&8&oLevel up by crafting tools"
# If the job should be unlocked by default
unlocked-by-default: true
# If job progress should be reset when quitting
reset-on-quit: false
# The price to join or leave this job (set to 0 to disable)
join-price: 0
leave-price: 0
# The xp requirements for each job level - add new levels by adding more to this list
level-xp-requirements:
- 100
- 120
- 150
- 180
- 210
- 250
- 300
- 360
- 430
- 520
- 620
- 740
- 890
- 1000
- 1300
- 1500
- 1900
- 2200
- 2700
- 3200
- 3800
- 4600
- 5500
- 6600
- 7900
- 9500
- 11500
- 14000
- 17000
- 19000
- 24000
- 29000
- 34000
- 41000
- 50000
- 60000
- 70000
- 85000
- 100000
- 120000
- 150000
- 180000
- 210000
- 250000
- 300000
- 360000
- 440000
- 580000
- 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:
- trigger: craft
multiplier: 2
conditions: [ ]
filters:
items:
- "*wooden_pickaxe"
- "*stone_pickaxe"
- "*iron_pickaxe"
- "*golden_pickaxe"
- "*diamond_pickaxe"
- "*netherite_pickaxe"
- "*wooden_axe"
- "*stone_axe"
- "*iron_axe"
- "*golden_axe"
- "*diamond_axe"
- "*netherite_axe"
- "*wooden_shovel"
- "*stone_shovel"
- "*iron_shovel"
- "*golden_shovel"
- "*diamond_shovel"
- "*netherite_shovel"
- "*wooden_hoe"
- "*stone_hoe"
- "*iron_hoe"
- "*golden_hoe"
- "*diamond_hoe"
- "*netherite_hoe"
- "*fishing_rod"
- "*flint_and_steel"
- "*clock"
- "*compass"
- "*lead"
- "*shears"
- "*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:
- id: "money"
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:
1:
- "&8» &8Earn &a$%money%&8 for each tool crafted"
# Same as above, but for %rewards%
rewards-description:
1:
- "&8» &8Earn &a$%money%&8 for each tool crafted"
# Same as above, but for %level_up_messages%
level-up-messages:
1:
- "&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: [ ]
# The effects for the job, has %level% as a placeholder
effects:
- id: give_money
args:
amount: "2 * %level%"
filters:
items:
- "*wooden_pickaxe"
- "*stone_pickaxe"
- "*iron_pickaxe"
- "*golden_pickaxe"
- "*diamond_pickaxe"
- "*netherite_pickaxe"
- "*wooden_axe"
- "*stone_axe"
- "*iron_axe"
- "*golden_axe"
- "*diamond_axe"
- "*netherite_axe"
- "*wooden_shovel"
- "*stone_shovel"
- "*iron_shovel"
- "*golden_shovel"
- "*diamond_shovel"
- "*netherite_shovel"
- "*wooden_hoe"
- "*stone_hoe"
- "*iron_hoe"
- "*golden_hoe"
- "*diamond_hoe"
- "*netherite_hoe"
- "*fishing_rod"
- "*flint_and_steel"
- "*clock"
- "*compass"
- "*lead"
- "*shears"
- "*spyglass"
triggers:
- craft
# The conditions for the job, also has %level% as a placeholder
conditions: [ ]
# The icon in GUIs
icon: player_head texture:eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvODk2ZDRjODM4YTE2MDZhYzc1Nzc1NDIzMjA4NjE0OTcwOGI3OWFiYTAxYmU5NTNjNjUzOTkxMDFlODk0M2RhZiJ9fX0=

View File

@@ -6,8 +6,17 @@ messages:
reloaded: "Reloaded!" reloaded: "Reloaded!"
cannot-afford: "&cYou can't afford to do this! &fCost: &a$$%cost%" cannot-afford: "&cYou can't afford to do this! &fCost: &a$$%cost%"
cannot-afford-type: "&cYou can't afford to do this! &fCost: &a%cost% %type%" cannot-afford-type: "&cYou can't afford to do this! &fCost: &a%cost% %type%"
cannot-afford-price: "&cYou can't afford to do this! &fPrice: %price%"
on-cooldown: "&cThis effect is on cooldown! &fTime left: &a%seconds% seconds" on-cooldown: "&cThis effect is on cooldown! &fTime left: &a%seconds% seconds"
cannot-transmit: "&cYou can't transmit here!" cannot-transmit: "&cYou can't transmit here!"
must-specify-lrcdb-id: "&cYou must specify the ID of the config to download! Not sure what this means? Go to &alrcdb.auxilor.io"
lrcdb-import-error: "&cError importing config: &f%message%"
lrcdb-import-success: "&fImported &a%name%&f! Reload the plugin to install it"
must-specify-config-name: "&cYou must specify the config name!"
invalid-config-name: "&cInvalid config name!"
lrcdb-export-error: "&cError exporting config: &f%message%"
lrcdb-export-success: "&fExported &a%name%&f! View it on &alrcdb.auxilor.io&f, or share your config ID: &f%id%"
needs-player: "&cYou must specify a player!" needs-player: "&cYou must specify a player!"
gave-xp: "&fYou have given &a%xp% &fXP to %player%&f's %job%&f!" gave-xp: "&fYou have given &a%xp% &fXP to %player%&f's %job%&f!"
reset-xp: "&fYou have reset %player%&f's %job%&f XP!" reset-xp: "&fYou have reset %player%&f's %job%&f XP!"
@@ -20,6 +29,17 @@ messages:
unlocked-job: "&fSuccessfully unlocked the %job%&f job for %player%!" unlocked-job: "&fSuccessfully unlocked the %job%&f job for %player%!"
cannot-spawn-job: "&cYou already have this job unlocked!" cannot-spawn-job: "&cYou already have this job unlocked!"
invalid-amount: "&cInvalid amount!" invalid-amount: "&cInvalid amount!"
no-job: "&cYou don't have a job!"
joined-job: "&fYou have joined the %job%&f job!"
left-job: "&fYou have left the %job%&f job!"
job-already-joined: "&cYou already have this job!"
must-specify-lrcdb-id: "&cYou must specify the ID of the config to download! Not sure what this means? Go to &alrcdb.auxilor.io"
lrcdb-import-error: "&cError importing config: &f%message%"
lrcdb-import-success: "&fImported &a%name%&f! Reload the plugin to install it"
must-specify-config-name: "&cYou must specify the config name!"
invalid-config-name: "&cInvalid config name!"
lrcdb-export-error: "&cError exporting config: &f%message%"
lrcdb-export-success: "&fExported &a%name%&f! View it on &alrcdb.auxilor.io&f, or share your config ID: &f%id%"
menu: menu:
title: "Jobs" title: "Jobs"

View File

@@ -0,0 +1,19 @@
# Options for lrcdb (https://lrcdb.auxilor.io), a website to share configs
# with other server owners, so you can get more configs without making them
# yourself!
author: "Unknown Author" # The name attached to configs you export
# Options about automatically sharing configs you create
share-configs:
# If you want all your configs to automatically be publicly available,
# set this to true. This really helps out other users!
publicly: false
# If you don't want your configs to be usable to gather information about
# plugin usage or to improve the plugins in the future, disable this.
# Nothing identifying is shared.
enabled: true
# If you disable share-configs, you can still share select configs publicly
# with /ecojobs export <config>.

View File

@@ -49,7 +49,11 @@ permissions:
ecojobs.command.jobs: true ecojobs.command.jobs: true
ecojobs.command.unlock: true ecojobs.command.unlock: true
ecojobs.command.givexp: true ecojobs.command.givexp: true
ecojobs.command.join: true
ecojobs.command.leave: true
ecojobs.command.reset: true ecojobs.command.reset: true
ecojobs.command.import: true
ecojobs.command.export: true
ecojobs.command.reload: ecojobs.command.reload:
description: Allows reloading the config description: Allows reloading the config
@@ -69,6 +73,18 @@ permissions:
ecojobs.command.reset: ecojobs.command.reset:
description: Allows the use of /ecojobs reset. description: Allows the use of /ecojobs reset.
default: op default: op
ecojobs.command.import:
description: Allows the use of /ecojobs import.
default: op
ecojobs.command.export:
description: Allows the use of /ecojobs export.
default: op
ecojobs.command.join:
description: Allows the use of /jobs join.
default: true
ecojobs.command.leave:
description: Allows the use of /jobs leave.
default: true
ecojobs.xpmultiplier.50percent: ecojobs.xpmultiplier.50percent:
description: Gives the player 50% more job experience description: Gives the player 50% more job experience

View File

@@ -1,4 +1,4 @@
#libreforge-updater #libreforge-updater
#Sun Sep 11 19:27:54 BST 2022 #Mon Oct 24 17:04:52 BST 2022
version=1.1.0 version=1.20.0
plugin-name=EcoJobs plugin-name=EcoJobs

0
gradlew vendored Normal file → Executable file
View File