[1.7.10]Вопрос по гуи, подскажите как взаимодействовать со слотами.

Код:
public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer player)
{
    if (world.isRemote) {
        player.openGui(Main.instance, 1, world, 0, 0, 0);
    }
    return itemstack;
}
Ошибка была тут. player.openGui нужно вызывать на стороне сервера.
То есть должно быть: if (!world.isRemote) {

Проверять итемы в слотах тебе нужно на стороне сервера. Это несколько сложнее, чем отображение инвентаря игрока. Проверку итемов в слотах можно сделать через метод onUpdate в итеме, который вызывается каждый тик, пока итем находится в инвентаре игрока.
[merge_posts_bbcode]Добавлено: 29.10.2014 21:43:18[/merge_posts_bbcode]

Но из-за того что итемы это синглтоны, непонятно как получить в onUpdate инвентарь итема. Хотя как-то это сделать конечно возможно.
 
Asd73 написал(а):
Проверять итемы в слотах тебе нужно на стороне сервера. Это несколько сложнее, чем отображение инвентаря игрока. Проверку итемов в слотах можно сделать через метод onUpdate в итеме, который вызывается каждый тик, пока итем находится в инвентаре игрока.
[merge_posts_bbcode]Добавлено: 29.10.2014 21:43:18[/merge_posts_bbcode]

Но из-за того что итемы это синглтоны, непонятно как получить в onUpdate инвентарь итема. Хотя как-то это сделать конечно возможно.

Проверку итемов в слотах необходимо делать в самих слотах.

Так же, глупо и банально невозможно использовать onUpdate или любой другой метод из класса предмета, для работы с контейнером/инвентарем/гуем. В конце-концов это разные вещи, выполняющие свои строго определенные цели.

В конструктор контейнера необходимо передать итемстак, и уже с ним работать.

Код:
public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z)
{
    return new MyContainer(player, player.getHeldItem());
}

И да, предметы - не синглтоны.
 
Asd73 написал(а):
Код:
public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer player)
{
    if (world.isRemote) {
        player.openGui(Main.instance, 1, world, 0, 0, 0);
    }
    return itemstack;
}
Ошибка была тут. player.openGui нужно вызывать на стороне сервера.
То есть должно быть: if (!world.isRemote) {

Проверять итемы в слотах тебе нужно на стороне сервера. Это несколько сложнее, чем отображение инвентаря игрока. Проверку итемов в слотах можно сделать через метод onUpdate в итеме, который вызывается каждый тик, пока итем находится в инвентаре игрока.
[merge_posts_bbcode]Добавлено: 29.10.2014 21:43:18[/merge_posts_bbcode]

Но из-за того что итемы это синглтоны, непонятно как получить в onUpdate инвентарь итема. Хотя как-то это сделать конечно возможно.
Вот тебе огромнейшее спасибо. Теперь все работает))))
[merge_posts_bbcode]Добавлено: 30.10.2014 08:38:18[/merge_posts_bbcode]

Defilak написал(а):
Asd73 написал(а):
Проверять итемы в слотах тебе нужно на стороне сервера. Это несколько сложнее, чем отображение инвентаря игрока. Проверку итемов в слотах можно сделать через метод onUpdate в итеме, который вызывается каждый тик, пока итем находится в инвентаре игрока.
[merge_posts_bbcode]Добавлено: 29.10.2014 21:43:18[/merge_posts_bbcode]

Но из-за того что итемы это синглтоны, непонятно как получить в onUpdate инвентарь итема. Хотя как-то это сделать конечно возможно.

Проверку итемов в слотах необходимо делать в самих слотах.
А можно поподробнее? Решил в этом гуи сделать еще кнопку, по нажатию которой будет происходить обмен.

Так же, глупо и банально невозможно использовать onUpdate или любой другой метод из класса предмета, для работы с контейнером/инвентарем/гуем. В конце-концов это разные вещи, выполняющие свои строго определенные цели.

В конструктор контейнера необходимо передать итемстак, и уже с ним работать.

Код:
public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z)
{
    return new MyContainer(player, player.getHeldItem());
}

И да, предметы - не синглтоны.
Можно по подробнее? вот у меня есть два слота
Код:
        this.addSlotToContainer(new Slot(craftMatrix, 0, 30+18, 17));
        this.addSlotToContainer(new Slot(craftMatrix, 1, 30+18, 17+18));
Как к ним обратиться можно?
 
Kuroi написал(а):
Можно по подробнее? вот у меня есть два слота
Код:
        this.addSlotToContainer(new Slot(craftMatrix, 0, 30+18, 17));
        this.addSlotToContainer(new Slot(craftMatrix, 1, 30+18, 17+18));
Как к ним обратиться можно?
Ну для начала, что тебе необходимо с ними делать?

Допустим, для того чтобы просто проверять может ли данный предмет размещаться в данном слоте нужно создать класс расширяющий Slot и переопределить метод isItemValid().

UPD: Прочел первый пост еще раз. Если тебе нужно получить предмет хранящийся в слоте, нужно использовать метод getStackInSlot() в классе имплементирующем IInventory.
 
Defilak написал(а):
Kuroi написал(а):
Можно по подробнее? вот у меня есть два слота
Код:
        this.addSlotToContainer(new Slot(craftMatrix, 0, 30+18, 17));
        this.addSlotToContainer(new Slot(craftMatrix, 1, 30+18, 17+18));
Как к ним обратиться можно?
Ну для начала, что тебе необходимо с ними делать?

Допустим, для того чтобы просто проверять может ли данный предмет размещаться в данном слоте нужно создать класс расширяющий Slot и переопределить метод isItemValid().

UPD: Прочел первый пост еще раз. Если тебе нужно получить предмет хранящийся в слоте, нужно использовать метод getStackInSlot() в классе имплементирующем IInventory.
Можешь подробно описать какой класс надо создать и где его надо прописать? Мне надо что бы по нажатию кнопки в гуи этом проверялось какой предмет лежит в слоте 0 и в слоте 1, за тем если предметы лежат нужные их удаляло из слотов и выдавало новый предмет и гуи закрывалось. Просто тут так много всего было, что я уже запутался и не понимаю какой класс создать и куда его прописать.
UPD. Мне нужно создать кастом класс на примере этого?
Код:
    public InventoryCrafting craftMatrix = new InventoryCrafting(this, 1, 2);
Если да, то как его зарегистрировать, так как тут многое кричали, что мне его еще регистрировать надо, так как я раньше его создавал уже, предполагая, что он нужен. А сейчас юзаю от крафтера.
 
Defilak написал(а):
Так же, глупо и банально невозможно использовать onUpdate или любой другой метод из класса предмета, для работы с контейнером/инвентарем/гуем. В конце-концов это разные вещи, выполняющие свои строго определенные цели.

И да, предметы - не синглтоны.
Да, понял уже. Действительно ерунду написал.

Сами предметы, как итемстак - конечно не синглтоны. А вот классы Item, разве не синглтоны?
 
Kuroi написал(а):
Defilak написал(а):
Kuroi написал(а):
Можно по подробнее? вот у меня есть два слота
Код:
        this.addSlotToContainer(new Slot(craftMatrix, 0, 30+18, 17));
        this.addSlotToContainer(new Slot(craftMatrix, 1, 30+18, 17+18));
Как к ним обратиться можно?
Ну для начала, что тебе необходимо с ними делать?

Допустим, для того чтобы просто проверять может ли данный предмет размещаться в данном слоте нужно создать класс расширяющий Slot и переопределить метод isItemValid().

UPD: Прочел первый пост еще раз. Если тебе нужно получить предмет хранящийся в слоте, нужно использовать метод getStackInSlot() в классе имплементирующем IInventory.
Можешь подробно описать какой класс надо создать и где его надо прописать? Мне надо что бы по нажатию кнопки в гуи этом проверялось какой предмет лежит в слоте 0 и в слоте 1, за тем если предметы лежат нужные их удаляло из слотов и выдавало новый предмет и гуи закрывалось. Просто тут так много всего было, что я уже запутался и не понимаю какой класс создать и куда его прописать.
UPD. Мне нужно создать кастом класс на примере этого?
Код:
    public InventoryCrafting craftMatrix = new InventoryCrafting(this, 1, 2);
Если да, то как его зарегистрировать, так как тут многое кричали, что мне его еще регистрировать надо, так как я раньше его создавал уже, предполагая, что он нужен. А сейчас юзаю от крафтера.
Т.е. тебе нужно сделать просто верстак с тремя слотами вместо десяти? Тогда да, InventoryCrafting тебе подойдет. Регистрировать его нигде не нужно. Но верстак использует два класса имплементирующих IInventory. Один для матрицы, другой для результатов крафта. В любом случае можешь просто посмотреть ContainerWorkbench.
Так же, посмотри вот здесь. Там все просто и понятно описано.

Asd73 написал(а):
Defilak написал(а):
Так же, глупо и банально невозможно использовать onUpdate или любой другой метод из класса предмета, для работы с контейнером/инвентарем/гуем. В конце-концов это разные вещи, выполняющие свои строго определенные цели.

И да, предметы - не синглтоны.
Да, понял уже. Действительно ерунду написал.

Сами предметы, как итемстак - конечно не синглтоны. А вот классы Item, разве не синглтоны?
Паттерн синглтон подразумевает наличие для класса только одного единственного объекта для всей программы. Объектов итемов ты можешь наделать сколько оперативной памяти хватит, зарегистрировать в реестре предметов тоже.
 
Defilak написал(а):
Kuroi написал(а):
Можешь подробно описать какой класс надо создать и где его надо прописать? Мне надо что бы по нажатию кнопки в гуи этом проверялось какой предмет лежит в слоте 0 и в слоте 1, за тем если предметы лежат нужные их удаляло из слотов и выдавало новый предмет и гуи закрывалось. Просто тут так много всего было, что я уже запутался и не понимаю какой класс создать и куда его прописать.
UPD. Мне нужно создать кастом класс на примере этого?
Код:
    public InventoryCrafting craftMatrix = new InventoryCrafting(this, 1, 2);
Если да, то как его зарегистрировать, так как тут многое кричали, что мне его еще регистрировать надо, так как я раньше его создавал уже, предполагая, что он нужен. А сейчас юзаю от крафтера.
Т.е. тебе нужно сделать просто верстак с тремя слотами вместо десяти? Тогда да, InventoryCrafting тебе подойдет. Регистрировать его нигде не нужно. Но верстак использует два класса имплементирующих IInventory. Один для матрицы, другой для результатов крафта. В любом случае можешь просто посмотреть ContainerWorkbench.
Так же, посмотри вот здесь. Там все просто и понятно описано.
Я же описал, мне не нужен крафтер. Мне нужно реализовать гуи с кнопкой и двумя слотами, по нажатию кнопки проверяются эти слоты и если в них лежать предметы нужные для выдачи нового, то они удаляются из этих слотов, выдается предме и гуи закрывается.
 
Kuroi написал(а):
Я же описал, мне не нужен крафтер. Мне нужно реализовать гуи с кнопкой и двумя слотами, по нажатию кнопки проверяются эти слоты и если в них лежать предметы нужные для выдачи нового, то они удаляются из этих слотов, выдается предме и гуи закрывается.
То что ты описал - является верстаком. И делается по аналогии с ним.

Конечно, если оба предмета строго определены и других быть не может, то можно сделать попроще - я уже давал название метода для получения итемстака в определенном слоте. Так же, изменение содержимого слотов заставляет срабатывать метод onCraftMatrixChanged() в контейнере. А кнопки реализуются пакетами.

В любом случае, мне лень продолжать пояснять за контейнеры. Тебе уже сказали в каком направлении копать, а тебе нужен именно рабочий код - но это уже не помощь, а работа забесплатно.
 
Defilak написал(а):
Kuroi написал(а):
Я же описал, мне не нужен крафтер. Мне нужно реализовать гуи с кнопкой и двумя слотами, по нажатию кнопки проверяются эти слоты и если в них лежать предметы нужные для выдачи нового, то они удаляются из этих слотов, выдается предме и гуи закрывается.
То что ты описал - является верстаком. И делается по аналогии с ним.

Конечно, если оба предмета строго определены и других быть не может, то можно сделать попроще - я уже давал название метода для получения итемстака в определенном слоте. А кнопки реализуются пакетами.

В любом случае, мне лень продолжать пояснять за контейнеры. Тебе уже сказали в каком направлении копать, а тебе нужен именно рабочий код - но это уже не помощь, а работа забесплатно.
при использовании
Код:
    public InventoryCrafting craftMatrix = new InventoryCrafting(this, 1, 2);
    private World worldObj;

    public GuiContainerMod (EntityPlayer player, World world, ItemStack itemStack){
        this.worldObj = world;
        this.addSlotToContainer(new Slot(craftMatrix, 0, 30+18, 17));
        this.addSlotToContainer(new Slot(craftMatrix, 1, 30+18, 17+18));
        bindPlayerInventory(player.inventory);
    }
Не получается сделать проверку
Код:
GuiContainerMod.craftMatrix.getStackInSlot(0).getItem()
Но я больше чем уверен, что я не понимаю почему, знаю одно что для этого нужно craftMatrix переводить в static но тогда начинает  ругаться на this в InventoryCrafting(this, 1, 2) и я хз что с этим делать дальше. если создавать второй класс то мне нужно понять как их заставить работать совместно.
 
Kuroi написал(а):
при использовании
Код:
    public InventoryCrafting craftMatrix = new InventoryCrafting(this, 1, 2);
    private World worldObj;

    public GuiContainerMod (EntityPlayer player, World world, ItemStack itemStack){
        this.worldObj = world;
        this.addSlotToContainer(new Slot(craftMatrix, 0, 30+18, 17));
        this.addSlotToContainer(new Slot(craftMatrix, 1, 30+18, 17+18));
        bindPlayerInventory(player.inventory);
    }
Не получается сделать проверку
Код:
GuiContainerMod.craftMatrix.getStackInSlot(0).getItem()
Но я больше чем уверен, что я не понимаю почему, знаю одно что для этого нужно craftMatrix переводить в static но тогда начинает  ругаться на this в InventoryCrafting(this, 1, 2) и я хз что с этим делать дальше. если создавать второй класс то мне нужно понять как их заставить работать совместно.
thumb.png

Я конечно могу войти в чужое положение, но боли от непроизвольного удара рукой себе по лицу это не отменяет.
Иди гугли разницу между статичными объектами, и обычными.

И да - в тривиальных случаях, как этот, для построение интерфейса с инвентарем тебе не нужно ничего кроме трех классов: контейнера, инвентаря, и гуя. И в каждом из них можно получить обьект остальных двух и с ними уже работать.
Могу лишь добавить что если ты сделаешь матрицу статичной, то она будет одинакова у всех.
 
реализовал это при помощи такого кода 
Код:
    public InventoryCrafting craftMatrix = new InventoryCrafting(this, 1, 2);
    public static IInventory upWeapons = new InventaryUpWeapons();
    private World worldObj;

    public GuiContainerMod (EntityPlayer player, World world, ItemStack itemStack){
        this.worldObj = world;
        this.addSlotToContainer(new Slot(craftMatrix, 0, 30+18, 17));
        this.addSlotToContainer(new Slot(craftMatrix, 1, 30+18, 17+18));
        this.addSlotToContainer(new SlotCrafting(player, this.craftMatrix, this.upWeapons, 0, 124, 35));
        bindPlayerInventory(player.inventory);
    }
И получаю это на кнопке при помощи
Код:
this.entity.inventory.addItemStackToInventory(new ItemStack(GuiContainerMod.upWeapons.getStackInSlot(0).getItem(), 1));
Все выдается, но теперь вопрос новый. Как запретить брать предмет при помощи мыши и тп. что бы его можно было получить только нажатием кнопки в гуи? Который появляется в в слоте
Код:
        this.addSlotToContainer(new SlotCrafting(player, this.craftMatrix, this.upWeapons, 0, 124, 35));
InventaryUpWeapons.class
Код:
package spellflex.kuroi.rpg.gui;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;

public class InventaryUpWeapons implements IInventory
{
    /** A list of one item containing the result of the crafting formula */
    private ItemStack[] stackResult = new ItemStack[1];
    private static final String __OBFID = "CL_00001760";

    /**
     * Returns the number of slots in the inventory.
     */
    public int getSizeInventory()
    {
        return 1;
    }

    /**
     * Returns the stack in slot i
     */
    public ItemStack getStackInSlot(int p_70301_1_)
    {
        return this.stackResult[0];
    }

    /**
     * Returns the name of the inventory
     */
    public String getInventoryName()
    {
        return "Result";
    }

    /**
     * Returns if the inventory is named
     */
    public boolean hasCustomInventoryName()
    {
        return false;
    }

    /**
     * Removes from an inventory slot (first arg) up to a specified number (second arg) of items and returns them in a
     * new stack.
     */
    public ItemStack decrStackSize(int p_70298_1_, int p_70298_2_)
    {
        if (this.stackResult[0] != null)
        {
            ItemStack itemstack = this.stackResult[0];
            this.stackResult[0] = null;
            return itemstack;
        }
        else
        {
            return null;
        }
    }

    /**
     * When some containers are closed they call this on each slot, then drop whatever it returns as an EntityItem -
     * like when you close a workbench GUI.
     */
    public ItemStack getStackInSlotOnClosing(int p_70304_1_)
    {
        if (this.stackResult[0] != null)
        {
            ItemStack itemstack = this.stackResult[0];
            this.stackResult[0] = null;
            return itemstack;
        }
        else
        {
            return null;
        }
    }

    /**
     * Sets the given item stack to the specified slot in the inventory (can be crafting or armor sections).
     */
    public void setInventorySlotContents(int p_70299_1_, ItemStack p_70299_2_)
    {
        this.stackResult[0] = p_70299_2_;
    }

    /**
     * Returns the maximum stack size for a inventory slot.
     */
    public int getInventoryStackLimit()
    {
        return 64;
    }

    /**
     * For tile entities, ensures the chunk containing the tile entity is saved to disk later - the game won't think it
     * hasn't changed and skip it.
     */
    public void markDirty() {}

    /**
     * Do not make give this method the name canInteractWith because it clashes with Container
     */
    public boolean isUseableByPlayer(EntityPlayer p_70300_1_)
    {
        return true;
    }

    public void openInventory() {}

    public void closeInventory() {}

    /**
     * Returns true if automation is allowed to insert the given stack (ignoring stack size) into the given slot.
     */
    public boolean isItemValidForSlot(int p_94041_1_, ItemStack p_94041_2_)
    {
        return true;
    }
}
Как сделать этот слот не кликабельным?
 
Никак. На то он и слот чтоб в него тыкать. Но запретить туда класть что либо можно опять же при помощи isItemValid(). Создаешь класс расширяющий Slot, и все такое.
 
Defilak написал(а):
Никак. На то он и слот чтоб в него тыкать. Но запретить туда класть что либо можно опять же при помощи isItemValid(). Создаешь класс расширяющий Slot, и все такое.
В данный слот и так ничего положить нельзя. Я взял стандартный класс от крафтера для него. Но вот надо сделать его либо невидимым либо запретить из него забирать предметы. А вообще проще всего было бы если бы кто-то помог
Код:
    public InventoryCrafting craftMatrix = new InventoryCrafting(this, 1, 2);
        this.addSlotToContainer(new Slot(craftMatrix, 0, 30+18, 17));
        this.addSlotToContainer(new Slot(craftMatrix, 1, 30+18, 17+18));
Оборотиться к этим слотам по принципу как я сделал к слоту с полученным результатом крафта.
Код:
this.entity.inventory.addItemStackToInventory(new ItemStack(GuiContainerMod.upWeapons.getStackInSlot(0).getItem(), 1, GuiContainerMod.upWeapons.getStackInSlot(0).getItemDamage()));
Сам я не допираю, в php такого нет и поэтому сложно для меня найти этому решения одному. Пытался найти в гугле, но ничего не нашел, скорее всего я неправильно строю поисковый запрос, или плохо умылся утром. Прошу не писать типа там наследуешь и тут бах и там бум. Просто напишите пожалуйста кусок кода. Мозг у меня уже так закипел, что не описать.
 
Если ты хочешь просто рисовать предмет в слоте, в который нельзя положить предмет и из которого нельзя достать предмет - реализуй это через гуи. Предмет пусть хранится в каком-нибудь хранилище, доступ к которому по кнопке.

Kuroi написал(а):
Прошу не писать типа там наследуешь и тут бах и там бум. Просто напишите пожалуйста кусок кода.
Напишу код - ты не станешь разбираться и пытаться понять как оно работает - захочешь большего - возникнет ещё больше вопросов.
 
Oldestkon написал(а):
Если ты хочешь просто рисовать предмет в слоте, в который нельзя положить предмет и из которого нельзя достать предмет - реализуй это через гуи. Предмет пусть хранится в каком-нибудь хранилище, доступ к которому по кнопке.

Kuroi написал(а):
Прошу не писать типа там наследуешь и тут бах и там бум. Просто напишите пожалуйста кусок кода.
Напишу код - ты не станешь разбираться и пытаться понять как оно работает - захочешь большего - возникнет ещё больше вопросов.
Реализуй это через гуи? да ладно, это ты сейчас не шутишь?
я о том, что я для слота в котором рисуется придмет я сделал отдельный класс
Код:
    public static IInventory upWeapons = new InventaryUpWeapons();
и обращаюсь к нему
Код:
GuiContainerMod.upWeapons.getStackInSlot(0).getItem()
Из другого класса, но мне нужно обратиться таким же принципом к слотам
Код:
        this.addSlotToContainer(new Slot(craftMatrix, 0, 48, 17));
        this.addSlotToContainer(new Slot(craftMatrix, 1, 48, 35));
создавать под каждый слот класс не считаю правильным.
А по моему если ты напишешь код мне будет легче понять как решается моя задача, если конечно в твоем коде будет нужная мне задача описана, потому, что мне начинает казаться что меня не понимают.
Опишу что именно мне надо еще раз более понятно надеюсь
Код:
У меня есть два слота
        this.addSlotToContainer(new Slot(craftMatrix, 0, 48, 17));
        this.addSlotToContainer(new Slot(craftMatrix, 1, 48, 35));
мне нужно получить находящиеся в них предметы в другом классе, по вот такому принципу
GuiContainerMod.craftMatrix.getStackInSlot(0).getItem()
но для этого нужно сделать объект
    public InventoryCrafting craftMatrix = new InventoryCrafting(this, 1, 2);
статическим, чего делать нельзя, да и не получается, так как я не понимаю что мне нужно написать заместо this
 
Код:
но для этого нужно сделать объект
    public InventoryCrafting craftMatrix = new InventoryCrafting(this, 1, 2);
статическим,
Прежде чем тыкать другим в то, что они якобы дебилы, разберись сначала хотя бы с гребаными основами ООП.
 
Oldestkon написал(а):
Код:
но для этого нужно сделать объект
    public InventoryCrafting craftMatrix = new InventoryCrafting(this, 1, 2);
статическим,
Прежде чем тыкать другим в то, что они якобы дебилы, разберись сначала хотя бы с гребаными основами ООП.
1. я ни кого не тыкаю. Если ты о том, что я говорю, что вы меня не понимаете, это не значит, что проблема в вас, возможно проблема во мне и я криво объяснил.
2 помоги разобраться, а то тут все горазды кричать, да ты не так делаешь, да ты поди почитай, это делается не так. А по факту складывается впечатление что они и сами не понимают этого и просто пытаются казаться умными. А тот кто знает и если он действительно хочет помочь, тот возьмет и объяснит, а не будет отправлять хз куда ну или как минимум даст материал который будет толков. Да и причем тут ооп? Вся JAvA является объектно ориентированным программированием. А если я не понимаю как мне начать взаимодействие в другом классе с объектом который нельзя сделать статически, то наверно стоит сказать, что так не получится, а вы все говорите иди почитай, значит все таки так можно, так вот искал я искал и ничего не нашел. Прошу написать как это сделать, ни кто не пишет, вывод, те кто говорят читать, сами не читали и не знают. Если я не прав, то опиши как обратиться к нестатическому объекту класса через другой класс без использования открытия класса объектно, то есть без Object a = new b();
 
Божеее мой.
Если тебе говорят идти почитать - стоит идти и почитать, не?
 
Специально для тебя обьясняю
. Что делает модификатор static:
При обьявлении поля с данным модификатором, данное поле становится общим для всех объектов (экземпляров) данного класса. Улавливаешь логику? Нет?
Один игрок нажал ПКМ, засунул предмет в инвентарь -> у другого игрока, у которого открыт этот инвентарь, ВНЕЗАПНО появляется предмет. Почему? Да потому что ты делаешь матрицу общей для всех игроков по сути. И любое изменение из любого участка кода отражается везде.

Что тебе надо сделать?

Посмотри IExtendedEntityProperties, посмотри NBT. Люди же как-то добавляют новые характеристики игроку? Что тебе мешает добавить в игрока переременную, которая хранит контейнер? И модификатор статик (он тут вообще не уместен) будет не нужен и ты спокойно сможешь обратиться к своим слотам через onItemUse\т.д.

Таким образом, ты сможешь узнать что находится в твоем потаенном контейнере, что вызывается по ПКМ на предмете, через любой участок кода, где фигурирует игрок.

Если тебе нужен отдельный инвентарь для каждого предмета - используй NBT итемстака, контейнер остается у игрока, но IInventory - craftMatrix, точнее его содержимое - итемстаки, будут в данном случае привязаны к другому итемстаку.

Что насчет гуи - я предлагал тебе следующее. Ты как-то промолвился, что у тебя есть слот, в который нельзя положить предмет - и из которого нельзя забрать предмет, но предмет там каким-то образом появляется. Через гуи мы просто отрисовываем нужный при данных обстоятельствах предмет, затемняем слот (как бы говоря юзеру, что ты не возьмешь предмет) и всё. Типа визуальная подсказка. А дальше там свои действия по кнопочкам.

Да, я не очень вник в твою задачу, потому что стены текста, где половина буковок - агр на других людей, меня не очень привлекает. Поэтому, если что непонятно - опиши свою задачу максимально подробно, и попробуй сделать это грамотно и по пунктам.

>Если я не прав, то опиши как обратиться к нестатическому объекту класса через другой класс без >использования открытия класса объектно, то есть без Object a = new b();
Элементарные знания ООП, нет?
Есть класс гуи, есть контейнер. Я хочу в классе гуи отрисовать предмет из контейнера. Твоя задача?
1. Имеем конструктор гуи - public MyGui(MyContainer container, EntityPlayer player)
2. Смекаешь?
3. При создании гуи, сначала создается контейнер, дальше он передается в гуи.
4. ??? ItemStack itemStack = container.itemMatrix.getItemInSlot(0);
5. PROFIT

Упомяну, что в Java операнд = при работе с обьектами оперирует лишь над ссылками. Это очень важный момент. Клонирование обьектов осуществляется через создание нового - это либо конструктор с входным аргументом, тип которого совпадает с самим классом обьекта, либо метод clone(), который возвращает новый обьект с теми же свойствами.
 
Назад
Сверху