mirror of
https://github.com/encounter/dynmap.git
synced 2026-03-30 11:08:39 -07:00
Compare commits
12 Commits
modules
...
recommended
| Author | SHA1 | Date | |
|---|---|---|---|
| 3126de8eec | |||
| 4292d8540e | |||
| 0a4b1fd14b | |||
| ac1d4a8af0 | |||
| 2e5d27d0d5 | |||
| f80b456b2c | |||
| 41d1de1fbb | |||
| 274a363a97 | |||
| b0d9f5541a | |||
| 0f722da05d | |||
| af1bcd1094 | |||
| a7f0218d0f |
@@ -96,14 +96,6 @@
|
|||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
<repositories>
|
<repositories>
|
||||||
<repository>
|
|
||||||
<releases>
|
|
||||||
</releases>
|
|
||||||
<snapshots>
|
|
||||||
</snapshots>
|
|
||||||
<id>bukkit-repo</id>
|
|
||||||
<url>http://repo.bukkit.org/content/repositories/releases/</url>
|
|
||||||
</repository>
|
|
||||||
<repository>
|
<repository>
|
||||||
<releases>
|
<releases>
|
||||||
</releases>
|
</releases>
|
||||||
@@ -122,7 +114,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.bukkit</groupId>
|
<groupId>org.bukkit</groupId>
|
||||||
<artifactId>bukkit</artifactId>
|
<artifactId>bukkit</artifactId>
|
||||||
<version>1.4.7-R1.0</version>
|
<version>1.7.10-R0.1-SNAPSHOT</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>us.dynmap</groupId>
|
<groupId>us.dynmap</groupId>
|
||||||
@@ -162,5 +154,5 @@
|
|||||||
<version>2.10.1</version>
|
<version>2.10.1</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<version>2.0.0-SNAPSHOT</version>
|
<version>2.2</version>
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import org.bukkit.Server;
|
|||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.dynmap.Log;
|
import org.dynmap.Log;
|
||||||
|
import org.dynmap.utils.Polygon;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper for isolation of bukkit version specific issues
|
* Helper for isolation of bukkit version specific issues
|
||||||
@@ -142,5 +143,9 @@ public abstract class BukkitVersionHelper {
|
|||||||
/**
|
/**
|
||||||
* Get player health
|
* Get player health
|
||||||
*/
|
*/
|
||||||
public abstract int getHealth(Player p);
|
public abstract double getHealth(Player p);
|
||||||
|
/**
|
||||||
|
* Get world border
|
||||||
|
*/
|
||||||
|
public Polygon getWorldBorder(World world) { return null; }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,12 +5,14 @@ import java.lang.reflect.InvocationTargetException;
|
|||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Chunk;
|
import org.bukkit.Chunk;
|
||||||
import org.bukkit.Server;
|
import org.bukkit.Server;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
import org.dynmap.Log;
|
import org.dynmap.Log;
|
||||||
import org.dynmap.common.BiomeMap;
|
import org.dynmap.common.BiomeMap;
|
||||||
|
import org.dynmap.utils.Polygon;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper for isolation of bukkit version specific issues
|
* Helper for isolation of bukkit version specific issues
|
||||||
@@ -23,6 +25,12 @@ public class BukkitVersionHelperCB extends BukkitVersionHelperGeneric {
|
|||||||
private Field blockname;
|
private Field blockname;
|
||||||
private Field material;
|
private Field material;
|
||||||
private Method blockbyidfunc; // 1.7+ method for getting block by id
|
private Method blockbyidfunc; // 1.7+ method for getting block by id
|
||||||
|
private Method getworldborder; // 1.8+ method for getting world border
|
||||||
|
private Class<?> nmsworldborder;
|
||||||
|
private Method worldborderminx;
|
||||||
|
private Method worldbordermaxx;
|
||||||
|
private Method worldborderminz;
|
||||||
|
private Method worldbordermaxz;
|
||||||
|
|
||||||
BukkitVersionHelperCB() {
|
BukkitVersionHelperCB() {
|
||||||
}
|
}
|
||||||
@@ -58,12 +66,13 @@ public class BukkitVersionHelperCB extends BukkitVersionHelperGeneric {
|
|||||||
biomebaselist = getPrivateField(biomebase, new String[] { "biomes" }, biomebasearray);
|
biomebaselist = getPrivateField(biomebase, new String[] { "biomes" }, biomebasearray);
|
||||||
biomebasetemp = getField(biomebase, new String[] { "temperature", "F" }, float.class);
|
biomebasetemp = getField(biomebase, new String[] { "temperature", "F" }, float.class);
|
||||||
biomebasehumi = getField(biomebase, new String[] { "humidity", "G" }, float.class);
|
biomebasehumi = getField(biomebase, new String[] { "humidity", "G" }, float.class);
|
||||||
biomebaseidstring = getField(biomebase, new String[] { "y", "af" }, String.class);
|
biomebaseidstring = getField(biomebase, new String[] { "y", "af", "ah" }, String.class);
|
||||||
biomebaseid = getField(biomebase, new String[] { "id" }, int.class);
|
biomebaseid = getField(biomebase, new String[] { "id" }, int.class);
|
||||||
/* n.m.s.World */
|
/* n.m.s.World */
|
||||||
nmsworld = getNMSClass("net.minecraft.server.WorldServer");
|
nmsworld = getNMSClass("net.minecraft.server.WorldServer");
|
||||||
chunkprovserver = getNMSClass("net.minecraft.server.ChunkProviderServer");
|
chunkprovserver = getNMSClass("net.minecraft.server.ChunkProviderServer");
|
||||||
nmsw_chunkproviderserver = getField(nmsworld, new String[] { "chunkProviderServer" }, chunkprovserver);
|
nmsw_chunkproviderserver = getField(nmsworld, new String[] { "chunkProviderServer" }, chunkprovserver);
|
||||||
|
getworldborder = getMethodNoFail(nmsworld, new String[] { "af" }, nulltypes);
|
||||||
|
|
||||||
longhashset = getOBCClassNoFail("org.bukkit.craftbukkit.util.LongHashSet");
|
longhashset = getOBCClassNoFail("org.bukkit.craftbukkit.util.LongHashSet");
|
||||||
if(longhashset != null) {
|
if(longhashset != null) {
|
||||||
@@ -80,12 +89,21 @@ public class BukkitVersionHelperCB extends BukkitVersionHelperGeneric {
|
|||||||
}
|
}
|
||||||
/** n.m.s.Chunk */
|
/** n.m.s.Chunk */
|
||||||
nmschunk = getNMSClass("net.minecraft.server.Chunk");
|
nmschunk = getNMSClass("net.minecraft.server.Chunk");
|
||||||
nmsc_removeentities = getMethod(nmschunk, new String[] { "removeEntities" }, new Class[0]);
|
nmsc_removeentities = getMethod(nmschunk, new String[] { "removeEntities" }, nulltypes);
|
||||||
nmsc_tileentities = getField(nmschunk, new String[] { "tileEntities" }, Map.class);
|
nmsc_tileentities = getField(nmschunk, new String[] { "tileEntities" }, Map.class);
|
||||||
nmsc_inhabitedticks = getFieldNoFail(nmschunk, new String[] { "s", "q" }, long.class);
|
nmsc_inhabitedticks = getFieldNoFail(nmschunk, new String[] { "s", "q", "u" }, long.class);
|
||||||
if (nmsc_inhabitedticks == null) {
|
if (nmsc_inhabitedticks == null) {
|
||||||
Log.info("inhabitedTicks field not found - inhabited shader not functional");
|
Log.info("inhabitedTicks field not found - inhabited shader not functional");
|
||||||
}
|
}
|
||||||
|
/** n.m.s.WorldBorder */
|
||||||
|
nmsworldborder = getNMSClassNoFail("net.minecraft.server.WorldBorder");
|
||||||
|
if (nmsworldborder != null) {
|
||||||
|
worldborderminx = getMethod(nmsworldborder, new String[] { "b" }, nulltypes);
|
||||||
|
worldborderminz = getMethod(nmsworldborder, new String[] { "c" }, nulltypes);
|
||||||
|
worldbordermaxx = getMethod(nmsworldborder, new String[] { "d" }, nulltypes);
|
||||||
|
worldbordermaxz = getMethod(nmsworldborder, new String[] { "e" }, nulltypes);
|
||||||
|
}
|
||||||
|
|
||||||
/** nbt classes */
|
/** nbt classes */
|
||||||
nbttagcompound = getNMSClass("net.minecraft.server.NBTTagCompound");
|
nbttagcompound = getNMSClass("net.minecraft.server.NBTTagCompound");
|
||||||
nbttagbyte = getNMSClass("net.minecraft.server.NBTTagByte");
|
nbttagbyte = getNMSClass("net.minecraft.server.NBTTagByte");
|
||||||
@@ -111,9 +129,18 @@ public class BukkitVersionHelperCB extends BukkitVersionHelperGeneric {
|
|||||||
/** Tile entity */
|
/** Tile entity */
|
||||||
nms_tileentity = getNMSClass("net.minecraft.server.TileEntity");
|
nms_tileentity = getNMSClass("net.minecraft.server.TileEntity");
|
||||||
nmst_readnbt = getMethod(nms_tileentity, new String[] { "b" }, new Class[] { nbttagcompound });
|
nmst_readnbt = getMethod(nms_tileentity, new String[] { "b" }, new Class[] { nbttagcompound });
|
||||||
nmst_x = getField(nms_tileentity, new String[] { "x" }, int.class);
|
nmst_getposition = getMethodNoFail(nms_tileentity, new String[] { "getPosition" }, new Class[0]); // Try 1.8 method
|
||||||
nmst_y = getField(nms_tileentity, new String[] { "y" }, int.class);
|
if (nmst_getposition == null) {
|
||||||
nmst_z = getField(nms_tileentity, new String[] { "z" }, int.class);
|
nmst_x = getField(nms_tileentity, new String[] { "x" }, int.class);
|
||||||
|
nmst_y = getField(nms_tileentity, new String[] { "y" }, int.class);
|
||||||
|
nmst_z = getField(nms_tileentity, new String[] { "z" }, int.class);
|
||||||
|
}
|
||||||
|
else { /* BlockPosition */
|
||||||
|
nms_blockposition = getNMSClass("net.minecraft.server.BlockPosition");
|
||||||
|
nmsbp_getx = getMethod(nms_blockposition, new String[] { "getX" }, new Class[0]);
|
||||||
|
nmsbp_gety = getMethod(nms_blockposition, new String[] { "getY" }, new Class[0]);
|
||||||
|
nmsbp_getz = getMethod(nms_blockposition, new String[] { "getZ" }, new Class[0]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
public void unloadChunkNoSave(World w, Chunk c, int cx, int cz) {
|
public void unloadChunkNoSave(World w, Chunk c, int cx, int cz) {
|
||||||
@@ -219,4 +246,28 @@ public class BukkitVersionHelperCB extends BukkitVersionHelperGeneric {
|
|||||||
}
|
}
|
||||||
return new int[0];
|
return new int[0];
|
||||||
}
|
}
|
||||||
|
@Override
|
||||||
|
public Polygon getWorldBorder(World world) {
|
||||||
|
Polygon p = null;
|
||||||
|
if ((getworldborder == null) || (world == null)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
Object cw = getNMSWorld(world);
|
||||||
|
if (cw == null) return null;
|
||||||
|
Object wb = callMethod(cw, getworldborder, nullargs, null);
|
||||||
|
if (wb != null) {
|
||||||
|
double minx = (Double) callMethod(wb, worldborderminx, nullargs, Double.MIN_VALUE);
|
||||||
|
double minz = (Double) callMethod(wb, worldborderminz, nullargs, Double.MIN_VALUE);
|
||||||
|
double maxx = (Double) callMethod(wb, worldbordermaxx, nullargs, Double.MAX_VALUE);
|
||||||
|
double maxz = (Double) callMethod(wb, worldbordermaxz, nullargs, Double.MAX_VALUE);
|
||||||
|
if (maxx < 1E7) {
|
||||||
|
p = new Polygon();
|
||||||
|
p.addVertex(minx, minz);
|
||||||
|
p.addVertex(minx, maxz);
|
||||||
|
p.addVertex(maxx, maxz);
|
||||||
|
p.addVertex(maxx, minz);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return p;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,8 @@ public abstract class BukkitVersionHelperGeneric extends BukkitVersionHelper {
|
|||||||
private String obc_package; // Package used for org.bukkit.craftbukkit
|
private String obc_package; // Package used for org.bukkit.craftbukkit
|
||||||
protected String nms_package; // Package used for net.minecraft.server
|
protected String nms_package; // Package used for net.minecraft.server
|
||||||
private boolean failed;
|
private boolean failed;
|
||||||
private static final Object[] nullargs = new Object[0];
|
protected static final Object[] nullargs = new Object[0];
|
||||||
|
protected static final Class[] nulltypes = new Class[0];
|
||||||
private static final Map nullmap = Collections.emptyMap();
|
private static final Map nullmap = Collections.emptyMap();
|
||||||
|
|
||||||
/** CraftChunkSnapshot */
|
/** CraftChunkSnapshot */
|
||||||
@@ -83,6 +84,13 @@ public abstract class BukkitVersionHelperGeneric extends BukkitVersionHelper {
|
|||||||
protected Field nmst_x;
|
protected Field nmst_x;
|
||||||
protected Field nmst_y;
|
protected Field nmst_y;
|
||||||
protected Field nmst_z;
|
protected Field nmst_z;
|
||||||
|
protected Method nmst_getposition;
|
||||||
|
/** BlockPosition */
|
||||||
|
protected Class<?> nms_blockposition;
|
||||||
|
protected Method nmsbp_getx;
|
||||||
|
protected Method nmsbp_gety;
|
||||||
|
protected Method nmsbp_getz;
|
||||||
|
|
||||||
/** Server */
|
/** Server */
|
||||||
protected Method server_getonlineplayers;
|
protected Method server_getonlineplayers;
|
||||||
/** Player */
|
/** Player */
|
||||||
@@ -136,7 +144,11 @@ public abstract class BukkitVersionHelperGeneric extends BukkitVersionHelper {
|
|||||||
protected Class<?> getNMSClass(String classname) {
|
protected Class<?> getNMSClass(String classname) {
|
||||||
return getClassByName(classname, "net.minecraft.server", nms_package, false);
|
return getClassByName(classname, "net.minecraft.server", nms_package, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected Class<?> getNMSClassNoFail(String classname) {
|
||||||
|
return getClassByName(classname, "net.minecraft.server", nms_package, true);
|
||||||
|
}
|
||||||
|
|
||||||
protected Class<?> getClassByName(String classname, String base, String mapping, boolean nofail) {
|
protected Class<?> getClassByName(String classname, String base, String mapping, boolean nofail) {
|
||||||
String n = classname;
|
String n = classname;
|
||||||
int idx = classname.indexOf(base);
|
int idx = classname.indexOf(base);
|
||||||
@@ -231,7 +243,18 @@ public abstract class BukkitVersionHelperGeneric extends BukkitVersionHelper {
|
|||||||
failed = true;
|
failed = true;
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
private Object callMethod(Object obj, Method meth, Object[] args, Object def) {
|
protected Method getMethodNoFail(Class<?> cls, String[] ids, Class[] args) {
|
||||||
|
if(cls == null) return null;
|
||||||
|
for(String id : ids) {
|
||||||
|
try {
|
||||||
|
return cls.getMethod(id, args);
|
||||||
|
} catch (SecurityException e) {
|
||||||
|
} catch (NoSuchMethodException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
protected Object callMethod(Object obj, Method meth, Object[] args, Object def) {
|
||||||
if((obj == null) || (meth == null)) {
|
if((obj == null) || (meth == null)) {
|
||||||
return def;
|
return def;
|
||||||
}
|
}
|
||||||
@@ -333,19 +356,37 @@ public abstract class BukkitVersionHelperGeneric extends BukkitVersionHelper {
|
|||||||
* Get X coordinate of tile entity
|
* Get X coordinate of tile entity
|
||||||
*/
|
*/
|
||||||
public int getTileEntityX(Object te) {
|
public int getTileEntityX(Object te) {
|
||||||
return (Integer)getFieldValue(te, nmst_x, 0);
|
if (nmst_getposition == null) {
|
||||||
|
return (Integer)getFieldValue(te, nmst_x, 0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Object pos = callMethod(te, nmst_getposition, nullargs, null);
|
||||||
|
return (Integer) callMethod(pos, nmsbp_getx, nullargs, null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Get Y coordinate of tile entity
|
* Get Y coordinate of tile entity
|
||||||
*/
|
*/
|
||||||
public int getTileEntityY(Object te) {
|
public int getTileEntityY(Object te) {
|
||||||
return (Integer)getFieldValue(te, nmst_y, 0);
|
if (nmst_getposition == null) {
|
||||||
|
return (Integer)getFieldValue(te, nmst_y, 0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Object pos = callMethod(te, nmst_getposition, nullargs, null);
|
||||||
|
return (Integer) callMethod(pos, nmsbp_gety, nullargs, null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Get Z coordinate of tile entity
|
* Get Z coordinate of tile entity
|
||||||
*/
|
*/
|
||||||
public int getTileEntityZ(Object te) {
|
public int getTileEntityZ(Object te) {
|
||||||
return (Integer)getFieldValue(te, nmst_z, 0);
|
if (nmst_getposition == null) {
|
||||||
|
return (Integer)getFieldValue(te, nmst_z, 0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Object pos = callMethod(te, nmst_getposition, nullargs, null);
|
||||||
|
return (Integer) callMethod(pos, nmsbp_getz, nullargs, null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Read tile entity NBT
|
* Read tile entity NBT
|
||||||
@@ -416,7 +457,8 @@ public abstract class BukkitVersionHelperGeneric extends BukkitVersionHelper {
|
|||||||
/**
|
/**
|
||||||
* Get player health
|
* Get player health
|
||||||
*/
|
*/
|
||||||
public int getHealth(Player p) {
|
@Override
|
||||||
|
public double getHealth(Player p) {
|
||||||
Object health = callMethod(p, player_gethealth, nullargs, null);
|
Object health = callMethod(p, player_gethealth, nullargs, null);
|
||||||
if (health instanceof Integer) {
|
if (health instanceof Integer) {
|
||||||
return (Integer) health;
|
return (Integer) health;
|
||||||
|
|||||||
@@ -444,7 +444,7 @@ public class BukkitVersionHelperGlowstone extends BukkitVersionHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getHealth(Player p) {
|
public double getHealth(Player p) {
|
||||||
return p.getHealth();
|
return p.getHealth();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,12 +11,14 @@ import java.util.List;
|
|||||||
import org.bukkit.Chunk;
|
import org.bukkit.Chunk;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.permissions.Permission;
|
import org.bukkit.permissions.Permission;
|
||||||
import org.bukkit.permissions.PermissionDefault;
|
import org.bukkit.permissions.PermissionDefault;
|
||||||
import org.dynmap.DynmapChunk;
|
import org.dynmap.DynmapChunk;
|
||||||
import org.dynmap.DynmapLocation;
|
import org.dynmap.DynmapLocation;
|
||||||
import org.dynmap.DynmapWorld;
|
import org.dynmap.DynmapWorld;
|
||||||
import org.dynmap.utils.MapChunkCache;
|
import org.dynmap.utils.MapChunkCache;
|
||||||
|
import org.dynmap.utils.Polygon;
|
||||||
import org.dynmap.utils.TileFlags;
|
import org.dynmap.utils.TileFlags;
|
||||||
|
|
||||||
public class BukkitWorld extends DynmapWorld {
|
public class BukkitWorld extends DynmapWorld {
|
||||||
@@ -124,7 +126,10 @@ public class BukkitWorld extends DynmapWorld {
|
|||||||
@Override
|
@Override
|
||||||
public int getLightLevel(int x, int y, int z) {
|
public int getLightLevel(int x, int y, int z) {
|
||||||
if(world != null) {
|
if(world != null) {
|
||||||
return world.getBlockAt(x, y, z).getLightLevel();
|
if ((y >= 0) && (y < this.worldheight)) {
|
||||||
|
return world.getBlockAt(x, y, z).getLightLevel();
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return -1;
|
return -1;
|
||||||
@@ -149,7 +154,12 @@ public class BukkitWorld extends DynmapWorld {
|
|||||||
@Override
|
@Override
|
||||||
public int getSkyLightLevel(int x, int y, int z) {
|
public int getSkyLightLevel(int x, int y, int z) {
|
||||||
if(world != null) {
|
if(world != null) {
|
||||||
return world.getBlockAt(x, y, z).getLightFromSky();
|
if ((y >= 0) && (y < this.worldheight)) {
|
||||||
|
return world.getBlockAt(x, y, z).getLightFromSky();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return 15;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return -1;
|
return -1;
|
||||||
@@ -233,5 +243,8 @@ public class BukkitWorld extends DynmapWorld {
|
|||||||
}
|
}
|
||||||
return cnt;
|
return cnt;
|
||||||
}
|
}
|
||||||
|
@Override
|
||||||
|
public Polygon getWorldBorder() {
|
||||||
|
return DynmapPlugin.plugin.getWorldBorder(world);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,11 +2,9 @@ package org.dynmap.bukkit;
|
|||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
@@ -96,6 +94,7 @@ import org.dynmap.hdmap.HDMap;
|
|||||||
import org.dynmap.markers.MarkerAPI;
|
import org.dynmap.markers.MarkerAPI;
|
||||||
import org.dynmap.modsupport.ModSupportImpl;
|
import org.dynmap.modsupport.ModSupportImpl;
|
||||||
import org.dynmap.utils.MapChunkCache;
|
import org.dynmap.utils.MapChunkCache;
|
||||||
|
import org.dynmap.utils.Polygon;
|
||||||
import org.dynmap.utils.VisibilityLimit;
|
import org.dynmap.utils.VisibilityLimit;
|
||||||
|
|
||||||
public class DynmapPlugin extends JavaPlugin implements DynmapAPI {
|
public class DynmapPlugin extends JavaPlugin implements DynmapAPI {
|
||||||
@@ -103,11 +102,9 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI {
|
|||||||
private PermissionProvider permissions;
|
private PermissionProvider permissions;
|
||||||
private String version;
|
private String version;
|
||||||
public SnapshotCache sscache;
|
public SnapshotCache sscache;
|
||||||
private boolean has_spout = false;
|
|
||||||
public PlayerList playerList;
|
public PlayerList playerList;
|
||||||
private MapManager mapManager;
|
private MapManager mapManager;
|
||||||
public static DynmapPlugin plugin;
|
public static DynmapPlugin plugin;
|
||||||
public SpoutPluginBlocks spb;
|
|
||||||
public PluginManager pm;
|
public PluginManager pm;
|
||||||
private Metrics metrics;
|
private Metrics metrics;
|
||||||
private BukkitEnableCoreCallback enabCoreCB = new BukkitEnableCoreCallback();
|
private BukkitEnableCoreCallback enabCoreCB = new BukkitEnableCoreCallback();
|
||||||
@@ -169,26 +166,10 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI {
|
|||||||
private class BukkitEnableCoreCallback extends DynmapCore.EnableCoreCallbacks {
|
private class BukkitEnableCoreCallback extends DynmapCore.EnableCoreCallbacks {
|
||||||
@Override
|
@Override
|
||||||
public void configurationLoaded() {
|
public void configurationLoaded() {
|
||||||
/* Check for Spout */
|
File st = new File(core.getDataFolder(), "renderdata/spout-texture.txt");
|
||||||
if(detectSpout()) {
|
if(st.exists()) {
|
||||||
if(core.configuration.getBoolean("spout/enabled", true)) {
|
st.delete();
|
||||||
has_spout = true;
|
|
||||||
Log.info("Detected Spout");
|
|
||||||
if(spb == null) {
|
|
||||||
spb = new SpoutPluginBlocks(DynmapPlugin.this);
|
|
||||||
}
|
|
||||||
modsused.add("SpoutPlugin");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Log.info("Detected Spout - Support Disabled");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if(!has_spout) { /* If not, clean up old spout texture, if needed */
|
|
||||||
File st = new File(core.getDataFolder(), "renderdata/spout-texture.txt");
|
|
||||||
if(st.exists())
|
|
||||||
st.delete();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -276,6 +257,11 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI {
|
|||||||
return true;
|
return true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@Override
|
||||||
|
public boolean isServerThread() {
|
||||||
|
return Bukkit.getServer().isPrimaryThread();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String stripChatColor(String s) {
|
public String stripChatColor(String s) {
|
||||||
return ChatColor.stripColor(s);
|
return ChatColor.stripColor(s);
|
||||||
@@ -634,7 +620,7 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
public int getHealth() {
|
public double getHealth() {
|
||||||
if(player != null)
|
if(player != null)
|
||||||
return helper.getHealth(player);
|
return helper.getHealth(player);
|
||||||
else
|
else
|
||||||
@@ -738,19 +724,24 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI {
|
|||||||
Object[] biomelist = helper.getBiomeBaseList();
|
Object[] biomelist = helper.getBiomeBaseList();
|
||||||
/* Loop through list, skipping well known biomes */
|
/* Loop through list, skipping well known biomes */
|
||||||
for(int i = 0; i < biomelist.length; i++) {
|
for(int i = 0; i < biomelist.length; i++) {
|
||||||
if (!BiomeMap.byBiomeID(i).isDefault()) continue;
|
|
||||||
Object bb = biomelist[i];
|
Object bb = biomelist[i];
|
||||||
if(bb != null) {
|
if(bb != null) {
|
||||||
String id = helper.getBiomeBaseIDString(bb);
|
|
||||||
if(id == null) {
|
|
||||||
id = "BIOME_" + i;
|
|
||||||
}
|
|
||||||
float tmp = helper.getBiomeBaseTemperature(bb);
|
float tmp = helper.getBiomeBaseTemperature(bb);
|
||||||
float hum = helper.getBiomeBaseHumidity(bb);
|
float hum = helper.getBiomeBaseHumidity(bb);
|
||||||
|
BiomeMap bmap = BiomeMap.byBiomeID(i);
|
||||||
BiomeMap m = new BiomeMap(i, id, tmp, hum);
|
if (bmap.isDefault()) {
|
||||||
Log.verboseinfo("Add custom biome [" + m.toString() + "] (" + i + ")");
|
String id = helper.getBiomeBaseIDString(bb);
|
||||||
cnt++;
|
if(id == null) {
|
||||||
|
id = "BIOME_" + i;
|
||||||
|
}
|
||||||
|
BiomeMap m = new BiomeMap(i, id, tmp, hum);
|
||||||
|
Log.verboseinfo("Add custom biome [" + m.toString() + "] (" + i + ")");
|
||||||
|
cnt++;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
bmap.setTemperature(tmp);
|
||||||
|
bmap.setRainfall(hum);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(cnt > 0) {
|
if(cnt > 0) {
|
||||||
@@ -842,7 +833,6 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI {
|
|||||||
@EventHandler(priority=EventPriority.MONITOR, ignoreCancelled=true)
|
@EventHandler(priority=EventPriority.MONITOR, ignoreCancelled=true)
|
||||||
public void onPluginEnabled(PluginEnableEvent evt) {
|
public void onPluginEnabled(PluginEnableEvent evt) {
|
||||||
if (!readyToEnable()) {
|
if (!readyToEnable()) {
|
||||||
spb.markPluginEnabled(evt.getPlugin());
|
|
||||||
if (readyToEnable()) { /* If we;re ready now, finish enable */
|
if (readyToEnable()) { /* If we;re ready now, finish enable */
|
||||||
doEnable(); /* Finish enable */
|
doEnable(); /* Finish enable */
|
||||||
}
|
}
|
||||||
@@ -867,18 +857,10 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean readyToEnable() {
|
private boolean readyToEnable() {
|
||||||
if (spb != null) {
|
|
||||||
return spb.isReady();
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void doEnable() {
|
private void doEnable() {
|
||||||
/* Prep spout support, if needed */
|
|
||||||
if(spb != null) {
|
|
||||||
spb.processSpoutBlocks(this, core);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Enable core */
|
/* Enable core */
|
||||||
if(!core.enableCore(enabCoreCB)) {
|
if(!core.enableCore(enabCoreCB)) {
|
||||||
this.setEnabled(false);
|
this.setEnabled(false);
|
||||||
@@ -1515,18 +1497,6 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean detectSpout() {
|
|
||||||
Plugin p = this.getServer().getPluginManager().getPlugin("Spout");
|
|
||||||
if(p != null) {
|
|
||||||
return p.isEnabled();
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean hasSpout() {
|
|
||||||
return has_spout;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void assertPlayerInvisibility(String player, boolean is_invisible,
|
public void assertPlayerInvisibility(String player, boolean is_invisible,
|
||||||
String plugin_id) {
|
String plugin_id) {
|
||||||
@@ -1577,14 +1547,6 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
features.addPlotter(new Metrics.Plotter("Spout") {
|
|
||||||
@Override
|
|
||||||
public int getValue() {
|
|
||||||
if(plugin.has_spout)
|
|
||||||
return 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
features.addPlotter(new Metrics.Plotter("Login Security") {
|
features.addPlotter(new Metrics.Plotter("Login Security") {
|
||||||
@Override
|
@Override
|
||||||
public int getValue() {
|
public int getValue() {
|
||||||
@@ -1658,4 +1620,8 @@ public class DynmapPlugin extends JavaPlugin implements DynmapAPI {
|
|||||||
String[] lines, String playerid) {
|
String[] lines, String playerid) {
|
||||||
core.processSignChange(blkid, world, x, y, z, lines, playerid);
|
core.processSignChange(blkid, world, x, y, z, lines, playerid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Polygon getWorldBorder(World w) {
|
||||||
|
return helper.getWorldBorder(w);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,14 +22,12 @@ import org.dynmap.utils.MapChunkCache;
|
|||||||
import org.dynmap.utils.MapIterator;
|
import org.dynmap.utils.MapIterator;
|
||||||
import org.dynmap.utils.BlockStep;
|
import org.dynmap.utils.BlockStep;
|
||||||
import org.dynmap.utils.VisibilityLimit;
|
import org.dynmap.utils.VisibilityLimit;
|
||||||
import org.getspout.spoutapi.block.SpoutChunk;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Container for managing chunks - dependent upon using chunk snapshots, since rendering is off server thread
|
* Container for managing chunks - dependent upon using chunk snapshots, since rendering is off server thread
|
||||||
*/
|
*/
|
||||||
public class NewMapChunkCache extends MapChunkCache {
|
public class NewMapChunkCache extends MapChunkCache {
|
||||||
private static boolean init = false;
|
private static boolean init = false;
|
||||||
private static boolean use_spout = false;
|
|
||||||
|
|
||||||
private World w;
|
private World w;
|
||||||
private DynmapWorld dw;
|
private DynmapWorld dw;
|
||||||
@@ -737,8 +735,6 @@ public class NewMapChunkCache extends MapChunkCache {
|
|||||||
*/
|
*/
|
||||||
public NewMapChunkCache() {
|
public NewMapChunkCache() {
|
||||||
if(!init) {
|
if(!init) {
|
||||||
use_spout = DynmapPlugin.plugin.hasSpout();
|
|
||||||
|
|
||||||
init = true;
|
init = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -781,17 +777,6 @@ public class NewMapChunkCache extends MapChunkCache {
|
|||||||
isSectionNotEmpty = new boolean[snapcnt][];
|
isSectionNotEmpty = new boolean[snapcnt][];
|
||||||
}
|
}
|
||||||
|
|
||||||
private ChunkSnapshot checkSpoutData(Chunk c, ChunkSnapshot ss) {
|
|
||||||
if(c instanceof SpoutChunk) {
|
|
||||||
SpoutChunk sc = (SpoutChunk)c;
|
|
||||||
short[] custids = sc.getCustomBlockIds();
|
|
||||||
if(custids != null) {
|
|
||||||
return new SpoutChunkSnapshot(ss, custids, c.getWorld().getMaxHeight());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ss;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int loadChunks(int max_to_load) {
|
public int loadChunks(int max_to_load) {
|
||||||
if(dw.isLoaded() == false)
|
if(dw.isLoaded() == false)
|
||||||
return 0;
|
return 0;
|
||||||
@@ -884,9 +869,6 @@ public class NewMapChunkCache extends MapChunkCache {
|
|||||||
else {
|
else {
|
||||||
if(blockdata || highesty) {
|
if(blockdata || highesty) {
|
||||||
ss = c.getChunkSnapshot(highesty, biome, biomeraw);
|
ss = c.getChunkSnapshot(highesty, biome, biomeraw);
|
||||||
if(use_spout) {
|
|
||||||
ss = checkSpoutData(c, ss);
|
|
||||||
}
|
|
||||||
/* Get tile entity data */
|
/* Get tile entity data */
|
||||||
List<Object> vals = new ArrayList<Object>();
|
List<Object> vals = new ArrayList<Object>();
|
||||||
Map<?,?> tileents = helper.getTileEntitiesForChunk(c);
|
Map<?,?> tileents = helper.getTileEntitiesForChunk(c);
|
||||||
|
|||||||
@@ -1,268 +0,0 @@
|
|||||||
package org.dynmap.bukkit;
|
|
||||||
|
|
||||||
import java.awt.image.BufferedImage;
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileReader;
|
|
||||||
import java.io.FileWriter;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.net.URL;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import javax.imageio.ImageIO;
|
|
||||||
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.plugin.Plugin;
|
|
||||||
import org.dynmap.DynmapCore;
|
|
||||||
import org.dynmap.Log;
|
|
||||||
import org.getspout.spoutapi.block.design.BlockDesign;
|
|
||||||
import org.getspout.spoutapi.block.design.GenericBlockDesign;
|
|
||||||
import org.getspout.spoutapi.block.design.GenericCuboidBlockDesign;
|
|
||||||
import org.getspout.spoutapi.block.design.Texture;
|
|
||||||
import org.getspout.spoutapi.material.CustomBlock;
|
|
||||||
import org.getspout.spoutapi.material.MaterialData;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handler for pulling spout-defined custom blocks into dynmap
|
|
||||||
*
|
|
||||||
* Generates and maintains custom render data file (renderdata/spout-texture.txt) and
|
|
||||||
* directory of downloaded image files (texturepacks/standard/spout/plugin.blockid.png)
|
|
||||||
*/
|
|
||||||
public class SpoutPluginBlocks {
|
|
||||||
private Field textXPosField; /* float[][] textXPos */
|
|
||||||
private Field textYPosField; /* float[][] textYPos */
|
|
||||||
private HashSet<String> plugins_pending = new HashSet<String>();
|
|
||||||
|
|
||||||
public SpoutPluginBlocks(Plugin plugin) {
|
|
||||||
/* First, see if any spout plugins that need to be enabled */
|
|
||||||
for(Plugin p : plugin.getServer().getPluginManager().getPlugins()) {
|
|
||||||
List<String> dep = p.getDescription().getDepend();
|
|
||||||
if((dep != null) && (dep.contains("Spout"))) {
|
|
||||||
Log.info("Found Spout plugin: " + p.getName());
|
|
||||||
if(p.isEnabled() == false) {
|
|
||||||
plugins_pending.add(p.getName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isReady() {
|
|
||||||
return plugins_pending.isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void markPluginEnabled(Plugin p) {
|
|
||||||
plugins_pending.remove(p.getName());
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean initSpoutAccess() {
|
|
||||||
boolean success = false;
|
|
||||||
try {
|
|
||||||
textXPosField = GenericBlockDesign.class.getDeclaredField("textXPos");
|
|
||||||
textXPosField.setAccessible(true);
|
|
||||||
textYPosField = GenericBlockDesign.class.getDeclaredField("textYPos");
|
|
||||||
textYPosField.setAccessible(true);
|
|
||||||
success = true;
|
|
||||||
} catch (NoSuchFieldException nsfx) {
|
|
||||||
Log.severe("Cannot access needed Spout custom block fields!");
|
|
||||||
Log.severe(nsfx);
|
|
||||||
}
|
|
||||||
return success;
|
|
||||||
}
|
|
||||||
private void addDefaultBlock(StringBuilder sb, CustomBlock blk) {
|
|
||||||
if(blk.isOpaque())
|
|
||||||
sb.append("block:id=" + blk.getCustomId() + ",data=*,allfaces=1\n");
|
|
||||||
else
|
|
||||||
sb.append("block:id=" + blk.getCustomId() + ",allfaces=12049,transparency=TRANSPARENT\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String fixIDString(String id) {
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
int len = id.length();
|
|
||||||
sb.setLength(len);
|
|
||||||
for(int i = 0; i < len; i++) {
|
|
||||||
char c = id.charAt(i);
|
|
||||||
if(Character.isJavaIdentifierStart(c)) {
|
|
||||||
sb.setCharAt(i, c);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
sb.setCharAt(i, '_');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Process spout blocks - return true if something changed */
|
|
||||||
public boolean processSpoutBlocks(DynmapPlugin plugin, DynmapCore core) {
|
|
||||||
File datadir = core.getDataFolder();
|
|
||||||
if(textYPosField == null) {
|
|
||||||
if(initSpoutAccess() == false)
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
HashMap<String, String> texturelist = new HashMap<String, String>();
|
|
||||||
boolean use_existing_texture = core.configuration.getBoolean("spout/use-existing-textures", true);
|
|
||||||
|
|
||||||
int cnt = 0;
|
|
||||||
File f = new File(datadir, "texturepacks/standard/spout");
|
|
||||||
if(f.exists() == false)
|
|
||||||
f.mkdirs();
|
|
||||||
List<CustomBlock> blks = new ArrayList<CustomBlock>();
|
|
||||||
CustomBlock[] cb = MaterialData.getCustomBlocks();
|
|
||||||
/* Build new texture file as string */
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
/* Loop through blocks - try to freshen files, if needed */
|
|
||||||
for(CustomBlock b : cb) {
|
|
||||||
BlockDesign bd = b.getBlockDesign();
|
|
||||||
if(bd == null) continue;
|
|
||||||
String txtplug = bd.getTexturePlugin();
|
|
||||||
if(txtplug == null) continue;
|
|
||||||
String blkname = b.getName();
|
|
||||||
if(blkname == null) continue;
|
|
||||||
String blkid = txtplug + "." + fixIDString(blkname);
|
|
||||||
/* If not GenericCubiodBlockDesign, we don't handle it */
|
|
||||||
if((bd instanceof GenericCuboidBlockDesign) == false) {
|
|
||||||
Log.info("Block " + blkid + " not suppored - only cubiod blocks");
|
|
||||||
addDefaultBlock(sb, b);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
/* Get texture info */
|
|
||||||
Texture txt = bd.getTexture();
|
|
||||||
int w = txt.getWidth();
|
|
||||||
int h = txt.getHeight();
|
|
||||||
int sz = txt.getSpriteSize();
|
|
||||||
GenericCuboidBlockDesign gbd = (GenericCuboidBlockDesign)bd;
|
|
||||||
int[] txtidx = new int[6];
|
|
||||||
/* Fetch quad fields - figure out which texture for which side */
|
|
||||||
try {
|
|
||||||
float[][] textXPos = (float[][])textXPosField.get(gbd);
|
|
||||||
float[][] textYPos = (float[][])textYPosField.get(gbd);
|
|
||||||
/* Quads on cuboid are bottom, west, south, east, north, top */
|
|
||||||
for(int i = 0; i < 6; i++) {
|
|
||||||
float minx = 1.0F;
|
|
||||||
float miny = 1.0F;
|
|
||||||
for(int j = 0; j < 4; j++) {
|
|
||||||
minx = Math.min(minx, textXPos[i][j]);
|
|
||||||
miny = Math.min(miny, textYPos[i][j]);
|
|
||||||
}
|
|
||||||
txtidx[i] = (int)((minx * w)/sz) + (w/sz)*(int)((miny * h)/sz);
|
|
||||||
}
|
|
||||||
} catch (Exception iax) {
|
|
||||||
addDefaultBlock(sb, b);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
String txname = bd.getTexureURL();
|
|
||||||
|
|
||||||
String txtid = texturelist.get(txname); /* Get texture */
|
|
||||||
if(txtid == null) { /* Not found yet */
|
|
||||||
File imgfile = new File(f, blkid + ".png");
|
|
||||||
|
|
||||||
/* If not reusing loaded textures OR not previously loaded */
|
|
||||||
if((!use_existing_texture) || (!imgfile.exists())) {
|
|
||||||
BufferedImage img = null;
|
|
||||||
boolean urlloaded = false;
|
|
||||||
try {
|
|
||||||
URL url = new URL(txname);
|
|
||||||
img = ImageIO.read(url); /* Load skin for player */
|
|
||||||
urlloaded = true;
|
|
||||||
} catch (IOException iox) {
|
|
||||||
if(txname.startsWith("http") == false) { /* Not URL - try file */
|
|
||||||
File tf = new File(txname);
|
|
||||||
if(tf.exists() == false) {
|
|
||||||
/* Horrible hack - try to find temp file (some SpoutMaterials versions) */
|
|
||||||
try {
|
|
||||||
File tmpf = File.createTempFile("dynmap", "test");
|
|
||||||
|
|
||||||
tf = new File(tmpf.getParent(), txname);
|
|
||||||
tmpf.delete();
|
|
||||||
} catch (IOException iox2) {}
|
|
||||||
}
|
|
||||||
if(tf.exists()) {
|
|
||||||
try {
|
|
||||||
img = ImageIO.read(tf);
|
|
||||||
urlloaded = true;
|
|
||||||
} catch (IOException iox3) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(img == null) {
|
|
||||||
Log.severe("Error loading texture for custom block '" + blkid + "' (" + b.getCustomId() + ") from " + txname + "(" + iox.getMessage() + ")");
|
|
||||||
if(imgfile.exists()) {
|
|
||||||
try {
|
|
||||||
img = ImageIO.read(imgfile); /* Load existing */
|
|
||||||
Log.info("Loaded cached texture file for " + blkid);
|
|
||||||
} catch (IOException iox2) {
|
|
||||||
Log.severe("Error loading cached texture file for " + blkid + " - " + iox2.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(img != null) {
|
|
||||||
try {
|
|
||||||
if(urlloaded)
|
|
||||||
ImageIO.write(img, "png", imgfile);
|
|
||||||
} catch (IOException iox) {
|
|
||||||
Log.severe("Error writing " + blkid + ".png");
|
|
||||||
} finally {
|
|
||||||
img.flush();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(imgfile.exists()) { /* If exists now, log it */
|
|
||||||
String tfid = "txtid" + texturelist.size();
|
|
||||||
sb.append("texturefile:id=" + tfid + ",filename=spout/" + blkid + ".png,xcount=" + w/sz + ",ycount=" + h/sz + "\n");
|
|
||||||
texturelist.put(txname, tfid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
String txfileid = texturelist.get(txname);
|
|
||||||
if(txfileid != null) {
|
|
||||||
blks.add(b);
|
|
||||||
|
|
||||||
sb.append("block:id=" + b.getCustomId() + ",data=*,bottom=" + txtidx[0] + ",west=" +txtidx[1] + ",south=" + txtidx[2] + ",east=" + txtidx[3] + ",north="+txtidx[4]+",top="+txtidx[5]);
|
|
||||||
if(b.getBlockId() == Material.GLASS.getId())
|
|
||||||
sb.append(",transparency=TRANSPARENT");
|
|
||||||
sb.append(",txtid=" + txfileid + "\n");
|
|
||||||
cnt++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
String rslt = sb.toString();
|
|
||||||
/* Now, generate spout texture file - see if changed */
|
|
||||||
File renderdata = new File(datadir, "renderdata");
|
|
||||||
if (renderdata.exists() == false)
|
|
||||||
renderdata.mkdirs();
|
|
||||||
File st = new File(renderdata, "spout-texture.txt");
|
|
||||||
if(st.exists()) {
|
|
||||||
FileReader fr = null;
|
|
||||||
StringBuilder sbold = new StringBuilder();
|
|
||||||
try {
|
|
||||||
fr = new FileReader(st);
|
|
||||||
int len;
|
|
||||||
char[] buf = new char[512];
|
|
||||||
while((len = fr.read(buf)) > 0) {
|
|
||||||
sbold.append(buf, 0, len);
|
|
||||||
}
|
|
||||||
} catch (IOException iox) {
|
|
||||||
} finally {
|
|
||||||
if(fr != null) { try { fr.close(); } catch (IOException iox) {} }
|
|
||||||
}
|
|
||||||
/* If same, no changes */
|
|
||||||
if(sbold.equals(rslt)) {
|
|
||||||
Log.info("Loaded " + cnt + " Spout custom blocks");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
FileWriter fw = null;
|
|
||||||
try {
|
|
||||||
fw = new FileWriter(st);
|
|
||||||
fw.write(rslt);
|
|
||||||
} catch (IOException iox) {
|
|
||||||
Log.severe("Error opening spout texture file - " + st.getPath());
|
|
||||||
return false;
|
|
||||||
} finally {
|
|
||||||
if(fw != null) { try { fw.close(); } catch (IOException iox) {} }
|
|
||||||
}
|
|
||||||
Log.info("Loaded " + cnt + " Spout custom blocks");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -125,6 +125,8 @@ components:
|
|||||||
spawnbedhidebydefault: true
|
spawnbedhidebydefault: true
|
||||||
spawnbedminzoom: 0
|
spawnbedminzoom: 0
|
||||||
spawnbedformat: "%name%'s bed"
|
spawnbedformat: "%name%'s bed"
|
||||||
|
# (optional) show world border (vanilla 1.8+)
|
||||||
|
showworldborder: true
|
||||||
|
|
||||||
- class: org.dynmap.ClientComponent
|
- class: org.dynmap.ClientComponent
|
||||||
type: chat
|
type: chat
|
||||||
@@ -274,7 +276,7 @@ custom-colors-support: true
|
|||||||
#refreshskins: false
|
#refreshskins: false
|
||||||
|
|
||||||
# Customize URL used for fetching player skins (%player% is macro for name)
|
# Customize URL used for fetching player skins (%player% is macro for name)
|
||||||
skin-url: "http://s3.amazonaws.com/MinecraftSkins/%player%.png"
|
skin-url: "http://skins.minecraft.net/MinecraftSkins/%player%.png"
|
||||||
|
|
||||||
# Control behavior for new (1.0+) compass orientation (sunrise moved 90 degrees: east is now what used to be south)
|
# Control behavior for new (1.0+) compass orientation (sunrise moved 90 degrees: east is now what used to be south)
|
||||||
# default is 'newrose' (preserve pre-1.0 maps, rotate rose)
|
# default is 'newrose' (preserve pre-1.0 maps, rotate rose)
|
||||||
@@ -473,4 +475,4 @@ verbose: false
|
|||||||
#debuggers:
|
#debuggers:
|
||||||
# - class: org.dynmap.debug.LogDebugger
|
# - class: org.dynmap.debug.LogDebugger
|
||||||
# Debug: dump blocks missing render data
|
# Debug: dump blocks missing render data
|
||||||
dump-missing-blocks: false
|
dump-missing-blocks: false
|
||||||
|
|||||||
Reference in New Issue
Block a user