Начинающий
- Статус
- Оффлайн
- Регистрация
- 7 Сен 2025
- Сообщения
- 6
- Реакции
- 1
- Выберите загрузчик игры
- Vanilla
- Forge
- Fabric
- NeoForge
- OptiFine
- ForgeOptiFine
- Прочие моды
Здарова югеймовцы! моя 1 работата не судите строго, решил слить так как половина читов без Иконок эффектов и определения дебаффов карсным XD,надеюсь сделал нормально :)
upd: Делал на Хармони(no ad)
upd: Делал на Хармони(no ad)
Пожалуйста, авторизуйтесь для просмотра ссылки.
или :
code:
@FieldDefaults(level = AccessLevel.PRIVATE)
@RequiredArgsConstructor
public class PotionRenderer implements ElementRenderer {
final Dragging dragging;
private final CompactAnimation widthAnimation = new CompactAnimation(Easing.EASE_OUT_QUART, 100);
private final CompactAnimation heightAnimation = new CompactAnimation(Easing.EASE_OUT_QUART, 100);
final Animation alphaAnimation = new DecelerateAnimation(300, 1, Direction.FORWARDS);
float width;
float height;
float[] colorShiftOffsets = new float[4];
float[] colorShiftSpeeds = {0.00025f, 0.00018f, 0.00022f, 0.00015f};
float animatedX = -1;
float animatedY = -1;
float dragSpeed = 0.15f;
boolean isFirstRender = true;
private static final Minecraft mc = Minecraft.getInstance();
@Override
public void render(EventDisplay eventDisplay) {
MatrixStack ms = eventDisplay.getMatrixStack();
if (isFirstRender) {
animatedX = dragging.getX();
animatedY = dragging.getY();
isFirstRender = false;
}
float targetX = dragging.getX();
float targetY = dragging.getY();
if (Math.abs(targetX - animatedX) > 0.01f || Math.abs(targetY - animatedY) > 0.01f) {
animatedX += (targetX - animatedX) * dragSpeed;
animatedY += (targetY - animatedY) * dragSpeed;
if (Math.abs(targetX - animatedX) < 0.1f) animatedX = targetX;
dragging.setX(animatedX);
dragging.setY(animatedY);
}
float posX = animatedX;
float posY = animatedY;
float titleFontSize = 7.5f;
float potionFontSize = 7.5f;
float padding = 1.5f;
float effectPadding = 0f;
float iconWidth = 16;
float iconPadding = 1;
float sidePadding = 4;
float rectHeight = 15;
float cornerRadius = 6;
float timerRectPadding = 1f;
float effectIconSize = 10f;
float effectIconPadding = 2f;
float iconBgPadding = 1f;
float iconBgSize = effectIconSize + 2 * iconBgPadding;
float iconBgRadius = 2f;
float iconGap = 2f;
ITextComponent name = GradientUtil.gradient("Эффекты");
boolean isAnyPotionActive = false;
for (EffectInstance effectInstance : mc.player.getActivePotionEffects()) {
if (effectInstance.getDuration() > 0 && effectInstance.isShowIcon()) {
isAnyPotionActive = true;
break;
}
}
boolean chatOpen = mc.currentScreen instanceof ChatScreen;
if (chatOpen) {
isAnyPotionActive = true;
}
Direction targetDirection = isAnyPotionActive ? Direction.FORWARDS : Direction.BACKWARDS;
if (alphaAnimation.getDirection() != targetDirection) {
alphaAnimation.setDirection(targetDirection);
if (targetDirection == Direction.FORWARDS) {
alphaAnimation.reset();
}
}
alphaAnimation.isDone();
float finalAlpha = (float) alphaAnimation.getOutput();
if (finalAlpha <= 0.01) {
return;
}
float textWidth = Fonts.sfuy.getWidth("Эффекты", titleFontSize);
float targetWidth = iconWidth + iconPadding + textWidth + 2 * sidePadding + 30;
float totalPotionHeight = 0;
for (EffectInstance ef : mc.player.getActivePotionEffects()) {
if (ef.isShowIcon()) {
int amp = ef.getAmplifier();
String ampStr = amp >= 1 && amp <= 9 ? " " + I18n.format("enchantment.level." + (amp + 1)) : "";
String nameText = I18n.format(ef.getEffectName()) + ampStr;
float nameWidth = Fonts.sfuy.getWidth(nameText, potionFontSize);
String bindText = EffectUtils.getPotionDurationString(ef, 1);
float bindWidth = Fonts.sfuy.getWidth(bindText, potionFontSize);
float timerRectWidth = bindWidth + 4f * timerRectPadding;
float localWidth = sidePadding + nameWidth + padding + timerRectWidth + sidePadding;
if (localWidth > targetWidth) {
targetWidth = localWidth;
}
totalPotionHeight += (rectHeight + effectPadding);
}
}
widthAnimation.run(Math.max(targetWidth, 80));
heightAnimation.run(rectHeight + (mc.player.getActivePotionEffects().isEmpty() && chatOpen ? 0 : totalPotionHeight));
width = (float) widthAnimation.getValue();
height = (float) heightAnimation.getValue();
updateColorAnimation();
int themeColor1 = Theme.MainColor(0);
int themeColor2 = Theme.MainColor(1);
GL11.glPushMatrix();
GL11.glTranslatef(posX, posY, 0);
if (!mc.player.getActivePotionEffects().isEmpty()) {
float effectY = rectHeight;
PotionSpriteUploader potionspriteuploader = mc.getPotionSpriteUploader();
int alpha = (int) (245 * finalAlpha);
alpha = Math.max(1, alpha);
int mainTopLeftBase = ColorUtils.rgba(10, 10, 18, alpha);
int mainTopRightBase = ColorUtils.rgba(12, 12, 20, alpha);
mainTopLeftBase = ColorUtils.interpolateColor(mainTopLeftBase, themeColor1, 0.04f);
mainTopRightBase = ColorUtils.interpolateColor(mainTopRightBase, themeColor2, 0.04f);
for (EffectInstance ef : mc.player.getActivePotionEffects()) {
if (ef.isShowIcon()) {
Effect effect = ef.getPotion();
TextureAtlasSprite sprite = potionspriteuploader.getSprite(effect);
float alphaMultiplier = 1f;
if (ef.getDuration() < 200) {
alphaMultiplier = (float) (Math.sin(System.currentTimeMillis() / 200.0) * 0.3 + 0.7);
}
alphaMultiplier *= finalAlpha;
float iconRectX = -iconBgSize - iconGap;
float iconRectY = effectY + (rectHeight - iconBgSize) / 2;
int iconBgAlpha = (int)(240 * alphaMultiplier);
int iconBgTopLeft = ColorUtils.setAlpha(mainTopLeftBase, iconBgAlpha);
int iconBgTopRight = ColorUtils.setAlpha(mainTopRightBase, iconBgAlpha);
int iconBgBottomLeft = ColorUtils.setAlpha(mainTopLeftBase, (int)(iconBgAlpha * 0.8f));
int iconBgBottomRight = ColorUtils.setAlpha(mainTopRightBase, (int)(iconBgAlpha * 0.8f));
Vector4f iconBgRadiusVec = new Vector4f(iconBgRadius, iconBgRadius, iconBgRadius, iconBgRadius);
dev.silence.utils.math.Vector4i iconBgColors = new dev.silence.utils.math.Vector4i(iconBgTopLeft, iconBgTopRight, iconBgBottomLeft, iconBgBottomRight);
RenderUtility.drawRoundedRect(iconRectX, iconRectY, iconBgSize, iconBgSize, iconBgRadiusVec, iconBgColors);
GlStateManager.color4f(1.0f, 1.0f, 1.0f, alphaMultiplier);
float iconY = iconRectY + (iconBgSize - effectIconSize) / 2;
drawIcon(sprite, iconRectX + iconBgPadding, iconY, effectIconSize, effectIconSize);
effectY += (rectHeight + effectPadding);
}
}
}
int alpha = (int) (245 * finalAlpha);
alpha = Math.max(1, alpha);
int headerTopLeft = ColorUtils.rgba(16, 16, 26, alpha);
int headerTopRight = ColorUtils.rgba(18, 18, 28, alpha);
int headerBottomLeft = ColorUtils.rgba(20, 20, 32, alpha);
int headerBottomRight = ColorUtils.rgba(22, 22, 34, alpha);
headerTopLeft = ColorUtils.interpolateColor(headerTopLeft, themeColor1, 0.07f);
headerTopRight = ColorUtils.interpolateColor(headerTopRight, themeColor2, 0.07f);
headerBottomLeft = ColorUtils.interpolateColor(headerBottomLeft, themeColor1, 0.10f);
headerBottomRight = ColorUtils.interpolateColor(headerBottomRight, themeColor2, 0.10f);
boolean hasActivePotions = !mc.player.getActivePotionEffects().isEmpty();
boolean shouldHaveExpandedLayout = (hasActivePotions || !chatOpen) && height > rectHeight + 1;
Vector4f headerRadius = shouldHaveExpandedLayout ?
new Vector4f(cornerRadius, 0, cornerRadius, 0) :
new Vector4f(cornerRadius, cornerRadius, cornerRadius, cornerRadius);
RenderUtility.drawRoundedRect(0, 0, width + 4, rectHeight, headerRadius,
new dev.silence.utils.math.Vector4i(headerTopLeft, headerTopRight, headerBottomLeft, headerBottomRight));
if (height > rectHeight + 1) {
int mainTopLeft = ColorUtils.rgba(10, 10, 18, alpha);
int mainTopRight = ColorUtils.rgba(12, 12, 20, alpha);
int mainBottomLeft = ColorUtils.rgba(14, 14, 24, alpha);
int mainBottomRight = ColorUtils.rgba(16, 16, 26, alpha);
mainTopLeft = ColorUtils.interpolateColor(mainTopLeft, themeColor1, 0.04f);
mainTopRight = ColorUtils.interpolateColor(mainTopRight, themeColor2, 0.04f);
mainBottomLeft = ColorUtils.interpolateColor(mainBottomLeft, themeColor1, 0.07f);
mainBottomRight = ColorUtils.interpolateColor(mainBottomRight, themeColor2, 0.07f);
RenderUtility.drawRoundedRect(0, rectHeight, width + 4, height - rectHeight,
new Vector4f(0, cornerRadius, 0, cornerRadius),
new dev.silence.utils.math.Vector4i(mainTopLeft, mainTopRight, mainBottomLeft, mainBottomRight));
}
int logoColor = ColorUtils.interpolateColor(themeColor1, ColorUtils.rgb(255, 255, 255), 0.2f);
logoColor = ColorUtils.setAlpha(logoColor, (int) (255 * finalAlpha));
ClientFonts.icons_nur[20].drawCenteredString(ms, "B", sidePadding + 4.5f, (rectHeight - 12.5f)/2 + 4.5f, logoColor);
float xOffset = iconWidth + iconPadding - 2;
for (ITextComponent sibling : name.getSiblings()) {
String charText = sibling.getString();
Color color = sibling.getStyle().getColor();
int colorInt = color != null ? color.getColor() : ColorUtils.rgb(255, 255, 255);
colorInt = ColorUtils.interpolateColor(colorInt, ColorUtils.rgb(255, 255, 255), 0.15f);
colorInt = ColorUtils.setAlpha(colorInt, (int) (255 * finalAlpha));
Fonts.sfuy.drawText(ms, charText, xOffset, (rectHeight - titleFontSize)/2, colorInt, titleFontSize);
xOffset += Fonts.sfuy.getWidth(charText, titleFontSize);
}
if (hasActivePotions) {
float effectY = rectHeight;
for (EffectInstance ef : mc.player.getActivePotionEffects()) {
if (ef.isShowIcon()) {
int amp = ef.getAmplifier();
String ampStr = amp >= 1 && amp <= 9 ? " " + I18n.format("enchantment.level." + (amp + 1)) : "";
String nameText = I18n.format(ef.getEffectName()) + ampStr;
float nameWidth = Fonts.sfuy.getWidth(nameText, potionFontSize);
String bindText = EffectUtils.getPotionDurationString(ef, 1);
float bindWidth = Fonts.sfuy.getWidth(bindText, potionFontSize);
float alphaMultiplier = 1f;
if (ef.getDuration() < 200) {
alphaMultiplier = (float) (Math.sin(System.currentTimeMillis() / 200.0) * 0.3 + 0.7);
}
alphaMultiplier *= finalAlpha;
float timerRectX = width - sidePadding - (bindWidth + 4f * timerRectPadding);
float timerRectY = effectY + (rectHeight - (potionFontSize + timerRectPadding * 2)) / 2;
float timerRectWidth = bindWidth + timerRectPadding * 4;
float timerRectHeight = potionFontSize + timerRectPadding * 2;
int timerBgColor1 = ColorUtils.setAlpha(ColorUtils.interpolateColor(themeColor1, ColorUtils.rgba(30, 30, 40, 255), 0.8f), (int)(240 * alphaMultiplier));
int timerBgColor2 = ColorUtils.setAlpha(ColorUtils.interpolateColor(themeColor2, ColorUtils.rgba(40, 40, 50, 255), 0.8f), (int)(240 * alphaMultiplier));
Vector4f timerBgRadius = new Vector4f(3, 3, 3, 3);
dev.silence.utils.math.Vector4i timerBgColors = new dev.silence.utils.math.Vector4i(timerBgColor1, timerBgColor2, timerBgColor2, timerBgColor1);
RenderUtility.drawRoundedRect(timerRectX, timerRectY, timerRectWidth, timerRectHeight, timerBgRadius, timerBgColors);
float textY = effectY + (rectHeight - potionFontSize)/2;
float nameStartX = sidePadding;
if (!ef.getPotion().isBeneficial()) {
ITextComponent gradientNameText = GradientUtil.redGradient(nameText);
float nameXOffset = nameStartX;
for (ITextComponent sibling : gradientNameText.getSiblings()) {
String charText = sibling.getString();
Color color = sibling.getStyle().getColor();
int colorInt = color != null ? color.getColor() : ColorUtils.rgb(255, 255, 255);
colorInt = ColorUtils.setAlpha(colorInt, (int) (255 * alphaMultiplier));
Fonts.sfuy.drawText(ms, charText, nameXOffset, textY, colorInt, potionFontSize);
nameXOffset += Fonts.sfuy.getWidth(charText, potionFontSize);
}
Fonts.sfuy.drawText(ms, bindText, timerRectX + timerRectPadding * 2, textY,
ColorUtils.rgba(255, 102, 102, (int) (255 * alphaMultiplier)), potionFontSize);
} else {
Fonts.sfuy.drawText(ms, nameText, nameStartX, textY,
ColorUtils.rgba(255, 255, 255, (int) (255 * alphaMultiplier)), potionFontSize);
Fonts.sfuy.drawText(ms, bindText, timerRectX + timerRectPadding * 2, textY,
ColorUtils.rgba(255, 255, 255, (int) (255 * alphaMultiplier)), potionFontSize);
}
effectY += (rectHeight + effectPadding);
}
}
}
GL11.glPopMatrix();
dragging.setWidth(width);
dragging.setHeight(height);
}
private void drawIcon(TextureAtlasSprite sprite, float x, float y, float width, float height) {
if (sprite == null) return;
GlStateManager.pushMatrix();
GlStateManager.enableBlend();
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
mc.getTextureManager().bindTexture(sprite.getAtlasTexture().getTextureLocation());
Tessellator tessellator = Tessellator.getInstance();
BufferBuilder bufferBuilder = tessellator.getBuffer();
bufferBuilder.begin(7, DefaultVertexFormats.POSITION_TEX);
bufferBuilder.pos(x, y + height, 0).tex(sprite.getMinU(), sprite.getMaxV()).endVertex();
bufferBuilder.pos(x + width, y + height, 0).tex(sprite.getMaxU(), sprite.getMaxV()).endVertex();
bufferBuilder.pos(x + width, y, 0).tex(sprite.getMaxU(), sprite.getMinV()).endVertex();
bufferBuilder.pos(x, y, 0).tex(sprite.getMinU(), sprite.getMinV()).endVertex();
tessellator.draw();
GlStateManager.disableBlend();
GlStateManager.popMatrix();
}
private float animateFast(float current, float target, float speed) {
float diff = target - current;
if (Math.abs(diff) < 0.1f) return target;
return current + diff / speed;
}
private void updateColorAnimation() {
for (int i = 0; i < 4; i++) {
colorShiftOffsets = (colorShiftOffsets + colorShiftSpeeds) % 1.0f;
}
}
private void drawEnhancedShadow(float x, float y, float width, float height, float radius, float alpha) {
int themeColor1 = Theme.MainColor(0);
int themeColor2 = Theme.MainColor(1);
int shadowAlpha1 = (int)(25 * alpha);
int shadowAlpha2 = (int)(15 * alpha);
int shadowAlpha3 = (int)(8 * alpha);
shadowAlpha1 = Math.max(1, shadowAlpha1);
shadowAlpha2 = Math.max(1, shadowAlpha2);
shadowAlpha3 = Math.max(1, shadowAlpha3);
int shadowColor1 = ColorUtils.rgba(0, 0, 0, shadowAlpha1);
int shadowColor2 = ColorUtils.rgba(0, 0, 0, shadowAlpha2);
int shadowColor3 = ColorUtils.rgba(0, 0, 0, shadowAlpha3);
shadowColor1 = ColorUtils.interpolateColor(shadowColor1, themeColor1, 0.03f);
shadowColor2 = ColorUtils.interpolateColor(shadowColor2, themeColor2, 0.02f);
RenderUtility.drawRoundedRect(x + 2, y + 2, width, height,
new Vector4f(radius, radius, radius, radius), shadowColor3);
RenderUtility.drawRoundedRect(x + 1.5f, y + 1.5f, width - 1, height - 1,
new Vector4f(radius, radius, radius, radius), shadowColor2);
RenderUtility.drawRoundedRect(x + 1, y + 1, width - 2, height - 2,
new Vector4f(radius, radius, radius, radius), shadowColor1);
}
Последнее редактирование: