Çözüldü Envanterde belirli slotta belirli bir eşya varsa InventoryClickEvent cancel'lensin.

  • Konuyu Başlatan Konuyu Başlatan xRiuse
  • Başlangıç tarihi Başlangıç tarihi
  • Görüntüleme 580
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...

xRiuse

Bir Kömür Göründü Kaptanım!
Katılım
7 Eylül 2019
Mesajlar
133
Elmaslar
23
Puan
3.920
Yaş
25
Minecraft
exenaly

Discord:

exnn#0082

Merhabalar JAVA anlayanlardan bir isteğim olacak.

oyuncunun envanterinde 1. slotta "test" adlı bir taş var ise InventoryClickEvent, setCancelled(true) olsun.

Hatalı bir kodum var düzenleyebilirsiniz.
Java:
@EventHandler
public void onClick(InventoryClickEvent e) {
        if (e.getPlayer().getDisplayName().equals("test")) {
            e.setCancelled(true);
            }
        }
##KODDA SLOT İF'İ YOK VE KOD ÇALIŞMIYOR##
 
Java:
@EventHandler
    public void onClick(InventoryClickEvent e) {
        if (e.getSlot() == 0) {
            if(e.getCurrentItem().getType().equals(Material.STONE)) {
                if(e.getCurrentItem().getItemMeta().getDisplayName().equals("Test")) {
                    e.setCancelled(true);
                }
            }
        }
    }
Bunu deneyebilirsin.

Kendi yazdığın kodda e.getPlayer() demişsin. Hatalı bir kod eğer bir ide kullanıyorsan seni zaten uyarması gerekiyordu. InventoryClickEvent eventinde getPlayer() olarak çalışmaz. Oyunucuyu okutmak istiyorsan getWhoClicked() kullanmalısın. Ve kod içerisinde
Kod:
if (e.getPlayer().getDisplayName().equals("test"))
var. Bu eğer getWhoClicked() olarak tanımlansaydı oyuncunun adı test ise aşağıdakini uygula demek olurdu.
 
Son düzenleme:
Java:
@EventHandler
    public void onClick(InventoryClickEvent e) {
        if (e.getSlot() == 0) {
            if(e.getCurrentItem().getType().equals(Material.STONE)) {
                if(e.getCurrentItem().getItemMeta().getDisplayName().equals("Test")) {
                    e.setCancelled(true);
                }
            }
        }
    }
Bunu deneyebilirsin.

Kendi yazdığın kodda e.getPlayer() demişsin. Hatalı bir kod eğer bir ide kullanıyorsan seni zaten uyarması gerekiyordu. InventoryClickEvent eventinde getPlayer() olarak çalışmaz. Oyunucuyu okutmak istiyorsan getWhoClicked() kullanmalısın. Ve kod içerisinde
Kod:
if (e.getPlayer().getDisplayName().equals("test"))
var. Bu eğer getWhoClicked() olarak tanımlansaydı oyuncunun adı test ise aşağıdakini uygula demek olurdu.
Kendim denedim, canavar gibi çalışıyor.
 
Kendim denedim, canavar gibi çalışıyor.
LJŞFDEWGLJQEWFG
Java:
@EventHandler
    public void onClick(InventoryClickEvent e) {
        if (e.getSlot() == 0) {
            if(e.getCurrentItem().getType().equals(Material.STONE)) {
                if(e.getCurrentItem().getItemMeta().getDisplayName().equals("Test")) {
                    e.setCancelled(true);
                }
            }
        }
    }
Bunu deneyebilirsin.

Kendi yazdığın kodda e.getPlayer() demişsin. Hatalı bir kod eğer bir ide kullanıyorsan seni zaten uyarması gerekiyordu. InventoryClickEvent eventinde getPlayer() olarak çalışmaz. Oyunucuyu okutmak istiyorsan getWhoClicked() kullanmalısın. Ve kod içerisinde
Kod:
if (e.getPlayer().getDisplayName().equals("test"))
var. Bu eğer getWhoClicked() olarak tanımlansaydı oyuncunun adı test ise aşağıdakini uygula demek olurdu.
Eline sağlık teşekkürler bilgiler içinde fakat benim istediğim eğer envanterde bu item varsa envanterdeki hiçbişeyi haraket ettiremeyim onu düzenleyip atarsan efsane olur. ELİNE SAĞLIK
 
Kod:
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.ItemStack;

import net.md_5.bungee.api.ChatColor;




public class PlayerClickEvent implements Listener {
    
    @EventHandler
    public void onClick(InventoryClickEvent event) {
        
        Player p = (Player)event.getWhoClicked();
        
        if ((event.getCurrentItem() == null) || (event.getCurrentItem().getType().equals(Material.AIR))) {
            return;
        }
        
        for(ItemStack item : p.getInventory().getContents()){
            if(item.getItemMeta().getDisplayName().equals("TEST")){
                event.setCancelled(true);
                p.sendMessage(ChatColor.RED + "Envanterinde envanter bozucu bulunduğu için tıklayamazsın.");
            }
        
        }
    }
}
 
Kod:
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.ItemStack;

import net.md_5.bungee.api.ChatColor;




public class PlayerClickEvent implements Listener {
   
    @EventHandler
    public void onClick(InventoryClickEvent event) {
       
        Player p = (Player)event.getWhoClicked();
       
        if ((event.getCurrentItem() == null) || (event.getCurrentItem().getType().equals(Material.AIR))) {
            return;
        }
       
        for(ItemStack item : p.getInventory().getContents()){
            if(item.getItemMeta().getDisplayName().equals("TEST")){
                event.setCancelled(true);
                p.sendMessage(ChatColor.RED + "Envanterinde envanter bozucu bulunduğu için tıklayamazsın.");
            }
       
        }
    }
}
maalesef çalışmadı
 
Java:
@EventHandler
    public void onClick(InventoryClickEvent e) {
        if (e.getSlot() == 0) {
            if(e.getCurrentItem().getType().equals(Material.STONE)) {
                if(e.getCurrentItem().getItemMeta().getDisplayName().equals("Test")) {
                    e.setCancelled(true);
                }
            }
        }
    }
Bunu deneyebilirsin.

Kendi yazdığın kodda e.getPlayer() demişsin. Hatalı bir kod eğer bir ide kullanıyorsan seni zaten uyarması gerekiyordu. InventoryClickEvent eventinde getPlayer() olarak çalışmaz. Oyunucuyu okutmak istiyorsan getWhoClicked() kullanmalısın. Ve kod içerisinde
Kod:
if (e.getPlayer().getDisplayName().equals("test"))
var. Bu eğer getWhoClicked() olarak tanımlansaydı oyuncunun adı test ise aşağıdakini uygula demek olurdu.
burdaki mantık: eğer slot:1'de 'Test' adlı taş varsa o taşa tıklanmasın.
istediğim: eğer slot:1'de 'Test' adlı taş varsa envanterinde tıklanmasın.

yardımcı olabilir misin?
 
Oyuncunun envanterinde aramak yerine hedef envanterde arayın sorun çözülecektir muhtemelen. For yerine stream ile de yapılabilir.
Ek: InventoryClickEvent#getSlot yerine InventoryClickEvent#getRawSlot kullanın.

Ek olarak; eşyanın ismini kontrol etmek hiç mantıklı bir fikir değil, eğer bir menü yapmaya çalışıyorsanız inventoryholder ile kontrol edin veya hazır bir menü apisi kullanın yok sadece eşyayı kontrol etmem gerek diyorsanız da eşyaya özel bir pdc (+1.14.4) veya nbt atayın ve o değeri kontrol edin, çok daha sağlıklı olacaktır.

Yanıt verene arkadaşlara bir not, spoonfeed yapmazsanız daha iyi olur. Spoonfeed yüzünden konu sahibinin bir şey öğrenmesine gerek kalmıyor, onun yerine nasıl yapılacağını söyleyin.
 
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...

Hala Discord sunucumuza katılmadın mı?

Büyük bir topluluğun parçası ol, etkinliklere katıl ve özel hediyeler kazanma şansı yakala!

Şimdi Katıl
Üst