Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
@file:Suppress("UnstableApiUsage")

import org.gradle.kotlin.dsl.modImplementation
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

Expand Down Expand Up @@ -92,6 +91,7 @@ compactingResources {

configureTask(tasks.named<AbstractCopyTask>("processResources").get())
compactToArray("rooms")
compactToArray("secrets")
}

ksp {
Expand All @@ -111,6 +111,10 @@ tasks.withType<JavaCompile>().configureEach {

tasks.withType<KotlinCompile>().configureEach {
compilerOptions.jvmTarget.set(JvmTarget.JVM_21)
compilerOptions.freeCompilerArgs.addAll(
"-Xcontext-sensitive-resolution",
"-Xcontext-parameters"
)
compilerOptions.optIn.add("kotlin.time.ExperimentalTime")
}

Expand Down
1 change: 1 addition & 0 deletions gradle.properties
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
kotlin.code.style=official
org.gradle.configuration-cache=true
org.gradle.jvmargs=-Xmx4G
ksp.incremental=false

Expand Down
14 changes: 7 additions & 7 deletions src/main/kotlin/me/owdding/mortem/config/ConfigManager.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import com.teamresourceful.resourcefulconfig.api.loader.Configurator
import me.owdding.ktmodules.Module
import me.owdding.lib.overlays.EditOverlaysScreen
import me.owdding.mortem.Mortem
import me.owdding.mortem.core.event.MortemRegisterCommandsEvent
import tech.thatgravyboat.skyblockapi.api.events.base.Subscription
import tech.thatgravyboat.skyblockapi.api.events.misc.RegisterCommandsEvent
import tech.thatgravyboat.skyblockapi.helpers.McClient
Expand All @@ -19,13 +20,12 @@ object ConfigManager {
fun openConfig() = McClient.setScreenAsync { ResourcefulConfigScreen.getFactory(Mortem.MOD_ID).apply(null) }

@Subscription
fun onCommand(event: RegisterCommandsEvent) {
event.register("mortem") {
thenCallback("overlays") {
McClient.setScreenAsync { EditOverlaysScreen(Mortem.MOD_ID) }
}

callback { openConfig() }
fun onCommand(event: MortemRegisterCommandsEvent) {
event.registerBaseCallback {
openConfig()
}
event.registerWithCallback("overlays") {
McClient.setScreenAsync { EditOverlaysScreen(Mortem.MOD_ID) }
}
}
}
40 changes: 22 additions & 18 deletions src/main/kotlin/me/owdding/mortem/core/catacombs/Catacomb.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,20 @@ import me.owdding.mortem.core.Instance
import me.owdding.mortem.core.InstanceType
import me.owdding.mortem.core.catacombs.nodes.CatacombNodeType
import me.owdding.mortem.core.catacombs.nodes.CatacombsNode
import me.owdding.mortem.core.catacombs.nodes.RoomNode
import me.owdding.mortem.core.event.catacomb.CatacombNodeChangeEvent
import me.owdding.mortem.core.event.catacomb.CatacombRoomChangeEvent
import me.owdding.mortem.utils.Utils
import me.owdding.mortem.utils.Utils.post
import me.owdding.mortem.utils.Utils.unsafeCast
import net.minecraft.core.Direction
import org.joml.Vector2i
import org.joml.minus
import org.joml.plus
import tech.thatgravyboat.skyblockapi.api.area.dungeon.DungeonFloor
import tech.thatgravyboat.skyblockapi.helpers.McPlayer
import tech.thatgravyboat.skyblockapi.utils.extentions.filterValuesNotNull
import java.util.concurrent.ConcurrentHashMap
import me.owdding.mortem.core.catacombs.nodes.RoomNode
import me.owdding.mortem.core.event.catacomb.CatacombNodeChangeEvent
import me.owdding.mortem.core.event.catacomb.CatacombRoomChangeEvent
import me.owdding.mortem.utils.Utils.post
import tech.thatgravyboat.skyblockapi.helpers.McPlayer

data class Catacomb(
val floor: DungeonFloor,
Expand All @@ -40,6 +40,8 @@ data class Catacomb(

val grid: MutableMap<Vector2i, CatacombsNode<*>> = ConcurrentHashMap()

operator fun get(position: Vector2i): CatacombsNode<*>? = grid[position]

fun <T : CatacombsNode<T>> getOrCreateNode(position: Vector2i, type: CatacombNodeType<T>) : T = grid.getOrPut(position, type.constructor).unsafeCast()

inline fun <reified T : CatacombsNode<T>> getNeighbours(position: Vector2i): Map<Vector2i, T> = buildList {
Expand Down Expand Up @@ -72,18 +74,20 @@ fun interface CatacombsColorProvider {
fun getColor(): Int
}

enum class CatacombRoomType(val provider: CatacombsColorProvider) : CatacombsColorProvider by provider {
NORMAL({ 0xAb6b00 }),
TRAP({ 0xFF7F0F }),
FAIRY({ 0xF080FF }),
PUZZLE({ 0xe050F0 }),
MINIBOSS({ 0xFFFF00 }),
BLOOD({ 0xFF0000 }),
START({ 0x00FF00 }),
UNKNOWN({ 0xababab }),
DEFAULT({ 0x000000 }),
enum class CatacombRoomType(provider: CatacombsColorProvider) : CatacombsColorProvider by provider {
NORMAL(0xAb6b00),
TRAP(0xFF7F0F),
FAIRY(0xF080FF),
PUZZLE(0xe050F0),
MINIBOSS(0xFFFF00),
BLOOD(0xFF0000),
START(0x00FF00),
UNKNOWN(0xababab),
DEFAULT(0x000000),
;

constructor(color: Int) : this({ color })

companion object {
fun getByColor(color: CatacombMapColor): CatacombRoomType? = when (color) {
CatacombMapColor.COMPLETE -> START
Expand All @@ -101,14 +105,14 @@ enum class CatacombRoomType(val provider: CatacombsColorProvider) : CatacombsCol
}

enum class CatacombDoorType(val provider: CatacombsColorProvider) : CatacombsColorProvider by provider {
WITHER({ 0x4f4f4f }),
WITHER({ 0x000000 }),
BLOOD({ 0xFF0000 }),
NORMAL({ 0xab6b00 }),
TRAP({ 0xff7f0f }),
MINIBOSS({ 0xFFFF00 }),
PUZZLE({ 0xe060f0 }),
FAIRY({ 0xf080ff }),
DEFAULT({ 0x000000 }),
DEFAULT({ 0x4f4f4f }),
;

companion object {
Expand All @@ -130,7 +134,7 @@ enum class CatacombDoorType(val provider: CatacombsColorProvider) : CatacombsCol
data class StoredCatacombRoom(
var name: String,
var id: String,
var secrets: Int,
var secrets: Int = 0,
@FieldName("center") val centerHash: String,
@FieldName("directions") val directionalHashes: Map<String, Direction>,
@FieldName("extra_rotation_handling") val extraRotationHandling: Boolean = false,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
package me.owdding.mortem.core.catacombs

const val DOOR_WIDTH: Int = 4
const val WITHER_ESSENCE = "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzRkYjRhZGZhOWJmNDhmZjVkNDE3MDdhZTM0ZWE3OGJkMjM3MTY1OWZjZDhjZDg5MzQ3NDlhZjRjY2U5YiJ9fX0="
const val REDSTONE_KEY = "TODO"
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,12 @@ import me.owdding.mortem.core.catacombs.roommatching.CatacombMapMatcher
import me.owdding.mortem.core.catacombs.roommatching.CatacombWorldMatcher
import me.owdding.mortem.core.event.CatacombJoinEvent
import me.owdding.mortem.core.event.CatacombLeaveEvent
import me.owdding.mortem.core.event.MortemRegisterCommandsEvent
import me.owdding.mortem.core.event.catacomb.CatacombNodeChangeEvent
import me.owdding.mortem.core.event.catacomb.CatacombRoomChangeEvent
import me.owdding.mortem.generated.CodecUtils
import me.owdding.mortem.generated.MortemCodecs
import me.owdding.mortem.utils.CommandExceptions.getCatacomb
import me.owdding.mortem.utils.Utils
import me.owdding.mortem.utils.Utils.post
import me.owdding.mortem.utils.colors.CatppuccinColors
Expand All @@ -28,7 +32,6 @@ import tech.thatgravyboat.skyblockapi.api.events.dungeon.DungeonEnterEvent
import tech.thatgravyboat.skyblockapi.api.events.hypixel.ServerChangeEvent
import tech.thatgravyboat.skyblockapi.api.events.level.PacketReceivedEvent
import tech.thatgravyboat.skyblockapi.api.events.location.ServerDisconnectEvent
import tech.thatgravyboat.skyblockapi.api.events.misc.RegisterCommandsEvent
import tech.thatgravyboat.skyblockapi.api.events.time.TickEvent
import tech.thatgravyboat.skyblockapi.api.location.SkyBlockIsland
import tech.thatgravyboat.skyblockapi.helpers.McClient
Expand All @@ -43,9 +46,6 @@ import java.nio.file.Path
import kotlin.io.path.createDirectories
import kotlin.io.path.writeText
import kotlin.math.abs
import kotlin.math.floor
import me.owdding.mortem.core.event.catacomb.CatacombNodeChangeEvent
import me.owdding.mortem.core.event.catacomb.CatacombRoomChangeEvent

@Module
object CatacombsManager {
Expand Down Expand Up @@ -239,8 +239,12 @@ object CatacombsManager {


@Subscription
fun command(event: RegisterCommandsEvent) {
event.registerWithCallback("mortem dev column_hash") {
fun command(event: MortemRegisterCommandsEvent) {
event.registerWithCallback("dev copy grid") {
McClient.clipboard = getCatacomb().grid.toString()
Text.of("Copied catacomb grid to clipboard!").sendWithPrefix()
}
event.registerWithCallback("dev column_hash") {
val chunkPos = McPlayer.self!!.chunkPosition()
val chunk = McLevel.self.getChunk(chunkPos.x, chunkPos.z)
val hash = CatacombWorldMatcher.hashColumn(chunk, McPlayer.self!!.blockPosition().atY(255))
Expand All @@ -258,7 +262,7 @@ object CatacombsManager {
append(" ")
append(coordinate.z().shorten(2)) { color = CatppuccinColors.Mocha.blue }
}
event.registerWithCallback("mortem dev room_pos") {
event.registerWithCallback("dev room_pos") {
val catacomb = catacomb ?: return@registerWithCallback
val playerNode = catacomb.grid[worldPosToGridPos(McPlayer.self!!.blockPosition())]
if (playerNode !is RoomNode) {
Expand All @@ -272,7 +276,7 @@ object CatacombsManager {
append(format(roomPos))
}.sendWithPrefix()
}
event.registerWithCallback("mortem dev room_pos_test") {
event.registerWithCallback("dev room_pos_test") {
val catacomb = catacomb ?: return@registerWithCallback
val playerNode = catacomb.grid[worldPosToGridPos(McPlayer.self!!.blockPosition())]
val pos = McPlayer.position!!.toVector3dc()
Expand Down Expand Up @@ -323,8 +327,8 @@ object CatacombsManager {
}

fun worldPosToGridPos(pos: BlockPos): Vector2i {
val chunkX = floor(pos.x / 16f).toInt()
val chunkY = floor(pos.z / 16f).toInt()
val chunkX = pos.x shr 4
val chunkY = pos.z shr 4
val chunkRelativeX = pos.x and 15
val chunkRelativeY = pos.z and 15

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,9 @@ import me.owdding.mortem.core.catacombs.CatacombsColorProvider
import me.owdding.mortem.core.catacombs.StoredCatacombRoom
import me.owdding.mortem.utils.Utils
import me.owdding.mortem.utils.extensions.mutableCopy
import me.owdding.mortem.utils.extensions.sendWithPrefix
import me.owdding.mortem.utils.extensions.toVec2d
import net.minecraft.world.level.block.Rotation
import org.joml.Vector2i
import org.joml.Vector3d
import org.joml.Vector3dc
import org.joml.Vector3i
import org.joml.Vector3ic
import org.joml.component1
import org.joml.component2
import tech.thatgravyboat.skyblockapi.utils.text.Text
import org.joml.*
import kotlin.math.max
import kotlin.math.min

Expand Down Expand Up @@ -45,7 +37,7 @@ object VoidNode : CatacombsNode<VoidNode>(CatacombNodeType.Void, 0) {
class DoorNode(
var doorType: CatacombDoorType = CatacombDoorType.DEFAULT,
) : CatacombsNode<DoorNode>(CatacombNodeType.Door, 10) {
override fun toString() = "Door"
override fun toString() = "Door[type=$doorType]"
fun mutateType(type: CatacombDoorType) {
doorType = when (doorType) {
CatacombDoorType.DEFAULT -> type
Expand All @@ -63,6 +55,7 @@ class RoomNode(
val positions: MutableSet<Vector2i> = mutableSetOf()
var backingData: StoredCatacombRoom? = null
var rotation: Rotation? = null
var secrets: Int = 0 // TODO: implement

override fun toString() = "Room[type=$roomType]"
fun addPosition(position: Vector2i) {
Expand Down Expand Up @@ -114,7 +107,7 @@ class RoomNode(
else -> null
}
}
}
}?.mutableCopy()
}

fun minMiddleChunkPos(): Vector2i = Vector2i(
Expand All @@ -134,7 +127,6 @@ class RoomNode(

fun worldToRoom(vec3d: Vector3dc): Vector3dc {
val origin = getCenter().toVec2d().add(0.5, 0.5)
Text.of(origin.toString()).sendWithPrefix()
val original = vec3d.mutableCopy().sub(origin.x, 0.0, origin.y)
return when (rotation) {
Rotation.CLOCKWISE_90 -> Vector3d(original.z(), original.y(), -original.x())
Expand Down Expand Up @@ -163,7 +155,6 @@ class RoomNode(
else -> vec3i.mutableCopy()
}
val origin = getCenter()
Text.of(origin.toString()).sendWithPrefix()
return room.add(origin.x, 0, origin.y)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,15 +129,15 @@ object CatacombMapMatcher : MortemOverlay {
CatacombWorldMatcher.matchData(rooms)
}

fun Catacomb.mergeNodes(position: Vector2i, oneOffset: Vector2i, twoOffset: Vector2i) {
fun Catacomb.mergeNodes(position: Vector2i, oneOffset: Vector2ic, twoOffset: Vector2ic) {
val room = getOrCreateNode(position - twoOffset, CatacombNodeType.Room)
grid[position] = room
grid[position - oneOffset] = room
room.addPosition(position.copy() / 2)
}

override val name: Component = Text.of("Debug")
override val position: Position = ConfigPosition(0, 0)
override val position: Position = ConfigPosition(-300, 0)
override val bounds: Pair<Int, Int> = 20 to 20

override fun render(graphics: GuiGraphics, mouseX: Int, mouseY: Int) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package me.owdding.mortem.core.catacombs.secrets

import com.mojang.serialization.Codec
import me.owdding.ktcodecs.Compact
import me.owdding.ktcodecs.FieldName
import me.owdding.ktcodecs.GenerateCodec
import me.owdding.ktcodecs.IncludedCodec
import me.owdding.mortem.generated.CodecUtils
import me.owdding.mortem.generated.MortemCodecs

@GenerateCodec
data class CatacombsSecretRoom(
val id: String,
@Compact @FieldName("secret_groups") val secretGroups: MutableList<CatacombsSecretGroup> = mutableListOf(),
) {
fun markDirty() {
needsUpdate = true
}
var needsUpdate = true
fun addSecret(secret: CatacombsSecret) {
removeSecret(secret)
secretGroups.add(CatacombsSecretGroup(secret))
markDirty()
}
fun removeSecret(secret: CatacombsSecret) {
secretGroups.forEach { it.secrets.remove(secret) }
removeEmpty()
markDirty()
}
fun replaceSecret(old: CatacombsSecret, new: CatacombsSecret) {
secretGroups.forEach { it.replaceSecret(old, new) }
markDirty()
}

private fun removeEmpty() = secretGroups.removeIf { it.secrets.isEmpty() }
fun reset() = secretGroups.forEach(CatacombsSecretGroup::reset)
}

data class CatacombsSecretGroup(
val secrets: MutableList<CatacombsSecret> = mutableListOf(),
) {
constructor(secret: CatacombsSecret) : this(mutableListOf(secret))
fun replaceSecret(old: CatacombsSecret, new: CatacombsSecret) {
val index = secrets.indexOf(old)
if (index != -1) secrets[index] = new
}

val clicked: Boolean get() {
val actualSecrets = secrets.filter { it.type.isSecret }
if (actualSecrets.isEmpty()) return false
return actualSecrets.all { it.clicked }
}
fun reset() = secrets.forEach(CatacombsSecret::reset)

companion object {
@IncludedCodec
val CODEC: Codec<CatacombsSecretGroup> =
CodecUtils.compactMutableList(MortemCodecs.getCodec<CatacombsSecret>()).xmap(::CatacombsSecretGroup, CatacombsSecretGroup::secrets)
}
}
Loading