package org.dynmap.hdmap.renderer; import java.util.ArrayList; import java.util.Map; import org.dynmap.renderer.CustomRenderer; import org.dynmap.renderer.MapDataContext; import org.dynmap.renderer.RenderPatch; import org.dynmap.renderer.RenderPatchFactory; public class ThaumFurnaceRenderer extends CustomRenderer { private int blkid; private static final int TXTIDX_FIRST_GRID = 0; /* First 9 - 3 x 3 arrangement */ private static final int TXTIDX_SECOND_GRID = 9; /* Second 9 - 3 x 3 arrangement */ private static final int TXTIDX_SPECIAL_23 = 18; /* 23 */ private static final int TXTIDX_SPECIAL_24 = 19; /* 24 */ private static final int TXTIDX_SPECIAL_39 = 20; /* 39 */ private static final int TXTIDX_SPECIAL_40 = 21; /* 40 */ private static final int TXTIDX_SPECIAL_6 = 22; /* 6 */ private static final int TXTIDX_SPECIAL_7 = 23; /* 7 */ private static final int TXTIDX_LAVA = 24; /* Lava */ @Override public boolean initializeRenderer(RenderPatchFactory rpf, int blkid, int blockdatamask, Map<String,String> custparm) { if(!super.initializeRenderer(rpf, blkid, blockdatamask, custparm)) return false; this.blkid = blkid; /* Remember our block ID */ return true; } private boolean blockTouching(MapDataContext ctx, int id, int meta, int side) { if ( ((side > 3) && (ctx.getBlockTypeIDAt(0, 0, 1) == id) && (ctx.getBlockDataAt(0, 0, 1) == meta)) || ((side > 3) && (ctx.getBlockTypeIDAt(0, 0, -1) == id) && (ctx.getBlockDataAt(0, 0, -1) == meta)) || ((side > 1) && (side < 4) && (ctx.getBlockTypeIDAt(1, 0, 0) == id) && (ctx.getBlockDataAt(1, 0, 0) == meta)) || ((side > 1) && (side < 4) && (ctx.getBlockTypeIDAt(-1, 0, 0) == id) && (ctx.getBlockDataAt(-1, 0, 0) == meta)) || ((side > 1) && (ctx.getBlockTypeIDAt(0, 1, 0) == id) && (ctx.getBlockDataAt(0, 1, 0) == meta)) || ((side > 1) && (ctx.getBlockTypeIDAt(0, -1, 0) == id) && (ctx.getBlockDataAt(0, -1, 0) == meta))) { return true; } if ( ((side > 3) && (ctx.getBlockTypeIDAt(0, 1, 1) == id) && (ctx.getBlockDataAt(0, 1, 1) == meta)) || ((side > 3) && (ctx.getBlockTypeIDAt(0, 1, -1) == id) && (ctx.getBlockDataAt(0, 1, -1) == meta)) || ((side > 1) && (side < 4) && (ctx.getBlockTypeIDAt(1, 1, 0) == id) && (ctx.getBlockDataAt(1, 1, 0) == meta)) || ((side > 1) && (side < 4) && (ctx.getBlockTypeIDAt(-1, 1, 0) == id) && (ctx.getBlockDataAt(-1, 1, 0) == meta))) { return true; } if ( ((side > 3) && (ctx.getBlockTypeIDAt(0, -1, 1) == id) && (ctx.getBlockDataAt(0, -1, 1) == meta)) || ((side > 3) && (ctx.getBlockTypeIDAt(0, -1, -1) == id) && (ctx.getBlockDataAt(0, -1, -1) == meta)) || ((side > 1) && (side < 4) && (ctx.getBlockTypeIDAt(1, -1, 0) == id) && (ctx.getBlockDataAt(1, -1, 0) == meta)) || ((side > 1) && (side < 4) && (ctx.getBlockTypeIDAt(-1, -1, 0) == id) && (ctx.getBlockDataAt(-1, -1, 0) == meta))) { return true; } switch (side) { case 0: if ((ctx.getBlockTypeIDAt(0, -1, 0) != id) || (ctx.getBlockDataAt(0, -1, 0) != meta)) break; return true; case 1: if ((ctx.getBlockTypeIDAt(0, 1, 0) != id) || (ctx.getBlockDataAt(0, 1, 0) != meta)) break; return true; } return false; } /* Calculate index of texture for given side */ private int calcTexture(MapDataContext ctx, int side) { int meta = ctx.getBlockData(); int lvl = calcLevel(ctx); int add = TXTIDX_FIRST_GRID; if(blockTouching(ctx, blkid, 10, side)) { add = TXTIDX_SECOND_GRID; } switch (side) { case 0: case 1: if ((side == 1) && (lvl == 2)) { switch (meta) { case 2: return TXTIDX_SPECIAL_23; case 4: return TXTIDX_SPECIAL_24; case 6: return TXTIDX_SPECIAL_40; case 8: return TXTIDX_SPECIAL_39; } } if (add == TXTIDX_SECOND_GRID) break; if (meta == 5) return TXTIDX_SPECIAL_7; return (meta - 1) % 3 + (meta - 1) / 3 * 3; case 2: switch (meta) { default: if (lvl != 1) return TXTIDX_SPECIAL_7; return TXTIDX_SPECIAL_6; case 1: return 2 + (lvl*3) + add; case 2: return 1 + (lvl*3) + add; case 3: return 0 + (lvl*3) + add; } case 3: switch (meta) { default: if (lvl != 1) return TXTIDX_SPECIAL_7; return TXTIDX_SPECIAL_6; case 7: return 0 + (lvl*3) + add; case 8: return 1 + (lvl*3) + add; case 9: return 2 + (lvl*3) + add; } case 4: switch (meta) { default: if (lvl != 1) return TXTIDX_SPECIAL_7; return TXTIDX_SPECIAL_6; case 1: return 0 + (lvl*3) + add; case 4: return 1 + (lvl*3) + add; case 7: return 2 + (lvl*3) + add; } case 5: switch (meta) { default: if (lvl != 1) return TXTIDX_SPECIAL_7; return TXTIDX_SPECIAL_6; case 3: return 2 + (lvl*3) + add; case 6: return 1 + (lvl*3) + add; case 9: return 0 + (lvl*3) + add; } } return add == 0 ? TXTIDX_SPECIAL_7 : TXTIDX_SPECIAL_6; } private int calcLevel(MapDataContext ctx) { int meta = ctx.getBlockData(); int metaA = ctx.getBlockDataAt(0, 1, 0); if ((metaA == 10) || (metaA == 0)) metaA = meta; int metaB = ctx.getBlockDataAt(0, -1, 0); if ((metaB == 10) || (metaB == 0)) metaB = meta; int blockA = ctx.getBlockTypeIDAt(0, 1, 0); int blockB = ctx.getBlockTypeIDAt(0, -1, 0); if ((meta == metaA) && (meta == metaB) && (blkid == blockA) && (blkid == blockB)) return 1; if ((meta == metaA) && (blkid == blockA) && ((meta != metaB) || (blkid != blockB))) return 2; return 0; } @Override public int getMaximumTextureCount() { return 24; } @Override public RenderPatch[] getRenderPatchList(MapDataContext ctx) { ArrayList<RenderPatch> list = new ArrayList<RenderPatch>(); int txtids[] = new int[6]; if(ctx.getBlockData() == 0) { for(int i = 0; i < 6; i++) { txtids[i] = TXTIDX_LAVA; } } else { for(int i = 0; i < 6; i++) { txtids[i] = calcTexture(ctx, i); } } CustomRenderer.addBox(ctx.getPatchFactory(), list, 0, 1, 0, 1, 0, 1, txtids); return list.toArray(new RenderPatch[6]); } }