Skip to content

Commit

Permalink
Optimize RegionChunk ticking
Browse files Browse the repository at this point in the history
  • Loading branch information
NichtStudioCode committed Apr 29, 2024
1 parent 6e8f4f7 commit cfa01d2
Show file tree
Hide file tree
Showing 6 changed files with 218 additions and 140 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import xyz.xenondevs.nova.transformer.adapter.LcsWrapperAdapter
import xyz.xenondevs.nova.transformer.patch.FieldFilterPatch
import xyz.xenondevs.nova.transformer.patch.block.BlockUpdatesPatch
import xyz.xenondevs.nova.transformer.patch.bossbar.BossBarOriginPatch
import xyz.xenondevs.nova.transformer.patch.chunk.ChunkLoadSchedulingPatch
import xyz.xenondevs.nova.transformer.patch.chunk.ChunkSchedulingPatch
import xyz.xenondevs.nova.transformer.patch.item.AnvilResultPatch
import xyz.xenondevs.nova.transformer.patch.item.AttributePatch
import xyz.xenondevs.nova.transformer.patch.item.DamageablePatches
Expand Down Expand Up @@ -65,7 +65,7 @@ internal object Patcher {
WrapperBlockPatch, MappedRegistryPatch, FuelPatches, RemainingItemPatches, FireResistancePatches, SoundPatches,
BroadcastPacketPatch, CBFCompoundTagPatch, EventPreventionPatch, LegacyConversionPatch, WearablePatch,
NovaRuleTestPatch, BossBarOriginPatch, ThreadingDetectorPatch, FakePlayerLastHurtPatch, BlockUpdatesPatch,
ChunkLoadSchedulingPatch
ChunkSchedulingPatch
).filter(Transformer::shouldTransform).toSet()
}

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package xyz.xenondevs.nova.transformer.patch.chunk

import ca.spottedleaf.concurrentutil.executor.standard.PrioritisedExecutor
import io.papermc.paper.chunk.system.ChunkSystem
import io.papermc.paper.chunk.system.scheduling.ChunkTaskScheduler
import net.minecraft.world.level.chunk.ChunkStatus
import net.minecraft.world.level.chunk.LevelChunk
import xyz.xenondevs.bytebase.asm.buildInsnList
import xyz.xenondevs.bytebase.jvm.VirtualClassPath
import xyz.xenondevs.nova.transformer.MultiTransformer
import xyz.xenondevs.nova.util.reflection.ReflectionUtils
import xyz.xenondevs.nova.world.ChunkPos
import xyz.xenondevs.nova.world.format.WorldDataManager
import java.util.function.Consumer
import kotlin.reflect.KFunction

private val CHUNK_TASK_SCHEDULER_SCHEDULE_CHUNK_LOAD_METHOD = ReflectionUtils.getMethod(
ChunkTaskScheduler::class,
false,
"scheduleChunkLoad",
Int::class, Int::class, ChunkStatus::class, Boolean::class, PrioritisedExecutor.Priority::class, Consumer::class
)

internal object ChunkSchedulingPatch : MultiTransformer(ChunkTaskScheduler::class, ChunkSystem::class) {

override fun transform() {
VirtualClassPath[CHUNK_TASK_SCHEDULER_SCHEDULE_CHUNK_LOAD_METHOD]
.instructions.insert(buildInsnList {
addLabel()
aLoad(0)
iLoad(1)
iLoad(2)
invokeStatic(::handleScheduleChunkLoad)
})

fun insertEnableTicking(fn: KFunction<*>) =
VirtualClassPath[fn].instructions.insert(buildInsnList {
addLabel()
aLoad(0)
invokeStatic(::enableChunkTicking)
})

fun insertDisableTicking(fn: KFunction<*>) =
VirtualClassPath[fn].instructions.insert(buildInsnList {
addLabel()
aLoad(0)
invokeStatic(::disableChunkTicking)
})

insertEnableTicking(ChunkSystem::onChunkEntityTicking)
insertEnableTicking(ChunkSystem::onChunkTicking)
insertDisableTicking(ChunkSystem::onChunkNotTicking)
insertDisableTicking(ChunkSystem::onChunkNotEntityTicking)
}

@JvmStatic
fun handleScheduleChunkLoad(scheduler: ChunkTaskScheduler, x: Int, z: Int) {
WorldDataManager.loadAsync(ChunkPos(scheduler.world.uuid, x, z))
}

@JvmStatic
fun enableChunkTicking(chunk: LevelChunk) {
WorldDataManager.startTicking(ChunkPos(chunk.level.uuid, chunk.locX, chunk.locZ))
}

@JvmStatic
fun disableChunkTicking(chunk: LevelChunk) {
WorldDataManager.stopTicking(ChunkPos(chunk.level.uuid, chunk.locX, chunk.locZ))
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,14 @@ object WorldDataManager : Listener {
GlobalScope.launch { worlds.values.forEach { it.loadAsync(pos) } }
}

internal fun startTicking(pos: ChunkPos) {
runBlocking { getOrLoadChunk(pos).startTicking() }
}

internal fun stopTicking(pos: ChunkPos) {
runBlocking { getOrLoadChunk(pos).stopTicking() }
}

fun getBlockState(pos: BlockPos): NovaBlockState? =
runBlocking { getOrLoadChunk(pos.chunkPos).getBlockState(pos) }

Expand Down
Loading

0 comments on commit cfa01d2

Please sign in to comment.