Added rarity system
This commit is contained in:
@@ -37,9 +37,10 @@ allprojects {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compileOnly("com.willfp:eco:6.71.0")
|
compileOnly("com.willfp:eco:6.72.0")
|
||||||
compileOnly("org.jetbrains:annotations:23.0.0")
|
compileOnly("org.jetbrains:annotations:23.0.0")
|
||||||
compileOnly("org.jetbrains.kotlin:kotlin-stdlib:1.9.20")
|
compileOnly("org.jetbrains.kotlin:kotlin-stdlib:1.9.20")
|
||||||
|
compileOnly("com.github.ben-manes.caffeine:caffeine:3.1.5")
|
||||||
}
|
}
|
||||||
|
|
||||||
java {
|
java {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ group = "com.willfp"
|
|||||||
version = rootProject.version
|
version = rootProject.version
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compileOnly("io.papermc.paper:paper-api:1.20-R0.1-SNAPSHOT")
|
compileOnly("io.papermc.paper:paper-api:1.20.4-R0.1-SNAPSHOT")
|
||||||
}
|
}
|
||||||
|
|
||||||
publishing {
|
publishing {
|
||||||
|
|||||||
@@ -4,12 +4,14 @@ import com.willfp.eco.core.command.impl.PluginCommand
|
|||||||
import com.willfp.eco.core.display.DisplayModule
|
import com.willfp.eco.core.display.DisplayModule
|
||||||
import com.willfp.ecoitems.commands.CommandEcoItems
|
import com.willfp.ecoitems.commands.CommandEcoItems
|
||||||
import com.willfp.ecoitems.display.ItemsDisplay
|
import com.willfp.ecoitems.display.ItemsDisplay
|
||||||
|
import com.willfp.ecoitems.display.RarityDisplay
|
||||||
import com.willfp.ecoitems.items.EcoItemFinder
|
import com.willfp.ecoitems.items.EcoItemFinder
|
||||||
import com.willfp.ecoitems.items.EcoItems
|
import com.willfp.ecoitems.items.EcoItems
|
||||||
import com.willfp.ecoitems.items.EcoItemsRecipes
|
import com.willfp.ecoitems.items.EcoItemsRecipes
|
||||||
import com.willfp.ecoitems.items.ItemAttributeListener
|
import com.willfp.ecoitems.items.ItemAttributeListener
|
||||||
import com.willfp.ecoitems.items.ItemListener
|
import com.willfp.ecoitems.items.ItemListener
|
||||||
import com.willfp.ecoitems.libreforge.ConditionHasEcoItem
|
import com.willfp.ecoitems.libreforge.ConditionHasEcoItem
|
||||||
|
import com.willfp.ecoitems.rarity.Rarities
|
||||||
import com.willfp.ecoitems.util.DiscoverRecipeListener
|
import com.willfp.ecoitems.util.DiscoverRecipeListener
|
||||||
import com.willfp.libreforge.conditions.Conditions
|
import com.willfp.libreforge.conditions.Conditions
|
||||||
import com.willfp.libreforge.loader.LibreforgePlugin
|
import com.willfp.libreforge.loader.LibreforgePlugin
|
||||||
@@ -21,9 +23,6 @@ internal lateinit var plugin: EcoItemsPlugin
|
|||||||
private set
|
private set
|
||||||
|
|
||||||
class EcoItemsPlugin : LibreforgePlugin() {
|
class EcoItemsPlugin : LibreforgePlugin() {
|
||||||
/**
|
|
||||||
* Internal constructor called by bukkit on plugin load.
|
|
||||||
*/
|
|
||||||
init {
|
init {
|
||||||
plugin = this
|
plugin = this
|
||||||
}
|
}
|
||||||
@@ -36,6 +35,7 @@ class EcoItemsPlugin : LibreforgePlugin() {
|
|||||||
|
|
||||||
override fun loadConfigCategories(): List<ConfigCategory> {
|
override fun loadConfigCategories(): List<ConfigCategory> {
|
||||||
return listOf(
|
return listOf(
|
||||||
|
Rarities,
|
||||||
EcoItems,
|
EcoItems,
|
||||||
EcoItemsRecipes
|
EcoItemsRecipes
|
||||||
)
|
)
|
||||||
@@ -55,7 +55,10 @@ class EcoItemsPlugin : LibreforgePlugin() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun createDisplayModule(): DisplayModule {
|
override fun loadDisplayModules(): List<DisplayModule> {
|
||||||
return ItemsDisplay(this)
|
return listOf(
|
||||||
|
ItemsDisplay(this),
|
||||||
|
RarityDisplay(this)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,42 @@
|
|||||||
|
package com.willfp.ecoitems.display
|
||||||
|
|
||||||
|
import com.willfp.eco.core.EcoPlugin
|
||||||
|
import com.willfp.eco.core.display.Display
|
||||||
|
import com.willfp.eco.core.display.DisplayModule
|
||||||
|
import com.willfp.eco.core.display.DisplayPriority
|
||||||
|
import com.willfp.eco.core.display.DisplayProperties
|
||||||
|
import com.willfp.eco.core.fast.fast
|
||||||
|
import com.willfp.ecoitems.rarity.Rarities
|
||||||
|
import com.willfp.ecoitems.rarity.ecoItemRarity
|
||||||
|
import org.bukkit.entity.Player
|
||||||
|
import org.bukkit.inventory.ItemStack
|
||||||
|
|
||||||
|
class RarityDisplay(plugin: EcoPlugin) : DisplayModule(plugin, DisplayPriority.HIGHEST.weight + 1) {
|
||||||
|
override fun display(itemStack: ItemStack, player: Player?, properties: DisplayProperties, vararg args: Any) {
|
||||||
|
if (!plugin.configYml.getBool("rarity.enabled")) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (properties.inGui) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
val baseRarity = itemStack.ecoItemRarity
|
||||||
|
|
||||||
|
if (baseRarity == null) {
|
||||||
|
if (!plugin.configYml.getBool("rarity.display-default")) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val rarity = baseRarity ?: Rarities.defaultRarity
|
||||||
|
|
||||||
|
val fis = itemStack.fast()
|
||||||
|
val lore = fis.lore.toMutableList()
|
||||||
|
if (plugin.configYml.getBool("rarity.blank-lore-line")) {
|
||||||
|
lore += Display.PREFIX
|
||||||
|
}
|
||||||
|
lore += rarity.displayLore
|
||||||
|
fis.lore = lore
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,6 +8,7 @@ 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.recipe.Recipes
|
import com.willfp.eco.core.recipe.Recipes
|
||||||
import com.willfp.eco.core.registry.Registrable
|
import com.willfp.eco.core.registry.Registrable
|
||||||
|
import com.willfp.ecoitems.rarity.Rarities
|
||||||
import com.willfp.libreforge.Holder
|
import com.willfp.libreforge.Holder
|
||||||
import com.willfp.libreforge.ViolationContext
|
import com.willfp.libreforge.ViolationContext
|
||||||
import com.willfp.libreforge.conditions.Conditions
|
import com.willfp.libreforge.conditions.Conditions
|
||||||
@@ -81,6 +82,8 @@ class EcoItem(
|
|||||||
|
|
||||||
val baseAttackSpeed = config.getDoubleOrNull("base-attack-speed")
|
val baseAttackSpeed = config.getDoubleOrNull("base-attack-speed")
|
||||||
|
|
||||||
|
val rarity = Rarities[config.getString("rarity")]
|
||||||
|
|
||||||
override fun getID(): String {
|
override fun getID(): String {
|
||||||
return this.id.key
|
return this.id.key
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
package com.willfp.ecoitems.rarity
|
||||||
|
|
||||||
|
import com.github.benmanes.caffeine.cache.Caffeine
|
||||||
|
import com.willfp.eco.core.config.interfaces.Config
|
||||||
|
import com.willfp.eco.core.items.HashedItem
|
||||||
|
import com.willfp.ecoitems.EcoItemsPlugin
|
||||||
|
import com.willfp.ecoitems.items.ecoItem
|
||||||
|
import com.willfp.ecoitems.plugin
|
||||||
|
import com.willfp.libreforge.loader.LibreforgePlugin
|
||||||
|
import com.willfp.libreforge.loader.configs.RegistrableCategory
|
||||||
|
import org.bukkit.inventory.ItemStack
|
||||||
|
import java.util.Optional
|
||||||
|
import java.util.concurrent.TimeUnit
|
||||||
|
import kotlin.jvm.optionals.getOrNull
|
||||||
|
|
||||||
|
object Rarities : RegistrableCategory<Rarity>("rarity", "rarities") {
|
||||||
|
override fun clear(plugin: LibreforgePlugin) {
|
||||||
|
registry.clear()
|
||||||
|
cache.invalidateAll()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun acceptConfig(plugin: LibreforgePlugin, id: String, config: Config) {
|
||||||
|
registry.register(Rarity(id, config, plugin as EcoItemsPlugin))
|
||||||
|
}
|
||||||
|
|
||||||
|
val defaultRarity: Rarity
|
||||||
|
get() = Rarities[plugin.configYml.getString("rarity.default")]
|
||||||
|
?: throw IllegalStateException("Invalid default rarity!")
|
||||||
|
}
|
||||||
|
|
||||||
|
private val cache = Caffeine.newBuilder()
|
||||||
|
.expireAfterAccess(5, TimeUnit.SECONDS)
|
||||||
|
.build<HashedItem, Optional<Rarity>>()
|
||||||
|
|
||||||
|
val ItemStack.ecoItemRarity: Rarity?
|
||||||
|
get() {
|
||||||
|
val configuredRarity = this.ecoItem?.rarity
|
||||||
|
|
||||||
|
val item = HashedItem.of(this)
|
||||||
|
|
||||||
|
return cache.get(item) {
|
||||||
|
Optional.ofNullable(configuredRarity ?: Rarities.values()
|
||||||
|
.sortedByDescending { it.weight }
|
||||||
|
.firstOrNull { it.matches(this) })
|
||||||
|
}.getOrNull()
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
package com.willfp.ecoitems.rarity
|
||||||
|
|
||||||
|
import com.willfp.eco.core.config.interfaces.Config
|
||||||
|
import com.willfp.eco.core.display.Display
|
||||||
|
import com.willfp.eco.core.items.Items
|
||||||
|
import com.willfp.eco.core.recipe.parts.EmptyTestableItem
|
||||||
|
import com.willfp.eco.core.registry.KRegistrable
|
||||||
|
import com.willfp.ecoitems.EcoItemsPlugin
|
||||||
|
import org.bukkit.inventory.ItemStack
|
||||||
|
|
||||||
|
class Rarity(
|
||||||
|
override val id: String,
|
||||||
|
val config: Config,
|
||||||
|
val plugin: EcoItemsPlugin
|
||||||
|
) : KRegistrable {
|
||||||
|
val items = config.getStrings("items")
|
||||||
|
.map { Items.lookup(it) }
|
||||||
|
.filterNot { it is EmptyTestableItem }
|
||||||
|
|
||||||
|
val weight = config.getInt("weight")
|
||||||
|
|
||||||
|
val lore = config.getFormattedStrings("lore")
|
||||||
|
|
||||||
|
val displayLore = lore.map { Display.PREFIX + it }
|
||||||
|
|
||||||
|
fun matches(item: ItemStack): Boolean {
|
||||||
|
return items.any { it.matches(item) }
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun equals(other: Any?): Boolean {
|
||||||
|
return other is Rarity && other.id == this.id
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun hashCode(): Int {
|
||||||
|
return id.hashCode()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,3 +4,9 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
discover-recipes: true # If all recipes should be automatically discovered.
|
discover-recipes: true # If all recipes should be automatically discovered.
|
||||||
|
|
||||||
|
rarity:
|
||||||
|
enabled: false # If the rarity system should be enabled
|
||||||
|
blank-lore-line: true # If there should be a blank lore line separating the rarity from the item lore
|
||||||
|
default: common # The default rarity for unspecified items
|
||||||
|
display-default: true # If the default rarity should be displayed in the lore
|
||||||
|
|||||||
@@ -44,6 +44,9 @@ slot: mainhand
|
|||||||
base-damage: 12 # (Optional) The item base damage
|
base-damage: 12 # (Optional) The item base damage
|
||||||
base-attack-speed: 1.5 # (Optional) The item base attack speed
|
base-attack-speed: 1.5 # (Optional) The item base attack speed
|
||||||
|
|
||||||
|
# (Optional) The rarity of the item
|
||||||
|
rarity: rare
|
||||||
|
|
||||||
# The effects of the item (i.e. the functionality)
|
# The effects of the item (i.e. the functionality)
|
||||||
# See here: https://plugins.auxilor.io/effects/configuring-an-effect
|
# See here: https://plugins.auxilor.io/effects/configuring-an-effect
|
||||||
effects:
|
effects:
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
# The ID of the rarity is the name of the .yml file,
|
||||||
|
# for example common.yml has the ID of common
|
||||||
|
# You can place rarities anywhere in this folder,
|
||||||
|
# including in subfolders if you want to organize your rarity configs
|
||||||
|
# _example.yml is not loaded.
|
||||||
|
|
||||||
|
# The lore added to items with this rarity
|
||||||
|
lore:
|
||||||
|
- "&a&lCOMMON"
|
||||||
|
|
||||||
|
# The weight of the rarity. Higher weights take precedence over lower weights,
|
||||||
|
# so if an item has multiple rarities, the one with the highest weight will be used.
|
||||||
|
weight: 1
|
||||||
|
|
||||||
|
# The items that have this rarity
|
||||||
|
# Read here: https://plugins.auxilor.io/all-plugins/the-item-lookup-system
|
||||||
|
# EcoItems items should specify the rarity in their config rather than here
|
||||||
|
items:
|
||||||
|
- diamond
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
lore:
|
||||||
|
- "&a&lCOMMON"
|
||||||
|
|
||||||
|
weight: 1
|
||||||
|
|
||||||
|
items: []
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
lore:
|
||||||
|
- "&d&lEPIC"
|
||||||
|
|
||||||
|
weight: 1
|
||||||
|
|
||||||
|
items: []
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
lore:
|
||||||
|
- "&6&lLEGENDARY"
|
||||||
|
|
||||||
|
weight: 1
|
||||||
|
|
||||||
|
items: []
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
lore:
|
||||||
|
- "&c&lMYTHIC"
|
||||||
|
|
||||||
|
weight: 1
|
||||||
|
|
||||||
|
items: []
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
lore:
|
||||||
|
- "&9&lRARE"
|
||||||
|
|
||||||
|
weight: 1
|
||||||
|
|
||||||
|
items: []
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
lore:
|
||||||
|
- "&e&lUNCOMMON"
|
||||||
|
|
||||||
|
weight: 1
|
||||||
|
|
||||||
|
items: []
|
||||||
Reference in New Issue
Block a user