From fa79852dbbcbe8975c3d409a5bb80af896a353a6 Mon Sep 17 00:00:00 2001
From: Amorilia <amorilia@users.sourceforge.net>
Date: Sat, 6 Jun 2009 10:18:18 +0000
Subject: [PATCH] niflib: removed -fpermissive flag from Makefile and fixed 32
 bit pointer casts for 64 bit build (reported by guidoj, fixed with hints from
 Alphax, see issue #2788607)

---
 Makefile                                     |  2 +-
 include/NIF_IO.h                             |  1 +
 src/NIF_IO.cpp                               | 19 ++++++++++++++
 src/gen/Footer.cpp                           |  2 +-
 src/niflib.cpp                               |  3 +--
 src/obj/ATextureRenderData.cpp               |  2 +-
 src/obj/BSFrustumFOVController.cpp           |  2 +-
 src/obj/BSKeyframeController.cpp             |  2 +-
 src/obj/BSMasterParticleSystem.cpp           |  2 +-
 src/obj/BSMultiBound.cpp                     |  2 +-
 src/obj/BSMultiBoundNode.cpp                 |  2 +-
 src/obj/BSPSysMultiTargetEmitterCtlr.cpp     |  4 +--
 src/obj/BSShaderPPLightingProperty.cpp       |  2 +-
 src/obj/FxRadioButton.cpp                    |  2 +-
 src/obj/Ni3dsAlphaAnimator.cpp               |  2 +-
 src/obj/Ni3dsAnimationNode.cpp               |  2 +-
 src/obj/NiAVObject.cpp                       |  4 +--
 src/obj/NiAlphaController.cpp                |  2 +-
 src/obj/NiArkTextureExtraData.cpp            |  2 +-
 src/obj/NiBSplineInterpolator.cpp            |  4 +--
 src/obj/NiBezierMesh.cpp                     |  2 +-
 src/obj/NiBinaryVoxelExtraData.cpp           |  2 +-
 src/obj/NiBoneLODController.cpp              |  8 +++---
 src/obj/NiBoolInterpolator.cpp               |  2 +-
 src/obj/NiCamera.cpp                         |  2 +-
 src/obj/NiCollisionObject.cpp                |  2 +-
 src/obj/NiControllerManager.cpp              |  4 +--
 src/obj/NiControllerSequence.cpp             |  6 ++---
 src/obj/NiDefaultAVObjectPalette.cpp         |  2 +-
 src/obj/NiDynamicEffect.cpp                  |  2 +-
 src/obj/NiEnvMappedTriShape.cpp              |  6 ++---
 src/obj/NiExtraData.cpp                      |  2 +-
 src/obj/NiFlipController.cpp                 |  4 +--
 src/obj/NiFloatInterpolator.cpp              |  2 +-
 src/obj/NiGeomMorpherController.cpp          |  6 ++---
 src/obj/NiGeometry.cpp                       |  4 +--
 src/obj/NiGeometryData.cpp                   |  2 +-
 src/obj/NiImage.cpp                          |  2 +-
 src/obj/NiKeyframeController.cpp             |  2 +-
 src/obj/NiLODNode.cpp                        |  2 +-
 src/obj/NiLookAtController.cpp               |  2 +-
 src/obj/NiLookAtInterpolator.cpp             |  8 +++---
 src/obj/NiMeshPSysData.cpp                   |  2 +-
 src/obj/NiMorpherController.cpp              |  2 +-
 src/obj/NiMultiTargetTransformController.cpp |  2 +-
 src/obj/NiMultiTextureProperty.cpp           |  2 +-
 src/obj/NiNode.cpp                           |  4 +--
 src/obj/NiObjectNET.cpp                      |  6 ++---
 src/obj/NiPSysAgeDeathModifier.cpp           |  2 +-
 src/obj/NiPSysBombModifier.cpp               |  2 +-
 src/obj/NiPSysCollider.cpp                   |  8 +++---
 src/obj/NiPSysColliderManager.cpp            |  2 +-
 src/obj/NiPSysColorModifier.cpp              |  2 +-
 src/obj/NiPSysDragModifier.cpp               |  2 +-
 src/obj/NiPSysEmitterCtlr.cpp                |  4 +--
 src/obj/NiPSysFieldModifier.cpp              |  2 +-
 src/obj/NiPSysGravityModifier.cpp            |  2 +-
 src/obj/NiPSysMeshEmitter.cpp                |  2 +-
 src/obj/NiPSysMeshUpdateModifier.cpp         |  2 +-
 src/obj/NiPSysModifier.cpp                   |  2 +-
 src/obj/NiPSysModifierActiveCtlr.cpp         |  2 +-
 src/obj/NiPSysModifierFloatCtlr.cpp          |  2 +-
 src/obj/NiPSysVolumeEmitter.cpp              |  2 +-
 src/obj/NiParticleColorModifier.cpp          |  2 +-
 src/obj/NiParticleMeshModifier.cpp           |  2 +-
 src/obj/NiParticleMeshesData.cpp             |  2 +-
 src/obj/NiParticleModifier.cpp               |  4 +--
 src/obj/NiParticleSystem.cpp                 |  2 +-
 src/obj/NiParticleSystemController.cpp       | 12 ++++-----
 src/obj/NiParticlesData.cpp                  |  2 +-
 src/obj/NiPathController.cpp                 |  4 +--
 src/obj/NiPathInterpolator.cpp               |  4 +--
 src/obj/NiPhysXActorDesc.cpp                 | 10 ++++----
 src/obj/NiPhysXProp.cpp                      |  6 ++---
 src/obj/NiPhysXPropDesc.cpp                  |  6 ++---
 src/obj/NiPhysXShapeDesc.cpp                 |  2 +-
 src/obj/NiPhysXTransformDest.cpp             |  2 +-
 src/obj/NiPoint3InterpController.cpp         |  2 +-
 src/obj/NiPoint3Interpolator.cpp             |  2 +-
 src/obj/NiPortal.cpp                         |  2 +-
 src/obj/NiRollController.cpp                 |  2 +-
 src/obj/NiRoom.cpp                           |  6 ++---
 src/obj/NiRoomGroup.cpp                      |  4 +--
 src/obj/NiSequence.cpp                       | 12 ++++-----
 src/obj/NiSingleInterpController.cpp         |  2 +-
 src/obj/NiSkinData.cpp                       |  2 +-
 src/obj/NiSkinInstance.cpp                   |  8 +++---
 src/obj/NiSourceTexture.cpp                  |  4 +--
 src/obj/NiTextureEffect.cpp                  |  4 +--
 src/obj/NiTextureProperty.cpp                |  2 +-
 src/obj/NiTextureTransformController.cpp     |  2 +-
 src/obj/NiTexturingProperty.cpp              | 26 ++++++++++----------
 src/obj/NiTimeController.cpp                 |  4 +--
 src/obj/NiTransformInterpolator.cpp          |  2 +-
 src/obj/NiTriShapeSkinController.cpp         |  2 +-
 src/obj/NiUVController.cpp                   |  2 +-
 src/obj/NiVisController.cpp                  |  2 +-
 src/obj/bhkConstraint.cpp                    |  2 +-
 src/obj/bhkConvexListShape.cpp               |  2 +-
 src/obj/bhkListShape.cpp                     |  2 +-
 src/obj/bhkMalleableConstraint.cpp           |  4 +--
 src/obj/bhkMoppBvTreeShape.cpp               |  2 +-
 src/obj/bhkNiCollisionObject.cpp             |  2 +-
 src/obj/bhkNiTriStripsShape.cpp              |  2 +-
 src/obj/bhkPackedNiTriStripsShape.cpp        |  2 +-
 src/obj/bhkRigidBody.cpp                     |  2 +-
 src/obj/bhkTransformShape.cpp                |  2 +-
 src/obj/bhkWorldObject.cpp                   |  2 +-
 108 files changed, 194 insertions(+), 175 deletions(-)

diff --git a/Makefile b/Makefile
index afea2f1f..3946fc77 100644
--- a/Makefile
+++ b/Makefile
@@ -27,7 +27,7 @@ DEBUGGING	=
 # Example: -march=k8 would generate enhancements for the k8 family (opterons and some athlons).or -march=pentium4 for a pentium4
 # For more info read this: http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64-Options
 #
-CFLAGS 		= -O2 -Wall $(DEBUGGING) -fpermissive -Iinclude -D BUILDING_NIFLIB_DLL -fPIC
+CFLAGS 		= -O2 -Wall $(DEBUGGING) -Iinclude -D BUILDING_NIFLIB_DLL -fPIC
 CXXFLAGS	= $(CFLAGS)
 #IT should find the libs used, but if it doesn't specify here. Ex: -lm for libm.so.<whatever>
 LIBS		=
diff --git a/include/NIF_IO.h b/include/NIF_IO.h
index 00cacd3a..70b58b92 100644
--- a/include/NIF_IO.h
+++ b/include/NIF_IO.h
@@ -37,6 +37,7 @@ bool ReadBool( istream &in, unsigned int version );
 //-- Write Utility Functions --//
 void WriteInt( int val, ostream& out );
 void WriteUInt( unsigned int val, ostream& out );
+void WritePtr32( void * val, ostream& out );
 void WriteUShort( unsigned short val, ostream& out );
 void WriteShort( short val, ostream& out );
 void WriteByte( byte val, ostream& out );
diff --git a/src/NIF_IO.cpp b/src/NIF_IO.cpp
index ac357c2b..563adfe7 100644
--- a/src/NIF_IO.cpp
+++ b/src/NIF_IO.cpp
@@ -184,6 +184,25 @@ void WriteUInt( unsigned int val, ostream& out ){
 	out.write( (char*)&val, 4 );
 }
 
+void WritePtr32( void * val, ostream& out ){
+#if __SIZEOF_POINTER__ == 4
+  // 32 bit
+  WriteUInt( (unsigned int)val, out );
+#else
+  // 64 bit
+  typedef union intpoint {
+    void *ptr;
+    unsigned int id1;
+    unsigned int id2;
+  };
+  intpoint ptr;
+  ptr.ptr = val;
+  // xor the two parts
+  // (maybe a more advanced hash function would be better, experience will tell)
+  WriteUInt(ptr.id1 ^ ptr.id2, out);
+#endif
+}
+
 void WriteUShort( unsigned short val, ostream& out ){
 
 	out.write( (char*)&val, 2 );
diff --git a/src/gen/Footer.cpp b/src/gen/Footer.cpp
index f47d935f..3db8f638 100644
--- a/src/gen/Footer.cpp
+++ b/src/gen/Footer.cpp
@@ -45,7 +45,7 @@ void Footer::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map
 		NifStream( numRoots, out, info );
 		for (unsigned int i2 = 0; i2 < roots.size(); i2++) {
 			if ( info.version < VER_3_3_0_13 ) {
-				NifStream( (unsigned int)&(*roots[i2]), out, info );
+				WritePtr32( &(*roots[i2]), out );
 			} else {
 				if ( roots[i2] != NULL ) {
 					NifStream( link_map.find( StaticCast<NiObject>(roots[i2]) )->second, out, info );
diff --git a/src/niflib.cpp b/src/niflib.cpp
index 35ebf445..0b16e576 100644
--- a/src/niflib.cpp
+++ b/src/niflib.cpp
@@ -500,8 +500,7 @@ void WriteNifTree( ostream & out, list<NiObjectRef> const & roots, const NifInfo
 			//Write Object Type
 			WriteString( objects[i]->GetType().GetTypeName() , out );
 			//Write pointer number of object
-			WriteUInt( (unsigned int)&(*objects[i]), out );
-
+			WritePtr32( &(*objects[i]), out );
 			
 		} else if (version < 0x05000001) {
 			//Write Object Type
diff --git a/src/obj/ATextureRenderData.cpp b/src/obj/ATextureRenderData.cpp
index 18a0fe91..bab6c9e6 100644
--- a/src/obj/ATextureRenderData.cpp
+++ b/src/obj/ATextureRenderData.cpp
@@ -144,7 +144,7 @@ void ATextureRenderData::Write( ostream& out, const map<NiObjectRef,unsigned int
 		};
 	};
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*palette), out, info );
+		WritePtr32( &(*palette), out );
 	} else {
 		if ( palette != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(palette) )->second, out, info );
diff --git a/src/obj/BSFrustumFOVController.cpp b/src/obj/BSFrustumFOVController.cpp
index b9b4831b..5ae6136e 100644
--- a/src/obj/BSFrustumFOVController.cpp
+++ b/src/obj/BSFrustumFOVController.cpp
@@ -63,7 +63,7 @@ void BSFrustumFOVController::Write( ostream& out, const map<NiObjectRef,unsigned
 
 	NiTimeController::Write( out, link_map, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*interpolator), out, info );
+		WritePtr32( &(*interpolator), out );
 	} else {
 		if ( interpolator != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(interpolator) )->second, out, info );
diff --git a/src/obj/BSKeyframeController.cpp b/src/obj/BSKeyframeController.cpp
index 250d1231..6b64582b 100644
--- a/src/obj/BSKeyframeController.cpp
+++ b/src/obj/BSKeyframeController.cpp
@@ -57,7 +57,7 @@ void BSKeyframeController::Write( ostream& out, const map<NiObjectRef,unsigned i
 
 	NiKeyframeController::Write( out, link_map, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*data2), out, info );
+		WritePtr32( &(*data2), out );
 	} else {
 		if ( data2 != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(data2) )->second, out, info );
diff --git a/src/obj/BSMasterParticleSystem.cpp b/src/obj/BSMasterParticleSystem.cpp
index a3781d9f..99433c76 100644
--- a/src/obj/BSMasterParticleSystem.cpp
+++ b/src/obj/BSMasterParticleSystem.cpp
@@ -72,7 +72,7 @@ void BSMasterParticleSystem::Write( ostream& out, const map<NiObjectRef,unsigned
 	NifStream( numParticleSystems, out, info );
 	for (unsigned int i1 = 0; i1 < particleSystems.size(); i1++) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*particleSystems[i1]), out, info );
+			WritePtr32( &(*particleSystems[i1]), out );
 		} else {
 			if ( particleSystems[i1] != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(particleSystems[i1]) )->second, out, info );
diff --git a/src/obj/BSMultiBound.cpp b/src/obj/BSMultiBound.cpp
index 96bf2d7f..9a506cae 100644
--- a/src/obj/BSMultiBound.cpp
+++ b/src/obj/BSMultiBound.cpp
@@ -63,7 +63,7 @@ void BSMultiBound::Write( ostream& out, const map<NiObjectRef,unsigned int> & li
 
 	NiObject::Write( out, link_map, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*data), out, info );
+		WritePtr32( &(*data), out );
 	} else {
 		if ( data != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
diff --git a/src/obj/BSMultiBoundNode.cpp b/src/obj/BSMultiBoundNode.cpp
index c0094502..3355b667 100644
--- a/src/obj/BSMultiBoundNode.cpp
+++ b/src/obj/BSMultiBoundNode.cpp
@@ -63,7 +63,7 @@ void BSMultiBoundNode::Write( ostream& out, const map<NiObjectRef,unsigned int>
 
 	NiNode::Write( out, link_map, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*multiBound), out, info );
+		WritePtr32( &(*multiBound), out );
 	} else {
 		if ( multiBound != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(multiBound) )->second, out, info );
diff --git a/src/obj/BSPSysMultiTargetEmitterCtlr.cpp b/src/obj/BSPSysMultiTargetEmitterCtlr.cpp
index 40960ca5..c1f0b00e 100644
--- a/src/obj/BSPSysMultiTargetEmitterCtlr.cpp
+++ b/src/obj/BSPSysMultiTargetEmitterCtlr.cpp
@@ -73,7 +73,7 @@ void BSPSysMultiTargetEmitterCtlr::Write( ostream& out, const map<NiObjectRef,un
 	NiPSysModifierCtlr::Write( out, link_map, info );
 	if ( info.version <= 0x0A010000 ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*data), out, info );
+			WritePtr32( &(*data), out );
 		} else {
 			if ( data != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
@@ -84,7 +84,7 @@ void BSPSysMultiTargetEmitterCtlr::Write( ostream& out, const map<NiObjectRef,un
 	};
 	if ( info.version >= 0x0A020000 ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*visibilityInterpolator), out, info );
+			WritePtr32( &(*visibilityInterpolator), out );
 		} else {
 			if ( visibilityInterpolator != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(visibilityInterpolator) )->second, out, info );
diff --git a/src/obj/BSShaderPPLightingProperty.cpp b/src/obj/BSShaderPPLightingProperty.cpp
index 612fbf69..c768f6fb 100644
--- a/src/obj/BSShaderPPLightingProperty.cpp
+++ b/src/obj/BSShaderPPLightingProperty.cpp
@@ -71,7 +71,7 @@ void BSShaderPPLightingProperty::Write( ostream& out, const map<NiObjectRef,unsi
 
 	BSShaderLightingProperty::Write( out, link_map, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*textureSet), out, info );
+		WritePtr32( &(*textureSet), out );
 	} else {
 		if ( textureSet != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(textureSet) )->second, out, info );
diff --git a/src/obj/FxRadioButton.cpp b/src/obj/FxRadioButton.cpp
index 3c0122f2..8e5afbc9 100644
--- a/src/obj/FxRadioButton.cpp
+++ b/src/obj/FxRadioButton.cpp
@@ -69,7 +69,7 @@ void FxRadioButton::Write( ostream& out, const map<NiObjectRef,unsigned int> & l
 	NifStream( numButtons, out, info );
 	for (unsigned int i1 = 0; i1 < buttons.size(); i1++) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*buttons[i1]), out, info );
+			WritePtr32( &(*buttons[i1]), out );
 		} else {
 			if ( buttons[i1] != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(buttons[i1]) )->second, out, info );
diff --git a/src/obj/Ni3dsAlphaAnimator.cpp b/src/obj/Ni3dsAlphaAnimator.cpp
index e1caf255..13bc1c04 100644
--- a/src/obj/Ni3dsAlphaAnimator.cpp
+++ b/src/obj/Ni3dsAlphaAnimator.cpp
@@ -80,7 +80,7 @@ void Ni3dsAlphaAnimator::Write( ostream& out, const map<NiObjectRef,unsigned int
 		NifStream( unknown1[i1], out, info );
 	};
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*parent), out, info );
+		WritePtr32( &(*parent), out );
 	} else {
 		if ( parent != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(parent) )->second, out, info );
diff --git a/src/obj/Ni3dsAnimationNode.cpp b/src/obj/Ni3dsAnimationNode.cpp
index 2024d11b..2ca9c984 100644
--- a/src/obj/Ni3dsAnimationNode.cpp
+++ b/src/obj/Ni3dsAnimationNode.cpp
@@ -87,7 +87,7 @@ void Ni3dsAnimationNode::Write( ostream& out, const map<NiObjectRef,unsigned int
 		};
 		NifStream( unknownShort, out, info );
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*child), out, info );
+			WritePtr32( &(*child), out );
 		} else {
 			if ( child != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(child) )->second, out, info );
diff --git a/src/obj/NiAVObject.cpp b/src/obj/NiAVObject.cpp
index bc9805c5..2c30e486 100644
--- a/src/obj/NiAVObject.cpp
+++ b/src/obj/NiAVObject.cpp
@@ -122,7 +122,7 @@ void NiAVObject::Write( ostream& out, const map<NiObjectRef,unsigned int> & link
 	NifStream( numProperties, out, info );
 	for (unsigned int i1 = 0; i1 < properties.size(); i1++) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*properties[i1]), out, info );
+			WritePtr32( &(*properties[i1]), out );
 		} else {
 			if ( properties[i1] != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(properties[i1]) )->second, out, info );
@@ -148,7 +148,7 @@ void NiAVObject::Write( ostream& out, const map<NiObjectRef,unsigned int> & link
 	};
 	if ( info.version >= 0x0A000100 ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*collisionObject), out, info );
+			WritePtr32( &(*collisionObject), out );
 		} else {
 			if ( collisionObject != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(collisionObject) )->second, out, info );
diff --git a/src/obj/NiAlphaController.cpp b/src/obj/NiAlphaController.cpp
index 5ffc46bd..e2b0ea26 100644
--- a/src/obj/NiAlphaController.cpp
+++ b/src/obj/NiAlphaController.cpp
@@ -61,7 +61,7 @@ void NiAlphaController::Write( ostream& out, const map<NiObjectRef,unsigned int>
 	NiFloatInterpController::Write( out, link_map, info );
 	if ( info.version <= 0x0A010000 ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*data), out, info );
+			WritePtr32( &(*data), out );
 		} else {
 			if ( data != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
diff --git a/src/obj/NiArkTextureExtraData.cpp b/src/obj/NiArkTextureExtraData.cpp
index 755268cc..3407ada4 100644
--- a/src/obj/NiArkTextureExtraData.cpp
+++ b/src/obj/NiArkTextureExtraData.cpp
@@ -94,7 +94,7 @@ void NiArkTextureExtraData::Write( ostream& out, const map<NiObjectRef,unsigned
 		NifStream( textures[i1].unknownInt3, out, info );
 		NifStream( textures[i1].unknownInt4, out, info );
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*textures[i1].texturingProperty), out, info );
+			WritePtr32( &(*textures[i1].texturingProperty), out );
 		} else {
 			if ( textures[i1].texturingProperty != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(textures[i1].texturingProperty) )->second, out, info );
diff --git a/src/obj/NiBSplineInterpolator.cpp b/src/obj/NiBSplineInterpolator.cpp
index ba5235b1..e1664e6a 100644
--- a/src/obj/NiBSplineInterpolator.cpp
+++ b/src/obj/NiBSplineInterpolator.cpp
@@ -64,7 +64,7 @@ void NiBSplineInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned
 	NifStream( startTime, out, info );
 	NifStream( stopTime, out, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*splineData), out, info );
+		WritePtr32( &(*splineData), out );
 	} else {
 		if ( splineData != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(splineData) )->second, out, info );
@@ -73,7 +73,7 @@ void NiBSplineInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned
 		}
 	}
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*basisData), out, info );
+		WritePtr32( &(*basisData), out );
 	} else {
 		if ( basisData != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(basisData) )->second, out, info );
diff --git a/src/obj/NiBezierMesh.cpp b/src/obj/NiBezierMesh.cpp
index 211f4c5f..0d3f7e00 100644
--- a/src/obj/NiBezierMesh.cpp
+++ b/src/obj/NiBezierMesh.cpp
@@ -94,7 +94,7 @@ void NiBezierMesh::Write( ostream& out, const map<NiObjectRef,unsigned int> & li
 	NifStream( numBezierTriangles, out, info );
 	for (unsigned int i1 = 0; i1 < bezierTriangle.size(); i1++) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*bezierTriangle[i1]), out, info );
+			WritePtr32( &(*bezierTriangle[i1]), out );
 		} else {
 			if ( bezierTriangle[i1] != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(bezierTriangle[i1]) )->second, out, info );
diff --git a/src/obj/NiBinaryVoxelExtraData.cpp b/src/obj/NiBinaryVoxelExtraData.cpp
index 35ac1cd1..635bae78 100644
--- a/src/obj/NiBinaryVoxelExtraData.cpp
+++ b/src/obj/NiBinaryVoxelExtraData.cpp
@@ -59,7 +59,7 @@ void NiBinaryVoxelExtraData::Write( ostream& out, const map<NiObjectRef,unsigned
 	NiExtraData::Write( out, link_map, info );
 	NifStream( unknownInt, out, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*data), out, info );
+		WritePtr32( &(*data), out );
 	} else {
 		if ( data != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
diff --git a/src/obj/NiBoneLODController.cpp b/src/obj/NiBoneLODController.cpp
index d54a6477..d58c063c 100644
--- a/src/obj/NiBoneLODController.cpp
+++ b/src/obj/NiBoneLODController.cpp
@@ -104,7 +104,7 @@ void NiBoneLODController::Write( ostream& out, const map<NiObjectRef,unsigned in
 		NifStream( nodeGroups[i1].numNodes, out, info );
 		for (unsigned int i2 = 0; i2 < nodeGroups[i1].nodes.size(); i2++) {
 			if ( info.version < VER_3_3_0_13 ) {
-				NifStream( (unsigned int)&(*nodeGroups[i1].nodes[i2]), out, info );
+				WritePtr32( &(*nodeGroups[i1].nodes[i2]), out );
 			} else {
 				if ( nodeGroups[i1].nodes[i2] != NULL ) {
 					NifStream( link_map.find( StaticCast<NiObject>(nodeGroups[i1].nodes[i2]) )->second, out, info );
@@ -121,7 +121,7 @@ void NiBoneLODController::Write( ostream& out, const map<NiObjectRef,unsigned in
 			NifStream( shapeGroups1[i2].numLinkPairs, out, info );
 			for (unsigned int i3 = 0; i3 < shapeGroups1[i2].linkPairs.size(); i3++) {
 				if ( info.version < VER_3_3_0_13 ) {
-					NifStream( (unsigned int)&(*shapeGroups1[i2].linkPairs[i3].shape), out, info );
+					WritePtr32( &(*shapeGroups1[i2].linkPairs[i3].shape), out );
 				} else {
 					if ( shapeGroups1[i2].linkPairs[i3].shape != NULL ) {
 						NifStream( link_map.find( StaticCast<NiObject>(shapeGroups1[i2].linkPairs[i3].shape) )->second, out, info );
@@ -130,7 +130,7 @@ void NiBoneLODController::Write( ostream& out, const map<NiObjectRef,unsigned in
 					}
 				}
 				if ( info.version < VER_3_3_0_13 ) {
-					NifStream( (unsigned int)&(*shapeGroups1[i2].linkPairs[i3].skinInstance), out, info );
+					WritePtr32( &(*shapeGroups1[i2].linkPairs[i3].skinInstance), out );
 				} else {
 					if ( shapeGroups1[i2].linkPairs[i3].skinInstance != NULL ) {
 						NifStream( link_map.find( StaticCast<NiObject>(shapeGroups1[i2].linkPairs[i3].skinInstance) )->second, out, info );
@@ -143,7 +143,7 @@ void NiBoneLODController::Write( ostream& out, const map<NiObjectRef,unsigned in
 		NifStream( numShapeGroups2, out, info );
 		for (unsigned int i2 = 0; i2 < shapeGroups2.size(); i2++) {
 			if ( info.version < VER_3_3_0_13 ) {
-				NifStream( (unsigned int)&(*shapeGroups2[i2]), out, info );
+				WritePtr32( &(*shapeGroups2[i2]), out );
 			} else {
 				if ( shapeGroups2[i2] != NULL ) {
 					NifStream( link_map.find( StaticCast<NiObject>(shapeGroups2[i2]) )->second, out, info );
diff --git a/src/obj/NiBoolInterpolator.cpp b/src/obj/NiBoolInterpolator.cpp
index e7317268..99d48433 100644
--- a/src/obj/NiBoolInterpolator.cpp
+++ b/src/obj/NiBoolInterpolator.cpp
@@ -59,7 +59,7 @@ void NiBoolInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int
 	NiKeyBasedInterpolator::Write( out, link_map, info );
 	NifStream( boolValue, out, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*data), out, info );
+		WritePtr32( &(*data), out );
 	} else {
 		if ( data != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
diff --git a/src/obj/NiCamera.cpp b/src/obj/NiCamera.cpp
index 710be261..71c5b83b 100644
--- a/src/obj/NiCamera.cpp
+++ b/src/obj/NiCamera.cpp
@@ -98,7 +98,7 @@ void NiCamera::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_m
 	NifStream( viewportBottom, out, info );
 	NifStream( lodAdjust, out, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*unknownLink), out, info );
+		WritePtr32( &(*unknownLink), out );
 	} else {
 		if ( unknownLink != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, info );
diff --git a/src/obj/NiCollisionObject.cpp b/src/obj/NiCollisionObject.cpp
index ee84d0a5..1faa29b5 100644
--- a/src/obj/NiCollisionObject.cpp
+++ b/src/obj/NiCollisionObject.cpp
@@ -57,7 +57,7 @@ void NiCollisionObject::Write( ostream& out, const map<NiObjectRef,unsigned int>
 
 	NiObject::Write( out, link_map, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*target), out, info );
+		WritePtr32( &(*target), out );
 	} else {
 		if ( target != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(target) )->second, out, info );
diff --git a/src/obj/NiControllerManager.cpp b/src/obj/NiControllerManager.cpp
index 735d11a8..4d8c6a98 100644
--- a/src/obj/NiControllerManager.cpp
+++ b/src/obj/NiControllerManager.cpp
@@ -70,7 +70,7 @@ void NiControllerManager::Write( ostream& out, const map<NiObjectRef,unsigned in
 	NifStream( numControllerSequences, out, info );
 	for (unsigned int i1 = 0; i1 < controllerSequences.size(); i1++) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*controllerSequences[i1]), out, info );
+			WritePtr32( &(*controllerSequences[i1]), out );
 		} else {
 			if ( controllerSequences[i1] != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(controllerSequences[i1]) )->second, out, info );
@@ -80,7 +80,7 @@ void NiControllerManager::Write( ostream& out, const map<NiObjectRef,unsigned in
 		}
 	};
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*objectPalette), out, info );
+		WritePtr32( &(*objectPalette), out );
 	} else {
 		if ( objectPalette != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(objectPalette) )->second, out, info );
diff --git a/src/obj/NiControllerSequence.cpp b/src/obj/NiControllerSequence.cpp
index 6863a3b5..4ad5d8f3 100644
--- a/src/obj/NiControllerSequence.cpp
+++ b/src/obj/NiControllerSequence.cpp
@@ -103,7 +103,7 @@ void NiControllerSequence::Write( ostream& out, const map<NiObjectRef,unsigned i
 	if ( info.version >= 0x0A01006A ) {
 		NifStream( weight, out, info );
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*textKeys), out, info );
+			WritePtr32( &(*textKeys), out );
 		} else {
 			if ( textKeys != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(textKeys) )->second, out, info );
@@ -131,7 +131,7 @@ void NiControllerSequence::Write( ostream& out, const map<NiObjectRef,unsigned i
 	};
 	if ( info.version >= 0x0A01006A ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*manager), out, info );
+			WritePtr32( &(*manager), out );
 		} else {
 			if ( manager != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(manager) )->second, out, info );
@@ -143,7 +143,7 @@ void NiControllerSequence::Write( ostream& out, const map<NiObjectRef,unsigned i
 	};
 	if ( ( info.version >= 0x0A020000 ) && ( info.version <= 0x14000005 ) ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*stringPalette), out, info );
+			WritePtr32( &(*stringPalette), out );
 		} else {
 			if ( stringPalette != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(stringPalette) )->second, out, info );
diff --git a/src/obj/NiDefaultAVObjectPalette.cpp b/src/obj/NiDefaultAVObjectPalette.cpp
index 933f3a74..dd3cf564 100644
--- a/src/obj/NiDefaultAVObjectPalette.cpp
+++ b/src/obj/NiDefaultAVObjectPalette.cpp
@@ -69,7 +69,7 @@ void NiDefaultAVObjectPalette::Write( ostream& out, const map<NiObjectRef,unsign
 	for (unsigned int i1 = 0; i1 < objs.size(); i1++) {
 		NifStream( objs[i1].name, out, info );
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*objs[i1].avObject), out, info );
+			WritePtr32( &(*objs[i1].avObject), out );
 		} else {
 			if ( objs[i1].avObject != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(objs[i1].avObject) )->second, out, info );
diff --git a/src/obj/NiDynamicEffect.cpp b/src/obj/NiDynamicEffect.cpp
index 3c8bc2aa..d8b05b2d 100644
--- a/src/obj/NiDynamicEffect.cpp
+++ b/src/obj/NiDynamicEffect.cpp
@@ -95,7 +95,7 @@ void NiDynamicEffect::Write( ostream& out, const map<NiObjectRef,unsigned int> &
 	if ( info.version >= 0x0A010000 ) {
 		for (unsigned int i2 = 0; i2 < affectedNodes.size(); i2++) {
 			if ( info.version < VER_3_3_0_13 ) {
-				NifStream( (unsigned int)&(*affectedNodes[i2]), out, info );
+				WritePtr32( &(*affectedNodes[i2]), out );
 			} else {
 				if ( affectedNodes[i2] != NULL ) {
 					NifStream( link_map.find( StaticCast<NiObject>(affectedNodes[i2]) )->second, out, info );
diff --git a/src/obj/NiEnvMappedTriShape.cpp b/src/obj/NiEnvMappedTriShape.cpp
index 6556c768..ba83aa10 100644
--- a/src/obj/NiEnvMappedTriShape.cpp
+++ b/src/obj/NiEnvMappedTriShape.cpp
@@ -79,7 +79,7 @@ void NiEnvMappedTriShape::Write( ostream& out, const map<NiObjectRef,unsigned in
 	NifStream( numChildren, out, info );
 	for (unsigned int i1 = 0; i1 < children.size(); i1++) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*children[i1]), out, info );
+			WritePtr32( &(*children[i1]), out );
 		} else {
 			if ( children[i1] != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(children[i1]) )->second, out, info );
@@ -89,7 +89,7 @@ void NiEnvMappedTriShape::Write( ostream& out, const map<NiObjectRef,unsigned in
 		}
 	};
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*child2), out, info );
+		WritePtr32( &(*child2), out );
 	} else {
 		if ( child2 != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(child2) )->second, out, info );
@@ -98,7 +98,7 @@ void NiEnvMappedTriShape::Write( ostream& out, const map<NiObjectRef,unsigned in
 		}
 	}
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*child3), out, info );
+		WritePtr32( &(*child3), out );
 	} else {
 		if ( child3 != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(child3) )->second, out, info );
diff --git a/src/obj/NiExtraData.cpp b/src/obj/NiExtraData.cpp
index cbc82af0..ce782b4b 100644
--- a/src/obj/NiExtraData.cpp
+++ b/src/obj/NiExtraData.cpp
@@ -65,7 +65,7 @@ void NiExtraData::Write( ostream& out, const map<NiObjectRef,unsigned int> & lin
 	};
 	if ( info.version <= 0x04020200 ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*nextExtraData), out, info );
+			WritePtr32( &(*nextExtraData), out );
 		} else {
 			if ( nextExtraData != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(nextExtraData) )->second, out, info );
diff --git a/src/obj/NiFlipController.cpp b/src/obj/NiFlipController.cpp
index ddb0dd7b..cc6ef943 100644
--- a/src/obj/NiFlipController.cpp
+++ b/src/obj/NiFlipController.cpp
@@ -89,7 +89,7 @@ void NiFlipController::Write( ostream& out, const map<NiObjectRef,unsigned int>
 	if ( info.version >= 0x04000000 ) {
 		for (unsigned int i2 = 0; i2 < sources.size(); i2++) {
 			if ( info.version < VER_3_3_0_13 ) {
-				NifStream( (unsigned int)&(*sources[i2]), out, info );
+				WritePtr32( &(*sources[i2]), out );
 			} else {
 				if ( sources[i2] != NULL ) {
 					NifStream( link_map.find( StaticCast<NiObject>(sources[i2]) )->second, out, info );
@@ -102,7 +102,7 @@ void NiFlipController::Write( ostream& out, const map<NiObjectRef,unsigned int>
 	if ( info.version <= 0x03010000 ) {
 		for (unsigned int i2 = 0; i2 < images.size(); i2++) {
 			if ( info.version < VER_3_3_0_13 ) {
-				NifStream( (unsigned int)&(*images[i2]), out, info );
+				WritePtr32( &(*images[i2]), out );
 			} else {
 				if ( images[i2] != NULL ) {
 					NifStream( link_map.find( StaticCast<NiObject>(images[i2]) )->second, out, info );
diff --git a/src/obj/NiFloatInterpolator.cpp b/src/obj/NiFloatInterpolator.cpp
index 3cb211c3..bfe9b97f 100644
--- a/src/obj/NiFloatInterpolator.cpp
+++ b/src/obj/NiFloatInterpolator.cpp
@@ -59,7 +59,7 @@ void NiFloatInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned in
 	NiKeyBasedInterpolator::Write( out, link_map, info );
 	NifStream( floatValue, out, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*data), out, info );
+		WritePtr32( &(*data), out );
 	} else {
 		if ( data != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
diff --git a/src/obj/NiGeomMorpherController.cpp b/src/obj/NiGeomMorpherController.cpp
index 07a2dbe0..6be8420c 100644
--- a/src/obj/NiGeomMorpherController.cpp
+++ b/src/obj/NiGeomMorpherController.cpp
@@ -119,7 +119,7 @@ void NiGeomMorpherController::Write( ostream& out, const map<NiObjectRef,unsigne
 		NifStream( unknown2, out, info );
 	};
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*data), out, info );
+		WritePtr32( &(*data), out );
 	} else {
 		if ( data != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
@@ -134,7 +134,7 @@ void NiGeomMorpherController::Write( ostream& out, const map<NiObjectRef,unsigne
 	if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x14020006 ) ) {
 		for (unsigned int i2 = 0; i2 < interpolators.size(); i2++) {
 			if ( info.version < VER_3_3_0_13 ) {
-				NifStream( (unsigned int)&(*interpolators[i2]), out, info );
+				WritePtr32( &(*interpolators[i2]), out );
 			} else {
 				if ( interpolators[i2] != NULL ) {
 					NifStream( link_map.find( StaticCast<NiObject>(interpolators[i2]) )->second, out, info );
@@ -147,7 +147,7 @@ void NiGeomMorpherController::Write( ostream& out, const map<NiObjectRef,unsigne
 	if ( info.version >= 0x14020007 ) {
 		for (unsigned int i2 = 0; i2 < interpolatorWeights.size(); i2++) {
 			if ( info.version < VER_3_3_0_13 ) {
-				NifStream( (unsigned int)&(*interpolatorWeights[i2].interpolator), out, info );
+				WritePtr32( &(*interpolatorWeights[i2].interpolator), out );
 			} else {
 				if ( interpolatorWeights[i2].interpolator != NULL ) {
 					NifStream( link_map.find( StaticCast<NiObject>(interpolatorWeights[i2].interpolator) )->second, out, info );
diff --git a/src/obj/NiGeometry.cpp b/src/obj/NiGeometry.cpp
index 596d47b6..38d67377 100644
--- a/src/obj/NiGeometry.cpp
+++ b/src/obj/NiGeometry.cpp
@@ -94,7 +94,7 @@ void NiGeometry::Write( ostream& out, const map<NiObjectRef,unsigned int> & link
 	NiAVObject::Write( out, link_map, info );
 	numMaterials = (unsigned int)(materialName.size());
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*data), out, info );
+		WritePtr32( &(*data), out );
 	} else {
 		if ( data != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
@@ -104,7 +104,7 @@ void NiGeometry::Write( ostream& out, const map<NiObjectRef,unsigned int> & link
 	}
 	if ( info.version >= 0x0303000D ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*skinInstance), out, info );
+			WritePtr32( &(*skinInstance), out );
 		} else {
 			if ( skinInstance != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(skinInstance) )->second, out, info );
diff --git a/src/obj/NiGeometryData.cpp b/src/obj/NiGeometryData.cpp
index 71868796..410a549f 100644
--- a/src/obj/NiGeometryData.cpp
+++ b/src/obj/NiGeometryData.cpp
@@ -203,7 +203,7 @@ void NiGeometryData::Write( ostream& out, const map<NiObjectRef,unsigned int> &
 	};
 	if ( info.version >= 0x14000004 ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*additionalData), out, info );
+			WritePtr32( &(*additionalData), out );
 		} else {
 			if ( additionalData != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(additionalData) )->second, out, info );
diff --git a/src/obj/NiImage.cpp b/src/obj/NiImage.cpp
index ce0b5055..f46bea2c 100644
--- a/src/obj/NiImage.cpp
+++ b/src/obj/NiImage.cpp
@@ -72,7 +72,7 @@ void NiImage::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_ma
 	};
 	if ( (external == 0) ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*imageData), out, info );
+			WritePtr32( &(*imageData), out );
 		} else {
 			if ( imageData != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(imageData) )->second, out, info );
diff --git a/src/obj/NiKeyframeController.cpp b/src/obj/NiKeyframeController.cpp
index 0c8c4f78..6ad64629 100644
--- a/src/obj/NiKeyframeController.cpp
+++ b/src/obj/NiKeyframeController.cpp
@@ -60,7 +60,7 @@ void NiKeyframeController::Write( ostream& out, const map<NiObjectRef,unsigned i
 	NiSingleInterpController::Write( out, link_map, info );
 	if ( info.version <= 0x0A010000 ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*data), out, info );
+			WritePtr32( &(*data), out );
 		} else {
 			if ( data != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
diff --git a/src/obj/NiLODNode.cpp b/src/obj/NiLODNode.cpp
index 0d55b2f1..f5390a68 100644
--- a/src/obj/NiLODNode.cpp
+++ b/src/obj/NiLODNode.cpp
@@ -93,7 +93,7 @@ void NiLODNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_
 	};
 	if ( info.version >= 0x0A010000 ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*lodLevelData), out, info );
+			WritePtr32( &(*lodLevelData), out );
 		} else {
 			if ( lodLevelData != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(lodLevelData) )->second, out, info );
diff --git a/src/obj/NiLookAtController.cpp b/src/obj/NiLookAtController.cpp
index 018e5f52..36a33b76 100644
--- a/src/obj/NiLookAtController.cpp
+++ b/src/obj/NiLookAtController.cpp
@@ -63,7 +63,7 @@ void NiLookAtController::Write( ostream& out, const map<NiObjectRef,unsigned int
 		NifStream( unknown1, out, info );
 	};
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*lookAtNode), out, info );
+		WritePtr32( &(*lookAtNode), out );
 	} else {
 		if ( lookAtNode != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(lookAtNode) )->second, out, info );
diff --git a/src/obj/NiLookAtInterpolator.cpp b/src/obj/NiLookAtInterpolator.cpp
index de593be1..d2fdae59 100644
--- a/src/obj/NiLookAtInterpolator.cpp
+++ b/src/obj/NiLookAtInterpolator.cpp
@@ -71,7 +71,7 @@ void NiLookAtInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned i
 	NiInterpolator::Write( out, link_map, info );
 	NifStream( unknownShort, out, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*lookAt), out, info );
+		WritePtr32( &(*lookAt), out );
 	} else {
 		if ( lookAt != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(lookAt) )->second, out, info );
@@ -84,7 +84,7 @@ void NiLookAtInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned i
 	NifStream( rotation, out, info );
 	NifStream( scale, out, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*unknownLink1), out, info );
+		WritePtr32( &(*unknownLink1), out );
 	} else {
 		if ( unknownLink1 != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(unknownLink1) )->second, out, info );
@@ -93,7 +93,7 @@ void NiLookAtInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned i
 		}
 	}
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*unknownLink2), out, info );
+		WritePtr32( &(*unknownLink2), out );
 	} else {
 		if ( unknownLink2 != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(unknownLink2) )->second, out, info );
@@ -102,7 +102,7 @@ void NiLookAtInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned i
 		}
 	}
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*unknownLink3), out, info );
+		WritePtr32( &(*unknownLink3), out );
 	} else {
 		if ( unknownLink3 != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(unknownLink3) )->second, out, info );
diff --git a/src/obj/NiMeshPSysData.cpp b/src/obj/NiMeshPSysData.cpp
index 0a37c35a..3a5afe99 100644
--- a/src/obj/NiMeshPSysData.cpp
+++ b/src/obj/NiMeshPSysData.cpp
@@ -75,7 +75,7 @@ void NiMeshPSysData::Write( ostream& out, const map<NiObjectRef,unsigned int> &
 		};
 	};
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*unknownNode), out, info );
+		WritePtr32( &(*unknownNode), out );
 	} else {
 		if ( unknownNode != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(unknownNode) )->second, out, info );
diff --git a/src/obj/NiMorpherController.cpp b/src/obj/NiMorpherController.cpp
index 6bd6569b..8301877c 100644
--- a/src/obj/NiMorpherController.cpp
+++ b/src/obj/NiMorpherController.cpp
@@ -63,7 +63,7 @@ void NiMorpherController::Write( ostream& out, const map<NiObjectRef,unsigned in
 
 	NiInterpController::Write( out, link_map, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*data), out, info );
+		WritePtr32( &(*data), out );
 	} else {
 		if ( data != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
diff --git a/src/obj/NiMultiTargetTransformController.cpp b/src/obj/NiMultiTargetTransformController.cpp
index 1daceba7..438ce64a 100644
--- a/src/obj/NiMultiTargetTransformController.cpp
+++ b/src/obj/NiMultiTargetTransformController.cpp
@@ -65,7 +65,7 @@ void NiMultiTargetTransformController::Write( ostream& out, const map<NiObjectRe
 	NifStream( numExtraTargets, out, info );
 	for (unsigned int i1 = 0; i1 < extraTargets.size(); i1++) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*extraTargets[i1]), out, info );
+			WritePtr32( &(*extraTargets[i1]), out );
 		} else {
 			if ( extraTargets[i1] != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(extraTargets[i1]) )->second, out, info );
diff --git a/src/obj/NiMultiTextureProperty.cpp b/src/obj/NiMultiTextureProperty.cpp
index df34746a..174343c5 100644
--- a/src/obj/NiMultiTextureProperty.cpp
+++ b/src/obj/NiMultiTextureProperty.cpp
@@ -84,7 +84,7 @@ void NiMultiTextureProperty::Write( ostream& out, const map<NiObjectRef,unsigned
 		NifStream( textureElements[i1].hasImage, out, info );
 		if ( textureElements[i1].hasImage ) {
 			if ( info.version < VER_3_3_0_13 ) {
-				NifStream( (unsigned int)&(*textureElements[i1].image), out, info );
+				WritePtr32( &(*textureElements[i1].image), out );
 			} else {
 				if ( textureElements[i1].image != NULL ) {
 					NifStream( link_map.find( StaticCast<NiObject>(textureElements[i1].image) )->second, out, info );
diff --git a/src/obj/NiNode.cpp b/src/obj/NiNode.cpp
index f615597d..8b134e09 100644
--- a/src/obj/NiNode.cpp
+++ b/src/obj/NiNode.cpp
@@ -88,7 +88,7 @@ void NiNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map
 	NifStream( numChildren, out, info );
 	for (unsigned int i1 = 0; i1 < children.size(); i1++) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*children[i1]), out, info );
+			WritePtr32( &(*children[i1]), out );
 		} else {
 			if ( children[i1] != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(children[i1]) )->second, out, info );
@@ -100,7 +100,7 @@ void NiNode::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map
 	NifStream( numEffects, out, info );
 	for (unsigned int i1 = 0; i1 < effects.size(); i1++) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*effects[i1]), out, info );
+			WritePtr32( &(*effects[i1]), out );
 		} else {
 			if ( effects[i1] != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(effects[i1]) )->second, out, info );
diff --git a/src/obj/NiObjectNET.cpp b/src/obj/NiObjectNET.cpp
index 63bff664..a5258590 100644
--- a/src/obj/NiObjectNET.cpp
+++ b/src/obj/NiObjectNET.cpp
@@ -99,7 +99,7 @@ void NiObjectNET::Write( ostream& out, const map<NiObjectRef,unsigned int> & lin
 	};
 	if ( ( info.version >= 0x03000000 ) && ( info.version <= 0x04020200 ) ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*extraData), out, info );
+			WritePtr32( &(*extraData), out );
 		} else {
 			if ( extraData != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(extraData) )->second, out, info );
@@ -112,7 +112,7 @@ void NiObjectNET::Write( ostream& out, const map<NiObjectRef,unsigned int> & lin
 		NifStream( numExtraDataList, out, info );
 		for (unsigned int i2 = 0; i2 < extraDataList.size(); i2++) {
 			if ( info.version < VER_3_3_0_13 ) {
-				NifStream( (unsigned int)&(*extraDataList[i2]), out, info );
+				WritePtr32( &(*extraDataList[i2]), out );
 			} else {
 				if ( extraDataList[i2] != NULL ) {
 					NifStream( link_map.find( StaticCast<NiObject>(extraDataList[i2]) )->second, out, info );
@@ -124,7 +124,7 @@ void NiObjectNET::Write( ostream& out, const map<NiObjectRef,unsigned int> & lin
 	};
 	if ( info.version >= 0x03000000 ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*controller), out, info );
+			WritePtr32( &(*controller), out );
 		} else {
 			if ( controller != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(controller) )->second, out, info );
diff --git a/src/obj/NiPSysAgeDeathModifier.cpp b/src/obj/NiPSysAgeDeathModifier.cpp
index 0580ecd3..e154697c 100644
--- a/src/obj/NiPSysAgeDeathModifier.cpp
+++ b/src/obj/NiPSysAgeDeathModifier.cpp
@@ -59,7 +59,7 @@ void NiPSysAgeDeathModifier::Write( ostream& out, const map<NiObjectRef,unsigned
 	NiPSysModifier::Write( out, link_map, info );
 	NifStream( spawnOnDeath, out, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*spawnModifier), out, info );
+		WritePtr32( &(*spawnModifier), out );
 	} else {
 		if ( spawnModifier != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(spawnModifier) )->second, out, info );
diff --git a/src/obj/NiPSysBombModifier.cpp b/src/obj/NiPSysBombModifier.cpp
index d50920e9..b169f346 100644
--- a/src/obj/NiPSysBombModifier.cpp
+++ b/src/obj/NiPSysBombModifier.cpp
@@ -62,7 +62,7 @@ void NiPSysBombModifier::Write( ostream& out, const map<NiObjectRef,unsigned int
 
 	NiPSysModifier::Write( out, link_map, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*bombObject), out, info );
+		WritePtr32( &(*bombObject), out );
 	} else {
 		if ( bombObject != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(bombObject) )->second, out, info );
diff --git a/src/obj/NiPSysCollider.cpp b/src/obj/NiPSysCollider.cpp
index c8ee6096..cf88ff11 100644
--- a/src/obj/NiPSysCollider.cpp
+++ b/src/obj/NiPSysCollider.cpp
@@ -71,7 +71,7 @@ void NiPSysCollider::Write( ostream& out, const map<NiObjectRef,unsigned int> &
 	NifStream( spawnOnCollide, out, info );
 	NifStream( dieOnCollide, out, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*spawnModifier), out, info );
+		WritePtr32( &(*spawnModifier), out );
 	} else {
 		if ( spawnModifier != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(spawnModifier) )->second, out, info );
@@ -80,7 +80,7 @@ void NiPSysCollider::Write( ostream& out, const map<NiObjectRef,unsigned int> &
 		}
 	}
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*parent), out, info );
+		WritePtr32( &(*parent), out );
 	} else {
 		if ( parent != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(parent) )->second, out, info );
@@ -89,7 +89,7 @@ void NiPSysCollider::Write( ostream& out, const map<NiObjectRef,unsigned int> &
 		}
 	}
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*nextCollider), out, info );
+		WritePtr32( &(*nextCollider), out );
 	} else {
 		if ( nextCollider != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(nextCollider) )->second, out, info );
@@ -98,7 +98,7 @@ void NiPSysCollider::Write( ostream& out, const map<NiObjectRef,unsigned int> &
 		}
 	}
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*colliderObject), out, info );
+		WritePtr32( &(*colliderObject), out );
 	} else {
 		if ( colliderObject != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(colliderObject) )->second, out, info );
diff --git a/src/obj/NiPSysColliderManager.cpp b/src/obj/NiPSysColliderManager.cpp
index 053cc611..f98c95b7 100644
--- a/src/obj/NiPSysColliderManager.cpp
+++ b/src/obj/NiPSysColliderManager.cpp
@@ -57,7 +57,7 @@ void NiPSysColliderManager::Write( ostream& out, const map<NiObjectRef,unsigned
 
 	NiPSysModifier::Write( out, link_map, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*collider), out, info );
+		WritePtr32( &(*collider), out );
 	} else {
 		if ( collider != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(collider) )->second, out, info );
diff --git a/src/obj/NiPSysColorModifier.cpp b/src/obj/NiPSysColorModifier.cpp
index e674f39c..a07c63c2 100644
--- a/src/obj/NiPSysColorModifier.cpp
+++ b/src/obj/NiPSysColorModifier.cpp
@@ -57,7 +57,7 @@ void NiPSysColorModifier::Write( ostream& out, const map<NiObjectRef,unsigned in
 
 	NiPSysModifier::Write( out, link_map, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*data), out, info );
+		WritePtr32( &(*data), out );
 	} else {
 		if ( data != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
diff --git a/src/obj/NiPSysDragModifier.cpp b/src/obj/NiPSysDragModifier.cpp
index 1fd8e0b7..67e7cf4d 100644
--- a/src/obj/NiPSysDragModifier.cpp
+++ b/src/obj/NiPSysDragModifier.cpp
@@ -61,7 +61,7 @@ void NiPSysDragModifier::Write( ostream& out, const map<NiObjectRef,unsigned int
 
 	NiPSysModifier::Write( out, link_map, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*parent), out, info );
+		WritePtr32( &(*parent), out );
 	} else {
 		if ( parent != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(parent) )->second, out, info );
diff --git a/src/obj/NiPSysEmitterCtlr.cpp b/src/obj/NiPSysEmitterCtlr.cpp
index c28a6d1a..8d741142 100644
--- a/src/obj/NiPSysEmitterCtlr.cpp
+++ b/src/obj/NiPSysEmitterCtlr.cpp
@@ -65,7 +65,7 @@ void NiPSysEmitterCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int>
 	NiPSysModifierCtlr::Write( out, link_map, info );
 	if ( info.version <= 0x0A010000 ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*data), out, info );
+			WritePtr32( &(*data), out );
 		} else {
 			if ( data != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
@@ -76,7 +76,7 @@ void NiPSysEmitterCtlr::Write( ostream& out, const map<NiObjectRef,unsigned int>
 	};
 	if ( info.version >= 0x0A020000 ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*visibilityInterpolator), out, info );
+			WritePtr32( &(*visibilityInterpolator), out );
 		} else {
 			if ( visibilityInterpolator != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(visibilityInterpolator) )->second, out, info );
diff --git a/src/obj/NiPSysFieldModifier.cpp b/src/obj/NiPSysFieldModifier.cpp
index 78063f45..31d03f7d 100644
--- a/src/obj/NiPSysFieldModifier.cpp
+++ b/src/obj/NiPSysFieldModifier.cpp
@@ -67,7 +67,7 @@ void NiPSysFieldModifier::Write( ostream& out, const map<NiObjectRef,unsigned in
 
 	NiPSysModifier::Write( out, link_map, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*fieldObject), out, info );
+		WritePtr32( &(*fieldObject), out );
 	} else {
 		if ( fieldObject != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(fieldObject) )->second, out, info );
diff --git a/src/obj/NiPSysGravityModifier.cpp b/src/obj/NiPSysGravityModifier.cpp
index ec936e06..7ae2420a 100644
--- a/src/obj/NiPSysGravityModifier.cpp
+++ b/src/obj/NiPSysGravityModifier.cpp
@@ -66,7 +66,7 @@ void NiPSysGravityModifier::Write( ostream& out, const map<NiObjectRef,unsigned
 
 	NiPSysModifier::Write( out, link_map, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*gravityObject), out, info );
+		WritePtr32( &(*gravityObject), out );
 	} else {
 		if ( gravityObject != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(gravityObject) )->second, out, info );
diff --git a/src/obj/NiPSysMeshEmitter.cpp b/src/obj/NiPSysMeshEmitter.cpp
index 2bde0839..ec4e738e 100644
--- a/src/obj/NiPSysMeshEmitter.cpp
+++ b/src/obj/NiPSysMeshEmitter.cpp
@@ -67,7 +67,7 @@ void NiPSysMeshEmitter::Write( ostream& out, const map<NiObjectRef,unsigned int>
 	NifStream( numEmitterMeshes, out, info );
 	for (unsigned int i1 = 0; i1 < emitterMeshes.size(); i1++) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*emitterMeshes[i1]), out, info );
+			WritePtr32( &(*emitterMeshes[i1]), out );
 		} else {
 			if ( emitterMeshes[i1] != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(emitterMeshes[i1]) )->second, out, info );
diff --git a/src/obj/NiPSysMeshUpdateModifier.cpp b/src/obj/NiPSysMeshUpdateModifier.cpp
index edd51c7a..01356c8a 100644
--- a/src/obj/NiPSysMeshUpdateModifier.cpp
+++ b/src/obj/NiPSysMeshUpdateModifier.cpp
@@ -64,7 +64,7 @@ void NiPSysMeshUpdateModifier::Write( ostream& out, const map<NiObjectRef,unsign
 	NifStream( numMeshes, out, info );
 	for (unsigned int i1 = 0; i1 < meshes.size(); i1++) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*meshes[i1]), out, info );
+			WritePtr32( &(*meshes[i1]), out );
 		} else {
 			if ( meshes[i1] != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(meshes[i1]) )->second, out, info );
diff --git a/src/obj/NiPSysModifier.cpp b/src/obj/NiPSysModifier.cpp
index 7353b096..cc91f987 100644
--- a/src/obj/NiPSysModifier.cpp
+++ b/src/obj/NiPSysModifier.cpp
@@ -62,7 +62,7 @@ void NiPSysModifier::Write( ostream& out, const map<NiObjectRef,unsigned int> &
 	NifStream( name, out, info );
 	NifStream( order, out, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*target), out, info );
+		WritePtr32( &(*target), out );
 	} else {
 		if ( target != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(target) )->second, out, info );
diff --git a/src/obj/NiPSysModifierActiveCtlr.cpp b/src/obj/NiPSysModifierActiveCtlr.cpp
index 80c2849a..69caadc4 100644
--- a/src/obj/NiPSysModifierActiveCtlr.cpp
+++ b/src/obj/NiPSysModifierActiveCtlr.cpp
@@ -60,7 +60,7 @@ void NiPSysModifierActiveCtlr::Write( ostream& out, const map<NiObjectRef,unsign
 	NiPSysModifierBoolCtlr::Write( out, link_map, info );
 	if ( info.version <= 0x0A010000 ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*data), out, info );
+			WritePtr32( &(*data), out );
 		} else {
 			if ( data != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
diff --git a/src/obj/NiPSysModifierFloatCtlr.cpp b/src/obj/NiPSysModifierFloatCtlr.cpp
index 0627fb15..606227a0 100644
--- a/src/obj/NiPSysModifierFloatCtlr.cpp
+++ b/src/obj/NiPSysModifierFloatCtlr.cpp
@@ -60,7 +60,7 @@ void NiPSysModifierFloatCtlr::Write( ostream& out, const map<NiObjectRef,unsigne
 	NiPSysModifierCtlr::Write( out, link_map, info );
 	if ( info.version <= 0x0A010000 ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*data), out, info );
+			WritePtr32( &(*data), out );
 		} else {
 			if ( data != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
diff --git a/src/obj/NiPSysVolumeEmitter.cpp b/src/obj/NiPSysVolumeEmitter.cpp
index 694572d4..c22e5ca5 100644
--- a/src/obj/NiPSysVolumeEmitter.cpp
+++ b/src/obj/NiPSysVolumeEmitter.cpp
@@ -60,7 +60,7 @@ void NiPSysVolumeEmitter::Write( ostream& out, const map<NiObjectRef,unsigned in
 	NiPSysEmitter::Write( out, link_map, info );
 	if ( info.version >= 0x0A010000 ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*emitterObject), out, info );
+			WritePtr32( &(*emitterObject), out );
 		} else {
 			if ( emitterObject != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(emitterObject) )->second, out, info );
diff --git a/src/obj/NiParticleColorModifier.cpp b/src/obj/NiParticleColorModifier.cpp
index 1a9ac7bb..d02de0da 100644
--- a/src/obj/NiParticleColorModifier.cpp
+++ b/src/obj/NiParticleColorModifier.cpp
@@ -57,7 +57,7 @@ void NiParticleColorModifier::Write( ostream& out, const map<NiObjectRef,unsigne
 
 	NiParticleModifier::Write( out, link_map, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*colorData), out, info );
+		WritePtr32( &(*colorData), out );
 	} else {
 		if ( colorData != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(colorData) )->second, out, info );
diff --git a/src/obj/NiParticleMeshModifier.cpp b/src/obj/NiParticleMeshModifier.cpp
index 2179fb92..a5ccfcea 100644
--- a/src/obj/NiParticleMeshModifier.cpp
+++ b/src/obj/NiParticleMeshModifier.cpp
@@ -64,7 +64,7 @@ void NiParticleMeshModifier::Write( ostream& out, const map<NiObjectRef,unsigned
 	NifStream( numParticleMeshes, out, info );
 	for (unsigned int i1 = 0; i1 < particleMeshes.size(); i1++) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*particleMeshes[i1]), out, info );
+			WritePtr32( &(*particleMeshes[i1]), out );
 		} else {
 			if ( particleMeshes[i1] != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(particleMeshes[i1]) )->second, out, info );
diff --git a/src/obj/NiParticleMeshesData.cpp b/src/obj/NiParticleMeshesData.cpp
index d20ff243..b85bf1a0 100644
--- a/src/obj/NiParticleMeshesData.cpp
+++ b/src/obj/NiParticleMeshesData.cpp
@@ -57,7 +57,7 @@ void NiParticleMeshesData::Write( ostream& out, const map<NiObjectRef,unsigned i
 
 	NiRotatingParticlesData::Write( out, link_map, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*unknownLink2), out, info );
+		WritePtr32( &(*unknownLink2), out );
 	} else {
 		if ( unknownLink2 != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(unknownLink2) )->second, out, info );
diff --git a/src/obj/NiParticleModifier.cpp b/src/obj/NiParticleModifier.cpp
index 7d81b33f..23843056 100644
--- a/src/obj/NiParticleModifier.cpp
+++ b/src/obj/NiParticleModifier.cpp
@@ -67,7 +67,7 @@ void NiParticleModifier::Write( ostream& out, const map<NiObjectRef,unsigned int
 
 	NiObject::Write( out, link_map, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*nextModifier), out, info );
+		WritePtr32( &(*nextModifier), out );
 	} else {
 		if ( nextModifier != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(nextModifier) )->second, out, info );
@@ -77,7 +77,7 @@ void NiParticleModifier::Write( ostream& out, const map<NiObjectRef,unsigned int
 	}
 	if ( info.version >= 0x04000002 ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*controller), out, info );
+			WritePtr32( &(*controller), out );
 		} else {
 			if ( controller != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(controller) )->second, out, info );
diff --git a/src/obj/NiParticleSystem.cpp b/src/obj/NiParticleSystem.cpp
index 2bc2aa6a..bf06aba3 100644
--- a/src/obj/NiParticleSystem.cpp
+++ b/src/obj/NiParticleSystem.cpp
@@ -69,7 +69,7 @@ void NiParticleSystem::Write( ostream& out, const map<NiObjectRef,unsigned int>
 		NifStream( numModifiers, out, info );
 		for (unsigned int i2 = 0; i2 < modifiers.size(); i2++) {
 			if ( info.version < VER_3_3_0_13 ) {
-				NifStream( (unsigned int)&(*modifiers[i2]), out, info );
+				WritePtr32( &(*modifiers[i2]), out );
 			} else {
 				if ( modifiers[i2] != NULL ) {
 					NifStream( link_map.find( StaticCast<NiObject>(modifiers[i2]) )->second, out, info );
diff --git a/src/obj/NiParticleSystemController.cpp b/src/obj/NiParticleSystemController.cpp
index 16154484..68fcc6fa 100644
--- a/src/obj/NiParticleSystemController.cpp
+++ b/src/obj/NiParticleSystemController.cpp
@@ -173,7 +173,7 @@ void NiParticleSystemController::Write( ostream& out, const map<NiObjectRef,unsi
 	};
 	NifStream( startRandom, out, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*emitter), out, info );
+		WritePtr32( &(*emitter), out );
 	} else {
 		if ( emitter != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(emitter) )->second, out, info );
@@ -193,7 +193,7 @@ void NiParticleSystemController::Write( ostream& out, const map<NiObjectRef,unsi
 		NifStream( particleUnknownVector, out, info );
 		NifStream( particleLifetime, out, info );
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*particleLink), out, info );
+			WritePtr32( &(*particleLink), out );
 		} else {
 			if ( particleLink != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(particleLink) )->second, out, info );
@@ -218,7 +218,7 @@ void NiParticleSystemController::Write( ostream& out, const map<NiObjectRef,unsi
 			NifStream( particles[i2].vertexId, out, info );
 		};
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*unknownLink), out, info );
+			WritePtr32( &(*unknownLink), out );
 		} else {
 			if ( unknownLink != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, info );
@@ -228,7 +228,7 @@ void NiParticleSystemController::Write( ostream& out, const map<NiObjectRef,unsi
 		}
 	};
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*particleExtra), out, info );
+		WritePtr32( &(*particleExtra), out );
 	} else {
 		if ( particleExtra != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(particleExtra) )->second, out, info );
@@ -237,7 +237,7 @@ void NiParticleSystemController::Write( ostream& out, const map<NiObjectRef,unsi
 		}
 	}
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*unknownLink2), out, info );
+		WritePtr32( &(*unknownLink2), out );
 	} else {
 		if ( unknownLink2 != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(unknownLink2) )->second, out, info );
@@ -250,7 +250,7 @@ void NiParticleSystemController::Write( ostream& out, const map<NiObjectRef,unsi
 	};
 	if ( info.version <= 0x03010000 ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*colorData), out, info );
+			WritePtr32( &(*colorData), out );
 		} else {
 			if ( colorData != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(colorData) )->second, out, info );
diff --git a/src/obj/NiParticlesData.cpp b/src/obj/NiParticlesData.cpp
index 107b7cd4..462346a9 100644
--- a/src/obj/NiParticlesData.cpp
+++ b/src/obj/NiParticlesData.cpp
@@ -270,7 +270,7 @@ void NiParticlesData::Write( ostream& out, const map<NiObjectRef,unsigned int> &
 	};
 	if ( info.version >= 0x14000004 ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*additionalData), out, info );
+			WritePtr32( &(*additionalData), out );
 		} else {
 			if ( additionalData != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(additionalData) )->second, out, info );
diff --git a/src/obj/NiPathController.cpp b/src/obj/NiPathController.cpp
index 066c9fd2..92273d16 100644
--- a/src/obj/NiPathController.cpp
+++ b/src/obj/NiPathController.cpp
@@ -74,7 +74,7 @@ void NiPathController::Write( ostream& out, const map<NiObjectRef,unsigned int>
 	NifStream( unknownFloat3, out, info );
 	NifStream( unknownShort, out, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*posData), out, info );
+		WritePtr32( &(*posData), out );
 	} else {
 		if ( posData != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(posData) )->second, out, info );
@@ -83,7 +83,7 @@ void NiPathController::Write( ostream& out, const map<NiObjectRef,unsigned int>
 		}
 	}
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*floatData), out, info );
+		WritePtr32( &(*floatData), out );
 	} else {
 		if ( floatData != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(floatData) )->second, out, info );
diff --git a/src/obj/NiPathInterpolator.cpp b/src/obj/NiPathInterpolator.cpp
index bb8f2737..63015d29 100644
--- a/src/obj/NiPathInterpolator.cpp
+++ b/src/obj/NiPathInterpolator.cpp
@@ -70,7 +70,7 @@ void NiPathInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int
 	NifStream( unknownFloat2, out, info );
 	NifStream( unknownShort2, out, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*posData), out, info );
+		WritePtr32( &(*posData), out );
 	} else {
 		if ( posData != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(posData) )->second, out, info );
@@ -79,7 +79,7 @@ void NiPathInterpolator::Write( ostream& out, const map<NiObjectRef,unsigned int
 		}
 	}
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*floatData), out, info );
+		WritePtr32( &(*floatData), out );
 	} else {
 		if ( floatData != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(floatData) )->second, out, info );
diff --git a/src/obj/NiPhysXActorDesc.cpp b/src/obj/NiPhysXActorDesc.cpp
index d67a8a13..daa8987d 100644
--- a/src/obj/NiPhysXActorDesc.cpp
+++ b/src/obj/NiPhysXActorDesc.cpp
@@ -92,7 +92,7 @@ void NiPhysXActorDesc::Write( ostream& out, const map<NiObjectRef,unsigned int>
 	NifStream( unknownQuat2, out, info );
 	NifStream( unknownQuat3, out, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*unknownRef0), out, info );
+		WritePtr32( &(*unknownRef0), out );
 	} else {
 		if ( unknownRef0 != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(unknownRef0) )->second, out, info );
@@ -106,7 +106,7 @@ void NiPhysXActorDesc::Write( ostream& out, const map<NiObjectRef,unsigned int>
 	NifStream( unknownByte2, out, info );
 	NifStream( unknownInt6, out, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*shapeDescription), out, info );
+		WritePtr32( &(*shapeDescription), out );
 	} else {
 		if ( shapeDescription != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(shapeDescription) )->second, out, info );
@@ -115,7 +115,7 @@ void NiPhysXActorDesc::Write( ostream& out, const map<NiObjectRef,unsigned int>
 		}
 	}
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*unknownRef1), out, info );
+		WritePtr32( &(*unknownRef1), out );
 	} else {
 		if ( unknownRef1 != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(unknownRef1) )->second, out, info );
@@ -124,7 +124,7 @@ void NiPhysXActorDesc::Write( ostream& out, const map<NiObjectRef,unsigned int>
 		}
 	}
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*unknownRef2), out, info );
+		WritePtr32( &(*unknownRef2), out );
 	} else {
 		if ( unknownRef2 != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(unknownRef2) )->second, out, info );
@@ -134,7 +134,7 @@ void NiPhysXActorDesc::Write( ostream& out, const map<NiObjectRef,unsigned int>
 	}
 	for (unsigned int i1 = 0; i1 < unknownRefs3.size(); i1++) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*unknownRefs3[i1]), out, info );
+			WritePtr32( &(*unknownRefs3[i1]), out );
 		} else {
 			if ( unknownRefs3[i1] != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(unknownRefs3[i1]) )->second, out, info );
diff --git a/src/obj/NiPhysXProp.cpp b/src/obj/NiPhysXProp.cpp
index 838b4095..649c55e8 100644
--- a/src/obj/NiPhysXProp.cpp
+++ b/src/obj/NiPhysXProp.cpp
@@ -84,7 +84,7 @@ void NiPhysXProp::Write( ostream& out, const map<NiObjectRef,unsigned int> & lin
 	NifStream( unknownInt1, out, info );
 	for (unsigned int i1 = 0; i1 < unknownRefs1.size(); i1++) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*unknownRefs1[i1]), out, info );
+			WritePtr32( &(*unknownRefs1[i1]), out );
 		} else {
 			if ( unknownRefs1[i1] != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(unknownRefs1[i1]) )->second, out, info );
@@ -96,7 +96,7 @@ void NiPhysXProp::Write( ostream& out, const map<NiObjectRef,unsigned int> & lin
 	NifStream( numDests, out, info );
 	for (unsigned int i1 = 0; i1 < transformDests.size(); i1++) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*transformDests[i1]), out, info );
+			WritePtr32( &(*transformDests[i1]), out );
 		} else {
 			if ( transformDests[i1] != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(transformDests[i1]) )->second, out, info );
@@ -107,7 +107,7 @@ void NiPhysXProp::Write( ostream& out, const map<NiObjectRef,unsigned int> & lin
 	};
 	NifStream( unknownByte, out, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*propDescription), out, info );
+		WritePtr32( &(*propDescription), out );
 	} else {
 		if ( propDescription != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(propDescription) )->second, out, info );
diff --git a/src/obj/NiPhysXPropDesc.cpp b/src/obj/NiPhysXPropDesc.cpp
index a0266c0b..d205aaf2 100644
--- a/src/obj/NiPhysXPropDesc.cpp
+++ b/src/obj/NiPhysXPropDesc.cpp
@@ -91,7 +91,7 @@ void NiPhysXPropDesc::Write( ostream& out, const map<NiObjectRef,unsigned int> &
 	NifStream( numDests, out, info );
 	for (unsigned int i1 = 0; i1 < actorDescs.size(); i1++) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*actorDescs[i1]), out, info );
+			WritePtr32( &(*actorDescs[i1]), out );
 		} else {
 			if ( actorDescs[i1] != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(actorDescs[i1]) )->second, out, info );
@@ -103,7 +103,7 @@ void NiPhysXPropDesc::Write( ostream& out, const map<NiObjectRef,unsigned int> &
 	NifStream( numJoints, out, info );
 	for (unsigned int i1 = 0; i1 < jointDescs.size(); i1++) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*jointDescs[i1]), out, info );
+			WritePtr32( &(*jointDescs[i1]), out );
 		} else {
 			if ( jointDescs[i1] != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(jointDescs[i1]) )->second, out, info );
@@ -118,7 +118,7 @@ void NiPhysXPropDesc::Write( ostream& out, const map<NiObjectRef,unsigned int> &
 		NifStream( materialDescs[i1].number, out, info );
 		NifStream( materialDescs[i1].unknownByte1, out, info );
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*materialDescs[i1].materialDesc), out, info );
+			WritePtr32( &(*materialDescs[i1].materialDesc), out );
 		} else {
 			if ( materialDescs[i1].materialDesc != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(materialDescs[i1].materialDesc) )->second, out, info );
diff --git a/src/obj/NiPhysXShapeDesc.cpp b/src/obj/NiPhysXShapeDesc.cpp
index 9bcb6b5c..c6f0f7ee 100644
--- a/src/obj/NiPhysXShapeDesc.cpp
+++ b/src/obj/NiPhysXShapeDesc.cpp
@@ -103,7 +103,7 @@ void NiPhysXShapeDesc::Write( ostream& out, const map<NiObjectRef,unsigned int>
 		};
 	};
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*meshDescription), out, info );
+		WritePtr32( &(*meshDescription), out );
 	} else {
 		if ( meshDescription != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(meshDescription) )->second, out, info );
diff --git a/src/obj/NiPhysXTransformDest.cpp b/src/obj/NiPhysXTransformDest.cpp
index e3f5b15c..cac97e3a 100644
--- a/src/obj/NiPhysXTransformDest.cpp
+++ b/src/obj/NiPhysXTransformDest.cpp
@@ -67,7 +67,7 @@ void NiPhysXTransformDest::Write( ostream& out, const map<NiObjectRef,unsigned i
 	NifStream( unknownByte1, out, info );
 	NifStream( unknownByte2, out, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*node), out, info );
+		WritePtr32( &(*node), out );
 	} else {
 		if ( node != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(node) )->second, out, info );
diff --git a/src/obj/NiPoint3InterpController.cpp b/src/obj/NiPoint3InterpController.cpp
index 7855f6e3..79ba0105 100644
--- a/src/obj/NiPoint3InterpController.cpp
+++ b/src/obj/NiPoint3InterpController.cpp
@@ -66,7 +66,7 @@ void NiPoint3InterpController::Write( ostream& out, const map<NiObjectRef,unsign
 	};
 	if ( info.version <= 0x0A010000 ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*data), out, info );
+			WritePtr32( &(*data), out );
 		} else {
 			if ( data != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
diff --git a/src/obj/NiPoint3Interpolator.cpp b/src/obj/NiPoint3Interpolator.cpp
index cb079254..7b68466b 100644
--- a/src/obj/NiPoint3Interpolator.cpp
+++ b/src/obj/NiPoint3Interpolator.cpp
@@ -59,7 +59,7 @@ void NiPoint3Interpolator::Write( ostream& out, const map<NiObjectRef,unsigned i
 	NiKeyBasedInterpolator::Write( out, link_map, info );
 	NifStream( point3Value, out, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*data), out, info );
+		WritePtr32( &(*data), out );
 	} else {
 		if ( data != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
diff --git a/src/obj/NiPortal.cpp b/src/obj/NiPortal.cpp
index 8ec611fe..21276f07 100644
--- a/src/obj/NiPortal.cpp
+++ b/src/obj/NiPortal.cpp
@@ -77,7 +77,7 @@ void NiPortal::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_m
 		NifStream( vertices[i1], out, info );
 	};
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*target), out, info );
+		WritePtr32( &(*target), out );
 	} else {
 		if ( target != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(target) )->second, out, info );
diff --git a/src/obj/NiRollController.cpp b/src/obj/NiRollController.cpp
index aaae4c44..4dc79c7d 100644
--- a/src/obj/NiRollController.cpp
+++ b/src/obj/NiRollController.cpp
@@ -57,7 +57,7 @@ void NiRollController::Write( ostream& out, const map<NiObjectRef,unsigned int>
 
 	NiSingleInterpController::Write( out, link_map, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*data), out, info );
+		WritePtr32( &(*data), out );
 	} else {
 		if ( data != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
diff --git a/src/obj/NiRoom.cpp b/src/obj/NiRoom.cpp
index 309fbd81..9c7f13c5 100644
--- a/src/obj/NiRoom.cpp
+++ b/src/obj/NiRoom.cpp
@@ -95,7 +95,7 @@ void NiRoom::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map
 	NifStream( numInPortals, out, info );
 	for (unsigned int i1 = 0; i1 < inPortals.size(); i1++) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*inPortals[i1]), out, info );
+			WritePtr32( &(*inPortals[i1]), out );
 		} else {
 			if ( inPortals[i1] != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(inPortals[i1]) )->second, out, info );
@@ -107,7 +107,7 @@ void NiRoom::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map
 	NifStream( numPortals2, out, info );
 	for (unsigned int i1 = 0; i1 < portals2.size(); i1++) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*portals2[i1]), out, info );
+			WritePtr32( &(*portals2[i1]), out );
 		} else {
 			if ( portals2[i1] != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(portals2[i1]) )->second, out, info );
@@ -119,7 +119,7 @@ void NiRoom::Write( ostream& out, const map<NiObjectRef,unsigned int> & link_map
 	NifStream( numItems, out, info );
 	for (unsigned int i1 = 0; i1 < items.size(); i1++) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*items[i1]), out, info );
+			WritePtr32( &(*items[i1]), out );
 		} else {
 			if ( items[i1] != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(items[i1]) )->second, out, info );
diff --git a/src/obj/NiRoomGroup.cpp b/src/obj/NiRoomGroup.cpp
index b06bdfd2..09049045 100644
--- a/src/obj/NiRoomGroup.cpp
+++ b/src/obj/NiRoomGroup.cpp
@@ -71,7 +71,7 @@ void NiRoomGroup::Write( ostream& out, const map<NiObjectRef,unsigned int> & lin
 	NiNode::Write( out, link_map, info );
 	numRooms = (int)(rooms.size());
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*shellLink), out, info );
+		WritePtr32( &(*shellLink), out );
 	} else {
 		if ( shellLink != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(shellLink) )->second, out, info );
@@ -82,7 +82,7 @@ void NiRoomGroup::Write( ostream& out, const map<NiObjectRef,unsigned int> & lin
 	NifStream( numRooms, out, info );
 	for (unsigned int i1 = 0; i1 < rooms.size(); i1++) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*rooms[i1]), out, info );
+			WritePtr32( &(*rooms[i1]), out );
 		} else {
 			if ( rooms[i1] != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(rooms[i1]) )->second, out, info );
diff --git a/src/obj/NiSequence.cpp b/src/obj/NiSequence.cpp
index 3507645e..9ced8c3c 100644
--- a/src/obj/NiSequence.cpp
+++ b/src/obj/NiSequence.cpp
@@ -145,7 +145,7 @@ void NiSequence::Write( ostream& out, const map<NiObjectRef,unsigned int> & link
 	if ( info.version <= 0x0A010000 ) {
 		NifStream( textKeysName, out, info );
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*textKeys), out, info );
+			WritePtr32( &(*textKeys), out );
 		} else {
 			if ( textKeys != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(textKeys) )->second, out, info );
@@ -162,7 +162,7 @@ void NiSequence::Write( ostream& out, const map<NiObjectRef,unsigned int> & link
 		if ( info.version <= 0x0A010000 ) {
 			NifStream( controlledBlocks[i1].targetName, out, info );
 			if ( info.version < VER_3_3_0_13 ) {
-				NifStream( (unsigned int)&(*controlledBlocks[i1].controller), out, info );
+				WritePtr32( &(*controlledBlocks[i1].controller), out );
 			} else {
 				if ( controlledBlocks[i1].controller != NULL ) {
 					NifStream( link_map.find( StaticCast<NiObject>(controlledBlocks[i1].controller) )->second, out, info );
@@ -173,7 +173,7 @@ void NiSequence::Write( ostream& out, const map<NiObjectRef,unsigned int> & link
 		};
 		if ( info.version >= 0x0A01006A ) {
 			if ( info.version < VER_3_3_0_13 ) {
-				NifStream( (unsigned int)&(*controlledBlocks[i1].interpolator), out, info );
+				WritePtr32( &(*controlledBlocks[i1].interpolator), out );
 			} else {
 				if ( controlledBlocks[i1].interpolator != NULL ) {
 					NifStream( link_map.find( StaticCast<NiObject>(controlledBlocks[i1].interpolator) )->second, out, info );
@@ -182,7 +182,7 @@ void NiSequence::Write( ostream& out, const map<NiObjectRef,unsigned int> & link
 				}
 			}
 			if ( info.version < VER_3_3_0_13 ) {
-				NifStream( (unsigned int)&(*controlledBlocks[i1].controller), out, info );
+				WritePtr32( &(*controlledBlocks[i1].controller), out );
 			} else {
 				if ( controlledBlocks[i1].controller != NULL ) {
 					NifStream( link_map.find( StaticCast<NiObject>(controlledBlocks[i1].controller) )->second, out, info );
@@ -193,7 +193,7 @@ void NiSequence::Write( ostream& out, const map<NiObjectRef,unsigned int> & link
 		};
 		if ( ( info.version >= 0x0A01006A ) && ( info.version <= 0x0A01006A ) ) {
 			if ( info.version < VER_3_3_0_13 ) {
-				NifStream( (unsigned int)&(*controlledBlocks[i1].unknownLink2), out, info );
+				WritePtr32( &(*controlledBlocks[i1].unknownLink2), out );
 			} else {
 				if ( controlledBlocks[i1].unknownLink2 != NULL ) {
 					NifStream( link_map.find( StaticCast<NiObject>(controlledBlocks[i1].unknownLink2) )->second, out, info );
@@ -208,7 +208,7 @@ void NiSequence::Write( ostream& out, const map<NiObjectRef,unsigned int> & link
 		};
 		if ( ( info.version >= 0x0A020000 ) && ( info.version <= 0x14000005 ) ) {
 			if ( info.version < VER_3_3_0_13 ) {
-				NifStream( (unsigned int)&(*controlledBlocks[i1].stringPalette), out, info );
+				WritePtr32( &(*controlledBlocks[i1].stringPalette), out );
 			} else {
 				if ( controlledBlocks[i1].stringPalette != NULL ) {
 					NifStream( link_map.find( StaticCast<NiObject>(controlledBlocks[i1].stringPalette) )->second, out, info );
diff --git a/src/obj/NiSingleInterpController.cpp b/src/obj/NiSingleInterpController.cpp
index c3da419f..797289ab 100644
--- a/src/obj/NiSingleInterpController.cpp
+++ b/src/obj/NiSingleInterpController.cpp
@@ -61,7 +61,7 @@ void NiSingleInterpController::Write( ostream& out, const map<NiObjectRef,unsign
 	NiInterpController::Write( out, link_map, info );
 	if ( info.version >= 0x0A020000 ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*interpolator), out, info );
+			WritePtr32( &(*interpolator), out );
 		} else {
 			if ( interpolator != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(interpolator) )->second, out, info );
diff --git a/src/obj/NiSkinData.cpp b/src/obj/NiSkinData.cpp
index faa3bad5..a59d2fe1 100644
--- a/src/obj/NiSkinData.cpp
+++ b/src/obj/NiSkinData.cpp
@@ -103,7 +103,7 @@ void NiSkinData::Write( ostream& out, const map<NiObjectRef,unsigned int> & link
 	NifStream( numBones, out, info );
 	if ( ( info.version >= 0x04000002 ) && ( info.version <= 0x0A010000 ) ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*skinPartition), out, info );
+			WritePtr32( &(*skinPartition), out );
 		} else {
 			if ( skinPartition != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(skinPartition) )->second, out, info );
diff --git a/src/obj/NiSkinInstance.cpp b/src/obj/NiSkinInstance.cpp
index b3c2fb6a..da2dcf2b 100644
--- a/src/obj/NiSkinInstance.cpp
+++ b/src/obj/NiSkinInstance.cpp
@@ -85,7 +85,7 @@ void NiSkinInstance::Write( ostream& out, const map<NiObjectRef,unsigned int> &
 	NiObject::Write( out, link_map, info );
 	numBones = (unsigned int)(bones.size());
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*data), out, info );
+		WritePtr32( &(*data), out );
 	} else {
 		if ( data != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
@@ -95,7 +95,7 @@ void NiSkinInstance::Write( ostream& out, const map<NiObjectRef,unsigned int> &
 	}
 	if ( info.version >= 0x0A020000 ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*skinPartition), out, info );
+			WritePtr32( &(*skinPartition), out );
 		} else {
 			if ( skinPartition != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(skinPartition) )->second, out, info );
@@ -105,7 +105,7 @@ void NiSkinInstance::Write( ostream& out, const map<NiObjectRef,unsigned int> &
 		}
 	};
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*skeletonRoot), out, info );
+		WritePtr32( &(*skeletonRoot), out );
 	} else {
 		if ( skeletonRoot != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(skeletonRoot) )->second, out, info );
@@ -116,7 +116,7 @@ void NiSkinInstance::Write( ostream& out, const map<NiObjectRef,unsigned int> &
 	NifStream( numBones, out, info );
 	for (unsigned int i1 = 0; i1 < bones.size(); i1++) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*bones[i1]), out, info );
+			WritePtr32( &(*bones[i1]), out );
 		} else {
 			if ( bones[i1] != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(bones[i1]) )->second, out, info );
diff --git a/src/obj/NiSourceTexture.cpp b/src/obj/NiSourceTexture.cpp
index 6221bd74..e0da6670 100644
--- a/src/obj/NiSourceTexture.cpp
+++ b/src/obj/NiSourceTexture.cpp
@@ -96,7 +96,7 @@ void NiSourceTexture::Write( ostream& out, const map<NiObjectRef,unsigned int> &
 	if ( info.version >= 0x0A010000 ) {
 		if ( (useExternal == 1) ) {
 			if ( info.version < VER_3_3_0_13 ) {
-				NifStream( (unsigned int)&(*unknownLink), out, info );
+				WritePtr32( &(*unknownLink), out );
 			} else {
 				if ( unknownLink != NULL ) {
 					NifStream( link_map.find( StaticCast<NiObject>(unknownLink) )->second, out, info );
@@ -118,7 +118,7 @@ void NiSourceTexture::Write( ostream& out, const map<NiObjectRef,unsigned int> &
 	};
 	if ( (useExternal == 0) ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*pixelData), out, info );
+			WritePtr32( &(*pixelData), out );
 		} else {
 			if ( pixelData != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(pixelData) )->second, out, info );
diff --git a/src/obj/NiTextureEffect.cpp b/src/obj/NiTextureEffect.cpp
index 18ecb260..7b6309b4 100644
--- a/src/obj/NiTextureEffect.cpp
+++ b/src/obj/NiTextureEffect.cpp
@@ -87,7 +87,7 @@ void NiTextureEffect::Write( ostream& out, const map<NiObjectRef,unsigned int> &
 	NifStream( coordinateGenerationType, out, info );
 	if ( info.version <= 0x03010000 ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*image), out, info );
+			WritePtr32( &(*image), out );
 		} else {
 			if ( image != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(image) )->second, out, info );
@@ -98,7 +98,7 @@ void NiTextureEffect::Write( ostream& out, const map<NiObjectRef,unsigned int> &
 	};
 	if ( info.version >= 0x04000000 ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*sourceTexture), out, info );
+			WritePtr32( &(*sourceTexture), out );
 		} else {
 			if ( sourceTexture != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(sourceTexture) )->second, out, info );
diff --git a/src/obj/NiTextureProperty.cpp b/src/obj/NiTextureProperty.cpp
index 358386b2..743252bf 100644
--- a/src/obj/NiTextureProperty.cpp
+++ b/src/obj/NiTextureProperty.cpp
@@ -63,7 +63,7 @@ void NiTextureProperty::Write( ostream& out, const map<NiObjectRef,unsigned int>
 	NiProperty::Write( out, link_map, info );
 	NifStream( flags, out, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*image), out, info );
+		WritePtr32( &(*image), out );
 	} else {
 		if ( image != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(image) )->second, out, info );
diff --git a/src/obj/NiTextureTransformController.cpp b/src/obj/NiTextureTransformController.cpp
index 03cc31bc..071c1e13 100644
--- a/src/obj/NiTextureTransformController.cpp
+++ b/src/obj/NiTextureTransformController.cpp
@@ -67,7 +67,7 @@ void NiTextureTransformController::Write( ostream& out, const map<NiObjectRef,un
 	NifStream( operation, out, info );
 	if ( info.version <= 0x0A010000 ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*data), out, info );
+			WritePtr32( &(*data), out );
 		} else {
 			if ( data != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
diff --git a/src/obj/NiTexturingProperty.cpp b/src/obj/NiTexturingProperty.cpp
index da10a4c4..3b4c8606 100644
--- a/src/obj/NiTexturingProperty.cpp
+++ b/src/obj/NiTexturingProperty.cpp
@@ -562,7 +562,7 @@ void NiTexturingProperty::Write( ostream& out, const map<NiObjectRef,unsigned in
 	NifStream( hasBaseTexture, out, info );
 	if ( (hasBaseTexture != 0) ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*baseTexture.source), out, info );
+			WritePtr32( &(*baseTexture.source), out );
 		} else {
 			if ( baseTexture.source != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(baseTexture.source) )->second, out, info );
@@ -601,7 +601,7 @@ void NiTexturingProperty::Write( ostream& out, const map<NiObjectRef,unsigned in
 	NifStream( hasDarkTexture, out, info );
 	if ( (hasDarkTexture != 0) ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*darkTexture.source), out, info );
+			WritePtr32( &(*darkTexture.source), out );
 		} else {
 			if ( darkTexture.source != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(darkTexture.source) )->second, out, info );
@@ -640,7 +640,7 @@ void NiTexturingProperty::Write( ostream& out, const map<NiObjectRef,unsigned in
 	NifStream( hasDetailTexture, out, info );
 	if ( (hasDetailTexture != 0) ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*detailTexture.source), out, info );
+			WritePtr32( &(*detailTexture.source), out );
 		} else {
 			if ( detailTexture.source != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(detailTexture.source) )->second, out, info );
@@ -679,7 +679,7 @@ void NiTexturingProperty::Write( ostream& out, const map<NiObjectRef,unsigned in
 	NifStream( hasGlossTexture, out, info );
 	if ( (hasGlossTexture != 0) ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*glossTexture.source), out, info );
+			WritePtr32( &(*glossTexture.source), out );
 		} else {
 			if ( glossTexture.source != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(glossTexture.source) )->second, out, info );
@@ -718,7 +718,7 @@ void NiTexturingProperty::Write( ostream& out, const map<NiObjectRef,unsigned in
 	NifStream( hasGlowTexture, out, info );
 	if ( (hasGlowTexture != 0) ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*glowTexture.source), out, info );
+			WritePtr32( &(*glowTexture.source), out );
 		} else {
 			if ( glowTexture.source != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(glowTexture.source) )->second, out, info );
@@ -757,7 +757,7 @@ void NiTexturingProperty::Write( ostream& out, const map<NiObjectRef,unsigned in
 	NifStream( hasBumpMapTexture, out, info );
 	if ( (hasBumpMapTexture != 0) ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*bumpMapTexture.source), out, info );
+			WritePtr32( &(*bumpMapTexture.source), out );
 		} else {
 			if ( bumpMapTexture.source != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(bumpMapTexture.source) )->second, out, info );
@@ -800,7 +800,7 @@ void NiTexturingProperty::Write( ostream& out, const map<NiObjectRef,unsigned in
 		NifStream( hasNormalTexture, out, info );
 		if ( (hasNormalTexture != 0) ) {
 			if ( info.version < VER_3_3_0_13 ) {
-				NifStream( (unsigned int)&(*normalTexture.source), out, info );
+				WritePtr32( &(*normalTexture.source), out );
 			} else {
 				if ( normalTexture.source != NULL ) {
 					NifStream( link_map.find( StaticCast<NiObject>(normalTexture.source) )->second, out, info );
@@ -839,7 +839,7 @@ void NiTexturingProperty::Write( ostream& out, const map<NiObjectRef,unsigned in
 		NifStream( hasUnknown2Texture, out, info );
 		if ( (hasUnknown2Texture != 0) ) {
 			if ( info.version < VER_3_3_0_13 ) {
-				NifStream( (unsigned int)&(*unknown2Texture.source), out, info );
+				WritePtr32( &(*unknown2Texture.source), out );
 			} else {
 				if ( unknown2Texture.source != NULL ) {
 					NifStream( link_map.find( StaticCast<NiObject>(unknown2Texture.source) )->second, out, info );
@@ -882,7 +882,7 @@ void NiTexturingProperty::Write( ostream& out, const map<NiObjectRef,unsigned in
 	NifStream( hasDecal0Texture, out, info );
 	if ( (hasDecal0Texture != 0) ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*decal0Texture.source), out, info );
+			WritePtr32( &(*decal0Texture.source), out );
 		} else {
 			if ( decal0Texture.source != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(decal0Texture.source) )->second, out, info );
@@ -930,7 +930,7 @@ void NiTexturingProperty::Write( ostream& out, const map<NiObjectRef,unsigned in
 	};
 	if ( (hasDecal1Texture != 0) ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*decal1Texture.source), out, info );
+			WritePtr32( &(*decal1Texture.source), out );
 		} else {
 			if ( decal1Texture.source != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(decal1Texture.source) )->second, out, info );
@@ -978,7 +978,7 @@ void NiTexturingProperty::Write( ostream& out, const map<NiObjectRef,unsigned in
 	};
 	if ( (hasDecal2Texture != 0) ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*decal2Texture.source), out, info );
+			WritePtr32( &(*decal2Texture.source), out );
 		} else {
 			if ( decal2Texture.source != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(decal2Texture.source) )->second, out, info );
@@ -1026,7 +1026,7 @@ void NiTexturingProperty::Write( ostream& out, const map<NiObjectRef,unsigned in
 	};
 	if ( (hasDecal3Texture != 0) ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*decal3Texture.source), out, info );
+			WritePtr32( &(*decal3Texture.source), out );
 		} else {
 			if ( decal3Texture.source != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(decal3Texture.source) )->second, out, info );
@@ -1068,7 +1068,7 @@ void NiTexturingProperty::Write( ostream& out, const map<NiObjectRef,unsigned in
 			NifStream( shaderTextures[i2].isUsed, out, info );
 			if ( (shaderTextures[i2].isUsed != 0) ) {
 				if ( info.version < VER_3_3_0_13 ) {
-					NifStream( (unsigned int)&(*shaderTextures[i2].textureData.source), out, info );
+					WritePtr32( &(*shaderTextures[i2].textureData.source), out );
 				} else {
 					if ( shaderTextures[i2].textureData.source != NULL ) {
 						NifStream( link_map.find( StaticCast<NiObject>(shaderTextures[i2].textureData.source) )->second, out, info );
diff --git a/src/obj/NiTimeController.cpp b/src/obj/NiTimeController.cpp
index d75b7678..45c83527 100644
--- a/src/obj/NiTimeController.cpp
+++ b/src/obj/NiTimeController.cpp
@@ -69,7 +69,7 @@ void NiTimeController::Write( ostream& out, const map<NiObjectRef,unsigned int>
 
 	NiObject::Write( out, link_map, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*nextController), out, info );
+		WritePtr32( &(*nextController), out );
 	} else {
 		if ( nextController != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(nextController) )->second, out, info );
@@ -84,7 +84,7 @@ void NiTimeController::Write( ostream& out, const map<NiObjectRef,unsigned int>
 	NifStream( stopTime, out, info );
 	if ( info.version >= 0x0303000D ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*target), out, info );
+			WritePtr32( &(*target), out );
 		} else {
 			if ( target != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(target) )->second, out, info );
diff --git a/src/obj/NiTransformInterpolator.cpp b/src/obj/NiTransformInterpolator.cpp
index f7f7f53d..af6fa7c9 100644
--- a/src/obj/NiTransformInterpolator.cpp
+++ b/src/obj/NiTransformInterpolator.cpp
@@ -73,7 +73,7 @@ void NiTransformInterpolator::Write( ostream& out, const map<NiObjectRef,unsigne
 		};
 	};
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*data), out, info );
+		WritePtr32( &(*data), out );
 	} else {
 		if ( data != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
diff --git a/src/obj/NiTriShapeSkinController.cpp b/src/obj/NiTriShapeSkinController.cpp
index 7ec16a9f..e50f54f5 100644
--- a/src/obj/NiTriShapeSkinController.cpp
+++ b/src/obj/NiTriShapeSkinController.cpp
@@ -83,7 +83,7 @@ void NiTriShapeSkinController::Write( ostream& out, const map<NiObjectRef,unsign
 	};
 	for (unsigned int i1 = 0; i1 < bones.size(); i1++) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*bones[i1]), out, info );
+			WritePtr32( &(*bones[i1]), out );
 		} else {
 			if ( bones[i1] != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(bones[i1]) )->second, out, info );
diff --git a/src/obj/NiUVController.cpp b/src/obj/NiUVController.cpp
index abcef0ee..3b6b98c5 100644
--- a/src/obj/NiUVController.cpp
+++ b/src/obj/NiUVController.cpp
@@ -59,7 +59,7 @@ void NiUVController::Write( ostream& out, const map<NiObjectRef,unsigned int> &
 	NiTimeController::Write( out, link_map, info );
 	NifStream( unknownShort, out, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*data), out, info );
+		WritePtr32( &(*data), out );
 	} else {
 		if ( data != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
diff --git a/src/obj/NiVisController.cpp b/src/obj/NiVisController.cpp
index 37f99d12..77faebe7 100644
--- a/src/obj/NiVisController.cpp
+++ b/src/obj/NiVisController.cpp
@@ -60,7 +60,7 @@ void NiVisController::Write( ostream& out, const map<NiObjectRef,unsigned int> &
 	NiBoolInterpController::Write( out, link_map, info );
 	if ( info.version <= 0x0A010000 ) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*data), out, info );
+			WritePtr32( &(*data), out );
 		} else {
 			if ( data != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
diff --git a/src/obj/bhkConstraint.cpp b/src/obj/bhkConstraint.cpp
index 07676eb0..761e153d 100644
--- a/src/obj/bhkConstraint.cpp
+++ b/src/obj/bhkConstraint.cpp
@@ -65,7 +65,7 @@ void bhkConstraint::Write( ostream& out, const map<NiObjectRef,unsigned int> & l
 	NifStream( numEntities, out, info );
 	for (unsigned int i1 = 0; i1 < entities.size(); i1++) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*entities[i1]), out, info );
+			WritePtr32( &(*entities[i1]), out );
 		} else {
 			if ( entities[i1] != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(entities[i1]) )->second, out, info );
diff --git a/src/obj/bhkConvexListShape.cpp b/src/obj/bhkConvexListShape.cpp
index 791405fb..4ef07060 100644
--- a/src/obj/bhkConvexListShape.cpp
+++ b/src/obj/bhkConvexListShape.cpp
@@ -76,7 +76,7 @@ void bhkConvexListShape::Write( ostream& out, const map<NiObjectRef,unsigned int
 	NifStream( numSubShapes, out, info );
 	for (unsigned int i1 = 0; i1 < subShapes.size(); i1++) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*subShapes[i1]), out, info );
+			WritePtr32( &(*subShapes[i1]), out );
 		} else {
 			if ( subShapes[i1] != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(subShapes[i1]) )->second, out, info );
diff --git a/src/obj/bhkListShape.cpp b/src/obj/bhkListShape.cpp
index cbd773d8..65d1d60c 100644
--- a/src/obj/bhkListShape.cpp
+++ b/src/obj/bhkListShape.cpp
@@ -75,7 +75,7 @@ void bhkListShape::Write( ostream& out, const map<NiObjectRef,unsigned int> & li
 	NifStream( numSubShapes, out, info );
 	for (unsigned int i1 = 0; i1 < subShapes.size(); i1++) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*subShapes[i1]), out, info );
+			WritePtr32( &(*subShapes[i1]), out );
 		} else {
 			if ( subShapes[i1] != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(subShapes[i1]) )->second, out, info );
diff --git a/src/obj/bhkMalleableConstraint.cpp b/src/obj/bhkMalleableConstraint.cpp
index 608ce26e..2f4c2b65 100644
--- a/src/obj/bhkMalleableConstraint.cpp
+++ b/src/obj/bhkMalleableConstraint.cpp
@@ -134,7 +134,7 @@ void bhkMalleableConstraint::Write( ostream& out, const map<NiObjectRef,unsigned
 	NifStream( type, out, info );
 	NifStream( unknownInt2, out, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*unknownLink1), out, info );
+		WritePtr32( &(*unknownLink1), out );
 	} else {
 		if ( unknownLink1 != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(unknownLink1) )->second, out, info );
@@ -143,7 +143,7 @@ void bhkMalleableConstraint::Write( ostream& out, const map<NiObjectRef,unsigned
 		}
 	}
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*unknownLink2), out, info );
+		WritePtr32( &(*unknownLink2), out );
 	} else {
 		if ( unknownLink2 != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(unknownLink2) )->second, out, info );
diff --git a/src/obj/bhkMoppBvTreeShape.cpp b/src/obj/bhkMoppBvTreeShape.cpp
index 7d0f957a..46fa7cda 100644
--- a/src/obj/bhkMoppBvTreeShape.cpp
+++ b/src/obj/bhkMoppBvTreeShape.cpp
@@ -69,7 +69,7 @@ void bhkMoppBvTreeShape::Write( ostream& out, const map<NiObjectRef,unsigned int
 	bhkBvTreeShape::Write( out, link_map, info );
 	moppDataSize = (unsigned int)(moppData.size());
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*shape), out, info );
+		WritePtr32( &(*shape), out );
 	} else {
 		if ( shape != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(shape) )->second, out, info );
diff --git a/src/obj/bhkNiCollisionObject.cpp b/src/obj/bhkNiCollisionObject.cpp
index 7f822a53..35e9a9a2 100644
--- a/src/obj/bhkNiCollisionObject.cpp
+++ b/src/obj/bhkNiCollisionObject.cpp
@@ -59,7 +59,7 @@ void bhkNiCollisionObject::Write( ostream& out, const map<NiObjectRef,unsigned i
 	NiCollisionObject::Write( out, link_map, info );
 	NifStream( flags, out, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*body), out, info );
+		WritePtr32( &(*body), out );
 	} else {
 		if ( body != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(body) )->second, out, info );
diff --git a/src/obj/bhkNiTriStripsShape.cpp b/src/obj/bhkNiTriStripsShape.cpp
index 62b8cf70..16aff6c0 100644
--- a/src/obj/bhkNiTriStripsShape.cpp
+++ b/src/obj/bhkNiTriStripsShape.cpp
@@ -92,7 +92,7 @@ void bhkNiTriStripsShape::Write( ostream& out, const map<NiObjectRef,unsigned in
 	NifStream( numStripsData, out, info );
 	for (unsigned int i1 = 0; i1 < stripsData.size(); i1++) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*stripsData[i1]), out, info );
+			WritePtr32( &(*stripsData[i1]), out );
 		} else {
 			if ( stripsData[i1] != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(stripsData[i1]) )->second, out, info );
diff --git a/src/obj/bhkPackedNiTriStripsShape.cpp b/src/obj/bhkPackedNiTriStripsShape.cpp
index 42456105..f7ae039a 100644
--- a/src/obj/bhkPackedNiTriStripsShape.cpp
+++ b/src/obj/bhkPackedNiTriStripsShape.cpp
@@ -99,7 +99,7 @@ void bhkPackedNiTriStripsShape::Write( ostream& out, const map<NiObjectRef,unsig
 	NifStream( scale, out, info );
 	NifStream( unknownFloat4, out, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*data), out, info );
+		WritePtr32( &(*data), out );
 	} else {
 		if ( data != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(data) )->second, out, info );
diff --git a/src/obj/bhkRigidBody.cpp b/src/obj/bhkRigidBody.cpp
index be8a9f3d..7d732edd 100644
--- a/src/obj/bhkRigidBody.cpp
+++ b/src/obj/bhkRigidBody.cpp
@@ -147,7 +147,7 @@ void bhkRigidBody::Write( ostream& out, const map<NiObjectRef,unsigned int> & li
 	NifStream( numConstraints, out, info );
 	for (unsigned int i1 = 0; i1 < constraints.size(); i1++) {
 		if ( info.version < VER_3_3_0_13 ) {
-			NifStream( (unsigned int)&(*constraints[i1]), out, info );
+			WritePtr32( &(*constraints[i1]), out );
 		} else {
 			if ( constraints[i1] != NULL ) {
 				NifStream( link_map.find( StaticCast<NiObject>(constraints[i1]) )->second, out, info );
diff --git a/src/obj/bhkTransformShape.cpp b/src/obj/bhkTransformShape.cpp
index 7382246f..b9554e3c 100644
--- a/src/obj/bhkTransformShape.cpp
+++ b/src/obj/bhkTransformShape.cpp
@@ -63,7 +63,7 @@ void bhkTransformShape::Write( ostream& out, const map<NiObjectRef,unsigned int>
 
 	bhkShape::Write( out, link_map, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*shape), out, info );
+		WritePtr32( &(*shape), out );
 	} else {
 		if ( shape != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(shape) )->second, out, info );
diff --git a/src/obj/bhkWorldObject.cpp b/src/obj/bhkWorldObject.cpp
index c9c5ca4b..ff982376 100644
--- a/src/obj/bhkWorldObject.cpp
+++ b/src/obj/bhkWorldObject.cpp
@@ -60,7 +60,7 @@ void bhkWorldObject::Write( ostream& out, const map<NiObjectRef,unsigned int> &
 
 	bhkSerializable::Write( out, link_map, info );
 	if ( info.version < VER_3_3_0_13 ) {
-		NifStream( (unsigned int)&(*shape), out, info );
+		WritePtr32( &(*shape), out );
 	} else {
 		if ( shape != NULL ) {
 			NifStream( link_map.find( StaticCast<NiObject>(shape) )->second, out, info );
-- 
GitLab