Updated Mimic
user_4036049
java
10 months ago
8.2 kB
5
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();
}
}
Editor is loading...
Leave a Comment