How to spawn NPCs?

/!\ Possible spoiler ahead /!\
I need help with #28157 (contains spoiler)

To make it work I need to spawn NPC near the player, but what i’ve got so far crashes the game :

        std::shared_ptr<npc> tmp = std::make_shared<npc>();
        tmp->normalize();
        tmp->randomize( NC_CLASSE );
        tmp->spawn_at_precise({ get_levx(), get_levy() }, p);
        return true; 

( [SPOILER] : NC_CLASS is in fact NC_HALLU which is a new class )

So what’s the proper way to spawn an NPC ?

I changed code to :

    if( one_in( 100 ) ) {
        std::shared_ptr<npc> tmp = std::make_shared<npc>();
        tmp->normalize();
        tmp->randomize( NC_CLASS );
        tmp->spawn_at_precise( { get_levx(), get_levy() }, p );
        if( !critter_at( p, true ) ) {
            overmap_buffer.insert_npc( tmp );
            return true;
        } else {
            return false;
        }
    }

And now instead of a hard crash I get :

  DEBUG    : Invalid body part token -858993460
 
 FUNCTION : convert_bp
 FILE     : ..\src\bodypart.cpp
 LINE     : 136

Anybody got any idea on what I’m doing wrong ?

Have you tried to add load_npcs() in the end, like in code to spawn NPC in debug menu?

Just did, it still gives the same error.

Why aren’t you using:

    const string_id<npc_template> npc_template_name( "npc_template_name" );
    const int tmp_id = g->m.place_npc( get_levx(), get_levy(), npc_template_name );
    g->load_npcs();

    return g->find_npc( tmp_id );

I know that works for me.

I’ve made the npc template, and implemented your suggestion but I still get the Invalid body part token error.

What does this errorr mean ? I don’t see where we would/should have touch anything about body part.

Does anybody know what’s the link between bodypart.cpp and spawning an NPC ?

Does the error could come from a mistake in the json ? Even though bodyparts are never adressed in any of them.

EDIT : I haven’t figure where the bodypart error came from but this works as far as spawning NPC is concerned

        std::shared_ptr<npc> tmp = std::make_shared<npc>();
        tmp->normalize();
        tmp->randomize( NC_CLASS );
        tmp->spawn_at_precise( { get_levx(), get_levy() }, tripoint );
        overmap_buffer.insert_npc( tmp );
        load_npcs();