3
0
Mirror von https://github.com/IntellectualSites/FastAsyncWorldEdit.git synchronisiert 2024-12-26 02:50:06 +01:00
Dieser Commit ist enthalten in:
Jesse Boyd 2018-10-17 23:40:52 +11:00
Ursprung 4ef43b6c2e
Commit f65887c957
Es konnte kein GPG-Schlüssel zu dieser Signatur gefunden werden
GPG-Schlüssel-ID: 59F1DE6293AF6E1F
8 geänderte Dateien mit 112 neuen und 67 gelöschten Zeilen

Datei anzeigen

@ -501,7 +501,7 @@ public class CFICommands extends MethodCommands {
HeightMapMCAGenerator gen = assertSettings(fp).getGenerator(); HeightMapMCAGenerator gen = assertSettings(fp).getGenerator();
World world = fp.getWorld(); World world = fp.getWorld();
MultiClipboardHolder multi = ClipboardFormat.SCHEMATIC.loadAllFromInput(fp.getPlayer(), schematic, true); MultiClipboardHolder multi = ClipboardFormat.SCHEMATIC.loadAllFromInput(fp.getPlayer(), schematic, null, true);
if (multi == null) { if (multi == null) {
return; return;
} }

Datei anzeigen

@ -34,7 +34,7 @@ public abstract class ScrollAction implements ScrollTool {
} }
String filename = split[1]; String filename = split[1];
try { try {
MultiClipboardHolder multi = ClipboardFormat.SCHEMATIC.loadAllFromInput(player, filename, message); MultiClipboardHolder multi = ClipboardFormat.SCHEMATIC.loadAllFromInput(player, filename, null, message);
if (multi == null) { if (multi == null) {
return null; return null;
} }

Datei anzeigen

@ -11,6 +11,7 @@ import com.github.luben.zstd.ZstdInputStream;
import com.github.luben.zstd.ZstdOutputStream; import com.github.luben.zstd.ZstdOutputStream;
import com.sk89q.jnbt.*; import com.sk89q.jnbt.*;
import com.sk89q.worldedit.entity.Entity; import com.sk89q.worldedit.entity.Entity;
import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormat;
import com.sk89q.worldedit.history.changeset.ChangeSet; import com.sk89q.worldedit.history.changeset.ChangeSet;
import com.sk89q.worldedit.util.Location; import com.sk89q.worldedit.util.Location;
import java.awt.Graphics2D; import java.awt.Graphics2D;
@ -35,6 +36,7 @@ import java.util.function.BiConsumer;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.zip.*; import java.util.zip.*;
import javax.annotation.Nullable;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import net.jpountz.lz4.*; import net.jpountz.lz4.*;
@ -884,9 +886,29 @@ public class MainUtil {
return res; return res;
} }
public static boolean isInSubDirectory(File dir, File file) { public static File resolve(File dir, String filename, @Nullable ClipboardFormat format, boolean allowDir) {
if (format != null) {
if (!filename.matches(".*\\.[\\w].*")) {
filename = filename + "." + format.getExtension();
}
return MainUtil.resolveRelative(new File(dir, filename));
}
if (allowDir) {
File file = MainUtil.resolveRelative(new File(dir, filename));
if (file.exists() && file.isDirectory()) return file;
}
for (ClipboardFormat f : ClipboardFormat.values) {
File file = MainUtil.resolveRelative(new File(dir, filename + "." + f.getExtension()));
if (file.exists()) return file;
}
return null;
}
public static boolean isInSubDirectory(File dir, File file) throws IOException {
if (file == null) return false; if (file == null) return false;
if (file.equals(dir)) return true; if (file.equals(dir)) return true;
file = file.getCanonicalFile();
dir = dir.getCanonicalFile();
return isInSubDirectory(dir, file.getParentFile()); return isInSubDirectory(dir, file.getParentFile());
} }

Datei anzeigen

@ -458,7 +458,7 @@ public class BrushCommands extends BrushProcessor {
try { try {
MultiClipboardHolder clipboards = ClipboardFormat.SCHEMATIC.loadAllFromInput(player, clipboard, true); MultiClipboardHolder clipboards = ClipboardFormat.SCHEMATIC.loadAllFromInput(player, clipboard, null, true);
if (clipboards == null) { if (clipboards == null) {
BBC.SCHEMATIC_NOT_FOUND.send(player, clipboard); BBC.SCHEMATIC_NOT_FOUND.send(player, clipboard);
return null; return null;

Datei anzeigen

@ -190,7 +190,7 @@ public class PatternCommands extends MethodCommands {
clipboards = Collections.singletonList(clipboard); clipboards = Collections.singletonList(clipboard);
break; break;
default: default:
MultiClipboardHolder multi = ClipboardFormat.SCHEMATIC.loadAllFromInput(player, location, true); MultiClipboardHolder multi = ClipboardFormat.SCHEMATIC.loadAllFromInput(player, location, null, true);
clipboards = multi != null ? multi.getHolders() : null; clipboards = multi != null ? multi.getHolders() : null;
break; break;
} }

Datei anzeigen

@ -97,7 +97,7 @@ public class SchematicCommands extends MethodCommands {
desc = "Load multiple clipboards (paste will randomly choose one)" desc = "Load multiple clipboards (paste will randomly choose one)"
) )
@Deprecated @Deprecated
@CommandPermissions({"worldedit.clipboard.load", "worldedit.schematic.load", "worldedit.schematic.upload"}) @CommandPermissions({"worldedit.clipboard.load", "worldedit.schematic.load", "worldedit.schematic.load.web", "worldedit.schematic.load.asset"})
public void loadall(final Player player, final LocalSession session, @Optional("schematic") final String formatName, final String filename, @Switch('r') boolean randomRotate) throws FilenameException { public void loadall(final Player player, final LocalSession session, @Optional("schematic") final String formatName, final String filename, @Switch('r') boolean randomRotate) throws FilenameException {
final ClipboardFormat format = ClipboardFormat.findByAlias(formatName); final ClipboardFormat format = ClipboardFormat.findByAlias(formatName);
if (format == null) { if (format == null) {
@ -105,7 +105,7 @@ public class SchematicCommands extends MethodCommands {
return; return;
} }
try { try {
MultiClipboardHolder all = format.loadAllFromInput(player, filename, true); MultiClipboardHolder all = format.loadAllFromInput(player, filename, null, true);
if (all != null) { if (all != null) {
session.addClipboard(all); session.addClipboard(all);
BBC.SCHEMATIC_LOADED.send(player, filename); BBC.SCHEMATIC_LOADED.send(player, filename);
@ -187,24 +187,9 @@ public class SchematicCommands extends MethodCommands {
player.print(BBC.getPrefix() + "Remapped schematic"); player.print(BBC.getPrefix() + "Remapped schematic");
} }
private File resolve(File dir, String filename, @Nullable ClipboardFormat format) {
if (format != null) {
if (!filename.matches(".*\\.[\\w].*")) {
filename = filename + "." + format.getExtension();
}
return MainUtil.resolveRelative(new File(dir, filename));
}
for (ClipboardFormat f : ClipboardFormat.values) {
File file = MainUtil.resolveRelative(new File(dir, filename + "." + f.getExtension()));
if (file.exists()) return file;
}
return null;
}
@Command(aliases = {"load"}, usage = "[<format>] <filename>", desc = "Load a schematic into your clipboard") @Command(aliases = {"load"}, usage = "[<format>] <filename>", desc = "Load a schematic into your clipboard")
@Deprecated @Deprecated
@CommandPermissions({"worldedit.clipboard.load", "worldedit.schematic.load", "worldedit.schematic.upload", "worldedit.schematic.load.other"}) @CommandPermissions({"worldedit.clipboard.load", "worldedit.schematic.load", "worldedit.schematic.load.asset", "worldedit.schematic.load.web", "worldedit.schematic.load.other"})
public void load(final Player player, final LocalSession session, @Optional() final String formatName, String filename) throws FilenameException { public void load(final Player player, final LocalSession session, @Optional() final String formatName, String filename) throws FilenameException {
final LocalConfiguration config = this.worldEdit.getConfiguration(); final LocalConfiguration config = this.worldEdit.getConfiguration();
ClipboardFormat format = formatName == null ? null : ClipboardFormat.findByAlias(formatName); ClipboardFormat format = formatName == null ? null : ClipboardFormat.findByAlias(formatName);
@ -212,8 +197,8 @@ public class SchematicCommands extends MethodCommands {
try { try {
URI uri; URI uri;
if (filename.startsWith("url:")) { if (filename.startsWith("url:")) {
if (!player.hasPermission("worldedit.schematic.upload")) { if (!player.hasPermission("worldedit.schematic.load.web")) {
BBC.NO_PERM.send(player, "worldedit.schematic.upload"); BBC.NO_PERM.send(player, "worldedit.schematic.load.web");
return; return;
} }
UUID uuid = UUID.fromString(filename.substring(4)); UUID uuid = UUID.fromString(filename.substring(4));
@ -252,12 +237,12 @@ public class SchematicCommands extends MethodCommands {
String extension = filename.substring(filename.lastIndexOf('.') + 1, filename.length()); String extension = filename.substring(filename.lastIndexOf('.') + 1, filename.length());
format = ClipboardFormat.findByExtension(extension); format = ClipboardFormat.findByExtension(extension);
} }
f = resolve(dir, filename, format); f = MainUtil.resolve(dir, filename, format, false);
} }
if (f == null || !f.exists()) { if (f == null || !f.exists()) {
if (!filename.contains("../")) { if (!filename.contains("../")) {
dir = this.worldEdit.getWorkingDirectoryFile(config.saveDir); dir = this.worldEdit.getWorkingDirectoryFile(config.saveDir);
f = resolve(dir, filename, format); f = MainUtil.resolve(dir, filename, format, false);
} }
} }
if (f == null || !f.exists() || !MainUtil.isInSubDirectory(working, f)) { if (f == null || !f.exists() || !MainUtil.isInSubDirectory(working, f)) {
@ -383,7 +368,7 @@ public class SchematicCommands extends MethodCommands {
@Command(aliases = {"move", "m"}, usage = "<directory>", desc = "Move your loaded schematic", help = "Move your currently loaded schematics", min = 1, max = 1) @Command(aliases = {"move", "m"}, usage = "<directory>", desc = "Move your loaded schematic", help = "Move your currently loaded schematics", min = 1, max = 1)
@CommandPermissions({"worldedit.schematic.move", "worldedit.schematic.move.other"}) @CommandPermissions({"worldedit.schematic.move", "worldedit.schematic.move.other"})
public void move(final Player player, final LocalSession session, String directory) throws WorldEditException { public void move(final Player player, final LocalSession session, String directory) throws WorldEditException, IOException {
final LocalConfiguration config = this.worldEdit.getConfiguration(); final LocalConfiguration config = this.worldEdit.getConfiguration();
final File working = this.worldEdit.getWorkingDirectoryFile(config.saveDir); final File working = this.worldEdit.getWorkingDirectoryFile(config.saveDir);
final File dir = Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS ? new File(working, player.getUniqueId().toString()) : working; final File dir = Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS ? new File(working, player.getUniqueId().toString()) : working;
@ -429,7 +414,7 @@ public class SchematicCommands extends MethodCommands {
@Command(aliases = {"delete", "d"}, usage = "<filename|*>", desc = "Delete a saved schematic", help = "Delete a schematic from the schematic list", min = 1, max = 1) @Command(aliases = {"delete", "d"}, usage = "<filename|*>", desc = "Delete a saved schematic", help = "Delete a schematic from the schematic list", min = 1, max = 1)
@CommandPermissions({"worldedit.schematic.delete", "worldedit.schematic.delete.other"}) @CommandPermissions({"worldedit.schematic.delete", "worldedit.schematic.delete.other"})
public void delete(final Player player, final LocalSession session, final CommandContext args) throws WorldEditException { public void delete(final Player player, final LocalSession session, final CommandContext args) throws WorldEditException, IOException {
final LocalConfiguration config = this.worldEdit.getConfiguration(); final LocalConfiguration config = this.worldEdit.getConfiguration();
final File working = this.worldEdit.getWorkingDirectoryFile(config.saveDir); final File working = this.worldEdit.getWorkingDirectoryFile(config.saveDir);
final File dir = Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS ? new File(working, player.getUniqueId().toString()) : working; final File dir = Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS ? new File(working, player.getUniqueId().toString()) : working;

Datei anzeigen

@ -0,0 +1,5 @@
package com.sk89q.worldedit.command;
public class SelectionTypeCommands {
}

Datei anzeigen

@ -56,6 +56,7 @@ import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel; import java.nio.channels.ReadableByteChannel;
import java.util.*; import java.util.*;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Pattern;
import java.util.zip.GZIPInputStream; import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream; import java.util.zip.GZIPOutputStream;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
@ -318,16 +319,24 @@ public enum ClipboardFormat {
}); });
} }
public MultiClipboardHolder loadAllFromInput(Actor player, String input, boolean message) throws IOException { public static MultiClipboardHolder loadAllFromInput(Actor player, String input, ClipboardFormat format, boolean message) throws IOException {
checkNotNull(player); checkNotNull(player);
checkNotNull(input); checkNotNull(input);
WorldEdit worldEdit = WorldEdit.getInstance(); WorldEdit worldEdit = WorldEdit.getInstance();
LocalConfiguration config = worldEdit.getConfiguration(); LocalConfiguration config = worldEdit.getConfiguration();
if (input.startsWith("url:")) { if (input.startsWith("url:")) {
if (!player.hasPermission("worldedit.schematic.load.web")) {
if (message) BBC.NO_PERM.send(player, "worldedit.schematic.load.web");
return null;
}
URL base = new URL(Settings.IMP.WEB.URL); URL base = new URL(Settings.IMP.WEB.URL);
input = new URL(base, "uploads/" + input.substring(4) + ".schematic").toString(); input = new URL(base, "uploads/" + input.substring(4) + ".schematic").toString();
} }
if (input.startsWith("http")) { if (input.startsWith("http")) {
if (!player.hasPermission("worldedit.schematic.load.asset")) {
if (message) BBC.NO_PERM.send(player, "worldedit.schematic.load.asset");
return null;
}
URL url = new URL(input); URL url = new URL(input);
URL webInterface = new URL(Settings.IMP.WEB.ASSETS); URL webInterface = new URL(Settings.IMP.WEB.ASSETS);
if (!url.getHost().equalsIgnoreCase(webInterface.getHost())) { if (!url.getHost().equalsIgnoreCase(webInterface.getHost())) {
@ -337,68 +346,89 @@ public enum ClipboardFormat {
MultiClipboardHolder clipboards = loadAllFromUrl(url); MultiClipboardHolder clipboards = loadAllFromUrl(url);
return clipboards; return clipboards;
} else { } else {
if (input.contains("../") && !player.hasPermission("worldedit.schematic.load.other")) { if (Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS && Pattern.compile("[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}").matcher(input).find() && !player.hasPermission("worldedit.schematic.load.other")) {
if (message) BBC.NO_PERM.send(player, "worldedit.schematic.load.other"); BBC.NO_PERM.send(player, "worldedit.schematic.load.other");
return null; return null;
} }
File working = worldEdit.getWorkingDirectoryFile(config.saveDir); File working = worldEdit.getWorkingDirectoryFile(config.saveDir);
File dir = new File(working, (Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS ? (player.getUniqueId().toString() + File.separator) : "") + input); File dir = Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS ? new File(working, player.getUniqueId().toString()) : working;
if (!dir.exists()) { File f;
dir = new File(dir + "." + getExtension()); if (input.startsWith("#")) {
} String[] extensions;
if (!dir.exists()) { if (format != null) {
if ((!input.contains("/") && !input.contains("\\")) || player.hasPermission("worldedit.schematic.load.other")) { extensions = format.getFileExtensions().toArray(new String[0]);
dir = new File(worldEdit.getWorkingDirectoryFile(config.saveDir), input); } else {
extensions = ClipboardFormats.getFileExtensionArray();
} }
if (!dir.exists()) { f = player.openFileOpenDialog(extensions);
dir = new File(dir + "." + getExtension()); if (f == null || !f.exists()) {
if (message) player.printError("Schematic " + input + " does not exist! (" + f + ")");
return null;
}
} else {
if (Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS && Pattern.compile("[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}").matcher(input).find() && !player.hasPermission("worldedit.schematic.load.other")) {
if (message) BBC.NO_PERM.send(player, "worldedit.schematic.load.other");
return null;
}
if (format == null && input.matches(".*\\.[\\w].*")) {
String extension = input.substring(input.lastIndexOf('.') + 1, input.length());
format = ClipboardFormat.findByExtension(extension);
}
f = MainUtil.resolve(dir, input, format, true);
}
if (f == null || !f.exists()) {
if (!input.contains("../")) {
dir = worldEdit.getWorkingDirectoryFile(config.saveDir);
f = MainUtil.resolve(dir, input, format, true);
} }
} }
if(!dir.exists()) { if (f == null || !f.exists() || !MainUtil.isInSubDirectory(working, f)) {
for(ClipboardFormat format : values) { if (message) player.printError("Schematic " + input + " does not exist! (" + ((f == null) ? false : f.exists()) + "|" + f + "|" + (f == null ? false : !MainUtil.isInSubDirectory(working, f)) + ")");
if(new File(working, (Settings.IMP.PATHS.PER_PLAYER_SCHEMATICS ? (player.getUniqueId().toString() + File.separator) : "") + input + "." + format.getExtension()).exists()) { return null;
return format.loadAllFromInput(player, input, message);
}
}
} }
if (!dir.exists()) { if (format == null && f.isFile()) {
format = ClipboardFormat.findByFile(f);
if (format == null) {
BBC.CLIPBOARD_INVALID_FORMAT.send(player, f.getName());
return null;
}
}
if (!f.exists()) {
if (message) BBC.SCHEMATIC_NOT_FOUND.send(player, input); if (message) BBC.SCHEMATIC_NOT_FOUND.send(player, input);
return null; return null;
} }
if (!dir.isDirectory()) { if (!f.isDirectory()) {
if(!findByFile(dir).getExtension().equals(getExtension())) { ByteSource source = Files.asByteSource(f);
return findByFile(dir).loadAllFromInput(player, input, message); URI uri = f.toURI();
} return new MultiClipboardHolder(uri, new LazyClipboardHolder(f.toURI(), source, format, null));
ByteSource source = Files.asByteSource(dir);
URI uri = dir.toURI();
return new MultiClipboardHolder(uri, new LazyClipboardHolder(dir.toURI(), source, this, null));
} }
URIClipboardHolder[] clipboards = loadAllFromDirectory(dir); URIClipboardHolder[] clipboards = loadAllFromDirectory(f);
if (clipboards.length < 1) { if (clipboards.length < 1) {
if (message) BBC.SCHEMATIC_NOT_FOUND.send(player, input); if (message) BBC.SCHEMATIC_NOT_FOUND.send(player, input);
return null; return null;
} }
return new MultiClipboardHolder(dir.toURI(), clipboards); return new MultiClipboardHolder(f.toURI(), clipboards);
} }
} }
public URIClipboardHolder[] loadAllFromDirectory(File dir) { public static URIClipboardHolder[] loadAllFromDirectory(File dir) {
File[] files = dir.listFiles(new FileFilter() { HashSet<String> extensions = new HashSet<>(Arrays.asList(ClipboardFormats.getFileExtensionArray()));
@Override File[] files = dir.listFiles(pathname -> {
public boolean accept(File pathname) { String input = pathname.getName();
return pathname.getName().endsWith(".schematic"); String extension = input.substring(input.lastIndexOf('.') + 1, input.length());
} return (extensions.contains(extension.toLowerCase()));
}); });
LazyClipboardHolder[] clipboards = new LazyClipboardHolder[files.length]; LazyClipboardHolder[] clipboards = new LazyClipboardHolder[files.length];
for (int i = 0; i < files.length; i++) { for (int i = 0; i < files.length; i++) {
File file = files[i]; File file = files[i];
ByteSource source = Files.asByteSource(file); ByteSource source = Files.asByteSource(file);
clipboards[i] = new LazyClipboardHolder(file.toURI(), source, this, null); ClipboardFormat format = ClipboardFormat.findByFile(file);
clipboards[i] = new LazyClipboardHolder(file.toURI(), source, format, null);
} }
return clipboards; return clipboards;
} }
public MultiClipboardHolder loadAllFromUrl(URL url) throws IOException { public static MultiClipboardHolder loadAllFromUrl(URL url) throws IOException {
List<LazyClipboardHolder> clipboards = new ArrayList<>(); List<LazyClipboardHolder> clipboards = new ArrayList<>();
try (ReadableByteChannel rbc = Channels.newChannel(url.openStream())) { try (ReadableByteChannel rbc = Channels.newChannel(url.openStream())) {
try (InputStream in = Channels.newInputStream(rbc)) { try (InputStream in = Channels.newInputStream(rbc)) {
@ -406,7 +436,10 @@ public enum ClipboardFormat {
ZipEntry entry; ZipEntry entry;
byte[] buffer = new byte[8192]; byte[] buffer = new byte[8192];
while ((entry = zip.getNextEntry()) != null) { while ((entry = zip.getNextEntry()) != null) {
if (entry.getName().endsWith(".schematic")) { String filename = entry.getName();
String extension = filename.substring(filename.lastIndexOf('.') + 1, filename.length());
ClipboardFormat format = findByExtension(filename);
if (format != null) {
FastByteArrayOutputStream out = new FastByteArrayOutputStream(); FastByteArrayOutputStream out = new FastByteArrayOutputStream();
int len = 0; int len = 0;
while ((len = zip.read(buffer)) > 0) { while ((len = zip.read(buffer)) > 0) {
@ -414,7 +447,7 @@ public enum ClipboardFormat {
} }
byte[] array = out.toByteArray(); byte[] array = out.toByteArray();
ByteSource source = ByteSource.wrap(array); ByteSource source = ByteSource.wrap(array);
LazyClipboardHolder clipboard = new LazyClipboardHolder(url.toURI(), source, this, null); LazyClipboardHolder clipboard = new LazyClipboardHolder(url.toURI(), source, format, null);
clipboards.add(clipboard); clipboards.add(clipboard);
} }
} }