From e1bf1cfafff277c9ba318a9622be5220c913c9da Mon Sep 17 00:00:00 2001 From: Auxilor Date: Sun, 20 Mar 2022 12:20:19 +0000 Subject: [PATCH] Added permission multipliers for some more rigging potential --- .../ecocrates/crate/PermissionMultiplier.kt | 23 +++++++ .../ecocrates/crate/PermissionMultipliers.kt | 62 +++++++++++++++++++ .../com/willfp/ecocrates/reward/Reward.kt | 21 +++++-- .../core-plugin/src/main/resources/config.yml | 12 ++++ .../src/main/resources/rewards.yml | 3 + 5 files changed, 116 insertions(+), 5 deletions(-) create mode 100644 eco-core/core-plugin/src/main/kotlin/com/willfp/ecocrates/crate/PermissionMultiplier.kt create mode 100644 eco-core/core-plugin/src/main/kotlin/com/willfp/ecocrates/crate/PermissionMultipliers.kt diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecocrates/crate/PermissionMultiplier.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecocrates/crate/PermissionMultiplier.kt new file mode 100644 index 0000000..2a92d04 --- /dev/null +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecocrates/crate/PermissionMultiplier.kt @@ -0,0 +1,23 @@ +package com.willfp.ecocrates.crate + +import org.bukkit.Bukkit +import org.bukkit.permissions.Permission +import org.bukkit.permissions.PermissionDefault + +data class PermissionMultiplier( + val permission: String, + val multiplier: Double, + val priority: Int +) { + init { + if (Bukkit.getPluginManager().getPermission(permission) == null) { + Bukkit.getPluginManager().addPermission( + Permission( + permission, + "Gives a ${multiplier}x multiplier in crate rewards", + PermissionDefault.FALSE + ) + ) + } + } +} diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecocrates/crate/PermissionMultipliers.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecocrates/crate/PermissionMultipliers.kt new file mode 100644 index 0000000..7c76feb --- /dev/null +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecocrates/crate/PermissionMultipliers.kt @@ -0,0 +1,62 @@ +package com.willfp.ecocrates.crate + +import com.willfp.eco.core.config.updating.ConfigUpdater +import com.willfp.ecocrates.EcoCratesPlugin +import com.willfp.ecocrates.crate.placed.PlacedCrates +import org.bukkit.entity.Player + +@Suppress("UNUSED") +object PermissionMultipliers { + private val REGISTRY = mutableListOf() + private val NO_MULTIPLIER = PermissionMultiplier("none", 1.0, 0) + + /** + * Get the permission multiplier for a given player. + * + * @param player The player. + * @return The multiplier. + */ + @JvmStatic + fun getForPlayer(player: Player): PermissionMultiplier { + var current = NO_MULTIPLIER + + for (multiplier in REGISTRY) { + if (multiplier.priority < current.priority) { + continue + } + + if (!player.hasPermission(multiplier.permission)) { + continue + } + + current = multiplier + } + + return current + } + + /** + * List of all registered crates. + * + * @return The crates. + */ + @JvmStatic + fun values(): List { + return REGISTRY.toList() + } + + @ConfigUpdater + @JvmStatic + fun update(plugin: EcoCratesPlugin) { + REGISTRY.clear() + + for (config in plugin.configYml.getSubsections("permission-multipliers")) { + val multiplier = PermissionMultiplier( + config.getString("permission"), + config.getDouble("multiplier"), + config.getInt("priority") + ) + REGISTRY.add(multiplier) + } + } +} diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecocrates/reward/Reward.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecocrates/reward/Reward.kt index 1206a6a..346e4cf 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecocrates/reward/Reward.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecocrates/reward/Reward.kt @@ -14,11 +14,12 @@ import com.willfp.eco.core.recipe.parts.EmptyTestableItem import com.willfp.eco.util.formatEco import com.willfp.eco.util.toNiceString import com.willfp.ecocrates.crate.Crate +import com.willfp.ecocrates.crate.PermissionMultipliers import org.bukkit.Bukkit import org.bukkit.OfflinePlayer import org.bukkit.entity.Player import org.bukkit.inventory.ItemStack -import java.util.* +import java.util.Objects class Reward( private val plugin: EcoPlugin, @@ -43,6 +44,8 @@ class Reward( if (maxWins > 0) player() } + private val canPermissionMultiply = config.getBool("weight.permission-multipliers") + private val baseDisplay = ItemStackBuilder(Items.lookup(config.getString("display.item"))) .setDisplayName(config.getString("display.name")) .build() @@ -51,9 +54,13 @@ class Reward( val item = baseDisplay.clone() val fis = FastItemStack.wrap(item) fis.lore = config.getStrings("display.lore").map { - it.replace("%chance%", getPercentageChance(player, crate.rewards, displayWeight = true).toNiceString()) - .replace("%actual_chance%", getPercentageChance(player, crate.rewards, displayWeight = false).toNiceString()) - .formatEco(player) + it.replace( + "%chance%", + getPercentageChance(player, crate.rewards, displayWeight = true).toNiceString() + ).replace( + "%actual_chance%", + getPercentageChance(player, crate.rewards, displayWeight = false).toNiceString() + ).formatEco(player) } return item } @@ -86,7 +93,11 @@ class Reward( val others = among.toMutableList() others.remove(this) - val weight = if (displayWeight) this.getDisplayWeight(player) else this.getWeight(player) + var weight = (if (displayWeight) this.getDisplayWeight(player) else this.getWeight(player)) + + if (canPermissionMultiply) { + weight *= PermissionMultipliers.getForPlayer(player).multiplier + } var totalWeight = weight for (other in others) { diff --git a/eco-core/core-plugin/src/main/resources/config.yml b/eco-core/core-plugin/src/main/resources/config.yml index 505f0d2..3db1099 100644 --- a/eco-core/core-plugin/src/main/resources/config.yml +++ b/eco-core/core-plugin/src/main/resources/config.yml @@ -5,6 +5,18 @@ no-key-velocity: 1.5 # The speed at which a player should be launched away from a crate if they try to open it without a key. Set to 0 to disable. +# If a reward allows permission multipliers, the weights +# will be multiplied by highest-priority multiplier that a player +# has permission for - i.e. if a player has both vip and mvp permissions, +# than they'll have the mvp one applied as it has a higher priority. +permission-multipliers: + - permission: ecocrates.mutliplier.vip + multiplier: 1.5 + priority: 1 + - permission: ecocrates.mutliplier.mvp + multiplier: 2 + priority: 2 + reroll: rows: 3 mask: diff --git a/eco-core/core-plugin/src/main/resources/rewards.yml b/eco-core/core-plugin/src/main/resources/rewards.yml index 187c630..f0e8c0a 100644 --- a/eco-core/core-plugin/src/main/resources/rewards.yml +++ b/eco-core/core-plugin/src/main/resources/rewards.yml @@ -6,6 +6,7 @@ rewards: messages: - 'amogus?' weight: + permission-multipliers: true actual: 1 display: 25 max-wins: -1 @@ -25,6 +26,7 @@ rewards: messages: - 'amogus?!!' weight: + permission-multipliers: false actual: 1 display: 50 max-wins: -1 @@ -44,6 +46,7 @@ rewards: messages: - 'amogus?!!' weight: + permission-multipliers: false actual: 98 display: 0 max-wins: -1