Skocz do zawartości
  • 0

Problem z loopowaniem


deusowy_yt
 Udostępnij

Pytanie

Witam, mam taki mały probłem otóz plugin działa normalnie gdy jestem sam na serwerze, ale gdy są np dwie osoby online, to drop jest dziwny. Nie dropi tak jest jest ustawione, tylko zamiast np 32 emeraldy dropi ich 8. Pomoze ktos? Kawałek kodu:

EventHandler
    public void onPlace(BlockPlaceEvent e) {
		Player p = e.getPlayer();
        Block b = e.getBlock();
            if(b.getType() == Material.CHEST) {
            	ItemMeta im = p.getItemInHand().getItemMeta();
            	if(im.getDisplayName().equals("§7§k|§a§l§k!§7§k|§7 §a§o§lNeroCase §7§k|§a§l§k!§7§k|") && im.getLore().equals(Arrays.asList(" §5§oTen przedmiot jest wyjatkowo Legendarny."," §5§oW srodku tej skrzyni znajduja sie bardzo"," §5§oCenne przedmioty, otworzenie jej spowoduje"," §5§oWielki wybuch, i uwolnienie mocy, co skutkuje", " §5§oWyrzuceniem przedmiotow do Twojego ekwipunku!   ", " §e§oChcesz sprobowac swojego szczescia?" , " §e§oSmialo, wez ta skrzynie do reki i ja poloz!", " §f§oJestes ciekawy co wyleci? Wpisz §4§l§o/CASE"))) {                
            		e.setCancelled(true);
                	if(p.getInventory().getItemInHand() != null) {
                		ItemStack handItem = p.getInventory().getItemInHand();
                		handItem.setAmount(handItem.getAmount() - 1);
                		p.getInventory().setItemInHand(handItem);
                		p.updateInventory();
                		for(Player all : Bukkit.getOnlinePlayers()) {
                			if(map.get(all) == Boolean.TRUE) {
                				all.sendMessage(" §a§l»" + "§c§o " + p.getName() + " §7§ootworzyl §7§k|§a§l§k!§7§k|§7 §a§o§lNeroCase §7§k|§a§l§k!§7§k|§7§o, i otrzymal§8:");
                			}
			                if(Math.random() * 100 <= 1) {
			                    giveItem(p, Stacki.is);
			                    if(map.get(all) == Boolean.TRUE) {
			                    	all.sendMessage(" §f§l» §4§oRzucane TNT §8§o(1%)");
			                    }
			                }
			                if(Math.random() * 100 <= 10) {
			                    giveItem(p, Stacki.is1);
			                    if(map.get(all) == Boolean.TRUE) {
			                    	all.sendMessage(" §f§l» §d§oKlate §c§o4§7/§c§o3 §8§o(10%)");
			                    }
			                }
			                if(Math.random() * 100 <= 10) {
			                    giveItem(p, Stacki.is2);
			                    if(map.get(all) == Boolean.TRUE) {
			                    	all.sendMessage(" §f§l» §d§oButy §c§o4§7/§c§o3 §8§o(10%)");

 

Odnośnik do komentarza
Udostępnij na innych stronach

6 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0
Cytat

EventHandler
    public void onPlace(BlockPlaceEvent e) {
		Player p = e.getPlayer();
        Block b = e.getBlock();
            if(b.getType() == Material.CHEST) {
            	ItemMeta im = p.getItemInHand().getItemMeta();
            	if(im.getDisplayName().equals("§7§k|§a§l§k!§7§k|§7 §a§o§lNeroCase §7§k|§a§l§k!§7§k|") && im.getLore().equals(Arrays.asList(" §5§oTen przedmiot jest wyjatkowo Legendarny."," §5§oW srodku tej skrzyni znajduja sie bardzo"," §5§oCenne przedmioty, otworzenie jej spowoduje"," §5§oWielki wybuch, i uwolnienie mocy, co skutkuje", " §5§oWyrzuceniem przedmiotow do Twojego ekwipunku!   ", " §e§oChcesz sprobowac swojego szczescia?" , " §e§oSmialo, wez ta skrzynie do reki i ja poloz!", " §f§oJestes ciekawy co wyleci? Wpisz §4§l§o/CASE"))) {                
            		e.setCancelled(true);
                	if(p.getInventory().getItemInHand() != null) {

na początek: polecam ci sprawdzać czy event został przerwany, jeżeli tak to piszesz wysyłasz playerowi wiadomość, że nie może tutaj postawić case'a, a gdy nie bedzie przerwany to po prostu robisz e.getBlock().setType(Material.AIR) - i już nie musisz sie bawić w usuwanie tego itemu z inventory gracza.

Pierw pobierasz item w rece gracza (przy zmiennej im), dopiero potem sprawdzasz czy item ,!= null, do tego nie sprawdzasz czy Meta itemu zawiera nazwe i lore tylko od razu ją sprawdzasz, no i do tego zamiast sobie gdzieś walnąć te 'wiadomości itd.' do configu to robisz to od razu w kodzie i do tego używasz paragrafów..

No i tak samo z dropieniem itemów, zamiast zrobić sobie jakiś obiekt CaseDrop i tam trzymać różne szanse na ten przedmiot i od razu możesz zrobić pętle z tymi casedrop, sprawdzić czy szansa sie sprawdza, jeżeli tak to dropisz itemy i wysyłasz wiadomość, no ale przecież java to tak trudny język.. zróbmy wszystko static i bez żadnej konfiguracji

Cytat

Nie dropi tak jest jest ustawione, tylko zamiast np 32 emeraldy dropi ich 8. Pomoze ktos? Kawałek kodu:

ja tu nie widze żadnych emeraldów, może daj nam kod klasy "Stacki"?

Odnośnik do komentarza
Udostępnij na innych stronach

  • 0
3 godziny temu, deusowy_yt napisał:

.. zrob sobie liste z itemami ew. mapke integer/double, itemstack lub obiekt w ktorym trzymasz szanse, item i wiadomosc + rób foreach i sprawdzaj szanse i tyle.

kod skrócony kilka razy i łatwiej wszystko czytać, szukać błędów.

Odnośnik do komentarza
Udostępnij na innych stronach

  • 0
11 godzin temu, deusowy_yt napisał:

@yooniksNo dobra, ale dlaczego tak sie dzieje? Ze jak jest jeden gracz na serwerze to normalnie dropi, a jak jest juz wiecej to nie tak jak nalezy :/

zakładam, że dlatego, bo robisz to w pętli i masz jakąś dziwną metodę giveItem do ustawiania amount itd.

Odnośnik do komentarza
Udostępnij na innych stronach

Nieaktywny
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
 Udostępnij

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...