diff --git a/src/main/java/carpet/script/api/Auxiliary.java b/src/main/java/carpet/script/api/Auxiliary.java index 2105605c..1ec278f8 100644 --- a/src/main/java/carpet/script/api/Auxiliary.java +++ b/src/main/java/carpet/script/api/Auxiliary.java @@ -88,12 +88,12 @@ public class Auxiliary { public static final String MARKER_STRING = "__scarpet_marker"; private static final Map mixerMap = Arrays.stream(SoundCategory.values()).collect(Collectors.toMap(SoundCategory::getName, k -> k)); - public static String recognizeResource(Value value) + public static String recognizeResource(Value value, boolean isFloder) { String origfile = value.getString(); String file = origfile.toLowerCase(Locale.ROOT).replaceAll("[^A-Za-z0-9\\-+_/]", ""); file = Arrays.stream(file.split("/+")).filter(s -> !s.isEmpty()).collect(Collectors.joining("/")); - if (file.isEmpty()) + if (file.isEmpty() && !isFloder) { throw new InternalExpressionException("Cannot use "+origfile+" as resource name - must have some letters and numbers"); } @@ -786,7 +786,7 @@ public class Auxiliary { }); expression.addLazyFunction("read_file", 2, (c, t, lv) -> { - String resource = recognizeResource(lv.get(0).evalValue(c)); + String resource = recognizeResource(lv.get(0).evalValue(c), false); String origtype = lv.get(1).evalValue(c).getString().toLowerCase(Locale.ROOT); boolean shared = origtype.startsWith("shared_"); String type = shared ? origtype.substring(7) : origtype; //len(shared_) @@ -809,7 +809,7 @@ public class Auxiliary { }); expression.addLazyFunction("delete_file", 2, (c, t, lv) -> { - String resource = recognizeResource(lv.get(0).evalValue(c)); + String resource = recognizeResource(lv.get(0).evalValue(c), false); String origtype = lv.get(1).evalValue(c).getString().toLowerCase(Locale.ROOT); boolean shared = origtype.startsWith("shared_"); String type = shared ? origtype.substring(7) : origtype; //len(shared_) @@ -821,7 +821,7 @@ public class Auxiliary { expression.addLazyFunction("write_file", -1, (c, t, lv) -> { if (lv.size() < 3) throw new InternalExpressionException("'write_file' requires three or more arguments"); - String resource = recognizeResource(lv.get(0).evalValue(c)); + String resource = recognizeResource(lv.get(0).evalValue(c), false); String origtype = lv.get(1).evalValue(c).getString().toLowerCase(Locale.ROOT); boolean shared = origtype.startsWith("shared_"); String type = shared ? origtype.substring(7) : origtype; //len(shared_) @@ -874,7 +874,7 @@ public class Auxiliary { if (lv.size()>0) { c.host.issueDeprecation("load_app_data(...) with arguments"); - file = recognizeResource(lv.get(0).evalValue(c)); + file = recognizeResource(lv.get(0).evalValue(c), false); if (lv.size() > 1) { shared = lv.get(1).evalValue(c).getBoolean(); @@ -897,7 +897,7 @@ public class Auxiliary { if (lv.size()>1) { c.host.issueDeprecation("store_app_data(...) with more than one argument"); - file = recognizeResource(lv.get(1).evalValue(c)); + file = recognizeResource(lv.get(1).evalValue(c), false); if (lv.size() > 2) { shared = lv.get(2).evalValue(c).getBoolean(); diff --git a/src/main/java/carpet/script/bundled/FileModule.java b/src/main/java/carpet/script/bundled/FileModule.java index cacc2e12..4528a17f 100644 --- a/src/main/java/carpet/script/bundled/FileModule.java +++ b/src/main/java/carpet/script/bundled/FileModule.java @@ -1,5 +1,7 @@ package carpet.script.bundled; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtIo; import net.minecraft.nbt.PositionTracker; import net.minecraft.nbt.Tag; import net.minecraft.nbt.TagReaders; @@ -60,25 +62,40 @@ public class FileModule extends Module } //copied private method from net.minecraft.nbt.NbtIo.read() + // to read non-compound tags - these won't be compressed public static Tag read(File file) { - try (DataInputStream dataInput_1 = new DataInputStream(new FileInputStream(file))) + try { - byte byte_1 = dataInput_1.readByte(); - if (byte_1 == 0) + return NbtIo.readCompressed(file); + } + catch (IOException e) + { + try { + return NbtIo.read(file); + } + catch (IOException ioException) + { + try (DataInputStream dataInput_1 = new DataInputStream(new FileInputStream(file))) + { + byte byte_1 = dataInput_1.readByte(); + if (byte_1 == 0) + { + return null; + } + else + { + dataInput_1.readUTF(); + return TagReaders.of(byte_1).read(dataInput_1, 0, PositionTracker.DEFAULT); + } + } + catch (IOException ignored) + { + } return null; } - else - { - dataInput_1.readUTF(); - return TagReaders.of(byte_1).read(dataInput_1, 0, PositionTracker.DEFAULT); - } } - catch (IOException ignored) - { - } - return null; } //copied private method from net.minecraft.nbt.NbtIo.write() and client method safe_write @@ -87,18 +104,32 @@ public class FileModule extends Module File file_2 = new File(file.getAbsolutePath() + "_tmp"); if (file_2.exists()) file_2.delete(); - try(DataOutputStream dataOutputStream_1 = new DataOutputStream(new FileOutputStream(file_2))) + if (tag_1 instanceof CompoundTag) { - dataOutputStream_1.writeByte(tag_1.getType()); - if (tag_1.getType() != 0) + try { - dataOutputStream_1.writeUTF(""); - tag_1.write(dataOutputStream_1); + NbtIo.writeCompressed((CompoundTag) tag_1, file_2); + } + catch (IOException e) + { + return false; } } - catch (IOException e) + else { - return false; + try (DataOutputStream dataOutputStream_1 = new DataOutputStream(new FileOutputStream(file_2))) + { + dataOutputStream_1.writeByte(tag_1.getType()); + if (tag_1.getType() != 0) + { + dataOutputStream_1.writeUTF(""); + tag_1.write(dataOutputStream_1); + } + } + catch (IOException e) + { + return false; + } } if (file.exists()) file.delete(); if (!file.exists()) file_2.renameTo(file);