1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите Сохранение меты блока

Тема в разделе "Разработка плагинов для новичков", создана пользователем ToBlEzZ, 17 фев 2021.

  1. Автор темы
    ToBlEzZ

    ToBlEzZ Активный участник Пользователь

    Баллы:
    76
    Всем привет!
    Делаю сохранение, устанавливаемого игроком блока, чтобы после разрушения оного дропом был тот же блок, что был поставлен.
    Пример:
    Игрок переименовывает булыжник в "булыга" и затем ставит его. Потом он его ломает и ему дропается его "булыга"

    В процессе, появилось несколько вопросов:
    1. (PlaceEvent) в таком виде сохраняется мета айтема, который держал игрок в руке во время установки? Или "базовая" мета блока?
    2. (BreakEvent) Как получить дроп, чтобы дать ему мету?
    3. Сильно ли будет грузить сервер сделанный мною Map, если сохранять в него только блоки с кастомной метой?

    PHP:
    public class blockPlaceEvent implements Listener {
     
    BlockMap blockMap = new BlockMap();

    @
    EventHandler
    public void onPlaceBlock(BlockPlaceEvent e) {
        
    Player p e.getPlayer();
        
    ItemMeta meta e.getItemInHand().getItemMeta();
        if (
    uniqueMeta(meta)) {
            
    Location blockLoc e.getBlock().getLocation();
            
    blockMap.addKey(blockLocmeta);
        }
        
    giver(p); //Выдаёт блок с метой
    }

    private 
    boolean uniqueMeta(ItemMeta meta) {
        return 
    meta.hasLore() || meta.hasDisplayName();
    }
    PHP:
    BlockMap blockMap = new BlockMap();
    @
    EventHandler
    public void onBlockBreak(BlockBreakEvent e){
        
    Location loc e.getBlock().getLocation();
        if(
    blockMap.contKey(loc)){ //Всегда false
            
    e.setDropItems(false);
            
    ItemMeta meta blockMap.getBlocks().get(loc);
            
    ItemStack drop = new ItemStack(e.getBlock().getType());
            
    drop.setItemMeta(meta);
            
    e.getBlock().getWorld().dropItemNaturally(loc, new ItemStack(drop));
            
    blockMap.removeKey(locmeta);
        }
    }
    PHP:
    public class BlockMap {
        static 
    Map<LocationItemMetablocks = new HashMap<>();

        public 
    Map<LocationItemMetagetBlocks() {
            return 
    blocks;
        }
        public 
    void addKey(Location locItemMeta meta){
            
    blocks.put(locmeta);
        }
        public 
    void removeKey(Location locItemMeta meta){
            
    blocks.remove(locmeta);
        }
        public 
    boolean contKey(Location loc){
            return 
    blocks.containsKey(loc);
        }
    }

    upd:
    - Поправил получение меты для Map (PlaceEvent). Теперь бы понять как получить дропаемый, при разрушенни, блок
    - Добавил дополнительные методы во все классы.[!] Понял, что Map blocks уникален для ивентов. Как сделать его общим? (Сделал его статичным)
    - Заработало! Кому нужно, можете использовать мой код. Критика кода приветствуется
     
    Последнее редактирование: 17 фев 2021

Поделиться этой страницей