Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно. Вам необходимо обновить браузер или попробовать использовать другой.
ВопросЕсть ли что-то похожее, или идеи для такой же реализации
Вам необходимо зарегистрироваться для просмотра изображений-вложений
Ищу плагин который может реализовать что-то похожее, коротко говоря, он выводит уведомление в 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;
}
Здесь нужно импортировать само 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 он уже есть...
Вот джарник, если интересно. Не забудьте установить саму библиотеку как плагин.
Здесь нужно импортировать само 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. Самая, наверное, главная трудность - получить имя предмета, в соответствии с локализацией игрока (или сервера). Благо, это можно сделать с помощью NMS или с помощью различный API. Я в своем примере буду использовать это АПИ -