[1.7.10]GUIを表示するブロックの追加に関しての質問

Modding・サーバPlugin制作・ツール制作など、開発関連の質問があればこちらにお願い致します。
フォーラムルール
質問関連フォーラムで質問する時は、必ず次のトピックを一読/厳守お願い致します。
viewtopic.php?f=5&t=999
  • (PostNo.285767)

[1.7.10]GUIを表示するブロックの追加に関しての質問

投稿記事by ☭Destroy//Accuracy☭ » 2016年10月16日(日) 13:12

Mod開発をしているのですが、開発の途中で不具合が出てきてしまったので質問させていただきます。
不具合1:
燃料ゲージ(左のバー)が燃料を入れると緑色になるようにしたいのですが、ソースコードを入力しても反映されません。
不具合2:
一番右側の完成品スロットにアイテムを1スタックまで置いておけるようにしたいのですが、1個までしかおいてくれません。

ソースコードに目立ったエラーはありません。どの部分が間違っているのでしょうか。

環境: Eclipse 4.6 / Minecraft 1.7.10 / MinecraftForge #1558

2016-10-16_12.15.42.png


BlockAlloySmelter
コード: 全て選択
package destroy.platinum.block;

import java.util.Random;

import cpw.mods.fml.common.network.internal.FMLNetworkHandler;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import destroy.platinum.common.PlatinumExpansion;
import destroy.platinum.entity.TileEntityAlloySmelter;
import destroy.platinum.init.BlockRegistry;
import net.minecraft.block.Block;
import net.minecraft.block.BlockContainer;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.IIcon;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;

public class BlockAlloySmelter extends BlockContainer {

   private Random random = new Random();
   private final boolean isActive;
   private static boolean keepInventory = true;

   @SideOnly(Side.CLIENT)
   private IIcon iconTop;
   @SideOnly(Side.CLIENT)
   private IIcon iconFront;

   public BlockAlloySmelter(boolean blockState) {
      super(Material.iron);
      this.setBlockTextureName("platinum:alloySmelter");
      this.setHardness(3.0F);
      this.isActive = blockState;
   }

   public void onBlocAdded(World world, int x, int y, int z) {
      super.onBlockAdded(world, x, y, z);
      this.setDefaultDirection(world, x, y, z);
   }

   private void setDefaultDirection(World world, int x, int y, int z) {
         if (!world.isRemote) {
            Block block = world.getBlock(x, y, z -1);
            Block block1 = world.getBlock(x, y, z + 1);
            Block block2 = world.getBlock(x -1, y, z);
            Block block3 =world.getBlock(x + 1, y, z);
            byte b0 = 3;

            if (block.func_149730_j() && !block1.func_149730_j()) {
               b0 = 3;
            }

            if (block1.func_149730_j() && !block.func_149730_j()) {
               b0 = 2;
            }

            if (block2.func_149730_j() && !block3.func_149730_j()) {
               b0 = 5;
            }

            if (block3.func_149730_j() && !block2.func_149730_j()) {
               b0 = 4;
            }

            world.setBlockMetadataWithNotify(x, y, z, b0, 2);
      }
   }

   @SideOnly(Side.CLIENT)
   public IIcon getIcon(int side, int meta) {
      return side == 1 ? this.iconFront : (side == 0 ? this.iconFront : (side != meta ? this.blockIcon : this.iconTop));
   }

   @SideOnly(Side.CLIENT)
   public void registerBlockIcons(IIconRegister IIcon) {
      this.blockIcon = IIcon.registerIcon("platinum:alloySmelter_side");
      this.iconFront = IIcon.registerIcon(this.isActive ? "platinum:alloySmelter_front_on" : "platinum:alloySmelter_front_off");
      this.iconTop = IIcon.registerIcon("platinum:alloySmelter_top");
   }

   public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
      if (world.isRemote) {
         return true;
      } else {
         TileEntityAlloySmelter entityalloysmelter = (TileEntityAlloySmelter)world.getTileEntity(x, y, z);
         if (entityalloysmelter != null) {
            FMLNetworkHandler.openGui(player, PlatinumExpansion.Instance, BlockRegistry.guiIDAlloySmelter, world, x, y, z);
         }
         return true;
      }
   }

   public static void updateAlloySmelterBlockState(boolean isMashing, World world, int xCoord, int yCoord, int zCoord) {
      int l = world.getBlockMetadata(xCoord, yCoord, zCoord);
      TileEntity entity = world.getTileEntity(xCoord, yCoord, zCoord);
      keepInventory = true;

      if (isMashing) {
         world.setBlock(xCoord, yCoord, zCoord, BlockRegistry.alloySmelterIdle);
      } else {
         world.setBlock(xCoord, yCoord, zCoord, BlockRegistry.alloySmelterActive);
      }

      keepInventory = false;
      world.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, l, 2);

      if (entity != null) {
         entity.validate();
         world.setTileEntity(xCoord, yCoord, zCoord, entity);
      }
   }

   @Override
   public TileEntity createNewTileEntity(World world, int tile) {
      return new TileEntityAlloySmelter();
   }

   public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entity, ItemStack item) {
      int l = MathHelper.floor_double((double)(entity.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3;

      if (l == 0) {
         world.setBlockMetadataWithNotify(x, y, z, 2, 2);
      }

      if (l == 1) {
          world.setBlockMetadataWithNotify(x, y, z, 5, 2);
       }

       if (l == 2) {
          world.setBlockMetadataWithNotify(x, y, z, 3, 2);
       }

       if (l == 3) {
          world.setBlockMetadataWithNotify(x, y, z, 4, 2);
       }
   }

   public void breakBlock(World world, int x, int y, int z, Block block, int meta)
    {
        if (!keepInventory)
        {
            TileEntityAlloySmelter tileentity = (TileEntityAlloySmelter)world.getTileEntity(x, y, z);

            if (tileentity != null)
            {
                for (int j1 = 0; j1 < tileentity.getSizeInventory(); ++j1)
                {
                    ItemStack itemstack = tileentity.getStackInSlot(j1);

                    if (itemstack != null)
                    {
                        float f = this.random.nextFloat() * 0.8F + 0.1F;
                        float f1 = this.random.nextFloat() * 0.8F + 0.1F;
                        float f2 = this.random.nextFloat() * 0.8F + 0.1F;

                        while (itemstack.stackSize > 0)
                        {
                            int k1 = this.random.nextInt(21) + 10;

                            if (k1 > itemstack.stackSize)
                            {
                                k1 = itemstack.stackSize;
                            }

                            itemstack.stackSize -= k1;
                            EntityItem entityitem = new EntityItem(world, (double)((float)x + f), (double)((float)y + f1), (double)((float)z + f2), new ItemStack(itemstack.getItem(), k1, itemstack.getItemDamage()));

                            if (itemstack.hasTagCompound())
                            {
                                entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy());
                            }

                            float f3 = 0.05F;
                            entityitem.motionX = (double)((float)this.random.nextGaussian() * f3);
                            entityitem.motionY = (double)((float)this.random.nextGaussian() * f3 + 0.2F);
                            entityitem.motionZ = (double)((float)this.random.nextGaussian() * f3);
                            world.spawnEntityInWorld(entityitem);
                        }
                    }
                }

                world.func_147453_f(x, y, z, block);
            }
        }

        super.breakBlock(world, x, y, z, block, meta);
    }

   @SideOnly(Side.CLIENT)
    public void randomDisplayTick(World world, int x, int y, int z, Random random)
    {
        if (this.isActive)
        {
            int l = world.getBlockMetadata(x, y, z);
            float f = (float)x + 0.5F;
            float f1 = (float)y + 0.0F + random.nextFloat() * 6.0F / 16.0F;
            float f2 = (float)z + 0.5F;
            float f3 = 0.52F;
            float f4 = random.nextFloat() * 0.6F - 0.3F;

            if (l == 4)
            {
               world.spawnParticle("smoke", (double)(f - f3), (double)f1, (double)(f2 + f4), 0.0D, 0.0D, 0.0D);
               world.spawnParticle("flame", (double)(f - f3), (double)f1, (double)(f2 + f4), 0.0D, 0.0D, 0.0D);
            }
            else if (l == 5)
            {
               world.spawnParticle("smoke", (double)(f + f3), (double)f1, (double)(f2 + f4), 0.0D, 0.0D, 0.0D);
               world.spawnParticle("flame", (double)(f + f3), (double)f1, (double)(f2 + f4), 0.0D, 0.0D, 0.0D);
            }
            else if (l == 2)
            {
                world.spawnParticle("smoke", (double)(f + f4), (double)f1, (double)(f2 - f3), 0.0D, 0.0D, 0.0D);
                world.spawnParticle("flame", (double)(f + f4), (double)f1, (double)(f2 - f3), 0.0D, 0.0D, 0.0D);
            }
            else if (l == 3)
            {
               world.spawnParticle("smoke", (double)(f + f4), (double)f1, (double)(f2 + f3), 0.0D, 0.0D, 0.0D);
               world.spawnParticle("flame", (double)(f + f4), (double)f1, (double)(f2 + f3), 0.0D, 0.0D, 0.0D);
            }
        }
    }

   public boolean hasComparatorInputOverride() {
      return true;
   }

   public int getComparatorInputOverride(World world, int x, int y, int z, int meta) {
      return Container.calcRedstoneFromInventory((IInventory)world.getTileEntity(x, y, z));
   }

   public Item getItemDropped(int i, Random random, int j) {
      return Item.getItemFromBlock(BlockRegistry.alloySmelterIdle);
   }
}



TileEntityAlloySmelter
コード: 全て選択
package destroy.platinum.entity;

import destroy.platinum.block.BlockAlloySmelter;
import destroy.platinum.common.registry.AlloySmelterRecipes;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.tileentity.TileEntity;

public class TileEntityAlloySmelter extends TileEntity implements ISidedInventory {

   private static final int[] slotsTop = new int[] {0,1};
   private static final int[] slotsBottom = new int[] {3};
   private static final int[] slotsSides = new int[] {1};

   private ItemStack[] alloySmelterItemStacks = new ItemStack[4];

   public int furnacePower;
   public int furnaceCookTime;
   public static final int maxPower = 10000;
   public static final int mashingSpeed = 200;

   private String customName;

   public int getSizeInventory() {
      return this.alloySmelterItemStacks.length;
   }

   public ItemStack getStackInSlot(int i) {
      return this.alloySmelterItemStacks[i];
   }

   public ItemStack decrStackSize(int i, int j) {
      if (this.alloySmelterItemStacks[i] != null) {

         ItemStack itemstack;

         if (this.alloySmelterItemStacks[i].stackSize <= j) {

            itemstack = this.alloySmelterItemStacks[i];
            this.alloySmelterItemStacks[i] = null;
            return itemstack;
         }

         ItemStack itemstack1 = this.alloySmelterItemStacks[i].splitStack(j);

         if (this.alloySmelterItemStacks[i].stackSize == 0) {

            this.alloySmelterItemStacks[i] = null;
         }
         return itemstack1;
      } else {
         return null;
      }
   }

   public ItemStack getStackInSlotOnClosing(int i) {
      if (this.alloySmelterItemStacks[i] != null) {
         ItemStack itemstack = this.alloySmelterItemStacks[i];
         this.alloySmelterItemStacks[i] = null;
         return itemstack;
      } else {
         return null;
      }
   }

   public void setInventorySlotContents(int i, ItemStack itemstack) {
      this.alloySmelterItemStacks[i] = itemstack;
      if (itemstack != null && itemstack.stackSize > this.getInventoryStackLimit()) {
         itemstack.stackSize = getInventoryStackLimit();
      }
   }

   public String getInventoryName() {
      return this.hasCustomInventoryName() ? this.customName : "container.alloySmelter";
   }

   public boolean hasCustomInventoryName() {
      return this.customName != null && this.customName.length() > 0;
   }

   public void func_145951_a(String string) {
      this.customName = string;
   }

   public void readFromNBT(NBTTagCompound nbt) {
      super.readFromNBT(nbt);
      NBTTagList nbttaglist = nbt.getTagList("Items", 10);
      this.alloySmelterItemStacks = new ItemStack[this.getSizeInventory()];

      for (int i = 0; i < nbttaglist.tagCount(); i++) {
         NBTTagCompound nbt1 = (NBTTagCompound)nbttaglist.getCompoundTagAt(i);
         byte b0 = nbt1.getByte("Slot");

         if (b0 >= 0 && 0 < this.alloySmelterItemStacks.length) {
            this.alloySmelterItemStacks[b0] = ItemStack.loadItemStackFromNBT(nbt1);
         }
      }

      furnacePower = nbt.getShort("PowerTime");
      furnaceCookTime = nbt.getShort("CookTime");
   }

   public void writeToNBT(NBTTagCompound nbt) {
      super.writeToNBT(nbt);
      nbt.setShort("PowerTime", (short)this.furnacePower);
      nbt.setShort("CookTime", (short)this.furnaceCookTime);
      NBTTagList nbttaglist = new NBTTagList();

      for (int i = 0; i < this.alloySmelterItemStacks.length; ++i) {
         if (this.alloySmelterItemStacks[i] != null) {
            NBTTagCompound nbt1 = new NBTTagCompound();
            nbt1.setByte("Slot", (byte)i);
            this.alloySmelterItemStacks[i].writeToNBT(nbt1);
            nbttaglist.appendTag(nbt1);
         }
      }

      nbt.setTag("Items", nbttaglist);

      if (this.hasCustomInventoryName()) {
         nbt.setString("CustomName", this.customName);
      }
   }

   public int getInventoryStackLimit() {
      return 64;
   }

   @Override
   public boolean isUseableByPlayer(EntityPlayer player) {
      if (worldObj.getTileEntity(xCoord, yCoord, zCoord) != this) {
         return false;
      } else {
         return player.getDistanceSq((double)xCoord + 0.5D, (double)yCoord + 0.5D, (double)zCoord + 0.5D) <= 64;
      }
   }

   @Override
   public void openInventory(){}
   @Override
   public void closeInventory() {}

   @Override
   public boolean isItemValidForSlot(int i, ItemStack item) {
      return i == 2 ? false : (i == 1 ? hasItemPower(item) : true);
   }

   public boolean hasItemPower(ItemStack item) {
      return getItemPower(item) > 0;
   }

   //燃料の指定
   public static int getItemPower(ItemStack itemstack) {
      if (itemstack == null) {
         return 0;
      } else {
         Item item = itemstack.getItem();

         if (item instanceof ItemBlock && Block.getBlockFromItem(item) != Blocks.air) {
            Block block = Block.getBlockFromItem(item);

            if (block == Blocks.coal_block) {
               return 16000;
            }
         }

         if (item == Items.coal) return 1200;

         return 0;
      }
   }

   public boolean canInsertItem(int var1, ItemStack itemstack, int var3) {
      return this.isItemValidForSlot(var1, itemstack);
   }

   @Override
   public boolean canExtractItem(int i, ItemStack itemstack, int j) {
      return j != 0 || i != 1 || itemstack.getItem() == Items.bucket;
   }

   @Override
   public int[] getAccessibleSlotsFromSide(int i) {
      return i == 0 ? slotsBottom : (i == 1 ? slotsTop : slotsSides);
   }

   public int getSmelterProgressScaled(int i) {
      return (furnaceCookTime * i) / this.mashingSpeed;
   }

   public int getPowerReamingScaled(int i) {
      return (furnacePower * 1) / maxPower;
   }

   private boolean canSmelt() {

      if (this.alloySmelterItemStacks[0] == null || this.alloySmelterItemStacks[1] == null) {
         return false;
      }

      ItemStack itemstack = AlloySmelterRecipes.getSmeltingResult(this.alloySmelterItemStacks[0].getItem(), this.alloySmelterItemStacks[1].getItem());

      if (itemstack == null) {
         return false;
      }

      if (this.alloySmelterItemStacks[3] == null) {
         return true;
      }

      if (this.alloySmelterItemStacks[3].isItemEqual(itemstack)) {
         return false;
      }

      if (this.alloySmelterItemStacks[3].stackSize < getInventoryStackLimit() && this.alloySmelterItemStacks[3].stackSize < this.alloySmelterItemStacks[3].getMaxStackSize()) {
         return true;
      } else {
         return this.alloySmelterItemStacks[3].stackSize < itemstack.getMaxStackSize();
      }
   }

   private void smeltItem() {

      if (canSmelt()) {
         ItemStack itemstack = AlloySmelterRecipes.getSmeltingResult(this.alloySmelterItemStacks[0].getItem(), this.alloySmelterItemStacks[1].getItem());

         if (this.alloySmelterItemStacks[3] == null) {
            this.alloySmelterItemStacks[3] = itemstack.copy();
         } else if (this.alloySmelterItemStacks[3].isItemEqual(itemstack)) {
            this.alloySmelterItemStacks[3].stackSize += itemstack.stackSize;
         }

         for (int i = 0; i < 2; i++) {
            if (this.alloySmelterItemStacks[i].stackSize <= 0) {
               this.alloySmelterItemStacks[i] = new ItemStack(this.alloySmelterItemStacks[i].getItem().setFull3D());
            } else {
               this.alloySmelterItemStacks[i].stackSize--;
            }

            if (this.alloySmelterItemStacks[i].stackSize <= 0) {
               this.alloySmelterItemStacks[i] = null;
            }
         }
      }
   }

   public boolean hasPower() {
      return furnacePower > 0;
   }

   public boolean isMashing() {
      return this.furnaceCookTime > 0;
   }

   public void updateEntity() {
      boolean flag = this.hasPower();
      boolean flag1 = false;

      if (hasPower() && this.isMashing()) {
         this.furnacePower--;
      }

      if (!this.worldObj.isRemote) {
         if (this.hasItemPower(this.alloySmelterItemStacks[2]) && this.furnacePower < (this.maxPower - this.getItemPower(this.alloySmelterItemStacks[2]))) {
            this.furnacePower += getItemPower(this.alloySmelterItemStacks[2]);

            if (this.alloySmelterItemStacks[2] != null) {
               flag1 = true;

               this.alloySmelterItemStacks[2].stackSize--;

               if (this.alloySmelterItemStacks[2].stackSize == 0) {
                  this.alloySmelterItemStacks[2] = this.alloySmelterItemStacks[2].getItem().getContainerItem(this.alloySmelterItemStacks[2]);
               }
            }
         }

         if (hasPower() && canSmelt()) {
            furnaceCookTime++;

            if (this.furnaceCookTime == this.mashingSpeed) {
               this.furnaceCookTime = 0;
               this.smeltItem();
               flag1 = true;
            }
         } else {
            furnaceCookTime = 0;
         }

         if (flag != this.isMashing()) {
            flag1 = true;
            BlockAlloySmelter.updateAlloySmelterBlockState(this.isMashing(), this.worldObj, this.xCoord, this.yCoord, this.zCoord);
         }
      }

      if (flag1) {
         this.markDirty();
      }
   }
}


GuiAlloySmelter
コード: 全て選択
package destroy.platinum.gui;

import org.lwjgl.opengl.GL11;

import destroy.platinum.common.Reference;
import destroy.platinum.entity.TileEntityAlloySmelter;
import destroy.platinum.gui.container.ContainerAlloySmelter;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.resources.I18n;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.util.ResourceLocation;

public class GuiAlloySmelter extends GuiContainer {

   private static final ResourceLocation texture = new ResourceLocation(Reference.MOD_ID + ":" + "/textures/gui/guiAlloySmelter.png");
   private TileEntityAlloySmelter alloySmelter;

   public GuiAlloySmelter(InventoryPlayer invPlayer, TileEntityAlloySmelter tileentity) {
      super(new ContainerAlloySmelter(invPlayer, tileentity));
      this.alloySmelter = tileentity;

      this.xSize = 176;
      this.ySize = 166;
   }

   protected void drawGuiContainerForegroundLayer(int i, int j) {
      String name = this.alloySmelter.hasCustomInventoryName() ? this.alloySmelter.getInventoryName() : I18n.format(this.alloySmelter.getInventoryName(), new Object[0]);

      this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752);
      this.fontRendererObj.drawString(I18n.format("container.inventory", new Object[0]), 8, this.ySize - 96 + 2, 4210752);
   }

   @Override
   protected void drawGuiContainerBackgroundLayer(float f, int i, int j) {

      GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
      this.mc.getTextureManager().bindTexture(texture);
      /*int k = (this.width - this.xSize) /2;
      int l = (this.height - this.ySize) /2;*/
      this.drawTexturedModalRect(guiLeft, guiTop, 0, 0, this.xSize, this.ySize);

      //燃料ゲージの位置
      if (alloySmelter.hasPower()) {
         //更新後のゲージ幅
         int i1 = this.alloySmelter.getPowerReamingScaled(52);
         drawTexturedModalRect(guiLeft + 14, guiTop + 68 - i1, 176, 65 - i1, 13, i1);
      }

      //精錬ゲージの位置
      int j1 = alloySmelter.getSmelterProgressScaled(33);
      drawTexturedModalRect(guiLeft + 97, guiTop + 35, 176, 0, j1 + 1, 13);

   }
}


ContainerAlloySmelter
package destroy.platinum.gui.container;

import destroy.platinum.entity.TileEntityAlloySmelter;
import destroy.platinum.gui.slot.SlotAlloySmelter;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.ICrafting;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.FurnaceRecipes;
import net.minecraft.tileentity.TileEntityFurnace;

public class ContainerAlloySmelter extends Container {

private TileEntityAlloySmelter alloy;
private int furnaceCookTime;
private int furnacePower;
private int lastItemBurnTime;

public ContainerAlloySmelter(InventoryPlayer invPlayer, TileEntityAlloySmelter tileentity) {
furnaceCookTime = 0;
furnacePower = 0;
lastItemBurnTime = 0;

alloy = tileentity;

//スロットの位置
this.addSlotToContainer(new Slot(tileentity, 0, 51, 34));
this.addSlotToContainer(new Slot(tileentity, 1, 77, 34));
this.addSlotToContainer(new Slot(tileentity, 2, 23, 21));
this.addSlotToContainer(new SlotAlloySmelter(invPlayer.player, tileentity, 3, 134, 34));

//Inventory
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 9; j++) {
this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 84 + i * 18));
}
}

//ActionBar
for(int i = 0; i < 9; i++) {
this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 142));
}
}

public void addCraftingToCrafters (ICrafting crafting) {
super.addCraftingToCrafters(crafting);
crafting.sendProgressBarUpdate(this, 0, this.alloy.furnaceCookTime);
crafting.sendProgressBarUpdate(this, 1, this.alloy.furnacePower);
}

public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int par2)
{
ItemStack itemstack = null;
Slot slot = (Slot)this.inventorySlots.get(par2);

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

if (par2 == 2)
{
if (!this.mergeItemStack(itemstack1, 3, 39, true))
{
return null;
}

slot.onSlotChange(itemstack1, itemstack);
}
else if (par2 != 1 && par2 != 0)
{
if (FurnaceRecipes.smelting().getSmeltingResult(itemstack1) != null)
{
if (!this.mergeItemStack(itemstack1, 0, 1, false))
{
return null;
}
}
else if (TileEntityFurnace.isItemFuel(itemstack1))
{
if (!this.mergeItemStack(itemstack1, 1, 2, false))
{
return null;
}
}
else if (par2 >= 3 && par2 < 30)
{
if (!this.mergeItemStack(itemstack1, 30, 39, false))
{
return null;
}
}
else if (par2 >= 30 && par2 < 39 && !this.mergeItemStack(itemstack1, 3, 30, false))
{
return null;
}
}
else if (!this.mergeItemStack(itemstack1, 3, 39, false))
{
return null;
}

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

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

slot.onPickupFromSlot(par1EntityPlayer, itemstack1);
}

return itemstack;
}

@Override
public boolean canInteractWith(EntityPlayer player) {
return alloy.isUseableByPlayer(player);
}

public void detectAndSendChanges() {
super.detectAndSendChanges();

for (int i = 0; i < this.crafters.size(); i++) {
ICrafting k = (ICrafting)this.crafters.get(i);

if (this.furnaceCookTime != this.alloy.furnaceCookTime) {
k.sendProgressBarUpdate(this, 0, this.alloy.furnaceCookTime);
}

if (this.furnacePower != this.alloy.furnacePower) {
k.sendProgressBarUpdate(this, 1, this.alloy.furnacePower);
}
}

this.furnaceCookTime = this.alloy.furnaceCookTime;
this.furnacePower = this.alloy.furnacePower;
}

public void updateProgressBar(int i, int j){
if (i == 0) {
alloy.furnaceCookTime = j;
}

if (i == 1) {
alloy.furnacePower = j;
}
}
}
和風はお好き?
  • 1.7.10永住民です。1.8? 1.9? 1.10? 知らんな。
  • 趣味の範囲でModの開発を手がけています。過去VerのModのサルベージ希望とかを見かけたら規約に違反しない範囲で配布するかも。
  • テクスチャ書くの上手い人って羨ましいですよね。上手になりたい。
アバター
☭Destroy//Accuracy☭
ID:53c5c913
石掘り
 
記事: 78
登録日時: 2015年11月03日(火) 08:46
お住まい: 京の町

  • (PostNo.285847)

Re: [1.7.10]GUIを表示するブロックの追加に関しての質問

投稿記事by zyando123 » 2016年10月17日(月) 09:16

一つ目の問題はクライアント側の情報が更新されていないからだと思われます。
modding wikiの1.6のタイルエンティティのチュートリアルを参考にしてみて下さい。
それでも解決しない場合はこちらを見てみると解決するかもしれません
ろくな事を呟かないTwitterアカウント→@zyando79
アバター
zyando123
ID:a21f68a1
石掘り
 
記事: 88
登録日時: 2016年8月29日(月) 13:28

  • (PostNo.285867)

Re: [1.7.10]GUIを表示するブロックの追加に関しての質問

投稿記事by ☭Destroy//Accuracy☭ » 2016年10月17日(月) 17:46

クライアント側の情報の更新はどの場所のメゾットを使用すればいいのでしょうか。
和風はお好き?
  • 1.7.10永住民です。1.8? 1.9? 1.10? 知らんな。
  • 趣味の範囲でModの開発を手がけています。過去VerのModのサルベージ希望とかを見かけたら規約に違反しない範囲で配布するかも。
  • テクスチャ書くの上手い人って羨ましいですよね。上手になりたい。
アバター
☭Destroy//Accuracy☭
ID:53c5c913
石掘り
 
記事: 78
登録日時: 2015年11月03日(火) 08:46
お住まい: 京の町

  • (PostNo.285869)

Re: [1.7.10]GUIを表示するブロックの追加に関しての質問

投稿記事by zyando123 » 2016年10月17日(月) 18:26

TileEntityの情報などの操作はサーバー側でのみ行われているので、クライアント側は変化しません。

GUIなどはクライアント側の情報のみで表示するので、クライアント側の情報に適切なタイミングでサーバー側の情報を反映させなければいけません。

サーバー側の情報を反映させるためにはNBTとパケットの送受信が前提として必要です。
コードを見たところ、NBTの送受信はできている様なので以下のメソッドをTileEntityを継承したクラスに記述します。
そして、updateEntity()の適切なタイミングでmarkBlockForUpdateメソッドを呼ぶとクライアント側の情報の更新がされる...はずです。

コード: 全て選択
@Override
   public Packet getDescriptionPacket()
   {
      NBTTagCompound nbtTagCompound = new NBTTagCompound();
      this.writeToNBT(nbtTagCompound);
      return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 1, nbtTagCompound);
   }

   @Override
   public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt)
   {
      this.readFromNBT(pkt.func_148857_g());
   }
ろくな事を呟かないTwitterアカウント→@zyando79
アバター
zyando123
ID:93d451bf
石掘り
 
記事: 88
登録日時: 2016年8月29日(月) 13:28


Return to 質問:開発・制作関連

x