- Поддерживаемые версии
- 1.8
- 1.9
- 1.10
- 1.11
- 1.12
- 1.13
- 1.14
- 1.15
- 1.16
Если Вам так хотелось отловить игроков с Forge или Fabric, но не знали как это сделать - Вы попали по адресу.
Зачем это нужно? Можно составить список игроков - потенциальных читеров, тем более что сейчас читы все чаще выходят как модификации для Forge/Fabric. Если античит ругается на игрока, а он еще и с модифицированным клиентом - это повод устроить ему проверку. Но не переусердствуйте, а то так легко распугать весь онлайн.
Зачем это нужно? Можно составить список игроков - потенциальных читеров, тем более что сейчас читы все чаще выходят как модификации для Forge/Fabric. Если античит ругается на игрока, а он еще и с модифицированным клиентом - это повод устроить ему проверку. Но не переусердствуйте, а то так легко распугать весь онлайн.
Java:
public class BrandDetector extends JavaPlugin {
private String channel = "MC|Brand";
@Override
public void onEnable() {
/**
* Определяем версию сервера
* (опционально)
*/
String version = getServer().getClass().getPackage().getName().split("\\.")[3].split("_")[1];
if (Integer.parseInt(version) >= 13)
channel = "minecraft:brand";
/**
* Регистрируем слушатель
* Используем рефлексию или NMS
*/
getServer().getPluginManager().registerEvents(new Listener() {
@EventHandler
public void onLogin(PlayerLoginEvent event) {
((CraftPlayer)event.getPlayer()).addChannel(channel);
}
}, this);
/**
* Регистрируем канал
* При входе на сервер игрока с Fabric или Forge
* в консоль выводиться сообщение об этом
*/
Messenger messenger = getServer().getMessenger();
messenger.registerIncomingPluginChannel(this, channel, (s, player, bytes) -> {
String brand = new String(bytes, Charsets.UTF_8);
if (brand.contains("fabric") || brand.contains("fml") || brand.contains("forge"))
getLogger().info(player.getName()+ "зашел используя "+brand);
});
}
}
Разберем написанное.
Java:
String version = getServer().getClass().getPackage().getName().split("\\.")[3].split("_")[1];
if (Integer.parseInt(version) >= 13)
channel = "minecraft:brand";
Зачем это нужно? Дело в том, что у версий 1.13+ изменился канал
Тут мы регистрируем слушатель, который будет добавлять канал игроку при входе. Я решил реализовать интерфейс именно в
Здесь нам приходится использовать NMS или рефлексию, так как Bukkit не предоставляет возможности добавить игроку каналы. Можно использовать интерфейсы для каждой версии, но это замедлит разработку.
MC|Brand
на minecraft:brand
, поэтому для поддержки разных версий игры стоит добавить эту проверку, хотя это на свое усмотрение.Тут мы регистрируем слушатель, который будет добавлять канал игроку при входе. Я решил реализовать интерфейс именно в
onEnable
, но для лучшей читаемости стоит создать отдельный класс.Здесь нам приходится использовать NMS или рефлексию, так как Bukkit не предоставляет возможности добавить игроку каналы. Можно использовать интерфейсы для каждой версии, но это замедлит разработку.
Java:
getServer().getPluginManager().registerEvents(new Listener() {
@EventHandler
public void onLogin(PlayerLoginEvent event) {
((CraftPlayer)event.getPlayer()).addChannel(channel);
}
}, this);
Именно то, что рассказывает нам про зашедшего игрока. Тут все просто: клиент передает нам массив байт, а далее мы создаем из него строку с брендом. Делаем проверку, содержит ли название нужные нам клиенты.
Java:
Messenger messenger = getServer().getMessenger();
messenger.registerIncomingPluginChannel(this, channel, (s, player, bytes) -> {
String brand = new String(bytes, Charsets.UTF_8);
if (brand.contains("fabric") || brand.contains("fml") || brand.contains("forge"))
getLogger().info(player.getName()+ "зашел используя "+brand);
});
В целом, это все. Очень просто и быстро.
Как Вы это будете использовать - Ваше дело.
Как Вы это будете использовать - Ваше дело.