From d4825132a3be9490219bd1c854e0740ce842ec8f Mon Sep 17 00:00:00 2001
From: Shon Ferguson <shonferg@users.sourceforge.net>
Date: Thu, 28 Sep 2006 05:52:19 +0000
Subject: [PATCH] Updated from XML. Generated array code now prints 20 items
 per 2D array in total when verbose is off. Fixed duplicated Read call.  All
 FFvt3R demo files can now be read by Niflib.

---
 include/gen/obj_defines.h               |   12 +-
 include/obj/NiPSysEmitterLifeSpanCtlr.h |    3 +
 src/gen/obj_impl.cpp                    | 1265 +++++++++++++++++++----
 src/obj/NiPSysEmitterCtlrData.cpp       |    2 +-
 src/obj/NiPSysEmitterLifeSpanCtlr.cpp   |    1 +
 5 files changed, 1102 insertions(+), 181 deletions(-)

diff --git a/include/gen/obj_defines.h b/include/gen/obj_defines.h
index fbb50cc7..acd162ff 100644
--- a/include/gen/obj_defines.h
+++ b/include/gen/obj_defines.h
@@ -193,7 +193,8 @@ vector<float > unknownFloats1; \
 ushort unknownShort3; \
 bool hasUnknownFloats2; \
 vector<float > unknownFloats2; \
-byte unknownByte1; \
+byte hasUnknownFloats3; \
+vector< array<4,float> > unknownFloats3; \
 
 #define BHK_BLEND_COLLISION_OBJECT_MEMBERS \
 float unknownFloat1; \
@@ -636,7 +637,6 @@ float alpha; \
 
 #define NI_MESH_P_SYS_DATA_MEMBERS \
 byte unknownByte11; \
-vector< array<4,float> > unknownFloats3; \
 vector< array<10,float> > unknownFloats4; \
 vector< array<12,float> > unknownFloats5; \
 uint unknownInt1; \
@@ -780,7 +780,7 @@ float lifetime; \
 float lifetimeRandom; \
 ushort emitFlags; \
 Vector3 startRandom; \
-Ref<NiObject > emitter; \
+NiObject * emitter; \
 ushort unknownShort2_; \
 float unknownFloat13_; \
 uint unknownInt1_; \
@@ -922,6 +922,7 @@ vector<Key<byte > > visibilityKeys_; \
 #define NI_P_SYS_EMITTER_INITIAL_RADIUS_CTLR_MEMBERS \
 
 #define NI_P_SYS_EMITTER_LIFE_SPAN_CTLR_MEMBERS \
+Ref<NiFloatData > unknownLink; \
 
 #define NI_P_SYS_EMITTER_SPEED_CTLR_MEMBERS \
 Ref<NiFloatData > unknownLink; \
@@ -1640,7 +1641,7 @@ CompareMode function; \
 
 #define A_P_SYS_DATA_PARENT NiGeometryData
 
-#define A_P_SYS_DATA_CONSTRUCT  : hasUnknownFloats1(false), unknownShort3((ushort)0), hasUnknownFloats2(false), unknownByte1((byte)0)
+#define A_P_SYS_DATA_CONSTRUCT  : hasUnknownFloats1(false), unknownShort3((ushort)0), hasUnknownFloats2(false), hasUnknownFloats3((byte)0)
 
 #define BHK_BLEND_COLLISION_OBJECT_INCLUDE "NiCollisionObject.h"
 
@@ -2372,7 +2373,8 @@ CompareMode function; \
 
 #define NI_P_SYS_EMITTER_LIFE_SPAN_CTLR_PARENT APSysCtlr
 
-#define NI_P_SYS_EMITTER_LIFE_SPAN_CTLR_CONSTRUCT 
+#define NI_P_SYS_EMITTER_LIFE_SPAN_CTLR_CONSTRUCT  : unknownLink(NULL)
+
 #define NI_P_SYS_EMITTER_SPEED_CTLR_INCLUDE "APSysCtlr.h"
 
 #define NI_P_SYS_EMITTER_SPEED_CTLR_PARENT APSysCtlr
diff --git a/include/obj/NiPSysEmitterLifeSpanCtlr.h b/include/obj/NiPSysEmitterLifeSpanCtlr.h
index 0455cbc6..f3cb0d86 100644
--- a/include/obj/NiPSysEmitterLifeSpanCtlr.h
+++ b/include/obj/NiPSysEmitterLifeSpanCtlr.h
@@ -10,6 +10,9 @@ namespace Niflib {
 
 #include "../gen/obj_defines.h"
 
+// Forward define of referenced blocks
+class NiFloatData;
+
 class NiPSysEmitterLifeSpanCtlr;
 typedef Ref<NiPSysEmitterLifeSpanCtlr> NiPSysEmitterLifeSpanCtlrRef;
 
diff --git a/src/gen/obj_impl.cpp b/src/gen/obj_impl.cpp
index 6c97682e..9871c534 100644
--- a/src/gen/obj_impl.cpp
+++ b/src/gen/obj_impl.cpp
@@ -227,6 +227,7 @@ void NiObject::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, unsi
 
 std::string NiObject::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	return out.str();
 }
 
@@ -248,6 +249,7 @@ void AKeyedData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, un
 
 std::string AKeyedData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiObject::asString();
 	return out.str();
 }
@@ -285,6 +287,7 @@ void AParticleModifier::InternalWrite( ostream& out, map<NiObjectRef,uint> link_
 
 std::string AParticleModifier::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiObject::asString();
 	out << "  Next Modifier:  " << nextModifier << endl;
 	out << "  Controller:  " << controller << endl;
@@ -315,6 +318,7 @@ void bhkRefObject::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map,
 
 std::string bhkRefObject::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiObject::asString();
 	return out.str();
 }
@@ -339,6 +343,7 @@ void bhkSerializable::InternalWrite( ostream& out, map<NiObjectRef,uint> link_ma
 
 std::string bhkSerializable::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << bhkRefObject::asString();
 	return out.str();
 }
@@ -380,15 +385,21 @@ void AbhkConstraint::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map
 
 std::string AbhkConstraint::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << bhkSerializable::asString();
 	numBodies = uint(bodies.size());
 	out << "  Num Bodies:  " << numBodies << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < bodies.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Bodies[" << i1 << "]:  " << bodies[i1] << endl;
+		array_output_count++;
 	};
 	out << "  Priority:  " << priority << endl;
 	return out.str();
@@ -443,6 +454,7 @@ void AbhkRagdollConstraint::InternalWrite( ostream& out, map<NiObjectRef,uint> l
 
 std::string AbhkRagdollConstraint::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << AbhkConstraint::asString();
 	out << "  Pivot A:  " << pivotA << endl;
 	out << "  Plane A:  " << planeA << endl;
@@ -479,6 +491,7 @@ void bhkShape::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, unsi
 
 std::string bhkShape::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << bhkSerializable::asString();
 	return out.str();
 }
@@ -503,6 +516,7 @@ void AbhkShapeCollection::InternalWrite( ostream& out, map<NiObjectRef,uint> lin
 
 std::string AbhkShapeCollection::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << bhkShape::asString();
 	return out.str();
 }
@@ -529,6 +543,7 @@ void bhkSphereRepShape::InternalWrite( ostream& out, map<NiObjectRef,uint> link_
 
 std::string bhkSphereRepShape::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << bhkShape::asString();
 	out << "  Material:  " << material << endl;
 	return out.str();
@@ -554,6 +569,7 @@ void bhkConvexShape::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map
 
 std::string bhkConvexShape::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << bhkSphereRepShape::asString();
 	return out.str();
 }
@@ -578,6 +594,7 @@ void bhkWorldObject::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map
 
 std::string bhkWorldObject::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << bhkShape::asString();
 	return out.str();
 }
@@ -615,6 +632,7 @@ void bhkEntity::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, uns
 
 std::string bhkEntity::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << bhkWorldObject::asString();
 	out << "  Shape:  " << shape << endl;
 	out << "  Layer:  " << layer << endl;
@@ -661,6 +679,7 @@ void NiCollisionObject::InternalWrite( ostream& out, map<NiObjectRef,uint> link_
 
 std::string NiCollisionObject::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiObject::asString();
 	out << "  Parent:  " << parent << endl;
 	out << "  Unknown Short:  " << unknownShort << endl;
@@ -709,6 +728,7 @@ void NiExtraData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, u
 
 std::string NiExtraData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiObject::asString();
 	out << "  Name:  " << name << endl;
 	out << "  Next Extra Data:  " << nextExtraData << endl;
@@ -740,6 +760,7 @@ void NiInterpolator::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map
 
 std::string NiInterpolator::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiObject::asString();
 	return out.str();
 }
@@ -768,6 +789,7 @@ void NiBlendInterpolator::InternalWrite( ostream& out, map<NiObjectRef,uint> lin
 
 std::string NiBlendInterpolator::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiInterpolator::asString();
 	out << "  Unknown Short:  " << unknownShort << endl;
 	out << "  Unknown Int:  " << unknownInt << endl;
@@ -811,6 +833,7 @@ void NiBSplineInterpolator::InternalWrite( ostream& out, map<NiObjectRef,uint> l
 
 std::string NiBSplineInterpolator::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiInterpolator::asString();
 	out << "  Start Time:  " << startTime << endl;
 	out << "  Stop Time:  " << stopTime << endl;
@@ -882,17 +905,23 @@ void NiObjectNET::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, u
 
 std::string NiObjectNET::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiObject::asString();
 	numExtraDataList = uint(extraDataList.size());
 	out << "  Name:  " << name << endl;
 	out << "  Extra Data:  " << extraData << endl;
 	out << "  Num Extra Data List:  " << numExtraDataList << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < extraDataList.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Extra Data List[" << i1 << "]:  " << extraDataList[i1] << endl;
+		array_output_count++;
 	};
 	out << "  Controller:  " << controller << endl;
 	return out.str();
@@ -1002,6 +1031,7 @@ void NiAVObject::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, un
 
 std::string NiAVObject::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiObjectNET::asString();
 	numProperties = uint(properties.size());
 	out << "  Flags:  " << flags << endl;
@@ -1010,12 +1040,17 @@ std::string NiAVObject::InternalAsString( bool verbose ) const {
 	out << "  Scale:  " << scale << endl;
 	out << "  Velocity:  " << velocity << endl;
 	out << "  Num Properties:  " << numProperties << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < properties.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Properties[" << i1 << "]:  " << properties[i1] << endl;
+		array_output_count++;
 	};
 	out << "  Has Bounding Box:  " << hasBoundingBox << endl;
 	if ( (hasBoundingBox != 0) ) {
@@ -1104,23 +1139,34 @@ void NiDynamicEffect::InternalWrite( ostream& out, map<NiObjectRef,uint> link_ma
 
 std::string NiDynamicEffect::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiAVObject::asString();
 	numAffectedNodes = uint(affectedNodeListPointers.size());
 	out << "  Switch State:  " << switchState << endl;
 	out << "  Num Affected Nodes:  " << numAffectedNodes << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < affectedNodeListPointers.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Affected Node List Pointers[" << i1 << "]:  " << affectedNodeListPointers[i1] << endl;
+		array_output_count++;
 	};
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < affectedNodes.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Affected Nodes[" << i1 << "]:  " << affectedNodes[i1] << endl;
+		array_output_count++;
 	};
 	return out.str();
 }
@@ -1162,6 +1208,7 @@ void NiLight::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, unsig
 
 std::string NiLight::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiDynamicEffect::asString();
 	out << "  Dimmer:  " << dimmer << endl;
 	out << "  Ambient Color:  " << ambientColor << endl;
@@ -1190,6 +1237,7 @@ void NiProperty::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, un
 
 std::string NiProperty::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiObjectNET::asString();
 	return out.str();
 }
@@ -1227,6 +1275,7 @@ void NiPSysModifier::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map
 
 std::string NiPSysModifier::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiObject::asString();
 	out << "  Name:  " << name << endl;
 	out << "  Order:  " << order << endl;
@@ -1282,6 +1331,7 @@ void NiPSysEmitter::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map,
 
 std::string NiPSysEmitter::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiPSysModifier::asString();
 	out << "  Speed:  " << speed << endl;
 	out << "  Speed Variation:  " << speedVariation << endl;
@@ -1328,6 +1378,7 @@ void NiPSysVolumeEmitter::InternalWrite( ostream& out, map<NiObjectRef,uint> lin
 
 std::string NiPSysVolumeEmitter::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiPSysEmitter::asString();
 	out << "  Emitter Object:  " << emitterObject << endl;
 	return out.str();
@@ -1379,6 +1430,7 @@ void NiTimeController::InternalWrite( ostream& out, map<NiObjectRef,uint> link_m
 
 std::string NiTimeController::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiObject::asString();
 	out << "  Next Controller:  " << nextController << endl;
 	out << "  Flags:  " << flags << endl;
@@ -1441,20 +1493,31 @@ void ABoneLODController::InternalWrite( ostream& out, map<NiObjectRef,uint> link
 
 std::string ABoneLODController::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiTimeController::asString();
 	numNodeGroups = uint(nodeGroups.size());
 	out << "  Unknown Int 1:  " << unknownInt1 << endl;
 	out << "  Num Node Groups:  " << numNodeGroups << endl;
 	out << "  Num Node Groups 2:  " << numNodeGroups2 << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < nodeGroups.size(); i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
 		nodeGroups[i1].numNodes = uint(nodeGroups[i1].nodes.size());
 		out << "    Num Nodes:  " << nodeGroups[i1].numNodes << endl;
+		array_output_count = 0;
 		for (uint i2 = 0; i2 < nodeGroups[i1].nodes.size(); i2++) {
-			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) {
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 				break;
 			};
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+				break;
+			};
 			out << "      Nodes[" << i2 << "]:  " << nodeGroups[i1].nodes[i2] << endl;
+			array_output_count++;
 		};
 	};
 	return out.str();
@@ -1502,6 +1565,7 @@ void NiSingleInterpolatorController::InternalWrite( ostream& out, map<NiObjectRe
 
 std::string NiSingleInterpolatorController::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiTimeController::asString();
 	out << "  Interpolator:  " << interpolator << endl;
 	return out.str();
@@ -1534,6 +1598,7 @@ void APSysCtlr::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, uns
 
 std::string APSysCtlr::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiSingleInterpolatorController::asString();
 	out << "  Modifier Name:  " << modifierName << endl;
 	return out.str();
@@ -1590,6 +1655,7 @@ void NiGeometry::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, un
 
 std::string NiGeometry::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiAVObject::asString();
 	out << "  Data:  " << data << endl;
 	out << "  Skin Instance:  " << skinInstance << endl;
@@ -1634,6 +1700,7 @@ void NiTriBasedGeom::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map
 
 std::string NiTriBasedGeom::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiGeometry::asString();
 	return out.str();
 }
@@ -1805,6 +1872,7 @@ void NiGeometryData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map
 
 std::string NiGeometryData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiObject::asString();
 	numUvSets = ushort(uvSets.size());
 	numUvSets2 = byte(uvSets.size());
@@ -1814,63 +1882,93 @@ std::string NiGeometryData::InternalAsString( bool verbose ) const {
 	out << "  Unknown Short 1:  " << unknownShort1 << endl;
 	out << "  Has Vertices:  " << hasVertices << endl;
 	if ( (hasVertices != 0) ) {
+		array_output_count = 0;
 		for (uint i2 = 0; i2 < vertices.size(); i2++) {
-			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) {
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 				break;
 			};
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+				break;
+			};
 			out << "      Vertices[" << i2 << "]:  " << vertices[i2] << endl;
+			array_output_count++;
 		};
 	};
 	out << "  Num UV Sets 2:  " << numUvSets2 << endl;
 	out << "  Unknown Byte:  " << unknownByte << endl;
 	out << "  Has Normals:  " << hasNormals << endl;
 	if ( (hasNormals != 0) ) {
+		array_output_count = 0;
 		for (uint i2 = 0; i2 < normals.size(); i2++) {
-			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) {
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 				break;
 			};
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+				break;
+			};
 			out << "      Normals[" << i2 << "]:  " << normals[i2] << endl;
+			array_output_count++;
 		};
 	};
 	if ( (((hasNormals != 0)) && ((unknownByte & 16))) ) {
+		array_output_count = 0;
 		for (uint i2 = 0; i2 < unknownVectors1.size(); i2++) {
-			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) {
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 				break;
 			};
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+				break;
+			};
 			out << "      Unknown Vectors 1[" << i2 << "]:  " << unknownVectors1[i2] << endl;
+			array_output_count++;
 		};
+		array_output_count = 0;
 		for (uint i2 = 0; i2 < unknownVectors2.size(); i2++) {
-			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) {
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 				break;
 			};
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+				break;
+			};
 			out << "      Unknown Vectors 2[" << i2 << "]:  " << unknownVectors2[i2] << endl;
+			array_output_count++;
 		};
 	};
 	out << "  Center:  " << center << endl;
 	out << "  Radius:  " << radius << endl;
 	out << "  Has Vertex Colors:  " << hasVertexColors << endl;
 	if ( (hasVertexColors != 0) ) {
+		array_output_count = 0;
 		for (uint i2 = 0; i2 < vertexColors.size(); i2++) {
-			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) {
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 				break;
 			};
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+				break;
+			};
 			out << "      Vertex Colors[" << i2 << "]:  " << vertexColors[i2] << endl;
+			array_output_count++;
 		};
 	};
 	out << "  Num UV Sets:  " << numUvSets << endl;
 	out << "  Has UV:  " << hasUv << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < uvSets.size(); i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
 		for (uint i2 = 0; i2 < uvSets[i1].size(); i2++) {
-			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) {
-				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				break;
 			};
-			out << "      UV Sets[" << i1 << "][" << i2 << "]:  " << uvSets[i1][i2] << endl;
+			out << "      UV Sets[" << i2 << "]:  " << uvSets[i1][i2] << endl;
+			array_output_count++;
 		};
 	};
 	out << "  Unknown Short 2:  " << unknownShort2 << endl;
@@ -1905,6 +2003,7 @@ void NiTriBasedGeomData::InternalWrite( ostream& out, map<NiObjectRef,uint> link
 
 std::string NiTriBasedGeomData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiGeometryData::asString();
 	out << "  Num Triangles:  " << numTriangles << endl;
 	return out.str();
@@ -1937,7 +2036,15 @@ void APSysData::InternalRead( istream& in, list<uint> & link_stack, unsigned int
 			NifStream( unknownFloats2[i2], in, version );
 		};
 	};
-	NifStream( unknownByte1, in, version );
+	NifStream( hasUnknownFloats3, in, version );
+	if ( (hasUnknownFloats3 != 0) ) {
+		unknownFloats3.resize(numVertices);
+		for (uint i2 = 0; i2 < unknownFloats3.size(); i2++) {
+			for (uint i3 = 0; i3 < 4; i3++) {
+				NifStream( unknownFloats3[i2][i3], in, version );
+			};
+		};
+	};
 }
 
 void APSysData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const {
@@ -1955,34 +2062,68 @@ void APSysData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, uns
 			NifStream( unknownFloats2[i2], out, version );
 		};
 	};
-	NifStream( unknownByte1, out, version );
+	NifStream( hasUnknownFloats3, out, version );
+	if ( (hasUnknownFloats3 != 0) ) {
+		for (uint i2 = 0; i2 < unknownFloats3.size(); i2++) {
+			for (uint i3 = 0; i3 < 4; i3++) {
+				NifStream( unknownFloats3[i2][i3], out, version );
+			};
+		};
+	};
 }
 
 std::string APSysData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiGeometryData::asString();
 	out << "  Has Unknown Floats 1:  " << hasUnknownFloats1 << endl;
 	if ( (hasUnknownFloats1 != 0) ) {
+		array_output_count = 0;
 		for (uint i2 = 0; i2 < unknownFloats1.size(); i2++) {
-			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) {
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 				break;
 			};
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+				break;
+			};
 			out << "      Unknown Floats 1[" << i2 << "]:  " << unknownFloats1[i2] << endl;
+			array_output_count++;
 		};
 	};
 	out << "  Unknown Short 3:  " << unknownShort3 << endl;
 	out << "  Has Unknown Floats 2:  " << hasUnknownFloats2 << endl;
 	if ( (hasUnknownFloats2 != 0) ) {
+		array_output_count = 0;
 		for (uint i2 = 0; i2 < unknownFloats2.size(); i2++) {
-			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) {
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 				break;
 			};
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+				break;
+			};
 			out << "      Unknown Floats 2[" << i2 << "]:  " << unknownFloats2[i2] << endl;
+			array_output_count++;
+		};
+	};
+	out << "  Has Unknown Floats 3:  " << hasUnknownFloats3 << endl;
+	if ( (hasUnknownFloats3 != 0) ) {
+		array_output_count = 0;
+		for (uint i2 = 0; i2 < unknownFloats3.size(); i2++) {
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+				break;
+			};
+			for (uint i3 = 0; i3 < 4; i3++) {
+				if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+					break;
+				};
+				out << "        Unknown Floats 3[" << i3 << "]:  " << unknownFloats3[i2][i3] << endl;
+				array_output_count++;
+			};
 		};
 	};
-	out << "  Unknown Byte 1:  " << unknownByte1 << endl;
 	return out.str();
 }
 
@@ -2010,6 +2151,7 @@ void bhkBlendCollisionObject::InternalWrite( ostream& out, map<NiObjectRef,uint>
 
 std::string bhkBlendCollisionObject::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiCollisionObject::asString();
 	out << "  Unknown Float 1:  " << unknownFloat1 << endl;
 	out << "  Unknown Float 2:  " << unknownFloat2 << endl;
@@ -2038,6 +2180,7 @@ void bhkBlendController::InternalWrite( ostream& out, map<NiObjectRef,uint> link
 
 std::string bhkBlendController::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiTimeController::asString();
 	out << "  Unknown Int:  " << unknownInt << endl;
 	return out.str();
@@ -2077,6 +2220,7 @@ void bhkBoxShape::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, u
 
 std::string bhkBoxShape::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << bhkConvexShape::asString();
 	out << "  Unknown Float 1:  " << unknownFloat1 << endl;
 	out << "  Unknown Short 1:  " << unknownShort1 << endl;
@@ -2126,6 +2270,7 @@ void bhkCapsuleShape::InternalWrite( ostream& out, map<NiObjectRef,uint> link_ma
 
 std::string bhkCapsuleShape::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << bhkConvexShape::asString();
 	out << "  Radius:  " << radius << endl;
 	out << "  Unknown Short 1:  " << unknownShort1 << endl;
@@ -2159,6 +2304,7 @@ void bhkCollisionObject::InternalWrite( ostream& out, map<NiObjectRef,uint> link
 
 std::string bhkCollisionObject::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiCollisionObject::asString();
 	return out.str();
 }
@@ -2209,31 +2355,47 @@ void bhkConvexVerticesShape::InternalWrite( ostream& out, map<NiObjectRef,uint>
 
 std::string bhkConvexVerticesShape::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << bhkSphereRepShape::asString();
 	num2 = uint(unknownVectors2.size());
 	num1 = uint(unknownVectors1.size());
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < 7; i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Unknown Floats 1[" << i1 << "]:  " << unknownFloats1[i1] << endl;
+		array_output_count++;
 	};
 	out << "  Num 1:  " << num1 << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < unknownVectors1.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Unknown Vectors 1[" << i1 << "]:  " << unknownVectors1[i1] << endl;
+		array_output_count++;
 	};
 	out << "  Num 2:  " << num2 << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < unknownVectors2.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Unknown Vectors 2[" << i1 << "]:  " << unknownVectors2[i1] << endl;
+		array_output_count++;
 	};
 	return out.str();
 }
@@ -2268,14 +2430,20 @@ void bhkHingeConstraint::InternalWrite( ostream& out, map<NiObjectRef,uint> link
 
 std::string bhkHingeConstraint::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << AbhkConstraint::asString();
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < 5; i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
 		for (uint i2 = 0; i2 < 4; i2++) {
-			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) {
-				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				break;
 			};
-			out << "      Unknown Floats[" << i1 << "][" << i2 << "]:  " << unknownFloats[i1][i2] << endl;
+			out << "      Unknown Floats[" << i2 << "]:  " << unknownFloats[i1][i2] << endl;
+			array_output_count++;
 		};
 	};
 	return out.str();
@@ -2321,6 +2489,7 @@ void bhkLimitedHingeConstraint::InternalWrite( ostream& out, map<NiObjectRef,uin
 
 std::string bhkLimitedHingeConstraint::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << AbhkConstraint::asString();
 	out << "  Pivot A:  " << limitedHinge.pivotA << endl;
 	out << "  Axle A:  " << limitedHinge.axleA << endl;
@@ -2388,32 +2557,48 @@ void bhkListShape::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map,
 
 std::string bhkListShape::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << AbhkShapeCollection::asString();
 	numUnknownInts = uint(unknownInts.size());
 	numSubShapes = uint(subShapes.size());
 	out << "  Num Sub Shapes:  " << numSubShapes << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < subShapes.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Sub Shapes[" << i1 << "]:  " << subShapes[i1] << endl;
+		array_output_count++;
 	};
 	out << "  Material:  " << material << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < 6; i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Unknown Floats[" << i1 << "]:  " << unknownFloats[i1] << endl;
+		array_output_count++;
 	};
 	out << "  Num Unknown Ints:  " << numUnknownInts << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < unknownInts.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Unknown Ints[" << i1 << "]:  " << unknownInts[i1] << endl;
+		array_output_count++;
 	};
 	return out.str();
 }
@@ -2520,6 +2705,7 @@ void bhkMalleableConstraint::InternalWrite( ostream& out, map<NiObjectRef,uint>
 
 std::string bhkMalleableConstraint::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << AbhkConstraint::asString();
 	out << "  Type:  " << type << endl;
 	out << "  Unknown Int 2:  " << unknownInt2 << endl;
@@ -2614,25 +2800,36 @@ void bhkMoppBvTreeShape::InternalWrite( ostream& out, map<NiObjectRef,uint> link
 
 std::string bhkMoppBvTreeShape::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << bhkShape::asString();
 	numUnknownBytes2 = uint(unknownBytes2.size());
 	out << "  Shape:  " << shape << endl;
 	out << "  Material:  " << material << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < 8; i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Unknown Bytes 1[" << i1 << "]:  " << unknownBytes1[i1] << endl;
+		array_output_count++;
 	};
 	out << "  Unknown Float:  " << unknownFloat << endl;
 	out << "  Num Unknown Bytes 2:  " << numUnknownBytes2 << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < unknownBytes2.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Unknown Bytes 2[" << i1 << "]:  " << unknownBytes2[i1] << endl;
+		array_output_count++;
 	};
 	out << "  Unknown Vector:  " << unknownVector << endl;
 	out << "  Unknown Float 2:  " << unknownFloat2 << endl;
@@ -2680,13 +2877,19 @@ void bhkMultiSphereShape::InternalWrite( ostream& out, map<NiObjectRef,uint> lin
 
 std::string bhkMultiSphereShape::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << bhkSphereRepShape::asString();
 	numSpheres = uint(spheres.size());
 	out << "  Unknown Float 1:  " << unknownFloat1 << endl;
 	out << "  Unknown Float 2:  " << unknownFloat2 << endl;
 	out << "  Unknown Float 3:  " << unknownFloat3 << endl;
 	out << "  Num Spheres:  " << numSpheres << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < spheres.size(); i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
 		out << "    Center:  " << spheres[i1].center << endl;
 		out << "    Radius:  " << spheres[i1].radius << endl;
 	};
@@ -2754,36 +2957,52 @@ void bhkNiTriStripsShape::InternalWrite( ostream& out, map<NiObjectRef,uint> lin
 
 std::string bhkNiTriStripsShape::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << bhkSphereRepShape::asString();
 	numUnknownInts2 = uint(unknownInts2.size());
 	numStripsData = uint(stripsData.size());
 	out << "  Unknown Float 1:  " << unknownFloat1 << endl;
 	out << "  Unknown Int 1:  " << unknownInt1 << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < 4; i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Unknown Ints 1[" << i1 << "]:  " << unknownInts1[i1] << endl;
+		array_output_count++;
 	};
 	out << "  Unknown Int 2:  " << unknownInt2 << endl;
 	out << "  Scale:  " << scale << endl;
 	out << "  Unknown Int 3:  " << unknownInt3 << endl;
 	out << "  Num Strips Data:  " << numStripsData << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < stripsData.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Strips Data[" << i1 << "]:  " << stripsData[i1] << endl;
+		array_output_count++;
 	};
 	out << "  Num Unknown Ints 2:  " << numUnknownInts2 << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < unknownInts2.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Unknown Ints 2[" << i1 << "]:  " << unknownInts2[i1] << endl;
+		array_output_count++;
 	};
 	return out.str();
 }
@@ -2850,32 +3069,48 @@ void bhkPackedNiTriStripsShape::InternalWrite( ostream& out, map<NiObjectRef,uin
 
 std::string bhkPackedNiTriStripsShape::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << AbhkShapeCollection::asString();
 	numSubparts = ushort(subparts.size());
 	out << "  Num Subparts:  " << numSubparts << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < subparts.size(); i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
 		for (uint i2 = 0; i2 < 3; i2++) {
-			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) {
-				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				break;
 			};
-			out << "      Subparts[" << i1 << "][" << i2 << "]:  " << subparts[i1][i2] << endl;
+			out << "      Subparts[" << i2 << "]:  " << subparts[i1][i2] << endl;
+			array_output_count++;
 		};
 	};
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < 9; i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Unknown Floats[" << i1 << "]:  " << unknownFloats[i1] << endl;
+		array_output_count++;
 	};
 	out << "  Scale:  " << scale << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < 3; i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Unknown Floats 2[" << i1 << "]:  " << unknownFloats2[i1] << endl;
+		array_output_count++;
 	};
 	out << "  Data:  " << data << endl;
 	return out.str();
@@ -2916,20 +3151,31 @@ void bhkPrismaticConstraint::InternalWrite( ostream& out, map<NiObjectRef,uint>
 
 std::string bhkPrismaticConstraint::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << AbhkConstraint::asString();
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < 8; i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Unknown Vectors[" << i1 << "]:  " << unknownVectors[i1] << endl;
+		array_output_count++;
 	};
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < 3; i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Unknown Floats 2[" << i1 << "]:  " << unknownFloats2[i1] << endl;
+		array_output_count++;
 	};
 	return out.str();
 }
@@ -2954,6 +3200,7 @@ void bhkRagdollConstraint::InternalWrite( ostream& out, map<NiObjectRef,uint> li
 
 std::string bhkRagdollConstraint::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << AbhkRagdollConstraint::asString();
 	return out.str();
 }
@@ -3077,30 +3324,46 @@ void bhkRigidBody::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map,
 
 std::string bhkRigidBody::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << bhkEntity::asString();
 	numConstraints = uint(constraints.size());
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < 5; i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Unknown 5 Floats[" << i1 << "]:  " << unknown5Floats[i1] << endl;
+		array_output_count++;
 	};
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < 4; i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Unknown 4 Shorts[" << i1 << "]:  " << unknown4Shorts[i1] << endl;
+		array_output_count++;
 	};
 	out << "  Layer Copy:  " << layerCopy << endl;
 	out << "  Col Filter Copy:  " << colFilterCopy << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < 7; i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Unknown 7 Shorts[" << i1 << "]:  " << unknown7Shorts[i1] << endl;
+		array_output_count++;
 	};
 	out << "  Translation:  " << translation << endl;
 	out << "  Unknown Float 00:  " << unknownFloat00 << endl;
@@ -3112,12 +3375,17 @@ std::string bhkRigidBody::InternalAsString( bool verbose ) const {
 	out << "  Unknown Float 01:  " << unknownFloat01 << endl;
 	out << "  Angular Velocity:  " << angularVelocity << endl;
 	out << "  Unknown Float 02:  " << unknownFloat02 << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < 12; i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Transform[" << i1 << "]:  " << transform[i1] << endl;
+		array_output_count++;
 	};
 	out << "  Center:  " << center << endl;
 	out << "  Unknown Float 03:  " << unknownFloat03 << endl;
@@ -3137,12 +3405,17 @@ std::string bhkRigidBody::InternalAsString( bool verbose ) const {
 	out << "  Unknown Int 7:  " << unknownInt7 << endl;
 	out << "  Unknown Int 8:  " << unknownInt8 << endl;
 	out << "  Num Constraints:  " << numConstraints << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < constraints.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Constraints[" << i1 << "]:  " << constraints[i1] << endl;
+		array_output_count++;
 	};
 	return out.str();
 }
@@ -3174,6 +3447,7 @@ void bhkRigidBodyT::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map,
 
 std::string bhkRigidBodyT::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << bhkRigidBody::asString();
 	return out.str();
 }
@@ -3216,21 +3490,32 @@ void bhkSimpleShapePhantom::InternalWrite( ostream& out, map<NiObjectRef,uint> l
 
 std::string bhkSimpleShapePhantom::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << bhkEntity::asString();
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < 7; i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Unkown Floats[" << i1 << "]:  " << unkownFloats[i1] << endl;
+		array_output_count++;
 	};
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < 3; i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
 		for (uint i2 = 0; i2 < 5; i2++) {
-			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) {
-				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				break;
 			};
-			out << "      Unknown Floats 2[" << i1 << "][" << i2 << "]:  " << unknownFloats2[i1][i2] << endl;
+			out << "      Unknown Floats 2[" << i2 << "]:  " << unknownFloats2[i1][i2] << endl;
+			array_output_count++;
 		};
 	};
 	out << "  Unknown Float:  " << unknownFloat << endl;
@@ -3257,6 +3542,7 @@ void bhkSPCollisionObject::InternalWrite( ostream& out, map<NiObjectRef,uint> li
 
 std::string bhkSPCollisionObject::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiCollisionObject::asString();
 	return out.str();
 }
@@ -3283,6 +3569,7 @@ void bhkSphereShape::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map
 
 std::string bhkSphereShape::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << bhkConvexShape::asString();
 	out << "  Radius:  " << radius << endl;
 	return out.str();
@@ -3320,14 +3607,20 @@ void bhkStiffSpringConstraint::InternalWrite( ostream& out, map<NiObjectRef,uint
 
 std::string bhkStiffSpringConstraint::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << AbhkConstraint::asString();
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < 2; i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
 		for (uint i2 = 0; i2 < 4; i2++) {
-			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) {
-				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				break;
 			};
-			out << "      Unknown Floats[" << i1 << "][" << i2 << "]:  " << unknownFloats[i1][i2] << endl;
+			out << "      Unknown Floats[" << i2 << "]:  " << unknownFloats[i1][i2] << endl;
+			array_output_count++;
 		};
 	};
 	out << "  Unknown Float:  " << unknownFloat << endl;
@@ -3362,6 +3655,7 @@ void bhkTransformShape::InternalWrite( ostream& out, map<NiObjectRef,uint> link_
 
 std::string bhkTransformShape::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << bhkEntity::asString();
 	out << "  Unknown Float 1:  " << unknownFloat1 << endl;
 	out << "  Unknown Float 2:  " << unknownFloat2 << endl;
@@ -3390,6 +3684,7 @@ void bhkConvexTransformShape::InternalWrite( ostream& out, map<NiObjectRef,uint>
 
 std::string bhkConvexTransformShape::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << bhkTransformShape::asString();
 	return out.str();
 }
@@ -3418,6 +3713,7 @@ void BSBound::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, unsig
 
 std::string BSBound::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiExtraData::asString();
 	out << "  Center:  " << center << endl;
 	out << "  Dimensions:  " << dimensions << endl;
@@ -3460,10 +3756,16 @@ void BSFurnitureMarker::InternalWrite( ostream& out, map<NiObjectRef,uint> link_
 
 std::string BSFurnitureMarker::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiExtraData::asString();
 	numPositions = uint(positions.size());
 	out << "  Num Positions:  " << numPositions << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < positions.size(); i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
 		out << "    Offset:  " << positions[i1].offset << endl;
 		out << "    Orientation:  " << positions[i1].orientation << endl;
 		out << "    Position Ref 1:  " << positions[i1].positionRef1 << endl;
@@ -3494,6 +3796,7 @@ void BSParentVelocityModifier::InternalWrite( ostream& out, map<NiObjectRef,uint
 
 std::string BSParentVelocityModifier::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiPSysModifier::asString();
 	out << "  Unknown Float:  " << unknownFloat << endl;
 	return out.str();
@@ -3519,6 +3822,7 @@ void BSPSysArrayEmitter::InternalWrite( ostream& out, map<NiObjectRef,uint> link
 
 std::string BSPSysArrayEmitter::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiPSysVolumeEmitter::asString();
 	return out.str();
 }
@@ -3545,6 +3849,7 @@ void BSXFlags::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, unsi
 
 std::string BSXFlags::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiExtraData::asString();
 	out << "  Flags:  " << flags << endl;
 	return out.str();
@@ -3594,22 +3899,33 @@ void hkPackedNiTriStripsData::InternalWrite( ostream& out, map<NiObjectRef,uint>
 
 std::string hkPackedNiTriStripsData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << AbhkShapeCollection::asString();
 	numVertices = uint(vertices.size());
 	numTriangles = uint(triangles.size());
 	out << "  Num Triangles:  " << numTriangles << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < triangles.size(); i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
 		out << "    Triangle:  " << triangles[i1].triangle << endl;
 		out << "    Unknown Short:  " << triangles[i1].unknownShort << endl;
 		out << "    Normal:  " << triangles[i1].normal << endl;
 	};
 	out << "  Num Vertices:  " << numVertices << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < vertices.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Vertices[" << i1 << "]:  " << vertices[i1] << endl;
+		array_output_count++;
 	};
 	return out.str();
 }
@@ -3645,6 +3961,7 @@ void NiAlphaController::InternalWrite( ostream& out, map<NiObjectRef,uint> link_
 
 std::string NiAlphaController::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiSingleInterpolatorController::asString();
 	out << "  Data:  " << data << endl;
 	return out.str();
@@ -3679,6 +3996,7 @@ void NiAlphaProperty::InternalWrite( ostream& out, map<NiObjectRef,uint> link_ma
 
 std::string NiAlphaProperty::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiProperty::asString();
 	out << "  Flags:  " << flags << endl;
 	out << "  Threshold:  " << threshold << endl;
@@ -3705,6 +4023,7 @@ void NiAmbientLight::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map
 
 std::string NiAmbientLight::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiLight::asString();
 	return out.str();
 }
@@ -3766,6 +4085,7 @@ void NiAutoNormalParticlesData::InternalWrite( ostream& out, map<NiObjectRef,uin
 
 std::string NiAutoNormalParticlesData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiGeometryData::asString();
 	out << "  Num Particles:  " << numParticles << endl;
 	out << "  Size:  " << size << endl;
@@ -3773,12 +4093,17 @@ std::string NiAutoNormalParticlesData::InternalAsString( bool verbose ) const {
 	out << "  Unknown Short:  " << unknownShort << endl;
 	out << "  Has Sizes:  " << hasSizes << endl;
 	if ( (hasSizes != 0) ) {
+		array_output_count = 0;
 		for (uint i2 = 0; i2 < sizes.size(); i2++) {
-			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) {
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 				break;
 			};
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+				break;
+			};
 			out << "      Sizes[" << i2 << "]:  " << sizes[i2] << endl;
+			array_output_count++;
 		};
 	};
 	return out.str();
@@ -3814,15 +4139,21 @@ void NiBinaryExtraData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_
 
 std::string NiBinaryExtraData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiExtraData::asString();
 	binaryData.dataSize = uint(binaryData.data.size());
 	out << "  Data Size:  " << binaryData.dataSize << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < binaryData.data.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Data[" << i1 << "]:  " << binaryData.data[i1] << endl;
+		array_output_count++;
 	};
 	return out.str();
 }
@@ -3849,6 +4180,7 @@ void NiBlendBoolInterpolator::InternalWrite( ostream& out, map<NiObjectRef,uint>
 
 std::string NiBlendBoolInterpolator::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiBlendInterpolator::asString();
 	out << "  Bool Value:  " << boolValue << endl;
 	return out.str();
@@ -3876,6 +4208,7 @@ void NiBlendFloatInterpolator::InternalWrite( ostream& out, map<NiObjectRef,uint
 
 std::string NiBlendFloatInterpolator::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiBlendInterpolator::asString();
 	out << "  Float Value:  " << floatValue << endl;
 	return out.str();
@@ -3903,6 +4236,7 @@ void NiBlendPoint3Interpolator::InternalWrite( ostream& out, map<NiObjectRef,uin
 
 std::string NiBlendPoint3Interpolator::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiBlendInterpolator::asString();
 	out << "  Point Value:  " << pointValue << endl;
 	return out.str();
@@ -3928,6 +4262,7 @@ void NiBlendTransformInterpolator::InternalWrite( ostream& out, map<NiObjectRef,
 
 std::string NiBlendTransformInterpolator::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiBlendInterpolator::asString();
 	return out.str();
 }
@@ -3995,25 +4330,41 @@ void NiBoneLODController::InternalWrite( ostream& out, map<NiObjectRef,uint> lin
 
 std::string NiBoneLODController::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << ABoneLODController::asString();
 	numShapeGroups2 = uint(shapeGroups2.size());
 	numShapeGroups = uint(shapeGroups1.size());
 	out << "  Num Shape Groups:  " << numShapeGroups << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < shapeGroups1.size(); i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
 		shapeGroups1[i1].numLinkPairs = uint(shapeGroups1[i1].linkPairs.size());
 		out << "    Num Link Pairs:  " << shapeGroups1[i1].numLinkPairs << endl;
+		array_output_count = 0;
 		for (uint i2 = 0; i2 < shapeGroups1[i1].linkPairs.size(); i2++) {
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+				break;
+			};
 			out << "      Shape:  " << shapeGroups1[i1].linkPairs[i2].shape << endl;
 			out << "      Skin Instance:  " << shapeGroups1[i1].linkPairs[i2].skinInstance << endl;
 		};
 	};
 	out << "  Num Shape Groups 2:  " << numShapeGroups2 << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < shapeGroups2.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Shape Groups 2[" << i1 << "]:  " << shapeGroups2[i1] << endl;
+		array_output_count++;
 	};
 	return out.str();
 }
@@ -4075,18 +4426,24 @@ void NiBoolData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, un
 
 std::string NiBoolData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << AKeyedData::asString();
 	data.numKeys = uint(data.keys.size());
 	out << "  Num Keys:  " << data.numKeys << endl;
 	if ( (data.numKeys != 0) ) {
 		out << "    Interpolation:  " << data.interpolation << endl;
 	};
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < data.keys.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Keys[" << i1 << "]:  " << data.keys[i1] << endl;
+		array_output_count++;
 	};
 	return out.str();
 }
@@ -4113,6 +4470,7 @@ void NiBooleanExtraData::InternalWrite( ostream& out, map<NiObjectRef,uint> link
 
 std::string NiBooleanExtraData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiExtraData::asString();
 	out << "  Boolean Data:  " << booleanData << endl;
 	return out.str();
@@ -4147,6 +4505,7 @@ void NiBoolInterpolator::InternalWrite( ostream& out, map<NiObjectRef,uint> link
 
 std::string NiBoolInterpolator::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiInterpolator::asString();
 	out << "  Bool Value:  " << boolValue << endl;
 	out << "  Data:  " << data << endl;
@@ -4185,6 +4544,7 @@ void NiBoolTimelineInterpolator::InternalWrite( ostream& out, map<NiObjectRef,ui
 
 std::string NiBoolTimelineInterpolator::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiInterpolator::asString();
 	out << "  Bool Value:  " << boolValue << endl;
 	out << "  Data:  " << data << endl;
@@ -4214,6 +4574,7 @@ void NiBSBoneLODController::InternalWrite( ostream& out, map<NiObjectRef,uint> l
 
 std::string NiBSBoneLODController::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << ABoneLODController::asString();
 	return out.str();
 }
@@ -4240,6 +4601,7 @@ void NiBSplineBasisData::InternalWrite( ostream& out, map<NiObjectRef,uint> link
 
 std::string NiBSplineBasisData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiObject::asString();
 	out << "  Num Control Pt:  " << numControlPt << endl;
 	return out.str();
@@ -4271,13 +4633,19 @@ void NiBSplineCompFloatInterpolator::InternalWrite( ostream& out, map<NiObjectRe
 
 std::string NiBSplineCompFloatInterpolator::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiBSplineInterpolator::asString();
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < 4; i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Unknown Floats[" << i1 << "]:  " << unknownFloats[i1] << endl;
+		array_output_count++;
 	};
 	return out.str();
 }
@@ -4308,13 +4676,19 @@ void NiBSplineCompPoint3Interpolator::InternalWrite( ostream& out, map<NiObjectR
 
 std::string NiBSplineCompPoint3Interpolator::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiBSplineInterpolator::asString();
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < 6; i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Unknown Floats[" << i1 << "]:  " << unknownFloats[i1] << endl;
+		array_output_count++;
 	};
 	return out.str();
 }
@@ -4363,6 +4737,7 @@ void NiBSplineCompTransformInterpolator::InternalWrite( ostream& out, map<NiObje
 
 std::string NiBSplineCompTransformInterpolator::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiBSplineInterpolator::asString();
 	out << "  Translation:  " << translation << endl;
 	out << "  Rotation:  " << rotation << endl;
@@ -4411,16 +4786,22 @@ void NiBSplineData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map,
 
 std::string NiBSplineData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiObject::asString();
 	count = uint(controlPoints.size());
 	out << "  Unknown Int:  " << unknownInt << endl;
 	out << "  Count:  " << count << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < controlPoints.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Control Points[" << i1 << "]:  " << controlPoints[i1] << endl;
+		array_output_count++;
 	};
 	return out.str();
 }
@@ -4494,6 +4875,7 @@ void NiCamera::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, unsi
 
 std::string NiCamera::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiAVObject::asString();
 	out << "  Unknown Short:  " << unknownShort << endl;
 	out << "  Frustum Left:  " << frustumLeft << endl;
@@ -4584,6 +4966,7 @@ void NiCollisionData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_ma
 
 std::string NiCollisionData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiObject::asString();
 	out << "  Target Node:  " << targetNode << endl;
 	out << "  Unknown Int 1:  " << unknownInt1 << endl;
@@ -4594,21 +4977,31 @@ std::string NiCollisionData::InternalAsString( bool verbose ) const {
 		out << "    Unknown Vector:  " << unknownVector << endl;
 	};
 	if ( (collisionType == 2) ) {
+		array_output_count = 0;
 		for (uint i2 = 0; i2 < 8; i2++) {
-			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) {
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 				break;
 			};
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+				break;
+			};
 			out << "      Unknown Float 1[" << i2 << "]:  " << unknownFloat1[i2] << endl;
+			array_output_count++;
 		};
 	};
 	if ( (collisionType == 1) ) {
+		array_output_count = 0;
 		for (uint i2 = 0; i2 < 15; i2++) {
-			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) {
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 				break;
 			};
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+				break;
+			};
 			out << "      Unknown Float 2[" << i2 << "]:  " << unknownFloat2[i2] << endl;
+			array_output_count++;
 		};
 	};
 	return out.str();
@@ -4651,18 +5044,24 @@ void NiColorData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, u
 
 std::string NiColorData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << AKeyedData::asString();
 	data.numKeys = uint(data.keys.size());
 	out << "  Num Keys:  " << data.numKeys << endl;
 	if ( (data.numKeys != 0) ) {
 		out << "    Interpolation:  " << data.interpolation << endl;
 	};
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < data.keys.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Keys[" << i1 << "]:  " << data.keys[i1] << endl;
+		array_output_count++;
 	};
 	return out.str();
 }
@@ -4689,6 +5088,7 @@ void NiColorExtraData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_m
 
 std::string NiColorExtraData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiExtraData::asString();
 	out << "  Data:  " << data << endl;
 	return out.str();
@@ -4737,16 +5137,22 @@ void NiControllerManager::InternalWrite( ostream& out, map<NiObjectRef,uint> lin
 
 std::string NiControllerManager::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiTimeController::asString();
 	numControllerSequences = uint(controllerSequences.size());
 	out << "  Cumulative:  " << cumulative << endl;
 	out << "  Num Controller Sequences:  " << numControllerSequences << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < controllerSequences.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Controller Sequences[" << i1 << "]:  " << controllerSequences[i1] << endl;
+		array_output_count++;
 	};
 	out << "  Object Palette:  " << objectPalette << endl;
 	return out.str();
@@ -5005,6 +5411,7 @@ void NiControllerSequence::InternalWrite( ostream& out, map<NiObjectRef,uint> li
 
 std::string NiControllerSequence::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiObject::asString();
 	numControlledBlocks = uint(controlledBlocks.size());
 	out << "  Name:  " << name << endl;
@@ -5012,7 +5419,12 @@ std::string NiControllerSequence::InternalAsString( bool verbose ) const {
 	out << "  Text Keys:  " << textKeys << endl;
 	out << "  Num Controlled Blocks:  " << numControlledBlocks << endl;
 	out << "  Unknown Int 1:  " << unknownInt1 << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < controlledBlocks.size(); i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
 		out << "    Target Name:  " << controlledBlocks[i1].targetName << endl;
 		out << "    Controller:  " << controlledBlocks[i1].controller << endl;
 		out << "    Interpolator:  " << controlledBlocks[i1].interpolator << endl;
@@ -5125,11 +5537,17 @@ void NiDefaultAVObjectPalette::InternalWrite( ostream& out, map<NiObjectRef,uint
 
 std::string NiDefaultAVObjectPalette::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiObject::asString();
 	numObjs = uint(objs.size());
 	out << "  Unknown Int:  " << unknownInt << endl;
 	out << "  Num Objs:  " << numObjs << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < objs.size(); i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
 		out << "    Name:  " << objs[i1].name << endl;
 		out << "    AV Object:  " << objs[i1].avObject << endl;
 	};
@@ -5161,6 +5579,7 @@ void NiDirectionalLight::InternalWrite( ostream& out, map<NiObjectRef,uint> link
 
 std::string NiDirectionalLight::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiLight::asString();
 	return out.str();
 }
@@ -5187,6 +5606,7 @@ void NiDitherProperty::InternalWrite( ostream& out, map<NiObjectRef,uint> link_m
 
 std::string NiDitherProperty::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiProperty::asString();
 	out << "  Flags:  " << flags << endl;
 	return out.str();
@@ -5237,18 +5657,24 @@ void NiFlipController::InternalWrite( ostream& out, map<NiObjectRef,uint> link_m
 
 std::string NiFlipController::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiSingleInterpolatorController::asString();
 	numSources = uint(sources.size());
 	out << "  Texture Slot:  " << textureSlot << endl;
 	out << "  Unknown Int 2:  " << unknownInt2 << endl;
 	out << "  Delta:  " << delta << endl;
 	out << "  Num Sources:  " << numSources << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < sources.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Sources[" << i1 << "]:  " << sources[i1] << endl;
+		array_output_count++;
 	};
 	return out.str();
 }
@@ -5296,18 +5722,24 @@ void NiFloatData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, u
 
 std::string NiFloatData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << AKeyedData::asString();
 	data.numKeys = uint(data.keys.size());
 	out << "  Num Keys:  " << data.numKeys << endl;
 	if ( (data.numKeys != 0) ) {
 		out << "    Interpolation:  " << data.interpolation << endl;
 	};
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < data.keys.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Keys[" << i1 << "]:  " << data.keys[i1] << endl;
+		array_output_count++;
 	};
 	return out.str();
 }
@@ -5334,6 +5766,7 @@ void NiFloatExtraData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_m
 
 std::string NiFloatExtraData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiExtraData::asString();
 	out << "  Float Data:  " << floatData << endl;
 	return out.str();
@@ -5372,6 +5805,7 @@ void NiFloatExtraDataController::InternalWrite( ostream& out, map<NiObjectRef,ui
 
 std::string NiFloatExtraDataController::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiTimeController::asString();
 	out << "  Unknown Link:  " << unknownLink << endl;
 	out << "  Unknown String:  " << unknownString << endl;
@@ -5412,6 +5846,7 @@ void NiFloatInterpolator::InternalWrite( ostream& out, map<NiObjectRef,uint> lin
 
 std::string NiFloatInterpolator::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiInterpolator::asString();
 	out << "  Float Value:  " << floatValue << endl;
 	out << "  Data:  " << data << endl;
@@ -5451,15 +5886,21 @@ void NiFloatsExtraData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_
 
 std::string NiFloatsExtraData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiExtraData::asString();
 	numFloats = uint(data.size());
 	out << "  Num Floats:  " << numFloats << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < data.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Data[" << i1 << "]:  " << data[i1] << endl;
+		array_output_count++;
 	};
 	return out.str();
 }
@@ -5490,6 +5931,7 @@ void NiFogProperty::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map,
 
 std::string NiFogProperty::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiProperty::asString();
 	out << "  Flags:  " << flags << endl;
 	out << "  Fog Depth:  " << fogDepth << endl;
@@ -5570,6 +6012,7 @@ void NiGeomMorpherController::InternalWrite( ostream& out, map<NiObjectRef,uint>
 
 std::string NiGeomMorpherController::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiTimeController::asString();
 	numUnknownInts = uint(unknownInts.size());
 	numInterpolators = uint(interpolators.size());
@@ -5578,20 +6021,30 @@ std::string NiGeomMorpherController::InternalAsString( bool verbose ) const {
 	out << "  Data:  " << data << endl;
 	out << "  Unknown Byte:  " << unknownByte << endl;
 	out << "  Num Interpolators:  " << numInterpolators << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < interpolators.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Interpolators[" << i1 << "]:  " << interpolators[i1] << endl;
+		array_output_count++;
 	};
 	out << "  Num Unknown Ints:  " << numUnknownInts << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < unknownInts.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Unknown Ints[" << i1 << "]:  " << unknownInts[i1] << endl;
+		array_output_count++;
 	};
 	return out.str();
 }
@@ -5638,6 +6091,7 @@ void NiGravity::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, uns
 
 std::string NiGravity::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << AParticleModifier::asString();
 	out << "  Unknown Float 1:  " << unknownFloat1 << endl;
 	out << "  Force:  " << force << endl;
@@ -5669,6 +6123,7 @@ void NiIntegerExtraData::InternalWrite( ostream& out, map<NiObjectRef,uint> link
 
 std::string NiIntegerExtraData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiExtraData::asString();
 	out << "  Integer Data:  " << integerData << endl;
 	return out.str();
@@ -5704,15 +6159,21 @@ void NiIntegersExtraData::InternalWrite( ostream& out, map<NiObjectRef,uint> lin
 
 std::string NiIntegersExtraData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiExtraData::asString();
 	numIntegers = uint(data.size());
 	out << "  Num Integers:  " << numIntegers << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < data.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Data[" << i1 << "]:  " << data[i1] << endl;
+		array_output_count++;
 	};
 	return out.str();
 }
@@ -5744,6 +6205,7 @@ void NiKeyframeController::InternalWrite( ostream& out, map<NiObjectRef,uint> li
 
 std::string NiKeyframeController::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiTimeController::asString();
 	out << "  Data:  " << data << endl;
 	return out.str();
@@ -5779,6 +6241,7 @@ void BSKeyframeController::InternalWrite( ostream& out, map<NiObjectRef,uint> li
 
 std::string BSKeyframeController::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiKeyframeController::asString();
 	out << "  Data 2:  " << data2 << endl;
 	return out.str();
@@ -5892,34 +6355,50 @@ void NiKeyframeData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map
 
 std::string NiKeyframeData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << AKeyedData::asString();
 	out << "  Num Rotation Keys:  " << numRotationKeys << endl;
 	if ( (numRotationKeys != 0) ) {
 		out << "    Rotation Type:  " << rotationType << endl;
 	};
 	if ( (rotationType != 4) ) {
+		array_output_count = 0;
 		for (uint i2 = 0; i2 < quaternionKeys.size(); i2++) {
-			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) {
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 				break;
 			};
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+				break;
+			};
 			out << "      Quaternion Keys[" << i2 << "]:  " << quaternionKeys[i2] << endl;
+			array_output_count++;
 		};
 	};
 	if ( (rotationType == 4) ) {
 		out << "    Unknown Float:  " << unknownFloat << endl;
+		array_output_count = 0;
 		for (uint i2 = 0; i2 < 3; i2++) {
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+				break;
+			};
 			xyzRotations[i2].numKeys = uint(xyzRotations[i2].keys.size());
 			out << "      Num Keys:  " << xyzRotations[i2].numKeys << endl;
 			if ( (xyzRotations[i2].numKeys != 0) ) {
 				out << "        Interpolation:  " << xyzRotations[i2].interpolation << endl;
 			};
+			array_output_count = 0;
 			for (uint i3 = 0; i3 < xyzRotations[i2].keys.size(); i3++) {
-				if ( !verbose && ( i3 > MAXARRAYDUMP ) ) {
+				if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 					out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 					break;
 				};
+				if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+					break;
+				};
 				out << "        Keys[" << i3 << "]:  " << xyzRotations[i2].keys[i3] << endl;
+				array_output_count++;
 			};
 		};
 	};
@@ -5928,24 +6407,34 @@ std::string NiKeyframeData::InternalAsString( bool verbose ) const {
 	if ( (translations.numKeys != 0) ) {
 		out << "    Interpolation:  " << translations.interpolation << endl;
 	};
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < translations.keys.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Keys[" << i1 << "]:  " << translations.keys[i1] << endl;
+		array_output_count++;
 	};
 	scales.numKeys = uint(scales.keys.size());
 	out << "  Num Keys:  " << scales.numKeys << endl;
 	if ( (scales.numKeys != 0) ) {
 		out << "    Interpolation:  " << scales.interpolation << endl;
 	};
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < scales.keys.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Keys[" << i1 << "]:  " << scales.keys[i1] << endl;
+		array_output_count++;
 	};
 	return out.str();
 }
@@ -5999,6 +6488,7 @@ void NiLightColorController::InternalWrite( ostream& out, map<NiObjectRef,uint>
 
 std::string NiLightColorController::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiTimeController::asString();
 	out << "  Unknown Short:  " << unknownShort << endl;
 	out << "  Data:  " << data << endl;
@@ -6043,6 +6533,7 @@ void NiLightDimmerController::InternalWrite( ostream& out, map<NiObjectRef,uint>
 
 std::string NiLightDimmerController::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiTimeController::asString();
 	out << "  Unknown Link:  " << unknownLink << endl;
 	return out.str();
@@ -6084,6 +6575,7 @@ void NiLookAtController::InternalWrite( ostream& out, map<NiObjectRef,uint> link
 
 std::string NiLookAtController::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiTimeController::asString();
 	out << "  Unknown1:  " << unknown1 << endl;
 	out << "  Look At Node:  " << lookAtNode << endl;
@@ -6148,6 +6640,7 @@ void NiLookAtInterpolator::InternalWrite( ostream& out, map<NiObjectRef,uint> li
 
 std::string NiLookAtInterpolator::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiInterpolator::asString();
 	out << "  Unknown Short:  " << unknownShort << endl;
 	out << "  Look At:  " << lookAt << endl;
@@ -6210,6 +6703,7 @@ void NiMaterialColorController::InternalWrite( ostream& out, map<NiObjectRef,uin
 
 std::string NiMaterialColorController::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiSingleInterpolatorController::asString();
 	out << "  Target Color:  " << targetColor << endl;
 	out << "  Data:  " << data << endl;
@@ -6259,6 +6753,7 @@ void NiMaterialProperty::InternalWrite( ostream& out, map<NiObjectRef,uint> link
 
 std::string NiMaterialProperty::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiProperty::asString();
 	out << "  Flags:  " << flags << endl;
 	out << "  Ambient Color:  " << ambientColor << endl;
@@ -6287,12 +6782,6 @@ void NiMeshPSysData::InternalRead( istream& in, list<uint> & link_stack, unsigne
 		NifStream( unknownByte11, in, version );
 	};
 	if ( version <= 0x14000004 ) {
-		unknownFloats3.resize(numVertices);
-		for (uint i2 = 0; i2 < unknownFloats3.size(); i2++) {
-			for (uint i3 = 0; i3 < 4; i3++) {
-				NifStream( unknownFloats3[i2][i3], in, version );
-			};
-		};
 		unknownFloats4.resize(numVertices);
 		for (uint i2 = 0; i2 < unknownFloats4.size(); i2++) {
 			for (uint i3 = 0; i3 < 10; i3++) {
@@ -6342,11 +6831,6 @@ void NiMeshPSysData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map
 		NifStream( unknownByte11, out, version );
 	};
 	if ( version <= 0x14000004 ) {
-		for (uint i2 = 0; i2 < unknownFloats3.size(); i2++) {
-			for (uint i3 = 0; i3 < 4; i3++) {
-				NifStream( unknownFloats3[i2][i3], out, version );
-			};
-		};
 		for (uint i2 = 0; i2 < unknownFloats4.size(); i2++) {
 			for (uint i3 = 0; i3 < 10; i3++) {
 				NifStream( unknownFloats4[i2][i3], out, version );
@@ -6394,46 +6878,53 @@ void NiMeshPSysData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map
 
 std::string NiMeshPSysData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << APSysData::asString();
 	numUnknownLinks = uint(unknownLinks.size());
 	out << "  Unknown Byte 11:  " << unknownByte11 << endl;
-	for (uint i1 = 0; i1 < unknownFloats3.size(); i1++) {
-		for (uint i2 = 0; i2 < 4; i2++) {
-			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) {
-				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
-				break;
-			};
-			out << "      Unknown Floats 3[" << i1 << "][" << i2 << "]:  " << unknownFloats3[i1][i2] << endl;
-		};
-	};
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < unknownFloats4.size(); i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
 		for (uint i2 = 0; i2 < 10; i2++) {
-			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) {
-				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				break;
 			};
-			out << "      Unknown Floats 4[" << i1 << "][" << i2 << "]:  " << unknownFloats4[i1][i2] << endl;
+			out << "      Unknown Floats 4[" << i2 << "]:  " << unknownFloats4[i1][i2] << endl;
+			array_output_count++;
 		};
 	};
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < unknownFloats5.size(); i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
 		for (uint i2 = 0; i2 < 12; i2++) {
-			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) {
-				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				break;
 			};
-			out << "      Unknown Floats 5[" << i1 << "][" << i2 << "]:  " << unknownFloats5[i1][i2] << endl;
+			out << "      Unknown Floats 5[" << i2 << "]:  " << unknownFloats5[i1][i2] << endl;
+			array_output_count++;
 		};
 	};
 	out << "  Unknown Int 1:  " << unknownInt1 << endl;
 	out << "  Modifier:  " << modifier << endl;
 	out << "  Unknown Byte 2:  " << unknownByte2 << endl;
 	out << "  Num Unknown Links:  " << numUnknownLinks << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < unknownLinks.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Unknown Links[" << i1 << "]:  " << unknownLinks[i1] << endl;
+		array_output_count++;
 	};
 	out << "  Unknown Short 4:  " << unknownShort4 << endl;
 	out << "  Unknown Int 2:  " << unknownInt2 << endl;
@@ -6530,30 +7021,46 @@ void NiMorphData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, u
 
 std::string NiMorphData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiObject::asString();
 	numMorphs = uint(morphs.size());
 	out << "  Num Morphs:  " << numMorphs << endl;
 	out << "  Num Vertices:  " << numVertices << endl;
 	out << "  Unknown Byte:  " << unknownByte << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < morphs.size(); i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
 		morphs[i1].numKeys = uint(morphs[i1].keys.size());
 		out << "    Frame Name:  " << morphs[i1].frameName << endl;
 		out << "    Num Keys:  " << morphs[i1].numKeys << endl;
 		out << "    Interpolation:  " << morphs[i1].interpolation << endl;
+		array_output_count = 0;
 		for (uint i2 = 0; i2 < morphs[i1].keys.size(); i2++) {
-			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) {
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 				break;
 			};
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+				break;
+			};
 			out << "      Keys[" << i2 << "]:  " << morphs[i1].keys[i2] << endl;
+			array_output_count++;
 		};
 		out << "    Unknown Int:  " << morphs[i1].unknownInt << endl;
+		array_output_count = 0;
 		for (uint i2 = 0; i2 < morphs[i1].vectors.size(); i2++) {
-			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) {
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 				break;
 			};
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+				break;
+			};
 			out << "      Vectors[" << i2 << "]:  " << morphs[i1].vectors[i2] << endl;
+			array_output_count++;
 		};
 	};
 	return out.str();
@@ -6594,15 +7101,21 @@ void NiMultiTargetTransformController::InternalWrite( ostream& out, map<NiObject
 
 std::string NiMultiTargetTransformController::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiTimeController::asString();
 	numExtraTargets = ushort(extraTargets.size());
 	out << "  Num Extra Targets:  " << numExtraTargets << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < extraTargets.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Extra Targets[" << i1 << "]:  " << extraTargets[i1] << endl;
+		array_output_count++;
 	};
 	return out.str();
 }
@@ -6661,24 +7174,35 @@ void NiNode::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, unsign
 
 std::string NiNode::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiAVObject::asString();
 	numEffects = uint(effects.size());
 	numChildren = uint(children.size());
 	out << "  Num Children:  " << numChildren << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < children.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Children[" << i1 << "]:  " << children[i1] << endl;
+		array_output_count++;
 	};
 	out << "  Num Effects:  " << numEffects << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < effects.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Effects[" << i1 << "]:  " << effects[i1] << endl;
+		array_output_count++;
 	};
 	return out.str();
 }
@@ -6717,6 +7241,7 @@ void AvoidNode::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, uns
 
 std::string AvoidNode::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiNode::asString();
 	return out.str();
 }
@@ -6749,14 +7274,20 @@ void FxWidget::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, unsi
 
 std::string FxWidget::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiNode::asString();
 	out << "  Unknown1:  " << unknown1 << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < 292; i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Unknown 292 Bytes[" << i1 << "]:  " << unknown292Bytes[i1] << endl;
+		array_output_count++;
 	};
 	return out.str();
 }
@@ -6781,6 +7312,7 @@ void FxButton::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, unsi
 
 std::string FxButton::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << FxWidget::asString();
 	return out.str();
 }
@@ -6826,18 +7358,24 @@ void FxRadioButton::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map,
 
 std::string FxRadioButton::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << FxWidget::asString();
 	numButtons = uint(buttons.size());
 	out << "  Unknown Int 1:  " << unknownInt1 << endl;
 	out << "  Unknown Int  2:  " << unknownInt2 << endl;
 	out << "  Unknown Int 3:  " << unknownInt3 << endl;
 	out << "  Num Buttons:  " << numButtons << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < buttons.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Buttons[" << i1 << "]:  " << buttons[i1] << endl;
+		array_output_count++;
 	};
 	return out.str();
 }
@@ -6873,6 +7411,7 @@ void NiBillboardNode::InternalWrite( ostream& out, map<NiObjectRef,uint> link_ma
 
 std::string NiBillboardNode::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiNode::asString();
 	out << "  Billboard Mode:  " << billboardMode << endl;
 	return out.str();
@@ -6898,6 +7437,7 @@ void NiBSAnimationNode::InternalWrite( ostream& out, map<NiObjectRef,uint> link_
 
 std::string NiBSAnimationNode::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiNode::asString();
 	return out.str();
 }
@@ -6922,6 +7462,7 @@ void NiBSParticleNode::InternalWrite( ostream& out, map<NiObjectRef,uint> link_m
 
 std::string NiBSParticleNode::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiNode::asString();
 	return out.str();
 }
@@ -6983,18 +7524,29 @@ void NiLODNode::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, uns
 
 std::string NiLODNode::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiNode::asString();
 	numLodLevels = uint(lodLevels.size());
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < 4; i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Unknown 4 Bytes[" << i1 << "]:  " << unknown4Bytes[i1] << endl;
+		array_output_count++;
 	};
 	out << "  LOD Center:  " << lodCenter << endl;
 	out << "  Num LOD Levels:  " << numLodLevels << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < lodLevels.size(); i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
 		out << "    Near Extent:  " << lodLevels[i1].nearExtent << endl;
 		out << "    Far Extent:  " << lodLevels[i1].farExtent << endl;
 	};
@@ -7042,16 +7594,22 @@ void NiPalette::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, uns
 
 std::string NiPalette::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiObject::asString();
 	out << "  Unknown Byte:  " << unknownByte << endl;
 	out << "  Num Entries?:  " << numEntries_ << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < 256; i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
 		for (uint i2 = 0; i2 < 4; i2++) {
-			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) {
-				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				break;
 			};
-			out << "      Palette[" << i1 << "][" << i2 << "]:  " << palette[i1][i2] << endl;
+			out << "      Palette[" << i2 << "]:  " << palette[i1][i2] << endl;
+			array_output_count++;
 		};
 	};
 	return out.str();
@@ -7101,6 +7659,7 @@ void NiParticleBomb::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map
 
 std::string NiParticleBomb::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << AParticleModifier::asString();
 	out << "  Unknown Float 1:  " << unknownFloat1 << endl;
 	out << "  Unknown Float 2:  " << unknownFloat2 << endl;
@@ -7144,6 +7703,7 @@ void NiParticleColorModifier::InternalWrite( ostream& out, map<NiObjectRef,uint>
 
 std::string NiParticleColorModifier::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << AParticleModifier::asString();
 	out << "  Color Data:  " << colorData << endl;
 	return out.str();
@@ -7176,6 +7736,7 @@ void NiParticleGrowFade::InternalWrite( ostream& out, map<NiObjectRef,uint> link
 
 std::string NiParticleGrowFade::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << AParticleModifier::asString();
 	out << "  Grow:  " << grow << endl;
 	out << "  Fade:  " << fade << endl;
@@ -7217,15 +7778,21 @@ void NiParticleMeshModifier::InternalWrite( ostream& out, map<NiObjectRef,uint>
 
 std::string NiParticleMeshModifier::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << AParticleModifier::asString();
 	numParticleMeshes = uint(particleMeshes.size());
 	out << "  Num Particle Meshes:  " << numParticleMeshes << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < particleMeshes.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Particle Meshes[" << i1 << "]:  " << particleMeshes[i1] << endl;
+		array_output_count++;
 	};
 	return out.str();
 }
@@ -7267,6 +7834,7 @@ void NiParticleRotation::InternalWrite( ostream& out, map<NiObjectRef,uint> link
 
 std::string NiParticleRotation::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << AParticleModifier::asString();
 	out << "  Unknown Byte:  " << unknownByte << endl;
 	out << "  Unknown Float 1:  " << unknownFloat1 << endl;
@@ -7296,6 +7864,7 @@ void NiParticles::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, u
 
 std::string NiParticles::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiGeometry::asString();
 	return out.str();
 }
@@ -7320,6 +7889,7 @@ void NiAutoNormalParticles::InternalWrite( ostream& out, map<NiObjectRef,uint> l
 
 std::string NiAutoNormalParticles::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiParticles::asString();
 	return out.str();
 }
@@ -7344,6 +7914,7 @@ void NiParticleMeshes::InternalWrite( ostream& out, map<NiObjectRef,uint> link_m
 
 std::string NiParticleMeshes::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiParticles::asString();
 	return out.str();
 }
@@ -7400,26 +7971,37 @@ void NiParticlesData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_ma
 
 std::string NiParticlesData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiAutoNormalParticlesData::asString();
 	out << "  Num Active:  " << numActive << endl;
 	out << "  Has Unknown Floats:  " << hasUnknownFloats << endl;
 	if ( (hasUnknownFloats != 0) ) {
+		array_output_count = 0;
 		for (uint i2 = 0; i2 < unknownFloats.size(); i2++) {
-			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) {
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 				break;
 			};
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+				break;
+			};
 			out << "      Unknown Floats[" << i2 << "]:  " << unknownFloats[i2] << endl;
+			array_output_count++;
 		};
 	};
 	out << "  Has Rotations:  " << hasRotations << endl;
 	if ( (hasRotations != 0) ) {
+		array_output_count = 0;
 		for (uint i2 = 0; i2 < rotations.size(); i2++) {
-			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) {
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 				break;
 			};
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+				break;
+			};
 			out << "      Rotations[" << i2 << "]:  " << rotations[i2] << endl;
+			array_output_count++;
 		};
 	};
 	return out.str();
@@ -7452,6 +8034,7 @@ void NiParticleMeshesData::InternalWrite( ostream& out, map<NiObjectRef,uint> li
 
 std::string NiParticleMeshesData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiParticlesData::asString();
 	out << "  Unknown Link 2:  " << unknownLink2 << endl;
 	return out.str();
@@ -7501,16 +8084,22 @@ void NiParticleSystem::InternalWrite( ostream& out, map<NiObjectRef,uint> link_m
 
 std::string NiParticleSystem::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiParticles::asString();
 	numModifiers = uint(modifiers.size());
 	out << "  Unknown Bool:  " << unknownBool << endl;
 	out << "  Num Modifiers:  " << numModifiers << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < modifiers.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Modifiers[" << i1 << "]:  " << modifiers[i1] << endl;
+		array_output_count++;
 	};
 	return out.str();
 }
@@ -7544,6 +8133,7 @@ void NiMeshParticleSystem::InternalWrite( ostream& out, map<NiObjectRef,uint> li
 
 std::string NiMeshParticleSystem::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiParticleSystem::asString();
 	return out.str();
 }
@@ -7673,6 +8263,7 @@ void NiParticleSystemController::InternalWrite( ostream& out, map<NiObjectRef,ui
 
 std::string NiParticleSystemController::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiTimeController::asString();
 	numParticles = ushort(particles.size());
 	out << "  Speed:  " << speed << endl;
@@ -7705,7 +8296,12 @@ std::string NiParticleSystemController::InternalAsString( bool verbose ) const {
 	out << "  Unknown Short 3?:  " << unknownShort3_ << endl;
 	out << "  Num Particles:  " << numParticles << endl;
 	out << "  Num Valid:  " << numValid << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < particles.size(); i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
 		out << "    Velocity:  " << particles[i1].velocity << endl;
 		out << "    Unknown Vector:  " << particles[i1].unknownVector << endl;
 		out << "    Lifetime:  " << particles[i1].lifetime << endl;
@@ -7732,8 +8328,6 @@ void NiParticleSystemController::InternalFixLinks( const map<unsigned,NiObjectRe
 std::list<NiObjectRef> NiParticleSystemController::InternalGetRefs() const {
 	list<Ref<NiObject> > refs;
 	refs = NiTimeController::GetRefs();
-	if ( emitter != NULL )
-		refs.push_back(StaticCast<NiObject>(emitter));
 	if ( unknownLink != NULL )
 		refs.push_back(StaticCast<NiObject>(unknownLink));
 	if ( particleExtra != NULL )
@@ -7753,6 +8347,7 @@ void NiBSPArrayController::InternalWrite( ostream& out, map<NiObjectRef,uint> li
 
 std::string NiBSPArrayController::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiParticleSystemController::asString();
 	return out.str();
 }
@@ -7804,6 +8399,7 @@ void NiPathController::InternalWrite( ostream& out, map<NiObjectRef,uint> link_m
 
 std::string NiPathController::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiTimeController::asString();
 	out << "  Unknown Short 2:  " << unknownShort2 << endl;
 	out << "  Unknown Int 1:  " << unknownInt1 << endl;
@@ -7860,6 +8456,7 @@ void NiPathInterpolator::InternalWrite( ostream& out, map<NiObjectRef,uint> link
 
 std::string NiPathInterpolator::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiBlendInterpolator::asString();
 	out << "  Unknown Float 1:  " << unknownFloat1 << endl;
 	out << "  Unknown Float 2:  " << unknownFloat2 << endl;
@@ -7972,6 +8569,7 @@ void NiPixelData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, u
 
 std::string NiPixelData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiObject::asString();
 	numMipmaps = uint(mipmaps.size());
 	out << "  Pixel Format:  " << pixelFormat << endl;
@@ -7980,37 +8578,57 @@ std::string NiPixelData::InternalAsString( bool verbose ) const {
 	out << "  Blue Mask:  " << blueMask << endl;
 	out << "  Alpha Mask:  " << alphaMask << endl;
 	out << "  Bits Per Pixel:  " << bitsPerPixel << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < 8; i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Unknown 8 Bytes[" << i1 << "]:  " << unknown8Bytes[i1] << endl;
+		array_output_count++;
 	};
 	out << "  Unknown Int:  " << unknownInt << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < 54; i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Unknown 54 Bytes[" << i1 << "]:  " << unknown54Bytes[i1] << endl;
+		array_output_count++;
 	};
 	out << "  Palette:  " << palette << endl;
 	out << "  Num Mipmaps:  " << numMipmaps << endl;
 	out << "  Bytes Per Pixel:  " << bytesPerPixel << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < mipmaps.size(); i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
 		out << "    Width:  " << mipmaps[i1].width << endl;
 		out << "    Height:  " << mipmaps[i1].height << endl;
 		out << "    Offset:  " << mipmaps[i1].offset << endl;
 	};
 	pixelData.dataSize = uint(pixelData.data.size());
 	out << "  Data Size:  " << pixelData.dataSize << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < pixelData.data.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Data[" << i1 << "]:  " << pixelData.data[i1] << endl;
+		array_output_count++;
 	};
 	out << "  Unknown Int 2:  " << unknownInt2 << endl;
 	return out.str();
@@ -8083,6 +8701,7 @@ void NiPlanarCollider::InternalWrite( ostream& out, map<NiObjectRef,uint> link_m
 
 std::string NiPlanarCollider::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << AParticleModifier::asString();
 	out << "  Unknown Short:  " << unknownShort << endl;
 	out << "  Unknown Float 1:  " << unknownFloat1 << endl;
@@ -8134,6 +8753,7 @@ void NiPoint3Interpolator::InternalWrite( ostream& out, map<NiObjectRef,uint> li
 
 std::string NiPoint3Interpolator::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiInterpolator::asString();
 	out << "  Point 3 Value:  " << point3Value << endl;
 	out << "  Data:  " << data << endl;
@@ -8169,6 +8789,7 @@ void NiPointLight::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map,
 
 std::string NiPointLight::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiLight::asString();
 	out << "  Constant Attenuation:  " << constantAttenuation << endl;
 	out << "  Linear Attenuation:  " << linearAttenuation << endl;
@@ -8212,18 +8833,24 @@ void NiPosData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, uns
 
 std::string NiPosData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << AKeyedData::asString();
 	data.numKeys = uint(data.keys.size());
 	out << "  Num Keys:  " << data.numKeys << endl;
 	if ( (data.numKeys != 0) ) {
 		out << "    Interpolation:  " << data.interpolation << endl;
 	};
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < data.keys.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Keys[" << i1 << "]:  " << data.keys[i1] << endl;
+		array_output_count++;
 	};
 	return out.str();
 }
@@ -8257,6 +8884,7 @@ void NiPSysAgeDeathModifier::InternalWrite( ostream& out, map<NiObjectRef,uint>
 
 std::string NiPSysAgeDeathModifier::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiPSysModifier::asString();
 	out << "  Spawn on Death:  " << spawnOnDeath << endl;
 	out << "  Spawn Modifier:  " << spawnModifier << endl;
@@ -8311,28 +8939,44 @@ void NiPSysBombModifier::InternalWrite( ostream& out, map<NiObjectRef,uint> link
 
 std::string NiPSysBombModifier::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiPSysModifier::asString();
 	out << "  Unknown Link:  " << unknownLink << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < 2; i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Unknown Ints 1[" << i1 << "]:  " << unknownInts1[i1] << endl;
+		array_output_count++;
 	};
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < 3; i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Unknown Floats[" << i1 << "]:  " << unknownFloats[i1] << endl;
+		array_output_count++;
 	};
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < 2; i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Unknown Ints 2[" << i1 << "]:  " << unknownInts2[i1] << endl;
+		array_output_count++;
 	};
 	return out.str();
 }
@@ -8360,6 +9004,7 @@ void NiPSysBoundUpdateModifier::InternalWrite( ostream& out, map<NiObjectRef,uin
 
 std::string NiPSysBoundUpdateModifier::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiPSysModifier::asString();
 	out << "  Update Skip:  " << updateSkip << endl;
 	return out.str();
@@ -8391,6 +9036,7 @@ void NiPSysBoxEmitter::InternalWrite( ostream& out, map<NiObjectRef,uint> link_m
 
 std::string NiPSysBoxEmitter::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiPSysVolumeEmitter::asString();
 	out << "  Width:  " << width << endl;
 	out << "  Height:  " << height << endl;
@@ -8425,6 +9071,7 @@ void NiPSysColliderManager::InternalWrite( ostream& out, map<NiObjectRef,uint> l
 
 std::string NiPSysColliderManager::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiPSysModifier::asString();
 	out << "  Collider:  " << collider << endl;
 	return out.str();
@@ -8460,6 +9107,7 @@ void NiPSysColorModifier::InternalWrite( ostream& out, map<NiObjectRef,uint> lin
 
 std::string NiPSysColorModifier::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiPSysModifier::asString();
 	out << "  Data:  " << data << endl;
 	return out.str();
@@ -8492,6 +9140,7 @@ void NiPSysCylinderEmitter::InternalWrite( ostream& out, map<NiObjectRef,uint> l
 
 std::string NiPSysCylinderEmitter::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiPSysVolumeEmitter::asString();
 	out << "  Radius:  " << radius << endl;
 	out << "  Height:  " << height << endl;
@@ -8590,49 +9239,70 @@ void NiPSysData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, un
 
 std::string NiPSysData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << APSysData::asString();
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < unknownFloats4.size(); i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
 		for (uint i2 = 0; i2 < 10; i2++) {
-			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) {
-				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				break;
 			};
-			out << "      Unknown Floats 4[" << i1 << "][" << i2 << "]:  " << unknownFloats4[i1][i2] << endl;
+			out << "      Unknown Floats 4[" << i2 << "]:  " << unknownFloats4[i1][i2] << endl;
+			array_output_count++;
 		};
 	};
 	out << "  Unknown Bool 1:  " << unknownBool1 << endl;
 	if ( (unknownBool1 != 0) ) {
+		array_output_count = 0;
 		for (uint i2 = 0; i2 < unknownBytes.size(); i2++) {
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+				break;
+			};
 			for (uint i3 = 0; i3 < 32; i3++) {
-				if ( !verbose && ( i3 > MAXARRAYDUMP ) ) {
-					out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+				if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 					break;
 				};
-				out << "        Unknown Bytes[" << i2 << "][" << i3 << "]:  " << unknownBytes[i2][i3] << endl;
+				out << "        Unknown Bytes[" << i3 << "]:  " << unknownBytes[i2][i3] << endl;
+				array_output_count++;
 			};
 		};
 	};
 	if ( (unknownBool1 == 0) ) {
+		array_output_count = 0;
 		for (uint i2 = 0; i2 < unknownBytesAlt.size(); i2++) {
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+				break;
+			};
 			for (uint i3 = 0; i3 < 28; i3++) {
-				if ( !verbose && ( i3 > MAXARRAYDUMP ) ) {
-					out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+				if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 					break;
 				};
-				out << "        Unknown Bytes Alt[" << i2 << "][" << i3 << "]:  " << unknownBytesAlt[i2][i3] << endl;
+				out << "        Unknown Bytes Alt[" << i3 << "]:  " << unknownBytesAlt[i2][i3] << endl;
+				array_output_count++;
 			};
 		};
 	};
 	out << "  Unknown Byte 3:  " << unknownByte3 << endl;
 	out << "  Unknown Bool 2:  " << unknownBool2 << endl;
 	if ( (unknownBool2 != 0) ) {
+		array_output_count = 0;
 		for (uint i2 = 0; i2 < unknownBytes2.size(); i2++) {
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+				break;
+			};
 			for (uint i3 = 0; i3 < 4; i3++) {
-				if ( !verbose && ( i3 > MAXARRAYDUMP ) ) {
-					out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+				if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 					break;
 				};
-				out << "        Unknown Bytes 2[" << i2 << "][" << i3 << "]:  " << unknownBytes2[i2][i3] << endl;
+				out << "        Unknown Bytes 2[" << i3 << "]:  " << unknownBytes2[i2][i3] << endl;
+				array_output_count++;
 			};
 		};
 	};
@@ -8675,6 +9345,7 @@ void NiPSysDragModifier::InternalWrite( ostream& out, map<NiObjectRef,uint> link
 
 std::string NiPSysDragModifier::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiPSysModifier::asString();
 	out << "  Parent:  " << parent << endl;
 	out << "  Drag Axis:  " << dragAxis << endl;
@@ -8726,6 +9397,7 @@ void NiPSysEmitterCtlr::InternalWrite( ostream& out, map<NiObjectRef,uint> link_
 
 std::string NiPSysEmitterCtlr::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << APSysCtlr::asString();
 	out << "  Data:  " << data << endl;
 	out << "  Visibility Interpolator:  " << visibilityInterpolator << endl;
@@ -8788,6 +9460,7 @@ void NiPSysEmitterCtlrData::InternalWrite( ostream& out, map<NiObjectRef,uint> l
 
 std::string NiPSysEmitterCtlrData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiObject::asString();
 	numVisibilityKeys_ = uint(visibilityKeys_.size());
 	floatKeys_.numKeys = uint(floatKeys_.keys.size());
@@ -8795,20 +9468,30 @@ std::string NiPSysEmitterCtlrData::InternalAsString( bool verbose ) const {
 	if ( (floatKeys_.numKeys != 0) ) {
 		out << "    Interpolation:  " << floatKeys_.interpolation << endl;
 	};
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < floatKeys_.keys.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Keys[" << i1 << "]:  " << floatKeys_.keys[i1] << endl;
+		array_output_count++;
 	};
 	out << "  Num Visibility Keys?:  " << numVisibilityKeys_ << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < visibilityKeys_.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Visibility Keys?[" << i1 << "]:  " << visibilityKeys_[i1] << endl;
+		array_output_count++;
 	};
 	return out.str();
 }
@@ -8833,6 +9516,7 @@ void NiPSysEmitterDeclinationCtlr::InternalWrite( ostream& out, map<NiObjectRef,
 
 std::string NiPSysEmitterDeclinationCtlr::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << APSysCtlr::asString();
 	return out.str();
 }
@@ -8857,6 +9541,7 @@ void NiPSysEmitterDeclinationVarCtlr::InternalWrite( ostream& out, map<NiObjectR
 
 std::string NiPSysEmitterDeclinationVarCtlr::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << APSysCtlr::asString();
 	return out.str();
 }
@@ -8881,6 +9566,7 @@ void NiPSysEmitterInitialRadiusCtlr::InternalWrite( ostream& out, map<NiObjectRe
 
 std::string NiPSysEmitterInitialRadiusCtlr::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << APSysCtlr::asString();
 	return out.str();
 }
@@ -8896,26 +9582,44 @@ std::list<NiObjectRef> NiPSysEmitterInitialRadiusCtlr::InternalGetRefs() const {
 }
 
 void NiPSysEmitterLifeSpanCtlr::InternalRead( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
+	uint block_num;
 	APSysCtlr::Read( in, link_stack, version, user_version );
+	if ( version <= 0x0A010000 ) {
+		NifStream( block_num, in, version );
+		link_stack.push_back( block_num );
+	};
 }
 
 void NiPSysEmitterLifeSpanCtlr::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const {
 	APSysCtlr::Write( out, link_map, version, user_version );
+	if ( version <= 0x0A010000 ) {
+		if ( unknownLink != NULL )
+			NifStream( link_map[StaticCast<NiObject>(unknownLink)], out, version );
+		else
+			NifStream( 0xffffffff, out, version );
+	};
 }
 
 std::string NiPSysEmitterLifeSpanCtlr::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << APSysCtlr::asString();
+	out << "  Unknown Link:  " << unknownLink << endl;
 	return out.str();
 }
 
 void NiPSysEmitterLifeSpanCtlr::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
 	APSysCtlr::FixLinks( objects, link_stack, version, user_version );
+	if ( version <= 0x0A010000 ) {
+		unknownLink = FixLink<NiFloatData>( objects, link_stack, version );
+	};
 }
 
 std::list<NiObjectRef> NiPSysEmitterLifeSpanCtlr::InternalGetRefs() const {
 	list<Ref<NiObject> > refs;
 	refs = APSysCtlr::GetRefs();
+	if ( unknownLink != NULL )
+		refs.push_back(StaticCast<NiObject>(unknownLink));
 	return refs;
 }
 
@@ -8940,6 +9644,7 @@ void NiPSysEmitterSpeedCtlr::InternalWrite( ostream& out, map<NiObjectRef,uint>
 
 std::string NiPSysEmitterSpeedCtlr::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << APSysCtlr::asString();
 	out << "  Unknown Link:  " << unknownLink << endl;
 	return out.str();
@@ -8989,6 +9694,7 @@ void NiPSysGravityModifier::InternalWrite( ostream& out, map<NiObjectRef,uint> l
 
 std::string NiPSysGravityModifier::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiPSysModifier::asString();
 	out << "  Gravity Object:  " << gravityObject << endl;
 	out << "  Gravity Axis:  " << gravityAxis << endl;
@@ -9032,6 +9738,7 @@ void NiPSysGravityStrengthCtlr::InternalWrite( ostream& out, map<NiObjectRef,uin
 
 std::string NiPSysGravityStrengthCtlr::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << APSysCtlr::asString();
 	out << "  Unknown Link:  " << unknownLink << endl;
 	return out.str();
@@ -9070,6 +9777,7 @@ void NiPSysGrowFadeModifier::InternalWrite( ostream& out, map<NiObjectRef,uint>
 
 std::string NiPSysGrowFadeModifier::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiPSysModifier::asString();
 	out << "  Grow Time:  " << growTime << endl;
 	out << "  Grow Generation:  " << growGeneration << endl;
@@ -9119,15 +9827,21 @@ void NiPSysMeshEmitter::InternalWrite( ostream& out, map<NiObjectRef,uint> link_
 
 std::string NiPSysMeshEmitter::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiPSysEmitter::asString();
 	numEmitterMeshes = uint(emitterMeshes.size());
 	out << "  Num Emitter Meshes:  " << numEmitterMeshes << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < emitterMeshes.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Emitter Meshes[" << i1 << "]:  " << emitterMeshes[i1] << endl;
+		array_output_count++;
 	};
 	out << "  Initial Velocity Type:  " << initialVelocityType << endl;
 	out << "  Emission Type:  " << emissionType << endl;
@@ -9177,15 +9891,21 @@ void NiPSysMeshUpdateModifier::InternalWrite( ostream& out, map<NiObjectRef,uint
 
 std::string NiPSysMeshUpdateModifier::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiPSysModifier::asString();
 	numMeshes = uint(meshes.size());
 	out << "  Num Meshes:  " << numMeshes << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < meshes.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Meshes[" << i1 << "]:  " << meshes[i1] << endl;
+		array_output_count++;
 	};
 	return out.str();
 }
@@ -9223,6 +9943,7 @@ void NiPSysModifierActiveCtlr::InternalWrite( ostream& out, map<NiObjectRef,uint
 
 std::string NiPSysModifierActiveCtlr::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << APSysCtlr::asString();
 	out << "  Unknown Int:  " << unknownInt << endl;
 	return out.str();
@@ -9287,6 +10008,7 @@ void NiPSysPlanarCollider::InternalWrite( ostream& out, map<NiObjectRef,uint> li
 
 std::string NiPSysPlanarCollider::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiObject::asString();
 	out << "  Bounce:  " << bounce << endl;
 	out << "  Spawn on Collide:  " << spawnOnCollide << endl;
@@ -9332,6 +10054,7 @@ void NiPSysPositionModifier::InternalWrite( ostream& out, map<NiObjectRef,uint>
 
 std::string NiPSysPositionModifier::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiPSysModifier::asString();
 	return out.str();
 }
@@ -9356,6 +10079,7 @@ void NiPSysResetOnLoopCtlr::InternalWrite( ostream& out, map<NiObjectRef,uint> l
 
 std::string NiPSysResetOnLoopCtlr::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiTimeController::asString();
 	return out.str();
 }
@@ -9398,6 +10122,7 @@ void NiPSysRotationModifier::InternalWrite( ostream& out, map<NiObjectRef,uint>
 
 std::string NiPSysRotationModifier::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiPSysModifier::asString();
 	out << "  Initial Rotation Speed:  " << initialRotationSpeed << endl;
 	out << "  Initial Rotation Speed Variation:  " << initialRotationSpeedVariation << endl;
@@ -9445,6 +10170,7 @@ void NiPSysSpawnModifier::InternalWrite( ostream& out, map<NiObjectRef,uint> lin
 
 std::string NiPSysSpawnModifier::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiPSysModifier::asString();
 	out << "  Num Spawn Generations:  " << numSpawnGenerations << endl;
 	out << "  Percentage Spawned:  " << percentageSpawned << endl;
@@ -9479,6 +10205,7 @@ void NiPSysSphereEmitter::InternalWrite( ostream& out, map<NiObjectRef,uint> lin
 
 std::string NiPSysSphereEmitter::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiPSysVolumeEmitter::asString();
 	out << "  Radius:  " << radius << endl;
 	return out.str();
@@ -9504,6 +10231,7 @@ void NiPSysUpdateCtlr::InternalWrite( ostream& out, map<NiObjectRef,uint> link_m
 
 std::string NiPSysUpdateCtlr::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiTimeController::asString();
 	return out.str();
 }
@@ -9528,6 +10256,7 @@ void NiLODData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, uns
 
 std::string NiLODData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiObject::asString();
 	return out.str();
 }
@@ -9566,11 +10295,17 @@ void NiRangeLODData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map
 
 std::string NiRangeLODData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiLODData::asString();
 	numLodLevels = uint(lodLevels.size());
 	out << "  LOD Center:  " << lodCenter << endl;
 	out << "  Num LOD Levels:  " << numLodLevels << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < lodLevels.size(); i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
 		out << "    Near Extent:  " << lodLevels[i1].nearExtent << endl;
 		out << "    Far Extent:  " << lodLevels[i1].farExtent << endl;
 	};
@@ -9615,6 +10350,7 @@ void NiScreenLODData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_ma
 
 std::string NiScreenLODData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiLODData::asString();
 	proportionCount = uint(proportionLevels.size());
 	out << "  Bound Center:  " << boundCenter << endl;
@@ -9622,12 +10358,17 @@ std::string NiScreenLODData::InternalAsString( bool verbose ) const {
 	out << "  World Center:  " << worldCenter << endl;
 	out << "  World Radius:  " << worldRadius << endl;
 	out << "  Proportion Count:  " << proportionCount << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < proportionLevels.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Proportion Levels[" << i1 << "]:  " << proportionLevels[i1] << endl;
+		array_output_count++;
 	};
 	return out.str();
 }
@@ -9652,6 +10393,7 @@ void NiRotatingParticles::InternalWrite( ostream& out, map<NiObjectRef,uint> lin
 
 std::string NiRotatingParticles::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiParticles::asString();
 	return out.str();
 }
@@ -9676,6 +10418,7 @@ void NiRotatingParticlesData::InternalWrite( ostream& out, map<NiObjectRef,uint>
 
 std::string NiRotatingParticlesData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiParticlesData::asString();
 	return out.str();
 }
@@ -9700,6 +10443,7 @@ void NiSequenceStreamHelper::InternalWrite( ostream& out, map<NiObjectRef,uint>
 
 std::string NiSequenceStreamHelper::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiObjectNET::asString();
 	return out.str();
 }
@@ -9726,6 +10470,7 @@ void NiShadeProperty::InternalWrite( ostream& out, map<NiObjectRef,uint> link_ma
 
 std::string NiShadeProperty::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiProperty::asString();
 	out << "  Flags:  " << flags << endl;
 	return out.str();
@@ -9804,6 +10549,7 @@ void NiSkinData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, un
 
 std::string NiSkinData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiObject::asString();
 	numBones = uint(boneList.size());
 	out << "  Rotation:  " << rotation << endl;
@@ -9812,7 +10558,12 @@ std::string NiSkinData::InternalAsString( bool verbose ) const {
 	out << "  Num Bones:  " << numBones << endl;
 	out << "  Skin Partition:  " << skinPartition << endl;
 	out << "  Unknown Byte:  " << unknownByte << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < boneList.size(); i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
 		boneList[i1].numVertices = ushort(boneList[i1].vertexWeights.size());
 		out << "    Rotation:  " << boneList[i1].rotation << endl;
 		out << "    Translation:  " << boneList[i1].translation << endl;
@@ -9820,7 +10571,12 @@ std::string NiSkinData::InternalAsString( bool verbose ) const {
 		out << "    Bounding Sphere Offset:  " << boneList[i1].boundingSphereOffset << endl;
 		out << "    Bounding Sphere Radius:  " << boneList[i1].boundingSphereRadius << endl;
 		out << "    Num Vertices:  " << boneList[i1].numVertices << endl;
+		array_output_count = 0;
 		for (uint i2 = 0; i2 < boneList[i1].vertexWeights.size(); i2++) {
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+				break;
+			};
 			out << "      Index:  " << boneList[i1].vertexWeights[i2].index << endl;
 			out << "      Weight:  " << boneList[i1].vertexWeights[i2].weight << endl;
 		};
@@ -9890,18 +10646,24 @@ void NiSkinInstance::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map
 
 std::string NiSkinInstance::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiObject::asString();
 	numBones = uint(bones.size());
 	out << "  Data:  " << data << endl;
 	out << "  Skin Partition:  " << skinPartition << endl;
 	out << "  Skeleton Root:  " << skeletonRoot << endl;
 	out << "  Num Bones:  " << numBones << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < bones.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Bones[" << i1 << "]:  " << bones[i1] << endl;
+		array_output_count++;
 	};
 	return out.str();
 }
@@ -9940,6 +10702,7 @@ void NiClodSkinInstance::InternalWrite( ostream& out, map<NiObjectRef,uint> link
 
 std::string NiClodSkinInstance::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiSkinInstance::asString();
 	return out.str();
 }
@@ -10144,10 +10907,16 @@ void NiSkinPartition::InternalWrite( ostream& out, map<NiObjectRef,uint> link_ma
 
 std::string NiSkinPartition::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiObject::asString();
 	numSkinPartitionBlocks = uint(skinPartitionBlocks.size());
 	out << "  Num Skin Partition Blocks:  " << numSkinPartitionBlocks << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < skinPartitionBlocks.size(); i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
 		for (uint i2 = 0; i2 < skinPartitionBlocks[i1].strips.size(); i2++)
 			skinPartitionBlocks[i1].stripLengths[i2] = ushort(skinPartitionBlocks[i1].strips[i2].size());
 		skinPartitionBlocks[i1].numWeightsPerVertex = ushort((skinPartitionBlocks[i1].vertexWeights.size() > 0) ? skinPartitionBlocks[i1].vertexWeights[0].size() : 0);
@@ -10160,66 +10929,101 @@ std::string NiSkinPartition::InternalAsString( bool verbose ) const {
 		out << "    Num Bones:  " << skinPartitionBlocks[i1].numBones << endl;
 		out << "    Num Strips:  " << skinPartitionBlocks[i1].numStrips << endl;
 		out << "    Num Weights Per Vertex:  " << skinPartitionBlocks[i1].numWeightsPerVertex << endl;
+		array_output_count = 0;
 		for (uint i2 = 0; i2 < skinPartitionBlocks[i1].bones.size(); i2++) {
-			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) {
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 				break;
 			};
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+				break;
+			};
 			out << "      Bones[" << i2 << "]:  " << skinPartitionBlocks[i1].bones[i2] << endl;
+			array_output_count++;
 		};
 		out << "    Has Vertex Map:  " << skinPartitionBlocks[i1].hasVertexMap << endl;
+		array_output_count = 0;
 		for (uint i2 = 0; i2 < skinPartitionBlocks[i1].vertexMap.size(); i2++) {
-			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) {
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 				break;
 			};
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+				break;
+			};
 			out << "      Vertex Map[" << i2 << "]:  " << skinPartitionBlocks[i1].vertexMap[i2] << endl;
+			array_output_count++;
 		};
 		out << "    Has Vertex Weights:  " << skinPartitionBlocks[i1].hasVertexWeights << endl;
+		array_output_count = 0;
 		for (uint i2 = 0; i2 < skinPartitionBlocks[i1].vertexWeights.size(); i2++) {
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+				break;
+			};
 			for (uint i3 = 0; i3 < skinPartitionBlocks[i1].vertexWeights[i2].size(); i3++) {
-				if ( !verbose && ( i3 > MAXARRAYDUMP ) ) {
-					out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+				if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 					break;
 				};
-				out << "        Vertex Weights[" << i2 << "][" << i3 << "]:  " << skinPartitionBlocks[i1].vertexWeights[i2][i3] << endl;
+				out << "        Vertex Weights[" << i3 << "]:  " << skinPartitionBlocks[i1].vertexWeights[i2][i3] << endl;
+				array_output_count++;
 			};
 		};
+		array_output_count = 0;
 		for (uint i2 = 0; i2 < skinPartitionBlocks[i1].stripLengths.size(); i2++) {
-			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) {
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 				break;
 			};
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+				break;
+			};
 			out << "      Strip Lengths[" << i2 << "]:  " << skinPartitionBlocks[i1].stripLengths[i2] << endl;
+			array_output_count++;
 		};
 		out << "    Has Strips:  " << skinPartitionBlocks[i1].hasStrips << endl;
+		array_output_count = 0;
 		for (uint i2 = 0; i2 < skinPartitionBlocks[i1].strips.size(); i2++) {
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+				break;
+			};
 			for (uint i3 = 0; i3 < skinPartitionBlocks[i1].stripLengths[i2]; i3++) {
-				if ( !verbose && ( i3 > MAXARRAYDUMP ) ) {
-					out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+				if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 					break;
 				};
-				out << "        Strips[" << i2 << "][" << i3 << "]:  " << skinPartitionBlocks[i1].strips[i2][i3] << endl;
+				out << "        Strips[" << i3 << "]:  " << skinPartitionBlocks[i1].strips[i2][i3] << endl;
+				array_output_count++;
 			};
 		};
 		if ( (skinPartitionBlocks[i1].numStrips == 0) ) {
+			array_output_count = 0;
 			for (uint i3 = 0; i3 < skinPartitionBlocks[i1].triangles.size(); i3++) {
-				if ( !verbose && ( i3 > MAXARRAYDUMP ) ) {
+				if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 					out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 					break;
 				};
+				if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+					break;
+				};
 				out << "        Triangles[" << i3 << "]:  " << skinPartitionBlocks[i1].triangles[i3] << endl;
+				array_output_count++;
 			};
 		};
 		out << "    Has Bone Indices:  " << skinPartitionBlocks[i1].hasBoneIndices << endl;
 		if ( (skinPartitionBlocks[i1].hasBoneIndices != 0) ) {
+			array_output_count = 0;
 			for (uint i3 = 0; i3 < skinPartitionBlocks[i1].boneIndices.size(); i3++) {
+				if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+					out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+					break;
+				};
 				for (uint i4 = 0; i4 < skinPartitionBlocks[i1].boneIndices[i3].size(); i4++) {
-					if ( !verbose && ( i4 > MAXARRAYDUMP ) ) {
-						out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+					if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 						break;
 					};
-					out << "          Bone Indices[" << i3 << "][" << i4 << "]:  " << skinPartitionBlocks[i1].boneIndices[i3][i4] << endl;
+					out << "          Bone Indices[" << i4 << "]:  " << skinPartitionBlocks[i1].boneIndices[i3][i4] << endl;
+					array_output_count++;
 				};
 			};
 		};
@@ -10314,6 +11118,7 @@ void NiSourceTexture::InternalWrite( ostream& out, map<NiObjectRef,uint> link_ma
 
 std::string NiSourceTexture::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiObjectNET::asString();
 	out << "  Use External:  " << useExternal << endl;
 	if ( (useExternal == 1) ) {
@@ -10366,6 +11171,7 @@ void NiSpecularProperty::InternalWrite( ostream& out, map<NiObjectRef,uint> link
 
 std::string NiSpecularProperty::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiProperty::asString();
 	out << "  Flags:  " << flags << endl;
 	return out.str();
@@ -10403,6 +11209,7 @@ void NiSphericalCollider::InternalWrite( ostream& out, map<NiObjectRef,uint> lin
 
 std::string NiSphericalCollider::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << AParticleModifier::asString();
 	out << "  Unknown Float 1:  " << unknownFloat1 << endl;
 	out << "  Unknown Short:  " << unknownShort << endl;
@@ -10437,6 +11244,7 @@ void NiSpotLight::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, u
 
 std::string NiSpotLight::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiPointLight::asString();
 	out << "  Cutoff Angle:  " << cutoffAngle << endl;
 	out << "  Exponent:  " << exponent << endl;
@@ -10485,6 +11293,7 @@ void NiStencilProperty::InternalWrite( ostream& out, map<NiObjectRef,uint> link_
 
 std::string NiStencilProperty::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiProperty::asString();
 	out << "  Flags:  " << flags << endl;
 	out << "  Stencil Enabled:  " << stencilEnabled << endl;
@@ -10526,6 +11335,7 @@ void NiStringExtraData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_
 
 std::string NiStringExtraData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiExtraData::asString();
 	out << "  Bytes Remaining:  " << bytesRemaining << endl;
 	out << "  String Data:  " << stringData << endl;
@@ -10556,6 +11366,7 @@ void NiStringPalette::InternalWrite( ostream& out, map<NiObjectRef,uint> link_ma
 
 std::string NiStringPalette::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiObject::asString();
 	out << "  Palette:  " << palette.palette << endl;
 	out << "  Length:  " << palette.length << endl;
@@ -10592,15 +11403,21 @@ void NiStringsExtraData::InternalWrite( ostream& out, map<NiObjectRef,uint> link
 
 std::string NiStringsExtraData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiExtraData::asString();
 	numStrings = uint(data.size());
 	out << "  Num Strings:  " << numStrings << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < data.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Data[" << i1 << "]:  " << data[i1] << endl;
+		array_output_count++;
 	};
 	return out.str();
 }
@@ -10641,16 +11458,22 @@ void NiTextKeyExtraData::InternalWrite( ostream& out, map<NiObjectRef,uint> link
 
 std::string NiTextKeyExtraData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiExtraData::asString();
 	numTextKeys = uint(textKeys.size());
 	out << "  Unknown Int 1:  " << unknownInt1 << endl;
 	out << "  Num Text Keys:  " << numTextKeys << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < textKeys.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Text Keys[" << i1 << "]:  " << textKeys[i1] << endl;
+		array_output_count++;
 	};
 	return out.str();
 }
@@ -10714,6 +11537,7 @@ void NiTextureEffect::InternalWrite( ostream& out, map<NiObjectRef,uint> link_ma
 
 std::string NiTextureEffect::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiDynamicEffect::asString();
 	out << "  Model Projection Matrix:  " << modelProjectionMatrix << endl;
 	out << "  Model Projection Transform:  " << modelProjectionTransform << endl;
@@ -10771,6 +11595,7 @@ void NiTextureTransformController::InternalWrite( ostream& out, map<NiObjectRef,
 
 std::string NiTextureTransformController::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiSingleInterpolatorController::asString();
 	out << "  Unknown2:  " << unknown2 << endl;
 	out << "  Texture Slot:  " << textureSlot << endl;
@@ -11307,6 +12132,7 @@ void NiTexturingProperty::InternalWrite( ostream& out, map<NiObjectRef,uint> lin
 
 std::string NiTexturingProperty::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiProperty::asString();
 	numShaderTextures = uint(shaderTextures.size());
 	out << "  Flags:  " << flags << endl;
@@ -11462,7 +12288,12 @@ std::string NiTexturingProperty::InternalAsString( bool verbose ) const {
 		};
 	};
 	out << "  Num Shader Textures:  " << numShaderTextures << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < shaderTextures.size(); i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
 		out << "    Is Used:  " << shaderTextures[i1].isUsed << endl;
 		if ( (shaderTextures[i1].isUsed != 0) ) {
 			out << "      Source:  " << shaderTextures[i1].textureData.source << endl;
@@ -11557,6 +12388,7 @@ void NiTransformController::InternalWrite( ostream& out, map<NiObjectRef,uint> l
 
 std::string NiTransformController::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiSingleInterpolatorController::asString();
 	return out.str();
 }
@@ -11581,6 +12413,7 @@ void NiTransformData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_ma
 
 std::string NiTransformData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiKeyframeData::asString();
 	return out.str();
 }
@@ -11628,16 +12461,22 @@ void NiTransformInterpolator::InternalWrite( ostream& out, map<NiObjectRef,uint>
 
 std::string NiTransformInterpolator::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiInterpolator::asString();
 	out << "  Translation:  " << translation << endl;
 	out << "  Rotation:  " << rotation << endl;
 	out << "  Scale:  " << scale << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < 3; i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Unknown Bytes[" << i1 << "]:  " << unknownBytes[i1] << endl;
+		array_output_count++;
 	};
 	out << "  Data:  " << data << endl;
 	return out.str();
@@ -11666,6 +12505,7 @@ void NiTriShape::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, un
 
 std::string NiTriShape::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiTriBasedGeom::asString();
 	return out.str();
 }
@@ -11742,27 +12582,43 @@ void NiTriShapeData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map
 
 std::string NiTriShapeData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiTriBasedGeomData::asString();
 	numMatchGroups = ushort(matchGroups.size());
 	out << "  Num Triangle Points:  " << numTrianglePoints << endl;
 	out << "  Has Triangles:  " << hasTriangles << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < triangles.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Triangles[" << i1 << "]:  " << triangles[i1] << endl;
+		array_output_count++;
 	};
 	out << "  Num Match Groups:  " << numMatchGroups << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < matchGroups.size(); i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
 		matchGroups[i1].numVertices = ushort(matchGroups[i1].vertexIndices.size());
 		out << "    Num Vertices:  " << matchGroups[i1].numVertices << endl;
+		array_output_count = 0;
 		for (uint i2 = 0; i2 < matchGroups[i1].vertexIndices.size(); i2++) {
-			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) {
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 				break;
 			};
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+				break;
+			};
 			out << "      Vertex Indices[" << i2 << "]:  " << matchGroups[i1].vertexIndices[i2] << endl;
+			array_output_count++;
 		};
 	};
 	return out.str();
@@ -11788,6 +12644,7 @@ void NiTriStrips::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, u
 
 std::string NiTriStrips::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiTriBasedGeom::asString();
 	return out.str();
 }
@@ -11866,26 +12723,37 @@ void NiTriStripsData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_ma
 
 std::string NiTriStripsData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiTriBasedGeomData::asString();
 	for (uint i1 = 0; i1 < points.size(); i1++)
 		stripLengths[i1] = ushort(points[i1].size());
 	numStrips = ushort(stripLengths.size());
 	out << "  Num Strips:  " << numStrips << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < stripLengths.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Strip Lengths[" << i1 << "]:  " << stripLengths[i1] << endl;
+		array_output_count++;
 	};
 	out << "  Has Points:  " << hasPoints << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < points.size(); i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
 		for (uint i2 = 0; i2 < stripLengths[i1]; i2++) {
-			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) {
-				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				break;
 			};
-			out << "      Points[" << i1 << "][" << i2 << "]:  " << points[i1][i2] << endl;
+			out << "      Points[" << i2 << "]:  " << points[i1][i2] << endl;
+			array_output_count++;
 		};
 	};
 	return out.str();
@@ -11911,6 +12779,7 @@ void NiClod::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, unsign
 
 std::string NiClod::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiTriBasedGeom::asString();
 	return out.str();
 }
@@ -11979,6 +12848,7 @@ void NiClodData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, un
 
 std::string NiClodData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiTriBasedGeomData::asString();
 	unknownCount3 = ushort(unknownClodShorts3.size());
 	unknownCount2 = ushort(unknownClodShorts2.size());
@@ -11989,29 +12859,44 @@ std::string NiClodData::InternalAsString( bool verbose ) const {
 	out << "  Unknown Count 3:  " << unknownCount3 << endl;
 	out << "  Unknown Float:  " << unknownFloat << endl;
 	out << "  Unknown Short:  " << unknownShort << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < unknownClodShorts1.size(); i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
 		for (uint i2 = 0; i2 < 6; i2++) {
-			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) {
-				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				break;
 			};
-			out << "      Unknown Clod Shorts 1[" << i1 << "][" << i2 << "]:  " << unknownClodShorts1[i1][i2] << endl;
+			out << "      Unknown Clod Shorts 1[" << i2 << "]:  " << unknownClodShorts1[i1][i2] << endl;
+			array_output_count++;
 		};
 	};
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < unknownClodShorts2.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Unknown Clod Shorts 2[" << i1 << "]:  " << unknownClodShorts2[i1] << endl;
+		array_output_count++;
 	};
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < unknownClodShorts3.size(); i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
 		for (uint i2 = 0; i2 < 6; i2++) {
-			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) {
-				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				break;
 			};
-			out << "      Unknown Clod Shorts 3[" << i1 << "][" << i2 << "]:  " << unknownClodShorts3[i1][i2] << endl;
+			out << "      Unknown Clod Shorts 3[" << i2 << "]:  " << unknownClodShorts3[i1][i2] << endl;
+			array_output_count++;
 		};
 	};
 	return out.str();
@@ -12046,6 +12931,7 @@ void NiUVController::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map
 
 std::string NiUVController::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiTimeController::asString();
 	out << "  Unknown Short:  " << unknownShort << endl;
 	out << "  Data:  " << data << endl;
@@ -12095,19 +12981,30 @@ void NiUVData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, unsi
 
 std::string NiUVData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiObject::asString();
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < 4; i1++) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
+			break;
+		};
 		uvGroups[i1].numKeys = uint(uvGroups[i1].keys.size());
 		out << "    Num Keys:  " << uvGroups[i1].numKeys << endl;
 		if ( (uvGroups[i1].numKeys != 0) ) {
 			out << "      Interpolation:  " << uvGroups[i1].interpolation << endl;
 		};
+		array_output_count = 0;
 		for (uint i2 = 0; i2 < uvGroups[i1].keys.size(); i2++) {
-			if ( !verbose && ( i2 > MAXARRAYDUMP ) ) {
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 				out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 				break;
 			};
+			if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+				break;
+			};
 			out << "      Keys[" << i2 << "]:  " << uvGroups[i1].keys[i2] << endl;
+			array_output_count++;
 		};
 	};
 	return out.str();
@@ -12137,6 +13034,7 @@ void NiVectorExtraData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_
 
 std::string NiVectorExtraData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiExtraData::asString();
 	out << "  Vector Data:  " << vectorData << endl;
 	out << "  Unknown Float:  " << unknownFloat << endl;
@@ -12169,6 +13067,7 @@ void NiVertexColorProperty::InternalWrite( ostream& out, map<NiObjectRef,uint> l
 
 std::string NiVertexColorProperty::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiProperty::asString();
 	out << "  Flags:  " << flags << endl;
 	out << "  Vertex Mode:  " << vertexMode << endl;
@@ -12208,16 +13107,22 @@ void NiVertWeightsExtraData::InternalWrite( ostream& out, map<NiObjectRef,uint>
 
 std::string NiVertWeightsExtraData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiExtraData::asString();
 	numVertices = ushort(weight.size());
 	out << "  Num Bytes:  " << numBytes << endl;
 	out << "  Num Vertices:  " << numVertices << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < weight.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Weight[" << i1 << "]:  " << weight[i1] << endl;
+		array_output_count++;
 	};
 	return out.str();
 }
@@ -12253,6 +13158,7 @@ void NiVisController::InternalWrite( ostream& out, map<NiObjectRef,uint> link_ma
 
 std::string NiVisController::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiSingleInterpolatorController::asString();
 	out << "  Data:  " << data << endl;
 	return out.str();
@@ -12293,15 +13199,21 @@ void NiVisData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, uns
 
 std::string NiVisData::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << AKeyedData::asString();
 	numVisKeys = uint(visKeys.size());
 	out << "  Num Vis Keys:  " << numVisKeys << endl;
+	array_output_count = 0;
 	for (uint i1 = 0; i1 < visKeys.size(); i1++) {
-		if ( !verbose && ( i1 > MAXARRAYDUMP ) ) {
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
 			out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl;
 			break;
 		};
+		if ( !verbose && ( array_output_count > MAXARRAYDUMP ) ) {
+			break;
+		};
 		out << "    Vis Keys[" << i1 << "]:  " << visKeys[i1] << endl;
+		array_output_count++;
 	};
 	return out.str();
 }
@@ -12328,6 +13240,7 @@ void NiWireframeProperty::InternalWrite( ostream& out, map<NiObjectRef,uint> lin
 
 std::string NiWireframeProperty::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiProperty::asString();
 	out << "  Flags:  " << flags << endl;
 	return out.str();
@@ -12361,6 +13274,7 @@ void NiZBufferProperty::InternalWrite( ostream& out, map<NiObjectRef,uint> link_
 
 std::string NiZBufferProperty::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiProperty::asString();
 	out << "  Flags:  " << flags << endl;
 	out << "  Function:  " << function << endl;
@@ -12387,6 +13301,7 @@ void RootCollisionNode::InternalWrite( ostream& out, map<NiObjectRef,uint> link_
 
 std::string RootCollisionNode::InternalAsString( bool verbose ) const {
 	stringstream out;
+	uint array_output_count = 0;
 	out << NiNode::asString();
 	return out.str();
 }
diff --git a/src/obj/NiPSysEmitterCtlrData.cpp b/src/obj/NiPSysEmitterCtlrData.cpp
index 534e7952..fc791e59 100644
--- a/src/obj/NiPSysEmitterCtlrData.cpp
+++ b/src/obj/NiPSysEmitterCtlrData.cpp
@@ -13,7 +13,7 @@ NiPSysEmitterCtlrData::NiPSysEmitterCtlrData() NI_P_SYS_EMITTER_CTLR_DATA_CONSTR
 NiPSysEmitterCtlrData::~NiPSysEmitterCtlrData() {}
 
 void NiPSysEmitterCtlrData::Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version ) {
-	InternalRead( in, link_stack, version, user_version );InternalRead( in, link_stack, version, user_version );
+	InternalRead( in, link_stack, version, user_version );
 }
 
 void NiPSysEmitterCtlrData::Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const {
diff --git a/src/obj/NiPSysEmitterLifeSpanCtlr.cpp b/src/obj/NiPSysEmitterLifeSpanCtlr.cpp
index 07315c06..e1fa769f 100644
--- a/src/obj/NiPSysEmitterLifeSpanCtlr.cpp
+++ b/src/obj/NiPSysEmitterLifeSpanCtlr.cpp
@@ -2,6 +2,7 @@
 All rights reserved.  Please see niflib.h for licence. */
 
 #include "../../include/obj/NiPSysEmitterLifeSpanCtlr.h"
+#include "../../include/obj/NiFloatData.h"
 using namespace Niflib;
 
 //Definition of TYPE constant
-- 
GitLab