mirror of
https://github.com/webbukkit/dynmap.git
synced 2024-11-24 19:25:15 +01:00
Add basic wire support rendering for IC2
This commit is contained in:
parent
827b172bed
commit
4a6d30f8a2
198
renderdata/ic2-models.txt-disabled
Normal file
198
renderdata/ic2-models.txt-disabled
Normal file
@ -0,0 +1,198 @@
|
|||||||
|
# Wire - set render alg
|
||||||
|
linkmap:id=228,linkalg=5,linkid=223,linkid=225,linkid=226,linkid=227,linkid=228,linkid=233,linkid=237,linkid=246,linkid=250
|
||||||
|
# Wire - (data is faked: 1=north,2=east,4=south,8=west)
|
||||||
|
# Wire - no neighbors
|
||||||
|
block:id=228,data=0,scale=16
|
||||||
|
layer:6,7,8,9
|
||||||
|
----------------
|
||||||
|
----------------
|
||||||
|
----------------
|
||||||
|
----------------
|
||||||
|
----------------
|
||||||
|
----------------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
----------------
|
||||||
|
----------------
|
||||||
|
----------------
|
||||||
|
----------------
|
||||||
|
----------------
|
||||||
|
----------------
|
||||||
|
# Wire - just north neighbor
|
||||||
|
block:id=228,data=1,scale=16
|
||||||
|
layer:6,7,8,9
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
----------------
|
||||||
|
----------------
|
||||||
|
----------------
|
||||||
|
----------------
|
||||||
|
----------------
|
||||||
|
----------------
|
||||||
|
# Wire - just east neighbor
|
||||||
|
block:id=228,data=2,scale=16
|
||||||
|
rotate:id=228,data=1,rot=90
|
||||||
|
# Wire - just south neighbor
|
||||||
|
block:id=228,id=113,data=4,scale=16
|
||||||
|
rotate:id=228,data=1,rot=180
|
||||||
|
# Wire - just south neighbor
|
||||||
|
block:id=228,data=8,scale=16
|
||||||
|
rotate:id=228,data=1,rot=270
|
||||||
|
# Wire - north and east neighbor
|
||||||
|
block:id=228,data=3,scale=16
|
||||||
|
layer:6,7,8,9
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------**********
|
||||||
|
------**********
|
||||||
|
------**********
|
||||||
|
------**********
|
||||||
|
----------------
|
||||||
|
----------------
|
||||||
|
----------------
|
||||||
|
----------------
|
||||||
|
----------------
|
||||||
|
----------------
|
||||||
|
# Wire - east and south neighbor
|
||||||
|
block:id=228,data=6,scale=16
|
||||||
|
rotate:id=228,data=3,rot=90
|
||||||
|
# Wire - south and west neighbor
|
||||||
|
block:id=228,data=12,scale=16
|
||||||
|
rotate:id=228,data=3,rot=180
|
||||||
|
# Wire - west and north neighbor
|
||||||
|
block:id=228,data=9,scale=16
|
||||||
|
rotate:id=228,data=3,rot=270
|
||||||
|
# Wire - north and south neighbor
|
||||||
|
block:id=228,data=5,scale=16
|
||||||
|
layer:6,7,8,9
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
# Wire - east and west neighbor
|
||||||
|
block:id=228,data=10,scale=16
|
||||||
|
rotate:id=228,data=5,rot=90
|
||||||
|
# Wire - north, east and south neighbor
|
||||||
|
block:id=228,data=7,scale=16
|
||||||
|
layer:6,7,8,9
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------**********
|
||||||
|
------**********
|
||||||
|
------**********
|
||||||
|
------**********
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
# Wire - east, south and west neighbor
|
||||||
|
block:id=228,data=14,scale=16
|
||||||
|
rotate:id=228,data=7,rot=90
|
||||||
|
# Wire - south, west and north neighbor
|
||||||
|
block:id=228,data=13,scale=16
|
||||||
|
rotate:id=228,data=7,rot=180
|
||||||
|
# Wire - west, north and east neighbor
|
||||||
|
block:id=228,data=11,scale=16
|
||||||
|
rotate:id=228,data=7,rot=270
|
||||||
|
# Wire - north, south, east, west neightbors
|
||||||
|
block:id=228,data=15,scale=16
|
||||||
|
layer:6,7,8,9
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
****************
|
||||||
|
****************
|
||||||
|
****************
|
||||||
|
****************
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
------****------
|
||||||
|
# Iron Fence - set render algorithm
|
||||||
|
linkmap:id=232,linkalg=1
|
||||||
|
# Iron Fence - (data is faked: 1=north,2=east,4=south,8=west)
|
||||||
|
# Iron Fence - no neighbors
|
||||||
|
block:id=232,data=0,scale=16
|
||||||
|
rotate:id=85,data=0,rot=0
|
||||||
|
# Iron Fence - just north neighbor
|
||||||
|
block:id=232,data=1,scale=16
|
||||||
|
rotate:id=85,data=1,rot=0
|
||||||
|
# Iron Fence - just east neighbor
|
||||||
|
block:id=232,data=2,scale=16
|
||||||
|
rotate:id=232,data=1,rot=90
|
||||||
|
# Iron Fence - just south neighbor
|
||||||
|
block:id=232,data=4,scale=16
|
||||||
|
rotate:id=232,data=1,rot=180
|
||||||
|
# Iron Fence - just south neighbor
|
||||||
|
block:id=232,data=8,scale=16
|
||||||
|
rotate:id=232,data=1,rot=270
|
||||||
|
# Iron Fence - north and east neighbor
|
||||||
|
block:id=232,data=3,scale=16
|
||||||
|
rotate:id=85,data=3,rot=0
|
||||||
|
# Iron Fence - east and south neighbor
|
||||||
|
block:id=232,data=6,scale=16
|
||||||
|
rotate:id=232,data=3,rot=90
|
||||||
|
# Iron Fence - south and west neighbor
|
||||||
|
block:id=232,data=12,scale=16
|
||||||
|
rotate:id=85,data=3,rot=180
|
||||||
|
# Iron Fence - west and north neighbor
|
||||||
|
block:id=232,data=9,scale=16
|
||||||
|
rotate:id=85,data=3,rot=270
|
||||||
|
# Iron Fence - north and south neighbor
|
||||||
|
block:id=232,data=5,scale=16
|
||||||
|
rotate:id=85,data=5,rot=0
|
||||||
|
# Iron Fence - east and west neighbor
|
||||||
|
block:id=232,id=113,data=10,scale=16
|
||||||
|
rotate:id=232,data=5,rot=90
|
||||||
|
# Iron Fence - north, east and south neighbor
|
||||||
|
block:id=232,data=7,scale=16
|
||||||
|
rotate:id=85,data=7,rot=0
|
||||||
|
# Iron Fence - east, south and west neighbor
|
||||||
|
block:id=232,data=14,scale=16
|
||||||
|
rotate:id=232,data=7,rot=90
|
||||||
|
# Iron Fence - south, west and north neighbor
|
||||||
|
block:id=232,data=13,scale=16
|
||||||
|
rotate:id=232,data=7,rot=180
|
||||||
|
# Iron Fence - west, north and east neighbor
|
||||||
|
block:id=232,data=11,scale=16
|
||||||
|
rotate:id=232,data=7,rot=270
|
||||||
|
# Iron Fence - north, south, east, west neightbors
|
||||||
|
block:id=232,data=15,scale=16
|
||||||
|
layer:id=232,data=15,rot=0
|
@ -11,6 +11,7 @@ import java.io.InputStreamReader;
|
|||||||
import java.io.LineNumberReader;
|
import java.io.LineNumberReader;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.dynmap.Log;
|
import org.dynmap.Log;
|
||||||
@ -25,6 +26,8 @@ public class HDBlockModels {
|
|||||||
private long blockflags[];
|
private long blockflags[];
|
||||||
private int nativeres;
|
private int nativeres;
|
||||||
private HashMap<Integer, short[]> scaledblocks;
|
private HashMap<Integer, short[]> scaledblocks;
|
||||||
|
private static int linkalg[] = new int[256];
|
||||||
|
private static int linkmap[][] = new int[256][];
|
||||||
|
|
||||||
private static HashMap<Integer, HDBlockModels> models_by_id_data = new HashMap<Integer, HDBlockModels>();
|
private static HashMap<Integer, HDBlockModels> models_by_id_data = new HashMap<Integer, HDBlockModels>();
|
||||||
|
|
||||||
@ -49,10 +52,6 @@ public class HDBlockModels {
|
|||||||
this.databits = databits;
|
this.databits = databits;
|
||||||
this.nativeres = m.nativeres;
|
this.nativeres = m.nativeres;
|
||||||
this.blockflags = m.blockflags;
|
this.blockflags = m.blockflags;
|
||||||
for(int i = 0; i < 16; i++) {
|
|
||||||
if((databits & (1<<i)) != 0)
|
|
||||||
models_by_id_data.put((blockid<<4)+i, this);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Block definition - positions correspond to Bukkit coordinates (+X is south, +Y is up, +Z is west)
|
* Block definition - positions correspond to Bukkit coordinates (+X is south, +Y is up, +Z is west)
|
||||||
@ -100,6 +99,22 @@ public class HDBlockModels {
|
|||||||
else
|
else
|
||||||
blockflags[nativeres*y+z] &= ~(1 << x);
|
blockflags[nativeres*y+z] &= ~(1 << x);
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Get link algorithm
|
||||||
|
* @param blkid - block ID
|
||||||
|
* @return 0=no link alg
|
||||||
|
*/
|
||||||
|
public static final int getLinkAlgID(int blkid) {
|
||||||
|
return linkalg[blkid];
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Get link block IDs
|
||||||
|
* @param blkid - block ID
|
||||||
|
* @return array of block IDs to link with
|
||||||
|
*/
|
||||||
|
public static final int[] getLinkIDs(int blkid) {
|
||||||
|
return linkmap[blkid];
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Get scaled map of block: will return array of alpha levels, corresponding to how much of the
|
* Get scaled map of block: will return array of alpha levels, corresponding to how much of the
|
||||||
* scaled subblocks are occupied by the original blocks (indexed by Y*res*res + Z*res + X)
|
* scaled subblocks are occupied by the original blocks (indexed by Y*res*res + Z*res + X)
|
||||||
@ -276,28 +291,26 @@ public class HDBlockModels {
|
|||||||
loadModelFile(in, "models.txt");
|
loadModelFile(in, "models.txt");
|
||||||
try { in.close(); } catch (IOException iox) {} in = null;
|
try { in.close(); } catch (IOException iox) {} in = null;
|
||||||
}
|
}
|
||||||
File custom = new File(datadir, "renderdata/custom-models.txt");
|
File customdir = new File(datadir, "renderdata");
|
||||||
if(custom.canRead()) {
|
String[] files = customdir.list();
|
||||||
try {
|
for(String fn : files) {
|
||||||
in = new FileInputStream(custom);
|
if(fn.endsWith("-models.txt") == false)
|
||||||
loadModelFile(in, custom.getPath());
|
continue;
|
||||||
} catch (IOException iox) {
|
File custom = new File(customdir, fn);
|
||||||
Log.severe("Error loading " + custom.getPath());
|
if(custom.canRead()) {
|
||||||
} finally {
|
try {
|
||||||
if(in != null) {
|
in = new FileInputStream(custom);
|
||||||
try { in.close(); } catch (IOException iox) {}
|
loadModelFile(in, custom.getPath());
|
||||||
in = null;
|
} catch (IOException iox) {
|
||||||
|
Log.severe("Error loading " + custom.getPath());
|
||||||
|
} finally {
|
||||||
|
if(in != null) {
|
||||||
|
try { in.close(); } catch (IOException iox) {}
|
||||||
|
in = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
try {
|
|
||||||
FileWriter fw = new FileWriter(custom);
|
|
||||||
fw.write("# The user is free to add new and custom models here - Dynmap's install will not overwrite it\n");
|
|
||||||
fw.close();
|
|
||||||
} catch (IOException iox) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Load models from file
|
* Load models from file
|
||||||
@ -400,6 +413,36 @@ public class HDBlockModels {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if(line.startsWith("linkmap:")) {
|
||||||
|
ArrayList<Integer> blkids = new ArrayList<Integer>();
|
||||||
|
line = line.substring(8);
|
||||||
|
String[] args = line.split(",");
|
||||||
|
List<Integer> map = null;
|
||||||
|
int linktype = 0;
|
||||||
|
for(String a : args) {
|
||||||
|
String[] av = a.split("=");
|
||||||
|
if(av.length < 2) continue;
|
||||||
|
if(av[0].equals("id")) {
|
||||||
|
blkids.add(Integer.parseInt(av[1]));
|
||||||
|
}
|
||||||
|
else if(av[0].equals("linkalg")) {
|
||||||
|
linktype = Integer.parseInt(av[1]);
|
||||||
|
}
|
||||||
|
else if(av[0].equals("linkid")) {
|
||||||
|
if(map == null) map = new ArrayList<Integer>();
|
||||||
|
map.add(Integer.parseInt(av[1]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(map != null) {
|
||||||
|
int[] mapids = new int[map.size()];
|
||||||
|
for(int i = 0; i < mapids.length; i++)
|
||||||
|
mapids[i] = map.get(i);
|
||||||
|
for(Integer bid : blkids) {
|
||||||
|
linkalg[bid] = linktype;
|
||||||
|
linkmap[bid] = mapids;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
else if(line.startsWith("#") || line.startsWith(";")) {
|
else if(line.startsWith("#") || line.startsWith(";")) {
|
||||||
}
|
}
|
||||||
else if(layerbits != 0) { /* If we're working pattern lines */
|
else if(layerbits != 0) { /* If we're working pattern lines */
|
||||||
|
@ -516,6 +516,38 @@ public class IsoHDPerspective implements HDPerspective {
|
|||||||
}
|
}
|
||||||
return blockdata;
|
return blockdata;
|
||||||
}
|
}
|
||||||
|
private final boolean containsID(int id, int[] linkids) {
|
||||||
|
for(int lid: linkids)
|
||||||
|
if(id == lid)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
private int generateWireBlockData(MapIterator mapiter, int[] linkids) {
|
||||||
|
int blockdata = 0;
|
||||||
|
int id;
|
||||||
|
/* Check north */
|
||||||
|
id = mapiter.getBlockTypeIDAt(BlockStep.X_MINUS);
|
||||||
|
if(containsID(id, linkids)) {
|
||||||
|
blockdata |= 1;
|
||||||
|
}
|
||||||
|
/* Look east */
|
||||||
|
id = mapiter.getBlockTypeIDAt(BlockStep.Z_MINUS);
|
||||||
|
if(containsID(id, linkids)) {
|
||||||
|
blockdata |= 2;
|
||||||
|
}
|
||||||
|
/* Look south */
|
||||||
|
id = mapiter.getBlockTypeIDAt(BlockStep.X_PLUS);
|
||||||
|
if(containsID(id, linkids)) {
|
||||||
|
blockdata |= 4;
|
||||||
|
}
|
||||||
|
/* Look west */
|
||||||
|
id = mapiter.getBlockTypeIDAt(BlockStep.Z_PLUS);
|
||||||
|
if(containsID(id, linkids)) {
|
||||||
|
blockdata |= 8;
|
||||||
|
}
|
||||||
|
return blockdata;
|
||||||
|
}
|
||||||
|
|
||||||
private final boolean handleSubModel(short[] model, HDShaderState[] shaderstate, boolean[] shaderdone) {
|
private final boolean handleSubModel(short[] model, HDShaderState[] shaderstate, boolean[] shaderdone) {
|
||||||
boolean firststep = true;
|
boolean firststep = true;
|
||||||
|
|
||||||
@ -535,6 +567,11 @@ public class IsoHDPerspective implements HDPerspective {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
private static final int FENCE_ALGORITHM = 1;
|
||||||
|
private static final int CHEST_ALGORITHM = 2;
|
||||||
|
private static final int REDSTONE_ALGORITHM = 3;
|
||||||
|
private static final int GLASS_IRONFENCE_ALG = 4;
|
||||||
|
private static final int WIRE_ALGORITHM = 5;
|
||||||
/**
|
/**
|
||||||
* Process visit of ray to block
|
* Process visit of ray to block
|
||||||
*/
|
*/
|
||||||
@ -547,21 +584,23 @@ public class IsoHDPerspective implements HDPerspective {
|
|||||||
}
|
}
|
||||||
else if(nonairhit || (blocktypeid != 0)) {
|
else if(nonairhit || (blocktypeid != 0)) {
|
||||||
blockdata = mapiter.getBlockData();
|
blockdata = mapiter.getBlockData();
|
||||||
switch(blocktypeid) {
|
switch(HDBlockModels.getLinkAlgID(blocktypeid)) {
|
||||||
case FENCE_BLKTYPEID: /* Special case for fence - need to fake data so we can render properly */
|
case FENCE_ALGORITHM: /* Fence algorithm */
|
||||||
case NETHERFENCE_BLKTYPEID:
|
|
||||||
blockrenderdata = generateFenceBlockData(mapiter, blocktypeid);
|
blockrenderdata = generateFenceBlockData(mapiter, blocktypeid);
|
||||||
break;
|
break;
|
||||||
case CHEST_BLKTYPEID: /* Special case for chest - need to fake data so we can render */
|
case CHEST_ALGORITHM:
|
||||||
blockrenderdata = generateChestBlockData(mapiter);
|
blockrenderdata = generateChestBlockData(mapiter);
|
||||||
break;
|
break;
|
||||||
case REDSTONE_BLKTYPEID: /* Special case for redstone - fake data for wire pattern */
|
case REDSTONE_ALGORITHM:
|
||||||
blockrenderdata = generateRedstoneWireBlockData(mapiter);
|
blockrenderdata = generateRedstoneWireBlockData(mapiter);
|
||||||
break;
|
break;
|
||||||
case IRONFENCE_BLKTYPEID: /* Special case for iron fence - fake data for adjacent block info */
|
case GLASS_IRONFENCE_ALG:
|
||||||
case GLASSPANE_BLKTYPEID: /* Special case for glass pane - fake data for adjacent block info */
|
|
||||||
blockrenderdata = generateIronFenceGlassBlockData(mapiter, blocktypeid);
|
blockrenderdata = generateIronFenceGlassBlockData(mapiter, blocktypeid);
|
||||||
break;
|
break;
|
||||||
|
case WIRE_ALGORITHM:
|
||||||
|
blockrenderdata = generateWireBlockData(mapiter, HDBlockModels.getLinkIDs(blocktypeid));
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
default:
|
default:
|
||||||
blockrenderdata = -1;
|
blockrenderdata = -1;
|
||||||
break;
|
break;
|
||||||
|
@ -31,6 +31,8 @@ rotate:id=53,data=0,rot=90
|
|||||||
# Nether brick stair - up east
|
# Nether brick stair - up east
|
||||||
block:id=53,id=67,id=108,id=109,id=114,data=3,scale=2
|
block:id=53,id=67,id=108,id=109,id=114,data=3,scale=2
|
||||||
rotate:id=53,data=0,rot=270
|
rotate:id=53,data=0,rot=270
|
||||||
|
# Chest - set render alg
|
||||||
|
linkmap:id=54,linkalg=2
|
||||||
# Slab (stone, sandstone, wood, cobblestone)
|
# Slab (stone, sandstone, wood, cobblestone)
|
||||||
block:id=44,data=*,scale=4
|
block:id=44,data=*,scale=4
|
||||||
layer:0,1
|
layer:0,1
|
||||||
@ -173,6 +175,9 @@ rotate:id=50,data=1,rot=90
|
|||||||
# Redstone torch off - pointing east
|
# Redstone torch off - pointing east
|
||||||
block:id=50,id=75,id=76,data=4,scale=16
|
block:id=50,id=75,id=76,data=4,scale=16
|
||||||
rotate:id=50,data=1,rot=270
|
rotate:id=50,data=1,rot=270
|
||||||
|
# Fence - set render algorithm
|
||||||
|
# Nether brick fence - set render alg
|
||||||
|
linkmap:id=85,id=113,linkalg=1
|
||||||
# Fence - (data is faked: 1=north,2=east,4=south,8=west)
|
# Fence - (data is faked: 1=north,2=east,4=south,8=west)
|
||||||
# Fence - no neighbors
|
# Fence - no neighbors
|
||||||
# Nether Brick Fence
|
# Nether Brick Fence
|
||||||
@ -876,6 +881,8 @@ rotate:id=68,data=2,rot=270
|
|||||||
# Wall sign - facing south
|
# Wall sign - facing south
|
||||||
block:id=68,data=5,scale=8
|
block:id=68,data=5,scale=8
|
||||||
rotate:id=68,data=2,rot=90
|
rotate:id=68,data=2,rot=90
|
||||||
|
# Redstone - render alg
|
||||||
|
linkmap:id=55,linkalg=3
|
||||||
# Redstone wire (NSEW)
|
# Redstone wire (NSEW)
|
||||||
block:id=55,data=0,scale=16
|
block:id=55,data=0,scale=16
|
||||||
layer:0,1
|
layer:0,1
|
||||||
@ -1904,6 +1911,9 @@ rotate:id=34,data=2,rot=270
|
|||||||
# Piston extension - extended facing west
|
# Piston extension - extended facing west
|
||||||
block:id=34,data=5,data=13,scale=8
|
block:id=34,data=5,data=13,scale=8
|
||||||
rotate:id=34,data=2,rot=90
|
rotate:id=34,data=2,rot=90
|
||||||
|
# Glass pane - render alg
|
||||||
|
# Iron fence - render alg
|
||||||
|
linkmap:id=101,id=102,linkalg=4
|
||||||
# Glass pane - no adjacent (0), all adjacent (15)
|
# Glass pane - no adjacent (0), all adjacent (15)
|
||||||
# Iron fence - no adjacent (0), all adjacent (15)
|
# Iron fence - no adjacent (0), all adjacent (15)
|
||||||
block:id=102,id=101,data=0,data=15,scale=16
|
block:id=102,id=101,data=0,data=15,scale=16
|
||||||
|
Loading…
Reference in New Issue
Block a user