aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Jonas Gunz <himself@jonasgunz.de> 2020-10-21 05:05:41 +0200
committerGravatar Jonas Gunz <himself@jonasgunz.de> 2020-10-21 05:05:41 +0200
commitce9ace2a7ac7709d8af5324e5b3dffed19c13ba3 (patch)
tree458000cb06290239925187c50241757cbbd84b9d
parent130efdf70984a8efb59d05d1708cce4a4d1c3361 (diff)
downloadparquet-ce9ace2a7ac7709d8af5324e5b3dffed19c13ba3.tar.gz
Fix client crash when accessing stats on non-parquet clients
-rw-r--r--Readme.md2
-rw-r--r--properties.md17
-rw-r--r--src/main/java/re/jag/parquet/ParquetSettings.java2
-rw-r--r--src/main/java/re/jag/parquet/mixin/StatisticsS2CPacketMixin.java61
-rw-r--r--src/main/resources/parquet.mixins.json3
5 files changed, 83 insertions, 2 deletions
diff --git a/Readme.md b/Readme.md
index e5d0b1c..e0f53c8 100644
--- a/Readme.md
+++ b/Readme.md
@@ -18,7 +18,7 @@ Not using `/c` and `/s` to be carpet compatible
#### `get <stat>`
-Query user statistics. This work for both online and offline players, if they are in
+Query user statistics. This works for both online and offline players, if they are in
usercache.
#### `import <scoreboard> [multiplier]`
diff --git a/properties.md b/properties.md
new file mode 100644
index 0000000..c2a42a3
--- /dev/null
+++ b/properties.md
@@ -0,0 +1,17 @@
+# parquet.properties
+
+## stats-*
+
+`[true]/false`
+enable/disable custom statistic collection
+
+## stats-send-to-client
+
+`true/[false]`
+enable/disable sending custom statistics to clients.
+This causes clients to crash when trying to access statistics.
+
+## command-*
+
+`[true]/false`
+enable/disable single parquet commands \ No newline at end of file
diff --git a/src/main/java/re/jag/parquet/ParquetSettings.java b/src/main/java/re/jag/parquet/ParquetSettings.java
index 030306d..203c648 100644
--- a/src/main/java/re/jag/parquet/ParquetSettings.java
+++ b/src/main/java/re/jag/parquet/ParquetSettings.java
@@ -14,6 +14,7 @@ public class ParquetSettings {
public final boolean dispenser_custom_behavior;
public final boolean stats_villager_trades;
+ public final boolean stats_send_to_client;
public final boolean command_cameramode;
public final boolean command_stats;
@@ -30,6 +31,7 @@ public class ParquetSettings {
this.dispenser_custom_behavior = get_boolean("dispenser-custom-behavior", true);
this.stats_villager_trades = get_boolean("stats-villager-trades", true);
+ this.stats_send_to_client = get_boolean("stats-send-to-client", false);
this.command_cameramode = get_boolean("command-cameramode", true);
this.command_stats = get_boolean("command-stats", true);
diff --git a/src/main/java/re/jag/parquet/mixin/StatisticsS2CPacketMixin.java b/src/main/java/re/jag/parquet/mixin/StatisticsS2CPacketMixin.java
new file mode 100644
index 0000000..173edcb
--- /dev/null
+++ b/src/main/java/re/jag/parquet/mixin/StatisticsS2CPacketMixin.java
@@ -0,0 +1,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.get_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.get_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();
+ }
+}
diff --git a/src/main/resources/parquet.mixins.json b/src/main/resources/parquet.mixins.json
index d3336eb..2feca40 100644
--- a/src/main/resources/parquet.mixins.json
+++ b/src/main/resources/parquet.mixins.json
@@ -10,7 +10,8 @@
"BootstrapMixin",
"FireWorkItemMixin",
"AbstractTraderEntityMixin",
- "SellMapFactoryMixin"
+ "SellMapFactoryMixin",
+ "StatisticsS2CPacketMixin"
],
"server": [
],