Skip to content
Open
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.willfp.libreforge.effects.impl

import com.willfp.eco.core.config.interfaces.Config
import com.willfp.eco.core.fast.FastItemStack
import com.willfp.libreforge.NoCompileData
import com.willfp.libreforge.arguments
import com.willfp.libreforge.effects.Effect
Expand All @@ -12,7 +11,6 @@ import com.willfp.libreforge.triggers.event.EditableBlockDropEvent
import com.willfp.libreforge.triggers.event.EditableDropEvent
import org.bukkit.Bukkit
import org.bukkit.Material
import org.bukkit.enchantments.Enchantment
import org.bukkit.entity.Player
import org.bukkit.inventory.FurnaceRecipe
import org.bukkit.inventory.ItemStack
Expand All @@ -35,6 +33,13 @@ object EffectAutosmelt : Effect<NoCompileData>("autosmelt") {
)

init {
loadRecipes()
}

private fun loadRecipes() {
recipes.clear()

// Load recipes from Bukkit
val iterator = Bukkit.recipeIterator()
while (iterator.hasNext()) {
val recipe = iterator.next()
Expand All @@ -45,6 +50,32 @@ object EffectAutosmelt : Effect<NoCompileData>("autosmelt") {
@Suppress("DEPRECATION")
recipes[recipe.input.type] = Pair(recipe.result.type, xp)
}

// Add fallback recipes for common ores if they're missing (using vanilla XP values)
addFallbackRecipe(Material.IRON_ORE, Material.IRON_INGOT, ceil(0.7f).toInt())
addFallbackRecipe(Material.DEEPSLATE_IRON_ORE, Material.IRON_INGOT, ceil(0.7f).toInt())
addFallbackRecipe(Material.GOLD_ORE, Material.GOLD_INGOT, ceil(1.0f).toInt())
addFallbackRecipe(Material.DEEPSLATE_GOLD_ORE, Material.GOLD_INGOT, ceil(1.0f).toInt())
addFallbackRecipe(Material.COPPER_ORE, Material.COPPER_INGOT, ceil(0.7f).toInt())
addFallbackRecipe(Material.DEEPSLATE_COPPER_ORE, Material.COPPER_INGOT, ceil(0.7f).toInt())
addFallbackRecipe(Material.COAL_ORE, Material.COAL, ceil(0.1f).toInt())
addFallbackRecipe(Material.DEEPSLATE_COAL_ORE, Material.COAL, ceil(0.1f).toInt())
addFallbackRecipe(Material.DIAMOND_ORE, Material.DIAMOND, ceil(1.0f).toInt())
addFallbackRecipe(Material.DEEPSLATE_DIAMOND_ORE, Material.DIAMOND, ceil(1.0f).toInt())
addFallbackRecipe(Material.EMERALD_ORE, Material.EMERALD, ceil(1.0f).toInt())
addFallbackRecipe(Material.DEEPSLATE_EMERALD_ORE, Material.EMERALD, ceil(1.0f).toInt())
addFallbackRecipe(Material.LAPIS_ORE, Material.LAPIS_LAZULI, ceil(0.2f).toInt())
addFallbackRecipe(Material.DEEPSLATE_LAPIS_ORE, Material.LAPIS_LAZULI, ceil(0.2f).toInt())
addFallbackRecipe(Material.REDSTONE_ORE, Material.REDSTONE, ceil(0.7f).toInt())
addFallbackRecipe(Material.DEEPSLATE_REDSTONE_ORE, Material.REDSTONE, ceil(0.7f).toInt())
addFallbackRecipe(Material.NETHER_GOLD_ORE, Material.GOLD_NUGGET, ceil(1.0f).toInt())
addFallbackRecipe(Material.NETHER_QUARTZ_ORE, Material.QUARTZ, ceil(0.2f).toInt())
}

private fun addFallbackRecipe(input: Material, output: Material, xp: Int) {
if (!recipes.containsKey(input)) {
recipes[input] = Pair(output, xp)
}
}

private fun getOutput(input: Material): Pair<Material, Int> {
Expand All @@ -70,8 +101,16 @@ object EffectAutosmelt : Effect<NoCompileData>("autosmelt") {
}

private fun handleEvent(player: Player, event: EditableDropEvent, config: Config) {
val fortune = FastItemStack.wrap(player.inventory.itemInMainHand)
.getEnchantmentLevel(getEnchantment("fortune")!!, false)
val fortune = try {
val fortuneEnchant = getEnchantment("fortune")
if (fortuneEnchant != null) {
player.inventory.itemInMainHand.getEnchantmentLevel(fortuneEnchant)
} else {
0
}
} catch (_: Exception) {
0
}

event.addModifier {
var (type, xp) = getOutput(it.type)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,12 @@ object EffectDrill : MineBlockEffect<NoCompileData>("drill") {
blocks.add(toBreak)
}

player.breakBlocksSafely(blocks)
val useSetBlockBreak = config.getBool("prevent_trigger")
if (useSetBlockBreak) {
blocks.forEach { it.breakNaturally() }
} else {
player.breakBlocksSafely(blocks)
}

return true
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,12 @@ object EffectMineRadius : MineBlockEffect<NoCompileData>("mine_radius") {
}
}

player.breakBlocksSafely(blocks)
val useSetBlockBreak = config.getBool("prevent_trigger")
if (useSetBlockBreak) {
blocks.forEach { it.breakNaturally() }
} else {
player.breakBlocksSafely(blocks)
}

return true
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,12 @@ object EffectMineRadiusOneDeep : MineBlockEffect<NoCompileData>("mine_radius_one
}
}

player.breakBlocksSafely(blocks)
val useSetBlockBreak = config.getBool("prevent_trigger")
if (useSetBlockBreak) {
blocks.forEach { it.breakNaturally() }
} else {
player.breakBlocksSafely(blocks)
}

return true
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.willfp.libreforge.effects.impl

import com.willfp.eco.core.config.interfaces.Config
import com.willfp.eco.util.runExempted
import com.willfp.libreforge.NoCompileData
import com.willfp.libreforge.effects.Effect
import com.willfp.libreforge.triggers.TriggerData
Expand All @@ -20,25 +19,23 @@ object EffectShootArrow : Effect<NoCompileData>("shoot_arrow") {
val velocity = data.velocity
val fire = ((data.event as? EntityShootBowEvent)?.projectile?.fireTicks ?: 0) > 0

player.runExempted {
val arrow = if (velocity == null || !config.getBool("inherit_velocity")) {
player.launchProjectile(Arrow::class.java)
} else {
player.launchProjectile(Arrow::class.java, velocity)
}

if (config.getBool("launch-at-location") && data.location != null) {
arrow.teleportAsync(data.location)
}

arrow.pickupStatus = AbstractArrow.PickupStatus.DISALLOWED
if (fire) {
arrow.fireTicks = Int.MAX_VALUE
}

if (config.getBool("no_source")) {
arrow.shooter = null
}
val arrow = if (velocity == null || !config.getBool("inherit_velocity")) {
player.launchProjectile(Arrow::class.java)
} else {
player.launchProjectile(Arrow::class.java, velocity)
}

if (config.getBool("launch-at-location") && data.location != null) {
arrow.teleportAsync(data.location)
}

arrow.pickupStatus = AbstractArrow.PickupStatus.DISALLOWED
if (fire) {
arrow.fireTicks = Int.MAX_VALUE
}

if (config.getBool("no_source")) {
arrow.shooter = null
}

return true
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import com.willfp.libreforge.NoCompileData
import com.willfp.libreforge.arguments
import com.willfp.libreforge.effects.Effect
import com.willfp.libreforge.getIntFromExpression
import com.willfp.libreforge.plugin
import com.willfp.libreforge.triggers.TriggerData
import com.willfp.libreforge.triggers.TriggerParameter
import org.bukkit.entity.AreaEffectCloud
Expand Down Expand Up @@ -43,6 +44,12 @@ object EffectSpawnPotionCloud : Effect<NoCompileData>("spawn_potion_cloud") {

cloud.source = data.player

plugin.scheduler.runLater(duration.toLong()) {
if (!cloud.isDead) {
cloud.remove()
}
}

return true
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.willfp.libreforge.effects.templates

import com.willfp.eco.core.config.interfaces.Config
import com.willfp.eco.util.runExempted
import com.willfp.libreforge.effects.Effect
import com.willfp.libreforge.plugin
import com.willfp.libreforge.triggers.TriggerData
Expand All @@ -26,17 +25,15 @@ abstract class MineBlockEffect<T : Any>(id: String) : Effect<T>(id) {
if (plugin.configYml.getBool("effects.use-setblock-break")) {
blocks.forEach { it.type = Material.AIR }
} else {
this.runExempted {
for (block in blocks) {
if (block.world != this.world) {
continue
}

block.setMetadata(ignoreKey, plugin.createMetadataValue(true))
this.breakBlock(block)
block.removeMetadata(ignoreKey, plugin)
for (block in blocks) {
if (block.world != this.world) {
continue
}

block.setMetadata(ignoreKey, plugin.createMetadataValue(true))
this.breakBlock(block)
block.removeMetadata(ignoreKey, plugin)
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import org.bukkit.Tag
import org.bukkit.entity.Entity
import org.bukkit.entity.LivingEntity
import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority
import org.bukkit.event.block.Action
import org.bukkit.event.player.PlayerInteractEvent
import java.util.UUID
Expand Down Expand Up @@ -56,7 +57,8 @@ object TriggerAltClick : Trigger("alt_click") {
Material.BLAST_FURNACE,
Material.BREWING_STAND,
Material.DISPENSER,
Material.DROPPER
Material.DROPPER,
Material.BEDROCK
)

private val preventDoubleTriggers = mutableSetOf<UUID>()
Expand All @@ -71,7 +73,7 @@ object TriggerAltClick : Trigger("alt_click") {
BLOCK_BLACKLIST.addAll(Tag.SHULKER_BOXES.values)
}

@EventHandler
@EventHandler(priority = EventPriority.LOW)
fun handle(event: PlayerInteractEvent) {
val player = event.player

Expand Down
4 changes: 2 additions & 2 deletions core/common/src/main/resources/chains.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ chains:
- id: shoot_arrow
args:
repeat:
times: "2 * %arrows%"
start: "-11 * %arrows%"
times: 3
start: -22
increment: 22
inherit_velocity: true
mutators:
Expand Down