From 4ed5d54dde2280a1725d6c76efdf154572e1da6f Mon Sep 17 00:00:00 2001 From: Thinkofdeath Date: Wed, 8 Jan 2014 22:00:00 +0000 Subject: [PATCH] Allow statistics to be disabled/forced --- CraftBukkit-Patches/0002-mc-dev-imports.patch | 211 +++++++++++++++++- ...low-statistics-to-be-disabled-forced.patch | 95 ++++++++ 2 files changed, 304 insertions(+), 2 deletions(-) create mode 100644 CraftBukkit-Patches/0090-Allow-statistics-to-be-disabled-forced.patch diff --git a/CraftBukkit-Patches/0002-mc-dev-imports.patch b/CraftBukkit-Patches/0002-mc-dev-imports.patch index 1cf54b63eb..30c21ca0c2 100644 --- a/CraftBukkit-Patches/0002-mc-dev-imports.patch +++ b/CraftBukkit-Patches/0002-mc-dev-imports.patch @@ -1,4 +1,4 @@ -From 40f35de3f974c832544ea0f1dfa24c8281688606 Mon Sep 17 00:00:00 2001 +From 023df056c334c6f5e41eea9b32c722dc85d7622c Mon Sep 17 00:00:00 2001 From: md_5 Date: Sun, 1 Dec 2013 15:10:48 +1100 Subject: [PATCH] mc-dev imports @@ -1609,6 +1609,213 @@ index 0000000..900ed68 + return regionfile.b(i & 31, j & 31); + } +} +diff --git a/src/main/java/net/minecraft/server/ServerStatisticManager.java b/src/main/java/net/minecraft/server/ServerStatisticManager.java +new file mode 100644 +index 0000000..2f980cb +--- /dev/null ++++ b/src/main/java/net/minecraft/server/ServerStatisticManager.java +@@ -0,0 +1,201 @@ ++package net.minecraft.server; ++ ++import java.io.File; ++import java.io.IOException; ++import java.lang.reflect.Constructor; ++import java.util.HashMap; ++import java.util.HashSet; ++import java.util.Iterator; ++import java.util.Map; ++import java.util.Set; ++import java.util.Map.Entry; ++ ++import net.minecraft.util.com.google.common.collect.Maps; ++import net.minecraft.util.com.google.common.collect.Sets; ++import net.minecraft.util.com.google.gson.JsonElement; ++import net.minecraft.util.com.google.gson.JsonObject; ++import net.minecraft.util.com.google.gson.JsonParseException; ++import net.minecraft.util.com.google.gson.JsonParser; ++import net.minecraft.util.org.apache.commons.io.FileUtils; ++import org.apache.logging.log4j.LogManager; ++import org.apache.logging.log4j.Logger; ++ ++public class ServerStatisticManager extends StatisticManager { ++ ++ private static final Logger b = LogManager.getLogger(); ++ private final MinecraftServer c; ++ private final File d; ++ private final Set e = Sets.newHashSet(); ++ private int f = -300; ++ private boolean g = false; ++ ++ public ServerStatisticManager(MinecraftServer minecraftserver, File file1) { ++ this.c = minecraftserver; ++ this.d = file1; ++ } ++ ++ public void a() { ++ if (this.d.isFile()) { ++ try { ++ this.a.clear(); ++ this.a.putAll(this.a(FileUtils.readFileToString(this.d))); ++ } catch (IOException ioexception) { ++ b.error("Couldn\'t read statistics file " + this.d, ioexception); ++ } catch (JsonParseException jsonparseexception) { ++ b.error("Couldn\'t parse statistics file " + this.d, jsonparseexception); ++ } ++ } ++ } ++ ++ public void b() { ++ try { ++ FileUtils.writeStringToFile(this.d, a(this.a)); ++ } catch (IOException ioexception) { ++ b.error("Couldn\'t save stats", ioexception); ++ } ++ } ++ ++ public void a(EntityHuman entityhuman, Statistic statistic, int i) { ++ int j = statistic.d() ? this.a(statistic) : 0; ++ ++ super.a(entityhuman, statistic, i); ++ this.e.add(statistic); ++ if (statistic.d() && j == 0 && i > 0) { ++ this.g = true; ++ if (this.c.ar()) { ++ this.c.getPlayerList().sendMessage(new ChatMessage("chat.type.achievement", new Object[] { entityhuman.getScoreboardDisplayName(), statistic.j()})); ++ } ++ } ++ } ++ ++ public Set c() { ++ HashSet hashset = Sets.newHashSet(this.e); ++ ++ this.e.clear(); ++ this.g = false; ++ return hashset; ++ } ++ ++ public Map a(String s) { ++ JsonElement jsonelement = (new JsonParser()).parse(s); ++ ++ if (!jsonelement.isJsonObject()) { ++ return Maps.newHashMap(); ++ } else { ++ JsonObject jsonobject = jsonelement.getAsJsonObject(); ++ HashMap hashmap = Maps.newHashMap(); ++ Iterator iterator = jsonobject.entrySet().iterator(); ++ ++ while (iterator.hasNext()) { ++ Entry entry = (Entry) iterator.next(); ++ Statistic statistic = StatisticList.a((String) entry.getKey()); ++ ++ if (statistic != null) { ++ StatisticWrapper statisticwrapper = new StatisticWrapper(); ++ ++ if (((JsonElement) entry.getValue()).isJsonPrimitive() && ((JsonElement) entry.getValue()).getAsJsonPrimitive().isNumber()) { ++ statisticwrapper.a(((JsonElement) entry.getValue()).getAsInt()); ++ } else if (((JsonElement) entry.getValue()).isJsonObject()) { ++ JsonObject jsonobject1 = ((JsonElement) entry.getValue()).getAsJsonObject(); ++ ++ if (jsonobject1.has("value") && jsonobject1.get("value").isJsonPrimitive() && jsonobject1.get("value").getAsJsonPrimitive().isNumber()) { ++ statisticwrapper.a(jsonobject1.getAsJsonPrimitive("value").getAsInt()); ++ } ++ ++ if (jsonobject1.has("progress") && statistic.l() != null) { ++ try { ++ Constructor constructor = statistic.l().getConstructor(new Class[0]); ++ IJsonStatistic ijsonstatistic = (IJsonStatistic) constructor.newInstance(new Object[0]); ++ ++ statisticwrapper.a(ijsonstatistic); ++ } catch (Throwable throwable) { ++ b.warn("Invalid statistic progress in " + this.d, throwable); ++ } ++ } ++ } ++ ++ hashmap.put(statistic, statisticwrapper); ++ } else { ++ b.warn("Invalid statistic in " + this.d + ": Don\'t know what " + (String) entry.getKey() + " is"); ++ } ++ } ++ ++ return hashmap; ++ } ++ } ++ ++ public static String a(Map map) { ++ JsonObject jsonobject = new JsonObject(); ++ Iterator iterator = map.entrySet().iterator(); ++ ++ while (iterator.hasNext()) { ++ Entry entry = (Entry) iterator.next(); ++ ++ if (((StatisticWrapper) entry.getValue()).b() != null) { ++ JsonObject jsonobject1 = new JsonObject(); ++ ++ jsonobject1.addProperty("value", Integer.valueOf(((StatisticWrapper) entry.getValue()).a())); ++ ++ try { ++ jsonobject1.add("progress", ((StatisticWrapper) entry.getValue()).b().a()); ++ } catch (Throwable throwable) { ++ b.warn("Couldn\'t save statistic " + ((Statistic) entry.getKey()).e() + ": error serializing progress", throwable); ++ } ++ ++ jsonobject.add(((Statistic) entry.getKey()).e, jsonobject1); ++ } else { ++ jsonobject.addProperty(((Statistic) entry.getKey()).e, Integer.valueOf(((StatisticWrapper) entry.getValue()).a())); ++ } ++ } ++ ++ return jsonobject.toString(); ++ } ++ ++ public void d() { ++ Iterator iterator = this.a.keySet().iterator(); ++ ++ while (iterator.hasNext()) { ++ Statistic statistic = (Statistic) iterator.next(); ++ ++ this.e.add(statistic); ++ } ++ } ++ ++ public void a(EntityPlayer entityplayer) { ++ int i = this.c.aj(); ++ HashMap hashmap = Maps.newHashMap(); ++ ++ if (this.g || i - this.f > 300) { ++ this.f = i; ++ Iterator iterator = this.c().iterator(); ++ ++ while (iterator.hasNext()) { ++ Statistic statistic = (Statistic) iterator.next(); ++ ++ hashmap.put(statistic, Integer.valueOf(this.a(statistic))); ++ } ++ } ++ ++ entityplayer.playerConnection.sendPacket(new PacketPlayOutStatistic(hashmap)); ++ } ++ ++ public void b(EntityPlayer entityplayer) { ++ HashMap hashmap = Maps.newHashMap(); ++ Iterator iterator = AchievementList.e.iterator(); ++ ++ while (iterator.hasNext()) { ++ Achievement achievement = (Achievement) iterator.next(); ++ ++ if (this.a(achievement)) { ++ hashmap.put(achievement, Integer.valueOf(this.a((Statistic) achievement))); ++ this.e.remove(achievement); ++ } ++ } ++ ++ entityplayer.playerConnection.sendPacket(new PacketPlayOutStatistic(hashmap)); ++ } ++ ++ public boolean e() { ++ return this.g; ++ } ++} diff --git a/src/main/java/net/minecraft/server/StructureGenerator.java b/src/main/java/net/minecraft/server/StructureGenerator.java new file mode 100644 index 0000000..1eb87ae @@ -1990,5 +2197,5 @@ index 0000000..c0db754 + } +} -- -1.8.3.2 +1.8.4.msysgit.0 diff --git a/CraftBukkit-Patches/0090-Allow-statistics-to-be-disabled-forced.patch b/CraftBukkit-Patches/0090-Allow-statistics-to-be-disabled-forced.patch new file mode 100644 index 0000000000..6cce8b0800 --- /dev/null +++ b/CraftBukkit-Patches/0090-Allow-statistics-to-be-disabled-forced.patch @@ -0,0 +1,95 @@ +From c73eb8c8476907817b0690014e5003e79f43dc1e Mon Sep 17 00:00:00 2001 +From: Thinkofdeath +Date: Tue, 7 Jan 2014 15:56:26 +0000 +Subject: [PATCH] Allow statistics to be disabled/forced + + +diff --git a/src/main/java/net/minecraft/server/ServerStatisticManager.java b/src/main/java/net/minecraft/server/ServerStatisticManager.java +index 2f980cb..3f78728 100644 +--- a/src/main/java/net/minecraft/server/ServerStatisticManager.java ++++ b/src/main/java/net/minecraft/server/ServerStatisticManager.java +@@ -32,6 +32,14 @@ public class ServerStatisticManager extends StatisticManager { + public ServerStatisticManager(MinecraftServer minecraftserver, File file1) { + this.c = minecraftserver; + this.d = file1; ++ // Spigot start ++ for ( String name : org.spigotmc.SpigotConfig.forcedStats.keySet() ) ++ { ++ StatisticWrapper wrapper = new StatisticWrapper(); ++ wrapper.a( org.spigotmc.SpigotConfig.forcedStats.get( name ) ); ++ a.put( StatisticList.a( name ), wrapper ); ++ } ++ // Spigot end + } + + public void a() { +@@ -48,6 +56,7 @@ public class ServerStatisticManager extends StatisticManager { + } + + public void b() { ++ if ( org.spigotmc.SpigotConfig.disableStatSaving ) return; // Spigot + try { + FileUtils.writeStringToFile(this.d, a(this.a)); + } catch (IOException ioexception) { +@@ -56,6 +65,7 @@ public class ServerStatisticManager extends StatisticManager { + } + + public void a(EntityHuman entityhuman, Statistic statistic, int i) { ++ if ( org.spigotmc.SpigotConfig.disableStatSaving ) return; // Spigot + int j = statistic.d() ? this.a(statistic) : 0; + + super.a(entityhuman, statistic, i); +diff --git a/src/main/java/org/spigotmc/SpigotConfig.java b/src/main/java/org/spigotmc/SpigotConfig.java +index cb5002f..17e1d21 100755 +--- a/src/main/java/org/spigotmc/SpigotConfig.java ++++ b/src/main/java/org/spigotmc/SpigotConfig.java +@@ -11,11 +11,14 @@ import java.util.HashMap; + import java.util.List; + import java.util.Map; + import java.util.logging.Level; ++ ++import gnu.trove.map.hash.TObjectIntHashMap; + import net.minecraft.server.MinecraftServer; + import org.bukkit.Bukkit; + import org.bukkit.ChatColor; + import org.bukkit.command.Command; + import org.bukkit.command.SimpleCommandMap; ++import org.bukkit.configuration.ConfigurationSection; + import org.bukkit.configuration.file.YamlConfiguration; + import org.bukkit.craftbukkit.command.TicksPerSecondCommand; + +@@ -220,4 +223,31 @@ public class SpigotConfig + private static void lateBind() { + lateBind = getBoolean( "settings.late-bind", false ); + } ++ ++ public static boolean disableStatSaving; ++ public static TObjectIntHashMap forcedStats = new TObjectIntHashMap(); ++ private static void stats() ++ { ++ disableStatSaving = getBoolean( "stats.disable-saving", false ); ++ ++ if ( !config.contains( "stats.forced-stats" ) ) { ++ config.createSection( "stats.forced-stats" ); ++ } ++ ++ ConfigurationSection section = config.getConfigurationSection( "stats.forced-stats" ); ++ for ( String name : section.getKeys( true ) ) ++ { ++ if ( section.isInt( name ) ) ++ { ++ forcedStats.put( name, section.getInt( name ) ); ++ } ++ } ++ ++ if ( disableStatSaving && section.getInt( "achievement.openInventory", 0 ) < 1 ) ++ { ++ Bukkit.getLogger().warning( "*** WARNING *** stats.disable-saving is true but stats.forced-stats.achievement.openInventory" + ++ " isn't set to 1. Disabling stat saving without forcing the achievement may cause it to get stuck on the player's " + ++ "screen." ); ++ } ++ } + } +-- +1.8.4.msysgit.0 +