diff --git a/build.gradle b/build.gradle index bf7ed78..429771b 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id "fabric-loom" version "1.8-SNAPSHOT" + id "fabric-loom" version "1.10-SNAPSHOT" } base { diff --git a/gradle.properties b/gradle.properties index 08afefc..c94ef18 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,12 +2,12 @@ org.gradle.jvmargs=-Xmx2G # Fabric Properties (https://fabricmc.net/develop) minecraft_version=1.21.4 -yarn_mappings=1.21.4+build.7 -loader_version=0.16.9 +yarn_mappings=1.21.4+build.8 +loader_version=0.16.14 # Mod Properties -mod_version=0.1.0 -maven_group=com.example -archives_base_name=addon-template +mod_version=0.6.9 +maven_group=com.genyo +archives_base_name=genyo-addon # Dependencies diff --git a/src/main/java/com/genyo/addon/GenyoAddon.java b/src/main/java/com/genyo/addon/GenyoAddon.java index 2ab6fe4..7177e91 100644 --- a/src/main/java/com/genyo/addon/GenyoAddon.java +++ b/src/main/java/com/genyo/addon/GenyoAddon.java @@ -1,14 +1,17 @@ package com.genyo.addon; +import com.genyo.addon.gui.EnemiesTab; import com.genyo.addon.hud.PvPNeccessaryHud; import com.genyo.addon.modules.GenyoAutoEZ; +import com.genyo.addon.systems.enemies.Enemies; import com.mojang.logging.LogUtils; import meteordevelopment.meteorclient.addons.GithubRepo; import meteordevelopment.meteorclient.addons.MeteorAddon; +import meteordevelopment.meteorclient.gui.tabs.Tabs; +import meteordevelopment.meteorclient.systems.Systems; import meteordevelopment.meteorclient.systems.hud.Hud; import meteordevelopment.meteorclient.systems.hud.HudGroup; import meteordevelopment.meteorclient.systems.modules.Category; -import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.systems.modules.Modules; import org.slf4j.Logger; @@ -21,8 +24,12 @@ public class GenyoAddon extends MeteorAddon { public void onInitialize() { LOG.info("Genyo fasz indul genyo"); + Systems.add(new Enemies()); + Modules.get().add(new GenyoAutoEZ()); + Tabs.add(new EnemiesTab()); + // HUD Hud.get().register(PvPNeccessaryHud.INFO); } diff --git a/src/main/java/com/genyo/addon/gui/EnemiesTab.java b/src/main/java/com/genyo/addon/gui/EnemiesTab.java new file mode 100644 index 0000000..6b87a7b --- /dev/null +++ b/src/main/java/com/genyo/addon/gui/EnemiesTab.java @@ -0,0 +1,123 @@ +package com.genyo.addon.gui; + +import com.genyo.addon.systems.enemies.Enemies; +import com.genyo.addon.systems.enemies.Enemy; +import meteordevelopment.meteorclient.gui.GuiTheme; +import meteordevelopment.meteorclient.gui.tabs.Tab; +import meteordevelopment.meteorclient.gui.tabs.TabScreen; +import meteordevelopment.meteorclient.gui.tabs.WindowTabScreen; +import meteordevelopment.meteorclient.gui.widgets.containers.WHorizontalList; +import meteordevelopment.meteorclient.gui.widgets.containers.WTable; +import meteordevelopment.meteorclient.gui.widgets.input.WTextBox; +import meteordevelopment.meteorclient.gui.widgets.pressable.WMinus; +import meteordevelopment.meteorclient.gui.widgets.pressable.WPlus; +import meteordevelopment.meteorclient.settings.Settings; +import meteordevelopment.meteorclient.utils.misc.NbtUtils; +import meteordevelopment.meteorclient.utils.network.MeteorExecutor; +import net.minecraft.client.gui.screen.Screen; + +public class EnemiesTab extends Tab { + + public EnemiesTab() { + super("Enemies"); + } + + @Override + public TabScreen createScreen(GuiTheme theme) { + return new EnemiesScreen(theme, this); + } + + @Override + public boolean isScreen(Screen screen) { + return screen instanceof EnemiesScreen; + } + + private static class EnemiesScreen extends WindowTabScreen { + private final Settings settings; + + public EnemiesScreen(GuiTheme theme, Tab tab) { + super(theme, tab); + + settings = Enemies.get().settings; + } + + @Override + public void initWidgets() { + WTable table = add(theme.table()).expandX().minWidth(400).widget(); + + add(theme.settings(settings)).expandX(); + + add(theme.horizontalSeparator()).expandX(); + + initTable(table); + + // New + WHorizontalList list = add(theme.horizontalList()).expandX().widget(); + + WTextBox nameW = list.add(theme.textBox("", (text, c) -> c != ' ')).expandX().widget(); + nameW.setFocused(true); + + WPlus add = list.add(theme.plus()).widget(); + add.action = () -> { + String name = nameW.get().trim(); + Enemy enemy = new Enemy(name); + + if (Enemies.get().add(enemy)) { + nameW.set(""); + reload(); + + MeteorExecutor.execute(() -> { + enemy.updateInfo(); + reload(); + }); + } + }; + + enterAction = add.action; + } + + private void initTable(WTable table) { + table.clear(); + if (Enemies.get().isEmpty()) return; + + Enemies.get().forEach(enemy -> + MeteorExecutor.execute(() -> { + if (enemy.headTextureNeedsUpdate()) { + enemy.updateInfo(); + reload(); + } + }) + ); + + for (Enemy enemy : Enemies.get()) { + table.add(theme.texture(32, 32, enemy.getHead().needsRotate() ? 90 : 0, enemy.getHead())); + table.add(theme.label(enemy.getName())); + + WMinus remove = table.add(theme.minus()).expandCellX().right().widget(); + remove.action = () -> { + Enemies.get().remove(enemy); + reload(); + }; + + table.row(); + } + } + + @Override + public void tick() { + super.tick(); + + settings.tick(window, theme); + } + + @Override + public boolean toClipboard() { + return NbtUtils.toClipboard(Enemies.get()); + } + + @Override + public boolean fromClipboard() { + return NbtUtils.fromClipboard(Enemies.get()); + } + } +} diff --git a/src/main/java/com/genyo/addon/mixin/FriendsInjector.java b/src/main/java/com/genyo/addon/mixin/FriendsInjector.java new file mode 100644 index 0000000..d52fe82 --- /dev/null +++ b/src/main/java/com/genyo/addon/mixin/FriendsInjector.java @@ -0,0 +1,21 @@ +package com.genyo.addon.mixin; + +import com.genyo.addon.systems.enemies.Enemies; +import meteordevelopment.meteorclient.systems.friends.Friend; +import meteordevelopment.meteorclient.systems.friends.Friends; +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.CallbackInfoReturnable; + +@Mixin(value = Friends.class, remap = false) +public class FriendsInjector { + + @Inject(at = @At("RETURN"), method = "add*") + private void injected(Friend friend, CallbackInfoReturnable cir) { + if (Enemies.get().get(friend.getName()) != null) { + Enemies.get().remove(Enemies.get().get(friend.getName())); + } + } + +} diff --git a/src/main/java/com/genyo/addon/mixin/PlayerUtilsMixin.java b/src/main/java/com/genyo/addon/mixin/PlayerUtilsMixin.java new file mode 100644 index 0000000..f6220da --- /dev/null +++ b/src/main/java/com/genyo/addon/mixin/PlayerUtilsMixin.java @@ -0,0 +1,23 @@ +package com.genyo.addon.mixin; + +import com.genyo.addon.systems.enemies.Enemies; +import meteordevelopment.meteorclient.utils.player.PlayerUtils; +import meteordevelopment.meteorclient.utils.render.color.Color; +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.CallbackInfoReturnable; + +@Mixin(value = PlayerUtils.class, remap = false) +public class PlayerUtilsMixin { + + @Inject(at = @At("TAIL"), method = "getPlayerColor*", cancellable = true) + private static void injectGetPlayerColor(PlayerEntity entity, Color defaultColor, CallbackInfoReturnable cir) { + if (Enemies.get().isEnemy(entity)) { + //cir.setReturnValue(new Color(245, 133, 125, 255)); + cir.setReturnValue(Enemies.get().getEnemyColor()); + } + } + +} diff --git a/src/main/java/com/genyo/addon/modules/GenyoAutoEZ.java b/src/main/java/com/genyo/addon/modules/GenyoAutoEZ.java index a0f3d73..45056e7 100644 --- a/src/main/java/com/genyo/addon/modules/GenyoAutoEZ.java +++ b/src/main/java/com/genyo/addon/modules/GenyoAutoEZ.java @@ -7,6 +7,7 @@ import meteordevelopment.meteorclient.systems.friends.Friends; import meteordevelopment.meteorclient.systems.modules.Module; import meteordevelopment.meteorclient.utils.player.ChatUtils; +import meteordevelopment.meteorclient.utils.player.PlayerUtils; import meteordevelopment.orbit.EventHandler; import meteordevelopment.orbit.EventPriority; import net.minecraft.client.network.AbstractClientPlayerEntity; @@ -77,8 +78,6 @@ public GenyoAutoEZ() { private float renderHealth; private float renderPing; - private final Map tog = new HashMap<>(); - @Override public void onActivate() { super.onActivate(); diff --git a/src/main/java/com/genyo/addon/systems/enemies/Enemies.java b/src/main/java/com/genyo/addon/systems/enemies/Enemies.java new file mode 100644 index 0000000..3bff3e4 --- /dev/null +++ b/src/main/java/com/genyo/addon/systems/enemies/Enemies.java @@ -0,0 +1,242 @@ +package com.genyo.addon.systems.enemies; + +import com.genyo.addon.GenyoAddon; +import com.mojang.util.UndashedUuid; +import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.systems.System; +import meteordevelopment.meteorclient.systems.Systems; +import meteordevelopment.meteorclient.systems.friends.Friends; +import meteordevelopment.meteorclient.utils.misc.Keybind; +import meteordevelopment.meteorclient.utils.misc.NbtUtils; +import meteordevelopment.meteorclient.utils.network.MeteorExecutor; +import meteordevelopment.meteorclient.utils.player.ChatUtils; +import meteordevelopment.meteorclient.utils.render.color.Color; +import meteordevelopment.meteorclient.utils.render.color.SettingColor; +import net.minecraft.client.network.PlayerListEntry; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtElement; +import org.jetbrains.annotations.NotNull; +import org.lwjgl.glfw.GLFW; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + +import static meteordevelopment.meteorclient.MeteorClient.mc; +import static meteordevelopment.meteorclient.utils.player.ChatUtils.info; + +public class Enemies extends System implements Iterable { + + private final List enemies = new ArrayList<>(); + + public final Settings settings = new Settings(); + + private final SettingGroup sgGeneral = settings.getDefaultGroup(); + private final SettingGroup sgMessage = settings.createGroup("Message"); + + private final Setting enemyColor = sgGeneral.add(new ColorSetting.Builder() + .name("esp-color") + .description("Brasil") + .defaultValue(new SettingColor(255, 100, 89, 255)) + .build() + ); + + private final Setting keybind = sgGeneral.add(new KeybindSetting.Builder() + .name("Keybind") + .description("Ecuadór") + .defaultValue(Keybind.fromKey(GLFW.GLFW_KEY_X)) + .action(this::genyo) + .build() + ); + + // Message + + private final Setting message = sgMessage.add(new BoolSetting.Builder() + .name("send-message") + .description("Megüzeni a kiválasztott emberpajtásunknak, hogy mi a téma.") + .defaultValue(false) + .build() + ); + + private final Setting messageMode = sgMessage.add(new EnumSetting.Builder() + .name("message-mode") + .description("Shabala babala /whisper oder /msg") + .defaultValue(MessageMode.Whisper) + .build() + ); + + private final Setting customMessage = sgMessage.add(new StringSetting.Builder() + .name("custom-message") + .description("Hajrá Mezőkövesd! :D :D :D") + .defaultValue("shabala babala niger biger.") + .build() + ); + + public Enemies() { + super("enemies"); + } + + public static Enemies get() { + return Systems.get(Enemies.class); + } + + public boolean add(Enemy enemy) { + if (enemy.name.isEmpty() || enemy.name.contains(" ")) return false; + + if (!enemies.contains(enemy)) { + if (Friends.get().get(enemy.getName()) != null) { + Friends.get().remove(Friends.get().get(enemy.getName())); + } + + enemies.add(enemy); + save(); + + return true; + } + + return false; + } + + public boolean remove(Enemy enemy) { + if (enemies.remove(enemy)) { + save(); + return true; + } + + return false; + } + + public Enemy get(String name) { + for (Enemy enemy : enemies) { + if (enemy.name.equalsIgnoreCase(name)) { + return enemy; + } + } + + return null; + } + + public Enemy get(PlayerEntity player) { + return get(player.getName().getString()); + } + + public Enemy get(PlayerListEntry player) { + return get(player.getProfile().getName()); + } + + public boolean isEnemy(PlayerEntity player) { + return player != null && get(player) != null; + } + + public boolean isEnemy(PlayerListEntry player) { + return get(player) != null; + } + + public boolean shouldAttack(PlayerEntity player) { + return isEnemy(player); + } + + public int count() { + return enemies.size(); + } + + public boolean isEmpty() { + return enemies.isEmpty(); + } + + @Override + public @NotNull Iterator iterator() { + return enemies.iterator(); + } + + @Override + public NbtCompound toTag() { + NbtCompound tag = new NbtCompound(); + + tag.put("friends", NbtUtils.listToTag(enemies)); + tag.put("settings", settings.toTag()); + + return tag; + } + + private void genyo() { + GenyoAddon.LOG.info("fa"); + + if (mc.targetedEntity == null) return; + if (!(mc.targetedEntity instanceof PlayerEntity player)) return; + + if (!isEnemy(player)) { + add(new Enemy(player)); + info("Added %s to enemies", player.getName().getString()); + if (getMessageBool()) { + String message = getCustomMessage(); + + switch (getMessageMode()) { + case MessageMode.Whisper: + ChatUtils.sendPlayerMsg("/whisper " + player.getName().getString() + " " + message); + GenyoAddon.LOG.info("/whisper " + player.getName().getString() + " " + message); + case MessageMode.Msg: + ChatUtils.sendPlayerMsg("/msg " + player.getName().getString() + " " + message); + } + } + } else { + remove(get(player)); + info("Removed %s from opps.", player.getName().getString()); + } + } + + @Override + public Enemies fromTag(NbtCompound tag) { + if (tag.contains("settings")) settings.fromTag(tag.getCompound("settings")); + + enemies.clear(); + + for (NbtElement itemTag : tag.getList("enemies", 0)) { + NbtCompound enemyTag = (NbtCompound) itemTag; + if (!enemyTag.contains("name")) continue; + + String name = enemyTag.getString("name"); + if (get(name) != null) continue; + + String uuid = enemyTag.getString("id"); + Enemy enemy = !uuid.isBlank() + ? new Enemy(name, UndashedUuid.fromStringLenient(uuid)) + : new Enemy(name); + + enemies.add(enemy); + } + + Collections.sort(enemies); + + MeteorExecutor.execute(() -> enemies.forEach(Enemy::updateInfo)); + + return this; + } + + public Color getEnemyColor() { + return enemyColor.get(); + } + + public Keybind getKeybind() { + return keybind.get(); + } + + public boolean getMessageBool() { + return message.get(); + } + + public String getCustomMessage() { + return customMessage.get(); + } + + public MessageMode getMessageMode() { + return messageMode.get(); + } + + public enum MessageMode { + Whisper, + Msg + } +} diff --git a/src/main/java/com/genyo/addon/systems/enemies/Enemy.java b/src/main/java/com/genyo/addon/systems/enemies/Enemy.java new file mode 100644 index 0000000..c2be935 --- /dev/null +++ b/src/main/java/com/genyo/addon/systems/enemies/Enemy.java @@ -0,0 +1,102 @@ +package com.genyo.addon.systems.enemies; + +import com.mojang.util.UndashedUuid; +import meteordevelopment.meteorclient.utils.misc.ISerializable; +import meteordevelopment.meteorclient.utils.network.Http; +import meteordevelopment.meteorclient.utils.render.PlayerHeadTexture; +import meteordevelopment.meteorclient.utils.render.PlayerHeadUtils; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.NbtCompound; +import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nullable; +import java.util.Objects; +import java.util.UUID; + +import static meteordevelopment.meteorclient.MeteorClient.mc; + +public class Enemy implements ISerializable, Comparable { + + public volatile String name; + private volatile @Nullable UUID id; + private volatile @Nullable PlayerHeadTexture headTexture; + private volatile boolean updating; + + public Enemy(String name, @Nullable UUID id) { + this.name = name; + this.id = id; + this.headTexture = null; + } + + public Enemy(PlayerEntity player) { + this(player.getName().getString(), player.getUuid()); + } + + public Enemy(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 Enemy fromTag(NbtCompound tag) { + return this; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Enemy friend = (Enemy) o; + return Objects.equals(name, friend.name); + } + + @Override + public int hashCode() { + return Objects.hash(name); + } + + @Override + public int compareTo(@NotNull Enemy enemy) { + return name.compareTo(enemy.name); + } + + private static class APIResponse { + String name, id; + } + +} diff --git a/src/main/resources/assets/template/icon.png b/src/main/resources/assets/genyo/icon.png similarity index 100% rename from src/main/resources/assets/template/icon.png rename to src/main/resources/assets/genyo/icon.png diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 6e88b65..f147bdb 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -9,9 +9,9 @@ "Barnika18ASDASDASDBLACKMAN" ], "contact": { - "repo": "https://www.youtube.com/" + "repo": "https://github.com/wuritz/genyo-addon" }, - "icon": "assets/template/icon.png", + "icon": "assets/genyo/icon.png", "environment": "client", "entrypoints": { "meteor": [ diff --git a/src/main/resources/genyo.mixins.json b/src/main/resources/genyo.mixins.json index 07f48a3..61bb683 100644 --- a/src/main/resources/genyo.mixins.json +++ b/src/main/resources/genyo.mixins.json @@ -3,7 +3,9 @@ "package": "com.genyo.addon.mixin", "compatibilityLevel": "JAVA_21", "client": [ - "HudRendererAccessor" + "HudRendererAccessor", + "PlayerUtilsMixin", + "FriendsInjector" ], "injectors": { "defaultRequire": 1