diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index aafdc6e..f36e470 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -13,6 +13,7 @@
+
diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml
index fdf8d99..8d81632 100644
--- a/.idea/kotlinc.xml
+++ b/.idea/kotlinc.xml
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/api/src/main/kotlin/com/artillexstudios/axminions/api/minions/utils/ChunkPos.kt b/api/src/main/kotlin/com/artillexstudios/axminions/api/utils/ChunkPos.kt
similarity index 76%
rename from api/src/main/kotlin/com/artillexstudios/axminions/api/minions/utils/ChunkPos.kt
rename to api/src/main/kotlin/com/artillexstudios/axminions/api/utils/ChunkPos.kt
index 2f2e2a6..d85fac3 100644
--- a/api/src/main/kotlin/com/artillexstudios/axminions/api/minions/utils/ChunkPos.kt
+++ b/api/src/main/kotlin/com/artillexstudios/axminions/api/utils/ChunkPos.kt
@@ -1,10 +1,9 @@
-package com.artillexstudios.axminions.api.minions.utils
+package com.artillexstudios.axminions.api.utils
import com.artillexstudios.axminions.api.minions.Minion
-import com.artillexstudios.axminions.api.utils.fastFor
import org.bukkit.World
-data class ChunkPos(val world: World, var x: Int, var z: Int) {
+data class ChunkPos(val world: World, val x: Int, val z: Int) {
val minions = arrayListOf()
val worldUUID = world.uid
diff --git a/api/src/main/kotlin/com/artillexstudios/axminions/api/utils/MinionUtils.kt b/api/src/main/kotlin/com/artillexstudios/axminions/api/utils/MinionUtils.kt
index f658699..a6b9e7d 100644
--- a/api/src/main/kotlin/com/artillexstudios/axminions/api/utils/MinionUtils.kt
+++ b/api/src/main/kotlin/com/artillexstudios/axminions/api/utils/MinionUtils.kt
@@ -41,8 +41,10 @@ object MinionUtils {
var lava = false
var water = false
+ val locBlock = location.block
+
FACES.fastFor {
- val relative = location.block.getRelative(it)
+ val relative = locBlock.getRelative(it)
val type = relative.type
if (!lava) {
lava = type == Material.LAVA
diff --git a/build.gradle b/build.gradle
index d8e8de5..a40e8b7 100644
--- a/build.gradle
+++ b/build.gradle
@@ -3,11 +3,11 @@ plugins {
id 'com.github.johnrengelman.shadow' version "8.1.1"
id 'maven-publish'
id 'java'
- id 'org.jetbrains.kotlin.jvm' version '1.9.0'
+ id 'org.jetbrains.kotlin.jvm' version '1.9.22'
}
group = 'com.artillexstudios.axminions'
-version = '1.0.0'
+version = '1.0.1'
repositories {
mavenCentral()
@@ -20,7 +20,6 @@ repositories {
dependencies {
implementation project(path: ":api")
implementation project(path: ":common")
- implementation project(path: ":nms:v1_19_R3", configuration: "reobf")
implementation project(path: ":nms:v1_20_R1", configuration: "reobf")
implementation project(path: ":nms:v1_20_R2", configuration: "reobf")
implementation project(path: ":nms:v1_20_R3", configuration: "reobf")
@@ -46,6 +45,10 @@ allprojects {
mavenCentral()
mavenLocal()
+ maven {
+ url = uri("https://repo.papermc.io/repository/maven-public/")
+ }
+
maven {
url = uri('https://hub.spigotmc.org/nexus/content/repositories/snapshots/')
}
@@ -107,7 +110,6 @@ allprojects {
compileOnly 'com.github.brcdev-minecraft:shopgui-api:3.0.0'
compileOnly 'org.jetbrains.kotlin:kotlin-stdlib:1.9.0'
compileOnly 'com.h2database:h2:2.2.220'
- compileOnly 'dev.rosewood:rosestacker:1.5.9'
compileOnly 'com.bgsoftware:WildStackerAPI:2023.2'
compileOnly 'net.essentialsx:EssentialsX:2.19.0'
compileOnly 'com.github.Gypopo:EconomyShopGUI-API:1.6.0'
@@ -120,13 +122,12 @@ allprojects {
compileOnly 'com.github.angeschossen:LandsAPI:6.29.12'
compileOnly 'com.intellectualsites.plotsquared:plotsquared-core:7.0.0-rc.4'
compileOnly 'com.intellectualsites.plotsquared:plotsquared-bukkit:7.0.0-rc.4'
+ compileOnly 'org.black_ixx:playerpoints:3.2.6'
+ compileOnly 'com.github.ben-manes.caffeine:caffeine:3.1.8'
implementation platform('com.intellectualsites.bom:bom-newest:1.35')
implementation("com.artillexstudios.axapi:axapi:1.4.22")
implementation("net.byteflux:libby-bukkit:1.3.0")
implementation("com.zaxxer:HikariCP:5.1.0")
- compileOnly files('../libs/CMI-API9.5.0.8.jar')
- compileOnly files('../libs/IridiumSkyblock-3.2.12.jar')
- compileOnly files('../libs/KingdomsX-1.16.12.jar')
}
shadowJar {
diff --git a/common/build.gradle b/common/build.gradle
index 3801697..2f8cc73 100644
--- a/common/build.gradle
+++ b/common/build.gradle
@@ -9,4 +9,8 @@ processResources {
dependencies {
implementation project(':api')
+ compileOnly files('../libs/CMI-API9.5.0.8.jar')
+ compileOnly files('../libs/IridiumSkyblock-4.0.9.jar')
+ compileOnly files('../libs/KingdomsX-1.16.12.jar')
+ compileOnly files('../libs/KGenerators-7.3-b161.jar')
}
diff --git a/common/src/main/kotlin/com/artillexstudios/axminions/AxMinionsPlugin.kt b/common/src/main/kotlin/com/artillexstudios/axminions/AxMinionsPlugin.kt
index ee81596..be38a7f 100644
--- a/common/src/main/kotlin/com/artillexstudios/axminions/AxMinionsPlugin.kt
+++ b/common/src/main/kotlin/com/artillexstudios/axminions/AxMinionsPlugin.kt
@@ -2,6 +2,7 @@ package com.artillexstudios.axminions
import com.artillexstudios.axapi.AxPlugin
import com.artillexstudios.axapi.data.ThreadedQueue
+import com.artillexstudios.axapi.scheduler.Scheduler
import com.artillexstudios.axminions.api.AxMinionsAPI
import com.artillexstudios.axminions.api.AxMinionsAPIImpl
import com.artillexstudios.axminions.api.config.Config
@@ -10,9 +11,12 @@ import com.artillexstudios.axminions.api.data.DataHandler
import com.artillexstudios.axminions.api.minions.miniontype.MinionType
import com.artillexstudios.axminions.api.minions.miniontype.MinionTypes
import com.artillexstudios.axminions.api.utils.fastFor
+import com.artillexstudios.axminions.cache.Caches
+import com.artillexstudios.axminions.cache.ChunkCache
import com.artillexstudios.axminions.commands.AxMinionsCommand
import com.artillexstudios.axminions.data.H2DataHandler
import com.artillexstudios.axminions.integrations.Integrations
+import com.artillexstudios.axminions.listeners.CacheListener
import com.artillexstudios.axminions.listeners.ChunkListener
import com.artillexstudios.axminions.listeners.LinkingListener
import com.artillexstudios.axminions.listeners.MinionDamageListener
@@ -107,6 +111,7 @@ class AxMinionsPlugin : AxPlugin() {
// Retroactively load minions for the already loaded worlds
dataQueue.submit {
Bukkit.getWorlds().fastFor { world ->
+ Caches.add(ChunkCache(world))
MinionTypes.getMinionTypes().fastFor { _, v ->
dataHandler.loadMinionsForWorld(v, world)
}
@@ -121,29 +126,34 @@ class AxMinionsPlugin : AxPlugin() {
it.registerEvents(MinionDamageListener(), this)
it.registerEvents(WorldListener(), this)
it.registerEvents(MinionDropListener(), this)
+ it.registerEvents(CacheListener(), this)
}
MinionTicker.startTicking()
- Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate({
+ Scheduler.get().runTimer({
dataQueue.submit {
- Minions.get().fastFor { pos ->
- pos.minions.fastFor { minion ->
- dataHandler.saveMinion(minion)
+ Minions.get {
+ it.fastFor { pos ->
+ pos.minions.fastFor { minion ->
+ dataHandler.saveMinion(minion)
+ }
}
}
}
- },0, Config.AUTO_SAVE_MINUTES(), TimeUnit.MINUTES)
+ }, 0, Config.AUTO_SAVE_MINUTES() * 20 * 60)
}
override fun disable() {
- Minions.get().fastFor { pos ->
- pos.minions.fastFor { minion ->
- val minionImp = minion as Minion
+ Minions.get {
+ it.fastFor { pos ->
+ pos.minions.fastFor { minion ->
+ val minionImp = minion as Minion
- minionImp.openInventories.fastFor { inventory ->
- inventory.viewers.fastFor { player ->
- player.closeInventory()
+ minionImp.openInventories.fastFor { inventory ->
+ inventory.viewers.fastFor { player ->
+ player.closeInventory()
+ }
}
}
}
diff --git a/common/src/main/kotlin/com/artillexstudios/axminions/cache/Caches.kt b/common/src/main/kotlin/com/artillexstudios/axminions/cache/Caches.kt
new file mode 100644
index 0000000..adc0192
--- /dev/null
+++ b/common/src/main/kotlin/com/artillexstudios/axminions/cache/Caches.kt
@@ -0,0 +1,21 @@
+package com.artillexstudios.axminions.cache
+
+import java.util.UUID
+import java.util.concurrent.ConcurrentHashMap
+import org.bukkit.World
+
+object Caches {
+ private val map = ConcurrentHashMap()
+
+ fun add(cache: ChunkCache) {
+ map[cache.world.uid] = cache
+ }
+
+ fun remove(world: World) {
+ map.remove(world.uid)
+ }
+
+ fun get(world: World): ChunkCache? {
+ return map[world.uid]
+ }
+}
\ No newline at end of file
diff --git a/common/src/main/kotlin/com/artillexstudios/axminions/cache/ChunkCache.kt b/common/src/main/kotlin/com/artillexstudios/axminions/cache/ChunkCache.kt
new file mode 100644
index 0000000..f625efc
--- /dev/null
+++ b/common/src/main/kotlin/com/artillexstudios/axminions/cache/ChunkCache.kt
@@ -0,0 +1,44 @@
+package com.artillexstudios.axminions.cache
+
+import com.artillexstudios.axminions.AxMinionsPlugin
+import java.util.concurrent.ConcurrentHashMap
+import me.kryniowesegryderiusz.kgenerators.Main
+import org.bukkit.Location
+import org.bukkit.World
+
+class ChunkCache(val world: World) {
+ private val map = ConcurrentHashMap>()
+
+ fun get(x: Int, y: Int, z: Int): Any {
+ val pos = ChunkLoc(x shr 4, z shr 4)
+ val layerMap = map[pos] ?: HashMap()
+ val layer = layerMap[y] ?: ChunkLayer()
+ layerMap[y] = layer
+
+ val worldBlock: Any
+ if (AxMinionsPlugin.integrations.kGeneratorsIntegration) {
+ val loc = Location(world, x.toDouble(), y.toDouble(), z.toDouble())
+ if (!Main.getPlacedGenerators().isChunkFullyLoaded(loc)) {
+ worldBlock = world.getBlockAt(x, y, z).type
+ } else {
+ val gen = Main.getPlacedGenerators().getLoaded(loc) ?: world.getBlockAt(x, y, z).type
+ worldBlock = gen
+ }
+ } else {
+ worldBlock = world.getBlockAt(x, y, z).type
+ }
+
+ val block = layer.get(x, z) ?: layer.set(x, z, worldBlock)
+ map[pos] = layerMap
+
+ return block
+ }
+
+ fun invalidate(x: Int, z: Int) {
+ map.remove(ChunkLoc(x, z))
+ }
+
+ fun update(x: Int, y: Int, z: Int) {
+ get(x, y, z)
+ }
+}
\ No newline at end of file
diff --git a/common/src/main/kotlin/com/artillexstudios/axminions/cache/ChunkLayer.kt b/common/src/main/kotlin/com/artillexstudios/axminions/cache/ChunkLayer.kt
new file mode 100644
index 0000000..2a2343b
--- /dev/null
+++ b/common/src/main/kotlin/com/artillexstudios/axminions/cache/ChunkLayer.kt
@@ -0,0 +1,20 @@
+package com.artillexstudios.axminions.cache
+
+import java.util.concurrent.ConcurrentHashMap
+
+class ChunkLayer {
+ private val map = ConcurrentHashMap()
+
+ fun set(x: Int, z: Int, to: Any): Any {
+ val key = (x shl 16) or z
+
+ map[key] = to
+ return to
+ }
+
+ fun get(x: Int, z: Int): Any? {
+ val key = (x shl 16) or z
+
+ return map[key]
+ }
+}
\ No newline at end of file
diff --git a/common/src/main/kotlin/com/artillexstudios/axminions/cache/ChunkLoc.kt b/common/src/main/kotlin/com/artillexstudios/axminions/cache/ChunkLoc.kt
new file mode 100644
index 0000000..1c283ab
--- /dev/null
+++ b/common/src/main/kotlin/com/artillexstudios/axminions/cache/ChunkLoc.kt
@@ -0,0 +1,21 @@
+package com.artillexstudios.axminions.cache
+
+@JvmRecord
+data class ChunkLoc(val x: Int, val z: Int) {
+
+ override fun equals(other: Any?): Boolean {
+ if (this === other) return true
+ if (other !is ChunkLoc) return false
+
+ if (x != other.x) return false
+ if (z != other.z) return false
+
+ return true
+ }
+
+ override fun hashCode(): Int {
+ var result = x
+ result = 31 * result + z
+ return result
+ }
+}
\ No newline at end of file
diff --git a/common/src/main/kotlin/com/artillexstudios/axminions/integrations/Integrations.kt b/common/src/main/kotlin/com/artillexstudios/axminions/integrations/Integrations.kt
index c60aa44..7a035e8 100644
--- a/common/src/main/kotlin/com/artillexstudios/axminions/integrations/Integrations.kt
+++ b/common/src/main/kotlin/com/artillexstudios/axminions/integrations/Integrations.kt
@@ -34,6 +34,7 @@ class Integrations : Integrations {
private var pricesIntegration: PricesIntegration? = null
private var economyIntegration: EconomyIntegration? = null
private val protectionIntegrations = com.artillexstudios.axminions.integrations.protection.ProtectionIntegrations()
+ internal var kGeneratorsIntegration = false
override fun getStackerIntegration(): StackerIntegration {
return stackerIntegration
@@ -94,7 +95,7 @@ class Integrations : Integrations {
}
"economyshopgui" -> {
- if (isPluginLoaded("EconomoyShopGUI")) {
+ if (isPluginLoaded("EconomyShopGUI")) {
register(EconomyShopGUIIntegration())
}
}
@@ -157,6 +158,12 @@ class Integrations : Integrations {
Bukkit.getConsoleSender()
.sendMessage(StringUtils.formatToString("<#33FF33>[AxMinions] Hooked into KingdomsX!"))
}
+
+ if (Bukkit.getPluginManager().getPlugin("KGenerators") != null) {
+ kGeneratorsIntegration = true
+ Bukkit.getConsoleSender()
+ .sendMessage(StringUtils.formatToString("<#33FF33>[AxMinions] Hooked into KGenerators!"))
+ }
}
override fun register(integration: Integration) {
diff --git a/common/src/main/kotlin/com/artillexstudios/axminions/integrations/economy/PlayerPointsIntegration.kt b/common/src/main/kotlin/com/artillexstudios/axminions/integrations/economy/PlayerPointsIntegration.kt
index e5419dd..d9e65cb 100644
--- a/common/src/main/kotlin/com/artillexstudios/axminions/integrations/economy/PlayerPointsIntegration.kt
+++ b/common/src/main/kotlin/com/artillexstudios/axminions/integrations/economy/PlayerPointsIntegration.kt
@@ -1,24 +1,24 @@
package com.artillexstudios.axminions.integrations.economy
import com.artillexstudios.axminions.api.integrations.types.EconomyIntegration
+import org.black_ixx.playerpoints.PlayerPoints
import org.bukkit.OfflinePlayer
-import org.bukkit.entity.Player
class PlayerPointsIntegration : EconomyIntegration {
override fun getBalance(player: OfflinePlayer): Double {
- TODO("Not yet implemented")
+ return PlayerPoints.getInstance().api.look(player.uniqueId).toDouble()
}
override fun giveBalance(player: OfflinePlayer, amount: Double) {
- TODO("Not yet implemented")
+ PlayerPoints.getInstance().api.give(player.uniqueId, amount.toInt())
}
override fun takeBalance(player: OfflinePlayer, amount: Double) {
- TODO("Not yet implemented")
+ PlayerPoints.getInstance().api.take(player.uniqueId, amount.toInt())
}
override fun register() {
- TODO("Not yet implemented")
+
}
}
\ No newline at end of file
diff --git a/common/src/main/kotlin/com/artillexstudios/axminions/integrations/protection/IridiumSkyBlockIntegration.kt b/common/src/main/kotlin/com/artillexstudios/axminions/integrations/protection/IridiumSkyBlockIntegration.kt
index e1d23e7..4147058 100644
--- a/common/src/main/kotlin/com/artillexstudios/axminions/integrations/protection/IridiumSkyBlockIntegration.kt
+++ b/common/src/main/kotlin/com/artillexstudios/axminions/integrations/protection/IridiumSkyBlockIntegration.kt
@@ -1,6 +1,7 @@
package com.artillexstudios.axminions.integrations.protection
import com.artillexstudios.axminions.api.integrations.types.ProtectionIntegration
+import com.iridium.iridiumskyblock.IridiumSkyblock
import com.iridium.iridiumskyblock.api.IridiumSkyblockAPI
import org.bukkit.Location
import org.bukkit.entity.Player
@@ -10,7 +11,7 @@ class IridiumSkyBlockIntegration : ProtectionIntegration {
override fun canBuildAt(player: Player, location: Location): Boolean {
val island = IridiumSkyblockAPI.getInstance().getIslandViaLocation(location)
- return island.map { IridiumSkyblockAPI.getInstance().getUser(player) in it.members }.orElse(true)
+ return island.map { IridiumSkyblockAPI.getInstance().getUser(player) in IridiumSkyblock.getInstance().teamManager.getMembersOnIsland(it) }.orElse(true) || IridiumSkyblockAPI.getInstance().getUser(player).isBypassing
}
override fun register() {
diff --git a/common/src/main/kotlin/com/artillexstudios/axminions/listeners/CacheListener.kt b/common/src/main/kotlin/com/artillexstudios/axminions/listeners/CacheListener.kt
new file mode 100644
index 0000000..ac62d52
--- /dev/null
+++ b/common/src/main/kotlin/com/artillexstudios/axminions/listeners/CacheListener.kt
@@ -0,0 +1,78 @@
+package com.artillexstudios.axminions.listeners
+
+import com.artillexstudios.axminions.cache.Caches
+import org.bukkit.event.EventHandler
+import org.bukkit.event.Listener
+import org.bukkit.event.block.BlockBreakEvent
+import org.bukkit.event.block.BlockBurnEvent
+import org.bukkit.event.block.BlockExplodeEvent
+import org.bukkit.event.block.BlockFadeEvent
+import org.bukkit.event.block.BlockFormEvent
+import org.bukkit.event.block.BlockFromToEvent
+import org.bukkit.event.block.BlockGrowEvent
+import org.bukkit.event.block.BlockPistonExtendEvent
+import org.bukkit.event.block.BlockPistonRetractEvent
+import org.bukkit.event.block.BlockPlaceEvent
+
+class CacheListener : Listener {
+
+ @EventHandler
+ fun onBlockBreakEvent(event: BlockBreakEvent) {
+ val block = event.block
+ Caches.get(block.world)?.update(block.x, block.y, block.z)
+ }
+
+ @EventHandler
+ fun onBlockPlaceEvent(event: BlockPlaceEvent) {
+ val block = event.block
+ Caches.get(block.world)?.update(block.x, block.y, block.z)
+ }
+
+ @EventHandler
+ fun onBlockFromToEvent(event: BlockFromToEvent) {
+ val block = event.block
+ Caches.get(block.world)?.update(block.x, block.y, block.z)
+ }
+
+ @EventHandler
+ fun onBlockBurnEvent(event: BlockBurnEvent) {
+ val block = event.block
+ Caches.get(block.world)?.update(block.x, block.y, block.z)
+ }
+
+ @EventHandler
+ fun onBlockExplodeEvent(event: BlockExplodeEvent) {
+ val block = event.block
+ Caches.get(block.world)?.update(block.x, block.y, block.z)
+ }
+
+ @EventHandler
+ fun onBlockFadeEvent(event: BlockFadeEvent) {
+ val block = event.block
+ Caches.get(block.world)?.update(block.x, block.y, block.z)
+ }
+
+ @EventHandler
+ fun onBlockFormEvent(event: BlockFormEvent) {
+ val block = event.block
+ Caches.get(block.world)?.update(block.x, block.y, block.z)
+ }
+
+ @EventHandler
+ fun onBlockGrowEvent(event: BlockGrowEvent) {
+ val block = event.block
+ Caches.get(block.world)?.update(block.x, block.y, block.z)
+ }
+
+ @EventHandler
+ fun onBlockPistonExtendEvent(event: BlockPistonExtendEvent) {
+ val block = event.block
+ Caches.get(block.world)?.update(block.x, block.y, block.z)
+ }
+
+ @EventHandler
+ fun onBlockPistonRetractEvent(event: BlockPistonRetractEvent) {
+ val block = event.block
+ Caches.get(block.world)?.update(block.x, block.y, block.z)
+ }
+}
\ No newline at end of file
diff --git a/common/src/main/kotlin/com/artillexstudios/axminions/listeners/ChunkListener.kt b/common/src/main/kotlin/com/artillexstudios/axminions/listeners/ChunkListener.kt
index a972c9b..7fdb181 100644
--- a/common/src/main/kotlin/com/artillexstudios/axminions/listeners/ChunkListener.kt
+++ b/common/src/main/kotlin/com/artillexstudios/axminions/listeners/ChunkListener.kt
@@ -1,5 +1,6 @@
package com.artillexstudios.axminions.listeners
+import com.artillexstudios.axminions.cache.Caches
import com.artillexstudios.axminions.minions.Minions
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
@@ -15,6 +16,9 @@ class ChunkListener : Listener {
@EventHandler
fun onChunkUnloadEvent(event: ChunkUnloadEvent) {
- Minions.removeTicking(event.chunk)
+ val chunk = event.chunk
+ Minions.removeTicking(chunk)
+
+ Caches.get(event.world)?.invalidate(chunk.x, chunk.z)
}
}
\ No newline at end of file
diff --git a/common/src/main/kotlin/com/artillexstudios/axminions/listeners/WorldListener.kt b/common/src/main/kotlin/com/artillexstudios/axminions/listeners/WorldListener.kt
index 1cd76c4..cc9ec5e 100644
--- a/common/src/main/kotlin/com/artillexstudios/axminions/listeners/WorldListener.kt
+++ b/common/src/main/kotlin/com/artillexstudios/axminions/listeners/WorldListener.kt
@@ -2,9 +2,12 @@ package com.artillexstudios.axminions.listeners
import com.artillexstudios.axminions.AxMinionsPlugin
import com.artillexstudios.axminions.api.minions.miniontype.MinionTypes
+import com.artillexstudios.axminions.cache.Caches
+import com.artillexstudios.axminions.cache.ChunkCache
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.world.WorldLoadEvent
+import org.bukkit.event.world.WorldUnloadEvent
class WorldListener : Listener {
@@ -13,5 +16,12 @@ class WorldListener : Listener {
AxMinionsPlugin.dataQueue.submit {
MinionTypes.loadForWorld(event.world)
}
+
+ Caches.add(ChunkCache(event.world))
+ }
+
+ @EventHandler
+ fun onWorldUnloadEvent(event: WorldUnloadEvent) {
+ Caches.remove(event.world)
}
}
\ No newline at end of file
diff --git a/common/src/main/kotlin/com/artillexstudios/axminions/minions/MinionTicker.kt b/common/src/main/kotlin/com/artillexstudios/axminions/minions/MinionTicker.kt
index d6b99b2..58bb3e7 100644
--- a/common/src/main/kotlin/com/artillexstudios/axminions/minions/MinionTicker.kt
+++ b/common/src/main/kotlin/com/artillexstudios/axminions/minions/MinionTicker.kt
@@ -7,9 +7,11 @@ object MinionTicker {
private var tick = 0L
private inline fun tickAll() {
- Minions.get().fastFor { pos ->
- pos.minions.fastFor {
- it.tick()
+ Minions.get { minions ->
+ minions.fastFor { pos ->
+ pos.minions.fastFor {
+ it.tick()
+ }
}
}
diff --git a/common/src/main/kotlin/com/artillexstudios/axminions/minions/Minions.kt b/common/src/main/kotlin/com/artillexstudios/axminions/minions/Minions.kt
index 624cc62..90518c5 100644
--- a/common/src/main/kotlin/com/artillexstudios/axminions/minions/Minions.kt
+++ b/common/src/main/kotlin/com/artillexstudios/axminions/minions/Minions.kt
@@ -1,7 +1,7 @@
package com.artillexstudios.axminions.minions
import com.artillexstudios.axminions.api.minions.Minion
-import com.artillexstudios.axminions.api.minions.utils.ChunkPos
+import com.artillexstudios.axminions.api.utils.ChunkPos
import java.util.Collections
import java.util.concurrent.locks.ReentrantReadWriteLock
import kotlin.concurrent.read
@@ -9,8 +9,8 @@ import kotlin.concurrent.write
import org.bukkit.Chunk
object Minions {
- private val lock = ReentrantReadWriteLock()
- private val minions = arrayListOf()
+ val lock = ReentrantReadWriteLock()
+ val minions = arrayListOf()
fun addTicking(chunk: Chunk) {
val chunkX = chunk.x
@@ -120,9 +120,9 @@ object Minions {
}
}
- internal fun get(): ArrayList {
+ internal inline fun get(use: (ArrayList) -> Unit) {
lock.read {
- return minions
+ use(minions)
}
}
diff --git a/common/src/main/kotlin/com/artillexstudios/axminions/minions/miniontype/FarmerMinionType.kt b/common/src/main/kotlin/com/artillexstudios/axminions/minions/miniontype/FarmerMinionType.kt
index 70b4f38..4d59502 100644
--- a/common/src/main/kotlin/com/artillexstudios/axminions/minions/miniontype/FarmerMinionType.kt
+++ b/common/src/main/kotlin/com/artillexstudios/axminions/minions/miniontype/FarmerMinionType.kt
@@ -7,6 +7,7 @@ import com.artillexstudios.axminions.api.utils.LocationUtils
import com.artillexstudios.axminions.api.utils.MinionUtils
import com.artillexstudios.axminions.api.utils.fastFor
import com.artillexstudios.axminions.api.warnings.Warnings
+import com.artillexstudios.axminions.cache.Caches
import com.artillexstudios.axminions.minions.MinionTicker
import kotlin.math.roundToInt
import org.bukkit.Material
@@ -53,12 +54,14 @@ class FarmerMinionType : MinionType("farmer", AxMinionsPlugin.INSTANCE.getResour
var size = 0
LocationUtils.getAllBlocksInRadius(minion.getLocation(), minion.getRange(), false).fastFor { location ->
- val block = location.block
+ val block = Caches.get(location.world!!)?.get(location.x.toInt(), location.y.toInt(), location.z.toInt())
+ if (block !is Material) return@fastFor
+ val locationBlock = location.block
val drops = arrayListOf()
- when (block.type) {
+ when (block) {
Material.CACTUS, Material.SUGAR_CANE, Material.BAMBOO -> {
- MinionUtils.getPlant(block).fastFor {
+ MinionUtils.getPlant(locationBlock).fastFor {
val blockDrops = it.getDrops(minion.getTool())
blockDrops.forEach { itemStack ->
size += itemStack.amount
@@ -69,36 +72,36 @@ class FarmerMinionType : MinionType("farmer", AxMinionsPlugin.INSTANCE.getResour
}
Material.MELON, Material.PUMPKIN -> {
- val blockDrops = block.getDrops(minion.getTool())
+ val blockDrops = locationBlock.getDrops(minion.getTool())
blockDrops.forEach { itemStack ->
size += itemStack.amount
}
drops.addAll(blockDrops)
- block.type = Material.AIR
+ locationBlock.type = Material.AIR
}
Material.COCOA_BEANS, Material.COCOA, Material.NETHER_WART, Material.WHEAT, Material.CARROTS, Material.BEETROOTS, Material.POTATOES -> {
- val ageable = block.blockData as Ageable
+ val ageable = locationBlock.blockData as Ageable
if (ageable.age != ageable.maximumAge) return@fastFor
- val blockDrops = block.getDrops(minion.getTool())
+ val blockDrops = locationBlock.getDrops(minion.getTool())
blockDrops.forEach { itemStack ->
size += itemStack.amount
}
drops.addAll(blockDrops)
ageable.age = 0
- block.blockData = ageable
+ locationBlock.blockData = ageable
}
Material.SWEET_BERRY_BUSH -> {
- val ageable = block.blockData as Ageable
+ val ageable = locationBlock.blockData as Ageable
if (ageable.age != ageable.maximumAge) return@fastFor
- val blockDrops = block.getDrops(minion.getTool())
+ val blockDrops = locationBlock.getDrops(minion.getTool())
blockDrops.forEach { itemStack ->
size += itemStack.amount
}
drops.addAll(blockDrops)
ageable.age = 1
- block.blockData = ageable
+ locationBlock.blockData = ageable
}
else -> return@fastFor
diff --git a/common/src/main/kotlin/com/artillexstudios/axminions/minions/miniontype/MinerMinionType.kt b/common/src/main/kotlin/com/artillexstudios/axminions/minions/miniontype/MinerMinionType.kt
index 734c70b..e8594c5 100644
--- a/common/src/main/kotlin/com/artillexstudios/axminions/minions/miniontype/MinerMinionType.kt
+++ b/common/src/main/kotlin/com/artillexstudios/axminions/minions/miniontype/MinerMinionType.kt
@@ -9,11 +9,14 @@ import com.artillexstudios.axminions.api.utils.LocationUtils
import com.artillexstudios.axminions.api.utils.MinionUtils
import com.artillexstudios.axminions.api.utils.fastFor
import com.artillexstudios.axminions.api.warnings.Warnings
+import com.artillexstudios.axminions.integrations.Integrations
import com.artillexstudios.axminions.minions.MinionTicker
import java.util.Locale
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
import kotlin.math.roundToInt
+import me.kryniowesegryderiusz.kgenerators.Main
+import me.kryniowesegryderiusz.kgenerators.api.KGeneratorsAPI
import org.bukkit.Material
import org.bukkit.block.BlockFace
import org.bukkit.enchantments.Enchantment
@@ -83,6 +86,16 @@ class MinerMinionType : MinionType("miner", AxMinionsPlugin.INSTANCE.getResource
asyncExecutor!!.execute {
LocationUtils.getAllBlocksInRadius(minion.getLocation(), minion.getRange(), false)
.fastFor { location ->
+ if (AxMinionsPlugin.integrations.kGeneratorsIntegration && Main.getPlacedGenerators().isChunkFullyLoaded(location)) {
+ val gen = Main.getPlacedGenerators().getLoaded(location)
+ val possible = gen?.isBlockPossibleToMine(location) ?: false
+
+ if (possible) {
+ gen?.scheduleGeneratorRegeneration()
+ return@fastFor
+ }
+ }
+
val isStoneGenerator = MinionUtils.isStoneGenerator(location)
if (isStoneGenerator) {
@@ -100,6 +113,16 @@ class MinerMinionType : MinionType("miner", AxMinionsPlugin.INSTANCE.getResource
} else {
LocationUtils.getAllBlocksInRadius(minion.getLocation(), minion.getRange(), false)
.fastFor { location ->
+ if (AxMinionsPlugin.integrations.kGeneratorsIntegration && Main.getPlacedGenerators().isChunkFullyLoaded(location)) {
+ val gen = Main.getPlacedGenerators().getLoaded(location)
+ val possible = gen?.isBlockPossibleToMine(location) ?: false
+
+ if (possible) {
+ gen?.scheduleGeneratorRegeneration()
+ return@fastFor
+ }
+ }
+
val isStoneGenerator = MinionUtils.isStoneGenerator(location)
if (isStoneGenerator) {
@@ -117,6 +140,16 @@ class MinerMinionType : MinionType("miner", AxMinionsPlugin.INSTANCE.getResource
"line" -> {
faces.fastFor {
LocationUtils.getAllBlocksFacing(minion.getLocation(), minion.getRange(), it).fastFor { location ->
+ if (AxMinionsPlugin.integrations.kGeneratorsIntegration && Main.getPlacedGenerators().isChunkFullyLoaded(location)) {
+ val gen = Main.getPlacedGenerators().getLoaded(location)
+ val possible = gen?.isBlockPossibleToMine(location) ?: false
+
+ if (possible) {
+ gen?.scheduleGeneratorRegeneration()
+ return@fastFor
+ }
+ }
+
val isStoneGenerator = MinionUtils.isStoneGenerator(location)
if (isStoneGenerator) {
@@ -134,6 +167,16 @@ class MinerMinionType : MinionType("miner", AxMinionsPlugin.INSTANCE.getResource
"face" -> {
LocationUtils.getAllBlocksFacing(minion.getLocation(), minion.getRange(), minion.getDirection().facing)
.fastFor { location ->
+ if (AxMinionsPlugin.integrations.kGeneratorsIntegration && Main.getPlacedGenerators().isChunkFullyLoaded(location)) {
+ val gen = Main.getPlacedGenerators().getLoaded(location)
+ val possible = gen?.isBlockPossibleToMine(location) ?: false
+
+ if (possible) {
+ gen?.scheduleGeneratorRegeneration()
+ return@fastFor
+ }
+ }
+
val isStoneGenerator = MinionUtils.isStoneGenerator(location)
if (isStoneGenerator) {
diff --git a/common/src/main/resources/plugin.yml b/common/src/main/resources/plugin.yml
index 4d77bce..d9fca32 100644
--- a/common/src/main/resources/plugin.yml
+++ b/common/src/main/resources/plugin.yml
@@ -18,4 +18,5 @@ softdepend:
- Lands
- SuperiorSkyBlock2
- WorldGuard
- - PlotSquared
\ No newline at end of file
+ - PlotSquared
+ - KGenerators
\ No newline at end of file
diff --git a/libs/AxAPI-1.0-SNAPSHOT.jar b/libs/AxAPI-1.0-SNAPSHOT.jar
deleted file mode 100644
index 723d197..0000000
Binary files a/libs/AxAPI-1.0-SNAPSHOT.jar and /dev/null differ
diff --git a/libs/IridiumSkyblock-3.2.12.jar b/libs/IridiumSkyblock-3.2.12.jar
deleted file mode 100644
index e461d88..0000000
Binary files a/libs/IridiumSkyblock-3.2.12.jar and /dev/null differ
diff --git a/nms/build.gradle b/nms/build.gradle
index 6d99e85..165c81a 100644
--- a/nms/build.gradle
+++ b/nms/build.gradle
@@ -1,5 +1,5 @@
plugins {
- id("io.papermc.paperweight.userdev") version "1.5.4" apply false
+ id("io.papermc.paperweight.userdev") version "1.5.10" apply false
}
group = "com.artillexstudios.axminions"
diff --git a/nms/libs/AxAPI-1.0-SNAPSHOT.jar b/nms/libs/AxAPI-1.0-SNAPSHOT.jar
deleted file mode 100644
index 723d197..0000000
Binary files a/nms/libs/AxAPI-1.0-SNAPSHOT.jar and /dev/null differ
diff --git a/nms/libs/CMI-API9.5.0.8.jar b/nms/libs/CMI-API9.5.0.8.jar
deleted file mode 100644
index bec562f..0000000
Binary files a/nms/libs/CMI-API9.5.0.8.jar and /dev/null differ
diff --git a/nms/libs/IridiumSkyblock-3.2.12.jar b/nms/libs/IridiumSkyblock-3.2.12.jar
deleted file mode 100644
index e461d88..0000000
Binary files a/nms/libs/IridiumSkyblock-3.2.12.jar and /dev/null differ
diff --git a/nms/libs/KingdomsX-1.16.12.jar b/nms/libs/KingdomsX-1.16.12.jar
deleted file mode 100644
index 60a33f9..0000000
Binary files a/nms/libs/KingdomsX-1.16.12.jar and /dev/null differ
diff --git a/settings.gradle b/settings.gradle
index a3e1cda..f009b1f 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -13,7 +13,6 @@ rootProject.name = 'AxMinions'
include 'api'
include 'common'
include 'nms'
-include 'nms:v1_19_R3'
include 'nms:v1_20_R1'
include 'nms:v1_20_R2'
include 'nms:v1_20_R3'