Compare commits

...

72 Commits
v3.6 ... v3.0

Author SHA1 Message Date
Michael Primm b434f09035 Band-aid up Forge 1.12.2 build 2024-04-29 15:06:37 -05:00
Michael Primm e21198d279 Back to SNAPSHOT 2024-04-28 15:30:36 -05:00
Michael Primm 1d6346b580 Handle tile entity lookup in 1.20.5 2024-04-28 14:01:07 -05:00
Michael Primm e086930133 Update README 2024-04-26 23:12:08 -05:00
Michael Primm 27526e64e5 Migrate to Gradle 8.7, JDK 21 compiler 2024-04-26 22:51:32 -05:00
Michael Primm 21369ec485 Migrate to Gradle 8.7 2024-04-26 22:50:43 -05:00
Michael Primm 120889b500 Merge branch 'v3.0' of git@github-home:webbukkit/dynmap.git into v3.0 2024-04-26 20:54:54 -05:00
Michael Primm 669c75322a Start 1.20.5 code 2024-04-26 20:54:41 -05:00
mikeprimm ea24554033
Merge pull request #4056 from JurgenKuyper/patch-2
Update DynmapBlockState.java
2024-01-23 09:26:06 -06:00
JurgenKuyper b9144e3609
Update DynmapBlockState.java
also hide nether_quartz_ore if hideores is true
2024-01-22 21:11:43 +01:00
Michael Primm 9878719337 Drop older 1.19 Forge and Fabric builds 2023-12-23 15:03:35 -06:00
Michael Primm 6746631758 Back to SNAPSHOT 2023-12-23 14:54:30 -06:00
Michael Primm 23cd60ba0a Switch to beta-4 2023-12-23 09:57:55 -06:00
Michael Primm 328954b256 Handle bogus gamma correction on new GRAY texturepack images 2023-12-22 11:08:10 -06:00
Michael Primm 574a400ada Back to SNAPSHOT 2023-12-15 00:16:37 -06:00
Michael Primm 84ee4cdf0c Prep for 3.7-beta-3 2023-12-14 22:49:51 -06:00
Michael Primm dea6a55acd Add Fabric 1.20.4 build 2023-12-14 22:47:56 -06:00
Michael Primm 87993219bb Add 1.20.3, 1.20.4 blocks 2023-12-14 22:19:53 -06:00
Michael Primm 7cdd90768e Fix S3 PR for 1.12 build 2023-12-12 22:13:44 -06:00
mikeprimm b0e56d3e5a
Merge pull request #4030 from ChimneySwift/generic-s3
Allow generic S3 endpoints for alternative services
2023-12-12 22:02:03 -06:00
Michael Primm 20700c21b8 Fix broken spectator/invisible PR on 1.12 2023-12-12 22:00:23 -06:00
Michael Primm 85885ced0e Add spigot-1.20.4 initial support 2023-12-12 21:22:38 -06:00
mikeprimm 06fbcb8d3d
Merge pull request #4036 from ApliNi/v3.0
Fix SQLite database size keeps increasing
2023-12-12 17:58:59 -06:00
mikeprimm b181607e5a
Merge pull request #4015 from JurgenKuyper/v3.0
implemented hide if spectator
2023-12-01 14:42:45 -06:00
mikeprimm bb1438b3c4
Merge pull request #4023 from Spongecade/patch-1
Update Minecraft wiki link to new domain
2023-12-01 11:43:12 -06:00
ChimneySwift 1ba6dd4683 Bundle xml.bind as this is used by s3-lite 2023-11-17 13:21:35 +10:00
ChimneySwift d16fdc8275 Add override_endpoint setting to configuration files 2023-11-16 22:07:28 +10:00
ChimneySwift 914fc5a10c Allow for custom S3 endpoints 2023-11-16 21:56:35 +10:00
ChimneySwift a669d75de0 Update s3-lite client to 0.0.2-SNAPSHOT version 2023-11-16 21:19:16 +10:00
Jurgen bc0117ac5a implemented hideifspectator switch, fully functional 2023-10-08 11:56:41 +02:00
Spongecade 298b31cdc8
Update Minecraft wiki link to new domain
The Minecraft Fandom wiki has been forked to a new domain: minecraft.wiki. Learn more here: https://minecraft.wiki/w/Minecraft_Wiki:Moving_from_Fandom. This PR updates the old wiki link accordingly.
2023-10-05 16:19:08 -05:00
ApliNi 5244e74d47 PRAGMA auto_vacuum = FULL; 2023-10-03 18:31:51 +08:00
JurgenKuyper 0d15ee5a46
Merge branch 'webbukkit:v3.0' into v3.0 2023-10-01 10:44:26 +02:00
Michael Primm ca80758605 Back to SNAPSHOT 2023-09-28 00:37:31 -05:00
Michael Primm 96554717f1 Switch to 3.7-beta-2 2023-09-27 22:06:10 -05:00
Michael Primm c807861859 Restrict /dmarker file imports to {dynmap-directory}/import 2023-09-27 21:35:40 -05:00
Michael Primm 65cca049ac Fix running on spigot/paper 1.20, 1.20.1 2023-09-27 16:35:44 -05:00
JurgenKuyper 0ba3c8008f
Merge pull request #1 from webbukkit/v3.0
align repo
2023-09-27 22:21:33 +02:00
Jurgen 030a0e1d24 implemented hideifspectator switch, still need to test fabric/forge 2023-09-27 22:22:00 +02:00
Michael Primm 79f354b111 Switch to SecureRandom for web auth token (avoid hugely unlikely
compromise during login register process...).
2023-09-27 12:25:14 -05:00
Michael Primm 92b9016c65 Merge branch 'v3.0' of git@github-home:webbukkit/dynmap.git into v3.0 2023-09-23 18:08:33 -05:00
Michael Primm e6a18f1029 Back to SNAPSHOT 2023-09-23 18:08:23 -05:00
mikeprimm ff87b9dd3e
Merge pull request #4017 from MuriloGhignatti/patch-1
Proper error catching (regarding Quilt)
2023-09-23 18:07:13 -05:00
Michael Primm 2d723afba1 Merge branch 'v3.0' of git@github-home:webbukkit/dynmap.git into v3.0 2023-09-23 17:03:43 -05:00
Michael Primm f5d2244450 Prep for 3.7-beta-1 release 2023-09-23 17:03:32 -05:00
mikeprimm e429a53d27
Update README.md 2023-09-23 13:08:32 -05:00
Michael Primm 169bb81ca7 Add Fabric 1.20.2 initial port 2023-09-23 13:03:21 -05:00
Michael Primm 91c4b23a0e Add forge 1.20.2 2023-09-21 21:31:24 -05:00
Michael Primm e2a5fc80d3 Add spigot 1.20.2 support 2023-09-21 20:13:15 -05:00
Michael Primm 736dd5a290 Add BufferedReader 2023-09-19 21:53:01 -05:00
Michael Primm 7905f76d51 Bump to 3.7-beta-q 2023-09-18 12:55:07 -05:00
Murilo Henrique Ghignatti b97d5045b6
Proper error catching (regarding Quilt)
When the mod is loaded by quilt and you try to get the path using this method an IllegalArgumentException is thrown, I think that quilt is not loading the mod as a file so this is why you are getting this error.
2023-09-13 21:53:17 -03:00
Michael Primm 85012ae478 Add buffered stream to texture reading 2023-09-10 14:49:22 -05:00
Michael Primm d1408b7bfd Adds I/O stream buffering 2023-09-10 10:56:40 -05:00
Jurgen c093a95bc0 implemented hide if spectator 2023-09-03 12:37:58 +02:00
Michael Primm 7ed6728e34 Avoid pan to 0,0 when followed player is not visible 2023-09-02 21:11:47 -05:00
Michael Primm eed1a2b444 Make readonly survive saving (dmap commands) 2023-08-30 10:59:46 -05:00
mikeprimm b8b1e8bd4e
Merge pull request #4007 from Jameskmonger/read-only-map-option
feat: add `readonly` map option
2023-08-30 09:25:06 -05:00
Michael Primm ae164f2993 Restore normal version of chunk handler 2023-08-29 21:49:12 -05:00
mikeprimm ebb9dc00d0
Merge pull request #4011 from stormboomer/Stormboomer-Performance-MySQL-Storage
Drasticly improve zoom tile calculation for larger maps when using MySQL/MariaDB storage Engine
2023-08-29 18:32:58 -05:00
mikeprimm 31d1b400f0
Merge pull request #3990 from Thorinwasher/v3.0
Disable the plugin if on the wrong platform
2023-08-29 13:14:01 -05:00
mikeprimm 105e3887a0
Merge pull request #4005 from JurgenKuyper/v3.0
Update dynmap_style.css
2023-08-29 13:13:20 -05:00
stormboomer 0120c135c4 Added JDK 8 version compatiblity for DynmapCoreAPI.
It seems that this is missing from latest release and causes incompatiblity with older versions. This should resolve this
2023-08-29 20:07:22 +02:00
stormboomer b8166a9122 Remove thread safety implementation for java 17, since it seems to not be needed anymore and improves render time by 8-10% 2023-08-29 13:23:54 +02:00
stormboomer 247e81bc61 Drasticly improve zoom tile calculation for larger maps when using MySQL storage engine. For Larger Tables doing Limit and Offset can have a big Impact on Statement execution because it is an IO heavy task.
This fixes the issue by not doing any limit / offset on the SQL statement but instead query for all the data at once, and let the JDBC handler do the resultset handling.
This can probably be adapted for MSSQL, PostgreSQL and SQLLite.
2023-08-28 08:03:43 +02:00
James Monger fe49d37fa9 feat: update template worlds.txt 2023-08-23 07:21:34 +01:00
James Monger 20592cd805 feat: add `readonly` map option
This option will prevent the map from being updated by the renderer. It can be used if you want a "natural" map, i.e. you want to generate a map and preserve it without being updated with users buildings.
2023-08-23 07:19:03 +01:00
Michael Primm b310a57b64 Shift old spigot/paper support to dynamic load to handle pedantic Paper
loader
2023-08-20 14:38:38 -05:00
JurgenKuyper 6b3e18c351
Update dynmap_style.css
patched issue where the chatbar would drop if login or customlink was enabled, but now the custom link and login overlap if they are set to be in the same area, I don't have enough frontend-knowledge to fix this sadly.
2023-08-18 19:47:13 +02:00
Michael Primm 105d4f1b62 Update bstats library 2023-07-17 18:33:26 -05:00
Thorinwasher 2503dbfdbb Update DynmapPlugin.java 2023-07-10 11:45:27 +02:00
Michael Primm 87d8c73941 Switch to 3.7-SNAPSHOT 2023-07-08 20:09:57 -05:00
1100 changed files with 3697 additions and 8012 deletions

View File

@ -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 {

View File

@ -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());

View File

@ -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;

View File

@ -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")) {

View File

@ -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)) {

View File

@ -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);
}

View File

@ -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) {

View File

@ -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;

View File

@ -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

View File

@ -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),

View File

@ -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();

View File

@ -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);
}

View File

@ -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));
}
}

View File

@ -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);
}
}

View File

@ -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();

View File

@ -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) {

View File

@ -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;

View File

@ -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");

View File

@ -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");

View File

@ -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;

View File

@ -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) {

View File

@ -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) {

View File

@ -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;

View File

@ -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;
}
}

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 252 B

After

Width:  |  Height:  |  Size: 219 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 264 B

After

Width:  |  Height:  |  Size: 233 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 249 B

After

Width:  |  Height:  |  Size: 210 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 259 B

After

Width:  |  Height:  |  Size: 193 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 301 B

After

Width:  |  Height:  |  Size: 243 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 269 B

After

Width:  |  Height:  |  Size: 202 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 232 B

After

Width:  |  Height:  |  Size: 204 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 294 B

After

Width:  |  Height:  |  Size: 242 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 295 B

After

Width:  |  Height:  |  Size: 243 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 284 B

After

Width:  |  Height:  |  Size: 212 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 249 B

After

Width:  |  Height:  |  Size: 215 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 276 B

After

Width:  |  Height:  |  Size: 207 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 298 B

After

Width:  |  Height:  |  Size: 222 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 260 B

After

Width:  |  Height:  |  Size: 198 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 236 B

After

Width:  |  Height:  |  Size: 170 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 201 B

After

Width:  |  Height:  |  Size: 192 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 146 B

After

Width:  |  Height:  |  Size: 144 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 265 B

After

Width:  |  Height:  |  Size: 209 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 287 B

After

Width:  |  Height:  |  Size: 248 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 235 B

After

Width:  |  Height:  |  Size: 201 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 251 B

After

Width:  |  Height:  |  Size: 184 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 299 B

After

Width:  |  Height:  |  Size: 219 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 198 B

After

Width:  |  Height:  |  Size: 166 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 327 B

After

Width:  |  Height:  |  Size: 244 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 304 B

After

Width:  |  Height:  |  Size: 253 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 295 B

After

Width:  |  Height:  |  Size: 249 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 289 B

After

Width:  |  Height:  |  Size: 214 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 213 B

After

Width:  |  Height:  |  Size: 153 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 213 B

After

Width:  |  Height:  |  Size: 153 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 290 B

After

Width:  |  Height:  |  Size: 255 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 303 B

After

Width:  |  Height:  |  Size: 230 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 274 B

After

Width:  |  Height:  |  Size: 225 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 255 B

After

Width:  |  Height:  |  Size: 232 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 246 B

After

Width:  |  Height:  |  Size: 241 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 279 B

After

Width:  |  Height:  |  Size: 203 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 323 B

After

Width:  |  Height:  |  Size: 261 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 270 B

After

Width:  |  Height:  |  Size: 214 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 258 B

After

Width:  |  Height:  |  Size: 205 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 243 B

After

Width:  |  Height:  |  Size: 203 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 223 B

After

Width:  |  Height:  |  Size: 193 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 256 B

After

Width:  |  Height:  |  Size: 187 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 279 B

After

Width:  |  Height:  |  Size: 211 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 211 B

After

Width:  |  Height:  |  Size: 198 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 247 B

After

Width:  |  Height:  |  Size: 169 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 220 B

After

Width:  |  Height:  |  Size: 185 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 286 B

After

Width:  |  Height:  |  Size: 237 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 315 B

After

Width:  |  Height:  |  Size: 249 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 243 B

After

Width:  |  Height:  |  Size: 208 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 220 B

After

Width:  |  Height:  |  Size: 185 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 216 B

After

Width:  |  Height:  |  Size: 181 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 250 B

After

Width:  |  Height:  |  Size: 207 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 291 B

After

Width:  |  Height:  |  Size: 243 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 247 B

After

Width:  |  Height:  |  Size: 207 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 198 B

After

Width:  |  Height:  |  Size: 180 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 219 B

After

Width:  |  Height:  |  Size: 200 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 195 B

After

Width:  |  Height:  |  Size: 182 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 245 B

After

Width:  |  Height:  |  Size: 214 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 297 B

After

Width:  |  Height:  |  Size: 234 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 274 B

After

Width:  |  Height:  |  Size: 230 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 231 B

After

Width:  |  Height:  |  Size: 198 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 266 B

After

Width:  |  Height:  |  Size: 208 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 298 B

After

Width:  |  Height:  |  Size: 239 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 268 B

After

Width:  |  Height:  |  Size: 202 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 223 B

After

Width:  |  Height:  |  Size: 196 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 310 B

After

Width:  |  Height:  |  Size: 248 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 228 B

After

Width:  |  Height:  |  Size: 172 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 349 B

After

Width:  |  Height:  |  Size: 285 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 266 B

After

Width:  |  Height:  |  Size: 256 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 350 B

After

Width:  |  Height:  |  Size: 334 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 417 B

After

Width:  |  Height:  |  Size: 364 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 290 B

After

Width:  |  Height:  |  Size: 204 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 288 B

After

Width:  |  Height:  |  Size: 195 B

Some files were not shown because too many files have changed in this diff Show More