Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -20,6 +22,36 @@

public class MojangMapping extends AMapping {

// Cache the constructors in static variables
private static Constructor<EntitySelectorParser> twoArgConstructor; // 1.21.1 and above
private static Constructor<EntitySelectorParser> 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<EntitySelectorParser> 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<Entity> getEntitiesFromSelector(String selector, Block commandBlock) {
List<Entity> entities = Collections.emptyList();
Expand Down Expand Up @@ -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.");
}

/**
Expand Down
1 change: 1 addition & 0 deletions modules/mapping/spigot/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
<module>v1_20_R3</module>
<module>v1_20_R4</module>
<module>v1_21_R1</module>
<module>v1_21_R2</module>
<module>provider</module>
</modules>
</project>
6 changes: 6 additions & 0 deletions modules/mapping/spigot/provider/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,12 @@
<artifactId>mapping-v1_21_R1</artifactId>
<version>${project.parent.version}</version>
</dependency>

<dependency>
<groupId>org.bitbucket._newage.commandhook</groupId>
<artifactId>mapping-v1_21_R2</artifactId>
<version>${project.parent.version}</version>
</dependency>
</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
22 changes: 22 additions & 0 deletions modules/mapping/spigot/v1_21_R2/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.bitbucket._newage.commandhook</groupId>
<artifactId>mapping-parent</artifactId>
<version>2.0.0</version>
<relativePath>../../pom.xml</relativePath>
</parent>

<name>CommandHook - Mapping 1.21_R2</name>
<artifactId>mapping-v1_21_R2</artifactId>
<packaging>jar</packaging>

<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId>
<version>1.21.1-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
@@ -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<Entity> getEntitiesFromSelector(String selector, Block commandBlock) {
List<Entity> entities = Collections.emptyList();

CommandListenerWrapper wrapper = getCommandListenerWrapper(commandBlock);
ArgumentParserSelector argumentParser = getArgumentParser(selector);
try {
List<? extends net.minecraft.world.entity.Entity> 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<? extends net.minecraft.world.entity.Entity> getNmsEntities(ArgumentParserSelector argumentParser, CommandListenerWrapper wrapper) throws CommandSyntaxException {
EntitySelector selector = argumentParser.parse(false);
return selector.b(wrapper);
}

/**
* Spigot related
* @param entities
* @return
*/
private List<Entity> convertToBukkitEntity(List<? extends net.minecraft.world.entity.Entity> entities) {
return entities.stream()
.map(net.minecraft.world.entity.Entity::getBukkitEntity)
.collect(Collectors.toList());
}

}