void psCreationManager::HandleTraitData( MsgEntry* me ) { psCharCreateTraitsMessage msg(me); iDocumentSystem* xml = psengine->GetXMLParser (); csRef<iDocument> doc = xml->CreateDocument(); const char* error = doc->Parse(msg.GetString().GetData()); if ( error ) { Error2("Error in XML: %s", error ); return; } csRef<iDocumentNode> root = doc->GetRoot(); if(!root) { Error1("No XML root in Trait Data"); return; } csRef<iDocumentNodeIterator> iter1 = root->GetNode("traits")->GetNodes("trait"); // Build the traits list while ( iter1->HasNext() ) { csRef<iDocumentNode> node = iter1->Next(); Trait *t = new Trait; t->Load( node ); traits.Push(t); } TraitIterator iter2 = GetTraitIterator(); while ( iter2.HasNext() ) { Trait * t = iter2.Next(); t->next_trait = GetTrait(t->next_trait_uid); if (t->next_trait != NULL) { t->next_trait->prev_trait = t; } } // Insert into the custom location structure all top trait TraitIterator iter3 = GetTraitIterator(); while ( iter3.HasNext() ) { Trait * t = iter3.Next(); // Check for top trait if (t->prev_trait == NULL) { RaceDefinition * race = GetRace(t->raceID); if (race != NULL) { if (t->gender == PSCHARACTER_GENDER_NONE) { race->location[t->location][PSCHARACTER_GENDER_MALE].Push(t); // still needed? race->location[t->location][PSCHARACTER_GENDER_FEMALE].Push(t); // still needed? race->location[t->location][PSCHARACTER_GENDER_NONE].Push(t); } else { race->location[t->location][t->gender].Push(t); } } else { Error3("Failed to insert trait '%s' into location table for race %d.\n",t->name.GetData(),t->raceID); } } } }
void psCharAppearance::ApplyTraits(const csString& traitString) { if ( traitString.Length() == 0 ) { return; } csRef<iDocument> doc = xmlparser->CreateDocument(); const char* traitError = doc->Parse(traitString); if ( traitError ) { Error2("Error in XML: %s", traitError ); return; } csRef<iDocumentNodeIterator> traitIter = doc->GetRoot()->GetNode("traits")->GetNodes("trait"); csPDelArray<Trait> traits; // Build traits table while ( traitIter->HasNext() ) { csRef<iDocumentNode> traitNode = traitIter->Next(); Trait * trait = new Trait; trait->Load(traitNode); traits.Push(trait); } // Build next and prev pointers for trait sets csPDelArray<Trait>::Iterator iter = traits.GetIterator(); while (iter.HasNext()) { Trait * trait = iter.Next(); csPDelArray<Trait>::Iterator iter2 = traits.GetIterator(); while (iter2.HasNext()) { Trait * trait2 = iter2.Next(); if (trait->next_trait_uid == trait2->uid) { trait->next_trait = trait2; trait2->prev_trait = trait; } } } // Find top traits and set them on mesh csPDelArray<Trait>::Iterator iter3 = traits.GetIterator(); while (iter3.HasNext()) { Trait * trait = iter3.Next(); if (trait->prev_trait == NULL) { if (!SetTrait(trait)) { Error2("Failed to set trait %s for mesh.", traitString.GetData()); } } } return; }