2025-07-18 02:18:15 +02:00

80 lines
2.9 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.cimeyclust.ezcheat.client;
import com.cimeyclust.ezcheat.Ezcheat;
import com.cimeyclust.ezcheat.EzcheatPayload;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry;
import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.api.metadata.ModOrigin;
import org.apache.commons.codec.digest.DigestUtils;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;
public class EzcheatClient implements ClientModInitializer {
@Override
public void onInitializeClient() {
ClientPlayConnectionEvents.JOIN.register((handler, sender, client) -> {
Ezcheat.LOGGER.info("Joined server: {}", handler.getConnection().getAddress());
Ezcheat.LOGGER.info("Is Singleplayer: {}", client.isInSingleplayer());
if (!client.isInSingleplayer()) {
Ezcheat.LOGGER.info("Sending mod hashes to server");
this.sendHashes();
}
});
}
/** Called clientside to compute & send hashes */
private void sendHashes() {
// gather mod files
Path modsDir = FabricLoader.getInstance()
.getGameDir()
.resolve("mods")
.toAbsolutePath();
Map<String, String> hashes = new HashMap<>();
for (var mod : FabricLoader.getInstance().getAllMods()) {
try {
var origin = mod.getOrigin();
// Skip nested origins
if (origin.getKind() == ModOrigin.Kind.NESTED) {
Ezcheat.LOGGER.debug("Skipping nested mod {}", mod.getMetadata().getId());
continue;
}
Path modFile = null;
for (Path p : origin.getPaths()) {
if (Files.isRegularFile(p)) {
modFile = p;
break;
}
}
if (modFile == null) {
Ezcheat.LOGGER.debug("Skipping mod {}: No valid path", mod.getMetadata().getId());
continue;
}
if (modFile.startsWith(modsDir)) {
try (InputStream in = Files.newInputStream(modFile)) {
hashes.put(mod.getMetadata().getId(), DigestUtils.sha256Hex(in));
}
}
} catch (IOException e) {
Ezcheat.LOGGER.warn("Could not hash {}: {}", mod.getMetadata().getId(), e.getMessage());
}
}
EzcheatPayload payload = new EzcheatPayload(hashes);
ClientPlayNetworking.send(payload);
}
}