From aa40213b24ff1948a38d0e3b8a54f68e56fdbf38 Mon Sep 17 00:00:00 2001 From: Cloudburst Date: Sat, 12 Jun 2021 15:46:20 +0200 Subject: [PATCH] added .gui heads --- .../rejects/MeteorRejectsAddon.java | 1 + .../rejects/commands/ScreenCommand.java | 29 ++++ .../rejects/gui/screens/HeadScreen.java | 139 ++++++++++++++++++ 3 files changed, 169 insertions(+) create mode 100644 src/main/java/cloudburst/rejects/commands/ScreenCommand.java create mode 100644 src/main/java/cloudburst/rejects/gui/screens/HeadScreen.java diff --git a/src/main/java/cloudburst/rejects/MeteorRejectsAddon.java b/src/main/java/cloudburst/rejects/MeteorRejectsAddon.java index e8420e8..6181128 100644 --- a/src/main/java/cloudburst/rejects/MeteorRejectsAddon.java +++ b/src/main/java/cloudburst/rejects/MeteorRejectsAddon.java @@ -61,6 +61,7 @@ public class MeteorRejectsAddon extends MeteorAddon { commands.add(new AntiAntiXrayCommand()); commands.add(new GiveCommand()); commands.add(new SaveSkinCommand()); + commands.add(new ScreenCommand()); commands.add(new ServerCommand()); commands.add(new SetBlockCommand()); commands.add(new TeleportCommand()); diff --git a/src/main/java/cloudburst/rejects/commands/ScreenCommand.java b/src/main/java/cloudburst/rejects/commands/ScreenCommand.java new file mode 100644 index 0000000..898d03b --- /dev/null +++ b/src/main/java/cloudburst/rejects/commands/ScreenCommand.java @@ -0,0 +1,29 @@ +package cloudburst.rejects.commands; + +import com.mojang.brigadier.builder.LiteralArgumentBuilder; + +import net.minecraft.command.CommandSource; + +import cloudburst.rejects.gui.screens.HeadScreen; +import minegame159.meteorclient.MeteorClient; +import minegame159.meteorclient.gui.GuiThemes; +import minegame159.meteorclient.systems.commands.Command; + +public class ScreenCommand extends Command { + + public ScreenCommand() { + super("screen", "Displays different screens", "gui"); + } + + @Override + public void build(LiteralArgumentBuilder builder) { + builder.then(literal("heads").executes(ctx -> { + MeteorClient.INSTANCE.screenToOpen = new HeadScreen(GuiThemes.get()); + + return 1; + })); + + } + + +} diff --git a/src/main/java/cloudburst/rejects/gui/screens/HeadScreen.java b/src/main/java/cloudburst/rejects/gui/screens/HeadScreen.java new file mode 100644 index 0000000..c489211 --- /dev/null +++ b/src/main/java/cloudburst/rejects/gui/screens/HeadScreen.java @@ -0,0 +1,139 @@ +package cloudburst.rejects.gui.screens; + +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtList; +import net.minecraft.network.packet.c2s.play.CreativeInventoryActionC2SPacket; +import net.minecraft.text.LiteralText; + +import minegame159.meteorclient.gui.GuiTheme; +import minegame159.meteorclient.gui.WidgetScreen; +import minegame159.meteorclient.gui.WindowScreen; +import minegame159.meteorclient.gui.widgets.containers.WTable; +import minegame159.meteorclient.gui.widgets.pressable.WButton; +import minegame159.meteorclient.settings.EnumSetting; +import minegame159.meteorclient.settings.Setting; +import minegame159.meteorclient.settings.SettingGroup; +import minegame159.meteorclient.settings.Settings; +import minegame159.meteorclient.utils.network.HttpUtils; +import minegame159.meteorclient.utils.network.MeteorExecutor; +import minegame159.meteorclient.utils.player.ChatUtils; +import minegame159.meteorclient.utils.player.SlotUtils; + +import static minegame159.meteorclient.utils.Utils.mc; + +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.*; +import java.lang.reflect.Type; + +import com.google.common.reflect.TypeToken; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +public class HeadScreen extends WindowScreen { + + public enum Categories { + Alphabet, + Animals, + Blocks, + Decoration, + Food_Drinks, + Humanoid, + Miscellaneous, + Monsters, + Plants + } + + private static final Type gsonType = new TypeToken>>() {}.getType(); + + private final Settings settings = new Settings(); + private final SettingGroup sgGeneral = settings.getDefaultGroup(); + private static Categories category = Categories.Decoration; + private final Setting categorySetting = sgGeneral.add(new EnumSetting.Builder() + .name("Category") + .defaultValue(category) + .description("Category") + .onChanged((v) -> this.loadHeads()) + .build() + ); + + private static final Gson gson = new GsonBuilder() + .create(); + + public HeadScreen(GuiTheme theme) { + super(theme, "Heads"); + loadHeads(); + } + + private void set() { + clear(); + add(theme.settings(settings)).expandX(); + add(theme.horizontalSeparator()).expandX(); + } + + private String getCat() { + category = categorySetting.get(); + return category.toString().replace("_", "-"); + } + + private void loadHeads() { + MeteorExecutor.execute(() -> { + InputStream in = HttpUtils.get("https://minecraft-heads.com/scripts/api.php?cat="+getCat()); + List> res = gson.fromJson(new InputStreamReader(in, StandardCharsets.UTF_8), gsonType); + List heads = new ArrayList<>(); + res.forEach(a -> { + try { + heads.add(createHeadStack(a.get("uuid"), a.get("value"), a.get("name"))); + } catch (Exception e) { } + }); + + WTable t = theme.table(); + for (ItemStack head : heads) { + t.add(theme.item(head)); + t.add(theme.label(head.getName().asString())); + WButton give = t.add(theme.button("Give")).widget(); + give.action = () -> { + addItem(head); + }; + t.row(); + } + set(); + add(t).expandX().minWidth(400).widget(); + }); + } + + private ItemStack createHeadStack(String uuid, String value, String name) { + ItemStack head = Items.PLAYER_HEAD.getDefaultStack(); + NbtCompound tag = new NbtCompound(); + NbtCompound skullOwner = new NbtCompound(); + skullOwner.putUuid("Id", UUID.fromString(uuid)); + NbtCompound properties = new NbtCompound(); + NbtList textures = new NbtList(); + NbtCompound Value = new NbtCompound(); + Value.putString("Value", value); + textures.add(Value); + properties.put("textures", textures); + skullOwner.put("Properties", properties); + tag.put("SkullOwner", skullOwner); + head.setTag(tag); + head.setCustomName(new LiteralText(name)); + return head; + } + + private void addItem(ItemStack item) { + if (!mc.player.getAbilities().creativeMode) { + ChatUtils.error("Heads", "You must be in creative mode to use this."); + return; + } + for(int i = 0; i < 36; i++) { + ItemStack stack = mc.player.getInventory().getStack(SlotUtils.indexToId(i)); + if (stack == null || !stack.isEmpty() || stack.getItem() != Items.AIR) continue; + mc.player.networkHandler.sendPacket(new CreativeInventoryActionC2SPacket(SlotUtils.indexToId(i), item)); + return; + } + ChatUtils.error("Heads", "No space in hotbar."); + } +}