-
-
Notifications
You must be signed in to change notification settings - Fork 177
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
4 changed files
with
175 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
89 changes: 89 additions & 0 deletions
89
src/main/java/net/neoforged/neoforge/items/wrapper/ItemEntityWrapper.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
/* | ||
* Copyright (c) Forge Development LLC and contributors SPDX-License-Identifier: LGPL-2.1-only | ||
*/ | ||
package net.neoforged.neoforge.items.wrapper; | ||
|
||
import net.minecraft.world.entity.item.ItemEntity; | ||
import net.minecraft.world.item.ItemStack; | ||
import net.neoforged.neoforge.items.IItemHandlerModifiable; | ||
|
||
public class ItemEntityWrapper implements IItemHandlerModifiable { | ||
protected final ItemEntity itemEntity; | ||
|
||
public ItemEntityWrapper(ItemEntity itemEntity) { | ||
this.itemEntity = itemEntity; | ||
} | ||
|
||
@Override | ||
public int getSlots() { | ||
return 1; | ||
} | ||
|
||
@Override | ||
public ItemStack getStackInSlot(int slot) { | ||
validateSlotIndex(slot); | ||
return itemEntity.getItem(); | ||
} | ||
|
||
@Override | ||
public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { | ||
validateSlotIndex(slot); | ||
ItemStack stackInSlot = itemEntity.getItem(); | ||
if (!ItemEntity.areMergable(stackInSlot, stack)) { | ||
return stack; | ||
} | ||
|
||
int insertableCount = Math.min(stackInSlot.getMaxStackSize() - stackInSlot.getCount(), stack.getCount()); | ||
if (!simulate) { | ||
stackInSlot.grow(insertableCount); | ||
itemEntity.setItem(stackInSlot); | ||
} | ||
return stack.getCount() == insertableCount ? ItemStack.EMPTY : stack.copyWithCount(stack.getCount() - insertableCount); | ||
} | ||
|
||
@Override | ||
public ItemStack extractItem(int slot, int amount, boolean simulate) { | ||
if (amount == 0) return ItemStack.EMPTY; | ||
|
||
validateSlotIndex(slot); | ||
ItemStack stackInSlot = itemEntity.getItem(); | ||
|
||
if (stackInSlot.isEmpty()) return ItemStack.EMPTY; | ||
|
||
if (stackInSlot.getCount() < amount) { | ||
if (!simulate) { | ||
itemEntity.setItem(ItemStack.EMPTY); | ||
itemEntity.discard(); | ||
} | ||
return stackInSlot.copy(); | ||
} else { | ||
if (simulate) | ||
|
||
return stackInSlot.copyWithCount(amount); | ||
|
||
ItemStack extracted = stackInSlot.split(amount); | ||
itemEntity.setItem(stackInSlot); | ||
return extracted; | ||
} | ||
} | ||
|
||
@Override | ||
public int getSlotLimit(int slot) { | ||
return itemEntity.getItem().getMaxStackSize(); | ||
} | ||
|
||
@Override | ||
public boolean isItemValid(int slot, ItemStack stack) { | ||
return true; | ||
} | ||
|
||
@Override | ||
public void setStackInSlot(int slot, ItemStack stack) { | ||
validateSlotIndex(slot); | ||
itemEntity.setItem(stack); | ||
} | ||
|
||
private void validateSlotIndex(int slot) { | ||
if (slot != 0) throw new IllegalArgumentException("Only slot 0 is present - requested: " + slot); | ||
} | ||
} |
75 changes: 75 additions & 0 deletions
75
src/main/java/net/neoforged/neoforge/items/wrapper/ItemFrameWrapper.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
/* | ||
* Copyright (c) Forge Development LLC and contributors SPDX-License-Identifier: LGPL-2.1-only | ||
*/ | ||
package net.neoforged.neoforge.items.wrapper; | ||
|
||
import net.minecraft.world.entity.decoration.ItemFrame; | ||
import net.minecraft.world.item.ItemStack; | ||
import net.neoforged.neoforge.items.IItemHandlerModifiable; | ||
|
||
public class ItemFrameWrapper implements IItemHandlerModifiable { | ||
protected final ItemFrame itemFrame; | ||
|
||
public ItemFrameWrapper(ItemFrame itemFrame) { | ||
this.itemFrame = itemFrame; | ||
} | ||
|
||
@Override | ||
public int getSlots() { | ||
return 1; | ||
} | ||
|
||
@Override | ||
public ItemStack getStackInSlot(int slot) { | ||
validateSlotIndex(slot); | ||
return itemFrame.getItem(); | ||
} | ||
|
||
@Override | ||
public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { | ||
validateSlotIndex(slot); | ||
if (itemFrame.getItem().isEmpty() && !simulate) { | ||
itemFrame.setItem(stack); | ||
return stack.getCount() == 1 ? ItemStack.EMPTY : stack.copyWithCount(stack.getCount() - 1); | ||
} | ||
// itemFrame has stack of size 1, so nothing to insert | ||
return stack; | ||
} | ||
|
||
@Override | ||
public ItemStack extractItem(int slot, int amount, boolean simulate) { | ||
if (amount == 0) return ItemStack.EMPTY; | ||
|
||
validateSlotIndex(slot); | ||
ItemStack stackInSlot = itemFrame.getItem(); | ||
|
||
if (stackInSlot.isEmpty()) return ItemStack.EMPTY; | ||
|
||
if (simulate) { | ||
return stackInSlot.copy(); | ||
} else { | ||
itemFrame.setItem(ItemStack.EMPTY); | ||
return stackInSlot; | ||
} | ||
} | ||
|
||
@Override | ||
public int getSlotLimit(int slot) { | ||
return 1; | ||
} | ||
|
||
@Override | ||
public boolean isItemValid(int slot, ItemStack stack) { | ||
return true; | ||
} | ||
|
||
@Override | ||
public void setStackInSlot(int slot, ItemStack stack) { | ||
validateSlotIndex(slot); | ||
itemFrame.setItem(stack); | ||
} | ||
|
||
private void validateSlotIndex(int slot) { | ||
if (slot != 0) throw new IllegalArgumentException("Only slot 0 is present - requested: " + slot); | ||
} | ||
} |