Ailes,Monture,item qui permet de spawn une entity,MultiTool



  • Bonjour (re plutôt ^^) 
    J'ai voulu crée des ailes,monture (qui est un cheval) et un item qui permet de faire spawn une entity mais que le joueur ne peux pas faire spawn si il à déjà fait spawn l'entity mais que lorsque qu'il fait un click gauche sur le mob en question sa va le faire disparaître et il va pouvoir le faire re spawn

    Pour les Ailes j'ai fait un codage mais le problème c'est que quand je met les ailes on peux volé mais quand on les enlevé on peut encore volé et  que j'aimerais que tu peux que volé que 5 secondes
    Le Codages des Ailes:

    public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack)
    {
    
    if(this.armorType == 1)
    {
    player.capabilities.allowFlying = true;
    if(player.capabilities.allowFlying = true)
    {
    System.out.println("TestFly");
    }
    }
     }
    

    Le Codage  pour l'item qui permet de spawner une entity

    public class SpawnerHorse extends Item {
    
    public SpawnerHorse()
    {
    super();
    }
    
     public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ)
    
    {
       if(!world.isRemote)
       {
           Horse Horse = new Horse(world);
           Horse.setPosition(x, y, z);
           world.spawnEntityInWorld(Horse);
           return true;
       }
       return false;
    }
    }
    

    Et pour l'entity le premier problème est que l'entity ne peut pas sauté,le 2 elle est bloqué sur l'animation du cheval et la 3 est est ce que on peut changé la texture?
    Le Code du Cheval

    import net.minecraft.entity.EntityAgeable;
    import net.minecraft.entity.SharedMonsterAttributes;
    import net.minecraft.entity.ai.attributes.IAttribute;
    import net.minecraft.entity.ai.attributes.RangedAttribute;
    import net.minecraft.entity.passive.EntityHorse;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.util.StatCollector;
    import net.minecraft.world.World;
    
    public  class Horse extends EntityHorse
    {
    public Horse(World model)
    {
    super(model);
    }
    
    public void applyEntityAttributes()
        {
            super.applyEntityAttributes();
            this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(3D);    
            this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.5D);
        }  
    
    public boolean canBeSteered()
        {
            return true;
        }
    
        public boolean isHorseSaddled()
        {
            return true;
        }
    
    public boolean isHorseJumping()
        {
            return true;
        }
    
    public boolean isTame()
        {
            return true;
        }
    
        public boolean isChested()
        {
            return false;
        } 
    
    public boolean interact(EntityPlayer par1EntityPlayer)
      {
          if (super.interact(par1EntityPlayer))
          {
              par1EntityPlayer.mountEntity(this);
              return true;
          }
          for (int i = 0; i < 2; ++i)
          {
              this.worldObj.spawnParticle("largesmoke", this.posX + (this.rand.nextDouble() - 0.5D) * (double)this.width, this.posY + this.rand.nextDouble() * (double)this.height, this.posZ + (this.rand.nextDouble() - 0.5D) * (double)this.width, 0.0D, 0.0D, 0.0D);
          }
          return false;
      }
    
    public boolean jumpRearingCounter()
    {
    return true;
    }
    public boolean jumpPower()
    {
    return true;
    }
    public boolean horsejumping()
    {
    return true;
    }
    public boolean isEatingHaystack()
    {
    return true;
    }
    public boolean isRearing()
    {
    return true;
    }
    @Override
    public EntityAgeable createChild(EntityAgeable p_90011_1_)
    {
    return null;
    }
    public String getCommandSenderName()
    {
        if (this.hasCustomNameTag())
        {
            return this.getCustomNameTag();
        }
        else
        {
            int i = this.getHorseType();
    
            switch (i)
            {
                case 0:
                default:
                    return StatCollector.translateToLocal("entity.skeletonhorse.name");
    
            }
        }
    }
    }
    
    

    Excusez-moi pour l'orthographe


  • Administrateurs

    Re,
    Pour le 1, il faut repasser player.capabilities.allowFlying sur false une fois l'armure. Je ne suis pas sûr qu'il existe une fonction qui est appelé lorsqu'une armure est retiré. Faut chercher. Si ça existe il suffit d'utiliser cette dernière. Sinon il faut passer un event de tick du joueur, s'il peut fly, qu'il n'est pas en créatif et qu'il n'a pas d'armure il faut remettre sur false.

    1. Il faut utiliser le tag nbt.
    public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ)
    {
    if(!stack.hasTagCompound())
    {
    stack.setTagCompound(new NBTTagCompound());
    }
    if(!world.isRemote && !stack.getTagCompound().getBoolean("used"))
    {
    Horse horse = new Horse(world);
    horse.setPosition(x, y, z);
    world.spawnEntityInWorld(horse);
    stack.setTagCompound().getBoolean("used", true);
    return true;
    }
    return false;
    }
    

    Et ensuite dans la fonction interact de ton entité si par1EntityPlayer.getCurrentEquippedItem() n'est pas null, que par1EntityPlayer.getCurrentEquippedItem().getItem() est ton item.
    Ensuite même condition pour ajouter un tag nbt si non présent :

    if(!par1EntityPlayer.getCurrentEquippedItem().hasTagCompound())
    {
    par1EntityPlayer.getCurrentEquippedItem().setTagCompound(new NBTTagCompound());
    }
    

    Et ensuite si par1EntityPlayer.getCurrentEquippedItem().getTagCompound().getBoolean("Used") est sur true tu le repasse sur false et tu fais un this.setDead()



  • J'ai oubli le codage du multi tool
    Excusez-moi x)



  • J'ai fait sa mais sa marche même plus  😞

    public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack,int tick)
    {
    
    if(this.armorType == 1)
    {
    player.capabilities.allowFlying = true;
    
    if(player.capabilities.allowFlying = true)
    {
    System.out.println("TestFly");
    }
    int coldoown;
    coldoown = tick;
    coldoown = 1;
    coldoown = 2;
    coldoown = 3;
    coldoown = 4;
    coldoown = 5;
    
    if(player.capabilities.allowFlying = false)
    {
    System.out.println("TestFlyTest");
    }
    }
     }
    

  • Administrateurs

    Heu ? C'est sensé être quoi ?



  • C'est Censé être le temps du vol même moi je sais pas ce que j'ai fait



  • Comment te dire que la valeur de ton cooldown va passer à 5 en moins d'un centième de tick, que "= true" et "=false" ne respectent pas les conventions et que tu fais une condition juste après avoir mis la valeur



  • Quelqu'un connait une fonction quand je joueur retire l'armure?



  • Bah sinon tu peux passer un boolean à true si il a son armure et tu check dans un tick handler, si il ne l'a plus et que le boolean était à true



  • J'ai fait sa mais sa marche toujours pas alors que dans la console sa met FlyOn

    public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack)
    {
    
    if(this.armorType == 1)
    {
    FlyOn = true;
    
    if(FlyOn = true)
    {
    System.out.println("FlyOn");
    }
    if(FlyOff = false)
    {
    System.out.println("FlyOff");
    }
    }
     }
    public void Fly(World world, EntityPlayer player, ItemStack itemStack)
    {
    
    if(FlyOn = true)
    {
    player.capabilities.allowFlying = true;
    }
    if(FlyOff = false)
    {
    player.capabilities.allowFlying = false;
    }
    }
    public boolean FlyOn(World world, EntityPlayer player, ItemStack itemStack)
    {
    return true;
    
    }
    public boolean FlyOff(World world, EntityPlayer player, ItemStack itemStack)
    {
    return false;
    
    }
    


  • Tu ne mets jamais FlyOn à false
    Et essaye de respecter la convention java



  • Si, il mets toujours flyOn à false puisque il mets des = au lieu des ==



  • Il faut que tu fasse quelque chose comme ça (pas éxactement ça, mais c'est l'idée) :

    
    public static int counter = 0;
    
    @Override
    public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack) {
    player.capabilities.allowFlying = !player.capabilities.allowFlying ? [font=monospace**this**][font=monospace.][font=monospacearmorType] == 1 : !counter >= 100; // 100 car 20 ticks par seconde
    counter = player.capabilities.allowFlying ? counter + 1 : 0;
    }
    
    

  • Correcteurs

    Vu son code, je ne pense pas qu'il comprenne encore bien les conditions ternaires sans explication.



  • @'Toutoune1008':

    Vu son code, je ne pense pas qu'il comprenne encore bien les conditions ternaires sans explication.

    J'ai enlevé le reset du counter, car sinon ça va se relancer en continu, et j'ai documenté le code. Faudrait reset le counter quand on enlève l'armure (c'est pas trop compliqué t'inquiète)

    
    public static int counter = 0;
    
    /*
    Si le joueur ne vole pas et que l'Item est porté sur le plastron alors il vole, si le joueur vole et que le counter est à 5 secondes alors il ne vole plus
    Si le joueur vole alors le counter s'incrémente tous les ticks 
    100 car 20 ticks par seconde
    */
    @Override
    public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack) {
        player.capabilities.allowFlying = !player.capabilities.allowFlying ? [font=monospace**this**][font=monospace.][font=monospacearmorType] == 1 : !counter >= 100; 
        if(player.capabilities.allowFlying)
             ++counter;
    }
    
    


  • Je peut toujours volé à l'infini



  • Je crois que je me suis mal exprimé ce que j’essaie de faire c'est un temps de vole et non un cooldown entre chaque vole



  • Pourquoi faire compliqué quand on peut faire simple x)

    
    @SubscribeEvent
    public void livingEntity(LivingUpdateEvent event)
    {
    if (event.entityLiving instanceof EntityPlayer)
    {
    EntityPlayer player = (EntityPlayer)event.entityLiving;
    if((player.getCurrentArmor(0) || player.getCurrentArmor(1) || player.getCurrentArmor(2) || player.getCurrentArmor(3)) && (player.getCurrentArmor(0).getItem() == TaClasseMod.tonCasque || player.getCurrentArmor(0).getItem() == TaClasseMod.tonPlastron || player.getCurrentArmor(0).getItem() == TaClasseMod.tesJambieres || player.getCurrentArmor(0).getItem() == TaClasseMod.tesBottes))
    player.capabilities.isFlying = true;
    else
    player.capabilities.isFlying = false;
    }
    }
    
    


  • @'Plaigon':

    Pourquoi faire compliqué quand on peut faire simple x)

    
    @SubscribeEvent
    public void livingEntity(LivingUpdateEvent event)
    {
    if (event.entityLiving instanceof EntityPlayer)
    {
    EntityPlayer player = (EntityPlayer)event.entityLiving;
    if((player.getCurrentArmor(0) || player.getCurrentArmor(1) || player.getCurrentArmor(2) || player.getCurrentArmor(3)) && (player.getCurrentArmor(0).getItem() == TaClasseMod.tonCasque || player.getCurrentArmor(0).getItem() == TaClasseMod.tonPlastron || player.getCurrentArmor(0).getItem() == TaClasseMod.tesJambieres || player.getCurrentArmor(0).getItem() == TaClasseMod.tesBottes))
    player.capabilities.isFlying = true;
    else
    player.capabilities.isFlying = false;
                     }
           }
    
    

    Je crois que tu n'as pas compris son problème… Il veut voler seulement 5 secondes (et en quoi c'est plus simple d'écrire 10 lignes au lieu de 2 ? x)

    [size=smallJe peut toujours volé à l'infini]

    Essaie de cast dans un booléen différent, je testerai ce soir si je fais pas de soirée



  • Le formatteur de mff a fait plein de retour a la ligne, chez moi sa n en fait pas autant.
    Apres si il veut juste 5 sec a lui d adapter son code avec la variable world.getTotalWorldTime()
    Et puis @Dylem, essaie au moins d adapter ton code avec getTotalWorldTime(), sinon il devra enregistrer la var counter dans les tags de l item, ce qui au final ne sera pas une solution + facile…