Вопрос Есть ли что-то похожее, или идеи для такой же реализации

As1sa1

Пользователь
Сообщения
97
Решения
5
Вам необходимо зарегистрироваться для просмотра изображений-вложений


Ищу плагин который может реализовать что-то похожее, коротко говоря, он выводит уведомление в ActionBar о количестве добытого блока и выводит имеющиеся количество в инвентаре.

Пытался сам что-то такое сделать, но я слаб ещё в плагинописании, поэтому не справился.
 
Решение
Сделал что-то похожее, опишу принцип действия.

1. Самая, наверное, главная трудность - получить имя предмета, в соответствии с локализацией игрока (или сервера). Благо, это можно сделать с помощью NMS или с помощью различных API. Я в своем примере буду использовать это АПИ -
2. С помощью слушателя событий, сделать триггер на ломание блока.
3. Все имеющиеся данные совместить в одно целое. Имя предмета, кол-во добытых блоков и имеющихся в инвентаре.
4. С помощью Spigot API или другого иного (Actionbar API и т.д) вывести сообщение игроку.

Специально вам накидал рабочий код с учетом всех пунктов выше. Единственное что не сделано - кол-во добытых блоков, т.к я не особо понимаю что это значит...
Сделал что-то похожее, опишу принцип действия.

1. Самая, наверное, главная трудность - получить имя предмета, в соответствии с локализацией игрока (или сервера). Благо, это можно сделать с помощью NMS или с помощью различных API. Я в своем примере буду использовать это АПИ -
2. С помощью слушателя событий, сделать триггер на ломание блока.
3. Все имеющиеся данные совместить в одно целое. Имя предмета, кол-во добытых блоков и имеющихся в инвентаре.
4. С помощью Spigot API или другого иного (Actionbar API и т.д) вывести сообщение игроку.

Специально вам накидал рабочий код с учетом всех пунктов выше. Единственное что не сделано - кол-во добытых блоков, т.к я не особо понимаю что это значит. Это кол-вол за текущую сессию, за время, не поднятого или что-то другое? В общем я думаю этого и так будет достаточно, чтобы написать готовую версию


Java:
    private final String OUTPUT_STYLE = "&a+ &7{item} - &ax{current} &7(&a{total}&7)";

    @EventHandler
    public void onBlockBreak(BlockBreakEvent event) {

        Player player = event.getPlayer();
        Material material = event.getBlock().getDrops().stream().findFirst().get().getType();

        int amount = itemCount(player, material);

        String itemTranslation = Translate.getMaterial(player, material);

        String output = ChatColor.translateAlternateColorCodes('&', OUTPUT_STYLE);
        output = output.replaceAll("\\{item}", itemTranslation);
        output = output.replaceAll("\\{current}","0");
        output = output.replaceAll("\\{total}", String.valueOf(amount));

        player.spigot().sendMessage(ChatMessageType.ACTION_BAR, new TextComponent(output));

    }

    public int itemCount(Player player, Material material) {
        int count = 0;
        PlayerInventory inv = player.getInventory();
        for (ItemStack is : inv.all(material).values()) {
            if (is != null && is.getType() == material) {
                count = count + is.getAmount();
            }
        }
        return count;
    }
 
Последнее редактирование:
Сделал что-то похожее, опишу принцип действия.

1. Самая, наверное, главная трудность - получить имя предмета, в соответствии с локализацией игрока (или сервера). Благо, это можно сделать с помощью NMS или с помощью различный API. Я в своем примере буду использовать это АПИ -
2. С помощью слушателя событий, сделать триггер на ломание блока.
3. Все имеющиеся данные совместить в одно целое. Имя предмета, кол-во добытых блоков и имеющихся в инвентаре.
4. С помощью Spigot API или другого иного (Actionbar API и т.д) вывести сообщение игроку.

Специально вам накидал рабочий код с учетом всех пунктов выше. Единственное что не сделано - кол-во добытых блоков, т.к я не особо понимаю что это значит. Это кол-вол за текущую сессию, за время, не поднятого или что-то другое? В общем я думаю этого и так будет достаточно, чтобы написать готовую версию


Java:
    private final String OUTPUT_STYLE = "&a+ &7{item} - &ax{current} &7(&a{total}&7)";

    @EventHandler
    public void onBlockBreak(BlockBreakEvent event) {

        Player player = event.getPlayer();
        Material material = event.getBlock().getDrops().stream().findFirst().get().getType();

        int amount = itemCount(player, material);

        String itemTranslation = Translate.getMaterial(player, material);

        String output = ChatColor.translateAlternateColorCodes('&', OUTPUT_STYLE);
        output = output.replaceAll("\\{item}", itemTranslation);
        output = output.replaceAll("\\{current}","0");
        output = output.replaceAll("\\{total}", String.valueOf(amount));

        player.spigot().sendMessage(ChatMessageType.ACTION_BAR, new TextComponent(output));

    }

    public int itemCount(Player player, Material material) {
        int count = 0;
        PlayerInventory inv = player.getInventory();
        for (ItemStack is : inv.all(material).values()) {
            if (is != null && is.getType() == material) {
                count = count + is.getAmount();
            }
        }
        return count;
    }
Благодарю за подробный ответ и помощь, вы очень помогли мне. Отмечу как лучший ответ, ибо ожидал что мне никто показывать код за добрую душу не будет...
 
Сделал что-то похожее, опишу принцип действия.

1. Самая, наверное, главная трудность - получить имя предмета, в соответствии с локализацией игрока (или сервера). Благо, это можно сделать с помощью NMS или с помощью различный API. Я в своем примере буду использовать это АПИ -
2. С помощью слушателя событий, сделать триггер на ломание блока.
3. Все имеющиеся данные совместить в одно целое. Имя предмета, кол-во добытых блоков и имеющихся в инвентаре.
4. С помощью Spigot API или другого иного (Actionbar API и т.д) вывести сообщение игроку.

Специально вам накидал рабочий код с учетом всех пунктов выше. Единственное что не сделано - кол-во добытых блоков, т.к я не особо понимаю что это значит. Это кол-вол за текущую сессию, за время, не поднятого или что-то другое? В общем я думаю этого и так будет достаточно, чтобы написать готовую версию


Java:
    private final String OUTPUT_STYLE = "&a+ &7{item} - &ax{current} &7(&a{total}&7)";

    @EventHandler
    public void onBlockBreak(BlockBreakEvent event) {

        Player player = event.getPlayer();
        Material material = event.getBlock().getDrops().stream().findFirst().get().getType();

        int amount = itemCount(player, material);

        String itemTranslation = Translate.getMaterial(player, material);

        String output = ChatColor.translateAlternateColorCodes('&', OUTPUT_STYLE);
        output = output.replaceAll("\\{item}", itemTranslation);
        output = output.replaceAll("\\{current}","0");
        output = output.replaceAll("\\{total}", String.valueOf(amount));

        player.spigot().sendMessage(ChatMessageType.ACTION_BAR, new TextComponent(output));

    }

    public int itemCount(Player player, Material material) {
        int count = 0;
        PlayerInventory inv = player.getInventory();
        for (ItemStack is : inv.all(material).values()) {
            if (is != null && is.getType() == material) {
                count = count + is.getAmount();
            }
        }
        return count;
    }
инфа о дропе будет недостоверная, лучше юзать BlockDropItemEvent
 
Будьте осторожны с рекомендациями этого пользователя.
а что тут сделать надо?

Вам необходимо зарегистрироваться для просмотра изображений-вложений
Здесь нужно импортировать само API. Можно это сделать несколькими способами:

1. Если вы используете Maven, то удобным импортом через гитхаб является JitPack ( ). Хотя в самом гитхабе библиотеки есть свой источник импорта, он не работает. Так вот, после захода на JitPack туда вставляете ссылку на гитхаб и нажимаете Look Up. Из списка версий выбираете нужную (Get it) и спускаетесь чуть ниже. Далее видите следующее:
Вам необходимо зарегистрироваться для просмотра изображений-вложений

Из это выбираем Maven и копируем содержимое сверху в ваши репозитории, а содержимое снизу в ваши зависимости. Перезагружаете Maven и радуетесь (если получилось конечно).
2. Gradle - То же самое, кроме того, что вместо Maven нужно из списка выбрать Gradle.
3. Если же ничего из вышесказанного, то нужно будет импортировать jar-файл в проект. Идем на , там скачиваем . Идем в студию и испортируем (думаю это найдете как сделать).

После подключения библиотеки, нужно добавить в ваш plugin.yml следующую строчку: depend: [Locale-API], так же кидаем этот джарник
в папку Plugins вашего сервера. Если всё сделано правильно - у вашей студии не будет красных подчеркиваний и т.д.

Что касается плагина, то его я доделал полностью и вот исходник:
Java:
package ваш_пакет;

import de.unpixelt.locale.Translate;
import net.md_5.bungee.api.ChatMessageType;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.GameMode;
import org.bukkit.Material;
import org.bukkit.entity.Item;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockDropItemEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
import org.bukkit.plugin.java.JavaPlugin;

import java.util.HashMap;
import java.util.List;
import java.util.UUID;

public final class ActionbarBlockBreakInfo extends JavaPlugin implements Listener {

    private final String OUTPUT_STYLE = "&a+ &7{item} - &ax{current} &7(&a{total}&7)";
    private final int TIMEOUT = 5;

    private HashMap<UUID, LastBlocksInfo> timeoutMap = new HashMap<>();

    @EventHandler
    public void onBlockBreak(BlockDropItemEvent event) {

        Player player = event.getPlayer();

        if (event.isCancelled()) {
            return;
        }

        if (player.getGameMode() != GameMode.SURVIVAL) {
            return;
        }

        if (!timeoutMap.containsKey(player.getUniqueId())) {
            timeoutMap.put(player.getUniqueId(), new LastBlocksInfo());
        }

        LastBlocksInfo info = timeoutMap.get(player.getUniqueId());
        long secondsLeft = ((timeoutMap.get(player.getUniqueId()).getLastTime()/1000) + TIMEOUT) - (System.currentTimeMillis()/1000);

        if (secondsLeft < 0) {
            return;
        }

        List<Item> drops = event.getItems();

        if (drops.size() == 0) {
            return;
        }

        Material material = drops.get(0).getItemStack().getType();
        int amount = itemCount(player, material);

        if (info.getMaterial() != material) {
            info.setCount(0);
        }

        info.setCount(info.getCount() + 1);
        info.setLastTime(System.currentTimeMillis());
        info.setMaterial(material);

        String itemTranslation = Translate.getMaterial(player, material);

        String output = ChatColor.translateAlternateColorCodes('&', OUTPUT_STYLE);
        output = output.replaceAll("\\{item}", itemTranslation);
        output = output.replaceAll("\\{current}", String.valueOf(info.getCount()));
        output = output.replaceAll("\\{total}", String.valueOf(amount));

        player.spigot().sendMessage(ChatMessageType.ACTION_BAR, new TextComponent(output));

    }

    public int itemCount(Player player, Material material) {
        int count = 0;
        PlayerInventory inv = player.getInventory();
        for (ItemStack is : inv.all(material).values()) {
            if (is != null && is.getType() == material) {
                count = count + is.getAmount();
            }
        }
        return count;
    }


    @Override
    public void onEnable() {
        Bukkit.getPluginManager().registerEvents(this, this);
    }

}

Спасибо Metalloprokat, за ивент BlockDropItemEvent. Не знал о его существовании. Кстати в 1.13 его нету, а в 1.13.2 он уже есть...
Вот джарник, если интересно. Не забудьте установить саму библиотеку как плагин.
 

Вложения

  • ActionbarBlockBreakInfo-1.0-SNAPSHOT.jar
    6 KB · Просмотры: 1
Здесь нужно импортировать само API. Можно это сделать несколькими способами:

1. Если вы используете Maven, то удобным импортом через гитхаб является JitPack ( ). Хотя в самом гитхабе библиотеки есть свой источник импорта, он не работает. Так вот, после захода на JitPack туда вставляете ссылку на гитхаб и нажимаете Look Up. Из списка версий выбираете нужную (Get it) и спускаетесь чуть ниже. Далее видите следующее:
Вам необходимо зарегистрироваться для просмотра изображений-вложений

Из это выбираем Maven и копируем содержимое сверху в ваши репозитории, а содержимое снизу в ваши зависимости. Перезагружаете Maven и радуетесь (если получилось конечно).
2. Gradle - То же самое, кроме того, что вместо Maven нужно из списка выбрать Gradle.
3. Если же ничего из вышесказанного, то нужно будет импортировать jar-файл в проект. Идем на , там скачиваем . Идем в студию и испортируем (думаю это найдете как сделать).

После подключения библиотеки, нужно добавить в ваш plugin.yml следующую строчку: depend: [Locale-API], так же кидаем этот джарник
в папку Plugins вашего сервера. Если всё сделано правильно - у вашей студии не будет красных подчеркиваний и т.д.

Что касается плагина, то его я доделал полностью и вот исходник:
Java:
package ваш_пакет;

import de.unpixelt.locale.Translate;
import net.md_5.bungee.api.ChatMessageType;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.GameMode;
import org.bukkit.Material;
import org.bukkit.entity.Item;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockDropItemEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
import org.bukkit.plugin.java.JavaPlugin;

import java.util.HashMap;
import java.util.List;
import java.util.UUID;

public final class ActionbarBlockBreakInfo extends JavaPlugin implements Listener {

    private final String OUTPUT_STYLE = "&a+ &7{item} - &ax{current} &7(&a{total}&7)";
    private final int TIMEOUT = 5;

    private HashMap<UUID, LastBlocksInfo> timeoutMap = new HashMap<>();

    @EventHandler
    public void onBlockBreak(BlockDropItemEvent event) {

        Player player = event.getPlayer();

        if (event.isCancelled()) {
            return;
        }

        if (player.getGameMode() != GameMode.SURVIVAL) {
            return;
        }

        if (!timeoutMap.containsKey(player.getUniqueId())) {
            timeoutMap.put(player.getUniqueId(), new LastBlocksInfo());
        }

        LastBlocksInfo info = timeoutMap.get(player.getUniqueId());
        long secondsLeft = ((timeoutMap.get(player.getUniqueId()).getLastTime()/1000) + TIMEOUT) - (System.currentTimeMillis()/1000);

        if (secondsLeft < 0) {
            return;
        }

        List<Item> drops = event.getItems();

        if (drops.size() == 0) {
            return;
        }

        Material material = drops.get(0).getItemStack().getType();
        int amount = itemCount(player, material);

        if (info.getMaterial() != material) {
            info.setCount(0);
        }

        info.setCount(info.getCount() + 1);
        info.setLastTime(System.currentTimeMillis());
        info.setMaterial(material);

        String itemTranslation = Translate.getMaterial(player, material);

        String output = ChatColor.translateAlternateColorCodes('&', OUTPUT_STYLE);
        output = output.replaceAll("\\{item}", itemTranslation);
        output = output.replaceAll("\\{current}", String.valueOf(info.getCount()));
        output = output.replaceAll("\\{total}", String.valueOf(amount));

        player.spigot().sendMessage(ChatMessageType.ACTION_BAR, new TextComponent(output));

    }

    public int itemCount(Player player, Material material) {
        int count = 0;
        PlayerInventory inv = player.getInventory();
        for (ItemStack is : inv.all(material).values()) {
            if (is != null && is.getType() == material) {
                count = count + is.getAmount();
            }
        }
        return count;
    }


    @Override
    public void onEnable() {
        Bukkit.getPluginManager().registerEvents(this, this);
    }

}

Спасибо Metalloprokat, за ивент BlockDropItemEvent. Не знал о его существовании. Кстати в 1.13 его нету, а в 1.13.2 он уже есть...
Вот джарник, если интересно. Не забудьте установить саму библиотеку как плагин.
есть одна проблема, он только 1 раз срабатывает.
 

Вложения

  • ActionbarBlockBreakInfo-1.0-SNAPSHOT.jar
    6.2 KB · Просмотры: 3
1. Самая, наверное, главная трудность - получить имя предмета, в соответствии с локализацией игрока (или сервера). Благо, это можно сделать с помощью NMS или с помощью различный API. Я в своем примере буду использовать это АПИ -
Это ещё можно сделать через minimessage, типа You should get a <lang:block.minecraft.diamond_block>!
 
Назад
Сверху Снизу