Подпишитесь на наш Telegram-канал, чтобы всегда быть в курсе важных обновлений! Перейти

Вопрос Рендер доната HolyWorld

  • Автор темы Автор темы fimizok
  • Дата начала Дата начала
Дак там под рв только
да, но у него уже есть часть реализации кода, просто он сталкивается с проблемой что пишет только один символ, но код из этой темы вероятно может ему помочь, или понять что он делает не так.
да, но у него уже есть часть реализации кода, просто он сталкивается с проблемой что пишет только один символ, но код из этой темы вероятно может ему помочь, или понять что он делает не так.
я жду пока он скажет получилось у него ибо нет, ибо код из этого поста ему ничем не помогает, чтобы дальше ему помочь.
 
да, но у него уже есть часть реализации кода, просто он сталкивается с проблемой что пишет только один символ, но код из этой темы вероятно может ему помочь, или понять что он делает не так.

я жду пока он скажет получилось у него ибо нет, ибо код из этого поста ему ничем не помогает, чтобы дальше ему помочь.
вот код, если можешь помоги

import de.maxhenkel.voicechat.voice.client.ClientManager;
import de.maxhenkel.voicechat.voice.client.ClientPlayerStateManager;
import de.maxhenkel.voicechat.voice.client.ClientVoicechat;
import lombok.Getter;
import lombok.experimental.Accessors;
import net.blaze3d.matrix.MatrixStack;
import net.blaze3d.systems.RenderSystem;
import net.minecraft.client.entity.player.AbstractClientPlayerEntity;
import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.client.resources.I18n;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.item.EnderPearlEntity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.potion.EffectInstance;
import net.minecraft.potion.EffectUtils;
import net.minecraft.scoreboard.Score;
import net.minecraft.scoreboard.ScoreObjective;
import net.minecraft.scoreboard.Scoreboard;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.vector.Matrix4f;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.math.vector.Vector4f;
import net.minecraft.util.text.*;
import org.lwjgl.opengl.GL11;
import org.overlord.common.events.orbit.EventHandler;
import org.overlord.common.events.orbit.EventPriority;
import org.overlord.luno.api.interfaces.IBuffer;
import org.overlord.luno.client.Client;
import org.overlord.luno.client.events.other.RunTickEvent;
import org.overlord.luno.client.events.render.RenderPre2DEvent;
import org.overlord.luno.client.events.render.RenderTagEvent;
import org.overlord.luno.client.impl.component.impl.target.TargetComponent;
import org.overlord.luno.client.impl.feature.Category;
import org.overlord.luno.client.impl.feature.Feature;
import org.overlord.luno.client.impl.feature.FeatureInfo;
import org.overlord.luno.client.impl.settings.impl.BooleanSetting;
import org.overlord.luno.client.impl.settings.impl.MultiBooleanSetting;
import org.overlord.luno.client.impl.settings.impl.SliderSetting;
import org.overlord.luno.client.util.color.ColorUtil;
import org.overlord.luno.client.util.color.theme.Theme;
import org.overlord.luno.client.util.font.Font;
import org.overlord.luno.client.util.font.Fonts;
import org.overlord.luno.client.util.math.Lerp;
import org.overlord.luno.client.util.math.Mathf;
import org.overlord.luno.client.util.other.FakePlayer;
import org.overlord.luno.client.util.player.PlayerUtil;
import org.overlord.luno.client.util.render.impl.Project;
import org.overlord.luno.client.util.render.impl.RectUtil;
import org.overlord.luno.client.util.render.impl.RenderUtil;
import org.overlord.luno.client.util.render.texture.ClientTexture;

import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

@Getter
@Accessors(fluent = true)
@FeatureInfo(name = "Esp", description = "Выделяет существ сквозь стены и показывает дополнительный перечень информации", category = Category.RENDER)
public class Esp extends Feature {

private static final BufferBuilder BOX_BUFFER = new BufferBuilder(256);
private final Set<Entity> entities = new HashSet<>(256);

private static final Font TAG_FONT = Fonts.BLACK;
private static final float TAG_FONT_SIZE = 7.5F;

private static final Font POTION_FONT = Fonts.BLACK;
private static final float POTION_FONT_SIZE = 5.5F;

private final MultiBooleanSetting targets = new MultiBooleanSetting("Таргеты",
BooleanSetting.of("Игроки", true),
BooleanSetting.of("Предметы", true),
BooleanSetting.of("Эндер-пёрлы", true)
);

private final MultiBooleanSetting render = new MultiBooleanSetting("Отображать",
BooleanSetting.of("Имя", true),
BooleanSetting.of("Бокс", false),
BooleanSetting.of("Зелья", false),
BooleanSetting.of("Вторая Рука", true),
BooleanSetting.of("Броня", true).visible(() -> targets.get("Игроки").get()),
BooleanSetting.of("Префикс", true).visible(() -> targets.get("Игроки").get())
);

private final SliderSetting allowance0100 = new SliderSetting("Разрезать боксы", 60, 0, 90, 1).visible(() -> render.enabled("Бокс")).sbMax(() -> 70.F);

private static final Map<String, ClientTexture> DONATE_ICONS = new HashMap<>();

static {
DONATE_ICONS.put("ꔀ", ClientTexture.DONATE_PLAYER);
DONATE_ICONS.put("ꔄ", ClientTexture.DONATE_HERO);
DONATE_ICONS.put("ꔈ", ClientTexture.DONATE_TITAN);
DONATE_ICONS.put("ꔒ", ClientTexture.DONATE_AVENGER);
DONATE_ICONS.put("ꔖ", ClientTexture.DONATE_OVERLORD);
DONATE_ICONS.put("ꔠ", ClientTexture.DONATE_MAGISTER);
DONATE_ICONS.put("ꔤ", ClientTexture.DONATE_IMPERATOR);
DONATE_ICONS.put("ꔨ", ClientTexture.DONATE_DRAGON);
DONATE_ICONS.put("ꔲ", ClientTexture.DONATE_BULL);
DONATE_ICONS.put("ꕒ", ClientTexture.DONATE_RABBIT);
DONATE_ICONS.put("ꔶ", ClientTexture.DONATE_TIGER);
DONATE_ICONS.put("ꕄ", ClientTexture.DONATE_DRACULA);
DONATE_ICONS.put("ꕖ", ClientTexture.DONATE_BUNNY);
DONATE_ICONS.put("ꕀ", ClientTexture.DONATE_HYDRA);
DONATE_ICONS.put("ꕈ", ClientTexture.DONATE_COBRA);
DONATE_ICONS.put("ꔁ", ClientTexture.DONATE_MEDIA);
DONATE_ICONS.put("ꔅ", ClientTexture.DONATE_YT);
DONATE_ICONS.put("ꕠ", ClientTexture.DONATE_DHELPER);
DONATE_ICONS.put("ꔉ", ClientTexture.DONATE_HELPER);
DONATE_ICONS.put("ꔓ", ClientTexture.DONATE_MLMODER);
DONATE_ICONS.put("ꔗ", ClientTexture.DONATE_MODER);
DONATE_ICONS.put("ꔡ", ClientTexture.DONATE_MODERPLUS);
DONATE_ICONS.put("ꔥ", ClientTexture.DONATE_STMODER);
DONATE_ICONS.put("ꔩ", ClientTexture.DONATE_GLMODER);
DONATE_ICONS.put("ꔳ", ClientTexture.DONATE_MLADMIN);
DONATE_ICONS.put("ꔷ", ClientTexture.DONATE_ADMIN);
}

@EventHandler
public void onEvent(RenderTagEvent event) {
if (event.getEntity() instanceof AbstractClientPlayerEntity) {
event.cancel();
}
}

@EventHandler
public void onEvent(RunTickEvent event) {
if (PlayerUtil.ifnull()) return;

List<Entity> newTargets = TargetComponent.getTargets(128, this::isValid, false);
entities.clear();
entities.addAll(newTargets);
entities.add(mc.player);
}

@EventHandler(priority = EventPriority.LOWEST)
public void onRender2D(RenderPre2DEvent event) {
MatrixStack matrix = event.getMatrix();
Matrix4f project2DMatrix = mc.gameRenderer.getProject2DMatrix();
float partialTicks = event.getPartialTicks();

boolean isNameEnabled = render.enabled("Имя");
boolean isBoxEnabled = render.enabled("Бокс");
boolean isPotionsEnabled = render.enabled("Зелья");

BOX_BUFFER.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_COLOR);

for (Entity entity : entities) {
renderESP(matrix, project2DMatrix, entity, isNameEnabled, isBoxEnabled, isPotionsEnabled, partialTicks);
}

RenderSystem.enableSmoothShadeModel();
RenderSystem.enableBlend();
RenderSystem.disableTexture();
RenderSystem.defaultBlendFunc();
IBuffer.TESSELLATOR.draw(BOX_BUFFER);
RenderSystem.enableTexture();
RenderSystem.disableBlend();
RenderSystem.disableSmoothShadeModel();
}

private void renderESP(MatrixStack matrix, Matrix4f projection, Entity entity, boolean renderName, boolean renderBox, boolean renderPotions, float partialTicks) {
if (!isValid(entity)) {
return;
}

Vector4f worldToScreen = Project.getEntity2DPosition(projection, entity, partialTicks);
if (worldToScreen == null) return;

ITextComponent tagComponent = createEntityTagComponent(entity);

float x = worldToScreen.getX();
float y = worldToScreen.getY();
float endX = worldToScreen.getZ();
float endY = worldToScreen.getW();
float width = endX - x;
float height = endY - y;

int color1 = Theme.DEFAULT.accent(0, 1);
int color2 = Theme.DEFAULT.accent(90, 1);
int color3 = Theme.DEFAULT.accent(180, 1);
int color4 = Theme.DEFAULT.accent(270, 1);

if (renderBox) {
drawBox(matrix, x, y, endX, endY, color1, color2, ColorUtil.multDark(color3, .8f), ColorUtil.multDark(color4, .8f), ColorUtil.getColor(0, 1F), allowance0100.get() / 100.F);
}

if (entity instanceof PlayerEntity) {
drawItems(matrix, (PlayerEntity) entity, worldToScreen, 1);
}

if (entity instanceof LivingEntity livingEntity && renderPotions) {
drawPotions(matrix, livingEntity, x, y, width, height);
}
if (renderName) {
if (render.get("Вторая Рука").get() && entity instanceof LivingEntity living) {
ItemStack offHand = living.getHeldItemOffhand();
if (!offHand.isEmpty()) {
ITextComponent iTextComponent = offHand.getDisplayName();
if (!(iTextComponent instanceof TranslationTextComponent)) {
IFormattableTextComponent temp = (IFormattableTextComponent) tagComponent.deepCopy();
temp = temp.append(new StringTextComponent(" "));
temp = temp.append(iTextComponent);
tagComponent = temp;
}
}
}
drawTag(matrix, entity, tagComponent, x, y, width, height, TAG_FONT.getWidth(tagComponent.getString(), TAG_FONT_SIZE));
}
}

private ITextComponent createEntityTagComponent(Entity entity) {
ITextComponent displayName = entity.getDisplayName();

if (entity instanceof PlayerEntity player) {
boolean isFriend = Client.inst().friendManager().isFriend(player.getGameProfile().getName());
return getTextPlayer(player, isFriend);
}

if (entity instanceof ItemEntity item) {
IFormattableTextComponent itemName = (IFormattableTextComponent) displayName.deepCopy();
itemName.append(new StringTextComponent(" x" + item.getItem().getCount()).mergeStyle(TextFormatting.GRAY));
return itemName;
}

return displayName;
}

private ITextComponent getTextPlayer(PlayerEntity player, boolean friend) {
Item offHandItem = player.getHeldItemOffhand().getItem();
IFormattableTextComponent text = new StringTextComponent("");
if (friend) text.append(new StringTextComponent("[" + TextFormatting.GREEN + "F" + TextFormatting.RESET + "] "));
boolean isBot = false; // Assuming no AntiBot; adjust if needed
if (isBot) text.append(new StringTextComponent("[" + TextFormatting.DARK_RED + "BOT" + TextFormatting.RESET + "] "));
boolean usePrefix = render.get("Префикс").get();
ITextComponent nameText = usePrefix ? player.getDisplayName().deepCopy() : new StringTextComponent(player.getName().getString());
text.append(nameText);
if (offHandItem == Items.PLAYER_HEAD || offHandItem == Items.TOTEM_OF_UNDYING) text.append(new StringTextComponent(TextFormatting.RESET + getSphere(player.getHeldItemOffhand())));
return appendHealth(text, player);
}

private String getSphere(ItemStack stack) {
if (stack.getItem() == Items.PLAYER_HEAD || stack.getItem() == Items.TOTEM_OF_UNDYING) {
CompoundNBT tag = stack.getTag();
if (PlayerUtil.isFuntime() && tag != null && tag.getInt("tslevel") != 0) {
return " [" + TextFormatting.GOLD + tag.getString("don-item").replace("sphere-", "").toUpperCase() + TextFormatting.RESET + "]";
}
}
return "";
}

private ITextComponent appendHealth(IFormattableTextComponent component, LivingEntity entity) {
String healthText;
if (PlayerUtil.isReallyWorld() && entity instanceof PlayerEntity player) {
Scoreboard scoreboard = mc.world.getScoreboard();
ScoreObjective healthObjective = scoreboard.getObjectiveInDisplaySlot(2);
if (healthObjective != null) {
Score score = scoreboard.getOrCreateScore(player.getScoreboardName(), healthObjective);
healthText = score.getScorePoints() > 0 ? String.format("%dHp", score.getScorePoints()) : "0Hp";
player.setAbsorptionAmount(0.0F);
} else {
healthText = String.format("%Hp", (int) entity.getHealthFixed());
}
} else {
healthText = PlayerUtil.isFuntime() && entity.getHealthFixed() == 1000 ? "НЕИЗВЕСТНО" : String.format("%dHp", (int) entity.getHealthFixed());
}

IFormattableTextComponent firstBraceComponent = new StringTextComponent(" [").mergeStyle(TextFormatting.GRAY);
IFormattableTextComponent secondBraceComponent = new StringTextComponent("]").mergeStyle(TextFormatting.GRAY);

component = component.append(firstBraceComponent);
component = component.append(new StringTextComponent(healthText).mergeStyle(TextFormatting.RED));
component = component.append(secondBraceComponent);

return component;
}

public Vector3d interpolate(Entity entity, float partialTicks) {
double posX = Lerp.calc(entity.lastTickPosX, entity.getPosX(), partialTicks);
double posY = Lerp.calc(entity.lastTickPosY, entity.getPosY(), partialTicks);
double posZ = Lerp.calc(entity.lastTickPosZ, entity.getPosZ(), partialTicks);
return new Vector3d(posX, posY, posZ);
}

private void drawTag(MatrixStack matrix, Entity entity, ITextComponent tagComponent, float x, float y, float width, float height, float nameWidth) {
int spaceX = 1;
int spaceY = 1;

int paddingY = 1;

ClientTexture donateIcon = null;
String donateChar = null;

if (entity instanceof PlayerEntity) {
for (String iconKey : DONATE_ICONS.keySet()) {
if (tagComponent.getString().contains(iconKey)) {
donateIcon = DONATE_ICONS.get(iconKey);
donateChar = iconKey;
break;
}
}
}

if (donateChar != null) {
String updatedText = tagComponent.getString().replace(donateChar, "");
tagComponent = new StringTextComponent(updatedText);
nameWidth = TAG_FONT.getWidth(updatedText, TAG_FONT_SIZE);
}

float iconWidth = donateIcon != null ? 38 : 0;
float iconHeight = donateIcon != null ? 8 : 0;
float nameOffset = donateIcon != null ? iconWidth : 3;

float backgroundWidth = nameWidth + 2 + spaceX * 2 - 2 + nameOffset;
float backgroundHeight = TAG_FONT.getHeight(TAG_FONT_SIZE) + spaceY * 2;

float tagX = x + width / 2F - backgroundWidth / 2F;
float tagY = y - backgroundHeight - paddingY;

ClientVoicechat client = ClientManager.getClient();
if (client != null) {
if (entity instanceof PlayerEntity player) {
ClientPlayerStateManager manager = ClientManager.getPlayerStateManager();
boolean isVoiceClient = !manager.isPlayerDisconnected(player);
if (isVoiceClient) {
boolean isSpeak = client.getTalkCache().isWhispering(player) || client.getTalkCache().isTalking(player);
// Color color = manager.isPlayerDisabled(player) ? Color.ORANGE : (isSpeak ? Color.GREEN : Color.RED);
// RectUtil.drawRect(matrix, tagX - spaceX - 1, tagY, 1, backgroundHeight, color.getRGB());
// RectUtil.drawRect(matrix, tagX - spaceX + backgroundWidth, tagY, 1, backgroundHeight, color.getRGB());
}
}
}
RectUtil.drawRect(matrix, tagX - spaceX, tagY, backgroundWidth, backgroundHeight, ColorUtil.getColor(0, 0.45F));

if (donateIcon != null) {
drawDonateIcon(matrix, donateIcon, tagX + spaceX, tagY + spaceY + 0.5F, iconWidth, iconHeight);
TAG_FONT.drawComponent(matrix, tagComponent, tagX + spaceX + nameOffset, tagY + spaceY + 0.5F, -1, 255, TAG_FONT_SIZE);
} else {
TAG_FONT.drawComponent(matrix, tagComponent, tagX + spaceX, tagY + spaceY + 0.5F, -1, 255, TAG_FONT_SIZE);
}
}

private void drawDonateIcon(MatrixStack matrix, ClientTexture texture, float x, float y, float width, float height) {
RenderSystem.color4f(10.0F, 10.0F, 10.0F, 10.0F);
RenderUtil.bindTexture(texture.location());
RectUtil.drawRect(matrix, x, y, width, height, ColorUtil.getColor(255, 255, 255, 255), true, true);
}

private void drawPotions(MatrixStack matrix, LivingEntity entity, float x, float y, float width, float height) {
float potionsX = x + width / 2F + 1;
float potionY = y + height + 2;

float yOffset = 0;

for (EffectInstance effect : entity.getActivePotionEffects()) {
IFormattableTextComponent effectText = new StringTextComponent(I18n.format(effect.getPotion().getName())).appendString(effect.getAmplifier() == 0 ? "" : " " + this.getPotionLvl(effect.getAmplifier() + 1))
.append(new StringTextComponent(" " + EffectUtils.getPotionDurationString(effect, 1)).mergeStyle(TextFormatting.GRAY));

POTION_FONT.drawComponentCenter(matrix, effectText, potionsX, potionY + yOffset, effect.getPotion().getLiquidColor(), 255, POTION_FONT_SIZE);
yOffset += POTION_FONT.getHeight(POTION_FONT_SIZE);
}
}

private void drawBox(MatrixStack matrixStack, float x, float y, float endPosX, float endPosY, int color1, int color2, int color3, int color4, int bgColor, float allowancePC01) {
this.drawFourthContoursLines(matrixStack, x, y, endPosX, endPosY, true, bgColor, bgColor, bgColor, bgColor, allowancePC01);
this.drawFourthContoursLines(matrixStack, x, y, endPosX, endPosY, false, color1, color2, color3, color4, allowancePC01);
}

private void drawFourthContoursLines(MatrixStack matrixStack, float x, float y, float x2, float y2, boolean isOut, int color1, int color2, int color3, int color4, float allowance) {
allowance = 1.F - allowance;
int screenW = mc.getMainWindow().getScaledWidth();
int screenH = mc.getMainWindow().getScaledHeight();
float minScreen = Math.min(screenW, screenH);
float scale = Math.max(0.5f, minScreen / 1080f);

float boxWidth = isOut ? 2.5F : 0.5F;
boxWidth *= scale;

x = (int) (x * 2.F) / 2.F;
x2 = (int) (x2 * 2.F) / 2.F;
y = (int) (y * 2.F) / 2.F;
y2 = (int) (y2 * 2.F) / 2.F;
float treeCompense = 0.39F;
GL11.glLineWidth(boxWidth);
GL11.glDisable(GL11.GL_LINE_SMOOTH);
RectUtil.VERTEXES.clear();
if (allowance < 1.F) {
allowance *= .5F;
final float[] offsetsPosArray = new float[]{
(int) (Mathf.interpolate(x, x2, 1.F - allowance) * 2.F) / 2.F,
(int) (Mathf.interpolate(x, x2, allowance) * 2.F) / 2.F,
(int) (Mathf.interpolate(y, y2, 1.F - allowance) * 2.F) / 2.F,
(int) (Mathf.interpolate(y, y2, allowance) * 2.F) / 2.F
};
final int[] offsetsColorArray = new int[]{
ColorUtil.overCol(color1, color2, 1.F - allowance),
ColorUtil.overCol(color1, color2, allowance),
ColorUtil.overCol(color4, color3, 1.F - allowance),
ColorUtil.overCol(color4, color3, allowance),
ColorUtil.overCol(color1, color4, 1.F - allowance),
ColorUtil.overCol(color1, color4, allowance),
ColorUtil.overCol(color2, color3, 1.F - allowance),
ColorUtil.overCol(color2, color3, allowance)
};

RectUtil.VERTEXES.add(new RectUtil.Vec2f(x - treeCompense, y, color1));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(offsetsPosArray[0] + treeCompense, y, offsetsColorArray[0]));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(offsetsPosArray[1] - treeCompense, y, offsetsColorArray[1]));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x2 + treeCompense, y, color2));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x - treeCompense, y2, color4));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(offsetsPosArray[0] + treeCompense, y2, offsetsColorArray[2]));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(offsetsPosArray[1] - treeCompense, y2, offsetsColorArray[3]));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x2 + treeCompense, y2, color3));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x, y - treeCompense, color1));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x, offsetsPosArray[2] + treeCompense, offsetsColorArray[4]));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x, offsetsPosArray[3] - treeCompense, offsetsColorArray[5]));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x, y2 + treeCompense, color4));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x2, y - treeCompense, color2));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x2, offsetsPosArray[2] + treeCompense, offsetsColorArray[6]));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x2, offsetsPosArray[3] - treeCompense, offsetsColorArray[7]));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x2, y2 + treeCompense, color3));
} else {
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x - treeCompense, y, color1));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x2 + treeCompense, y, color2));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x, y - treeCompense, color1));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x, y2 + treeCompense, color4));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x2, y - treeCompense, color2));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x2, y2 + treeCompense, color3));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x - treeCompense, y2, color4));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x2 + treeCompense, y2, color3));
}

RectUtil.drawVertexesList2D(matrixStack, RectUtil.VERTEXES, GL11.GL_LINES, false, false);
GL11.glLineWidth(1.F);
}

private String convert(int number) {
if (number < 1 || number > 3999) {
return String.valueOf(number);
}

int[] values = {
1000, 900, 500, 400,
100, 90, 50, 40,
10, 9, 5, 4,
1
};

String[] romanSymbols = {
"M", "CM", "D", "CD",
"C", "XC", "L", "XL",
"X", "IX", "V", "IV",
"I"
};

StringBuilder roman = new StringBuilder();

for (int i = 0; i < values.length; i++) {
while (number >= values) {
roman.append(romanSymbols);
number -= values;
}
}


return roman.toString();
}

private String getPotionLvl(int lvl) {
String sLvl = I18n.format("enchantment.level." + lvl);

if (sLvl.startsWith("enchantment.level.")) {
return lvl == 0 ? "infinity" : convert(lvl);
}


return sLvl;
}

private AxisAlignedBB getEntityBox(Entity entity, Vector3d vec) {
Vector3d size = new Vector3d(entity.getBoundingBox().maxX - entity.getBoundingBox().minX, entity.getBoundingBox().maxY - entity.getBoundingBox().minY, entity.getBoundingBox().maxZ - entity.getBoundingBox().minZ);

return new AxisAlignedBB(vec.x - size.x / 2f, vec.y, vec.z - size.z / 2f, vec.x + size.x / 2f, vec.y + size.y, vec.z + size.z / 2f);
}

private boolean isValid(Entity entity) {

if (!entity.isAlive()) {
return false;
}
if (entity == mc.player && mc.gameSettings.getPointOfView().firstPerson()) {

return false;
}
if (entity instanceof FakePlayer) {

return false;
}

if (!isEntityEnabled(entity)) {
return false;
}

return isInView(entity);
}

private boolean isEntityEnabled(Entity entity) {
if (entity instanceof PlayerEntity) {
return targets.enabled("Игроки");
}
if (entity instanceof ItemEntity) {
return targets.enabled("Предметы");
}
if (entity instanceof EnderPearlEntity) {
return targets.enabled("Эндер-пёрлы");
}

return false;
}


public void drawItems(MatrixStack matrixStack, PlayerEntity player, Vector4f screenPosition, float baseScale) {
ItemStack[] armorStacks = player.inventory.armorInventory.toArray(new ItemStack[0]);
ItemStack mainHandStack = player.getHeldItemMainhand();
ItemStack offHandStack = player.getHeldItemOffhand();

float slotSpacing = 12f * baseScale;
float slotSize = 10f * baseScale;

float x = screenPosition.getX();
float y = screenPosition.getY();
float width = screenPosition.getZ() - x;

int spaceX = 1;
int spaceY = 1;
int paddingY = 1;
float nameWidth = TAG_FONT.getWidth(player.getDisplayName().getString(), TAG_FONT_SIZE);
float backgroundWidth = nameWidth + 2 + spaceX * 2 - 2;
float backgroundHeight = TAG_FONT.getHeight(TAG_FONT_SIZE) + spaceY * 2;
float tagX = x + width / 2F - nameWidth / 2F - 1;

float tagY = y - backgroundHeight - paddingY;

float originY = tagY - slotSpacing;

float totalEquipmentWidth = 0f;
for (int i = 3; i >= 0; i--) {

if (!armorStacks.isEmpty()) totalEquipmentWidth += slotSpacing;
}

if (!mainHandStack.isEmpty()) totalEquipmentWidth += slotSpacing;
if (!offHandStack.isEmpty()) totalEquipmentWidth += slotSpacing;

boolean showArmor = render.enabled("Броня");

float equipX = tagX - spaceX + (backgroundWidth - totalEquipmentWidth) / 2f;

if (showArmor) {
for (int i = 0; i < 6; i++) {
ItemStack stack = i == 0 ? offHandStack : i == 5 ? mainHandStack : armorStacks[4 - i];
if (stack.isEmpty()) continue;
RectUtil.drawRect(matrixStack, equipX - baseScale, originY - baseScale, slotSize, slotSize, ColorUtil.getColor(0, 0.45F));
RectUtil.drawItemStack(matrixStack, stack, equipX, originY, baseScale / 2f, 255);
equipX += slotSpacing;
}
}
}

public boolean isInView(Entity entity) {
if (mc.getRenderViewEntity() == null || mc.worldRenderer.getClippinghelper() == null) {

return false;
}
return mc.worldRenderer.getClippinghelper().isBoundingBoxInFrustum(entity.getBoundingBox()) || entity.ignoreFrustumCheck;
}

private float getWidth(ITextComponent text) {
return mc.fontRenderer.getStringWidth(text.getString());
}
}
 
вот код, если можешь помоги

import de.maxhenkel.voicechat.voice.client.ClientManager;
import de.maxhenkel.voicechat.voice.client.ClientPlayerStateManager;
import de.maxhenkel.voicechat.voice.client.ClientVoicechat;
import lombok.Getter;
import lombok.experimental.Accessors;
import net.blaze3d.matrix.MatrixStack;
import net.blaze3d.systems.RenderSystem;
import net.minecraft.client.entity.player.AbstractClientPlayerEntity;
import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.client.resources.I18n;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.item.EnderPearlEntity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.potion.EffectInstance;
import net.minecraft.potion.EffectUtils;
import net.minecraft.scoreboard.Score;
import net.minecraft.scoreboard.ScoreObjective;
import net.minecraft.scoreboard.Scoreboard;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.vector.Matrix4f;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.math.vector.Vector4f;
import net.minecraft.util.text.*;
import org.lwjgl.opengl.GL11;
import org.overlord.common.events.orbit.EventHandler;
import org.overlord.common.events.orbit.EventPriority;
import org.overlord.luno.api.interfaces.IBuffer;
import org.overlord.luno.client.Client;
import org.overlord.luno.client.events.other.RunTickEvent;
import org.overlord.luno.client.events.render.RenderPre2DEvent;
import org.overlord.luno.client.events.render.RenderTagEvent;
import org.overlord.luno.client.impl.component.impl.target.TargetComponent;
import org.overlord.luno.client.impl.feature.Category;
import org.overlord.luno.client.impl.feature.Feature;
import org.overlord.luno.client.impl.feature.FeatureInfo;
import org.overlord.luno.client.impl.settings.impl.BooleanSetting;
import org.overlord.luno.client.impl.settings.impl.MultiBooleanSetting;
import org.overlord.luno.client.impl.settings.impl.SliderSetting;
import org.overlord.luno.client.util.color.ColorUtil;
import org.overlord.luno.client.util.color.theme.Theme;
import org.overlord.luno.client.util.font.Font;
import org.overlord.luno.client.util.font.Fonts;
import org.overlord.luno.client.util.math.Lerp;
import org.overlord.luno.client.util.math.Mathf;
import org.overlord.luno.client.util.other.FakePlayer;
import org.overlord.luno.client.util.player.PlayerUtil;
import org.overlord.luno.client.util.render.impl.Project;
import org.overlord.luno.client.util.render.impl.RectUtil;
import org.overlord.luno.client.util.render.impl.RenderUtil;
import org.overlord.luno.client.util.render.texture.ClientTexture;

import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

@Getter
@Accessors(fluent = true)
@FeatureInfo(name = "Esp", description = "Выделяет существ сквозь стены и показывает дополнительный перечень информации", category = Category.RENDER)
public class Esp extends Feature {

private static final BufferBuilder BOX_BUFFER = new BufferBuilder(256);
private final Set<Entity> entities = new HashSet<>(256);

private static final Font TAG_FONT = Fonts.BLACK;
private static final float TAG_FONT_SIZE = 7.5F;

private static final Font POTION_FONT = Fonts.BLACK;
private static final float POTION_FONT_SIZE = 5.5F;

private final MultiBooleanSetting targets = new MultiBooleanSetting("Таргеты",
BooleanSetting.of("Игроки", true),
BooleanSetting.of("Предметы", true),
BooleanSetting.of("Эндер-пёрлы", true)
);

private final MultiBooleanSetting render = new MultiBooleanSetting("Отображать",
BooleanSetting.of("Имя", true),
BooleanSetting.of("Бокс", false),
BooleanSetting.of("Зелья", false),
BooleanSetting.of("Вторая Рука", true),
BooleanSetting.of("Броня", true).visible(() -> targets.get("Игроки").get()),
BooleanSetting.of("Префикс", true).visible(() -> targets.get("Игроки").get())
);

private final SliderSetting allowance0100 = new SliderSetting("Разрезать боксы", 60, 0, 90, 1).visible(() -> render.enabled("Бокс")).sbMax(() -> 70.F);

private static final Map<String, ClientTexture> DONATE_ICONS = new HashMap<>();

static {
DONATE_ICONS.put("ꔀ", ClientTexture.DONATE_PLAYER);
DONATE_ICONS.put("ꔄ", ClientTexture.DONATE_HERO);
DONATE_ICONS.put("ꔈ", ClientTexture.DONATE_TITAN);
DONATE_ICONS.put("ꔒ", ClientTexture.DONATE_AVENGER);
DONATE_ICONS.put("ꔖ", ClientTexture.DONATE_OVERLORD);
DONATE_ICONS.put("ꔠ", ClientTexture.DONATE_MAGISTER);
DONATE_ICONS.put("ꔤ", ClientTexture.DONATE_IMPERATOR);
DONATE_ICONS.put("ꔨ", ClientTexture.DONATE_DRAGON);
DONATE_ICONS.put("ꔲ", ClientTexture.DONATE_BULL);
DONATE_ICONS.put("ꕒ", ClientTexture.DONATE_RABBIT);
DONATE_ICONS.put("ꔶ", ClientTexture.DONATE_TIGER);
DONATE_ICONS.put("ꕄ", ClientTexture.DONATE_DRACULA);
DONATE_ICONS.put("ꕖ", ClientTexture.DONATE_BUNNY);
DONATE_ICONS.put("ꕀ", ClientTexture.DONATE_HYDRA);
DONATE_ICONS.put("ꕈ", ClientTexture.DONATE_COBRA);
DONATE_ICONS.put("ꔁ", ClientTexture.DONATE_MEDIA);
DONATE_ICONS.put("ꔅ", ClientTexture.DONATE_YT);
DONATE_ICONS.put("ꕠ", ClientTexture.DONATE_DHELPER);
DONATE_ICONS.put("ꔉ", ClientTexture.DONATE_HELPER);
DONATE_ICONS.put("ꔓ", ClientTexture.DONATE_MLMODER);
DONATE_ICONS.put("ꔗ", ClientTexture.DONATE_MODER);
DONATE_ICONS.put("ꔡ", ClientTexture.DONATE_MODERPLUS);
DONATE_ICONS.put("ꔥ", ClientTexture.DONATE_STMODER);
DONATE_ICONS.put("ꔩ", ClientTexture.DONATE_GLMODER);
DONATE_ICONS.put("ꔳ", ClientTexture.DONATE_MLADMIN);
DONATE_ICONS.put("ꔷ", ClientTexture.DONATE_ADMIN);
}

@EventHandler
public void onEvent(RenderTagEvent event) {
if (event.getEntity() instanceof AbstractClientPlayerEntity) {
event.cancel();
}
}

@EventHandler
public void onEvent(RunTickEvent event) {
if (PlayerUtil.ifnull()) return;

List<Entity> newTargets = TargetComponent.getTargets(128, this::isValid, false);
entities.clear();
entities.addAll(newTargets);
entities.add(mc.player);
}

@EventHandler(priority = EventPriority.LOWEST)
public void onRender2D(RenderPre2DEvent event) {
MatrixStack matrix = event.getMatrix();
Matrix4f project2DMatrix = mc.gameRenderer.getProject2DMatrix();
float partialTicks = event.getPartialTicks();

boolean isNameEnabled = render.enabled("Имя");
boolean isBoxEnabled = render.enabled("Бокс");
boolean isPotionsEnabled = render.enabled("Зелья");

BOX_BUFFER.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_COLOR);

for (Entity entity : entities) {
renderESP(matrix, project2DMatrix, entity, isNameEnabled, isBoxEnabled, isPotionsEnabled, partialTicks);
}

RenderSystem.enableSmoothShadeModel();
RenderSystem.enableBlend();
RenderSystem.disableTexture();
RenderSystem.defaultBlendFunc();
IBuffer.TESSELLATOR.draw(BOX_BUFFER);
RenderSystem.enableTexture();
RenderSystem.disableBlend();
RenderSystem.disableSmoothShadeModel();
}

private void renderESP(MatrixStack matrix, Matrix4f projection, Entity entity, boolean renderName, boolean renderBox, boolean renderPotions, float partialTicks) {
if (!isValid(entity)) {
return;
}

Vector4f worldToScreen = Project.getEntity2DPosition(projection, entity, partialTicks);
if (worldToScreen == null) return;

ITextComponent tagComponent = createEntityTagComponent(entity);

float x = worldToScreen.getX();
float y = worldToScreen.getY();
float endX = worldToScreen.getZ();
float endY = worldToScreen.getW();
float width = endX - x;
float height = endY - y;

int color1 = Theme.DEFAULT.accent(0, 1);
int color2 = Theme.DEFAULT.accent(90, 1);
int color3 = Theme.DEFAULT.accent(180, 1);
int color4 = Theme.DEFAULT.accent(270, 1);

if (renderBox) {
drawBox(matrix, x, y, endX, endY, color1, color2, ColorUtil.multDark(color3, .8f), ColorUtil.multDark(color4, .8f), ColorUtil.getColor(0, 1F), allowance0100.get() / 100.F);
}

if (entity instanceof PlayerEntity) {
drawItems(matrix, (PlayerEntity) entity, worldToScreen, 1);
}

if (entity instanceof LivingEntity livingEntity && renderPotions) {
drawPotions(matrix, livingEntity, x, y, width, height);
}
if (renderName) {
if (render.get("Вторая Рука").get() && entity instanceof LivingEntity living) {
ItemStack offHand = living.getHeldItemOffhand();
if (!offHand.isEmpty()) {
ITextComponent iTextComponent = offHand.getDisplayName();
if (!(iTextComponent instanceof TranslationTextComponent)) {
IFormattableTextComponent temp = (IFormattableTextComponent) tagComponent.deepCopy();
temp = temp.append(new StringTextComponent(" "));
temp = temp.append(iTextComponent);
tagComponent = temp;
}
}
}
drawTag(matrix, entity, tagComponent, x, y, width, height, TAG_FONT.getWidth(tagComponent.getString(), TAG_FONT_SIZE));
}
}

private ITextComponent createEntityTagComponent(Entity entity) {
ITextComponent displayName = entity.getDisplayName();

if (entity instanceof PlayerEntity player) {
boolean isFriend = Client.inst().friendManager().isFriend(player.getGameProfile().getName());
return getTextPlayer(player, isFriend);
}

if (entity instanceof ItemEntity item) {
IFormattableTextComponent itemName = (IFormattableTextComponent) displayName.deepCopy();
itemName.append(new StringTextComponent(" x" + item.getItem().getCount()).mergeStyle(TextFormatting.GRAY));
return itemName;
}

return displayName;
}

private ITextComponent getTextPlayer(PlayerEntity player, boolean friend) {
Item offHandItem = player.getHeldItemOffhand().getItem();
IFormattableTextComponent text = new StringTextComponent("");
if (friend) text.append(new StringTextComponent("[" + TextFormatting.GREEN + "F" + TextFormatting.RESET + "] "));
boolean isBot = false; // Assuming no AntiBot; adjust if needed
if (isBot) text.append(new StringTextComponent("[" + TextFormatting.DARK_RED + "BOT" + TextFormatting.RESET + "] "));
boolean usePrefix = render.get("Префикс").get();
ITextComponent nameText = usePrefix ? player.getDisplayName().deepCopy() : new StringTextComponent(player.getName().getString());
text.append(nameText);
if (offHandItem == Items.PLAYER_HEAD || offHandItem == Items.TOTEM_OF_UNDYING) text.append(new StringTextComponent(TextFormatting.RESET + getSphere(player.getHeldItemOffhand())));
return appendHealth(text, player);
}

private String getSphere(ItemStack stack) {
if (stack.getItem() == Items.PLAYER_HEAD || stack.getItem() == Items.TOTEM_OF_UNDYING) {
CompoundNBT tag = stack.getTag();
if (PlayerUtil.isFuntime() && tag != null && tag.getInt("tslevel") != 0) {
return " [" + TextFormatting.GOLD + tag.getString("don-item").replace("sphere-", "").toUpperCase() + TextFormatting.RESET + "]";
}
}
return "";
}

private ITextComponent appendHealth(IFormattableTextComponent component, LivingEntity entity) {
String healthText;
if (PlayerUtil.isReallyWorld() && entity instanceof PlayerEntity player) {
Scoreboard scoreboard = mc.world.getScoreboard();
ScoreObjective healthObjective = scoreboard.getObjectiveInDisplaySlot(2);
if (healthObjective != null) {
Score score = scoreboard.getOrCreateScore(player.getScoreboardName(), healthObjective);
healthText = score.getScorePoints() > 0 ? String.format("%dHp", score.getScorePoints()) : "0Hp";
player.setAbsorptionAmount(0.0F);
} else {
healthText = String.format("%Hp", (int) entity.getHealthFixed());
}
} else {
healthText = PlayerUtil.isFuntime() && entity.getHealthFixed() == 1000 ? "НЕИЗВЕСТНО" : String.format("%dHp", (int) entity.getHealthFixed());
}

IFormattableTextComponent firstBraceComponent = new StringTextComponent(" [").mergeStyle(TextFormatting.GRAY);
IFormattableTextComponent secondBraceComponent = new StringTextComponent("]").mergeStyle(TextFormatting.GRAY);

component = component.append(firstBraceComponent);
component = component.append(new StringTextComponent(healthText).mergeStyle(TextFormatting.RED));
component = component.append(secondBraceComponent);

return component;
}

public Vector3d interpolate(Entity entity, float partialTicks) {
double posX = Lerp.calc(entity.lastTickPosX, entity.getPosX(), partialTicks);
double posY = Lerp.calc(entity.lastTickPosY, entity.getPosY(), partialTicks);
double posZ = Lerp.calc(entity.lastTickPosZ, entity.getPosZ(), partialTicks);
return new Vector3d(posX, posY, posZ);
}

private void drawTag(MatrixStack matrix, Entity entity, ITextComponent tagComponent, float x, float y, float width, float height, float nameWidth) {
int spaceX = 1;
int spaceY = 1;

int paddingY = 1;

ClientTexture donateIcon = null;
String donateChar = null;

if (entity instanceof PlayerEntity) {
for (String iconKey : DONATE_ICONS.keySet()) {
if (tagComponent.getString().contains(iconKey)) {
donateIcon = DONATE_ICONS.get(iconKey);
donateChar = iconKey;
break;
}
}
}

if (donateChar != null) {
String updatedText = tagComponent.getString().replace(donateChar, "");
tagComponent = new StringTextComponent(updatedText);
nameWidth = TAG_FONT.getWidth(updatedText, TAG_FONT_SIZE);
}

float iconWidth = donateIcon != null ? 38 : 0;
float iconHeight = donateIcon != null ? 8 : 0;
float nameOffset = donateIcon != null ? iconWidth : 3;

float backgroundWidth = nameWidth + 2 + spaceX * 2 - 2 + nameOffset;
float backgroundHeight = TAG_FONT.getHeight(TAG_FONT_SIZE) + spaceY * 2;

float tagX = x + width / 2F - backgroundWidth / 2F;
float tagY = y - backgroundHeight - paddingY;

ClientVoicechat client = ClientManager.getClient();
if (client != null) {
if (entity instanceof PlayerEntity player) {
ClientPlayerStateManager manager = ClientManager.getPlayerStateManager();
boolean isVoiceClient = !manager.isPlayerDisconnected(player);
if (isVoiceClient) {
boolean isSpeak = client.getTalkCache().isWhispering(player) || client.getTalkCache().isTalking(player);
// Color color = manager.isPlayerDisabled(player) ? Color.ORANGE : (isSpeak ? Color.GREEN : Color.RED);
// RectUtil.drawRect(matrix, tagX - spaceX - 1, tagY, 1, backgroundHeight, color.getRGB());
// RectUtil.drawRect(matrix, tagX - spaceX + backgroundWidth, tagY, 1, backgroundHeight, color.getRGB());
}
}
}
RectUtil.drawRect(matrix, tagX - spaceX, tagY, backgroundWidth, backgroundHeight, ColorUtil.getColor(0, 0.45F));

if (donateIcon != null) {
drawDonateIcon(matrix, donateIcon, tagX + spaceX, tagY + spaceY + 0.5F, iconWidth, iconHeight);
TAG_FONT.drawComponent(matrix, tagComponent, tagX + spaceX + nameOffset, tagY + spaceY + 0.5F, -1, 255, TAG_FONT_SIZE);
} else {
TAG_FONT.drawComponent(matrix, tagComponent, tagX + spaceX, tagY + spaceY + 0.5F, -1, 255, TAG_FONT_SIZE);
}
}

private void drawDonateIcon(MatrixStack matrix, ClientTexture texture, float x, float y, float width, float height) {
RenderSystem.color4f(10.0F, 10.0F, 10.0F, 10.0F);
RenderUtil.bindTexture(texture.location());
RectUtil.drawRect(matrix, x, y, width, height, ColorUtil.getColor(255, 255, 255, 255), true, true);
}

private void drawPotions(MatrixStack matrix, LivingEntity entity, float x, float y, float width, float height) {
float potionsX = x + width / 2F + 1;
float potionY = y + height + 2;

float yOffset = 0;

for (EffectInstance effect : entity.getActivePotionEffects()) {
IFormattableTextComponent effectText = new StringTextComponent(I18n.format(effect.getPotion().getName())).appendString(effect.getAmplifier() == 0 ? "" : " " + this.getPotionLvl(effect.getAmplifier() + 1))
.append(new StringTextComponent(" " + EffectUtils.getPotionDurationString(effect, 1)).mergeStyle(TextFormatting.GRAY));

POTION_FONT.drawComponentCenter(matrix, effectText, potionsX, potionY + yOffset, effect.getPotion().getLiquidColor(), 255, POTION_FONT_SIZE);
yOffset += POTION_FONT.getHeight(POTION_FONT_SIZE);
}
}

private void drawBox(MatrixStack matrixStack, float x, float y, float endPosX, float endPosY, int color1, int color2, int color3, int color4, int bgColor, float allowancePC01) {
this.drawFourthContoursLines(matrixStack, x, y, endPosX, endPosY, true, bgColor, bgColor, bgColor, bgColor, allowancePC01);
this.drawFourthContoursLines(matrixStack, x, y, endPosX, endPosY, false, color1, color2, color3, color4, allowancePC01);
}

private void drawFourthContoursLines(MatrixStack matrixStack, float x, float y, float x2, float y2, boolean isOut, int color1, int color2, int color3, int color4, float allowance) {
allowance = 1.F - allowance;
int screenW = mc.getMainWindow().getScaledWidth();
int screenH = mc.getMainWindow().getScaledHeight();
float minScreen = Math.min(screenW, screenH);
float scale = Math.max(0.5f, minScreen / 1080f);

float boxWidth = isOut ? 2.5F : 0.5F;
boxWidth *= scale;

x = (int) (x * 2.F) / 2.F;
x2 = (int) (x2 * 2.F) / 2.F;
y = (int) (y * 2.F) / 2.F;
y2 = (int) (y2 * 2.F) / 2.F;
float treeCompense = 0.39F;
GL11.glLineWidth(boxWidth);
GL11.glDisable(GL11.GL_LINE_SMOOTH);
RectUtil.VERTEXES.clear();
if (allowance < 1.F) {
allowance *= .5F;
final float[] offsetsPosArray = new float[]{
(int) (Mathf.interpolate(x, x2, 1.F - allowance) * 2.F) / 2.F,
(int) (Mathf.interpolate(x, x2, allowance) * 2.F) / 2.F,
(int) (Mathf.interpolate(y, y2, 1.F - allowance) * 2.F) / 2.F,
(int) (Mathf.interpolate(y, y2, allowance) * 2.F) / 2.F
};
final int[] offsetsColorArray = new int[]{
ColorUtil.overCol(color1, color2, 1.F - allowance),
ColorUtil.overCol(color1, color2, allowance),
ColorUtil.overCol(color4, color3, 1.F - allowance),
ColorUtil.overCol(color4, color3, allowance),
ColorUtil.overCol(color1, color4, 1.F - allowance),
ColorUtil.overCol(color1, color4, allowance),
ColorUtil.overCol(color2, color3, 1.F - allowance),
ColorUtil.overCol(color2, color3, allowance)
};

RectUtil.VERTEXES.add(new RectUtil.Vec2f(x - treeCompense, y, color1));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(offsetsPosArray[0] + treeCompense, y, offsetsColorArray[0]));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(offsetsPosArray[1] - treeCompense, y, offsetsColorArray[1]));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x2 + treeCompense, y, color2));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x - treeCompense, y2, color4));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(offsetsPosArray[0] + treeCompense, y2, offsetsColorArray[2]));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(offsetsPosArray[1] - treeCompense, y2, offsetsColorArray[3]));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x2 + treeCompense, y2, color3));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x, y - treeCompense, color1));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x, offsetsPosArray[2] + treeCompense, offsetsColorArray[4]));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x, offsetsPosArray[3] - treeCompense, offsetsColorArray[5]));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x, y2 + treeCompense, color4));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x2, y - treeCompense, color2));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x2, offsetsPosArray[2] + treeCompense, offsetsColorArray[6]));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x2, offsetsPosArray[3] - treeCompense, offsetsColorArray[7]));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x2, y2 + treeCompense, color3));
} else {
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x - treeCompense, y, color1));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x2 + treeCompense, y, color2));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x, y - treeCompense, color1));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x, y2 + treeCompense, color4));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x2, y - treeCompense, color2));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x2, y2 + treeCompense, color3));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x - treeCompense, y2, color4));
RectUtil.VERTEXES.add(new RectUtil.Vec2f(x2 + treeCompense, y2, color3));
}

RectUtil.drawVertexesList2D(matrixStack, RectUtil.VERTEXES, GL11.GL_LINES, false, false);
GL11.glLineWidth(1.F);
}

private String convert(int number) {
if (number < 1 || number > 3999) {
return String.valueOf(number);
}

int[] values = {
1000, 900, 500, 400,
100, 90, 50, 40,
10, 9, 5, 4,
1
};

String[] romanSymbols = {
"M", "CM", "D", "CD",
"C", "XC", "L", "XL",
"X", "IX", "V", "IV",
"I"
};

StringBuilder roman = new StringBuilder();

for (int i = 0; i < values.length; i++) {
while (number >= values) {
roman.append(romanSymbols);
number -= values;
}
}


return roman.toString();
}

private String getPotionLvl(int lvl) {
String sLvl = I18n.format("enchantment.level." + lvl);

if (sLvl.startsWith("enchantment.level.")) {
return lvl == 0 ? "infinity" : convert(lvl);
}


return sLvl;
}

private AxisAlignedBB getEntityBox(Entity entity, Vector3d vec) {
Vector3d size = new Vector3d(entity.getBoundingBox().maxX - entity.getBoundingBox().minX, entity.getBoundingBox().maxY - entity.getBoundingBox().minY, entity.getBoundingBox().maxZ - entity.getBoundingBox().minZ);

return new AxisAlignedBB(vec.x - size.x / 2f, vec.y, vec.z - size.z / 2f, vec.x + size.x / 2f, vec.y + size.y, vec.z + size.z / 2f);
}

private boolean isValid(Entity entity) {

if (!entity.isAlive()) {
return false;
}
if (entity == mc.player && mc.gameSettings.getPointOfView().firstPerson()) {

return false;
}
if (entity instanceof FakePlayer) {

return false;
}

if (!isEntityEnabled(entity)) {
return false;
}

return isInView(entity);
}

private boolean isEntityEnabled(Entity entity) {
if (entity instanceof PlayerEntity) {
return targets.enabled("Игроки");
}
if (entity instanceof ItemEntity) {
return targets.enabled("Предметы");
}
if (entity instanceof EnderPearlEntity) {
return targets.enabled("Эндер-пёрлы");
}

return false;
}


public void drawItems(MatrixStack matrixStack, PlayerEntity player, Vector4f screenPosition, float baseScale) {
ItemStack[] armorStacks = player.inventory.armorInventory.toArray(new ItemStack[0]);
ItemStack mainHandStack = player.getHeldItemMainhand();
ItemStack offHandStack = player.getHeldItemOffhand();

float slotSpacing = 12f * baseScale;
float slotSize = 10f * baseScale;

float x = screenPosition.getX();
float y = screenPosition.getY();
float width = screenPosition.getZ() - x;

int spaceX = 1;
int spaceY = 1;
int paddingY = 1;
float nameWidth = TAG_FONT.getWidth(player.getDisplayName().getString(), TAG_FONT_SIZE);
float backgroundWidth = nameWidth + 2 + spaceX * 2 - 2;
float backgroundHeight = TAG_FONT.getHeight(TAG_FONT_SIZE) + spaceY * 2;
float tagX = x + width / 2F - nameWidth / 2F - 1;

float tagY = y - backgroundHeight - paddingY;

float originY = tagY - slotSpacing;

float totalEquipmentWidth = 0f;
for (int i = 3; i >= 0; i--) {

if (!armorStacks.isEmpty()) totalEquipmentWidth += slotSpacing;
}

if (!mainHandStack.isEmpty()) totalEquipmentWidth += slotSpacing;
if (!offHandStack.isEmpty()) totalEquipmentWidth += slotSpacing;

boolean showArmor = render.enabled("Броня");

float equipX = tagX - spaceX + (backgroundWidth - totalEquipmentWidth) / 2f;

if (showArmor) {
for (int i = 0; i < 6; i++) {
ItemStack stack = i == 0 ? offHandStack : i == 5 ? mainHandStack : armorStacks[4 - i];
if (stack.isEmpty()) continue;
RectUtil.drawRect(matrixStack, equipX - baseScale, originY - baseScale, slotSize, slotSize, ColorUtil.getColor(0, 0.45F));
RectUtil.drawItemStack(matrixStack, stack, equipX, originY, baseScale / 2f, 255);
equipX += slotSpacing;
}
}
}

public boolean isInView(Entity entity) {
if (mc.getRenderViewEntity() == null || mc.worldRenderer.getClippinghelper() == null) {

return false;
}
return mc.worldRenderer.getClippinghelper().isBoundingBoxInFrustum(entity.getBoundingBox()) || entity.ignoreFrustumCheck;
}

private float getWidth(ITextComponent text) {
return mc.fontRenderer.getStringWidth(text.getString());
}
}
так у тебя значения символов ресурспака для риливорлда а не холиворлда
 

Вложения

  • 1760294288169.png
    1760294288169.png
    23 KB · Просмотры: 18
Назад
Сверху Снизу