From 122e572f8a5980da9d4f4c9227c7c1cb7071d761 Mon Sep 17 00:00:00 2001 From: TheCSDev Date: Mon, 13 Jul 2026 11:08:35 +0200 Subject: [PATCH 1/2] Reduced impact of #45 Lag spike sliced in half. Still not good enough though, needs more optimization. --- .github/ISSUE_TEMPLATE/bug_report.yml | 9 +- gradle.properties | 6 +- .../betterstats/client/BetterStatsClient.java | 30 ++++++ .../client/gui/panel/PersonalHomePanel.java | 89 +++++++++++------- ...-26.2.jar => tcdcommons-5.5.0+fn-26.2.jar} | Bin 462788 -> 465305 bytes 5 files changed, 92 insertions(+), 42 deletions(-) rename src/main/resources/META-INF/jarjar/{tcdcommons-5.4.1+fn-26.2.jar => tcdcommons-5.5.0+fn-26.2.jar} (91%) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 5c9f819..336707d 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -20,8 +20,8 @@ body: **Version format:** v[mod_version]+[mod_loader]-[minecraft_version] - **Version example:** v5.0+fabric-1.26 - **Title example:** [v5.3.1+neoforge-1.26.2] Red "Do not click" button + **Version example:** v5.0+fabric-26 + **Title example:** [v5.3.1+neoforge-26.1.2] Red "Do not click" button crashes the game when clicked - type: textarea id: description @@ -69,9 +69,8 @@ body: mod-pack. This helps project maintainers reproduce the issue, as other mods often can and do cause issues. placeholder: >- - Name a list of mods or link a mod-pack here. Please do not expect - project maintainers to manually download and install like 300 separate - mods. + Name a list of mods or link a mod-pack here. To rule out mod conflicts, it is + advised to reproduce the issue without other mods present (except for dependencies). validations: required: true - type: checkboxes diff --git a/gradle.properties b/gradle.properties index 4893f6e..622268b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,7 +11,7 @@ maven.group = com.thecsdev # Mod properties mod.id = betterstats -mod.version = 5.4.2 +mod.version = 5.5.0 mod.name = Better Statistics Screen mod.description = A Minecraft mod that improves the statistics screen and makes it more useful. mod.author = TheCSDev @@ -48,7 +48,7 @@ fabric.api_version = 0.152.1+26.2 fabric.json.depends.minecraft = ~26.2 fabric.json.depends.fabricloader = >=0.19.3 fabric.json.depends.fabric-api = >=0.152.1 - fabric.json.depends.tcdcommons = >=5.4.1 + fabric.json.depends.tcdcommons = >=5.5.0 # Neo-Forge properties neoforge.version = 26.1.0.7-beta @@ -57,4 +57,4 @@ neoforge.version = 26.1.0.7-beta net.toml.loaderVersion = [4,) neo.toml.dependencies.neoforge = [26.2.0.1-beta,) neo.toml.dependencies.minecraft = [26.2, 26.3) - neo.toml.dependencies.tcdcommons = [5.4.1,) + neo.toml.dependencies.tcdcommons = [5.5.0,) diff --git a/src/main/java/com/thecsdev/betterstats/client/BetterStatsClient.java b/src/main/java/com/thecsdev/betterstats/client/BetterStatsClient.java index 92e7ba0..bb28b86 100644 --- a/src/main/java/com/thecsdev/betterstats/client/BetterStatsClient.java +++ b/src/main/java/com/thecsdev/betterstats/client/BetterStatsClient.java @@ -41,6 +41,36 @@ public BetterStatsClient() //keep track of last login time ClientEvent.PLAYER_JOIN.addListener(_ -> LAST_LOGIN_TIME = System.currentTimeMillis()); ClientEvent.PLAYER_QUIT.addListener(_ -> LAST_LOGIN_TIME = System.currentTimeMillis()); + + //FIXME - REMOVE TEST CODE THAT POPULATES STATS WITH ARBITRARY NUMBERS: + /* + ClientEvent.PLAYER_JOIN.addListener(_ -> + { + //obtain singleplayer server + final var server = Minecraft.getInstance().getSingleplayerServer(); + if(server == null) return; + + //continue execution on server-side + server.execute(() -> + { + //obtain the first player (who is usually the main player) + final var player = server.getPlayerList().getPlayers().stream().findFirst().orElse(null); + if(player == null) return; + final var stats = player.getStats(); + final var rng = new Random(); + + //noinspection unchecked | award every single stat in the game to the player + for(final var statType : (Registry>)(Object) BuiltInRegistries.STAT_TYPE) + { + //skip "custom/general" statistics + if(((Object) statType) == Stats.CUSTOM) continue; + //populate all other stat types + for(final var statSubject : statType.getRegistry()) + stats.setValue(player, statType.get(statSubject), rng.nextInt(0, 1024)); + } + }); + }); + */ } // ================================================== /** diff --git a/src/main/java/com/thecsdev/betterstats/client/gui/panel/PersonalHomePanel.java b/src/main/java/com/thecsdev/betterstats/client/gui/panel/PersonalHomePanel.java index d8091bd..3961535 100644 --- a/src/main/java/com/thecsdev/betterstats/client/gui/panel/PersonalHomePanel.java +++ b/src/main/java/com/thecsdev/betterstats/client/gui/panel/PersonalHomePanel.java @@ -23,10 +23,7 @@ import com.thecsdev.commonmc.api.client.gui.widget.TButtonWidget; import com.thecsdev.commonmc.api.client.gui.widget.TClickableWidget; import com.thecsdev.commonmc.api.client.gui.widget.stats.TTextualStatWidget; -import com.thecsdev.commonmc.api.stats.util.BlockStats; -import com.thecsdev.commonmc.api.stats.util.CustomStat; -import com.thecsdev.commonmc.api.stats.util.EntityStats; -import com.thecsdev.commonmc.api.stats.util.ItemStats; +import com.thecsdev.commonmc.api.stats.util.*; import com.thecsdev.commonmc.api.util.modinfo.ModInfoProvider; import com.thecsdev.commonmc.resource.TComponent; import com.thecsdev.commonmc.resource.TLanguage; @@ -38,15 +35,11 @@ import net.minecraft.resources.Identifier; import net.minecraft.stats.StatFormatter; import net.minecraft.stats.Stats; -import net.minecraft.world.entity.MobCategory; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Comparator; -import java.util.List; -import java.util.Objects; -import java.util.Optional; +import java.util.*; import java.util.concurrent.Future; import java.util.function.Consumer; @@ -175,37 +168,15 @@ else if(stat.isTime()) ibmPanel.setBounds(computeNextYBounds(255, GAP)); //featured item statistics - final var items = ItemStats.getItemStats(lpStats, null, null).stream() - .sorted(Comparator.comparingDouble( - (ItemStats obj) -> obj.getValues().values().stream() - .mapToInt(Integer::intValue) - .average() - .orElse(0.0)).reversed()) - .limit(7) - .toList(); + final var items = getTopStats(ItemStats.getItemStats(lpStats, null, null), 7); StatsViewUtils.initItemStats(ibmPanel, null, items); //featured block statistics - final var blocks = BlockStats.getBlockStats(lpStats, null, null).stream() - .sorted(Comparator.comparingDouble( - (BlockStats obj) -> obj.getValues().values().stream() - .mapToInt(Integer::intValue) - .average() - .orElse(0.0)).reversed()) - .limit(7) - .toList(); + final var blocks = getTopStats(BlockStats.getBlockStats(lpStats, null, null), 7); StatsViewUtils.initBlockStats(ibmPanel, null, blocks); //featured mob statistics - final var entities = EntityStats.getEntityStats(lpStats, null, null).stream() - .filter(es -> es.getSubject().getCategory() != MobCategory.MISC) - .sorted(Comparator.comparingDouble( - (EntityStats obj) -> obj.getValues().values().stream() - .mapToInt(Integer::intValue) - .average() - .orElse(0.0)).reversed()) - .limit(5) - .toList(); + final var entities = getTopStats(EntityStats.getEntityStats(lpStats, null, null), 5); StatsViewUtils.initMobStats(ibmPanel, null, entities); //and finally, center that panel and add it to this panel @@ -238,6 +209,56 @@ private final void initNewsAsync() lbl_group.textScaleProperty().set(1.1d, PersonalHomePanel.class); news.forEach(section -> CreditsPanel.initSection(this, section)); } + // ================================================== + /** + * Returns a new {@link Collection} containing the "top/largest" stats from another + * collection of stats. + * @param origin The origin {@link Collection}. + * @param size The size of the returned {@link Collection}. + * @throws NullPointerException If the argument is {@code null}. + * @throws IllegalArgumentException If {@code size < 1}. + * @implNote Uses an optimized sorting algorithm that avoids wasteful sort operations. + */ + private static final > @NotNull Collection getTopStats( + @NotNull Collection origin, int size) + throws NullPointerException, IllegalArgumentException + { + //check arguments + Objects.requireNonNull(origin); + if(size < 1) throw new IllegalArgumentException("size < 1."); + + //define the priority queue that'll be used for stat ranking + record RankedStat(S stat, int weight) {} + final var queue = new PriorityQueue>(size, Comparator.comparingInt(RankedStat::weight)); + + //iterate stats from origin with a single pass + for(final var stat : origin) + { + //calculate total "weight" the current stat is worth + int weight = 0; + for(final int statVal : stat.getValues().values()) weight += statVal; + + //if the queue is full, check if the current item can fit in + if(queue.size() == size) { + //a '0' definitely will not fit in the queue + if(weight == 0) continue; + //compare the score against the lowest rank in the queue + final var lowestRank = queue.peek(); + if(lowestRank != null && weight <= lowestRank.weight) + continue; //skip current stat if it ranks below lowest rank + } + + //add to queue + queue.add(new RankedStat<>(stat, weight)); + if(queue.size() > size) queue.poll(); + } + + //return a sorted list containing the ranked elements + final var stats = new ArrayList(size); + while(stats.size() < size && !queue.isEmpty()) + stats.add(queue.poll().stat); + return stats.reversed(); + } // ================================================== ================================================== // ModSummaryPanel IMPLEMENTATION // ================================================== ================================================== diff --git a/src/main/resources/META-INF/jarjar/tcdcommons-5.4.1+fn-26.2.jar b/src/main/resources/META-INF/jarjar/tcdcommons-5.5.0+fn-26.2.jar similarity index 91% rename from src/main/resources/META-INF/jarjar/tcdcommons-5.4.1+fn-26.2.jar rename to src/main/resources/META-INF/jarjar/tcdcommons-5.5.0+fn-26.2.jar index bde03a70b7ac3f5e4492b92c79d9ce30bb0e580b..03cb3b35d3f1f4578097fd96106005488b240048 100644 GIT binary patch delta 26850 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 z z^*^!&2rj@)&8%QU!vS&@peCqfgKPn@RWPjNFNn2XkztD(xZ`9KF?|IIvoFG7(En=$ zETWExMfl zzOI{rY*nWC2F`(o6}aqde**DU^aSOfpSXxMnB4(us2UhtMY$*ie-Vj0rS>8YC?fE~ zJ9`!8L-iVTNiN}lASL|3UR^`wc!^KO2?z#L1m8x*x~UTC-?&GHcs*X?6G;|qMkgf( z!@Wt-y^I4*D9ZDw6>mWGW)+9Axp2WAxJ{r6>vv_qkpfRoIl77iHkv3i2&KRqP;#%~ zfH8uHdkqEN47rPd87!U!gwdi@zzM+{AcA-z;RK(EhWTG(A0^%#iDf2va*0MI8_B2_ zK(_!1EYwDDlSsl2NLX-qIq(UKhxe`gMC^{d6e78=;qXV0Uw@4sIQ&UOQ4%EL@w~tR zg;6}$4MEUBH1gLCQQ{Jn1Gn%n+V6F89SM^Hf>d}PqOJiKyer_ z(c{Iy|ELW@uSuqpV#PBMySN_=v*78GZmrEeJ0#)Y2H^nhtZ>>ib;yVl8{PuJ>TZw= zNSWS-u>+tiaFiz5;V9kG-@u$;f`e460U~#JGq%HG3{VV!DJ{i JE*lfg{{xGR6Ey$; From 1034b0000fb059262f2385575abe7e756d6a9f89 Mon Sep 17 00:00:00 2001 From: TheCSDev Date: Mon, 13 Jul 2026 13:41:14 +0200 Subject: [PATCH 2/2] Resolve #45 Although more work and optimizations can still be done. --- .../controller/tab/McbsEditorFileTab.java | 1 - .../betterstats/api/mcbs/model/McbsStats.java | 16 ++++++++-------- .../client/gui/panel/PersonalHomePanel.java | 11 ++++------- .../jarjar/tcdcommons-5.5.0+fn-26.2.jar | Bin 465305 -> 465155 bytes 4 files changed, 12 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/thecsdev/betterstats/api/mcbs/controller/tab/McbsEditorFileTab.java b/src/main/java/com/thecsdev/betterstats/api/mcbs/controller/tab/McbsEditorFileTab.java index e9c04bc..3e19f6d 100644 --- a/src/main/java/com/thecsdev/betterstats/api/mcbs/controller/tab/McbsEditorFileTab.java +++ b/src/main/java/com/thecsdev/betterstats/api/mcbs/controller/tab/McbsEditorFileTab.java @@ -155,7 +155,6 @@ public final void setCurrentView(@NotNull StatsView view) throws NullPointerExce /** * Puts an {@link McbsGoal} into {@link McbsFile#getGoals()}. * @param goal The {@link McbsGoal} to add. - * @return {@code true} if the {@link McbsFile} did not already contain the goal. * @throws NullPointerException If the argument is {@code null}. */ public final void putGoal(@NotNull McbsGoal goal) throws NullPointerException diff --git a/src/main/java/com/thecsdev/betterstats/api/mcbs/model/McbsStats.java b/src/main/java/com/thecsdev/betterstats/api/mcbs/model/McbsStats.java index 3fc7670..f1d319b 100644 --- a/src/main/java/com/thecsdev/betterstats/api/mcbs/model/McbsStats.java +++ b/src/main/java/com/thecsdev/betterstats/api/mcbs/model/McbsStats.java @@ -37,14 +37,15 @@ private McbsStats( // ================================================== /** * Clears redundant statistic data like zero-value entries and empty maps. + * @apiNote Costly operation. Avoid frequent calls! */ private final @ApiStatus.Internal void cleanUp() { //remove zero-value statistic entries - for(final var statTypeEntry : this.intStats.entrySet()) - statTypeEntry.getValue().entrySet().removeIf(e -> e.getValue() == 0); + for(final var statTypeEntry : this.intStats.values()) + statTypeEntry.values().removeIf(e -> e == 0); //remove empty stat-type maps - this.intStats.entrySet().removeIf(e -> e.getValue().isEmpty()); + this.intStats.values().removeIf(ConcurrentHashMap::isEmpty); } // ================================================== /** @@ -52,7 +53,6 @@ private McbsStats( * integer-based statistics values. */ public final @NotNull ConcurrentHashMap> getIntValues() { - cleanUp(); return this.intStats; } @@ -66,8 +66,7 @@ private McbsStats( @NotNull Identifier type) throws NullPointerException { Objects.requireNonNull(type); - cleanUp(); - return this.intStats.computeIfAbsent(type, __ -> new ConcurrentHashMap<>()); + return this.intStats.computeIfAbsent(type, _ -> new ConcurrentHashMap<>()); } // ================================================== /** @@ -226,7 +225,6 @@ public final void clearAndAddAll(@NotNull IStatsProvider statsProvider) throws N public final void forEach(@NotNull McbsStats.IntValueConsumer consumer) throws NullPointerException { Objects.requireNonNull(consumer); - cleanUp(); for(final var statTypeEntry : this.intStats.entrySet()) { final var statTypeId = statTypeEntry.getKey(); for(final var statSubjectEntry : statTypeEntry.getValue().entrySet()) { @@ -274,6 +272,8 @@ public final void forEach(@NotNull McbsStats.IntValueConsumer consumer) throws N * {@link Codec} implementation for {@link McbsStats}. */ @ApiStatus.Internal - static final Codec CODEC = CODEC_INT_STATS.xmap(McbsStats::new, McbsStats::getIntValues); + static final Codec CODEC = CODEC_INT_STATS.xmap( + McbsStats::new, + stats -> { stats.cleanUp(); return stats.getIntValues(); }); // ================================================== ================================================== } diff --git a/src/main/java/com/thecsdev/betterstats/client/gui/panel/PersonalHomePanel.java b/src/main/java/com/thecsdev/betterstats/client/gui/panel/PersonalHomePanel.java index 3961535..effc568 100644 --- a/src/main/java/com/thecsdev/betterstats/client/gui/panel/PersonalHomePanel.java +++ b/src/main/java/com/thecsdev/betterstats/client/gui/panel/PersonalHomePanel.java @@ -168,16 +168,13 @@ else if(stat.isTime()) ibmPanel.setBounds(computeNextYBounds(255, GAP)); //featured item statistics - final var items = getTopStats(ItemStats.getItemStats(lpStats, null, null), 7); - StatsViewUtils.initItemStats(ibmPanel, null, items); + StatsViewUtils.initItemStats(ibmPanel, null, getTopStats(ItemStats.getItemStats(lpStats, null, null), 7)); //featured block statistics - final var blocks = getTopStats(BlockStats.getBlockStats(lpStats, null, null), 7); - StatsViewUtils.initBlockStats(ibmPanel, null, blocks); + StatsViewUtils.initBlockStats(ibmPanel, null, getTopStats(BlockStats.getBlockStats(lpStats, null, null), 7)); //featured mob statistics - final var entities = getTopStats(EntityStats.getEntityStats(lpStats, null, null), 5); - StatsViewUtils.initMobStats(ibmPanel, null, entities); + StatsViewUtils.initMobStats(ibmPanel, null, getTopStats(EntityStats.getEntityStats(lpStats, null, null), 5)); //and finally, center that panel and add it to this panel ibmPanel.setBounds(ibmPanel.getContentBounds()); @@ -225,7 +222,7 @@ private final void initNewsAsync() { //check arguments Objects.requireNonNull(origin); - if(size < 1) throw new IllegalArgumentException("size < 1."); + if(origin.isEmpty() || size < 1) return new ArrayList<>(); //define the priority queue that'll be used for stat ranking record RankedStat(S stat, int weight) {} diff --git a/src/main/resources/META-INF/jarjar/tcdcommons-5.5.0+fn-26.2.jar b/src/main/resources/META-INF/jarjar/tcdcommons-5.5.0+fn-26.2.jar index 03cb3b35d3f1f4578097fd96106005488b240048..a7489617dbf89a1f74dc7b5d9237bc8835b67980 100644 GIT binary patch delta 5213 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 delta 5450 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