Skocz do zawartości
  • 0

Jak usunąć dropy?


KodziaK

Pytanie

Mam pytanie jak usunąć dropy z bloku przy evencie BlockBreakEvent.

		if(e.getBlock().getType().equals(Material.STONE)){
			e.getPlayer().giveExp(expstone);
			if(pYml.getBoolean("players." + e.getPlayer().getName() + ".cobblestone")){
				if(e.getPlayer().getItemInHand().getEnchantments().containsKey(Enchantment.SILK_TOUCH)){
					e.getPlayer().getInventory().addItem(new ItemStack(Material.STONE, 1));
				}else{
					e.getPlayer().getInventory().addItem(new ItemStack(Material.COBBLESTONE, 1));
				}
				e.setCancelled(true);
				e.getBlock().setType(Material.AIR);
			}else{
				e.setCancelled(true);
				e.getBlock().setType(Material.AIR);
			}
		}

Mam taki kod ale problem jest taki że użycia nie zchodzą z narzędzia. Więc jeżeli ktoś ma jakiś pomysł na usunięcie dropów/da kod na usuwanie użyć z kilofa to niech napisze :).

ps tak wyglądają dane gracza:

  K0dX:
    Diament: true
    Emerald: true
    points: 685
    Lapis Lazuli: true
    lvl: 152
    cobblestone: false

 

Odnośnik do komentarza
https://skript.pl/temat/21237-jak-usun%C4%85%C4%87-dropy/
Udostępnij na innych stronach

6 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0

no niestety ale nie ma dobrego sposobu :D by ti ładnie zablokować to trzeba albo się jebać w NMS, albo właśnie ręcznie odtwarzać wszystkie reakcje, co oznacza też enchanty od unbreaking, różne zużycie przy niektórych blokach i narzędziach i inne takie.

Dlatego często wygodniej użyć np OtherDropa co już to ma, sporo można z configu, albo użyć jako API też powinno się dać.

Edytowane przez GotoFinal
Odnośnik do komentarza
https://skript.pl/temat/21237-jak-usun%C4%85%C4%87-dropy/#findComment-144236
Udostępnij na innych stronach

  • 0

@GotoFinal No problem jest taki że ja już mam praktycznie cały plugin na drop napisany turbo drop/exp, gui z pokazanym dropem, levele i inne. 

Brakuje mi tylko tego.

Edytowane przez K0dziakOfSky
Odnośnik do komentarza
https://skript.pl/temat/21237-jak-usun%C4%85%C4%87-dropy/#findComment-144239
Udostępnij na innych stronach

  • 0

no to musisz się pomęczyć z NMS lub symulowaniem, jak z NMS to musisz znaleźć gdzie wywołuje się drop, najwygodniej poszukać gdzie wywołuje się BlockBreakEvent i tam szukać gdzie jest drop, tylko to dość mało przenośnie i ryzykowne.

 

Możesz też poszukać w innych pluginach jak to wygląda: https://github.com/Zarius/Bukkit-OtherBlocks

Odnośnik do komentarza
https://skript.pl/temat/21237-jak-usun%C4%85%C4%87-dropy/#findComment-144242
Udostępnij na innych stronach

  • 1
package pl.inder00.drop.listeners;

import java.util.HashMap;

import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.inventory.ItemStack;

public class BreakEvent implements Listener {
	
	public static int randomInt(int min, int max){
		return (int) (Math.random()*(max-min))+min;
	}
	
    public static void recalculateDurability(Player player, ItemStack item) {
        if (item.getType().getMaxDurability() == 0) {
            return;
        }
        int enchantLevel = item.getEnchantmentLevel(Enchantment.DURABILITY);
        short d = item.getDurability();
        if (enchantLevel > 0) {
            if (100 / (enchantLevel + 1) > randomInt(0, 100)) {
                if (d == item.getType().getMaxDurability()) {
                    player.getInventory().clear(player.getInventory().getHeldItemSlot());
                } else {
                    item.setDurability((short) (d + 1));
                }
            }
        } else if (d == item.getType().getMaxDurability()) {
            player.getInventory().clear(player.getInventory().getHeldItemSlot());
        } else {
            item.setDurability((short) (d + 1));
        }
    }
    
    @EventHandler(priority=EventPriority.MONITOR)
    public void onBreak(BlockBreakEvent e) {
		if(e.isCancelled()) return;
    	Player p = e.getPlayer();
    	Block b = e.getBlock();
    	
    	HashMap<Integer, ItemStack> rest = new HashMap<Integer, ItemStack>();
    	
    	if(b.getType() == Material.STONE) {
    		ItemStack drop = b.getDrops().iterator().next();
    		b.breakNaturally(new ItemStack(Material.AIR));
    		recalculateDurability(p, p.getItemInHand());
    		if(pYml.getBoolean("players." + e.getPlayer().getName() + ".cobblestone")) rest.putAll(p.getInventory().addItem(drop));
    	}
		for (ItemStack l : rest.values())
		{
		    b.getWorld().dropItemNaturally(b.getLocation(), l);
		}
    }

}

 

Edytowane przez Nieaktywny
Odnośnik do komentarza
https://skript.pl/temat/21237-jak-usun%C4%85%C4%87-dropy/#findComment-144252
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ę...