• S'inscrire
    • Se connecter
    • Recherche
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes

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

    1.12.x
    1.12.2
    2
    5
    224
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • Kporal
      Kporal dernière édition par

      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 !

      Check out my mod : https://www.curseforge.com/minecraft/mc-mods/eygo

      1 réponse Dernière réponse Répondre Citer 0
      • Kporal
        Kporal dernière édition par 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

        Check out my mod : https://www.curseforge.com/minecraft/mc-mods/eygo

        1 réponse Dernière réponse Répondre Citer 0
        • Kporal
          Kporal dernière édition par

          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 …

          Check out my mod : https://www.curseforge.com/minecraft/mc-mods/eygo

          1 réponse Dernière réponse Répondre Citer 0
          • Kporal
            Kporal dernière édition par

            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 ?

            Check out my mod : https://www.curseforge.com/minecraft/mc-mods/eygo

            1 réponse Dernière réponse Répondre Citer 0
            • Deleted
              Deleted dernière édition par

              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 réponse Dernière réponse Répondre Citer 0
              • Kporal
                Kporal dernière édition par 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

                Check out my mod : https://www.curseforge.com/minecraft/mc-mods/eygo

                1 réponse Dernière réponse Répondre Citer 0
                • 1 / 1
                • Premier message
                  Dernier message
                Design by Woryk
                Contact / Mentions Légales

                MINECRAFT FORGE FRANCE © 2018

                Powered by NodeBB