Compare commits
72 Commits
Author | SHA1 | Date |
---|---|---|
Michael Primm | b434f09035 | |
Michael Primm | e21198d279 | |
Michael Primm | 1d6346b580 | |
Michael Primm | e086930133 | |
Michael Primm | 27526e64e5 | |
Michael Primm | 21369ec485 | |
Michael Primm | 120889b500 | |
Michael Primm | 669c75322a | |
mikeprimm | ea24554033 | |
JurgenKuyper | b9144e3609 | |
Michael Primm | 9878719337 | |
Michael Primm | 6746631758 | |
Michael Primm | 23cd60ba0a | |
Michael Primm | 328954b256 | |
Michael Primm | 574a400ada | |
Michael Primm | 84ee4cdf0c | |
Michael Primm | dea6a55acd | |
Michael Primm | 87993219bb | |
Michael Primm | 7cdd90768e | |
mikeprimm | b0e56d3e5a | |
Michael Primm | 20700c21b8 | |
Michael Primm | 85885ced0e | |
mikeprimm | 06fbcb8d3d | |
mikeprimm | b181607e5a | |
mikeprimm | bb1438b3c4 | |
ChimneySwift | 1ba6dd4683 | |
ChimneySwift | d16fdc8275 | |
ChimneySwift | 914fc5a10c | |
ChimneySwift | a669d75de0 | |
Jurgen | bc0117ac5a | |
Spongecade | 298b31cdc8 | |
ApliNi | 5244e74d47 | |
JurgenKuyper | 0d15ee5a46 | |
Michael Primm | ca80758605 | |
Michael Primm | 96554717f1 | |
Michael Primm | c807861859 | |
Michael Primm | 65cca049ac | |
JurgenKuyper | 0ba3c8008f | |
Jurgen | 030a0e1d24 | |
Michael Primm | 79f354b111 | |
Michael Primm | 92b9016c65 | |
Michael Primm | e6a18f1029 | |
mikeprimm | ff87b9dd3e | |
Michael Primm | 2d723afba1 | |
Michael Primm | f5d2244450 | |
mikeprimm | e429a53d27 | |
Michael Primm | 169bb81ca7 | |
Michael Primm | 91c4b23a0e | |
Michael Primm | e2a5fc80d3 | |
Michael Primm | 736dd5a290 | |
Michael Primm | 7905f76d51 | |
Murilo Henrique Ghignatti | b97d5045b6 | |
Michael Primm | 85012ae478 | |
Michael Primm | d1408b7bfd | |
Jurgen | c093a95bc0 | |
Michael Primm | 7ed6728e34 | |
Michael Primm | eed1a2b444 | |
mikeprimm | b8b1e8bd4e | |
Michael Primm | ae164f2993 | |
mikeprimm | ebb9dc00d0 | |
mikeprimm | 31d1b400f0 | |
mikeprimm | 105e3887a0 | |
stormboomer | 0120c135c4 | |
stormboomer | b8166a9122 | |
stormboomer | 247e81bc61 | |
James Monger | fe49d37fa9 | |
James Monger | 20592cd805 | |
Michael Primm | b310a57b64 | |
JurgenKuyper | 6b3e18c351 | |
Michael Primm | 105d4f1b62 | |
Thorinwasher | 2503dbfdbb | |
Michael Primm | 87d8c73941 |
|
@ -8,6 +8,8 @@ eclipse {
|
|||
}
|
||||
}
|
||||
|
||||
sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '1.8' // Need this here so eclipse task generates correctly.
|
||||
|
||||
dependencies {
|
||||
implementation project(':DynmapCoreAPI')
|
||||
implementation 'javax.servlet:javax.servlet-api:3.1'
|
||||
|
@ -17,11 +19,13 @@ dependencies {
|
|||
implementation 'org.yaml:snakeyaml:1.23' // DON'T UPDATE - NEWER ONE TRIPS ON WINDOWS ENCODED FILES
|
||||
implementation 'com.googlecode.owasp-java-html-sanitizer:owasp-java-html-sanitizer:20180219.1'
|
||||
implementation 'org.postgresql:postgresql:42.2.18'
|
||||
implementation 'io.github.linktosriram:s3-lite-core:0.2.0'
|
||||
implementation 'io.github.linktosriram:s3-lite-api:0.2.0'
|
||||
implementation 'io.github.linktosriram:s3-lite-http-client-url-connection:0.2.0'
|
||||
implementation 'io.github.linktosriram:s3-lite-http-client-spi:0.2.0'
|
||||
implementation 'io.github.linktosriram:s3-lite-util:0.2.0'
|
||||
implementation 'io.github.linktosriram.s3lite:core:0.0.2-SNAPSHOT'
|
||||
implementation 'io.github.linktosriram.s3lite:api:0.0.2-SNAPSHOT'
|
||||
implementation 'io.github.linktosriram.s3lite:http-client-url-connection:0.0.2-SNAPSHOT'
|
||||
implementation 'io.github.linktosriram.s3lite:http-client-spi:0.0.2-SNAPSHOT'
|
||||
implementation 'io.github.linktosriram.s3lite:util:0.0.2-SNAPSHOT'
|
||||
implementation 'jakarta.xml.bind:jakarta.xml.bind-api:3.0.1'
|
||||
implementation 'com.sun.xml.bind:jaxb-impl:3.0.0'
|
||||
}
|
||||
|
||||
processResources {
|
||||
|
@ -44,7 +48,7 @@ processResources {
|
|||
}
|
||||
|
||||
jar {
|
||||
classifier = 'unshaded'
|
||||
archiveClassifier = 'unshaded'
|
||||
}
|
||||
|
||||
shadowJar {
|
||||
|
@ -56,11 +60,13 @@ shadowJar {
|
|||
include(dependency('org.eclipse.jetty::'))
|
||||
include(dependency('org.eclipse.jetty.orbit:javax.servlet:'))
|
||||
include(dependency('org.postgresql:postgresql:'))
|
||||
include(dependency('io.github.linktosriram:s3-lite-core:'))
|
||||
include(dependency('io.github.linktosriram:s3-lite-api:'))
|
||||
include(dependency('io.github.linktosriram:s3-lite-http-client-url-connection:'))
|
||||
include(dependency('io.github.linktosriram:s3-lite-http-client-spi:'))
|
||||
include(dependency('io.github.linktosriram:s3-lite-util:'))
|
||||
include(dependency('io.github.linktosriram.s3lite:core:'))
|
||||
include(dependency('io.github.linktosriram.s3lite:api:'))
|
||||
include(dependency('io.github.linktosriram.s3lite:http-client-url-connection:'))
|
||||
include(dependency('io.github.linktosriram.s3lite:http-client-spi:'))
|
||||
include(dependency('io.github.linktosriram.s3lite:util:'))
|
||||
include(dependency('jakarta.xml.bind::'))
|
||||
include(dependency('com.sun.xml.bind::'))
|
||||
include(dependency(':DynmapCoreAPI'))
|
||||
exclude("META-INF/maven/**")
|
||||
exclude("META-INF/services/**")
|
||||
|
@ -73,8 +79,8 @@ shadowJar {
|
|||
relocate('org.postgresql', 'org.dynmap.org.postgresql')
|
||||
relocate('io.github.linktosriram.s3lite', 'org.dynmap.s3lite')
|
||||
|
||||
destinationDir = file '../target'
|
||||
classifier = ''
|
||||
destinationDirectory = file '../target'
|
||||
archiveClassifier = ''
|
||||
}
|
||||
|
||||
artifacts {
|
||||
|
|
|
@ -12,6 +12,7 @@ public class ClientUpdateComponent extends Component {
|
|||
private int hideifshadow;
|
||||
private int hideifunder;
|
||||
private boolean hideifsneaking;
|
||||
private boolean hideifspectator;
|
||||
private boolean hideifinvisiblepotion;
|
||||
private boolean is_protected;
|
||||
public static boolean usePlayerColors;
|
||||
|
@ -24,6 +25,7 @@ public class ClientUpdateComponent extends Component {
|
|||
hideifshadow = configuration.getInteger("hideifshadow", 15);
|
||||
hideifunder = configuration.getInteger("hideifundercover", 15);
|
||||
hideifsneaking = configuration.getBoolean("hideifsneaking", false);
|
||||
hideifspectator = configuration.getBoolean("hideifspectator", false);
|
||||
hideifinvisiblepotion = configuration.getBoolean("hide-if-invisiblity-potion", true);
|
||||
is_protected = configuration.getBoolean("protected-player-info", false);
|
||||
usePlayerColors = configuration.getBoolean("use-name-colors", false);
|
||||
|
@ -100,6 +102,9 @@ public class ClientUpdateComponent extends Component {
|
|||
if((!hide) && hideifsneaking && p.isSneaking()) {
|
||||
hide = true;
|
||||
}
|
||||
if((!hide) && hideifspectator && p.isSpectator()) {
|
||||
hide = true;
|
||||
}
|
||||
if((!hide) && is_protected && (!see_all)) {
|
||||
if(e.user != null) {
|
||||
hide = !core.testIfPlayerVisibleToPlayer(e.user, p.getName());
|
||||
|
|
|
@ -1,11 +1,15 @@
|
|||
package org.dynmap;
|
||||
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.io.Reader;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
|
@ -82,13 +86,13 @@ public class ConfigurationNode implements Map<String, Object> {
|
|||
initparse();
|
||||
// If no file to read, just return false
|
||||
if (!f.canRead()) { return false; }
|
||||
FileInputStream fis = null;
|
||||
Reader fr = null;
|
||||
try {
|
||||
fis = new FileInputStream(f);
|
||||
Object o = yaml.load(new UnicodeReader(fis));
|
||||
fr = new UnicodeReader(new BufferedInputStream(new FileInputStream(f)));
|
||||
Object o = yaml.load(fr);
|
||||
if((o != null) && (o instanceof Map))
|
||||
entries = (Map<String, Object>)o;
|
||||
fis.close();
|
||||
fr.close();
|
||||
}
|
||||
catch (YAMLException e) {
|
||||
Log.severe("Error parsing " + f.getPath() + ". Use http://yamllint.com to debug the YAML syntax." );
|
||||
|
@ -97,8 +101,8 @@ public class ConfigurationNode implements Map<String, Object> {
|
|||
Log.severe("Error reading " + f.getPath());
|
||||
return false;
|
||||
} finally {
|
||||
if(fis != null) {
|
||||
try { fis.close(); } catch (IOException x) {}
|
||||
if(fr != null) {
|
||||
try { fr.close(); } catch (IOException x) {}
|
||||
}
|
||||
}
|
||||
return (entries != null);
|
||||
|
@ -111,7 +115,7 @@ public class ConfigurationNode implements Map<String, Object> {
|
|||
public boolean save(File file) {
|
||||
initparse();
|
||||
|
||||
FileOutputStream stream = null;
|
||||
OutputStream stream = null;
|
||||
|
||||
File parent = file.getParentFile();
|
||||
|
||||
|
@ -120,7 +124,7 @@ public class ConfigurationNode implements Map<String, Object> {
|
|||
}
|
||||
|
||||
try {
|
||||
stream = new FileOutputStream(file);
|
||||
stream = new BufferedOutputStream(new FileOutputStream(file));
|
||||
OutputStreamWriter writer = new OutputStreamWriter(stream, "UTF-8");
|
||||
yaml.dump(entries, writer);
|
||||
return true;
|
||||
|
|
|
@ -164,6 +164,7 @@ public class DynmapCore implements DynmapCommonAPI {
|
|||
private File dataDirectory;
|
||||
private File tilesDirectory;
|
||||
private File exportDirectory;
|
||||
private File importDirectory;
|
||||
private String plugin_ver;
|
||||
private MapStorage defaultStorage;
|
||||
|
||||
|
@ -224,6 +225,9 @@ public class DynmapCore implements DynmapCommonAPI {
|
|||
public final File getExportFolder() {
|
||||
return exportDirectory;
|
||||
}
|
||||
public final File getImportFolder() {
|
||||
return importDirectory;
|
||||
}
|
||||
public void setMinecraftVersion(String mcver) {
|
||||
this.platformVersion = mcver;
|
||||
}
|
||||
|
@ -428,6 +432,11 @@ public class DynmapCore implements DynmapCommonAPI {
|
|||
if (!exportDirectory.isDirectory() && !exportDirectory.mkdirs()) {
|
||||
Log.warning("Could not create directory for exports ('" + exportDirectory + "').");
|
||||
}
|
||||
// Prime the imports directory
|
||||
importDirectory = getFile(configuration.getString("importpath", "import"));
|
||||
if (!importDirectory.isDirectory() && !importDirectory.mkdirs()) {
|
||||
Log.warning("Could not create directory for imports ('" + importDirectory + "').");
|
||||
}
|
||||
// Create default storage handler
|
||||
String storetype = configuration.getString("storage/type", "filetree");
|
||||
if (storetype.equals("filetree")) {
|
||||
|
|
|
@ -92,6 +92,7 @@ public class DynmapMapCommands {
|
|||
mapSetArgs.put("boostzoom", emptySupplier);
|
||||
mapSetArgs.put("tilescale", emptySupplier);
|
||||
mapSetArgs.put("tileupdatedelay", emptySupplier);
|
||||
mapSetArgs.put("readonly", booleanSupplier);
|
||||
|
||||
tabCompletions = new HashMap<>();
|
||||
tabCompletions.put("worldaddlimit", worldAddLimitArgs);
|
||||
|
@ -696,7 +697,7 @@ public class DynmapMapCommands {
|
|||
sb.append(", lighting=").append(hdmt.getLighting().getName()).append(", mapzoomin=").append(hdmt.getMapZoomIn()).append(", mapzoomout=").append(hdmt.getMapZoomOutLevels());
|
||||
sb.append(", img-format=").append(hdmt.getImageFormatSetting()).append(", icon=").append(hdmt.getIcon());
|
||||
sb.append(", append-to-world=").append(hdmt.getAppendToWorld()).append(", boostzoom=").append(hdmt.getBoostZoom());
|
||||
sb.append(", protected=").append(hdmt.isProtected()).append(", tilescale=").append(hdmt.getTileScale());
|
||||
sb.append(", protected=").append(hdmt.isProtected()).append(", tilescale=").append(hdmt.getTileScale()).append(", readonly=").append(hdmt.isReadOnly());
|
||||
if(hdmt.tileupdatedelay > 0) {
|
||||
sb.append(", tileupdatedelay=").append(hdmt.tileupdatedelay);
|
||||
}
|
||||
|
@ -996,6 +997,9 @@ public class DynmapMapCommands {
|
|||
else if(tok[0].equalsIgnoreCase("protected")) {
|
||||
did_update |= mt.setProtected(Boolean.parseBoolean(tok[1]));
|
||||
}
|
||||
else if(tok[0].equalsIgnoreCase("readonly")) {
|
||||
did_update |= mt.setReadOnly(Boolean.parseBoolean(tok[1]));
|
||||
}
|
||||
}
|
||||
if(did_update) {
|
||||
if(core.updateWorldConfig(w)) {
|
||||
|
|
|
@ -629,10 +629,12 @@ public class MapManager {
|
|||
renderedmaps.addAll(map.getMapsSharingRender(world));
|
||||
|
||||
/* Now, prime the render queue */
|
||||
for (MapTile mt : map.getTiles(world, (int)loc.x, (int)loc.y, (int)loc.z)) {
|
||||
if (!found.getFlag(mt.tileOrdinalX(), mt.tileOrdinalY())) {
|
||||
found.setFlag(mt.tileOrdinalX(), mt.tileOrdinalY(), true);
|
||||
renderQueue.add(mt);
|
||||
if (map.isReadOnly() == false) {
|
||||
for (MapTile mt : map.getTiles(world, (int)loc.x, (int)loc.y, (int)loc.z)) {
|
||||
if (!found.getFlag(mt.tileOrdinalX(), mt.tileOrdinalY())) {
|
||||
found.setFlag(mt.tileOrdinalX(), mt.tileOrdinalY(), true);
|
||||
renderQueue.add(mt);
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!updaterender) { /* Only add other seed points for fullrender */
|
||||
|
@ -1072,6 +1074,10 @@ public class MapManager {
|
|||
tiles.clear();
|
||||
for(DynmapWorld w : worlds) {
|
||||
for(MapTypeState mts : w.mapstate) {
|
||||
if (mts.type.isReadOnly()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if(mts.getNextInvalidTileCoord(coord)) {
|
||||
mts.type.addMapTiles(tiles, w, coord.x, coord.y);
|
||||
mts.validateTile(coord.x, coord.y);
|
||||
|
@ -1903,6 +1909,10 @@ public class MapManager {
|
|||
}
|
||||
if(world == null) continue;
|
||||
for (MapTypeState mts : world.mapstate) {
|
||||
if (mts.type.isReadOnly()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
List<TileFlags.TileCoord> tiles = mts.type.getTileCoords(world, evt.x, evt.y, evt.z);
|
||||
invalidates += mts.invalidateTiles(tiles);
|
||||
}
|
||||
|
@ -1935,6 +1945,10 @@ public class MapManager {
|
|||
if(world == null) continue;
|
||||
int invalidates = 0;
|
||||
for (MapTypeState mts : world.mapstate) {
|
||||
if (mts.type.isReadOnly()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
List<TileFlags.TileCoord> tiles = mts.type.getTileCoords(world, evt.xmin, evt.ymin, evt.zmin, evt.xmax, evt.ymax, evt.zmax);
|
||||
invalidates += mts.invalidateTiles(tiles);
|
||||
}
|
||||
|
|
|
@ -10,6 +10,10 @@ import org.json.simple.JSONObject;
|
|||
|
||||
public abstract class MapType {
|
||||
private boolean is_protected;
|
||||
/**
|
||||
* Is the map type read-only? (i.e. should not be updated by renderer)
|
||||
*/
|
||||
private boolean is_readonly;
|
||||
protected int tileupdatedelay;
|
||||
|
||||
public enum ImageVariant {
|
||||
|
@ -207,6 +211,26 @@ public abstract class MapType {
|
|||
}
|
||||
return false;
|
||||
}
|
||||
/**
|
||||
* Is the map type read-only? (i.e. should not be updated by renderer)
|
||||
* @return true if read-only
|
||||
*/
|
||||
public boolean isReadOnly() {
|
||||
return is_readonly;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set read-only state of map type
|
||||
* @param r - true if read-only
|
||||
* @return true if state changed
|
||||
*/
|
||||
public boolean setReadOnly(boolean r) {
|
||||
if(is_readonly != r) {
|
||||
is_readonly = r;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
public abstract String getPrefix();
|
||||
|
||||
public int getTileUpdateDelay(DynmapWorld w) {
|
||||
|
|
|
@ -7,11 +7,11 @@ import java.io.IOException;
|
|||
import java.io.UnsupportedEncodingException;
|
||||
import java.security.MessageDigest;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.security.SecureRandom;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Properties;
|
||||
import java.util.Random;
|
||||
import java.util.Set;
|
||||
|
||||
import org.dynmap.common.DynmapCommandSender;
|
||||
|
@ -26,7 +26,7 @@ public class WebAuthManager {
|
|||
public static final String WEBAUTHFILE = "webauth.txt";
|
||||
private static final String HASHSALT = "$HASH_SALT$";
|
||||
private static final String PWDHASH_PREFIX = "hash.";
|
||||
private Random rnd = new Random();
|
||||
private SecureRandom rnd = new SecureRandom();
|
||||
private DynmapCore core;
|
||||
private String publicRegistrationURL;
|
||||
|
||||
|
|
|
@ -44,6 +44,12 @@ public interface DynmapPlayer extends DynmapCommandSender {
|
|||
* @return true if sneaking
|
||||
*/
|
||||
public boolean isSneaking();
|
||||
|
||||
/**
|
||||
* get spectator gamemode
|
||||
* @return true if gamemode spectator
|
||||
*/
|
||||
public boolean isSpectator();
|
||||
/**
|
||||
* Get health
|
||||
* @return health points
|
||||
|
|
|
@ -34,7 +34,7 @@ public class ChunkVersionHDShader implements HDShader {
|
|||
|
||||
}
|
||||
};
|
||||
// Mapping from https://minecraft.fandom.com/wiki/Data_version
|
||||
// Mapping from https://minecraft.wiki/w/Data_version
|
||||
final static DataVersionMap[] versionmap = {
|
||||
new DataVersionMap(0, "unknown", 0x202020),
|
||||
new DataVersionMap(1519, "1.13.0", 0xF9E79F),
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package org.dynmap.hdmap;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
|
@ -356,7 +357,7 @@ public class HDBlockModels {
|
|||
int layerbits = 0;
|
||||
int rownum = 0;
|
||||
int scale = 0;
|
||||
rdr = new LineNumberReader(new InputStreamReader(in));
|
||||
rdr = new LineNumberReader(new BufferedReader(new InputStreamReader(in)));
|
||||
while ((line = rdr.readLine()) != null) {
|
||||
boolean skip = false;
|
||||
int lineNum = rdr.getLineNumber();
|
||||
|
|
|
@ -153,6 +153,7 @@ public class HDMap extends MapType {
|
|||
this.append_to_world = configuration.getString("append_to_world", "");
|
||||
setProtected(configuration.getBoolean("protected", false));
|
||||
setTileUpdateDelay(configuration.getInteger("tileupdatedelay", -1));
|
||||
setReadOnly(configuration.getBoolean("readonly", false));
|
||||
}
|
||||
|
||||
public ConfigurationNode saveConfiguration() {
|
||||
|
@ -180,6 +181,7 @@ public class HDMap extends MapType {
|
|||
cn.put("backgroundnight", bg_night_cfg);
|
||||
cn.put("append_to_world", append_to_world);
|
||||
cn.put("protected", isProtected());
|
||||
cn.put("readonly", isReadOnly());
|
||||
if(this.tileupdatedelay > 0) {
|
||||
cn.put("tileupdatedelay", this.tileupdatedelay);
|
||||
}
|
||||
|
|
|
@ -131,6 +131,12 @@ public class HDMapManager {
|
|||
/* If limited to one map, and this isn't it, skip */
|
||||
if((mapname != null) && (!hdmap.getName().equals(mapname)))
|
||||
continue;
|
||||
|
||||
// Maps can be set to read-only, which means they don't get re-rendered
|
||||
if (map.isReadOnly()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
shaders.add(hdmap.getShader().getStateInstance(hdmap, cache, mapiter, scale));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1268,7 +1268,7 @@ public class IsoHDPerspective implements HDPerspective {
|
|||
// Mark the tiles we're going to render as validated
|
||||
for (int i = 0; i < numshaders; i++) {
|
||||
MapTypeState mts = world.getMapState(shaderstate[i].getMap());
|
||||
if (mts != null) {
|
||||
if (mts != null && mts.type.isReadOnly() == false) {
|
||||
mts.validateTile(tile.tx, tile.ty);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package org.dynmap.hdmap;
|
||||
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
|
@ -1272,7 +1273,17 @@ public class TexturePack {
|
|||
imgs[idx].width = img.getWidth();
|
||||
imgs[idx].height = img.getHeight();
|
||||
imgs[idx].argb = new int[imgs[idx].width * imgs[idx].height];
|
||||
img.getRGB(0, 0, imgs[idx].width, imgs[idx].height, imgs[idx].argb, 0, imgs[idx].width);
|
||||
if (img.getType() == BufferedImage.TYPE_BYTE_GRAY) { // We don't want alpha correction, apparently
|
||||
float[] buffer = new float[imgs[idx].width * imgs[idx].height];
|
||||
img.getData().getPixels(0, 0, imgs[idx].width, imgs[idx].height, buffer);
|
||||
for (int i = 0; i < imgs[idx].argb.length; i++) {
|
||||
int v = (int) buffer[i];
|
||||
imgs[idx].argb[i] = 0xFF000000 | (v << 16) | (v << 8) | v;
|
||||
}
|
||||
}
|
||||
else {
|
||||
img.getRGB(0, 0, imgs[idx].width, imgs[idx].height, imgs[idx].argb, 0, imgs[idx].width);
|
||||
}
|
||||
img.flush();
|
||||
imgs[idx].isLoaded = true;
|
||||
}
|
||||
|
@ -1823,7 +1834,7 @@ public class TexturePack {
|
|||
|
||||
try {
|
||||
String line;
|
||||
rdr = new LineNumberReader(new InputStreamReader(txtfile));
|
||||
rdr = new LineNumberReader(new BufferedReader(new InputStreamReader(txtfile)));
|
||||
while((line = rdr.readLine()) != null) {
|
||||
if(line.startsWith("#")) {
|
||||
}
|
||||
|
@ -1922,7 +1933,7 @@ public class TexturePack {
|
|||
Map<DynmapBlockState, BitSet> bsprslt;
|
||||
try {
|
||||
String line;
|
||||
rdr = new LineNumberReader(new InputStreamReader(txtfile));
|
||||
rdr = new LineNumberReader(new BufferedReader(new InputStreamReader(txtfile)));
|
||||
while((line = rdr.readLine()) != null) {
|
||||
boolean skip = false;
|
||||
int lineNum = rdr.getLineNumber();
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package org.dynmap.hdmap;
|
||||
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
|
@ -61,13 +62,13 @@ public class TexturePackLoader {
|
|||
if (zf != null) {
|
||||
ZipEntry ze = zf.getEntry(rname);
|
||||
if ((ze != null) && (!ze.isDirectory())) {
|
||||
return zf.getInputStream(ze);
|
||||
return new BufferedInputStream(zf.getInputStream(ze));
|
||||
}
|
||||
}
|
||||
else if (tpdir != null) {
|
||||
File f = new File(tpdir, rname);
|
||||
if (f.isFile() && f.canRead()) {
|
||||
return new FileInputStream(f);
|
||||
return new BufferedInputStream(new FileInputStream(f));
|
||||
}
|
||||
}
|
||||
} catch (IOException iox) {
|
||||
|
@ -75,7 +76,7 @@ public class TexturePackLoader {
|
|||
// Fall through - load as resource from mod, if possible, or from jar
|
||||
InputStream is = dsi.openResource(modname, rname);
|
||||
if (is != null) {
|
||||
return is;
|
||||
return new BufferedInputStream(is);
|
||||
}
|
||||
if (modname != null) {
|
||||
ModSource ms = src_by_mod.get(modname);
|
||||
|
@ -118,7 +119,7 @@ public class TexturePackLoader {
|
|||
Log.warning("Resource " + rname + " for mod " + modname + " not found");
|
||||
}
|
||||
|
||||
return is;
|
||||
return (is != null) ? new BufferedInputStream(is) : null;
|
||||
}
|
||||
public void close() {
|
||||
if(zf != null) {
|
||||
|
|
|
@ -2176,6 +2176,10 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
|
|||
sender.sendMessage("file:\"filename\" required");
|
||||
return true;
|
||||
}
|
||||
if (!validateImportFile(file)) {
|
||||
sender.sendMessage("Error: '" + ARG_FILE + "' cannot include directory separators - must be just filename in " + plugin.getImportFolder().getAbsolutePath() + " directory");
|
||||
return true;
|
||||
}
|
||||
if(label == null)
|
||||
label = id;
|
||||
MarkerIcon ico = MarkerAPIImpl.getMarkerIconImpl(id);
|
||||
|
@ -2184,10 +2188,9 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
|
|||
return true;
|
||||
}
|
||||
/* Open stream to filename */
|
||||
File iconf = new File(file);
|
||||
FileInputStream fis = null;
|
||||
try {
|
||||
fis = new FileInputStream(iconf);
|
||||
fis = new FileInputStream(new File(plugin.getImportFolder(), file));
|
||||
/* Create new icon */
|
||||
MarkerIcon mi = api.createMarkerIcon(id, label, fis);
|
||||
if(mi == null) {
|
||||
|
@ -3201,6 +3204,12 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
|
|||
}
|
||||
return true;
|
||||
}
|
||||
private static boolean validateImportFile(String fname) {
|
||||
if ((fname.indexOf('/') >= 0) || (fname.indexOf('\\') >= 0)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
/** Process importdesc for given item */
|
||||
private static boolean processImportDesc(DynmapCore plugin, DynmapCommandSender sender, String cmd, String commandLabel, String[] args) {
|
||||
if(args.length > 1) {
|
||||
|
@ -3214,13 +3223,17 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
|
|||
}
|
||||
String f = parms.get(ARG_FILE);
|
||||
if (f == null) {
|
||||
sender.sendMessage("Error: no '" + ARG_FILE + "' parameter");
|
||||
sender.sendMessage("file:\"filename\" required");
|
||||
return true;
|
||||
}
|
||||
if (!validateImportFile(f)) {
|
||||
sender.sendMessage("Error: '" + ARG_FILE + "' cannot include directory separators - must be just filename in " + plugin.getImportFolder().getAbsolutePath() + " directory");
|
||||
return true;
|
||||
}
|
||||
FileReader fr = null;
|
||||
String val = null;
|
||||
try {
|
||||
fr = new FileReader(f);
|
||||
fr = new FileReader(new File(plugin.getImportFolder(), f));
|
||||
StringBuilder sb = new StringBuilder();
|
||||
char[] buf = new char[512];
|
||||
int len;
|
||||
|
@ -3261,13 +3274,17 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
|
|||
}
|
||||
String f = parms.get(ARG_FILE);
|
||||
if (f == null) {
|
||||
sender.sendMessage("Error: no '" + ARG_FILE + "' parameter");
|
||||
sender.sendMessage("file:\"filename\" required");
|
||||
return true;
|
||||
}
|
||||
if (!validateImportFile(f)) {
|
||||
sender.sendMessage("Error: '" + ARG_FILE + "' cannot include directory separators - must be just filename in " + plugin.getImportFolder().getAbsolutePath() + " directory");
|
||||
return true;
|
||||
}
|
||||
FileReader fr = null;
|
||||
String val = null;
|
||||
try {
|
||||
fr = new FileReader(f);
|
||||
fr = new FileReader(new File(plugin.getImportFolder(), f));
|
||||
StringBuilder sb = new StringBuilder();
|
||||
char[] buf = new char[512];
|
||||
int len;
|
||||
|
|
|
@ -1,8 +1,10 @@
|
|||
package org.dynmap.modsupport.impl;
|
||||
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.File;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.Writer;
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Locale;
|
||||
|
@ -274,9 +276,9 @@ public class ModModelDefinitionImpl implements ModModelDefinition {
|
|||
return;
|
||||
}
|
||||
File f = new File(destdir, this.txtDef.getModID() + "-models.txt");
|
||||
FileWriter fw = null;
|
||||
Writer fw = null;
|
||||
try {
|
||||
fw = new FileWriter(f);
|
||||
fw = new BufferedWriter(new FileWriter(f));
|
||||
// Write modname line
|
||||
String s = "modname:" + this.txtDef.getModID();
|
||||
fw.write(s + "\n\n");
|
||||
|
|
|
@ -1,8 +1,10 @@
|
|||
package org.dynmap.modsupport.impl;
|
||||
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.File;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.Writer;
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
@ -278,9 +280,9 @@ public class ModTextureDefinitionImpl implements ModTextureDefinition {
|
|||
|
||||
public void writeToFile(File destdir) throws IOException {
|
||||
File f = new File(destdir, this.modid + "-texture.txt");
|
||||
FileWriter fw = null;
|
||||
Writer fw = null;
|
||||
try {
|
||||
fw = new FileWriter(f);
|
||||
fw = new BufferedWriter(new FileWriter(f));
|
||||
// Write modname line
|
||||
String s = "modname:" + this.modid;
|
||||
fw.write(s + "\n\n");
|
||||
|
|
|
@ -22,7 +22,6 @@ import java.nio.charset.Charset;
|
|||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.logging.Logger;
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package org.dynmap.storage.aws_s3;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URI;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.security.MessageDigest;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
|
@ -139,7 +140,7 @@ public class AWSS3MapStorage extends MapStorage {
|
|||
else {
|
||||
PutObjectRequest req = PutObjectRequest.builder().bucketName(bucketname).key(baseKey).contentType(map.getImageFormat().getEncoding().getContentType())
|
||||
.addMetadata("x-dynmap-hash", Long.toHexString(hash)).addMetadata("x-dynmap-ts", Long.toString(timestamp)).build();
|
||||
s3.putObject(req, RequestBody.fromBytes(encImage.buf, encImage.len));
|
||||
s3.putObject(req, RequestBody.fromBytes(encImage.buf));
|
||||
}
|
||||
done = true;
|
||||
} catch (S3Exception x) {
|
||||
|
@ -221,7 +222,7 @@ public class AWSS3MapStorage extends MapStorage {
|
|||
}
|
||||
|
||||
private String bucketname;
|
||||
private String region;
|
||||
private Region region;
|
||||
private String access_key_id;
|
||||
private String secret_access_key;
|
||||
private String prefix;
|
||||
|
@ -248,10 +249,20 @@ public class AWSS3MapStorage extends MapStorage {
|
|||
}
|
||||
// Get our settings
|
||||
bucketname = core.configuration.getString("storage/bucketname", "dynmap");
|
||||
region = core.configuration.getString("storage/region", "us-east-1");
|
||||
access_key_id = core.configuration.getString("storage/aws_access_key_id", System.getenv("AWS_ACCESS_KEY_ID"));
|
||||
secret_access_key = core.configuration.getString("storage/aws_secret_access_key", System.getenv("AWS_SECRET_ACCESS_KEY"));
|
||||
prefix = core.configuration.getString("storage/prefix", "");
|
||||
|
||||
// Either use a custom region, or one of the default AWS regions
|
||||
String region_name = core.configuration.getString("storage/region", "us-east-1");
|
||||
String region_endpoint = core.configuration.getString("storage/override_endpoint", "");
|
||||
|
||||
if (region_endpoint.length() > 0) {
|
||||
region = Region.of(region_name, URI.create(region_endpoint));
|
||||
} else {
|
||||
region = Region.fromString(region_name);
|
||||
}
|
||||
|
||||
if ((prefix.length() > 0) && (prefix.charAt(prefix.length()-1) != '/')) {
|
||||
prefix += '/';
|
||||
}
|
||||
|
@ -518,7 +529,7 @@ public class AWSS3MapStorage extends MapStorage {
|
|||
}
|
||||
else {
|
||||
PutObjectRequest req = PutObjectRequest.builder().bucketName(bucketname).key(baseKey).contentType("image/png").build();
|
||||
s3.putObject(req, RequestBody.fromBytes(encImage.buf, encImage.len));
|
||||
s3.putObject(req, RequestBody.fromBytes(encImage.buf));
|
||||
}
|
||||
done = true;
|
||||
} catch (S3Exception x) {
|
||||
|
@ -571,7 +582,7 @@ public class AWSS3MapStorage extends MapStorage {
|
|||
}
|
||||
else {
|
||||
PutObjectRequest req = PutObjectRequest.builder().bucketName(bucketname).key(baseKey).contentType("image/png").build();
|
||||
s3.putObject(req, RequestBody.fromBytes(encImage.buf, encImage.len));
|
||||
s3.putObject(req, RequestBody.fromBytes(encImage.buf));
|
||||
}
|
||||
done = true;
|
||||
} catch (S3Exception x) {
|
||||
|
@ -734,7 +745,7 @@ public class AWSS3MapStorage extends MapStorage {
|
|||
ct = "application/x-javascript";
|
||||
}
|
||||
PutObjectRequest req = PutObjectRequest.builder().bucketName(bucketname).key(baseKey).contentType(ct).build();
|
||||
s3.putObject(req, RequestBody.fromBytes(content.buf, content.len));
|
||||
s3.putObject(req, RequestBody.fromBytes(content.buf));
|
||||
standalone_cache.put(fileid, digest);
|
||||
}
|
||||
done = true;
|
||||
|
@ -763,7 +774,7 @@ public class AWSS3MapStorage extends MapStorage {
|
|||
if (cpoolCount < POOLSIZE) { // Still more we can have
|
||||
c = new DefaultS3ClientBuilder()
|
||||
.credentialsProvider(() -> AwsBasicCredentials.create(access_key_id, secret_access_key))
|
||||
.region(Region.fromString(region))
|
||||
.region(region)
|
||||
.httpClient(URLConnectionSdkHttpClient.create())
|
||||
.build();
|
||||
if (c == null) {
|
||||
|
|
|
@ -809,29 +809,21 @@ public class MySQLMapStorage extends MapStorage {
|
|||
}
|
||||
try {
|
||||
c = getConnection();
|
||||
boolean done = false;
|
||||
int limit = 100;
|
||||
int offset = 0;
|
||||
while (!done) {
|
||||
// Query tiles for given mapkey
|
||||
Statement stmt = c.createStatement();
|
||||
ResultSet rs = stmt.executeQuery(String.format("SELECT x,y,zoom,Format FROM %s WHERE MapID=%d LIMIT %d OFFSET %d;", tableTiles, mapkey, limit, offset));
|
||||
int cnt = 0;
|
||||
while (rs.next()) {
|
||||
StorageTile st = new StorageTile(world, map, rs.getInt("x"), rs.getInt("y"), rs.getInt("zoom"), var);
|
||||
final MapType.ImageEncoding encoding = MapType.ImageEncoding.fromOrd(rs.getInt("Format"));
|
||||
if(cb != null)
|
||||
cb.tileFound(st, encoding);
|
||||
if(cbBase != null && st.zoom == 0)
|
||||
cbBase.tileFound(st, encoding);
|
||||
st.cleanup();
|
||||
cnt++;
|
||||
}
|
||||
rs.close();
|
||||
stmt.close();
|
||||
if (cnt < limit) done = true;
|
||||
offset += cnt;
|
||||
Statement stmt = c.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, //we want to stream our resultset one row at a time, we are not interessted in going back
|
||||
java.sql.ResultSet.CONCUR_READ_ONLY); //since we do not handle the entire resultset in memory -> tell the statement that we are going to work read only
|
||||
stmt.setFetchSize(100); //we can change the jdbc "retrieval chunk size". Basicly we limit how much rows are kept in memory. Bigger value = less network calls to DB, but more memory consumption
|
||||
ResultSet rs = stmt.executeQuery(String.format("SELECT x,y,zoom,Format FROM %s WHERE MapID=%d;", tableTiles, mapkey)); //we do the query, but do not set any limit / offset. Since data is not kept in memory, just streamed from DB this should not be a problem, only the rows from setFetchSize are kept in memory.
|
||||
while (rs.next()) {
|
||||
StorageTile st = new StorageTile(world, map, rs.getInt("x"), rs.getInt("y"), rs.getInt("zoom"), var);
|
||||
final MapType.ImageEncoding encoding = MapType.ImageEncoding.fromOrd(rs.getInt("Format"));
|
||||
if(cb != null)
|
||||
cb.tileFound(st, encoding);
|
||||
if(cbBase != null && st.zoom == 0)
|
||||
cbBase.tileFound(st, encoding);
|
||||
st.cleanup();
|
||||
}
|
||||
rs.close();
|
||||
stmt.close();
|
||||
if(cbEnd != null)
|
||||
cbEnd.searchEnded();
|
||||
} catch (SQLException x) {
|
||||
|
|
|
@ -533,6 +533,7 @@ public class SQLiteMapStorage extends MapStorage {
|
|||
|
||||
private static Connection configureConnection(Connection conn) throws SQLException {
|
||||
final Statement statement = conn.createStatement();
|
||||
statement.execute("PRAGMA auto_vacuum = FULL;");
|
||||
statement.execute("PRAGMA journal_mode = WAL;");
|
||||
statement.close();
|
||||
return conn;
|
||||
|
|
|
@ -107,68 +107,126 @@ public class ImageIOManager {
|
|||
}
|
||||
|
||||
public static BufferOutputStream imageIOEncode(BufferedImage img, ImageFormat fmt) {
|
||||
BufferOutputStream bos = new BufferOutputStream();
|
||||
|
||||
if(isRequiredJDKVersion(17,-1,-1)){
|
||||
return imageIOEncodeUnsafe(img, fmt); //we can skip Thread safety for more performance
|
||||
}
|
||||
synchronized(imageioLock) {
|
||||
try {
|
||||
ImageIO.setUseCache(false); /* Don't use file cache - too small to be worth it */
|
||||
|
||||
fmt = validateFormat(fmt);
|
||||
|
||||
if(fmt.getEncoding() == ImageEncoding.JPG) {
|
||||
WritableRaster raster = img.getRaster();
|
||||
WritableRaster newRaster = raster.createWritableChild(0, 0, img.getWidth(),
|
||||
img.getHeight(), 0, 0, new int[] {0, 1, 2});
|
||||
DirectColorModel cm = (DirectColorModel)img.getColorModel();
|
||||
DirectColorModel newCM = new DirectColorModel(cm.getPixelSize(),
|
||||
cm.getRedMask(), cm.getGreenMask(), cm.getBlueMask());
|
||||
// now create the new buffer that is used ot write the image:
|
||||
BufferedImage rgbBuffer = new BufferedImage(newCM, newRaster, false, null);
|
||||
return imageIOEncodeUnsafe(img, fmt);
|
||||
}
|
||||
}
|
||||
private static BufferOutputStream imageIOEncodeUnsafe(BufferedImage img, ImageFormat fmt) {
|
||||
BufferOutputStream bos = new BufferOutputStream();
|
||||
try {
|
||||
ImageIO.setUseCache(false); /* Don't use file cache - too small to be worth it */
|
||||
|
||||
// Find a jpeg writer
|
||||
ImageWriter writer = null;
|
||||
Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName("jpg");
|
||||
if (iter.hasNext()) {
|
||||
writer = iter.next();
|
||||
}
|
||||
if(writer == null) {
|
||||
Log.severe("No JPEG ENCODER - Java VM does not support JPEG encoding");
|
||||
return null;
|
||||
}
|
||||
ImageWriteParam iwp = writer.getDefaultWriteParam();
|
||||
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
|
||||
iwp.setCompressionQuality(fmt.getQuality());
|
||||
fmt = validateFormat(fmt);
|
||||
|
||||
ImageOutputStream ios;
|
||||
ios = ImageIO.createImageOutputStream(bos);
|
||||
writer.setOutput(ios);
|
||||
if(fmt.getEncoding() == ImageEncoding.JPG) {
|
||||
WritableRaster raster = img.getRaster();
|
||||
WritableRaster newRaster = raster.createWritableChild(0, 0, img.getWidth(),
|
||||
img.getHeight(), 0, 0, new int[] {0, 1, 2});
|
||||
DirectColorModel cm = (DirectColorModel)img.getColorModel();
|
||||
DirectColorModel newCM = new DirectColorModel(cm.getPixelSize(),
|
||||
cm.getRedMask(), cm.getGreenMask(), cm.getBlueMask());
|
||||
// now create the new buffer that is used ot write the image:
|
||||
BufferedImage rgbBuffer = new BufferedImage(newCM, newRaster, false, null);
|
||||
|
||||
writer.write(null, new IIOImage(rgbBuffer, null, null), iwp);
|
||||
writer.dispose();
|
||||
|
||||
rgbBuffer.flush();
|
||||
// Find a jpeg writer
|
||||
ImageWriter writer = null;
|
||||
Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName("jpg");
|
||||
if (iter.hasNext()) {
|
||||
writer = iter.next();
|
||||
}
|
||||
else if (fmt.getEncoding() == ImageEncoding.WEBP) {
|
||||
doWEBPEncode(img, fmt, bos);
|
||||
if(writer == null) {
|
||||
Log.severe("No JPEG ENCODER - Java VM does not support JPEG encoding");
|
||||
return null;
|
||||
}
|
||||
else {
|
||||
ImageIO.write(img, fmt.getFileExt(), bos); /* Write to byte array stream - prevent bogus I/O errors */
|
||||
}
|
||||
} catch (IOException iox) {
|
||||
Log.info("Error encoding image - " + iox.getMessage());
|
||||
return null;
|
||||
ImageWriteParam iwp = writer.getDefaultWriteParam();
|
||||
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
|
||||
iwp.setCompressionQuality(fmt.getQuality());
|
||||
|
||||
ImageOutputStream ios;
|
||||
ios = ImageIO.createImageOutputStream(bos);
|
||||
writer.setOutput(ios);
|
||||
|
||||
writer.write(null, new IIOImage(rgbBuffer, null, null), iwp);
|
||||
writer.dispose();
|
||||
|
||||
rgbBuffer.flush();
|
||||
}
|
||||
else if (fmt.getEncoding() == ImageEncoding.WEBP) {
|
||||
doWEBPEncode(img, fmt, bos);
|
||||
}
|
||||
else {
|
||||
ImageIO.write(img, fmt.getFileExt(), bos); /* Write to byte array stream - prevent bogus I/O errors */
|
||||
}
|
||||
} catch (IOException iox) {
|
||||
Log.info("Error encoding image - " + iox.getMessage());
|
||||
return null;
|
||||
}
|
||||
return bos;
|
||||
}
|
||||
|
||||
|
||||
public static BufferedImage imageIODecode(MapStorageTile.TileRead tr) throws IOException {
|
||||
if(isRequiredJDKVersion(17,-1,-1)){
|
||||
return imageIODecodeUnsafe(tr); //we can skip Thread safety for more performance
|
||||
}
|
||||
synchronized(imageioLock) {
|
||||
ImageIO.setUseCache(false); /* Don't use file cache - too small to be worth it */
|
||||
if (tr.format == ImageEncoding.WEBP) {
|
||||
return doWEBPDecode(tr.image);
|
||||
}
|
||||
return ImageIO.read(tr.image);
|
||||
return imageIODecodeUnsafe(tr);
|
||||
}
|
||||
}
|
||||
|
||||
private static BufferedImage imageIODecodeUnsafe(MapStorageTile.TileRead tr) throws IOException {
|
||||
ImageIO.setUseCache(false); /* Don't use file cache - too small to be worth it */
|
||||
if (tr.format == ImageEncoding.WEBP) {
|
||||
return doWEBPDecode(tr.image);
|
||||
}
|
||||
return ImageIO.read(tr.image);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the current JDK is running at least a specific version
|
||||
* targetMinor and targetBuild can be set to -1, if the java.version only provides a Major release this will then only check for the major release
|
||||
* @param targetMajor the required minimum major version
|
||||
* @param targetMinor the required minimum minor version
|
||||
* @param targetBuild the required minimum build version
|
||||
* @return true if the current JDK version is the required minimum version
|
||||
*/
|
||||
private static boolean isRequiredJDKVersion(int targetMajor, int targetMinor, int targetBuild){
|
||||
String javaVersion = System.getProperty("java.version");
|
||||
String[] versionParts = javaVersion.split("\\.");
|
||||
if(versionParts.length < 3){
|
||||
if(versionParts.length == 1
|
||||
&& targetMinor == -1
|
||||
&& targetBuild == -1
|
||||
&& parseInt(versionParts[0], -1) >= targetMajor){
|
||||
return true;//we only have a major version and thats ok
|
||||
}
|
||||
return false; //can not evaluate
|
||||
}
|
||||
int major = parseInt(versionParts[0], -1);
|
||||
int minor = parseInt(versionParts[1], -1);
|
||||
int build = parseInt(versionParts[2], -1);
|
||||
if(major != -1 && major >= targetMajor &&
|
||||
minor != -1 && minor >= targetMinor &&
|
||||
build != -1 && build >= targetBuild
|
||||
){
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses a string to int, with a dynamic fallback value if not parsable
|
||||
* @param input the String to parse
|
||||
* @param fallback the Fallback value to use
|
||||
* @return the parsed integer or the fallback value if unparsable
|
||||
*/
|
||||
private static int parseInt(String input, int fallback){
|
||||
int output = fallback;
|
||||
try{
|
||||
output = Integer.parseInt(input);
|
||||
} catch (NumberFormatException e) {}
|
||||
return output;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -411,7 +411,7 @@
|
|||
|
||||
.dynmap .sublist .item > a {
|
||||
display: block;
|
||||
|
||||
|
||||
text-indent: -99999px;
|
||||
outline: none;
|
||||
}
|
||||
|
@ -806,10 +806,10 @@
|
|||
}
|
||||
|
||||
.chatinput {
|
||||
|
||||
position: absolute;
|
||||
width: 608px;
|
||||
height: 16px;
|
||||
|
||||
bottom: 8px;
|
||||
outline: none;
|
||||
color: #fff;
|
||||
background-color: #000000;
|
||||
|
@ -829,6 +829,9 @@
|
|||
}
|
||||
|
||||
.loginbutton {
|
||||
position: absolute;
|
||||
bottom: 0px;
|
||||
right: 4px;
|
||||
color: #000;
|
||||
font-family: sans-serif;
|
||||
font-size: 11px;
|
||||
|
|
|
@ -592,9 +592,6 @@ DynMap.prototype = {
|
|||
me.selectWorldAndPan(location.world, location, function() {
|
||||
if(completed) completed();
|
||||
});
|
||||
} else {
|
||||
var latlng = me.maptype.getProjection().fromLocationToLatLng(location);
|
||||
me.panToLatLng(latlng, completed);
|
||||
}
|
||||
},
|
||||
panToLayerPoint: function(point, completed) {
|
||||
|
@ -779,8 +776,7 @@ DynMap.prototype = {
|
|||
if (me.followingPlayer !== player) {
|
||||
me.followPlayer(null);
|
||||
}
|
||||
if(player.location.world)
|
||||
me.panToLocation(player.location);
|
||||
me.panToLocation(player.location);
|
||||
});
|
||||
player.menuname.data('sort', player.sort);
|
||||
// Inject into playerlist alphabetically
|
||||
|
|
|
@ -856,7 +856,13 @@ modellist:id=%iron_bars,state=west:false/east:false/south:false/north:false,box=
|
|||
# Fern
|
||||
# Dead shrub
|
||||
# Tall grass
|
||||
patchblock:id=fern,id=grass,id=cobweb,id=tall_grass,id=dead_bush,id=sugar_cane,patch0=VertX1Z0ToX0Z1,patch1=VertX1Z0ToX0Z1@90
|
||||
patchblock:id=fern,patch0=VertX1Z0ToX0Z1,patch1=VertX1Z0ToX0Z1@90
|
||||
[-1.20.2]patchblock:id=grass,patch0=VertX1Z0ToX0Z1,patch1=VertX1Z0ToX0Z1@90
|
||||
[1.20.3-]patchblock:id=short_grass,patch0=VertX1Z0ToX0Z1,patch1=VertX1Z0ToX0Z1@90
|
||||
patchblock:id=cobweb,patch0=VertX1Z0ToX0Z1,patch1=VertX1Z0ToX0Z1@90
|
||||
patchblock:id=tall_grass,patch0=VertX1Z0ToX0Z1,patch1=VertX1Z0ToX0Z1@90
|
||||
patchblock:id=dead_bush,patch0=VertX1Z0ToX0Z1,patch1=VertX1Z0ToX0Z1@90
|
||||
patchblock:id=sugar_cane,patch0=VertX1Z0ToX0Z1,patch1=VertX1Z0ToX0Z1@90
|
||||
|
||||
# Seagrass
|
||||
# Tall seagrass
|
||||
|
@ -3435,3 +3441,25 @@ modellist:id=%dropper,state=facing:down,box=0.000000/0.000000/0.000000:16.000000
|
|||
[1.20-]modellist:id=%calibrated_sculk_sensor,state=facing:east/sculk_sensor_phase:inactive,box=0.000000/0.000000/0.000000:16.000000/8.000000/16.000000:n/2/0.000000/8.000000/16.000000/16.000000:w/2/0.000000/8.000000/16.000000/16.000000:s/0/0.000000/8.000000/16.000000/16.000000:d/1/0.000000/0.000000/16.000000/16.000000:e/2/0.000000/8.000000/16.000000/16.000000:u/3/0.000000/0.000000/16.000000/16.000000:R/0/90/0,box=-1.000000/8.000000/3.000000:7.000000/16.000000/3.000000/0.000000/45.000000/0.000000/3.000000/12.000000/3.000000:n/4/4.000000/8.000000/12.000000/16.000000:s/4/12.000000/8.000000/4.000000/16.000000:R/0/90/0,box=9.000000/8.000000/3.000000:17.000000/16.000000/3.000000/0.000000/-45.000000/0.000000/13.000000/12.000000/3.000000:n/4/12.000000/8.000000/4.000000/16.000000:s/4/4.000000/8.000000/12.000000/16.000000:R/0/90/0,box=9.000000/8.000000/13.000000:17.000000/16.000000/13.000000/0.000000/45.000000/0.000000/13.000000/12.000000/13.000000:n/4/12.000000/8.000000/4.000000/16.000000:s/4/4.000000/8.000000/12.000000/16.000000:R/0/90/0,box=-1.000000/8.000000/13.000000:7.000000/16.000000/13.000000/0.000000/-45.000000/0.000000/3.000000/12.000000/13.000000:n/4/4.000000/8.000000/12.000000/16.000000:s/4/12.000000/8.000000/4.000000/16.000000:R/0/90/0,box=8.000000/8.000000/0.000000/false:8.000000/20.000000/16.000000/0.000000/45.000000/0.000000/8.000000/9.000000/8.000000:w/5/0.000000/4.000000/16.000000/16.000000:e/5/0.000000/4.000000/16.000000/16.000000:R/0/90/0,box=0.000000/8.000000/8.000000/false:16.000000/20.000000/8.000000/0.000000/45.000000/0.000000/8.000000/9.000000/8.000000:n/5/0.000000/4.000000/16.000000/16.000000:s/5/0.000000/4.000000/16.000000/16.000000:R/0/90/0
|
||||
[1.20-]modellist:id=%calibrated_sculk_sensor,state=facing:east/sculk_sensor_phase:active,box=0.000000/0.000000/0.000000:16.000000/8.000000/16.000000:n/2/0.000000/8.000000/16.000000/16.000000:w/2/0.000000/8.000000/16.000000/16.000000:s/0/0.000000/8.000000/16.000000/16.000000:d/1/0.000000/0.000000/16.000000/16.000000:e/2/0.000000/8.000000/16.000000/16.000000:u/3/0.000000/0.000000/16.000000/16.000000:R/0/90/0,box=-1.000000/8.000000/3.000000:7.000000/16.000000/3.000000/0.000000/45.000000/0.000000/3.000000/12.000000/3.000000:n/4/4.000000/8.000000/12.000000/16.000000:s/4/12.000000/8.000000/4.000000/16.000000:R/0/90/0,box=9.000000/8.000000/3.000000:17.000000/16.000000/3.000000/0.000000/-45.000000/0.000000/13.000000/12.000000/3.000000:n/4/12.000000/8.000000/4.000000/16.000000:s/4/4.000000/8.000000/12.000000/16.000000:R/0/90/0,box=9.000000/8.000000/13.000000:17.000000/16.000000/13.000000/0.000000/45.000000/0.000000/13.000000/12.000000/13.000000:n/4/12.000000/8.000000/4.000000/16.000000:s/4/4.000000/8.000000/12.000000/16.000000:R/0/90/0,box=-1.000000/8.000000/13.000000:7.000000/16.000000/13.000000/0.000000/-45.000000/0.000000/3.000000/12.000000/13.000000:n/4/4.000000/8.000000/12.000000/16.000000:s/4/12.000000/8.000000/4.000000/16.000000:R/0/90/0,box=8.000000/8.000000/0.000000/false:8.000000/20.000000/16.000000/0.000000/45.000000/0.000000/8.000000/9.000000/8.000000:w/5/0.000000/4.000000/16.000000/16.000000:e/5/0.000000/4.000000/16.000000/16.000000:R/0/90/0,box=0.000000/8.000000/8.000000/false:16.000000/20.000000/8.000000/0.000000/45.000000/0.000000/8.000000/9.000000/8.000000:n/5/0.000000/4.000000/16.000000/16.000000:s/5/0.000000/4.000000/16.000000/16.000000:R/0/90/0
|
||||
[1.20-]modellist:id=%calibrated_sculk_sensor,state=facing:east/sculk_sensor_phase:cooldown,box=0.000000/0.000000/0.000000:16.000000/8.000000/16.000000:n/2/0.000000/8.000000/16.000000/16.000000:w/2/0.000000/8.000000/16.000000/16.000000:s/0/0.000000/8.000000/16.000000/16.000000:d/1/0.000000/0.000000/16.000000/16.000000:e/2/0.000000/8.000000/16.000000/16.000000:u/3/0.000000/0.000000/16.000000/16.000000:R/0/90/0,box=-1.000000/8.000000/3.000000:7.000000/16.000000/3.000000/0.000000/45.000000/0.000000/3.000000/12.000000/3.000000:n/4/4.000000/8.000000/12.000000/16.000000:s/4/12.000000/8.000000/4.000000/16.000000:R/0/90/0,box=9.000000/8.000000/3.000000:17.000000/16.000000/3.000000/0.000000/-45.000000/0.000000/13.000000/12.000000/3.000000:n/4/12.000000/8.000000/4.000000/16.000000:s/4/4.000000/8.000000/12.000000/16.000000:R/0/90/0,box=9.000000/8.000000/13.000000:17.000000/16.000000/13.000000/0.000000/45.000000/0.000000/13.000000/12.000000/13.000000:n/4/12.000000/8.000000/4.000000/16.000000:s/4/4.000000/8.000000/12.000000/16.000000:R/0/90/0,box=-1.000000/8.000000/13.000000:7.000000/16.000000/13.000000/0.000000/-45.000000/0.000000/3.000000/12.000000/13.000000:n/4/4.000000/8.000000/12.000000/16.000000:s/4/12.000000/8.000000/4.000000/16.000000:R/0/90/0,box=8.000000/8.000000/0.000000/false:8.000000/20.000000/16.000000/0.000000/45.000000/0.000000/8.000000/9.000000/8.000000:w/5/0.000000/4.000000/16.000000/16.000000:e/5/0.000000/4.000000/16.000000/16.000000:R/0/90/0,box=0.000000/8.000000/8.000000/false:16.000000/20.000000/8.000000/0.000000/45.000000/0.000000/8.000000/9.000000/8.000000:n/5/0.000000/4.000000/16.000000/16.000000:s/5/0.000000/4.000000/16.000000/16.000000:R/0/90/0
|
||||
|
||||
# 1.20.3
|
||||
[1.20.3-]modellist:id=%tuff_slab,state=type:top,box=0.000000/8.000000/0.000000:16.000000/16.000000/16.000000:n/0/0.000000/0.000000/16.000000/8.000000:w/0/0.000000/0.000000/16.000000/8.000000:e/0/0.000000/0.000000/16.000000/8.000000:s/0/0.000000/0.000000/16.000000/8.000000:u/0/0.000000/0.000000/16.000000/16.000000:d/0/0.000000/0.000000/16.000000/16.000000
|
||||
[1.20.3-]modellist:id=%tuff_slab,state=type:bottom,box=0.000000/0.000000/0.000000:16.000000/8.000000/16.000000:n/0/0.000000/8.000000/16.000000/16.000000:w/0/0.000000/8.000000/16.000000/16.000000:e/0/0.000000/8.000000/16.000000/16.000000:s/0/0.000000/8.000000/16.000000/16.000000:u/0/0.000000/0.000000/16.000000/16.000000:d/0/0.000000/0.000000/16.000000/16.000000
|
||||
[1.20.3-]customblock:id=%tuff_stairs,class=org.dynmap.hdmap.renderer.StairStateRenderer
|
||||
[1.20.3-]customblock:id=%tuff_wall,class=org.dynmap.hdmap.renderer.FenceWallBlockStateRenderer,type=tallwall
|
||||
[1.20.3-]modellist:id=%polished_tuff_slab,state=type:top,box=0.000000/8.000000/0.000000:16.000000/16.000000/16.000000:n/0/0.000000/0.000000/16.000000/8.000000:w/0/0.000000/0.000000/16.000000/8.000000:e/0/0.000000/0.000000/16.000000/8.000000:s/0/0.000000/0.000000/16.000000/8.000000:u/0/0.000000/0.000000/16.000000/16.000000:d/0/0.000000/0.000000/16.000000/16.000000
|
||||
[1.20.3-]modellist:id=%polished_tuff_slab,state=type:bottom,box=0.000000/0.000000/0.000000:16.000000/8.000000/16.000000:n/0/0.000000/8.000000/16.000000/16.000000:w/0/0.000000/8.000000/16.000000/16.000000:e/0/0.000000/8.000000/16.000000/16.000000:s/0/0.000000/8.000000/16.000000/16.000000:u/0/0.000000/0.000000/16.000000/16.000000:d/0/0.000000/0.000000/16.000000/16.000000
|
||||
[1.20.3-]customblock:id=%polished_tuff_stairs,class=org.dynmap.hdmap.renderer.StairStateRenderer
|
||||
[1.20.3-]customblock:id=%polished_tuff_wall,class=org.dynmap.hdmap.renderer.FenceWallBlockStateRenderer,type=tallwall
|
||||
[1.20.3-]customblock:id=%polished_tuff_stairs,class=org.dynmap.hdmap.renderer.StairStateRenderer
|
||||
[1.20.3-]customblock:id=%polished_tuff_wall,class=org.dynmap.hdmap.renderer.FenceWallBlockStateRenderer,type=tallwall
|
||||
[1.20.3-]customblock:id=%copper_door,id=%exposed_copper_door,id=%oxidized_copper_door,id=%weathered_copper_door,class=org.dynmap.hdmap.renderer.DoorStateRenderer
|
||||
[1.20.3-]customblock:id=%waxed_copper_door,id=%waxed_exposed_copper_door,id=%waxed_oxidized_copper_door,id=%waxed_weathered_copper_door,class=org.dynmap.hdmap.renderer.DoorStateRenderer
|
||||
|
||||
[1.20.3-]boxblock:id=%copper_trapdoor,id=%waxed_copper_trapdoor,id=%exposed_copper_trapdoor,id=%waxed_exposed_copper_trapdoor,id=%oxidized_copper_trapdoor,id=%waxed_oxidized_copper_trapdoor,id=%weathered_copper_trapdoor,id=%waxed_weathered_copper_trapdoor,data=12-15,data=28-31,data=44-47,data=60-63,ymax=0.1875
|
||||
[1.20.3-]boxblock:id=%copper_trapdoor,id=%waxed_copper_trapdoor,id=%exposed_copper_trapdoor,id=%waxed_exposed_copper_trapdoor,id=%oxidized_copper_trapdoor,id=%waxed_oxidized_copper_trapdoor,id=%weathered_copper_trapdoor,id=%waxed_weathered_copper_trapdoor,data=32-35,data=40-44,xmin=0.8125
|
||||
[1.20.3-]boxblock:id=%copper_trapdoor,id=%waxed_copper_trapdoor,id=%exposed_copper_trapdoor,id=%waxed_exposed_copper_trapdoor,id=%oxidized_copper_trapdoor,id=%waxed_oxidized_copper_trapdoor,id=%weathered_copper_trapdoor,id=%waxed_weathered_copper_trapdoor,data=48-51,data=56-59,xmax=0.1875
|
||||
[1.20.3-]boxblock:id=%copper_trapdoor,id=%waxed_copper_trapdoor,id=%exposed_copper_trapdoor,id=%waxed_exposed_copper_trapdoor,id=%oxidized_copper_trapdoor,id=%waxed_oxidized_copper_trapdoor,id=%weathered_copper_trapdoor,id=%waxed_weathered_copper_trapdoor,data=16-19,data=24-27,zmax=0.1875
|
||||
[1.20.3-]boxblock:id=%copper_trapdoor,id=%waxed_copper_trapdoor,id=%exposed_copper_trapdoor,id=%waxed_exposed_copper_trapdoor,id=%oxidized_copper_trapdoor,id=%waxed_oxidized_copper_trapdoor,id=%weathered_copper_trapdoor,id=%waxed_weathered_copper_trapdoor,data=0-3,data=8-11,zmin=0.8125
|
||||
[1.20.3-]boxblock:id=%copper_trapdoor,id=%waxed_copper_trapdoor,id=%exposed_copper_trapdoor,id=%waxed_exposed_copper_trapdoor,id=%oxidized_copper_trapdoor,id=%waxed_oxidized_copper_trapdoor,id=%weathered_copper_trapdoor,id=%waxed_weathered_copper_trapdoor,data=4-7,data=20-23,data=36-39,data=52-55,ymin=0.8125
|
||||
|
||||
|
|
|
@ -814,7 +814,8 @@ block:id=detector_rail,state=powered:false,patch0=0:detector_rail,transparency=T
|
|||
# Web
|
||||
block:id=cobweb,patch0-1=0:cobweb,transparency=TRANSPARENT
|
||||
# Grass
|
||||
block:id=grass,patch0-1=1000:grass,transparency=TRANSPARENT
|
||||
[-1.20.2]block:id=grass,patch0-1=1000:grass,transparency=TRANSPARENT
|
||||
[1.20.3-]block:id=short_grass,patch0-1=1000:grass,transparency=TRANSPARENT
|
||||
# Fern
|
||||
block:id=fern,patch0-1=1000:fern,transparency=TRANSPARENT
|
||||
# Dead shrub
|
||||
|
@ -4513,3 +4514,88 @@ block:id=%melon_stem,patch0=0:melon_stem,blockcolor=foliagebiome,transparency=TR
|
|||
[1.20-]block:id=%calibrated_sculk_sensor,state=facing:east/sculk_sensor_phase:inactive,patch0=0:calibrated_sculk_sensor_input_side,patch1=0:sculk_sensor_bottom,patch2=0:sculk_sensor_side,patch3=0:calibrated_sculk_sensor_top,patch4=0:sculk_sensor_tendril_inactive,patch5=0:calibrated_sculk_sensor_amethyst,transparency=SEMITRANSPARENT,stdrot=true
|
||||
[1.20-]block:id=%calibrated_sculk_sensor,state=facing:east/sculk_sensor_phase:active,patch0=0:calibrated_sculk_sensor_input_side,patch1=0:sculk_sensor_bottom,patch2=0:sculk_sensor_side,patch3=0:calibrated_sculk_sensor_top,patch4=0:sculk_sensor_tendril_active,patch5=0:calibrated_sculk_sensor_amethyst,transparency=SEMITRANSPARENT,stdrot=true
|
||||
[1.20-]block:id=%calibrated_sculk_sensor,state=facing:east/sculk_sensor_phase:cooldown,patch0=0:calibrated_sculk_sensor_input_side,patch1=0:sculk_sensor_bottom,patch2=0:sculk_sensor_side,patch3=0:calibrated_sculk_sensor_top,patch4=0:sculk_sensor_tendril_active,patch5=0:calibrated_sculk_sensor_amethyst,transparency=SEMITRANSPARENT,stdrot=true
|
||||
|
||||
# 1.20.3
|
||||
[1.20.3-]texture:id=suspicious_gravel_0,filename=assets/minecraft/textures/block/suspicious_gravel_0.png,xcount=1,ycount=1
|
||||
[1.20.3-]texture:id=suspicious_gravel_1,filename=assets/minecraft/textures/block/suspicious_gravel_1.png,xcount=1,ycount=1
|
||||
[1.20.3-]texture:id=suspicious_gravel_2,filename=assets/minecraft/textures/block/suspicious_gravel_2.png,xcount=1,ycount=1
|
||||
[1.20.3-]texture:id=suspicious_gravel_3,filename=assets/minecraft/textures/block/suspicious_gravel_3.png,xcount=1,ycount=1
|
||||
[1.20.3-]texture:id=tuff,filename=assets/minecraft/textures/block/tuff.png,xcount=1,ycount=1
|
||||
[1.20.3-]texture:id=polished_tuff,filename=assets/minecraft/textures/block/polished_tuff.png,xcount=1,ycount=1
|
||||
[1.20.3-]texture:id=chiseled_tuff,filename=assets/minecraft/textures/block/chiseled_tuff.png,xcount=1,ycount=1
|
||||
[1.20.3-]texture:id=chiseled_tuff_top,filename=assets/minecraft/textures/block/chiseled_tuff_top.png,xcount=1,ycount=1
|
||||
[1.20.3-]texture:id=tuff_bricks,filename=assets/minecraft/textures/block/tuff_bricks.png,xcount=1,ycount=1
|
||||
[1.20.3-]texture:id=chiseled_tuff_bricks,filename=assets/minecraft/textures/block/chiseled_tuff_bricks.png,xcount=1,ycount=1
|
||||
[1.20.3-]texture:id=chiseled_tuff_bricks_top,filename=assets/minecraft/textures/block/chiseled_tuff_bricks_top.png,xcount=1,ycount=1
|
||||
[1.20.3-]texture:id=oxidized_chiseled_copper,filename=assets/minecraft/textures/block/oxidized_chiseled_copper.png,xcount=1,ycount=1
|
||||
[1.20.3-]texture:id=weathered_chiseled_copper,filename=assets/minecraft/textures/block/weathered_chiseled_copper.png,xcount=1,ycount=1
|
||||
[1.20.3-]texture:id=exposed_chiseled_copper,filename=assets/minecraft/textures/block/exposed_chiseled_copper.png,xcount=1,ycount=1
|
||||
[1.20.3-]texture:id=chiseled_copper,filename=assets/minecraft/textures/block/chiseled_copper.png,xcount=1,ycount=1
|
||||
[1.20.3-]texture:id=copper_door_top,filename=assets/minecraft/textures/block/copper_door_top.png,xcount=1,ycount=1
|
||||
[1.20.3-]texture:id=copper_door_bottom,filename=assets/minecraft/textures/block/copper_door_bottom.png,xcount=1,ycount=1
|
||||
[1.20.3-]texture:id=exposed_copper_door_top,filename=assets/minecraft/textures/block/exposed_copper_door_top.png,xcount=1,ycount=1
|
||||
[1.20.3-]texture:id=exposed_copper_door_bottom,filename=assets/minecraft/textures/block/exposed_copper_door_bottom.png,xcount=1,ycount=1
|
||||
[1.20.3-]texture:id=oxidized_copper_door_top,filename=assets/minecraft/textures/block/oxidized_copper_door_top.png,xcount=1,ycount=1
|
||||
[1.20.3-]texture:id=oxidized_copper_door_bottom,filename=assets/minecraft/textures/block/oxidized_copper_door_bottom.png,xcount=1,ycount=1
|
||||
[1.20.3-]texture:id=weathered_copper_door_top,filename=assets/minecraft/textures/block/weathered_copper_door_top.png,xcount=1,ycount=1
|
||||
[1.20.3-]texture:id=weathered_copper_door_bottom,filename=assets/minecraft/textures/block/weathered_copper_door_bottom.png,xcount=1,ycount=1
|
||||
[1.20.3-]texture:id=copper_trapdoor,filename=assets/minecraft/textures/block/copper_trapdoor.png,xcount=1,ycount=1
|
||||
[1.20.3-]texture:id=exposed_copper_trapdoor,filename=assets/minecraft/textures/block/exposed_copper_trapdoor.png,xcount=1,ycount=1
|
||||
[1.20.3-]texture:id=oxidized_copper_trapdoor,filename=assets/minecraft/textures/block/oxidized_copper_trapdoor.png,xcount=1,ycount=1
|
||||
[1.20.3-]texture:id=weathered_copper_trapdoor,filename=assets/minecraft/textures/block/weathered_copper_trapdoor.png,xcount=1,ycount=1
|
||||
[1.20.3-]texture:id=copper_grate,filename=assets/minecraft/textures/block/copper_grate.png,xcount=1,ycount=1
|
||||
[1.20.3-]texture:id=exposed_copper_grate,filename=assets/minecraft/textures/block/exposed_copper_grate.png,xcount=1,ycount=1
|
||||
[1.20.3-]texture:id=weathered_copper_grate,filename=assets/minecraft/textures/block/weathered_copper_grate.png,xcount=1,ycount=1
|
||||
[1.20.3-]texture:id=oxidized_copper_grate,filename=assets/minecraft/textures/block/oxidized_copper_grate.png,xcount=1,ycount=1
|
||||
[1.20.3-]block:id=%suspicious_gravel,state=dusted:0,patch0=0:suspicious_gravel_0,patch1=0:suspicious_gravel_0,patch2=0:suspicious_gravel_0,patch3=0:suspicious_gravel_0,patch4=0:suspicious_gravel_0,patch5=0:suspicious_gravel_0,stdrot=true
|
||||
[1.20.3-]block:id=%suspicious_gravel,state=dusted:1,patch0=0:suspicious_gravel_1,patch1=0:suspicious_gravel_1,patch2=0:suspicious_gravel_1,patch3=0:suspicious_gravel_1,patch4=0:suspicious_gravel_1,patch5=0:suspicious_gravel_1,stdrot=true
|
||||
[1.20.3-]block:id=%suspicious_gravel,state=dusted:2,patch0=0:suspicious_gravel_2,patch1=0:suspicious_gravel_2,patch2=0:suspicious_gravel_2,patch3=0:suspicious_gravel_2,patch4=0:suspicious_gravel_2,patch5=0:suspicious_gravel_2,stdrot=true
|
||||
[1.20.3-]block:id=%suspicious_gravel,state=dusted:3,patch0=0:suspicious_gravel_3,patch1=0:suspicious_gravel_3,patch2=0:suspicious_gravel_3,patch3=0:suspicious_gravel_3,patch4=0:suspicious_gravel_3,patch5=0:suspicious_gravel_3,stdrot=true
|
||||
[1.20.3-]block:id=%tuff,patch0-5=0:tuff,stdrot=true
|
||||
[1.20.3-]block:id=%tuff_slab,state=type:top,patch0=0:tuff,transparency=SEMITRANSPARENT,stdrot=true
|
||||
[1.20.3-]block:id=%tuff_slab,state=type:bottom,patch0=0:tuff,transparency=SEMITRANSPARENT,stdrot=true
|
||||
[1.20.3-]block:id=%tuff_slab,state=type:double,patch0-5=0:tuff,transparency=SEMITRANSPARENT,stdrot=true
|
||||
[1.20.3-]block:id=%tuff_stairs,patch0-2=0:tuff,transparency=SEMITRANSPARENT,stdrot=true
|
||||
[1.20.3-]block:id=%tuff_wall,patch0-2=0:tuff,transparency=SEMITRANSPARENT,stdrot=true
|
||||
[1.20.3-]block:id=%polished_tuff,patch0-5=0:polished_tuff,stdrot=true
|
||||
[1.20.3-]block:id=%polished_tuff_slab,state=type:top,patch0=0:polished_tuff,transparency=SEMITRANSPARENT,stdrot=true
|
||||
[1.20.3-]block:id=%polished_tuff_slab,state=type:bottom,patch0=0:polished_tuff,transparency=SEMITRANSPARENT,stdrot=true
|
||||
[1.20.3-]block:id=%polished_tuff_slab,state=type:double,patch0-5=0:polished_tuff,transparency=SEMITRANSPARENT,stdrot=true
|
||||
[1.20.3-]block:id=%polished_tuff_stairs,patch0-2=0:polished_tuff,transparency=SEMITRANSPARENT,stdrot=true
|
||||
[1.20.3-]block:id=%polished_tuff_wall,patch0-2=0:polished_tuff,transparency=SEMITRANSPARENT,stdrot=true
|
||||
[1.20.3-]block:id=%chiseled_tuff,patch0=0:chiseled_tuff,patch1=0:chiseled_tuff_top,patch2=0:chiseled_tuff,patch3=0:chiseled_tuff,patch4=0:chiseled_tuff_top,patch5=0:chiseled_tuff,stdrot=true
|
||||
[1.20.3-]block:id=%tuff_bricks,patch0-5=0:tuff_bricks,stdrot=true
|
||||
[1.20.3-]block:id=%tuff_brick_slab,state=type:top,patch0=0:tuff_bricks,transparency=SEMITRANSPARENT,stdrot=true
|
||||
[1.20.3-]block:id=%tuff_brick_slab,state=type:bottom,patch0=0:tuff_bricks,transparency=SEMITRANSPARENT,stdrot=true
|
||||
[1.20.3-]block:id=%tuff_brick_slab,state=type:double,patch0-5=0:tuff_bricks,transparency=SEMITRANSPARENT,stdrot=true
|
||||
[1.20.3-]block:id=%tuff_brick_stairs,patch0-2=0:tuff_bricks,transparency=SEMITRANSPARENT,stdrot=true
|
||||
[1.20.3-]block:id=%tuff_brick_wall,patch0-2=0:tuff_bricks,transparency=SEMITRANSPARENT,stdrot=true
|
||||
[1.20.3-]block:id=%chiseled_tuff_bricks,patch0-5=0:chiseled_tuff_bricks,stdrot=true
|
||||
[1.20.3-]block:id=%oxidized_chiseled_copper,patch0-5=0:oxidized_chiseled_copper,stdrot=true
|
||||
[1.20.3-]block:id=%weathered_chiseled_copper,patch0-5=0:weathered_chiseled_copper,stdrot=true
|
||||
[1.20.3-]block:id=%exposed_chiseled_copper,patch0-5=0:exposed_chiseled_copper,stdrot=true
|
||||
[1.20.3-]block:id=%chiseled_copper,patch0-5=0:chiseled_copper,stdrot=true
|
||||
[1.20.3-]block:id=%waxed_oxidized_chiseled_copper,patch0-5=0:oxidized_chiseled_copper,stdrot=true
|
||||
[1.20.3-]block:id=%waxed_weathered_chiseled_copper,patch0-5=0:weathered_chiseled_copper,stdrot=true
|
||||
[1.20.3-]block:id=%waxed_exposed_chiseled_copper,patch0-5=0:exposed_chiseled_copper,stdrot=true
|
||||
[1.20.3-]block:id=%waxed_chiseled_copper,patch0-5=0:chiseled_copper,stdrot=true
|
||||
[1.20.3-]block:id=%copper_door,data=*,patch0=0:copper_door_top,patch1=0:copper_door_bottom,transparency=TRANSPARENT
|
||||
[1.20.3-]block:id=%exposed_copper_door,data=*,patch0=0:exposed_copper_door_top,patch1=0:exposed_copper_door_bottom,transparency=TRANSPARENT
|
||||
[1.20.3-]block:id=%oxidized_copper_door,data=*,patch0=0:oxidized_copper_door_top,patch1=0:oxidized_copper_door_bottom,transparency=TRANSPARENT
|
||||
[1.20.3-]block:id=%weathered_copper_door,data=*,patch0=0:weathered_copper_door_top,patch1=0:weathered_copper_door_bottom,transparency=TRANSPARENT
|
||||
[1.20.3-]block:id=%waxed_copper_door,data=*,patch0=0:copper_door_top,patch1=0:copper_door_bottom,transparency=TRANSPARENT
|
||||
[1.20.3-]block:id=%waxed_exposed_copper_door,data=*,patch0=0:exposed_copper_door_top,patch1=0:exposed_copper_door_bottom,transparency=TRANSPARENT
|
||||
[1.20.3-]block:id=%waxed_oxidized_copper_door,data=*,patch0=0:oxidized_copper_door_top,patch1=0:oxidized_copper_door_bottom,transparency=TRANSPARENT
|
||||
[1.20.3-]block:id=%waxed_weathered_copper_door,data=*,patch0=0:weathered_copper_door_top,patch1=0:weathered_copper_door_bottom,transparency=TRANSPARENT
|
||||
[1.20.3-]block:id=%copper_trapdoor,id=%waxed_copper_trapdoor,allfaces=0:copper_trapdoor,stdrot=true,transparency=TRANSPARENT
|
||||
[1.20.3-]block:id=%exposed_copper_trapdoor,id=%waxed_exposed_copper_trapdoor,allfaces=0:exposed_copper_trapdoor,stdrot=true,transparency=TRANSPARENT
|
||||
[1.20.3-]block:id=%oxidized_copper_trapdoor,id=%waxed_oxidized_copper_trapdoor,allfaces=0:oxidized_copper_trapdoor,stdrot=true,transparency=TRANSPARENT
|
||||
[1.20.3-]block:id=%weathered_copper_trapdoor,id=%waxed_weathered_copper_trapdoor,allfaces=0:weathered_copper_trapdoor,stdrot=true,transparency=TRANSPARENT
|
||||
[1.20.3-]block:id=%copper_grate,patch0-5=0:copper_grate,transparency=TRANSPARENT,stdrot=true
|
||||
[1.20.3-]block:id=%exposed_copper_grate,patch0-5=0:exposed_copper_grate,transparency=TRANSPARENT,stdrot=true
|
||||
[1.20.3-]block:id=%weathered_copper_grate,patch0-5=0:weathered_copper_grate,transparency=TRANSPARENT,stdrot=true
|
||||
[1.20.3-]block:id=%oxidized_copper_grate,patch0-5=0:oxidized_copper_grate,transparency=TRANSPARENT,stdrot=true
|
||||
[1.20.3-]block:id=%waxed_copper_grate,patch0-5=0:copper_grate,transparency=TRANSPARENT,stdrot=true
|
||||
[1.20.3-]block:id=%waxed_exposed_copper_grate,patch0-5=0:exposed_copper_grate,transparency=TRANSPARENT,stdrot=true
|
||||
[1.20.3-]block:id=%waxed_weathered_copper_grate,patch0-5=0:weathered_copper_grate,transparency=TRANSPARENT,stdrot=true
|
||||
[1.20.3-]block:id=%waxed_oxidized_copper_grate,patch0-5=0:oxidized_copper_grate,transparency=TRANSPARENT,stdrot=true
|
||||
|
|
Before Width: | Height: | Size: 252 B After Width: | Height: | Size: 219 B |
Before Width: | Height: | Size: 264 B After Width: | Height: | Size: 233 B |
Before Width: | Height: | Size: 249 B After Width: | Height: | Size: 210 B |
Before Width: | Height: | Size: 259 B After Width: | Height: | Size: 193 B |
Before Width: | Height: | Size: 301 B After Width: | Height: | Size: 243 B |
Before Width: | Height: | Size: 269 B After Width: | Height: | Size: 202 B |
Before Width: | Height: | Size: 232 B After Width: | Height: | Size: 204 B |
Before Width: | Height: | Size: 294 B After Width: | Height: | Size: 242 B |
Before Width: | Height: | Size: 295 B After Width: | Height: | Size: 243 B |
Before Width: | Height: | Size: 284 B After Width: | Height: | Size: 212 B |
Before Width: | Height: | Size: 249 B After Width: | Height: | Size: 215 B |
Before Width: | Height: | Size: 276 B After Width: | Height: | Size: 207 B |
Before Width: | Height: | Size: 298 B After Width: | Height: | Size: 222 B |
Before Width: | Height: | Size: 260 B After Width: | Height: | Size: 198 B |
Before Width: | Height: | Size: 236 B After Width: | Height: | Size: 170 B |
Before Width: | Height: | Size: 201 B After Width: | Height: | Size: 192 B |
Before Width: | Height: | Size: 146 B After Width: | Height: | Size: 144 B |
Before Width: | Height: | Size: 265 B After Width: | Height: | Size: 209 B |
Before Width: | Height: | Size: 287 B After Width: | Height: | Size: 248 B |
Before Width: | Height: | Size: 235 B After Width: | Height: | Size: 201 B |
Before Width: | Height: | Size: 251 B After Width: | Height: | Size: 184 B |
Before Width: | Height: | Size: 299 B After Width: | Height: | Size: 219 B |
Before Width: | Height: | Size: 198 B After Width: | Height: | Size: 166 B |
Before Width: | Height: | Size: 327 B After Width: | Height: | Size: 244 B |
Before Width: | Height: | Size: 304 B After Width: | Height: | Size: 253 B |
Before Width: | Height: | Size: 295 B After Width: | Height: | Size: 249 B |
Before Width: | Height: | Size: 289 B After Width: | Height: | Size: 214 B |
Before Width: | Height: | Size: 213 B After Width: | Height: | Size: 153 B |
Before Width: | Height: | Size: 213 B After Width: | Height: | Size: 153 B |
Before Width: | Height: | Size: 290 B After Width: | Height: | Size: 255 B |
Before Width: | Height: | Size: 303 B After Width: | Height: | Size: 230 B |
Before Width: | Height: | Size: 274 B After Width: | Height: | Size: 225 B |
Before Width: | Height: | Size: 255 B After Width: | Height: | Size: 232 B |
Before Width: | Height: | Size: 246 B After Width: | Height: | Size: 241 B |
Before Width: | Height: | Size: 279 B After Width: | Height: | Size: 203 B |
Before Width: | Height: | Size: 323 B After Width: | Height: | Size: 261 B |
Before Width: | Height: | Size: 270 B After Width: | Height: | Size: 214 B |
Before Width: | Height: | Size: 258 B After Width: | Height: | Size: 205 B |
Before Width: | Height: | Size: 243 B After Width: | Height: | Size: 203 B |
Before Width: | Height: | Size: 223 B After Width: | Height: | Size: 193 B |
Before Width: | Height: | Size: 256 B After Width: | Height: | Size: 187 B |
Before Width: | Height: | Size: 279 B After Width: | Height: | Size: 211 B |
Before Width: | Height: | Size: 211 B After Width: | Height: | Size: 198 B |
Before Width: | Height: | Size: 247 B After Width: | Height: | Size: 169 B |
Before Width: | Height: | Size: 220 B After Width: | Height: | Size: 185 B |
Before Width: | Height: | Size: 286 B After Width: | Height: | Size: 237 B |
Before Width: | Height: | Size: 315 B After Width: | Height: | Size: 249 B |
Before Width: | Height: | Size: 243 B After Width: | Height: | Size: 208 B |
Before Width: | Height: | Size: 220 B After Width: | Height: | Size: 185 B |
Before Width: | Height: | Size: 216 B After Width: | Height: | Size: 181 B |
Before Width: | Height: | Size: 250 B After Width: | Height: | Size: 207 B |
Before Width: | Height: | Size: 291 B After Width: | Height: | Size: 243 B |
Before Width: | Height: | Size: 247 B After Width: | Height: | Size: 207 B |
Before Width: | Height: | Size: 198 B After Width: | Height: | Size: 180 B |
Before Width: | Height: | Size: 219 B After Width: | Height: | Size: 200 B |
Before Width: | Height: | Size: 195 B After Width: | Height: | Size: 182 B |
Before Width: | Height: | Size: 245 B After Width: | Height: | Size: 214 B |
Before Width: | Height: | Size: 297 B After Width: | Height: | Size: 234 B |
Before Width: | Height: | Size: 274 B After Width: | Height: | Size: 230 B |
Before Width: | Height: | Size: 231 B After Width: | Height: | Size: 198 B |
Before Width: | Height: | Size: 266 B After Width: | Height: | Size: 208 B |
Before Width: | Height: | Size: 298 B After Width: | Height: | Size: 239 B |
Before Width: | Height: | Size: 268 B After Width: | Height: | Size: 202 B |
Before Width: | Height: | Size: 223 B After Width: | Height: | Size: 196 B |
Before Width: | Height: | Size: 310 B After Width: | Height: | Size: 248 B |
Before Width: | Height: | Size: 228 B After Width: | Height: | Size: 172 B |
Before Width: | Height: | Size: 349 B After Width: | Height: | Size: 285 B |
Before Width: | Height: | Size: 266 B After Width: | Height: | Size: 256 B |
Before Width: | Height: | Size: 350 B After Width: | Height: | Size: 334 B |
Before Width: | Height: | Size: 417 B After Width: | Height: | Size: 364 B |
Before Width: | Height: | Size: 290 B After Width: | Height: | Size: 204 B |
Before Width: | Height: | Size: 288 B After Width: | Height: | Size: 195 B |