Skip to content
7 changes: 6 additions & 1 deletion src/main/java/com/genyo/Genyo.java
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,12 @@ private void initSystems() {

private void initModules(Modules modules) {
modules.add(new GenyoAutoEZ());
modules.add(new AutoPortal());
// modules.add(new GenyoLogoutPoints());
modules.add(new GenyoLogoutSpots());
modules.add(new GenyoNoMineAnimation());
modules.add(new GenyoAutoPortal());
modules.add(new MineESP());
modules.add(new GenyoAutoPortal());
modules.add(new MineESP());
modules.add(new GenyoNuker());
modules.add(new NoSwing());
Expand Down
22 changes: 16 additions & 6 deletions src/main/java/com/genyo/core/Core.java
Original file line number Diff line number Diff line change
Expand Up @@ -54,19 +54,26 @@ private float humanizeVolume(float min, float max) {
@EventHandler
public void onMessageReceive(ReceiveMessageEvent event) {
String message = event.getMessage().getString().toLowerCase();
GenyoConfig cfg = GenyoConfig.get();
if (cfg == null) return;

if (message.contains("genyo") && !message.startsWith("§")) {
Managers.SOUND.playSound(VINE);
if (cfg.vineSound.get()) {
Managers.SOUND.playSound(VINE, cfg.vineVolume.get());
}
} else if (message.contains("verstappen")) {
Managers.SOUND.playSound(VERSTAPPEN);
} else if ((message.contains("nigga") || message.contains("nigger")) &&
(GenyoConfig.get().blackPerson.get()) && GenyoConfig.get() != null) {
if (cfg.verstappenSound.get()) {
Managers.SOUND.playSound(VERSTAPPEN, cfg.verstappenVolume.get());
}
} else if ((message.contains("nigga") || message.contains("nigger")) && cfg.blackPerson.get()) {
if (soundTimer.passed(6000)) {
Managers.SOUND.playSound(BLACK, 10);
soundTimer.reset();
}
} else if (message.contains("kiwi")) {
Managers.SOUND.playSound(KIWI);
if (cfg.kiwiSound.get()) {
Managers.SOUND.playSound(KIWI, cfg.kiwiVolume.get());
}
}
}

Expand All @@ -75,7 +82,10 @@ public void onPlayerRender(EntityAddedEvent event) {
if (!(event.entity instanceof PlayerEntity player)) return;
if (!Enemies.get().isEnemy(player)) return;

Managers.SOUND.playSound(HAMBURGER);
GenyoConfig cfg = GenyoConfig.get();
if (cfg != null && cfg.hamburgerSound.get()) {
Managers.SOUND.playSound(HAMBURGER, cfg.hamburgerVolume.get());
}
}

}
6 changes: 5 additions & 1 deletion src/main/java/com/genyo/managers/combat/CombatManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.genyo.events.UnderCombatEvent;
import com.genyo.managers.Managers;
import com.genyo.core.sound.SoundManager;
import com.genyo.systems.config.GenyoConfig;
import com.genyo.utils.GenyoChatUtils;
import meteordevelopment.meteorclient.MeteorClient;
import meteordevelopment.meteorclient.events.entity.player.AttackEntityEvent;
Expand Down Expand Up @@ -61,7 +62,10 @@ public void onPacketReceive(PacketEvent.Receive event) {
"\n\nReason: " + Formatting.GREEN + "ewrhjfkjerkjfhrejkgkregr" + Formatting.GRAY +
"\nConclusion: " + Formatting.GREEN + "Skill issue. :(");

Managers.SOUND.playSound(SoundManager.SCREAM, 80);
GenyoConfig cfg = GenyoConfig.get();
if (cfg != null && cfg.screamSound.get()) {
Managers.SOUND.playSound(SoundManager.SCREAM, cfg.screamVolume.get());
}
}
}
}
Expand Down
11 changes: 11 additions & 0 deletions src/main/java/com/genyo/mixin/accessor/AccessorCrystalAura.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.genyo.mixin.accessor;

import meteordevelopment.meteorclient.systems.modules.combat.CrystalAura;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;

@Mixin(CrystalAura.class)
public interface AccessorCrystalAura {
@Accessor("placing")
boolean isPlacing();
}
13 changes: 13 additions & 0 deletions src/main/java/com/genyo/mixin/accessor/AccessorLogoutSpots.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.genyo.mixin.accessor;

import meteordevelopment.meteorclient.systems.modules.render.LogoutSpots;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;

import java.util.List;

@Mixin(LogoutSpots.class)
public interface AccessorLogoutSpots {
@Accessor("players")
List<Object> getPlayers();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.genyo.mixin.entity.player;


import com.genyo.render.FrozenPlayerRenderState;
import com.genyo.render.RenderStateCache;
import net.minecraft.client.render.entity.LivingEntityRenderer;
import net.minecraft.client.render.entity.state.LivingEntityRenderState;
import net.minecraft.client.render.entity.state.PlayerEntityRenderState;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

@Mixin(LivingEntityRenderer.class)
public class MixinLivingEntityRenderer {

@Inject(method = "updateRenderState(Lnet/minecraft/entity/LivingEntity;Lnet/minecraft/client/render/entity/state/LivingEntityRenderState;F)V", at = @At("TAIL"))
private void genyo$captureState(LivingEntity entity, LivingEntityRenderState state, float tickDelta, CallbackInfo ci) {
if (entity instanceof PlayerEntity player && state instanceof PlayerEntityRenderState playerState) {
RenderStateCache.put(player.getUuid(), FrozenPlayerRenderState.copyOf(playerState));
}
}
}
16 changes: 10 additions & 6 deletions src/main/java/com/genyo/mixin/meteor/MixinWWidget.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ private void onMouseMoved(double mouseX, double mouseY,

if (mouseOver && !genyo_wasOver) {
GenyoConfig cfg = GenyoConfig.get();
if (cfg != null && cfg.guiSounds.get()) {
if (cfg != null && cfg.hoverSoundEnabled.get()) {
float vol = cfg.hoverVolume.get() / 100f;
Managers.SOUND.playUISound(SoundManager.GUI_HOVER, vol, 1f);
}
Expand All @@ -44,14 +44,18 @@ private void onMouseClicked(Click click, boolean doubled,
if (!mouseOver) return;

GenyoConfig cfg = GenyoConfig.get();
if (cfg == null || !cfg.guiSounds.get()) return;

float vol = cfg.clickVolume.get() / 100f;
if (cfg == null) return;

if (click.button() == 0) {
Managers.SOUND.playUISound(SoundManager.GUI_CLICK_LEFT, vol, 1f);
if (cfg.clickLeftSoundEnabled.get()) {
float vol = cfg.clickLeftVolume.get() / 100f;
Managers.SOUND.playUISound(SoundManager.GUI_CLICK_LEFT, vol, 1f);
}
} else if (click.button() == 1) {
Managers.SOUND.playUISound(SoundManager.GUI_CLICK_RIGHT, vol, 1f);
if (cfg.clickRightSoundEnabled.get()) {
float vol = cfg.clickRightVolume.get() / 100f;
Managers.SOUND.playUISound(SoundManager.GUI_CLICK_RIGHT, vol, 1f);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.genyo.mixin.render;

import com.genyo.systems.modules.visual.GenyoNoMineAnimation;
import meteordevelopment.meteorclient.systems.modules.Modules;
import net.minecraft.client.render.WorldRenderer;
import net.minecraft.util.math.BlockPos;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

@Mixin(WorldRenderer.class)
public abstract class MixinWorldRendererBreaking {

@Inject(method = "setBlockBreakingInfo", at = @At("HEAD"), cancellable = true)
private void genyo$hookSetBlockBreakingInfo(int breakerId, BlockPos pos, int stage, CallbackInfo ci) {
GenyoNoMineAnimation module = Modules.get().get(GenyoNoMineAnimation.class);
if (module != null && module.shouldCancel(breakerId)) {
ci.cancel();
}
}
}
78 changes: 78 additions & 0 deletions src/main/java/com/genyo/render/FrozenPlayerRenderState.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package com.genyo.render;

import net.minecraft.client.render.entity.state.PlayerEntityRenderState;

/** A frozen, non-mutating copy of a PlayerEntityRenderState, captured at logout. */
public class FrozenPlayerRenderState extends PlayerEntityRenderState {

public static FrozenPlayerRenderState copyOf(PlayerEntityRenderState src) {
FrozenPlayerRenderState f = new FrozenPlayerRenderState();

// EntityRenderState
f.entityType = src.entityType;
f.x = src.x; f.y = src.y; f.z = src.z;
f.age = src.age;
f.width = src.width; f.height = src.height;
f.standingEyeHeight = src.standingEyeHeight;
f.invisible = src.invisible;
f.sneaking = src.sneaking;
f.onFire = src.onFire;
f.light = src.light;
f.outlineColor = src.outlineColor;

// LivingEntityRenderState
f.bodyYaw = src.bodyYaw;
f.relativeHeadYaw = src.relativeHeadYaw;
f.pitch = src.pitch;
f.deathTime = src.deathTime;
f.limbSwingAnimationProgress = src.limbSwingAnimationProgress;
f.limbSwingAmplitude = src.limbSwingAmplitude;
f.baseScale = src.baseScale;
f.ageScale = src.ageScale;
f.flipUpsideDown = src.flipUpsideDown;
f.shaking = src.shaking;
f.baby = src.baby;
f.touchingWater = src.touchingWater;
f.usingRiptide = src.usingRiptide;
f.hurt = src.hurt;
f.pose = src.pose;

// ArmedEntityRenderState
f.mainArm = src.mainArm;
f.rightArmPose = src.rightArmPose;
f.leftArmPose = src.leftArmPose;
f.rightHandItem = src.rightHandItem.copy();
f.leftHandItem = src.leftHandItem.copy();
f.swingAnimationType = src.swingAnimationType;
f.handSwingProgress = src.handSwingProgress; // frozen value; won't animate further, which is intended

// BipedEntityRenderState
f.leaningPitch = src.leaningPitch;
f.limbAmplitudeInverse = src.limbAmplitudeInverse;
f.crossbowPullTime = src.crossbowPullTime;
f.itemUseTime = src.itemUseTime;
f.preferredArm = src.preferredArm;
f.activeHand = src.activeHand;
f.isInSneakingPose = src.isInSneakingPose;
f.isGliding = src.isGliding;
f.isSwimming = src.isSwimming;
f.hasVehicle = src.hasVehicle;
f.isUsingItem = src.isUsingItem;
f.equippedHeadStack = src.equippedHeadStack.copy();
f.equippedChestStack = src.equippedChestStack.copy();
f.equippedLegsStack = src.equippedLegsStack.copy();
f.equippedFeetStack = src.equippedFeetStack.copy();

// PlayerEntityRenderState
f.skinTextures = src.skinTextures;
f.spectator = src.spectator;
f.hatVisible = src.hatVisible;
f.jacketVisible = src.jacketVisible;
f.leftPantsLegVisible = src.leftPantsLegVisible;
f.rightPantsLegVisible = src.rightPantsLegVisible;
f.leftSleeveVisible = src.leftSleeveVisible;
f.rightSleeveVisible = src.rightSleeveVisible;

return f;
}
}
132 changes: 132 additions & 0 deletions src/main/java/com/genyo/render/PlayerWireframeRenderer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
package com.genyo.render;

import meteordevelopment.meteorclient.renderer.Renderer3D;
import meteordevelopment.meteorclient.events.render.Render3DEvent;
import meteordevelopment.meteorclient.utils.render.color.Color;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.model.ModelPart;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.util.math.RotationAxis;
import org.joml.Matrix4f;
import org.joml.Vector3f;

public class PlayerWireframeRenderer {

private static final int[][] EDGES = {
{0, 1}, {1, 2}, {2, 3}, {3, 0}, // bottom face
{4, 5}, {5, 6}, {6, 7}, {7, 4}, // top face
{0, 4}, {1, 5}, {2, 6}, {3, 7} // verticals connecting bottom to top
};

// 4 corner indices (winding order) per face of the box
private static final int[][] FACES = {
{0, 1, 2, 3}, // bottom
{4, 5, 6, 7}, // top
{0, 1, 5, 4},
{1, 2, 6, 5},
{2, 3, 7, 6},
{3, 0, 4, 7}
};

public static void render(Render3DEvent event, ModelPart root,
double originX, double originY, double originZ,
float bodyYaw, Color lineColor, Color sideColor, double lineThickness) {
Renderer3D renderer = event.renderer;
MatrixStack matrices = new MatrixStack();

matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(180.0F - bodyYaw));
matrices.scale(-1.0F, -1.0F, 1.0F);
matrices.translate(0.0F, -1.501F, 0.0F);

// Camera position, used to billboard thick-line quads so they face the viewer
var cam = MinecraftClient.getInstance().gameRenderer.getCamera().getCameraPos();


root.forEachCuboid(matrices, (entry, path, index, cuboid) -> {
Matrix4f mat = entry.getPositionMatrix();

Vector3f[] corners = new Vector3f[] {
new Vector3f(cuboid.minX / 16f, cuboid.minY / 16f, cuboid.minZ / 16f),
new Vector3f(cuboid.maxX / 16f, cuboid.minY / 16f, cuboid.minZ / 16f),
new Vector3f(cuboid.maxX / 16f, cuboid.minY / 16f, cuboid.maxZ / 16f),
new Vector3f(cuboid.minX / 16f, cuboid.minY / 16f, cuboid.maxZ / 16f),
new Vector3f(cuboid.minX / 16f, cuboid.maxY / 16f, cuboid.minZ / 16f),
new Vector3f(cuboid.maxX / 16f, cuboid.maxY / 16f, cuboid.minZ / 16f),
new Vector3f(cuboid.maxX / 16f, cuboid.maxY / 16f, cuboid.maxZ / 16f),
new Vector3f(cuboid.minX / 16f, cuboid.maxY / 16f, cuboid.maxZ / 16f),
};

for (Vector3f corner : corners) mat.transformPosition(corner);

// Filled side faces
if (sideColor.a > 0) {
for (int[] face : FACES) {
Vector3f a = corners[face[0]];
Vector3f b = corners[face[1]];
Vector3f c = corners[face[2]];
Vector3f d = corners[face[3]];

renderer.quad(
originX + a.x, originY + a.y, originZ + a.z,
originX + b.x, originY + b.y, originZ + b.z,
originX + c.x, originY + c.y, originZ + c.z,
originX + d.x, originY + d.y, originZ + d.z,
sideColor
);
}
}

// Wireframe edges, thickened into billboarded quads
for (int[] edge : EDGES) {
Vector3f a = corners[edge[0]];
Vector3f b = corners[edge[1]];

drawThickLine(
renderer,
originX + a.x, originY + a.y, originZ + a.z,
originX + b.x, originY + b.y, originZ + b.z,
lineColor, lineThickness, cam.x, cam.y, cam.z
);
}
});
}

/**
* Draws a line as a camera-facing quad so it can be given a world-space thickness.
* Falls back visually to a hairline at very small thickness values.
*/
private static void drawThickLine(Renderer3D renderer,
double x1, double y1, double z1,
double x2, double y2, double z2,
Color color, double thickness,
double camX, double camY, double camZ) {
// Direction of the line segment
double dx = x2 - x1, dy = y2 - y1, dz = z2 - z1;
double len = Math.sqrt(dx * dx + dy * dy + dz * dz);
if (len < 1e-6) return;
dx /= len; dy /= len; dz /= len;

// Vector from line midpoint to camera, used to find a perpendicular
double mx = (x1 + x2) / 2, my = (y1 + y2) / 2, mz = (z1 + z2) / 2;
double toCamX = camX - mx, toCamY = camY - my, toCamZ = camZ - mz;

// perpendicular = normalize(dir x toCam)
double px = dy * toCamZ - dz * toCamY;
double py = dz * toCamX - dx * toCamZ;
double pz = dx * toCamY - dy * toCamX;
double plen = Math.sqrt(px * px + py * py + pz * pz);
if (plen < 1e-6) return; // line is pointing directly at camera, degenerate
double half = thickness / 32.0; // thickness setting is in "block/16ths"-ish units; tune to taste
px = px / plen * half;
py = py / plen * half;
pz = pz / plen * half;

renderer.quad(
x1 - px, y1 - py, z1 - pz,
x1 + px, y1 + py, z1 + pz,
x2 + px, y2 + py, z2 + pz,
x2 - px, y2 - py, z2 - pz,
color
);
}
}
Loading
Loading