Add xp to miner, cap correctly

This commit is contained in:
TomTom 2024-03-14 19:24:42 +01:00
parent 86d85ede6b
commit fb2a999cc7
8 changed files with 114 additions and 16 deletions

View File

@ -17,14 +17,16 @@ class MinionDamageListener : Listener {
fun onMinionKillEntityEvent(event: MinionKillEntityEvent) { fun onMinionKillEntityEvent(event: MinionKillEntityEvent) {
val entitySize = AxMinionsPlugin.integrations.getStackerIntegration().getStackSize(event.target) val entitySize = AxMinionsPlugin.integrations.getStackerIntegration().getStackSize(event.target)
val amount = ThreadLocalRandom.current().nextInt(1, 4) * entitySize
event.minion.setActions(event.minion.getActionAmount() + entitySize) event.minion.setActions(event.minion.getActionAmount() + entitySize)
if (event.minion.getStorage() + amount < event.minion.getType().getDouble("storage", event.minion.getLevel())) { val coerced = (event.minion.getStorage() + ThreadLocalRandom.current().nextInt(1, 4) * entitySize).coerceIn(
event.minion.setStorage(event.minion.getStorage() + amount * entitySize) 0.0,
} event.minion.getType().getLong("storage", event.minion.getLevel()).toDouble()
)
event.minion.setStorage(coerced)
Scheduler.get().runLaterAt(event.target.location, { Scheduler.get().runLaterAt(event.target.location, {
event.target.location.world!!.getNearbyEntities(event.target.location, 4.0, 4.0, 4.0).filterIsInstance<Item>().fastFor { item -> event.target.location.world!!.getNearbyEntities(event.target.location, 4.0, 4.0, 4.0)
.filterIsInstance<Item>().fastFor { item ->
if (event.minion.getLinkedInventory()?.firstEmpty() == -1) { if (event.minion.getLinkedInventory()?.firstEmpty() == -1) {
Warnings.CONTAINER_FULL.display(event.minion) Warnings.CONTAINER_FULL.display(event.minion)
return@runLaterAt return@runLaterAt

View File

@ -76,9 +76,9 @@ class FisherMinionType : MinionType("fisher", AxMinionsPlugin.INSTANCE.getResour
val xp = ThreadLocalRandom.current().nextInt(6) + 1 val xp = ThreadLocalRandom.current().nextInt(6) + 1
minion.addToContainerOrDrop(loot) minion.addToContainerOrDrop(loot)
if (minion.getStorage() + xp < minion.getType().getDouble("storage", minion.getLevel())) { val coerced = (minion.getStorage() + xp).coerceIn(0.0, minion.getType().getLong("storage", minion.getLevel()).toDouble())
minion.setStorage(minion.getStorage() + xp) minion.setStorage(coerced)
}
minion.setActions(minion.getActionAmount() + 1) minion.setActions(minion.getActionAmount() + 1)
minion.damageTool() minion.damageTool()
} }

View File

@ -10,19 +10,52 @@ import com.artillexstudios.axminions.api.utils.MinionUtils
import com.artillexstudios.axminions.api.utils.fastFor import com.artillexstudios.axminions.api.utils.fastFor
import com.artillexstudios.axminions.api.warnings.Warnings import com.artillexstudios.axminions.api.warnings.Warnings
import com.artillexstudios.axminions.minions.MinionTicker import com.artillexstudios.axminions.minions.MinionTicker
import com.artillexstudios.axminions.nms.NMSHandler
import dev.lone.itemsadder.api.CustomBlock import dev.lone.itemsadder.api.CustomBlock
import java.util.Locale import java.util.Locale
import java.util.concurrent.ExecutorService import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors import java.util.concurrent.Executors
import kotlin.math.roundToInt import kotlin.math.roundToInt
import me.kryniowesegryderiusz.kgenerators.Main import me.kryniowesegryderiusz.kgenerators.Main
import org.bukkit.Bukkit
import org.bukkit.Material import org.bukkit.Material
import org.bukkit.block.BlockFace import org.bukkit.block.BlockFace
import org.bukkit.enchantments.Enchantment import org.bukkit.enchantments.Enchantment
import org.bukkit.inventory.FurnaceRecipe
import org.bukkit.inventory.ItemStack
class MinerMinionType : MinionType("miner", AxMinionsPlugin.INSTANCE.getResource("minions/miner.yml")!!) { class MinerMinionType : MinionType("miner", AxMinionsPlugin.INSTANCE.getResource("minions/miner.yml")!!) {
private var asyncExecutor: ExecutorService? = null companion object {
private val faces = arrayOf(BlockFace.NORTH, BlockFace.EAST, BlockFace.SOUTH, BlockFace.WEST) private var asyncExecutor: ExecutorService? = null
private val smeltingRecipes = ArrayList<FurnaceRecipe>()
private val faces = arrayOf(BlockFace.NORTH, BlockFace.EAST, BlockFace.SOUTH, BlockFace.WEST)
init {
Bukkit.recipeIterator().forEachRemaining {
if (it is FurnaceRecipe) {
smeltingRecipes.add(it)
}
}
}
}
// private fun toSmelted(minion: Minion, drops: Collection<ItemStack>): MutableList<ItemStack> {
// if (minion.getType().getConfig().getBoolean("gui.autosmelt.enabled")) {
// val dropsList = ArrayList<ItemStack>(drops.size)
// drops.forEach { item ->
// smeltingRecipes.fastFor {
// if (it.inputChoice.test(item)) {
// dropsList.add(it.result)
// } else {
// dropsList.add(item)
// }
// }
// }
// }
//
//
// return dropsList
// }
override fun shouldRun(minion: Minion): Boolean { override fun shouldRun(minion: Minion): Boolean {
return MinionTicker.getTick() % minion.getNextAction() == 0L return MinionTicker.getTick() % minion.getNextAction() == 0L
@ -65,6 +98,7 @@ class MinerMinionType : MinionType("miner", AxMinionsPlugin.INSTANCE.getResource
Warnings.remove(minion, Warnings.NO_TOOL) Warnings.remove(minion, Warnings.NO_TOOL)
var amount = 0 var amount = 0
var xp = 0
when (getConfig().getString("mode").lowercase(Locale.ENGLISH)) { when (getConfig().getString("mode").lowercase(Locale.ENGLISH)) {
"sphere" -> { "sphere" -> {
LocationUtils.getAllBlocksInRadius(minion.getLocation(), minion.getRange(), false).fastFor { location -> LocationUtils.getAllBlocksInRadius(minion.getLocation(), minion.getRange(), false).fastFor { location ->
@ -83,7 +117,9 @@ class MinerMinionType : MinionType("miner", AxMinionsPlugin.INSTANCE.getResource
val isStoneGenerator = MinionUtils.isStoneGenerator(location) val isStoneGenerator = MinionUtils.isStoneGenerator(location)
if (isStoneGenerator) { if (isStoneGenerator) {
val drops = location.block.getDrops(minion.getTool()) val block = location.block
val drops = block.getDrops(minion.getTool())
xp += NMSHandler.get().getExp(block, minion.getTool() ?: return)
drops.forEach { drops.forEach {
amount += it.amount amount += it.amount
} }
@ -118,7 +154,9 @@ class MinerMinionType : MinionType("miner", AxMinionsPlugin.INSTANCE.getResource
if (isStoneGenerator) { if (isStoneGenerator) {
Scheduler.get().run { Scheduler.get().run {
val drops = location.block.getDrops(minion.getTool()) val block = location.block
val drops = block.getDrops(minion.getTool())
xp += NMSHandler.get().getExp(block, minion.getTool() ?: return@run)
drops.forEach { drops.forEach {
amount += it.amount amount += it.amount
} }
@ -146,7 +184,9 @@ class MinerMinionType : MinionType("miner", AxMinionsPlugin.INSTANCE.getResource
val isStoneGenerator = MinionUtils.isStoneGenerator(location) val isStoneGenerator = MinionUtils.isStoneGenerator(location)
if (isStoneGenerator) { if (isStoneGenerator) {
val drops = location.block.getDrops(minion.getTool()) val block = location.block
val drops = block.getDrops(minion.getTool())
xp += NMSHandler.get().getExp(block, minion.getTool() ?: return)
drops.forEach { drops.forEach {
amount += it.amount amount += it.amount
} }
@ -175,7 +215,9 @@ class MinerMinionType : MinionType("miner", AxMinionsPlugin.INSTANCE.getResource
val isStoneGenerator = MinionUtils.isStoneGenerator(location) val isStoneGenerator = MinionUtils.isStoneGenerator(location)
if (isStoneGenerator) { if (isStoneGenerator) {
val drops = location.block.getDrops(minion.getTool()) val block = location.block
val drops = block.getDrops(minion.getTool())
xp += NMSHandler.get().getExp(block, minion.getTool() ?: return)
drops.forEach { item -> drops.forEach { item ->
amount += item.amount amount += item.amount
} }
@ -217,10 +259,13 @@ class MinerMinionType : MinionType("miner", AxMinionsPlugin.INSTANCE.getResource
val isStoneGenerator = MinionUtils.isStoneGenerator(location) val isStoneGenerator = MinionUtils.isStoneGenerator(location)
if (isStoneGenerator) { if (isStoneGenerator) {
val drops = location.block.getDrops(minion.getTool()) val block = location.block
val drops = block.getDrops(minion.getTool())
xp += NMSHandler.get().getExp(block, minion.getTool() ?: return)
drops.forEach { drops.forEach {
amount += it.amount amount += it.amount
} }
minion.addToContainerOrDrop(drops) minion.addToContainerOrDrop(drops)
location.block.type = Material.AIR location.block.type = Material.AIR
} }
@ -228,6 +273,9 @@ class MinerMinionType : MinionType("miner", AxMinionsPlugin.INSTANCE.getResource
} }
} }
val coerced =
(minion.getStorage() + xp).coerceIn(0.0, minion.getType().getLong("storage", minion.getLevel()).toDouble())
minion.setStorage(coerced)
minion.setActions(minion.getActionAmount() + amount) minion.setActions(minion.getActionAmount() + amount)
minion.damageTool(amount) minion.damageTool(amount)
} }

View File

@ -3,6 +3,7 @@ package com.artillexstudios.axminions.nms
import com.artillexstudios.axapi.utils.Version import com.artillexstudios.axapi.utils.Version
import com.artillexstudios.axminions.api.minions.Minion import com.artillexstudios.axminions.api.minions.Minion
import org.bukkit.Location import org.bukkit.Location
import org.bukkit.block.Block
import org.bukkit.entity.Entity import org.bukkit.entity.Entity
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
@ -21,4 +22,6 @@ interface NMSHandler {
fun generateRandomFishingLoot(minion: Minion, waterLocation: Location): List<ItemStack> fun generateRandomFishingLoot(minion: Minion, waterLocation: Location): List<ItemStack>
fun isAnimal(entity: Entity): Boolean fun isAnimal(entity: Entity): Boolean
fun getExp(block: Block, itemStack: ItemStack): Int
} }

View File

@ -53,15 +53,29 @@ gui:
- " <gray>- <white>Killed mobs: <#FF3333><actions>" - " <gray>- <white>Killed mobs: <#FF3333><actions>"
- " <gray>- <white>Stored exp: <#CC00FF><storage>" - " <gray>- <white>Stored exp: <#CC00FF><storage>"
- "" - ""
autosmelt:
enabled: true
slot: 9
material: "lava_bucket"
name: "<gold>Autosmelt"
lore:
- ""
- "<gray> Click to purchase! "
- ""
- "<white>Price: <green>$1,000"
requirements:
money: 1000
actions: 100
upgrades: upgrades:
1: 1:
range: 3 range: 3
speed: 200 speed: 200
storage: 200
items: items:
helmet: helmet:
type: "player_head" type: "player_head"
texture: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTc1MzJlOTBjNTczYTM5NGM3ODAyYWE0MTU4MzA1ODAyYjU5ZTY3ZjJhMmI3ZTNmZDAzNjNhYTZlYTQyYjg0MSJ9fX0=" texture: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI 6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTc1MzJlOTBjNTczYTM5NGM3ODAyYWE0MTU4MzA1ODAyYjU5ZTY3ZjJhMmI3ZTNmZDAzNjNhYTZlYTQyYjg0MSJ9fX0="
chestplate: chestplate:
type: "leather_chestplate" type: "leather_chestplate"
color: "0, 150, 255" color: "0, 150, 255"

View File

@ -4,7 +4,12 @@ import com.artillexstudios.axminions.api.minions.Minion
import com.artillexstudios.axminions.nms.NMSHandler import com.artillexstudios.axminions.nms.NMSHandler
import net.minecraft.world.entity.MobCategory import net.minecraft.world.entity.MobCategory
import org.bukkit.Location import org.bukkit.Location
import org.bukkit.block.Block
import org.bukkit.craftbukkit.v1_20_R1.block.CraftBlock
import org.bukkit.craftbukkit.v1_20_R1.block.CraftBlockState
import org.bukkit.craftbukkit.v1_20_R1.entity.CraftEntity import org.bukkit.craftbukkit.v1_20_R1.entity.CraftEntity
import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack
import org.bukkit.craftbukkit.v1_20_R1.util.CraftLocation
import org.bukkit.entity.Entity import org.bukkit.entity.Entity
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
@ -21,4 +26,9 @@ class NMSHandler : NMSHandler {
override fun isAnimal(entity: Entity): Boolean { override fun isAnimal(entity: Entity): Boolean {
return (entity as CraftEntity).handle.type.category == MobCategory.CREATURE return (entity as CraftEntity).handle.type.category == MobCategory.CREATURE
} }
override fun getExp(block: Block, itemStack: ItemStack): Int {
val craftBlock = block as CraftBlock
return craftBlock.nms.block.getExpDrop((block.state as CraftBlockState).handle, craftBlock.handle.minecraftWorld, CraftLocation.toBlockPosition(block.location), CraftItemStack.asNMSCopy(itemStack), true)
}
} }

View File

@ -4,7 +4,12 @@ import com.artillexstudios.axminions.api.minions.Minion
import com.artillexstudios.axminions.nms.NMSHandler import com.artillexstudios.axminions.nms.NMSHandler
import net.minecraft.world.entity.MobCategory import net.minecraft.world.entity.MobCategory
import org.bukkit.Location import org.bukkit.Location
import org.bukkit.block.Block
import org.bukkit.craftbukkit.v1_20_R2.block.CraftBlock
import org.bukkit.craftbukkit.v1_20_R2.block.CraftBlockState
import org.bukkit.craftbukkit.v1_20_R2.entity.CraftEntity import org.bukkit.craftbukkit.v1_20_R2.entity.CraftEntity
import org.bukkit.craftbukkit.v1_20_R2.inventory.CraftItemStack
import org.bukkit.craftbukkit.v1_20_R2.util.CraftLocation
import org.bukkit.entity.Entity import org.bukkit.entity.Entity
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
@ -21,4 +26,9 @@ class NMSHandler : NMSHandler {
override fun isAnimal(entity: Entity): Boolean { override fun isAnimal(entity: Entity): Boolean {
return (entity as CraftEntity).handle.type.category == MobCategory.CREATURE return (entity as CraftEntity).handle.type.category == MobCategory.CREATURE
} }
override fun getExp(block: Block, itemStack: ItemStack): Int {
val craftBlock = block as CraftBlock
return craftBlock.nms.block.getExpDrop((block.state as CraftBlockState).handle, craftBlock.handle.minecraftWorld, CraftLocation.toBlockPosition(block.location), CraftItemStack.unwrap(itemStack), true)
}
} }

View File

@ -2,9 +2,15 @@ package com.artillexstudios.axminions.nms.v1_20_R3
import com.artillexstudios.axminions.api.minions.Minion import com.artillexstudios.axminions.api.minions.Minion
import com.artillexstudios.axminions.nms.NMSHandler import com.artillexstudios.axminions.nms.NMSHandler
import net.minecraft.core.BlockPos
import net.minecraft.world.entity.MobCategory import net.minecraft.world.entity.MobCategory
import org.bukkit.Location import org.bukkit.Location
import org.bukkit.block.Block
import org.bukkit.craftbukkit.v1_20_R3.block.CraftBlock
import org.bukkit.craftbukkit.v1_20_R3.block.CraftBlockState
import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity
import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftItemStack
import org.bukkit.craftbukkit.v1_20_R3.util.CraftLocation
import org.bukkit.entity.Entity import org.bukkit.entity.Entity
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
@ -21,4 +27,9 @@ class NMSHandler : NMSHandler {
override fun isAnimal(entity: Entity): Boolean { override fun isAnimal(entity: Entity): Boolean {
return (entity as CraftEntity).handle.type.category == MobCategory.CREATURE return (entity as CraftEntity).handle.type.category == MobCategory.CREATURE
} }
override fun getExp(block: Block, itemStack: ItemStack): Int {
val craftBlock = block as CraftBlock
return craftBlock.nms.block.getExpDrop((block.state as CraftBlockState).handle, craftBlock.handle.minecraftWorld, CraftLocation.toBlockPosition(block.location), CraftItemStack.unwrap(itemStack), true)
}
} }