Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ yarn_mappings=1.21.4+build.8
loader_version=0.16.14

# Mod Properties
mod_version=0.7.0
mod_version=0.7.2
maven_group=com.genyo
archives_base_name=genyo-addon

Expand Down
2 changes: 2 additions & 0 deletions src/main/java/com/genyo/addon/GenyoAddon.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.genyo.addon.modules.AngelSexHulkenberg;
import com.genyo.addon.modules.GenyoAutoEZ;
import com.genyo.addon.modules.GenyoSurround;
import com.genyo.addon.modules.GenyoWelcome;
import com.genyo.addon.systems.enemies.EnemiesTab;
import com.genyo.addon.hud.InCombatHud;
import com.genyo.addon.hud.PvPNeccessaryHud;
Expand Down Expand Up @@ -61,6 +62,7 @@ private void initModules(Modules modules) {
modules.add(new GenyoAutoEZ());
modules.add(new AngelSexHulkenberg());
modules.add(new GenyoSurround());
modules.add(new GenyoWelcome());
}

private void initHUD(Hud hud) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.genyo.addon.mixin;

import com.genyo.addon.screens.PlayerListScreen;
import com.genyo.addon.settings.PlayerListSetting;
import meteordevelopment.meteorclient.gui.DefaultSettingsWidgetFactory;
import meteordevelopment.meteorclient.gui.GuiTheme;
import meteordevelopment.meteorclient.gui.utils.SettingsWidgetFactory;
import meteordevelopment.meteorclient.gui.widgets.containers.WContainer;
import meteordevelopment.meteorclient.gui.widgets.containers.WTable;
import meteordevelopment.meteorclient.settings.Setting;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

import static meteordevelopment.meteorclient.MeteorClient.mc;

@Mixin(DefaultSettingsWidgetFactory.class)
public abstract class DefaultSettingsWidgetFactoryMixin extends SettingsWidgetFactory {

@Shadow
private void selectW(WContainer c, Setting<?> setting, Runnable action) {}

public DefaultSettingsWidgetFactoryMixin(GuiTheme theme) {
super(theme);
}

@Inject(method = "<init>", at = @At("TAIL"))
protected void genyo(CallbackInfo info) {
factories.put(PlayerListSetting.class, (table, setting) -> playerListW(table, (PlayerListSetting) setting));
}

private void playerListW(WTable table, PlayerListSetting setting) {
selectW(table, setting, () -> mc.setScreen(new PlayerListScreen(theme, "Add Players", setting)));
}
}
3 changes: 1 addition & 2 deletions src/main/java/com/genyo/addon/modules/GenyoAutoEZ.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import meteordevelopment.meteorclient.events.packets.PacketEvent;
import meteordevelopment.meteorclient.events.world.TickEvent;
import meteordevelopment.meteorclient.settings.*;
import meteordevelopment.meteorclient.systems.modules.Module;
import meteordevelopment.meteorclient.utils.player.ChatUtils;
import meteordevelopment.orbit.EventHandler;
import meteordevelopment.orbit.EventPriority;
Expand Down Expand Up @@ -166,7 +165,7 @@ private boolean checkPersonValidity(PlayerEntity player) {
return true;
}

//TODO: if we want to display this for everyone, then implement something here
//TODO: if we want to display this for everyone

return false;
}
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/genyo/addon/modules/GenyoModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ public void sendDisableMsg(String text) {
sendMessage(Text.of(msg), hashCode());
}

public void sendBOInfo(String text) {
public void sendInfo(String text) {
if (mc.world == null) return;

ChatUtils.forceNextPrefixClass(getClass());
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/genyo/addon/modules/GenyoSurround.java
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ private void onTick(TickEvent.Pre event) {
if (delayTicks >= placeDelay.get()) {
delayTicks = 0;
if (disableOnJump.get() && mc.options.jumpKey.isPressed() && mc.player.isOnGround()) {
sendBOInfo("Player jumped, disabling.");
sendInfo("Player jumped, disabling.");
toggle();
} else {
FindItemResult obsidian = InvUtils.findInHotbar(Items.OBSIDIAN);
Expand Down
258 changes: 258 additions & 0 deletions src/main/java/com/genyo/addon/modules/GenyoWelcome.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,258 @@
package com.genyo.addon.modules;

import com.genyo.addon.GenyoAddon;
import com.genyo.addon.settings.PlayerListSetting;
import com.mojang.authlib.GameProfile;
import com.mojang.util.UndashedUuid;
import meteordevelopment.meteorclient.events.game.GameJoinedEvent;
import meteordevelopment.meteorclient.events.game.GameLeftEvent;
import meteordevelopment.meteorclient.events.packets.PacketEvent;
import meteordevelopment.meteorclient.events.world.TickEvent;
import meteordevelopment.meteorclient.settings.IntSetting;
import meteordevelopment.meteorclient.settings.Setting;
import meteordevelopment.meteorclient.settings.SettingGroup;
import meteordevelopment.meteorclient.settings.StringSetting;
import meteordevelopment.meteorclient.utils.misc.ISerializable;
import meteordevelopment.meteorclient.utils.network.Http;
import meteordevelopment.meteorclient.utils.network.PacketUtils;
import meteordevelopment.meteorclient.utils.player.ChatUtils;
import meteordevelopment.meteorclient.utils.render.PlayerHeadTexture;
import meteordevelopment.meteorclient.utils.render.PlayerHeadUtils;
import meteordevelopment.orbit.EventHandler;
import meteordevelopment.orbit.EventPriority;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.PlayerListEntry;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.network.packet.s2c.play.GameJoinS2CPacket;
import net.minecraft.network.packet.s2c.play.PlayerListS2CPacket;
import net.minecraft.util.profiling.jfr.event.PacketReceivedEvent;
import org.jetbrains.annotations.NotNull;

import javax.annotation.Nullable;
import java.util.*;

public class GenyoWelcome extends GenyoModule {

public static List<ListPlayer> genyo = new ArrayList<>();

private Set<UUID> onlinePlayers = new HashSet<>();
private final List<Message> messageQueue = new LinkedList<>();
private int timer = 0;

private final SettingGroup sgGeneral = settings.getDefaultGroup();

private final Setting<List<ListPlayer>> players = sgGeneral.add(new PlayerListSetting.Builder()
.name("Players")
.description("sdasdjgewqjhgfjhgewjhfg ew gfjhewgfhjgwehjf gjhwe few")
.onChanged(this::refreshList)
.build()
);

private final Setting<String> message = sgGeneral.add(new StringSetting.Builder()
.name("Message")
.description("<NAME> ewhfhewjkfhejwkhfhewkjfhewjkfhkjewhfkhewfke")
.defaultValue("genyo <NAME>")
.build()
);

private final Setting<Integer> tickDelay = sgGeneral.add(new IntSetting.Builder()
.name("Delay")
.description("tick delay between the messages.")
.defaultValue(0)
.min(0)
.sliderRange(0, 100)
.build()
);

@Override
public void onActivate() {
onlinePlayers.clear();
}

public GenyoWelcome() {
super(GenyoAddon.GENYO, "Genyo Welcome", "i love kiwi. i love kiwi. i love kiwi. i love kiwi. i love kiwi.");
}

@EventHandler
private void onGameJoined(GameJoinedEvent event) {
if (mc.player == null && mc.world == null) return;
onlinePlayers.clear();
mc.getNetworkHandler().getPlayerList().iterator().forEachRemaining(p -> {
if (p.getProfile() != null) onlinePlayers.add(p.getProfile().getId());
});
}

@EventHandler
private void onGameLeft(GameLeftEvent event) {
onlinePlayers.clear();
}

@EventHandler(priority = EventPriority.HIGHEST)
private void onTick(TickEvent.Pre event) {
if (mc.player == null && mc.world == null) return;
timer++;

if (timer >= tickDelay.get() && !messageQueue.isEmpty()) {
Message msg = messageQueue.get(0);
ChatUtils.sendPlayerMsg(msg.message);
timer = 0;

if (msg.kill) messageQueue.clear();
else messageQueue.removeFirst();
}
}

@EventHandler
private void onReceivePacket(PacketEvent.Receive event) {
if (event.packet instanceof PlayerListS2CPacket pac) {
pac.getEntries().forEach(entry -> {
GameProfile profile = entry.profile();
if (profile == null) return;

String name = profile.getName();
if (!contains(name)) return;
UUID playerUuid = profile.getId();
GenyoAddon.LOG.info("asd");
if (!pac.getActions().contains(PlayerListS2CPacket.Action.ADD_PLAYER)
&& playerUuid != null && !onlinePlayers.contains(playerUuid)) return;

handleMessage(name);
onlinePlayers.add(playerUuid);
});
}
}

private void handleMessage(String name) {
if (mc.world == null) return;

String toSend = message.get();
toSend = toSend.contains("<NAME>") ? toSend.replace("<NAME>", name) : toSend;

Message msg = new Message(toSend, false);
messageQueue.add(msg);
}

private boolean contains(String name) {
for (ListPlayer listPlayer : players.get()) {
if (listPlayer.name.equalsIgnoreCase(name)) return true;
}

return false;
}

private void refreshList(List<ListPlayer> a) {
genyo = a;
}

public static ListPlayer get(String name) {
for (ListPlayer player : genyo) {
if (player == null) return null;

if (player.name.equalsIgnoreCase(name)) {
return player;
}
}

return null;
}

public boolean isInList(String name) {
return get(name) != null;
}

public static ListPlayer createListPlayer(String name) {
return new ListPlayer(name);
}

public static class ListPlayer implements ISerializable<ListPlayer>, Comparable<ListPlayer> {
private static final MinecraftClient mc = MinecraftClient.getInstance();

public volatile String name;
private volatile @Nullable UUID id;
private volatile @Nullable PlayerHeadTexture headTexture;
private volatile boolean updating;

public ListPlayer(String name, @Nullable UUID id) {
this.name = name;
this.id = id;
this.headTexture = null;
}

public ListPlayer(PlayerEntity player) {
this(player.getName().getString(), player.getUuid());
}

public ListPlayer(String name) {
this(name, null);
}

public UUID getId() {
return id;
}

public String getName() {
return name;
}

public PlayerHeadTexture getHead() {
return headTexture != null ? headTexture : PlayerHeadUtils.STEVE_HEAD;
}

public void updateInfo() {
updating = true;
APIResponse res = Http.get("https://api.mojang.com/users/profiles/minecraft/" + name).sendJson(APIResponse.class);
if (res == null || res.name == null || res.id == null) return;
name = res.name;
id = UndashedUuid.fromStringLenient(res.id);
mc.execute(() -> headTexture = PlayerHeadUtils.fetchHead(id));
updating = false;
}

public boolean headTextureNeedsUpdate() {
return !this.updating && headTexture == null;
}

@Override
public NbtCompound toTag() {
NbtCompound tag = new NbtCompound();

tag.putString("name", name);
if (id != null) tag.putString("id", UndashedUuid.toString(id));

return tag;
}

@Override
public ListPlayer fromTag(NbtCompound tag) {
return this;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ListPlayer player = (ListPlayer) o;
return Objects.equals(name, player.name);
}

@Override
public int hashCode() {
return Objects.hash(name);
}

@Override
public int compareTo(@NotNull GenyoWelcome.ListPlayer player) {
return name.compareTo(player.name);
}

private static class APIResponse {
String name, id;
}
}

private record Message(String message, boolean kill) {
}


}
Loading
Loading