--- a/net/minecraft/world/level/GameRules.java
+++ b/net/minecraft/world/level/GameRules.java
@@ -142,7 +142,7 @@
     }
 
     public <T extends GameRules.GameRuleValue<T>> T getRule(GameRules.GameRuleKey<T> gamerules_gamerulekey) {
-        return (GameRules.GameRuleValue) this.rules.get(gamerules_gamerulekey);
+        return (T) this.rules.get(gamerules_gamerulekey); // CraftBukkit - decompile error
     }
 
     public NBTTagCompound createTag() {
@@ -156,7 +156,7 @@
 
     private void loadFromTag(DynamicLike<?> dynamiclike) {
         this.rules.forEach((gamerules_gamerulekey, gamerules_gamerulevalue) -> {
-            Optional optional = dynamiclike.get(gamerules_gamerulekey.id).asString().result();
+            Optional<String> optional = dynamiclike.get(gamerules_gamerulekey.id).asString().result(); // CraftBukkit - decompile error
 
             Objects.requireNonNull(gamerules_gamerulevalue);
             optional.ifPresent(gamerules_gamerulevalue::deserialize);
@@ -176,8 +176,8 @@
     }
 
     private static <T extends GameRules.GameRuleValue<T>> void callVisitorCap(GameRules.GameRuleVisitor gamerules_gamerulevisitor, GameRules.GameRuleKey<?> gamerules_gamerulekey, GameRules.GameRuleDefinition<?> gamerules_gameruledefinition) {
-        gamerules_gamerulevisitor.visit(gamerules_gamerulekey, gamerules_gameruledefinition);
-        gamerules_gameruledefinition.callVisitor(gamerules_gamerulevisitor, gamerules_gamerulekey);
+        gamerules_gamerulevisitor.visit((GameRules.GameRuleKey<T>) gamerules_gamerulekey, (GameRules.GameRuleDefinition<T>) gamerules_gameruledefinition); // CraftBukkit - decompile error
+        ((GameRules.GameRuleDefinition<T>) gamerules_gameruledefinition).callVisitor(gamerules_gamerulevisitor, (GameRules.GameRuleKey<T>) gamerules_gamerulekey); // CraftBukkit - decompile error
     }
 
     public void assignFrom(GameRules gamerules, @Nullable MinecraftServer minecraftserver) {
@@ -269,7 +269,7 @@
         }
 
         public T createRule() {
-            return (GameRules.GameRuleValue) this.constructor.apply(this);
+            return this.constructor.apply(this); // CraftBukkit - decompile error
         }
 
         public void callVisitor(GameRules.GameRuleVisitor gamerules_gamerulevisitor, GameRules.GameRuleKey<T> gamerules_gamerulekey) {
@@ -299,7 +299,7 @@
 
         }
 
-        protected abstract void deserialize(String s);
+        public abstract void deserialize(String s); // PAIL - private->public
 
         public abstract String serialize();
 
@@ -365,7 +365,7 @@
         }
 
         @Override
-        protected void deserialize(String s) {
+        public void deserialize(String s) { // PAIL - protected->public
             this.value = Boolean.parseBoolean(s);
         }
 
@@ -430,7 +430,7 @@
         }
 
         @Override
-        protected void deserialize(String s) {
+        public void deserialize(String s) { // PAIL - protected->public
             this.value = safeParse(s);
         }
 
