Ejemplo n.º 1
0
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);
            }
        }
    }
}
Ejemplo n.º 2
0
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;

}