diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecomobs/commands/CommandGive.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecomobs/commands/CommandGive.kt index f910511..1f79969 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecomobs/commands/CommandGive.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecomobs/commands/CommandGive.kt @@ -57,7 +57,7 @@ class CommandGive(plugin: EcoMobsPlugin) : Subcommand( ) DropQueue(recipient) - .addItem(egg.getItem(recipient).apply { + .addItem(egg.item.item.apply { setAmount(amount) }) .forceTelekinesis() diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecomobs/display/BaseItem.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecomobs/display/BaseItem.kt new file mode 100644 index 0000000..a3268a2 --- /dev/null +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecomobs/display/BaseItem.kt @@ -0,0 +1,54 @@ +package com.willfp.ecomobs.display + +import com.willfp.eco.core.display.Display +import com.willfp.eco.core.fast.fast +import com.willfp.eco.core.placeholder.context.placeholderContext +import com.willfp.eco.util.formatEco +import com.willfp.libreforge.BlankHolder +import com.willfp.libreforge.EmptyProvidedHolder +import com.willfp.libreforge.ProvidedHolder +import org.bukkit.entity.Player +import org.bukkit.inventory.ItemStack + +class BaseItem( + private val baseItem: ItemStack, + private val rawDisplayName: String, + private val rawLore: List +) { + private val itemFlags = baseItem.fast().itemFlags + + val item: ItemStack + get() = display(baseItem.clone(), null, EmptyProvidedHolder) + + fun display(itemStack: ItemStack, player: Player?, holder: ProvidedHolder): ItemStack { + val fis = itemStack.fast() + + val context = placeholderContext( + player = player, + item = itemStack + ) + + // Handle lore + val lore = rawLore.map { "${Display.PREFIX}${it.formatEco(context)}" }.toMutableList() + + if (player != null) { + val lines = holder.getNotMetLines(player).map { Display.PREFIX + it } + + if (lines.isNotEmpty()) { + lore.add(Display.PREFIX) + lore.addAll(lines) + } + } + + lore.addAll(fis.lore) + fis.lore = lore + + // Handle display name + fis.displayName = rawDisplayName.formatEco(context) + + // Handle flags + fis.addItemFlags(*itemFlags.toTypedArray()) + + return fis.unwrap() + } +} diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecomobs/display/SpawnEggDisplay.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecomobs/display/SpawnEggDisplay.kt index 84415cb..7849934 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecomobs/display/SpawnEggDisplay.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecomobs/display/SpawnEggDisplay.kt @@ -1,7 +1,6 @@ package com.willfp.ecomobs.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.fast.fast @@ -26,10 +25,6 @@ class SpawnEggDisplay( val egg = fis.ecoMobEgg?.spawnEgg ?: return - val notMetLines = egg.conditions - .getNotMetLines(player, ItemProvidedHolder(BlankHolder, itemStack)) - .map { Display.PREFIX + it } - - fis.lore = fis.lore + notMetLines + egg.item.display(itemStack, player, ItemProvidedHolder(BlankHolder, itemStack)) } } diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecomobs/mob/impl/ConfigDrivenEcoMob.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecomobs/mob/impl/ConfigDrivenEcoMob.kt index 8704c1c..5a3dabc 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecomobs/mob/impl/ConfigDrivenEcoMob.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecomobs/mob/impl/ConfigDrivenEcoMob.kt @@ -26,6 +26,7 @@ import com.willfp.ecomobs.config.ifTrue import com.willfp.ecomobs.config.toConfigKey import com.willfp.ecomobs.config.validate import com.willfp.ecomobs.config.validateNotNull +import com.willfp.ecomobs.display.BaseItem import com.willfp.ecomobs.event.EcoMobPreSpawnEvent import com.willfp.ecomobs.event.EcoMobSpawnEvent import com.willfp.ecomobs.integrations.MobIntegration @@ -275,9 +276,11 @@ internal class ConfigDrivenEcoMob( SpawnEgg( this, conditions, - item, - name, - lore + BaseItem( + item, + name, + lore + ) ) } diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecomobs/mob/options/SpawnEgg.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecomobs/mob/options/SpawnEgg.kt index 0829863..3093ca4 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecomobs/mob/options/SpawnEgg.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecomobs/mob/options/SpawnEgg.kt @@ -5,6 +5,7 @@ import com.willfp.eco.core.fast.fast import com.willfp.eco.core.items.builder.modify import com.willfp.eco.util.formatEco import com.willfp.eco.util.namespacedKeyOf +import com.willfp.ecomobs.display.BaseItem import com.willfp.ecomobs.mob.EcoMob import com.willfp.ecomobs.mob.EcoMobs import com.willfp.ecomobs.mob.LivingMob @@ -19,17 +20,8 @@ import org.bukkit.persistence.PersistentDataType class SpawnEgg internal constructor( val mob: EcoMob, val conditions: ConditionList, - private val backingItem: ItemStack, - private val rawDisplayName: String, - private val rawLore: List + val item: BaseItem ) { - fun getItem(player: Player?): ItemStack { - return backingItem.clone().modify { - this.setDisplayName(rawDisplayName.formatEco(player)) - this.addLoreLines(rawLore.formatEco(player)) - } - } - fun trySpawn(location: Location, player: Player?): LivingMob? { if (player != null) { val canSpawn = conditions.areMetAndTrigger( diff --git a/gradle.properties b/gradle.properties index 43a3395..bb5ebf6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official -libreforge-version=4.41.0 +libreforge-version=4.42.0 version=10.0.0-b1