Skip to content

Commit 22e543d

Browse files
committed
1.21.11 part 5: initial code updates
1 parent 70b2d5c commit 22e543d

17 files changed

Lines changed: 220 additions & 73 deletions

File tree

paper/src/main/java/com/denizenscript/denizen/paper/events/WorldGameRuleChangeScriptEvent.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.denizenscript.denizen.objects.PlayerTag;
88
import com.denizenscript.denizen.objects.WorldTag;
99
import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData;
10+
import com.denizenscript.denizen.utilities.world.GameRuleReflect;
1011
import com.denizenscript.denizencore.objects.ObjectTag;
1112
import com.denizenscript.denizencore.objects.core.ElementTag;
1213
import com.denizenscript.denizencore.scripts.ScriptEntryData;
@@ -69,7 +70,7 @@ public boolean matches(ScriptPath path) {
6970
if (path.eventArgLowerAt(2).equals("in") && !path.tryArgObject(3, world)) {
7071
return false;
7172
}
72-
if (!runGenericSwitchCheck(path, "gamerule", event.getGameRule().getName())) {
73+
if (!runGenericSwitchCheck(path, "gamerule", GameRuleReflect.getName(event.getGameRule()))) {
7374
return false;
7475
}
7576
return super.matches(path);
@@ -78,7 +79,7 @@ public boolean matches(ScriptPath path) {
7879
@Override
7980
public ObjectTag getContext(String name) {
8081
return switch (name) {
81-
case "gamerule" -> new ElementTag(event.getGameRule().getName(), true);
82+
case "gamerule" -> new ElementTag(GameRuleReflect.getName(event.getGameRule()), true);
8283
case "value" -> new ElementTag(event.getValue(), true);
8384
case "source_type" -> getSourceType();
8485
case "command_block_location" -> getCommandBlock();

plugin/src/main/java/com/denizenscript/denizen/objects/WorldTag.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.denizenscript.denizen.nms.abstracts.BiomeNMS;
77
import com.denizenscript.denizen.utilities.BukkitImplDeprecations;
88
import com.denizenscript.denizen.utilities.flags.WorldFlagHandler;
9+
import com.denizenscript.denizen.utilities.world.GameRuleReflect;
910
import com.denizenscript.denizencore.flags.AbstractFlagTracker;
1011
import com.denizenscript.denizencore.flags.FlaggableObject;
1112
import com.denizenscript.denizencore.objects.Adjustable;
@@ -177,7 +178,7 @@ public <T> T getGameRuleOrDefault(GameRule<T> gameRule) {
177178
if (value == null) {
178179
value = world.getGameRuleDefault(gameRule);
179180
if (value == null) {
180-
throw new IllegalStateException("World " + world_name + " contains no GameRule " + gameRule.getName());
181+
throw new IllegalStateException("World " + world_name + " contains no GameRule " + GameRuleReflect.getName(gameRule));
181182
}
182183
}
183184
return value;
@@ -859,9 +860,13 @@ else if (time >= 12500) {
859860
attribute.echoError("The tag 'worldtag.gamerule[...]' must have an input value.");
860861
return null;
861862
}
862-
GameRule rule = GameRule.getByName(attribute.getParam());
863-
Object result = object.getWorld().getGameRuleValue(rule);
864-
return new ElementTag(result == null ? "null" : result.toString());
863+
GameRule<?> rule = GameRuleReflect.getByName(attribute.getParam());
864+
if (rule == null) {
865+
attribute.echoError("Invalid game rule specified: " + attribute.getParam() + '.');
866+
return null;
867+
}
868+
Object result = GameRuleReflect.getValue(object.getWorld(), rule);
869+
return new ElementTag(String.valueOf(result), true);
865870
});
866871

867872
// <--[tag]
@@ -872,10 +877,10 @@ else if (time >= 12500) {
872877
// -->
873878
registerTag(MapTag.class, "gamerule_map", (attribute, object) -> {
874879
MapTag map = new MapTag();
875-
for (GameRule rule : GameRule.values()) {
876-
Object result = object.getWorld().getGameRuleValue(rule);
880+
for (GameRule<?> rule : GameRuleReflect.values()) {
881+
Object result = GameRuleReflect.getValue(object.getWorld(), rule);
877882
if (result != null) {
878-
map.putObject(rule.getName(), new ElementTag(result.toString()));
883+
map.putObject(GameRuleReflect.getName(rule), new ElementTag(result.toString(), true));
879884
}
880885
}
881886
return map;
@@ -1525,7 +1530,7 @@ else if (time >= 12500) {
15251530
NMSHandler.worldHelper.wakeUpAllPlayers(world);
15261531
}
15271532
// minor change: prior to 1.18, hasStorm/isRaining was not checked
1528-
if (object.getGameRuleOrDefault(GameRule.DO_WEATHER_CYCLE) && world.hasStorm()) {
1533+
if (object.getGameRuleOrDefault(GameRuleReflect.WEATHER_CYCLE_GAMERULE) && world.hasStorm()) {
15291534
NMSHandler.worldHelper.clearWeather(world);
15301535
}
15311536
});

plugin/src/main/java/com/denizenscript/denizen/scripts/commands/world/GameRuleCommand.java

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
package com.denizenscript.denizen.scripts.commands.world;
22

3-
import com.denizenscript.denizencore.utilities.debugging.Debug;
43
import com.denizenscript.denizen.objects.WorldTag;
4+
import com.denizenscript.denizen.utilities.world.GameRuleReflect;
55
import com.denizenscript.denizencore.exceptions.InvalidArgumentsException;
66
import com.denizenscript.denizencore.objects.Argument;
77
import com.denizenscript.denizencore.objects.core.ElementTag;
88
import com.denizenscript.denizencore.scripts.ScriptEntry;
99
import com.denizenscript.denizencore.scripts.commands.AbstractCommand;
10+
import com.denizenscript.denizencore.utilities.debugging.Debug;
11+
import com.denizenscript.denizencore.utilities.debugging.DebugInternals;
1012
import org.bukkit.Bukkit;
13+
import org.bukkit.GameRule;
1114
import org.bukkit.generator.WorldInfo;
1215

13-
import java.util.stream.Collectors;
14-
1516
public class GameRuleCommand extends AbstractCommand {
1617

1718
public GameRuleCommand() {
@@ -45,10 +46,14 @@ public GameRuleCommand() {
4546
// - gamerule Adventure mobGriefing false
4647
// -->
4748

49+
50+
4851
@Override
4952
public void addCustomTabCompletions(TabCompletionsBuilder tab) {
50-
tab.add(Bukkit.getWorlds().get(0).getGameRules());
51-
tab.add(Bukkit.getWorlds().stream().map(WorldInfo::getName).collect(Collectors.toSet()));
53+
for (GameRule<?> gameRule : GameRuleReflect.values()) {
54+
tab.add(GameRuleReflect.getName(gameRule));
55+
}
56+
tab.add(Bukkit.getWorlds().stream().map(WorldInfo::getName).toList());
5257
}
5358

5459
@Override
@@ -82,12 +87,37 @@ else if (!scriptEntry.hasObject("value")) {
8287
@Override
8388
public void execute(ScriptEntry scriptEntry) {
8489
WorldTag world = scriptEntry.getObjectTag("world");
85-
ElementTag gamerule = scriptEntry.getElement("gamerule");
86-
ElementTag value = scriptEntry.getElement("value");
90+
ElementTag gameRuleInput = scriptEntry.getElement("gamerule");
91+
ElementTag valueInput = scriptEntry.getElement("value");
8792
if (scriptEntry.dbCallShouldDebug()) {
88-
Debug.report(scriptEntry, getName(), world, gamerule, value);
93+
Debug.report(scriptEntry, getName(), world, gameRuleInput, valueInput);
94+
}
95+
GameRule gameRule = GameRuleReflect.getByName(gameRuleInput.asString());
96+
if (gameRule == null) {
97+
Debug.echoError("Invalid game rule specified: " + gameRuleInput.asString() + '.');
98+
return;
99+
}
100+
Class<?> gameRuleType = GameRuleReflect.getType(gameRule);
101+
Object convertedValue;
102+
if (gameRuleType == Integer.class) {
103+
if (!valueInput.isInt()) {
104+
Debug.echoError("Invalid value specified: must be a number.");
105+
return;
106+
}
107+
convertedValue = valueInput.asInt();
108+
}
109+
else if (gameRuleType == Boolean.class) {
110+
if (!valueInput.isBoolean()) {
111+
Debug.echoError("Invalid value specified: must be a boolean.");
112+
return;
113+
}
114+
convertedValue = valueInput.asBoolean();
115+
}
116+
else {
117+
Debug.echoError("Unrecognized game rule type '" + DebugInternals.getFullClassNameOpti(gameRuleType) + "'! Please report this to the developers.");
118+
return;
89119
}
90-
if (!world.getWorld().setGameRuleValue(gamerule.asString(), value.asString())) {
120+
if (!world.getWorld().setGameRule(gameRule, convertedValue)) {
91121
Debug.echoError(scriptEntry, "Invalid gamerule!");
92122
}
93123
}

plugin/src/main/java/com/denizenscript/denizen/tags/core/ServerTagBase.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import com.denizenscript.denizen.utilities.*;
1515
import com.denizenscript.denizen.utilities.depends.Depends;
1616
import com.denizenscript.denizen.utilities.inventory.SlotHelper;
17+
import com.denizenscript.denizen.utilities.world.GameRuleReflect;
1718
import com.denizenscript.denizencore.DenizenCore;
1819
import com.denizenscript.denizencore.events.ScriptEvent;
1920
import com.denizenscript.denizencore.objects.Mechanism;
@@ -639,11 +640,7 @@ else if (param.shouldBeType(EntityTag.class)) {
639640
// Returns a list of all available gamerules on the server.
640641
// -->
641642
tagProcessor.registerStaticTag(ListTag.class, "gamerules", (attribute, object) -> {
642-
ListTag gamerules = new ListTag();
643-
for (GameRule<?> rule : GameRule.values()) {
644-
gamerules.add(rule.getName());
645-
}
646-
return gamerules;
643+
return new ListTag(Arrays.asList(GameRuleReflect.values()), gameRule -> new ElementTag(GameRuleReflect.getName(gameRule), true));
647644
});
648645

649646
// <--[tag]
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package com.denizenscript.denizen.utilities.world;
2+
3+
import com.denizenscript.denizen.nms.NMSHandler;
4+
import com.denizenscript.denizen.nms.NMSVersion;
5+
import com.denizenscript.denizencore.utilities.ReflectionHelper;
6+
import org.bukkit.GameRule;
7+
import org.bukkit.World;
8+
9+
import java.lang.invoke.MethodHandle;
10+
11+
public class GameRuleReflect {
12+
13+
private static final MethodHandle GAMERULE_VALUES = ReflectionHelper.getMethodHandle(GameRule.class, "values");
14+
private static final MethodHandle GAMERULE_GET_BY_NAME = ReflectionHelper.getMethodHandle(GameRule.class, "getByName", String.class);
15+
private static final MethodHandle GAMERULE_GET_NAME = ReflectionHelper.getMethodHandle(GameRule.class, "getName");
16+
private static final MethodHandle GAMERULE_GET_TYPE = ReflectionHelper.getMethodHandle(GameRule.class, "getType");
17+
18+
public static final GameRule<Boolean> WEATHER_CYCLE_GAMERULE = NMSHandler.getVersion().isAtLeast(NMSVersion.v1_21) ? GameRule.ADVANCE_WEATHER : (GameRule<Boolean>) getByName("doWeatherCycle");
19+
20+
public static GameRule<?>[] values() {
21+
try {
22+
return (GameRule<?>[]) GAMERULE_VALUES.invokeExact();
23+
}
24+
catch (Throwable e) {
25+
throw new RuntimeException(e);
26+
}
27+
}
28+
29+
public static GameRule<?> getByName(String name) {
30+
try {
31+
return (GameRule<?>) GAMERULE_GET_BY_NAME.invokeExact(name);
32+
}
33+
catch (Throwable e) {
34+
throw new RuntimeException(e);
35+
}
36+
}
37+
38+
public static String getName(GameRule<?> gameRule) {
39+
try {
40+
return (String) GAMERULE_GET_NAME.invokeExact(gameRule);
41+
}
42+
catch (Throwable e) {
43+
throw new RuntimeException(e);
44+
}
45+
}
46+
47+
public static Class<?> getType(GameRule<?> gameRule) {
48+
try {
49+
return (Class<?>) GAMERULE_GET_TYPE.invokeExact(gameRule);
50+
}
51+
catch (Throwable e) {
52+
throw new RuntimeException(e);
53+
}
54+
}
55+
56+
public static <T> T getValue(World world, GameRule<T> gameRule) {
57+
try {
58+
return world.getGameRuleValue(gameRule);
59+
}
60+
catch (IllegalArgumentException e) {
61+
if (e.getMessage().equals("Tried to access invalid game rule")) {
62+
return null;
63+
}
64+
throw e;
65+
}
66+
}
67+
}

v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/Handler.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
import net.minecraft.nbt.NbtOps;
4646
import net.minecraft.nbt.StringTag;
4747
import net.minecraft.network.chat.Component;
48-
import net.minecraft.resources.ResourceLocation;
48+
import net.minecraft.resources.Identifier;
4949
import net.minecraft.server.MinecraftServer;
5050
import net.minecraft.server.level.ServerLevel;
5151
import net.minecraft.util.ProblemReporter;
@@ -294,7 +294,7 @@ public ProfileEditor getProfileEditor() {
294294
public List<BiomeNMS> getBiomes(World world) {
295295
ServerLevel level = ((CraftWorld) world).getHandle();
296296
ArrayList<BiomeNMS> output = new ArrayList<>();
297-
for (ResourceLocation key : level.registryAccess().lookupOrThrow(Registries.BIOME).keySet()) {
297+
for (Identifier key : level.registryAccess().lookupOrThrow(Registries.BIOME).keySet()) {
298298
output.add(new BiomeNMSImpl(level, CraftNamespacedKey.fromMinecraft(key)));
299299
}
300300
return output;
@@ -314,7 +314,7 @@ public BiomeNMS getBiomeAt(Block block) {
314314
// Based on CraftWorld source
315315
ServerLevel level = ((CraftWorld) block.getWorld()).getHandle();
316316
Holder<Biome> biome = level.getNoiseBiome(block.getX() >> 2, block.getY() >> 2, block.getZ() >> 2);
317-
ResourceLocation key = level.registryAccess().lookupOrThrow(Registries.BIOME).getKey(biome.value());
317+
Identifier key = level.registryAccess().lookupOrThrow(Registries.BIOME).getKey(biome.value());
318318
return new BiomeNMSImpl(level, CraftNamespacedKey.fromMinecraft(key));
319319
}
320320

v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/ReflectionMappingsInfo.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ public class ReflectionMappingsInfo {
3030
// net.minecraft.world.entity.monster.EnderMan
3131
public static String EnderMan_DATA_CREEPY = "cx";
3232

33-
// net.minecraft.world.entity.monster.Zombie
34-
public static String Zombie_inWaterTime = ERROR_UNKNOWN_TARGET;
33+
// net.minecraft.world.entity.monster.zombie.Zombie
34+
public static String Zombie_inWaterTime = "cL";
3535

3636
// net.minecraft.world.item.Item
3737
public static String Item_components = "c";
@@ -59,11 +59,10 @@ public class ReflectionMappingsInfo {
5959

6060
// net.minecraft.world.level.biome.Biome
6161
public static String Biome_climateSettings = "i";
62+
public static String Biome_attributes = "l";
6263

6364
// net.minecraft.world.level.biome.BiomeSpecialEffects
6465
public static String BiomeSpecialEffects_foliageColorOverride = "c";
65-
public static String BiomeSpecialEffects_fogColor = ERROR_UNKNOWN_TARGET;
66-
public static String BiomeSpecialEffects_waterFogColor = ERROR_UNKNOWN_TARGET;
6766

6867
// net.minecraft.network.Connection
6968
public static String Connection_receiving = "h";

v1_21/src/main/java/com/denizenscript/denizen/nms/v1_21/helpers/AdvancementHelperImpl.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@
66
import com.google.common.collect.ImmutableMap;
77
import net.md_5.bungee.api.ChatColor;
88
import net.minecraft.advancements.*;
9-
import net.minecraft.advancements.critereon.ImpossibleTrigger;
9+
import net.minecraft.advancements.criterion.ImpossibleTrigger;
1010
import net.minecraft.core.ClientAsset;
1111
import net.minecraft.network.protocol.game.ClientboundUpdateAdvancementsPacket;
12-
import net.minecraft.resources.ResourceLocation;
12+
import net.minecraft.resources.Identifier;
1313
import net.minecraft.server.PlayerAdvancements;
1414
import net.minecraft.server.ServerAdvancementManager;
1515
import net.minecraft.server.level.ServerPlayer;
@@ -38,8 +38,8 @@ public void register(com.denizenscript.denizen.nms.util.Advancement advancement)
3838
return;
3939
}
4040
AdvancementHolder nmsAdvancementHolder = asNMSCopy(advancement);
41-
Map<ResourceLocation, AdvancementHolder> nmsAdvancements = getNMSAdvancementManager().advancements;
42-
ImmutableMap.Builder<ResourceLocation, AdvancementHolder> mapBuilder = ImmutableMap.builderWithExpectedSize(nmsAdvancements.size() + 1);
41+
Map<Identifier, AdvancementHolder> nmsAdvancements = getNMSAdvancementManager().advancements;
42+
ImmutableMap.Builder<Identifier, AdvancementHolder> mapBuilder = ImmutableMap.builderWithExpectedSize(nmsAdvancements.size() + 1);
4343
mapBuilder.putAll(nmsAdvancements);
4444
mapBuilder.put(nmsAdvancementHolder.id(), nmsAdvancementHolder);
4545
getNMSAdvancementManager().advancements = mapBuilder.build();
@@ -65,10 +65,10 @@ public void unregister(com.denizenscript.denizen.nms.util.Advancement advancemen
6565
if (advancement.temporary || !advancement.registered) {
6666
return;
6767
}
68-
ResourceLocation nmsKey = CraftNamespacedKey.toMinecraft(advancement.key);
69-
Map<ResourceLocation, AdvancementHolder> nmsAdvancements = getNMSAdvancementManager().advancements;
70-
ImmutableMap.Builder<ResourceLocation, AdvancementHolder> mapBuilder = ImmutableMap.builderWithExpectedSize(nmsAdvancements.size() - 1);
71-
for (Map.Entry<ResourceLocation, AdvancementHolder> entry : nmsAdvancements.entrySet()) {
68+
Identifier nmsKey = CraftNamespacedKey.toMinecraft(advancement.key);
69+
Map<Identifier, AdvancementHolder> nmsAdvancements = getNMSAdvancementManager().advancements;
70+
ImmutableMap.Builder<Identifier, AdvancementHolder> mapBuilder = ImmutableMap.builderWithExpectedSize(nmsAdvancements.size() - 1);
71+
for (Map.Entry<Identifier, AdvancementHolder> entry : nmsAdvancements.entrySet()) {
7272
if (!entry.getKey().equals(nmsKey)) {
7373
mapBuilder.put(entry);
7474
}

0 commit comments

Comments
 (0)