Skip to content

Commit d6494e1

Browse files
committed
Rework json comment generator
1 parent b314a3e commit d6494e1

8 files changed

Lines changed: 74 additions & 56 deletions

File tree

build.gradle.kts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ val publishType = if (mod.hasProp("build.release_type")) mod.prop("build.release
55
val isBeta = publishType != null && publishType == "beta"
66
val isAlpha = publishType != null && publishType == "alpha"
77
val kotlinVersion: String by rootProject
8+
val allSupportedMC = mutableListOf(mod.minecraftVersion).apply {
9+
if (mod.hasProp("minecraft_version.additional"))
10+
this.addAll(mod.prop("minecraft_version.additional").split(',').map { it.trim() })
11+
}
812

913
plugins {
1014
id("gg.meza.stonecraft")
@@ -65,10 +69,6 @@ publishMods {
6569
return@publishMods
6670
}
6771

68-
val additionalMinecraftVersions = if (mod.hasProp("minecraft_version.additional"))
69-
mod.prop("minecraft_version.additional").split(',').map { it.trim() }
70-
else listOf()
71-
7272
changelog = rootProject.file("CHANGELOG.md").readText()
7373

7474
type = when {
@@ -95,8 +95,7 @@ publishMods {
9595
requires(*depends.toTypedArray())
9696
}
9797

98-
minecraftVersions.add(mod.minecraftVersion)
99-
minecraftVersions.addAll(additionalMinecraftVersions)
98+
minecraftVersions.addAll(allSupportedMC)
10099
}
101100

102101
if (curseToken != null && curseProject != null) curseforge {
@@ -116,7 +115,7 @@ publishMods {
116115
}
117116
minecraftVersions.add(modifiedVersion)
118117
} else minecraftVersions.add(mod.minecraftVersion)
119-
minecraftVersions.addAll(additionalMinecraftVersions)
118+
minecraftVersions.addAll(allSupportedMC)
120119
}
121120
}
122121

src/main/kotlin/Mod.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.algorithmlx.dimore
22

3-
import com.algorithmlx.dimore.init.config.ConfigManager
3+
import com.algorithmlx.dimore.init.config.CommentedJSONManager
44
import com.algorithmlx.dimore.init.Registry
55
import com.algorithmlx.dimore.init.post.loot.SimpleGenerator
66
//? if neoforge {
@@ -33,7 +33,7 @@ object Mod {
3333
fun onInitialize() {
3434
SimpleGenerator.generateLootTables(FabricLoader.getInstance().isModLoaded("kubejs"))
3535

36-
ConfigManager.load()
36+
CommentedJSONManager.load()
3737
Registry.init()
3838
OreConfig.init()
3939
}

src/main/kotlin/init/Registry.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.algorithmlx.dimore.init
22

33
import com.algorithmlx.dimore.LOGGER
4-
import com.algorithmlx.dimore.Mod
54
import com.algorithmlx.dimore.ModId
65
import com.algorithmlx.dimore.block.DimensionalOreBlock
76
import com.algorithmlx.dimore.block.DimensionalRedstoneOre
@@ -27,7 +26,7 @@ import net.neoforged.neoforge.registries.NeoForgeRegistries
2726
import java.util.function.Supplier
2827
*///?}
2928
//? if fabric {
30-
import com.algorithmlx.dimore.init.config.ConfigManager
29+
import com.algorithmlx.dimore.init.config.CommentedJSONManager
3130
import com.algorithmlx.dimore.init.post.PostBlock
3231
import com.algorithmlx.dimore.util.DimensionOreConfig
3332
import com.algorithmlx.dimore.util.OreGeneratorFactory
@@ -98,13 +97,14 @@ object Registry {
9897
.filter { !it.name.startsWith("_") }
9998
.filter { !it.isDirectory }
10099
.forEach {
100+
val id = "custom.${it.name.removeSuffix(".json")}"
101101
val config: PostBlock = json.decodeFromStream(it.inputStream())
102102

103103
if (!config.isRedstone) this.registerBlock(
104-
it.name, ::Block,
104+
id, ::Block,
105105
config.properties.asBlockBehaviourProperties(), true
106106
) else this.registerBlock(
107-
it.name, ::RedStoneOreBlock,
107+
id, ::RedStoneOreBlock,
108108
config.properties.asBlockBehaviourProperties(), true
109109
)
110110
}
@@ -198,7 +198,7 @@ object Registry {
198198
cfReg: Registry<ConfiguredFeature<*, *>>,
199199
pfReg: Registry<PlacedFeature>
200200
) {
201-
if (ConfigManager.config.netherOres.generateOres) {
201+
if (CommentedJSONManager.config.netherOres.generateOres) {
202202
OreTypes.netherOres.forEach { type ->
203203
val id = "nether_${type.name.lowercase()}_ore"
204204
val config = OreTypes.configByTypeNether[type] ?: return@forEach
@@ -214,7 +214,7 @@ object Registry {
214214
}
215215
}
216216

217-
if (ConfigManager.config.overworldOres.generateOres) {
217+
if (CommentedJSONManager.config.overworldOres.generateOres) {
218218
OreTypes.overworldOres.forEach { type ->
219219
val stoneId = "stone_${type.name.lowercase()}_ore"
220220
val deepslateId = "deepslate_${type.name.lowercase()}_ore"
@@ -238,7 +238,7 @@ object Registry {
238238
}
239239
}
240240

241-
if (ConfigManager.config.endOres.generateOres) {
241+
if (CommentedJSONManager.config.endOres.generateOres) {
242242
OreTypes.endOres.forEach { type ->
243243
val id = "end_${type.name.lowercase()}_ore"
244244
val config = OreTypes.configByTypeEnd[type] ?: return@forEach

src/main/kotlin/init/config/ConfigManager.kt renamed to src/main/kotlin/init/config/CommentedJSONManager.kt

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.algorithmlx.dimore.init.config
22

3+
import com.algorithmlx.dimore.init.post.ExampleBlock
4+
import com.algorithmlx.dimore.init.post.PostBlock
35
import kotlinx.serialization.*
46
import kotlinx.serialization.json.*
57
import java.io.File
@@ -9,7 +11,7 @@ import kotlin.reflect.full.hasAnnotation
911
import kotlin.reflect.full.memberProperties
1012

1113
@OptIn(ExperimentalSerializationApi::class)
12-
object ConfigManager {
14+
object CommentedJSONManager {
1315
private const val COMMENT_MULTILINE_START = "/*"
1416
private const val COMMENT_MULTILINE_END = "*/"
1517
private const val COMMENT_STAR = "*"
@@ -27,32 +29,50 @@ object ConfigManager {
2729
private set
2830

2931
fun load() {
30-
val configCache: MutableMap<String, Any> = mutableMapOf()
31-
3232
val configFile = File("config/dimore/dimore.json")
33-
if (!configFile.exists()) {
34-
configFile.parentFile.mkdirs()
35-
save(configCache, configFile, config, DimensionalOresConfig::class)
33+
val defaultBlockFile = File("config/dimore/custom/_example_block.json")
34+
35+
config = saveOrLoad(configFile, config, DimensionalOresConfig::class)
36+
37+
if (!defaultBlockFile.parentFile.exists())
38+
saveOrLoad(defaultBlockFile, ExampleBlock, PostBlock::class)
39+
}
40+
41+
inline fun <reified T: Any> saveOrLoad(file: File, obj: T, clazz: KClass<T>): T {
42+
val cache = mutableMapOf<String, Any>()
43+
return saveOrLoad(cache, file, obj, clazz)
44+
}
45+
46+
inline fun <reified T : Any> saveOrLoad(cache: MutableMap<String, Any>, file: File, obj: T, clazz: KClass<T>): T {
47+
val value = if (!file.exists()) {
48+
file.parentFile.mkdirs()
49+
save(cache, file, obj, clazz)
50+
51+
obj
3652
} else {
3753
try {
38-
config = json.decodeFromStream(configFile.inputStream())
54+
json.decodeFromStream(file.inputStream())
3955
} catch (e: Exception) {
4056
e.printStackTrace()
41-
save(configCache, configFile, config, DimensionalOresConfig::class)
57+
save(cache, file, obj, clazz)
58+
59+
obj
4260
}
4361
}
4462

45-
updateCache(configCache, config)
63+
updateCache(cache, obj)
64+
65+
return value
4666
}
4767

48-
private inline fun <reified T : Any> save(cache: MutableMap<String, Any>, configFile: File, toSave: T, clazz: KClass<T>) {
68+
inline fun <reified T : Any> save(cache: MutableMap<String, Any>, configFile: File, toSave: T, clazz: KClass<T>) {
4969
val jsonStr = json.encodeToString(toSave)
5070
val commentedStr = injectComments(jsonStr, clazz)
5171
configFile.writeText(commentedStr)
5272
updateCache(cache, toSave)
5373
}
5474

55-
private inline fun <reified T> updateCache(cache: MutableMap<String, Any>, config: T) {
75+
inline fun <reified T> updateCache(cache: MutableMap<String, Any>, config: T) {
5676
val jsonObject = json.encodeToJsonElement(config).jsonObject
5777
val flat = flatten(jsonObject)
5878
cache.putAll(flat)
@@ -64,7 +84,7 @@ object ConfigManager {
6484
@JvmStatic
6585
fun getInt(cache: Map<String, Any>, key: String): Int = cache[key] as? Int ?: 0
6686

67-
private fun flatten(el: JsonElement, pr: String = ""): Map<String, Any> {
87+
fun flatten(el: JsonElement, pr: String = ""): Map<String, Any> {
6888
val m = mutableMapOf<String, Any>()
6989
when (el) {
7090
is JsonObject -> {

src/main/kotlin/init/post/PostBlock.kt

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,7 @@ val ExampleBlock = PostBlock(
2626
count = 12,
2727
minHeight = -60,
2828
maxHeight = 120,
29-
oreDimensionType = PostBlock.OreReplacementRule(
30-
"minecraft:stone",
31-
PostBlock.TargetType(into = "minecraft:cobblestone")
32-
)
29+
oreTarget = PostBlock.TargetType(from = "minecraft:stone")
3330
)
3431
)
3532

@@ -62,40 +59,41 @@ data class PostBlock(
6259
val maxHeight: Int,
6360
@JsonComment(["Settings of ore generation"])
6461
@SerialName("ore_replacement_rule")
65-
val oreDimensionType: OreReplacementRule,
62+
val oreTarget: TargetType,
63+
@JsonComment(["Experience settings"])
6664
@Serializable
6765
val dropExperience: ExperienceRange = ExperienceRange.EMPTY
68-
)
66+
) {
67+
fun asDimensionType(blockId: String) = OreReplacementRule(blockId, oreTarget)
6968

70-
@Serializable
71-
open class OreReplacementRule(
72-
@JsonComment(["Block to replace"])
73-
val replacement: String,
74-
val target: TargetType
75-
): OreDimensionType {
76-
@Transient
77-
override val dimensionBlock: () -> Block = {
78-
//$ if >1.21.1 '.getValue(ResLoc.parse(replacement))' else '.get(ResLoc.parse(replacement))'
79-
BuiltInRegistries.BLOCK.getValue(ResLoc.parse(replacement))
80-
}
69+
open class OreReplacementRule(
70+
val replacement: String,
71+
val target: TargetType
72+
): OreDimensionType {
73+
override val dimensionBlock: () -> Block = {
74+
//$ if >1.21.1 '.getValue(ResLoc.parse(replacement))' else '.get(ResLoc.parse(replacement))'
75+
BuiltInRegistries.BLOCK.getValue(ResLoc.parse(replacement))
76+
}
8177

82-
override fun replacementSettings(block: BlockState): OreConfiguration.TargetBlockState =
83-
OreConfiguration.target(target.asRuleTest(), block)
78+
override fun replacementSettings(block: BlockState): OreConfiguration.TargetBlockState =
79+
OreConfiguration.target(target.asRuleTest(), block)
80+
}
8481
}
8582

8683
@Serializable
8784
data class TargetType(
85+
@JsonComment(["Block replace type.", "Can be \"block\" and \"tag\""], multiline = true)
8886
val type: String = "block",
89-
val into: String
87+
val from: String
9088
) {
9189
@Transient val isBlock = this.type == "block"
9290
@Transient val isTag = !isBlock
9391

9492
fun asRuleTest(): RuleTest {
9593
return if (isTag)
96-
TagMatchTest(TagKey.create(Registries.BLOCK, ResLoc.parse(into)))
94+
TagMatchTest(TagKey.create(Registries.BLOCK, ResLoc.parse(from)))
9795
else {
98-
val blockId = ResLoc.parse(into)
96+
val blockId = ResLoc.parse(from)
9997
val block = BuiltInRegistries.BLOCK
10098
//$ if >1.21.1 '.getValue(blockId)' else '.get(blockId)'
10199
.getValue(blockId)

src/main/kotlin/util/OreTypes.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.algorithmlx.dimore.util
22

3-
import com.algorithmlx.dimore.init.config.ConfigManager
3+
import com.algorithmlx.dimore.init.config.CommentedJSONManager
44
import net.minecraft.util.valueproviders.ConstantInt
55
import net.minecraft.util.valueproviders.IntProvider
66
import net.minecraft.util.valueproviders.UniformInt
@@ -20,9 +20,9 @@ enum class OreTypes(override val parentOreBlock: () -> Block, override val exper
2020
REDSTONE({ Blocks.REDSTONE_ORE });
2121

2222
companion object {
23-
private val netherOresConfig = ConfigManager.config.netherOres
24-
private val overOresConfig = ConfigManager.config.overworldOres
25-
private val endOresConfig = ConfigManager.config.endOres
23+
private val netherOresConfig = CommentedJSONManager.config.netherOres
24+
private val overOresConfig = CommentedJSONManager.config.overworldOres
25+
private val endOresConfig = CommentedJSONManager.config.endOres
2626

2727
val netherOres = arrayOf(COAL, COPPER, IRON, LAPIS, DIAMOND, EMERALD, REDSTONE)
2828
val overworldOres = arrayOf(QUARTZ)

src/main/kotlin/worldgen/OreConfig.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package com.algorithmlx.dimore.worldgen
22

33
//? if fabric {
44
import com.algorithmlx.dimore.ModId
5-
import com.algorithmlx.dimore.init.config.ConfigManager
5+
import com.algorithmlx.dimore.init.config.CommentedJSONManager
66
import net.fabricmc.fabric.api.biome.v1.BiomeModifications
77
import net.fabricmc.fabric.api.biome.v1.BiomeSelectionContext
88
import net.fabricmc.fabric.api.biome.v1.BiomeSelectors
@@ -13,7 +13,7 @@ import net.minecraft.world.level.levelgen.GenerationStep
1313
import java.util.function.Predicate
1414

1515
object OreConfig {
16-
private val config = ConfigManager.config
16+
private val config = CommentedJSONManager.config
1717

1818
fun init() {
1919
if (config.overworldOres.generateOres) generateOverworldOres()

versions/dependencies/26.1.0.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ build.ignore=false
33
build.release_type=beta
44

55
minecraft_version=26.1
6+
minecraft_version.additional=26.1.1,26.1.2
67
loader_version=0.19.2
78

89
fabric_version=0.145.1+26.1

0 commit comments

Comments
 (0)