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


  • 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 !


  • @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


  • 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 ...


  • 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 ?


  • 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.


  • @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