Updated Mimic

 avatar
user_4036049
java
17 days ago
8.2 kB
2
Indexable
package me.blindedbythesun.nya.modules;

import me.blindedbythesun.nya.Addon;
import meteordevelopment.meteorclient.events.packets.PacketEvent;
import meteordevelopment.meteorclient.settings.BoolSetting;
import meteordevelopment.meteorclient.settings.Setting;
import meteordevelopment.meteorclient.settings.SettingGroup;
import meteordevelopment.meteorclient.settings.StringListSetting;
import meteordevelopment.meteorclient.settings.StringSetting;
import meteordevelopment.meteorclient.systems.modules.Module;
import meteordevelopment.orbit.EventHandler;
import meteordevelopment.meteorclient.systems.modules.Modules;
import net.minecraft.network.packet.s2c.play.GameMessageS2CPacket;

import java.util.List;
import java.util.Random;
import me.blindedbythesun.nya.modules.notifications.NotificationType;

public class Mimic extends Module {

    private final SettingGroup sgGeneral = this.settings.getDefaultGroup();

    private final Setting<List<String>> targets = sgGeneral.add(new StringListSetting.Builder()
        .name("target-usernames")
        .description("The list of players whose messages you want to mimic")
        .defaultValue(List.of("popbob"))
        .build()
    );

    private final Setting<Boolean> greenText = sgGeneral.add(new BoolSetting.Builder()
        .name("green-text")
        .description("Enables green text for mimicked messages by adding a > prefix")
        .defaultValue(false)
        .build()
    );

    private final Setting<Boolean> antiTrolling = sgGeneral.add(new BoolSetting.Builder()
        .name("anti-troll")
        .description("Protect yourself from being trolled by replacing your name with the targets")
        .defaultValue(true)
        .build()
    );

    private final Setting<Boolean> antiKickProtection = sgGeneral.add(new BoolSetting.Builder()
        .name("anti-kick")
        .description("Appends random letters and numbers to mimicked messages to prevent spam detection")
        .defaultValue(false)
        .build()
    );

    private final Setting<Boolean> mimicPrivateMessages = sgGeneral.add(new BoolSetting.Builder()
        .name("mimic-private-messages")
        .description("Mimics private messages received and sends them back to the sender")
        .defaultValue(true)
        .build()
    );

    private final Setting<Boolean> privateMessageEnabled = sgGeneral.add(new BoolSetting.Builder()
        .name("send-private-message")
        .description("Enable sending a private message after mimicking")
        .defaultValue(false)
        .build()
    );

    private final Setting<String> privateMessageContent = sgGeneral.add(new StringSetting.Builder()
        .name("private-message-text")
        .description("The private message to send to the mimicked player")
        .defaultValue("nya")
        .visible(privateMessageEnabled::get)
        .build()
    );

    public Mimic() {
        super(Addon.CATEGORY, "mimic", "Repeats messages of a specified player for maximum fun");
        Modules.get().add(this);
    }

    @Override
    public void onActivate() {
        List<String> targetList = targets.get();
        if (targetList.isEmpty()) {
            Addon.notifications.addNotification("Invalid Config", "Target usernames list is empty, please add players", 4000, NotificationType.ERROR);
            return;
        }

        targetList.forEach(target -> {
            if (!isTargetOnline(target)) {
                String message = String.format("Your mimic target, %s, is not online", target);
                Addon.notifications.addNotification("Target Offline", message, 4000, NotificationType.WARNING);
            }
        });
    }

    @EventHandler
    public void onPacket(PacketEvent.Receive event) {
        if (!(event.packet instanceof GameMessageS2CPacket packet)) return;

        String formattedMessage = packet.content().getString().trim();
        if (formattedMessage.isEmpty()) return;

        String senderName = extractSenderName(formattedMessage);
        String messageContent = extractMessageContent(formattedMessage);

        if (formattedMessage.contains(" whispers: ")) {
            String sender = extractPrivateMessageSender(formattedMessage);
            String content = extractPrivateMessageContent(formattedMessage);

            if (sender == null || sender.isEmpty() || content == null || content.isEmpty()) return;

            if (!targets.get().contains(sender)) return;

            if (!isTargetOnline(sender)) {
                String message = String.format("Your mimic target, %s, is not online", sender);
                Addon.notifications.addNotification("Target Offline", message, 4000, NotificationType.WARNING);
                return;
            }

            if (antiTrolling.get()) {
                content = content.replaceAll("(?i)" + mc.player.getName().getString(), sender);
            }

            mc.player.networkHandler.sendCommand("w " + sender + " " + content);
            return;
        }

        if (senderName.isEmpty() || !targets.get().contains(senderName)) return;

        if (!isTargetOnline(senderName)) {
            String message = String.format("Your mimic target, %s, is not online", senderName);
            Addon.notifications.addNotification("Target Offline", message, 4000, NotificationType.WARNING);
            return;
        }

        if (antiTrolling.get()) {
            messageContent = messageContent.replaceAll("(?i)" + mc.player.getName().getString(), senderName);
        }

        if (antiKickProtection.get() && !messageContent.isEmpty()) {
            messageContent += generateRandomSuffix();
        }

        if (!messageContent.isEmpty()) {
            mc.player.networkHandler.sendChatMessage(greenText.get() ? "> " + sanitizeMessage(messageContent) : sanitizeMessage(messageContent));

            if (privateMessageEnabled.get() && !privateMessageContent.get().trim().isEmpty()) {
                mc.player.networkHandler.sendCommand("w " + senderName + " " + privateMessageContent.get().trim());
            }
        }
    }

    private boolean isTargetOnline(String target) {
        return mc.player.networkHandler.getPlayerList().stream()
            .anyMatch(player -> player.getProfile().getName().equalsIgnoreCase(target));
    }

    private String sanitizeMessage(String message) {
        if (message.startsWith("/") || message.startsWith("*") || message.startsWith(",")) {
            message = " " + message;
        }
        return message;
    }

    private String extractSenderName(String message) {
        if (message.startsWith("<") && message.contains(">")) {
            int endIndex = message.indexOf(">");
            return message.substring(1, endIndex);
        }
        return "";
    }

    private String extractMessageContent(String message) {
        if (message.startsWith("<") && message.contains(">")) {
            int startIndex = message.indexOf(">");
            return message.substring(startIndex + 2).trim();
        }
        return "";
    }

    private String extractPrivateMessageSender(String message) {
        if (message.contains(" whispers: ")) {
            int endIndex = message.indexOf(" whispers:");
            if (endIndex > 0) {
                return message.substring(0, endIndex).trim();
            }
        }
        return "";
    }

    private String extractPrivateMessageContent(String message) {
        if (message.contains(" whispers: ")) {
            int startIndex = message.indexOf(" whispers:") + " whispers:".length();
            if (startIndex < message.length()) {
                return message.substring(startIndex).trim();
            }
        }
        return "";
    }

    private String generateRandomSuffix() {
        Random random = new Random();
        int length = random.nextInt(4) + 3;
        String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        StringBuilder suffix = new StringBuilder(" [");

        for (int i = 0; i < length; i++) {
            suffix.append(characters.charAt(random.nextInt(characters.length())));
        }
        suffix.append("]");

        return suffix.toString();
    }
}
Leave a Comment