Search in sources :

Example 56 with DynmapBlockState

use of org.dynmap.renderer.DynmapBlockState in project dynmap by webbukkit.

the class HDBlockModels method loadModelFile.

/**
 * Load models from file
 * @param core
 */
private static void loadModelFile(InputStream in, String fname, ConfigurationNode config, DynmapCore core, String blockset) {
    LineNumberReader rdr = null;
    int cnt = 0;
    boolean need_mod_cfg = false;
    boolean mod_cfg_loaded = false;
    String modname = "minecraft";
    String modversion = null;
    final String mcver = core.getDynmapPluginPlatformVersion();
    BlockStateParser bsp = new BlockStateParser();
    Map<DynmapBlockState, BitSet> bsprslt;
    try {
        String line;
        ArrayList<HDBlockVolumetricModel> modlist = new ArrayList<HDBlockVolumetricModel>();
        ArrayList<HDBlockPatchModel> pmodlist = new ArrayList<HDBlockPatchModel>();
        HashMap<String, Integer> varvals = new HashMap<String, Integer>();
        HashMap<String, PatchDefinition> patchdefs = new HashMap<String, PatchDefinition>();
        pdf.setPatchNameMape(patchdefs);
        int layerbits = 0;
        int rownum = 0;
        int scale = 0;
        rdr = new LineNumberReader(new InputStreamReader(in));
        while ((line = rdr.readLine()) != null) {
            boolean skip = false;
            int lineNum = rdr.getLineNumber();
            if ((line.length() > 0) && (line.charAt(0) == '[')) {
                // If version constrained like
                // Find end
                int end = line.indexOf(']');
                if (end < 0) {
                    Log.severe("Format error - line " + lineNum + " of " + fname + ": bad version limit");
                    return;
                }
                String vertst = line.substring(1, end);
                String tver = mcver;
                if (vertst.startsWith("mod:")) {
                    // If mod version ranged
                    tver = modversion;
                    vertst = vertst.substring(4);
                }
                if (!HDBlockModels.checkVersionRange(tver, vertst)) {
                    skip = true;
                }
                line = line.substring(end + 1);
            }
            // Comment line
            if (line.startsWith("#") || line.startsWith(";")) {
                skip = true;
            }
            // If we're skipping due to version restriction
            if (skip)
                continue;
            // Split off <type>:
            int typeend = line.indexOf(':');
            String typeid = "";
            if (typeend >= 0) {
                typeid = line.substring(0, typeend);
                line = line.substring(typeend + 1).trim();
            }
            if (typeid.equals("block")) {
                // Parse block states
                bsp.processLine(modname, line, lineNum, varvals);
                scale = 0;
                String[] args = line.split(",");
                for (String a : args) {
                    String[] av = a.split("=");
                    if (av.length < 2)
                        continue;
                    if (av[0].equals("scale")) {
                        scale = Integer.parseInt(av[1]);
                    }
                }
                bsprslt = bsp.getMatchingStates();
                /* If we have everything, build block */
                if ((bsprslt.size() > 0) && (scale > 0)) {
                    modlist.clear();
                    for (DynmapBlockState bblk : bsprslt.keySet()) {
                        if (bblk.isNotAir()) {
                            modlist.add(new HDBlockVolumetricModel(bblk, bsprslt.get(bblk), scale, new long[0], blockset));
                            cnt++;
                        } else {
                            Log.severe("Invalid model block name " + bblk.blockName + " at line " + lineNum);
                        }
                    }
                } else {
                    Log.severe("Block model missing required parameters = line " + lineNum + " of " + fname);
                }
                layerbits = 0;
            } else if (typeid.equals("layer")) {
                String[] args = line.split(",");
                layerbits = 0;
                rownum = 0;
                for (String a : args) {
                    layerbits |= (1 << Integer.parseInt(a));
                }
            } else if (typeid.equals("rotate")) {
                // Parse block states
                bsp.processLine(modname, line, lineNum, varvals);
                String[] args = line.split(",");
                int rot = -1;
                for (String a : args) {
                    String[] av = a.split("=");
                    if (av.length < 2)
                        continue;
                    if (av[0].equals("rot")) {
                        rot = Integer.parseInt(av[1]);
                    }
                }
                bsprslt = bsp.getMatchingStates();
                if (bsprslt.size() != 1) {
                    Log.severe("Missing rotate source on line " + lineNum);
                    continue;
                }
                DynmapBlockState basebs = bsprslt.keySet().iterator().next();
                BitSet bits = bsprslt.get(basebs);
                /* get old model to be rotated */
                DynmapBlockState bs = basebs.getState(bits.nextSetBit(0));
                if (bs.isAir()) {
                    Log.severe("Invalid rotate ID: " + bs + " on line " + lineNum);
                    continue;
                }
                HDBlockModel mod = models_by_id_data.get(bs.globalStateIndex);
                if (modlist.isEmpty()) {
                } else if ((mod != null) && ((rot % 90) == 0) && (mod instanceof HDBlockVolumetricModel)) {
                    HDBlockVolumetricModel vmod = (HDBlockVolumetricModel) mod;
                    for (int x = 0; x < scale; x++) {
                        for (int y = 0; y < scale; y++) {
                            for (int z = 0; z < scale; z++) {
                                if (vmod.isSubblockSet(x, y, z) == false)
                                    continue;
                                switch(rot) {
                                    case 0:
                                        for (HDBlockVolumetricModel bm : modlist) {
                                            bm.setSubblock(x, y, z, true);
                                        }
                                        break;
                                    case 90:
                                        for (HDBlockVolumetricModel bm : modlist) {
                                            bm.setSubblock(scale - z - 1, y, x, true);
                                        }
                                        break;
                                    case 180:
                                        for (HDBlockVolumetricModel bm : modlist) {
                                            bm.setSubblock(scale - x - 1, y, scale - z - 1, true);
                                        }
                                        break;
                                    case 270:
                                        for (HDBlockVolumetricModel bm : modlist) {
                                            bm.setSubblock(z, y, scale - x - 1, true);
                                        }
                                        break;
                                }
                            }
                        }
                    }
                } else {
                    Log.severe("Invalid rotate error - line " + lineNum + " of " + fname);
                    continue;
                }
            } else if (typeid.equals("patchrotate")) {
                // Parse block states
                bsp.processLine(modname, line, lineNum, varvals);
                String[] args = line.split(",");
                int rotx = 0;
                int roty = 0;
                int rotz = 0;
                for (String a : args) {
                    String[] av = a.split("=");
                    if (av.length < 2)
                        continue;
                    if (av[0].equals("rot")) {
                        roty = Integer.parseInt(av[1]);
                    }
                    if (av[0].equals("roty")) {
                        roty = Integer.parseInt(av[1]);
                    }
                    if (av[0].equals("rotx")) {
                        rotx = Integer.parseInt(av[1]);
                    }
                    if (av[0].equals("rotz")) {
                        rotz = Integer.parseInt(av[1]);
                    }
                }
                bsprslt = bsp.getMatchingStates();
                if (bsprslt.size() != 1) {
                    Log.severe("Missing rotate source on line " + lineNum);
                    continue;
                }
                DynmapBlockState basebs = bsprslt.keySet().iterator().next();
                BitSet bits = bsprslt.get(basebs);
                /* get old model to be rotated */
                DynmapBlockState bs = basebs.getState(bits.nextSetBit(0));
                if (bs.isAir()) {
                    Log.severe("Invalid patchrotate ID: " + bs + " on line " + lineNum);
                    continue;
                }
                HDBlockModel mod = models_by_id_data.get(bs.globalStateIndex);
                if (pmodlist.isEmpty()) {
                } else if ((mod != null) && (mod instanceof HDBlockPatchModel)) {
                    HDBlockPatchModel pmod = (HDBlockPatchModel) mod;
                    PatchDefinition[] patches = pmod.getPatches();
                    PatchDefinition[] newpatches = new PatchDefinition[patches.length];
                    for (int i = 0; i < patches.length; i++) {
                        newpatches[i] = (PatchDefinition) pdf.getRotatedPatch(patches[i], rotx, roty, rotz, patches[i].textureindex);
                    }
                    if (patches.length > max_patches)
                        max_patches = patches.length;
                    for (HDBlockPatchModel patchmod : pmodlist) {
                        patchmod.setPatches(newpatches);
                    }
                } else {
                    Log.severe("Invalid rotate error - line " + lineNum + " of " + fname);
                    return;
                }
            } else if (typeid.equals("ignore-updates")) {
                // Parse block states
                bsp.processLine(modname, line, lineNum, varvals);
                bsprslt = bsp.getMatchingStates();
                for (DynmapBlockState bbs : bsprslt.keySet()) {
                    if (bbs.isNotAir()) {
                        BitSet bits = bsprslt.get(bbs);
                        for (int i = bits.nextSetBit(0); i >= 0; i = bits.nextSetBit(i + 1)) {
                            DynmapBlockState bs = bbs.getState(i);
                            changeIgnoredBlocks.set(bs.globalStateIndex);
                        }
                    } else {
                        Log.severe("Invalid update ignore block name " + bbs + " at line " + lineNum);
                    }
                }
            } else if (typeid.equals("enabled")) {
                /* Test if texture file is enabled */
                if (line.startsWith("true")) {
                /* We're enabled? */
                /* Nothing to do - keep processing */
                } else if (line.startsWith("false")) {
                    /* Disabled */
                    return;
                /* Quit */
                } else /* If setting is not defined or false, quit */
                if (config.getBoolean(line, false) == false) {
                    return;
                } else {
                    Log.info(line + " models enabled");
                }
            } else if (typeid.equals("var")) {
                /* Test if variable declaration */
                String[] args = line.split(",");
                for (int i = 0; i < args.length; i++) {
                    String[] v = args[i].split("=");
                    if (v.length < 2) {
                        Log.severe("Format error - line " + lineNum + " of " + fname);
                        return;
                    }
                    try {
                        int val = Integer.valueOf(v[1]);
                        /* Parse default value */
                        int parmval = config.getInteger(v[0], val);
                        /* Read value, with applied default */
                        varvals.put(v[0], parmval);
                    /* And save value */
                    } catch (NumberFormatException nfx) {
                        Log.severe("Format error - line " + lineNum + " of " + fname);
                        return;
                    }
                }
            } else if (typeid.equals("cfgfile")) {
                /* If config file */
                File cfgfile = new File(line);
                ForgeConfigFile cfg = new ForgeConfigFile(cfgfile);
                if (!mod_cfg_loaded) {
                    need_mod_cfg = true;
                }
                if (cfg.load()) {
                    cfg.addBlockIDs(varvals);
                    need_mod_cfg = false;
                    mod_cfg_loaded = true;
                }
            } else if (typeid.equals("patch")) {
                String patchid = null;
                String[] args = line.split(",");
                double p_x0 = 0.0, p_y0 = 0.0, p_z0 = 0.0;
                double p_xu = 0.0, p_yu = 1.0, p_zu = 0.0;
                double p_xv = 1.0, p_yv = 0.0, p_zv = 0.0;
                double p_umin = 0.0, p_umax = 1.0;
                double p_vmin = 0.0, p_vmax = 1.0;
                double p_vmaxatumax = -1.0;
                double p_vminatumax = -1.0;
                double p_uplusvmax = -1.0;
                SideVisible p_sidevis = SideVisible.BOTH;
                for (String a : args) {
                    String[] av = a.split("=");
                    if (av.length < 2)
                        continue;
                    if (av[0].equals("id")) {
                        patchid = av[1];
                    } else if (av[0].equals("Ox")) {
                        p_x0 = Double.parseDouble(av[1]);
                    } else if (av[0].equals("Oy")) {
                        p_y0 = Double.parseDouble(av[1]);
                    } else if (av[0].equals("Oz")) {
                        p_z0 = Double.parseDouble(av[1]);
                    } else if (av[0].equals("Ux")) {
                        p_xu = Double.parseDouble(av[1]);
                    } else if (av[0].equals("Uy")) {
                        p_yu = Double.parseDouble(av[1]);
                    } else if (av[0].equals("Uz")) {
                        p_zu = Double.parseDouble(av[1]);
                    } else if (av[0].equals("Vx")) {
                        p_xv = Double.parseDouble(av[1]);
                    } else if (av[0].equals("Vy")) {
                        p_yv = Double.parseDouble(av[1]);
                    } else if (av[0].equals("Vz")) {
                        p_zv = Double.parseDouble(av[1]);
                    } else if (av[0].equals("Umin")) {
                        p_umin = Double.parseDouble(av[1]);
                    } else if (av[0].equals("Umax")) {
                        p_umax = Double.parseDouble(av[1]);
                    } else if (av[0].equals("Vmin")) {
                        p_vmin = Double.parseDouble(av[1]);
                    } else if (av[0].equals("Vmax")) {
                        p_vmax = Double.parseDouble(av[1]);
                    } else if (av[0].equals("UplusVmax")) {
                        Log.warning("UplusVmax deprecated - use VmaxAtUMax - line " + lineNum + " of " + fname);
                        p_uplusvmax = Double.parseDouble(av[1]);
                    } else if (av[0].equals("VmaxAtUMax")) {
                        p_vmaxatumax = Double.parseDouble(av[1]);
                    } else if (av[0].equals("VminAtUMax")) {
                        p_vminatumax = Double.parseDouble(av[1]);
                    } else if (av[0].equals("visibility")) {
                        if (av[1].equals("top"))
                            p_sidevis = SideVisible.TOP;
                        else if (av[1].equals("topflip"))
                            p_sidevis = SideVisible.TOPFLIP;
                        else if (av[1].equals("topflipv"))
                            p_sidevis = SideVisible.TOPFLIPV;
                        else if (av[1].equals("topfliphv"))
                            p_sidevis = SideVisible.TOPFLIPHV;
                        else if (av[1].equals("bottom"))
                            p_sidevis = SideVisible.BOTTOM;
                        else if (av[1].equals("flip"))
                            p_sidevis = SideVisible.FLIP;
                        else
                            p_sidevis = SideVisible.BOTH;
                    }
                }
                // Deprecated: If set, compute umax, vmax, and vmaxatumax
                if (p_uplusvmax >= 0.0) {
                    p_umax = p_uplusvmax;
                    p_vmax = p_uplusvmax;
                    p_vmaxatumax = 0.0;
                }
                // If not set, match p_vmax by default
                if (p_vmaxatumax < 0.0) {
                    p_vmaxatumax = p_vmax;
                }
                // If not set, match p_vmin by default
                if (p_vminatumax < 0.0) {
                    p_vminatumax = p_vmin;
                }
                /* If completed, add to map */
                if (patchid != null) {
                    PatchDefinition pd = pdf.getPatch(p_x0, p_y0, p_z0, p_xu, p_yu, p_zu, p_xv, p_yv, p_zv, p_umin, p_umax, p_vmin, p_vminatumax, p_vmax, p_vmaxatumax, p_sidevis, 0);
                    if (pd != null) {
                        patchdefs.put(patchid, pd);
                    }
                }
            } else if (typeid.equals("patchblock")) {
                // Parse block states
                bsp.processLine(modname, line, lineNum, varvals);
                String[] args = line.split(",");
                ArrayList<PatchDefinition> patches = new ArrayList<PatchDefinition>();
                for (String a : args) {
                    String[] av = a.split("=");
                    if (av.length < 2)
                        continue;
                    if (av[0].startsWith("patch")) {
                        int patchnum0, patchnum1;
                        String ids = av[0].substring(5);
                        String[] ids2 = ids.split("-");
                        if (ids2.length == 1) {
                            patchnum0 = patchnum1 = Integer.parseInt(ids2[0]);
                        } else {
                            patchnum0 = Integer.parseInt(ids2[0]);
                            patchnum1 = Integer.parseInt(ids2[1]);
                        }
                        if (patchnum0 < 0) {
                            Log.severe("Invalid patch index " + patchnum0 + " - line " + lineNum + " of " + fname);
                            return;
                        }
                        if (patchnum1 < patchnum0) {
                            Log.severe("Invalid patch index " + patchnum1 + " - line " + lineNum + " of " + fname);
                            return;
                        }
                        String patchid = av[1];
                        /* Look up patch by name */
                        for (int i = patchnum0; i <= patchnum1; i++) {
                            PatchDefinition pd = pdf.getPatchByName(patchid, i);
                            if (pd == null) {
                                Log.severe("Invalid patch ID " + patchid + " - line " + lineNum + " of " + fname);
                                return;
                            }
                            patches.add(i, pd);
                        }
                    }
                }
                /* If we have everything, build block */
                bsprslt = bsp.getMatchingStates();
                pmodlist.clear();
                if (bsprslt.size() > 0) {
                    PatchDefinition[] patcharray = patches.toArray(new PatchDefinition[patches.size()]);
                    if (patcharray.length > max_patches)
                        max_patches = patcharray.length;
                    for (DynmapBlockState bs : bsprslt.keySet()) {
                        if (bs.isNotAir()) {
                            pmodlist.add(new HDBlockPatchModel(bs, bsprslt.get(bs), patcharray, blockset));
                            cnt++;
                        } else {
                            Log.severe("Invalid patchmodel block name " + bs + " at line " + lineNum);
                        }
                    }
                } else {
                    Log.severe("Patch block model missing required parameters = line " + lineNum + " of " + fname);
                }
            } else // Shortcut for defining a patchblock that is a simple rectangular prism, with sidex corresponding to full block sides
            if (typeid.equals("boxblock")) {
                // Parse block states
                bsp.processLine(modname, line, lineNum, varvals);
                String[] args = line.split(",");
                double xmin = 0.0, xmax = 1.0, ymin = 0.0, ymax = 1.0, zmin = 0.0, zmax = 1.0;
                int[] patchlist = boxPatchList;
                for (String a : args) {
                    String[] av = a.split("=");
                    if (av.length < 2)
                        continue;
                    if (av[0].equals("xmin")) {
                        xmin = Double.parseDouble(av[1]);
                    } else if (av[0].equals("xmax")) {
                        xmax = Double.parseDouble(av[1]);
                    } else if (av[0].equals("ymin")) {
                        ymin = Double.parseDouble(av[1]);
                    } else if (av[0].equals("ymax")) {
                        ymax = Double.parseDouble(av[1]);
                    } else if (av[0].equals("zmin")) {
                        zmin = Double.parseDouble(av[1]);
                    } else if (av[0].equals("zmax")) {
                        zmax = Double.parseDouble(av[1]);
                    } else if (av[0].equals("patches")) {
                        String[] v = av[1].split("/");
                        patchlist = new int[6];
                        for (int vidx = 0; (vidx < v.length) && (vidx < patchlist.length); vidx++) {
                            patchlist[vidx] = getIntValue(varvals, v[vidx]);
                        }
                    }
                }
                /* If we have everything, build block */
                pmodlist.clear();
                bsprslt = bsp.getMatchingStates();
                if (bsprslt.size() > 0) {
                    ArrayList<RenderPatch> pd = new ArrayList<RenderPatch>();
                    CustomRenderer.addBox(pdf, pd, xmin, xmax, ymin, ymax, zmin, zmax, patchlist);
                    PatchDefinition[] patcharray = new PatchDefinition[pd.size()];
                    for (int i = 0; i < patcharray.length; i++) {
                        patcharray[i] = (PatchDefinition) pd.get(i);
                    }
                    if (patcharray.length > max_patches)
                        max_patches = patcharray.length;
                    for (DynmapBlockState bs : bsprslt.keySet()) {
                        if (bs.isNotAir()) {
                            pmodlist.add(new HDBlockPatchModel(bs, bsprslt.get(bs), patcharray, blockset));
                            cnt++;
                        } else {
                            Log.severe("Invalid boxmodel block name " + bs + " at line " + lineNum);
                        }
                    }
                } else {
                    Log.severe("Box block model missing required parameters = line " + lineNum + " of " + fname);
                }
            } else // Shortcut for defining a patchblock that is a simple rectangular prism, with sidex corresponding to full block sides
            if (typeid.equals("boxlist")) {
                // Parse block states
                bsp.processLine(modname, line, lineNum, varvals);
                String[] args = line.split(",");
                ArrayList<BoxLimits> boxes = new ArrayList<BoxLimits>();
                for (String a : args) {
                    String[] av = a.split("=");
                    if (av.length < 2)
                        continue;
                    if (av[0].equals("box")) {
                        String[] prms = av[1].split(":");
                        BoxLimits box = new BoxLimits();
                        if (prms.length > 0)
                            box.xmin = Double.parseDouble(prms[0]);
                        if (prms.length > 1)
                            box.xmax = Double.parseDouble(prms[1]);
                        if (prms.length > 2)
                            box.ymin = Double.parseDouble(prms[2]);
                        if (prms.length > 3)
                            box.ymax = Double.parseDouble(prms[3]);
                        if (prms.length > 4)
                            box.zmin = Double.parseDouble(prms[4]);
                        if (prms.length > 5)
                            box.zmax = Double.parseDouble(prms[5]);
                        if (prms.length > 6) {
                            String[] pl = prms[6].split("/");
                            for (int p = 0; (p < 6) && (p < pl.length); p++) {
                                box.patches[p] = Integer.parseInt(pl[p]);
                            }
                        }
                        if (prms.length > 7) {
                            box.yrot = Integer.parseInt(prms[7]);
                        }
                        boxes.add(box);
                    }
                }
                /* If we have everything, build block */
                bsprslt = bsp.getMatchingStates();
                pmodlist.clear();
                if (bsprslt.size() > 0) {
                    ArrayList<RenderPatch> pd = new ArrayList<RenderPatch>();
                    for (BoxLimits bl : boxes) {
                        CustomRenderer.addBox(pdf, pd, bl.xmin, bl.xmax, bl.ymin, bl.ymax, bl.zmin, bl.zmax, bl.patches, bl.yrot);
                    }
                    PatchDefinition[] patcharray = new PatchDefinition[pd.size()];
                    for (int i = 0; i < patcharray.length; i++) {
                        patcharray[i] = (PatchDefinition) pd.get(i);
                    }
                    if (patcharray.length > max_patches)
                        max_patches = patcharray.length;
                    for (DynmapBlockState bs : bsprslt.keySet()) {
                        if (bs.isNotAir()) {
                            pmodlist.add(new HDBlockPatchModel(bs, bsprslt.get(bs), patcharray, blockset));
                            cnt++;
                        } else {
                            Log.severe("Invalid boxlist block name " + bs + " at line " + lineNum);
                        }
                    }
                } else {
                    Log.severe("Box list block model missing required parameters = line " + lineNum + " of " + fname);
                }
            } else // Shortcur for building JSON model style
            if (typeid.equals("modellist")) {
                // Parse block states
                bsp.processLine(modname, line, lineNum, varvals);
                String[] args = line.split(",");
                ArrayList<ModelBox> boxes = new ArrayList<ModelBox>();
                for (String a : args) {
                    String[] av = a.split("=");
                    if (av.length < 2)
                        continue;
                    if (av[0].equals("box")) {
                        // box=from-x/y/z:to-x/y/z/rotx/roty/rotz:<side - upnsew>/<txtidx>/umin/vmin/umax/vmax>:...
                        String[] prms = av[1].split(":");
                        ModelBox box = new ModelBox();
                        if (prms.length > 0) {
                            // Handle from (from-x/y/z or from-x/y/z/shadow)
                            String[] xyz = prms[0].split("/");
                            if ((xyz.length == 3) || (xyz.length == 4)) {
                                box.from[0] = Double.parseDouble(xyz[0]);
                                box.from[1] = Double.parseDouble(xyz[1]);
                                box.from[2] = Double.parseDouble(xyz[2]);
                                if ((xyz.length >= 4) && (xyz[3].equals("false"))) {
                                    box.shade = false;
                                }
                            } else {
                                Log.severe("Invalid modellist FROM value (" + prms[0] + " at line " + lineNum);
                            }
                        }
                        if (prms.length > 1) {
                            // Handle to (to-x/y/z or to-x/y/z/rotx/roty/rotz) or to-x/y/z/rotx/roty/rotz/rorigx/rorigy/rorigz
                            String[] xyz = prms[1].split("/");
                            if (xyz.length >= 3) {
                                box.to[0] = Double.parseDouble(xyz[0]);
                                box.to[1] = Double.parseDouble(xyz[1]);
                                box.to[2] = Double.parseDouble(xyz[2]);
                                if (xyz.length >= 6) {
                                    // If 6, second set are rotations (xrot/yrot/zrot)
                                    box.xrot = Double.parseDouble(xyz[3]);
                                    box.yrot = Double.parseDouble(xyz[4]);
                                    box.zrot = Double.parseDouble(xyz[5]);
                                }
                                if (xyz.length >= 9) {
                                    // If 9, third set is rotation origin (xrot/yrot/zrot)
                                    box.xrotorig = Double.parseDouble(xyz[6]);
                                    box.yrotorig = Double.parseDouble(xyz[7]);
                                    box.zrotorig = Double.parseDouble(xyz[8]);
                                }
                            } else {
                                Log.severe("Invalid modellist TO value (" + prms[1] + " at line " + lineNum);
                            }
                        }
                        // OR R/mrx/mry/mrz for model rotation
                        for (int faceidx = 2; faceidx < prms.length; faceidx++) {
                            String v = prms[faceidx];
                            String[] flds = v.split("/");
                            // If rotation
                            if (flds[0].equals("R") && (flds.length == 4)) {
                                box.modrotx = Integer.parseInt(flds[1]);
                                box.modroty = Integer.parseInt(flds[2]);
                                box.modrotz = Integer.parseInt(flds[3]);
                                continue;
                            }
                            ModelBoxSide side = new ModelBoxSide();
                            side.rot = null;
                            if ((flds.length != 2) && (flds.length != 6)) {
                                Log.severe("Invalid modellist face '" + v + "' at line " + lineNum);
                                continue;
                            }
                            if (flds.length > 0) {
                                String face = flds[0];
                                side.side = toBlockSide.get(face.substring(0, 1));
                                if (side.side == null) {
                                    Log.severe("Invalid modellist side value (" + face + ") in '" + v + "' at line " + lineNum);
                                    continue;
                                }
                                if (flds[0].length() > 1) {
                                    String r = flds[0].substring(1);
                                    switch(r) {
                                        case "90":
                                            side.rot = ModelBlockModel.SideRotation.DEG90;
                                            break;
                                        case "180":
                                            side.rot = ModelBlockModel.SideRotation.DEG180;
                                            break;
                                        case "270":
                                            side.rot = ModelBlockModel.SideRotation.DEG270;
                                            break;
                                    }
                                }
                            }
                            if (flds.length > 1) {
                                side.textureid = getIntValue(varvals, flds[1]);
                            }
                            if (flds.length >= 6) {
                                side.uv = new double[4];
                                side.uv[0] = Double.parseDouble(flds[2]);
                                side.uv[1] = Double.parseDouble(flds[3]);
                                side.uv[2] = Double.parseDouble(flds[4]);
                                side.uv[3] = Double.parseDouble(flds[5]);
                            }
                            box.sides.add(side);
                        }
                        boxes.add(box);
                    }
                }
                /* If we have everything, build block */
                bsprslt = bsp.getMatchingStates();
                pmodlist.clear();
                if (bsprslt.size() > 0) {
                    ArrayList<PatchDefinition> pd = new ArrayList<PatchDefinition>();
                    for (ModelBox bl : boxes) {
                        // Loop through faces
                        for (ModelBoxSide side : bl.sides) {
                            PatchDefinition patch = pdf.getModelFace(bl.from, bl.to, side.side, side.uv, side.rot, bl.shade, side.textureid);
                            if (patch != null) {
                                // If any rotations, apply them here
                                if ((bl.xrot != 0) || (bl.yrot != 0) || (bl.zrot != 0)) {
                                    patch = pdf.getPatch(patch, -bl.xrot, -bl.yrot, -bl.zrot, new Vector3D(bl.xrotorig / 16, bl.yrotorig / 16, bl.zrotorig / 16), patch.textureindex);
                                    if (patch == null)
                                        continue;
                                }
                                // If model rotation, apply too
                                if ((bl.modrotx != 0) || (bl.modroty != 0) || (bl.modrotz != 0)) {
                                    patch = pdf.getPatch(patch, bl.modrotx, bl.modroty, bl.modrotz, patch.textureindex);
                                    if (patch == null)
                                        continue;
                                }
                                pd.add(patch);
                            } else {
                                Log.severe(String.format("Invalid modellist patch for box %.02f/%.02f/%.02f:%.02f/%.02f/%.02f side %s at line %d", bl.from[0], bl.from[1], bl.from[2], bl.to[0], bl.to[1], bl.to[2], side.side, lineNum));
                                Log.verboseinfo(String.format("line = %s:%s", typeid, line));
                            }
                        }
                    }
                    PatchDefinition[] patcharray = new PatchDefinition[pd.size()];
                    for (int i = 0; i < patcharray.length; i++) {
                        patcharray[i] = pd.get(i);
                    }
                    if (patcharray.length > max_patches)
                        max_patches = patcharray.length;
                    for (DynmapBlockState bs : bsprslt.keySet()) {
                        if (bs.isNotAir()) {
                            pmodlist.add(new HDBlockPatchModel(bs, bsprslt.get(bs), patcharray, blockset));
                            cnt++;
                        } else {
                            Log.severe("Invalid modellist block name " + bs + " at line " + lineNum);
                        }
                    }
                } else {
                    Log.severe("Model list block model missing required parameters = line " + lineNum + " of " + fname);
                }
            } else if (typeid.equals("customblock")) {
                // Parse block states
                bsp.processLine(modname, line, lineNum, varvals);
                HashMap<String, String> custargs = new HashMap<String, String>();
                String[] args = line.split(",");
                String cls = null;
                for (String a : args) {
                    String[] av = a.split("=");
                    if (av.length < 2)
                        continue;
                    if (av[0].equals("id") || av[0].equals("data") || av[0].equals("state")) {
                    // Skip block state args - should not be bassed to custom block handler
                    } else if (av[0].equals("class")) {
                        cls = av[1];
                    } else {
                        /* See if substitution value available */
                        Integer vv = varvals.get(av[1]);
                        if (vv == null)
                            custargs.put(av[0], av[1]);
                        else
                            custargs.put(av[0], vv.toString());
                    }
                }
                /* If we have everything, build block */
                bsprslt = bsp.getMatchingStates();
                if ((bsprslt.size() > 0) && (cls != null)) {
                    for (DynmapBlockState bs : bsprslt.keySet()) {
                        if (bs.isNotAir()) {
                            CustomBlockModel cbm = new CustomBlockModel(bs, bsprslt.get(bs), cls, custargs, blockset);
                            if (cbm.render == null) {
                                Log.severe("Custom block model failed to initialize = line " + lineNum + " of " + fname);
                            } else {
                                /* Update maximum texture count */
                                int texturecnt = cbm.getTextureCount();
                                if (texturecnt > max_patches) {
                                    max_patches = texturecnt;
                                }
                            }
                            cnt++;
                        } else {
                            Log.severe("Invalid custommodel block name " + bs + " at line " + lineNum);
                        }
                    }
                } else {
                    Log.severe("Custom block model missing required parameters = line " + lineNum + " of " + fname);
                }
            } else if (typeid.equals("modname")) {
                String[] names = line.split(",");
                boolean found = false;
                for (String n : names) {
                    String[] ntok = n.split("[\\[\\]]");
                    String rng = null;
                    if (ntok.length > 1) {
                        n = ntok[0].trim();
                        rng = ntok[1].trim();
                    }
                    n = n.trim();
                    if (loadedmods.contains(n)) {
                        // Already supplied by mod itself?
                        return;
                    }
                    String modver = core.getServer().getModVersion(n);
                    if ((modver != null) && ((rng == null) || checkVersionRange(modver, rng))) {
                        found = true;
                        Log.info(n + "[" + modver + "] models enabled");
                        modname = n;
                        modversion = modver;
                        // Add to loaded mods
                        loadedmods.add(n);
                        // Prime values from block and item unique IDs
                        core.addModBlockItemIDs(modname, varvals);
                        break;
                    }
                }
                if (!found) {
                    return;
                }
            } else if (typeid.equals("version")) {
                if (!checkVersionRange(mcver, line)) {
                    return;
                }
            } else if (layerbits != 0) {
                /* Layerbits determine Y, rows count from North to South (X=0 to X=N-1), columns Z are West to East (N-1 to 0) */
                for (int i = 0; (i < scale) && (i < line.length()); i++) {
                    if (line.charAt(i) == '*') {
                        /* If an asterix, set flag */
                        for (int y = 0; y < scale; y++) {
                            if ((layerbits & (1 << y)) != 0) {
                                for (HDBlockVolumetricModel mod : modlist) {
                                    mod.setSubblock(rownum, y, scale - i - 1, true);
                                }
                            }
                        }
                    }
                }
                /* See if we're done with layer */
                rownum++;
                if (rownum >= scale) {
                    rownum = 0;
                    layerbits = 0;
                }
            }
        }
        if (need_mod_cfg) {
            Log.severe("Error loading configuration file for " + modname);
        }
        Log.verboseinfo("Loaded " + cnt + " block models from " + fname);
    } catch (IOException iox) {
        Log.severe("Error reading models.txt - " + iox.toString());
    } catch (NumberFormatException nfx) {
        Log.severe("Format error - line " + rdr.getLineNumber() + " of " + fname + ": " + nfx.getMessage());
    } finally {
        if (rdr != null) {
            try {
                rdr.close();
                rdr = null;
            } catch (IOException e) {
            }
        }
        pdf.setPatchNameMape(null);
    }
}
Also used : HashMap(java.util.HashMap) DynmapBlockState(org.dynmap.renderer.DynmapBlockState) ArrayList(java.util.ArrayList) LineNumberReader(java.io.LineNumberReader) ForgeConfigFile(org.dynmap.utils.ForgeConfigFile) Vector3D(org.dynmap.utils.Vector3D) SideVisible(org.dynmap.renderer.RenderPatchFactory.SideVisible) InputStreamReader(java.io.InputStreamReader) BlockStateParser(org.dynmap.utils.BlockStateParser) BitSet(java.util.BitSet) PatchDefinition(org.dynmap.utils.PatchDefinition) IOException(java.io.IOException) RenderPatch(org.dynmap.renderer.RenderPatch) ForgeConfigFile(org.dynmap.utils.ForgeConfigFile) ZipFile(java.util.zip.ZipFile) File(java.io.File)

Example 57 with DynmapBlockState

use of org.dynmap.renderer.DynmapBlockState in project dynmap by webbukkit.

the class HDBlockStateTextureMap method addToTable.

// Add block state to table, with given block IDs and state indexes
public void addToTable(Map<DynmapBlockState, BitSet> states) {
    /* Add entries to lookup table */
    for (DynmapBlockState baseblk : states.keySet()) {
        if (baseblk.isNotAir()) {
            BitSet stateidx = states.get(baseblk);
            for (int stateid = stateidx.nextSetBit(0); stateid >= 0; stateid = stateidx.nextSetBit(stateid + 1)) {
                DynmapBlockState bs = baseblk.getState(stateid);
                if (bs.isAir()) {
                    Log.warning("Invalid texture block state: " + baseblk.blockName + ":" + stateid);
                    continue;
                }
                if ((this.blockset != null) && (this.blockset.equals("core") == false)) {
                    HDBlockModels.resetIfNotBlockSet(bs, this.blockset);
                }
                copyToStateIndex(bs, this, null);
            }
        } else {
            Log.warning("Invalid texture block name: " + baseblk.blockName);
        }
    }
}
Also used : DynmapBlockState(org.dynmap.renderer.DynmapBlockState) BitSet(java.util.BitSet)

Example 58 with DynmapBlockState

use of org.dynmap.renderer.DynmapBlockState in project dynmap by webbukkit.

the class OBJExport method handleBlock.

/**
 * Handle block at current iterator coord
 * @param id - block ID
 * @param iter - iterator
 * @param edgebits - bit N corresponds to side N being an endge (forge render)
 */
private void handleBlock(DynmapBlockState blk, MapIterator map, boolean[] edgebits) throws IOException {
    BlockStep[] steps = BlockStep.values();
    int[] txtidx = null;
    // See if the block has a patch model
    RenderPatch[] patches = models.getPatchModel(blk);
    /* If no patches, see if custom model */
    if (patches == null) {
        CustomBlockModel cbm = models.getCustomBlockModel(blk);
        if (cbm != null) {
            /* If so, get our meshes */
            patches = cbm.getMeshForBlock(map);
        }
    }
    if (patches != null) {
        steps = new BlockStep[patches.length];
        txtidx = new int[patches.length];
        for (int i = 0; i < txtidx.length; i++) {
            txtidx[i] = ((PatchDefinition) patches[i]).getTextureIndex();
            steps[i] = ((PatchDefinition) patches[i]).step;
        }
    } else {
        // See if volumetric
        short[] smod = models.getScaledModel(blk);
        if (smod != null) {
            patches = getScaledModelAsPatches(smod);
            steps = new BlockStep[patches.length];
            txtidx = new int[patches.length];
            for (int i = 0; i < patches.length; i++) {
                PatchDefinition pd = (PatchDefinition) patches[i];
                steps[i] = pd.step;
                txtidx[i] = pd.getTextureIndex();
            }
        }
    }
    // Set block ID and ID+meta groups
    updateGroup(GROUP_BLOCKID, "blk" + blk.baseState.globalStateIndex);
    updateGroup(GROUP_BLOCKIDMETA, "blk" + blk.globalStateIndex);
    // Get materials for patches
    String[] mats = shader.getCurrentBlockMaterials(blk, map, txtidx, steps);
    if (patches != null) {
        // Patch based model?
        for (int i = 0; i < patches.length; i++) {
            addPatch((PatchDefinition) patches[i], map.getX(), map.getY(), map.getZ(), mats[i]);
        }
    } else {
        boolean opaque = HDBlockStateTextureMap.getTransparency(blk) == BlockTransparency.OPAQUE;
        for (int face = 0; face < 6; face++) {
            // Get block in direction
            DynmapBlockState blk2 = map.getBlockTypeAt(BlockStep.oppositeValues[face]);
            // If we're not solid, or adjacent block is not solid, draw side
            if ((!opaque) || blk2.isAir() || edgebits[face] || (HDBlockStateTextureMap.getTransparency(blk2) != BlockTransparency.OPAQUE)) {
                addPatch(defaultPathces[face], map.getX(), map.getY(), map.getZ(), mats[face]);
            }
        }
    }
}
Also used : DynmapBlockState(org.dynmap.renderer.DynmapBlockState) BlockStep(org.dynmap.utils.BlockStep) PatchDefinition(org.dynmap.utils.PatchDefinition) CustomBlockModel(org.dynmap.hdmap.CustomBlockModel) RenderPatch(org.dynmap.renderer.RenderPatch)

Example 59 with DynmapBlockState

use of org.dynmap.renderer.DynmapBlockState in project dynmap by webbukkit.

the class DynmapCore method dumpColorMap.

void dumpColorMap(String id, String name) {
    int[] sides = new int[] { BlockStep.Y_MINUS.ordinal(), BlockStep.X_PLUS.ordinal(), BlockStep.Z_PLUS.ordinal(), BlockStep.Y_PLUS.ordinal(), BlockStep.X_MINUS.ordinal(), BlockStep.Z_MINUS.ordinal() };
    FileWriter fw = null;
    try {
        fw = new FileWriter(new File(new File(getDataFolder(), "colorschemes"), id));
        TexturePack tp = TexturePack.getTexturePack(this, name);
        if (tp == null)
            return;
        tp = tp.resampleTexturePack(1);
        if (tp == null)
            return;
        Color c = new Color();
        for (int gidx = 0; gidx < DynmapBlockState.getGlobalIndexMax(); gidx++) {
            DynmapBlockState blk = DynmapBlockState.getStateByGlobalIndex(gidx);
            if (blk.isAir())
                continue;
            int meta0color = 0;
            HDBlockStateTextureMap map = HDBlockStateTextureMap.getByBlockState(blk);
            boolean done = false;
            for (int i = 0; (!done) && (i < sides.length); i++) {
                int idx = map.getIndexForFace(sides[i]);
                if (idx < 0)
                    continue;
                int[] rgb = tp.getTileARGB(idx % 1000000);
                if (rgb == null)
                    continue;
                if (rgb[0] == 0)
                    continue;
                c.setARGB(rgb[0]);
                idx = (idx / 1000000);
                switch(idx) {
                    // grass
                    case 1:
                    case // grass
                    18:
                        Log.verboseinfo("Used grass for " + blk);
                        c.blendColor(tp.getTrivialGrassMultiplier() | 0xFF000000);
                        break;
                    // foliage
                    case 2:
                    // foliage
                    case 19:
                    case // foliage
                    22:
                        Log.verboseinfo("Used foliage for " + blk);
                        c.blendColor(tp.getTrivialFoliageMultiplier() | 0xFF000000);
                        break;
                    case // pine
                    13:
                        c.blendColor(0x619961 | 0xFF000000);
                        break;
                    case // birch
                    14:
                        c.blendColor(0x80a755 | 0xFF000000);
                        break;
                    case // lily
                    15:
                        c.blendColor(0x208030 | 0xFF000000);
                        break;
                    // water
                    case 3:
                    case // water
                    20:
                        Log.verboseinfo("Used water for " + blk);
                        c.blendColor(tp.getTrivialWaterMultiplier() | 0xFF000000);
                        break;
                    case // clear inside
                    12:
                        if (blk.isWater()) {
                            // special case for water
                            Log.verboseinfo("Used water for " + blk);
                            c.blendColor(tp.getTrivialWaterMultiplier() | 0xFF000000);
                        }
                        break;
                }
                int custmult = tp.getCustomBlockMultiplier(blk);
                if (custmult != 0xFFFFFF) {
                    Log.info(String.format("Custom color: %06x for %s", custmult, blk));
                    if ((custmult & 0xFF000000) == 0) {
                        custmult |= 0xFF000000;
                    }
                    c.blendColor(custmult);
                }
                String ln = "";
                if (blk.stateIndex == 0) {
                    meta0color = c.getARGB();
                    ln = blk.blockName + " ";
                } else {
                    ln = blk + " ";
                }
                if ((blk.stateIndex == 0) || (meta0color != c.getARGB())) {
                    ln += c.getRed() + " " + c.getGreen() + " " + c.getBlue() + " " + c.getAlpha();
                    ln += " " + (c.getRed() * 4 / 5) + " " + (c.getGreen() * 4 / 5) + " " + (c.getBlue() * 4 / 5) + " " + c.getAlpha();
                    ln += " " + (c.getRed() / 2) + " " + (c.getGreen() / 2) + " " + (c.getBlue() / 2) + " " + c.getAlpha();
                    ln += " " + (c.getRed() * 2 / 5) + " " + (c.getGreen() * 2 / 5) + " " + (c.getBlue() * 2 / 5) + " " + c.getAlpha() + "\n";
                    fw.write(ln);
                }
                done = true;
            }
        }
    } catch (IOException iox) {
    } finally {
        if (fw != null) {
            try {
                fw.close();
            } catch (IOException x) {
            }
        }
        Log.info("Dumped RP=" + name + " to " + id);
    }
}
Also used : TexturePack(org.dynmap.hdmap.TexturePack) FileWriter(java.io.FileWriter) DynmapBlockState(org.dynmap.renderer.DynmapBlockState) HDBlockStateTextureMap(org.dynmap.hdmap.HDBlockStateTextureMap) IOException(java.io.IOException) ZipFile(java.util.zip.ZipFile) File(java.io.File)

Example 60 with DynmapBlockState

use of org.dynmap.renderer.DynmapBlockState in project dynmap by webbukkit.

the class ColorScheme method loadScheme.

public static ColorScheme loadScheme(DynmapCore core, String name) {
    File colorSchemeFile = new File(getColorSchemeDirectory(core), name + ".txt");
    Color[][] colors = new Color[DynmapBlockState.getGlobalIndexMax()][];
    Color[][] biomecolors = new Color[BiomeMap.values().length][];
    Color[][] raincolors = new Color[64][];
    Color[][] tempcolors = new Color[64][];
    /* Default the biome color */
    for (int i = 0; i < biomecolors.length; i++) {
        Color[] c = new Color[5];
        int red = 0x80 | (0x40 * ((i >> 0) & 1)) | (0x20 * ((i >> 3) & 1)) | (0x10 * ((i >> 6) & 1));
        int green = 0x80 | (0x40 * ((i >> 1) & 1)) | (0x20 * ((i >> 4) & 1)) | (0x10 * ((i >> 7) & 1));
        int blue = 0x80 | (0x40 * ((i >> 2) & 1)) | (0x20 * ((i >> 5) & 1));
        c[0] = new Color(red, green, blue);
        c[3] = new Color(red * 4 / 5, green * 4 / 5, blue * 4 / 5);
        c[1] = new Color(red / 2, green / 2, blue / 2);
        c[2] = new Color(red * 2 / 5, green * 2 / 5, blue * 2 / 5);
        c[4] = new Color((c[1].getRed() + c[3].getRed()) / 2, (c[1].getGreen() + c[3].getGreen()) / 2, (c[1].getBlue() + c[3].getBlue()) / 2, (c[1].getAlpha() + c[3].getAlpha()) / 2);
        biomecolors[i] = c;
    }
    InputStream stream;
    // Get defaults from biome_rainfall_temp.txt - let custom file override after
    File[] files = { new File(getColorSchemeDirectory(core), "biome_rainfall_temp.txt"), new File(getColorSchemeDirectory(core), "default.txt"), colorSchemeFile };
    try {
        for (int fidx = 0; fidx < files.length; fidx++) {
            Debug.debug("Loading colors from '" + files[fidx] + "' for " + name + "...");
            stream = new FileInputStream(files[fidx]);
            Scanner scanner = new Scanner(stream);
            while (scanner.hasNextLine()) {
                String line = scanner.nextLine();
                if (line.startsWith("#") || line.equals("")) {
                    continue;
                }
                /* Make parser less pedantic - tabs or spaces should be fine */
                String[] split = line.split("[\t ]");
                int cnt = 0;
                for (String s : split) {
                    if (s.length() > 0)
                        cnt++;
                }
                String[] nsplit = new String[cnt];
                cnt = 0;
                for (String s : split) {
                    if (s.length() > 0) {
                        nsplit[cnt] = s;
                        cnt++;
                    }
                }
                split = nsplit;
                if (split.length < 17) {
                    continue;
                }
                Integer id = null;
                boolean isbiome = false;
                boolean istemp = false;
                boolean israin = false;
                DynmapBlockState state = null;
                int idx = split[0].indexOf(':');
                if (idx > 0) {
                    /* ID:data - data color OR blockstate - data color */
                    String[] vsplit = split[0].split("[\\[\\]]");
                    // vsplit[0], vsplit.length > 1 ? vsplit[1] : ""));
                    if (vsplit.length > 1) {
                        state = DynmapBlockState.getStateByNameAndState(vsplit[0], vsplit[1]);
                    } else {
                        state = DynmapBlockState.getBaseStateByName(vsplit[0]);
                    }
                } else if (split[0].charAt(0) == '[') {
                    /* Biome color data */
                    String bio = split[0].substring(1);
                    idx = bio.indexOf(']');
                    if (idx >= 0)
                        bio = bio.substring(0, idx);
                    isbiome = true;
                    id = -1;
                    BiomeMap[] bm = BiomeMap.values();
                    for (int i = 0; i < bm.length; i++) {
                        if (bm[i].getId().equalsIgnoreCase(bio)) {
                            id = i;
                            break;
                        } else if (bio.equalsIgnoreCase("BIOME_" + i)) {
                            id = i;
                            break;
                        }
                    }
                    if (id < 0) {
                        /* Not biome - check for rain or temp */
                        if (bio.startsWith("RAINFALL-")) {
                            try {
                                double v = Double.parseDouble(bio.substring(9));
                                if ((v >= 0) && (v <= 1.00)) {
                                    id = (int) (v * 63.0);
                                    israin = true;
                                }
                            } catch (NumberFormatException nfx) {
                            }
                        } else if (bio.startsWith("TEMPERATURE-")) {
                            try {
                                double v = Double.parseDouble(bio.substring(12));
                                if ((v >= 0) && (v <= 1.00)) {
                                    id = (int) (v * 63.0);
                                    istemp = true;
                                }
                            } catch (NumberFormatException nfx) {
                            }
                        }
                    }
                } else {
                    id = Integer.parseInt(split[0]);
                    state = DynmapBlockState.getStateByLegacyBlockID(id);
                }
                Color[] c = new Color[5];
                /* store colors by raycast sequence number */
                c[0] = new Color(Integer.parseInt(split[1]), Integer.parseInt(split[2]), Integer.parseInt(split[3]), Integer.parseInt(split[4]));
                c[3] = new Color(Integer.parseInt(split[5]), Integer.parseInt(split[6]), Integer.parseInt(split[7]), Integer.parseInt(split[8]));
                c[1] = new Color(Integer.parseInt(split[9]), Integer.parseInt(split[10]), Integer.parseInt(split[11]), Integer.parseInt(split[12]));
                c[2] = new Color(Integer.parseInt(split[13]), Integer.parseInt(split[14]), Integer.parseInt(split[15]), Integer.parseInt(split[16]));
                /* Blended color - for 'smooth' option on flat map */
                c[4] = new Color((c[1].getRed() + c[3].getRed()) / 2, (c[1].getGreen() + c[3].getGreen()) / 2, (c[1].getBlue() + c[3].getBlue()) / 2, (c[1].getAlpha() + c[3].getAlpha()) / 2);
                if (isbiome) {
                    if (istemp) {
                        tempcolors[id] = c;
                    } else if (israin) {
                        raincolors[id] = c;
                    } else if ((id >= 0) && (id < biomecolors.length))
                        biomecolors[id] = c;
                } else if (state != null) {
                    int stateid = state.globalStateIndex;
                    colors[stateid] = c;
                }
            }
            scanner.close();
        }
        /* Last, push base color into any open slots in data colors list */
        for (int i = 0; i < colors.length; i++) {
            if (colors[i] == null) {
                // Get state
                DynmapBlockState bs = DynmapBlockState.getStateByGlobalIndex(i);
                DynmapBlockState bsbase = bs.baseState;
                if ((bsbase != null) && (colors[bsbase.globalStateIndex] != null)) {
                    colors[i] = colors[bsbase.globalStateIndex];
                }
            }
        }
        /* And interpolate any missing rain and temperature colors */
        interpolateColorTable(tempcolors);
        interpolateColorTable(raincolors);
    } catch (RuntimeException e) {
        Log.severe("Could not load colors '" + name + "' ('" + colorSchemeFile + "').", e);
        return null;
    } catch (FileNotFoundException e) {
        Log.severe("Could not load colors '" + name + "' ('" + colorSchemeFile + "'): File not found.", e);
    }
    return new ColorScheme(name, colors, biomecolors, raincolors, tempcolors);
}
Also used : Scanner(java.util.Scanner) FileInputStream(java.io.FileInputStream) InputStream(java.io.InputStream) DynmapBlockState(org.dynmap.renderer.DynmapBlockState) FileNotFoundException(java.io.FileNotFoundException) FileInputStream(java.io.FileInputStream) File(java.io.File)

Aggregations

DynmapBlockState (org.dynmap.renderer.DynmapBlockState)62 HashMap (java.util.HashMap)12 ArrayList (java.util.ArrayList)10 IdentityHashMap (java.util.IdentityHashMap)10 Block (net.minecraft.block.Block)10 GsonBuilder (com.google.gson.GsonBuilder)9 BlockState (net.minecraft.block.BlockState)9 BitSet (java.util.BitSet)7 RequiredArgumentBuilder (com.mojang.brigadier.builder.RequiredArgumentBuilder)6 File (java.io.File)6 FluidBlock (net.minecraft.block.FluidBlock)6 Material (net.minecraft.block.Material)6 Identifier (net.minecraft.util.Identifier)6 Block (net.minecraft.world.level.block.Block)6 RenderPatch (org.dynmap.renderer.RenderPatch)6 JsonParseException (com.google.gson.JsonParseException)5 IOException (java.io.IOException)5 CancellationException (java.util.concurrent.CancellationException)5 ExecutionException (java.util.concurrent.ExecutionException)5 ZipFile (java.util.zip.ZipFile)5