アイテムのインベントリを別のインベントリに移す方法を教えてください

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

アイテムのインベントリを別のインベントリに移す方法を教えてください

投稿記事by ゲストさん » 2018年8月13日(月) 16:08

質問です。
Minecraftは1.7.10、Forgeは10.13.4.1558です。
modding tutorial wikiを参考に、インベントリを持つアイテムを作りました。
そして今は、そのアイテムを持ってインベントリのあるブロック(チェストやホッパー)を右クリックすると、そのアイテムのインベントリの中にあるアイテムすべてを右クリックしたブロックのインベントリに移し、
もしブロックの方にアイテムがあり、そのアイテムのインベントリ内が空の状態なら、ブロックからアイテムに、インベントリ内のアイテムを移すという機能を作りたいです。
しかし、方法がよくわからないです。
現状こんな感じで、まだ全然できてません。
public boolean onItemUse(ItemStack itemstack, EntityPlayer entityplayer, World world, int x, int y, int z, int side){
if(!world.isRemote){
TileEntity tile = world.getTileEntity(x, y, z);
if(tile != null && tile instanceof IInventory){
}
}
}
else
{
onItemRightClick(itemstack, world, entityplayer);
}
}
return true;
}


一応、作ったインベントリのあるアイテムのプログラムで、使いそうなものを載せておきます。
InventoryHandy_Chest.java:
public class InventoryHandy_Chest implements IInventory
{
private InventoryPlayer inventoryPlayer;
private ItemStack currentItem;
public static ItemStack[] items;

public InventoryHandy_Chest(InventoryPlayer inventory)
{
inventoryPlayer = inventory;
currentItem = inventoryPlayer.getCurrentItem();

//InventorySize
items = new ItemStack[54];
}

@Override
public int getSizeInventory()
{
return items.length;
}

@Override
public ItemStack getStackInSlot(int slot)
{
return items[slot];
}

@Override
public ItemStack decrStackSize(int p_70298_1_, int p_70298_2_)
{
if (this.items[p_70298_1_] != null)
{
ItemStack itemstack;

if (this.items[p_70298_1_].stackSize <= p_70298_2_)
{
itemstack = this.items[p_70298_1_];
this.items[p_70298_1_] = null;
this.markDirty();
return itemstack;
}
else
{
itemstack = this.items[p_70298_1_].splitStack(p_70298_2_);

if (this.items[p_70298_1_].stackSize == 0)
{
this.items[p_70298_1_] = null;
}

this.markDirty();
return itemstack;
}
}
return null;
}

@Override
public ItemStack getStackInSlotOnClosing(int p_70304_1_)
{
if (this.items[p_70304_1_] != null)
{
ItemStack itemstack = this.items[p_70304_1_];
this.items[p_70304_1_] = null;
return itemstack;
}
return null;
}

@Override
public void setInventorySlotContents(int p_70299_1_, ItemStack p_70299_2_)
{
this.items[p_70299_1_] = p_70299_2_;

if (p_70299_2_ != null && p_70299_2_.stackSize > this.getInventoryStackLimit())
{
p_70299_2_.stackSize = this.getInventoryStackLimit();
}

this.markDirty();
}

@Override
public String getInventoryName() {
return "container.OgaMod.HandyChest";
}

@Override
public boolean hasCustomInventoryName()
{
return false;
}

@Override
public int getInventoryStackLimit()
{
return 64;
}

@Override
public void markDirty() {}

@Override
public boolean isUseableByPlayer(EntityPlayer p_70300_1_)
{
return true;
}

/*
Containerが開かれたタイミングでItemStackの持っているNBTからアイテムを読み込んでいる
*/
@Override
public void openInventory()
{
if(!currentItem.hasTagCompound())
{
currentItem.setTagCompound(new NBTTagCompound());
currentItem.getTagCompound().setTag("Items", new NBTTagList());
}
NBTTagList tags = (NBTTagList)currentItem.getTagCompound().getTag("Items");

for(int i = 0; i < tags.tagCount(); i++)
{
NBTTagCompound tagCompound = tags.getCompoundTagAt(i);
int slot = tagCompound.getByte("Slot");
if(slot >= 0 && slot < items.length)
{
items[slot] = ItemStack.loadItemStackFromNBT(tagCompound);
}
}
}

/*
Containerを閉じるときに保存
*/
@Override
public void closeInventory()
{
NBTTagList tagList = new NBTTagList();
for(int i = 0; i < items.length; i++)
{
if(items[i] != null)
{
NBTTagCompound compound = new NBTTagCompound();
compound.setByte("Slot", (byte)i);
items[i].writeToNBT(compound);
tagList.appendTag(compound);
}
}
ItemStack result = new ItemStack(currentItem.getItem(),1,currentItem.getItemDamage());
result.setTagCompound(new NBTTagCompound());
result.getTagCompound().setTag("Items", tagList);

//ItemStackをセットする。NBTは右クリック等のタイミングでしか保存されないため再セットで保存している。
inventoryPlayer.mainInventory[inventoryPlayer.currentItem] = result;
}

@Override
public boolean isItemValidForSlot(int p_94041_1_, ItemStack p_94041_2_)
{
return true;
}



ContainerHandy_chest.java:
public InventoryHandy_Chest inventory;
public ContainerHandy_chest(InventoryPlayer inventoryPlayer)
{
inventory = new InventoryHandy_Chest(inventoryPlayer);
inventory.openInventory();

int i = 2 * 18 + 1;

for (int j = 0; j < 6; ++j)
{
for (int k = 0; k < 9; ++k)
{
this.addSlotToContainer(new Slot(inventory, k + j * 9, 8 + k * 18, 18 + j * 18));
}
}

for (int j = 0; j < 3; ++j)
{
for (int k = 0; k < 9; ++k)
{
this.addSlotToContainer(new SlotHandy_chest(inventoryPlayer, k + j * 9 + 9, 8 + k * 18, 103 + j * 18 + i));
}
}

for (int j = 0; j < 9; ++j)
{
this.addSlotToContainer(new SlotHandy_chest(inventoryPlayer, j, 8 + j * 18, 161 + i));
}

}

/*
Containerが開いてられるか
*/
@Override
public boolean canInteractWith(EntityPlayer p_75145_1_)
{
return true;
}

@Override
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_ < this.inventory.getSizeInventory())
{
if (!this.mergeItemStack(itemstack1, this.inventory.getSizeInventory(), this.inventorySlots.size(), true))
{
return null;
}
}
//シフトクリック時に、このアイテムだったら動かさない。
else if(slot.getStack() != null && slot.getStack().getItem() == OgamodItems.ToolHandy_chest)
{
return null;
}
else if (!this.mergeItemStack(itemstack1, 0, this.inventory.getSizeInventory(), false))
{
return null;
}
if (itemstack1.stackSize == 0)
{
slot.putStack((ItemStack)null);
}
else
{
slot.onSlotChanged();
}
}

return itemstack;
}

/*
Containerを閉じるときに呼ばれる
*/
@Override
public void onContainerClosed(EntityPlayer p_75134_1_)
{
super.onContainerClosed(p_75134_1_);
this.inventory.closeInventory();

}
ゲストさん
ID:cfe2af9b
 

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

x