Проблема с слотами GUI. Вещи не перетаскиваются.

Ari

38
0
Вот есть код:
Код:
package com.example.examplemod;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;

public class ContainerDryingRack extends Container {
    public InventoryPlayer i;
    public ContainerDryingRack(InventoryPlayer inventory, TileEntityDryingRack dryingRack) 
    {
        i = inventory;
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/0, 8, 142));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/1, 26, 142));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/2, 44, 142));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/3, 62, 142));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/4, 80, 142));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/5, 98, 142));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/6, 116, 142));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/7, 134, 142));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/8, 152, 142));
    }

    @Override
    public boolean canInteractWith(EntityPlayer p_75145_1_) {
        // TODO Auto-generated method stub
        return i.isUseableByPlayer(p_75145_1_);
    }
    @Override
    public ItemStack slotClick(int slot, int button, int flag, EntityPlayer player) {
        // this will prevent the player from interacting with the item that opened the inventory:
        if (slot >= 0 && getSlot(slot) != null && getSlot(slot).getStack() == player.getHeldItem()) {
            return null;
        }
        return super.slotClick(slot, button, flag, player);
    }
}


Слоты добавились все работает нормально но как только захотел перетянуть из одного слота в другой вылезла проблема.
При клике мышью предмет на миллисекунду берется и потом возвращается туда где он был.
В Google все на английском а я его плохо знаю.
PS: Пожалусто скажите хоть что искать

PSS: Версия 1.7.10
 
Предположений несколько.
Если у тебя версия ниже 1.7 Minecraft, то нужно использовать, типа этого:
Код:
@NetworkMod (clientSideRequired = true, serverSideRequired = true, versionBounds = "1.0")
Есть ещё предположение. Может связано с тем, что не верно указано "ySize" в твоём GUI.
Также возможно, что GUI открывается без твоего контейнера. Так как не известно как ты вызываешь твоё GUI окно.
 
Agravaine написал(а):
Открыть надо на сервере потому что.
Тут такая проблемка. Это одиночка
[merge_posts_bbcode]Добавлено: 20.01.2016 17:44:33[/merge_posts_bbcode]
[merge_posts_bbcode]Добавлено: 20.01.2016 17:46:19[/merge_posts_bbcode]

Предположений несколько.
Если у тебя версия ниже 1.7 Minecraft, то нужно использовать, типа этого:
Код:
@NetworkMod (clientSideRequired = true, serverSideRequired = true, versionBounds = "1.0")
Есть ещё предположение. Может связано с тем, что не верно указано "ySize" в твоём GUI.
Также возможно, что GUI открывается без твоего контейнера. Так как не известно как ты вызываешь твоё GUI окно.
Вот все что связано с GUI:
Код:
package com.example.examplemod;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import cpw.mods.fml.common.network.IGuiHandler;

public class EgyptianCraftGuiHandler implements IGuiHandler {

    @Override
    public Object getServerGuiElement(int ID, EntityPlayer player, World world,
            int x, int y, int z) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
        TileEntity tileentity = world.getTileEntity(x, y, z);
        if(ID == 0)
        {
            return new GuiDryingRack(player.inventory, (TileEntityDryingRack) tileentity);
        }
        return null;
    }

}

package com.example.examplemod;

import cpw.mods.fml.client.FMLClientHandler;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.network.internal.FMLNetworkHandler;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.monster.EntityCreeper;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.IIcon;
import net.minecraft.util.MathHelper;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;

public class BlockCE extends BlockContainer 
{
    IIcon gor = null, dol = null, st1 = null, st2 = null, st3 = null, st4 = null;
    public BlockCE(Material materials)
    {
        super(materials);
        
        this.setHardness(3.0F);
        this.setCreativeTab(CreativeTabs.tabBlock);
        this.setStepSound(this.soundTypeGlass);
        this.setResistance(10.0F);
    }
    @SideOnly(Side.CLIENT)
    @Override
    public void registerBlockIcons(IIconRegister reg){
    this.gor = reg.registerIcon(ExampleMod.MODID + ":Down_power");
    this.dol = reg.registerIcon(ExampleMod.MODID + ":Top_power");
    this.st1 = reg.registerIcon(ExampleMod.MODID + ":dlo_power");
    this.st2 = reg.registerIcon(ExampleMod.MODID + ":dlo_power");
    this.st3 = reg.registerIcon(ExampleMod.MODID + ":dlo_power");
    this.st4 = reg.registerIcon(ExampleMod.MODID + ":dlo_power");
    }
    boolean red = false;
    public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int par6int, float par7float, float par8float, float par9float)
    {
        FMLNetworkHandler.openGui(player, ExampleMod.instance, 0, world, x, y, z);
        /*
        if (par1World.getBlock(par2int, par3int - 1, par4int) == Blocks.wool && !par1World.isRemote)
        {
            // Если есть, то превращаем оба блока в воздух (удаляем их)
            par1World.setBlockToAir(par2int, par3int, par4int);
            par1World.setBlockToAir(par2int, par3int - 1, par4int);
            for (int X = par2int; X < par2int + 10; X += 1)
            {
                for (int Y = par3int - 10; Y < par3int; Y += 1)
                {
                    for (int Z = par4int; Z < par4int + 10; Z += 1) 
                    {
                        if(par1World.getBlock(X,Y,Z) != Blocks.coal_ore && par1World.getBlock(X,Y,Z) != Blocks.iron_ore && par1World.getBlock(X,Y,Z) != Blocks.coal_ore && par1World.getBlock(X,Y,Z) != Blocks.gold_ore && par1World.getBlock(X,Y,Z) != Blocks.diamond_ore && par1World.getBlock(X,Y,Z) != Blocks.lapis_ore && par1World.getBlock(X,Y,Z) != Blocks.redstone_ore && par1World.getBlock(X,Y,Z) != Blocks.bedrock && par1World.getBlock(X,Y,Z) != Blocks.emerald_ore)
                        {
                            par1World.setBlockToAir(X,Y,Z);
                        }    
                    }
                }
            }
        }
        */
        return true;
    }
    @EventHandler
    public void onNeighborBlockChange(World world, int x, int y, int z, int blockID)
    {
       
        if (!world.isRemote && world.isBlockIndirectlyGettingPowered(x, y, z)) 
        {
         // Если есть, то превращаем оба блока в воздух (удаляем их)
           world.setBlockToAir(x, y, z);
           world.setBlockToAir(x, y - 1, z);
         for (int X = x; X < x + 10; X += 1)
         {
             for (int Y = y - 10; Y < y; Y += 1)
             {
                 for (int Z = z; Z < z + 10; Z += 1) 
                 {
                     world.setBlockToAir(X,Y,Z);
                 }
             }
         }
        }
   }
    @SideOnly(Side.CLIENT)
    @Override
    public IIcon getIcon(int i, int par2){

    if (i == 0)
    return gor;

    else if (i == 1)
    return dol;

    else if (i == 2)
    return st1;

    else if (i == 3)
    return st2;

    else if (i == 4)
    return st4;

    else if (i == 5)
    return st3;

    else
    return gor;

    }
    @Override
    public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_)
    {
        return new TileEntityDryingRack();
    }
    public int isProvidingStrongPower(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5){
        return red?1:0;
    }
    public void onNeighborBlockChange(World world, int i, int j, int k, Block l){
    EntityPlayer entity = Minecraft.getMinecraft().thePlayer;
    if (Block.getIdFromBlock(l) > 0 && l.canProvidePower() && world.isBlockIndirectlyGettingPowered(i, j, k))
    {
        if(true)
        {
            if(entity instanceof EntityPlayer)((EntityPlayer)entity).setPositionAndUpdate(0, 99, 0);
        }

    }
    }
    @Override
    public void onBlockPlacedBy(World par1World, int par2int, int par3int, int par4int, EntityLivingBase par5EntityLivingBase, ItemStack par6ItemStack)
    {
        int i = MathHelper.floor_double((double)(par5EntityLivingBase.rotationYaw * 4.0F / 360.0F) + 2.5D) & 3;
        par1World.setBlockMetadataWithNotify(par2int, par3int, par4int, i, 2);
    }
}

package com.example.examplemod;

import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.util.ResourceLocation;

public class GuiDryingRack extends GuiContainer 
{
    public final ResourceLocation texture = new ResourceLocation(ExampleMod.MODID, "textures/gui/GUI.png");
    public GuiDryingRack(InventoryPlayer inventory, TileEntityDryingRack dryingRack) {
        super(new ContainerDryingRack(inventory, dryingRack));
        }

    @Override
    protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) {
        xSize = 176;
        ySize = 166;
        Minecraft.getMinecraft().getTextureManager().bindTexture(texture);
        drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize);
    }

}

package com.example.examplemod;

import net.minecraft.tileentity.TileEntity;

public class TileEntityDryingRack extends TileEntity{

}
 
Вот в этом и проблема:
@Override
public Object getServerGuiElement(int ID, EntityPlayer player, World world,
int x, int y, int z) {
// TODO Auto-generated method stub
return null;
}
Проблема в том, что нужно отдавать твой контейнер.
Ari, Agravaine имел виду не про сервер, а серверную сторону.
 
timaxa007 написал(а):
Вот в этом и проблема:
   @Override
   public Object getServerGuiElement(int ID, EntityPlayer player, World world,
           int x, int y, int z) {
       // TODO Auto-generated method stub
       return null;
   }
Проблема в том, что нужно отдавать твой контейнер.
Ari, Agravaine имел виду не про сервер, а серверную сторону.
А как это зделать если не секрет ?
[merge_posts_bbcode]Добавлено: 20.01.2016 17:51:58[/merge_posts_bbcode]

PS: Ну все равно огромное спасибо:)

[merge_posts_bbcode]Добавлено: 20.01.2016 17:52:48[/merge_posts_bbcode]

Код:
    @Override
    public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
        TileEntity tileentity = world.getTileEntity(x, y, z);
        if(ID == 0)
        {
            return new GuiDryingRack(player.inventory, (TileEntityDryingRack) tileentity);
        }
        return null;
    }
Вот так ?
Если да то тут проблемка.
Майн сам закриваетса
 
Сделать почти как у getClientGuiElement:
Код:
    @Override
    public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
        TileEntity tileentity = world.getTileEntity(x, y, z);
        if(ID == 0)
        {
            return new ContainerDryingRack(player.inventory, (TileEntityDryingRack) tileentity);
        }
        return null;
    }
[merge_posts_bbcode]Добавлено: 20.01.2016 15:54:26[/merge_posts_bbcode]

Не GuiDryingRack, а ContainerDryingRack для getServerGuiElement.
 
Какой краш?
Но так-же возможно придётся сделать условие на проверку:
Код:
if (tileentity != null && tileentity instanceof TileEntityDryingRack)
Пожалуйста.
 
timaxa007 написал(а):
Какой краш?
Но так-же возможно придётся сделать условие на проверку:
Код:
if (tileentity != null && tileentity instanceof TileEntityDryingRack)
Уже все работает. Вот только новая проблема. Взять можно а положить назад нельзя ;(
PS: Но это я уже как то сам зделю
Еще раз спасибо вам
Хотя... Если знаете в чом может бить проблема может сказать ?
 
Проблема в методе slotClick в классе ContainerDryingRack.
 
Назад
Сверху