SPIGOT-4046: Fix selectors in tick functions

By: md_5 <git@md-5.net>
This commit is contained in:
CraftBukkit/Spigot
2018-07-19 10:58:31 +10:00
parent d74d992961
commit 1185891544
3 changed files with 59 additions and 26 deletions

View File

@@ -12,6 +12,7 @@ import net.minecraft.server.CommandListenerWrapper;
import net.minecraft.server.DedicatedServer;
import net.minecraft.server.EntityMinecartCommandBlock;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.WorldServer;
import org.apache.commons.lang.Validate;
import org.bukkit.Location;
import org.bukkit.command.BlockCommandSender;
@@ -64,6 +65,35 @@ public final class VanillaCommandWrapper extends BukkitCommand {
return results;
}
public static class WorldRescueContext {
private WorldServer[] prev;
public WorldRescueContext start(WorldServer def) {
// Some commands use the worldserver variable but we leave it full of null values,
// so we must temporarily populate it with the world of the commandsender
prev = MinecraftServer.getServer().worldServer;
MinecraftServer server = MinecraftServer.getServer();
server.worldServer = new WorldServer[server.worlds.size()];
server.worldServer[0] = def;
int bpos = 0;
for (int pos = 1; pos < server.worldServer.length; pos++) {
WorldServer world = server.worlds.get(bpos++);
if (server.worldServer[0] == world) {
pos--;
continue;
}
server.worldServer[pos] = world;
}
return this;
}
public void end() {
MinecraftServer.getServer().worldServer = prev;
}
}
private CommandListenerWrapper getListener(CommandSender sender) {
if (sender instanceof Player) {
return ((CraftPlayer) sender).getHandle().getCommandListener();