Несколько полезных утилит для разработчиков модов

deleted.user

Мошенник
321
43
Держите, может кому сгодится. И перегонщик течне и парсер звуков для модов.
Java:
public class OldTechneParser {
    public static void main(String[] args) throws Exception {
        File fXmlFile = new File("/путь/до/model.xml");
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(fXmlFile);
        doc.getDocumentElement().normalize();
        NodeList nList = doc.getElementsByTagName("Shape");
        System.out.println("r=new ModelRenderer[" + nList.getLength() + "];");
        for (int temp = 0; temp < nList.getLength(); ++temp) {
            Node nNode = nList.item(temp);
            if (nNode.getNodeType() != 1) continue;
            Element eElement = (Element)nNode;
            System.out.println("r[" + temp + "] = new ModelRenderer(this," + eElement.getElementsByTagName("TextureOffset").item(0).getTextContent() + ");");
            System.out.println("r[" + temp + "].addBox(" + OldTechneParser.parseFloat(eElement.getElementsByTagName("Offset").item(0).getTextContent()) + "," + eElement.getElementsByTagName("Size").item(0).getTextContent() + ");");
            System.out.println("r[" + temp + "].setRotationPoint(" + OldTechneParser.parseFloat(eElement.getElementsByTagName("Position").item(0).getTextContent()) + ");");
            System.out.println("setRotation(r[" + temp + "]," + OldTechneParser.parseFloat(eElement.getElementsByTagName("Rotation").item(0).getTextContent()) + ");");
        }
    }

    public static String parseFloat(String in) {
        String[] ar = in.split(",");
        StringBuilder b = new StringBuilder();
        for (int i = 0; i < ar.length; ++i) {
            b.append(ar[i]).append("f");
            if (i == ar.length - 1) continue;
            b.append(",");
        }
        return b.toString();
    }
}

Java:
public class Sound {
    public static void main(String[] args) {
        try {
            File file = new File("sounds.json");
            file.delete();
            file.createNewFile();
            BufferedWriter bw = new BufferedWriter(new FileWriter(file));
            bw.write("{\n");
            for (File s : new File("путь/до/папки/с/звуками").listFiles()) {
                if (s.isFile()) {
                    String a = s.getName().replace(".ogg", "");
                    bw.write("\"" + a + "\":{\"category\":\"player\",\"sounds\":[\"" + a + "\"]},\n");
                    continue;
                }
                Sound.parseFolder(bw, s.getName() + "/", s);
            }
            bw.write("}");
            bw.flush();
            bw.close();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void parseFolder(BufferedWriter bw, String dirName, File file) throws Exception {
        for (File s : file.listFiles()) {
            if (s.isFile()) {
                String a = s.getName().replace(".ogg", "");
                bw.write("\"" + dirName + a + "\":{\"category\":\"player\",\"sounds\":[\"" + dirName + a + "\"]},\n");
                continue;
            }
            Sound.parseFolder(bw, dirName + s.getName() + "/", s);
        }
    }
}
 
28
3
Techne закрыли. Её скачать очень сложно теперь, но у меня получилось на одном компе. А лучше пользоваться Tabula, она даже лучше. И скачать её можно без проблем! Кстати это не программа, а мод и открывать её нужно в самом Minecraft. А если играть с друзьями в Minecraft и установить Tabula, можно будет моделировать вдвоём, втроём и больше. (Модели Techne можно экспортировать в Tabula)
 
2,932
44
598
476
9
39
А ещё techne неадекватная программа и в linux не умеет. Можно просто генератор java кода из неё извлечь если уж надо и дописать как плагин к блендеру.
 
2,932
44
598
генератор java кода из неё извлечь если уж надо и дописать как плагин к блендеру.
Ну, ну... Как блендер будет превращать вот это:
armoredcavalry.png

В java код. Тут я думаю не одна сотня программистов над таким плагином должна работать :D
А ещё techne неадекватная программа и в linux не умеет.
Для этих целей есть отличная программа которая умеет в совместимость с Пингвином, Окном, и ОС Х. Называется: "Блокскамейка".
 
476
9
39
А нафига такая сложная моделька для майна?
 
2,932
44
598
А нафига такая сложная моделька для майна?
Это уже не ко мне, а к создателям проектов на СтулКруфт и Мэтро... Можешь сюда ещё глянуть: 3D модели MINECRAFT | OBJ MODELS

100% тебе рекламу проплатили.
Я бы сам им заплатил за эту программу :D!
 
1,111
47
420
В java код. Тут я думаю не одна сотня программистов над таким плагином должна работать :D
Ты рофлишь что ли? Го разбираться как работает модели и рендеры.
Модель - куча вершин остальное наносное пока откинем.
Вершина - это координаты, uv и опционально кости их пока откинем
Итого у нас есть массив координат и ювишек. Внимание смертельный трюк. Сейчас я заменю сотни программистов и сделаю их работу за 10 минут.
Kotlin:
fun generateDrawMethod(writer: PrintWriter, vertices: Array<Vertex>, drawMode: Int) {
    writer.println("public static void render() {")
    writer.println("Tesselator t = Tesselator.getInstance();")
    writer.println("t.start(drawMode.toString());")
    for (vertex in vertices) {
        writer.println("t.addVertexWithUV(${vertex.x}, ${vertex.y}, ${vertex.z}, ${vertex.u}, ${vertex.v});")
    }
    writer.println("t.draw();")
    writer.println("}")
    writer.flush();
}
 
2,932
44
598
Ты рофлишь что ли?
Да вообще-то ;D (Зря курсивом не выделил)
Модель - куча вершин остальное наносное пока откинем.
Вершина - это координаты, uv и опционально кости их пока откинем
В этом то и дело! Я говорю про нормальный экспорт... А не вот это откинем, то не важно... Как не как это потребует много усилий!
 
1,111
47
420
На котлин перешел, сразу про чистые функции забыл?)
Лучше бы так:
Kotlin:
fun generateDrawMethod(vertices: Array<Vertex>, drawMode: Int):String {
    "public static void render() {\n"+
    "   Tesselator t = Tesselator.getInstance();\n"+
    "   t.start(drawMode.toString());\n"+
    vertices.map("t.addVertexWithUV(${it.x}, ${it.y}, ${it.z}, ${it.u}, ${it.v});\n").fold("",(a,b)->a+b)+
    "   t.draw();\n"+
    "}\n"
}
Ну это не валидный Котлинокод на самом деле, но суть в том что тут ты очень сильно теряешь производительность. Вершин может быть очень много а ты конкатенацию используешь. Из всех фпшных штук которые мне щас пришли в голову это Моноид, но и он тут не спасет. Так что в топку такой код.

UPD можно использовать join, но и такой код в топку ибо ты сделаешь нифигасе какой большой лист, потом нифигасе какой большой стринг билдер, а затем нифигасе какую большую строку. Когда пишешь на JVM стоит все таки оглядываться на то как оно скомпилится в байт код.
 
Последнее редактирование:
1,111
47
420
В этом то и дело! Я говорю про нормальный экспорт... А не вот это откинем, то не важно... Как не как это потребует много усилий!
Скелетка без шейдеров - плевое дело. С шейдерами не шибко сложнее но все таки тонкости есть. Давай разберемся что такое кости
Кость - это вектор смещения, кватернион и модификатор влияния. Кватернион - вектор4 который несет в себе информацию о повороте. На вики подробнее почитай. Так вот рисовать скелет можно следующим образом:
1) Берем вершину
2) Смещаем ее на все кости которые к ней прикреплены(обычно не более четырех) умножая на мультипликатор влияния.
3) Поворачиваем на все кости
4) Добавляем в тесселятор
5) Profit
 
2,505
81
397
Сейчас бы скиннинг на цпу делать.
 
1,111
47
420
Ты ведь понимаешь что я немного не эту цель преследовал?
 
1,111
47
420
Скорее всего он превратит a + ":" + b в StringBuilder но не дальше. Скорее всего будет создана огромная куча стринг билдеров на каждую конкотенацию
 
Сверху