Skip to content

Commit 0921769

Browse files
committed
One night without sleep | postblock finish. Need tests & drops config
1 parent d6494e1 commit 0921769

17 files changed

Lines changed: 248 additions & 321 deletions
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.algorithmlx.dimore.mixin;
2+
3+
import com.algorithmlx.dimore.ModKt;
4+
import com.algorithmlx.dimore.init.Registry;
5+
import net.minecraft.resources.ResourceKey;
6+
import net.minecraft.server.ReloadableServerRegistries;
7+
import net.minecraft.world.level.storage.loot.LootTable;
8+
import org.spongepowered.asm.mixin.Mixin;
9+
import org.spongepowered.asm.mixin.injection.At;
10+
import org.spongepowered.asm.mixin.injection.Inject;
11+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
12+
13+
@Mixin(ReloadableServerRegistries.Holder.class)
14+
public class LootDataManagerMixin {
15+
@Inject(method = "getLootTable", at = @At("HEAD"), cancellable = true)
16+
private void injectLootTable(ResourceKey<LootTable> id, CallbackInfoReturnable<LootTable> cir) {
17+
var key =
18+
//$ if >=1.21.11 'id.identifier();' else 'id.location();'
19+
id.identifier();
20+
if (key.getNamespace().equals(ModKt.ModId)) {
21+
var table = Registry.spawnCustomLoot().get(id);
22+
if (table != null)
23+
cir.setReturnValue(table);
24+
}
25+
}
26+
}
Lines changed: 49 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,62 @@
11
package com.algorithmlx.dimore.mixin;
22

3+
import com.algorithmlx.dimore.ModKt;
34
import com.algorithmlx.dimore.init.resource.DimOreResourcePack;
5+
import net.minecraft.network.chat.Component;
6+
import net.minecraft.server.packs.PackLocationInfo;
7+
import net.minecraft.server.packs.PackResources;
8+
import net.minecraft.server.packs.PackSelectionConfig;
9+
import net.minecraft.server.packs.repository.Pack;
10+
import net.minecraft.server.packs.repository.PackCompatibility;
411
import net.minecraft.server.packs.repository.PackRepository;
5-
import net.minecraft.server.packs.repository.RepositorySource;
12+
import net.minecraft.server.packs.repository.PackSource;
13+
import net.minecraft.world.flag.FeatureFlagSet;
614
import org.spongepowered.asm.mixin.Mixin;
715
import org.spongepowered.asm.mixin.injection.At;
816
import org.spongepowered.asm.mixin.injection.ModifyVariable;
917

10-
import java.util.ArrayList;
11-
import java.util.Arrays;
18+
import java.util.HashMap;
19+
import java.util.List;
20+
import java.util.Map;
21+
import java.util.Optional;
1222

1323
@Mixin(PackRepository.class)
1424
public class PackRepositoryMixin {
15-
@ModifyVariable(
16-
at = @At("HEAD"),
17-
method = "<init>*",
18-
argsOnly = true
19-
)
20-
private static RepositorySource[] onInit(RepositorySource[] value) {
21-
final var l = new ArrayList<>(Arrays.asList(value));
22-
l.add(src -> {
23-
final var pack = DimOreResourcePack.getAsPack();
24-
if (pack != null) src.accept(pack);
25-
});
26-
return l.toArray(new RepositorySource[0]);
25+
@ModifyVariable(method = "discoverAvailable", at = @At("RETURN"), name = "discovered")
26+
private Map<String, Pack> externalPack(Map<String, Pack> discovered) {
27+
var mutable = new HashMap<>(discovered);
28+
29+
var locationInfo = new PackLocationInfo(
30+
ModKt.ModId + "_generated_resources",
31+
Component.literal(ModKt.ModId + " generated"),
32+
PackSource.BUILT_IN,
33+
Optional.empty()
34+
);
35+
36+
Pack.ResourcesSupplier resolver = new Pack.ResourcesSupplier() {
37+
@Override
38+
public PackResources openPrimary(PackLocationInfo location) {
39+
return new DimOreResourcePack(location);
40+
}
41+
42+
@Override
43+
public PackResources openFull(PackLocationInfo location, Pack.Metadata metadata) {
44+
return openPrimary(location);
45+
}
46+
};
47+
48+
var meta = new Pack.Metadata(
49+
Component.literal(ModKt.ModId + " generated"),
50+
PackCompatibility.COMPATIBLE,
51+
FeatureFlagSet.of(),
52+
List.of()
53+
);
54+
55+
var selectionConfig = new PackSelectionConfig(true, Pack.Position.TOP, false);
56+
var customPack = new Pack(locationInfo, resolver, meta, selectionConfig);
57+
58+
mutable.put(locationInfo.id(), customPack);
59+
60+
return discovered;
2761
}
2862
}

src/main/kotlin/Mod.kt

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

33
import com.algorithmlx.dimore.init.config.CommentedJSONManager
44
import com.algorithmlx.dimore.init.Registry
5-
import com.algorithmlx.dimore.init.post.loot.SimpleGenerator
65
//? if neoforge {
76
/*import net.neoforged.bus.api.IEventBus
8-
import net.neoforged.fml.ModList
97
import net.neoforged.fml.common.Mod
108
*///?} else if fabric {
119
import com.algorithmlx.dimore.worldgen.OreConfig
12-
import net.fabricmc.loader.api.FabricLoader
10+
//?}
1311
import org.slf4j.Logger
1412
import org.slf4j.LoggerFactory
1513

16-
//?}
17-
1814
@JvmField
1915
val LOGGER: Logger = LoggerFactory.getLogger("DimOre")
2016
const val ModId: String = "dimore"
@@ -23,16 +19,13 @@ const val ModId: String = "dimore"
2319
/*@Mod(ModId)
2420
class Mod(bus: IEventBus) {
2521
init {
26-
SimpleGenerator.generateLootTables(ModList.get().isLoaded("kubeJs"))
27-
ConfigManager.load()
22+
CommentedJSONManager.load()
2823
Registry.init(bus)
2924
}
3025
}
3126
*///?} else {
3227
object Mod {
3328
fun onInitialize() {
34-
SimpleGenerator.generateLootTables(FabricLoader.getInstance().isModLoaded("kubejs"))
35-
3629
CommentedJSONManager.load()
3730
Registry.init()
3831
OreConfig.init()

src/main/kotlin/block/DimensionalOreBlock.kt

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

33
import com.algorithmlx.dimore.util.DimensionOre
4+
import com.algorithmlx.dimore.util.NameTarget
45
import com.algorithmlx.dimore.util.OreDimensionType
56
import com.algorithmlx.dimore.util.OreType
67
import net.minecraft.network.chat.MutableComponent
@@ -13,5 +14,5 @@ class DimensionalOreBlock(
1314
): DropExperienceBlock(
1415
oreType.experienceDrop, properties,
1516
), DimensionOre {
16-
override fun getName(): MutableComponent = buildName()
17+
override fun getName(): MutableComponent = if (oreDimensionType is NameTarget) buildName(oreDimensionType) else super.getName()
1718
}

src/main/kotlin/block/DimensionalRedstoneOre.kt

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

33
import com.algorithmlx.dimore.util.DimensionOre
4+
import com.algorithmlx.dimore.util.NameTarget
45
import com.algorithmlx.dimore.util.OreDimensionType
56
import com.algorithmlx.dimore.util.OreType
67
import com.algorithmlx.dimore.util.OreTypes
@@ -11,6 +12,6 @@ class DimensionalRedstoneOre(
1112
override val oreDimensionType: OreDimensionType,
1213
properties: Properties
1314
): RedStoneOreBlock(properties), DimensionOre {
14-
override fun getName(): MutableComponent = buildName()
15+
override fun getName(): MutableComponent = if (oreDimensionType is NameTarget) buildName(oreDimensionType) else super.getName()
1516
override val oreType: OreType = OreTypes.REDSTONE
1617
}

src/main/kotlin/init/Registry.kt

Lines changed: 42 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,25 @@ import com.algorithmlx.dimore.LOGGER
44
import com.algorithmlx.dimore.ModId
55
import com.algorithmlx.dimore.block.DimensionalOreBlock
66
import com.algorithmlx.dimore.block.DimensionalRedstoneOre
7+
import com.algorithmlx.dimore.init.post.PostBlock
8+
import com.algorithmlx.dimore.init.config.DimensionalOresConfig
79
import com.algorithmlx.dimore.item.NamedBlockItem
810
import com.algorithmlx.dimore.util.OreDimensionType
911
import com.algorithmlx.dimore.util.OreDimensionTypes
1012
import com.algorithmlx.dimore.util.OreType
1113
import com.algorithmlx.dimore.util.OreTypes
1214
import com.algorithmlx.dimore.util.ResLoc
15+
import kotlinx.serialization.ExperimentalSerializationApi
16+
import kotlinx.serialization.json.Json
17+
import kotlinx.serialization.json.decodeFromStream
1318
import net.minecraft.world.level.block.state.BlockBehaviour
1419
import net.minecraft.core.registries.Registries
1520
import net.minecraft.resources.ResourceKey
1621
import net.minecraft.world.item.Item
1722
import net.minecraft.world.level.block.Block
1823
import net.minecraft.world.level.block.Blocks
24+
import net.minecraft.world.level.block.RedStoneOreBlock
25+
import net.minecraft.world.level.storage.loot.LootTable
1926
//? if neoforge {
2027
/*import com.algorithmlx.dimore.worldgen.DimOreModifier
2128
import net.minecraft.core.Holder
@@ -27,23 +34,18 @@ import java.util.function.Supplier
2734
*///?}
2835
//? if fabric {
2936
import com.algorithmlx.dimore.init.config.CommentedJSONManager
30-
import com.algorithmlx.dimore.init.post.PostBlock
3137
import com.algorithmlx.dimore.util.DimensionOreConfig
3238
import com.algorithmlx.dimore.util.OreGeneratorFactory
33-
import kotlinx.serialization.ExperimentalSerializationApi
34-
import kotlinx.serialization.json.Json
35-
import kotlinx.serialization.json.decodeFromStream
3639
import net.fabricmc.fabric.api.event.registry.DynamicRegistrySetupCallback
3740
import net.minecraft.core.Registry
3841
import net.minecraft.core.registries.BuiltInRegistries
39-
import net.minecraft.world.level.block.RedStoneOreBlock
4042
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature
4143
import net.minecraft.world.level.levelgen.placement.PlacedFeature
42-
import java.io.File
43-
4444
//?}
45+
import java.io.File
4546

4647
object Registry {
48+
private val postBlocks = mutableMapOf<String, PostBlock>()
4749
//? if neoforge {
4850
/*private val blockRegistry = DeferredRegister.createBlocks(ModId)
4951
private val itemRegistry = DeferredRegister.createItems(ModId)
@@ -100,6 +102,8 @@ object Registry {
100102
val id = "custom.${it.name.removeSuffix(".json")}"
101103
val config: PostBlock = json.decodeFromStream(it.inputStream())
102104

105+
postBlocks[id] = config
106+
103107
if (!config.isRedstone) this.registerBlock(
104108
id, ::Block,
105109
config.properties.asBlockBehaviourProperties(), true
@@ -110,9 +114,10 @@ object Registry {
110114
}
111115
}
112116

117+
fun getPostBlocks(): Map<String, PostBlock> = mapOf(*postBlocks.entries.map { it.toPair() }.toTypedArray())
118+
113119
private fun registerOres() {
114120
// Nether Ores
115-
116121
OreTypes.netherOres.forEach {
117122
val id = "nether_${it.name.lowercase()}_ore"
118123
if (it == OreTypes.REDSTONE) {
@@ -124,7 +129,6 @@ object Registry {
124129
}
125130

126131
// Overworld ores
127-
128132
OreTypes.overworldOres.forEach {
129133
val id = "stone_${it.name.lowercase()}_ore"
130134
val deepSlateId = "deepslate_${it.name.lowercase()}_ore"
@@ -145,6 +149,11 @@ object Registry {
145149
}
146150
}
147151

152+
@JvmStatic
153+
fun spawnCustomLoot(): MutableMap<ResourceKey<LootTable>, LootTable> {
154+
return mutableMapOf()
155+
}
156+
148157
private fun registerOre(id: String, oreType: OreType, oreDimensionType: OreDimensionType) = registerBlock(
149158
id,
150159
{ p -> DimensionalOreBlock(oreType, oreDimensionType, p) },
@@ -202,13 +211,11 @@ object Registry {
202211
OreTypes.netherOres.forEach { type ->
203212
val id = "nether_${type.name.lowercase()}_ore"
204213
val config = OreTypes.configByTypeNether[type] ?: return@forEach
205-
//? if >1.21.1 {
214+
206215
val block = BuiltInRegistries.BLOCK.get(ResLoc.fromNamespaceAndPath(ModId, id))
207-
.orElseThrow()
216+
//$ if >1.21.1 '.orElseThrow().value()' else ''
217+
.orElseThrow().value()
208218
.value()
209-
//?} else {
210-
/*val block = BuiltInRegistries.BLOCK.get(ResLoc.fromNamespaceAndPath(ModId, id))
211-
*///?}
212219

213220
createFeature(cfReg, pfReg, id, block, OreDimensionTypes.NETHER, config)
214221
}
@@ -220,18 +227,12 @@ object Registry {
220227
val deepslateId = "deepslate_${type.name.lowercase()}_ore"
221228
val config = OreTypes.configByTypeOverworld[type] ?: return@forEach
222229

223-
//? if >1.21.1 {
224230
val stoneBlock = BuiltInRegistries.BLOCK.get(ResLoc.fromNamespaceAndPath(ModId, stoneId))
225-
.orElseThrow()
226-
.value()
227-
val deepslateBlock =
228-
BuiltInRegistries.BLOCK.get(ResLoc.fromNamespaceAndPath(ModId, deepslateId))
229-
.orElseThrow()
230-
.value()
231-
//?} else {
232-
/*val stoneBlock = BuiltInRegistries.BLOCK.get(ResLoc.fromNamespaceAndPath(ModId, stoneId))
231+
//$ if >1.21.1 '.orElseThrow().value()' else ''
232+
.orElseThrow().value()
233233
val deepslateBlock = BuiltInRegistries.BLOCK.get(ResLoc.fromNamespaceAndPath(ModId, deepslateId))
234-
*///?}
234+
//$ if >1.21.1 '.orElseThrow().value()' else ''
235+
.orElseThrow().value()
235236

236237
createFeature(cfReg, pfReg, stoneId, stoneBlock, OreDimensionTypes.OVERWORLD, config)
237238
createFeature(cfReg, pfReg, deepslateId, deepslateBlock, OreDimensionTypes.OVERWORLD_DEEPSLATE, config)
@@ -242,17 +243,28 @@ object Registry {
242243
OreTypes.endOres.forEach { type ->
243244
val id = "end_${type.name.lowercase()}_ore"
244245
val config = OreTypes.configByTypeEnd[type] ?: return@forEach
245-
//? if >1.21.1 {
246246
val block = BuiltInRegistries.BLOCK.get(ResLoc.fromNamespaceAndPath(ModId, id))
247-
.orElseThrow()
248-
.value()
249-
//?} else {
250-
/*val block = BuiltInRegistries.BLOCK.get(ResLoc.fromNamespaceAndPath(ModId, id))
251-
*///?}
247+
//$ if >1.21.1 '.orElseThrow().value()' else ''
248+
.orElseThrow().value()
252249

253250
createFeature(cfReg, pfReg, id, block, OreDimensionTypes.END, config)
254251
}
255252
}
253+
254+
this.getPostBlocks().forEach { (id, block) ->
255+
val settings = block.generationSettings
256+
val generationConfig = settings.config
257+
val convertedConfig = DimensionalOresConfig.OreGenerationSettings(
258+
true, generationConfig.size, generationConfig.count,
259+
generationConfig.minHeight, generationConfig.maxHeight
260+
)
261+
262+
val mcBlock = BuiltInRegistries.BLOCK.get(ResLoc.fromNamespaceAndPath(ModId, id))
263+
//$ if >1.21.1 '.orElseThrow().value()' else ''
264+
.orElseThrow().value()
265+
266+
createFeature(cfReg, pfReg, id, mcBlock, settings.asDimensionType(), convertedConfig)
267+
}
256268
}
257269

258270
private fun createFeature(

src/main/kotlin/init/config/CommentedJSONManager.kt

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

3+
import com.algorithmlx.dimore.ModId
34
import com.algorithmlx.dimore.init.post.ExampleBlock
45
import com.algorithmlx.dimore.init.post.PostBlock
56
import kotlinx.serialization.*
@@ -29,8 +30,8 @@ object CommentedJSONManager {
2930
private set
3031

3132
fun load() {
32-
val configFile = File("config/dimore/dimore.json")
33-
val defaultBlockFile = File("config/dimore/custom/_example_block.json")
33+
val configFile = File("config/${ModId}/common.json")
34+
val defaultBlockFile = File("config/${ModId}/custom/_example_block.json")
3435

3536
config = saveOrLoad(configFile, config, DimensionalOresConfig::class)
3637

0 commit comments

Comments
 (0)