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

Сообщения
1,011
Лучшие ответы
9
Реакции
98
Версия Minecraft
1.7.10
Как я понял майн подгружает текстуры при загрузки из папки ресурсов, и их можно потом легко забиндить. Каким образом я могу подгрузить текстуры не из папки ресурсов в моде, а из корня клиента (из папки .minecraft) при запуске? И как потом такую текстуру биндить?
 
Сообщения
18
Лучшие ответы
0
Реакции
4
По-простому - никак. Наследоваться от AbstractTexture, изучать TextureManager.
Путь к запущенному приложению можно взять в System.getProperty("user.dir");, использовать новые пути джавы, вычитать текстуру.
Скорее всего придется использовать рефлексию, либо полностью воссоздавать загрузку текстур в GL.
Еще можно в соседнюю тему глянуть, там текстуры из сети тянут - NativeImage душит память
 
Сообщения
232
Лучшие ответы
27
Реакции
155
@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,451
Лучшие ответы
75
Реакции
343
Можно добавить в майновский класс лоадер путь до своей дополнительной папки.
Kotlin:
val cl = javaClass.classLoader as LaunchClassLoader
val file = File(resourceDir).toDir().absoluteFile
cl.addURL(file.toURI().toURL())
 
Сообщения
161
Лучшие ответы
8
Реакции
23
А ведь можно было перед созданием темы глянуть кто наследует AbstractTexture/ITextureObject.

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

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

Agravaine :j

Модератор
Сообщения
5,659
Лучшие ответы
293
Реакции
1,324
Если ты хочешь чтобы твой мод грузил ресурсы не из джарника, а из другого места, то можно в Minecraft#defaultResourcePacks добавить свою реализацию IResourcePack. Я просто добавил FolderResourcePack с нужной папкой в констукторе.
 
Сообщения
1,011
Лучшие ответы
9
Реакции
98
А можно как-то в атлас блоков пихнуть свои те текстуры, чтобы в мире вместе с чанками рендрить их? А то с разными текстурами нельзя, ибо в чанк запекается в лист, а лист рендрится с единой одной текстурой
 

Agravaine :j

Модератор
Сообщения
5,659
Лучшие ответы
293
Реакции
1,324
Можно, TextureStitchEvent в помощь. В нем уже регаешь свой TextureAtlasSprite: event.map.setTextureEntry()
 
Сообщения
2,451
Лучшие ответы
75
Реакции
343
А используя мой способ, не нужно будет танцевать с бубном.
 
Сообщения
1,011
Лучшие ответы
9
Реакции
98
Я половину не понимаю что у тебя там творится) Напиши на java. Куда это лучше пихнуть? И откуда брать майновский class loader?
 
Сообщения
4,518
Лучшие ответы
120
Реакции
704
Перевел
Java:
LaunchClassLoader cl = (LaunchClassLoader) любойВащеJavaClass.classLoader
File file = File(resourceDir).toDir().absoluteFile
cl.addURL(file.toURI().toURL())
 

Agravaine :j

Модератор
Сообщения
5,659
Лучшие ответы
293
Реакции
1,324
Ваще не понял что делает Дахака. Это чтобы можно было доставать через getClass().getResourceAsStream?
 
Сообщения
18
Лучшие ответы
0
Реакции
4
Это чтобы можно было доставать через getClass().getResourceAsStream?
Да, он добавляет новые ресурсы к основному класслоадеру. После этого их можно будет через getResourceAsStream загрузить уже стандартными средствами.
 
Сообщения
1,011
Лучшие ответы
9
Реакции
98
Никак чет нормально не получается зарендрить ту текстуру на блоке. Как дахака говорил, я в 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

На атласе блоков текстура тоже такая же. Я вот сижу и думаю почему она нормально не подгрузилась?
 
Сообщения
1,011
Лучшие ответы
9
Реакции
98
Это синтаксис котлина. В java нет такого метода и поля
 
Сообщения
2,451
Лучшие ответы
75
Реакции
343
Убедись сначала достается ли ресурс или нет. Может там нулл.
 
Сверху