Follow along with the video below to see how to install our site as a web app on your home screen.
Примечание: This feature may not be available in some browsers.
@SubscribeEvent
public void onPlayerDeath(LivingDeathEvent event) {
if(event.getEntity() instanceof EntityPlayer) {
//Доставай тут вещи со слотов
//Выкидывай их на землю
//Удаляй с инвентаря
}
}
public class AddedSlot extends Slot
{
/** The index of the slot in the inventory. */
private final int slotIndex;
/** The inventory we want to extract a slot from. */
public final IInventory inventory;
/** the id of the slot(also the index in the inventory arraylist) */
public int slotNumber;
/** display position of the inventory slot on the screen x axis */
public int xPos;
/** display position of the inventory slot on the screen y axis */
public int yPos;
public AddedSlot(EntityPlayer player, IInventory inventoryIn, int index, int xPosition, int yPosition) {
super(inventoryIn, index, xPosition, yPosition);
{
this.inventory = inventoryIn;
this.slotIndex = index;
this.xPos = xPosition;
this.yPos = yPosition;
}
}
/**
* if par2 has more items than par1, onCrafting(item,countIncrease) is called
*/
public void onSlotChange(ItemStack p_75220_1_, ItemStack p_75220_2_)
{
int i = p_75220_2_.getCount() - p_75220_1_.getCount();
if (i > 0)
{
this.onCrafting(p_75220_2_, i);
}
}
/**
* the itemStack passed in is the output - ie, iron ingots, and pickaxes, not ore and wood. Typically increases an
* internal count then calls onCrafting(item).
*/
protected void onCrafting(ItemStack stack, int amount)
{
}
protected void onSwapCraft(int p_190900_1_)
{
}
/**
* the itemStack passed in is the output - ie, iron ingots, and pickaxes, not ore and wood.
*/
protected void onCrafting(ItemStack stack)
{
}
public ItemStack onTake(EntityPlayer thePlayer, ItemStack stack)
{
this.onSlotChanged();
return stack;
}
/**
* Check if the stack is allowed to be placed in this slot, used for armor slots as well as furnace fuel.
*/
public boolean isItemValid(ItemStack stack)
{
return true;
}
/**
* Helper fnct to get the stack in the slot.
*/
public ItemStack getStack()
{
return this.inventory.getStackInSlot(this.slotIndex);
}
/**
* Returns if this slot contains a stack.
*/
public boolean getHasStack()
{
return !this.getStack().isEmpty();
}
/**
* Helper method to put a stack in the slot.
*/
public void putStack(ItemStack stack)
{
this.inventory.setInventorySlotContents(this.slotIndex, stack);
this.onSlotChanged();
}
/**
* Called when the stack in a Slot changes
*/
public void onSlotChanged()
{
this.inventory.markDirty();
}
/**
* Returns the maximum stack size for a given slot (usually the same as getInventoryStackLimit(), but 1 in the case
* of armor slots)
*/
public int getSlotStackLimit()
{
return this.inventory.getInventoryStackLimit();
}
public int getItemStackLimit(ItemStack stack)
{
return this.getSlotStackLimit();
}
@Nullable
@SideOnly(Side.CLIENT)
public String getSlotTexture()
{
return backgroundName;
}
/**
* Decrease the size of the stack in slot (first int arg) by the amount of the second int arg. Returns the new
* stack.
*/
public ItemStack decrStackSize(int amount)
{
return this.inventory.decrStackSize(this.slotIndex, amount);
}
/**
* returns true if the slot exists in the given inventory and location
*/
public boolean isHere(IInventory inv, int slotIn)
{
return inv == this.inventory && slotIn == this.slotIndex;
}
/**
* Return whether this slot's stack can be taken from this slot.
*/
public boolean canTakeStack(EntityPlayer playerIn)
{
return true;
}
/**
* Actualy only call when we want to render the white square effect over the slots. Return always True, except for
* the armor slot of the Donkey/Mule (we can't interact with the Undead and Skeleton horses)
*/
@SideOnly(Side.CLIENT)
public boolean isEnabled()
{
return true;
}
/[I]========================================= FORGE START =====================================[/I]/
protected String backgroundName = null;
protected net.minecraft.util.ResourceLocation backgroundLocation = null;
protected Object backgroundMap;
/**
* Gets the path of the texture file to use for the background image of this slot when drawing the GUI.
* @return The resource location for the background image
*/
@SideOnly(Side.CLIENT)
public net.minecraft.util.ResourceLocation getBackgroundLocation()
{
return (backgroundLocation == null ? net.minecraft.client.renderer.texture.TextureMap.LOCATION_BLOCKS_TEXTURE : backgroundLocation);
}
/**
* Sets the texture file to use for the background image of the slot when it's empty.
* @param texture the resourcelocation for the texture
*/
@SideOnly(Side.CLIENT)
public void setBackgroundLocation(net.minecraft.util.ResourceLocation texture)
{
this.backgroundLocation = texture;
}
/**
* Sets which icon index to use as the background image of the slot when it's empty.
* @param name The icon to use, null for none
*/
public void setBackgroundName(@Nullable String name)
{
this.backgroundName = name;
}
@Nullable
@SideOnly(Side.CLIENT)
public net.minecraft.client.renderer.texture.TextureAtlasSprite getBackgroundSprite()
{
String name = getSlotTexture();
return name == null ? null : getBackgroundMap().getAtlasSprite(name);
}
@SideOnly(Side.CLIENT)
protected net.minecraft.client.renderer.texture.TextureMap getBackgroundMap()
{
if (backgroundMap == null) backgroundMap = net.minecraft.client.Minecraft.getMinecraft().getTextureMapBlocks();
return (net.minecraft.client.renderer.texture.TextureMap)backgroundMap;
}
/**
* Retrieves the index in the inventory for this slot, this value should typically not
* be used, but can be useful for some occasions.
*
* @return Index in associated inventory for this slot.
*/
public int getSlotIndex()
{
return slotIndex;
}
/**
* Checks if the other slot is in the same inventory, by comparing the inventory reference.
* @param other
* @return true if the other slot is in the same inventory
*/
public boolean isSameInventory(Slot other)
{
return this.inventory == other.inventory;
}
/[I]========================================= FORGE END =====================================[/I]/
}
@SubscribeEvent
public void onPlayerDeath(LivingDeathEvent event) {
if(event.getEntity() instanceof EntityPlayer) {
//Доставай тут вещи со слотов
//Выкидывай их на землю
//Удаляй с инвентаря
}
}
player.drop(args) есть же такой метод, вот с него и дропайВещи и так удаляются из слотов, но не выпадают.
@SubscribeEvent
public void onPlayerDeath(LivingDeathEvent event) {
if(event.getEntity() instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer)event.getEntity();
ICAPCustomInventory cap = player.getCapability(CAPCustomInventoryProvider.INVENTORY_CAP, null);
CustomInventory inv = cap.getInventory();
dropAllItems(player, inv);
inv.clear();
}
}
private static void dropAllItems(EntityPlayer player, CustomInventory inventory){
NonNullList<ItemStack> itemstack = inventory.getStacks();
for (int i = 0; i < itemstack.size(); ++i) {
if (!itemstack.get(i).isEmpty()) {
player.dropItem(itemstack.get(i), true, false);
}
}
}
public class CustomInventory implements IInventory {
public static final int INV_SIZE = 73;
private NonNullList<ItemStack>inventory = NonNullList.<ItemStack>withSize(INV_SIZE, ItemStack.EMPTY);
public CustomInventory() {}
@Override
public String getName() {
return "Inventory";
}
@Override
public boolean hasCustomName() {
return true;
}
@Override
public ITextComponent getDisplayName() {
return (ITextComponent)(this.hasCustomName() ? new TextComponentString(this.getName()) : new TextComponentTranslation(this.getName(), new Object[0]));
}
@Override
public int getSizeInventory() {
return inventory.size();
}
@Override
public ItemStack getStackInSlot(int index) {
return index >= 0 && index < this.inventory.size() ? (ItemStack)this.inventory.get(index) : ItemStack.EMPTY;
}
public NonNullList<ItemStack> getStacks(){
return this.inventory;
}
@Override
public ItemStack decrStackSize(int index, int count) {
ItemStack itemstack = ItemStackHelper.getAndSplit(this.inventory, index, count);
if (!itemstack.isEmpty()) {
this.markDirty();
}
return itemstack;
}
@Override
public ItemStack removeStackFromSlot(int index) {
if (!this.inventory.get(index).isEmpty()) {
ItemStack itemstack = this.inventory.get(index);
this.inventory.set(index, ItemStack.EMPTY);
return itemstack;
}else {
return ItemStack.EMPTY;
}
}
@Override
public void setInventorySlotContents(int index, ItemStack stack) {
this.inventory.set(index, stack);
if (!stack.isEmpty() && stack.getCount() > this.getInventoryStackLimit()) {
stack.setCount(this.getInventoryStackLimit());
}
this.markDirty();
}
@Override
public boolean isEmpty() {
for (ItemStack itemstack : this.inventory) {
if (!itemstack.isEmpty()) {
return false;
}
}
return true;
}
@Override
public int getInventoryStackLimit() {
return 64;
}
@Override
public void markDirty() { }
@Override
public boolean isUsableByPlayer(EntityPlayer player) {
return true;
}
@Override
public void openInventory(EntityPlayer player) {}
@Override
public void closeInventory(EntityPlayer player) {}
@Override
public boolean isItemValidForSlot(int index, ItemStack stack) {
return true;
}
@Override
public int getField(int id) {
return 0;
}
@Override
public void setField(int id, int value) {}
@Override
public int getFieldCount() {
return 0;
}
@Override
public void clear() {
this.inventory.clear();
}
public void writeToNBT(NBTTagCompound compound) {
ItemStackHelper.saveAllItems(compound, this.inventory);
}
public void readFromNBT(NBTTagCompound compound) {
this.inventory = NonNullList.<ItemStack>withSize(this.getSizeInventory(), ItemStack.EMPTY);
ItemStackHelper.loadAllItems(compound, this.inventory);
}
void copy(CustomInventory inv) {
for (int i = 0; i < inv.getSizeInventory(); ++i) {
ItemStack stack = inv.getStackInSlot(i);
inventory.set(i, (stack.isEmpty() ? ItemStack.EMPTY : stack.copy()));
}
}
}