Skip to content

Commit 6bf9686

Browse files
committed
test #1
1 parent 6ace360 commit 6bf9686

10 files changed

Lines changed: 216 additions & 22 deletions

File tree

buildSrc/src/main/kotlin/multiloader-loader.gradle.kts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ plugins {
1010
val commonJava: Configuration by configurations.creating {
1111
isCanBeResolved = true
1212
}
13+
1314
val commonResources: Configuration by configurations.creating {
1415
isCanBeResolved = true
1516
}
@@ -76,7 +77,14 @@ val generateIdeaRunConfig = tasks.register("generateIdeaRunConfig") {
7677
if (current != text) {
7778
runFile.parentFile.mkdirs()
7879
Files.writeString(runFile.toPath(), text, StandardCharsets.UTF_8)
79-
println("Updated run config: ${runFile.absolutePath}")
80+
81+
if(side == "Server") {
82+
val eulaContent = """
83+
eula=true
84+
""".trimIndent()
85+
val eulaFile = rootProject.file("${loader}/versions/${version}/run/eula.txt")
86+
Files.writeString(eulaFile.toPath(), eulaContent, StandardCharsets.UTF_8)
87+
}
8088
}
8189
}
8290
}

common/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,11 @@ val commonResources: Configuration by configurations.creating {
111111
artifacts {
112112
afterEvaluate {
113113
val mainSourceSet = sourceSets.main.get()
114+
114115
mainSourceSet.java.sourceDirectories.files.forEach {
115116
add(commonJava.name, it)
116117
}
118+
117119
mainSourceSet.resources.sourceDirectories.files.forEach {
118120
add(commonResources.name, it)
119121
}

common/src/main/java/com/faboslav/structurify/common/config/data/WorldgenDataProvider.java

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -100,14 +100,12 @@ public static Map<String, StructureNamespaceData> loadStructureNamespaces() {
100100
Map<String, StructureNamespaceData> structuresNamespaces = new TreeMap<>(alphabeticallComparator);
101101
structuresNamespaces.put(StructureNamespaceData.GLOBAL_NAMESPACE_IDENTIFIER, new StructureNamespaceData());
102102

103-
var registryManager = StructurifyRegistryManagerProvider.getRegistryManager();
103+
var structureRegistry = StructurifyRegistryManagerProvider.getStructureRegistry();
104104

105-
if (registryManager == null) {
105+
if (structureRegistry == null) {
106106
return structuresNamespaces;
107107
}
108108

109-
var structureRegistry = registryManager.lookupOrThrow(Registries.STRUCTURE);
110-
111109
for (var structureReference : structureRegistry.listElements().toList()) {
112110
String structureNamespace = structureReference.key()/*? if >= 1.21.11 {*/.identifier()/*?} else {*//*.location()*//*?}*/.getNamespace();
113111

@@ -120,14 +118,13 @@ public static Map<String, StructureNamespaceData> loadStructureNamespaces() {
120118
}
121119

122120
public static Map<String, StructureData> loadStructures() {
123-
var registryManager = StructurifyRegistryManagerProvider.getRegistryManager();
121+
var structureRegistry = StructurifyRegistryManagerProvider.getStructureRegistry();
122+
var biomeRegistry =StructurifyRegistryManagerProvider.getBiomeRegistry();
124123

125-
if (registryManager == null) {
124+
if (structureRegistry == null || biomeRegistry == null) {
126125
return Collections.emptyMap();
127126
}
128127

129-
var structureRegistry = registryManager.lookupOrThrow(Registries.STRUCTURE);
130-
var biomeRegistry = registryManager.lookupOrThrow(Registries.BIOME);
131128
Map<String, StructureData> structures = new TreeMap<>(alphabeticallComparator);
132129

133130
for (var structureReference : structureRegistry.listElements().toList()) {
@@ -305,13 +302,12 @@ public static Map<String, StructureData> loadStructures() {
305302
}
306303

307304
public static Map<String, StructureSetData> loadStructureSets() {
308-
var registryManager = StructurifyRegistryManagerProvider.getRegistryManager();
305+
var structureSetRegistry = StructurifyRegistryManagerProvider.getStructureSetRegistry();
309306

310-
if (registryManager == null) {
307+
if (structureSetRegistry == null) {
311308
return Collections.emptyMap();
312309
}
313310

314-
var structureSetRegistry = registryManager.lookupOrThrow(Registries.STRUCTURE_SET);
315311
Map<String, StructureSetData> structureSets = new TreeMap<>();
316312

317313
for (var structureSetReference : structureSetRegistry.listElements().toList()) {

common/src/main/java/com/faboslav/structurify/common/registry/StructurifyRegistryManagerProvider.java

Lines changed: 127 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,31 +2,50 @@
22

33
import com.faboslav.structurify.common.Structurify;
44
import com.mojang.serialization.Codec;
5+
import com.mojang.serialization.Lifecycle;
56
import net.minecraft.core.*;
67
import net.minecraft.resources.RegistryDataLoader;
78
import net.minecraft.resources.ResourceKey;
9+
import net.minecraft.resources.Identifier;
810
import net.minecraft.server.packs.PackType;
911
import net.minecraft.server.packs.resources.MultiPackResourceManager;
12+
import net.minecraft.server.packs.resources.ResourceManager;
13+
import net.minecraft.tags.TagKey;
14+
import net.minecraft.tags.TagLoader;
15+
import net.minecraft.util.Util;
16+
import net.minecraft.commands.Commands;
1017
import net.minecraft.core.registries.Registries;
18+
import net.minecraft.server.WorldLoader;
19+
import net.minecraft.server.WorldStem;
1120
import net.minecraft.server.packs.repository.PackRepository;
1221
import net.minecraft.server.packs.repository.RepositorySource;
22+
import net.minecraft.world.level.WorldDataConfiguration;
1323
import net.minecraft.world.level.biome.Biome;
1424
import net.minecraft.world.level.levelgen.carver.ConfiguredWorldCarver;
1525
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
1626
import net.minecraft.world.level.levelgen.placement.PlacedFeature;
27+
import net.minecraft.world.level.levelgen.presets.WorldPresets;
1728
import net.minecraft.world.level.levelgen.structure.Structure;
1829
import net.minecraft.world.level.levelgen.structure.StructureSet;
1930
import net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool;
2031
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorType;
2132
import org.jetbrains.annotations.Nullable;
33+
34+
import java.util.Collection;
35+
import java.util.HashMap;
2236
import java.util.List;
37+
import java.util.Map;
38+
39+
//? if >= 1.21.11 {
40+
import net.minecraft.server.permissions.PermissionSet;
41+
//?}
2342

2443
//? if >= 1.21.3 {
2544
import net.minecraft.server.RegistryLayer;
2645
import net.minecraft.tags.TagLoader;
2746
//?} else {
2847
/*import net.minecraft.core.registries.BuiltInRegistries;
29-
*///?}
48+
*///?}
3049

3150
//? if >= 26.1 {
3251
import net.minecraft.resources.RegistryValidator;
@@ -70,10 +89,79 @@ public static HolderLookup.RegistryLookup<Structure> getStructureRegistry() {
7089
return registryManager.lookup(Registries.STRUCTURE).orElse(null);
7190
}
7291

92+
@Nullable
93+
public static HolderLookup.RegistryLookup<StructureSet> getStructureSetRegistry() {
94+
var registryManager = StructurifyRegistryManagerProvider.getRegistryManager();
95+
96+
if (registryManager == null) {
97+
return null;
98+
}
99+
100+
return registryManager.lookup(Registries.STRUCTURE_SET).orElse(null);
101+
}
102+
73103
public static void setRegistryManager(HolderLookup.Provider registryAccess) {
74104
registryManager = registryAccess;
75105
}
76106

107+
public static void loadRegistryManager2() {
108+
if (isLoading) {
109+
return;
110+
}
111+
112+
isLoading = true;
113+
try {
114+
Structurify.getLogger().info("Loading registry manager...");
115+
var resourcePackProviders = StructurifyResourcePackProvider.getResourcePackProviders();
116+
117+
for (var resourcePackProvider : resourcePackProviders) {
118+
Structurify.getLogger().info("Registering resource pack provider: " + resourcePackProvider.getClass().getSimpleName());
119+
}
120+
121+
var resourcePackManager = new PackRepository(StructurifyResourcePackProvider.getResourcePackProviders().toArray(new RepositorySource[0]));
122+
var dataPacks = new WorldLoader.PackConfig(resourcePackManager, WorldDataConfiguration.DEFAULT, false, false);
123+
var serverConfig = new WorldLoader.InitConfig(dataPacks, Commands.CommandSelection.INTEGRATED, /*? if >= 1.21.11 {*/PermissionSet.ALL_PERMISSIONS/*?} else {*//*2*//*?}*/);
124+
125+
var saveLoader = Util.blockUntilDone(executor ->
126+
WorldLoader.load(serverConfig, loadContextSupplierContext -> {
127+
var registry = new MappedRegistry<>(Registries.LEVEL_STEM, Lifecycle.stable()).freeze();
128+
129+
//? if >=1.21.3 {
130+
var dimensionsConfig = loadContextSupplierContext
131+
.datapackWorldgen()
132+
.lookupOrThrow(Registries.WORLD_PRESET)
133+
.getOrThrow(WorldPresets.FLAT)
134+
.value()
135+
.createWorldDimensions()
136+
.bake(registry);
137+
//?} else {
138+
/*var dimensionsConfig = loadContextSupplierContext
139+
.datapackWorldgen()
140+
.registryOrThrow(Registries.WORLD_PRESET)
141+
.getHolderOrThrow(WorldPresets.FLAT)
142+
.value()
143+
.createWorldDimensions()
144+
.bake(registry);
145+
*///?}
146+
147+
return new WorldLoader.DataLoadOutput<>(null, dimensionsConfig.dimensionsRegistryAccess());
148+
}, WorldStem::new, Util.backgroundExecutor(), executor)
149+
).get();
150+
151+
if (saveLoader == null || saveLoader.registries() == null) {
152+
Structurify.getLogger().error("SaveLoader or CombinedDynamicRegistries is null.");
153+
return;
154+
}
155+
156+
setRegistryManager(saveLoader.registries().compositeAccess());
157+
Structurify.getLogger().info("Finished loading registry manager");
158+
} catch (Exception exception) {
159+
Structurify.getLogger().error("Failed to load registry manager.", exception);
160+
} finally {
161+
isLoading = false;
162+
}
163+
}
164+
77165
public static void loadRegistryManager() {
78166
if (isLoading) {
79167
return;
@@ -118,7 +206,7 @@ public static void loadRegistryManager() {
118206
);
119207
//?} else {
120208
/*var baseRegistryAccess = RegistryAccess.fromRegistryOfRegistries(BuiltInRegistries.REGISTRY);
121-
*///?}
209+
*///?}
122210
//? if >= 26.1 {
123211
var registryAccess = Util.blockUntilDone(executor ->
124212
RegistryDataLoader.load(
@@ -136,6 +224,17 @@ public static void loadRegistryManager() {
136224
);
137225
*///?}
138226

227+
//? if <= 1.21.1 {
228+
/*bindRegistryTags(resourceManager, registryAccess, Registries.BIOME);
229+
bindRegistryTags(resourceManager, registryAccess, Registries.CONFIGURED_CARVER);
230+
bindRegistryTags(resourceManager, registryAccess, Registries.PROCESSOR_LIST);
231+
bindRegistryTags(resourceManager, registryAccess, Registries.TEMPLATE_POOL);
232+
bindRegistryTags(resourceManager, registryAccess, Registries.CONFIGURED_FEATURE);
233+
bindRegistryTags(resourceManager, registryAccess, Registries.PLACED_FEATURE);
234+
bindRegistryTags(resourceManager, registryAccess, Registries.STRUCTURE);
235+
bindRegistryTags(resourceManager, registryAccess, Registries.STRUCTURE_SET);
236+
*///?}
237+
139238
setRegistryManager(registryAccess);
140239
}
141240

@@ -152,8 +251,31 @@ private static <T> RegistryDataLoader.RegistryData<T> getRegistryDataLoader(Reso
152251
return new RegistryDataLoader.RegistryData<>(key, codec, RegistryValidator.none());
153252
//?} else if >= 1.21.1 {
154253
/*return new RegistryDataLoader.RegistryData<>(key, codec, false);
155-
*///?} else {
254+
*///?} else {
156255
/*return new RegistryDataLoader.RegistryData<>(key, codec);
157-
*///?}
256+
*///?}
257+
}
258+
259+
//? if <= 1.21.1 {
260+
/*private static <T> void bindRegistryTags(
261+
ResourceManager resourceManager,
262+
RegistryAccess registryAccess,
263+
ResourceKey<? extends Registry<T>> registryKey
264+
) {
265+
Registry<T> registry = registryAccess.registryOrThrow(registryKey);
266+
String tagsDirectory =
267+
//? if >= 1.21 {
268+
Registries.tagsDirPath(registryKey)
269+
//?} else {
270+
/^"tags/" + registryKey.location().getPath()
271+
^///?}
272+
273+
;
274+
TagLoader<Holder<T>> loader = new TagLoader<>(id -> registry.getHolder(ResourceKey.create(registryKey, id)), tagsDirectory);
275+
Map<Identifier, Collection<Holder<T>>> loadedTags = loader.loadAndBuild(resourceManager);
276+
Map<TagKey<T>, List<Holder<T>>> tags = new HashMap<>();
277+
loadedTags.forEach((id, holders) -> tags.put(TagKey.create(registryKey, id), List.copyOf(holders)));
278+
registry.bindTags(tags);
158279
}
159-
}
280+
*///?}
281+
}
Binary file not shown.

fabric/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ dependencies {
3535
addEmbeddedFabricModule("fabric-rendering-v1")
3636
addEmbeddedFabricModule("fabric-lifecycle-events-v1")
3737
addEmbeddedFabricModule("fabric-command-api-v2")
38+
addEmbeddedFabricModule("fabric-gametest-api-v1")
3839
//modApi("net.fabricmc.fabric-api:fabric-api:${commonMod.dep("fabric_api")}+${commonMod.mc}")
3940

4041
// Required dependencies

fabric/src/main/java/com/faboslav/structurify/fabric/StructurifyFabric.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,6 @@ private void onDatapackReload(RegistryAccess registryAccess, boolean isClient) {
3434

3535
private void onServerStart(MinecraftServer minecraftServer) {
3636
StructurifyRegistryManagerProvider.setRegistryManager(minecraftServer.registryAccess());
37-
UpdateRegistriesEvent.EVENT.invoke(new UpdateRegistriesEvent(StructurifyRegistryManagerProvider.getRegistryManager()));
37+
UpdateRegistriesEvent.EVENT.invoke(new UpdateRegistriesEvent(minecraftServer.registryAccess()));
3838
}
3939
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package com.faboslav.structurify.fabric.tests;
2+
3+
import com.faboslav.structurify.common.Structurify;
4+
import net.fabricmc.fabric.api.gametest.v1.GameTest;
5+
import net.minecraft.commands.CommandSource;
6+
import net.minecraft.commands.CommandSourceStack;
7+
import net.minecraft.core.BlockPos;
8+
import net.minecraft.gametest.framework.GameTestHelper;
9+
import net.minecraft.network.chat.Component;
10+
import net.minecraft.server.permissions.PermissionSet;
11+
12+
import java.util.ArrayList;
13+
import java.util.List;
14+
15+
public class StructureLocateTest
16+
{
17+
@GameTest
18+
public void structureLocateTest(GameTestHelper context) {
19+
20+
var level = context.getLevel();
21+
var server = level.getServer();
22+
List<Component> output = new ArrayList<>();
23+
final boolean[] success = {false};
24+
final int[] result = {0};
25+
CommandSource recordingSource = new CommandSource() {
26+
@Override
27+
public void sendSystemMessage(Component message) {
28+
output.add(message);
29+
}
30+
@Override
31+
public boolean acceptsSuccess() {
32+
return true;
33+
}
34+
@Override
35+
public boolean acceptsFailure() {
36+
return true;
37+
}
38+
@Override
39+
public boolean shouldInformAdmins() {
40+
return false;
41+
}
42+
};
43+
CommandSourceStack source = server.createCommandSourceStack()
44+
.withSource(recordingSource)
45+
.withLevel(level)
46+
.withPosition(context.absolutePos(BlockPos.ZERO).getCenter())
47+
.withPermission(PermissionSet.ALL_PERMISSIONS)
48+
.withCallback((wasSuccessful, returnValue) -> {
49+
success[0] = wasSuccessful;
50+
result[0] = returnValue;
51+
});
52+
server.getCommands().performPrefixedCommand(
53+
source,
54+
"locate structure structurify:your_structure"
55+
);
56+
for (Component message : output) {
57+
context.assertTrue(message.getString().contains("There is no structure with type"), "fail");
58+
}
59+
context.succeed();
60+
61+
}
62+
}

fabric/src/main/resources/fabric.mod.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@
2525
],
2626
"modmenu": [
2727
"com.faboslav.structurify.fabric.modcompat.ModMenuCompat"
28+
],
29+
"fabric-gametest": [
30+
"com.faboslav.structurify.fabric.tests.StructureLocateTest"
2831
]
2932
},
3033
"mixins": [

forge/build.gradle.kts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -119,15 +119,15 @@ dependencies {
119119
include("required", "optional", "embedded")
120120
}
121121
for (mod in fossilsAndArcheologyRevivalWithDeps) modImplementation(mod)
122-
modImplementation(fletchingTable.modrinth("fungal-infectionspore", commonMod.mc, "forge"))
123-
modImplementation(fletchingTable.modrinth("dungeons-enhanced", commonMod.mc, "forge"))
122+
//modImplementation(fletchingTable.modrinth("fungal-infectionspore", commonMod.mc, "forge"))
123+
//modImplementation(fletchingTable.modrinth("dungeons-enhanced", commonMod.mc, "forge"))
124124
//modImplementation(fletchingTable.modrinth("legendary-monsters", commonMod.mc, "forge"))
125-
modImplementation(fletchingTable.modrinth("wits", commonMod.mc, "forge"))
125+
/*
126126
val endersCataclysmWithDeps: List<Dependency> = fletchingTable.modrinthBundle("l_enders-cataclysm", commonMod.mc, "forge") {
127127
recursive = true
128128
include("required", "optional", "embedded")
129129
}
130-
for (mod in endersCataclysmWithDeps) modImplementation(mod)
130+
for (mod in endersCataclysmWithDeps) modImplementation(mod)*/
131131

132132
// For debugging
133133
// modImplementation(modrinth("blue-skies", "1.3.31")) { transitive = false }

0 commit comments

Comments
 (0)