Navigation

    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Popular
    • Users
    • Groups

    SOLVED Formulation mathématique pour retrouver un level à partir d'xp donné !

    1.12.x
    1.12.2
    2
    5
    32
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • Kporal
      Kporal last edited by

      Bien le bonsoir et bonne fin de week end 😄 > Bon bah tout est dans le titre, pour faire simple, je suis entrain de faire un système d’xp lors du spawn des mob hostile ( mon ancien système fonctionne sans souci mais n’est absolument pas dynamique et pas propre du tout bref ! )

      new Random().nextInt( 300 ); // Je génère un nombre qui simule l'xp du monstre
      /* ( 10 * rand( 5 )) + ( 10 * rand( 5 ) * rand( 5 ))
       * 0 + 0 * 0 = 0
       * 10 + 10 * 1 = 20
       * 20 + 20 * 2 = 60
       * 30 + 30 * 3 = 120
       * 40 + 40 * 4 = 200
       * 50 + 50 * 5 = 300
       */
      

      Le rand( 5 ) est juste pour simuler les niveaux des monstres pour me donner un aperçu de l’éventail d’xp fourni qui me sert de base “pourcentage” pour définir leur bonus et leur probabilité de pop sur la map.
      Mon souci est donc de retrouver cette formule au sens inverse, c’est à dire de retrouver le niveau max des monstres sachant que le niveau max est 5 avec un maximum de 300 d’xp !
      PS, je suis une brelle en math … je demande donc un peu d’aide si quelqu’un aurait une belle formule, j’ai chercher un peu des exemple notamment en utilisant Math.sqrt mais je n’y arrive simplement pas …
      Merci d’avance !

      1 Reply Last reply Reply Quote 0
      • Kporal
        Kporal last edited by Kporal

        @SubscribeEvent
        	public void entitySpawn( LivingSpawnEvent event ) {
        		if( event.getEntity() instanceof EntityMob && Configs.allowMobLevel ) {
        			
        			/* ( 10 * rand( 5 )) + ( 10 * rand( 5 ) * rand( 5 ))
        			 * 0 + 0 * 0 = 0
        			 * 10 + 10 * 1 = 20
        			 * 20 + 20 * 2 = 60
        			 * 30 + 30 * 3 = 120
        			 * 40 + 40 * 4 = 200
        			 * 50 + 50 * 5 = 300
        			 */
        			int xp = new Random().nextInt( 300 );
        			int level = ( int ) (( Math.sqrt( 20 * ( 2 * xp + 5 )) + 10 ) / 20);
        			int invert = 5 - level;
        			
        			EntityMob mob = ( EntityMob ) event.getEntity();
        			
        			if( invert == 5 )
        				mob.setCustomNameTag( TextFormatting.OBFUSCATED + mob.getCustomNameTag() );
        			
        			IAttributeInstance mobMaxHealth = mob.getEntityAttribute( SharedMonsterAttributes.MAX_HEALTH );
        			double maxHealth = mobMaxHealth.getBaseValue() + ( mobMaxHealth.getBaseValue() / 5 * invert);
        			mobMaxHealth.setBaseValue( maxHealth );
        			mob.setHealth(( float ) mobMaxHealth.getBaseValue() );
        			
        			IAttributeInstance mobAttack = mob.getEntityAttribute( SharedMonsterAttributes.ATTACK_DAMAGE );
        			double attack = mobAttack.getBaseValue() + ( mobAttack.getBaseValue() / 5 * invert);
        			mobAttack.setBaseValue( attack );
        		}
        	}
        

        Sujet résolu

        1 Reply Last reply Reply Quote 0
        • Kporal
          Kporal last edited by

          Bon bah j’ai trouver une solution qui fonctionne ( Algorithm for dynamically calculating a level based on experience points? )

          int xp = new Random().nextInt( 300 );
          int level = ( int ) (( Math.sqrt( 20 * ( 2 * xp + 5 )) + 10 ) / 20);
          

          Je comprend pas vraiment à quoi correspondent les chiffres, j’ai simplement copier bêtement la formule en modifiant certaine valeur qui me semblais cohérente … bref j’ai jouer à pile ou face et j’ai réussi mais je comprend rien pour autant …

          1 Reply Last reply Reply Quote 0
          • Kporal
            Kporal last edited by

            Existe t-il un moyen pour inverser dynamiquement mon level donnée ?
            Je m’expliques, le level max ici c’est 5, mais comme je l’ai dis, je récupère ce level sous forme de pourcentage, le niveau le plus rare est donc 0 et non 5, c’est à partir de là que je modifie les stats des monstres et leur donne de l’équipement en conséquent !
            là ou le niveau 5 est en faite le niveau le plus bas avec le plus gros pourcentage de chance d’apparition, en somme le but serait de faire : level 0 = 5, level 1 = 4, level 2 = 3 … … est-ce possible ? si oui comment doit-je m’y prendre ?

            1 Reply Last reply Reply Quote 0
            • Deleted
              Deleted last edited by

              Bonsoir, je n’ai rien compris du début jusqu’à la fin. Le niveau le plus bas est 5, donc on compte les niveau par ordre décroissant? Quel est le problème dans la formule? Que cherches-tu à faire? Explique avec des phrases simples, qui ne font pas 4 lignes, ne rentre pas trop dans les détails, sinon on s’y perd. On s’en fiche de savoir quel était l’ancien système.

              1 Reply Last reply Reply Quote 0
              • Kporal
                Kporal last edited by Kporal

                @SubscribeEvent
                	public void entitySpawn( LivingSpawnEvent event ) {
                		if( event.getEntity() instanceof EntityMob && Configs.allowMobLevel ) {
                			
                			/* ( 10 * rand( 5 )) + ( 10 * rand( 5 ) * rand( 5 ))
                			 * 0 + 0 * 0 = 0
                			 * 10 + 10 * 1 = 20
                			 * 20 + 20 * 2 = 60
                			 * 30 + 30 * 3 = 120
                			 * 40 + 40 * 4 = 200
                			 * 50 + 50 * 5 = 300
                			 */
                			int xp = new Random().nextInt( 300 );
                			int level = ( int ) (( Math.sqrt( 20 * ( 2 * xp + 5 )) + 10 ) / 20);
                			int invert = 5 - level;
                			
                			EntityMob mob = ( EntityMob ) event.getEntity();
                			
                			if( invert == 5 )
                				mob.setCustomNameTag( TextFormatting.OBFUSCATED + mob.getCustomNameTag() );
                			
                			IAttributeInstance mobMaxHealth = mob.getEntityAttribute( SharedMonsterAttributes.MAX_HEALTH );
                			double maxHealth = mobMaxHealth.getBaseValue() + ( mobMaxHealth.getBaseValue() / 5 * invert);
                			mobMaxHealth.setBaseValue( maxHealth );
                			mob.setHealth(( float ) mobMaxHealth.getBaseValue() );
                			
                			IAttributeInstance mobAttack = mob.getEntityAttribute( SharedMonsterAttributes.ATTACK_DAMAGE );
                			double attack = mobAttack.getBaseValue() + ( mobAttack.getBaseValue() / 5 * invert);
                			mobAttack.setBaseValue( attack );
                		}
                	}
                

                Sujet résolu

                1 Reply Last reply Reply Quote 0
                • 1 / 1
                • First post
                  Last post
                Design by Woryk
                Contact / Mentions Légales / Faire un don

                MINECRAFT FORGE FRANCE © 2018

                Powered by NodeBB