Сохранение моба при поломке спавнера

Dedik_

Пользователь
Сообщения
66
Всех приветствую, пишу плагин на кирку которая может ломать спавнер и сохранять моба внутри. Все сделал кроме сохранение моба внутри, как это сделать? (Название кирки берётся из конфига)
Java:
@EventHandler
public void onBlockBreakEvent(BlockBreakEvent e) {
    Block block = e.getBlock();
    Player player = e.getPlayer();
    Material tool = player.getInventory().getItemInMainHand().getType();

    if (block.getType() == Material.SPAWNER && tool == Material.GOLDEN_PICKAXE) {
        ItemStack itemInHand = player.getInventory().getItemInMainHand();
        ItemMeta itemMeta = itemInHand.getItemMeta();

        if (itemMeta != null && itemMeta.hasDisplayName()) {
            String displayName = itemMeta.getDisplayName();

            if (displayName.equals(HexUtil.translate(this.getConfig().getString("pickaxe_jake.name")))) {
                CreatureSpawner spawner = (CreatureSpawner) block.getState();
                EntityType entityType = spawner.getSpawnedType();

                NamespacedKey key = new NamespacedKey(this, "spawned_type");
                spawner.getPersistentDataContainer().set(key, PersistentDataType.STRING, entityType.toString());
                spawner.update();

                ItemStack spawnerItem = new ItemStack(Material.SPAWNER);
                ItemMeta spawnerMeta = spawnerItem.getItemMeta();
                spawnerMeta.setDisplayName(HexUtil.translate(this.getConfig().getString("pickaxe_jake.spawner_name")));
                spawnerItem.setItemMeta(spawnerMeta);

                player.getInventory().addItem(spawnerItem);
                player.getInventory().removeItem(itemInHand);

                block.setType(Material.AIR);
            }
        }
    }
}
 
сохранять моба внутри
???

NamespacedKey key = new NamespacedKey(this, "spawned_type");
spawner.getPersistentDataContainer().set(key, PersistentDataType.STRING, entityType.toString());
spawner.update();
Вот же сохраняете. А теперь в BlockPlaceEvent читаете этот ключ и ставите нужный вам тип сущности через CreatureSpawner
 
Не очень понял, что ты сделать хочешь. Если ты хочешь сохранять энтити в спавнере, то просто установи мету. Что-то типа такого:

Java:
    @EventHandler
    public void onBlockBreak(BlockBreakEvent e) {
        PlayerInventory inventory = e.getPlayer().getInventory();
        ItemStack itemInMainHand = inventory.getItemInMainHand();

        if (itemInMainHand.getType() != Material.GOLDEN_PICKAXE) return;

        Block block = e.getBlock();
        if (block.getType() != Material.SPAWNER) return;

        ItemStack spawnerItem = new ItemStack(Material.SPAWNER);
        BlockStateMeta blockStateMeta = (BlockStateMeta) spawnerItem.getItemMeta();

        blockStateMeta.setBlockState(block.getState());
        spawnerItem.setItemMeta(blockStateMeta);

        inventory.addItem(spawnerItem);
    }
 
А как ставить нужный тип сущности?
Java:
CreatureSpawner creatureSpawner = (CreatureSpawner) placedBlock.getState();
creatureSpawner.setSpawnedType(EntityType.valueOf(Получение из PersistentDataContainer));
creatureSpawner.update();
 
Все вставил, но почему то не работает. Ставлю спавнер и там свинья если я добывал спавнер скелетов

Java:
    @EventHandler
    public void onBlockBreakEvent(BlockBreakEvent e) {
        Block block = e.getBlock();
        Player player = e.getPlayer();
        Material tool = player.getInventory().getItemInMainHand().getType();

        if (block.getType() == Material.SPAWNER && tool == Material.GOLDEN_PICKAXE) {
            ItemStack itemInHand = player.getInventory().getItemInMainHand();
            ItemMeta itemMeta = itemInHand.getItemMeta();

            if (itemMeta != null && itemMeta.hasDisplayName()) {
                String displayName = itemMeta.getDisplayName();

                if (displayName.equals(HexUtil.translate(this.getConfig().getString("pickaxe_jake.name")))) {
                    CreatureSpawner spawner = (CreatureSpawner) block.getState();
                    EntityType entityType = spawner.getSpawnedType();

                    NamespacedKey key = new NamespacedKey(this, "spawned_type");
                    spawner.getPersistentDataContainer().set(key, PersistentDataType.STRING, entityType.toString());

                    Block placedBlock = block;
                    CreatureSpawner creatureSpawner = (CreatureSpawner) placedBlock.getState();
                    creatureSpawner.setSpawnedType(EntityType.valueOf(spawner.getPersistentDataContainer().get(key, PersistentDataType.STRING)));
                    creatureSpawner.update();

                    ItemStack spawnerItem = new ItemStack(Material.SPAWNER);
                    ItemMeta spawnerMeta = spawnerItem.getItemMeta();
                    spawnerMeta.setDisplayName(HexUtil.translate(this.getConfig().getString("pickaxe_jake.spawner_name")));
                    spawnerItem.setItemMeta(spawnerMeta);

                    player.getInventory().addItem(spawnerItem);
                    player.getInventory().removeItem(itemInHand);

                    block.setType(Material.AIR);
                }
            }
        }
    }
 
Block placedBlock = block; CreatureSpawner creatureSpawner = (CreatureSpawner) placedBlock.getState(); creatureSpawner.setSpawnedType(EntityType.valueOf(spawner.getPersistentDataContainer().get(key, PersistentDataType.STRING))); creatureSpawner.update();
А зачем это в BlockBreakEvent? Я же написал, что это должно быть в BlockPlaceEvent.
 
А почему мне пишет что тут ошибка?
Java:
    @EventHandler
    public void onBlockPlaceEvent(BlockPlaceEvent e) {
        Block placedBlock = e.getBlock();
        Player player = e.getPlayer();

        if (placedBlock.getType() == Material.SPAWNER) {
            NamespacedKey key = new NamespacedKey(this, "spawned_type");

            if (placedBlock.getPersistentDataContainer().has(key, PersistentDataType.STRING)) {
                CreatureSpawner creatureSpawner = (CreatureSpawner) placedBlock.getState();
                String entityTypeString = placedBlock.getPersistentDataContainer().get(key, PersistentDataType.STRING);
                EntityType entityType = EntityType.valueOf(entityTypeString);
                creatureSpawner.setSpawnedType(entityType);
                creatureSpawner.update();
            }
        }
    }
Вам необходимо зарегистрироваться для просмотра изображений-вложений
 
Последнее редактирование:
Сделал все так, но почему-то не робит, вот код:

Java:
    @EventHandler
    public void onBlockBreakEvent(BlockBreakEvent e) {
        Block block = e.getBlock();
        Player player = e.getPlayer();
        Material tool = player.getInventory().getItemInMainHand().getType();

        if (block.getType() == Material.SPAWNER && tool == Material.GOLDEN_PICKAXE) {
            ItemStack itemInHand = player.getInventory().getItemInMainHand();
            ItemMeta itemMeta = itemInHand.getItemMeta();

            if (itemMeta != null && itemMeta.hasDisplayName()) {
                String displayName = itemMeta.getDisplayName();

                if (displayName.equals(HexUtil.translate(this.getConfig().getString("pickaxe_jake.name")))) {
                    CreatureSpawner spawner = (CreatureSpawner) block.getState();
                    EntityType entityType = spawner.getSpawnedType();

                    NamespacedKey key = new NamespacedKey(this, "spawned_type");
                    spawner.getPersistentDataContainer().set(key, PersistentDataType.STRING, entityType.toString());

                    Block placedBlock = block;
                    CreatureSpawner creatureSpawner = (CreatureSpawner) placedBlock.getState();
                    creatureSpawner.setSpawnedType(EntityType.valueOf(spawner.getPersistentDataContainer().get(key, PersistentDataType.STRING)));
                    creatureSpawner.update();

                    ItemStack spawnerItem = new ItemStack(Material.SPAWNER);
                    ItemMeta spawnerMeta = spawnerItem.getItemMeta();
                    spawnerMeta.setDisplayName(HexUtil.translate(this.getConfig().getString("pickaxe_jake.spawner_name")));
                    spawnerItem.setItemMeta(spawnerMeta);

                    player.getInventory().addItem(spawnerItem);
                    player.getInventory().removeItem(itemInHand);

                    block.setType(Material.AIR);
                }
            }
        }
    }

    @EventHandler
    public void onSpawnerPlace(BlockPlaceEvent event) {
        final ItemStack hand = event.getItemInHand();
        if (hand.getType() == Material.AIR) return;

        ItemMeta meta = hand.getItemMeta();
        NamespacedKey key = new NamespacedKey(this, "SPAWNER_ENTITY_TYPE");

        if (!meta.getPersistentDataContainer().has(key, PersistentDataType.STRING)) return;

        EntityType type = EntityType.valueOf(meta.getPersistentDataContainer().get(key, PersistentDataType.STRING));

        final Block placedBlock = event.getBlockPlaced();

        if (placedBlock.getType() != Material.SPAWNER)
            placedBlock.setType(Material.SPAWNER);

        CreatureSpawner creatureSpawner = (CreatureSpawner) placedBlock.getState();
        creatureSpawner.setSpawnedType(type);
        creatureSpawner.update();
    }
 
Проверяйте то, что вы пишите, прежде чем проверять работу кода (!!!)
В BlockBreakEvent вы используете NamespacedKey(this, "spawned_type");, а в BlockPlaceEvent уже NamespacedKey(this, "SPAWNER_ENTITY_TYPE");
 
Назад
Сверху Снизу