【1.7.10】GUIの作成にあたって

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

【1.7.10】GUIの作成にあたって

投稿記事by ShuperDark » 2018年1月01日(月) 20:11

こんにちは。
また少し困っていることが起きたので質問させていただきます。
今回初めてGUIの作成に手を染めてみまして、エラーは出なかったのですが、そのGUIを開こうとした途端、GUIは表示されずマイクラの動きが凄く重くなり、最終的にはマイクラが固まってしまいました(ショートカットを使って何とか強制終了させましたが・・・)
機能としては、そのアイテムで右クリックするとラージチェストのプレイヤーのインベントリ部分だけの(下の画像のような)GUIが表示される感じにしたいです。

画像

一体どこがおかしいのかどうかご教授願います(ソースコードは怪しそうなクラスのみ抜粋させて頂きます〔他の怪しそうなクラスが見たいという場合は遠慮なくどうぞ〕)

ItemGuiTest.java
コード: 全て選択
package com.test.mod.item;

import com.test.mod.TestMod;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;

public class ItemGuiTest extends Item{
   
   public ItemGuiTest() {
      super();
      setMaxStackSize(1);
      setTextureName("apple");
      setUnlocalizedName("gui_test");
      setCreativeTab(TestMod.tapTest);
   }
   
   @Override
   public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player)
    {
      if(!world.isRemote)
         player.openGui(TestMod.instnace, 0, world, (int)player.posX, (int)player.posY, (int)player.posZ);
      return stack;
    }

}



ContainerGuiTest.java
コード: 全て選択
package com.test.mod.gui;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.Slot;

public class ContainerGuiTest extends Container {
   
   public ContainerGuiTest(IInventory inv1) {
      
      int i, j;
      
      for(i = 0; i < 3; i++) {
         for(j = 0; i < 9; j++) {
            this.addSlotToContainer(new Slot(inv1, j+(i*9)+9, 8+(j*18), 140+(i*18)));
         }
      }
      
      for(j = 0; j < 9; j++) {
         this.addSlotToContainer(new Slot(inv1,  j, 8+(j*18), 198));
      }
   }
   
   @Override
   public boolean canInteractWith(EntityPlayer player){
      return true;
   }

}



GuiGuiTest.java
コード: 全て選択
package com.test.mod.gui;

import org.lwjgl.opengl.GL11;

import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.ResourceLocation;

public class GuiGuiTest extends GuiContainer {
   
   private static final ResourceLocation GUITEST_BACKGROUND = new ResourceLocation("testmod:textures/gui/container/generic_test.png");
   
   public GuiGuiTest(EntityPlayer player) {
      super(new ContainerGuiTest(player.inventory));
      this.ySize=222;
   }
   
   @Override
   protected void drawGuiContainerForegroundLayer(int par0, int par1) {
      this.fontRendererObj.drawString("Inventory", 8, ySize-94, 4210752);
   }
   
   @Override
   protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) {
      GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
      this.mc.getTextureManager().bindTexture(GUITEST_BACKGROUND);
      int k=(this.width-this.xSize)/2;
      int l=(this.height-this.ySize)/2;
      this.drawTexturedModalRect(k, l, 0, 0, this.xSize, this.ySize);
   }

}



GuiHandler.java
コード: 全て選択
package com.test.mod.gui;

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

public class GuiHandler implements IGuiHandler{
   
   @Override
   public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
      if(ID == 0) {
         return new ContainerGuiTest(player.inventory);
      }
      return null;
   }
   
   @Override
   public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
      if(ID==0){
         return new ContainerGuiTest(player.inventory);
      }
      return null;
   }

}



CommonProxy.java
コード: 全て選択
package com.test.mod.proxy;

import com.test.mod.TestMod;
import com.test.mod.gui.GuiHandler;

import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.network.NetworkRegistry;

public class CommonProxy{
   
   public void init(FMLInitializationEvent e) {
      NetworkRegistry.INSTANCE.registerGuiHandler(TestMod.instnace, new GuiHandler());
   }
   
}


ClientProxy.java
コード: 全て選択
package com.test.mod.proxy;

import cpw.mods.fml.common.event.FMLInitializationEvent;

public class ClientProxy extends CommonProxy {
   
   @Override
   public void init(FMLInitializationEvent e) {
      super.init(e);
   }

}



TestMod.java
コード: 全て選択
package com.test.mod;

//略

@Mod(modid = TestMod.MODID)
public class TestMod
{
    public static final String MODID = "testmod";
   
    @Instance(MODID)
    public static TestMod instnace;
   
    @SidedProxy(clientSide = "com.test.mod.proxy.ClientProxy", serverSide = "com.test.mod.proxy.CommonProxy")
    public static CommonProxy proxy;

//略

 public static Item guiTest;

//略

 @Mod.EventHandler
    public void preInit(FMLPreInitializationEvent event) {

//略

guiTest = new ItemGuiTest();
       GameRegistry.registerItem(guiTest, "guiTest");

//略

}

 @Mod.EventHandler
    public void init(FMLInitializationEvent event)
    {

//略

proxy.init(event);

//略

}

//略


開発環境は1.7.10です
アバター
ShuperDark
ID:85d166a0
大工さん
 
記事: 47
登録日時: 2017年4月15日(土) 20:35

  • (PostNo.312137)

Re: 【1.7.10】GUIの作成にあたって

投稿記事by elise_blacklab » 2018年1月01日(月) 22:23

コード: 全て選択
   @Override
   public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
      if(ID==0){
         return new ContainerGuiTest(player.inventory);
      }
      return null;
   }

Handlerのここ,ClientにはGuiの方を返してあげないといけません
ただし,そのまま返そうとするとServer側にGui関連のクラスは読み込まれないのでマルチプレイで動作しないというトラブルに見舞われることになります
通常はproxyを噛ませて間接的にGuiクラスを返します
メイドつくってたりします.http://6docvc.net/
アバター
elise_blacklab
ID:0f87040f
掘り廃人
 
記事: 2553
登録日時: 2014年6月25日(水) 18:30

  • (PostNo.312154)

Re: 【1.7.10】GUIの作成にあたって

投稿記事by ShuperDark » 2018年1月02日(火) 14:01

elise_blacklab さんが書きました:
コード: 全て選択
   @Override
   public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
      if(ID==0){
         return new ContainerGuiTest(player.inventory);
      }
      return null;
   }

Handlerのここ,ClientにはGuiの方を返してあげないといけません
ただし,そのまま返そうとするとServer側にGui関連のクラスは読み込まれないのでマルチプレイで動作しないというトラブルに見舞われることになります
通常はproxyを噛ませて間接的にGuiクラスを返します


おっ!ついに念願のGUIを果たせました!
本当にありがとうございました!

画像
アバター
ShuperDark
ID:85d166a0
大工さん
 
記事: 47
登録日時: 2017年4月15日(土) 20:35


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

x