diff --git a/pom.xml b/pom.xml
index 361b6e43..40d89526 100644
--- a/pom.xml
+++ b/pom.xml
@@ -2,7 +2,7 @@
4.0.0
org.dynmap
dynmap
- 0.30
+ 0.29.1
dynmap
UTF-8
diff --git a/src/main/java/org/dynmap/DynmapPlugin.java b/src/main/java/org/dynmap/DynmapPlugin.java
index 880b7b80..b5e6a451 100644
--- a/src/main/java/org/dynmap/DynmapPlugin.java
+++ b/src/main/java/org/dynmap/DynmapPlugin.java
@@ -91,6 +91,11 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI {
boolean waterbiomeshading = false;
boolean fencejoin = false;
boolean bettergrass = false;
+
+ boolean usegeneratedtextures = false;
+ boolean waterlightingfix = false;
+ boolean biomeshadingfix = false;
+
public CompassMode compassmode = CompassMode.PRE19;
private int config_hashcode; /* Used to signal need to reload web configuration (world changes, config update, etc) */
private int fullrenderplayerlimit; /* Number of online players that will cause fullrender processing to pause */
@@ -255,6 +260,11 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI {
bukkitConfiguration.load();
configuration = new ConfigurationNode(bukkitConfiguration);
+ /* Add options to avoid 0.29 re-render (fixes very inconsistent with previous maps) */
+ usegeneratedtextures = configuration.getBoolean("use-generated-textures", false);
+ waterlightingfix = configuration.getBoolean("correct-water-lighting", false);
+ biomeshadingfix = configuration.getBoolean("correct-biome-shading", false);
+
/* Load block models */
HDBlockModels.loadModels(dataDirectory, configuration);
/* Load texture mappings */
@@ -282,6 +292,7 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI {
waterbiomeshading = configuration.getBoolean("waterbiomeshaded", !getServer().getVersion().contains("(MC: 1.8"));
/* Default fence-to-block-join off for 1.8, on after */
fencejoin = configuration.getBoolean("fence-to-block-join", !getServer().getVersion().contains("(MC: 1.8"));
+
/* Default compassmode to pre19, to newrose after */
String cmode = configuration.getString("compass-mode", getServer().getVersion().contains("(MC: 1.8")?"pre19":"newrose");
if(cmode.equals("newnorth"))
@@ -1894,4 +1905,15 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI {
private DynmapLocation toLoc(Location l) {
return new DynmapLocation(l.getWorld().getName(), l.getBlockX(), l.getBlockY(), l.getBlockZ());
}
+
+ public boolean useGeneratedTextures() {
+ return usegeneratedtextures;
+ }
+ public boolean waterLightingFix() {
+ return waterlightingfix;
+ }
+ public boolean biomeShadingFix() {
+ return biomeshadingfix;
+ }
+
}
diff --git a/src/main/java/org/dynmap/hdmap/HDMapManager.java b/src/main/java/org/dynmap/hdmap/HDMapManager.java
index cc40399c..b5200219 100644
--- a/src/main/java/org/dynmap/hdmap/HDMapManager.java
+++ b/src/main/java/org/dynmap/hdmap/HDMapManager.java
@@ -21,9 +21,17 @@ public class HDMapManager {
public HashSet maps = new HashSet();
public HashMap> maps_by_world_perspective = new HashMap>();
+ public static boolean usegeneratedtextures;
+ public static boolean waterlightingfix;
+ public static boolean biomeshadingfix;
+
public void loadHDShaders(DynmapPlugin plugin) {
Log.verboseinfo("Loading shaders...");
-
+
+ usegeneratedtextures = plugin.useGeneratedTextures();
+ waterlightingfix = plugin.waterLightingFix();
+ biomeshadingfix = plugin.biomeShadingFix();
+
File f = new File(plugin.getDataFolder(), "shaders.txt");
if(!plugin.updateUsingDefaultResource("/shaders.txt", f, "shaders")) {
return;
diff --git a/src/main/java/org/dynmap/hdmap/TexturePack.java b/src/main/java/org/dynmap/hdmap/TexturePack.java
index 035f23a1..9e6877e8 100644
--- a/src/main/java/org/dynmap/hdmap/TexturePack.java
+++ b/src/main/java/org/dynmap/hdmap/TexturePack.java
@@ -75,6 +75,7 @@ public class TexturePack {
private static final int COLORMOD_PINETONED = 13;
private static final int COLORMOD_BIRCHTONED = 14;
private static final int COLORMOD_LILYTONED = 15;
+ private static final int COLORMOD_OLD_WATERSHADED = 16;
/* Special tile index values */
private static final int BLOCKINDEX_BLANK = -1;
@@ -120,6 +121,8 @@ public class TexturePack {
private int terrain_width, terrain_height;
private int native_scale;
+ private int water_toned_op = COLORMOD_WATERTONED;
+
private static final int IMG_GRASSCOLOR = 0;
private static final int IMG_FOLIAGECOLOR = 1;
private static final int IMG_WATER = 2;
@@ -173,6 +176,7 @@ public class TexturePack {
for(int i = 0; i < texmaps.length; i++) {
texmaps[i] = this;
}
+
}
public HDTextureMap(List blockids, int databits, int[] faces, BlockTransparency trans, boolean userender) {
@@ -234,15 +238,20 @@ public class TexturePack {
private TexturePack(String tpname) throws FileNotFoundException {
ZipFile zf = null;
File texturedir = getTexturePackDirectory();
+ boolean use_generate = HDMapManager.usegeneratedtextures;
+ if(HDMapManager.biomeshadingfix == false)
+ water_toned_op = COLORMOD_OLD_WATERSHADED;
/* Set up for enough files */
imgs = new LoadedImage[IMG_CNT + addonfiles.size()];
/* Generate still and flowing water defaults */
- generateWater();
- generateWaterFlowing();
- generateLava();
- generateLavaFlow();
+ if(use_generate) {
+ generateWater();
+ generateWaterFlowing();
+ generateLava();
+ generateLavaFlow();
+ }
generateFire();
File f = new File(texturedir, tpname);
@@ -262,11 +271,27 @@ public class TexturePack {
}
loadTerrainPNG(is);
is.close();
- /* Patch in generated defaults */
- patchTextureWithImage(IMG_WATER, BLOCKINDEX_STATIONARYWATER);
- patchTextureWithImage(IMG_WATERMOVING, BLOCKINDEX_MOVINGWATER);
- patchTextureWithImage(IMG_LAVA, BLOCKINDEX_STATIONARYLAVA);
- patchTextureWithImage(IMG_LAVAMOVING, BLOCKINDEX_MOVINGLAVA);
+ /* If not generating water, load it */
+ if(!use_generate) {
+ ze = zf.getEntry(WATER_PNG);
+ if(ze == null) {
+ File ff = new File(texturedir, STANDARDTP + "/" + WATER_PNG);
+ is = new FileInputStream(ff);
+ }
+ else {
+ is = zf.getInputStream(ze);
+ }
+ loadImage(is, IMG_WATER);
+ patchTextureWithImage(IMG_WATER, BLOCKINDEX_STATIONARYWATER);
+ patchTextureWithImage(IMG_WATER, BLOCKINDEX_MOVINGWATER);
+ is.close();
+ }
+ else {
+ patchTextureWithImage(IMG_WATER, BLOCKINDEX_STATIONARYWATER);
+ patchTextureWithImage(IMG_WATERMOVING, BLOCKINDEX_MOVINGWATER);
+ patchTextureWithImage(IMG_LAVA, BLOCKINDEX_STATIONARYLAVA);
+ patchTextureWithImage(IMG_LAVAMOVING, BLOCKINDEX_MOVINGLAVA);
+ }
patchTextureWithImage(IMG_FIRE, BLOCKINDEX_FIRE);
/* Try to find and load misc/grasscolor.png */
@@ -365,12 +390,26 @@ public class TexturePack {
fis = new FileInputStream(f);
loadTerrainPNG(fis);
fis.close();
-
- /* Patch in generated defaults */
- patchTextureWithImage(IMG_WATER, BLOCKINDEX_STATIONARYWATER);
- patchTextureWithImage(IMG_WATERMOVING, BLOCKINDEX_MOVINGWATER);
- patchTextureWithImage(IMG_LAVA, BLOCKINDEX_STATIONARYLAVA);
- patchTextureWithImage(IMG_LAVAMOVING, BLOCKINDEX_MOVINGLAVA);
+
+ if(use_generate == false) { /* Not using generated - load water */
+ /* Check for misc/water.png */
+ f = new File(texturedir, tpname + "/" + WATER_PNG);
+ if(!f.canRead()) {
+ f = new File(texturedir, STANDARDTP + "/" + WATER_PNG);
+ }
+ fis = new FileInputStream(f);
+ loadImage(fis, IMG_WATER);
+ patchTextureWithImage(IMG_WATER, BLOCKINDEX_STATIONARYWATER);
+ patchTextureWithImage(IMG_WATER, BLOCKINDEX_MOVINGWATER);
+ fis.close();
+ }
+ else {
+ patchTextureWithImage(IMG_WATER, BLOCKINDEX_STATIONARYWATER);
+ patchTextureWithImage(IMG_WATERMOVING, BLOCKINDEX_MOVINGWATER);
+ patchTextureWithImage(IMG_LAVA, BLOCKINDEX_STATIONARYLAVA);
+ patchTextureWithImage(IMG_LAVAMOVING, BLOCKINDEX_MOVINGLAVA);
+ }
+ /* Patch in generated value */
patchTextureWithImage(IMG_FIRE, BLOCKINDEX_FIRE);
/* Check for misc/grasscolor.png */
@@ -454,6 +493,7 @@ public class TexturePack {
this.terrain_width = tp.terrain_width;
this.terrain_height = tp.terrain_height;
this.native_scale = tp.native_scale;
+ this.water_toned_op = tp.water_toned_op;
this.imgs = tp.imgs;
}
@@ -833,6 +873,27 @@ public class TexturePack {
}
}
+ /**
+ * Translate face ID - in case we've got options to fix it
+ */
+ private static int translateFaceID(int id) {
+ int f = (id / 1000);
+ switch(f) {
+ case COLORMOD_PINETONED:
+ case COLORMOD_BIRCHTONED:
+ case COLORMOD_LILYTONED:
+ if(HDMapManager.biomeshadingfix == false) {
+ id = (COLORMOD_FOLIAGETONED * 1000) + (id % 1000);
+ }
+ break;
+ case COLORMOD_WATERTONED:
+ if(HDMapManager.biomeshadingfix == false) {
+ id = (COLORMOD_OLD_WATERSHADED * 1000) + (id % 1000);
+ }
+ break;
+ }
+ return id;
+ }
/**
* Load texture pack mappings from texture.txt file
*/
@@ -909,6 +970,10 @@ public class TexturePack {
trans = BlockTransparency.OPAQUE;
Log.severe("Texture mapping has invalid transparency setting - " + av[1] + " - line " + rdr.getLineNumber() + " of " + txtname);
}
+ /* If no water lighting fix */
+ if((blkids.contains(8) || blkids.contains(9)) && (HDMapManager.waterlightingfix == false)) {
+ trans = BlockTransparency.TRANSPARENT; /* Treat water as transparent if no fix */
+ }
}
else if(av[0].equals("userenderdata")) {
userenderdata = av[1].equals("true");
@@ -934,6 +999,8 @@ public class TexturePack {
if(databits < 0) databits = 0xFFFF;
/* If we have everything, build block */
if(blkids.size() > 0) {
+ for(int i = 0; i < faces.length; i++)
+ faces[i] = translateFaceID(faces[i]);
HDTextureMap map = new HDTextureMap(blkids, databits, faces, trans, userenderdata);
map.addToTable();
cnt++;
@@ -1023,6 +1090,7 @@ public class TexturePack {
}
}
}
+
}
/* Process any ore hiding mappings */
@@ -1095,7 +1163,7 @@ public class TexturePack {
}
/* If water block, to watercolor tone op */
if((blkid == 8) || (blkid == 9)) {
- textop = COLORMOD_WATERTONED;
+ textop = water_toned_op;
}
}
@@ -1225,6 +1293,8 @@ public class TexturePack {
break;
}
break;
+ case COLORMOD_OLD_WATERSHADED:
+ break;
}
/* Read color from texture */
rslt.setARGB(texture[v*native_scale + u]);
@@ -1252,6 +1322,10 @@ public class TexturePack {
case COLORMOD_LILYTONED:
clrmult = 0xFF208030; /* from BlockLilyPad.java in MCP */
break;
+ case COLORMOD_OLD_WATERSHADED: /* Legacy water shading (wrong, but folks used it */
+ if(ss.do_water_shading)
+ li = imgs[IMG_WATERCOLOR];
+ break;
}
if(li != null) {
if((li.argb == null) || (!ss.do_biome_shading)) {
diff --git a/src/main/resources/configuration.txt b/src/main/resources/configuration.txt
index 5ea891fa..b13aa217 100644
--- a/src/main/resources/configuration.txt
+++ b/src/main/resources/configuration.txt
@@ -188,6 +188,14 @@ enabletilehash: true
# Optional - enabled BetterGrass style rendering of grass and snow block sides
#better-grass: true
+# Pre 0.29 render options - set all three to false if you want same results as 0.28 (i.e. you have existing maps and don't want to render)
+# use-generated-textures: if true, use generated textures (same as client); false is static, pre 0.29 textures
+# correct-water-lighting: if true, use corrected water lighting (same as client); false is legacy, pre 0.29 water (darker)
+# correct-biome-shading: if true, use fixed color mappings for birch, pine, lily, and proper water shading (same as client); false is pre 0.29
+use-generated-textures: true
+correct-water-lighting: true
+correct-biome-shading: true
+
# Control loading of player faces (if set to false, skins are never fetched)
#fetchskins: false