Войти или зарегистрироваться

Плагин [FUN] SuperNear v2.0 - Продвинутый /near [1.12.2]

Bezobrazie

Активный участник
Пользователь
Баллы
46
Имя в Minecraft
MySoulIsCry
Плагин усовершенствует обычный /near из Essentials. Что он может? Показывать игроков на дистанции от 1 до 1000 смотря какой вы Perm дадите той или иной группе.
Также отображает сторону где находится игрок.
​
upload_2021-7-4_17-35-7.pngupload_2021-7-4_17-35-28.png
Как его использовать?
  • Установите его в свою папку plugins​
  • Создайте перм и его радиус действия в конфиге​
  • Выдайте перм игроку​
  • Готово!​
Perms:​
near.usage - позволяет использовать команду /near
near.reload - позволяет перезагружать конфиг
near.hide - позволяет использовать команду /nearhide
near.invisibility - Вы невидимы для всех.
near.usage.position - позволяет использовать команду /nearposition

Команды:​
/near || /nt - Показывает игроков рядом с отображением стороны.
/near reload - Перезагрузка конфига.
/nearhide <Секунды> || /nth <Секунды> - позволяет скрыть себя из /near на некоторое время.(Также можно скрыть другого игрока написав в конце его ник.)
/nearposition || /ntp - Показывает игроков рядом с отображением координат.



​
Код:
[/LEFT]
PlayerMessage: '§b➣ §7%PlayerName% &c%Distance% &7'
Empty: '&7пусто'
NearMessage: '§7Игроки в радиусе §d%RADIUS%§7 блоков: '
NoPerm: '&cУ вас нет прав!'
position: 'X:&d%X% &7Y:&d%Y% &7Z:&d%Z%'
#ПОКАЗЫВАТЬ ЛИ ИГРОКОВ В ГМ 3
gamemode3: false
#ПОКАЗЫВАТЬ ЛИ ИГРОКОВ В НЕВИДИМОСТИ
invisibility: false
# РАСПОЛОГАТЬ ПЕРМИШОНЫ ПО ВОЗРАСТАНИЮ
# <НАЗВАНИЕ ПЕРМА (БЕЗ ТОЧКИ)>: <РАДИУС ЦЕЛЫМ ЧИСЛОМ>
# ПОСЛЕ СОЗДАНИЯ ПРОПИСЫВАЕМ /NEAR RELOAD И ВЫДАЕМ ИГРОКАМ ПЕРМЫ
perms:
  SuperNear100: 100
  SuperNear200: 200
  SuperNear300: 300
  SuperNear400: 400
  SuperNear500: 500
  SuperNear600: 600
Exception:
- Пусто...
[LEFT]
​
[16.06.2021] - v1.1 Проведена работа над оптимизацией кода.
[30.06.2021] - v1.2 Проведена работа над оптимизацией кода.
Немного изменил работу с конфигами чтобы лишний раз не нагружать сервер.(Пересоздайте кфг)
[4.07.2021] - v2.0 Добавлены команды /nearHide и /nearPosition.
Ура! Теперь есть отображение в какой стороне игрок.(Могут быть баги с отображением стороны. Они логируются в кфг строчкой "Exception". Скидывайте сюда если что).
Добавлены новые настройки в конфиг, пересоздайте его.
Добавлены сокращения команд.
СКАЧАТЬ + SRC
Принимаю
критику моего кода, мб где-то накосячил и тд
​
 
Последнее редактирование:
Зачем-то берешь свой плагин дважды. Main main можно убрать и оставить только Main plugin, добавив ему final.
PHP:
// L12
private Main plugin;
private Main main = (Main)Main.getPlugin(Main.class);

public Shop(Main main) {
    this.plugin = main;
}

@|Override
PHP:
// L19

public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {

Для построения строк следует пользоваться StringBuilder'ом.
PHP:
// L22
String near = new String();
// L42
near = near + Online.getName()+ ColourBracket +"(" + ColourDistanse + distanse(p.getLocation(), Online.getLocation()) + ColourBracket  + ") " ;

Опционально, строки стоит закэшировать и использовать ChatColor.translateAlternateColorCodes(char, String)
PHP:
// L26
String ColourBracket = main.getConfig().getString("ColourBracket").replace("&", "§");
String ColourDistanse = main.getConfig().getString("ColourDistanse").replace("&", "§");
String Empty = main.getConfig().getString("Empty").replace("&", "§");
// L35
String NearMessage = main.getConfig().getString("NearMessage").replace("&", "§").replace("%RADIUS%", rad+"");
// L53
String NoPerm = main.getConfig().getString("NoPerm").replace("&", "§");

Может делать больно серверу. Либо сделай через группы (взгляни как сделаны точки дома в Essentials), либо используй бинарный поиск.
PHP:
// L29
for(int radius = 1; radius <= 1000; radius++) {
    if(p.hasPermission("near." + radius)) {
        rad = radius;
    }

}

Непонятно, зачем это вообще, ибо Location#distance(Location) делает тоже самое
PHP:
// L70
public int distanse(Location loc1, Location loc2) {
    float Xentity = loc1.getBlockX();
    float Yentity = loc1.getBlockY();
    float Zentity = loc1.getBlockZ();
    float Xdamager = loc2.getBlockX();
    float Ydamager = loc2.getBlockY();
    float Zdamager = loc2.getBlockZ();
    float distanse = (float) Math.sqrt(Math.pow((Xentity - Xdamager), 2) + Math.pow((Yentity - Ydamager), 2) + Math.pow((Zentity - Zdamager), 2));
    return (int) distanse;
}

Для получения игроков в мире просто воспользуйся World#getPlayers(). Зачем здесь пустое поле после if? - простой перед проверкой добавь знак !, да и игроков можно просто сравнить p != Online (в идеале через итератор или for-i прервать поиск при обнаружении ищущего игрока, и продолжить поиск уже без этой проверки). Алсо подсчет дистанции следует сделать несколько иначе - сохранить результат Location#distance(Location) в переменную, и уже её использовать для сравнения и добавления в строку. В идеале нужно сравнивать Location#distanceSquared(Location) с квадратным радиусом, и лишь в случае успеха выводить корень для добавления в строку.
PHP:
// L36
for(Player Online : Bukkit.getOnlinePlayers()) {
    if(p.getWorld() == Online.getWorld()) {
        if(distanse(p.getLocation(), Online.getLocation()) <= rad) {
            if(p.getName().equalsIgnoreCase(Online.getName())) {

            }else {
                near = near + Online.getName()+ ColourBracket +"(" + ColourDistanse + distanse(p.getLocation(), Online.getLocation()) + ColourBracket  + ") " ;
            }
        }
    }
}

String#isEmpty()/StringBuilder#isEmpty()
PHP:
// L47
if(near.equalsIgnoreCase("")) {

else
PHP:
// L56
}
if(args.length == 1) {

Ну, и в общем не стоит называть переменные с большой буквы. Также не стоит называть переменные p, e (если только это не джинерики) и подобно, просто потому что это может вредить пониманию кода в будущем. Название класса команды не отражает его суть, да и в принципе команду не было большого смысла отделять от основного класса, ибо плагин только из неё по сути и состоит.
 
Зачем-то берешь свой плагин дважды. Main main можно убрать и оставить только Main plugin, добавив ему final.
PHP:
// L12
private Main plugin;
private Main main = (Main)Main.getPlugin(Main.class);

public Shop(Main main) {
    this.plugin = main;
}

@|Override
PHP:
// L19

public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {

Для построения строк следует пользоваться StringBuilder'ом.
PHP:
// L22
String near = new String();
// L42
near = near + Online.getName()+ ColourBracket +"(" + ColourDistanse + distanse(p.getLocation(), Online.getLocation()) + ColourBracket  + ") " ;

Опционально, строки стоит закэшировать и использовать ChatColor.translateAlternateColorCodes(char, String)
PHP:
// L26
String ColourBracket = main.getConfig().getString("ColourBracket").replace("&", "§");
String ColourDistanse = main.getConfig().getString("ColourDistanse").replace("&", "§");
String Empty = main.getConfig().getString("Empty").replace("&", "§");
// L35
String NearMessage = main.getConfig().getString("NearMessage").replace("&", "§").replace("%RADIUS%", rad+"");
// L53
String NoPerm = main.getConfig().getString("NoPerm").replace("&", "§");

Может делать больно серверу. Либо сделай через группы (взгляни как сделаны точки дома в Essentials), либо используй бинарный поиск.
PHP:
// L29
for(int radius = 1; radius <= 1000; radius++) {
    if(p.hasPermission("near." + radius)) {
        rad = radius;
    }

}

Непонятно, зачем это вообще, ибо Location#distance(Location) делает тоже самое
PHP:
// L70
public int distanse(Location loc1, Location loc2) {
    float Xentity = loc1.getBlockX();
    float Yentity = loc1.getBlockY();
    float Zentity = loc1.getBlockZ();
    float Xdamager = loc2.getBlockX();
    float Ydamager = loc2.getBlockY();
    float Zdamager = loc2.getBlockZ();
    float distanse = (float) Math.sqrt(Math.pow((Xentity - Xdamager), 2) + Math.pow((Yentity - Ydamager), 2) + Math.pow((Zentity - Zdamager), 2));
    return (int) distanse;
}

Для получения игроков в мире просто воспользуйся World#getPlayers(). Зачем здесь пустое поле после if? - простой перед проверкой добавь знак !, да и игроков можно просто сравнить p != Online (в идеале через итератор или for-i прервать поиск при обнаружении ищущего игрока, и продолжить поиск уже без этой проверки). Алсо подсчет дистанции следует сделать несколько иначе - сохранить результат Location#distance(Location) в переменную, и уже её использовать для сравнения и добавления в строку. В идеале нужно сравнивать Location#distanceSquared(Location) с квадратным радиусом, и лишь в случае успеха выводить корень для добавления в строку.
PHP:
// L36
for(Player Online : Bukkit.getOnlinePlayers()) {
    if(p.getWorld() == Online.getWorld()) {
        if(distanse(p.getLocation(), Online.getLocation()) <= rad) {
            if(p.getName().equalsIgnoreCase(Online.getName())) {

            }else {
                near = near + Online.getName()+ ColourBracket +"(" + ColourDistanse + distanse(p.getLocation(), Online.getLocation()) + ColourBracket  + ") " ;
            }
        }
    }
}

String#isEmpty()/StringBuilder#isEmpty()
PHP:
// L47
if(near.equalsIgnoreCase("")) {

else
PHP:
// L56
}
if(args.length == 1) {

Ну, и в общем не стоит называть переменные с большой буквы. Также не стоит называть переменные p, e (если только это не джинерики) и подобно, просто потому что это может вредить пониманию кода в будущем. Название класса команды не отражает его суть, да и в принципе команду не было большого смысла отделять от основного класса, ибо плагин только из неё по сути и состоит.
ух ёёёёёёё. Ну получается урыл.
 
Зачем-то берешь свой плагин дважды. Main main можно убрать и оставить только Main plugin, добавив ему final.
PHP:
// L12
private Main plugin;
private Main main = (Main)Main.getPlugin(Main.class);

public Shop(Main main) {
    this.plugin = main;
}

@|Override
PHP:
// L19

public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {

Для построения строк следует пользоваться StringBuilder'ом.
PHP:
// L22
String near = new String();
// L42
near = near + Online.getName()+ ColourBracket +"(" + ColourDistanse + distanse(p.getLocation(), Online.getLocation()) + ColourBracket  + ") " ;

Опционально, строки стоит закэшировать и использовать ChatColor.translateAlternateColorCodes(char, String)
PHP:
// L26
String ColourBracket = main.getConfig().getString("ColourBracket").replace("&", "§");
String ColourDistanse = main.getConfig().getString("ColourDistanse").replace("&", "§");
String Empty = main.getConfig().getString("Empty").replace("&", "§");
// L35
String NearMessage = main.getConfig().getString("NearMessage").replace("&", "§").replace("%RADIUS%", rad+"");
// L53
String NoPerm = main.getConfig().getString("NoPerm").replace("&", "§");

Может делать больно серверу. Либо сделай через группы (взгляни как сделаны точки дома в Essentials), либо используй бинарный поиск.
PHP:
// L29
for(int radius = 1; radius <= 1000; radius++) {
    if(p.hasPermission("near." + radius)) {
        rad = radius;
    }

}

Непонятно, зачем это вообще, ибо Location#distance(Location) делает тоже самое
PHP:
// L70
public int distanse(Location loc1, Location loc2) {
    float Xentity = loc1.getBlockX();
    float Yentity = loc1.getBlockY();
    float Zentity = loc1.getBlockZ();
    float Xdamager = loc2.getBlockX();
    float Ydamager = loc2.getBlockY();
    float Zdamager = loc2.getBlockZ();
    float distanse = (float) Math.sqrt(Math.pow((Xentity - Xdamager), 2) + Math.pow((Yentity - Ydamager), 2) + Math.pow((Zentity - Zdamager), 2));
    return (int) distanse;
}

Для получения игроков в мире просто воспользуйся World#getPlayers(). Зачем здесь пустое поле после if? - простой перед проверкой добавь знак !, да и игроков можно просто сравнить p != Online (в идеале через итератор или for-i прервать поиск при обнаружении ищущего игрока, и продолжить поиск уже без этой проверки). Алсо подсчет дистанции следует сделать несколько иначе - сохранить результат Location#distance(Location) в переменную, и уже её использовать для сравнения и добавления в строку. В идеале нужно сравнивать Location#distanceSquared(Location) с квадратным радиусом, и лишь в случае успеха выводить корень для добавления в строку.
PHP:
// L36
for(Player Online : Bukkit.getOnlinePlayers()) {
    if(p.getWorld() == Online.getWorld()) {
        if(distanse(p.getLocation(), Online.getLocation()) <= rad) {
            if(p.getName().equalsIgnoreCase(Online.getName())) {

            }else {
                near = near + Online.getName()+ ColourBracket +"(" + ColourDistanse + distanse(p.getLocation(), Online.getLocation()) + ColourBracket  + ") " ;
            }
        }
    }
}

String#isEmpty()/StringBuilder#isEmpty()
PHP:
// L47
if(near.equalsIgnoreCase("")) {

else
PHP:
// L56
}
if(args.length == 1) {

Ну, и в общем не стоит называть переменные с большой буквы. Также не стоит называть переменные p, e (если только это не джинерики) и подобно, просто потому что это может вредить пониманию кода в будущем. Название класса команды не отражает его суть, да и в принципе команду не было большого смысла отделять от основного класса, ибо плагин только из неё по сути и состоит.
Мои знания Java не настолько хороши, ну ниче щас буду гуглить что ты вообще сказал)
 
Добавил
Непонятно, зачем это вообще, ибо Location#distance(Location) делает тоже самое
Убрал, добавил метод distance
Для получения игроков в мире просто воспользуйся World#getPlayers()
Переписал
Зачем здесь пустое поле после if?
Убрал
да и игроков можно просто сравнить p != Online
Переписал
String#isEmpty()/StringBuilder#isEmpty()
Переписал
Добавил
////
Сделал все что понял.
 
Попробуешь сделать, чтобы показывалось, где игрок?
 
[30.06.2021] - v1.2 Проведена работа над оптимизацией кода.
Немного изменил работу с конфигами чтобы лишний раз не нагружать сервер.(Пересоздайте кфг)
Попробуешь сделать, чтобы показывалось, где игрок?
уже работаю над этим.
 
[30.06.2021] - v1.2 Проведена работа над оптимизацией кода.
Немного изменил работу с конфигами чтобы лишний раз не нагружать сервер.(Пересоздайте кфг)

уже работаю над этим.
если сделаешь, буду ооооооооооочень благодарен
 
Тем, что он заменяет все & на §
Как и должно быть, всё правильно. Но ответа я так и не услышал - почему это хуже?
Я контролирую сообщения и гарантирую, что знак "&" будет только в объявлении цвета.
 
Как и должно быть, всё правильно. Но ответа я так и не услышал - почему это хуже?
Я контролирую сообщения и гарантирую, что знак "&" будет только в объявлении цвета.
Ну так translateAlternateColorCodes заменяет знак только в том случае, если в результате замены будет цветовой код. Достаточно просто посмотреть код этих двух методов, чтобы понять их различие.
 
Нучто там с отображением игроков?
 
Выше отправил пару идей посмотри
Видел.
/near - показывает кто рядом, заменить на более короткую - /nt
Будет.
/ntp - Показывать координаты игрока
будет
/nts - Скрыть себя (с настройкой времени)

Допустим time:1h В течении часа тебя не видят в /near\/nt
Будет, но режим вкыл/выкл.
 
[4.07.2021] - v2.0 Добавлены команды /nearHide и /nearPosition.
Ура! Теперь есть отображение в какой стороне игрок.(Могут быть баги с отображением стороны. Они логируются в кфг строчкой "Exception". Скидывайте сюда если что).
Добавлены новые настройки в конфиг, пересоздайте его.
Добавлены сокращения команд.
 
Не понял как добавить пермишн в LuckPerms. Перепробовал все варианты, добавлял "SuperNear750" — не работало. Сделал "SuperNear.750", тоже не сработало. Написал уже по другому: "near.supernear750" — опять-же таки - не сработало. Подскажи, как правильно написать?
 
Назад
Верх