Skip to content

Commit 7063d26

Browse files
Merge remote-tracking branch 'upstream/dev/feature' into dev/EventValueFix
2 parents 7495475 + 9af7c9e commit 7063d26

15 files changed

+621
-99
lines changed

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

+12-32
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import ch.njol.skript.util.BlockUtils;
2222
import ch.njol.skript.util.PotionEffectUtils;
2323
import ch.njol.skript.util.StringMode;
24+
import ch.njol.skript.util.Utils;
2425
import ch.njol.util.StringUtils;
2526
import ch.njol.yggdrasil.Fields;
2627
import io.papermc.paper.world.MoonPhase;
@@ -71,10 +72,7 @@ public class BukkitClasses {
7172

7273
public BukkitClasses() {}
7374

74-
public static final Pattern UUID_PATTERN = Pattern.compile("(?i)[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}");
75-
7675
static {
77-
final boolean GET_ENTITY_METHOD_EXISTS = Skript.methodExists(Bukkit.class, "getEntity", UUID.class);
7876
Classes.registerClass(new ClassInfo<>(Entity.class, "entity")
7977
.user("entit(y|ies)")
8078
.name("Entity")
@@ -91,25 +89,10 @@ public BukkitClasses() {}
9189
.defaultExpression(new EventValueExpression<>(Entity.class))
9290
.parser(new Parser<Entity>() {
9391
@Override
94-
@Nullable
95-
public Entity parse(final String s, final ParseContext context) {
96-
UUID uuid;
97-
try {
98-
uuid = UUID.fromString(s);
99-
} catch (IllegalArgumentException iae) {
100-
return null;
101-
}
102-
if (GET_ENTITY_METHOD_EXISTS) {
103-
return Bukkit.getEntity(uuid);
104-
} else {
105-
for (World world : Bukkit.getWorlds()) {
106-
for (Entity entity : world.getEntities()) {
107-
if (entity.getUniqueId().equals(uuid)) {
108-
return entity;
109-
}
110-
}
111-
}
112-
}
92+
public @Nullable Entity parse(final String s, final ParseContext context) {
93+
if (Utils.isValidUUID(s))
94+
return Bukkit.getEntity(UUID.fromString(s));
95+
11396
return null;
11497
}
11598

@@ -643,8 +626,10 @@ public Player parse(String string, ParseContext context) {
643626
if (context == ParseContext.COMMAND || context == ParseContext.PARSE) {
644627
if (string.isEmpty())
645628
return null;
646-
if (UUID_PATTERN.matcher(string).matches())
629+
630+
if (Utils.isValidUUID(string))
647631
return Bukkit.getPlayer(UUID.fromString(string));
632+
648633
String name = string.toLowerCase(Locale.ENGLISH);
649634
int nameLength = name.length(); // caching
650635
List<Player> players = new ArrayList<>();
@@ -709,16 +694,11 @@ public String getDebugMessage(final Player p) {
709694
.after("string", "world")
710695
.parser(new Parser<OfflinePlayer>() {
711696
@Override
712-
@Nullable
713-
public OfflinePlayer parse(final String s, final ParseContext context) {
714-
if (context == ParseContext.COMMAND || context == ParseContext.PARSE) {
715-
if (UUID_PATTERN.matcher(s).matches())
716-
return Bukkit.getOfflinePlayer(UUID.fromString(s));
717-
else if (!SkriptConfig.playerNameRegexPattern.value().matcher(s).matches())
718-
return null;
697+
public @Nullable OfflinePlayer parse(final String s, final ParseContext context) {
698+
if (Utils.isValidUUID(s))
699+
return Bukkit.getOfflinePlayer(UUID.fromString(s));
700+
else if (SkriptConfig.playerNameRegexPattern.value().matcher(s).matches())
719701
return Bukkit.getOfflinePlayer(s);
720-
}
721-
assert false;
722702
return null;
723703
}
724704

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

+5
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import org.skriptlang.skript.lang.comparator.Relation;
4646

4747
import java.util.Objects;
48+
import java.util.UUID;
4849

4950
@SuppressWarnings({"rawtypes"})
5051
public class DefaultComparators {
@@ -665,6 +666,10 @@ public Relation compare(EntitySnapshot snap1, EntitySnapshot snap2) {
665666
}
666667
});
667668
}
669+
670+
// UUID
671+
Comparators.registerComparator(UUID.class, UUID.class, (one, two) -> Relation.get(one.equals(two)));
672+
Comparators.registerComparator(UUID.class, String.class, (one, two) -> Relation.get(one.toString().equals(two)));
668673
}
669674

670675
}

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

+5
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939
import org.skriptlang.skript.lang.converter.Converters;
4040
import org.skriptlang.skript.lang.script.Script;
4141

42+
import java.util.UUID;
43+
4244
public class DefaultConverters {
4345

4446
public DefaultConverters() {}
@@ -277,6 +279,9 @@ public void setAmount(Number amount) {
277279
Converters.registerConverter(Script.class, Config.class, Script::getConfig);
278280
Converters.registerConverter(Config.class, Node.class, Config::getMainNode);
279281

282+
// UUID -> String
283+
Converters.registerConverter(UUID.class, String.class, UUID::toString);
284+
280285
// // Entity - String (UUID) // Very slow, thus disabled for now
281286
// Converters.registerConverter(String.class, Entity.class, new Converter<String, Entity>() {
282287
//

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

+19-9
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,7 @@
1111
import ch.njol.skript.lang.util.SimpleLiteral;
1212
import ch.njol.skript.registrations.Classes;
1313
import ch.njol.skript.registrations.DefaultClasses;
14-
import ch.njol.skript.util.Color;
15-
import ch.njol.skript.util.ColorRGB;
16-
import ch.njol.skript.util.Contract;
17-
import ch.njol.skript.util.Date;
14+
import ch.njol.skript.util.*;
1815
import ch.njol.util.Math2;
1916
import ch.njol.util.StringUtils;
2017
import ch.njol.util.coll.CollectionUtils;
@@ -544,9 +541,8 @@ public Player[] executeSimple(Object[][] params) {
544541
boolean isExact = (boolean) params[1][0];
545542
UUID uuid = null;
546543
if (name.length() > 16 || name.contains("-")) { // shortcut
547-
try {
544+
if (Utils.isValidUUID(name))
548545
uuid = UUID.fromString(name);
549-
} catch (IllegalArgumentException ignored) {}
550546
}
551547
return CollectionUtils.array(uuid != null ? Bukkit.getPlayer(uuid) : (isExact ? Bukkit.getPlayerExact(name) : Bukkit.getPlayer(name)));
552548
}
@@ -569,10 +565,8 @@ public OfflinePlayer[] executeSimple(Object[][] params) {
569565
String name = (String) params[0][0];
570566
UUID uuid = null;
571567
if (name.length() > 16 || name.contains("-")) { // shortcut
572-
try {
568+
if (Utils.isValidUUID(name))
573569
uuid = UUID.fromString(name);
574-
} catch (IllegalArgumentException ignored) {
575-
}
576570
}
577571
OfflinePlayer result;
578572

@@ -711,6 +705,22 @@ public String[] executeSimple(Object[][] params) {
711705
"\t\tset {_money} to formatNumber({money::%sender's uuid%})",
712706
"\t\tsend \"Your balance: %{_money}%\" to sender")
713707
.since("2.10");
708+
709+
Functions.registerFunction(new SimpleJavaFunction<>("uuid", new Parameter[]{
710+
new Parameter<>("uuid", DefaultClasses.STRING, true, null)
711+
}, Classes.getExactClassInfo(UUID.class), true) {
712+
@Override
713+
public UUID[] executeSimple(Object[][] params) {
714+
String uuid = (String) params[0][0];
715+
if (Utils.isValidUUID(uuid))
716+
return CollectionUtils.array(UUID.fromString(uuid));
717+
return new UUID[0];
718+
}
719+
}
720+
.description("Returns a UUID from the given string. The string must be in the format of a UUID.")
721+
.examples("uuid(\"069a79f4-44e9-4726-a5be-fca90e38aaf5\")")
722+
.since("INSERT VERSION")
723+
);
714724
}
715725

716726
}

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

+72
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
import org.jetbrains.annotations.Nullable;
2020
import org.joml.Quaternionf;
2121

22+
import java.io.StreamCorruptedException;
23+
import java.util.UUID;
2224
import java.util.function.Function;
2325
import java.util.regex.Matcher;
2426
import java.util.regex.Pattern;
@@ -325,6 +327,19 @@ public String toVariableNameString(Quaternionf quaternion) {
325327
return null;
326328
}
327329
}));
330+
331+
Classes.registerClass(new ClassInfo<>(UUID.class, "uuid")
332+
.user("uuids?")
333+
.name("UUID")
334+
.description(
335+
"UUIDs are unique identifiers that ensure things can be reliably distinguished from each other. "
336+
+ "They are generated in a way that makes it practically impossible for duplicates to occur.",
337+
"Read more about UUIDs and how they are used in Minecraft "
338+
+ "in <a href='https://minecraft.wiki/w/UUID'>the wiki entry about UUIDs</a>.")
339+
.since("INSERT VERSION")
340+
.parser(new UUIDParser())
341+
.serializer(new UUIDSerializer())
342+
);
328343
}
329344

330345
/**
@@ -793,4 +808,61 @@ public boolean mustSyncDeserialization() {
793808

794809
}
795810

811+
private static class UUIDParser extends Parser<UUID> {
812+
813+
@Override
814+
public @Nullable UUID parse(String string, ParseContext context) {
815+
if (Utils.isValidUUID(string))
816+
return UUID.fromString(string);
817+
return null;
818+
}
819+
820+
@Override
821+
public String toString(UUID uuid, int flags) {
822+
return uuid.toString();
823+
}
824+
825+
@Override
826+
public String toVariableNameString(UUID uuid) {
827+
return uuid.toString();
828+
}
829+
830+
}
831+
832+
private static class UUIDSerializer extends Serializer<UUID> {
833+
834+
@Override
835+
public Fields serialize(UUID uuid) {
836+
Fields fields = new Fields();
837+
838+
fields.putPrimitive("mostsignificantbits", uuid.getMostSignificantBits());
839+
fields.putPrimitive("leastsignificantbits", uuid.getLeastSignificantBits());
840+
841+
return fields;
842+
}
843+
844+
@Override
845+
public void deserialize(UUID o, Fields f) {
846+
assert false;
847+
}
848+
849+
@Override
850+
protected UUID deserialize(Fields fields) throws StreamCorruptedException {
851+
long mostSignificantBits = fields.getAndRemovePrimitive("mostsignificantbits", long.class);
852+
long leastSignificantBits = fields.getAndRemovePrimitive("leastsignificantbits", long.class);
853+
return new UUID(mostSignificantBits, leastSignificantBits);
854+
}
855+
856+
@Override
857+
public boolean mustSyncDeserialization() {
858+
return false;
859+
}
860+
861+
@Override
862+
protected boolean canBeInstantiated() {
863+
return false;
864+
}
865+
866+
}
867+
796868
}

0 commit comments

Comments
 (0)