- 6
- 1
- 0
Небольшое вступление:
Я работаю над улучшенной версией замечательного мода Gravestones, исправляющей конфликты с некоторыми модами (к примеру с Сумеречным Лесом), и добавляющей функционал, который автор хотел добавить, но почему-то не довёл до ума. В частности речь об отображении скина игрока на одном из видов надгробий. Мне удалось реализовать эту функцию для игроков, находящихся на сервере на данный момент, по аналогии с головами игроков, при помощи следующего фрагмента кода (функция, разумеется, возвращает ResourceLocation скина):
Но этот вариант не работает для игроков, на сервере не находящихся (в Интернете советуют использовать ту же функцию, скормив ей
Метод рабочий, но вызывает как минимум две проблемы, с которыми, я надеюсь, вы сможете мне помочь:
Я работаю над улучшенной версией замечательного мода Gravestones, исправляющей конфликты с некоторыми модами (к примеру с Сумеречным Лесом), и добавляющей функционал, который автор хотел добавить, но почему-то не довёл до ума. В частности речь об отображении скина игрока на одном из видов надгробий. Мне удалось реализовать эту функцию для игроков, находящихся на сервере на данный момент, по аналогии с головами игроков, при помощи следующего фрагмента кода (функция, разумеется, возвращает ResourceLocation скина):
Для игрока, находящегося на сервере:
EntityPlayer player = Minecraft.getMinecraft().theWorld.getPlayerEntityByName(playername);
if(player != null) {
GameProfile gameprofile = player.getGameProfile();
Minecraft minecraft = Minecraft.getMinecraft();
Map<Type, MinecraftProfileTexture> map = minecraft.func_152342_ad().func_152788_a(gameprofile);
if (map.containsKey(Type.SKIN)) {
this.SKIN_ABSTRACT_PLAYER = minecraft.func_152342_ad().func_152792_a((MinecraftProfileTexture)map.get(Type.SKIN), Type.SKIN);
}
new GameProfile((UUID)null, playername)
, но я так и не смог реализовать это на практике). Единственное решение, которое у меня заработало, это скачивание скина с внешнего сервера с последующим сохранением его на диске и загрузкой в виде динамической текстуры:
Скачивание скина (за основу брал чужой код):
public void downloadSkin()
{
HttpsURLConnection httpurlconnection = null;
ResourceLocation resourcelocation = null;
GraveStones.printDebugMessage("Downloading "+this.playername+"'s skin");
String skinPath = "";
try
{
httpurlconnection = (HttpsURLConnection)(new URL("https://mineskin.eu/skin/"+this.playername)).openConnection(Minecraft.getMinecraft().getProxy());
httpurlconnection.setDoInput(true);
httpurlconnection.setDoOutput(false);
httpurlconnection.connect();
if (httpurlconnection.getResponseCode() / 100 != 2)
{
GraveStones.printDebugMessage("Server response code did not return 200, skin servers might be down.");
}
BufferedImage bufferedimage;
bufferedimage = ImageIO.read(httpurlconnection.getInputStream());
skinPath = "./cachedImages/skins/"+this.playername+".png";
File outputFile = new File(skinPath);
ImageIO.write(bufferedimage, "png", outputFile);
}
catch (Exception exception)
{
GraveStones.printDebugMessage("Error occurred when downloading skin, however, skin servers seem to be up.");
}
finally
{
if (httpurlconnection != null)
{
httpurlconnection.disconnect();
}
}
}
Загрузка изображения в качестве динамической текстуры:
try {
BufferedImage bufferedImage = ImageIO.read(new File("./cachedImages/skins/"+playername+".png"));
if(bufferedImage.getWidth() == bufferedImage.getHeight())
{
bufferedImage = bufferedImage.getSubimage(0, 0, bufferedImage.getWidth(), bufferedImage.getHeight()/2);
}
this.SKIN_ABSTRACT_PLAYER = Minecraft.getMinecraft().getTextureManager().getDynamicTextureLocation(" ", new DynamicTexture(bufferedImage));
} catch (IOException e) {
e.printStackTrace();
this.SKIN_ABSTRACT_PLAYER = this.SKIN_STEVE;
}
- [РЕШЕНО] Как и заявлено в заголовке, при использовании динамической текстуры, скин отображается только на гранях, видимых игроку. И если для самого скина это проблемой являться не будет (если только ваш скин не включает в себя прозрачные/полупрозрачные элементы), то головные уборы выглядят из-за этого крайне убого. Наглядный пример - на первом скрине рендер динамической текстуры, на втором - скина, взятого напрямую у игрока (внимание на ободок наушников и заднюю часть воротника):
Текстуры для этих моделей задаются черезnet.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer.bindTexture(ResourceLocation p_147499_1_)
, и я не уверен, что смогу это изменить, в связи с нехваткой опыта. Надеюсь, что вы сможете подсказать мне, как можно заставить динамическую текстуру рендериться с двух сторон, либо же как заставить работатьnew GameProfile((UUID)null, playername)
. - Хотя загрузка скинов и работает идеально при запуске через Eclipse, при добавлении мода в сборку (собственно, ради чего всё и затевалось) сетевые функции дают сбой. Логи говорят, что скорее всего не срабатывает функция
ImageIO.read(httpurlconnection.getInputStream())
, но теоретически проблемы могут быть и с подключением к сайту. Полагаю, что проблему вызывает один из 114 модов сборки, но я не могу его идентифицировать. Удаление всех модов, так или иначе связанных с сетевыми функциями, ни к чему не привело. Разумеется, я не прошу идентифицировать этот мод за меня, но вдруг кто-то сталкивался с похожей проблемой или просто знает, что какой-то мод может блокировать сетевые функции. Если понадобится, список я предоставлю.
Последнее редактирование: