Files
OpenPrestige/src/main/java/dev/zprestige/prestige/module/misc/EnemyFaker.java
T

205 lines
8.9 KiB
Java

package dev.zprestige.prestige.module.misc;
import com.mojang.authlib.GameProfile;
import dev.zprestige.prestige.BoolSetting;
import dev.zprestige.prestige.EnumSetting;
import dev.zprestige.prestige.Module;
import dev.zprestige.prestige.Subscribe;
import dev.zprestige.prestige.TextSetting;
import dev.zprestige.prestige.client.Prestige;
import dev.zprestige.prestige.event.LabelTextEvent;
import dev.zprestige.prestige.event.SkinTexturesEvent;
import dev.zprestige.prestige.event.TextReplaceEvent;
import dev.zprestige.prestige.event.ClientTickEvent;
import dev.zprestige.prestige.social.MojangApi;
import dev.zprestige.prestige.world.PositionUtil;
import java.util.ArrayList;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import net.minecraft.entity.Entity.RemovalReason;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.SkinTextures;
import net.minecraft.text.MutableText;
import net.minecraft.text.Text;
import net.minecraft.text.TextColor;
import net.minecraft.util.Formatting;
import net.minecraft.util.Pair;
public class EnemyFaker extends Module {
public EnemyFaker() {
dev.zprestige.prestige.ui.bridge.Bootstrap.pre(this);
}
private TextSetting fakeName;
private TextSetting gamemode;
private EnumSetting tier;
private BoolSetting update;
private SkinTextures fakeSkin = null;
private PlayerEntity target;
@Subscribe
public void onSkinTextures(SkinTexturesEvent event) {
if (this.target != null
&& this.fakeSkin != null
&& event.getPlayerName() != null
&& event.getSkinTextures() != null
&& !this.fakeName.getValue().isEmpty()
&& mc.getNetworkHandler() != null
&& mc.getNetworkHandler().getPlayerListEntry(this.target.getUuid()) != null
&& mc.getNetworkHandler().getPlayerListEntry(this.target.getUuid()).getProfile() != null) {
if (event.getPlayerName()
.equals(PositionUtil.getProfileName(mc.getNetworkHandler().getPlayerListEntry(this.target.getUuid()).getProfile()))) {
event.setSkinTextures(this.fakeSkin);
event.cancel();
}
}
}
@Subscribe
public void onLabelText(LabelTextEvent event) {
if (this.target != null) {
if (event.getEntity().equals(this.target)) {
MutableText iconText = Text.literal(String.valueOf(this.getGamemodeIcon().getLeft()));
MutableText tierText = Text.literal(this.tier.getValue().toString())
.styled(style -> style.withColor(getTierColor(this.tier.getValue().toString())));
MutableText separatorText = Text.literal(" | ").styled(style -> style.withColor(Formatting.GRAY));
MutableText nameText = Text.literal(this.fakeName.getValue().toString()).styled(style -> style.withFormatting(Formatting.WHITE));
if (this.fakeName.getValue().isEmpty()) {
nameText = Text.literal(event.getEntity().getName().getString()).styled(style -> style.withFormatting(Formatting.WHITE));
}
event.setText((this.tier.getValue().equals("None") ? Text.empty() : iconText.append(tierText).append(separatorText)).append(nameText));
event.cancel();
}
}
}
@Subscribe
public void onTextReplace(TextReplaceEvent event) {
if (this.target != null && !this.fakeName.getValue().isEmpty()) {
if (event.getText().contains(this.target.getName().getString())) {
event.setTarget(this.target.getName().getString());
event.setText(this.fakeName.getValue().toString());
event.cancel();
}
}
}
@Subscribe
public void onClientTick(ClientTickEvent event) {
if (mc.world == null || mc.player == null) {
this.target = null;
return;
}
for (PlayerEntity player : new ArrayList<>(mc.world.getPlayers())) {
if (!player.equals(mc.player) && (player.isDead() || !player.isAlive())) {
mc.world.removeEntity(player.getId(), RemovalReason.DISCARDED);
}
}
this.target = findClosestEnemy();
if (this.update.getValue()) {
this.update.setValue(false);
if (!this.fakeName.getValue().isEmpty()) {
String requestedName = this.fakeName.getValue().toString();
// Mojang lookups block for several seconds on a bad connection, never do them on the game thread
Thread lookup = new Thread(() -> {
UUID uuid = MojangApi.fetchUuid(requestedName);
GameProfile profile = uuid == null ? null : MojangApi.fetchProfile(uuid);
if (profile != null) {
mc.execute(() -> this.applyFakeSkin(profile, requestedName));
}
}, "Prestige-SkinLookup");
lookup.setDaemon(true);
lookup.start();
}
}
}
private void applyFakeSkin(GameProfile profile, String requestedName) {
if (!this.isEnabled()) {
return;
}
CompletableFuture skinFuture = mc.getSkinProvider().fetchSkinTextures(profile);
skinFuture.thenAccept(skinResult -> {
if (((java.util.Optional)skinResult).isPresent()) {
this.fakeSkin = (SkinTextures)((java.util.Optional)skinResult).get();
if (mc.player != null) {
mc.player.sendMessage(Text.of("Fake skin updated to: " + requestedName), false);
}
} else if (mc.player != null) {
mc.player.sendMessage(Text.of("Failed to fetch skin for: " + requestedName), false);
}
});
}
@Override
public void onDisable() {
this.target = null;
this.fakeSkin = null;
}
public static PlayerEntity findClosestEnemy() {
PlayerEntity closest = null;
if (mc.world == null || mc.player == null) {
return null;
}
for (PlayerEntity player : new ArrayList<>(mc.world.getPlayers())) {
if (!player.equals(mc.player)
&& !Prestige.friendManager.isFriend(player.getName().getString())
&& player.getName().getString().length() >= 3
&& Prestige.botFilter.isValidTarget(player)
&& (closest == null || mc.player.squaredDistanceTo(player) < mc.player.squaredDistanceTo(closest))) {
closest = player;
}
}
return closest;
}
private static int getTierColor(String tierName) {
return switch (tierName) {
case "HT1" -> 15252026;
case "LT1" -> 14005077;
case "HT2" -> 12899303;
case "LT2" -> 10528690;
case "HT3" -> 16293722;
case "LT3" -> 13007682;
case "HT4" -> 8483994;
case "LT4" -> 6642553;
case "HT5" -> 9405096;
case "LT5" -> 6642553;
default -> 13882323;
};
}
private Pair getGamemodeIcon() {
return switch (this.gamemode.getValue().toLowerCase()) {
case "axe" -> new Pair('\ue701', TextColor.fromFormatting(Formatting.GREEN));
case "mace" -> new Pair('\ue702', TextColor.fromFormatting(Formatting.GRAY));
case "nethop", "neth_pot" -> new Pair('\ue703', TextColor.fromRgb(8211008));
case "pot" -> new Pair('\ue704', TextColor.fromRgb(16711680));
case "smp" -> new Pair('\ue705', TextColor.fromRgb(15518533));
case "sword" -> new Pair('\ue706', TextColor.fromRgb(10812912));
case "uhc" -> new Pair('\ue707', TextColor.fromFormatting(Formatting.RED));
case "vanilla" -> new Pair('\ue708', TextColor.fromFormatting(Formatting.LIGHT_PURPLE));
case "bed" -> new Pair('\ue801', TextColor.fromRgb(16711680));
case "bow" -> new Pair('\ue802', TextColor.fromRgb(6700304));
case "creeper" -> new Pair('\ue803', TextColor.fromFormatting(Formatting.GREEN));
case "debuff" -> new Pair('\ue804', TextColor.fromFormatting(Formatting.DARK_GRAY));
case "dia_crystal" -> new Pair('\ue805', TextColor.fromFormatting(Formatting.AQUA));
case "dia_smp" -> new Pair('\ue806', TextColor.fromRgb(9201291));
case "elytra" -> new Pair('\ue807', TextColor.fromRgb(9276849));
case "manhunt" -> new Pair('\ue808', TextColor.fromFormatting(Formatting.RED));
case "minecart" -> new Pair('\ue809', TextColor.fromFormatting(Formatting.GRAY));
case "og_vanilla" -> new Pair('\ue810', TextColor.fromFormatting(Formatting.GOLD));
case "speed" -> new Pair('\ue811', TextColor.fromRgb(4434385));
case "trident" -> new Pair('\ue812', TextColor.fromRgb(5741452));
default -> new Pair('•', TextColor.fromFormatting(Formatting.WHITE));
};
}
}