Skip to content

Commit 92ea365

Browse files
Paper 1.21.10 Update (#8219)
* Initial Commit * copper golem * Update Skript.java * Update Skript.java * Attempt 2 * Attempt 3 * Attempt 4 * Attempt 5 * Attempt 6 * Attempt 7 * Attempt 8 * Attempt 9 * Attempt 10 * Attempt 11 * Attempt 12 * Attempt 13 * Attempt 14 * Update src/main/java/ch/njol/skript/Skript.java * 1.21.10
1 parent 83a15eb commit 92ea365

File tree

15 files changed

+199
-109
lines changed

15 files changed

+199
-109
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ dependencies {
2929
shadow group: 'org.bstats', name: 'bstats-bukkit', version: '3.1.0'
3030
shadow group: 'net.kyori', name: 'adventure-text-serializer-bungeecord', version: '4.4.1'
3131

32-
implementation group: 'io.papermc.paper', name: 'paper-api', version: '1.21.8-R0.1-SNAPSHOT'
32+
implementation group: 'io.papermc.paper', name: 'paper-api', version: '1.21.10-R0.1-SNAPSHOT'
3333
implementation group: 'com.google.code.findbugs', name: 'findbugs', version: '3.0.1'
3434

3535
// bundled with Minecraft 1.19.4+ for display entity transforms

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@ groupid=ch.njol
77
name=skript
88
version=2.13.0-pre1
99
jarName=Skript.jar
10-
testEnv=java21/paper-1.21.8
10+
testEnv=java21/paper-1.21.10
1111
testEnvJavaVersion=21

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

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,30 +3,54 @@
33
import ch.njol.skript.aliases.Aliases;
44
import ch.njol.skript.bukkitutil.BurgerHelper;
55
import ch.njol.skript.classes.ClassInfo;
6-
import ch.njol.skript.classes.data.*;
6+
import ch.njol.skript.classes.data.BukkitClasses;
7+
import ch.njol.skript.classes.data.BukkitEventValues;
8+
import ch.njol.skript.classes.data.DefaultComparators;
9+
import ch.njol.skript.classes.data.DefaultConverters;
10+
import ch.njol.skript.classes.data.DefaultFunctions;
11+
import ch.njol.skript.classes.data.DefaultOperations;
12+
import ch.njol.skript.classes.data.JavaClasses;
13+
import ch.njol.skript.classes.data.SkriptClasses;
714
import ch.njol.skript.command.Commands;
815
import ch.njol.skript.doc.Documentation;
916
import ch.njol.skript.events.EvtSkript;
1017
import ch.njol.skript.expressions.arithmetic.ExprArithmetic;
1118
import ch.njol.skript.hooks.Hook;
1219
import ch.njol.skript.lang.*;
13-
import ch.njol.skript.lang.Effect;
1420
import ch.njol.skript.lang.Condition.ConditionType;
1521
import ch.njol.skript.lang.util.SimpleExpression;
1622
import ch.njol.skript.localization.Language;
1723
import ch.njol.skript.localization.Message;
1824
import ch.njol.skript.localization.PluralizingArgsMessage;
19-
import ch.njol.skript.log.*;
25+
import ch.njol.skript.log.BukkitLoggerFilter;
26+
import ch.njol.skript.log.CountingLogHandler;
27+
import ch.njol.skript.log.ErrorDescLogHandler;
28+
import ch.njol.skript.log.ErrorQuality;
29+
import ch.njol.skript.log.LogEntry;
30+
import ch.njol.skript.log.LogHandler;
31+
import ch.njol.skript.log.SkriptLogger;
32+
import ch.njol.skript.log.TestingLogHandler;
33+
import ch.njol.skript.log.Verbosity;
2034
import ch.njol.skript.registrations.Classes;
2135
import ch.njol.skript.registrations.EventValues;
2236
import ch.njol.skript.registrations.Feature;
23-
import ch.njol.skript.test.runner.*;
37+
import ch.njol.skript.test.runner.EffObjectives;
38+
import ch.njol.skript.test.runner.SkriptAsyncJUnitTest;
39+
import ch.njol.skript.test.runner.SkriptJUnitTest;
40+
import ch.njol.skript.test.runner.SkriptTestEvent;
41+
import ch.njol.skript.test.runner.TestMode;
42+
import ch.njol.skript.test.runner.TestTracker;
2443
import ch.njol.skript.timings.SkriptTimings;
2544
import ch.njol.skript.update.ReleaseManifest;
2645
import ch.njol.skript.update.ReleaseStatus;
2746
import ch.njol.skript.update.UpdateManifest;
2847
import ch.njol.skript.util.Date;
29-
import ch.njol.skript.util.*;
48+
import ch.njol.skript.util.EmptyStacktraceException;
49+
import ch.njol.skript.util.ExceptionUtils;
50+
import ch.njol.skript.util.FileUtils;
51+
import ch.njol.skript.util.Task;
52+
import ch.njol.skript.util.Utils;
53+
import ch.njol.skript.util.Version;
3054
import ch.njol.skript.util.chat.BungeeConverter;
3155
import ch.njol.skript.util.chat.ChatMessages;
3256
import ch.njol.skript.variables.Variables;
@@ -37,9 +61,13 @@
3761
import ch.njol.util.coll.iterator.EnumerationIterable;
3862
import com.google.gson.Gson;
3963
import com.google.gson.GsonBuilder;
40-
import io.papermc.lib.PaperLib;
4164
import org.bstats.bukkit.Metrics;
42-
import org.bukkit.*;
65+
import org.bukkit.Bukkit;
66+
import org.bukkit.ChatColor;
67+
import org.bukkit.Material;
68+
import org.bukkit.OfflinePlayer;
69+
import org.bukkit.Server;
70+
import org.bukkit.World;
4371
import org.bukkit.command.CommandSender;
4472
import org.bukkit.command.PluginCommand;
4573
import org.bukkit.entity.Player;
@@ -70,8 +98,8 @@
7098
import org.skriptlang.skript.bukkit.fishing.FishingModule;
7199
import org.skriptlang.skript.bukkit.furnace.FurnaceModule;
72100
import org.skriptlang.skript.bukkit.input.InputModule;
73-
import org.skriptlang.skript.bukkit.log.runtime.BukkitRuntimeErrorConsumer;
74101
import org.skriptlang.skript.bukkit.itemcomponents.ItemComponentModule;
102+
import org.skriptlang.skript.bukkit.log.runtime.BukkitRuntimeErrorConsumer;
75103
import org.skriptlang.skript.bukkit.loottables.LootTableModule;
76104
import org.skriptlang.skript.bukkit.registration.BukkitRegistryKeys;
77105
import org.skriptlang.skript.bukkit.registration.BukkitSyntaxInfos;
@@ -696,7 +724,14 @@ protected void afterErrors() {
696724
if (TestMode.DEV_MODE) {
697725
runTests(); // Dev mode doesn't need a delay
698726
} else {
699-
PaperLib.getChunkAtAsync(Bukkit.getWorlds().get(0), 100, 100).thenRun(() -> runTests());
727+
// delay + chunk loading necessary to allow world to fully generate and start ticking before tests run.
728+
World world = Bukkit.getWorlds().get(0);
729+
world.setSpawnLocation(0, 0, 0);
730+
Bukkit.getScheduler().scheduleSyncDelayedTask(Skript.getInstance(), () -> {
731+
world.addPluginChunkTicket(0, 0, Skript.getInstance());
732+
world.addPluginChunkTicket(100, 100, Skript.getInstance());
733+
Bukkit.getScheduler().scheduleSyncDelayedTask(Skript.getInstance(), () -> runTests(), 100);
734+
}, 5);
700735
}
701736
}
702737

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

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

3-
import org.bukkit.World;
4-
import org.bukkit.event.Event;
5-
import org.jetbrains.annotations.Nullable;
6-
73
import ch.njol.skript.Skript;
84
import ch.njol.skript.doc.Description;
95
import ch.njol.skript.doc.Examples;
@@ -13,16 +9,19 @@
139
import ch.njol.skript.lang.Expression;
1410
import ch.njol.skript.lang.SkriptParser.ParseResult;
1511
import ch.njol.util.Kleenean;
12+
import org.bukkit.GameRule;
13+
import org.bukkit.World;
14+
import org.bukkit.event.Event;
15+
import org.jetbrains.annotations.Nullable;
1616

17-
/**
18-
* @author Peter Güttinger
19-
*/
2017
@Name("PvP")
2118
@Description("Checks the PvP state of a world.")
2219
@Examples({"PvP is enabled",
2320
"PvP is disabled in \"world\""})
2421
@Since("1.3.4")
2522
public class CondPvP extends Condition {
23+
24+
private static final boolean PVP_GAME_RULE_EXISTS = Skript.fieldExists(GameRule.class, "PVP");
2625

2726
static {
2827
Skript.registerCondition(CondPvP.class, "(is PvP|PvP is) enabled [in %worlds%]", "(is PvP|PvP is) disabled [in %worlds%]");
@@ -41,12 +40,15 @@ public boolean init(final Expression<?>[] exprs, final int matchedPattern, final
4140
}
4241

4342
@Override
44-
public boolean check(final Event e) {
45-
return worlds.check(e, w -> w.getPVP() == enabled, isNegated());
43+
public boolean check(Event event) {
44+
if (PVP_GAME_RULE_EXISTS)
45+
return worlds.check(event, world -> world.getGameRuleValue(GameRule.PVP) == enabled, isNegated());
46+
return worlds.check(event, world -> world.getPVP() == enabled, isNegated());
4647
}
4748

4849
@Override
49-
public String toString(final @Nullable Event e, final boolean debug) {
50-
return "PvP is " + (enabled ? "enabled" : "disabled") + " in " + worlds.toString(e, debug);
50+
public String toString(@Nullable Event event, boolean debug) {
51+
return "PvP is " + (enabled ? "enabled" : "disabled") + " in " + worlds.toString(event, debug);
5152
}
53+
5254
}
Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
package ch.njol.skript.effects;
22

3-
import org.bukkit.World;
4-
import org.bukkit.event.Event;
5-
import org.jetbrains.annotations.Nullable;
6-
73
import ch.njol.skript.Skript;
84
import ch.njol.skript.doc.Description;
95
import ch.njol.skript.doc.Examples;
@@ -13,17 +9,20 @@
139
import ch.njol.skript.lang.Expression;
1410
import ch.njol.skript.lang.SkriptParser.ParseResult;
1511
import ch.njol.util.Kleenean;
12+
import org.bukkit.GameRule;
13+
import org.bukkit.World;
14+
import org.bukkit.event.Event;
15+
import org.jetbrains.annotations.Nullable;
1616

17-
/**
18-
* @author Peter Güttinger
19-
*/
2017
@Name("PvP")
2118
@Description("Set the PvP state for a given world.")
2219
@Examples({"enable PvP #(current world only)",
2320
"disable PvP in all worlds"})
2421
@Since("1.3.4")
2522
public class EffPvP extends Effect {
26-
23+
24+
private static final boolean PVP_GAME_RULE_EXISTS = Skript.fieldExists(GameRule.class, "PVP");
25+
2726
static {
2827
Skript.registerEffect(EffPvP.class, "enable PvP [in %worlds%]", "disable PVP [in %worlds%]");
2928
}
@@ -41,15 +40,19 @@ public boolean init(final Expression<?>[] exprs, final int matchedPattern, final
4140
}
4241

4342
@Override
44-
protected void execute(final Event e) {
45-
for (final World w : worlds.getArray(e)) {
46-
w.setPVP(enable);
43+
protected void execute(Event event) {
44+
if (PVP_GAME_RULE_EXISTS) {
45+
for (World world : worlds.getArray(event))
46+
world.setGameRule(GameRule.PVP, enable);
47+
} else {
48+
for (World world : worlds.getArray(event))
49+
world.setPVP(enable);
4750
}
4851
}
4952

5053
@Override
51-
public String toString(final @Nullable Event e, final boolean debug) {
52-
return (enable ? "enable" : "disable") + " PvP in " + worlds.toString(e, debug);
54+
public String toString(@Nullable Event event, boolean debug) {
55+
return (enable ? "enable" : "disable") + " PvP in " + worlds.toString(event, debug);
5356
}
5457

5558
}

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

Lines changed: 36 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
import ch.njol.yggdrasil.Fields;
3030
import ch.njol.yggdrasil.Fields.FieldContext;
3131
import ch.njol.yggdrasil.YggdrasilSerializable.YggdrasilExtendedSerializable;
32+
import io.papermc.paper.world.flag.FeatureDependant;
33+
import io.papermc.paper.world.flag.FeatureFlagSetHolder;
3234
import org.bukkit.Bukkit;
3335
import org.bukkit.Chunk;
3436
import org.bukkit.Location;
@@ -58,22 +60,30 @@
5860
@SuppressWarnings("rawtypes")
5961
public abstract class EntityData<E extends Entity> implements SyntaxElement, YggdrasilExtendedSerializable {
6062

61-
/*
62-
* In 1.20.2 Spigot deprecated org.bukkit.util.Consumer.
63-
* From the class header: "API methods which use this consumer will be remapped to Java's consumer at runtime, resulting in an error."
64-
* But in 1.13-1.16 the only way to use a consumer was World#spawn(Location, Class, org.bukkit.util.Consumer).
65-
*/
66-
protected static @Nullable Method WORLD_1_17_CONSUMER_METHOD;
67-
protected static boolean WORLD_1_17_CONSUMER;
63+
// Removed in 1.21.9 in favor of 'FeatureFlagSetHolder'
64+
private static final boolean HAS_ENABLED_BY_FEATURE = Skript.methodExists(EntityType.class, "isEnabledByFeature", World.class);
65+
private static final @Nullable Method ENABLED_BY_FEATURE_METHOD;
66+
67+
// Added in 1.21.9, replaces 'isEnabledByFeature'
68+
private static final @Nullable Method IS_ENABLED_METHOD;
6869

6970
static {
70-
try {
71-
if (WORLD_1_17_CONSUMER = Skript.methodExists(RegionAccessor.class, "spawn", Location.class, Class.class, org.bukkit.util.Consumer.class))
72-
WORLD_1_17_CONSUMER_METHOD = RegionAccessor.class.getDeclaredMethod("spawn", Location.class, Class.class, org.bukkit.util.Consumer.class);
73-
} catch (NoSuchMethodException | SecurityException ignored) { /* We already checked if the method exists */ }
71+
if (HAS_ENABLED_BY_FEATURE) {
72+
IS_ENABLED_METHOD = null;
73+
try {
74+
ENABLED_BY_FEATURE_METHOD = EntityType.class.getDeclaredMethod("isEnabledByFeature", World.class);
75+
} catch (NoSuchMethodException e) {
76+
throw new RuntimeException(e);
77+
}
78+
} else {
79+
ENABLED_BY_FEATURE_METHOD = null;
80+
try {
81+
IS_ENABLED_METHOD = FeatureFlagSetHolder.class.getDeclaredMethod("isEnabled", FeatureDependant.class);
82+
} catch (NoSuchMethodException e) {
83+
throw new RuntimeException(e);
84+
}
85+
}
7486
}
75-
76-
private static final boolean HAS_ENABLED_BY_FEATURE = Skript.methodExists(EntityType.class, "isEnabledByFeature", World.class);
7787
public static final String LANGUAGE_NODE = "entities";
7888

7989
public static final Message m_age_pattern = new Message(LANGUAGE_NODE + ".age pattern");
@@ -638,19 +648,28 @@ private E apply(E entity) {
638648
* @param world The world to check spawning permissions in.
639649
* @return {@code true} if the entity can be spawned in the given world, or in general if world is {@code null}; otherwise {@code false}.
640650
*/
641-
@SuppressWarnings({"removal"})
642651
public boolean canSpawn(@Nullable World world) {
643652
if (world == null)
644653
return false;
645654
EntityType bukkitEntityType = info.entityType != null ? info.entityType : EntityUtils.toBukkitEntityType(this);
646-
if (bukkitEntityType == null)
655+
if (bukkitEntityType == null || !bukkitEntityType.isSpawnable())
647656
return false;
648657
if (HAS_ENABLED_BY_FEATURE) {
649658
// Check if the entity can actually be spawned
650659
// Some entity types may be restricted by experimental datapacks
651-
return bukkitEntityType.isEnabledByFeature(world) && bukkitEntityType.isSpawnable();
660+
assert ENABLED_BY_FEATURE_METHOD != null;
661+
try {
662+
return (boolean) ENABLED_BY_FEATURE_METHOD.invoke(bukkitEntityType, world);
663+
} catch (IllegalAccessException | InvocationTargetException e) {
664+
return false;
665+
}
666+
}
667+
assert IS_ENABLED_METHOD != null;
668+
try {
669+
return (boolean) IS_ENABLED_METHOD.invoke(world, bukkitEntityType);
670+
} catch (IllegalAccessException | InvocationTargetException e) {
671+
return false;
652672
}
653-
return bukkitEntityType.isSpawnable();
654673
}
655674

656675
/**
@@ -663,23 +682,6 @@ public boolean canSpawn(@Nullable World world) {
663682
return spawn(location, (Consumer<E>) null);
664683
}
665684

666-
/**
667-
* Spawn this entity data at a location.
668-
* The consumer allows for modification to the entity before it actually gets spawned.
669-
* <p>
670-
* Bukkit's own {@link org.bukkit.util.Consumer} is deprecated.
671-
* Use {@link #spawn(Location, Consumer)}
672-
*
673-
* @param location The {@link Location} to spawn the entity at.
674-
* @param consumer A {@link Consumer} to apply the entity changes to.
675-
* @return The Entity object that is spawned.
676-
*/
677-
@Deprecated(since = "2.8.0", forRemoval = true)
678-
@SuppressWarnings("deprecation")
679-
public @Nullable E spawn(Location location, org.bukkit.util.@Nullable Consumer<E> consumer) {
680-
return spawn(location, (Consumer<E>) e -> consumer.accept(e));
681-
}
682-
683685
/**
684686
* Spawn this entity data at a location.
685687
* The consumer allows for modification to the entity before it actually gets spawned.
@@ -887,20 +889,10 @@ public void deserialize(Fields fields) throws StreamCorruptedException, NotSeria
887889
return "entity data";
888890
}
889891

890-
@SuppressWarnings({"unchecked", "deprecation"})
891892
protected static <E extends Entity> @Nullable E spawn(Location location, Class<E> type, Consumer<E> consumer) {
892893
World world = location.getWorld();
893894
if (world == null)
894895
return null;
895-
if (WORLD_1_17_CONSUMER) {
896-
try {
897-
return (@Nullable E) WORLD_1_17_CONSUMER_METHOD.invoke(world, location, type, (org.bukkit.util.Consumer<E>) consumer::accept);
898-
} catch (InvocationTargetException | IllegalAccessException e) {
899-
if (Skript.testing())
900-
Skript.exception(e, "Can't spawn " + type.getName());
901-
return null;
902-
}
903-
}
904896
return world.spawn(location, type, consumer);
905897
}
906898

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,11 @@ private static void addSuperEntity(String codeName, Class<? extends Entity> enti
240240
if (Skript.isRunningMinecraft(1, 21, 6))
241241
addSimpleEntity("happy ghast", HappyGhast.class);
242242

243+
if (Skript.isRunningMinecraft(1, 21, 9)) {
244+
addSimpleEntity("copper golem", CopperGolem.class);
245+
addSimpleEntity("mannequin", Mannequin.class);
246+
}
247+
243248
// SuperTypes
244249
addSuperEntity("human", HumanEntity.class);
245250
addSuperEntity("damageable", Damageable.class);

0 commit comments

Comments
 (0)