add book on book
Some checks failed
Java CI with Gradle / build (push) Has been cancelled

This commit is contained in:
alexcrea 2026-07-01 14:37:59 +02:00
parent d67d998dc1
commit 460114ac01
Signed by: alexcrea
GPG key ID: E346CD16413450E3
4 changed files with 35 additions and 22 deletions

View file

@ -86,6 +86,7 @@ object ConfigOptions {
// Keys for specific enchantment values
private const val KEY_BOOK = "book"
private const val KEY_BOOK_ON_BOOK = "book_on_book"
private const val KEY_ITEM = "item"
// Debug flag
@ -578,14 +579,15 @@ object ConfigOptions {
*/
fun enchantmentValue(
enchantment: CAEnchantment,
isFromBook: Boolean
isToBook: Boolean,
isFromBook: Boolean,
): Int {
// Test namespace
var limit = enchantmentValue(enchantment.key.toString(), isFromBook)
var limit = enchantmentValue(enchantment.key.toString(), isToBook, isFromBook)
if (limit != null) return limit
// Test legacy (name only)
limit = enchantmentValue(enchantment.enchantmentName, isFromBook)
limit = enchantmentValue(enchantment.enchantmentName, isToBook, isFromBook)
if (limit != null) return limit
// get default (and test old legacy if present)
@ -599,13 +601,22 @@ object ConfigOptions {
*/
private fun enchantmentValue(
enchantmentName: String,
isFromBook: Boolean
isToBook: Boolean,
isFromBook: Boolean,
): Int? {
val typeKey = if (isFromBook) KEY_BOOK else KEY_ITEM
val path = "${ENCHANT_VALUES_ROOT}.${enchantmentName}.$typeKey"
return CustomAnvil.instance
.config
.getInt(path, DEFAULT_ENCHANT_VALUE - 1)
val config = ConfigHolder.DEFAULT_CONFIG.config
if(isFromBook && isToBook) {
val specialPath = "${ENCHANT_VALUES_ROOT}.${enchantmentName}.$KEY_BOOK_ON_BOOK"
if(config.isInt(specialPath))
return config.getInt(specialPath)
.takeIf { it >= DEFAULT_ENCHANT_VALUE }
}
return config.getInt(path, DEFAULT_ENCHANT_VALUE - 1)
.takeIf { it >= DEFAULT_ENCHANT_VALUE }
}

View file

@ -23,6 +23,7 @@ import xyz.alexcrea.cuanvil.dependency.economy.EconomyManager
import xyz.alexcrea.cuanvil.group.ConflictType
import xyz.alexcrea.cuanvil.util.AnvilTitleUtil
import xyz.alexcrea.cuanvil.util.dialog.AnvilRenameDialogUtil
import kotlin.math.sqrt
object AnvilXpUtil {
@ -35,8 +36,9 @@ object AnvilXpUtil {
inventory: AnvilInventory,
view: InventoryView,
player: Player,
result: AnvilResult) {
if(result.item == null) {
result: AnvilResult
) {
if (result.item == null) {
onNoResult(player, view)
return
}
@ -246,7 +248,8 @@ object AnvilXpUtil {
fun getRightValues(left: ItemStack, right: ItemStack, result: ItemStack, cost: AnvilCost) {
// Calculate right value and illegal enchant penalty
val rightIsFormBook = right.isEnchantedBook()
val isToBook = left.isEnchantedBook()
val isFromBook = right.isEnchantedBook()
val rightEnchs = EnchantmentApi.getEnchantments(right)
val resultEnchs = EnchantmentApi.getEnchantments(result)
val resultEnchsKeys = HashMap(resultEnchs)
@ -274,22 +277,21 @@ object AnvilXpUtil {
// We know "enchantment.key in resultEnchs" true
val resultLevel = resultEnchs[enchantment.key]!!
val enchantmentMultiplier = ConfigOptions.enchantmentValue(enchantment.key, rightIsFormBook)
val enchantmentMultiplier = ConfigOptions.enchantmentValue(enchantment.key, isFromBook, isToBook)
val value = resultLevel * enchantmentMultiplier
CustomAnvil.log("Value for sacrifice item ${enchantment.key.enchantmentName} level ${enchantment.value} is $value ($resultLevel * $enchantmentMultiplier)")
rightValue += value
}
if(ConfigOptions.includeLeftEnchantmentForCost) {
val leftIsFormBook = left.isEnchantedBook()
if (ConfigOptions.includeLeftEnchantmentForCost) {
val leftEnchs = EnchantmentApi.getEnchantments(left)
for (enchantment in leftEnchs) {
// Do not process enchantment that are present on the sacrifice
if(rightEnchs.contains(enchantment.key)) continue
if (rightEnchs.contains(enchantment.key)) continue
val resultLevel = resultEnchs.getOrDefault(enchantment.key, 0)
val enchantmentMultiplier = ConfigOptions.enchantmentValue(enchantment.key, leftIsFormBook)
val enchantmentMultiplier = ConfigOptions.enchantmentValue(enchantment.key, isFromBook, isToBook)
val value = resultLevel * enchantmentMultiplier
CustomAnvil.log("Value for left item ${enchantment.key.enchantmentName} level ${enchantment.value} is $value ($resultLevel * $enchantmentMultiplier)")
leftValue += value
@ -312,15 +314,15 @@ object AnvilXpUtil {
*/
fun calculateLevelForXp(xp: Int): Int {
return when {
xp <= 352 -> (Math.sqrt((xp + 9).toDouble()) - 3).toInt()
xp <= 352 -> (sqrt((xp + 9).toDouble()) - 3).toInt()
xp <= 1507 -> {
val inner = (2.0 / 5.0) * (xp - 7839.0 / 40.0)
(81.0 / 10.0 + Math.sqrt(inner)).toInt()
(81.0 / 10.0 + sqrt(inner)).toInt()
}
else -> {
val inner = (2.0 / 9.0) * (xp - 54215.0 / 72.0)
(325.0 / 18.0 + Math.sqrt(inner)).toInt()
(325.0 / 18.0 + sqrt(inner)).toInt()
}
}
}