Skip to content
Draft
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
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ public static void init() {
add(new EnchantCommand());
add(new FakePlayerCommand());
add(new FriendsCommand());
add(new EnemiesCommand());
add(new CommandsCommand());
add(new InventoryCommand());
add(new NbtCommand());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
/*
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client).
* Copyright (c) Meteor Development.
*/

package meteordevelopment.meteorclient.commands.arguments;

import com.google.common.collect.Streams;
import com.mojang.brigadier.StringReader;
import com.mojang.brigadier.arguments.ArgumentType;
import com.mojang.brigadier.context.CommandContext;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import com.mojang.brigadier.suggestion.Suggestions;
import com.mojang.brigadier.suggestion.SuggestionsBuilder;
import meteordevelopment.meteorclient.systems.targeting.SavedPlayer;
import meteordevelopment.meteorclient.systems.targeting.Targeting;

import java.util.Collection;
import java.util.List;
import java.util.concurrent.CompletableFuture;

import static net.minecraft.command.CommandSource.suggestMatching;

// TODO: functionality duplication

public class EnemyArgumentType implements ArgumentType<String> {
private static final EnemyArgumentType INSTANCE = new EnemyArgumentType();
private static final Collection<String> EXAMPLES = List.of("seasnail8169", "MineGame159");

public static EnemyArgumentType create() {
return INSTANCE;
}

public static SavedPlayer get(CommandContext<?> context) {
return Targeting.getFriend(context.getArgument("enemy", String.class));
}

private EnemyArgumentType() {}

@Override
public String parse(StringReader reader) throws CommandSyntaxException {
return reader.readString();
}

@Override
public <S> CompletableFuture<Suggestions> listSuggestions(CommandContext<S> context, SuggestionsBuilder builder) {
return suggestMatching(Streams.stream(Targeting.get().getEnemies()).map(SavedPlayer::getName), builder);
}

@Override
public Collection<String> getExamples() {
return EXAMPLES;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import com.mojang.brigadier.suggestion.Suggestions;
import com.mojang.brigadier.suggestion.SuggestionsBuilder;
import meteordevelopment.meteorclient.systems.friends.Friend;
import meteordevelopment.meteorclient.systems.friends.Friends;
import meteordevelopment.meteorclient.systems.targeting.SavedPlayer;
import meteordevelopment.meteorclient.systems.targeting.Targeting;

import java.util.Collection;
import java.util.List;
Expand All @@ -29,8 +29,8 @@ public static FriendArgumentType create() {
return INSTANCE;
}

public static Friend get(CommandContext<?> context) {
return Friends.get().get(context.getArgument("friend", String.class));
public static SavedPlayer get(CommandContext<?> context) {
return Targeting.getFriend(context.getArgument("friend", String.class));
}

private FriendArgumentType() {}
Expand All @@ -42,7 +42,7 @@ public String parse(StringReader reader) throws CommandSyntaxException {

@Override
public <S> CompletableFuture<Suggestions> listSuggestions(CommandContext<S> context, SuggestionsBuilder builder) {
return suggestMatching(Streams.stream(Friends.get()).map(Friend::getName), builder);
return suggestMatching(Streams.stream(Targeting.get().getFriends()).map(SavedPlayer::getName), builder);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
/*
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client).
* Copyright (c) Meteor Development.
*/

package meteordevelopment.meteorclient.commands.commands;

import com.mojang.authlib.GameProfile;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import meteordevelopment.meteorclient.commands.Command;
import meteordevelopment.meteorclient.commands.arguments.EnemyArgumentType;
import meteordevelopment.meteorclient.commands.arguments.PlayerListEntryArgumentType;
import meteordevelopment.meteorclient.systems.targeting.SavedPlayer;
import meteordevelopment.meteorclient.systems.targeting.Targeting;
import meteordevelopment.meteorclient.utils.player.ChatUtils;
import net.minecraft.command.CommandSource;
import net.minecraft.util.Formatting;

// TODO: functionality duplication

public class EnemiesCommand extends Command {
public EnemiesCommand() {
super("enemies", "Manages enemies.");
}

@Override
public void build(LiteralArgumentBuilder<CommandSource> builder) {
builder.then(literal("add")
.then(argument("player", PlayerListEntryArgumentType.create())
.executes(context -> {
GameProfile profile = PlayerListEntryArgumentType.get(context).getProfile();
SavedPlayer enemy = new SavedPlayer(profile.name(), profile.id());

if (Targeting.get().addEnemy(enemy)) {
ChatUtils.sendMsg(enemy.hashCode(), Formatting.GRAY, "Added (highlight)%s (default)to enemies.".formatted(enemy.getName()));
}
else error("Already enemies with that player.");

return SINGLE_SUCCESS;
})
)
);

builder.then(literal("remove")
.then(argument("enemy", EnemyArgumentType.create())
.executes(context -> {
SavedPlayer enemy = EnemyArgumentType.get(context);
if (enemy == null) {
error("Not enemies with that player.");
return SINGLE_SUCCESS;
}

if (Targeting.get().removeEnemy(enemy)) {
ChatUtils.sendMsg(enemy.hashCode(), Formatting.GRAY, "Removed (highlight)%s (default)from enemies.".formatted(enemy.getName()));
}
else error("Failed to remove that enemy.");

return SINGLE_SUCCESS;
})
)
);

builder.then(literal("list").executes(context -> {
info("--- Targeting ((highlight)%s(default)) ---", Targeting.get().countEnemies());
Targeting.get().getEnemies().forEach(enemy -> ChatUtils.info("(highlight)%s".formatted(enemy.getName())));
return SINGLE_SUCCESS;
})
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
import meteordevelopment.meteorclient.commands.Command;
import meteordevelopment.meteorclient.commands.arguments.FriendArgumentType;
import meteordevelopment.meteorclient.commands.arguments.PlayerListEntryArgumentType;
import meteordevelopment.meteorclient.systems.friends.Friend;
import meteordevelopment.meteorclient.systems.friends.Friends;
import meteordevelopment.meteorclient.systems.targeting.SavedPlayer;
import meteordevelopment.meteorclient.systems.targeting.Targeting;
import meteordevelopment.meteorclient.utils.player.ChatUtils;
import net.minecraft.command.CommandSource;
import net.minecraft.util.Formatting;
Expand All @@ -27,9 +27,9 @@ public void build(LiteralArgumentBuilder<CommandSource> builder) {
.then(argument("player", PlayerListEntryArgumentType.create())
.executes(context -> {
GameProfile profile = PlayerListEntryArgumentType.get(context).getProfile();
Friend friend = new Friend(profile.name(), profile.id());
SavedPlayer friend = new SavedPlayer(profile.name(), profile.id());

if (Friends.get().add(friend)) {
if (Targeting.get().addFriend(friend)) {
ChatUtils.sendMsg(friend.hashCode(), Formatting.GRAY, "Added (highlight)%s (default)to friends.".formatted(friend.getName()));
}
else error("Already friends with that player.");
Expand All @@ -42,13 +42,13 @@ public void build(LiteralArgumentBuilder<CommandSource> builder) {
builder.then(literal("remove")
.then(argument("friend", FriendArgumentType.create())
.executes(context -> {
Friend friend = FriendArgumentType.get(context);
SavedPlayer friend = FriendArgumentType.get(context);
if (friend == null) {
error("Not friends with that player.");
return SINGLE_SUCCESS;
}

if (Friends.get().remove(friend)) {
if (Targeting.get().removeFriend(friend)) {
ChatUtils.sendMsg(friend.hashCode(), Formatting.GRAY, "Removed (highlight)%s (default)from friends.".formatted(friend.getName()));
}
else error("Failed to remove that friend.");
Expand All @@ -59,8 +59,8 @@ public void build(LiteralArgumentBuilder<CommandSource> builder) {
);

builder.then(literal("list").executes(context -> {
info("--- Friends ((highlight)%s(default)) ---", Friends.get().count());
Friends.get().forEach(friend -> ChatUtils.info("(highlight)%s".formatted(friend.getName())));
info("--- Targeting ((highlight)%s(default)) ---", Targeting.get().countFriends());
Targeting.get().getFriends().forEach(friend -> ChatUtils.info("(highlight)%s".formatted(friend.getName())));
return SINGLE_SUCCESS;
})
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
import meteordevelopment.meteorclient.commands.Command;
import meteordevelopment.meteorclient.renderer.Fonts;
import meteordevelopment.meteorclient.systems.Systems;
import meteordevelopment.meteorclient.systems.friends.Friend;
import meteordevelopment.meteorclient.systems.friends.Friends;
import meteordevelopment.meteorclient.systems.targeting.SavedPlayer;
import meteordevelopment.meteorclient.systems.targeting.Targeting;
import meteordevelopment.meteorclient.utils.network.Capes;
import meteordevelopment.meteorclient.utils.network.MeteorExecutor;
import net.minecraft.command.CommandSource;
Expand All @@ -28,7 +28,8 @@ public void build(LiteralArgumentBuilder<CommandSource> builder) {
Systems.load();
Capes.init();
Fonts.refresh();
MeteorExecutor.execute(() -> Friends.get().forEach(Friend::updateInfo));
MeteorExecutor.execute(() -> Targeting.get().getFriends().forEach(SavedPlayer::updateInfo));
MeteorExecutor.execute(() -> Targeting.get().getEnemies().forEach(SavedPlayer::updateInfo));

return SINGLE_SUCCESS;
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public static void init() {
add(new ConfigTab());
add(new GuiTab());
add(new HudTab());
add(new FriendsTab());
add(new TargetingTab());
add(new MacrosTab());
add(new ProfilesTab());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,40 +12,50 @@
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.WButton;
import meteordevelopment.meteorclient.gui.widgets.pressable.WMinus;
import meteordevelopment.meteorclient.gui.widgets.pressable.WPlus;
import meteordevelopment.meteorclient.systems.friends.Friend;
import meteordevelopment.meteorclient.systems.friends.Friends;
import meteordevelopment.meteorclient.systems.targeting.SavedPlayer;
import meteordevelopment.meteorclient.systems.targeting.Targeting;
import meteordevelopment.meteorclient.utils.misc.NbtUtils;
import meteordevelopment.meteorclient.utils.network.MeteorExecutor;
import net.minecraft.client.gui.screen.Screen;

import java.util.function.Consumer;

import static meteordevelopment.meteorclient.MeteorClient.mc;

public class FriendsTab extends Tab {
public FriendsTab() {
super("Friends");
public class TargetingTab extends Tab {
public TargetingTab() {
super("Players");
}

@Override
public TabScreen createScreen(GuiTheme theme) {
return new FriendsScreen(theme, this);
return new TargetingScreen(theme, this);
}

@Override
public boolean isScreen(Screen screen) {
return screen instanceof FriendsScreen;
return screen instanceof TargetingScreen;
}

private static class FriendsScreen extends WindowTabScreen {
public FriendsScreen(GuiTheme theme, Tab tab) {
private static class TargetingScreen extends WindowTabScreen {
public TargetingScreen(GuiTheme theme, Tab tab) {
super(theme, tab);
}

@Override
public void initWidgets() {
WTable table = add(theme.table()).expandX().minWidth(400).widget();
initTable(table);
WTable outerTable = add(theme.table()).expandX().minWidth(800).widget();
WTable friends = outerTable.add(theme.table()).expandX().minWidth(400).top().widget();
outerTable.add(theme.verticalSeparator());
WTable enemies = outerTable.add(theme.table()).expandX().minWidth(400).top().widget();

Targeting targeting = Targeting.get();

initTable(friends, "Friends", targeting.getFriends(), targeting::removeFriend);
initTable(enemies, "Enemies", targeting.getEnemies(), targeting::removeEnemy);

add(theme.horizontalSeparator()).expandX();

Expand All @@ -55,12 +65,14 @@ public void initWidgets() {
WTextBox nameW = list.add(theme.textBox("", (text, c) -> c != ' ')).expandX().widget();
nameW.setFocused(true);

WPlus add = list.add(theme.plus()).widget();
add.action = () -> {
WButton addF = list.add(theme.button("Friend")).widget();
WButton addE = list.add(theme.button("Enemy")).widget();

addF.action = () -> {
String name = nameW.get().trim();
Friend friend = new Friend(name);
SavedPlayer friend = new SavedPlayer(name);

if (Friends.get().add(friend)) {
if (targeting.addFriend(friend)) {
nameW.set("");
reload();

Expand All @@ -71,28 +83,44 @@ public void initWidgets() {
}
};

enterAction = add.action;
addE.action = () -> {
String name = nameW.get().trim();
SavedPlayer enemy = new SavedPlayer(name);

if (targeting.addEnemy(enemy)) {
nameW.set("");
reload();

MeteorExecutor.execute(() -> {
enemy.updateInfo();
mc.execute(this::reload);
});
}
};
}

private void initTable(WTable table) {
private void initTable(WTable table, String title,Iterable<SavedPlayer> source, Consumer<SavedPlayer> removeAction) {
table.clear();
if (Friends.get().isEmpty()) return;

Friends.get().forEach(friend ->
table.add(theme.label(title, true)).expandCellX().centerX();

table.row();

source.forEach(friend ->
MeteorExecutor.execute(() -> {
if (friend.headTextureNeedsUpdate()) {
friend.updateInfo();
}
})
);

for (Friend friend : Friends.get()) {
for (SavedPlayer friend : source) {
table.add(theme.texture(32, 32, friend.getHead().needsRotate() ? 90 : 0, friend.getHead()));
table.add(theme.label(friend.getName()));

WMinus remove = table.add(theme.minus()).expandCellX().right().widget();
remove.action = () -> {
Friends.get().remove(friend);
removeAction.accept(friend);
reload();
};

Expand All @@ -102,12 +130,12 @@ private void initTable(WTable table) {

@Override
public boolean toClipboard() {
return NbtUtils.toClipboard(Friends.get());
return NbtUtils.toClipboard(Targeting.get());
}

@Override
public boolean fromClipboard() {
return NbtUtils.fromClipboard(Friends.get());
return NbtUtils.fromClipboard(Targeting.get());
}
}
}
Loading