From 9d4a91805ac6d14498c84f6c41fca6048839ceac Mon Sep 17 00:00:00 2001 From: grzybeek Date: Wed, 6 Jul 2022 02:06:46 +0200 Subject: [PATCH] Fix spawning bosses on unloaded chunks, keep them loaded and remove afterwards Entity is no longer null, change not needed "?: return" --- .../com/willfp/ecobosses/bosses/BossUtils.kt | 2 +- .../com/willfp/ecobosses/bosses/EcoBoss.kt | 7 +++--- .../willfp/ecobosses/bosses/LivingEcoBoss.kt | 24 ++++++++++++------- .../com/willfp/ecobosses/bosses/TargetMode.kt | 2 +- .../ecobosses/lifecycle/ConsoleLoggers.kt | 8 +++---- .../ecobosses/lifecycle/LifecycleHandlers.kt | 4 ++-- .../willfp/ecobosses/tick/BossBarTicker.kt | 2 +- .../com/willfp/ecobosses/tick/ChunkTicker.kt | 23 ++++++++++++++++++ .../ecobosses/tick/DisplayNameTicker.kt | 2 +- .../willfp/ecobosses/tick/LifespanTicker.kt | 2 +- .../com/willfp/ecobosses/tick/TargetTicker.kt | 2 +- .../willfp/ecobosses/tick/TeleportHandler.kt | 2 +- 12 files changed, 55 insertions(+), 25 deletions(-) create mode 100644 eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/tick/ChunkTicker.kt diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/bosses/BossUtils.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/bosses/BossUtils.kt index 8f42bed..cc9d6d2 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/bosses/BossUtils.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/bosses/BossUtils.kt @@ -14,7 +14,7 @@ val Player.bossHolders: Iterable for (boss in Bosses.values()) { for (livingBoss in boss.getAllAlive()) { - val entity = livingBoss.entity ?: continue + val entity = livingBoss.entity if (entity.world != this.world) { continue diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/bosses/EcoBoss.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/bosses/EcoBoss.kt index f4c3bbd..9b5dd99 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/bosses/EcoBoss.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/bosses/EcoBoss.kt @@ -332,7 +332,7 @@ class EcoBoss( val boss = LivingEcoBoss( plugin, - mob.uniqueId, + mob, this, createTickers() ) @@ -345,7 +345,8 @@ class EcoBoss( LifespanTicker(), DisplayNameTicker(), TargetTicker(), - TeleportHandler() + TeleportHandler(), + ChunkTicker() ) if (isBossBarEnabled) { @@ -371,7 +372,7 @@ class EcoBoss( } fun processRewards(event: BossKillEvent) { - val entity = event.boss.entity ?: return + val entity = event.boss.entity val location = entity.location val player = event.killer diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/bosses/LivingEcoBoss.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/bosses/LivingEcoBoss.kt index d9aac00..262da08 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/bosses/LivingEcoBoss.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/bosses/LivingEcoBoss.kt @@ -2,13 +2,12 @@ package com.willfp.ecobosses.bosses import com.willfp.eco.core.EcoPlugin import com.willfp.ecobosses.tick.BossTicker -import org.bukkit.Bukkit +import org.bukkit.Chunk import org.bukkit.entity.Mob -import java.util.UUID class LivingEcoBoss( plugin: EcoPlugin, - private val uuid: UUID, + private val mob: Mob, val boss: EcoBoss, private val tickers: Set ) { @@ -18,15 +17,20 @@ class LivingEcoBoss( } }.apply { runTaskTimer(1, 1) } - val entity: Mob? - get() = Bukkit.getEntity(uuid) as? Mob + val entity: Mob + get() = mob + + val chunk: Chunk + get() = entity.location.chunk + + val forceLoadedChunks = mutableListOf() val deathTime = System.currentTimeMillis() + (boss.lifespan * 1000) private var currentTick = 1 // Start at 1 as 0 is divisible by everything private fun tick(): Boolean { - if (entity == null || entity?.isDead == true) { + if (entity.isDead) { remove() return true } @@ -40,13 +44,15 @@ class LivingEcoBoss( fun remove() { ticker.cancel() - entity?.remove() + entity.remove() tickers.forEach { it.onDeath(this, currentTick) } + forceLoadedChunks.forEach { it.isForceLoaded = false } + forceLoadedChunks.clear() - boss.markDead(uuid) + boss.markDead(mob.uniqueId) } override fun toString(): String { - return "LivingEcoBoss{boss=${boss}, uuid=${uuid}}" + return "LivingEcoBoss{boss=${boss}, uuid=${mob.uniqueId}}" } } diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/bosses/TargetMode.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/bosses/TargetMode.kt index 19c61a1..4dea6bf 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/bosses/TargetMode.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/bosses/TargetMode.kt @@ -17,7 +17,7 @@ class TargetMode( } fun getTarget(boss: LivingEcoBoss): LivingEntity? { - val entity = boss.entity ?: return null + val entity = boss.entity return function( entity.getNearbyEntities( diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/lifecycle/ConsoleLoggers.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/lifecycle/ConsoleLoggers.kt index ddfd484..9ce388f 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/lifecycle/ConsoleLoggers.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/lifecycle/ConsoleLoggers.kt @@ -34,8 +34,8 @@ class ConsoleLoggers( return } - val loc = event.boss.entity?.location - val location = "${loc?.world?.name}: ${loc?.x}, ${loc?.y}, ${loc?.z}" + val loc = event.boss.entity.location + val location = "${loc.world?.name}: ${loc.x}, ${loc.y}, ${loc.z}" plugin.logger.info("&a${event.boss.boss.id}&r was killed by &a${event.killer?.name}&r at &a$location") } @@ -48,8 +48,8 @@ class ConsoleLoggers( if (!plugin.configYml.getBool("log-spawn-kill")) { return } - val loc = event.boss.entity?.location - val location = "${loc?.world?.name}: ${loc?.x}, ${loc?.y}, ${loc?.z}" + val loc = event.boss.entity.location + val location = "${loc.world?.name}: ${loc.x}, ${loc.y}, ${loc.z}" plugin.logger.info("&a${event.boss.boss.id}&r despawned at &a$location") } diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/lifecycle/LifecycleHandlers.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/lifecycle/LifecycleHandlers.kt index d0d982c..61315d6 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/lifecycle/LifecycleHandlers.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/lifecycle/LifecycleHandlers.kt @@ -28,7 +28,7 @@ class LifecycleHandlers : Listener { priority = EventPriority.MONITOR ) fun handle(event: BossKillEvent) { - val entity = event.boss.entity ?: return + val entity = event.boss.entity event.boss.boss.handleLifecycle(BossLifecycle.KILL, entity.location, entity) } @@ -38,7 +38,7 @@ class LifecycleHandlers : Listener { priority = EventPriority.MONITOR ) fun handle(event: BossDespawnEvent) { - val entity = event.boss.entity ?: return + val entity = event.boss.entity event.boss.boss.handleLifecycle(BossLifecycle.DESPAWN, entity.location, entity) } diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/tick/BossBarTicker.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/tick/BossBarTicker.kt index 17e748d..5a46ff1 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/tick/BossBarTicker.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/tick/BossBarTicker.kt @@ -12,7 +12,7 @@ class BossBarTicker( private val bar: BossBar ) : BossTicker { override fun tick(boss: LivingEcoBoss, tick: Int) { - val entity = boss.entity ?: return + val entity = boss.entity bar.name(entity.customName!!.toComponent()) bar.progress((entity.health / entity.getAttribute(Attribute.GENERIC_MAX_HEALTH)!!.value).toFloat()) diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/tick/ChunkTicker.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/tick/ChunkTicker.kt new file mode 100644 index 0000000..e11a6d4 --- /dev/null +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/tick/ChunkTicker.kt @@ -0,0 +1,23 @@ +package com.willfp.ecobosses.tick + +import com.willfp.ecobosses.bosses.LivingEcoBoss + +class ChunkTicker() : BossTicker { + + override fun tick(boss: LivingEcoBoss, tick: Int) { + val currentChunk = boss.chunk + + if (tick % 10 != 0) { + return + } + + if (currentChunk.isLoaded && currentChunk.isForceLoaded) { + return; + } + + currentChunk.load() + currentChunk.isForceLoaded = true + boss.forceLoadedChunks.add(currentChunk) + } + +} \ No newline at end of file diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/tick/DisplayNameTicker.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/tick/DisplayNameTicker.kt index d5daf0c..17c21f6 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/tick/DisplayNameTicker.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/tick/DisplayNameTicker.kt @@ -7,7 +7,7 @@ import kotlin.math.ceil class DisplayNameTicker : BossTicker { override fun tick(boss: LivingEcoBoss, tick: Int) { - val entity = boss.entity ?: return + val entity = boss.entity val timeLeft = ceil( (boss.deathTime - System.currentTimeMillis()) / 1000.0 diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/tick/LifespanTicker.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/tick/LifespanTicker.kt index 45ce55e..9eebf7b 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/tick/LifespanTicker.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/tick/LifespanTicker.kt @@ -16,7 +16,7 @@ class LifespanTicker : BossTicker { boss.remove() boss.boss.handleLifecycle( BossLifecycle.DESPAWN, - boss.entity?.location ?: return, + boss.entity.location, boss.entity ) } diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/tick/TargetTicker.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/tick/TargetTicker.kt index e26ad1e..1cbf94b 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/tick/TargetTicker.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/tick/TargetTicker.kt @@ -4,7 +4,7 @@ import com.willfp.ecobosses.bosses.LivingEcoBoss class TargetTicker : BossTicker { override fun tick(boss: LivingEcoBoss, tick: Int) { - val entity = boss.entity ?: return + val entity = boss.entity if (tick % 10 != 0) { return diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/tick/TeleportHandler.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/tick/TeleportHandler.kt index c4ae83c..bc7ea0a 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/tick/TeleportHandler.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/tick/TeleportHandler.kt @@ -7,7 +7,7 @@ import org.bukkit.block.BlockFace class TeleportHandler : BossTicker { override fun tick(boss: LivingEcoBoss, tick: Int) { - val entity = boss.entity ?: return + val entity = boss.entity if (!boss.boss.canTeleport) { return }