Skip to content

Commit 04da1be

Browse files
Prefer RegistryKey usage
1 parent 88ffe0d commit 04da1be

16 files changed

Lines changed: 225 additions & 327 deletions

File tree

src/main/java/ch/njol/skript/bukkitutil/BukkitUtils.java

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.google.common.collect.BiMap;
88
import com.google.common.collect.HashBiMap;
99

10+
import io.papermc.paper.registry.RegistryKey;
1011
import org.bukkit.Keyed;
1112
import org.bukkit.Registry;
1213
import org.bukkit.inventory.EquipmentSlot;
@@ -89,8 +90,25 @@ public static EquipmentSlot getEquipmentSlotFromIndex(int slotIndex) {
8990
String codeName,
9091
String languageNode
9192
) {
93+
// validate class
9294
if (!Skript.classExists(classPath))
9395
return null;
96+
Class<R> registryClass;
97+
try {
98+
//noinspection unchecked
99+
registryClass = (Class<R>) Class.forName(classPath);
100+
} catch (ClassNotFoundException e) {
101+
Skript.debug("Could not retrieve the class with the path: '" + classPath + "'.");
102+
throw new RuntimeException(e);
103+
}
104+
105+
// first, try better RegistryKey
106+
if (PaperUtils.registryExists(registryName)) {
107+
RegistryKey<R> registryKey = PaperUtils.getBukkitRegistryKey(registryName);
108+
return new RegistryClassInfo<>(registryClass, registryKey, codeName, languageNode);
109+
}
110+
111+
// otherwise, standard Registry
94112
Registry<R> registry = null;
95113
if (BukkitUtils.registryExists(registryName)) {
96114
try {
@@ -99,18 +117,8 @@ public static EquipmentSlot getEquipmentSlotFromIndex(int slotIndex) {
99117
} catch (NoSuchFieldException | IllegalAccessException e) {
100118
throw new RuntimeException(e);
101119
}
102-
} else if (PaperUtils.registryExists(registryName)) {
103-
registry = PaperUtils.getBukkitRegistry(registryName);
104120
}
105121
if (registry != null) {
106-
Class<R> registryClass;
107-
try {
108-
//noinspection unchecked
109-
registryClass = (Class<R>) Class.forName(classPath);
110-
} catch (ClassNotFoundException e) {
111-
Skript.debug("Could not retrieve the class with the path: '" + classPath + "'.");
112-
throw new RuntimeException(e);
113-
}
114122
return new RegistryClassInfo<>(registryClass, registry, codeName, languageNode);
115123
}
116124
Skript.debug("There were no registries found for '" + registryName + "'.");

src/main/java/ch/njol/skript/classes/ClassInfo.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,6 @@ public ClassInfo<T> user(final String... userInputPatterns) throws PatternSyntax
133133
* @see SimpleLiteral
134134
*/
135135
public ClassInfo<T> defaultExpression(final DefaultExpression<T> defaultExpression) {
136-
assert this.defaultExpression == null;
137136
if (!defaultExpression.isDefault())
138137
throw new IllegalArgumentException("defaultExpression.isDefault() must return true for the default expression of a class");
139138
this.defaultExpression = defaultExpression;

src/main/java/ch/njol/skript/classes/data/BukkitClasses.java

Lines changed: 6 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import ch.njol.skript.registrations.Classes;
1212
import ch.njol.skript.util.BlockUtils;
1313
import ch.njol.yggdrasil.Fields;
14+
import io.papermc.paper.registry.RegistryKey;
1415
import io.papermc.paper.world.MoonPhase;
1516
import net.kyori.adventure.text.Component;
1617
import org.bukkit.*;
@@ -326,7 +327,7 @@ public String toVariableNameString(InventoryHolder holder) {
326327
.since("2.0")
327328
.changer(DefaultChangers.itemChanger));
328329

329-
Classes.registerClass(new RegistryClassInfo<>(Biome.class, Registry.BIOME, "biome", "biomes")
330+
Classes.registerClass(new RegistryClassInfo<>(Biome.class, RegistryKey.BIOME, "biome", "biomes")
330331
.user("biomes?")
331332
.name("Biome")
332333
.description("All possible biomes Minecraft uses to generate a world.",
@@ -600,7 +601,7 @@ public String[] getPatterns() {
600601
ExpressionPropertyHandler.of(GameRule::getName, String.class)
601602
));
602603

603-
Classes.registerClass(new RegistryClassInfo<>(Attribute.class, Registry.ATTRIBUTE, "attributetype", "attribute types")
604+
Classes.registerClass(new RegistryClassInfo<>(Attribute.class, RegistryKey.ATTRIBUTE, "attributetype", "attribute types")
604605
.user("attribute ?types?")
605606
.name("Attribute Type")
606607
.description("Represents the type of an attribute. Note that this type does not contain any numerical values." +
@@ -659,14 +660,14 @@ public String[] getPatterns() {
659660
.description("Represents a change reason of an <a href='#experience cooldown change event'>experience cooldown change event</a>.")
660661
.since("2.10"));
661662

662-
Classes.registerClass(new RegistryClassInfo<>(Villager.Type.class, Registry.VILLAGER_TYPE, "villagertype", "villager types")
663+
Classes.registerClass(new RegistryClassInfo<>(Villager.Type.class, RegistryKey.VILLAGER_TYPE, "villagertype", "villager types")
663664
.user("villager ?types?")
664665
.name("Villager Type")
665666
.description("Represents the different types of villagers. These are usually the biomes a villager can be from.")
666667
.after("biome")
667668
.since("2.10"));
668669

669-
Classes.registerClass(new RegistryClassInfo<>(Villager.Profession.class, Registry.VILLAGER_PROFESSION, "villagerprofession", "villager professions")
670+
Classes.registerClass(new RegistryClassInfo<>(Villager.Profession.class, RegistryKey.VILLAGER_PROFESSION, "villagerprofession", "villager professions")
670671
.user("villager ?professions?")
671672
.name("Villager Profession")
672673
.description("Represents the different professions of villagers.")
@@ -705,27 +706,7 @@ public String toVariableNameString(EntitySnapshot snapshot) {
705706
.description("Represents a banner pattern.")
706707
.since("2.10"));
707708

708-
ClassInfo<?> patternTypeInfo;
709-
Registry<PatternType> patternRegistry = Bukkit.getRegistry(PatternType.class);
710-
if (patternRegistry != null) {
711-
patternTypeInfo = new RegistryClassInfo<>(PatternType.class, patternRegistry, "bannerpatterntype", "banner pattern types");
712-
} else {
713-
try {
714-
Class<?> patternClass = Class.forName("org.bukkit.block.banner.PatternType");
715-
if (patternClass.isEnum()) {
716-
//noinspection unchecked,rawtypes
717-
Class<? extends Enum> enumClass = (Class<? extends Enum>) patternClass;
718-
//noinspection rawtypes,unchecked
719-
patternTypeInfo = new EnumClassInfo<>(enumClass, "bannerpatterntype", "banner pattern types");
720-
} else {
721-
throw new IllegalStateException("PatternType is neither an enum nor a valid registry.");
722-
}
723-
} catch (ClassNotFoundException e) {
724-
throw new RuntimeException(e);
725-
}
726-
}
727-
728-
Classes.registerClass(patternTypeInfo
709+
Classes.registerClass(new RegistryClassInfo<>(PatternType.class, RegistryKey.BANNER_PATTERN, "bannerpatterntype", "banner pattern types")
729710
.user("banner ?pattern ?types?")
730711
.name("Banner Pattern Type")
731712
.description("Represents the various banner patterns that can be applied to a banner.")

src/main/java/ch/njol/skript/classes/registry/RegistryClassInfo.java

Lines changed: 95 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,16 @@
33
import ch.njol.skript.classes.ClassInfo;
44
import ch.njol.skript.expressions.base.EventValueExpression;
55
import ch.njol.skript.lang.DefaultExpression;
6+
import io.papermc.paper.registry.RegistryAccess;
7+
import io.papermc.paper.registry.RegistryKey;
68
import org.bukkit.Keyed;
79
import org.bukkit.Registry;
10+
import org.jetbrains.annotations.NotNull;
11+
import org.jetbrains.annotations.Nullable;
812

13+
import java.util.Iterator;
914
import java.util.function.Consumer;
15+
import java.util.function.Supplier;
1016

1117
/**
1218
* This class can be used for easily creating ClassInfos for {@link Registry}s.
@@ -16,12 +22,87 @@
1622
*/
1723
public class RegistryClassInfo<R extends Keyed> extends ClassInfo<R> {
1824

25+
private final @Nullable RegistryKey<R> registryKey;
26+
27+
/**
28+
* @param registryClass The registry class
29+
* @param registryKey The registry key
30+
* @param codeName The name used in patterns
31+
* @param languageNode The language node of the type
32+
*/
33+
public RegistryClassInfo(Class<R> registryClass, RegistryKey<R> registryKey, String codeName, String languageNode) {
34+
this(registryClass, registryKey, RegistryAccess.registryAccess().getRegistry(registryKey), codeName,
35+
languageNode, null, null);
36+
}
37+
38+
/**
39+
* @param registryClass The registry class
40+
* @param registryKey The registry key
41+
* @param codeName The name used in patterns
42+
* @param languageNode The language node of the type
43+
* @param parseCallback A consumer to run on a successful parse.
44+
*/
45+
public RegistryClassInfo(Class<R> registryClass, RegistryKey<R> registryKey, String codeName, String languageNode,
46+
Consumer<R> parseCallback) {
47+
this(registryClass, registryKey, RegistryAccess.registryAccess().getRegistry(registryKey), codeName,
48+
languageNode, null, parseCallback);
49+
}
50+
51+
private RegistryClassInfo(Class<R> registryClass, @Nullable RegistryKey<R> registryKey, Registry<R> registry,
52+
String codeName, String languageNode, @Nullable DefaultExpression<R> defaultExpression,
53+
@Nullable Consumer<R> parseCallback) {
54+
super(registryClass, codeName);
55+
56+
if (defaultExpression == null) {
57+
defaultExpression = new EventValueExpression<>(registryClass);
58+
}
59+
if (parseCallback == null) {
60+
parseCallback = ignored -> { };
61+
}
62+
63+
this.registryKey = registryKey;
64+
RegistryParser<R> registryParser = new RegistryParser<>(registry, languageNode, parseCallback);
65+
usage(registryParser.getCombinedPatterns())
66+
.supplier(registry::iterator)
67+
.serializer(new RegistrySerializer<>(registry))
68+
.defaultExpression(defaultExpression)
69+
.parser(registryParser);
70+
}
71+
72+
public @Nullable RegistryKey<R> registryKey() {
73+
return registryKey;
74+
}
75+
76+
@Override
77+
public @NotNull RegistryParser<R> getParser() {
78+
//noinspection ConstantConditions, unchecked
79+
return (RegistryParser<R>) super.getParser();
80+
}
81+
82+
@Override
83+
public @NotNull RegistrySerializer<R> getSerializer() {
84+
//noinspection ConstantConditions, unchecked
85+
return (RegistrySerializer<R>) super.getSerializer();
86+
}
87+
88+
@Override
89+
public @NotNull Supplier<Iterator<R>> getSupplier() {
90+
//noinspection ConstantConditions
91+
return super.getSupplier();
92+
}
93+
94+
/*
95+
* Legacy Constructors
96+
*/
97+
1998
/**
2099
* @param registryClass The registry class
21100
* @param registry The registry
22101
* @param codeName The name used in patterns
23102
* @param languageNode The language node of the type
103+
* @deprecated Use {@link #RegistryClassInfo(Class, RegistryKey, String, String)}.
24104
*/
105+
@Deprecated(since = "INSERT VERSION", forRemoval = true)
25106
public RegistryClassInfo(Class<R> registryClass, Registry<R> registry, String codeName, String languageNode) {
26107
this(registryClass, registry, codeName, languageNode, new EventValueExpression<>(registryClass));
27108
}
@@ -32,7 +113,9 @@ public RegistryClassInfo(Class<R> registryClass, Registry<R> registry, String co
32113
* @param codeName The name used in patterns
33114
* @param languageNode The language node of the type
34115
* @param parseCallback A consumer to run on a successful parse.
116+
* @deprecated Use {@link #RegistryClassInfo(Class, RegistryKey, String, String, Consumer)}.
35117
*/
118+
@Deprecated(since = "INSERT VERSION", forRemoval = true)
36119
public RegistryClassInfo(Class<R> registryClass, Registry<R> registry, String codeName, String languageNode, Consumer<R> parseCallback) {
37120
this(registryClass, registry, codeName, languageNode, new EventValueExpression<>(registryClass), parseCallback);
38121
}
@@ -43,8 +126,11 @@ public RegistryClassInfo(Class<R> registryClass, Registry<R> registry, String co
43126
* @param codeName The name used in patterns
44127
* @param languageNode The language node of the type
45128
* @param defaultExpression The default expression of the type
129+
* @deprecated Use {@link #RegistryClassInfo(Class, RegistryKey, String, String)} with {@link #defaultExpression(DefaultExpression)}.
46130
*/
47-
public RegistryClassInfo(Class<R> registryClass, Registry<R> registry, String codeName, String languageNode, DefaultExpression<R> defaultExpression) {
131+
@Deprecated(since = "INSERT VERSION", forRemoval = true)
132+
public RegistryClassInfo(Class<R> registryClass, Registry<R> registry, String codeName, String languageNode,
133+
DefaultExpression<R> defaultExpression) {
48134
this(registryClass, registry, codeName, languageNode, defaultExpression, ignored -> {});
49135
}
50136

@@ -55,15 +141,13 @@ public RegistryClassInfo(Class<R> registryClass, Registry<R> registry, String co
55141
* @param languageNode The language node of the type
56142
* @param defaultExpression The default expression of the type
57143
* @param parseCallback A consumer to run on a successful parse.
144+
* @deprecated Use {@link #RegistryClassInfo(Class, RegistryKey, String, String, Consumer)}
145+
* with {@link #defaultExpression(DefaultExpression)}.
58146
*/
59-
public RegistryClassInfo(Class<R> registryClass, Registry<R> registry, String codeName, String languageNode, DefaultExpression<R> defaultExpression, Consumer<R> parseCallback) {
60-
super(registryClass, codeName);
61-
RegistryParser<R> registryParser = new RegistryParser<>(registry, languageNode, parseCallback);
62-
usage(registryParser.getCombinedPatterns())
63-
.supplier(registry::iterator)
64-
.serializer(new RegistrySerializer<>(registry))
65-
.defaultExpression(defaultExpression)
66-
.parser(registryParser);
147+
@Deprecated(since = "INSERT VERSION", forRemoval = true)
148+
public RegistryClassInfo(Class<R> registryClass, Registry<R> registry, String codeName, String languageNode,
149+
DefaultExpression<R> defaultExpression, Consumer<R> parseCallback) {
150+
this(registryClass, null, registry, codeName, languageNode, defaultExpression, parseCallback);
67151
}
68152

69153
/**
@@ -89,7 +173,8 @@ public RegistryClassInfo(Class<R> registryClass, Registry<R> registry, String co
89173
* @deprecated {@code registerComparator} is no longer necessary.
90174
*/
91175
@Deprecated(since = "2.16", forRemoval = true)
92-
public RegistryClassInfo(Class<R> registryClass, Registry<R> registry, String codeName, String languageNode, DefaultExpression<R> defaultExpression, boolean registerComparator) {
176+
public RegistryClassInfo(Class<R> registryClass, Registry<R> registry, String codeName, String languageNode,
177+
DefaultExpression<R> defaultExpression, boolean registerComparator) {
93178
this(registryClass, registry, codeName, languageNode, defaultExpression);
94179
}
95180

src/main/java/ch/njol/skript/entity/CatData.java

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
package ch.njol.skript.entity;
22

3-
import ch.njol.skript.bukkitutil.BukkitUtils;
4-
import ch.njol.skript.classes.ClassInfo;
5-
import ch.njol.skript.classes.EnumClassInfo;
63
import ch.njol.skript.classes.registry.RegistryClassInfo;
74
import ch.njol.skript.lang.Literal;
85
import ch.njol.skript.lang.SkriptParser.ParseResult;
96
import ch.njol.skript.registrations.Classes;
107
import ch.njol.util.coll.CollectionUtils;
118
import com.google.common.collect.Iterators;
12-
import org.bukkit.Registry;
9+
import io.papermc.paper.registry.RegistryKey;
1310
import org.bukkit.entity.Cat;
1411
import org.bukkit.entity.Cat.Type;
1512
import org.jetbrains.annotations.NotNull;
@@ -22,13 +19,7 @@ public class CatData extends EntityData<Cat> {
2219
private static final Type[] TYPES;
2320

2421
static {
25-
ClassInfo<Type> catTypeClassInfo;
26-
if (BukkitUtils.registryExists("CAT_VARIANT")) {
27-
catTypeClassInfo = new RegistryClassInfo<>(Cat.Type.class, Registry.CAT_VARIANT, "cattype", "cat types");
28-
} else {
29-
//noinspection unchecked, rawtypes - it is an enum on other versions
30-
catTypeClassInfo = new EnumClassInfo<>((Class) Cat.Type.class, "cattype", "cat types");
31-
}
22+
var catTypeClassInfo = new RegistryClassInfo<>(Cat.Type.class, RegistryKey.CAT_VARIANT, "cattype", "cat types");
3223
Classes.registerClass(catTypeClassInfo
3324
.user("cat ?(type|race)s?")
3425
.name("Cat Type")

0 commit comments

Comments
 (0)