Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Визуальная часть ChinaHat | Rockstar 2.0 | Fabric 1.21.4

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
4 Апр 2024
Сообщения
52
Реакции
0
Выберите загрузчик игры
  1. Fabric
Сделал за минут 15, просто решил дополнить этот клиент довольно дефолт функцией. Возможно буду делать партиклы для rockstar 2.0.

SS:
1769941000049.png


DW:

Chinahat.java:
Java:
Expand Collapse Copy
package moscow.rockstar.utility.render;

import com.mojang.blaze3d.systems.RenderSystem;
import moscow.rockstar.Rockstar;
import moscow.rockstar.utility.colors.ColorRGBA;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gl.ShaderProgramKeys;
import net.minecraft.client.render.BufferBuilder;
import net.minecraft.client.render.BufferRenderer;
import net.minecraft.client.render.Camera;
import net.minecraft.client.render.VertexFormat.DrawMode;
import net.minecraft.client.render.VertexFormats;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.LivingEntity;
import net.minecraft.util.math.Vec3d;
import org.joml.Matrix4f;
import org.joml.Quaternionf;


public final class Chinahat {
   private static final MinecraftClient mc = MinecraftClient.getInstance();

   public static void render(
      LivingEntity entity,
      MatrixStack matrices,
      Camera camera,
      float tickDelta,
      float width,
      float height,
      ColorRGBA hatColor,
      float alphaVal
   ) {
      if (entity == null || mc.world == null) {
         return;
      }
  
      if (entity == mc.player && mc.options.getPerspective().isFirstPerson()) {
         return;
      }

      ColorRGBA themeColor = Rockstar.getInstance()
         .getThemeManager()
         .getCurrentTheme()
         .getAdditionalColor();

      ColorRGBA finalColor = hatColor != null ? hatColor : themeColor;

      Vec3d interpolatedPos = Utils.getInterpolatedPos(entity, tickDelta);
      Vec3d cameraPos = camera.getPos();

      double hatX = interpolatedPos.x - cameraPos.getX();
      double hatY = interpolatedPos.y + entity.getHeight() - cameraPos.getY(); // Attach to head
      double hatZ = interpolatedPos.z - cameraPos.getZ();
  
      matrices.push();
      matrices.translate(hatX, hatY, hatZ);

      drawConeHat(matrices, finalColor, width, height, alphaVal);
  
      matrices.pop();
   }


   private static void drawConeHat(
      MatrixStack matrices,
      ColorRGBA color,
      float radius,
      float coneHeight,
      float alpha
   ) {
      float r = color.getRed() / 255.0F;
      float g = color.getGreen() / 255.0F;
      float b = color.getBlue() / 255.0F;
      float a = alpha;

      RenderSystem.enableBlend();
      RenderSystem.setShader(ShaderProgramKeys.POSITION_COLOR);
      RenderSystem.lineWidth(40f);
  
      int segments = 32;

      BufferBuilder buffer = RenderSystem.renderThreadTesselator().begin(DrawMode.TRIANGLES, VertexFormats.POSITION_COLOR);
      Matrix4f matrix = matrices.peek().getPositionMatrix();

      for (int i = 0; i < segments; i++) {
         float angle1 = (float) (2 * Math.PI * i / segments);
         float angle2 = (float) (2 * Math.PI * (i + 1) / segments);
    
         float x1 = radius * (float) Math.cos(angle1);
         float z1 = radius * (float) Math.sin(angle1);
         float x2 = radius * (float) Math.cos(angle2);
         float z2 = radius * (float) Math.sin(angle2);

         buffer.vertex(matrix, x1, 0, z1).color(r, g, b, a);
         buffer.vertex(matrix, x2, 0, z2).color(r, g, b, a);
         buffer.vertex(matrix, 0, coneHeight, 0).color(r, g, b, a);
      }
  
      BufferRenderer.drawWithGlobalProgram(buffer.end());

      buffer = RenderSystem.renderThreadTesselator().begin(DrawMode.TRIANGLE_FAN, VertexFormats.POSITION_COLOR);
      matrix = matrices.peek().getPositionMatrix();
  
      buffer.vertex(matrix, 0, 0, 0).color(r, g, b, a);
  
      for (int i = 0; i <= segments; i++) {
         float angle = (float) (2 * Math.PI * i / segments);
         float x = radius * (float) Math.cos(angle);
         float z = radius * (float) Math.sin(angle);
         buffer.vertex(matrix, x, 0, z).color(r, g, b, a);
      }
  
      BufferRenderer.drawWithGlobalProgram(buffer.end());

      buffer = RenderSystem.renderThreadTesselator().begin(DrawMode.DEBUG_LINE_STRIP, VertexFormats.POSITION_COLOR);
      matrix = matrices.peek().getPositionMatrix();
  
      for (int i = 0; i <= segments; i++) {
         float angle = (float) (2 * Math.PI * i / segments);
         float x = radius * (float) Math.cos(angle);
         float z = radius * (float) Math.sin(angle);
         buffer.vertex(matrix, x, 0, z).color(r, g, b, 1.0f); // Full opacity for outline
      }
  
      BufferRenderer.drawWithGlobalProgram(buffer.end());
  
      RenderSystem.lineWidth(1.0f);
      RenderSystem.disableBlend();
   }
}

ChinahatModuel.java (для чекбоксов и т.д) :

Java:
Expand Collapse Copy
package moscow.rockstar.systems.modules.modules.visuals;

import moscow.rockstar.systems.event.EventListener;
import moscow.rockstar.systems.event.impl.render.Render3DEvent;
import moscow.rockstar.systems.modules.api.ModuleCategory;
import moscow.rockstar.systems.modules.api.ModuleInfo;
import moscow.rockstar.systems.modules.impl.BaseModule;
import moscow.rockstar.systems.setting.settings.BooleanSetting;
import moscow.rockstar.systems.setting.settings.ColorSetting;
import moscow.rockstar.systems.setting.settings.SliderSetting;
import moscow.rockstar.utility.colors.ColorRGBA;
import moscow.rockstar.utility.render.Chinahat;
import moscow.rockstar.utility.render.RenderUtility;
import net.minecraft.client.network.AbstractClientPlayerEntity;


@ModuleInfo(
name = "Chinahat",
desc = "Китайская шляпка над головой.",
category = ModuleCategory.VISUALS
)
public class ChinahatModule extends BaseModule {
private final BooleanSetting renderOwnPlayer = new BooleanSetting(
 this,
 "Для себя",
"Отображать шляпу над вашей головой"
   ).enabled(false);

private final BooleanSetting renderPlayers = new BooleanSetting(
 this,
 "Для остальных",
"Отображать шляпку над другими."
   ).enabled(true);

private final SliderSetting width = new SliderSetting(
 this,
 "Ширина",
 "Ширина шляпки",
() -> !this.renderOwnPlayer.isEnabled()
).min(0.2F).max(3.0F).step(0.1F).currentValue(1.0F);

private final SliderSetting height = new SliderSetting(
 this,
 "Высота",
 "Высота шляпки",
() -> !this.renderOwnPlayer.isEnabled()
).min(0.05F).max(0.8F).step(0.05F).currentValue(0.25F);

private final ColorSetting color = new ColorSetting(
 this,
 "Цвет",
() -> !this.renderOwnPlayer.isEnabled()
).color(new ColorRGBA(100, 150, 200, 255)).alpha(true);

private final SliderSetting alpha = new SliderSetting(
 this,
 "Прозрачность",
 "Прозрачность шляпки",
() -> !this.renderOwnPlayer.isEnabled()
).min(0.0F).max(1.0F).step(0.05F).currentValue(0.85F);

private final SliderSetting widthOthers = new SliderSetting(
 this,
 "Ширина для других",
 "Ширина шляпки для других игроков",
() -> !this.renderPlayers.isEnabled()
).min(0.2F).max(3.0F).step(0.1F).currentValue(1.0F);

private final SliderSetting heightOthers = new SliderSetting(
 this,
 "Высота для других",
 "Высота шляпки для других игроков",
() -> !this.renderPlayers.isEnabled()
).min(0.05F).max(0.8F).step(0.05F).currentValue(0.25F);

private final ColorSetting colorOthers = new ColorSetting(
 this,
 "Цвет для других",
() -> !this.renderPlayers.isEnabled()
).color(new ColorRGBA(100, 150, 200, 255)).alpha(true);

private final SliderSetting alphaOthers = new SliderSetting(
 this,
 "Прозрачность для других",
 "Прозрачность шляпки для других игроков",
() -> !this.renderPlayers.isEnabled()
).min(0.0F).max(1.0F).step(0.05F).currentValue(0.85F);

private final EventListener<Render3DEvent> onRender3D = event -> {
if (mc.world == null || mc.player == null) {
 return;
      }

RenderUtility.setupRender3D(true);

for (AbstractClientPlayerEntity player : mc.world.getPlayers()) {
if (player == mc.player && !this.renderOwnPlayer.isEnabled()) {
 continue;
         }

if (player != mc.player && !this.renderPlayers.isEnabled()) {
 continue;
         }

boolean isSelf = player == mc.player;
float width = isSelf ? this.width.getCurrentValue() : this.widthOthers.getCurrentValue();
float height = isSelf ? this.height.getCurrentValue() : this.heightOthers.getCurrentValue();
ColorRGBA color = isSelf ? this.color.getColor() : this.colorOthers.getColor();
float alpha = isSelf ? this.alpha.getCurrentValue() : this.alphaOthers.getCurrentValue();

Chinahat.render(
            player,
            event.getMatrices(),
mc.gameRenderer.getCamera(),
            event.getTickDelta(),
            width,
            height,
            color,
0.3f + alpha * 0.7f
         );
      }

RenderUtility.endRender3D();
   };
}

P.S: не бейте меня, я просто сделал деф функцию, которой не было в рокстаре
Жду когда проверят =)
 
Сделал за минут 15, просто решил дополнить этот клиент довольно дефолт функцией. Возможно буду делать партиклы для rockstar 2.0.

SS:Посмотреть вложение 326313

DW:

Chinahat.java:
Java:
Expand Collapse Copy
package moscow.rockstar.utility.render;

import com.mojang.blaze3d.systems.RenderSystem;
import moscow.rockstar.Rockstar;
import moscow.rockstar.utility.colors.ColorRGBA;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gl.ShaderProgramKeys;
import net.minecraft.client.render.BufferBuilder;
import net.minecraft.client.render.BufferRenderer;
import net.minecraft.client.render.Camera;
import net.minecraft.client.render.VertexFormat.DrawMode;
import net.minecraft.client.render.VertexFormats;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.LivingEntity;
import net.minecraft.util.math.Vec3d;
import org.joml.Matrix4f;
import org.joml.Quaternionf;


public final class Chinahat {
   private static final MinecraftClient mc = MinecraftClient.getInstance();

   public static void render(
      LivingEntity entity,
      MatrixStack matrices,
      Camera camera,
      float tickDelta,
      float width,
      float height,
      ColorRGBA hatColor,
      float alphaVal
   ) {
      if (entity == null || mc.world == null) {
         return;
      }
 
      if (entity == mc.player && mc.options.getPerspective().isFirstPerson()) {
         return;
      }

      ColorRGBA themeColor = Rockstar.getInstance()
         .getThemeManager()
         .getCurrentTheme()
         .getAdditionalColor();

      ColorRGBA finalColor = hatColor != null ? hatColor : themeColor;

      Vec3d interpolatedPos = Utils.getInterpolatedPos(entity, tickDelta);
      Vec3d cameraPos = camera.getPos();

      double hatX = interpolatedPos.x - cameraPos.getX();
      double hatY = interpolatedPos.y + entity.getHeight() - cameraPos.getY(); // Attach to head
      double hatZ = interpolatedPos.z - cameraPos.getZ();
 
      matrices.push();
      matrices.translate(hatX, hatY, hatZ);

      drawConeHat(matrices, finalColor, width, height, alphaVal);
 
      matrices.pop();
   }


   private static void drawConeHat(
      MatrixStack matrices,
      ColorRGBA color,
      float radius,
      float coneHeight,
      float alpha
   ) {
      float r = color.getRed() / 255.0F;
      float g = color.getGreen() / 255.0F;
      float b = color.getBlue() / 255.0F;
      float a = alpha;

      RenderSystem.enableBlend();
      RenderSystem.setShader(ShaderProgramKeys.POSITION_COLOR);
      RenderSystem.lineWidth(40f);
 
      int segments = 32;

      BufferBuilder buffer = RenderSystem.renderThreadTesselator().begin(DrawMode.TRIANGLES, VertexFormats.POSITION_COLOR);
      Matrix4f matrix = matrices.peek().getPositionMatrix();

      for (int i = 0; i < segments; i++) {
         float angle1 = (float) (2 * Math.PI * i / segments);
         float angle2 = (float) (2 * Math.PI * (i + 1) / segments);
   
         float x1 = radius * (float) Math.cos(angle1);
         float z1 = radius * (float) Math.sin(angle1);
         float x2 = radius * (float) Math.cos(angle2);
         float z2 = radius * (float) Math.sin(angle2);

         buffer.vertex(matrix, x1, 0, z1).color(r, g, b, a);
         buffer.vertex(matrix, x2, 0, z2).color(r, g, b, a);
         buffer.vertex(matrix, 0, coneHeight, 0).color(r, g, b, a);
      }
 
      BufferRenderer.drawWithGlobalProgram(buffer.end());

      buffer = RenderSystem.renderThreadTesselator().begin(DrawMode.TRIANGLE_FAN, VertexFormats.POSITION_COLOR);
      matrix = matrices.peek().getPositionMatrix();
 
      buffer.vertex(matrix, 0, 0, 0).color(r, g, b, a);
 
      for (int i = 0; i <= segments; i++) {
         float angle = (float) (2 * Math.PI * i / segments);
         float x = radius * (float) Math.cos(angle);
         float z = radius * (float) Math.sin(angle);
         buffer.vertex(matrix, x, 0, z).color(r, g, b, a);
      }
 
      BufferRenderer.drawWithGlobalProgram(buffer.end());

      buffer = RenderSystem.renderThreadTesselator().begin(DrawMode.DEBUG_LINE_STRIP, VertexFormats.POSITION_COLOR);
      matrix = matrices.peek().getPositionMatrix();
 
      for (int i = 0; i <= segments; i++) {
         float angle = (float) (2 * Math.PI * i / segments);
         float x = radius * (float) Math.cos(angle);
         float z = radius * (float) Math.sin(angle);
         buffer.vertex(matrix, x, 0, z).color(r, g, b, 1.0f); // Full opacity for outline
      }
 
      BufferRenderer.drawWithGlobalProgram(buffer.end());
 
      RenderSystem.lineWidth(1.0f);
      RenderSystem.disableBlend();
   }
}

ChinahatModuel.java (для чекбоксов и т.д) :

Java:
Expand Collapse Copy
package moscow.rockstar.systems.modules.modules.visuals;

import moscow.rockstar.systems.event.EventListener;
import moscow.rockstar.systems.event.impl.render.Render3DEvent;
import moscow.rockstar.systems.modules.api.ModuleCategory;
import moscow.rockstar.systems.modules.api.ModuleInfo;
import moscow.rockstar.systems.modules.impl.BaseModule;
import moscow.rockstar.systems.setting.settings.BooleanSetting;
import moscow.rockstar.systems.setting.settings.ColorSetting;
import moscow.rockstar.systems.setting.settings.SliderSetting;
import moscow.rockstar.utility.colors.ColorRGBA;
import moscow.rockstar.utility.render.Chinahat;
import moscow.rockstar.utility.render.RenderUtility;
import net.minecraft.client.network.AbstractClientPlayerEntity;


@ModuleInfo(
name = "Chinahat",
desc = "Китайская шляпка над головой.",
category = ModuleCategory.VISUALS
)
public class ChinahatModule extends BaseModule {
private final BooleanSetting renderOwnPlayer = new BooleanSetting(
 this,
 "Для себя",
"Отображать шляпу над вашей головой"
   ).enabled(false);

private final BooleanSetting renderPlayers = new BooleanSetting(
 this,
 "Для остальных",
"Отображать шляпку над другими."
   ).enabled(true);

private final SliderSetting width = new SliderSetting(
 this,
 "Ширина",
 "Ширина шляпки",
() -> !this.renderOwnPlayer.isEnabled()
).min(0.2F).max(3.0F).step(0.1F).currentValue(1.0F);

private final SliderSetting height = new SliderSetting(
 this,
 "Высота",
 "Высота шляпки",
() -> !this.renderOwnPlayer.isEnabled()
).min(0.05F).max(0.8F).step(0.05F).currentValue(0.25F);

private final ColorSetting color = new ColorSetting(
 this,
 "Цвет",
() -> !this.renderOwnPlayer.isEnabled()
).color(new ColorRGBA(100, 150, 200, 255)).alpha(true);

private final SliderSetting alpha = new SliderSetting(
 this,
 "Прозрачность",
 "Прозрачность шляпки",
() -> !this.renderOwnPlayer.isEnabled()
).min(0.0F).max(1.0F).step(0.05F).currentValue(0.85F);

private final SliderSetting widthOthers = new SliderSetting(
 this,
 "Ширина для других",
 "Ширина шляпки для других игроков",
() -> !this.renderPlayers.isEnabled()
).min(0.2F).max(3.0F).step(0.1F).currentValue(1.0F);

private final SliderSetting heightOthers = new SliderSetting(
 this,
 "Высота для других",
 "Высота шляпки для других игроков",
() -> !this.renderPlayers.isEnabled()
).min(0.05F).max(0.8F).step(0.05F).currentValue(0.25F);

private final ColorSetting colorOthers = new ColorSetting(
 this,
 "Цвет для других",
() -> !this.renderPlayers.isEnabled()
).color(new ColorRGBA(100, 150, 200, 255)).alpha(true);

private final SliderSetting alphaOthers = new SliderSetting(
 this,
 "Прозрачность для других",
 "Прозрачность шляпки для других игроков",
() -> !this.renderPlayers.isEnabled()
).min(0.0F).max(1.0F).step(0.05F).currentValue(0.85F);

private final EventListener<Render3DEvent> onRender3D = event -> {
if (mc.world == null || mc.player == null) {
 return;
      }

RenderUtility.setupRender3D(true);

for (AbstractClientPlayerEntity player : mc.world.getPlayers()) {
if (player == mc.player && !this.renderOwnPlayer.isEnabled()) {
 continue;
         }

if (player != mc.player && !this.renderPlayers.isEnabled()) {
 continue;
         }

boolean isSelf = player == mc.player;
float width = isSelf ? this.width.getCurrentValue() : this.widthOthers.getCurrentValue();
float height = isSelf ? this.height.getCurrentValue() : this.heightOthers.getCurrentValue();
ColorRGBA color = isSelf ? this.color.getColor() : this.colorOthers.getColor();
float alpha = isSelf ? this.alpha.getCurrentValue() : this.alphaOthers.getCurrentValue();

Chinahat.render(
            player,
            event.getMatrices(),
mc.gameRenderer.getCamera(),
            event.getTickDelta(),
            width,
            height,
            color,
0.3f + alpha * 0.7f
         );
      }

RenderUtility.endRender3D();
   };
}

P.S: не бейте меня, я просто сделал деф функцию, которой не было в рокстаре
Жду когда проверят =)
сойдет
 
/del просвечивается через голову + не привязано к голове
РЕГУЛИРОВКА ПРОЗРАЧНОСТИ ДЛЯ КОГО ?
к голове привязывается?
Нет, можешь сам привязать.
/del просвечивается через голову + не привязано к голове
Тебе сложно самому добавить привязку к голове? Делов на минуты 2. Челу +rep за то, что сделал довольно неплохой чинахет на базе рока.
 
Назад
Сверху Снизу