-
Автор темы
- #1
Пожалуйста, авторизуйтесь для просмотра ссылки.
Это мой 1 пост, если что у текста есть анимация печатанья.
wt:
package im.expensive.ui.display.impl;
import com.mojang.blaze3d.matrix.MatrixStack;
import im.expensive.Expensive;
import im.expensive.events.EventDisplay;
import im.expensive.ui.display.ElementRenderer;
import im.expensive.ui.styles.Style;
import im.expensive.utils.render.ColorUtils;
import im.expensive.utils.render.DisplayUtils;
import im.expensive.utils.render.font.Fonts;
import im.expensive.utils.text.GradientUtil;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import lombok.experimental.FieldDefaults;
import net.minecraft.client.Minecraft;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.text.Color;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.client.multiplayer.ServerData;
import im.expensive.utils.animations.Animation;
import im.expensive.utils.animations.Direction;
import im.expensive.utils.math.StopWatch;
@FieldDefaults(level = AccessLevel.PRIVATE)
@RequiredArgsConstructor
public class WatermarkRenderer implements ElementRenderer {
final Minecraft mc = Minecraft.getInstance();
private final Animation animation = new im.expensive.utils.animations.impl.EaseBackIn(400, 1.0, 1.0F);
private String fullText;
private String displayedText = "";
private float typingSpeed = 0.02f;
private float typingAnimation = 0;
private StopWatch timer = new StopWatch();
private boolean textComplete = false;
// Новые параметры для современного вида
private final int textColor = ColorUtils.rgb(230, 230, 230); // Светло-серый
private final int panelColor = ColorUtils.rgba(20, 20, 20, 200); // Темный фон с прозрачностью
private final float panelRadius = 3;
private final float fontSize = 10f;
private final float bottomTextFontSize = 8f; // Размер шрифта для текста снизу
private final int bottomTextColor = ColorUtils.rgb(150, 150, 150); // Цвет для текста снизу
private final float additionalPanelHeight = 12; // Дополнительное место для текста снизу
//Текст снизу
private final String bottomText = "New Client?"; //Текст снизу ватермарки
[USER=1367676]@override[/USER]
public void render(EventDisplay eventDisplay) {
MatrixStack ms = eventDisplay.getMatrixStack();
float posX = 3;
float posY = 3;
float padding = 2;
String username = mc.player != null && mc.player.getName() != null ? mc.player.getName().getString() : "N/A";
int fps = mc.getDebugFPS();
fullText = "North Client | " + username + " | FPS: " + fps;
// Обновляем анимированный текст
updateAnimatedText();
float textWidth = Fonts.sfui.getWidth(displayedText, fontSize);
float textHeight = Fonts.sfui.getHeight(fontSize);
float bottomTextWidth = Fonts.sfui.getWidth(bottomText, bottomTextFontSize);
float panelWidth = Math.max(textWidth, bottomTextWidth) + 2 * padding; // Панель подстраивается под самый широкий текст
float panelHeight = textHeight + 2 * padding + additionalPanelHeight; // Высота панели увеличилась для текста снизу
// Рисуем чёрную панель
drawBlackPanel(ms, posX, posY, panelWidth, panelHeight, panelColor, panelRadius);
// Рисуем анимированный текст
Fonts.sfui.drawText(ms, displayedText, posX + padding, posY + padding, textColor, fontSize);
// Рисуем текст снизу
Fonts.sfui.drawText(ms, bottomText, posX + padding, posY + textHeight + 2 * padding, bottomTextColor, bottomTextFontSize);
}
private void updateAnimatedText() {
float animationProgress = this.typingAnimation;
int textLength = fullText.length();
int displayLength = (int)(textLength * animationProgress);
if(displayLength > textLength) {
displayLength = textLength;
}
if(displayLength < 0) {
displayLength = 0;
}
displayedText = fullText.substring(0, displayLength);
if(this.typingAnimation >= 1) {
if(!textComplete) {
textComplete = true;
timer.reset();
}
if(timer.isReached(5000)) {
this.typingAnimation = 0;
textComplete = false;
}
return;
}
this.typingAnimation += typingSpeed;
}
//Измененный метод для панели
private void drawBlackPanel(MatrixStack ms, float x, float y, float width, float height, int color, float radius) {
DisplayUtils.drawRoundedRect(x, y, width, height, radius, color);
}
}