mirror of
https://github.com/GayPizzaSpecifications/foundation.git
synced 2025-08-03 21:41:32 +00:00
Gjallarhorn: Start support for player position changelogs and rename replay-block-log to block-changes
This commit is contained in:
@ -24,7 +24,7 @@ import java.util.concurrent.ConcurrentHashMap
|
||||
import java.util.concurrent.ScheduledThreadPoolExecutor
|
||||
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 exactTimeAsString by option("--time", help = "Replay Time")
|
||||
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 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() {
|
||||
if (timelapseMode != null) {
|
||||
@ -72,9 +72,9 @@ class BlockLogReplay : CliktCommand("Replay Block Logs", name = "replay-block-lo
|
||||
}
|
||||
logger.info("State Tracking Completed")
|
||||
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 globalBlockMax = BlockCoordinate.maxOf(allBlockMaxes.asSequence())
|
||||
val globalBlockMax = BlockCoordinate.maxOf(allBlockMaxes)
|
||||
val globalBlockExpanse = BlockExpanse.offsetAndMax(globalBlockOffset, globalBlockMax)
|
||||
|
||||
logger.info("Calculations Completed")
|
@ -1,12 +1,12 @@
|
||||
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.PlayerSessionExport
|
||||
import com.github.ajalt.clikt.core.subcommands
|
||||
|
||||
fun main(args: Array<String>) = GjallarhornCommand().subcommands(
|
||||
BlockLogReplay(),
|
||||
BlockChangeCommand(),
|
||||
PlayerSessionExport(),
|
||||
PlayerPositionExport()
|
||||
).main(args)
|
||||
|
@ -26,7 +26,7 @@ data class BlockCoordinate(
|
||||
companion object {
|
||||
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 y = coordinates.maxOf { it.y }
|
||||
val z = coordinates.maxOf { it.z }
|
||||
|
@ -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
|
||||
)
|
@ -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)
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user