Skip to content

Commit e40c687

Browse files
authored
Merge branch 'dev/feature' into command-block-syntax
2 parents ea4e687 + 3420038 commit e40c687

File tree

97 files changed

+4768
-918
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

97 files changed

+4768
-918
lines changed

build.gradle

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,15 @@ dependencies {
3131
shadow group: 'net.kyori', name: 'adventure-text-serializer-bungeecord', version: '4.3.2'
3232

3333
implementation group: 'io.papermc.paper', name: 'paper-api', version: '1.21-R0.1-SNAPSHOT'
34+
implementation group: 'org.eclipse.jdt', name: 'org.eclipse.jdt.annotation', version: '2.2.700'
35+
36+
// Comes from Minecraft including Guava or Gson
3437
implementation group: 'com.google.code.findbugs', name: 'findbugs', version: '3.0.1'
38+
39+
// bundled with Minecraft 1.19.4+ for display entity transforms
40+
implementation group: 'org.joml', name: 'joml', version: '1.10.5'
41+
42+
// Plugin hook libraries
3543
implementation group: 'com.sk89q.worldguard', name: 'worldguard-legacy', version: '7.0.0-SNAPSHOT'
3644
implementation group: 'net.milkbowl.vault', name: 'Vault', version: '1.7.3', {
3745
exclude group: 'org.bstats', module: 'bstats-bukkit'

src/main/java/ch/njol/skript/ScriptLoader.java

Lines changed: 121 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import org.bukkit.Bukkit;
4848
import org.bukkit.event.Event;
4949
import org.jetbrains.annotations.Nullable;
50+
import org.skriptlang.skript.util.event.EventRegistry;
5051
import org.skriptlang.skript.lang.script.Script;
5152
import org.skriptlang.skript.lang.structure.Structure;
5253

@@ -58,6 +59,7 @@
5859
import java.nio.file.Path;
5960
import java.util.ArrayList;
6061
import java.util.Arrays;
62+
import java.util.Collection;
6163
import java.util.Collections;
6264
import java.util.Comparator;
6365
import java.util.HashMap;
@@ -488,6 +490,9 @@ private static CompletableFuture<ScriptInfo> loadScripts(List<Config> configs, O
488490
if (configs.isEmpty()) // Nothing to load
489491
return CompletableFuture.completedFuture(new ScriptInfo());
490492

493+
eventRegistry().events(ScriptPreInitEvent.class)
494+
.forEach(event -> event.onPreInit(configs));
495+
//noinspection deprecation - we still need to call it
491496
Bukkit.getPluginManager().callEvent(new PreScriptLoadEvent(configs));
492497

493498
ScriptInfo scriptInfo = new ScriptInfo();
@@ -605,6 +610,20 @@ private static CompletableFuture<ScriptInfo> loadScripts(List<Config> configs, O
605610
});
606611
parser.setInactive();
607612

613+
// trigger events
614+
scripts.forEach(loadingInfo -> {
615+
Script script = loadingInfo.script;
616+
617+
parser.setActive(script);
618+
parser.setNode(script.getConfig().getMainNode());
619+
620+
ScriptLoader.eventRegistry().events(ScriptLoadEvent.class)
621+
.forEach(event -> event.onLoad(parser, script));
622+
script.eventRegistry().events(ScriptLoadEvent.class)
623+
.forEach(event -> event.onLoad(parser, script));
624+
});
625+
parser.setInactive();
626+
608627
return scriptInfo;
609628
} catch (Exception e) {
610629
// Something went wrong, we need to make sure the exception is printed
@@ -700,10 +719,13 @@ private static LoadingScriptInfo loadScript(Config config) {
700719
assert file != null;
701720
File disabledFile = new File(file.getParentFile(), DISABLED_SCRIPT_PREFIX + file.getName());
702721
disabledScripts.remove(disabledFile);
703-
722+
704723
// Add to loaded files to use for future reloads
705724
loadedScripts.add(script);
706-
725+
726+
ScriptLoader.eventRegistry().events(ScriptInitEvent.class)
727+
.forEach(event -> event.onInit(script));
728+
707729
return null;
708730
};
709731
if (isAsync()) { // Need to delegate to main thread
@@ -848,6 +870,13 @@ public static ScriptInfo unloadScripts(Set<Script> scripts) {
848870
// initial unload stage
849871
for (Script script : scripts) {
850872
parser.setActive(script);
873+
874+
// trigger unload event before beginning
875+
eventRegistry().events(ScriptUnloadEvent.class)
876+
.forEach(event -> event.onUnload(parser, script));
877+
script.eventRegistry().events(ScriptUnloadEvent.class)
878+
.forEach(event -> event.onUnload(parser, script));
879+
851880
for (Structure structure : script.getStructures())
852881
structure.unload();
853882
}
@@ -1043,6 +1072,96 @@ public static FileFilter getDisabledScriptsFilter() {
10431072
return disabledScriptFilter;
10441073
}
10451074

1075+
/*
1076+
* Global Script Event API
1077+
*/
1078+
1079+
// ScriptLoader Events
1080+
1081+
/**
1082+
* Used for listening to events involving a ScriptLoader.
1083+
* @see #eventRegistry()
1084+
*/
1085+
public interface LoaderEvent extends org.skriptlang.skript.util.event.Event { }
1086+
1087+
/**
1088+
* Called when {@link ScriptLoader} is preparing to load {@link Config}s into {@link Script}s.
1089+
* @see #loadScripts(File, OpenCloseable)
1090+
* @see #loadScripts(Set, OpenCloseable)
1091+
*/
1092+
@FunctionalInterface
1093+
public interface ScriptPreInitEvent extends LoaderEvent {
1094+
1095+
/**
1096+
* The method that is called when this event triggers.
1097+
* Modifications to the given collection will affect what is loaded.
1098+
* @param configs The Configs to be loaded.
1099+
*/
1100+
void onPreInit(Collection<Config> configs);
1101+
1102+
}
1103+
1104+
/**
1105+
* Called when a {@link Script} is created and preloaded in the {@link ScriptLoader}.
1106+
* The initializing script may contain {@link Structure}s that are not fully loaded.
1107+
* @see #loadScripts(File, OpenCloseable)
1108+
* @see #loadScripts(Set, OpenCloseable)
1109+
*/
1110+
@FunctionalInterface
1111+
public interface ScriptInitEvent extends LoaderEvent {
1112+
1113+
/**
1114+
* The method that is called when this event triggers.
1115+
* @param script The Script being initialized.
1116+
*/
1117+
void onInit(Script script);
1118+
1119+
}
1120+
1121+
/**
1122+
* Called when a {@link Script} is loaded in the {@link ScriptLoader}.
1123+
* This event will trigger <b>after</b> the script is completely loaded ({@link Structure} initialization finished).
1124+
* @see #loadScripts(File, OpenCloseable)
1125+
* @see #loadScripts(Set, OpenCloseable)
1126+
*/
1127+
@FunctionalInterface
1128+
public interface ScriptLoadEvent extends LoaderEvent, Script.Event {
1129+
1130+
/**
1131+
* The method that is called when this event triggers.
1132+
* @param parser The ParserInstance handling the loading of <code>script</code>.
1133+
* @param script The Script being loaded.
1134+
*/
1135+
void onLoad(ParserInstance parser, Script script);
1136+
1137+
}
1138+
1139+
/**
1140+
* Called when a {@link Script} is unloaded in the {@link ScriptLoader}.
1141+
* This event will trigger <b>before</b> the script is unloaded.
1142+
* @see #unloadScript(Script)
1143+
*/
1144+
@FunctionalInterface
1145+
public interface ScriptUnloadEvent extends LoaderEvent, Script.Event {
1146+
1147+
/**
1148+
* The method that is called when this event triggers.
1149+
* @param parser The ParserInstance handling the unloading of <code>script</code>.
1150+
* @param script The Script being unloaded.
1151+
*/
1152+
void onUnload(ParserInstance parser, Script script);
1153+
1154+
}
1155+
1156+
private static final EventRegistry<LoaderEvent> eventRegistry = new EventRegistry<>();
1157+
1158+
/**
1159+
* @return An EventRegistry for the ScriptLoader's events.
1160+
*/
1161+
public static EventRegistry<LoaderEvent> eventRegistry() {
1162+
return eventRegistry;
1163+
}
1164+
10461165
/*
10471166
* Deprecated stuff
10481167
*

src/main/java/ch/njol/skript/Skript.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@
9797
import org.junit.runner.JUnitCore;
9898
import org.junit.runner.Result;
9999
import org.skriptlang.skript.bukkit.SkriptMetrics;
100+
import org.skriptlang.skript.bukkit.displays.DisplayModule;
100101
import org.skriptlang.skript.lang.comparator.Comparator;
101102
import org.skriptlang.skript.lang.comparator.Comparators;
102103
import org.skriptlang.skript.lang.converter.Converter;
@@ -541,6 +542,9 @@ public void onEnable() {
541542
try {
542543
getAddonInstance().loadClasses("ch.njol.skript",
543544
"conditions", "effects", "events", "expressions", "entity", "sections", "structures");
545+
getAddonInstance().loadClasses("org.skriptlang.skript.bukkit", "misc");
546+
// todo: become proper module once registry api is merged
547+
DisplayModule.load();
544548
} catch (final Exception e) {
545549
exception(e, "Could not load required .class files: " + e.getLocalizedMessage());
546550
setEnabled(false);

src/main/java/ch/njol/skript/aliases/ItemType.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1414,6 +1414,22 @@ public Material getMaterial() {
14141414
return data.getType();
14151415
}
14161416

1417+
/**
1418+
* @return A random block material this ItemType represents.
1419+
* @throws IllegalStateException If {@link #hasBlock()} is false.
1420+
*/
1421+
public Material getBlockMaterial() {
1422+
List<ItemData> blockItemDatas = new ArrayList<>();
1423+
for (ItemData d : types) {
1424+
if (d.type.isBlock())
1425+
blockItemDatas.add(d);
1426+
}
1427+
if (blockItemDatas.isEmpty())
1428+
throw new IllegalStateException("This ItemType does not represent a material. " +
1429+
"ItemType#hasBlock() should return true before invoking this method.");
1430+
return blockItemDatas.get(random.nextInt(blockItemDatas.size())).getType();
1431+
}
1432+
14171433
/**
14181434
* Returns a base item type of this. Essentially, this calls
14191435
* {@link ItemData#aliasCopy()} on all datas and creates a new type
@@ -1427,4 +1443,5 @@ public ItemType getBaseType() {
14271443
}
14281444
return copy;
14291445
}
1446+
14301447
}

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

Lines changed: 37 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,32 @@
1818
*/
1919
package ch.njol.skript.classes.data;
2020

21-
import java.io.StreamCorruptedException;
22-
import java.util.ArrayList;
23-
import java.util.Arrays;
24-
import java.util.List;
25-
import java.util.Locale;
26-
import java.util.Map.Entry;
27-
import java.util.UUID;
28-
import java.util.regex.Matcher;
29-
import java.util.regex.Pattern;
30-
import java.util.stream.Collectors;
31-
21+
import ch.njol.skript.Skript;
22+
import ch.njol.skript.SkriptConfig;
23+
import ch.njol.skript.aliases.Aliases;
24+
import ch.njol.skript.aliases.ItemType;
3225
import ch.njol.skript.bukkitutil.BukkitUtils;
26+
import ch.njol.skript.bukkitutil.EnchantmentUtils;
27+
import ch.njol.skript.bukkitutil.ItemUtils;
28+
import ch.njol.skript.classes.ClassInfo;
29+
import ch.njol.skript.classes.ConfigurationSerializer;
30+
import ch.njol.skript.classes.EnumClassInfo;
31+
import ch.njol.skript.classes.Parser;
32+
import ch.njol.skript.classes.Serializer;
33+
import ch.njol.skript.classes.registry.RegistryClassInfo;
34+
import ch.njol.skript.entity.EntityData;
35+
import ch.njol.skript.expressions.ExprDamageCause;
36+
import ch.njol.skript.expressions.base.EventValueExpression;
37+
import ch.njol.skript.lang.ParseContext;
38+
import ch.njol.skript.lang.util.SimpleLiteral;
39+
import ch.njol.skript.localization.Language;
40+
import ch.njol.skript.registrations.Classes;
41+
import ch.njol.skript.util.BlockUtils;
42+
import ch.njol.skript.util.PotionEffectUtils;
43+
import ch.njol.skript.util.StringMode;
44+
import ch.njol.util.StringUtils;
45+
import ch.njol.yggdrasil.Fields;
46+
import io.papermc.paper.world.MoonPhase;
3347
import org.bukkit.Bukkit;
3448
import org.bukkit.Chunk;
3549
import org.bukkit.Difficulty;
@@ -80,37 +94,19 @@
8094
import org.bukkit.potion.PotionEffectType;
8195
import org.bukkit.util.CachedServerIcon;
8296
import org.bukkit.util.Vector;
83-
84-
import ch.njol.skript.Skript;
85-
import ch.njol.skript.SkriptConfig;
86-
import ch.njol.skript.aliases.Aliases;
87-
import ch.njol.skript.aliases.ItemType;
88-
import ch.njol.skript.bukkitutil.EnchantmentUtils;
89-
import ch.njol.skript.bukkitutil.ItemUtils;
90-
import ch.njol.skript.classes.ClassInfo;
91-
import ch.njol.skript.classes.ConfigurationSerializer;
92-
import ch.njol.skript.classes.EnumClassInfo;
93-
import ch.njol.skript.classes.Parser;
94-
import ch.njol.skript.classes.Serializer;
95-
import ch.njol.skript.classes.registry.RegistryClassInfo;
96-
import ch.njol.skript.entity.EntityData;
97-
import ch.njol.skript.expressions.ExprDamageCause;
98-
import ch.njol.skript.expressions.base.EventValueExpression;
99-
import ch.njol.skript.lang.ParseContext;
100-
import ch.njol.skript.lang.util.SimpleLiteral;
101-
import ch.njol.skript.localization.Language;
102-
import ch.njol.skript.registrations.Classes;
103-
import ch.njol.skript.util.BlockUtils;
104-
import ch.njol.skript.util.PotionEffectUtils;
105-
import ch.njol.skript.util.StringMode;
106-
import ch.njol.util.StringUtils;
107-
import ch.njol.yggdrasil.Fields;
108-
import io.papermc.paper.world.MoonPhase;
10997
import org.jetbrains.annotations.Nullable;
11098

111-
/**
112-
* @author Peter Güttinger
113-
*/
99+
import java.io.StreamCorruptedException;
100+
import java.util.ArrayList;
101+
import java.util.Arrays;
102+
import java.util.List;
103+
import java.util.Locale;
104+
import java.util.Map.Entry;
105+
import java.util.UUID;
106+
import java.util.regex.Matcher;
107+
import java.util.regex.Pattern;
108+
import java.util.stream.Collectors;
109+
114110
public class BukkitClasses {
115111

116112
public BukkitClasses() {}
@@ -1527,6 +1523,7 @@ public String toVariableNameString(EnchantmentOffer eo) {
15271523
.name("Transform Reason")
15281524
.description("Represents a transform reason of an <a href='events.html#entity transform'>entity transform event</a>.")
15291525
.since("2.8.0"));
1526+
15301527
Classes.registerClass(new EnumClassInfo<>(EntityPotionEffectEvent.Cause.class, "entitypotioncause", "entity potion causes")
15311528
.user("(entity )?potion ?effect ?cause")
15321529
.name("Entity Potion Cause")

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

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import ch.njol.skript.entity.EntityData;
3030
import ch.njol.skript.entity.RabbitData;
3131
import ch.njol.skript.util.BlockUtils;
32+
import ch.njol.skript.util.Color;
3233
import ch.njol.skript.util.Date;
3334
import ch.njol.skript.util.EnchantmentType;
3435
import ch.njol.skript.util.Experience;
@@ -75,20 +76,28 @@ public DefaultComparators() {}
7576
static {
7677

7778
// Number - Number
78-
Comparators.registerComparator(Number.class, Number.class, new Comparator<Number, Number>() {
79+
Comparators.registerComparator(Number.class, Number.class, new Comparator<>() {
7980
@Override
8081
public Relation compare(Number n1, Number n2) {
8182
if (n1 instanceof Long && n2 instanceof Long)
8283
return Relation.get(n1.longValue() - n2.longValue());
83-
Double d1 = n1.doubleValue(),
84-
d2 = n2.doubleValue();
84+
double epsilon = Skript.EPSILON;
85+
@SuppressWarnings("WrapperTypeMayBePrimitive") Double d1, d2;
86+
if (n1 instanceof Float || n2 instanceof Float) {
87+
d1 = (double) n1.floatValue();
88+
d2 = (double) n2.floatValue();
89+
epsilon = Math.min(d1, d2) * 1e-6; // dynamic epsilon
90+
} else {
91+
d1 = n1.doubleValue();
92+
d2 = n2.doubleValue();
93+
}
8594
if (d1.isNaN() || d2.isNaN()) {
8695
return Relation.SMALLER;
8796
} else if (d1.isInfinite() || d2.isInfinite()) {
8897
return d1 > d2 ? Relation.GREATER : d1 < d2 ? Relation.SMALLER : Relation.EQUAL;
8998
} else {
9099
double diff = d1 - d2;
91-
if (Math.abs(diff) < Skript.EPSILON)
100+
if (Math.abs(diff) < epsilon)
92101
return Relation.EQUAL;
93102
return Relation.get(diff);
94103
}
@@ -656,6 +665,11 @@ public boolean supportsOrdering() {
656665

657666
// Potion Effect Type
658667
Comparators.registerComparator(PotionEffectType.class, PotionEffectType.class, (one, two) -> Relation.get(one.equals(two)));
668+
669+
// Color - Color
670+
Comparators.registerComparator(Color.class, Color.class, (one, two) -> Relation.get(one.asBukkitColor().equals(two.asBukkitColor())));
671+
Comparators.registerComparator(Color.class, org.bukkit.Color.class, (one, two) -> Relation.get(one.asBukkitColor().equals(two)));
672+
Comparators.registerComparator(org.bukkit.Color.class, org.bukkit.Color.class, (one, two) -> Relation.get(one.equals(two)));
659673
}
660674

661675
}

0 commit comments

Comments
 (0)