9
0
mirror of https://github.com/Auxilor/Reforges.git synced 2025-12-21 16:09:20 +00:00

Compare commits

..

26 Commits

Author SHA1 Message Date
Auxilor
4f489cc018 libreforge-updater 2022-11-26 19:20:12 +00:00
Auxilor
a96d08d4be libreforge-updater 2022-11-24 14:30:01 +00:00
Auxilor
fdd95f005f libreforge-updater 2022-11-23 17:24:59 +00:00
Auxilor
aec6639725 libreforge-updater 2022-11-21 16:02:42 +00:00
Auxilor
b3f98e2b6e libreforge-updater 2022-11-17 08:38:19 +00:00
Auxilor
8b2c96dc53 libreforge-updater 2022-11-12 17:34:16 +00:00
Auxilor
192bb138ff Final touches to GUI 2022-11-09 15:23:57 +00:00
Auxilor
1dc15fcb53 Updated to ecomponent 1.3.0 2022-11-09 15:07:18 +00:00
Auxilor
94394ecaec Updated to ecomponent 1.2.0 2022-11-09 14:37:47 +00:00
Auxilor
0cf2d4c810 Fix 2022-11-09 12:56:15 +00:00
Auxilor
dfed5b996a Cleaned up default configs 2022-11-09 12:46:23 +00:00
Auxilor
5adf8832a8 Oops 2022-11-09 11:46:01 +00:00
Auxilor
4335833b7b Cleanup 2022-11-09 11:35:37 +00:00
Auxilor
1d1a84991e Improvements to config 2022-11-09 11:20:07 +00:00
Auxilor
a2752daa07 Added %price% support to reforge stone 2022-11-08 17:33:25 +00:00
Auxilor
fb5926453c Cleanup 2022-11-08 17:31:34 +00:00
Auxilor
252e9472de Updated to 5.70.0 2022-11-08 17:30:54 +00:00
Auxilor
ebde54cb87 Added price support to reforges, added ecomponent 2022-11-08 17:30:47 +00:00
Auxilor
98aff77ab3 libreforge-updater 2022-11-06 19:52:00 +00:00
Auxilor
3ddf466f2d libreforge-updater 2022-11-01 16:23:07 +00:00
Auxilor
ca41b54daa libreforge-updater 2022-10-28 11:34:59 +01:00
Auxilor
ff9e16a25f libreforge-updater 2022-10-26 22:10:30 +01:00
Auxilor
c0d94f6150 Fix 2022-10-24 17:09:11 +01:00
Auxilor
4b3bf30a9b Fix 2022-10-24 17:08:49 +01:00
Auxilor
4c1ee554b4 libreforge-updater 2022-10-24 17:05:03 +01:00
Auxilor
695d90c793 Fixed reforge stone bug 2022-10-24 12:54:51 +01:00
31 changed files with 372 additions and 569 deletions

View File

@@ -40,12 +40,14 @@ allprojects {
shadowJar { shadowJar {
relocate('com.willfp.libreforge', 'com.willfp.reforges.libreforge') relocate('com.willfp.libreforge', 'com.willfp.reforges.libreforge')
relocate('com.willfp.ecomponent', 'com.willfp.reforges.ecomponent')
relocate('org.joml', 'com.willfp.reforges.libreforge.joml') relocate('org.joml', 'com.willfp.reforges.libreforge.joml')
} }
dependencies { dependencies {
compileOnly 'com.willfp:eco:6.43.0' compileOnly 'com.willfp:eco:6.46.0'
implementation 'com.willfp:libreforge:3.114.1' implementation 'com.willfp:libreforge:3.123.0'
implementation 'com.willfp:ecomponent:1.3.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'
@@ -60,7 +62,7 @@ allprojects {
} }
processResources { processResources {
filesNotMatching(["**/*.png", "**/models/**", "**/textures/**", "**/reforges/**", "**lang.yml"]) { filesMatching(["**plugin.yml"]) {
expand projectVersion: project.version expand projectVersion: project.version
} }
} }

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,14 +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>
<!-- Effects don't need javadoc. -->
<suppress files="[\\/]reforges[\\/]reforges[\\/]" checks="MissingJavadocMethod"/>
<suppress files="[\\/]reforges[\\/]reforges[\\/]" checks="JavadocVariable"/>
<!-- Fields don't need javadoc -->
<suppress files="Reforges.java" checks="JavadocVariable"/>
</suppressions>

View File

@@ -8,6 +8,7 @@ import com.willfp.eco.core.fast.FastItemStack
import com.willfp.eco.core.fast.fast import com.willfp.eco.core.fast.fast
import com.willfp.eco.util.SkullUtils import com.willfp.eco.util.SkullUtils
import com.willfp.eco.util.StringUtils import com.willfp.eco.util.StringUtils
import com.willfp.eco.util.formatEco
import com.willfp.eco.util.toJSON import com.willfp.eco.util.toJSON
import com.willfp.reforges.ReforgesPlugin import com.willfp.reforges.ReforgesPlugin
import com.willfp.reforges.reforges.ReforgeTargets import com.willfp.reforges.reforges.ReforgeTargets
@@ -68,17 +69,17 @@ class ReforgesDisplay(private val plugin: ReforgesPlugin) : DisplayModule(plugin
val stoneTexture = SkullUtils.getSkullTexture(stoneMeta) val stoneTexture = SkullUtils.getSkullTexture(stoneMeta)
if (stoneTexture != null) { if (stoneTexture != null) {
try {
SkullUtils.setSkullTexture(meta as SkullMeta, stoneTexture) SkullUtils.setSkullTexture(meta as SkullMeta, stoneTexture)
} catch (e: StringIndexOutOfBoundsException) {
// Do nothing
}
} }
} }
itemStack.itemMeta = meta itemStack.itemMeta = meta
val stoneLore = stone.config.getFormattedStrings("stone.lore").map {
"${Display.PREFIX}$it" val stoneLore = stone.config.getStrings("stone.lore")
}.toList() .map { it.replace("%price%", if (player == null) "" else stone.stonePrice?.getDisplay(player) ?: "") }
.formatEco(player)
.map { "${Display.PREFIX}$it" }
lore.addAll(0, stoneLore) lore.addAll(0, stoneLore)
} }

View File

@@ -1,5 +0,0 @@
package com.willfp.reforges.gui
import com.willfp.reforges.util.ReforgeStatus
data class PricedReforgeStatus(val status: ReforgeStatus, val cost: Double)

View File

@@ -1,21 +1,30 @@
package com.willfp.reforges.gui package com.willfp.reforges.gui
import com.willfp.eco.core.EcoPlugin import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.config.emptyConfig
import com.willfp.eco.core.config.updating.ConfigUpdater import com.willfp.eco.core.config.updating.ConfigUpdater
import com.willfp.eco.core.drops.DropQueue import com.willfp.eco.core.drops.DropQueue
import com.willfp.eco.core.fast.fast
import com.willfp.eco.core.gui.captiveSlot import com.willfp.eco.core.gui.captiveSlot
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.menu.MenuEvent
import com.willfp.eco.core.gui.menu.events.CaptiveItemChangeEvent
import com.willfp.eco.core.gui.onEvent
import com.willfp.eco.core.gui.slot import com.willfp.eco.core.gui.slot
import com.willfp.eco.core.gui.slot.CustomSlot
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.integrations.economy.EconomyManager
import com.willfp.eco.core.items.Items 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.items.builder.modify
import com.willfp.eco.core.items.isEmpty import com.willfp.eco.core.items.isEmpty
import com.willfp.eco.util.NumberUtils import com.willfp.eco.core.price.ConfiguredPrice
import com.willfp.eco.core.sound.PlayableSound
import com.willfp.ecomponent.CaptiveItem
import com.willfp.ecomponent.menuStateVar
import com.willfp.ecomponent.setSlot
import com.willfp.reforges.reforges.PriceMultipliers import com.willfp.reforges.reforges.PriceMultipliers
import com.willfp.reforges.reforges.PriceMultipliers.reforgePriceMultiplier
import com.willfp.reforges.reforges.Reforge import com.willfp.reforges.reforges.Reforge
import com.willfp.reforges.reforges.ReforgeTarget import com.willfp.reforges.reforges.ReforgeTarget
import com.willfp.reforges.reforges.ReforgeTargets import com.willfp.reforges.reforges.ReforgeTargets
@@ -24,94 +33,81 @@ import com.willfp.reforges.util.getRandomReforge
import com.willfp.reforges.util.reforge import com.willfp.reforges.util.reforge
import com.willfp.reforges.util.reforgeStone import com.willfp.reforges.util.reforgeStone
import com.willfp.reforges.util.timesReforged import com.willfp.reforges.util.timesReforged
import org.bukkit.Material
import org.bukkit.Sound import org.bukkit.Sound
import org.bukkit.entity.Player import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack
import java.util.Locale import java.util.Locale
import kotlin.math.pow import kotlin.math.pow
@Suppress("DEPRECATION")
object ReforgeGUI {
private lateinit var menu: Menu
private fun Menu.getItemToReforge(player: Player) = this.getState<ItemStack>( private data class ReforgeGUIStatus(
player, val status: ReforgeStatus,
"item_to_reforge" val price: ConfiguredPrice,
val isStonePrice: Boolean
) )
private fun Menu.getReforgeStone(player: Player) = this.getState<ItemStack>( private class ReforgePriceChangeEvent : MenuEvent
player,
"reforge_stone"
)
private fun Menu.getReforgeStatus(player: Player): PricedReforgeStatus = private val Menu.reforgeStatus by menuStateVar(
this.getState<PricedReforgeStatus>(player, "reforge_status") ?: PricedReforgeStatus( ReforgeGUIStatus(
ReforgeStatus.NO_ITEM, ReforgeStatus.NO_ITEM,
0.0 ConfiguredPrice.createOrFree(emptyConfig()),
false
)
) )
@JvmStatic private class IndicatorSlot(
fun open(player: Player) { plugin: EcoPlugin
menu.open(player) ) : CustomSlot() {
private val slot = slot { player, menu ->
val status = menu.reforgeStatus[player].status
if (status == ReforgeStatus.ALLOW || status == ReforgeStatus.ALLOW_STONE) {
Items.lookup(plugin.configYml.getString("gui.show-allowed.allow-material")).item
} else {
Items.lookup(plugin.configYml.getString("gui.show-allowed.deny-material")).item
}
} }
@JvmStatic init {
@ConfigUpdater init(slot)
fun update(plugin: EcoPlugin) {
val activatorSlot = slot(ItemStack(Material.ANVIL)) {
setUpdater { player, menu, _ ->
val (status, specialCost) = menu.getReforgeStatus(player)
val cost = when {
status == ReforgeStatus.ALLOW || (status == ReforgeStatus.ALLOW_STONE && specialCost < 0) -> {
val amountOfReforges = menu.getItemToReforge(player)?.timesReforged ?: 0
plugin.configYml.getDouble("reforge.cost") *
plugin.configYml.getDouble("reforge.cost-exponent").pow(amountOfReforges) *
PriceMultipliers.getForPlayer(player).multiplier
} }
status == ReforgeStatus.ALLOW_STONE -> {
specialCost
}
else -> 0.0 // Never used, but at least kotlin can shut up
} }
var xpCost = plugin.configYml.getInt("reforge.xp-cost") private class ActivatorSlot(
if (status == ReforgeStatus.ALLOW) { plugin: EcoPlugin,
val item = menu.getItemToReforge(player) itemToReforge: CaptiveItem,
val reforges = item?.timesReforged ?: 0 reforgeStone: CaptiveItem
xpCost *= PriceMultipliers.getForPlayer(player).multiplier.toInt() ) : CustomSlot() {
xpCost *= plugin.configYml.getDouble("reforge.cost-exponent").pow(reforges.toDouble()).toInt() private val slot = slot({ player, menu ->
} val (status, price) = menu.reforgeStatus[player]
val configKey = status.configKey val configKey = status.configKey
Items.lookup(plugin.configYml.getString("gui.$configKey.material")).item.apply { Items.lookup(plugin.configYml.getString("gui.$configKey.material")).modify {
this.fast().displayName = plugin.configYml.getFormattedString("gui.$configKey.name") setDisplayName(plugin.configYml.getString("gui.$configKey.name"))
this.fast().lore = plugin.configYml.getFormattedStrings("gui.$configKey.lore").map { addLoreLines(plugin.configYml.getStrings("gui.$configKey.lore").map {
it.replace("%cost%", NumberUtils.format(cost)) it.replace("%price%", price.getDisplay(player))
.replace("%xpcost%", NumberUtils.format(xpCost.toDouble()))
.replace( .replace(
"%stone%", "%stone%",
menu.getReforgeStone(player)?.reforgeStone?.name ?: "" reforgeStone[player]?.reforgeStone?.name ?: ""
) )
// Legacy
.replace("%cost%", price.getDisplay(player))
.replace("%xpcost%", price.getDisplay(player))
})
} }
} }) {
}
onLeftClick { event, _, menu -> onLeftClick { event, _, menu ->
val player = event.whoClicked as Player val player = event.whoClicked as Player
val item = menu.getItemToReforge(player) ?: return@onLeftClick val item = itemToReforge[player] ?: return@onLeftClick
val currentReforge = item.reforge val currentReforge = item.reforge
val targets = ReforgeTargets.getForItem(item) val targets = ReforgeTargets.getForItem(item)
var usedStone = false var usedStone = false
val stoneInMenu = menu.getReforgeStone(player)?.reforgeStone val stoneInMenu = reforgeStone[player]?.reforgeStone
val reforge = if (stoneInMenu != null && stoneInMenu.canBeAppliedTo(item)) { val reforge = if (stoneInMenu != null && stoneInMenu.canBeAppliedTo(item)) {
usedStone = true usedStone = true
@@ -129,55 +125,22 @@ object ReforgeGUI {
return@onLeftClick return@onLeftClick
} }
var cost = 0.0 val price = menu.reforgeStatus[player].price
val reforges = item.timesReforged if (!price.canAfford(player)) {
player.sendMessage(
if (EconomyManager.hasRegistrations()) { plugin.langYml.getMessage("cannot-afford-price").replace("%price%", price.getDisplay(player))
cost = plugin.configYml.getDouble("reforge.cost")
cost *= plugin.configYml.getDouble("reforge.cost-exponent").pow(reforges.toDouble())
if (reforge.requiresStone && reforge.stonePrice != -1) {
cost = reforge.stonePrice.toDouble()
}
cost *= PriceMultipliers.getForPlayer(player).multiplier
if (!EconomyManager.hasAmount(player, cost)) {
player.sendMessage(plugin.langYml.getMessage("insufficient-money"))
if (plugin.configYml.getBool("gui.insufficient-money-sound.enabled")) {
player.playSound(
player.location,
Sound.valueOf(
plugin.configYml.getString("gui.insufficient-money-sound.id")
.uppercase(Locale.getDefault())
),
1f, plugin.configYml.getDouble("gui.insufficient-money-sound.pitch").toFloat()
) )
if (plugin.configYml.getBool("gui.cannot-afford-sound.enabled")) {
PlayableSound.create(
plugin.configYml.getSubsection("gui.cannot-afford-sound")
)?.playTo(player)
} }
return@onLeftClick return@onLeftClick
} }
}
var xpCost = plugin.configYml.getInt("reforge.xp-cost") price.pay(player)
xpCost *= plugin.configYml.getDouble("reforge.cost-exponent").pow(reforges.toDouble()).toInt()
xpCost *= PriceMultipliers.getForPlayer(player).multiplier.toInt()
if (player.level < xpCost) {
player.sendMessage(plugin.langYml.getMessage("insufficient-xp"))
if (plugin.configYml.getBool("gui.insufficient-money-sound.enabled")) {
player.playSound(
player.location,
Sound.valueOf(
plugin.configYml.getString("gui.insufficient-money-sound.id")
.uppercase(Locale.getDefault())
),
1f, plugin.configYml.getDouble("gui.insufficient-money-sound.pitch").toFloat()
)
}
return@onLeftClick
}
if (EconomyManager.hasRegistrations()) {
EconomyManager.removeMoney(player, cost)
}
player.level = player.level - xpCost
player.sendMessage(plugin.langYml.getMessage("applied-reforge").replace("%reforge%", reforge.name)) player.sendMessage(plugin.langYml.getMessage("applied-reforge").replace("%reforge%", reforge.name))
@@ -185,7 +148,7 @@ object ReforgeGUI {
item.reforge = reforge item.reforge = reforge
if (usedStone) { if (usedStone) {
val stone = menu.getReforgeStone(player) val stone = reforgeStone[player]
stone?.itemMeta = null stone?.itemMeta = null
stone?.amount = 0 stone?.amount = 0
if (plugin.configYml.getBool("gui.stone-sound.enabled")) { if (plugin.configYml.getBool("gui.stone-sound.enabled")) {
@@ -206,9 +169,38 @@ object ReforgeGUI {
1f, plugin.configYml.getDouble("gui.sound.pitch").toFloat() 1f, plugin.configYml.getDouble("gui.sound.pitch").toFloat()
) )
} }
menu.callEvent(player, ReforgePriceChangeEvent())
} }
} }
init {
init(slot)
}
}
@Suppress("DEPRECATION")
object ReforgeGUI {
private lateinit var menu: Menu
private lateinit var itemToReforge: CaptiveItem
private lateinit var reforgeStone: CaptiveItem
private lateinit var defaultPrice: ConfiguredPrice
@JvmStatic
fun open(player: Player) {
menu.open(player)
}
@JvmStatic
@ConfigUpdater
fun update(plugin: EcoPlugin) {
itemToReforge = CaptiveItem()
reforgeStone = CaptiveItem()
defaultPrice = ConfiguredPrice.createOrFree(plugin.configYml.getSubsection("reforge.price"))
val maskPattern = plugin.configYml.getStrings("gui.mask.pattern").toTypedArray() val maskPattern = plugin.configYml.getStrings("gui.mask.pattern").toTypedArray()
val maskItems = plugin.configYml.getStrings("gui.mask.materials") val maskItems = plugin.configYml.getStrings("gui.mask.materials")
@@ -218,30 +210,15 @@ object ReforgeGUI {
menu = menu(plugin.configYml.getInt("gui.rows")) { menu = menu(plugin.configYml.getInt("gui.rows")) {
title = plugin.langYml.getFormattedString("menu.title") title = plugin.langYml.getFormattedString("menu.title")
setMask(FillerMask(MaskItems(*maskItems), *maskPattern)) setMask(FillerMask(MaskItems(*maskItems), *maskPattern))
allowChangingHeldItem() allowChangingHeldItem()
val slot = slot(
ItemStackBuilder(Material.BLACK_STAINED_GLASS_PANE)
.setDisplayName("&r")
.build()
) {
setUpdater { player, menu, _ ->
val status = menu.getReforgeStatus(player).status
if (status == ReforgeStatus.ALLOW || status == ReforgeStatus.ALLOW_STONE) {
Items.lookup(plugin.configYml.getString("gui.show-allowed.allow-material")).item
} else {
Items.lookup(plugin.configYml.getString("gui.show-allowed.deny-material")).item
}
}
}
val allowedPattern = plugin.configYml.getStrings("gui.show-allowed.pattern") val allowedPattern = plugin.configYml.getStrings("gui.show-allowed.pattern")
for (i in 1..allowedPattern.size) { for (i in 1..allowedPattern.size) {
val row = allowedPattern[i - 1] val row = allowedPattern[i - 1]
for (j in 1..9) { for (j in 1..9) {
if (row[j - 1] != '0') { if (row[j - 1] != '0') {
setSlot(i, j, slot) setSlot(i, j, IndicatorSlot(plugin))
} }
} }
} }
@@ -249,19 +226,21 @@ object ReforgeGUI {
setSlot( setSlot(
plugin.configYml.getInt("gui.item-slot.row"), plugin.configYml.getInt("gui.item-slot.row"),
plugin.configYml.getInt("gui.item-slot.column"), plugin.configYml.getInt("gui.item-slot.column"),
captiveSlot() captiveSlot(),
bindCaptive = itemToReforge
) )
setSlot( setSlot(
plugin.configYml.getInt("gui.stone-slot.row"), plugin.configYml.getInt("gui.stone-slot.row"),
plugin.configYml.getInt("gui.stone-slot.column"), plugin.configYml.getInt("gui.stone-slot.column"),
captiveSlot() captiveSlot(),
bindCaptive = reforgeStone
) )
setSlot( setSlot(
plugin.configYml.getInt("gui.activator-slot.row"), plugin.configYml.getInt("gui.activator-slot.row"),
plugin.configYml.getInt("gui.activator-slot.column"), plugin.configYml.getInt("gui.activator-slot.column"),
activatorSlot ActivatorSlot(plugin, itemToReforge, reforgeStone)
) )
setSlot( setSlot(
@@ -276,48 +255,58 @@ object ReforgeGUI {
} }
) )
onRender { player, menu -> onEvent<ReforgePriceChangeEvent> { player, menu, _ ->
menu.addState( val status = menu.reforgeStatus[player]
player, "item_to_reforge", menu.getCaptiveItem(
player,
plugin.configYml.getInt("gui.item-slot.row"),
plugin.configYml.getInt("gui.item-slot.column")
)
)
menu.addState( val item = itemToReforge[player]
player, "reforge_stone", menu.getCaptiveItem(
player,
plugin.configYml.getInt("gui.stone-slot.row"),
plugin.configYml.getInt("gui.stone-slot.column")
)
)
val item = menu.getItemToReforge(player) val reforges = item?.timesReforged ?: 0
val stone = menu.getReforgeStone(player) var multiplier = if (status.isStonePrice) 1.0 else {
plugin.configYml.getDouble("reforge.cost-exponent")
.pow(reforges.toDouble())
}
multiplier *= player.reforgePriceMultiplier
status.price.setMultiplier(player, multiplier)
}
onEvent<CaptiveItemChangeEvent> { player, menu, _ ->
val item = itemToReforge[player]
val stone = reforgeStone[player]
val targets = mutableListOf<ReforgeTarget>() val targets = mutableListOf<ReforgeTarget>()
var cost = 0.0 var price = defaultPrice
var isStonePrice = false
val status = if (item.isEmpty) { val status = if (item.isEmpty) {
ReforgeStatus.NO_ITEM ReforgeStatus.NO_ITEM
} else { } else {
targets.addAll(ReforgeTargets.getForItem(item!!)) targets.addAll(ReforgeTargets.getForItem(item))
if (targets.isEmpty()) { if (targets.isEmpty()) {
ReforgeStatus.INVALID_ITEM ReforgeStatus.INVALID_ITEM
} else { } else {
val reforgeStone = stone.reforgeStone val reforgeStone = stone.reforgeStone
if (reforgeStone != null && reforgeStone.canBeAppliedTo(item)) { if (reforgeStone == null) {
cost = reforgeStone.stonePrice.toDouble() ReforgeStatus.ALLOW
} else {
if (reforgeStone.canBeAppliedTo(item)) {
price = reforgeStone.stonePrice ?: defaultPrice
isStonePrice = true
ReforgeStatus.ALLOW_STONE ReforgeStatus.ALLOW_STONE
} else { } else {
ReforgeStatus.ALLOW ReforgeStatus.INVALID_ITEM
}
} }
} }
} }
menu.addState(player, "reforge_status", PricedReforgeStatus(status, cost)) menu.reforgeStatus[player] = ReforgeGUIStatus(status, price, isStonePrice)
menu.callEvent(player, ReforgePriceChangeEvent())
} }
onClose { event, menu -> onClose { event, menu ->

View File

@@ -34,6 +34,10 @@ object PriceMultipliers {
return current return current
} }
/** The price multiplier from permissions. */
val Player.reforgePriceMultiplier: Double
get() = getForPlayer(this).multiplier
/** /**
* List of all registered multipliers. * List of all registered multipliers.
* *

View File

@@ -1,10 +1,12 @@
package com.willfp.reforges.reforges package com.willfp.reforges.reforges
import com.willfp.eco.core.config.config
import com.willfp.eco.core.config.interfaces.Config import com.willfp.eco.core.config.interfaces.Config
import com.willfp.eco.core.display.Display import com.willfp.eco.core.display.Display
import com.willfp.eco.core.items.CustomItem import com.willfp.eco.core.items.CustomItem
import com.willfp.eco.core.items.Items 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.price.ConfiguredPrice
import com.willfp.eco.core.recipe.Recipes import com.willfp.eco.core.recipe.Recipes
import com.willfp.eco.util.StringUtils import com.willfp.eco.util.StringUtils
import com.willfp.libreforge.Holder import com.willfp.libreforge.Holder
@@ -14,7 +16,7 @@ import com.willfp.reforges.ReforgesPlugin
import com.willfp.reforges.util.reforgeStone import com.willfp.reforges.util.reforgeStone
import net.kyori.adventure.text.format.TextDecoration import net.kyori.adventure.text.format.TextDecoration
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
import java.util.* import java.util.Objects
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
class Reforge( class Reforge(
@@ -30,13 +32,15 @@ class Reforge(
val targets = config.getStrings("targets").mapNotNull { ReforgeTargets.getByName(it) }.toSet() val targets = config.getStrings("targets").mapNotNull { ReforgeTargets.getByName(it) }.toSet()
override val effects = config.getSubsections("effects").mapNotNull { override val effects = Effects.compile(
Effects.compile(it, "Reforge ID $id") config.getSubsections("effects"),
}.toSet() "Reforge $id"
)
override val conditions = config.getSubsections("conditions").mapNotNull { override val conditions = Conditions.compile(
Conditions.compile(it, "Reforge ID $id") config.getSubsections("conditions"),
}.toSet() "Reforge $id"
)
val requiresStone = config.getBool("stone.enabled") val requiresStone = config.getBool("stone.enabled")
@@ -48,7 +52,21 @@ class Reforge(
} }
}.build() }.build()
val stonePrice = config.getIntOrNull("stone.price") ?: -1 val stonePrice = if (config.has("stone.price")) {
when {
// Legacy support
config.getDouble("stone.price") > 0 -> {
ConfiguredPrice.createOrFree(
config {
"value" to config.getDouble("stone.price")
"type" to "coins"
"display" to "%value%"
}
)
}
else -> ConfiguredPrice.createOrFree(config.getSubsection("stone.price"))
}
} else null
init { init {
Reforges.addNewReforge(this) Reforges.addNewReforge(this)

View File

@@ -33,7 +33,11 @@ object ReforgeTargets {
* @return The target. * @return The target.
*/ */
@JvmStatic @JvmStatic
fun getForItem(item: ItemStack): List<ReforgeTarget> { fun getForItem(item: ItemStack?): List<ReforgeTarget> {
if (item == null) {
return emptyList()
}
return registered.values return registered.values
.filter { !it.id.equals("all", ignoreCase = true) } .filter { !it.id.equals("all", ignoreCase = true) }
.filter { it.matches(item) } .filter { it.matches(item) }

View File

@@ -3,7 +3,7 @@ package com.willfp.reforges.reforges
import com.google.common.collect.HashBiMap import com.google.common.collect.HashBiMap
import com.google.common.collect.ImmutableSet import com.google.common.collect.ImmutableSet
import com.willfp.eco.core.config.ConfigType import com.willfp.eco.core.config.ConfigType
import com.willfp.eco.core.config.TransientConfig import com.willfp.eco.core.config.readConfig
import com.willfp.eco.core.config.updating.ConfigUpdater import com.willfp.eco.core.config.updating.ConfigUpdater
import com.willfp.libreforge.chains.EffectChains import com.willfp.libreforge.chains.EffectChains
import com.willfp.reforges.ReforgesPlugin import com.willfp.reforges.ReforgesPlugin
@@ -54,7 +54,7 @@ object Reforges {
@ConfigUpdater @ConfigUpdater
@JvmStatic @JvmStatic
fun update(plugin: ReforgesPlugin) { fun update(plugin: ReforgesPlugin) {
val reforgesYml = TransientConfig(File(plugin.dataFolder, "reforges.yml"), ConfigType.YAML) val reforgesYml = File(plugin.dataFolder, "reforges.yml").readConfig(ConfigType.YAML)
for (config in reforgesYml.getSubsections("chains")) { for (config in reforgesYml.getSubsections("chains")) {
EffectChains.compile(config, "Chains") EffectChains.compile(config, "Chains")

View File

@@ -74,10 +74,6 @@ gui:
row: 6 row: 6
column: 5 column: 5
# Placeholders:
# %cost% - The economy cost
# %xp% - The levels required
allow: allow:
material: anvil material: anvil
name: "&aReforge Item" name: "&aReforge Item"
@@ -86,8 +82,8 @@ gui:
- '&7it a random item modifier that' - '&7it a random item modifier that'
- '&7boosts its stats.' - '&7boosts its stats.'
- '' - ''
- '&7Cost' - '&7Price:'
- '&6\$%cost%' - '%price%'
- '' - ''
- '&eClick to reforge!' - '&eClick to reforge!'
allow-stone: allow-stone:
@@ -99,8 +95,8 @@ gui:
- '&7the %stone%&7 reforge to' - '&7the %stone%&7 reforge to'
- '&7boost its stats.' - '&7boost its stats.'
- '' - ''
- '&7Cost' - '&7Price:'
- '&6\$%cost%' - '%price%'
- '' - ''
- '&eClick to reforge!' - '&eClick to reforge!'
no-item: no-item:
@@ -138,9 +134,11 @@ gui:
pitch: 0.8 pitch: 0.8
reforge: reforge:
cost: 7500 # See here: https://plugins.auxilor.io/all-plugins/prices
xp-cost: 0 # In levels price:
use-player-points: false value: 7500
type: coins
display: "&6$%value%"
cost-exponent: 1.15 # (Reforges done ^ cost exponent) * cost cost-exponent: 1.15 # (Reforges done ^ cost exponent) * cost
@@ -179,6 +177,13 @@ 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"

View File

@@ -3,20 +3,11 @@ messages:
no-permission: "&cYou don't have permission to do this!" no-permission: "&cYou don't have permission to do this!"
not-player: "&cThis command must be run by a player" not-player: "&cThis command must be run by a player"
invalid-command: "&cUnknown subcommand!" invalid-command: "&cUnknown subcommand!"
reloaded: "Reloaded! (Restart if you're removed reforges!) Took %time%ms" reloaded: "Reloaded!"
insufficient-money: "&cYou don't have enough money for this!"
insufficient-xp: "&cYou don't have enough xp levels for this!"
applied-reforge: "Applied %reforge%&r reforge!"
needs-player: "&cYou must specify a player"
invalid-player: "&cInvalid player!"
needs-stone: "&cYou must specify a reforge stone"
invalid-stone: "&cInvalid reforge!"
give-success: "Gave &a%reforge%&r reforge stone to &a%recipient%"
on-cooldown: "&cThis reforge is on cooldown! &fTime left: &a%seconds% seconds"
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%"
invalid-reforge: "&cInvalid reforge!" cannot-afford-price: "&cYou can't afford to do this! &fPrice: %price%"
needs-reforge: "&cYou must specify a reforge" 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" 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-error: "&cError importing config: &f%message%"
@@ -26,6 +17,15 @@ messages:
lrcdb-export-error: "&cError exporting config: &f%message%" 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%" lrcdb-export-success: "&fExported &a%name%&f! View it on &alrcdb.auxilor.io&f, or share your config ID: &f%id%"
applied-reforge: "Applied %reforge%&r reforge!"
needs-player: "&cYou must specify a player"
invalid-player: "&cInvalid player!"
needs-stone: "&cYou must specify a reforge stone"
invalid-stone: "&cInvalid reforge!"
give-success: "Gave &a%reforge%&r reforge stone to &a%recipient%"
invalid-reforge: "&cInvalid reforge!"
needs-reforge: "&cYou must specify a reforge"
menu: menu:
title: "Reforge Item" title: "Reforge Item"
close: "&cClose" close: "&cClose"

View File

@@ -16,4 +16,4 @@ share-configs:
enabled: true enabled: true
# If you disable share-configs, you can still share select configs publicly # If you disable share-configs, you can still share select configs publicly
# with /ecoenchants export <config>. # with /reforges export <config>.

View File

@@ -21,7 +21,12 @@ stone:
- "<gradient:#AAFFA9>Dynamic</gradient:#11FFBD>&7 reforge!" - "<gradient:#AAFFA9>Dynamic</gradient:#11FFBD>&7 reforge!"
item: player_head texture:eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMmM0YTY1YzY4OWIyZDM2NDA5MTAwYTYwYzJhYjhkM2QwYTY3Y2U5NGVlYTNjMWY3YWM5NzRmZDg5MzU2OGI1ZCJ9fX0= item: player_head texture:eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMmM0YTY1YzY4OWIyZDM2NDA5MTAwYTYwYzJhYjhkM2QwYTY3Y2U5NGVlYTNjMWY3YWM5NzRmZDg5MzU2OGI1ZCJ9fX0=
craftable: true # If the reforge stone should be craftable craftable: true # If the reforge stone should be craftable
price: 100000 # (Optional) The price required to apply this reforge, overrides the default reforge price
price: # (Optional) The price required to apply this reforge, overrides the default reforge price
value: 100000
type: coins # See here: https://plugins.auxilor.io/all-plugins/prices
display: "&6$%value%"
recipe: # The recipe for the stone to have recipe: # The recipe for the stone to have
- air - air
- ecoitems:blank_reforge_stone ? air - ecoitems:blank_reforge_stone ? air

View File

@@ -1,15 +1,11 @@
name: "<gradient:#4776E6>Acute</gradient:#8E54E9>" name: "<gradient:#4776E6>Acute</gradient:#8E54E9>"
description: description:
- "&a+2% &fTriple Damage Chance" - "&a+2% &fTriple Damage Chance"
targets: targets:
- axe - axe
stone:
enabled: false
name: ''
lore: []
item: ''
craftable: false
recipe: []
effects: effects:
- id: damage_multiplier - id: damage_multiplier
args: args:
@@ -17,4 +13,5 @@ effects:
chance: 2 chance: 2
triggers: triggers:
- melee_attack - melee_attack
conditions: [] conditions: []

View File

@@ -1,21 +1,18 @@
name: "<gradient:#B993D6>Aerobic</gradient:#8CA6DB>" name: "<gradient:#B993D6>Aerobic</gradient:#8CA6DB>"
description: description:
- "&a+9% &fDamage when shot in air" - "&a+9% &fDamage when shot in air"
targets: targets:
- bow - bow
stone:
enabled: false
name: ''
lore: []
item: ''
craftable: false
recipe: []
effects: effects:
- id: damage_multiplier - id: damage_multiplier
args: args:
multiplier: 1.09 multiplier: 1.09
triggers: triggers:
- bow_attack - bow_attack
conditions: conditions:
- id: in_air - id: in_air
args: args:

View File

@@ -1,9 +1,12 @@
name: "<gradient:#AAFFA9>Dynamic</gradient:#11FFBD>" name: "<gradient:#AAFFA9>Dynamic</gradient:#11FFBD>"
description: description:
- "&a+5% &fDamage" - "&a+5% &fDamage"
- "&a+10% &fCrit Damage" - "&a+10% &fCrit Damage"
targets: targets:
- melee - melee
stone: stone:
enabled: true enabled: true
name: "<gradient:#AAFFA9>Dynamic</gradient:#11FFBD>&f Reforge Stone" name: "<gradient:#AAFFA9>Dynamic</gradient:#11FFBD>&f Reforge Stone"
@@ -13,7 +16,12 @@ stone:
- "<gradient:#AAFFA9>Dynamic</gradient:#11FFBD>&7 reforge!" - "<gradient:#AAFFA9>Dynamic</gradient:#11FFBD>&7 reforge!"
item: player_head texture:eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMmM0YTY1YzY4OWIyZDM2NDA5MTAwYTYwYzJhYjhkM2QwYTY3Y2U5NGVlYTNjMWY3YWM5NzRmZDg5MzU2OGI1ZCJ9fX0= item: player_head texture:eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMmM0YTY1YzY4OWIyZDM2NDA5MTAwYTYwYzJhYjhkM2QwYTY3Y2U5NGVlYTNjMWY3YWM5NzRmZDg5MzU2OGI1ZCJ9fX0=
craftable: true craftable: true
price: 100000
price:
value: 100000
type: coins
display: "&6$%value%"
recipe: recipe:
- air - air
- ecoitems:blank_reforge_stone ? air - ecoitems:blank_reforge_stone ? air
@@ -24,6 +32,7 @@ stone:
- air - air
- phantom_membrane - phantom_membrane
- air - air
effects: effects:
- id: damage_multiplier - id: damage_multiplier
args: args:
@@ -35,4 +44,5 @@ effects:
multiplier: 1.1 multiplier: 1.1
triggers: triggers:
- melee_attack - melee_attack
conditions: [] conditions: []

View File

@@ -1,15 +1,11 @@
name: "<gradient:#EFEFBB>Evasive</gradient:#D4D3DD>" name: "<gradient:#EFEFBB>Evasive</gradient:#D4D3DD>"
description: description:
- "&a+2% &fIgnore Damage Chance" - "&a+2% &fIgnore Damage Chance"
targets: targets:
- armor - armor
stone:
enabled: false
name: ''
lore: []
item: ''
craftable: false
recipe: []
effects: effects:
- id: damage_multiplier - id: damage_multiplier
args: args:
@@ -17,4 +13,5 @@ effects:
chance: 2 chance: 2
triggers: triggers:
- take_damage - take_damage
conditions: [] conditions: []

View File

@@ -1,19 +1,16 @@
name: "<gradient:#1e3c72>Gravitated</gradient:#2a5298>" name: "<gradient:#1e3c72>Gravitated</gradient:#2a5298>"
description: description:
- "&a+8% &fCritical Damage" - "&a+8% &fCritical Damage"
targets: targets:
- melee - melee
stone:
enabled: false
name: ''
lore: []
item: ''
craftable: false
recipe: []
effects: effects:
- id: crit_multiplier - id: crit_multiplier
args: args:
multiplier: 1.08 multiplier: 1.08
triggers: triggers:
- melee_attack - melee_attack
conditions: [] conditions: []

View File

@@ -1,17 +1,13 @@
name: "<gradient:#1c92d2>Light</gradient:#f2fcfe>" name: "<gradient:#1c92d2>Light</gradient:#f2fcfe>"
description: description:
- "&c-5% &fDamage" - "&c-5% &fDamage"
- "&c-5% &fKnockback" - "&c-5% &fKnockback"
- "&a+10% &fAttack Speed" - "&a+10% &fAttack Speed"
targets: targets:
- melee - melee
stone:
enabled: false
name: ''
lore: []
item: ''
craftable: false
recipe: []
effects: effects:
- id: damage_multiplier - id: damage_multiplier
args: args:
@@ -24,4 +20,5 @@ effects:
- id: attack_speed_multiplier - id: attack_speed_multiplier
args: args:
multiplier: 1.1 multiplier: 1.1
conditions: [] conditions: []

View File

@@ -1,17 +1,13 @@
name: "<gradient:#373B44>Nautical</gradient:#4286f4>" name: "<gradient:#373B44>Nautical</gradient:#4286f4>"
description: description:
- "&a+20% &fDamage in water" - "&a+20% &fDamage in water"
targets: targets:
- melee - melee
- bow - bow
- trident - trident
stone:
enabled: false
name: ''
lore: []
item: ''
craftable: false
recipe: []
effects: effects:
- id: damage_multiplier - id: damage_multiplier
args: args:
@@ -20,6 +16,7 @@ effects:
- melee_attack - melee_attack
- bow_attack - bow_attack
- trident_attack - trident_attack
conditions: conditions:
- id: in_water - id: in_water
args: args:

View File

@@ -1,19 +1,16 @@
name: "<gradient:#076585>Pointy</gradient:#ffffff>" name: "<gradient:#076585>Pointy</gradient:#ffffff>"
description: description:
- "&a+10% &fDamage" - "&a+10% &fDamage"
targets: targets:
- trident - trident
stone:
enabled: false
name: ''
lore: []
item: ''
craftable: false
recipe: []
effects: effects:
- id: damage_multiplier - id: damage_multiplier
args: args:
multiplier: 1.1 multiplier: 1.1
triggers: triggers:
- trident_attack - trident_attack
conditions: [] conditions: []

View File

@@ -1,15 +1,11 @@
name: "<gradient:#00B4DB>Prospecting</gradient:#0083B0>" name: "<gradient:#00B4DB>Prospecting</gradient:#0083B0>"
description: description:
- "&a+5% &fChance to get &e$$2&f for mining a block" - "&a+5% &fChance to get &e$$2&f for mining a block"
targets: targets:
- pickaxe - pickaxe
stone:
enabled: false
name: ''
lore: []
item: ''
craftable: false
recipe: []
effects: effects:
- id: give_money - id: give_money
args: args:
@@ -17,4 +13,5 @@ effects:
chance: 5 chance: 5
triggers: triggers:
- mine_block - mine_block
conditions: [] conditions: []

View File

@@ -1,19 +1,16 @@
name: "<gradient:#FBD786>Reinforced</gradient:#f7797d>" name: "<gradient:#FBD786>Reinforced</gradient:#f7797d>"
description: description:
- "&a+4% &fDamage Resistance" - "&a+4% &fDamage Resistance"
targets: targets:
- armor - armor
stone:
enabled: false
name: ''
lore: []
item: ''
craftable: false
recipe: []
effects: effects:
- id: damage_multiplier - id: damage_multiplier
args: args:
multiplier: 0.96 multiplier: 0.96
triggers: triggers:
- take_damage - take_damage
conditions: [] conditions: []

View File

@@ -1,9 +1,12 @@
name: "<gradient:#DBDBDB>Rich</gradient:#F2F2F2>" name: "<gradient:#DBDBDB>Rich</gradient:#F2F2F2>"
description: description:
- "&a+$$50 &fFor each mob kill" - "&a+$$50 &fFor each mob kill"
targets: targets:
- trident - trident
- bow - bow
stone: stone:
enabled: true enabled: true
name: "<gradient:#DBDBDB>Rich</gradient:#F2F2F2>&f Reforge Stone" name: "<gradient:#DBDBDB>Rich</gradient:#F2F2F2>&f Reforge Stone"
@@ -23,10 +26,12 @@ stone:
- gold_block - gold_block
- bow - bow
- gold_block - gold_block
effects: effects:
- id: give_money - id: give_money
args: args:
amount: 50 amount: 50
triggers: triggers:
- kill - kill
conditions: [] conditions: []

View File

@@ -3,6 +3,7 @@ description:
- "&a+3% &fDamage" - "&a+3% &fDamage"
targets: targets:
- melee - melee
stone: stone:
enabled: false enabled: false
name: '' name: ''
@@ -10,6 +11,7 @@ stone:
item: '' item: ''
craftable: false craftable: false
recipe: [] recipe: []
effects: effects:
- id: damage_multiplier - id: damage_multiplier
args: args:

View File

@@ -1,19 +1,16 @@
name: "<gradient:#74ebd5>Streamlined</gradient:#ACB6E5>" name: "<gradient:#74ebd5>Streamlined</gradient:#ACB6E5>"
description: description:
- "&a+4% &fDamage" - "&a+4% &fDamage"
targets: targets:
- bow - bow
stone:
enabled: false
name: ''
lore: []
item: ''
craftable: false
recipe: []
effects: effects:
- id: damage_multiplier - id: damage_multiplier
args: args:
multiplier: 1.04 multiplier: 1.04
triggers: triggers:
- bow_attack - bow_attack
conditions: [] conditions: []

View File

@@ -1,16 +1,12 @@
name: "<gradient:#ED213A>Strong</gradient:#93291E>" name: "<gradient:#ED213A>Strong</gradient:#93291E>"
description: description:
- "&a+2% &fDamage" - "&a+2% &fDamage"
- "&a+10% &fKnockback" - "&a+10% &fKnockback"
targets: targets:
- melee - melee
stone:
enabled: false
name: ''
lore: []
item: ''
craftable: false
recipe: []
effects: effects:
- id: damage_multiplier - id: damage_multiplier
args: args:
@@ -20,4 +16,5 @@ effects:
- id: knockback_multiplier - id: knockback_multiplier
args: args:
multiplier: 1.1 multiplier: 1.1
conditions: [] conditions: []

View File

@@ -1,16 +1,12 @@
name: "<gradient:#D1913C>Thin</gradient:#FFD194>" name: "<gradient:#D1913C>Thin</gradient:#FFD194>"
description: description:
- "&c-5% &fDamage Resistance" - "&c-5% &fDamage Resistance"
- "&a+2.5% &fMovement Speed" - "&a+2.5% &fMovement Speed"
targets: targets:
- armor - armor
stone:
enabled: false
name: ''
lore: []
item: ''
craftable: false
recipe: []
effects: effects:
- id: damage_multiplier - id: damage_multiplier
args: args:
@@ -20,4 +16,5 @@ effects:
- id: movement_speed_multiplier - id: movement_speed_multiplier
args: args:
multiplier: 1.025 multiplier: 1.025
conditions: [] conditions: []

View File

@@ -1,16 +1,12 @@
name: "<gradient:#a73737>Tough</gradient:#7a2828>" name: "<gradient:#a73737>Tough</gradient:#7a2828>"
description: description:
- "&c+8% &fDamage Resistance" - "&c+8% &fDamage Resistance"
- "&a-5% &fMovement Speed" - "&a-5% &fMovement Speed"
targets: targets:
- armor - armor
stone:
enabled: false
name: ''
lore: []
item: ''
craftable: false
recipe: []
effects: effects:
- id: damage_multiplier - id: damage_multiplier
args: args:
@@ -20,4 +16,5 @@ effects:
- id: movement_speed_multiplier - id: movement_speed_multiplier
args: args:
multiplier: 0.95 multiplier: 0.95
conditions: [] conditions: []

View File

@@ -1,4 +1,4 @@
#libreforge-updater #libreforge-updater
#Fri Oct 21 19:25:56 BST 2022 #Sat Nov 26 19:20:12 GMT 2022
version=5.65.1 version=5.75.0
plugin-name=Reforges plugin-name=Reforges