Итем с эффектом и текстурой.

Версия Minecraft
1.7.10
929
30
66
Всем привет.

Как сделать итему эффект ночного зрения (одевать на новыеслоты) , и чтобы появлялась на голове(типо шлем).
 
Решение
Ок. Пример с добавлением ночного видения при надевании кольчужного шлема.

Это слот:
Java:
public class CustomSlot extends Slot {

    private final EntityPlayer player;

    public CustomSlot(EntityPlayer player, IInventory inventory, int slotIndex, int xPos, int yPos) {
   
        super(inventory, slotIndex, xPos, yPos);
   
        this.player = player;
    }

    //При доставании из слота.
    @Override
    public void onPickupFromSlot(EntityPlayer player, ItemStack itemStack) {
                
        this.onSlotChanged();
        
        if (!this.player.worldObj.isRemote)
        if (this.getSlotIndex() == 0 /*индекс твоего слота*/ && (this.getStack() == null || this.getStack().getItem() != Items.chainmail_helmet)) {...
243
28
202
Ок. Пример с добавлением ночного видения при надевании кольчужного шлема.

Это слот:
Java:
public class CustomSlot extends Slot {

    private final EntityPlayer player;

    public CustomSlot(EntityPlayer player, IInventory inventory, int slotIndex, int xPos, int yPos) {
   
        super(inventory, slotIndex, xPos, yPos);
   
        this.player = player;
    }

    //При доставании из слота.
    @Override
    public void onPickupFromSlot(EntityPlayer player, ItemStack itemStack) {
                
        this.onSlotChanged();
        
        if (!this.player.worldObj.isRemote)
        if (this.getSlotIndex() == 0 /*индекс твоего слота*/ && (this.getStack() == null || this.getStack().getItem() != Items.chainmail_helmet)) {
            
            //Если после клика в слоте другой предмет - удаление эффекта.    
            player.removePotionEffect(Potion.nightVision.id);
        }    
    }
    
    //При добавлении в слот.
    @Override
    public void putStack(ItemStack itemStack) {
        
        this.inventory.setInventorySlotContents(this.getSlotIndex(), itemStack);
        this.onSlotChanged();
        
        if (!this.player.worldObj.isRemote)
        if (this.getSlotIndex() == 0 /* индекс твоего слота */&& this.getStack() != null && this.getStack().getItem() == Items.chainmail_helmet) {
            
            //Если после клика в слоте нужный предмет - добавление эффекта
            this.player.addPotionEffect(new PotionEffect(Potion.nightVision.id, 24000));
        }
        
        else if (this.getSlotIndex() == 0 && (this.getStack() == null || this.getStack().getItem() != Items.chainmail_helmet)) {
            
            //Если после клика в слоте другой предмет - удаление эффекта
            this.player.removePotionEffect(Potion.nightVision.id);
        }
    }
}


А это его добавление в контейнер (в конструкторе):
this.addSlotToContainer(new CustomSlot(player, inventory, index, xPos, yPos));

Такой способ учитывает всякие шифт-клики и клики с "подменой" и п.р.
 
Последнее редактирование:
929
30
66
Всё работает,но когда снимаю обратно предмет, то краш происходит

---- Minecraft Crash Report ----
// My bad.

Time: 16.04.18 23:33
Description: Ticking memory connection

java.lang.NullPointerException: Ticking memory connection
at bestfoxy.harvest.containers.slots.SlotPNV.func_82870_a(SlotPNV.java:40)
at net.minecraft.inventory.Container.func_75144_a(SourceFile:238)
at bestfoxy.harvest.containers.ContainerCustomPlayer.func_75144_a(ContainerCustomPlayer.java:121)
at net.minecraft.network.NetHandlerPlayServer.func_147351_a(NetHandlerPlayServer.java:883)
at net.minecraft.network.play.client.C0EPacketClickWindow.func_148833_a(SourceFile:32)
at net.minecraft.network.play.client.C0EPacketClickWindow.func_148833_a(SourceFile:10)
at net.minecraft.network.NetworkManager.func_74428_b(NetworkManager.java:212)
at net.minecraft.network.NetworkSystem.func_151269_c(NetworkSystem.java:165)
at net.minecraft.server.MinecraftServer.func_71190_q(MinecraftServer.java:659)
at net.minecraft.server.MinecraftServer.func_71217_p(MinecraftServer.java:547)
at net.minecraft.server.integrated.IntegratedServer.func_71217_p(IntegratedServer.java:111)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:427)
at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:685)
 
243
28
202
Твоя вставил,нет inventory
Это всего лишь имя аргумента, оно может быть любым и тебе важно понять какой объект оно представляет. В данном случае это интерфейс IInventory, я назвал переменную inventory, а ты inventoryCustom, но разницы нет никакой.


Всё работает,но когда снимаю обратно предмет, то краш происходит
В putStack() добавлямый стак может быть null, добавь проверку this.getStack() != null перед проверкой предмета в слоте при добавлении в оба условия.
(this.getSlotIndex() == 1 && this.getStack() != null && this.getStack().getItem() == Items.chainmal_helmet в первую ветку и с != в последнем условии (перед проверкой предмета) во вторую и не копируй тупо все подряд, проверяй свои условия)
 
Последнее редактирование:
929
30
66
@AustereTony ,
В putStack() добавлямый стак может быть null, добавь проверку this.getStack() != null перед проверкой предмета в слоте при добавлении в оба условия.
(this.getSlotIndex() == 1 && this.getStack() != null && this.getStack().getItem() == Items.chainmal_helmet в первую ветку и с != в последнем условии (перед проверкой предмета) во вторую и не копируй тупо все подряд, проверяй свои условия)

Я ничего не могу понять вроде делаю,но все равно пропадает эффект и так же краш , мож скинуть как ставить у меня руки кривые
 
929
30
66
onPickupFromSlot
тоже нужно добавлять или снова краш , везде поставил не крашит ,но эффекта нет. Так же туда много чего нужно ложить а мне 1 итем нужен
 
Последнее редактирование:
929
30
66
Отредактировал оригинальное сообщение, в котором скидывал класс слота - теперь всё работает как надо.
А можно ещё как-то сделать чтобы когда одеваешь на голове была текстура шлема допустим(пнв)
 
Сверху