1. Ce site utilise des "témoins de connexion" (cookies) conformes aux textes de l'Union Européenne. Continuer à naviguer sur nos pages vaut acceptation de notre règlement en la matière. En savoir plus.

Résolu Npc ne spawn pas.

Discussion dans 'Discussion & Aide au développement' démarrée par Neg, 23 Avril 2013.

  1. Neg

    Neg Le Lama

    Bonjour à tous,

    Pendant cette matiné j'ai codé un tout début de Npc et je ne comprends pas pourquoi il ne spawn pas.

    PHP:
    #include < amxmodx >
    #include < engine >
    #include < fakemeta >
    #include < hamsandwich >

     
    #define PLUGIN_NAME "amx_npc"

    new const g_szClassName[ ] = "Base" ;
     
    public plugin_init( )
    {
        register_plugin( PLUGIN_NAME , "0.0.1" , "Neg" ) ; /* Last update : 22.04.2013 */
     
        // Commande Client
        register_clcmd( "say /createbase" , "ClCmd_CreateBase" ) ;
        register_clcmd( "say_team /createbase" , "ClCmd_CreateBase" ) ;
     
        RegisterHam( Ham_TakeDamage , "info_target" , "fwHamTakeDamage" , .Post = false ) ;
    }
     
    public plugin_precache( )
    {
        precache_model( "models/hostageA.mdl" ) ;
    }
     
    public ClCmd_CreateBase( const id )
    {
        new
            iEnt ,
            Float: flOrigin[ 3 ] ;
     
        entity_get_vector( id , EV_VEC_origin , flOrigin ) ;
        flOrigin[ 1 ] += 35.0 ;
        entity_set_vector( iEnt , EV_VEC_origin , flOrigin ) ;
     
        iEnt = create_entity( "info_target" ) ;
     
        entity_set_string( iEnt , EV_SZ_classname , g_szClassName ) ;
     
        entity_set_int( iEnt , EV_INT_solid , SOLID_BBOX ) ;
     
        entity_set_float( iEnt , EV_FL_takedamage , 1.0 ) ;
        entity_set_float( iEnt , EV_FL_health , 3000.0 ) ;
        entity_set_float( iEnt , EV_FL_max_health , 3000.0 ) ;
     
        new Float: flMins[ 3 ] =
        {
            - 12.0 ,
            - 12.0 ,
            - 0.0
        } ;
     
        new Float: flMaxs[ 3 ] =
        {
            12.0 ,
            12.0 ,
            75.0
        } ;
     
        entity_set_size( iEnt , flMins , flMaxs ) ;
     
        entity_set_model( iEnt , "models/hostageA.mdl" ) ;
     
        drop_to_floor( iEnt ) ;
    }
    Voilà si vous avez une idée, je suis preneur. Merchi :D 
     
    Dernière édition: 26 Avril 2013
    Tags:
  2. Arkshine

    Arkshine Le Docteur

    Si tu ne lui dis pas où apparaître, c'est sûr que tu vas rien voir. Je ne vois null part définir l'origine.
    --- Message fusionné : 23 Avril 2013 ---
    Ah. tu le définis. T'es fort, tu crées l'entité après avoir défini son origin. Dur de ne pas voir le couac. iEnt étant nul à ce moment là, il y a une certaine probabilité que ça ne fonctionne pas..
     
  3. Neg

    Neg Le Lama

    Ah oui c'est vrai ... Merci bien, l'entité se crée désormais. Toutefois, elle n'est pas solide, je peux la traversé. Et pourtant j'ai mis SOLID_BBOX
    --- Message fusionné : 23 Avril 2013 ---
    C'est bon il fallait simplement placé le model de l'entité avant la taille. Pourquoi je ne sais pas.
    --- Message fusionné : 23 Avril 2013 ---
    j'aurais encore une question. Si je souhaite créer un Npc qui vend des armes par exemple. Serais-ce préférable de créer une entité info_target, fun_button ou encore player ?
     
  4. Arkshine

    Arkshine Le Docteur

    Bah, c'est plus logique qu'autre chose. Tu définis la taille à partir d'un model. On peut sûrement supposer que mettre un model définit une taille par défaut; et donc si tu ne définis pas la taille que tu veux par la suite, ça gardera cette taille par défaut.
    --- Message fusionné : 23 Avril 2013 ---
    Pour ta dernière question : tout dépend comment tu veux gérer la chose.
     
  5. Neg

    Neg Le Lama

    Et, pour remove tout les entités que j'ai créer d'un coup comment faut-il si prendre ?

    J'utilise remove_entity( iEnt ) ;
    Mais cette méthode ne supprime que la dernière entité que j'ai créer.

    Si je fais une boucle for ou while le serveur crash.

    Comment faire pour ré-initialiser toute les entités ?
     
  6. Arkshine

    Arkshine Le Docteur

    Quand tu demandes de l'aide, affiche le code, on ne peut pas deviner ce que tu as fais hein.
     
  7. Neg

    Neg Le Lama

    Excuse moi , le voici :

    PHP:
    #include < amxmodx >
    #include < engine >
    #include < fakemeta >
    #include < hamsandwich >
    #include < fun >
    #include < cstrike >


    #define PLUGIN_NAME "amx_dealer"
    #define MAX_PLAYERS 32

    new const g_szClassName[ ] =    "Dealer" ;
    new const g_szPrefix[ ] =   "[AMX-DEALER]" ;

    new static g_iMenu ;

    new g_iEnt ;


    public plugin_init( )
    {
        register_plugin( PLUGIN_NAME , "0.0.1" , "Neg" ) ; /* Last update : 22.04.2013 */
       
        register_clcmd( "say /dealer" , "ClCmd_Dealer" ) ;
        register_clcmd( "say_team /dealer" , "ClCmd_Dealer" ) ;
       
       
        g_iMenu = menu_create( "# Menu Dealer :" , "SubMenu" ) ;
       
        menu_additem( g_iMenu , "Creer un Dealer" ) ;
        menu_additem( g_iMenu , "Supprimer le Dealer en face de vous" ) ;
        menu_additem( g_iMenu , "Supprimer tout les dealers de cette map" ) ;
       
        menu_setprop( g_iMenu , MPROP_EXITNAME , "Quitter" ) ;
    }

    public plugin_precache( )
    {
        precache_model( "models/hostageA.mdl" ) ;
    }

    public ClCmd_Dealer( const id )
    {
        if( is_user_alive( id ) && get_user_flags( id ) & ADMIN_KICK )
        {
            menu_display( id , g_iMenu ) ;
           
        }
       
        else if( ! is_user_alive( id ) || get_user_flags( id ) | ADMIN_KICK )
        {
            client_print( id , print_chat , "%s Vous ne pouvez pas creer de Dealer." , g_szPrefix ) ;
           
            return PLUGIN_HANDLED ;
        }
       
        return PLUGIN_HANDLED ;
    }

    public SubMenu( const id , g_iMenu , const item )
    {
        if( item == MENU_EXIT )
        {
            menu_destroy( g_iMenu ) ;
        }
       
        else
        {
            switch( item )
            {
                case 0 :
                {
                    CreateDealer( id ) ;
                    client_print( id , print_chat , "%s Vous venez de creer un Dealer." , g_szPrefix ) ;
                   
                    menu_display( id , g_iMenu ) ;
                }
               
                case 1 :
                {
                    // DeleteDealer( id ) ;
                    client_print( id , print_chat , "%s Vous venez de supprimer votre Dealer." , g_szPrefix ) ;
                   
                    menu_display( id , g_iMenu ) ;
                }
               
                case 2 :
                {
                    DeleteAllDealer( id ) ;
                    client_print( id , print_chat , "%s Vous venez de supprimer tout les Dealers." , g_szPrefix ) ;
                   
                    menu_display( id , g_iMenu ) ;
                }
            }
        }
    }


    public CreateDealer( const id )
    {
        new
            Float: flOrigin[ 3 ] ;
       
        g_iEnt = create_entity( "func_button" ) ;

        entity_get_vector( id , EV_VEC_origin , flOrigin ) ;
        flOrigin[ 1 ] += 50.0 ;
        entity_set_vector( g_iEnt , EV_VEC_origin , flOrigin ) ;
       
        entity_set_model( g_iEnt , "models/hostageA.mdl" ) ;
       
        new Float: flMins[ 3 ] =
        {
            - 12.0 ,
            - 12.0 ,
            - 0.0
        } ;
       
        new Float: flMaxs[ 3 ] =
        {
            12.0 ,
            12.0 ,
            75.0
        } ;
       
        entity_set_size( g_iEnt , flMins , flMaxs ) ;
       
        entity_set_int( g_iEnt , EV_INT_solid , SOLID_BBOX ) ;
        entity_set_int( g_iEnt , EV_INT_iuser1 , MAX_PLAYERS + 1 ) ;
       
        entity_set_float( g_iEnt , EV_FL_takedamage , 1.0 ) ;
        entity_set_float( g_iEnt , EV_FL_health , 100.0 ) ;
       
        entity_set_string( g_iEnt , EV_SZ_classname , g_szClassName ) ;
       
        drop_to_floor( g_iEnt ) ;
       
        client_print( id , print_console , "%s Dealer Position : [x : %d] / [y : %d] / [z : %d]" ,
        g_szPrefix ,
        flOrigin[ 0 ] ,
        flOrigin[ 1 ] ,
        flOrigin[ 2 ] ) ;
       
        return g_iEnt ;
    }

    public DeleteAllDealer( const id )
    {  
        if( is_valid_ent( g_iEnt ) )
        {
            while( g_iEnt < 0 )
            {
                remove_entity( g_iEnt ) ;
            }
        }
    }
    --- Message fusionné : 23 Avril 2013 ---
    Le problème est situé dans la dernière fonction.
     
  8. Arkshine

    Arkshine Le Docteur

    DeleteAllDealer() ; OMG. :wideyed: 

    Tu peux m'expliquer ce que tu fais, et si tu comprends ce que tu fais ?
    Expliques-moi comment tu as pu arriver à ce résultat ? Qui est évidemment OMG-faux, juste pour comprendre et rectifier ta façon de penser.
     
  9. Neg

    Neg Le Lama

    Je souhaite créer deux fonctions bien distinces.
    • Dans un premier temps, DeleteDealer( ) ; qui supprimera l'Entité visé par le joueur ;
    • Et DeleteAllDealer( ) ; qui supprimera toute les entités sur la map.
    Alors voilà comment j'ai pensée la fonction DeleteAllDealer( ) ;
    • J'ai tout d'abord voulu checker si l'entités est valide
    • Je fais une boucle disant que tant que g_iEnt est plus grand que 0 on remove les entités.

    Je viens de voir que j'avais fais une faute ici :
    while( g_iEnt < 0 )

    J'aurais du écrire ainsi :
    while( g_iEnt > 0 )
     
  10. Arkshine

    Arkshine Le Docteur

    Ce que tu écris équivaut à : while( 126 > 0 ) En supposant que l'index actuel est 126 (au pif). Tu ne vois toujours rien d'anormal ?

    g_iEnt n'est pas incrémenté, tu boucles sur le même test encore et encore, et comment tu fais pour différencier ton entité à celui d'un autre ?

    g_iEnt contient uniquement l'index EN COURS. Ce n'est pas une liste. Boucler sur une simple variable n'a vraiment pas de sens, n'est-ce pas ?

    Si tu veux virer toutes les entités créés, soit tu crées une liste et donc chaque case correspondra à un index d'une entité, soit tu mets un "marqueur" sur l'entité en lui attribuant une valeur, par exemple, lui définir un nom de classe, et suffira de chercher tous les noms de classes pour trouver tes entités (find_ent_by_class).
     
  11. Neg

    Neg Le Lama

    Arg je ne sais pas du tout comment procédé :

    PHP:
    public DeleteAllDealer( const id )
    {
        if( is_valid_ent( g_iEnt ) )
        {
            while( find_ent_by_class( g_iEnt , "func_button" ) )
            {
                remove_entity( g_iEnt ) ;
            }
        }
    }
     
  12. Arkshine

    Arkshine Le Docteur

    Je viens de voir que tu définis déjà un nom de class (g_szClassName)
    Du coup, le plus simple pour toi c'est d'utiliser une function existante (stock) : remove_entity_name ( g_szClassName )
    Cette function tu l'as trouves dans engine_stocks.inc :
    Code (C):
    /* Remove entity by name */
    stock remove_entity_name(const eName[])
    {
        new iEntity = find_ent_by_class(-1, eName);
        while (iEntity > 0)
        {
            remove_entity(iEntity);
            iEntity = find_ent_by_class(-1, eName);
        }

        return 1;
    }
     
     
  13. Neg

    Neg Le Lama

    Super ton code marche très bien .

    Il y a tout de même quelques points que je ne saisis pas bien :

    PHP:
    stock remove_entity_name(const eName[])
    {
        new iEntity = find_ent_by_class(-1, eName); // Pourquoi partir de - 1 ?
        while (iEntity > 0)
        {
            remove_entity(iEntity);
            iEntity = find_ent_by_class(-1, eName); // Pourquoi replacer cette ligne dans la boucle tant que ?
        }

        return 1;
    }
    Merci encore :) 
    --- Message fusionné : 24 Avril 2013 ---
    Edit: Je rencontre encore un problème.
    J'ai deux fonctions qui marchent plutôt bien :

    PHP:
    public DeleteAllDealer( const id )
    {
        if( ValidEnt( g_iEnt ) )
        {
            new iEntity = find_ent_by_class( - 1 , g_szClassName ) ;
       
            while ( iEntity > 0 )
            {
                remove_entity( iEntity ) ;
                iEntity = find_ent_by_class( - 1 , g_szClassName ) ;
            }

            return PLUGIN_CONTINUE ;
        }
       
        return PLUGIN_CONTINUE ;
    }

    public DeleteDealerAiming( const id )
    {
        new tempid , body ;
       
        get_user_aiming( id , tempid , body ) ;
       
        if( ValidEnt( tempid ) && find_ent_by_class( - 1 , g_szClassName ) )
        {
            remove_entity( tempid ) ;
        }
       
        return PLUGIN_CONTINUE ;
    }
    En gros, imaginons que je crée 10 entités.
    J'en supprime dans un premier temps 4 (nombre au pif) avec DeleteDealerAiming( ) ; puis je souhaite supprimé les 6 autres en un seul coup avec DeleteAllDealer( ) ; Et bien sa ne marche pas. Il faudra que je passe par DeleteDealerAiming( ) ;

    Toutefois , si je re-crée une entités donc on en aura 6 + 1 soit 7 et que cette fois-ci j'utilise directement DeleteAllDealer( ) ; sans passé par DeleteDealerAiming( ) ; là sa marchera.

    Dite moi si sa n'est pas claire.
     
  14. ConnorMcLeod

    ConnorMcLeod Modérateur

    J'utilise cette fonction qui est similaire et un poil plus efficace, mais c'est vraiment du chipotage, l'autre est tout aussi bien.
    Code (C):
    remove_ents_by_class( const class[] )
    {
        new ent = FM_NULLENT;
        while( (ent = find_ent_by_class(ent, class)) > 0 )
        {
            remove_entity(ent);
        }
    }
    Par contre, assure toi de bien définir une classname custom, propre à ton entité, on utilise "info_target" car il faut une class reconnue par le moteur du jeu pour pouvoir créer une entité, mais une fois que l'entité est créée, on défini alors la class custom avec entity_set_string(ent, EV_SZ_classname, NPC_CLASS) ou set_pev(ent, pev_classname, NPC_CLASS)

    Ensuite tu utilises remove_ents_by_class( NPC_CLASS )
    --- Message fusionné : 24 Avril 2013 ---
    Le code dans DeleteDealerAiming est incohérent, car tu ne comprends absolument rien à ce que tu fais.
    Une fois que tu as récupéré tempid par get_user_aiming, tu dois vérifier :

    1. que l'index affecté à tempid est supérieur à 0 (par besoin de vérifier alors que l'entité est valide, mais si ça te conforte tu peux le faire)
    2. que la classname est bien celle qui t'intéresse entity_get_string(tempid, EV_SZ_classname, blabla, charsmax(blabla))
    if( equal(blabla, NPC_CLASS)
    3. Et seulement là tu peux supprimer l'entité
    find_ent_by_class n'a absolument rien à faire dans cette fonction


    Comme beaucoup d'autres débutants, tu t'attaques à des choses trop compliquées pour ton niveau, tu ne prends pas le temps de comprendre ce que tu utilises, tu ne peux donc pas arriver à ce que tu souhaites.
    Faut pas aller plus vite que les charrue, ni mettre de la musique aux boeufs/
     
  15. Neg

    Neg Le Lama

    Tout marche merci :D 
     

Partager cette page

Chargement...
Chargement...