Skocz do zawartości
  • 0

Skrzynka po śmierci


Pytanie

Witam, mam taki o to kod

public class DeadChest implements Listener {

    @EventHandler(priority = EventPriority.HIGH)
    public void PlayerDeath(PlayerDeathEvent event) {
        event.getEntity();
        Player p = (Player) event.getEntity();
        ItemStack[] drops = event.getDrops().toArray(new ItemStack[0]);
        int x = p.getLocation().getBlockX();
        int y = p.getLocation().getBlockY();
        int z = p.getLocation().getBlockZ();
        World w = p.getLocation().getWorld();
        Location loc = new Location(w, x, y, z);
        loc.getBlock().setType(Material.CHEST);
        Chest c = (Chest) loc.getBlock().getState();
        c.getInventory().setContents(drops);
    }
}

I mam z nim dwa problemy.

1. Itemy się klonują, zamiast wkładać się do skrzynki to wypadają a ich kopia tworzy się w skrzynce. w jaki sposób mogę usunąć te które wypadły lub inaczej rozwiązać ten problem ?

2.Jeśli gracz ma w sobie więcej przedmiotów niż jest w stanie pomieścić pojedyńcza skrzynka to sypie błędami. Chciałbym aby wtedy tworzyła się podwójna skrzynka lecz nie wiem jak mogę ją postawić bo w Material nie ma czegoś takiego jak Double Chest

Odnośnik do komentarza
https://skript.pl/temat/40176-skrzynka-po-%C5%9Bmierci/
Udostępnij na innych stronach

14 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0

event.getDrops().clear(); - usuwanie przedmiotów

 

możesz postawić po prostu drugą skrzynkę ale przed tym sprawdzić czy w inventory gracza jest wiecej przedmiotow niz moze pomiescic jedna skrzynka

Odnośnik do komentarza
https://skript.pl/temat/40176-skrzynka-po-%C5%9Bmierci/#findComment-251212
Udostępnij na innych stronach

  • 0
17 minut temu, rozumek29 napisał:

Dzięki wielkie, pomogło

na przyszłość polecam również forum spigotmc na którym widziałem wiele problemów identycznych do twojego więc  w skrócie polecam czasem poszukać, bo to jest nawet szybsze.

Odnośnik do komentarza
https://skript.pl/temat/40176-skrzynka-po-%C5%9Bmierci/#findComment-251309
Udostępnij na innych stronach

  • 0

 

Możliwe że źle szukałem, ale pojawił się kolejny problem. Mianowicie. Jeśli gracz zginie z ekwipunkiem który jest większy niż pojemność skrzynki pojedyńczej, sypie mi kod mi się wywala, więc zrobiłem warunek który sprawdza czy gracz ma większy ekwipunek i wtedy stawia duble chesta, ale nadal mam jakiś błąd który nie do końca rozumiem :/ ,

 

Mój kod

public class DeadChest implements Listener {

    @EventHandler(priority = EventPriority.HIGH)
    public void PlayerDeath(PlayerDeathEvent event) {
        event.getEntity();
        Player p = (Player) event.getEntity();
        ItemStack[] drops = event.getDrops().toArray(new ItemStack[0]);
        int x = p.getLocation().getBlockX();
        int y = p.getLocation().getBlockY();
        int z = p.getLocation().getBlockZ();
        World w = p.getLocation().getWorld();
        Location loc = new Location(w, x, y, z);
        loc.getBlock().setType(Material.CHEST);
        if (p.getInventory().getSize() >= 27){
            p.sendMessage("TEST WORK");
            Location loc2 = new Location(w, x+1, y, z);
            DoubleChest c = (DoubleChest) loc.getBlock().getState();
            c.getInventory().setContents(drops);
            event.getDrops().clear();
            p.sendMessage(ChatColor.RED+"Twoja Skrzynka posmiertna znajduje sie na współrzędnych:");
            p.sendMessage(ChatColor.RED+"X: "+x+", Y: "+y+", Z: "+z);
        }else {
        Chest c = (Chest) loc.getBlock().getState();
        c.getInventory().setContents(drops);
        event.getDrops().clear();
        p.sendMessage(ChatColor.RED+"Twoja Skrzynka posmiertna znajduje sie na współrzędnych:");
        p.sendMessage(ChatColor.RED+"X: "+x+", Y: "+y+", Z: "+z);
        }
    }
}

 

Edytowane przez Wojciu
Odnośnik do komentarza
https://skript.pl/temat/40176-skrzynka-po-%C5%9Bmierci/#findComment-251399
Udostępnij na innych stronach

  • 0

Po pierwsze musisz postawić dwie skrzynki:

Block b1 = loc.getBlock();
Block b2 = loc.clone().add(0,0,-1).getBlock();

b1.setType(Material.CHEST);
b2.setType(Material.CHEST);

Następnie musisz pobrać BlockDate tych bloków ustawić aby patrzyły się w jedno miejsce i ustawić typ skrzynki:

BlockData data1 = b1.getBlockData();
        ((Directional) data1).setFacing(BlockFace.EAST);
        b1.setBlockData(data1);

org.bukkit.block.data.type.Chest chestData1 = (org.bukkit.block.data.type.Chest) data1;
        chestData1.setType(org.bukkit.block.data.type.Chest.Type.RIGHT);
        b1.setBlockData(chestData1);

BlockData data2 = b2.getBlockData();
        ((Directional) data2).setFacing(BlockFace.EAST);
        b2.setBlockData(data2);

org.bukkit.block.data.type.Chest chestData2 = (org.bukkit.block.data.type.Chest) data2;
        chestData2.setType(org.bukkit.block.data.type.Chest.Type.LEFT);
        b2.setBlockData(chestData2);

I teraz pobierasz chest i dodajesz tam itemki:

Chest chest = (Chest) b1.getState();
chest.getInventory().setContents(items);

Pisane na szybko gdyby był jakiś błąd daj znać :D

Edytowane przez patryk96
Odnośnik do komentarza
https://skript.pl/temat/40176-skrzynka-po-%C5%9Bmierci/#findComment-251951
Udostępnij na innych stronach

  • 0
Godzinę temu, rozumek29 napisał:

skrzynki się nie łączą i wywala błąd że nie ma w skrzynce tyle miejsca

Spróbuj jeszcze raz ten sam kod bo dodawałem poprawkę po chwili jeśli nadal bedzię wywalało wyślij błąd.

Odnośnik do komentarza
https://skript.pl/temat/40176-skrzynka-po-%C5%9Bmierci/#findComment-251959
Udostępnij na innych stronach

Nieaktywny
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
  • Ostatnio przeglądający   0 użytkowników

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