Skip to content

Commit 669d6b8

Browse files
committed
Implemented Custom Registries
1 parent bcd0b86 commit 669d6b8

69 files changed

Lines changed: 1932 additions & 749 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

build.gradle

Lines changed: 27 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ plugins {
88
id 'net.neoforged.moddev' version "2.0.141"
99
}
1010

11-
ext.ENV = System.getenv()
11+
def ENV = System.getenv()
12+
def CI = ENV.CI == "true"
1213
def isLocal = !ENV.containsKey("GITHUB_RUN_NUMBER")
1314

1415
version = "$mod_version-${isLocal ? "local.${Instant.now().epochSecond}" : "build.${ENV.GITHUB_RUN_NUMBER}"}"
@@ -20,8 +21,7 @@ println("Building version: $version")
2021
neoForge {
2122
enable {
2223
version = project.neoforge_version
23-
validateAccessTransformers = ENV.CI != "true"
24-
disableRecompilation = ENV.CI == "true"
24+
validateAccessTransformers = !CI
2525

2626
accessTransformers {
2727
publish(project.file('src/main/resources/META-INF/accesstransformer.cfg'))
@@ -40,7 +40,7 @@ neoForge {
4040
client {
4141
ideName = 'Client'
4242
client()
43-
systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id
43+
// systemProperty 'neoforge.enabledGameTestNamespaces', project.mod_id
4444

4545
if (ENV.MC_CLIENT_ARGS) {
4646
programArguments.addAll(ENV.MC_CLIENT_ARGS.split(' '))
@@ -86,23 +86,6 @@ tasks.withType(Javadoc) {
8686
options.addStringOption('Xdoclint:none', '-quiet')
8787
}
8888

89-
repositories {
90-
mavenLocal()
91-
mavenCentral()
92-
93-
maven {
94-
url "https://maven.neoforged.net/releases"
95-
}
96-
97-
maven {
98-
name = 'ParchmentMC'
99-
url = 'https://maven.parchmentmc.org'
100-
content {
101-
includeGroup "org.parchmentmc.data"
102-
}
103-
}
104-
}
105-
10689
processResources {
10790
def toReplace = [
10891
"version": project.version
@@ -153,31 +136,29 @@ publishing {
153136

154137
idea {
155138
module {
156-
if (ENV.CI != "true") {
157-
downloadSources = true
158-
downloadJavadoc = true
159-
160-
["client", "server"].each {
161-
[
162-
"config",
163-
"crash-reports",
164-
"debug",
165-
"downloads",
166-
"flashback",
167-
"local",
168-
"logs",
169-
"mods",
170-
"pack-sync",
171-
"profilekeys",
172-
"saves",
173-
"voicechat_recordings",
174-
"command_history.txt",
175-
"options.txt",
176-
"server.properties",
177-
"world",
178-
].each { ext ->
179-
excludeDirs.add(file("runs/$it/$ext"))
180-
}
139+
downloadSources = true
140+
downloadJavadoc = true
141+
142+
["client", "server"].each {
143+
[
144+
"config",
145+
"crash-reports",
146+
"debug",
147+
"downloads",
148+
"flashback",
149+
"local",
150+
"logs",
151+
"mods",
152+
"pack-sync",
153+
"profilekeys",
154+
"saves",
155+
"voicechat_recordings",
156+
"command_history.txt",
157+
"options.txt",
158+
"server.properties",
159+
"world",
160+
].each { ext ->
161+
excludeDirs.add(file("runs/$it/$ext"))
181162
}
182163
}
183164
}

settings.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@ plugins {
1212
id 'org.gradle.toolchains.foojay-resolver-convention' version '1.0.0'
1313
}
1414

15-
rootProject.name = 'klib'
15+
rootProject.name = 'KLib 26.1'
Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,35 @@
11
package dev.latvian.mods.klib;
22

3-
import dev.latvian.mods.klib.data.DataTypeRegistry;
4-
import dev.latvian.mods.klib.data.DataTypes;
5-
import dev.latvian.mods.klib.data.JOMLDataTypes;
3+
import dev.latvian.mods.klib.color.Gradient;
4+
import dev.latvian.mods.klib.data.DataType;
5+
import dev.latvian.mods.klib.data.DataTypeCommandInfoRegistry;
6+
import dev.latvian.mods.klib.interpolation.Interpolation;
7+
import dev.latvian.mods.klib.platform.PlatformHelper;
8+
import dev.latvian.mods.klib.registry.CustomRegistry;
9+
import dev.latvian.mods.klib.registry.CustomRegistryCollector;
10+
import dev.latvian.mods.klib.shape.Shape;
11+
import org.slf4j.Logger;
12+
import org.slf4j.LoggerFactory;
613

714
public class KLib {
815
public static final String ID = "klib";
916
public static final String NAME = "KLib";
17+
public static final Logger LOGGER = LoggerFactory.getLogger(NAME);
1018
public static String VERSION = "dev";
1119

12-
public static void registerDataTypes(DataTypeRegistry registry) {
13-
DataTypes.register(registry);
14-
JOMLDataTypes.register(registry);
20+
public static void setup() {
21+
var helper = PlatformHelper.CURRENT;
22+
CustomRegistry.registerAll(helper::collectCustomRegistries);
23+
DataType.REGISTRY.registerTypes(helper::collectDataTypes);
24+
DataTypeCommandInfoRegistry.registerAll(helper::collectDataTypeCommandInfos);
25+
Interpolation.REGISTRY.registerTypes(helper::collectInterpolationTypes);
26+
Shape.REGISTRY.registerTypes(helper::collectShapeTypes);
27+
}
28+
29+
public static void builtInRegistries(CustomRegistryCollector registry) {
30+
registry.register(DataType.DATA_TYPE, DataType.REGISTRY);
31+
registry.register(Interpolation.DATA_TYPE, Interpolation.REGISTRY);
32+
registry.register(Shape.DATA_TYPE, Shape.REGISTRY);
33+
registry.register(Gradient.DATA_TYPE, Gradient.REGISTRY);
1534
}
1635
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package dev.latvian.mods.klib;
2+
3+
import com.mojang.brigadier.CommandDispatcher;
4+
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
5+
import dev.latvian.mods.klib.registry.CustomRegistry;
6+
import dev.latvian.mods.klib.registry.CustomRegistryType;
7+
import net.minecraft.ChatFormatting;
8+
import net.minecraft.commands.CommandBuildContext;
9+
import net.minecraft.commands.CommandSourceStack;
10+
import net.minecraft.commands.Commands;
11+
import net.minecraft.network.chat.Component;
12+
13+
public class KLibCommands {
14+
public static void register(CommandDispatcher<CommandSourceStack> dispatcher, CommandBuildContext context) {
15+
var regCommand = Commands.literal("custom-registry");
16+
17+
for (var registry : CustomRegistry.ALL.values()) {
18+
if (registry.side().isServer()) {
19+
regCommand.then(registryCommands(registry, context));
20+
}
21+
}
22+
23+
dispatcher.register(Commands.literal("klib")
24+
.requires(Commands.hasPermission(Commands.LEVEL_GAMEMASTERS))
25+
.then(regCommand)
26+
);
27+
}
28+
29+
private static <T> LiteralArgumentBuilder<CommandSourceStack> registryCommands(CustomRegistry<?, T> registry, CommandBuildContext context) {
30+
return Commands.literal(registry.registryKeys().root().identifier().toString())
31+
.then(Commands.literal("print")
32+
.executes(ctx -> {
33+
ctx.getSource().sendSuccess(() -> Component.literal("=== " + registry.registryKeys().root().identifier() + " ==="), false);
34+
ctx.getSource().sendSuccess(() -> Component.literal("Types:").withStyle(ChatFormatting.GRAY), false);
35+
36+
for (var type : registry.typeMap().entrySet()) {
37+
ctx.getSource().sendSuccess(() -> Component.literal(registry.registryKeys().encode(type.getKey())).withStyle(type.getValue().instance() == null ? ChatFormatting.GOLD : ChatFormatting.GREEN), false);
38+
}
39+
40+
ctx.getSource().sendSuccess(() -> Component.literal("Values:").withStyle(ChatFormatting.GRAY), false);
41+
42+
var format = "%0" + String.valueOf(registry.valueMap().size()).length() + "d ";
43+
44+
ctx.getSource().sendSuccess(() -> Component.empty().append(format.formatted(0)).append(Component.literal("null").withStyle(ChatFormatting.GRAY)), false);
45+
ctx.getSource().sendSuccess(() -> Component.empty().append(format.formatted(1)).append(Component.literal("custom").withStyle(ChatFormatting.GRAY)), false);
46+
47+
for (var entry : registry.valueMap().entrySet()) {
48+
var color = registry.getType(entry.getValue()) instanceof CustomRegistryType.Unit<?, T> ? ChatFormatting.GOLD : ChatFormatting.GREEN;
49+
50+
ctx.getSource().sendSuccess(() -> Component.empty()
51+
.append(format.formatted(registry.getValueIndex(entry.getValue())))
52+
.append(Component.literal(registry.registryKeys().encode(entry.getKey())).withStyle(ChatFormatting.YELLOW))
53+
.append(": ")
54+
.append(Component.literal(String.valueOf(entry.getValue())).withStyle(color)), false);
55+
}
56+
57+
return 1;
58+
})
59+
)
60+
.then(Commands.literal("parse")
61+
.then(Commands.argument("value", registry.dataType().argument(context))
62+
.executes(ctx -> {
63+
var value = registry.dataType().get(ctx, "value");
64+
65+
if (registry.getType(value) instanceof CustomRegistryType.Unit<?, T> unit) {
66+
ctx.getSource().sendSuccess(() -> Component.literal(registry.registryKeys().encode(unit.key())).withStyle(ChatFormatting.GOLD), false);
67+
} else {
68+
ctx.getSource().sendSuccess(() -> Component.literal(String.valueOf(value)).withStyle(ChatFormatting.GREEN), false);
69+
}
70+
71+
return 1;
72+
})
73+
)
74+
);
75+
}
76+
}
Lines changed: 53 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,26 @@
11
package dev.latvian.mods.klib;
22

33
import dev.latvian.mods.klib.command.KLibCommandArgumentTypes;
4-
import dev.latvian.mods.klib.data.DataTypeRegistry;
5-
import dev.latvian.mods.klib.data.DataTypeRegistryEvent;
4+
import dev.latvian.mods.klib.net.SyncCustomRegistryMetaPayload;
5+
import dev.latvian.mods.klib.net.SyncCustomRegistryValuesPayload;
66
import dev.latvian.mods.klib.platform.NeoPlatformHelper;
77
import dev.latvian.mods.klib.platform.PlatformHelper;
8+
import dev.latvian.mods.klib.registry.CustomRegistry;
9+
import dev.latvian.mods.klib.util.Cast;
810
import net.neoforged.bus.api.IEventBus;
911
import net.neoforged.bus.api.SubscribeEvent;
1012
import net.neoforged.fml.ModContainer;
11-
import net.neoforged.fml.ModLoader;
1213
import net.neoforged.fml.common.EventBusSubscriber;
1314
import net.neoforged.fml.common.Mod;
1415
import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent;
16+
import net.neoforged.neoforge.event.OnDatapackSyncEvent;
17+
import net.neoforged.neoforge.event.RegisterCommandsEvent;
18+
import net.neoforged.neoforge.event.server.ServerStartingEvent;
19+
import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent;
20+
import net.neoforged.neoforge.network.handling.IPayloadContext;
21+
22+
import java.util.function.Function;
23+
import java.util.stream.Collectors;
1524

1625
@Mod(KLib.ID)
1726
@EventBusSubscriber(modid = KLib.ID)
@@ -24,11 +33,49 @@ public KLibMod(ModContainer mod, IEventBus bus) {
2433

2534
@SubscribeEvent
2635
public static void setup(FMLCommonSetupEvent event) {
27-
DataTypeRegistry.registerAll(registry -> ModLoader.postEvent(new DataTypeRegistryEvent(registry)));
36+
KLib.setup();
37+
}
38+
39+
@SubscribeEvent
40+
public static void registerCommands(RegisterCommandsEvent event) {
41+
KLibCommands.register(event.getDispatcher(), event.getBuildContext());
42+
}
43+
44+
@SubscribeEvent
45+
public static void serverStarting(ServerStartingEvent event) {
46+
CustomRegistry.buildAllMeta();
47+
}
48+
49+
@SubscribeEvent
50+
public static void syncDataPacks(OnDatapackSyncEvent event) {
51+
event.getRelevantPlayers().forEach(CustomRegistry::sync);
2852
}
2953

3054
@SubscribeEvent
31-
public static void dataTypeRegistry(DataTypeRegistryEvent event) {
32-
KLib.registerDataTypes(event.getRegistry());
55+
public static void registerPackets(RegisterPayloadHandlersEvent event) {
56+
var registrar = event.registrar("1");
57+
registrar.playToClient(SyncCustomRegistryMetaPayload.TYPE, SyncCustomRegistryMetaPayload.STREAM_CODEC, KLibMod::handleServerRegistryMeta);
58+
registrar.playToClient(SyncCustomRegistryValuesPayload.TYPE, SyncCustomRegistryValuesPayload.STREAM_CODEC, KLibMod::handleServerRegistryValues);
59+
}
60+
61+
private static void handleServerRegistryMeta(SyncCustomRegistryMetaPayload payload, IPayloadContext context) {
62+
var map = payload.registries().stream().collect(Collectors.toMap(info -> info.registryKeys().root(), Function.identity()));
63+
64+
for (var registry : CustomRegistry.ALL.values()) {
65+
if (registry.side().isServer()) {
66+
var info = map.get(registry.registryKeys().root());
67+
registry.readMeta(Cast.to(info));
68+
}
69+
}
70+
}
71+
72+
private static void handleServerRegistryValues(SyncCustomRegistryValuesPayload payload, IPayloadContext context) {
73+
var registry = CustomRegistry.ALL.get(payload.info().registryKeys().root());
74+
75+
if (registry != null) {
76+
var registryAccess = context.player().registryAccess();
77+
var platformType = PlatformHelper.CURRENT.getPlatformOf(context.player());
78+
registry.readValues(Cast.to(payload.info()), registryAccess, platformType);
79+
}
3380
}
3481
}

src/main/java/dev/latvian/mods/klib/codec/KLibStreamCodecs.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import net.minecraft.core.Registry;
99
import net.minecraft.network.FriendlyByteBuf;
1010
import net.minecraft.network.RegistryFriendlyByteBuf;
11+
import net.minecraft.network.Utf8String;
1112
import net.minecraft.network.VarInt;
1213
import net.minecraft.network.VarLong;
1314
import net.minecraft.network.codec.ByteBufCodecs;
@@ -279,7 +280,7 @@ public void encode(ByteBuf buf, Identifier id) {
279280
};
280281
}
281282

282-
static <T> StreamCodec<ByteBuf, ResourceKey<T>> commonResourceKey(ResourceKey<? extends Registry<T>> root, String namespace) {
283+
static <T> StreamCodec<ByteBuf, @Nullable ResourceKey<T>> commonResourceKey(ResourceKey<? extends Registry<T>> root, String namespace) {
283284
if (namespace.isEmpty()) {
284285
return ResourceKey.streamCodec(root);
285286
}
@@ -288,15 +289,20 @@ static <T> StreamCodec<ByteBuf, ResourceKey<T>> commonResourceKey(ResourceKey<?
288289
private final Identifier commonIdentifier = Identifier.fromNamespaceAndPath(namespace, "x");
289290

290291
@Override
292+
@Nullable
291293
public ResourceKey<T> decode(ByteBuf buf) {
292-
var string = ByteBufCodecs.STRING_UTF8.decode(buf);
293-
return ResourceKey.create(root, string.indexOf(':') == -1 ? commonIdentifier.withPath(string) : Identifier.parse(string));
294+
var string = Utf8String.read(buf, 32767);
295+
return string.isEmpty() ? null : ResourceKey.create(root, string.indexOf(':') == -1 ? commonIdentifier.withPath(string) : Identifier.parse(string));
294296
}
295297

296298
@Override
297-
public void encode(ByteBuf buf, ResourceKey<T> value) {
298-
var id = value.identifier();
299-
ByteBufCodecs.STRING_UTF8.encode(buf, id.getNamespace().equals(commonIdentifier.getNamespace()) ? id.getPath() : id.toString());
299+
public void encode(ByteBuf buf, @Nullable ResourceKey<T> value) {
300+
if (value == null) {
301+
Utf8String.write(buf, "", 32767);
302+
} else {
303+
var id = value.identifier();
304+
Utf8String.write(buf, id.getNamespace().equals(commonIdentifier.getNamespace()) ? id.getPath() : id.toString(), 32767);
305+
}
300306
}
301307
};
302308
}

src/main/java/dev/latvian/mods/klib/color/Gradient.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@
33
import com.mojang.datafixers.util.Either;
44
import com.mojang.serialization.Codec;
55
import dev.latvian.mods.klib.data.DataType;
6+
import dev.latvian.mods.klib.registry.CustomRegistry;
7+
import dev.latvian.mods.klib.util.ID;
68
import dev.latvian.mods.klib.util.Lazy;
79
import io.netty.buffer.ByteBuf;
10+
import net.minecraft.network.FriendlyByteBuf;
811
import net.minecraft.network.codec.ByteBufCodecs;
912
import net.minecraft.network.codec.StreamCodec;
1013
import net.minecraft.util.RandomSource;
@@ -37,6 +40,11 @@ public interface Gradient {
3740

3841
DataType<Gradient> DATA_TYPE = DataType.of(CODEC, STREAM_CODEC);
3942

43+
CustomRegistry<FriendlyByteBuf, Gradient> REGISTRY = CustomRegistry.<FriendlyByteBuf, Gradient>builder()
44+
.keys(ID.klib("gradient"), "vidlib")
45+
.client()
46+
.build();
47+
4048
Color get(float delta);
4149

4250
default Color sample(RandomSource random) {

0 commit comments

Comments
 (0)