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;
});
}
}
|