@@ -0,0 +1,266 @@
|
||||
From 6f8c9264a359086a030be0348390caed19323c18 Mon Sep 17 00:00:00 2001
|
||||
From: Thinkofdeath <thethinkofdeath@gmail.com>
|
||||
Date: Wed, 18 Dec 2013 10:32:15 +1100
|
||||
Subject: [PATCH] Add VanillaCommand Wrapper to Support New Commands
|
||||
|
||||
This implements testfor, setblock and summon, as well as the capacity to replace any command with its vanilla version.
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/server/CommandBlockListenerAbstract.java b/src/main/java/net/minecraft/server/CommandBlockListenerAbstract.java
|
||||
index 5271272..f8d2ecb 100644
|
||||
--- a/src/main/java/net/minecraft/server/CommandBlockListenerAbstract.java
|
||||
+++ b/src/main/java/net/minecraft/server/CommandBlockListenerAbstract.java
|
||||
@@ -96,7 +96,7 @@ public abstract class CommandBlockListenerAbstract implements ICommandListener {
|
||||
|
||||
// Make sure this is a valid command
|
||||
if (commandMap.getCommand(args[0]) == null) {
|
||||
- this.b = 0;
|
||||
+ this.b = org.spigotmc.VanillaCommandWrapper.dispatch( sender, command ); // Spigot - Try vanilla commands
|
||||
return;
|
||||
}
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/server/CommandDispatcher.java b/src/main/java/net/minecraft/server/CommandDispatcher.java
|
||||
index e63f17c..e58be15 100644
|
||||
--- a/src/main/java/net/minecraft/server/CommandDispatcher.java
|
||||
+++ b/src/main/java/net/minecraft/server/CommandDispatcher.java
|
||||
@@ -62,7 +62,7 @@ public class CommandDispatcher extends CommandHandler implements ICommandDispatc
|
||||
public void a(ICommandListener icommandlistener, int i, String s, Object... aobject) {
|
||||
boolean flag = true;
|
||||
|
||||
- if (icommandlistener instanceof CommandBlockListenerAbstract && !MinecraftServer.getServer().worldServer[0].getGameRules().getBoolean("commandBlockOutput")) {
|
||||
+ if (icommandlistener instanceof CommandBlockListenerAbstract && !MinecraftServer.getServer().worlds.get(0).getGameRules().getBoolean("commandBlockOutput")) { // Spigot - worldServer -> worlds
|
||||
flag = false;
|
||||
}
|
||||
|
||||
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
||||
index cfa90d3..f369944 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
||||
@@ -546,6 +546,12 @@ public final class CraftServer implements Server {
|
||||
if (commandMap.dispatch(sender, commandLine)) {
|
||||
return true;
|
||||
}
|
||||
+ // Spigot Start - Try vanilla commands
|
||||
+ if ( org.spigotmc.VanillaCommandWrapper.dispatch( sender, commandLine ) != -1 )
|
||||
+ {
|
||||
+ return true;
|
||||
+ }
|
||||
+ // Spigot End
|
||||
|
||||
sender.sendMessage(org.spigotmc.SpigotConfig.unknownCommandMessage);
|
||||
|
||||
@@ -1399,15 +1405,23 @@ public final class CraftServer implements Server {
|
||||
}
|
||||
// Spigot End
|
||||
|
||||
- List<String> completions = null;
|
||||
+ // Spigot Start
|
||||
+ List<String> completions = new ArrayList<String>();
|
||||
try {
|
||||
- completions = getCommandMap().tabComplete(player, message.substring(1));
|
||||
+ message = message.substring( 1 );
|
||||
+ List<String> bukkitCompletions = getCommandMap().tabComplete( player, message );
|
||||
+ if ( bukkitCompletions != null )
|
||||
+ {
|
||||
+ completions.addAll( bukkitCompletions );
|
||||
+ }
|
||||
+ completions.addAll( org.spigotmc.VanillaCommandWrapper.complete( player, message ) );
|
||||
+ // Spigot End
|
||||
} catch (CommandException ex) {
|
||||
player.sendMessage(ChatColor.RED + "An internal error occurred while attempting to tab-complete this command");
|
||||
getLogger().log(Level.SEVERE, "Exception when " + player.getName() + " attempted to tab complete " + message, ex);
|
||||
}
|
||||
|
||||
- return completions == null ? ImmutableList.<String>of() : completions;
|
||||
+ return completions; // Spigot
|
||||
}
|
||||
|
||||
public List<String> tabCompleteChat(Player player, String message) {
|
||||
diff --git a/src/main/java/org/spigotmc/SpigotConfig.java b/src/main/java/org/spigotmc/SpigotConfig.java
|
||||
index c4a5488..628533e 100644
|
||||
--- a/src/main/java/org/spigotmc/SpigotConfig.java
|
||||
+++ b/src/main/java/org/spigotmc/SpigotConfig.java
|
||||
@@ -6,6 +6,7 @@ import java.io.IOException;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Modifier;
|
||||
+import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@@ -14,6 +15,7 @@ import net.minecraft.server.MinecraftServer;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.Command;
|
||||
+import org.bukkit.command.SimpleCommandMap;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.craftbukkit.command.TicksPerSecondCommand;
|
||||
|
||||
@@ -204,4 +206,13 @@ public class SpigotConfig
|
||||
System.setProperty( "io.netty.eventLoopThreads", Integer.toString( count ) );
|
||||
Bukkit.getLogger().log( Level.INFO, "Using {0} threads for Netty based IO", count );
|
||||
}
|
||||
+
|
||||
+ private static void replaceCommands()
|
||||
+ {
|
||||
+ for ( String command : (List<String>) getList( "replace-commands", Arrays.asList( "setblock", "summon", "testforblock" ) ) )
|
||||
+ {
|
||||
+ SimpleCommandMap.removeFallback( command );
|
||||
+ VanillaCommandWrapper.allowedCommands.add( command );
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
diff --git a/src/main/java/org/spigotmc/VanillaCommandWrapper.java b/src/main/java/org/spigotmc/VanillaCommandWrapper.java
|
||||
new file mode 100644
|
||||
index 0000000..e778d47
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/org/spigotmc/VanillaCommandWrapper.java
|
||||
@@ -0,0 +1,146 @@
|
||||
+package org.spigotmc;
|
||||
+
|
||||
+import com.google.common.collect.ImmutableList;
|
||||
+import net.minecraft.server.ChunkCoordinates;
|
||||
+import net.minecraft.server.EntityMinecartCommandBlock;
|
||||
+import net.minecraft.server.IChatBaseComponent;
|
||||
+import net.minecraft.server.ICommandListener;
|
||||
+import net.minecraft.server.MinecraftServer;
|
||||
+import net.minecraft.server.TileEntityCommand;
|
||||
+import net.minecraft.server.World;
|
||||
+import org.bukkit.ChatColor;
|
||||
+import org.bukkit.block.Block;
|
||||
+import org.bukkit.command.CommandSender;
|
||||
+import org.bukkit.craftbukkit.CraftWorld;
|
||||
+import org.bukkit.craftbukkit.command.CraftBlockCommandSender;
|
||||
+import org.bukkit.craftbukkit.entity.CraftMinecartCommand;
|
||||
+import org.bukkit.craftbukkit.entity.CraftPlayer;
|
||||
+import java.util.ArrayList;
|
||||
+import java.util.HashSet;
|
||||
+import java.util.List;
|
||||
+
|
||||
+public class VanillaCommandWrapper
|
||||
+{
|
||||
+
|
||||
+ public static final HashSet<String> allowedCommands = new HashSet<String>();
|
||||
+
|
||||
+ public static int dispatch(CommandSender sender, String commandLine)
|
||||
+ {
|
||||
+ int pos = commandLine.indexOf( ' ' );
|
||||
+ if ( pos == -1 )
|
||||
+ {
|
||||
+ pos = commandLine.length();
|
||||
+ }
|
||||
+ String name = commandLine.substring( 0, pos );
|
||||
+ if ( !allowedCommands.contains( name ) )
|
||||
+ {
|
||||
+ return -1;
|
||||
+ }
|
||||
+ if ( !sender.hasPermission( "bukkit.command." + name ) )
|
||||
+ {
|
||||
+ sender.sendMessage( ChatColor.RED + "You do not have permission for this command" );
|
||||
+ return 0;
|
||||
+ }
|
||||
+ ICommandListener listener = getListener( sender );
|
||||
+ if ( listener == null )
|
||||
+ {
|
||||
+ return -1;
|
||||
+ }
|
||||
+ return MinecraftServer.getServer().getCommandHandler().a( listener, commandLine );
|
||||
+ }
|
||||
+
|
||||
+ public static List<String> complete(CommandSender sender, String commandLine)
|
||||
+ {
|
||||
+ int pos = commandLine.indexOf( ' ' );
|
||||
+ if ( pos == -1 )
|
||||
+ {
|
||||
+ List<String> completions = new ArrayList<String>();
|
||||
+ commandLine = commandLine.toLowerCase();
|
||||
+ for ( String command : allowedCommands )
|
||||
+ {
|
||||
+ if ( command.startsWith( commandLine ) && sender.hasPermission( "bukkit.command." + command ) )
|
||||
+ {
|
||||
+ completions.add( "/" + command );
|
||||
+ }
|
||||
+ }
|
||||
+ return completions;
|
||||
+ }
|
||||
+ String name = commandLine.substring( 0, pos );
|
||||
+ if ( !allowedCommands.contains( name ) || !sender.hasPermission( "bukkit.command." + name ) )
|
||||
+ {
|
||||
+ return ImmutableList.<String>of();
|
||||
+ }
|
||||
+ ICommandListener listener = getListener( sender );
|
||||
+ if ( listener == null )
|
||||
+ {
|
||||
+ return ImmutableList.<String>of();
|
||||
+ }
|
||||
+ return MinecraftServer.getServer().getCommandHandler().b( listener, commandLine );
|
||||
+ }
|
||||
+
|
||||
+ private static ICommandListener getListener(CommandSender sender)
|
||||
+ {
|
||||
+ if ( sender instanceof CraftPlayer )
|
||||
+ {
|
||||
+ return new PlayerListener( ( (CraftPlayer) sender ).getHandle() );
|
||||
+ }
|
||||
+ if ( sender instanceof CraftBlockCommandSender )
|
||||
+ {
|
||||
+ CraftBlockCommandSender commandBlock = (CraftBlockCommandSender) sender;
|
||||
+ Block block = commandBlock.getBlock();
|
||||
+ return ( (TileEntityCommand) ( (CraftWorld) block.getWorld() ).getTileEntityAt( block.getX(), block.getY(), block.getZ() ) ).a();
|
||||
+ }
|
||||
+ if ( sender instanceof CraftMinecartCommand )
|
||||
+ {
|
||||
+ return ( (EntityMinecartCommandBlock) ( (CraftMinecartCommand) sender ).getHandle() ).e();
|
||||
+ }
|
||||
+ return null;
|
||||
+ }
|
||||
+
|
||||
+ private static class PlayerListener implements ICommandListener
|
||||
+ {
|
||||
+
|
||||
+ private final ICommandListener handle;
|
||||
+
|
||||
+ public PlayerListener(ICommandListener handle)
|
||||
+ {
|
||||
+ this.handle = handle;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public String getName()
|
||||
+ {
|
||||
+ return handle.getName();
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public IChatBaseComponent getScoreboardDisplayName()
|
||||
+ {
|
||||
+ return handle.getScoreboardDisplayName();
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void sendMessage(IChatBaseComponent iChatBaseComponent)
|
||||
+ {
|
||||
+ handle.sendMessage( iChatBaseComponent );
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean a(int i, String s)
|
||||
+ {
|
||||
+ return true;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public ChunkCoordinates getChunkCoordinates()
|
||||
+ {
|
||||
+ return handle.getChunkCoordinates();
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public World getWorld()
|
||||
+ {
|
||||
+ return handle.getWorld();
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
--
|
||||
1.8.3.2
|
||||
|
||||
Reference in New Issue
Block a user