Банальщина... Как обратится к переменой которая находится в void.

Версия Minecraft
1.7.10
API
Forge
В паблик айтемс я написал String desc, и хочу обратится в desc в конце кода. Как мне это сделать ?


public class Items extends Item {

public Items(String name, String texture, int maxStackSize, String desc) {
this.canRepair = false;
this.setUnlocalizedName(name);
this.setTextureName(Main.MODID + ":" + texture);
this.setCreativeTab(Main.tabTechLumMain);
this.maxStackSize = maxStackSize;
GameRegistry.registerItem(this, name);
}

@SideOnly(Side.CLIENT)
public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) {
par3List.add("§2" desc);
}

}
 

Вложения

  • изображение_2023-05-15_115534097.png
    изображение_2023-05-15_115534097.png
    37.2 KB · Просмотры: 18
Решение
Время пофармить пойнты 😬

У тебя desc - формальный аргумент конструктора, но ты никак не сохраняешь его в своём объекте
Чтобы заработало так, как ты хочешь, нужно сделать следующее:
Some pretty code:
public class Items extends Item {
    private String desc;

    public Items(String name, String texture, int maxStackSize, String desc) {
        this.canRepair = false;
        this.setUnlocalizedName(name);
        this.setTextureName(Main.MODID + ":" + texture);
        this.setCreativeTab(Main.tabTechLumMain);
        this.maxStackSize = maxStackSize;
        this.desc = desc;
        GameRegistry.registerItem(this, name);
    }

    @SideOnly(Side.CLIENT)
    public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer...
19
3
7
Время пофармить пойнты 😬

У тебя desc - формальный аргумент конструктора, но ты никак не сохраняешь его в своём объекте
Чтобы заработало так, как ты хочешь, нужно сделать следующее:
Some pretty code:
public class Items extends Item {
    private String desc;

    public Items(String name, String texture, int maxStackSize, String desc) {
        this.canRepair = false;
        this.setUnlocalizedName(name);
        this.setTextureName(Main.MODID + ":" + texture);
        this.setCreativeTab(Main.tabTechLumMain);
        this.maxStackSize = maxStackSize;
        this.desc = desc;
        GameRegistry.registerItem(this, name);
    }

    @SideOnly(Side.CLIENT)
    public void addInformation(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) {
        par3List.add(String.format("§2%s", desc));
    }
}
Построчно:
2 – добавить desc как поле объекта
10 – присвоить значение полю создаваемого объекта
Поле этого ты уже можешь к нему обратиться

P.S. - ну а вообще – да, стоит прочитать хотя бы быстрый курс на javarush, например
P.P.S - код лучше всё же оборачивать в соответствующий тег
P.P.P.S - и GameRegistry.registerItem(this, name); лучше вынести в другое место, т.к., возможно, тебе понадобится сам объект этого Item'а где-то ещё в коде и тебе придётся создавать его ещё раз
 

will0376

Токсичная личность
2,079
55
585
P.P.P.S - и GameRegistry.registerItem(this, name); лучше вынести в другое место, т.к., возможно, тебе понадобится сам объект этого Item'а где-то ещё в коде и тебе придётся создавать его ещё раз
Item создаётся 1 раз за всю игру.
 
19
3
7
Это уже наш оффтоп, на разве нам что-то мешает создать такой объект ещё раз? Убрав из конструктора регистрацию, конечно же
Просто вынести отдельно, как мне кажется, хороший вариант чтобы использовать напрямую где душе угодно, да и внешним разработчикам будет проще, нежели лезть в Game-/Item-/Block- Registry и доставать через методы оттуда
 

will0376

Токсичная личность
2,079
55
585
что-то мешает создать такой объект ещё раз?
Нет. только в этом смысла нет вообще никакого.
Да и в коде часто идёт сравние item == Bla.ITEM (проверка ссылки, не инстанса), так что...
 
1,074
72
372
Нет. только в этом смысла нет вообще никакого.
Необязательно для каждого нового предмета создавать свой класс, в некоторых случаях можно ограничиться изменением атрибутов объекта.
 
Сверху