From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Paul Sauve <paul@technove.co>
Date: Sun, 9 May 2021 16:49:49 -0500
Subject: [PATCH] Use array for gamerule storage


diff --git a/src/main/java/net/minecraft/world/level/GameRules.java b/src/main/java/net/minecraft/world/level/GameRules.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/net/minecraft/world/level/GameRules.java
+++ b/src/main/java/net/minecraft/world/level/GameRules.java
@@ -0,0 +0,0 @@ public class GameRules {
     }));
     private final Map<GameRules.Key<?>, GameRules.Value<?>> rules;
     private final FeatureFlagSet enabledFeatures;
+    private final GameRules.Value<?>[] gameruleArray; // Paper - Perf: Use array for gamerule storage
 
     private static <T extends GameRules.Value<T>> GameRules.Key<T> register(String name, GameRules.Category category, GameRules.Type<T> type) {
         GameRules.Key<T> gamerules_gamerulekey = new GameRules.Key<>(name, category);
@@ -0,0 +0,0 @@ public class GameRules {
     private GameRules(Map<GameRules.Key<?>, GameRules.Value<?>> rules, FeatureFlagSet enabledFeatures) {
         this.rules = rules;
         this.enabledFeatures = enabledFeatures;
+
+        // Paper start - Perf: Use array for gamerule storage
+        int arraySize = GameRules.Key.lastGameRuleIndex + 1;
+        GameRules.Value<?>[] values = new GameRules.Value[arraySize];
+
+        for (Entry<GameRules.Key<?>, GameRules.Value<?>> entry : rules.entrySet()) {
+            values[entry.getKey().gameRuleIndex] = entry.getValue();
+        }
+
+        this.gameruleArray = values;
+        // Paper end - Perf: Use array for gamerule storage
     }
 
     public <T extends GameRules.Value<T>> T getRule(GameRules.Key<T> key) {
-        T t0 = (T) this.rules.get(key); // CraftBukkit - decompile error
+        T t0 = key == null ? null : (T) this.gameruleArray[key.gameRuleIndex]; // Paper - Perf: Use array for gamerule storage
 
         if (t0 == null) {
             throw new IllegalArgumentException("Tried to access invalid game rule");
@@ -0,0 +0,0 @@ public class GameRules {
     }
 
     public static final class Key<T extends GameRules.Value<T>> {
+        // Paper start - Perf: Use array for gamerule storage
+        public static int lastGameRuleIndex = 0;
+        public final int gameRuleIndex = lastGameRuleIndex++;
+        // Paper end - Perf: Use array for gamerule storage
 
         final String id;
         private final GameRules.Category category;