package thunder.hack.features.modules.misc;
import com.mojang.authlib.GameProfile;
import meteordevelopment.orbit.EventHandler;
import net.minecraft.client.network.OtherClientPlayerEntity;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityStatuses;
import net.minecraft.entity.effect.StatusEffectInstance;
import net.minecraft.entity.effect.StatusEffects;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.network.packet.s2c.play.EntityStatusS2CPacket;
import net.minecraft.network.packet.s2c.play.ExplosionS2CPacket;
import net.minecraft.sound.SoundCategory;
import net.minecraft.sound.SoundEvents;
import net.minecraft.util.Hand;
import net.minecraft.util.math.Vec3d;
import thunder.hack.ThunderHack;
import thunder.hack.core.manager.client.ModuleManager;
import thunder.hack.events.impl.EventAttack;
import thunder.hack.events.impl.EventSync;
import thunder.hack.events.impl.PacketEvent;
import thunder.hack.events.impl.TotemPopEvent;
import thunder.hack.features.modules.Module;
import thunder.hack.setting.Setting;
import thunder.hack.utility.world.ExplosionUtility;
import thunder.hack.utility.player.InventoryUtility;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class FakePlayer extends Module {
private final Setting<Boolean> copyInventory = new Setting<>("CopyInventory", false);
public static OtherClientPlayerEntity fakePlayer;
public FakePlayer() {
super("FakePlayer", Category.MISC);
}
private Setting<Boolean> record = new Setting<>("Record", false);
private Setting<Boolean> play = new Setting<>("Play", false);
private Setting<Boolean> autoTotem = new Setting<>("AutoTotem", false);
private Setting<String> name = new Setting<>("Name", "Hell_Raider");
private final List<PlayerState> positions = new ArrayList<>();
int movementTick, deathTime;
@override
public void onEnable() {
fakePlayer = new OtherClientPlayerEntity(mc.world, new GameProfile(UUID.fromString("66123666-6666-6666-6666-666666666600"), name.getValue()));
fakePlayer.copyPositionAndRotation(mc.player);
if (copyInventory.getValue()) {
fakePlayer.setStackInHand(Hand.MAIN_HAND, mc.player.getMainHandStack().copy());
fakePlayer.setStackInHand(Hand.OFF_HAND, mc.player.getOffHandStack().copy());
fakePlayer.getInventory().setStack(36, mc.player.getInventory().getStack(36).copy());
fakePlayer.getInventory().setStack(37, mc.player.getInventory().getStack(37).copy());
fakePlayer.getInventory().setStack(38, mc.player.getInventory().getStack(38).copy());
fakePlayer.getInventory().setStack(39, mc.player.getInventory().getStack(39).copy());
}
mc.world.addEntity(fakePlayer);
fakePlayer.addStatusEffect(new StatusEffectInstance(StatusEffects.REGENERATION, 9999, 2));
fakePlayer.addStatusEffect(new StatusEffectInstance(StatusEffects.ABSORPTION, 9999, 4));
fakePlayer.addStatusEffect(new StatusEffectInstance(StatusEffects.RESISTANCE, 9999, 1));
}
@EventHandler
public void onPacketReceive(PacketEvent.Receive e) {
if (e.getPacket() instanceof ExplosionS2CPacket explosion && fakePlayer != null && fakePlayer.hurtTime == 0) {
fakePlayer.onDamaged(mc.world.getDamageSources().generic());
fakePlayer.setHealth(fakePlayer.getHealth() + fakePlayer.getAbsorptionAmount() - ExplosionUtility.getAutoCrystalDamage(new Vec3d(explosion.getX(), explosion.getY(), explosion.getZ()), fakePlayer, 0, false));
if (fakePlayer.isDead()) {
if (fakePlayer.tryUseTotem(mc.world.getDamageSources().generic())) {
fakePlayer.setHealth(10f);
ThunderHack.EVENT_BUS.post(new TotemPopEvent(fakePlayer, 1));
// new EntityStatusS2CPacket(fakePlayer, EntityStatuses.USE_TOTEM_OF_UNDYING).apply(mc.player.networkHandler);
}
}
}
}
@EventHandler
public void onSync(EventSync e) {
if (record.getValue()) {
positions.add(new PlayerState(mc.player.getX(), mc.player.getY(), mc.player.getZ(), mc.player.getYaw(), mc.player.getPitch()));
return;
}
if (fakePlayer != null) {
if (play.getValue() && !positions.isEmpty()) {
movementTick++;
if (movementTick >= positions.size()) {
movementTick = 0;
return;
}
PlayerState p = positions.get(movementTick);
fakePlayer.setYaw(p.yaw);
fakePlayer.setPitch(p.pitch);
fakePlayer.setHeadYaw(p.yaw);
fakePlayer.updateTrackedPosition(p.x, p.y, p.z);
fakePlayer.updateTrackedPositionAndAngles(p.x, p.y, p.z, p.yaw, p.pitch, 3);
} else movementTick = 0;
if (autoTotem.getValue() && fakePlayer.getOffHandStack().getItem() != Items.TOTEM_OF_UNDYING)
fakePlayer.setStackInHand(Hand.OFF_HAND, new ItemStack(Items.TOTEM_OF_UNDYING));
if (fakePlayer.isDead()) {
deathTime++;
if (deathTime > 10) disable();
}
}
}
@EventHandler
public void onAttack(EventAttack e) {
if (fakePlayer != null && e.getEntity() == fakePlayer && fakePlayer.hurtTime == 0 && !e.isPre()) {
mc.world.playSound(mc.player, fakePlayer.getX(), fakePlayer.getY(), fakePlayer.getZ(), SoundEvents.ENTITY_PLAYER_HURT, SoundCategory.PLAYERS, 1f, 1f);
if (mc.player.fallDistance > 0 || ModuleManager.criticals.isEnabled())
mc.world.playSound(mc.player, fakePlayer.getX(), fakePlayer.getY(), fakePlayer.getZ(), SoundEvents.ENTITY_PLAYER_ATTACK_CRIT, SoundCategory.PLAYERS, 1f, 1f);
fakePlayer.onDamaged(mc.world.getDamageSources().generic());
if (ModuleManager.aura.getAttackCooldown() >= 0.85)
fakePlayer.setHealth(fakePlayer.getHealth() + fakePlayer.getAbsorptionAmount() - InventoryUtility.getHitDamage(mc.player.getMainHandStack(), fakePlayer));
else fakePlayer.setHealth(fakePlayer.getHealth() + fakePlayer.getAbsorptionAmount() - 1f);
if (fakePlayer.isDead()) {
if (fakePlayer.tryUseTotem(mc.world.getDamageSources().generic())) {
fakePlayer.setHealth(10f);
new EntityStatusS2CPacket(fakePlayer, EntityStatuses.USE_TOTEM_OF_UNDYING).apply(mc.player.networkHandler);
}
}
}
}
@override
public void onDisable() {
if (fakePlayer == null) return;
fakePlayer.kill();
fakePlayer.setRemoved(Entity.RemovalReason.KILLED);
fakePlayer.onRemoved();
fakePlayer = null;
positions.clear();
deathTime = 0;
}
private record PlayerState(double x, double y, double z, float yaw, float pitch) {
}
}
вот ссылка бери от туда там норм сурсы -