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

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

    WARRIOR OF THE NORTH

    Group
    FOUNDER
    Posts
    9,080
    Location
    Terre di Bretha

    Status
    CITAZIONE
    CODICE
    //:://////////////////////////////////////////////
    //:: Created By: Nemesis
    //:: Created On: 22/10/02
    //:://////////////////////////////////////////////
    /*  Fa avvicinare il PNG al primo PG di cui si accorge e comincia il dialogo.
       Da inserire nell'OnUserDefined del PNG.
       Vi ricordo che per far funzionare un quasliasi
       script OnHeartbeat-OnUserDefinedEvent bisogna modificare la seguente
       linea di codice nello script OnSpawn del PNG:
       //SetSpawnInCondition(NW_FLAG_HEARTBEAT_EVENT);
    in    SetSpawnInCondition(NW_FLAG_HEARTBEAT_EVENT);
       facile, no? :)
    */

    void main()
    {
    int nUser = GetUserDefinedEventNumber();
    if (nUser == 1002) // on Perceived event
      {
       object oTarget = GetLastPerceived();
       if(GetLastPerceptionSeen() == TRUE)
        {
         if(GetIsPC(oTarget))
          {
           ActionMoveToObject(oTarget, TRUE, 2.0f);
           ActionStartConversation(oTarget);
          }
        }
      }
    }

    Anche questo a me non funziona. Ho risolto col metodo fatto da ariall sulla trilogia. Mettere lo script in onexit di un attivatore

    CODICE
    void main(){
    object oPC=GetExitingObject();
    int iQ=GetLocalInt(oPC,"attivatorebis");
    if((GetIsPC(oPC)==TRUE)&&(iQ==FALSE)){
    object oStr=GetObjectByTag("TAG_PNG");
    float fDist=GetDistanceToObject(oPC);
    SetLocalInt(oPC,"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,"NOME_CONVERSAZIONE"))));}
    else{return;}}


    Edited by Tukaram - 13/11/2010, 18:55
     
    .
  2.     Top   Top
     
    .
    Avatar

    Paladino Planare

    Group
    Administrator
    Posts
    8,596
    Location
    Da qualche parte nel multiverso

    Status
    cosi però devi salvare 10000 script se usi le variabili per il tag del png dentro l'attivatore, solo uno.. per tutti quelli che parlano

    Edited by Lord Ariall - 13/11/2010, 23:49
     
    .
  3.     Top   Top
     
    .
    Avatar

    WARRIOR OF THE NORTH

    Group
    FOUNDER
    Posts
    9,080
    Location
    Terre di Bretha

    Status
    Cioè? Non ho capito come dici...
     
    .
  4.     Top   Top
     
    .
    Avatar

    Paladino Planare

    Group
    Administrator
    Posts
    8,596
    Location
    Da qualche parte nel multiverso

    Status
    cioè il tag del png e la conversazione li legge nell'attivatore e non nello script, lo script gli dice vai a leggere tra le variaibili dell'attivatore quale conv.. quale tag.
     
    .
  5.     Top   Top
     
    .
    Avatar

    WARRIOR OF THE NORTH

    Group
    FOUNDER
    Posts
    9,080
    Location
    Terre di Bretha

    Status
    se lo posti sostituisco subito, anche perchè in effetti di situazioni simili ce ne sarebbero diverse... ste variabili iniziano a gustarmi :lol:
     
    .
  6.     Top   Top
     
    .
    Avatar

    Paladino Planare

    Group
    Administrator
    Posts
    8,596
    Location
    Da qualche parte nel multiverso

    Status
    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.

    Edited by Lord Ariall - 21/7/2011, 21:11
     
    .
  7.     Top   Top
     
    .
    Avatar

    WARRIOR OF THE NORTH

    Group
    FOUNDER
    Posts
    9,080
    Location
    Terre di Bretha

    Status
    :1155673_smile_beerchug.gif: Lo inserisco subito!!
    Quindi se ho capito, metto un attivatore per ogni png che voglio inizi una conv col pg appena lo percepisce, e setto nelle variabili dell'attivatore tagpng - string - tag del png.
    Nello script inserisco il tag del png e il nome della conv. Sul png invece non tocco nulla, tranne ovviamente che deve aver su la conv (oppure può anche non averla? Se può non averla con questo script si aprono scenari importanti, con il png che potrebbe più volte avvicinare il pg e far partire più conv a seconda del momento della storia).
    Domanda:
    ma il sistema è a botta singola? Oppure ogni volta che il pg passa sull'attivatore quello torna a parlarci? (anche se non sarebbe un problema, visto che basterebbe inserire in un nodo della conv lo script che distrugge l'attivatore, o in onexit dello stesso...)
     
    .
  8.     Top   Top
     
    .
    Avatar

    Paladino Planare

    Group
    Administrator
    Posts
    8,596
    Location
    Da qualche parte nel multiverso

    Status
    si sarebbe a botta singola, sulle conv nn ho mai provato forse si nn c'è bisogno di metterla nel png ma non son sicuro.
     
    .
  9.     Top   Top
     
    .
    Avatar

    WARRIOR OF THE NORTH

    Group
    FOUNDER
    Posts
    9,080
    Location
    Terre di Bretha

    Status
    Ok. Appena provo ti dico ;)
     
    .
  10.     Top   Top
     
    .
    Avatar

    WARRIOR OF THE NORTH

    Group
    FOUNDER
    Posts
    9,080
    Location
    Terre di Bretha

    Status
    Riprendo il discorso, ho provato, ma mettendo in onenter dell'attivatore, in quanto in onexit per com'è strutturata l'area non andrebbe bene. Ho provato, ma non funziona. Il png resta fermo e non va ad aprire la conv col pg. Il motivo è perchè uso l'evento onenter invece che onexit? io come scrissi, nello script metto il tag del png e il nome della conversazione. Nell'attivatore invece la variabile tagpng-string-TAG DEL PNG.

    edit. Ho modificato GetExitingObject con GetEnteringObject, ma lo stesso non funziona. Oltretutto, se devo segnare il tag della conv sullo script, lo stesso devo fare uno script per ogni conv...o sbaglio? Non è che sull'attivatore oltre alla variabile con il tag del png ci va anche quella con il tag della conversazione?
     
    .
  11.     Top   Top
     
    .
    Avatar

    Signore dei criceti

    Group
    Administrator
    Posts
    12,979
    Location
    Isole del Dragone

    Status
    io ne avevo fatto una versione con controlli aggiunti, mettendo nelle variabili anche la botta singola, il TimeOut e il FALSE/TRUE per farlo correre o camminare, potendo quindi usare ovunque lo stesso attivatore salvato in tavolozza, anche in situazioni diverse.

    il controllo TimeOut, serve in caso il png fosse troppo lontano, oppure si possa incastrare da qualche parte nel tragitto.
    cioè, se dopo X secondi non è ancora arrivato vicino al pg, jumpa.

    2015_12_18_163803

    (non so perchè, ma se metti 4.0 nel float ti salva zero, mentre se metti soltanto 4, ti ritorna quel valore lì... comunque così funziona)

    C'è poi un controllo sul nome PG in modo che sia a botta singola (quando deve esserlo) per ogni pg che entra
    (cioè, così ogni nuovo pg che entra farà partire il dialogo per sè stesso)
    anche questo, volendo può essere cambiato o deciso nelle variabili, in base all'esigenza.

    qui però, non so se sia sufficente per un multy, magari andrebbe aggiunta la key alla string

    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 Nome=GetName(oPC);
    object Speaker=GetNearestObjectByTag(GetLocalString(OBJECT_SELF,"TagSpk"),OBJECT_SELF);
    float TimeOut=GetLocalFloat(OBJECT_SELF,"TimeOut");
      int Run=GetLocalInt(OBJECT_SELF,"Run");
      int Once=GetLocalInt(OBJECT_SELF,"Once");

    if(Once)
     {
     if(GetLocalString(OBJECT_SELF,"DoOnce")==Nome) return;
     SetLocalString(OBJECT_SELF,"DoOnce",Nome);
     }

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



    Il dialogo, in ogni caso, dato che è una coda di azioni, parte soltanto quando lo speaker ha raggiunto il pg, sia che ci arrivi camminando, che jumpando

    Edited by magobargle - 18/12/2015, 21:27
    Web
     
    .
  12.     Top   Top
     
    .
    Avatar

    WARRIOR OF THE NORTH

    Group
    FOUNDER
    Posts
    9,080
    Location
    Terre di Bretha

    Status
    La variabile once che è? Lo script, dove lo metti? La stringa col tag è il tag del png?
     
    .
  13.     Top   Top
     
    .
    Avatar

    Signore dei criceti

    Group
    Administrator
    Posts
    12,979
    Location
    Isole del Dragone

    Status
    Edito: salta pure questo reply e leggi quello dopo

    Va su OnEnter dell'attivatore e le variabili vanno sull'attivatore: ne fai uno in tavolozza e poi usi sempre quello, cambiando le variabili in base alle singole esigenze

    TagSpkr: il tag di chi deve iniziare il dialogo (nell'esempio è un locandiere di default)
    Avendo usato "NearestObject" non c'è bisogno che il tag sia univoco
    Once: 1= botta singola per ogni singolo pg ----- 0=si esegue ogni volta che ci passi (es: una guardia che ti dà l'altolà ogni volta che provi ad entrare in qualche posto)
    Run: 1=corre ----- 0=cammina
    TimeOut= dopo quel numero di secondi, se non è ancora arrivato vicino al pg, jumpa direttamente
    (se metti 0.0 jumpa subito e parte subito il dialogo: utile se vuoi vedere il dialogo già iniziato appena entri in un area. In quel caso metti l'attivatore nel punto in cui jumpa il pg, o che copra l'intera area)

    qui non è tenuto conto del fatto che il png poi torni alla sua posizione iniziale, una volta terminato il dialogo.
    quel comando si darebbe dal dialogo ed andrebbe aggiunta qui una parte per settargli la LocalLocation (in modo da non dover mettere tappe) : se ti serve lo aggiungo.

    edito:
    nota che se lo imposti a botta singola, Gigi farà partire il dialogo una sola volta per sè, ma se poi ci entra Gianni, il dialogo ripartirà, sempre a botta singola, anche per lui;
    se ti serve che possa essere settata anche una botta singola globale, (cioè il dialogo parte solo la prima volta che un pg qualsiasi entra e poi mai più per nessuno) allora va aggiunta un'ulteriore variabile.

    precisazione: o l'ho fatto pensando anche al multy, ma di multy mi intendo molto poco, dunque non so se sia sufficente il controllo sul nome del pg ( se nello shard ci sono degli omonimi, darebbe problemi) per cui sarebbe bene, credo, aggiungere qualcosa alla string del nome, o sostituire il controllo sul nome con qualcos'altro, per esempio la cdkey, ma anche così bisognerebbe poi vedere se lo shard concede la possibilità di avere più di un pg.... probabilmente è necessario fare il controllo su nome+cdkey, ma per modificare in questo senso, attendo che me lo confermi qualcuno che capisce qualcosa più di me, di multy :P magari c'è un metodo meno cervellotico, che io non conosco.

    riedito:
    a ben vedere, credo vada aggiunto ancora un'altro controllo, cioè se il png non è già in conversazione... altrimenti, se è per un multy, uno sta parlando ed entra un'altro, gli si stoppa il dialogo al primo (almeno credo... non sono sicuro se accada questo oppure se il motore possa aprire due dialoghi contemporanei tra due pg ed un singolo png)

    come dicevo, il multy non è il mio pane quotidiano, ma qui puoi rispondermi tu: se parlo con un negoziante ed arriva un altro a cliccarlo, entrambi possono dialogare separatamente? Se è così allora quest'altro controllo non serve.

    Edited by magobargle - 19/12/2015, 22:03
    Web
     
    .
  14.     Top   Top
     
    .
    Avatar

    Signore dei criceti

    Group
    Administrator
    Posts
    12,979
    Location
    Isole del Dragone

    Status
    Ok, adesso dovrebbe tener conto di tutte le possibilità:

    Once=0 : si esegue ogni volta
    Once=1 : si esegue una sola volta per ogni PG
    Once=2 : si esegue una sola volta e basta

    TagSpk: il tag del PNG (non c'è bisogno che il tag sia univoco)

    Run=0: il png cammina
    Run=1: il png corre

    TimeOut=X.0 : dopo X secondi, se il png non è ancora arrivato vicino al pg, jumpa direttamente
    TimeOut=0.0 : il png jumpa subito e parte subito il dialogo

    Dial - string - nomedialogo: parte il dialogo corrispondente
    Lasciando il campo vuoto (non metti proprio nulla) parte il dialogo che c'è già sul png
    (quest'ultima, se fosse necessario usare un dialogo in tavolozza e non quello già presente sul png)

    non so se esista una funzione in grado di identificare univocamente i PG senza usare la CDKey, ad ogni modo così dovrebbe funzionare senza problemi.

    ho messo anche il controllo sul png: se sta già parlando con un altro PG, nulla accade.
    può anche darsi che quest'ultima cosa sia inutile: come dicevo, non so come in multy vengano gestiti i dialoghi tra un png e più di un pg.

    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 Nome=GetName(oPC)+GetPCPublicCDKey(oPC,FALSE);
    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(IsInConversation(Speaker)) return;

    if(Once==1)
     {
     if(GetLocalString(OBJECT_SELF,"DoOnce")==Nome) return;
     SetLocalString(OBJECT_SELF,"DoOnce",Nome);
     }
    else if(Once==2)
     {
     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 - 19/12/2015, 22:22
    Web
     
    .
  15.     Top   Top
     
    .
    Avatar

    WARRIOR OF THE NORTH

    Group
    FOUNDER
    Posts
    9,080
    Location
    Terre di Bretha

    Status
    Ottimo. Non serve per il multy, ma per il single per fare partire conv con gli henc ;)
     
    .
24 replies since 9/12/2008, 17:32   333 views
  Share  
.