Как читать исходный код Minecraft

Led

291
3
0
Доброго времени суток!Вопрос, возможно тупой, но очень хотелось бы получить на него ответ.
Кстати, хочу поблагодарить обитателей форума за оперативный и доходчивый ответ на мой предыдущий вопрос =)
По аналогии с другими спрашивающими замечу, что разработкой Java занялся недавно, прочитав пару книг по ней.
Столкнулся с такой проблемой, в исходных файлах многие переменные указанны примерно так " p_149650_2_", и мой гуманитарный мозг когнитивно диссонирует (я дипломированный психолог) от подобного. И мне становиться очень мало понятно, как работают блоки из исходников.

Благодаря этому посту, вот этого замечательного человека, я нашел эту замечательную тему.

Собственно сделать то что там указанно у меня получилось, но вот резонный вопрос:

Как из некрасивого этого делается красивое, читабельное и приятное во всех отношениях это?

И еще один вопрос (2)

можно ли это:
Код:
        itemLegendaryDiamond = new Item().setUnlocalizedName("LegendaryDiamond").setCreativeTab(lmod).setTextureName("lmod:itemLegendaryDiamond");

Записать как нибудь читабельнее, типа вот такого:

Код:
        itemLegendaryDiamond = new Item()
                this.setUnlocalizedName("LegendaryDiamond");
                this.setCreativeTab(lmod);
                this.setTextureName("lmod:itemLegendaryDiamond");


И назрел третий вопрос (3)
Как сделать иконку блока с нужной текстурой? ибо все заливается одной и той же текстурой
картинка (тестовый блок с головой волка. иконка (виден валяющейся итем) использует одну и ту же текстуру для разных сторон)

Заранее благодарен.
С Уважением,  Led.
 
1) Программы на джаве представляют собой архивы с *.class файлами. Благодаря особенностям джавы, из *.class файлов можно восстановить исходный код (пусть и без комментариев), поэтому создавать моды для майнкрафта так легко.
2) Но моджанги не хотят дарить всем исходный код, поэтому они используют обфускацию - автоматическую замену всех названий на нечитаемые, такие как " p_149650_2_". Разработчики форджа разобрались с этим кодом и заменили часть названий на читаемые.
При компиляции мода фордж заменяет эти названия в твоем моде обратно на те что есть в майнкрафте.


"p_149650_2_" - это очевидно параметр. Дело в том, что при переопределении методов необязательно давать параметрам те же имена.

Например, вместо
Код:
public void onBlockAdded(World p_149726_1_, int p_149726_2_, int p_149726_3_, int p_149726_4_)

можно написать

Код:
public void onBlockAdded(World world, int x, int y, int z)
И ничего не изменится. Но что означают эти аргументы нужно смотреть по коду, также может быть в новой версии форджа эти параметры переименовали на читаемые.
[merge_posts_bbcode]Добавлено: 27.03.2016 18:41:47[/merge_posts_bbcode]

По второму вопросу. Это можно перенести в конструктор класса.
Две книги это много, я даже одну не осилил.
 
Led написал(а):
Записать как нибудь читабельнее
Насколько я знаю, можно писать классы внутри классов (это дико, но можно):
Код:
itemLegendaryDiamond = new Item() {
    public Item() {
        this.setUnlocalizedName("LegendaryDiamond");
        this.setCreativeTab(lmod);
        this.setTextureName("lmod:itemLegendaryDiamond");
    }
}
Как-то так. То есть просто всё то, что у тебя есть в классе Item - пиши в фигурных скобках. Если что - поправьте)
 
То, что тут написано
Код:
 itemLegendaryDiamond = new Item().setUnlocalizedName("LegendaryDiamond").setCreativeTab(lmod).setTextureName("lmod:itemLegendaryDiamond");


Равносильно этому:
Код:
itemLegendaryDiamond = new Item();
itemLegendaryDiamond.setUnlocalizedName("LegendaryDiamond");
itemLegendaryDiamond.setCreativeTab(lmod);
itemLegendaryDiamond.setTextureName("lmod:itemLegendaryDiamond");
 
Искренне спасибо за исчерпывающие ответы на первые два вопроса.
Был бы благодарен за ответ на третий, после чего можно было бы закрыть тему.
 
Я так понял, нужен блок с мульти-текстурой?

В класс своего блока добавляешь
Код:
public IIcon[] icons = new IIcon[6];

Переопределяешь метод, регистрирующий иконки. По дефолту там регистрируется одна стоковая иконка, а мы хотим, например, чтобы их было 6.
Код:
@Override
public void registerBlockIcons(IIconRegister reg) {
    for (int i = 0; i < 6; ++i) {
        this.icons[i] = reg.registerIcon(this.textureName + "_" + i);
    }
}


Ну и затем переопределяешь геттер иконки. 
Код:
@Override
public IIcon getIcon(int side, int meta) {
    return this.icons[side];
}


PROFIT
 
Вроде понятно, а не очень)
Дилемма такова, блок с отдельной текстурой для верха, низа, лицевой стороны есть. Более того он ставиться лицевой стороной к игроку, который его ставит (как Печка)
Делал по теме, которая указанная в шапке (сейчас ссылку сложно крепить, пишу с телефона)
Но текстура блока в инвентаре отображается не корректно (скрин в первом посте)
Хочу её поправить
 
Код:
@SideOnly(Side.CLIENT)
    protected IIcon BlockIconFront;
    protected IIcon BlockIconSide;
    protected IIcon BlockIconTop;

@SideOnly(Side.CLIENT)
    @Override
    public void registerBlockIcons(IIconRegister par1IconRegister)
    {
        BlockIconFront = par1IconRegister.registerIcon(GalaxySpace.ASSET_PREFIX + ":" + "europa/europagrunt");
        BlockIconSide = par1IconRegister.registerIcon(GalaxySpace.ASSET_PREFIX + ":" + "europa/europagrunt");
        BlockIconTop = par1IconRegister.registerIcon(GalaxySpace.ASSET_PREFIX + ":" + "europa/europageyzer");
    }
    
    @SideOnly(Side.CLIENT)
    @Override
    public IIcon getIcon(int par1int, int par2int)
    {
        
        if (par1int == 0 || par1int == 1) { return BlockIconTop; }
        else if (par1int != par2int) { return BlockIconSide; }
        else { return BlockIconFront; }
    }
Так делал?
 
Назад
Сверху