Jump to content
  • 0

Invouk

Dotaz

Ahojte, 

 

1.) Mám problém, že pri daní levelu viac expov ako je level, cyklus while nezapne, a odobere hráčovi XP.
Ale ak dám určitý počet XP do toho levelu tak sa cyklus vykoná, XP odpočíta a LVL pribudne ale občas sa to bugne, že ani to neprebehne tak ako má.

2.) Problém s posledným private void createBoss z premennej ktoré uvádzam minProg a maxProg sa mi v premmenej  prog nevydelí číslo a vždy je 0, neviem prečo

3.) Ak máte návrh na optimalizovanie kódu kludne napíšem, budem len rád, za každú radu.

Kód je tu:
 

 

package LevelSystem;
 
import org.bukkit.Bukkit;
import org.bukkit.boss.BarColor;
import org.bukkit.boss.BarStyle;
import org.bukkit.boss.BossBar;
import org.bukkit.entity.Player;
 
import sk.xpress.antik.DataHandler;
import sk.xpress.antik.Main;
 
public class LevelHandler {
    private BossBar bs;
    boolean debug = Main.getData().getBoolean("Debug");
    DataHandler dh = new DataHandler();
   
   
    public void giveExp(Player p, int GivenExp){
        int exp = dh.getIData(p, "Exp.Experience");
        dh.setIData(p, GivenExp+exp, "Exp.Experience");
        createBoss(p, exp+GivenExp, getLevelToExp(p), GivenExp);
        if(debug) p.sendMessage("§7Expy§c " + exp + " §7Dostal §c" + GivenExp + " §7ToLevel§c " + getLevelToExp(p));
        dismissBossBar(p);
        updateLevel(p);
       
        p.sendMessage("");
        p.sendMessage("§m§c============================================");
        p.sendMessage("");
    }
   
    private int getLevelToExp(Player p){
        int exp = 0;
        int lvl = dh.getIData(p, "Exp.Level");
        if(lvl == 0){
            dh.setIData(p, 1, "Exp.Level");
            lvl = 1;
        }
        if(lvl >= 29){
            exp = (20*15600)-(20*960)+7*lvl;
            p.sendMessage("§8»» §cEXP LVL more then 29 §c" + exp);
        }else{
            exp = (lvl*1560)-(lvl*960);    
            p.sendMessage("§8»» §cEXP LVL less then 29 §c" + exp);
        }
        return exp;
    }
   
    private void updateLevel(Player p){
        int exp = dh.getIData(p, "Exp.Experience");
        int lvl = dh.getIData(p, "Exp.Level");
       
        while(getLevelToExp(p) <= exp){
            lvl++;
            exp -= getLevelToExp(p);
        }
        dh.setIData(p, lvl, "Exp.Level");
        dh.setIData(p, exp, "Exp.Experience");
    }
   
    private void dismissBossBar(final Player p){
        Bukkit.getScheduler().scheduleSyncDelayedTask(Main.getInstance(), new Runnable(){
            public void run(){
                bs.removePlayer(p);
              }
        }, 200L);  
    }
   
    private void createBoss(Player p, final int minProg, final int maxProg, int give){
        int prog = minProg/maxProg;
        int nlvl = maxProg-minProg;
        int nelvl = 0;
        if(nlvl <= -1){
            nlvl += nlvl;
            nelvl = getLevelToExp(p)+nlvl;
        }
        nlvl = nelvl;
        if(debug) bs = Bukkit.getServer().createBossBar("§e§lLevel " + dh.getIData(p, "Exp.Level") + " §7" + minProg + "§c§l/§7" + maxProg + " §6To Get Lvl §c" + nlvl, BarColor.YELLOW, BarStyle.SEGMENTED_20);
        bs = Bukkit.getServer().createBossBar("§e§lLevel " + dh.getIData(p, "Exp.Level") + " §7" + minProg + "§c§l/§7" + maxProg + " §6To Get Lvl §c" + nlvl, BarColor.YELLOW, BarStyle.SEGMENTED_20);
        bs.setColor(BarColor.YELLOW);
        if(prog >= 1){
            bs.setProgress(1);
        }else bs.setProgress(prog);
        bs.addPlayer(p);
        p.sendMessage("mP" + minProg + " maxP" + maxProg + " Given" + give + " toMaxLvl " + getLevelToExp(p) + " §cCalc " + prog);
           
    }
}

 



Ďakujem za každú pomoc.

Link to comment
Share on other sites

7 odpovědí na tuto otázku

Recommended Posts

  • 0

1) 

 while(getLevelToExp(p) <= exp){
       lvl++;
       exp -= getLevelToExp(p);
} 

tu by si mal ten level nastavit tak, aby to vedela fun kcia getLevelToExp rozpoznat, predpokladam ze ti to netaha z lokalneho integeru icon_e_biggrin.gif hod si tam aj dh.setIData(p, lvl, "Exp.Level"); medzi lvl a exp -= a vyskusaj tak.

2) Skusal si si tie min a maxProg hodnoty vyprintovat, ci su korektne? int nlvl je taka ako ma by? Printuj si to po kazdom riadku kedy s tou premennou pracujes, aby si zistil pripadne kde je chyba

 

3)

if(nlvl <= -1){
            nlvl += nlvl;
            nelvl = getLevelToExp(p)+nlvl;
        }

nie je [-x+(-x)] zlahcene -x -x? nechcel si tam dat nahodou nlvl *= -1 aby si dostal cislo kladne? :d neviem, len teoretizujem ci nemas chybu

Edited by bigw3b.
  • Líbí se mi to! (+1) 1
Link to comment
Share on other sites

  • 0

Ako mysliš, že netahá to getLevelToExp má len vypočítať z levelu podľa "vzorca" koľko mu tréba do dalšieho levelu

 

Trošku som to poupravil:

 

private int getLevelToExp(Player p, int lvl){
  int exp = 0;
  if(lvl == 0) lvl = 1;
  if(lvl >= 29){
   exp = (20*15600)-(20*960)+7*lvl;
  }else exp = (lvl*1560)-(lvl*960); 
  return exp;
}
a už som to opravil dík moc...

 

2) no tam bol problém, že int umožnuje iba celé čísla a žiadne decimalne takže stačilo 

 

float prog = (float)minProg/maxProg;
 

aby ukladalo ako keby "pozíciu" , a to (float) aby počítalo s decimalnimi číslami

 

To je asi všetko ,keby mal niekto návrh na optimalizáciu aktuálneho kódu sem s tým:

 

 

package LevelSystem;

import org.bukkit.Bukkit;
import org.bukkit.boss.BarColor;
import org.bukkit.boss.BarStyle;
import org.bukkit.boss.BossBar;
import org.bukkit.entity.Player;

import sk.xpress.antik.DataHandler;
import sk.xpress.antik.Main;

public class LevelHandler {
	private BossBar bs;
	boolean debug = Main.getData().getBoolean("Debug");
	DataHandler dh = new DataHandler();
	
	
	public void giveExp(Player p, int GivenExp){
		int exp = dh.getIData(p, "Exp.Experience");
		int level = dh.getIData(p, "Exp.Level");
		dh.setIData(p, GivenExp+exp, "Exp.Experience");
		createBoss(p, exp+GivenExp, getLevelToExp(p, level), GivenExp);
		dismissBossBar(p);
		updateLevel(p);
	}
	
	private int getLevelToExp(Player p, int lvl){
		int exp = 0;
		if(lvl == 0) lvl = 1;
		if(lvl >= 29){
			exp = (20*15600)-(20*960)+7*lvl;
		}else{
			exp = (lvl*1560)-(lvl*960);		
		}
		return exp;
	}
	
	private void updateLevel(Player p){
		int exp = dh.getIData(p, "Exp.Experience");
		int lvl = dh.getIData(p, "Exp.Level");
		
		while(getLevelToExp(p, dh.getIData(p, "Exp.Level")) <= exp){
			lvl++;
			exp -= getLevelToExp(p, dh.getIData(p, "Exp.Level"));
		}
		dh.setIData(p, lvl, "Exp.Level");
		dh.setIData(p, exp, "Exp.Experience");
	}
	
	private void dismissBossBar(final Player p){
		Bukkit.getScheduler().scheduleSyncDelayedTask(Main.getInstance(), new Runnable(){
			public void run(){
				bs.removePlayer(p);
				
			  }
		}, 200L);	
	}
	
	private void createBoss(Player p, final int minProg, final int maxProg, int give){
		float prog = (float)minProg/maxProg;
		int level = dh.getIData(p, "Exp.Level");

		bs = Bukkit.getServer().createBossBar("§e§lLevel §f§l" + level + " §a§l" + minProg + "§6§l/§a§l" + maxProg + " §6§lExp", BarColor.YELLOW, BarStyle.SEGMENTED_20);
		bs.setColor(BarColor.YELLOW);
		if(prog >= 1)bs.setProgress(1);
		else bs.setProgress(prog);

		bs.addPlayer(p);
		
			
	}
}

 

Link to comment
Share on other sites

  • 0

V Jave sa typ vysledku pri deleni určuje podla typov operandov, ak je aspon jeden z nich float, tak vysledok je float. Inak je to celé číslo. Ale na to si teda už prišiel. :))

Inak mozno:

    	private int getLevelToExp(/* Player p, ? */ int lvl){
            return (lvl < 29) ? (lvl*1560)-(lvl*960) : (20*15600)-(20*960)+7*lvl; // "ternarny operator", robi to iste ako koment nizsie
		/* if(lvl < 29) {
                    return (lvl*1560)-(lvl*960);
                } else {
                    return (20*15600)-(20*960)+7*lvl;
                } */                               
	}

Pripadne,

		if(prog >= 1)bs.setProgress(1);
		else bs.setProgress(prog); 
                // TOto treba? Nestaci namiesto toho
                bs.setProgress(prog); // skus bez tych podmienok
  • Líbí se mi to! (+1) 1
Link to comment
Share on other sites

  • 0

V Jave sa typ vysledku pri deleni určuje podla typov operandov, ak je aspon jeden z nich float, tak vysledok je float. Inak je to celé číslo. Ale na to si teda už prišiel. icon_e_smile.gif)

 

Inak mozno:

    	private int getLevelToExp(/* Player p, ? */ int lvl){
            return (lvl < 29) ? (lvl*1560)-(lvl*960) : (20*15600)-(20*960)+7*lvl; // "ternarny operator", robi to iste ako koment nizsie
		/* if(lvl < 29) {
                    return (lvl*1560)-(lvl*960);
                } else {
                    return (20*15600)-(20*960)+7*lvl;
                } */                               
	}

Pripadne,

		if(prog >= 1)bs.setProgress(1);
		else bs.setProgress(prog); 
                // TOto treba? Nestaci namiesto toho
                bs.setProgress(prog); // skus bez tych podmienok

Hej no rovno hádzať return bez premien...

 

A tá podmienka musí to tam byť pretože ak je väčšie ako 1 hodí to error

 

bere to ako float v rozpätí od 0 po 1 čiže 0.2 0.08 0.99 a podobne..

Link to comment
Share on other sites

  • 0

Máš:

    float prog = (float)minProg/maxProg;
    ..
    if(prog >= 1)bs.setProgress(1);
    else bs.setProgress(prog);

ďalej vychádzam z

prog = mensie/vacsie;

čo nikdy nemôže byť väčšie ako 1.

Ak ti to teda hádže errory, teda "mensie/vacsie > 1", máš chybu niekde inde v kóde, lebo minProg máš väčšie než maxProg, ak sa nemýlim.

Edit: btw, pekny help topic

Edited by Tanga
Link to comment
Share on other sites

  • 0

Ak dám napr:

10 000 xp kde maximálne XP k Levelu X  je 7000 tak "to je chyba" ale ak dám progress bar na plné. jedine, že by som ak je prog väčší  odčítal 1 číslo kedže by miesto 1.29 bolo 0.29 a tak by som zamedzil bugu, 


Dobrý nápad :d

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...