From b4f77a4eceecfc220ef7b8aa4ff9667bb16cc20c Mon Sep 17 00:00:00 2001
From: Tazpn <tazpn@users.sourceforge.net>
Date: Mon, 11 Sep 2006 02:54:51 +0000
Subject: [PATCH] Fix issues with NiControllerSequence in niflib. 1.
 StringOffset now defaults to -1 2. Search in StringPalette now finds exact
 matches rather than partial matches. 3. Reuse same StringPalette for
 Controller and all child blocks

---
 gen/ControllerLink.cpp       |  2 +-
 obj/NiControllerSequence.cpp | 16 ++++++----------
 obj/NiStringPalette.cpp      |  3 ++-
 3 files changed, 9 insertions(+), 12 deletions(-)

diff --git a/gen/ControllerLink.cpp b/gen/ControllerLink.cpp
index 9f7c7273..16c84980 100644
--- a/gen/ControllerLink.cpp
+++ b/gen/ControllerLink.cpp
@@ -9,7 +9,7 @@ All rights reserved.  Please see niflib.h for licence. */
 using namespace Niflib;
 
 //Constructor
-ControllerLink::ControllerLink() : controller(NULL), interpolator(NULL), unknownLink2(NULL), unknownShort0((ushort)0), priority_((byte)0), stringPalette(NULL), nodeNameOffset((uint)0), propertyTypeOffset((uint)0), controllerTypeOffset((uint)0), variableOffset1((uint)0), variableOffset2((uint)0) {};
+ControllerLink::ControllerLink() : controller(NULL), interpolator(NULL), unknownLink2(NULL), unknownShort0((ushort)0), priority_((byte)0), stringPalette(NULL), nodeNameOffset((uint)-1), propertyTypeOffset((uint)-1), controllerTypeOffset((uint)-1), variableOffset1((uint)-1), variableOffset2((uint)-1) {};
 
 //Destructor
 ControllerLink::~ControllerLink() {};
diff --git a/obj/NiControllerSequence.cpp b/obj/NiControllerSequence.cpp
index d1cc5921..f3eb8215 100644
--- a/obj/NiControllerSequence.cpp
+++ b/obj/NiControllerSequence.cpp
@@ -104,12 +104,8 @@ void NiControllerSequence::AddInterpolator( const Ref<NiSingleInterpolatorContro
 	}
 
 	//If there are existing ControllerLinks, use the same StringPalette they're using
-	NiStringPaletteRef str_pal;
-	if ( controlledBlocks.size() > 0 ) {
-		str_pal = controlledBlocks[0].stringPalette;
-	} else {
-		//No existing ones, so make a new one
-		str_pal = new NiStringPalette;
+   if ( stringPalette == NULL ) {
+      stringPalette = new NiStringPalette;
 	}
 
 	//Make a new ControllerLink and fill out necessary data
@@ -117,15 +113,15 @@ void NiControllerSequence::AddInterpolator( const Ref<NiSingleInterpolatorContro
 
 	cl.interpolator = interp;
 	cl.priority_ = priority;
-   cl.stringPalette = str_pal;
-	cl.nodeNameOffset = str_pal->AddSubStr( target->GetName() );
+   cl.stringPalette = stringPalette;
+	cl.nodeNameOffset = stringPalette->AddSubStr( target->GetName() );
 
 	NiPropertyRef prop = DynamicCast<NiProperty>(target);
 	if ( prop != NULL ) {
-		cl.propertyTypeOffset = str_pal->AddSubStr( prop->GetType().GetTypeName() );
+		cl.propertyTypeOffset = stringPalette->AddSubStr( prop->GetType().GetTypeName() );
 	}
 
-	cl.controllerTypeOffset = str_pal->AddSubStr( obj->GetType().GetTypeName() );
+	cl.controllerTypeOffset = stringPalette->AddSubStr( obj->GetType().GetTypeName() );
 
 	//Add finished ControllerLink to list
 	controlledBlocks.push_back( cl );
diff --git a/obj/NiStringPalette.cpp b/obj/NiStringPalette.cpp
index 25aa2cb7..59183a69 100644
--- a/obj/NiStringPalette.cpp
+++ b/obj/NiStringPalette.cpp
@@ -64,7 +64,8 @@ string NiStringPalette::GetSubStr( short offset ) const {
 
 unsigned int NiStringPalette::AddSubStr( const string & n ) {
 	//Search for the string
-	uint offset = (uint)palette.palette.find( n );
+   //  When searching for strings also search for ending null.
+	uint offset = (uint)palette.palette.find( n.c_str(), 0, n.size()+1 );
 	
 	//If string was not found, append it
 	if ( offset == 0xFFFFFFFF ) {
-- 
GitLab