Gjallarhorn: Start support for player position changelogs and rename replay-block-log to block-changes

This commit is contained in:
Kenneth Endfinger
2022-01-08 02:40:09 -05:00
parent d54f434805
commit 8ea1ea1540
5 changed files with 50 additions and 7 deletions

View File

@ -24,7 +24,7 @@ import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.ScheduledThreadPoolExecutor import java.util.concurrent.ScheduledThreadPoolExecutor
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
class BlockLogReplay : CliktCommand("Replay Block Logs", name = "replay-block-log") { class BlockChangeCommand : CliktCommand("Block Changes", name = "block-changes") {
private val db by requireObject<Database>() private val db by requireObject<Database>()
private val exactTimeAsString by option("--time", help = "Replay Time") private val exactTimeAsString by option("--time", help = "Replay Time")
private val timelapseMode by option("--timelapse", help = "Timelapse Mode").enum<TimelapseMode> { it.id } private val timelapseMode by option("--timelapse", help = "Timelapse Mode").enum<TimelapseMode> { it.id }
@ -36,7 +36,7 @@ class BlockLogReplay : CliktCommand("Replay Block Logs", name = "replay-block-lo
private val fromCoordinate by option("--trim-from", help = "Trim From Coordinate") private val fromCoordinate by option("--trim-from", help = "Trim From Coordinate")
private val toCoordinate by option("--trim-to", help = "Trim To Coordinate") private val toCoordinate by option("--trim-to", help = "Trim To Coordinate")
private val logger = LoggerFactory.getLogger(BlockLogReplay::class.java) private val logger = LoggerFactory.getLogger(BlockChangeCommand::class.java)
override fun run() { override fun run() {
if (timelapseMode != null) { if (timelapseMode != null) {
@ -72,9 +72,9 @@ class BlockLogReplay : CliktCommand("Replay Block Logs", name = "replay-block-lo
} }
logger.info("State Tracking Completed") logger.info("State Tracking Completed")
val allBlockOffsets = trackers.map { it.value.calculateZeroBlockOffset() } val allBlockOffsets = trackers.map { it.value.calculateZeroBlockOffset() }
val globalBlockOffset = BlockCoordinate.maxOf(allBlockOffsets.asSequence()) val globalBlockOffset = BlockCoordinate.maxOf(allBlockOffsets)
val allBlockMaxes = trackers.map { it.value.calculateMaxBlock() } val allBlockMaxes = trackers.map { it.value.calculateMaxBlock() }
val globalBlockMax = BlockCoordinate.maxOf(allBlockMaxes.asSequence()) val globalBlockMax = BlockCoordinate.maxOf(allBlockMaxes)
val globalBlockExpanse = BlockExpanse.offsetAndMax(globalBlockOffset, globalBlockMax) val globalBlockExpanse = BlockExpanse.offsetAndMax(globalBlockOffset, globalBlockMax)
logger.info("Calculations Completed") logger.info("Calculations Completed")

View File

@ -1,12 +1,12 @@
package cloud.kubelet.foundation.gjallarhorn package cloud.kubelet.foundation.gjallarhorn
import cloud.kubelet.foundation.gjallarhorn.commands.BlockLogReplay import cloud.kubelet.foundation.gjallarhorn.commands.BlockChangeCommand
import cloud.kubelet.foundation.gjallarhorn.commands.PlayerPositionExport import cloud.kubelet.foundation.gjallarhorn.commands.PlayerPositionExport
import cloud.kubelet.foundation.gjallarhorn.commands.PlayerSessionExport import cloud.kubelet.foundation.gjallarhorn.commands.PlayerSessionExport
import com.github.ajalt.clikt.core.subcommands import com.github.ajalt.clikt.core.subcommands
fun main(args: Array<String>) = GjallarhornCommand().subcommands( fun main(args: Array<String>) = GjallarhornCommand().subcommands(
BlockLogReplay(), BlockChangeCommand(),
PlayerSessionExport(), PlayerSessionExport(),
PlayerPositionExport() PlayerPositionExport()
).main(args) ).main(args)

View File

@ -26,7 +26,7 @@ data class BlockCoordinate(
companion object { companion object {
val zero = BlockCoordinate(0, 0, 0) val zero = BlockCoordinate(0, 0, 0)
fun maxOf(coordinates: Sequence<BlockCoordinate>): BlockCoordinate { fun maxOf(coordinates: List<BlockCoordinate>): BlockCoordinate {
val x = coordinates.maxOf { it.x } val x = coordinates.maxOf { it.x }
val y = coordinates.maxOf { it.y } val y = coordinates.maxOf { it.y }
val z = coordinates.maxOf { it.z } val z = coordinates.maxOf { it.z }

View File

@ -0,0 +1,15 @@
package cloud.kubelet.foundation.gjallarhorn.state
import java.time.Instant
import java.util.*
data class PlayerPositionChange(
val time: Instant,
val player: UUID,
val world: UUID,
val x: Double,
val y: Double,
val z: Double,
val pitch: Double,
val yaw: Double
)

View File

@ -0,0 +1,28 @@
package cloud.kubelet.foundation.gjallarhorn.state
import cloud.kubelet.foundation.heimdall.table.PlayerPositionTable
import org.jetbrains.exposed.sql.Database
import org.jetbrains.exposed.sql.Op
import org.jetbrains.exposed.sql.select
import org.jetbrains.exposed.sql.transactions.transaction
class PlayerPositionChangelog(
val changes: List<PlayerPositionChange>
) {
companion object {
fun query(db: Database, filter: Op<Boolean> = Op.TRUE): PlayerPositionChangelog = transaction(db) {
PlayerPositionChangelog(PlayerPositionTable.select(filter).orderBy(PlayerPositionTable.time).map { row ->
val time = row[PlayerPositionTable.time]
val player = row[PlayerPositionTable.player]
val world = row[PlayerPositionTable.world]
val x = row[PlayerPositionTable.x]
val y = row[PlayerPositionTable.y]
val z = row[PlayerPositionTable.z]
val pitch = row[PlayerPositionTable.z]
val yaw = row[PlayerPositionTable.z]
PlayerPositionChange(time, player, world, x, y, z, pitch, yaw)
})
}
}
}