Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Chore] Replace enum with registry system for feature flags #28

Merged
merged 10 commits into from
May 26, 2024
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package net.minestom.codegen;

import net.minestom.codegen.color.DyeColorGenerator;
import net.minestom.codegen.feature.FeatureFlagGenerator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand All @@ -21,7 +20,6 @@ public static void main(String[] args) {

// Generate DyeColors
new DyeColorGenerator(resource("dye_colors.json"), outputFolder).generate();
new FeatureFlagGenerator(resource("feature_flags.json"), outputFolder).generate();


var generator = new CodeGenerator(outputFolder);
Expand All @@ -43,6 +41,7 @@ public static void main(String[] args) {
generator.generate(resource("villager_types.json"), "net.minestom.server.entity.villager", "VillagerType", "VillagerTypeImpl", "VillagerTypes");
generator.generate(resource("attributes.json"), "net.minestom.server.attribute", "Attribute", "AttributeImpl", "Attributes");
generator.generate(resource("fluids.json"), "net.minestom.server.fluid", "Fluid", "FluidImpl", "Fluids");
generator.generate(resource("feature_flags.json"), "net.minestom.server.featureflag", "FeatureFlag", "FeatureFlagImpl", "FeatureFlags");

LOGGER.info("Finished generating code");
}
Expand Down

This file was deleted.

2 changes: 1 addition & 1 deletion settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ dependencyResolutionManagement {
version("kotlin", "1.9.22")
version("hydrazine", "1.7.2")
version("dependencyGetter", "v1.0.1")
version("data", "1.20.4-rv9")
version("data", "1.20.4-rv10")
version("hephaistos", "2.6.1")
version("jetbrainsAnnotations", "24.1.0")
version("logback", "1.4.5")
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package net.minestom.server.featureflag;

/**
* Code autogenerated, do not edit!
*/
@SuppressWarnings("unused")
interface FeatureFlags {
FeatureFlag UPDATE_1_21 = FeatureFlagImpl.get("minecraft:update_1_21");

FeatureFlag BUNDLE = FeatureFlagImpl.get("minecraft:bundle");

FeatureFlag VANILLA = FeatureFlagImpl.get("minecraft:vanilla");

FeatureFlag TRADE_REBALANCE = FeatureFlagImpl.get("minecraft:trade_rebalance");
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import net.kyori.adventure.key.Namespaced;
import net.minestom.server.entity.Player;
import net.minestom.server.event.trait.PlayerEvent;
import net.minestom.server.featureflag.FeatureFlag;
import net.minestom.server.instance.Instance;
import net.minestom.server.utils.NamespaceID;
import org.jetbrains.annotations.NotNull;
Expand All @@ -27,9 +28,9 @@ public class AsyncPlayerConfigurationEvent implements PlayerEvent {
private boolean hardcore;
private boolean sendRegistryData;
private Instance spawningInstance;
private Set<NamespaceID> enabledFeatures;
private Set<FeatureFlag> enabledFeatures;

public AsyncPlayerConfigurationEvent(@NotNull Player player, boolean isFirstConfig, @NotNull Set<NamespaceID> enabledFeatures) {
public AsyncPlayerConfigurationEvent(@NotNull Player player, boolean isFirstConfig, @NotNull Set<FeatureFlag> enabledFeatures) {
this.player = player;
this.isFirstConfig = isFirstConfig;
this.enabledFeatures = enabledFeatures;
Expand Down Expand Up @@ -75,11 +76,11 @@ public void setSpawningInstance(@Nullable Instance spawningInstance) {
this.spawningInstance = spawningInstance;
}

public void setEnabledFeatures(Set<NamespaceID> enabledFeatures) {
public void setEnabledFeatures(Set<FeatureFlag> enabledFeatures) {
this.enabledFeatures = enabledFeatures;
}

public Set<NamespaceID> getEnabledFeatures() {
public Set<FeatureFlag> getEnabledFeatures() {
return enabledFeatures;
}
}
39 changes: 39 additions & 0 deletions src/main/java/net/minestom/server/featureflag/FeatureFlag.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package net.minestom.server.featureflag;

import net.minestom.server.registry.Registry;
import net.minestom.server.registry.StaticProtocolObject;
import net.minestom.server.utils.NamespaceID;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.Collection;

public sealed interface FeatureFlag extends StaticProtocolObject permits FeatureFlagImpl {

/**
* Returns the entity registry.
*
* @return the entity registry or null if it was created with a builder
*/
@Contract(pure = true)
@Nullable
Registry.FeatureFlagEntry registry();

@Override
@NotNull
NamespaceID namespace();

static @NotNull Collection<@NotNull FeatureFlag> values() {
return FeatureFlagImpl.values();
}

static @Nullable FeatureFlag fromNamespaceId(@NotNull String namespaceID) {
return FeatureFlagImpl.getSafe(namespaceID);
}

static @Nullable FeatureFlag fromNamespaceId(@NotNull NamespaceID namespaceID) {
return fromNamespaceId(namespaceID.asString());
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package net.minestom.server.featureflag;

import net.minestom.server.registry.Registry;
import net.minestom.server.utils.NamespaceID;
import org.jetbrains.annotations.NotNull;

import java.util.Collection;
import java.util.concurrent.atomic.AtomicInteger;

public record FeatureFlagImpl(Registry.FeatureFlagEntry registry, NamespaceID namespace, int id) implements FeatureFlag {
private static final Registry.DynamicContainer<FeatureFlag> CONTAINER = Registry.createDynamicContainer(Registry.Resource.FEATURE_FLAGS, FeatureFlagImpl::createImpl);
private static final AtomicInteger INDEX = new AtomicInteger();

private static FeatureFlagImpl createImpl(String namespace, Registry.Properties properties) {
return new FeatureFlagImpl(Registry.featureFlag(namespace, properties));
}

private FeatureFlagImpl(Registry.FeatureFlagEntry registry) {
this(registry, registry.namespace(), INDEX.getAndIncrement());
}

static Collection<FeatureFlag> values() {
return CONTAINER.values();
}

public static FeatureFlag get(@NotNull String namespace) {
return CONTAINER.get(namespace);
}

static FeatureFlag getSafe(@NotNull String namespace) {
return CONTAINER.getSafe(namespace);
}
}
Original file line number Diff line number Diff line change
@@ -1,25 +1,25 @@
package net.minestom.server.network.packet.server.configuration;

import net.minestom.server.featureflag.FeatureFlag;
import net.minestom.server.network.NetworkBuffer;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.ServerPacketIdentifier;
import net.minestom.server.utils.NamespaceID;
import org.jetbrains.annotations.NotNull;

import java.util.Set;

import static net.minestom.server.network.NetworkBuffer.STRING;

public record UpdateEnabledFeaturesPacket(@NotNull Set<NamespaceID> features) implements ServerPacket.Configuration {
public static final int MAX_FEATURES = 1024;
public record UpdateEnabledFeaturesPacket(@NotNull Set<FeatureFlag> features) implements ServerPacket.Configuration {
public static final int MAX_FEATURES = 64;

public UpdateEnabledFeaturesPacket(@NotNull NetworkBuffer buffer) {
this(Set.copyOf(buffer.readCollection((b) -> NamespaceID.from(b.read(STRING)), MAX_FEATURES)));
this(Set.copyOf(buffer.readCollection((b) -> FeatureFlag.fromNamespaceId(b.read(STRING)), MAX_FEATURES)));
}

@Override
public void write(@NotNull NetworkBuffer writer) {
writer.writeCollection(features, (b, feature) -> b.write(STRING, feature.asString()));
writer.writeCollection(features, (b, feature) -> b.write(STRING, feature.namespace().toString()));
}

@Override
Expand Down
16 changes: 16 additions & 0 deletions src/main/java/net/minestom/server/registry/Registry.java
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,11 @@ public static AttributeEntry attribute(String namespace, @NotNull Properties mai
return new AttributeEntry(namespace, main, null);
}

@ApiStatus.Internal
public static FeatureFlagEntry featureFlag(String namespace, @NotNull Properties main) {
return new FeatureFlagEntry(namespace, main, null);
}

@ApiStatus.Internal
public static VillagerProfession villagerProfession(String namespace, @NotNull Properties main) {
return new VillagerProfession(namespace, main, null);
Expand Down Expand Up @@ -258,6 +263,7 @@ public enum Resource {
VILLAGER_PROFESSION("villager_professions.json"),
VILLAGER_TYPES("villager_types.json"),
FLUIDS("fluids.json"),
FEATURE_FLAGS("feature_flags.json"),
;

private final String name;
Expand All @@ -267,6 +273,16 @@ public enum Resource {
}
}

public record FeatureFlagEntry(
@NotNull NamespaceID namespace,
@Nullable Properties custom
) implements Entry {

public FeatureFlagEntry(String namespace, Properties main, Properties custom) {
theEvilReaper marked this conversation as resolved.
Show resolved Hide resolved
this(NamespaceID.from(namespace), custom);
}
}

public record FluidEntry(
@NotNull NamespaceID namespace,
@NotNull NamespaceID bucketId,
Expand Down