int sizeMods = 0;//получаем кол-во модов
File mods = new File("mods/");
File[] listMods = mods.listFiles();
for(File file : listMods) {
++sizeMods;
//String modName = file.getName();//если нужно, то получаем название
}
}
Ну я инжектну чит в существующий мод, индастриал какой-то например. Толку от твоей проверки на сервере, левых модов-то не будет.1 - Лаунчеры на стороне клиента, а значит им верить нет особого смысла. Их постоянно обходят. Если и не сам лаунчер - так JVM кастомную.
Такое себе решение2 - Не все сервера используют свой набор модов, я, к примеру, использую существующий в Technic Launcher модпак (западный, так сказать, подход).
private val login250Client: PacketAdapter = object : PacketAdapter(plugin, ConnectionSide.CLIENT_SIDE, GamePhase.LOGIN, 250) {
override fun onPacketReceiving(event: PacketEvent) {
val channel = event.packet.strings.readSafely(0)
when (channel) {
// ...
"FML|HS" -> {
// https://wiki.vg/Minecraft_Forge_Handshake <-- Forge HandShake protocol
val buffer = Unpooled.buffer().writeBytes(event.packet.byteArrays.readSafely(0)).readerIndex(0)
val discriminator = buffer.readByte()
when (discriminator.toInt()) {
// 0x02 = ModList
2 -> {
// cpw.mods.fml.common.network.ByteBufUtils - этот класс из FML. геморная попытка сэкономить пару байт. при необходимости притащить в плагин.
val modCount = ByteBufUtils.readVarInt(buffer, 2)
for (i in 0 until modCount) {
val modName = ByteBufUtils.readUTF8String(buffer)
val modVersion = ByteBufUtils.readUTF8String(buffer)
// Здесь уже можно составлять карту модов и сравнивать с эталонной/разрешенной.
}
}
}
}
// ...
}
}
}