Дополнительные слоты

Версия Minecraft
1.7.10
124
1
0
Приветствую, мододелы. Есть вопросик: у меня есть слот в верстаке. когда я в него кладу определённый итем, например SolderCraft.plate16 - должна отобразиться матрица крафта 6x6. как это сделать? (верстак работает, но матрица работает хоть с итемом, хоть без него)
 
124
1
0
верстак свой, основная матрица 6 на 6 слотов, 3 дополнительных и 1 для отключения верстака, причем мне надо отключать только основную матрицу (когда игрок вставит в определённый слот (craftMatrix, слот 36) плату - появится поле 6 на 6, где он может поставить на неё элементы.)
 
124
1
0
timaxa007 написал(а):
Либо блокируй взаимодействие со слотами от матрицы 6x6, либо добавляй и убирай слоты по условии.

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

tox1cozZ

aka Agravaine
Модератор
7,753
512
2,469
Слоты добавляешь как обычно, но ставишь им огромные координаты, чтобы до них никак нельзя было достать.
При клике на слот, проверяй, лежит ли там твой предмет. Если да - сдвигаешь матрицу на норм координаты, если нет - на огромные.
 
124
1
0
Agravaine написал(а):
Слоты добавляешь как обычно, но ставишь им огромные координаты, чтобы до них никак нельзя было достать.
При клике на слот, проверяй, лежит ли там твой предмет. Если да - сдвигаешь матрицу на норм координаты, если нет - на огромные.

Будь другом, подскажи условие для if, проверяющее наличие предмета, например Items.apple в слоте 36 инвентаря craftMatrix
 
124
1
0
вставил. В итоге при открытии стола - игра крашается.

контейнер
Код:
package com.mnsbabydoll.SolderCraft.container;

import com.mnsbabydoll.SolderCraft.crafting.SolderTableCraftingManager;
import com.mnsbabydoll.SolderCraft.main.SolderCraft;

import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.InventoryCraftResult;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.inventory.Slot;
import net.minecraft.inventory.SlotCrafting;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;

public class ContainerSolderTable extends Container {

 public InventoryCrafting craftMatrix;
 public IInventory craftResult;
 private World worldObj;
 private int posX;
 private int posY;
 private int posZ;
 
 public ContainerSolderTable(InventoryPlayer invPlayer, World world, int x, int y, int z)
 {
 craftMatrix = new InventoryCrafting(this, 6, 7);
 craftResult = new InventoryCraftResult();
 worldObj = world;
 posX = x;
 posY = y;
 posZ = z;
 
 this.addSlotToContainer(new SlotCrafting(invPlayer.player, craftMatrix, craftResult, 0, 152, 108));
 
 for (int i = 0; i < 6; i++)
 {
 for (int k = 0; k < 6; k++)
 {
 this.addSlotToContainer(new Slot(craftMatrix, k + i * 6, 8 + k * 18, 18 + i * 18));
 }
 }
 
 this.addSlotToContainer(new Slot(craftMatrix, 36, 116, 18));
 this.addSlotToContainer(new Slot(craftMatrix, 37, 116, 36));
 this.addSlotToContainer(new Slot(craftMatrix, 38, 116, 54));
 this.addSlotToContainer(new Slot(craftMatrix, 39, 116, 72));
 
 for (int i = 0; i < 3; i++)
 {
 for (int k = 0; k < 9; k++)
 {
 this.addSlotToContainer(new Slot(invPlayer, k + i * 9 + 9, 8 + k * 18, 140 + i * 18));
 }
 }
 
 for (int i = 0; i < 9; i++)
 {
 this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 198));
 }
 
 if (((Slot) inventorySlots.get(36)).getStack().getItem() == Items.apple) {
 System.out.println("яблоко!!!");
 }
 onCraftMatrixChanged(craftMatrix);
 }
 
 public void onCraftMatrixChanged(IInventory inventory)
 {
 craftResult.setInventorySlotContents(0, SolderTableCraftingManager.getInstance().findMatchingRecipe(craftMatrix, worldObj));
 }
 
 
 @Override
 public boolean canInteractWith(EntityPlayer player) {
 if (worldObj.getBlock(posX, posY, posZ) != SolderCraft.solderTable)
 {
 return false;
 }
 else
 {
 return player.getDistanceSq((double)posX + 0.5D, (double)posY + 0.5D, (double)posZ + 0.5D) <=64.0D;
 }
 }
 
 public void onContainerClosed(EntityPlayer p_75134_1_)
    {
        super.onContainerClosed(p_75134_1_);

        if (!this.worldObj.isRemote)
        {
            for (int i = 0; i < 40; ++i)
            {
                ItemStack itemstack = this.craftMatrix.getStackInSlotOnClosing(i);

                if (itemstack != null)
                {
                    p_75134_1_.dropPlayerItemWithRandomChoice(itemstack, false);
                }
            }
        }
    }
 
 public ItemStack transferStackInSlot(EntityPlayer p_82846_1_, int p_82846_2_)
    {
        ItemStack itemstack = null;
        Slot slot = (Slot)this.inventorySlots.get(p_82846_2_);

        if (slot != null && slot.getHasStack())
        {
            ItemStack itemstack1 = slot.getStack();
            itemstack = itemstack1.copy();

            if (p_82846_2_ == 0)
            {
                if (!this.mergeItemStack(itemstack1, 10, 46, true))
                {
                    return null;
                }

                slot.onSlotChange(itemstack1, itemstack);
            }
            else if (p_82846_2_ >= 10 && p_82846_2_ < 37)
            {
                if (!this.mergeItemStack(itemstack1, 37, 46, false))
                {
                    return null;
                }
            }
            else if (p_82846_2_ >= 37 && p_82846_2_ < 46)
            {
                if (!this.mergeItemStack(itemstack1, 10, 37, false))
                {
                    return null;
                }
            }
            else if (!this.mergeItemStack(itemstack1, 10, 46, false))
            {
                return null;
            }

            if (itemstack1.stackSize == 0)
            {
                slot.putStack((ItemStack)null);
            }
            else
            {
                slot.onSlotChanged();
            }

            if (itemstack1.stackSize == itemstack.stackSize)
            {
                return null;
            }

            slot.onPickupFromSlot(p_82846_1_, itemstack1);
        }

        return itemstack;
    }

}

гуи
Код:
package com.mnsbabydoll.SolderCraft.gui;

import org.lwjgl.opengl.GL11;

import com.mnsbabydoll.SolderCraft.container.ContainerSolderTable;

import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.StatCollector;
import net.minecraft.world.World;

public class GuiSolderTable extends GuiContainer 
{
	private ResourceLocation texture = new ResourceLocation("SolderCraft:textures/gui/SolderTable.png");
	public GuiSolderTable(InventoryPlayer invPlayer, World world, int x, int y, int z) 
	{
		super(new ContainerSolderTable(invPlayer, world, x, y, z));
		
		this.xSize = 256;
		this.ySize = 171;
	}
	
	public void onGuiClosed()
	{
		super.onGuiClosed();
	}
	
	protected void drawGuiContainerForegroundLayer(int i, int j)
	{
		this.fontRendererObj.drawString(StatCollector.translateToLocal("Solder Table"), 100, 5, 0x000000);
	}
	
	@Override
	protected void drawGuiContainerBackgroundLayer(float var1, int var2, int var3) 
	{
		GL11.glColor4f(1F, 1F, 1F, 1F);
		
		Minecraft.getMinecraft().getTextureManager().bindTexture(texture);
		
		int Left = (width - xSize) / 2;
		int Top = (height - ySize) / 2;
		
		drawTexturedModalRect(Left, Top, 0, 0, xSize, ySize);
	}

}
 
2,505
79
382
Дебагом научись пользоваться. И не будет таких мелких проблем. Точнее, ты их сам сможешь решить.


А вообще, для проверки ты можешь выводить не яблоко в куче ифиф, а сам слот вывести, если уж с дебагом туго.
 
2,505
79
382
Ну запускаешь в режиме дебага... Можно поставить куда-нибудь брекпоинт. Когда какой-нибудь поток дойдет до этой точки выполнение приостановится. Можно посмотреть состояния переменных. Можно пошагово продолжить отладку.
 

Led

291
3
0
Dahaka написал(а):
Дебагом научись пользоваться. И не будет таких мелких проблем. Точнее, ты их сам сможешь решить.


А вообще, для проверки ты можешь выводить не яблоко в куче ифиф, а сам слот вывести, если уж с дебагом туго.



Dahaka, я про дебаг случайно узнал тут, и только что понял, насколько это крутая штука!

Почему нет не одного гайда?
Если бы я знал про дебаг раньше, я бы намного меньше беспокоил timaxa007...
и вообще сэкономил бы часов 200 жизни....
 
Сверху