feat: new module UpdateESP
This commit is contained in:
parent
28a7cb9660
commit
9eab4544b0
1 changed files with 150 additions and 0 deletions
150
src/main/java/ftbsc/bscv/modules/vision/UpdateESP.java
Normal file
150
src/main/java/ftbsc/bscv/modules/vision/UpdateESP.java
Normal file
|
@ -0,0 +1,150 @@
|
|||
package ftbsc.bscv.modules.vision;
|
||||
|
||||
import java.util.Map.Entry;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
import com.google.auto.service.AutoService;
|
||||
import com.mojang.blaze3d.matrix.MatrixStack;
|
||||
import com.mojang.blaze3d.systems.RenderSystem;
|
||||
|
||||
import ftbsc.bscv.api.ILoadable;
|
||||
import ftbsc.bscv.modules.QuickModule;
|
||||
import ftbsc.bscv.patches.PacketPatch.PacketEvent;
|
||||
import ftbsc.bscv.tools.Setting;
|
||||
import net.minecraft.client.renderer.BufferBuilder;
|
||||
import net.minecraft.client.renderer.Tessellator;
|
||||
import net.minecraft.client.renderer.WorldRenderer;
|
||||
import net.minecraft.client.renderer.WorldVertexBufferUploader;
|
||||
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
|
||||
import net.minecraft.network.play.server.SChangeBlockPacket;
|
||||
import net.minecraft.network.play.server.SMultiBlockChangePacket;
|
||||
import net.minecraft.util.Tuple;
|
||||
import net.minecraft.util.math.vector.Vector3d;
|
||||
import net.minecraft.util.math.vector.Vector3i;
|
||||
import net.minecraftforge.client.event.RenderWorldLastEvent;
|
||||
import net.minecraftforge.common.ForgeConfigSpec;
|
||||
import net.minecraftforge.event.TickEvent;
|
||||
import net.minecraftforge.event.TickEvent.Phase;
|
||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||
|
||||
@AutoService(ILoadable.class)
|
||||
public class UpdateESP extends QuickModule {
|
||||
|
||||
public final ForgeConfigSpec.ConfigValue<Integer> duration;
|
||||
public final ForgeConfigSpec.ConfigValue<Double> alpha;
|
||||
public final ForgeConfigSpec.ConfigValue<Double> width;
|
||||
public final ForgeConfigSpec.ConfigValue<Boolean> fade;
|
||||
|
||||
public UpdateESP() {
|
||||
super();
|
||||
|
||||
this.updates = new ConcurrentLinkedQueue<>();
|
||||
|
||||
this.duration = Setting.Number.builder()
|
||||
.min(0)
|
||||
.fallback(250)
|
||||
.name("duration")
|
||||
.comment("how long to show block updates")
|
||||
.build(this);
|
||||
|
||||
this.alpha = Setting.Decimal.builder()
|
||||
.min(0.)
|
||||
.max(1.)
|
||||
.fallback(.25)
|
||||
.name("alpha")
|
||||
.comment("alpha channel value for highlights")
|
||||
.build(this);
|
||||
|
||||
this.width = Setting.Decimal.builder()
|
||||
.min(0.)
|
||||
.fallback(1.)
|
||||
.name("width")
|
||||
.comment("line width for highlights")
|
||||
.build(this);
|
||||
|
||||
this.fade = Setting.Bool.builder()
|
||||
.fallback(true)
|
||||
.name("fade")
|
||||
.comment("gradually decrease alpha to disappear smoothly")
|
||||
.build(this);
|
||||
}
|
||||
|
||||
private final ConcurrentLinkedQueue<Tuple<Vector3i, Long>> updates;
|
||||
|
||||
private float getAlpha(float multiplier, long insert, long now, long duration) {
|
||||
long age = now - insert;
|
||||
if (age > duration) return 0.f;
|
||||
return multiplier * (1.f - ((float) age / (float) duration));
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void onRenderWorld(RenderWorldLastEvent event) {
|
||||
RenderSystem.pushMatrix(); // ??
|
||||
|
||||
RenderSystem.enableBlend();
|
||||
RenderSystem.disableTexture();
|
||||
RenderSystem.disableDepthTest();
|
||||
RenderSystem.lineWidth(this.width.get().floatValue());
|
||||
|
||||
Vector3d projectedView = MC.gameRenderer.getMainCamera().getPosition().scale(-1);
|
||||
MatrixStack stack = event.getMatrixStack();
|
||||
stack.pushPose(); // ??
|
||||
stack.translate(projectedView.x(), projectedView.y(), projectedView.z());
|
||||
|
||||
BufferBuilder builder = Tessellator.getInstance().getBuilder();
|
||||
builder.begin(GL11.GL_LINES, DefaultVertexFormats.POSITION_COLOR);
|
||||
|
||||
long time = System.currentTimeMillis();
|
||||
long duration = this.duration.get();
|
||||
float multiplier = this.alpha.get().floatValue();
|
||||
boolean fade = this.fade.get();
|
||||
|
||||
for (Tuple<Vector3i, Long> entry : this.updates) {
|
||||
Vector3i pos = entry.getA();
|
||||
WorldRenderer.renderLineBox(
|
||||
stack, builder,
|
||||
pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1,
|
||||
1.f, 1.f, 1.f, fade ? this.getAlpha(multiplier, entry.getB(), time, duration) : multiplier
|
||||
);
|
||||
}
|
||||
|
||||
builder.end();
|
||||
WorldVertexBufferUploader.end(builder);
|
||||
stack.popPose(); // ??
|
||||
|
||||
RenderSystem.lineWidth(1.f);
|
||||
RenderSystem.enableTexture();
|
||||
RenderSystem.enableDepthTest();
|
||||
RenderSystem.disableBlend();
|
||||
RenderSystem.enableCull();
|
||||
|
||||
RenderSystem.popMatrix(); // ??
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void onTick(TickEvent.ClientTickEvent event) {
|
||||
if (event.phase == Phase.END) return;
|
||||
long time = System.currentTimeMillis();
|
||||
long duration = this.duration.get();
|
||||
while (this.updates.peek() != null && time - this.updates.peek().getB() > duration) {
|
||||
this.updates.poll();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@SubscribeEvent
|
||||
public void onPacket(PacketEvent.Incoming event) {
|
||||
if (event.packet instanceof SChangeBlockPacket) {
|
||||
SChangeBlockPacket packet = (SChangeBlockPacket) event.packet;
|
||||
this.updates.add(new Tuple<>(packet.getPos(), System.currentTimeMillis()));
|
||||
}
|
||||
|
||||
if (event.packet instanceof SMultiBlockChangePacket) {
|
||||
SMultiBlockChangePacket packet = (SMultiBlockChangePacket) event.packet;
|
||||
packet.runUpdates( (pos, state) -> this.updates.add(new Tuple<>(pos, System.currentTimeMillis())) );
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue