                  }
              }
          }
-@@ -579,6 +601,7 @@
+@@ -579,6 +605,7 @@
              }
              catch (IOException var7)
              {

                 var7.printStackTrace();
             }
         }
@@ -616,9 +639,28 @@
             }
             catch (IOException var6)
             {

                 var5.printStackTrace();
                 int[] var4 = this.func_28148_b(this.field_25189_l);
                 this.field_28151_c.put(p_28149_1_, var4);
@@ -459,8 +471,17 @@
         for (int var2 = 0; var2 < this.field_1604_f.size(); ++var2)
         {
             TextureFX var3 = (TextureFX)this.field_1604_f.get(var2);
+            if (var3.errored) continue;
             var3.field_1131_c = this.field_1602_h.field_1578_g;
-            var3.func_783_a();
+            Profiler.func_40663_a(var3.getClass().getSimpleName());
+            try {
+                var3.func_783_a();
+            } catch (Exception e) {
+                FMLCommonHandler.instance().getFMLLogger().warning(String.format("Texture FX %s has failed to animate. Likely caused by a texture pack change that they did not respond correctly to",var3.getClass().getSimpleName()));
+                var3.errored=true;
+                continue;
+            }
+            Profiler.func_40662_b();
             this.field_1605_e.clear();
             this.field_1605_e.put(var3.field_1127_a);
             this.field_1605_e.position(0).limit(var3.field_1127_a.length);
@@ -470,12 +491,17 @@
                 var3.func_782_a(this);
                 var1 = var3.field_1126_b;
             }
+            if (var3.field_1127_a.length!=TextureFX.tileSizeSquare<<2) {
+                FMLCommonHandler.instance().getFMLLogger().warning(String.format("Detected a texture FX discrepancy in %s (%d, %d)",var3.getClass().getSimpleName(), var3.field_1127_a.length, var3.tileSizeSquare<<2));
+                var3.errored=true;
+                continue;
+            }
 
