diff options
author | lucko <git@lucko.me> | 2024-07-21 12:44:06 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-21 12:44:06 +0100 |
commit | b78afab85ee15d809ea4ff0ccb14c2b263ede860 (patch) | |
tree | d3d987473aee0b1e71ac6a24ea2f692be78bf14b /spark-common | |
parent | 635800af986351f08dba33aa2e8ec5dd691bbffb (diff) | |
download | spark-b78afab85ee15d809ea4ff0ccb14c2b263ede860.tar.gz spark-b78afab85ee15d809ea4ff0ccb14c2b263ede860.tar.bz2 spark-b78afab85ee15d809ea4ff0ccb14c2b263ede860.zip |
Include gamerule settings in metadata (#425)
Diffstat (limited to 'spark-common')
4 files changed, 71 insertions, 1 deletions
diff --git a/spark-common/src/main/java/me/lucko/spark/common/platform/world/AsyncWorldInfoProvider.java b/spark-common/src/main/java/me/lucko/spark/common/platform/world/AsyncWorldInfoProvider.java index 82cddef..0f48b2e 100644 --- a/spark-common/src/main/java/me/lucko/spark/common/platform/world/AsyncWorldInfoProvider.java +++ b/spark-common/src/main/java/me/lucko/spark/common/platform/world/AsyncWorldInfoProvider.java @@ -80,6 +80,10 @@ public class AsyncWorldInfoProvider { return async(WorldInfoProvider::pollChunks); } + public CompletableFuture<WorldInfoProvider.GameRulesResult> pollGameRules() { + return async(WorldInfoProvider::pollGameRules); + } + public WorldInfoProvider.CountsResult getCounts() { return get(pollCounts()); } @@ -87,4 +91,8 @@ public class AsyncWorldInfoProvider { public WorldInfoProvider.ChunksResult<? extends ChunkInfo<?>> getChunks() { return get(pollChunks()); } + + public WorldInfoProvider.GameRulesResult getGameRules() { + return get(pollGameRules()); + } } diff --git a/spark-common/src/main/java/me/lucko/spark/common/platform/world/WorldInfoProvider.java b/spark-common/src/main/java/me/lucko/spark/common/platform/world/WorldInfoProvider.java index 7fb581d..e360ea4 100644 --- a/spark-common/src/main/java/me/lucko/spark/common/platform/world/WorldInfoProvider.java +++ b/spark-common/src/main/java/me/lucko/spark/common/platform/world/WorldInfoProvider.java @@ -39,6 +39,11 @@ public interface WorldInfoProvider { public ChunksResult<? extends ChunkInfo<?>> pollChunks() { return null; } + + @Override + public GameRulesResult pollGameRules() { + return null; + } }; /** @@ -55,6 +60,13 @@ public interface WorldInfoProvider { */ ChunksResult<? extends ChunkInfo<?>> pollChunks(); + /** + * Polls for game rules. + * + * @return the game rules + */ + GameRulesResult pollGameRules(); + default boolean mustCallSync() { return true; } @@ -101,4 +113,37 @@ public interface WorldInfoProvider { } } + final class GameRulesResult { + private final Map<String, GameRule> rules = new HashMap<>(); + + private GameRule rule(String name) { + return this.rules.computeIfAbsent(name, k -> new GameRule()); + } + + public void put(String gameRuleName, String worldName, String value) { + rule(gameRuleName).worldValues.put(worldName, value); + } + + public void putDefault(String gameRuleName, String value) { + rule(gameRuleName).defaultValue = value; + } + + public Map<String, GameRule> getRules() { + return this.rules; + } + + public static final class GameRule { + Map<String, String> worldValues = new HashMap<>(); + String defaultValue = null; + + public String getDefaultValue() { + return this.defaultValue; + } + + public Map<String, String> getWorldValues() { + return this.worldValues; + } + } + } + } diff --git a/spark-common/src/main/java/me/lucko/spark/common/platform/world/WorldStatisticsProvider.java b/spark-common/src/main/java/me/lucko/spark/common/platform/world/WorldStatisticsProvider.java index 7e63222..5d00037 100644 --- a/spark-common/src/main/java/me/lucko/spark/common/platform/world/WorldStatisticsProvider.java +++ b/spark-common/src/main/java/me/lucko/spark/common/platform/world/WorldStatisticsProvider.java @@ -38,7 +38,7 @@ public class WorldStatisticsProvider { } public WorldStatistics getWorldStatistics() { - WorldInfoProvider.ChunksResult<? extends ChunkInfo<?>> result = provider.getChunks(); + WorldInfoProvider.ChunksResult<? extends ChunkInfo<?>> result = this.provider.getChunks(); if (result == null) { return null; } @@ -70,6 +70,16 @@ public class WorldStatisticsProvider { stats.setTotalEntities(combinedTotal.get()); combined.asMap().forEach((key, value) -> stats.putEntityCounts(key, value.get())); + WorldInfoProvider.GameRulesResult gameRules = this.provider.getGameRules(); + if (gameRules != null) { + gameRules.getRules().forEach((ruleName, rule) -> stats.addGameRules(WorldStatistics.GameRule.newBuilder() + .setName(ruleName) + .setDefaultValue(rule.getDefaultValue()) + .putAllWorldValues(rule.getWorldValues()) + .build() + )); + } + return stats.build(); } diff --git a/spark-common/src/main/proto/spark/spark.proto b/spark-common/src/main/proto/spark/spark.proto index 53750d7..6ffd4e9 100644 --- a/spark-common/src/main/proto/spark/spark.proto +++ b/spark-common/src/main/proto/spark/spark.proto @@ -140,6 +140,7 @@ message WorldStatistics { int32 total_entities = 1; map<string, int32> entity_counts = 2; repeated World worlds = 3; + repeated GameRule game_rules = 4; message World { string name = 1; @@ -158,6 +159,12 @@ message WorldStatistics { int32 total_entities = 3; map<string, int32> entity_counts = 4; } + + message GameRule { + string name = 1; + string default_value = 2; + map<string, string> world_values = 3; + } } message WindowStatistics { |