Skip to content

Commit a340e6b

Browse files
Merge branch 'dev/feature' into dev/GhastSupport
2 parents c99268c + 9af7c9e commit a340e6b

34 files changed

+594
-148
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,9 @@ fabric.properties
166166

167167
# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023
168168

169+
# Exception for the icon
170+
!.idea/icon.png
171+
169172
*.iml
170173
modules.xml
171174
.idea/misc.xml

.idea/icon.png

4.07 KB
Loading

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ org.gradle.parallel=true
55

66
groupid=ch.njol
77
name=skript
8-
version=2.10.0
8+
version=2.10.1
99
jarName=Skript.jar
1010
testEnv=java21/paper-1.21.4
1111
testEnvJavaVersion=21

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

Lines changed: 12 additions & 32 deletions
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

Lines changed: 5 additions & 0 deletions
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

Lines changed: 5 additions & 0 deletions
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

Lines changed: 19 additions & 9 deletions
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

Lines changed: 72 additions & 0 deletions
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
}

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -354,15 +354,19 @@ public String toVariableNameString(final Timeperiod o) {
354354
@Override
355355
public Fields serialize(Date date) {
356356
Fields fields = new Fields();
357-
fields.putPrimitive("time", date.getTime());
357+
fields.putPrimitive("timestamp", date.getTime());
358358
return fields;
359359
}
360360

361361

362362
@Override
363-
protected Date deserialize(Fields fields)
364-
throws StreamCorruptedException {
365-
long time = fields.getPrimitive("time", long.class);
363+
protected Date deserialize(Fields fields) throws StreamCorruptedException {
364+
long time;
365+
if (fields.hasField("time")) { // compatibility for 2.10.0 (#7542)
366+
time = fields.getPrimitive("time", long.class);
367+
} else {
368+
time = fields.getPrimitive("timestamp", long.class);
369+
}
366370
return new Date(time);
367371
}
368372

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,17 @@ private void refresh() {
4747
String namespace = namespacedKey.getNamespace();
4848
String key = namespacedKey.getKey();
4949
String keyWithSpaces = key.replace("_", " ");
50-
String languageKey = languageNode + "." + key;
50+
String languageKey;
5151

5252
// Put the full namespaced key as a pattern
5353
parseMap.put(namespacedKey.toString(), registryObject);
5454

5555
// If the object is a vanilla Minecraft object, we'll add the key with spaces as a pattern
5656
if (namespace.equalsIgnoreCase(NamespacedKey.MINECRAFT)) {
5757
parseMap.put(keyWithSpaces, registryObject);
58+
languageKey = languageNode + "." + key;
59+
} else {
60+
languageKey = namespacedKey.toString();
5861
}
5962

6063
String[] options = Language.getList(languageKey);

src/main/java/ch/njol/skript/conditions/CondIsWearing.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package ch.njol.skript.conditions;
22

3+
import ch.njol.skript.Skript;
34
import ch.njol.skript.aliases.ItemType;
45
import ch.njol.skript.conditions.base.PropertyCondition;
56
import ch.njol.skript.conditions.base.PropertyCondition.PropertyType;
@@ -12,7 +13,7 @@
1213
import ch.njol.skript.lang.SkriptParser.ParseResult;
1314
import ch.njol.skript.lang.util.SimpleExpression;
1415
import ch.njol.util.Kleenean;
15-
import org.bukkit.entity.LivingEntity;
16+
import org.bukkit.entity.*;
1617
import org.bukkit.event.Event;
1718
import org.bukkit.inventory.EntityEquipment;
1819
import org.bukkit.inventory.EquipmentSlot;
@@ -30,6 +31,9 @@
3031
})
3132
@Since("1.0")
3233
public class CondIsWearing extends Condition {
34+
35+
private static final boolean HAS_CAN_USE_SLOT_METHOD = Skript.methodExists(LivingEntity.class, "canUseEquipmentSlot", EquipmentSlot.class);
36+
private static final boolean HAS_BODY_SLOT = Skript.fieldExists(EquipmentSlot.class, "BODY");
3337

3438
static {
3539
PropertyCondition.register(CondIsWearing.class, "wearing %itemtypes%", "livingentities");
@@ -59,6 +63,21 @@ public boolean check(Event event) {
5963
return false; // spigot nullability, no identifier as to why this occurs
6064

6165
ItemStack[] contents = Arrays.stream(EquipmentSlot.values())
66+
.filter(slot -> {
67+
// this method was added in 1.20.6
68+
if (HAS_CAN_USE_SLOT_METHOD)
69+
return entity.canUseEquipmentSlot(slot);
70+
71+
// body slot was added in 1.20.5
72+
if (HAS_BODY_SLOT && slot == EquipmentSlot.BODY)
73+
// this may change in the future, but for now this is the only way to figure out
74+
// if the entity can use the body slot
75+
return entity instanceof Horse
76+
|| entity instanceof Wolf
77+
|| entity instanceof Llama;
78+
79+
return true;
80+
})
6281
.map(equipment::getItem)
6382
.toArray(ItemStack[]::new);
6483

src/main/java/ch/njol/skript/expressions/ExprExperienceCooldown.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
public class ExprExperienceCooldown extends SimplePropertyExpression<Player, Timespan> {
3030

3131
static {
32-
register(ExprExperienceCooldown.class, Timespan.class, "[the] (experience|[e]xp) [pickup|collection] cooldown", "players");
32+
register(ExprExperienceCooldown.class, Timespan.class, "(experience|[e]xp) [pickup|collection] cooldown", "players");
3333
}
3434

3535
private static final int maxTicks = Integer.MAX_VALUE;

src/main/java/ch/njol/skript/expressions/ExprExperienceCooldownChangeReason.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
public class ExprExperienceCooldownChangeReason extends EventValueExpression<ChangeReason> {
2626

2727
static {
28-
register(ExprExperienceCooldownChangeReason.class, ChangeReason.class, "[the] (experience|[e]xp) cooldown change (reason|cause|type)");
28+
register(ExprExperienceCooldownChangeReason.class, ChangeReason.class, "(experience|[e]xp) cooldown change (reason|cause|type)");
2929
}
3030

3131
public ExprExperienceCooldownChangeReason() {

0 commit comments

Comments
 (0)