Fix lighting bug and two bugs with resource-loading

This commit is contained in:
Blue (Lukas Rieger) 2020-03-25 21:54:59 +01:00
parent 69e0e51fed
commit 5421f956d2
9 changed files with 139 additions and 12 deletions

View File

@ -98,7 +98,7 @@ public class ChunkAnvil112 extends Chunk {
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);
}

View File

@ -107,7 +107,7 @@ public class ChunkAnvil113 extends Chunk {
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);
}

View File

@ -107,7 +107,7 @@ public class ChunkAnvil115 extends Chunk {
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);
}

View File

@ -169,7 +169,7 @@ public class MCAWorld implements World {
}
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 {

View File

@ -45,6 +45,7 @@ import com.google.common.collect.MultimapBuilder;
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 class ResourcePack {
}
}
FileAccess sourcesAccess = new BluemapAssetOverrideFileAccess(combinedSources);
FileAccess sourcesAccess = new CaseInsensitiveFileAccess(new BluemapAssetOverrideFileAccess(combinedSources));
textures.reloadAllTextures(sourcesAccess);

View File

@ -0,0 +1,108 @@
/*
* This file is part of BlueMap, licensed under the MIT License (MIT).
*
* Copyright (c) Blue (Lukas Rieger) <https://bluecolored.de>
* 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<String> listFiles(String path, boolean recursive) {
return parent.listFiles(path, recursive);
}
@Override
public Collection<String> listFolders(String path) {
return parent.listFolders(path);
}
@Override
public void close() throws IOException {
parent.close();
}
}

View File

@ -31,6 +31,7 @@ import java.io.InputStream;
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 class ZipFileAccess implements FileAccess {
public Collection<String> listFolders(String path) {
path = normalizeFolderPath(path);
Collection<String> folders = new ArrayList<String>();
Collection<String> folders = new HashSet<String>();
for (Enumeration<? extends ZipEntry> 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 class ZipFileAccess implements FileAccess {
}
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);
}

View File

@ -27,7 +27,8 @@ package de.bluecolored.bluemap.core.world;
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;

View File

@ -180,7 +180,7 @@ public class SlicedWorld implements World {
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