aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/chrisoft/trashyaddon/commands/MapTallyCommand.java
blob: cfeaee8aa8748125fac942f649842e8024bc02ae (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package org.chrisoft.trashyaddon.commands;

import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import meteordevelopment.meteorclient.MeteorClient;
import meteordevelopment.meteorclient.commands.Command;
import meteordevelopment.meteorclient.utils.player.ChatUtils;
import meteordevelopment.orbit.EventPriority;
import meteordevelopment.orbit.listeners.IListener;
import meteordevelopment.meteorclient.events.packets.InventoryEvent;
import net.minecraft.command.CommandSource;
import net.minecraft.component.DataComponentTypes;
import net.minecraft.component.type.MapIdComponent;
import net.minecraft.client.MinecraftClient;
import net.minecraft.item.FilledMapItem;
import net.minecraft.item.ItemStack;
import net.minecraft.network.packet.s2c.play.InventoryS2CPacket;
import net.minecraft.util.Util;

import java.io.File;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.HashSet;
import java.util.List;
import java.util.zip.GZIPOutputStream;

import static com.mojang.brigadier.Command.SINGLE_SUCCESS;

public class MapTallyCommand extends Command {
    IListener invListener;
    HashSet<Integer> ids = new HashSet<>();
    private final MinecraftClient mc = MinecraftClient.getInstance();
    public MapTallyCommand() {
        super("mt", "Tally maps inside containers opened after execution of this command.");
        invListener = null;
    }

    @Override
    public void build(LiteralArgumentBuilder<CommandSource> builder) {
        builder.then(literal("stop").executes(context -> {
            if (invListener != null) {
                info(ids.size() + " distinct map(s) total found.");
                try {
                    ByteBuffer buf = ByteBuffer.allocate(4 * ids.size());
                    buf.order(ByteOrder.LITTLE_ENDIAN);
                    for (int id : ids)
                        buf.putInt(id);
                    File dirpath = new File(MeteorClient.FOLDER, "mapman");
                    if (!dirpath.isDirectory())
                        dirpath.mkdir();
                    File dumppath = new File(dirpath, "mt-" + Util.getFormattedCurrentTime() + ".gz");
                    FileOutputStream fo = new FileOutputStream(dumppath);
                    GZIPOutputStream output = new GZIPOutputStream(fo);
                    output.write(buf.array());
                    output.close();
                    fo.close();
                    info("Tally saved to " + dumppath.toString());
                }
                catch (Exception e) {
                    error("Cannot write output:" + e.getMessage());
                    return 0;
                }
                ids.clear();
                MeteorClient.EVENT_BUS.unsubscribe(invListener);
                invListener = null;
            } else error("Map tally not running.");
            return SINGLE_SUCCESS;
        }));
        builder.executes(context -> {
            if (invListener == null) {
                ids.clear();
                invListener = new IListener() {
                    @Override
                    public void call(Object target) {
                        InventoryEvent e = (InventoryEvent)target;
                        List<ItemStack> stacks = e.packet.getContents();
                        if (stacks.size() == 46 || stacks.size() <= 36) {
                            // player inventory / 3x3 crafting table or invalid
                            return;
                        }
                        int nmaps = 0;
                        for (ItemStack s : stacks.subList(0, stacks.size() - 36)) {
                            if (s.getItem() instanceof FilledMapItem) {
                                MapIdComponent idc = s.getComponents().get(DataComponentTypes.MAP_ID);
                                if (idc == null)
                                    continue;
                                ids.add(idc.id());
                                ++nmaps;
                            }
                        }
                        info("Found " + nmaps + " map(s) in that container.");
                    }
                    @Override public Class<?> getTarget() { return InventoryEvent.class; }
                    @Override public int getPriority() { return EventPriority.MEDIUM; }
                    @Override public boolean isStatic() { return false; }
                };
                MeteorClient.EVENT_BUS.subscribe(invListener);
                info("Open the containers that contain maps you wish to tally...");
            }
            else error("Already tallying!");
            return SINGLE_SUCCESS;
        });
    }
}