Créer un item non-lootable.



  • Bonjour à tous.
    J'aimerais savoir si quelqu'un aurait un moyen de créer un item non lootable, même en cas de mort.
    Merci d'avance.


  • Administrateurs

    Tu souhaites faire que l'item reste dans l'inventaire du joueur lorsqu'il meurt, ou qu'il disparaisse totalement lors de la mort ?
    Aussi, tu veux aussi empêcher de jeter l'item manuellement par terre ?



  • Moi jz cherche à faire en sorte de désactiver le drop


  • Administrateurs

    Désactiver totalement je vois vraiment pas comment faire.
    Juste supprimer l'item lors du drop, j'ai une idée avec l'eventDeath, ou l'eventDrop, ça devrait le faire.



  • Pour la 1.6 je crois que j'avais vue une fonction booléen candrop



  • J'aurais voulu que l'item reste dans l'inventaire du joueur lors de sa mort, et qu'il ne puisse pas le jeter.


  • Administrateurs

    Dans la classe de ton item, essaye de mettre ça :

    public boolean onDroppedByPlayer(ItemStack item, EntityPlayer player)
    {
    return false;
    }
    

    (pas eu le temps de tester)



  • J'ai testé, le joueur ne peut pas jeter l'item, mais lorsqu'il meurt, il le drop quand même.


  • Administrateurs

    Après quelques tests, dans ta classe principale, dans la fonction init mets ça :

    MinecraftForge.EVENT_BUS.register(new PlayerEventHandler());
    

    Et dans la classe PlayerEventHandler :

    package fr.minecraftforgefrance.tutoriel.common;
    
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.entity.player.InventoryPlayer;
    import net.minecraft.init.Items;
    import net.minecraft.item.ItemStack;
    import net.minecraft.stats.StatList;
    import net.minecraft.util.MathHelper;
    import net.minecraftforge.event.entity.EntityJoinWorldEvent;
    import net.minecraftforge.event.entity.living.LivingDeathEvent;
    import cpw.mods.fml.common.eventhandler.SubscribeEvent;
    
    public class PlayerEventHandler
    {
    @SubscribeEvent
    public void onLivingDeath(LivingDeathEvent event)
    {
    if(event.entity instanceof EntityPlayer)
    {
    EntityPlayer player = (EntityPlayer)event.entity;
    if(player.inventory.hasItem(ModTutoriel.itemTutoriel))
    {
    this.dropInventory(player.inventory);
    player.worldObj.getGameRules().setOrCreateGameRule("keepInventory", "true");
    }
    }
    }
    
    @SubscribeEvent
    public void onEntityJointWorld(EntityJoinWorldEvent event)
    {
    if(event.entity instanceof EntityPlayer)
    {
    event.world.getGameRules().setOrCreateGameRule("keepInventory", "false");
    }
    }
    
    private void dropInventory(InventoryPlayer inventory)
    {
    int i;
    
    for(i = 0; i < inventory.mainInventory.length; ++i)
    {
    if(inventory.mainInventory* != null)
    {
    if(inventory.mainInventory*.getItem() != ModTutoriel.itemTutoriel)
    {
    inventory.player.func_146097_a(inventory.mainInventory*, true, false);
    inventory.mainInventory* = null;
    }
    }
    }
    
    for(i = 0; i < inventory.armorInventory.length; ++i)
    {
    if(inventory.armorInventory* != null)
    {
    inventory.player.func_146097_a(inventory.armorInventory*, true, false);
    inventory.armorInventory* = null;
    }
    }
    }
    }
    

    Tu as juste à remplacer ModTutoriel.itemTutoriel par TaClassePrincipale.tonItem
    Si c'est un bloc, utilise Item.getItemFromBlock(TaClassePrincipale.tonBloc)

    J'ai pas trouvé de solution sans passer par le gameRule keepInventory, de toute façon elle n'est que actif lors du la mort du joueur et est remit à false lorsque le joueur revient dans le monde.



  • Merci beaucoup.



  • marche pour 1.6.x?


  • Administrateurs

    En principe, oui, cela devrais fonctionner à partir de la version 1.5.x.



  • ok merci



  • Si tu veux que l'item soit impossible à poser,tu implémente l'event EntityConstructEvent.
    Si l'entité est un EntityItem de ton item, tu le kill

    Même par dispenser et tout ça devient impossible 😉


Log in to reply