diff --git a/Spigot-Server-Patches/Asynchronous-chunk-IO-and-loading.patch b/Spigot-Server-Patches/Asynchronous-chunk-IO-and-loading.patch index 0832c5cf16..0975370b59 100644 --- a/Spigot-Server-Patches/Asynchronous-chunk-IO-and-loading.patch +++ b/Spigot-Server-Patches/Asynchronous-chunk-IO-and-loading.patch @@ -169,25 +169,17 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 +import com.destroystokyo.paper.io.chunk.ChunkTaskManager; import com.google.common.base.Functions; - import com.google.common.collect.Iterables; - import com.google.common.collect.Lists; -@@ -0,0 +0,0 @@ public class PaperCommand extends Command { + import com.google.common.base.Joiner; + import com.google.common.collect.ImmutableSet; +@@ -0,0 +0,0 @@ import java.util.stream.Collectors; + + public class PaperCommand extends Command { + private static final String BASE_PERM = "bukkit.command.paper."; +- private static final ImmutableSet SUBCOMMANDS = ImmutableSet.builder().add("heap", "entity", "reload", "version", "debug", "chunkinfo").build(); ++ private static final ImmutableSet SUBCOMMANDS = ImmutableSet.builder().add("heap", "entity", "reload", "version", "debug", "chunkinfo", "dumpwaiting").build(); + public PaperCommand(String name) { super(name); - this.description = "Paper related commands"; -- this.usageMessage = "/paper [heap | entity | reload | version | debug | chunkinfo]"; -+ this.usageMessage = "/paper [heap | entity | reload | version | debug | dumpwaiting | chunkinfo]"; - this.setPermission("bukkit.command.paper"); - } - - @Override - public List tabComplete(CommandSender sender, String alias, String[] args, Location location) throws IllegalArgumentException { - if (args.length <= 1) -- return getListMatchingLast(args, "heap", "entity", "reload", "version", "debug", "chunkinfo"); -+ return getListMatchingLast(args, "heap", "entity", "reload", "version", "debug", "dumpwaiting", "chunkinfo"); - - switch (args[0].toLowerCase(Locale.ENGLISH)) - { @@ -0,0 +0,0 @@ public class PaperCommand extends Command { case "debug": doDebug(sender, args); diff --git a/Spigot-Server-Patches/Chunk-debug-command.patch b/Spigot-Server-Patches/Chunk-debug-command.patch index 2fdb724f2c..89dd583fa9 100644 --- a/Spigot-Server-Patches/Chunk-debug-command.patch +++ b/Spigot-Server-Patches/Chunk-debug-command.patch @@ -35,30 +35,33 @@ diff --git a/src/main/java/com/destroystokyo/paper/PaperCommand.java b/src/main/ index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 --- a/src/main/java/com/destroystokyo/paper/PaperCommand.java +++ b/src/main/java/com/destroystokyo/paper/PaperCommand.java -@@ -0,0 +0,0 @@ public class PaperCommand extends Command { +@@ -0,0 +0,0 @@ import net.minecraft.server.ChunkCoordIntPair; + import net.minecraft.server.ChunkProviderServer; + import net.minecraft.server.Entity; + import net.minecraft.server.EntityTypes; ++import net.minecraft.server.MCUtil; + import net.minecraft.server.MinecraftKey; + import net.minecraft.server.MinecraftServer; ++import net.minecraft.server.PlayerChunk; + import net.minecraft.server.WorldServer; + import org.apache.commons.lang3.tuple.MutablePair; + import org.apache.commons.lang3.tuple.Pair; +@@ -0,0 +0,0 @@ import java.util.stream.Collectors; + + public class PaperCommand extends Command { + private static final String BASE_PERM = "bukkit.command.paper."; +- private static final ImmutableSet SUBCOMMANDS = ImmutableSet.builder().add("heap", "entity", "reload", "version").build(); ++ private static final ImmutableSet SUBCOMMANDS = ImmutableSet.builder().add("heap", "entity", "reload", "version", "debug", "chunkinfo").build(); + public PaperCommand(String name) { super(name); - this.description = "Paper related commands"; -- this.usageMessage = "/paper [heap | entity | reload | version]"; -+ this.usageMessage = "/paper [heap | entity | reload | version | debug | chunkinfo]"; - this.setPermission("bukkit.command.paper"); - } - - @Override - public List tabComplete(CommandSender sender, String alias, String[] args, Location location) throws IllegalArgumentException { - if (args.length <= 1) -- return getListMatchingLast(args, "heap", "entity", "reload", "version"); -+ return getListMatchingLast(args, "heap", "entity", "reload", "version", "debug", "chunkinfo"); - - switch (args[0].toLowerCase(Locale.ENGLISH)) - { @@ -0,0 +0,0 @@ public class PaperCommand extends Command { if (args.length == 3) - return getListMatchingLast(args, EntityTypes.getEntityNameList().stream().map(MinecraftKey::toString).sorted().toArray(String[]::new)); + return getListMatchingLast(sender, args, EntityTypes.getEntityNameList().stream().map(MinecraftKey::toString).sorted().toArray(String[]::new)); break; + case "debug": + if (args.length == 2) { -+ return getListMatchingLast(args, "help", "chunks"); ++ return getListMatchingLast(sender, args, "help", "chunks"); + } + break; + case "chunkinfo": @@ -68,7 +71,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + worldNames.add(world.getName()); + } + if (args.length == 2) { -+ return getListMatchingLast(args, worldNames); ++ return getListMatchingLast(sender, args, worldNames); + } + break; } @@ -85,8 +88,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + doChunkInfo(sender, args); + break; case "ver": + if (!testPermission(sender, "version")) break; // "ver" needs a special check because it's an alias. All other commands are checked up before the switch statement (because they are present in the SUBCOMMANDS set) case "version": - Command ver = org.bukkit.Bukkit.getServer().getCommandMap().getCommand("version"); @@ -0,0 +0,0 @@ public class PaperCommand extends Command { return true; } diff --git a/Spigot-Server-Patches/Fix-Light-Command.patch b/Spigot-Server-Patches/Fix-Light-Command.patch index e88a67b9fe..b4db629a00 100644 --- a/Spigot-Server-Patches/Fix-Light-Command.patch +++ b/Spigot-Server-Patches/Fix-Light-Command.patch @@ -10,6 +10,25 @@ diff --git a/src/main/java/com/destroystokyo/paper/PaperCommand.java b/src/main/ index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 --- a/src/main/java/com/destroystokyo/paper/PaperCommand.java +++ b/src/main/java/com/destroystokyo/paper/PaperCommand.java +@@ -0,0 +0,0 @@ import com.google.common.collect.Maps; + import com.google.gson.JsonObject; + import com.google.gson.internal.Streams; + import com.google.gson.stream.JsonWriter; ++import net.minecraft.server.BlockPosition; ++import net.minecraft.server.Chunk; + import net.minecraft.server.ChunkCoordIntPair; + import net.minecraft.server.ChunkProviderServer; + import net.minecraft.server.Entity; ++import net.minecraft.server.EntityPlayer; + import net.minecraft.server.EntityTypes; ++import net.minecraft.server.LightEngineThreaded; + import net.minecraft.server.MCUtil; + import net.minecraft.server.MinecraftKey; + import net.minecraft.server.MinecraftServer; ++import net.minecraft.server.PacketPlayOutLightUpdate; + import net.minecraft.server.PlayerChunk; + import net.minecraft.server.WorldServer; + import org.apache.commons.lang3.tuple.MutablePair; @@ -0,0 +0,0 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.craftbukkit.CraftServer; @@ -18,23 +37,28 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 import org.bukkit.entity.Player; import java.io.File; -@@ -0,0 +0,0 @@ public class PaperCommand extends Command { +@@ -0,0 +0,0 @@ import java.io.PrintStream; + import java.io.StringWriter; + import java.time.LocalDateTime; + import java.time.format.DateTimeFormatter; ++import java.util.ArrayDeque; + import java.util.ArrayList; + import java.util.Arrays; + import java.util.Collection; + import java.util.Collections; ++import java.util.Deque; + import java.util.Iterator; + import java.util.List; + import java.util.Locale; +@@ -0,0 +0,0 @@ import java.util.stream.Collectors; + + public class PaperCommand extends Command { + private static final String BASE_PERM = "bukkit.command.paper."; +- private static final ImmutableSet SUBCOMMANDS = ImmutableSet.builder().add("heap", "entity", "reload", "version", "debug", "chunkinfo", "dumpwaiting", "syncloadinfo").build(); ++ private static final ImmutableSet SUBCOMMANDS = ImmutableSet.builder().add("heap", "entity", "reload", "version", "debug", "chunkinfo", "dumpwaiting", "syncloadinfo", "fixlight").build(); + public PaperCommand(String name) { super(name); - this.description = "Paper related commands"; -- this.usageMessage = "/paper [heap | entity | reload | version | debug | dumpwaiting | chunkinfo | syncloadinfo]"; -+ this.usageMessage = "/paper [heap | entity | reload | version | debug | dumpwaiting | chunkinfo | syncloadinfo | fixlight]"; - this.setPermission("bukkit.command.paper"); - } - - @Override - public List tabComplete(CommandSender sender, String alias, String[] args, Location location) throws IllegalArgumentException { - if (args.length <= 1) -- return getListMatchingLast(args, "heap", "entity", "reload", "version", "debug", "dumpwaiting", "chunkinfo", "syncloadinfo"); -+ return getListMatchingLast(args, "heap", "entity", "reload", "version", "debug", "dumpwaiting", "chunkinfo", "syncloadinfo", "fixlight"); - - switch (args[0].toLowerCase(Locale.ENGLISH)) - { @@ -0,0 +0,0 @@ public class PaperCommand extends Command { case "syncloadinfo": this.doSyncLoadInfo(sender, args); @@ -43,8 +67,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + this.doFixLight(sender, args); + break; case "ver": + if (!testPermission(sender, "version")) break; // "ver" needs a special check because it's an alias. All other commands are checked up before the switch statement (because they are present in the SUBCOMMANDS set) case "version": - Command ver = org.bukkit.Bukkit.getServer().getCommandMap().getCommand("version"); @@ -0,0 +0,0 @@ public class PaperCommand extends Command { return true; } diff --git a/Spigot-Server-Patches/Paper-config-files.patch b/Spigot-Server-Patches/Paper-config-files.patch index 219c17287e..093c4f4f39 100644 --- a/Spigot-Server-Patches/Paper-config-files.patch +++ b/Spigot-Server-Patches/Paper-config-files.patch @@ -14,10 +14,18 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 +package com.destroystokyo.paper; + +import com.google.common.base.Functions; ++import com.google.common.base.Joiner; ++import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; -+import net.minecraft.server.*; ++import net.minecraft.server.ChunkCoordIntPair; ++import net.minecraft.server.ChunkProviderServer; ++import net.minecraft.server.Entity; ++import net.minecraft.server.EntityTypes; ++import net.minecraft.server.MinecraftKey; ++import net.minecraft.server.MinecraftServer; ++import net.minecraft.server.WorldServer; +import org.apache.commons.lang3.tuple.MutablePair; +import org.apache.commons.lang3.tuple.Pair; +import org.bukkit.Bukkit; @@ -33,45 +41,61 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 +import java.io.File; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; -+import java.util.*; ++import java.util.ArrayList; ++import java.util.Arrays; ++import java.util.Collection; ++import java.util.Collections; ++import java.util.Iterator; ++import java.util.List; ++import java.util.Locale; ++import java.util.Map; ++import java.util.Set; +import java.util.stream.Collectors; + +public class PaperCommand extends Command { ++ private static final String BASE_PERM = "bukkit.command.paper."; ++ private static final ImmutableSet SUBCOMMANDS = ImmutableSet.builder().add("heap", "entity", "reload", "version").build(); + + public PaperCommand(String name) { + super(name); + this.description = "Paper related commands"; -+ this.usageMessage = "/paper [heap | entity | reload | version]"; -+ this.setPermission("bukkit.command.paper"); ++ this.usageMessage = "/paper [" + Joiner.on(" | ").join(SUBCOMMANDS) + "]"; ++ this.setPermission("bukkit.command.paper;" + Joiner.on(';').join(SUBCOMMANDS.stream().map(s -> BASE_PERM + s).collect(Collectors.toSet()))); ++ } ++ ++ private static boolean testPermission(CommandSender commandSender, String permission) { ++ if (commandSender.hasPermission(BASE_PERM + permission) || commandSender.hasPermission("bukkit.command.paper")) return true; ++ commandSender.sendMessage(Bukkit.getPermissionMessage()); ++ return false; + } + + @Override + public List tabComplete(CommandSender sender, String alias, String[] args, Location location) throws IllegalArgumentException { + if (args.length <= 1) -+ return getListMatchingLast(args, "heap", "entity", "reload", "version"); ++ return getListMatchingLast(sender, args, SUBCOMMANDS); + + switch (args[0].toLowerCase(Locale.ENGLISH)) + { + case "entity": + if (args.length == 2) -+ return getListMatchingLast(args, "help", "list"); ++ return getListMatchingLast(sender, args, "help", "list"); + if (args.length == 3) -+ return getListMatchingLast(args, EntityTypes.getEntityNameList().stream().map(MinecraftKey::toString).sorted().toArray(String[]::new)); ++ return getListMatchingLast(sender, args, EntityTypes.getEntityNameList().stream().map(MinecraftKey::toString).sorted().toArray(String[]::new)); + break; + } + return Collections.emptyList(); + } + + // Code from Mojang - copyright them -+ public static List getListMatchingLast(String[] args, String... matches) { -+ return getListMatchingLast(args, (Collection) Arrays.asList(matches)); ++ public static List getListMatchingLast(CommandSender sender, String[] args, String... matches) { ++ return getListMatchingLast(sender, args, (Collection) Arrays.asList(matches)); + } + + public static boolean matches(String s, String s1) { + return s1.regionMatches(true, 0, s, 0, s.length()); + } + -+ public static List getListMatchingLast(String[] strings, Collection collection) { ++ public static List getListMatchingLast(CommandSender sender, String[] strings, Collection collection) { + String last = strings[strings.length - 1]; + ArrayList results = Lists.newArrayList(); + @@ -81,7 +105,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + while (iterator.hasNext()) { + String s1 = (String) iterator.next(); + -+ if (matches(last, s1)) { ++ if (matches(last, s1) && (sender.hasPermission(BASE_PERM + s1) || sender.hasPermission("bukkit.command.paper"))) { + results.add(s1); + } + } @@ -111,7 +135,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + sender.sendMessage(ChatColor.RED + "Usage: " + usageMessage); + return false; + } -+ ++ if (SUBCOMMANDS.contains(args[0].toLowerCase(Locale.ENGLISH))) { ++ if (!testPermission(sender, args[0].toLowerCase(Locale.ENGLISH))) return true; ++ } + switch (args[0].toLowerCase(Locale.ENGLISH)) { + case "heap": + dumpHeap(sender); @@ -123,6 +149,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + doReload(sender); + break; + case "ver": ++ if (!testPermission(sender, "version")) break; // "ver" needs a special check because it's an alias. All other commands are checked up before the switch statement (because they are present in the SUBCOMMANDS set) + case "version": + Command ver = org.bukkit.Bukkit.getServer().getCommandMap().getCommand("version"); + if (ver != null) { diff --git a/Spigot-Server-Patches/Paper-dumpitem-command.patch b/Spigot-Server-Patches/Paper-dumpitem-command.patch index 7d1f1c45ae..95fa92841f 100644 --- a/Spigot-Server-Patches/Paper-dumpitem-command.patch +++ b/Spigot-Server-Patches/Paper-dumpitem-command.patch @@ -9,6 +9,14 @@ diff --git a/src/main/java/com/destroystokyo/paper/PaperCommand.java b/src/main/ index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 --- a/src/main/java/com/destroystokyo/paper/PaperCommand.java +++ b/src/main/java/com/destroystokyo/paper/PaperCommand.java +@@ -0,0 +0,0 @@ import net.minecraft.server.LightEngineThreaded; + import net.minecraft.server.MCUtil; + import net.minecraft.server.MinecraftKey; + import net.minecraft.server.MinecraftServer; ++import net.minecraft.server.NBTTagCompound; + import net.minecraft.server.PacketPlayOutLightUpdate; + import net.minecraft.server.PlayerChunk; + import net.minecraft.server.WorldServer; @@ -0,0 +0,0 @@ import org.bukkit.command.CommandSender; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.CraftWorld; @@ -19,23 +27,15 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 import java.io.File; import java.io.FileOutputStream; -@@ -0,0 +0,0 @@ public class PaperCommand extends Command { +@@ -0,0 +0,0 @@ import java.util.stream.Collectors; + + public class PaperCommand extends Command { + private static final String BASE_PERM = "bukkit.command.paper."; +- private static final ImmutableSet SUBCOMMANDS = ImmutableSet.builder().add("heap", "entity", "reload", "version", "debug", "chunkinfo", "dumpwaiting", "syncloadinfo", "fixlight").build(); ++ private static final ImmutableSet SUBCOMMANDS = ImmutableSet.builder().add("heap", "entity", "reload", "version", "debug", "chunkinfo", "dumpwaiting", "syncloadinfo", "fixlight", "dumpitem").build(); + public PaperCommand(String name) { super(name); - this.description = "Paper related commands"; -- this.usageMessage = "/paper [heap | entity | reload | version | debug | dumpwaiting | chunkinfo | syncloadinfo | fixlight]"; -+ this.usageMessage = "/paper [heap | entity | reload | version | debug | dumpwaiting | chunkinfo | syncloadinfo | fixlight | dumpitem]"; - this.setPermission("bukkit.command.paper"); - } - - @Override - public List tabComplete(CommandSender sender, String alias, String[] args, Location location) throws IllegalArgumentException { - if (args.length <= 1) -- return getListMatchingLast(args, "heap", "entity", "reload", "version", "debug", "dumpwaiting", "chunkinfo", "syncloadinfo", "fixlight"); -+ return getListMatchingLast(args, "heap", "entity", "reload", "version", "debug", "dumpwaiting", "chunkinfo", "syncloadinfo", "fixlight", "dumpitem"); - - switch (args[0].toLowerCase(Locale.ENGLISH)) - { @@ -0,0 +0,0 @@ public class PaperCommand extends Command { case "reload": doReload(sender); @@ -51,10 +51,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 } + private void doDumpItem(CommandSender sender) { -+ if (!(sender instanceof Player)) { -+ sender.sendMessage("Only players can use this command"); -+ return; -+ } + ItemStack itemInHand = ((CraftPlayer) sender).getItemInHand(); + net.minecraft.server.ItemStack itemStack = CraftItemStack.asNMSCopy(itemInHand); + NBTTagCompound tag = itemStack.getTag(); diff --git a/Spigot-Server-Patches/Reduce-sync-loads.patch b/Spigot-Server-Patches/Reduce-sync-loads.patch index 32b9e0c758..ba271af0f1 100644 --- a/Spigot-Server-Patches/Reduce-sync-loads.patch +++ b/Spigot-Server-Patches/Reduce-sync-loads.patch @@ -20,15 +20,17 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 import com.destroystokyo.paper.io.chunk.ChunkTaskManager; +import com.destroystokyo.paper.io.SyncLoadFinder; import com.google.common.base.Functions; + import com.google.common.base.Joiner; + import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import com.google.gson.JsonObject; +import com.google.gson.internal.Streams; +import com.google.gson.stream.JsonWriter; - import net.minecraft.server.*; - import org.apache.commons.lang3.tuple.MutablePair; - import org.apache.commons.lang3.tuple.Pair; + import net.minecraft.server.ChunkCoordIntPair; + import net.minecraft.server.ChunkProviderServer; + import net.minecraft.server.Entity; @@ -0,0 +0,0 @@ import org.bukkit.craftbukkit.CraftWorld; import org.bukkit.entity.Player; @@ -38,24 +40,16 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 +import java.io.StringWriter; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; - import java.util.*; -@@ -0,0 +0,0 @@ public class PaperCommand extends Command { + import java.util.ArrayList; +@@ -0,0 +0,0 @@ import java.util.stream.Collectors; + + public class PaperCommand extends Command { + private static final String BASE_PERM = "bukkit.command.paper."; +- private static final ImmutableSet SUBCOMMANDS = ImmutableSet.builder().add("heap", "entity", "reload", "version", "debug", "chunkinfo", "dumpwaiting").build(); ++ private static final ImmutableSet SUBCOMMANDS = ImmutableSet.builder().add("heap", "entity", "reload", "version", "debug", "chunkinfo", "dumpwaiting", "syncloadinfo").build(); + public PaperCommand(String name) { super(name); - this.description = "Paper related commands"; -- this.usageMessage = "/paper [heap | entity | reload | version | debug | dumpwaiting | chunkinfo]"; -+ this.usageMessage = "/paper [heap | entity | reload | version | debug | dumpwaiting | chunkinfo | syncloadinfo]"; - this.setPermission("bukkit.command.paper"); - } - - @Override - public List tabComplete(CommandSender sender, String alias, String[] args, Location location) throws IllegalArgumentException { - if (args.length <= 1) -- return getListMatchingLast(args, "heap", "entity", "reload", "version", "debug", "dumpwaiting", "chunkinfo"); -+ return getListMatchingLast(args, "heap", "entity", "reload", "version", "debug", "dumpwaiting", "chunkinfo", "syncloadinfo"); - - switch (args[0].toLowerCase(Locale.ENGLISH)) - { @@ -0,0 +0,0 @@ public class PaperCommand extends Command { case "chunkinfo": doChunkInfo(sender, args); @@ -64,8 +58,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + this.doSyncLoadInfo(sender, args); + break; case "ver": + if (!testPermission(sender, "version")) break; // "ver" needs a special check because it's an alias. All other commands are checked up before the switch statement (because they are present in the SUBCOMMANDS set) case "version": - Command ver = org.bukkit.Bukkit.getServer().getCommandMap().getCommand("version"); @@ -0,0 +0,0 @@ public class PaperCommand extends Command { return true; }