Skip to content

Commit 6cea1d3

Browse files
committed
Merge branch 'feature/renderer'
2 parents d89d7f1 + 58095ea commit 6cea1d3

File tree

77 files changed

+1122
-777
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

77 files changed

+1122
-777
lines changed

common/src/main/java/com/lambda/mixin/render/ChatScreenMixin.java

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package com.lambda.mixin.render;
22

3+
import com.lambda.Lambda;
34
import com.lambda.command.CommandManager;
45
import com.lambda.graphics.renderer.gui.font.FontRenderer;
56
import com.lambda.graphics.renderer.gui.font.LambdaEmoji;
67
import com.lambda.graphics.renderer.gui.font.glyph.GlyphInfo;
8+
import com.lambda.module.modules.client.LambdaMoji;
9+
import com.lambda.util.math.Vec2d;
710
import kotlin.Pair;
811
import kotlin.ranges.IntRange;
912
import net.minecraft.client.gui.screen.ChatScreen;
@@ -13,16 +16,22 @@
1316
import org.spongepowered.asm.mixin.injection.ModifyArg;
1417
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
1518

19+
import java.util.ArrayList;
1620
import java.util.Collections;
1721
import java.util.List;
1822

1923
@Mixin(ChatScreen.class)
2024
public abstract class ChatScreenMixin {
2125
@ModifyArg(method = "sendMessage", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayNetworkHandler;sendChatMessage(Ljava/lang/String;)V"), index = 0)
2226
private String modifyChatText(String chatText) {
27+
if (LambdaMoji.INSTANCE.isDisabled()) return chatText;
28+
2329
List<Pair<GlyphInfo, IntRange>> emojis = FontRenderer.Companion.parseEmojis(chatText, LambdaEmoji.Twemoji);
2430
Collections.reverse(emojis);
2531

32+
List<String> pushEmojis = new ArrayList<>();
33+
List<Vec2d> pushPositions = new ArrayList<>();
34+
2635
for (Pair<GlyphInfo, IntRange> emoji : emojis) {
2736
String emojiString = chatText.substring(emoji.getSecond().getStart() + 1, emoji.getSecond().getEndInclusive());
2837
if (LambdaEmoji.Twemoji.get(emojiString) == null)
@@ -33,10 +42,20 @@ private String modifyChatText(String chatText) {
3342
// and render it after the text
3443
chatText = chatText.substring(0, emoji.getSecond().getStart()) + " " + chatText.substring(emoji.getSecond().getEndInclusive() + 1);
3544

36-
// TODO: Build a renderer for the emojis
37-
// TODO: Render the emojis at their correct position
45+
// We cannot retain the position in the future, but we can
46+
// assume that every time you send a message the height of
47+
// the position will change by the height of the glyph
48+
// The positions are from the top left corner of the screen
49+
int x = Lambda.getMc().textRenderer.getWidth(chatText.substring(0, emoji.getSecond().getStart()));
50+
int y = Lambda.getMc().textRenderer.fontHeight;
51+
52+
pushEmojis.add(String.format(":%s:", emojiString));
53+
pushPositions.add(new Vec2d(x, y));
3854
}
3955

56+
// Not optimal because it has to parse the emoji again but who cares
57+
LambdaMoji.INSTANCE.add(pushEmojis, pushPositions);
58+
4059
return chatText;
4160
}
4261

common/src/main/kotlin/com/lambda/Lambda.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,5 +42,9 @@ object Lambda {
4242
.registerTypeAdapter(GameProfile::class.java, GameProfileSerializer)
4343
.create()
4444

45-
fun initialize() = Loader.initialize()
45+
fun initialize() {
46+
recordRenderCall {
47+
Loader.initialize()
48+
}
49+
}
4650
}

common/src/main/kotlin/com/lambda/config/groups/BuildConfig.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@ interface BuildConfig {
1111
val breaksPerTick: Int
1212
val rotateForBreak: Boolean
1313
val rotateForPlace: Boolean
14+
val pingTimeout: Boolean
1415
}

common/src/main/kotlin/com/lambda/config/groups/BuildSettings.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ class BuildSettings(
77
vis: () -> Boolean = { true }
88
) : BuildConfig {
99
enum class Page {
10-
BREAK, PLACE, PATHING
10+
BREAK, PLACE, GENERAL
1111
}
1212

1313
private val page by c.setting("Build Page", Page.BREAK, "Current page", vis)
@@ -17,11 +17,13 @@ class BuildSettings(
1717
override val breakWeakBlocks by c.setting("Break Weak Blocks", false, "Break blocks that dont have structural integrity (e.g: grass)") { vis() && page == Page.BREAK }
1818
override val breaksPerTick by c.setting("Instant Breaks Per Tick", 10, 1..30, 1, "Maximum instant block breaks per tick") { vis() && page == Page.BREAK }
1919
override val rotateForBreak by c.setting("Rotate For Break", false, "Rotate towards block while breaking") { vis() && page == Page.BREAK }
20+
override val collectDrops by c.setting("Collect All Drops", false, "Collect all drops when breaking blocks") { vis() && page == Page.BREAK }
2021

2122
override val placeCooldown by c.setting("Place Cooldown", 0, 0..1000, 1, "Delay between placing blocks", " ms") { vis() && page == Page.PLACE }
22-
override val placeConfirmation by c.setting("Place Confirmation", false, "Wait for block placement confirmation") { vis() && page == Page.PLACE }
23-
override val collectDrops by c.setting("Collect All Drops", false, "Collect all drops when breaking blocks") { vis() && page == Page.PLACE }
23+
override val placeConfirmation by c.setting("Place Confirmation", true, "Wait for block placement confirmation") { vis() && page == Page.PLACE }
24+
2425
override val rotateForPlace by c.setting("Rotate For Place", true, "Rotate towards block while placing") { vis() && page == Page.PLACE }
2526

26-
override val pathing by c.setting("Pathing", true, "Path to blocks") { vis() && page == Page.PATHING }
27+
override val pathing by c.setting("Pathing", true, "Path to blocks") { vis() && page == Page.GENERAL }
28+
override val pingTimeout by c.setting("Ping Timeout", true, "Timeout on high ping") { vis() && page == Page.GENERAL }
2729
}

common/src/main/kotlin/com/lambda/core/Loader.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ object Loader {
2828
HudGuiConfigurable,
2929
FriendRegistry,
3030
SoundRegistry,
31+
TimerManager,
32+
PingManager,
3133
ContainerManager
3234
)
3335

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.lambda.core
2+
3+
import com.lambda.event.events.PacketEvent
4+
import com.lambda.event.events.TickEvent
5+
import com.lambda.event.listener.SafeListener.Companion.listener
6+
import com.lambda.util.collections.LimitedOrderedSet
7+
import net.minecraft.network.packet.c2s.query.QueryPingC2SPacket
8+
import net.minecraft.network.packet.s2c.query.PingResultS2CPacket
9+
import net.minecraft.util.Util
10+
11+
object PingManager : Loadable {
12+
private val pings: LimitedOrderedSet<Long> = LimitedOrderedSet(100)
13+
private const val INTERVAL = 1
14+
15+
val lastPing: Long
16+
get() = pings.lastOrNull() ?: 0
17+
18+
init {
19+
listener<TickEvent.Pre> {
20+
connection.sendPacket(QueryPingC2SPacket(Util.getMeasuringTimeMs()))
21+
}
22+
23+
listener<PacketEvent.Receive.Pre> { event ->
24+
if (event.packet !is PingResultS2CPacket) return@listener
25+
26+
pings.add(Util.getMeasuringTimeMs() - event.packet.startTime)
27+
}
28+
}
29+
}

common/src/main/kotlin/com/lambda/core/TimerManager.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import com.lambda.event.events.ClientEvent
55
import com.lambda.event.events.TickEvent
66
import com.lambda.event.listener.UnsafeListener.Companion.unsafeListener
77

8-
object TimerManager {
8+
object TimerManager : Loadable {
99
@JvmStatic
1010
var tickLength = 50f; private set
1111

common/src/main/kotlin/com/lambda/event/events/RenderEvent.kt

Lines changed: 7 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4,39 +4,19 @@ import com.lambda.Lambda.mc
44
import com.lambda.event.Event
55
import com.lambda.event.callback.Cancellable
66
import com.lambda.event.callback.ICancellable
7-
import com.lambda.graphics.renderer.esp.DirectionMask
8-
import com.lambda.graphics.renderer.esp.EntityEspRenderer
7+
import com.lambda.graphics.renderer.esp.global.BlockESPRenderer
8+
import com.lambda.graphics.renderer.esp.global.EntityESPRenderer
99
import com.lambda.util.math.Vec2d
10-
import net.minecraft.entity.Entity
11-
import java.awt.Color
1210

1311
abstract class RenderEvent : Event {
1412
class World : RenderEvent()
1513

14+
class BlockESP : RenderEvent() {
15+
val renderer = BlockESPRenderer
16+
}
17+
1618
class EntityESP : RenderEvent() {
17-
fun build(
18-
entity: Entity,
19-
filledColor: Color,
20-
outlineColor: Color,
21-
sides: Int = DirectionMask.ALL,
22-
outlineMode: DirectionMask.OutlineMode = DirectionMask.OutlineMode.OR
23-
) {
24-
buildFilled(entity, filledColor, sides)
25-
buildOutline(entity, outlineColor, sides, outlineMode)
26-
}
27-
28-
fun buildFilled(
29-
entity: Entity,
30-
color: Color,
31-
sides: Int = DirectionMask.ALL
32-
) = EntityEspRenderer.buildFilled(entity, color, sides)
33-
34-
fun buildOutline(
35-
entity: Entity,
36-
color: Color,
37-
sides: Int = DirectionMask.ALL,
38-
outlineMode: DirectionMask.OutlineMode = DirectionMask.OutlineMode.OR
39-
) = EntityEspRenderer.buildOutline(entity, color, sides, outlineMode)
19+
val renderer = EntityESPRenderer
4020
}
4121

4222
abstract class GUI(val scale: Double) : RenderEvent() {

common/src/main/kotlin/com/lambda/graphics/RenderMain.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ import com.lambda.graphics.gl.GlStateUtils.setupGL
77
import com.lambda.graphics.gl.Matrices
88
import com.lambda.graphics.gl.Matrices.resetMatrix
99
import com.lambda.graphics.gl.Matrices.translate
10-
import com.lambda.graphics.renderer.esp.EntityEspRenderer
10+
import com.lambda.graphics.renderer.esp.global.BlockESPRenderer
11+
import com.lambda.graphics.renderer.esp.global.EntityESPRenderer
1112
import com.lambda.module.modules.client.GuiSettings
1213
import com.lambda.util.math.Vec2d
1314
import com.mojang.blaze3d.systems.RenderSystem.getProjectionMatrix
@@ -41,7 +42,8 @@ object RenderMain {
4142

4243
setupGL {
4344
RenderEvent.World().post()
44-
EntityEspRenderer.render()
45+
BlockESPRenderer.render()
46+
EntityESPRenderer.render()
4547
}
4648
}
4749

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
package com.lambda.graphics.buffer
2+
import com.lambda.Lambda.mc
3+
import com.lambda.graphics.RenderMain
4+
import com.lambda.graphics.buffer.vao.VAO
5+
import com.lambda.graphics.buffer.vao.vertex.VertexAttrib
6+
import com.lambda.graphics.buffer.vao.vertex.VertexMode
7+
import com.lambda.graphics.gl.GlStateUtils.withBlendFunc
8+
import com.lambda.graphics.shader.Shader
9+
import com.lambda.graphics.texture.TextureUtils.bindTexture
10+
import com.lambda.graphics.texture.TextureUtils.setupTexture
11+
import com.lambda.util.math.Vec2d
12+
import org.lwjgl.opengl.GL30.*
13+
import java.nio.IntBuffer
14+
15+
class FrameBuffer(private val depth: Boolean = false) {
16+
private val fbo = glGenFramebuffers()
17+
18+
private val colorAttachment = glGenTextures()
19+
private val depthAttachment by lazy(::glGenTextures)
20+
21+
private val clearMask = if (!depth) GL_COLOR_BUFFER_BIT
22+
else GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT
23+
24+
private var width = 0
25+
private var height = 0
26+
27+
fun write(block: () -> Unit): FrameBuffer {
28+
val prev = lastFrameBuffer ?: mc.framebuffer.fbo
29+
30+
glBindFramebuffer(GL_FRAMEBUFFER, fbo)
31+
lastFrameBuffer = fbo
32+
33+
update()
34+
withBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA, block)
35+
36+
lastFrameBuffer = prev
37+
glBindFramebuffer(GL_FRAMEBUFFER, prev)
38+
return this
39+
}
40+
41+
fun read(
42+
shader: Shader,
43+
pos1: Vec2d = Vec2d.ZERO,
44+
pos2: Vec2d = RenderMain.screenSize,
45+
shaderBlock: (Shader) -> Unit = {}
46+
): FrameBuffer {
47+
bindColorTexture()
48+
49+
shader.use()
50+
shaderBlock(shader)
51+
52+
vao.use {
53+
grow(4)
54+
55+
val uv1 = pos1 / RenderMain.screenSize
56+
val uv2 = pos2 / RenderMain.screenSize
57+
58+
putQuad(
59+
vec2(pos1.x, pos1.y).vec2(uv1.x, 1.0 - uv1.y).end(),
60+
vec2(pos1.x, pos2.y).vec2(uv1.x, 1.0 - uv2.y).end(),
61+
vec2(pos2.x, pos2.y).vec2(uv2.x, 1.0 - uv2.y).end(),
62+
vec2(pos2.x, pos1.y).vec2(uv2.x, 1.0 - uv1.y).end()
63+
)
64+
}
65+
66+
withBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA) {
67+
vao.upload()
68+
vao.render()
69+
vao.clear()
70+
}
71+
72+
return this
73+
}
74+
75+
fun bindColorTexture(slot: Int = 0): FrameBuffer {
76+
bindTexture(colorAttachment, slot)
77+
return this
78+
}
79+
80+
fun bindDepthTexture(slot: Int = 0): FrameBuffer {
81+
check(depth) {
82+
"Cannot bind depth texture of a non-depth framebuffer"
83+
}
84+
85+
bindTexture(depthAttachment, slot)
86+
return this
87+
}
88+
89+
private fun update() {
90+
val widthIn = mc.window.framebufferWidth
91+
val heightIn = mc.window.framebufferHeight
92+
93+
if (width != widthIn || height != heightIn) {
94+
width = widthIn
95+
height = heightIn
96+
97+
setupBufferTexture(colorAttachment)
98+
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, null as IntBuffer?)
99+
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorAttachment, 0)
100+
101+
if (depth) {
102+
setupBufferTexture(depthAttachment)
103+
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, null as IntBuffer?)
104+
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthAttachment, 0)
105+
}
106+
107+
glClearColor(0f, 0f, 0f, 0f)
108+
glClearDepth(1.0)
109+
}
110+
111+
glClear(clearMask)
112+
}
113+
114+
private fun setupBufferTexture(id: Int) {
115+
bindTexture(id)
116+
setupTexture(GL_NEAREST, GL_NEAREST)
117+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
118+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
119+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)
120+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)
121+
}
122+
123+
companion object {
124+
private val vao = VAO(VertexMode.TRIANGLES, VertexAttrib.Group.POS_UV)
125+
private var lastFrameBuffer: Int? = null
126+
}
127+
}

0 commit comments

Comments
 (0)