NPG s'avvicina al primo PG che vede e inizia la conversazione

« Older   Newer »
 
  Share  
.
  1.     Top   Top
     
    .
    Avatar

    Signore dei criceti

    Group
    Administrator
    Posts
    12,979
    Location
    Isole del Dragone

    Status
    lol, se è per single, tutta parte che identifica il pg non serve a un ciufolo :P

    allora va meglio così

    Once - int - 1 (1=bottasingola, 0=sempre attivo)
    Run - int - 1 (1=corre, 0=cammina)
    TagSpk - string - TagPng (vabbè, il tag del png)
    TimeOut - float - X.X (dopo X.X secondi il png jumpa)
    Dial - string - nomedialogo

    Ho lasciato il nome del dialogo, perchè potresti avere un png con un proprio dialogo, che magari deve avviarne un'altro solo in quell'occasione: se non metti quel campo (lo ignori proprio), parte quello nelle proprietà del png, altrimenti, quello che metti come string
    cioè quello lo metti solo se devi fare partire un dialogo dalla tavolozza e non quello che sta già sul png.

    Se metti TimeOut a zero, il png jumperà subito e partirà subito anche il dialogo.
    altrimenti, secondo la distanza da cui parte il png, mettilo sempre un pò più lungo di quanto ci metterebbe ad arrivare a piedi.
    quello lì serve solo ad evitare che si incastri da qualche parte, ma per andare bene, non dovrebbe mai attivarsi.

    Tieni presente che il TimeOut è anche il momento in cui il pg viene liberato dall'effetto di immobilità, dunque, cerca di settarlo a 3 o 4 secondi più lungo di quanto ci impiega il png ad arrivare camminando.
    comunque parte un dialogo e quindi, anche se il pg non può ancora muoversi per qualche secondo, va bene lo stesso, anzi, se è un pò più lungo impedisci che il giocatore clicchi qualcosa e chiuda subito il dialogo per sbaglio.
    se il timeout arriva quando il png è a meno di 3 metri, comunque, non jumpa lo stesso e parte subito il dialogo (puoi regolarlo nel void jump).


    Onenter attivatore
    CODICE
    void jump(object oPC, object Speaker)
    {
    if(GetDistanceBetween(oPC,Speaker)>3.0)
    AssignCommand(Speaker,JumpToLocation(GetLocation(oPC)));
    }

    void main()
    {
    object oPC=GetEnteringObject();
    if(!GetIsPC(oPC)) return;

    string Dial=GetLocalString(OBJECT_SELF,"Dial");
    object Speaker=GetNearestObjectByTag(GetLocalString(OBJECT_SELF,"TagSpk"));
    float TimeOut=GetLocalFloat(OBJECT_SELF,"TimeOut");
      int Run=GetLocalInt(OBJECT_SELF,"Run");
      int Once=GetLocalInt(OBJECT_SELF,"Once");

    if(Once)
     {
     if(GetLocalInt(OBJECT_SELF,"DoOnce")) return;
     SetLocalInt(OBJECT_SELF,"DoOnce",1);
     }

    AssignCommand(oPC,ClearAllActions());
    ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectCutsceneImmobilize(),oPC,TimeOut);
    AssignCommand(oPC,SetFacingPoint(GetPosition(Speaker)));
    AssignCommand(Speaker,ActionForceMoveToObject(oPC,Run,1.0,TimeOut));
    DelayCommand(TimeOut,jump(oPC,Speaker));
    AssignCommand(Speaker,ActionStartConversation(oPC,Dial));
    }


    Edited by magobargle - 20/12/2015, 01:24
    Web
     
    .
  2.     Top   Top
     
    .
    Avatar

    Signore dei criceti

    Group
    Administrator
    Posts
    12,979
    Location
    Isole del Dragone

    Status
    Consuls-%D1%84%D0%BE%D1%82%D0%BE%D1%88%D0%BE%D0%BF-%D0%BC%D0%B0%D1%81%D1%82%D0%B5%D1%80-1599840

    ma porca vacca solo ora leggo che è per gli henchmen :18:
    ma come ho fatto a non vederlo, lol. :rolleyes:
    bisogna fare il controllo se è henchman allora, altrimenti, solo col tag te lo jumpa a fianco anche se lo hai lasciato a casa sua.

    se è per quello, allora nei miei moduli io uso questo, molto più semplice: controlla se tra i tuoi henchmen ce n'è uno con quel tag e fa partire il dialogo solo in quel caso (cioè funziona anche se hai con te 10 henchmen e parte solo se il tizio è effettivamente il tuo henchman)

    metti il tag direttamente nello script e stop, senza variabili sull'attivatore: essendo henchmen tutti quegli altri casini non servono.
    io ho questo sistema in decine di posti lungo tre moduli e non ha mai sgarrato una volta

    in questo caso non metto la camminata, ma direttamente il jump, perchè le azioni automatiche del mercenario (per esempio, seguire il pg) potrebbero interferire.

    anche la botta singola, qui è fissa (se hai con te l'henchman), ma in questo caso immagino ti serva sempre così


    CODICE
    void main()
    {
    object oPC=GetEnteringObject(),
          oHench=GetHenchman(oPC,1);
      int nHench;

    if(!GetIsPC(oPC)) return;
    if(GetLocalInt(OBJECT_SELF,"DoOnce")) return;

    while(oHench != OBJECT_INVALID)
        {
        string sTag=GetTag(oHench);
        if(sTag=="TAG_HENCHMAN")
           {
            SetLocalInt(OBJECT_SELF,"DoOnce",1);
            ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectCutsceneImmobilize(),oPC,2.0);
            AssignCommand(oHench,ClearAllActions());
            AssignCommand(oHench,ActionJumpToObject(oPC));
            DelayCommand(2.0,AssignCommand(oHench,ActionStartConversation(oPC)));
            break;
           }
        oHench=GetHenchman(oPC,++nHench);
        }
    }



    Nel caso invece che nel tuo modulo tu possa avere un solo henchman alla volta, ma magari potendolo scegliere tra 4 disponibili, allora usa l' IF in questo modo

    if(sTag=="TAG1"||sTag=="TAG2"||sTag=="TAG3"||sTag=="TAG4")

    Edited by magobargle - 20/12/2015, 02:57
    Web
     
    .
  3.     Top   Top
     
    .
    Avatar

    WARRIOR OF THE NORTH

    Group
    FOUNDER
    Posts
    9,080
    Location
    Terre di Bretha

    Status
    Bè nell'attivatore devo cmq mettere la variabile col tag della conv no? Ad ogni modo avrei cmq settato a zero le altre variabili e lasciato solo quella col tag della conv e il tag dell'henc.
     
    .
  4.     Top   Top
     
    .
    Avatar

    Signore dei criceti

    Group
    Administrator
    Posts
    12,979
    Location
    Isole del Dragone

    Status
    il modo migliore per farlo dipende da quanti henchmen ci sono disponibili nel modulo e da quanti puoi portarne con te contemporaneamente, ma anche se il dialogo è lo stesso per ognuno di loro, oppure se ognuno deve farne partire uno proprio.

    per esempio, come dicevo, se ne hai un tot disponibili, ma puoi assumerne solo uno alla volta ed il dialogo è il medesimo per tutti (oppure è quello che sta nelle proprietà del PNG), allora le variabili esterne non ti servono: metti tutti i nomi nello script e stop... quello controlla se tra i tuoi hencmen ce n'è uno che corrisponde ad uno di quelli disponibili e fa partire il dialogo con quello
    (considera che potrebbero essere considerati come henchmen anche i vari compagni animali, evocazioni, famigli, ecc)

    se invece puoi portartene dietro un tot, ma il dialogo parte con solo uno di quelli (intendo solo uno di loro per tutti i dialoghi) allora basta mettere solo quell'unico nome nello script

    se ne hai molti, puoi assumerli tutti e diversi attivatori fanno partire dialoghi con diversi henchmen, oppure anche se te ne porti solo uno, ma di nuovo il dialogo può partire con ognuno di loro, allora si, ti conviene mettere il tag nelle variabili (e magari anche anche il nome del dialogo), in modo da usare sempre lo stesso attivatore cambiandogli solo quello.

    in quest'ultimo caso puoi scriverlo così:

    nelle variabili metti il tag

    TAG_H - string - TAG_HENCHMAN

    e nello script, invece di mettere il tag, lo vai a prendere da lì, cioè, al posto di

    string sTag=GetTag(oHench);
    if(sTag=="TAG_HENCHMAN")


    metti


    string TagH=GetLocalString(OBJECT_SELF,"TAG_H");
    string sTag=GetTag(oHench);
    if(sTag==TagH)

    ... eccetera

    Però, appunto, conta anche quale dialogo deve partire e da dove (proprietà del png o tavolozza) e ci sono molte possibili combinazioni che non conosco.
    se mi dici quanti ne hai, quanti te ne puoi portare dietro contemporaneamente, con quali devono partire i dialoghi e da dove partono i dialoghi, te lo riscrivo personalizzato, lasciando fuori tutto quello che non serve direttamente nel tuo modulo.
    molte variabili servono se ci sono molte possibilità diverse, altrimenti non è detto che siano utili.
    Web
     
    .
  5.     Top   Top
     
    .
    Avatar

    WARRIOR OF THE NORTH

    Group
    FOUNDER
    Posts
    9,080
    Location
    Terre di Bretha

    Status
    CITAZIONE (Lord Ariall @ 14/11/2010, 06:40) 
    CODICE
    void main(){
    object oPC=GetExitingObject();
    int iQ=GetLocalInt(OBJECT_SELF,"attivatorebis");
    if((GetIsPC(oPC)==TRUE)&&(iQ==FALSE)){
    object oStr=GetObjectByTag(GetLocalString(OBJECT_SELF,"tagpng"));// tagpng e' il NOME della variabile nell'attivatore segnare il tag del png
    float fDist=GetDistanceToObject(oPC);
    SetLocalInt(OBJECT_SELF,"attivatorebis",TRUE);
    ApplyEffectToObject(DURATION_TYPE_TEMPORARY,EffectCutsceneParalyze(),oPC,4.0f);
    AssignCommand(oStr,ClearAllActions());
    AssignCommand(oStr,ActionForceMoveToObject(oPC,TRUE,fDist,30.0f));
    DelayCommand(0.5,ActionDoCommand(AssignCommand(oStr,ActionStartConversation(oPC,GetLocalString(OBJECT_SELF,"conversazione")))));} //segnare con nome conversazione la vera conversazione
    else{return;}}


    cosi è come gli incontri random o le frasi random.

    Alla fine credo che questo sia al caso mio. Non avevo capito cosa volesse dire Ariall, ma rileggendo ho capito che faccio un unico script in onenter dell'attivatore e poi nell'attivatore setto due variabili:
    tagpng -- string -- TAG DEL PNG
    conversazione -- string -- TAG DELLA CONVERSAZIONE

    Lo script lo lascio così com'è senza toccare nulla, così che sia unico per ogni conv o npg che debba parlare.
     
    .
  6.     Top   Top
     
    .
    Avatar

    Signore dei criceti

    Group
    Administrator
    Posts
    12,979
    Location
    Isole del Dragone

    Status
    in quel modo il png tenta di parlarti anche se non è il tuo hencman e se lo hai lasciato a casa sua (GetObjectByTag lo va a pescare in qualunque punto del modulo si trovi), in pratica verrebbe a parlarti anche se lo hai appena licenziato (trovandosi quindi nella stessa area) e proverebbe a dirigersi verso di te per trenta secondi, anche se fosse rimasto a casa sua. Cioè lo script fa il suo dovere, ma, secondo me, non nel modo più corretto.

    Cioè è stato pensato per png generici, già presenti nell'area dell'attivatore (il classico caso del tizio che ti viene incontro se entri in casa sua) e non per gli henchmen.
    può andare bene nel caso che sia previsto dalla trama che quel png debba per forza essere con te in quel momento come henchman, altrimenti bisogna aggiungere un controllo e quale tipo di controllo dipende appunto da come sono impostati gli henchmen nel tuo modulo.

    tra l'altro c'è una cosa che non capisco, magari può spiegarmela Ariall

    float fDist=GetDistanceToObject(oPC);
    //Returns the distance from the caller of the script to the object in meters.
    //The measurement taken will be from whatever in game object is calling this script

    in pratica il png dovrebbe fermare la sua corsa verso il pg a fDist metri di distanza da lui.
    non capisco bene cosa intenda il lexicon per "caller", in questo caso, ma a me pare possa riferirsi solo allo stesso attivatore, o al limite al PG, per cui darebbe sempre zero, dunque non ne capisco l'utilità: il dialogo normalmente parte ad una distanza maggiore di quella ed ho quindi il sospetto che il comando di MoveToObject rimarrebbe attivo anche quando non dovrebbe.

    però non conosco bene il funzionamento di quella funzione (magari si stoppa da sè se inizia un dialogo), quindi, magari mi sbaglio eh.

    poi, questo lo dico perchè mi è successo nei test, fare muovere un henchman verso il PG in quel modo può creare problemi, per questo io ho scelto il Jump e non il Walk, anche se è più brutto a vedersi: è vero che c'è un clearallactions, però gli henchmen hanno cicli continui che potrebbero dare fastidio o anhe impedire lo startconversation (nei test mi capitava proprio questo): in questo caso intendo il loro automatismo di seguire il pg, che, se l'henchman si trovasse in quel momento abbastanza lontano, potrebbe interferire con i comandi dello script, cioè, per andare sul sicuro andrebbe licenziato all'Onenter e riassunto ad inizio dialogo (ma forse è proprio per quello che viene usato il "ForceMove" ... come dicevo non conosco bene quella funzione e che differenza ci sia da normale "MoveTo")

    Insomma, quantomeno, fai qualche test supplementare per vedere che succede nei vari casi.

    Edited by magobargle - 21/12/2015, 16:00
    Web
     
    .
  7.     Top   Top
     
    .
    Avatar

    WARRIOR OF THE NORTH

    Group
    FOUNDER
    Posts
    9,080
    Location
    Terre di Bretha

    Status
    Nella trilogia che sto rifacendo con i bcm e ampliando, gli henc sono ben definiti nell'arco della storia. Non può capitare che il pg non sia con un henc per il quale prevedo la conv ;)
     
    .
  8.     Top   Top
     
    .
    Avatar

    Signore dei criceti

    Group
    Administrator
    Posts
    12,979
    Location
    Isole del Dragone

    Status
    allora ho scritto un sacco per nulla e va benissimo pure quello. :14:

    buon lavoro. ;)

    ... ma stai upgradando la vecchia saga o stai facendo delle novità sul sequel ?
    perchè mi farà piacere giocarmele, in ambo i casi :19:

    edito: visto adesso il link, come non detto :rolleyes:
    Web
     
    .
  9.     Top   Top
     
    .
    Avatar

    WARRIOR OF THE NORTH

    Group
    FOUNDER
    Posts
    9,080
    Location
    Terre di Bretha

    Status
    Rifacendo coi bcm e ampliando con altre quest secondarie. La trama resta quella dell'originale ;)
    Per nulla non hai scritto, perchè comunque hai espanso l'utilizzo dello script :08:
     
    .
  10.     Top   Top
     
    .
    Avatar

    Signore dei criceti

    Group
    Administrator
    Posts
    12,979
    Location
    Isole del Dragone

    Status
    un test però fallo lo stesso: metti l'henchman un pò lontano dall'attivatore, poi corri sull'attivatore in modo da lasciarlo indietro il più possibile.

    quello che accadeva a me (anche con il ForceMove) era che il png mi correva incontro, ma quando finalmente arrivava, il dialogo non partiva.
    Però io usavo un mio script, non quello di Ariall (pur se molto simile) , dunque è probabile che invece a te, in quel modo, funzioni ugualmente... io però un testino in quel senso lo farei, perchè lì magari rischi il blocco della trama e va evitato assolutamente.

    se poi le aree dove deve accadere sono abbastanza piccole, (cioè se l'henchmen non può essere troppo lontano dal pg) allora non dovrebbero esserci problemi.

    il punto è che di norma, quando si deve far compiere un azione a un henchman, lo si licenzia, gli si assegna l'azione e poi lo si riassume "al volo", proprio per evitare le interferenze dovute ai suoi script da henchman.
    (facendolo jumpare non c'è bisogno, però è brutto a vedersi, aimè.)
    Web
     
    .
24 replies since 9/12/2008, 17:32   333 views
  Share  
.