aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/re/jag/parquet/mixin/StatisticsS2CPacketMixin.java
blob: ae9dd617a49bd95eb556e81e9b901b21cd905a52 (plain)
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
package re.jag.parquet.mixin;

import it.unimi.dsi.fastutil.objects.Object2IntMap;
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
import it.unimi.dsi.fastutil.objects.ObjectIterator;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.network.packet.s2c.play.StatisticsS2CPacket;
import net.minecraft.stat.Stat;
import net.minecraft.util.registry.Registry;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import re.jag.parquet.CustomStats;
import re.jag.parquet.Parquet;

@Mixin(StatisticsS2CPacket.class)
public class StatisticsS2CPacketMixin {
	@Shadow
	private Object2IntMap<Stat<?>> stats;

	@Shadow
	private <T> int getStatId(Stat<T> stat) { return 0; }

	/*
	 * Opening the statistics menu on client causes crash with custom stats enabled.
	 * This new write() removes all custom stats from the list sent to the client.
	 */
	@Inject(method="write", at=@At("HEAD"), cancellable = true)
	protected void onWrite(PacketByteBuf buf, CallbackInfo ci){
		if (Parquet.settings.stats_send_to_client)
			return;

		Object2IntMap<Stat<?>> copy = ((Object2IntOpenHashMap)stats).clone();

		ObjectIterator iter = copy.object2IntEntrySet().iterator();

		while (iter.hasNext()) {
			Object2IntMap.Entry<Stat<?>> entry = (Object2IntMap.Entry)iter.next();
			Stat<?> stat = (Stat)entry.getKey();

			if( Parquet.settings.stats_villager_trades && stat.getType() == CustomStats.TRADED )
				copy.removeInt(stat);
		}

		iter = copy.object2IntEntrySet().iterator();
		buf.writeVarInt(copy.size());

		while(iter.hasNext()) {
			Object2IntMap.Entry<Stat<?>> entry = (Object2IntMap.Entry)iter.next();
			Stat<?> stat = (Stat)entry.getKey();

			buf.writeVarInt(Registry.STAT_TYPE.getRawId(stat.getType()));
			buf.writeVarInt(this.getStatId(stat));
			buf.writeVarInt(entry.getIntValue());
		}

		ci.cancel();
	}
}