From 6cb86d1dc709c1d8f3a8e7606a4caa20f1a2964f Mon Sep 17 00:00:00 2001 From: realfraze Date: Sat, 7 Jun 2025 16:53:12 +0200 Subject: [PATCH 1/3] Update to 1.21.5 --- build.gradle.kts | 2 +- .../of/time/storage/CustomRegionBasedStorage.kt | 9 +++++---- .../storage/serializable/AdvancementsStoreable.kt | 2 +- .../waste/of/time/storage/serializable/EndFlow.kt | 3 +-- .../storage/serializable/LevelDataStoreable.kt | 4 ++-- .../time/storage/serializable/MapDataStoreable.kt | 3 ++- .../time/storage/serializable/MetadataStoreable.kt | 2 +- .../time/storage/serializable/RegionBasedChunk.kt | 13 +++---------- .../storage/serializable/StatisticStoreable.kt | 2 +- common/src/main/resources/worldtools.accesswidener | 4 +++- fabric/src/main/resources/fabric.mod.json | 2 +- gradle.properties | 14 +++++++------- 12 files changed, 28 insertions(+), 32 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 9cd6ac6..fc4c215 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,7 +4,7 @@ import net.fabricmc.loom.task.RemapJarTask plugins { kotlin("jvm") version ("2.1.0") id("architectury-plugin") version "3.4-SNAPSHOT" - id("dev.architectury.loom") version "1.9-SNAPSHOT" apply false + id("dev.architectury.loom") version "1.10-SNAPSHOT" apply false id("com.github.johnrengelman.shadow") version "8.1.1" apply false } diff --git a/common/src/main/kotlin/org/waste/of/time/storage/CustomRegionBasedStorage.kt b/common/src/main/kotlin/org/waste/of/time/storage/CustomRegionBasedStorage.kt index 93b7d7c..f408529 100644 --- a/common/src/main/kotlin/org/waste/of/time/storage/CustomRegionBasedStorage.kt +++ b/common/src/main/kotlin/org/waste/of/time/storage/CustomRegionBasedStorage.kt @@ -6,7 +6,7 @@ import net.minecraft.nbt.NbtCompound import net.minecraft.nbt.NbtIo import net.minecraft.registry.Registries import net.minecraft.util.Identifier -import net.minecraft.util.PathUtil +import net.minecraft.util.path.PathUtil import net.minecraft.util.ThrowableDeliverer import net.minecraft.util.math.BlockPos import net.minecraft.util.math.ChunkPos @@ -68,11 +68,12 @@ open class CustomRegionBasedStorage internal constructor( fun getBlockEntities(chunkPos: ChunkPos): List = getNbtAt(chunkPos) - ?.getList("block_entities", 10) + ?.getList("block_entities") + ?.orElse(null) ?.filterIsInstance() ?.mapNotNull { compoundTag -> - val blockPos = BlockPos(compoundTag.getInt("x"), compoundTag.getInt("y"), compoundTag.getInt("z")) - val blockStateIdentifier = Identifier.of(compoundTag.getString("id")) + val blockPos = BlockPos(compoundTag.getInt("x", 0), compoundTag.getInt("y", 0), compoundTag.getInt("z", 0)) + val blockStateIdentifier = Identifier.of(compoundTag.getString("id", "")) val world = mc.world ?: return@mapNotNull null runCatching { diff --git a/common/src/main/kotlin/org/waste/of/time/storage/serializable/AdvancementsStoreable.kt b/common/src/main/kotlin/org/waste/of/time/storage/serializable/AdvancementsStoreable.kt index 36f588e..d6e9db8 100644 --- a/common/src/main/kotlin/org/waste/of/time/storage/serializable/AdvancementsStoreable.kt +++ b/common/src/main/kotlin/org/waste/of/time/storage/serializable/AdvancementsStoreable.kt @@ -5,7 +5,7 @@ import com.mojang.serialization.JsonOps import net.minecraft.advancement.PlayerAdvancementTracker import net.minecraft.datafixer.DataFixTypes import net.minecraft.text.MutableText -import net.minecraft.util.PathUtil +import net.minecraft.util.path.PathUtil import net.minecraft.util.WorldSavePath import net.minecraft.world.level.storage.LevelStorage import org.waste.of.time.WorldTools.CURRENT_VERSION diff --git a/common/src/main/kotlin/org/waste/of/time/storage/serializable/EndFlow.kt b/common/src/main/kotlin/org/waste/of/time/storage/serializable/EndFlow.kt index 22594e1..aaf55ec 100644 --- a/common/src/main/kotlin/org/waste/of/time/storage/serializable/EndFlow.kt +++ b/common/src/main/kotlin/org/waste/of/time/storage/serializable/EndFlow.kt @@ -38,8 +38,7 @@ class EndFlow : Storeable() { currentLevelName ).copy().styled { it.withClickEvent( - ClickEvent( - ClickEvent.Action.OPEN_FILE, + ClickEvent.OpenFile( session.getDirectory(WorldSavePath.ROOT).toFile().path ) ) diff --git a/common/src/main/kotlin/org/waste/of/time/storage/serializable/LevelDataStoreable.kt b/common/src/main/kotlin/org/waste/of/time/storage/serializable/LevelDataStoreable.kt index 3c1d325..11c9ce3 100644 --- a/common/src/main/kotlin/org/waste/of/time/storage/serializable/LevelDataStoreable.kt +++ b/common/src/main/kotlin/org/waste/of/time/storage/serializable/LevelDataStoreable.kt @@ -95,8 +95,8 @@ class LevelDataStoreable : Storeable() { mc.networkHandler?.listedPlayerListEntries?.find { it.profile.id == player.uuid }?.let { - putInt("GameType", it.gameMode.id) - } ?: putInt("GameType", player.server?.defaultGameMode?.id ?: 0) + putInt("GameType", it.gameMode.index) + } ?: putInt("GameType", player.server?.defaultGameMode?.index ?: 0) putInt("SpawnX", player.world.levelProperties.spawnPos.x) putInt("SpawnY", player.world.levelProperties.spawnPos.y) diff --git a/common/src/main/kotlin/org/waste/of/time/storage/serializable/MapDataStoreable.kt b/common/src/main/kotlin/org/waste/of/time/storage/serializable/MapDataStoreable.kt index a815e41..32c9a0c 100644 --- a/common/src/main/kotlin/org/waste/of/time/storage/serializable/MapDataStoreable.kt +++ b/common/src/main/kotlin/org/waste/of/time/storage/serializable/MapDataStoreable.kt @@ -1,5 +1,6 @@ package org.waste.of.time.storage.serializable +import net.minecraft.item.map.MapState import net.minecraft.nbt.NbtCompound import net.minecraft.nbt.NbtHelper import net.minecraft.nbt.NbtIo @@ -43,7 +44,7 @@ class MapDataStoreable : Storeable() { }?.forEach { (component, mapState) -> val id = component.id NbtCompound().apply { - put("data", mapState.writeNbt(NbtCompound(), world.registryManager)) + put("data", MapState.CODEC, mapState) NbtHelper.putDataVersion(this) val mapFile = dataDirectory.resolve("map_$id${WorldTools.DAT_EXTENSION}") if (!mapFile.exists()) { diff --git a/common/src/main/kotlin/org/waste/of/time/storage/serializable/MetadataStoreable.kt b/common/src/main/kotlin/org/waste/of/time/storage/serializable/MetadataStoreable.kt index cd201de..b6fd719 100644 --- a/common/src/main/kotlin/org/waste/of/time/storage/serializable/MetadataStoreable.kt +++ b/common/src/main/kotlin/org/waste/of/time/storage/serializable/MetadataStoreable.kt @@ -2,7 +2,7 @@ package org.waste.of.time.storage.serializable import net.minecraft.client.network.PlayerListEntry import net.minecraft.text.MutableText -import net.minecraft.util.PathUtil +import net.minecraft.util.path.PathUtil import net.minecraft.util.WorldSavePath import net.minecraft.world.level.storage.LevelStorage.Session import org.waste.of.time.Utils diff --git a/common/src/main/kotlin/org/waste/of/time/storage/serializable/RegionBasedChunk.kt b/common/src/main/kotlin/org/waste/of/time/storage/serializable/RegionBasedChunk.kt index 1705c02..bca3a98 100644 --- a/common/src/main/kotlin/org/waste/of/time/storage/serializable/RegionBasedChunk.kt +++ b/common/src/main/kotlin/org/waste/of/time/storage/serializable/RegionBasedChunk.kt @@ -232,15 +232,8 @@ open class RegionBasedChunk( private fun NbtCompound.getTickSchedulers(chunk: WorldChunk) { val time = chunk.world.levelProperties.time val tickSchedulers = chunk.getTickSchedulers(time) - - val blockTickSchedulers = tickSchedulers.blocks.map { ticker -> - ticker.toNbt { Registries.BLOCK.getId(it).toString()} - } - put("block_ticks", NbtList().apply { addAll(blockTickSchedulers) }) - val fluidTickSchedulers = tickSchedulers.fluids.map { ticker -> - ticker.toNbt { Registries.FLUID.getId(it).toString()} - } - put("fluid_ticks", NbtList().apply { addAll(fluidTickSchedulers) }) + put("block_ticks", SerializedChunk.BLOCK_TICKS_CODEC, tickSchedulers.blocks); + put("fluid_ticks", SerializedChunk.FLUID_TICKS_CODEC, tickSchedulers.fluids); } private fun NbtCompound.genPostProcessing(chunk: WorldChunk) { @@ -250,7 +243,7 @@ open class RegionBasedChunk( chunk.heightmaps.filter { chunk.status.heightmapTypes.contains(it.key) }.forEach { (key, value) -> - put(key.getName(), NbtLongArray(value.asLongArray())) + put(key.id, NbtLongArray(value.asLongArray())) } }) } diff --git a/common/src/main/kotlin/org/waste/of/time/storage/serializable/StatisticStoreable.kt b/common/src/main/kotlin/org/waste/of/time/storage/serializable/StatisticStoreable.kt index d61aa18..b9bc7f3 100644 --- a/common/src/main/kotlin/org/waste/of/time/storage/serializable/StatisticStoreable.kt +++ b/common/src/main/kotlin/org/waste/of/time/storage/serializable/StatisticStoreable.kt @@ -3,7 +3,7 @@ package org.waste.of.time.storage.serializable import com.google.gson.JsonObject import net.minecraft.registry.Registries import net.minecraft.text.MutableText -import net.minecraft.util.PathUtil +import net.minecraft.util.path.PathUtil import net.minecraft.util.WorldSavePath import net.minecraft.world.level.storage.LevelStorage import org.waste.of.time.manager.MessageManager.translateHighlight diff --git a/common/src/main/resources/worldtools.accesswidener b/common/src/main/resources/worldtools.accesswidener index 4a6f5ae..1af56d9 100644 --- a/common/src/main/resources/worldtools.accesswidener +++ b/common/src/main/resources/worldtools.accesswidener @@ -14,4 +14,6 @@ accessible method net/minecraft/client/world/ClientWorld getMapStates ()Ljava/ut accessible field net/minecraft/entity/player/PlayerEntity enderChestInventory Lnet/minecraft/inventory/EnderChestInventory; accessible method net/minecraft/block/entity/LockableContainerBlockEntity getHeldStacks ()Lnet/minecraft/util/collection/DefaultedList; accessible method net/minecraft/block/entity/LockableContainerBlockEntity setHeldStacks (Lnet/minecraft/util/collection/DefaultedList;)V -accessible method net/minecraft/world/chunk/SerializedChunk toNbt ([Lit/unimi/dsi/fastutil/shorts/ShortList;)Lnet/minecraft/nbt/NbtList; \ No newline at end of file +accessible method net/minecraft/world/chunk/SerializedChunk toNbt ([Lit/unimi/dsi/fastutil/shorts/ShortList;)Lnet/minecraft/nbt/NbtList; +accessible field net/minecraft/world/chunk/SerializedChunk BLOCK_TICKS_CODEC Lcom/mojang/serialization/Codec; +accessible field net/minecraft/world/chunk/SerializedChunk FLUID_TICKS_CODEC Lcom/mojang/serialization/Codec; diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 63d8154..f283c25 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -34,7 +34,7 @@ "depends": { "fabricloader": ">=${fabric_loader_version}", "fabric-api": "*", - "minecraft": ["1.21.4"], + "minecraft": ["1.21.5"], "java": ">=21", "fabric-language-kotlin": ">=${fabric_kotlin_version}", "cloth-config": ">=15" diff --git a/gradle.properties b/gradle.properties index 1a81b49..9265c75 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,9 +3,9 @@ org.gradle.jvmargs=-Xmx2048M archives_base_name=WorldTools maven_group=org.waste.of.time -mod_version=1.2.8 +mod_version=1.2.9 -minecraft_version=1.21.4 +minecraft_version=1.21.5 enabled_platforms=fabric,forge architectury_version=15.0.1 mixinextras_version=0.4.1 @@ -14,10 +14,10 @@ mod_menu_version=13.0.0 # Fabric https://fabricmc.net/develop/ fabric_loader_version=0.16.10 -yarn_mappings=1.21.4+build.8 -fabric_api_version=0.114.3+1.21.4 -fabric_kotlin_version=1.13.0+kotlin.2.1.0 +yarn_mappings=1.21.5+build.1 +fabric_api_version=0.126.0+1.21.5 +fabric_kotlin_version=1.13.3+kotlin.2.1.21 # Forge -forge_version=1.21.4-54.0.17 -kotlin_forge_version=5.7.0 +forge_version=1.21.5-55.0.22 +kotlin_forge_version=5.8.0 From 737ad866f2b018a0a5cd0679f0b09dd92fdba032 Mon Sep 17 00:00:00 2001 From: realfraze Date: Sat, 7 Jun 2025 17:08:09 +0200 Subject: [PATCH 2/3] remove pointless repetition of vanilla code --- .../waste/of/time/storage/serializable/RegionBasedChunk.kt | 4 +--- common/src/main/resources/worldtools.accesswidener | 3 +-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/common/src/main/kotlin/org/waste/of/time/storage/serializable/RegionBasedChunk.kt b/common/src/main/kotlin/org/waste/of/time/storage/serializable/RegionBasedChunk.kt index bca3a98..9c59b76 100644 --- a/common/src/main/kotlin/org/waste/of/time/storage/serializable/RegionBasedChunk.kt +++ b/common/src/main/kotlin/org/waste/of/time/storage/serializable/RegionBasedChunk.kt @@ -231,9 +231,7 @@ open class RegionBasedChunk( private fun NbtCompound.getTickSchedulers(chunk: WorldChunk) { val time = chunk.world.levelProperties.time - val tickSchedulers = chunk.getTickSchedulers(time) - put("block_ticks", SerializedChunk.BLOCK_TICKS_CODEC, tickSchedulers.blocks); - put("fluid_ticks", SerializedChunk.FLUID_TICKS_CODEC, tickSchedulers.fluids); + SerializedChunk.serializeTicks(this, chunk.getTickSchedulers(time)) } private fun NbtCompound.genPostProcessing(chunk: WorldChunk) { diff --git a/common/src/main/resources/worldtools.accesswidener b/common/src/main/resources/worldtools.accesswidener index 1af56d9..dff8adf 100644 --- a/common/src/main/resources/worldtools.accesswidener +++ b/common/src/main/resources/worldtools.accesswidener @@ -15,5 +15,4 @@ accessible field net/minecraft/entity/player/PlayerEntity enderChestInventory Ln accessible method net/minecraft/block/entity/LockableContainerBlockEntity getHeldStacks ()Lnet/minecraft/util/collection/DefaultedList; accessible method net/minecraft/block/entity/LockableContainerBlockEntity setHeldStacks (Lnet/minecraft/util/collection/DefaultedList;)V accessible method net/minecraft/world/chunk/SerializedChunk toNbt ([Lit/unimi/dsi/fastutil/shorts/ShortList;)Lnet/minecraft/nbt/NbtList; -accessible field net/minecraft/world/chunk/SerializedChunk BLOCK_TICKS_CODEC Lcom/mojang/serialization/Codec; -accessible field net/minecraft/world/chunk/SerializedChunk FLUID_TICKS_CODEC Lcom/mojang/serialization/Codec; +accessible method net/minecraft/world/chunk/SerializedChunk serializeTicks (Lnet/minecraft/nbt/NbtCompound;Lnet/minecraft/world/chunk/Chunk$TickSchedulers;)V \ No newline at end of file From 1ce0a49dafb7c2a0add47d45e5c91b3538d1b59f Mon Sep 17 00:00:00 2001 From: PK268 Date: Sun, 28 Sep 2025 01:29:38 +0300 Subject: [PATCH 3/3] Port to Fabric 1.21.8 --- common/build.gradle.kts | 2 +- .../kotlin/org/waste/of/time/WorldTools.kt | 2 +- .../time/storage/CustomRegionBasedStorage.kt | 3 +- .../of/time/storage/cache/EntityCacheable.kt | 10 ++- .../serializable/LevelDataStoreable.kt | 21 +++-- .../storage/serializable/PlayerStoreable.kt | 15 +++- .../storage/serializable/RegionBasedChunk.kt | 2 +- .../serializable/RegionBasedEntities.kt | 2 +- fabric/src/main/resources/fabric.mod.json | 2 +- forge/build.gradle.kts | 51 ----------- forge/gradle.properties | 1 - .../waste/of/time/forge/LoaderInfoImpl.java | 10 --- .../waste/of/time/forge/WorldToolsForge.kt | 87 ------------------- forge/src/main/resources/META-INF/mods.toml | 42 --------- forge/src/main/resources/pack.mcmeta | 6 -- gradle.properties | 24 +++-- settings.gradle.kts | 4 +- 17 files changed, 51 insertions(+), 233 deletions(-) delete mode 100644 forge/build.gradle.kts delete mode 100644 forge/gradle.properties delete mode 100644 forge/src/main/java/org/waste/of/time/forge/LoaderInfoImpl.java delete mode 100644 forge/src/main/kotlin/org/waste/of/time/forge/WorldToolsForge.kt delete mode 100644 forge/src/main/resources/META-INF/mods.toml delete mode 100644 forge/src/main/resources/pack.mcmeta diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 5084259..0a6cdd1 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -1,4 +1,4 @@ -architectury { common("fabric", "forge") } +architectury { common("fabric") } loom { accessWidenerPath.set(File("src/main/resources/worldtools.accesswidener")) diff --git a/common/src/main/kotlin/org/waste/of/time/WorldTools.kt b/common/src/main/kotlin/org/waste/of/time/WorldTools.kt index 68c0306..bf259ec 100644 --- a/common/src/main/kotlin/org/waste/of/time/WorldTools.kt +++ b/common/src/main/kotlin/org/waste/of/time/WorldTools.kt @@ -22,7 +22,7 @@ object WorldTools { const val MAX_LEVEL_NAME_LENGTH = 64 const val TIMESTAMP_KEY = "CaptureTimestamp" val GSON: Gson = GsonBuilder().setPrettyPrinting().create() - val CURRENT_VERSION = SharedConstants.getGameVersion().saveVersion.id + val CURRENT_VERSION = SharedConstants.getGameVersion().dataVersion().id private val VERSION: String = LoaderInfo.getVersion() val CREDIT_MESSAGE = "This file was created by $MOD_NAME $VERSION ($URL)" val CREDIT_MESSAGE_MD = "This file was created by [$MOD_NAME $VERSION]($URL)" diff --git a/common/src/main/kotlin/org/waste/of/time/storage/CustomRegionBasedStorage.kt b/common/src/main/kotlin/org/waste/of/time/storage/CustomRegionBasedStorage.kt index f408529..041e879 100644 --- a/common/src/main/kotlin/org/waste/of/time/storage/CustomRegionBasedStorage.kt +++ b/common/src/main/kotlin/org/waste/of/time/storage/CustomRegionBasedStorage.kt @@ -16,6 +16,7 @@ import net.minecraft.world.storage.StorageKey import org.waste.of.time.WorldTools.MCA_EXTENSION import org.waste.of.time.WorldTools.MOD_NAME import org.waste.of.time.WorldTools.mc +import net.minecraft.storage.NbtReadView import java.io.DataOutput import java.io.IOException import java.nio.file.Path @@ -82,7 +83,7 @@ open class CustomRegionBasedStorage internal constructor( .getOptionalValue(blockStateIdentifier) .orElse(null) ?.instantiate(blockPos, block.defaultState)?.apply { - read(compoundTag, world.registryManager) + read(NbtReadView.create(null,null,compoundTag)) } }.getOrNull() } ?: emptyList() diff --git a/common/src/main/kotlin/org/waste/of/time/storage/cache/EntityCacheable.kt b/common/src/main/kotlin/org/waste/of/time/storage/cache/EntityCacheable.kt index abb885e..c1eaac4 100644 --- a/common/src/main/kotlin/org/waste/of/time/storage/cache/EntityCacheable.kt +++ b/common/src/main/kotlin/org/waste/of/time/storage/cache/EntityCacheable.kt @@ -7,14 +7,18 @@ import org.waste.of.time.Utils.toByte import org.waste.of.time.WorldTools.TIMESTAMP_KEY import org.waste.of.time.WorldTools.config import org.waste.of.time.storage.Cacheable +import net.minecraft.util.ErrorReporter +import net.minecraft.storage.NbtWriteView data class EntityCacheable( val entity: Entity ) : Cacheable { - fun compound() = NbtCompound().apply { + + + fun compound() = NbtWriteView.create(ErrorReporter.EMPTY).apply { // saveSelfNbt has a check for RemovalReason.DISCARDED EntityType.getId(entity.type)?.let { putString(Entity.ID_KEY, it.toString()) } - entity.writeNbt(this) + entity.writeData(this) if (config.entity.behavior.modifyEntityBehavior) { putByte("NoAI", config.entity.behavior.noAI.toByte()) @@ -26,7 +30,7 @@ data class EntityCacheable( if (config.entity.metadata.captureTimestamp) { putLong(TIMESTAMP_KEY, System.currentTimeMillis()) } - } + }.nbt override fun cache() { HotCache.entities.computeIfAbsent(entity.chunkPos) { mutableSetOf() }.apply { diff --git a/common/src/main/kotlin/org/waste/of/time/storage/serializable/LevelDataStoreable.kt b/common/src/main/kotlin/org/waste/of/time/storage/serializable/LevelDataStoreable.kt index 11c9ce3..e501738 100644 --- a/common/src/main/kotlin/org/waste/of/time/storage/serializable/LevelDataStoreable.kt +++ b/common/src/main/kotlin/org/waste/of/time/storage/serializable/LevelDataStoreable.kt @@ -19,8 +19,11 @@ import org.waste.of.time.manager.MessageManager import org.waste.of.time.manager.MessageManager.translateHighlight import org.waste.of.time.storage.CustomRegionBasedStorage import org.waste.of.time.storage.Storeable +import net.minecraft.storage.NbtWriteView +import net.minecraft.nbt.NbtOps import java.io.File import java.io.IOException +import net.minecraft.util.ErrorReporter class LevelDataStoreable : Storeable() { override fun shouldStore() = config.general.capture.levelData @@ -83,10 +86,10 @@ class LevelDataStoreable : Storeable() { // skip removed features put("Version", NbtCompound().apply { - putString("Name", SharedConstants.getGameVersion().name) - putInt("Id", SharedConstants.getGameVersion().saveVersion.id) - putBoolean("Snapshot", !SharedConstants.getGameVersion().isStable) - putString("Series", SharedConstants.getGameVersion().saveVersion.series) + putString("Name", SharedConstants.getGameVersion().name()) + putInt("Id", SharedConstants.getGameVersion().dataVersion().id) + putBoolean("Snapshot", !SharedConstants.getGameVersion().stable()) + putString("Series", SharedConstants.getGameVersion().dataVersion().series) }) NbtHelper.putDataVersion(this) @@ -124,11 +127,13 @@ class LevelDataStoreable : Storeable() { // ToDo: Seems that the client side game rules were removed. Now only works for single player :/ val rules = player.world?.server?.gameRules?.genGameRules() ?: NbtCompound() put("GameRules", rules) - put("Player", NbtCompound().apply { - player.writeNbt(this) - remove("LastDeathLocation") // can contain sensitive information + + val view = NbtWriteView.create(ErrorReporter.EMPTY).apply { + player.writeData(this) + remove("LastDeathLocation") putString("Dimension", "minecraft:${player.world.registryKey.value.path}") - }) + } + put("Player", view.nbt) put("DragonFight", NbtCompound()) // not sure put("CustomBossEvents", NbtCompound()) // not sure diff --git a/common/src/main/kotlin/org/waste/of/time/storage/serializable/PlayerStoreable.kt b/common/src/main/kotlin/org/waste/of/time/storage/serializable/PlayerStoreable.kt index c0314e8..c893ccc 100644 --- a/common/src/main/kotlin/org/waste/of/time/storage/serializable/PlayerStoreable.kt +++ b/common/src/main/kotlin/org/waste/of/time/storage/serializable/PlayerStoreable.kt @@ -19,6 +19,8 @@ import org.waste.of.time.storage.cache.HotCache import java.io.File import java.nio.file.Files import java.nio.file.Path +import net.minecraft.util.ErrorReporter +import net.minecraft.storage.NbtWriteView data class PlayerStoreable( val player: PlayerEntity @@ -56,16 +58,23 @@ data class PlayerStoreable( } private fun savePlayerData(player: PlayerEntity, session: Session) { + try { val playerDataDir = session.getDirectory(WorldSavePath.PLAYERDATA).toFile() playerDataDir.mkdirs() val newPlayerFile = File.createTempFile(player.uuidAsString + "-", ".dat", playerDataDir).toPath() - NbtIo.writeCompressed(player.writeNbt(NbtCompound()).apply { - if (config.entity.censor.lastDeathLocation) { + + + val view = NbtWriteView.create(ErrorReporter.EMPTY).apply { + player.writeData(this) + if (config.entity.censor.lastDeathLocation) { remove("LastDeathLocation") } - }, newPlayerFile) + } + + //writeCompresesed wants a compound tag and a path + NbtIo.writeCompressed(view.nbt, newPlayerFile) val currentFile = File(playerDataDir, player.uuidAsString + ".dat").toPath() val backupFile = File(playerDataDir, player.uuidAsString + ".dat_old").toPath() Util.backupAndReplace(currentFile, newPlayerFile, backupFile) diff --git a/common/src/main/kotlin/org/waste/of/time/storage/serializable/RegionBasedChunk.kt b/common/src/main/kotlin/org/waste/of/time/storage/serializable/RegionBasedChunk.kt index 9c59b76..64885b4 100644 --- a/common/src/main/kotlin/org/waste/of/time/storage/serializable/RegionBasedChunk.kt +++ b/common/src/main/kotlin/org/waste/of/time/storage/serializable/RegionBasedChunk.kt @@ -113,7 +113,7 @@ open class RegionBasedChunk( putLong(TIMESTAMP_KEY, System.currentTimeMillis()) } - putInt("DataVersion", SharedConstants.getGameVersion().saveVersion.id) + putInt("DataVersion", SharedConstants.getGameVersion().dataVersion().id) putInt(SerializedChunk.X_POS_KEY, chunk.pos.x) putInt("yPos", chunk.bottomSectionCoord) putInt(SerializedChunk.Z_POS_KEY, chunk.pos.z) diff --git a/common/src/main/kotlin/org/waste/of/time/storage/serializable/RegionBasedEntities.kt b/common/src/main/kotlin/org/waste/of/time/storage/serializable/RegionBasedEntities.kt index 1ecd026..278d27c 100644 --- a/common/src/main/kotlin/org/waste/of/time/storage/serializable/RegionBasedEntities.kt +++ b/common/src/main/kotlin/org/waste/of/time/storage/serializable/RegionBasedEntities.kt @@ -46,7 +46,7 @@ class RegionBasedEntities( } }) - putInt("DataVersion", SharedConstants.getGameVersion().saveVersion.id) + putInt("DataVersion", SharedConstants.getGameVersion().dataVersion().id) put("Position", NbtIntArray(intArrayOf(chunkPos.x, chunkPos.z))) if (config.debug.logSavedEntities) { entities.forEach { entity -> LOG.info("Entity saved: $entity (Chunk: $chunkPos)") } diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index f283c25..a068eb9 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -34,7 +34,7 @@ "depends": { "fabricloader": ">=${fabric_loader_version}", "fabric-api": "*", - "minecraft": ["1.21.5"], + "minecraft": ["1.21.8"], "java": ">=21", "fabric-language-kotlin": ">=${fabric_kotlin_version}", "cloth-config": ">=15" diff --git a/forge/build.gradle.kts b/forge/build.gradle.kts deleted file mode 100644 index b784096..0000000 --- a/forge/build.gradle.kts +++ /dev/null @@ -1,51 +0,0 @@ -architectury { - platformSetupLoomIde() - forge() -} - -base.archivesName.set("${base.archivesName.get()}-forge") - -loom { - accessWidenerPath.set(project(":common").loom.accessWidenerPath) - forge { - convertAccessWideners = true - extraAccessWideners.add(loom.accessWidenerPath.get().asFile.name) - mixinConfig("worldtools.mixins.common.json") - } -} - -repositories { - maven("https://thedarkcolour.github.io/KotlinForForge/") { - name = "KotlinForForge" - } - maven("https://cursemaven.com") { - name = "Curse" - } -} - -val common: Configuration by configurations.creating { - configurations.compileClasspath.get().extendsFrom(this) - configurations.runtimeClasspath.get().extendsFrom(this) - configurations["developmentForge"].extendsFrom(this) -} - -dependencies { - forge("net.minecraftforge:forge:${project.properties["forge_version"]!!}") - implementation("thedarkcolour:kotlinforforge:${project.properties["kotlin_forge_version"]!!}") - common(project(":common", configuration = "namedElements")) { isTransitive = false } - shadowCommon(project(path = ":common", configuration = "transformProductionForge")) { isTransitive = false } - implementation(annotationProcessor("io.github.llamalad7:mixinextras-common:${project.properties["mixinextras_version"]}")!!) - implementation(include("io.github.llamalad7:mixinextras-forge:${project.properties["mixinextras_version"]}")!!) - modApi("me.shedaniel.cloth:cloth-config-forge:${project.properties["cloth_config_version"]}") -} - -tasks { - processResources { - inputs.property("version", project.version) - - filesMatching("META-INF/mods.toml") { - expand(getProperties()) - expand(mutableMapOf("version" to project.version)) - } - } -} diff --git a/forge/gradle.properties b/forge/gradle.properties deleted file mode 100644 index 8242585..0000000 --- a/forge/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -loom.platform=forge diff --git a/forge/src/main/java/org/waste/of/time/forge/LoaderInfoImpl.java b/forge/src/main/java/org/waste/of/time/forge/LoaderInfoImpl.java deleted file mode 100644 index 55009ce..0000000 --- a/forge/src/main/java/org/waste/of/time/forge/LoaderInfoImpl.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.waste.of.time.forge; - -import net.minecraftforge.fml.loading.FMLLoader; - -public class LoaderInfoImpl { - public static String getVersion() { - return FMLLoader.getLoadingModList().getModFileById("worldtools").versionString(); - } - -} diff --git a/forge/src/main/kotlin/org/waste/of/time/forge/WorldToolsForge.kt b/forge/src/main/kotlin/org/waste/of/time/forge/WorldToolsForge.kt deleted file mode 100644 index 14caf59..0000000 --- a/forge/src/main/kotlin/org/waste/of/time/forge/WorldToolsForge.kt +++ /dev/null @@ -1,87 +0,0 @@ -package org.waste.of.time.forge - -import com.mojang.brigadier.CommandDispatcher -import com.mojang.brigadier.arguments.StringArgumentType -import net.minecraft.server.command.CommandManager.argument -import net.minecraft.server.command.CommandManager.literal -import net.minecraft.server.command.ServerCommandSource -import net.minecraft.world.chunk.WorldChunk -import net.minecraftforge.client.event.ClientPlayerNetworkEvent -import net.minecraftforge.client.event.RegisterClientCommandsEvent -import net.minecraftforge.client.event.RegisterKeyMappingsEvent -import net.minecraftforge.client.event.ScreenEvent -import net.minecraftforge.event.TickEvent -import net.minecraftforge.event.TickEvent.ClientTickEvent -import net.minecraftforge.event.entity.EntityJoinLevelEvent -import net.minecraftforge.event.entity.EntityLeaveLevelEvent -import net.minecraftforge.event.level.ChunkEvent -import net.minecraftforge.fml.common.Mod -import org.waste.of.time.Events -import org.waste.of.time.WorldTools -import org.waste.of.time.WorldTools.LOG -import org.waste.of.time.manager.CaptureManager -import thedarkcolour.kotlinforforge.forge.FORGE_BUS - -@Mod(WorldTools.MOD_ID) -object WorldToolsForge { - init { - WorldTools.initialize() - FORGE_BUS.addListener { - it.register(WorldTools.CAPTURE_KEY) - it.register(WorldTools.CONFIG_KEY) - } - FORGE_BUS.addListener { - it.dispatcher.register() - } - FORGE_BUS.addListener { - Events.onClientJoin() - } - FORGE_BUS.addListener { - Events.onClientDisconnect() - } - FORGE_BUS.addListener { - Events.onEntityLoad(it.entity) - } - FORGE_BUS.addListener { - Events.onEntityUnload(it.entity) - } - FORGE_BUS.addListener { - if (it.phase == TickEvent.Phase.START) Events.onClientTickStart() - } - FORGE_BUS.addListener { - if (it.chunk is WorldChunk) Events.onChunkLoad(it.chunk as WorldChunk) - } - FORGE_BUS.addListener { - if (it.chunk is WorldChunk) Events.onChunkUnload(it.chunk as WorldChunk) - } - FORGE_BUS.addListener { - Events.onScreenRemoved(it.screen) - } - - LOG.info("WorldTools Forge initialized") - } - - private fun CommandDispatcher.register() { - register( - literal("worldtools") - .then(literal("capture") - .then(argument("name", StringArgumentType.string()).executes { - CaptureManager.start(it.getArgument("name", String::class.java)) - 0 - }) - .then(literal("start").executes { - CaptureManager.start() - 0 - }) - .then(literal("stop").executes { - CaptureManager.stop() - 0 - }) - .executes { - CaptureManager.toggleCapture() - 0 - } - ) - ) - } -} diff --git a/forge/src/main/resources/META-INF/mods.toml b/forge/src/main/resources/META-INF/mods.toml deleted file mode 100644 index 31b2e94..0000000 --- a/forge/src/main/resources/META-INF/mods.toml +++ /dev/null @@ -1,42 +0,0 @@ -modLoader = "kotlinforforge" -loaderVersion = "[4,)" -license = "GNU General Public License v3.0" - -[[mods]] -modId = "worldtools" -version = "${version}" -displayName = "WorldTools" -authors = "Constructor, P529, rfresh2" -description = ''' -A powerful Minecraft mod that captures high-detail snapshots of server worlds locally. -''' -logoFile = "assets/worldtools/WorldTools.png" -displayTest = "IGNORE_ALL_VERSION" - -[[dependencies.worldtools]] -modId = "forge" -mandatory = true -versionRange = "[47,)" -ordering = "NONE" -side = "CLIENT" - -[[dependencies.worldtools]] -modId = "minecraft" -mandatory = true -versionRange = "[1.21,)" -ordering = "NONE" -side = "CLIENT" - -[[dependencies.worldtools]] -modId = "kotlinforforge" -mandatory = true -versionRange = "[4,)" -ordering = "AFTER" -side = "CLIENT" - -[[dependencies.worldtools]] -modId = "cloth_config" -mandatory = true -versionRange = "[15,)" -ordering = "AFTER" -side = "CLIENT" diff --git a/forge/src/main/resources/pack.mcmeta b/forge/src/main/resources/pack.mcmeta deleted file mode 100644 index 6e6940d..0000000 --- a/forge/src/main/resources/pack.mcmeta +++ /dev/null @@ -1,6 +0,0 @@ -{ - "pack": { - "description": "worldtools", - "pack_format": 9 - } -} diff --git a/gradle.properties b/gradle.properties index 9265c75..88dc20f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,19 +5,15 @@ archives_base_name=WorldTools maven_group=org.waste.of.time mod_version=1.2.9 -minecraft_version=1.21.5 -enabled_platforms=fabric,forge -architectury_version=15.0.1 -mixinextras_version=0.4.1 -cloth_config_version=17.0.144 -mod_menu_version=13.0.0 +minecraft_version=1.21.8 +enabled_platforms=fabric +architectury_version=17.0.8 +mixinextras_version=0.5.0 +cloth_config_version=19.0.147 +mod_menu_version=15.0.0 # Fabric https://fabricmc.net/develop/ -fabric_loader_version=0.16.10 -yarn_mappings=1.21.5+build.1 -fabric_api_version=0.126.0+1.21.5 -fabric_kotlin_version=1.13.3+kotlin.2.1.21 - -# Forge -forge_version=1.21.5-55.0.22 -kotlin_forge_version=5.8.0 +fabric_loader_version=0.17.2 +yarn_mappings=1.21.8+build.1 +fabric_api_version=0.133.4+1.21.8 +fabric_kotlin_version=1.13.4+kotlin.2.2.0 diff --git a/settings.gradle.kts b/settings.gradle.kts index 28e49c8..f49aab0 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -5,7 +5,7 @@ pluginManagement { name = "Fabric" } maven("https://maven.architectury.dev/") - maven("https://maven.minecraftforge.net/") + maven("https://maven.minecraftforge.net/") mavenCentral() gradlePluginPortal() } @@ -13,4 +13,4 @@ pluginManagement { include("common") include("fabric") -include("forge") +