mirror of
https://github.com/Artillex-Studios/AxMinions.git
synced 2024-11-26 12:15:57 +01:00
Try fixing minion placement - refactor Minions & ChunkPos
This commit is contained in:
parent
f34b153da2
commit
d37cda336f
@ -1,8 +1,28 @@
|
||||
package com.artillexstudios.axminions.api.minions.utils
|
||||
|
||||
data class ChunkPos(var x: Int, var z: Int) {
|
||||
import com.artillexstudios.axminions.api.minions.Minion
|
||||
import com.artillexstudios.axminions.api.utils.fastFor
|
||||
|
||||
fun clone(): ChunkPos {
|
||||
return ChunkPos(x, z)
|
||||
data class ChunkPos(var x: Int, var z: Int) {
|
||||
val minions = arrayListOf<Minion>()
|
||||
|
||||
fun addMinion(minion: Minion) {
|
||||
minions.add(minion)
|
||||
}
|
||||
|
||||
fun removeMinion(minion: Minion): Boolean {
|
||||
minions.remove(minion)
|
||||
|
||||
return minions.isEmpty()
|
||||
}
|
||||
|
||||
fun setTicking(ticking: Boolean) {
|
||||
minions.fastFor {
|
||||
it.setTicking(ticking)
|
||||
}
|
||||
}
|
||||
|
||||
override fun toString(): String {
|
||||
return "ChunkPos{x=$x,z=$z,minions=$minions}"
|
||||
}
|
||||
}
|
@ -1,6 +1,5 @@
|
||||
package com.artillexstudios.axminions.integrations.stacker
|
||||
|
||||
import com.artillexstudios.axminions.AxMinionsPlugin
|
||||
import com.artillexstudios.axminions.api.integrations.types.StackerIntegration
|
||||
import org.bukkit.Location
|
||||
import org.bukkit.entity.Item
|
||||
@ -22,6 +21,6 @@ class DefaultStackerIntegration : StackerIntegration {
|
||||
}
|
||||
|
||||
override fun register() {
|
||||
AxMinionsPlugin.integrations.register(this)
|
||||
|
||||
}
|
||||
}
|
@ -58,7 +58,6 @@ class MinionPlaceListener : Listener {
|
||||
minion.setLevel(level)
|
||||
minion.setActions(stats)
|
||||
minion.setTicking(true)
|
||||
Minions.addTicking(location.chunk)
|
||||
event.player.sendMessage("Placed minion $minion. Ticking? ${minion.isTicking()} Is chunk ticking? ${Minions.isTicking(location.chunk)}")
|
||||
AxMinionsPlugin.dataHandler.saveMinion(minion)
|
||||
}
|
||||
|
@ -115,7 +115,7 @@ class Minion(
|
||||
}
|
||||
|
||||
if (Config.DEBUG() && debugHologram != null) {
|
||||
debugHologram?.setLine(0, StringUtils.format("Ticking: $ticking Chunk ticking: ${Minions.isTicking(location.chunk)} CHUNK X: ${location.chunk.x} CHUNK Z: ${location.chunk.z}"))
|
||||
debugHologram?.setLine(0, StringUtils.format("Ticking: $ticking"))
|
||||
}
|
||||
|
||||
type.tick(this)
|
||||
|
@ -7,8 +7,8 @@ object MinionTicker {
|
||||
private var tick = 0L
|
||||
|
||||
private inline fun tickAll() {
|
||||
Minions.get().values.forEach { list ->
|
||||
list.fastFor {
|
||||
Minions.get().fastFor { pos ->
|
||||
pos.minions.fastFor {
|
||||
it.tick()
|
||||
}
|
||||
}
|
||||
|
@ -4,67 +4,102 @@ import com.artillexstudios.axminions.api.minions.Minion
|
||||
import com.artillexstudios.axminions.api.minions.utils.ChunkPos
|
||||
import com.artillexstudios.axminions.api.utils.fastFor
|
||||
import java.util.Collections
|
||||
import java.util.concurrent.ConcurrentHashMap
|
||||
import org.bukkit.Chunk
|
||||
|
||||
object Minions {
|
||||
private val minions = ConcurrentHashMap<ChunkPos, ArrayList<Minion>>()
|
||||
private val minions = arrayListOf<ChunkPos>()
|
||||
|
||||
fun addTicking(chunk: Chunk) {
|
||||
val pos = ChunkPos(chunk.x, chunk.z)
|
||||
val chunkX = chunk.x
|
||||
val chunkZ = chunk.z
|
||||
|
||||
minions[pos]?.fastFor {
|
||||
run breaking@ {
|
||||
minions.fastFor {
|
||||
if (it.x == chunkX && it.z == chunkZ) {
|
||||
it.setTicking(true)
|
||||
} ?: return
|
||||
println("LOADING CHUNK! X: ${chunk.x} Z: ${chunk.z}")
|
||||
return@breaking
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun isTicking(chunk: Chunk): Boolean {
|
||||
val pos = ChunkPos(chunk.x, chunk.z)
|
||||
val chunkX = chunk.x
|
||||
val chunkZ = chunk.z
|
||||
|
||||
return minions.contains(pos)
|
||||
minions.fastFor {
|
||||
if (it.x == chunkX && it.z == chunkZ) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
fun removeTicking(chunk: Chunk) {
|
||||
val pos = ChunkPos(chunk.x, chunk.z)
|
||||
|
||||
val minions = this.minions[pos] ?: return
|
||||
val chunkX = chunk.x
|
||||
val chunkZ = chunk.z
|
||||
|
||||
run breaking@ {
|
||||
minions.fastFor {
|
||||
if (it.x == chunkX && it.z == chunkZ) {
|
||||
it.setTicking(false)
|
||||
return@breaking
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun load(minion: Minion) {
|
||||
println("LOADING MINION!!")
|
||||
val chunkPos = ChunkPos(minion.getLocation().chunk.x, minion.getLocation().chunk.z)
|
||||
val pos = minions[chunkPos] ?: arrayListOf()
|
||||
val chunkX = round(minion.getLocation().x) shr 4
|
||||
val chunkZ = round(minion.getLocation().z) shr 4
|
||||
|
||||
pos.add(minion)
|
||||
minions[chunkPos] = pos
|
||||
var pos: ChunkPos? = null
|
||||
run breaking@ {
|
||||
minions.fastFor {
|
||||
if (it.x == chunkX && it.z == chunkZ) {
|
||||
pos = it
|
||||
return@breaking
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (pos === null) {
|
||||
pos = ChunkPos(chunkX, chunkZ)
|
||||
println("Adding new pos! $pos")
|
||||
minions.add(pos!!)
|
||||
}
|
||||
|
||||
pos!!.addMinion(minion)
|
||||
}
|
||||
|
||||
fun remove(minion: Minion) {
|
||||
val chunkPos = ChunkPos(minion.getLocation().chunk.x, minion.getLocation().chunk.z)
|
||||
val chunkX = round(minion.getLocation().x) shr 4
|
||||
val chunkZ = round(minion.getLocation().z) shr 4
|
||||
|
||||
val pos = minions[chunkPos] ?: return
|
||||
val iterator = minions.iterator()
|
||||
while (iterator.hasNext()) {
|
||||
val next = iterator.next()
|
||||
|
||||
pos.remove(minion)
|
||||
if (pos.isEmpty()) {
|
||||
minions.remove(chunkPos)
|
||||
if (next.x == chunkX && next.z == chunkZ) {
|
||||
if (next.removeMinion(minion)) {
|
||||
iterator.remove()
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun getMinions(): List<Minion> {
|
||||
val list = mutableListOf<Minion>()
|
||||
minions.forEach { (_, value) ->
|
||||
list.addAll(value)
|
||||
minions.fastFor {
|
||||
list.addAll(it.minions)
|
||||
}
|
||||
|
||||
return Collections.unmodifiableList(list)
|
||||
|
||||
}
|
||||
|
||||
internal fun get(): ConcurrentHashMap<ChunkPos, ArrayList<Minion>> {
|
||||
internal fun get(): ArrayList<ChunkPos> {
|
||||
return minions
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user