Как получить ник рандомного игрока на сервере?

Версия Minecraft
1.12.2
API
Forge
Как получить ник рандомного игрока на сервере? Уже видел тут такой вопрос,код из ответа не рабочий.
 

VeniVidiVici

Санта Барбарис
327
15
198
1. Получить список игроков
2. Взять из него случайное значение
3. Посмотреть на мой аватар
4. Если всё ещё трудности, то код ниже
Java:
// Наш сервер
MinecraftServer server = FMLCommonHandler.instance().getMinecraftServerInstance();
// Кол-во игроков на нём
int count = server.getPlayerList().getPlayers().size();
// Сугубо для понимания что такое rand
Random rand = new Random();
// Берём случайного
EntityPlayerMP player = server.getPlayerList().getPlayers().get(rand.nextInt(count));
// Получаем его ник
String name = player.getDisplayNameString();
 
1. Получить список игроков
2. Взять из него случайное значение
3. Посмотреть на мой аватар
4. Если всё ещё трудности, то код ниже
Java:
// Наш сервер
MinecraftServer server = FMLCommonHandler.instance().getMinecraftServerInstance();
// Кол-во игроков на нём
int count = server.getPlayerList().getPlayers().size();
// Сугубо для понимания что такое rand
Random rand = new Random();
// Берём случайного
EntityPlayerMP player = server.getPlayerList().getPlayers().get(rand.nextInt(count));
// Получаем его ник
String name = player.getDisplayNameString();
Я сделал все почти тоже самое, но получил bound must be positive, я уже стер код, скинуть не смогу. Там в еррей лист короче добавлялись игроки. Точнее, должны были добавляться, но не добавлялись, т.к сайз был равен нулю, отсюда и ошибка. В твоем (а теперь и моем тоже, НАШЕМ!) коде коунт == нулю видимо. А почему я не знаю
 
183
8
16
Не совсем понимаю, как может не работать.
Написал вот такой код (всё в одну строчку)
Java:
String name = FMLCommonHandler.instance().getMinecraftServerInstance().getPlayerList().getOnlinePlayerNames()[new Random().nextInt(FMLCommonHandler.instance().getMinecraftServerInstance().getPlayerList().getOnlinePlayerNames().length)];
Запихнул в ивент ломания блока (чисто для проверки) и добавил сообщение в чат
Java:
@Mod.EventBusSubscriber
public class EventHandler {
    @SubscribeEvent
    public static void lol(BlockEvent.BreakEvent event) {
        String name = FMLCommonHandler.instance().getMinecraftServerInstance().getPlayerList().getOnlinePlayerNames()[new Random().nextInt(FMLCommonHandler.instance().getMinecraftServerInstance().getPlayerList().getOnlinePlayerNames().length)];
        FMLCommonHandler.instance().getMinecraftServerInstance().getPlayerList().sendMessage(new TextComponentString(name));
    }
}
И всё работает
2021-12-13_00.08.29.png
Если расписать мой код, получится такой же, какой у @VeniVidiVici за исключением того, что вместо player.getDisplayNameString(); я использовал сразу масив имён getPlayerList().getOnlinePlayerNames()

Edit:
Расписал немного код для понятности:
Java:
// Автоматически регистрируеем слушателей событий
@Mod.EventBusSubscriber
public class EventHandler {
    // Подписываемся на событие ломания блока
    @SubscribeEvent
    public static void lol(BlockEvent.BreakEvent event) {
        // Получаем сервер
        MinecraftServer server = FMLCommonHandler.instance().getMinecraftServerInstance();
        // Получаем массив имён игроков, которые сейчас онлайн на сервере
        String[] names = server.getPlayerList().getOnlinePlayerNames();
        // Создаём генератор случайных чисел
        Random random = new Random();
        // Получаем длину массива имён
        int size = names.length;
        // Получаем случайное имя из массива
        String name = names[random.nextInt(size)];
        // Отправляем имя всем игрокам
        server.getPlayerList().sendMessage(new TextComponentString(name));
    }
}
 
Последнее редактирование:

VeniVidiVici

Санта Барбарис
327
15
198
Если расписать мой код, получится такой же, какой у @VeniVidiVici за исключением того, что вместо player.getDisplayNameString(); я использовал сразу масив имён getPlayerList().getOnlinePlayerNames()
Так даже корректней, да
С днем нуллпоинтера на 4 строчке!!!
Рекомендую сюда заглянуть: MCreator - The Best Minecraft Mod Maker Ever
Там меньше надо думать
 
Не совсем понимаю, как может не работать.
Написал вот такой код (всё в одну строчку)
Java:
String name = FMLCommonHandler.instance().getMinecraftServerInstance().getPlayerList().getOnlinePlayerNames()[new Random().nextInt(FMLCommonHandler.instance().getMinecraftServerInstance().getPlayerList().getOnlinePlayerNames().length)];
Запихнул в ивент ломания блока (чисто для проверки) и добавил сообщение в чат
Java:
@Mod.EventBusSubscriber
public class EventHandler {
    @SubscribeEvent
    public static void lol(BlockEvent.BreakEvent event) {
        String name = FMLCommonHandler.instance().getMinecraftServerInstance().getPlayerList().getOnlinePlayerNames()[new Random().nextInt(FMLCommonHandler.instance().getMinecraftServerInstance().getPlayerList().getOnlinePlayerNames().length)];
        FMLCommonHandler.instance().getMinecraftServerInstance().getPlayerList().sendMessage(new TextComponentString(name));
    }
}
И всё работает Если расписать мой код, получится такой же, какой у @VeniVidiVici за исключением того, что вместо player.getDisplayNameString(); я использовал сразу масив имён getPlayerList().getOnlinePlayerNames()

Edit:
Расписал немного код для понятности:
Java:
// Автоматически регистрируеем слушателей событий
@Mod.EventBusSubscriber
public class EventHandler {
    // Подписываемся на событие ломания блока
    @SubscribeEvent
    public static void lol(BlockEvent.BreakEvent event) {
        // Получаем сервер
        MinecraftServer server = FMLCommonHandler.instance().getMinecraftServerInstance();
        // Получаем массив имён игроков, которые сейчас онлайн на сервере
        String[] names = server.getPlayerList().getOnlinePlayerNames();
        // Создаём генератор случайных чисел
        Random random = new Random();
        // Получаем длину массива имён
        int size = names.length;
        // Получаем случайное имя из массива
        String name = names[random.nextInt(size)];
        // Отправляем имя всем игрокам
        server.getPlayerList().sendMessage(new TextComponentString(name));
    }
}
String name = FMLCommonHandler.instance().getMinecraftServerInstance().getPlayerList().getOnlinePlayerNames()[new Random().nextInt(FMLCommonHandler.instance().getMinecraftServerInstance().getPlayerList().getOnlinePlayerNames().length)]; - нуллпоинтер как в ивенте, так и без него. Я не знаю почему.
 

will0376

Токсичная личность
2,079
55
585
Сверху