Подгрузка и бинд текстуры из вне

Версия Minecraft
1.7.10
1,015
9
102
Как я понял майн подгружает текстуры при загрузки из папки ресурсов, и их можно потом легко забиндить. Каким образом я могу подгрузить текстуры не из папки ресурсов в моде, а из корня клиента (из папки .minecraft) при запуске? И как потом такую текстуру биндить?
 
Решение
@Johnson, можно. А можно изучить API майна и узнать про DynamicTexture.

@Minebot, вот пример загрузки и создания ResourceLocation:
Java:
    public void loadIcon() {
        String iconPathStr = ...
        Path externalPath = Paths.get(iconPathStr);
        ResourceLocation icon;
        if (Files.exists(externalPath)) {
            try {
                icon = Minecraft.getMinecraft().getTextureManager().getDynamicTextureLocation("dynamic_icon", new DynamicTexture(ImageIO.read(new File(iconPathStr))));
            } catch (IOException exception) {
                exception.printStackTrace();
            }      
        }
    }
Привязывать как обычно.
78
3
10
По-простому - никак. Наследоваться от AbstractTexture, изучать TextureManager.
Путь к запущенному приложению можно взять в System.getProperty("user.dir");, использовать новые пути джавы, вычитать текстуру.
Скорее всего придется использовать рефлексию, либо полностью воссоздавать загрузку текстур в GL.
Еще можно в соседнюю тему глянуть, там текстуры из сети тянут - NativeImage душит память
 
243
28
202
@Johnson, можно. А можно изучить API майна и узнать про DynamicTexture.

@Minebot, вот пример загрузки и создания ResourceLocation:
Java:
    public void loadIcon() {
        String iconPathStr = ...
        Path externalPath = Paths.get(iconPathStr);
        ResourceLocation icon;
        if (Files.exists(externalPath)) {
            try {
                icon = Minecraft.getMinecraft().getTextureManager().getDynamicTextureLocation("dynamic_icon", new DynamicTexture(ImageIO.read(new File(iconPathStr))));
            } catch (IOException exception) {
                exception.printStackTrace();
            }      
        }
    }
Привязывать как обычно.
 
2,505
81
397
Можно добавить в майновский класс лоадер путь до своей дополнительной папки.
Kotlin:
val cl = javaClass.classLoader as LaunchClassLoader
val file = File(resourceDir).toDir().absoluteFile
cl.addURL(file.toURI().toURL())
 
214
11
59
А ведь можно было перед созданием темы глянуть кто наследует AbstractTexture/ITextureObject.

Тебе нужна DynamicTexture, она принимает BufferedImage, а изображение в свою очередь достается методом ImageIO.read(пример можно найти в ThreadDownloadImageData). Просто создай свою подобную текстуру, избавив от всего лишнего DynamicTexture.

Текстуры загружаются и биндятся через TextureManager
 

tox1cozZ

aka Agravaine
8,454
598
2,890
Если ты хочешь чтобы твой мод грузил ресурсы не из джарника, а из другого места, то можно в Minecraft#defaultResourcePacks добавить свою реализацию IResourcePack. Я просто добавил FolderResourcePack с нужной папкой в констукторе.
 
1,015
9
102
А можно как-то в атлас блоков пихнуть свои те текстуры, чтобы в мире вместе с чанками рендрить их? А то с разными текстурами нельзя, ибо в чанк запекается в лист, а лист рендрится с единой одной текстурой
 
7,099
324
1,509
Перевел
Java:
LaunchClassLoader cl = (LaunchClassLoader) любойВащеJavaClass.classLoader
File file = File(resourceDir).toDir().absoluteFile
cl.addURL(file.toURI().toURL())
 
78
3
10
Это чтобы можно было доставать через getClass().getResourceAsStream?
Да, он добавляет новые ресурсы к основному класслоадеру. После этого их можно будет через getResourceAsStream загрузить уже стандартными средствами.
 
1,015
9
102
Никак чет нормально не получается зарендрить ту текстуру на блоке. Как дахака говорил, я в preInit client proxy добавил папку с текстурой блока (называется она asd.png)
Java:
String configPath = event.getSuggestedConfigurationFile().getParent();
LaunchClassLoader cl = (LaunchClassLoader) event.getClass().getClassLoader();
try {
    cl.addURL(new File(configPath + "/textures").toURI().toURL());
} catch (MalformedURLException e) {
    e.printStackTrace();
}

Потом в эвенте TextureStitchEvent.Pre добавил в атлас свою текстурку, использовав при этом свой TextureAtlasSprite (я в нем убрал метод generateMipmaps т.к. почему-то при генерации минимапы майн крашился с этой текстурой)
Java:
if (e.map.getTextureType() == 0){
    TextureAtlas atl = new TextureAtlas("asd");
    try {
        atl.loadSprite(new BufferedImage[]{ ImageIO.read(e.getClass().getClassLoader().getResourceAsStream("asd.png")) }, null, false);
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    e.map.setTextureEntry("asd", atl);
    test = atl;
}

TextureAtlasSprite пихнул в статическую переменную и возвращал ее в классе своего блока в getIcon. Почему-то блок получился такой:
2019-09-07_12-32-41.png

На атласе блоков текстура тоже такая же. Я вот сижу и думаю почему она нормально не подгрузилась?
 
Сверху