-
Автор темы
- #1
Перед прочтением основного контента ниже, пожалуйста, обратите внимание на обновление внутри секции Майна на нашем форуме. У нас появились:
- бесплатные читы для Майнкрафт — любое использование на свой страх и риск;
- маркетплейс Майнкрафт — абсолютно любая коммерция, связанная с игрой, за исключением продажи читов (аккаунты, предоставления услуг, поиск кодеров читов и так далее);
- приватные читы для Minecraft — в этом разделе только платные хаки для игры, покупайте группу "Продавец" и выставляйте на продажу свой софт;
- обсуждения и гайды — всё тот же раздел с вопросами, но теперь модернизированный: поиск нужных хаков, пати с игроками-читерами и другая полезная информация.
Спасибо!
Nametags.java:
package im.expensive.functions.impl.render;
import com.google.common.eventbus.Subscribe;
import com.mojang.blaze3d.matrix.MatrixStack;
import im.expensive.events.EventDisplay;
import im.expensive.functions.api.Category;
import im.expensive.functions.api.Function;
import im.expensive.functions.api.FunctionRegister;
import im.expensive.functions.settings.impl.BooleanSetting;
import im.expensive.utils.projections.ProjectionUtil;
import im.expensive.utils.render.DisplayUtils;
import im.expensive.utils.render.font.Fonts;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.vector.Vector2f;
import org.lwjgl.opengl.GL11;
import java.util.HashMap;
import static org.lwjgl.opengl.GL11.glScalef;
import static org.lwjgl.opengl.GL11.glTranslatef;
@FunctionRegister(name = "Nametags", type = Category.Render)
public class Nametags extends Function {
private final HashMap<Entity, Vector4i> positions = new HashMap<>();
private final BooleanSetting showHealth = new BooleanSetting("Показывать ХП", true);
private final BooleanSetting showArmor = new BooleanSetting("Показывать броню", true); // Переключатель для отображения брони
private final BooleanSetting hideNametagNearPlayer = new BooleanSetting("Убирать неймтег рядом", true); // New setting to control this behavior
private final BooleanSetting showItemName = new BooleanSetting("Показывать имя предмета", true); // Переключатель для отображения имени предмета
public Nametags() {
addSettings(showHealth, showArmor, hideNametagNearPlayer, showItemName);
}
@Subscribe
public void onDisplay(EventDisplay e) {
if (mc.world == null || e.getType() != EventDisplay.Type.PRE) return;
positions.clear();
// Отображаем неймтеги для игроков
for (Entity entity : mc.world.getAllEntities()) {
if (!(entity instanceof PlayerEntity)) continue;
// Check if the player is a bot (to skip rendering)
if (isBot(entity)) {
continue;
}
double x = entity.getPosX();
double y = entity.getPosY() + entity.getHeight() + 0.5; // Adjust position
double z = entity.getPosZ();
AxisAlignedBB aabb = entity.getBoundingBox();
Vector4i position = projectAABB(aabb, x, y, z);
if (position != null) {
positions.put(entity, position);
}
}
// Отображаем неймтеги для предметов
for (Entity entity : mc.world.getAllEntities()) {
if (!(entity instanceof ItemEntity)) continue;
double x = entity.getPosX();
double y = entity.getPosY() + entity.getHeight() + 0.5; // Adjust position
double z = entity.getPosZ();
AxisAlignedBB aabb = entity.getBoundingBox();
Vector4i position = projectAABB(aabb, x, y, z);
if (position != null) {
positions.put(entity, position);
}
}
// Рендеринг игроков
for (Entity entity : positions.keySet()) {
if (entity instanceof LivingEntity living) {
// Calculate distance from the player
double distance = mc.player.getDistanceSq(entity);
// Only render the nametag if we are far enough away (6 blocks = 36 squared)
if (hideNametagNearPlayer.get() && distance < 36.0) { // 36 is the squared distance for 6 blocks
continue; // Skip rendering nametag if too close
}
// Render armor first (above HP)
if (showArmor.get()) {
renderArmor(e.getMatrixStack(), living, positions.get(entity));
}
// Then render name and health
renderNametag(e.getMatrixStack(), living, positions.get(entity));
}
}
// Рендеринг предметов
for (Entity entity : positions.keySet()) {
if (entity instanceof ItemEntity itemEntity) {
// Отображаем неймтег предмета, если активирован соответствующий параметр
if (showItemName.get()) {
renderItemNametag(e.getMatrixStack(), itemEntity, positions.get(entity));
}
}
}
}
private boolean isBot(Entity entity) {
// Simple check to determine if the player is a bot
return entity.getName().getString().equals("NPC") || entity instanceof PlayerEntity && ((PlayerEntity) entity).isSpectator();
}
private Vector4i projectAABB(AxisAlignedBB aabb, double x, double y, double z) {
Vector4i position = null;
for (int i = 0; i < 8; i++) {
Vector2f vector = ProjectionUtil.project(
(i & 1) == 0 ? aabb.minX : aabb.maxX,
(i & 2) == 0 ? aabb.minY : aabb.maxY,
(i & 4) == 0 ? aabb.minZ : aabb.maxZ
);
if (position == null) {
position = new Vector4i(vector.x, vector.y, vector.x, vector.y);
} else {
position.x = Math.min(position.x, vector.x);
position.y = Math.min(position.y, vector.y);
position.z = Math.max(position.z, vector.x);
position.w = Math.max(position.w, vector.y);
}
}
return position;
}
private void renderNametag(MatrixStack stack, LivingEntity entity, Vector4i position) {
String name = entity.getName().getString();
float midX = (position.x + position.z) / 2f;
float yOffset = position.y;
// Уменьшаем размер фона
float nameWidth = Fonts.consolas.getWidth(name, 8);
GL11.glPushMatrix();
DisplayUtils.drawRect(stack, midX - nameWidth / 2f - 1, yOffset - 10, // Меньше отступы
midX + nameWidth / 2f + 1, yOffset + 2, 0x90000000); // Меньше отступы
GL11.glPopMatrix();
// Увеличиваем размер шрифта
Fonts.consolas.drawText(stack, name, midX - nameWidth / 2f, yOffset - 8, -1, 8, 0.05f);
yOffset -= 12;
if (showHealth.get()) {
float health = entity.getHealth();
String healthText = String.format("HP: %.1f", health);
float healthWidth = Fonts.consolas.getWidth(healthText, 6);
GL11.glPushMatrix();
DisplayUtils.drawRect(stack, midX - healthWidth / 2f - 1, yOffset - 10, // Меньше отступы
midX + healthWidth / 2f + 1, yOffset + 2, 0x90000000); // Меньше отступы
GL11.glPopMatrix();
Fonts.consolas.drawText(stack, healthText, midX - healthWidth / 2f, yOffset - 8, 0xFF00FF00, 6, 0.05f);
yOffset -= 12;
}
}
private void renderArmor(MatrixStack stack, LivingEntity entity, Vector4i position) {
float midX = (position.x + position.z) / 2f;
float yOffset = position.y - 36; // Move armor rendering higher than HP
int size = 10;
int padding = 4;
float posX = midX - (size * 4 + padding * 3) / 2f; // Start from the leftmost position
for (ItemStack armorItem : entity.getArmorInventoryList()) {
if (armorItem.isEmpty()) continue;
GL11.glPushMatrix();
glCenteredScale(posX, yOffset, size, size, 0.5f);
mc.getItemRenderer().renderItemAndEffectIntoGUI(armorItem, (int) posX, (int) yOffset);
mc.getItemRenderer().renderItemOverlayIntoGUI(mc.fontRenderer, armorItem, (int) posX, (int) yOffset, null);
GL11.glPopMatrix();
posX += size + padding; // Move to the next armor slot
}
}
private void renderItemNametag(MatrixStack stack, ItemEntity itemEntity, Vector4i position) {
String name = itemEntity.getItem().getDisplayName().getString(); // Получаем имя предмета
float midX = (position.x + position.z) / 2f;
float yOffset = position.y;
// Уменьшаем размер фона для имени предмета
float nameWidth = Fonts.consolas.getWidth(name, 8);
GL11.glPushMatrix();
DisplayUtils.drawRect(stack, midX - nameWidth / 2f - 1, yOffset - 10, // Меньше отступы
midX + nameWidth / 2f + 1, yOffset + 2, 0x90000000); // Меньше отступы
GL11.glPopMatrix();
// Увеличиваем размер шрифта для имени предмета
Fonts.consolas.drawText(stack, name, midX - nameWidth / 2f, yOffset - 8, -1, 8, 0.05f);
}
private static class Vector4i {
public float x, y, z, w;
public Vector4i(float x, float y, float z, float w) {
this.x = x;
this.y = y;
this.z = z;
this.w = w;
}
}
// Helper function for scaling and centering
public void glCenteredScale(final float x, final float y, final float w, final float h, final float f) {
glTranslatef(x + w / 2, y + h / 2, 0);
glScalef(f, f, 1);
glTranslatef(-x - w / 2, -y - h / 2, 0);
}
}
Пожалуйста, авторизуйтесь для просмотра ссылки.