Support for non-linear protocol IDs in codegen

This commit is contained in:
jglrxavpok 2020-07-13 17:57:28 +02:00
parent 1b4f55bb9f
commit 7b53ec0999
3 changed files with 126 additions and 93 deletions

View File

@ -7,95 +7,97 @@ import net.minestom.server.utils.NamespaceID;
@SuppressWarnings({"deprecation"}) @SuppressWarnings({"deprecation"})
public enum Biome { public enum Biome {
OCEAN("minecraft:ocean"), OCEAN("minecraft:ocean", 0),
PLAINS("minecraft:plains"), PLAINS("minecraft:plains", 1),
DESERT("minecraft:desert"), DESERT("minecraft:desert", 2),
MOUNTAINS("minecraft:mountains"), MOUNTAINS("minecraft:mountains", 3),
FOREST("minecraft:forest"), FOREST("minecraft:forest", 4),
TAIGA("minecraft:taiga"), TAIGA("minecraft:taiga", 5),
SWAMP("minecraft:swamp"), SWAMP("minecraft:swamp", 6),
RIVER("minecraft:river"), RIVER("minecraft:river", 7),
NETHER_WASTES("minecraft:nether_wastes"), NETHER_WASTES("minecraft:nether_wastes", 8),
THE_END("minecraft:the_end"), THE_END("minecraft:the_end", 9),
FROZEN_OCEAN("minecraft:frozen_ocean"), FROZEN_OCEAN("minecraft:frozen_ocean", 10),
FROZEN_RIVER("minecraft:frozen_river"), FROZEN_RIVER("minecraft:frozen_river", 11),
SNOWY_TUNDRA("minecraft:snowy_tundra"), SNOWY_TUNDRA("minecraft:snowy_tundra", 12),
SNOWY_MOUNTAINS("minecraft:snowy_mountains"), SNOWY_MOUNTAINS("minecraft:snowy_mountains", 13),
MUSHROOM_FIELDS("minecraft:mushroom_fields"), MUSHROOM_FIELDS("minecraft:mushroom_fields", 14),
MUSHROOM_FIELD_SHORE("minecraft:mushroom_field_shore"), MUSHROOM_FIELD_SHORE("minecraft:mushroom_field_shore", 15),
BEACH("minecraft:beach"), BEACH("minecraft:beach", 16),
DESERT_HILLS("minecraft:desert_hills"), DESERT_HILLS("minecraft:desert_hills", 17),
WOODED_HILLS("minecraft:wooded_hills"), WOODED_HILLS("minecraft:wooded_hills", 18),
TAIGA_HILLS("minecraft:taiga_hills"), TAIGA_HILLS("minecraft:taiga_hills", 19),
MOUNTAIN_EDGE("minecraft:mountain_edge"), MOUNTAIN_EDGE("minecraft:mountain_edge", 20),
JUNGLE("minecraft:jungle"), JUNGLE("minecraft:jungle", 21),
JUNGLE_HILLS("minecraft:jungle_hills"), JUNGLE_HILLS("minecraft:jungle_hills", 22),
JUNGLE_EDGE("minecraft:jungle_edge"), JUNGLE_EDGE("minecraft:jungle_edge", 23),
DEEP_OCEAN("minecraft:deep_ocean"), DEEP_OCEAN("minecraft:deep_ocean", 24),
STONE_SHORE("minecraft:stone_shore"), STONE_SHORE("minecraft:stone_shore", 25),
SNOWY_BEACH("minecraft:snowy_beach"), SNOWY_BEACH("minecraft:snowy_beach", 26),
BIRCH_FOREST("minecraft:birch_forest"), BIRCH_FOREST("minecraft:birch_forest", 27),
BIRCH_FOREST_HILLS("minecraft:birch_forest_hills"), BIRCH_FOREST_HILLS("minecraft:birch_forest_hills", 28),
DARK_FOREST("minecraft:dark_forest"), DARK_FOREST("minecraft:dark_forest", 29),
SNOWY_TAIGA("minecraft:snowy_taiga"), SNOWY_TAIGA("minecraft:snowy_taiga", 30),
SNOWY_TAIGA_HILLS("minecraft:snowy_taiga_hills"), SNOWY_TAIGA_HILLS("minecraft:snowy_taiga_hills", 31),
GIANT_TREE_TAIGA("minecraft:giant_tree_taiga"), GIANT_TREE_TAIGA("minecraft:giant_tree_taiga", 32),
GIANT_TREE_TAIGA_HILLS("minecraft:giant_tree_taiga_hills"), GIANT_TREE_TAIGA_HILLS("minecraft:giant_tree_taiga_hills", 33),
WOODED_MOUNTAINS("minecraft:wooded_mountains"), WOODED_MOUNTAINS("minecraft:wooded_mountains", 34),
SAVANNA("minecraft:savanna"), SAVANNA("minecraft:savanna", 35),
SAVANNA_PLATEAU("minecraft:savanna_plateau"), SAVANNA_PLATEAU("minecraft:savanna_plateau", 36),
BADLANDS("minecraft:badlands"), BADLANDS("minecraft:badlands", 37),
WOODED_BADLANDS_PLATEAU("minecraft:wooded_badlands_plateau"), WOODED_BADLANDS_PLATEAU("minecraft:wooded_badlands_plateau", 38),
BADLANDS_PLATEAU("minecraft:badlands_plateau"), BADLANDS_PLATEAU("minecraft:badlands_plateau", 39),
SMALL_END_ISLANDS("minecraft:small_end_islands"), SMALL_END_ISLANDS("minecraft:small_end_islands", 40),
END_MIDLANDS("minecraft:end_midlands"), END_MIDLANDS("minecraft:end_midlands", 41),
END_HIGHLANDS("minecraft:end_highlands"), END_HIGHLANDS("minecraft:end_highlands", 42),
END_BARRENS("minecraft:end_barrens"), END_BARRENS("minecraft:end_barrens", 43),
WARM_OCEAN("minecraft:warm_ocean"), WARM_OCEAN("minecraft:warm_ocean", 44),
LUKEWARM_OCEAN("minecraft:lukewarm_ocean"), LUKEWARM_OCEAN("minecraft:lukewarm_ocean", 45),
COLD_OCEAN("minecraft:cold_ocean"), COLD_OCEAN("minecraft:cold_ocean", 46),
DEEP_WARM_OCEAN("minecraft:deep_warm_ocean"), DEEP_WARM_OCEAN("minecraft:deep_warm_ocean", 47),
DEEP_LUKEWARM_OCEAN("minecraft:deep_lukewarm_ocean"), DEEP_LUKEWARM_OCEAN("minecraft:deep_lukewarm_ocean", 48),
DEEP_COLD_OCEAN("minecraft:deep_cold_ocean"), DEEP_COLD_OCEAN("minecraft:deep_cold_ocean", 49),
DEEP_FROZEN_OCEAN("minecraft:deep_frozen_ocean"), DEEP_FROZEN_OCEAN("minecraft:deep_frozen_ocean", 50),
THE_VOID("minecraft:the_void"), THE_VOID("minecraft:the_void", 127),
SUNFLOWER_PLAINS("minecraft:sunflower_plains"), SUNFLOWER_PLAINS("minecraft:sunflower_plains", 129),
DESERT_LAKES("minecraft:desert_lakes"), DESERT_LAKES("minecraft:desert_lakes", 130),
GRAVELLY_MOUNTAINS("minecraft:gravelly_mountains"), GRAVELLY_MOUNTAINS("minecraft:gravelly_mountains", 131),
FLOWER_FOREST("minecraft:flower_forest"), FLOWER_FOREST("minecraft:flower_forest", 132),
TAIGA_MOUNTAINS("minecraft:taiga_mountains"), TAIGA_MOUNTAINS("minecraft:taiga_mountains", 133),
SWAMP_HILLS("minecraft:swamp_hills"), SWAMP_HILLS("minecraft:swamp_hills", 134),
ICE_SPIKES("minecraft:ice_spikes"), ICE_SPIKES("minecraft:ice_spikes", 140),
MODIFIED_JUNGLE("minecraft:modified_jungle"), MODIFIED_JUNGLE("minecraft:modified_jungle", 149),
MODIFIED_JUNGLE_EDGE("minecraft:modified_jungle_edge"), MODIFIED_JUNGLE_EDGE("minecraft:modified_jungle_edge", 151),
TALL_BIRCH_FOREST("minecraft:tall_birch_forest"), TALL_BIRCH_FOREST("minecraft:tall_birch_forest", 155),
TALL_BIRCH_HILLS("minecraft:tall_birch_hills"), TALL_BIRCH_HILLS("minecraft:tall_birch_hills", 156),
DARK_FOREST_HILLS("minecraft:dark_forest_hills"), DARK_FOREST_HILLS("minecraft:dark_forest_hills", 157),
SNOWY_TAIGA_MOUNTAINS("minecraft:snowy_taiga_mountains"), SNOWY_TAIGA_MOUNTAINS("minecraft:snowy_taiga_mountains", 158),
GIANT_SPRUCE_TAIGA("minecraft:giant_spruce_taiga"), GIANT_SPRUCE_TAIGA("minecraft:giant_spruce_taiga", 160),
GIANT_SPRUCE_TAIGA_HILLS("minecraft:giant_spruce_taiga_hills"), GIANT_SPRUCE_TAIGA_HILLS("minecraft:giant_spruce_taiga_hills", 161),
MODIFIED_GRAVELLY_MOUNTAINS("minecraft:modified_gravelly_mountains"), MODIFIED_GRAVELLY_MOUNTAINS("minecraft:modified_gravelly_mountains", 162),
SHATTERED_SAVANNA("minecraft:shattered_savanna"), SHATTERED_SAVANNA("minecraft:shattered_savanna", 163),
SHATTERED_SAVANNA_PLATEAU("minecraft:shattered_savanna_plateau"), SHATTERED_SAVANNA_PLATEAU("minecraft:shattered_savanna_plateau", 164),
ERODED_BADLANDS("minecraft:eroded_badlands"), ERODED_BADLANDS("minecraft:eroded_badlands", 165),
MODIFIED_WOODED_BADLANDS_PLATEAU("minecraft:modified_wooded_badlands_plateau"), MODIFIED_WOODED_BADLANDS_PLATEAU("minecraft:modified_wooded_badlands_plateau", 166),
MODIFIED_BADLANDS_PLATEAU("minecraft:modified_badlands_plateau"), MODIFIED_BADLANDS_PLATEAU("minecraft:modified_badlands_plateau", 167),
BAMBOO_JUNGLE("minecraft:bamboo_jungle"), BAMBOO_JUNGLE("minecraft:bamboo_jungle", 168),
BAMBOO_JUNGLE_HILLS("minecraft:bamboo_jungle_hills"), BAMBOO_JUNGLE_HILLS("minecraft:bamboo_jungle_hills", 169),
SOUL_SAND_VALLEY("minecraft:soul_sand_valley"), SOUL_SAND_VALLEY("minecraft:soul_sand_valley", 170),
CRIMSON_FOREST("minecraft:crimson_forest"), CRIMSON_FOREST("minecraft:crimson_forest", 171),
WARPED_FOREST("minecraft:warped_forest"), WARPED_FOREST("minecraft:warped_forest", 172),
BASALT_DELTAS("minecraft:basalt_deltas"), BASALT_DELTAS("minecraft:basalt_deltas", 173),
; ;
private String namespaceID; private String namespaceID;
private int id;
Biome(String namespaceID) { Biome(String namespaceID, int id) {
this.namespaceID = namespaceID; this.namespaceID = namespaceID;
this.id = id;
Registries.biomes.put(NamespaceID.from(namespaceID), this); Registries.biomes.put(NamespaceID.from(namespaceID), this);
} }
public int getId() { public int getId() {
return ordinal(); return id;
} }
public String getNamespaceID() { public String getNamespaceID() {
@ -103,8 +105,10 @@ public enum Biome {
} }
public static Biome fromId(int id) { public static Biome fromId(int id) {
if(id >= 0 && id < values().length) { for(Biome o : values()) {
return values()[id]; if(o.getId() == id) {
return o;
}
} }
return null; return null;
} }

View File

@ -15,9 +15,18 @@ import java.util.TreeSet;
public abstract class BasicEnumGenerator extends MinestomEnumGenerator<BasicEnumGenerator.Container> { public abstract class BasicEnumGenerator extends MinestomEnumGenerator<BasicEnumGenerator.Container> {
private static final String MC_DATA_REGISTRIES_PATH = "minecraft_data/reports/registries.json"; private static final String MC_DATA_REGISTRIES_PATH = "minecraft_data/reports/registries.json";
/**
* Are IDs linear? Biomes are not for instance.
*/
private final boolean linear;
private NamespaceID defaultEntry; private NamespaceID defaultEntry;
protected BasicEnumGenerator(File targetFolder) throws IOException { protected BasicEnumGenerator(File targetFolder) throws IOException {
this(targetFolder, true);
}
protected BasicEnumGenerator(File targetFolder, boolean linear) throws IOException {
this.linear = linear;
generateTo(targetFolder); generateTo(targetFolder);
} }
@ -47,12 +56,23 @@ public abstract class BasicEnumGenerator extends MinestomEnumGenerator<BasicEnum
@Override @Override
protected void postWrite(EnumGenerator generator) { protected void postWrite(EnumGenerator generator) {
generator.addMethod("fromId", "(int id)", "static "+getClassName(), if(linear) {
"if(id >= 0 && id < values().length) {", generator.addMethod("fromId", "(int id)", "static "+getClassName(),
"\treturn values()[id];", "if(id >= 0 && id < values().length) {",
"}", "\treturn values()[id];",
"return "+(defaultEntry == null ? "null" : identifier(defaultEntry))+";" "}",
); "return "+(defaultEntry == null ? "null" : identifier(defaultEntry))+";"
);
} else {
generator.addMethod("fromId", "(int id)", "static "+getClassName(),
"for("+getClassName()+" o : values()) {",
"\tif(o.getId() == id) {",
"\t\treturn o;",
"\t}",
"}",
"return "+(defaultEntry == null ? "null" : identifier(defaultEntry))+";"
);
}
} }
private String identifier(NamespaceID id) { private String identifier(NamespaceID id) {
@ -67,8 +87,13 @@ public abstract class BasicEnumGenerator extends MinestomEnumGenerator<BasicEnum
generator.addClassAnnotation("@SuppressWarnings({\"deprecation\"})"); generator.addClassAnnotation("@SuppressWarnings({\"deprecation\"})");
generator.addImport(Registries.class.getCanonicalName()); generator.addImport(Registries.class.getCanonicalName());
generator.addImport(NamespaceID.class.getCanonicalName()); generator.addImport(NamespaceID.class.getCanonicalName());
generator.setParams("String namespaceID"); if(linear) {
generator.addMethod("getId", "()", "int", "return ordinal();"); generator.setParams("String namespaceID");
generator.addMethod("getId", "()", "int", "return ordinal();");
} else {
generator.setParams("String namespaceID", "int id");
generator.addMethod("getId", "()", "int", "return id;");
}
generator.addMethod("getNamespaceID", "()", "String", "return namespaceID;"); generator.addMethod("getNamespaceID", "()", "String", "return namespaceID;");
generator.appendToConstructor("Registries."+CodeGenerator.decapitalize(getClassName())+"s.put(NamespaceID.from(namespaceID), this);"); generator.appendToConstructor("Registries."+CodeGenerator.decapitalize(getClassName())+"s.put(NamespaceID.from(namespaceID), this);");
@ -76,7 +101,11 @@ public abstract class BasicEnumGenerator extends MinestomEnumGenerator<BasicEnum
@Override @Override
protected void writeSingle(EnumGenerator generator, Container item) { protected void writeSingle(EnumGenerator generator, Container item) {
generator.addInstance(identifier(item.name), "\""+item.name.toString()+"\""); if(linear) {
generator.addInstance(identifier(item.name), "\""+item.name.toString()+"\"");
} else {
generator.addInstance(identifier(item.name), "\""+item.name.toString()+"\"", item.id);
}
} }
static class Container implements Comparable<Container> { static class Container implements Comparable<Container> {

View File

@ -36,7 +36,7 @@ public class BiomesEnumGenerator extends BasicEnumGenerator {
} }
private BiomesEnumGenerator(File targetFolder) throws IOException { private BiomesEnumGenerator(File targetFolder) throws IOException {
super(targetFolder); super(targetFolder, false);
} }
@Override @Override