From 85f92587a79032b352a14aa0395265d26a528fbe Mon Sep 17 00:00:00 2001 From: Emmanuel Lampe Date: Tue, 1 Oct 2024 00:13:55 +0200 Subject: [PATCH 1/2] feat: support 1.21.1 paper --- .../commandhook/mapping/MojangMapping.java | 45 ++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/modules/mapping/paper/mojang-mapped/src/main/java/org/bitbucket/_newage/commandhook/mapping/MojangMapping.java b/modules/mapping/paper/mojang-mapped/src/main/java/org/bitbucket/_newage/commandhook/mapping/MojangMapping.java index 4cd94c3..b46f19a 100644 --- a/modules/mapping/paper/mojang-mapped/src/main/java/org/bitbucket/_newage/commandhook/mapping/MojangMapping.java +++ b/modules/mapping/paper/mojang-mapped/src/main/java/org/bitbucket/_newage/commandhook/mapping/MojangMapping.java @@ -2,6 +2,8 @@ import com.mojang.brigadier.StringReader; import com.mojang.brigadier.exceptions.CommandSyntaxException; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.arguments.selector.EntitySelectorParser; import net.minecraft.commands.arguments.selector.EntitySelector; @@ -20,6 +22,36 @@ public class MojangMapping extends AMapping { + // Cache the constructors in static variables + private static Constructor twoArgConstructor; // 1.21.1 and above + private static Constructor oneArgConstructor; // 1.21 and below + + static { + try { + // Attempt to cache both constructors + twoArgConstructor = EntitySelectorParser.class.getConstructor(StringReader.class, boolean.class); + } catch (NoSuchMethodException e) { + // Handle the case where this constructor is missing + twoArgConstructor = null; + } + + try { + oneArgConstructor = EntitySelectorParser.class.getConstructor(StringReader.class); + } catch (NoSuchMethodException e) { + // Handle the case where this constructor is missing + oneArgConstructor = null; + } + } + + private static EntitySelectorParser createEntitySelectorParser(StringReader stringReader, Constructor constructor, Object... args) { + try { + return constructor.newInstance(stringReader, args); + } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) { + // Optionally, log the exception here if needed for debugging + return null; + } + } + @Override public List getEntitiesFromSelector(String selector, Block commandBlock) { List entities = Collections.emptyList(); @@ -59,7 +91,18 @@ public CommandSourceStack getCommandListenerWrapper(Block block) { @Override public EntitySelectorParser getArgumentParser(String selector) { StringReader stringReader = new StringReader(selector); - return new EntitySelectorParser(stringReader); + + if (twoArgConstructor != null) { + EntitySelectorParser parser = createEntitySelectorParser(stringReader, twoArgConstructor, true); + if (parser != null) return parser; + } + + if (oneArgConstructor != null) { + EntitySelectorParser parser = createEntitySelectorParser(stringReader, oneArgConstructor); + if (parser != null) return parser; + } + + throw new RuntimeException("No valid constructor found for EntitySelectorParser."); } /** From 6c9a7b78bc5cb0a5cbbf22ce11dc853bb39fa7a5 Mon Sep 17 00:00:00 2001 From: Emmanuel Lampe Date: Tue, 1 Oct 2024 00:18:24 +0200 Subject: [PATCH 2/2] feat: support 1.21.1 spigot mapping --- modules/mapping/spigot/pom.xml | 1 + modules/mapping/spigot/provider/pom.xml | 6 ++ .../mapping/SpigotMappingSelector.java | 4 + modules/mapping/spigot/v1_21_R2/pom.xml | 22 +++++ .../commandhook/mapping/NmsV1_21_R2.java | 88 +++++++++++++++++++ 5 files changed, 121 insertions(+) create mode 100644 modules/mapping/spigot/v1_21_R2/pom.xml create mode 100644 modules/mapping/spigot/v1_21_R2/src/main/java/org/bitbucket/_newage/commandhook/mapping/NmsV1_21_R2.java diff --git a/modules/mapping/spigot/pom.xml b/modules/mapping/spigot/pom.xml index 71e734f..b26f116 100644 --- a/modules/mapping/spigot/pom.xml +++ b/modules/mapping/spigot/pom.xml @@ -31,6 +31,7 @@ v1_20_R3 v1_20_R4 v1_21_R1 + v1_21_R2 provider \ No newline at end of file diff --git a/modules/mapping/spigot/provider/pom.xml b/modules/mapping/spigot/provider/pom.xml index 1ebcbb6..88a328c 100644 --- a/modules/mapping/spigot/provider/pom.xml +++ b/modules/mapping/spigot/provider/pom.xml @@ -126,6 +126,12 @@ mapping-v1_21_R1 ${project.parent.version} + + + org.bitbucket._newage.commandhook + mapping-v1_21_R2 + ${project.parent.version} + diff --git a/modules/mapping/spigot/provider/src/main/java/org/bitbucket/_newage/commandhook/mapping/SpigotMappingSelector.java b/modules/mapping/spigot/provider/src/main/java/org/bitbucket/_newage/commandhook/mapping/SpigotMappingSelector.java index 9c526c8..161ab9d 100644 --- a/modules/mapping/spigot/provider/src/main/java/org/bitbucket/_newage/commandhook/mapping/SpigotMappingSelector.java +++ b/modules/mapping/spigot/provider/src/main/java/org/bitbucket/_newage/commandhook/mapping/SpigotMappingSelector.java @@ -143,6 +143,10 @@ private static IMapping fromMinecraftVersion(String minecraftVersion) { mapping = new NmsV1_21_R1(); break; + case "1.21.1": + mapping = new NmsV1_21_R2(); + break; + default: mapping = null; } diff --git a/modules/mapping/spigot/v1_21_R2/pom.xml b/modules/mapping/spigot/v1_21_R2/pom.xml new file mode 100644 index 0000000..009c3f2 --- /dev/null +++ b/modules/mapping/spigot/v1_21_R2/pom.xml @@ -0,0 +1,22 @@ + + 4.0.0 + + org.bitbucket._newage.commandhook + mapping-parent + 2.0.0 + ../../pom.xml + + + CommandHook - Mapping 1.21_R2 + mapping-v1_21_R2 + jar + + + + org.spigotmc + spigot + 1.21.1-R0.1-SNAPSHOT + provided + + + \ No newline at end of file diff --git a/modules/mapping/spigot/v1_21_R2/src/main/java/org/bitbucket/_newage/commandhook/mapping/NmsV1_21_R2.java b/modules/mapping/spigot/v1_21_R2/src/main/java/org/bitbucket/_newage/commandhook/mapping/NmsV1_21_R2.java new file mode 100644 index 0000000..58c0104 --- /dev/null +++ b/modules/mapping/spigot/v1_21_R2/src/main/java/org/bitbucket/_newage/commandhook/mapping/NmsV1_21_R2.java @@ -0,0 +1,88 @@ +package org.bitbucket._newage.commandhook.mapping; + +import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.commands.CommandListenerWrapper; +import net.minecraft.commands.arguments.selector.ArgumentParserSelector; +import net.minecraft.commands.arguments.selector.EntitySelector; +import net.minecraft.core.BlockPosition; +import net.minecraft.world.level.CommandBlockListenerAbstract; +import net.minecraft.world.level.World; +import net.minecraft.world.level.block.entity.TileEntityCommand; +import org.bitbucket._newage.commandhook.mapping.api.AMapping; +import org.bukkit.block.Block; +import org.bukkit.craftbukkit.v1_21_R1.CraftWorld; +import org.bukkit.entity.Entity; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +public class NmsV1_21_R2 extends AMapping { + + @Override + public List getEntitiesFromSelector(String selector, Block commandBlock) { + List entities = Collections.emptyList(); + + CommandListenerWrapper wrapper = getCommandListenerWrapper(commandBlock); + ArgumentParserSelector argumentParser = getArgumentParser(selector); + try { + List nmsEntities = getNmsEntities(argumentParser, wrapper); + entities = convertToBukkitEntity(nmsEntities); + } catch (CommandSyntaxException ex) { + handleCommandSyntaxException(commandBlock, ex); + } + + return entities; + } + + /** + * Vanilla CommandListenerWrapper + * @param block + * @return + */ + @Override + public CommandListenerWrapper getCommandListenerWrapper(Block block) { + World world = ((CraftWorld) block.getWorld()).getHandle(); + BlockPosition blockPosition = new BlockPosition(block.getX(), block.getY(), block.getZ()); + + TileEntityCommand tileEntityCommand = (TileEntityCommand) world.getBlockEntity(blockPosition, true); + CommandBlockListenerAbstract commandBlockListenerAbstract = tileEntityCommand.b(); + return commandBlockListenerAbstract.i(); + } + + /** + * Vanilla Argument Parser Selector + * @param selector + * @return + */ + @Override + public ArgumentParserSelector getArgumentParser(String selector) { + StringReader stringReader = new StringReader(selector); + return new ArgumentParserSelector(stringReader, true); + } + + /** + * Vanilla Entities + * @param argumentParser + * @param wrapper + * @return + * @throws CommandSyntaxException + */ + private List getNmsEntities(ArgumentParserSelector argumentParser, CommandListenerWrapper wrapper) throws CommandSyntaxException { + EntitySelector selector = argumentParser.parse(false); + return selector.b(wrapper); + } + + /** + * Spigot related + * @param entities + * @return + */ + private List convertToBukkitEntity(List entities) { + return entities.stream() + .map(net.minecraft.world.entity.Entity::getBukkitEntity) + .collect(Collectors.toList()); + } + +}