From 5421f956d22e5a8b0ead82d1b2450c9129824d47 Mon Sep 17 00:00:00 2001 From: "Blue (Lukas Rieger)" Date: Wed, 25 Mar 2020 21:54:59 +0100 Subject: [PATCH 1/2] Fix lighting bug and two bugs with resource-loading --- .../bluemap/core/mca/ChunkAnvil112.java | 2 +- .../bluemap/core/mca/ChunkAnvil113.java | 2 +- .../bluemap/core/mca/ChunkAnvil115.java | 2 +- .../bluemap/core/mca/MCAWorld.java | 2 +- .../core/resourcepack/ResourcePack.java | 3 +- .../fileaccess/CaseInsensitiveFileAccess.java | 108 ++++++++++++++++++ .../fileaccess/ZipFileAccess.java | 27 ++++- .../bluemap/core/world/LightData.java | 3 +- .../bluemap/core/world/SlicedWorld.java | 2 +- 9 files changed, 139 insertions(+), 12 deletions(-) create mode 100644 BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resourcepack/fileaccess/CaseInsensitiveFileAccess.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/mca/ChunkAnvil112.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/mca/ChunkAnvil112.java index 42cd5c38..22e41950 100644 --- a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/mca/ChunkAnvil112.java +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/mca/ChunkAnvil112.java @@ -98,7 +98,7 @@ public LightData getLightData(Vector3i pos) { int sectionY = MCAUtil.blockToChunk(pos.getY()); Section section = this.sections[sectionY]; - if (section == null) return LightData.FULL; + if (section == null) return LightData.SKY; return section.getLightData(pos); } diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/mca/ChunkAnvil113.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/mca/ChunkAnvil113.java index 0d7cd574..0d0ff724 100644 --- a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/mca/ChunkAnvil113.java +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/mca/ChunkAnvil113.java @@ -107,7 +107,7 @@ public LightData getLightData(Vector3i pos) { int sectionY = MCAUtil.blockToChunk(pos.getY()); Section section = this.sections[sectionY]; - if (section == null) return LightData.FULL; + if (section == null) return LightData.SKY; return section.getLightData(pos); } diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/mca/ChunkAnvil115.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/mca/ChunkAnvil115.java index 5ebff346..96fd4e95 100644 --- a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/mca/ChunkAnvil115.java +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/mca/ChunkAnvil115.java @@ -107,7 +107,7 @@ public LightData getLightData(Vector3i pos) { int sectionY = MCAUtil.blockToChunk(pos.getY()); Section section = this.sections[sectionY]; - if (section == null) return LightData.FULL; + if (section == null) return LightData.SKY; return section.getLightData(pos); } diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/mca/MCAWorld.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/mca/MCAWorld.java index 849e2511..1217c996 100644 --- a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/mca/MCAWorld.java +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/mca/MCAWorld.java @@ -169,7 +169,7 @@ public Block getBlock(Vector3i pos) { } if (pos.getY() > getMaxY()) { - return new Block(this, BlockState.AIR, LightData.FULL, Biome.DEFAULT, BlockProperties.TRANSPARENT, pos); + return new Block(this, BlockState.AIR, LightData.SKY, Biome.DEFAULT, BlockProperties.TRANSPARENT, pos); } try { diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resourcepack/ResourcePack.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resourcepack/ResourcePack.java index 85fe04cf..8490d6ec 100644 --- a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resourcepack/ResourcePack.java +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resourcepack/ResourcePack.java @@ -45,6 +45,7 @@ import de.bluecolored.bluemap.core.logger.Logger; import de.bluecolored.bluemap.core.resourcepack.BlockStateResource.Builder; import de.bluecolored.bluemap.core.resourcepack.fileaccess.BluemapAssetOverrideFileAccess; +import de.bluecolored.bluemap.core.resourcepack.fileaccess.CaseInsensitiveFileAccess; import de.bluecolored.bluemap.core.resourcepack.fileaccess.CombinedFileAccess; import de.bluecolored.bluemap.core.resourcepack.fileaccess.FileAccess; import de.bluecolored.bluemap.core.world.BlockState; @@ -140,7 +141,7 @@ public void load(File... sources) { } } - FileAccess sourcesAccess = new BluemapAssetOverrideFileAccess(combinedSources); + FileAccess sourcesAccess = new CaseInsensitiveFileAccess(new BluemapAssetOverrideFileAccess(combinedSources)); textures.reloadAllTextures(sourcesAccess); diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resourcepack/fileaccess/CaseInsensitiveFileAccess.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resourcepack/fileaccess/CaseInsensitiveFileAccess.java new file mode 100644 index 00000000..c08bc0a5 --- /dev/null +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resourcepack/fileaccess/CaseInsensitiveFileAccess.java @@ -0,0 +1,108 @@ +/* + * This file is part of BlueMap, licensed under the MIT License (MIT). + * + * Copyright (c) Blue (Lukas Rieger) + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package de.bluecolored.bluemap.core.resourcepack.fileaccess; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.util.Collection; + +/** + * This {@link FileAccess} maps its parent {@link FileAccess} to first look in assets/[namespace]/bluemap/... instead of assets/[namespace]/... + */ +public class CaseInsensitiveFileAccess implements FileAccess { + + public FileAccess parent; + + public CaseInsensitiveFileAccess(FileAccess parent) { + this.parent = parent; + } + + @Override + public InputStream readFile(String path) throws FileNotFoundException, IOException { + try { + return parent.readFile(path); + } catch (FileNotFoundException ex) { + try { + return parent.readFile(path.toLowerCase()); + } catch (FileNotFoundException ex2) { + path = correctPathCase(path); + return parent.readFile(path); + } + } + } + + private String correctPathCase(String path) throws FileNotFoundException, IOException { + path = FileAccess.normalize(path); + String[] pathParts = path.split("/"); + + String correctPath = ""; + for (int i = 0; i < pathParts.length; i++) { + String part = correctPath + pathParts[i]; + + boolean found = false; + for(String folder : listFolders(correctPath)) { + if (!folder.equalsIgnoreCase(part)) continue; + + part = folder; + found = true; + break; + } + + if (!found && i == pathParts.length - 1) { + for(String folder : listFiles(correctPath, false)) { + if (!folder.equalsIgnoreCase(part)) continue; + + part = folder; + found = true; + break; + } + } + + if (!found) throw new FileNotFoundException(); + + correctPath = part + "/"; + } + + correctPath = FileAccess.normalize(correctPath); + return correctPath; + } + + @Override + public Collection listFiles(String path, boolean recursive) { + return parent.listFiles(path, recursive); + } + + @Override + public Collection listFolders(String path) { + return parent.listFolders(path); + } + + @Override + public void close() throws IOException { + parent.close(); + } + +} diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resourcepack/fileaccess/ZipFileAccess.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resourcepack/fileaccess/ZipFileAccess.java index 4ba703b3..d894b790 100644 --- a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resourcepack/fileaccess/ZipFileAccess.java +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resourcepack/fileaccess/ZipFileAccess.java @@ -31,6 +31,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Enumeration; +import java.util.HashSet; import java.util.zip.ZipEntry; import java.util.zip.ZipException; import java.util.zip.ZipFile; @@ -85,14 +86,20 @@ public Collection listFiles(String path, boolean recursive) { public Collection listFolders(String path) { path = normalizeFolderPath(path); - Collection folders = new ArrayList(); + Collection folders = new HashSet(); for (Enumeration entries = file.entries(); entries.hasMoreElements();) { ZipEntry entry = entries.nextElement(); - if (!entry.isDirectory()) continue; - String file = entry.getName(); - file = file.substring(0, file.length() - 1); //strip last / + if (!entry.isDirectory()) { + int nameSplit = file.lastIndexOf('/'); + if (nameSplit == -1) continue; + file = file.substring(0, nameSplit); + } + file = normalizeFolderPath(file); + + //strip last / + file = file.substring(0, file.length() - 1); int nameSplit = file.lastIndexOf('/'); String filePath = "/"; @@ -101,7 +108,17 @@ public Collection listFolders(String path) { } filePath = normalizeFolderPath(filePath); - if (!path.equals(filePath)) continue; + if (!filePath.startsWith(path)) continue; + + int subFolderMark = file.indexOf('/', path.length()); + if (subFolderMark != -1) { + file = file.substring(0, subFolderMark); + } + + file = normalizeFolderPath(file); + + //strip last / + file = file.substring(0, file.length() - 1); folders.add(file); } diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/LightData.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/LightData.java index e42bfa41..74cce20c 100644 --- a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/LightData.java +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/LightData.java @@ -27,7 +27,8 @@ public class LightData { public static final LightData ZERO = new LightData(0, 0); - public static final LightData FULL = new LightData(15, 15); + public static final LightData SKY = new LightData(15, 0); + public static final LightData FULL = new LightData(15, 15); private final int skyLight, blockLight; diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/SlicedWorld.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/SlicedWorld.java index 487c25a1..d0a37dfd 100644 --- a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/SlicedWorld.java +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/SlicedWorld.java @@ -180,7 +180,7 @@ private Block createAirBlock(Vector3i pos) { return new Block( this, BlockState.AIR, - pos.getY() < this.min.getY() ? LightData.ZERO : LightData.FULL, + pos.getY() < this.min.getY() ? LightData.ZERO : LightData.SKY, Biome.DEFAULT, BlockProperties.TRANSPARENT, pos From 015b38311d11420f79c6afc3843b679f406fa25d Mon Sep 17 00:00:00 2001 From: "Blue (Lukas Rieger)" Date: Wed, 25 Mar 2020 22:30:50 +0100 Subject: [PATCH 2/2] Fix bug with dimensions not being detected correctly in bukkit --- .../java/de/bluecolored/bluemap/bukkit/BukkitPlugin.java | 5 +++++ BlueMapBukkit/src/main/resources/bluemap-bukkit.conf | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/BlueMapBukkit/src/main/java/de/bluecolored/bluemap/bukkit/BukkitPlugin.java b/BlueMapBukkit/src/main/java/de/bluecolored/bluemap/bukkit/BukkitPlugin.java index 6f20526f..3ecb1067 100644 --- a/BlueMapBukkit/src/main/java/de/bluecolored/bluemap/bukkit/BukkitPlugin.java +++ b/BlueMapBukkit/src/main/java/de/bluecolored/bluemap/bukkit/BukkitPlugin.java @@ -78,6 +78,11 @@ public void unregisterAllListeners() { @Override public UUID getUUIDForWorld(File worldFolder) throws IOException { + //if it is a dimension folder + if (!new File(worldFolder, "level.dat").exists()) { + worldFolder = worldFolder.getParentFile(); + } + final File normalizedWorldFolder = worldFolder.getCanonicalFile(); Future futureUUID; diff --git a/BlueMapBukkit/src/main/resources/bluemap-bukkit.conf b/BlueMapBukkit/src/main/resources/bluemap-bukkit.conf index d24681af..d5070bb3 100644 --- a/BlueMapBukkit/src/main/resources/bluemap-bukkit.conf +++ b/BlueMapBukkit/src/main/resources/bluemap-bukkit.conf @@ -134,7 +134,7 @@ maps: [ { id: "end" name: "End" - world: "world_the_end" + world: "world_the_end/DIM1" # We dont want a blue sky in the end skyColor: "#080010" @@ -150,7 +150,7 @@ maps: [ { id: "nether" name: "Nether" - world: "world_nether" + world: "world_nether/DIM-1" skyColor: "#290000"