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-forge/src | |
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-forge/src')
-rw-r--r-- | spark-forge/src/main/java/me/lucko/spark/forge/ForgeWorldInfoProvider.java | 54 |
1 files changed, 52 insertions, 2 deletions
diff --git a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeWorldInfoProvider.java b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeWorldInfoProvider.java index e10a0c8..286605a 100644 --- a/spark-forge/src/main/java/me/lucko/spark/forge/ForgeWorldInfoProvider.java +++ b/spark-forge/src/main/java/me/lucko/spark/forge/ForgeWorldInfoProvider.java @@ -32,6 +32,7 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.GameRules; import net.minecraft.world.level.entity.EntityLookup; import net.minecraft.world.level.entity.EntitySection; import net.minecraft.world.level.entity.EntitySectionStorage; @@ -97,6 +98,29 @@ public abstract class ForgeWorldInfoProvider implements WorldInfoProvider { return data; } + + @Override + public GameRulesResult pollGameRules() { + GameRulesResult data = new GameRulesResult(); + Iterable<ServerLevel> levels = this.server.getAllLevels(); + + GameRules.visitGameRuleTypes(new GameRules.GameRuleTypeVisitor() { + @Override + public <T extends GameRules.Value<T>> void visit(GameRules.Key<T> key, GameRules.Type<T> type) { + String defaultValue = type.createRule().serialize(); + data.putDefault(key.getId(), defaultValue); + + for (ServerLevel level : levels) { + String levelName = level.dimension().location().getPath(); + + String value = level.getGameRules().getRule(key).serialize(); + data.put(key.getId(), levelName, value); + } + } + }); + + return data; + } } public static final class Client extends ForgeWorldInfoProvider { @@ -124,13 +148,13 @@ public abstract class ForgeWorldInfoProvider implements WorldInfoProvider { @Override public ChunksResult<ForgeChunkInfo> pollChunks() { - ChunksResult<ForgeChunkInfo> data = new ChunksResult<>(); - ClientLevel level = this.client.level; if (level == null) { return null; } + ChunksResult<ForgeChunkInfo> data = new ChunksResult<>(); + TransientEntitySectionManager<Entity> entityManager = level.entityStorage; EntitySectionStorage<Entity> cache = entityManager.sectionStorage; @@ -139,6 +163,32 @@ public abstract class ForgeWorldInfoProvider implements WorldInfoProvider { return data; } + + @Override + public GameRulesResult pollGameRules() { + ClientLevel level = this.client.level; + if (level == null) { + return null; + } + + GameRulesResult data = new GameRulesResult(); + + String levelName = level.dimension().location().getPath(); + GameRules levelRules = level.getGameRules(); + + GameRules.visitGameRuleTypes(new GameRules.GameRuleTypeVisitor() { + @Override + public <T extends GameRules.Value<T>> void visit(GameRules.Key<T> key, GameRules.Type<T> type) { + String defaultValue = type.createRule().serialize(); + data.putDefault(key.getId(), defaultValue); + + String value = levelRules.getRule(key).serialize(); + data.put(key.getId(), levelName, value); + } + }); + + return data; + } } static final class ForgeChunkInfo extends AbstractChunkInfo<EntityType<?>> { |