2016-07-25 3 views
2

私はMinecraft Forgeを使用して新しいタイルエンティティを作成しました。
81スロット(9行9列)のシンプルな胸部です。
基本的には、x座標とy座標を作成する必要があります。
iの間隔ごとに、x coordにSLOT_X_SPACINGを追加しますが、9回後には0にリセットされます。
私は9間隔ごとに、私は18をSLOT_Y_SPACINGに加える必要があります。
これらのForループをただ1つのループに並べ替えることはできますか?
(私はループのために十分な情報ではありませんので、私の全体のコンテナクラスが必要だと感じた)
Minecraft GUIコンテナにシステムにスロットを追加する方法

public class ModDrawerContainer extends Container { 

    private ModTileEntityDrawer tileEntityInventoryBasic; 

    private final int HOTBAR_SLOT_COUNT = 9; 
    private final int PLAYER_INVENTORY_ROW_COUNT = 3; 
    private final int PLAYER_INVENTORY_COLUMN_COUNT = 9; 
    private final int PLAYER_INVENTORY_SLOT_COUNT = PLAYER_INVENTORY_COLUMN_COUNT * PLAYER_INVENTORY_ROW_COUNT; 
    private final int VANILLA_SLOT_COUNT = HOTBAR_SLOT_COUNT + PLAYER_INVENTORY_SLOT_COUNT; 

    private final int VANILLA_FIRST_SLOT_INDEX = 0; 
    private final int TE_INVENTORY_FIRST_SLOT_INDEX = VANILLA_FIRST_SLOT_INDEX + VANILLA_SLOT_COUNT; 
    private final int TE_INVENTORY_SLOT_COUNT = 81; 



    public ModDrawerContainer(InventoryPlayer invPlayer, ModTileEntityDrawer tileEntityInventoryBasic) { 
     this.tileEntityInventoryBasic = tileEntityInventoryBasic; 

     final int SLOT_X_SPACING = 18; 
     final int SLOT_Y_SPACING = 18; 

     final int HOTBAR_XPOS = 12; 
     final int HOTBAR_YPOS = 232; 

     for (int x = 0; x < HOTBAR_SLOT_COUNT; x++) { 
      int slotNumber = x; 
      addSlotToContainer(new Slot(invPlayer, slotNumber, HOTBAR_XPOS + SLOT_X_SPACING * x, HOTBAR_YPOS)); 
     } 

     final int PLAYER_INVENTORY_XPOS = 12; 
     final int PLAYER_INVENTORY_YPOS = 174; 

     for (int y = 0; y < PLAYER_INVENTORY_ROW_COUNT; y++) { 
      for (int x = 0; x < PLAYER_INVENTORY_COLUMN_COUNT; x++) { 
       int slotNumber = HOTBAR_SLOT_COUNT + y * PLAYER_INVENTORY_COLUMN_COUNT + x; 
       int xpos = PLAYER_INVENTORY_XPOS + x * SLOT_X_SPACING; 
       int ypos = PLAYER_INVENTORY_YPOS + y * SLOT_Y_SPACING; 
       addSlotToContainer(new Slot(invPlayer, slotNumber, xpos, ypos)); 
      } 
     } 

     if (TE_INVENTORY_SLOT_COUNT != tileEntityInventoryBasic.getSizeInventory()) { 
      System.err.println("Mismatched slot count in ContainerBasic(" + TE_INVENTORY_SLOT_COUNT 
                + ") and TileInventory (" + tileEntityInventoryBasic.getSizeInventory()+")"); 
     } 

     final int TILE_INVENTORY_XPOS = 12; 
     int TILE_INVENTORY_YPOS = 8; 

     for (int i = 0; i < 9; i++) { 
      int slotNumber = i; 
      addSlotToContainer(new Slot(tileEntityInventoryBasic, slotNumber, TILE_INVENTORY_XPOS + SLOT_X_SPACING * i, TILE_INVENTORY_YPOS)); 
     } 
     TILE_INVENTORY_YPOS = 8 + 18 *1; 
     for (int i = 9; i < 18; i++) { 
      int slotNumber = i; 
      addSlotToContainer(new Slot(tileEntityInventoryBasic, slotNumber, TILE_INVENTORY_XPOS + SLOT_X_SPACING * (i-9), TILE_INVENTORY_YPOS)); 
     } 
     TILE_INVENTORY_YPOS = 8 + 18 *2; 
     for (int i = 18; i < 27; i++) { 
      int slotNumber = i; 
      addSlotToContainer(new Slot(tileEntityInventoryBasic, slotNumber, TILE_INVENTORY_XPOS + SLOT_X_SPACING * (i-18), TILE_INVENTORY_YPOS)); 
     } 
     TILE_INVENTORY_YPOS = 8 + 18 *3; 
     for (int i = 27; i < 36; i++) { 
      int slotNumber = i; 
      addSlotToContainer(new Slot(tileEntityInventoryBasic, slotNumber, TILE_INVENTORY_XPOS + SLOT_X_SPACING * (i-27), TILE_INVENTORY_YPOS)); 
     } 
     TILE_INVENTORY_YPOS = 8 + 18 *4; 
     for (int i = 36; i < 45; i++) { 
      int slotNumber = i; 
      addSlotToContainer(new Slot(tileEntityInventoryBasic, slotNumber, TILE_INVENTORY_XPOS + SLOT_X_SPACING * (i-36), TILE_INVENTORY_YPOS)); 
     } 
     TILE_INVENTORY_YPOS = 8 + 18 *5; 
     for (int i = 45; i < 54; i++) { 
      int slotNumber = i; 
      addSlotToContainer(new Slot(tileEntityInventoryBasic, slotNumber, TILE_INVENTORY_XPOS + SLOT_X_SPACING * (i-45), TILE_INVENTORY_YPOS)); 
     } 
     TILE_INVENTORY_YPOS = 8 + 18 *6; 
     for (int i = 54; i < 63; i++) { 
      int slotNumber = i; 
      addSlotToContainer(new Slot(tileEntityInventoryBasic, slotNumber, TILE_INVENTORY_XPOS + SLOT_X_SPACING * (i-54), TILE_INVENTORY_YPOS)); 
     } 
     TILE_INVENTORY_YPOS = 8 + 18 *7; 
     for (int i =63; i < 72; i++) { 
      int slotNumber = i; 
      addSlotToContainer(new Slot(tileEntityInventoryBasic, slotNumber, TILE_INVENTORY_XPOS + SLOT_X_SPACING * (i-63), TILE_INVENTORY_YPOS)); 
     } 
     TILE_INVENTORY_YPOS = 8 + 18 *8; 
     for (int i = 73; i < 81; i++) { 
      int slotNumber = i; 
      addSlotToContainer(new Slot(tileEntityInventoryBasic, slotNumber, TILE_INVENTORY_XPOS + SLOT_X_SPACING * (i-72), TILE_INVENTORY_YPOS)); 
     } 
    } 

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

    @Override 
    public ItemStack transferStackInSlot(EntityPlayer player, int sourceSlotIndex) 
    { 
     Slot sourceSlot = (Slot)inventorySlots.get(sourceSlotIndex); 
     if (sourceSlot == null || !sourceSlot.getHasStack()) return null; 
     ItemStack sourceStack = sourceSlot.getStack(); 
     ItemStack copyOfSourceStack = sourceStack.copy(); 

     if (sourceSlotIndex >= VANILLA_FIRST_SLOT_INDEX && sourceSlotIndex < VANILLA_FIRST_SLOT_INDEX + VANILLA_SLOT_COUNT) { 
      if (!mergeItemStack(sourceStack, TE_INVENTORY_FIRST_SLOT_INDEX, TE_INVENTORY_FIRST_SLOT_INDEX + TE_INVENTORY_SLOT_COUNT, false)){ 
       return null; 
      } 
     } else if (sourceSlotIndex >= TE_INVENTORY_FIRST_SLOT_INDEX && sourceSlotIndex < TE_INVENTORY_FIRST_SLOT_INDEX + TE_INVENTORY_SLOT_COUNT) { 
      if (!mergeItemStack(sourceStack, VANILLA_FIRST_SLOT_INDEX, VANILLA_FIRST_SLOT_INDEX + VANILLA_SLOT_COUNT, false)) { 
       return null; 
      } 
     } else { 
      System.err.print("Invalid slotIndex:" + sourceSlotIndex); 
      return null; 
     } 
     if (sourceStack.stackSize == 0) { 
      sourceSlot.putStack(null); 
     } else { 
      sourceSlot.onSlotChanged(); 
     } 

     sourceSlot.onPickupFromSlot(player, sourceStack); 
     return copyOfSourceStack; 
    } 

    @Override 
    public void onContainerClosed(EntityPlayer playerIn) 
    { 
     super.onContainerClosed(playerIn); 
     this.tileEntityInventoryBasic.closeInventory(playerIn); 
    } 
} 

ここで起こっていただきました!あなたが視覚化できるように、インベントリの写真です: DrawerGUI.png

答えて

2

水平位置について、あなたがやりたいであろう、9で割った余りを取得するためにモジュロ演算子%)を使用することができます。 i % 9は常に0から8の値を返します。そのためにはTILE_INVENTORY_XPOS + SLOT_X_SPACING * (i % 9)を使用します。

垂直位置の場合、単純に除算を使用して行を取得することができます。i/9は現在の行になります。したがって、そのポジションを得るには8 + 18 * (i/9)を使用します。

final int TILE_INVENTORY_XPOS = 12; 
final int TILE_INVENTORY_YPOS = 8; 

for (int slotNumber = 0; slotNumber < TE_INVENTORY_SLOT_COUNT; slotNumber++) { 
    addSlotToContainer(new Slot(tileEntityInventoryBasic, slotNumber, 
       TILE_INVENTORY_XPOS + SLOT_X_SPACING * (i % 9), 
       TILE_INVENTORY_YPOS + SLOT_Y_SPACING * (i/9))); 
} 

一緒にそれらの両方を置くむしろiよりループ内slotNumberを用いて、この生成します

関連する問題