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

  • Автор темы Автор темы 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(blockLoc, meta);
    }
    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(loc, meta);
    }
}
PHP:
public class BlockMap {
    static Map<Location, ItemMeta> blocks = new HashMap<>();

    public Map<Location, ItemMeta> getBlocks() {
        return blocks;
    }
    public void addKey(Location loc, ItemMeta meta){
        blocks.put(loc, meta);
    }
    public void removeKey(Location loc, ItemMeta meta){
        blocks.remove(loc, meta);
    }
    public boolean contKey(Location loc){
        return blocks.containsKey(loc);
    }
}

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