Начинающий
- Статус
- Оффлайн
- Регистрация
- 4 Янв 2023
- Сообщения
- 5
- Реакции
- 0
- Выберите загрузчик игры
- Fabric
Сливаю джамп серкл который мне написал дипсик за 10 минут. Пастерам на рокстаре пойдет.
Java:
package moscow.rockstar.systems.modules.modules.visuals;
import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem;
import moscow.rockstar.Rockstar;
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.ModeSetting;
import moscow.rockstar.systems.setting.settings.SliderSetting;
import moscow.rockstar.utility.colors.ColorRGBA;
import moscow.rockstar.utility.colors.Colors;
import net.minecraft.block.Blocks;
import net.minecraft.client.gl.ShaderProgramKeys;
import net.minecraft.client.render.*;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.RotationAxis;
import net.minecraft.util.math.Vec3d;
import org.joml.Matrix4f;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.CopyOnWriteArrayList;
@ModuleInfo(name = "Jump Circle", category = ModuleCategory.VISUALS, desc = "Отображает анимированные круги в месте приземления")
public class JumpCircle extends BaseModule {
private final ModeSetting mode = new ModeSetting(this, "Режим");
private final ModeSetting.Value defaultMode = new ModeSetting.Value(mode, "Обычный").select();
private final ModeSetting.Value customMode = new ModeSetting.Value(mode, "Кастомный");
private final SliderSetting rotateSpeed = new SliderSetting(this, "Скорость вращения")
.min(0.5F).max(5.0F).step(0.1F).currentValue(2.0F);
private final SliderSetting circleScale = new SliderSetting(this, "Масштаб круга")
.min(0.5F).max(3.0F).step(0.1F).currentValue(1.0F);
private final SliderSetting brightness = new SliderSetting(this, "Яркость")
.min(1.0F).max(2.5F).step(0.1F).currentValue(1.8F);
private final SliderSetting animationDuration = new SliderSetting(this, "Длительность")
.min(1000F).max(8000F).step(100F).currentValue(5000F).suffix(" ms");
private final List<Circle> circles = new ArrayList<>();
private final List<PlayerEntity> cache = new CopyOnWriteArrayList<>();
private Identifier customTexture;
private static final Identifier DEFAULT_TEXTURE = Rockstar.id("textures/jumpcircle/default.png");
private final EventListener<Render3DEvent> onRender3D = event -> {
if (mc.player == null || circles.isEmpty()) return;
Collections.reverse(circles);
RenderSystem.disableDepthTest();
RenderSystem.enableBlend();
RenderSystem.blendFunc(GlStateManager.SrcFactor.SRC_ALPHA, GlStateManager.DstFactor.ONE);
Identifier texture = mode.is(customMode) ?
Objects.requireNonNullElse(customTexture, DEFAULT_TEXTURE) : DEFAULT_TEXTURE;
RenderSystem.setShaderTexture(0, texture);
RenderSystem.setShader(ShaderProgramKeys.POSITION_TEX_COLOR);
BufferBuilder buffer = Tessellator.getInstance().begin(
VertexFormat.DrawMode.QUADS,
VertexFormats.POSITION_TEXTURE_COLOR
);
MatrixStack matrices = event.getMatrices();
Vec3d cameraPos = mc.gameRenderer.getCamera().getPos();
float bright = brightness.getCurrentValue();
for (Circle circle : circles) {
float passedTime = (float) circle.timer.getPassedTimeMs();
float duration = animationDuration.getCurrentValue();
float alphaAnim = 1.0f - (passedTime / duration);
alphaAnim = Math.max(0, Math.min(1, alphaAnim));
alphaAnim = alphaAnim * 0.9f;
float sizeAnim = circleScale.getCurrentValue() - (float) Math.pow(1 - (passedTime / duration), 4);
matrices.push();
matrices.translate(
circle.pos.x - cameraPos.x,
circle.pos.y - cameraPos.y,
circle.pos.z - cameraPos.z
);
matrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(90));
matrices.multiply(RotationAxis.POSITIVE_Z.rotationDegrees(sizeAnim * rotateSpeed.getCurrentValue() * 1000f));
Matrix4f matrix = matrices.peek().getPositionMatrix();
ColorRGBA themeColor = getThemeColor();
int r = Math.min(255, (int)(themeColor.getRed() * bright));
int g = Math.min(255, (int)(themeColor.getGreen() * bright));
int b = Math.min(255, (int)(themeColor.getBlue() * bright));
int a = (int)(alphaAnim * 200);
int color = new ColorRGBA(r, g, b, a).getRGB();
float size = sizeAnim * 2f;
buffer.vertex(matrix, -sizeAnim, -sizeAnim + size, 0).texture(0, 1).color(color);
buffer.vertex(matrix, -sizeAnim + size, -sizeAnim + size, 0).texture(1, 1).color(color);
buffer.vertex(matrix, -sizeAnim + size, -sizeAnim, 0).texture(1, 0).color(color);
buffer.vertex(matrix, -sizeAnim, -sizeAnim, 0).texture(0, 0).color(color);
matrices.pop();
}
var builtBuffer = buffer.endNullable();
if (builtBuffer != null) {
BufferRenderer.drawWithGlobalProgram(builtBuffer);
}
RenderSystem.defaultBlendFunc();
RenderSystem.disableBlend();
RenderSystem.enableDepthTest();
Collections.reverse(circles);
};
private ColorRGBA getThemeColor() {
if (Rockstar.getInstance().getThemeManager() != null) {
ColorRGBA color = Rockstar.getInstance().getThemeManager().getCurrentTheme().getAdditionalColor();
if (color.getRed() < 50 && color.getGreen() < 50 && color.getBlue() < 50) {
return new ColorRGBA(255, 150, 100, 255);
}
return color;
}
return new ColorRGBA(255, 150, 100, 255);
}
@Override
public void tick() {
if (mc.player == null) return;
for (PlayerEntity player : mc.world.getPlayers()) {
if (!cache.contains(player) && player.isOnGround()) {
cache.add(player);
}
}
cache.forEach(player -> {
if (player != null && !player.isOnGround()) {
BlockPos blockPos = BlockPos.ofFloored(player.getPos());
double yOffset = 0.001f;
if (mc.world.getBlockState(blockPos).getBlock() == Blocks.SNOW) {
yOffset = 0.126f;
}
circles.add(new Circle(
new Vec3d(player.getX(), Math.floor(player.getY()) + yOffset, player.getZ()),
new Timer()
));
cache.remove(player);
}
});
circles.removeIf(c -> c.timer.passedMs((long) animationDuration.getCurrentValue()));
}
@Override
public void onEnable() {
circles.clear();
cache.clear();
customTexture = Rockstar.id("textures/jumpcircle/custom.png");
super.onEnable();
Rockstar.getInstance().getEventManager().subscribe(onRender3D);
}
@Override
public void onDisable() {
circles.clear();
cache.clear();
super.onDisable();
Rockstar.getInstance().getEventManager().unsubscribe(onRender3D);
}
private static class Circle {
private final Vec3d pos;
private final Timer timer;
public Circle(Vec3d pos, Timer timer) {
this.pos = pos;
this.timer = timer;
}
}
private static class Timer {
private final long startTime;
public Timer() {
this.startTime = System.currentTimeMillis();
}
public long getPassedTimeMs() {
return System.currentTimeMillis() - startTime;
}
public boolean passedMs(long ms) {
return getPassedTimeMs() >= ms;
}
}
}
Пожалуйста, авторизуйтесь для просмотра ссылки.