Svenska 3D-Tåg - Forum

Svenska 3D-Tåg - Forum (http://www.e-buzz.se/forum/index.php)
-   Scenarios och scripts (http://www.e-buzz.se/forum/forumdisplay.php?f=20)
-   -   Triggers (http://www.e-buzz.se/forum/showthread.php?t=28869)

ngtutp 2011-01-21 12:20

Triggers
 
Hej

Kan en trigger känna av ett tåg även om de står stilla på en trigger?

Försöker få det att funka i driver setup att tåg a skall vänta på att tåg b skall aktivera trigger c.

Problemet är att om tåg b redan står på triggern så fattar inte tåg a det i sitt körschema :(


Tack på förhand :)

Hobo 2011-01-21 12:42

Kan du inte prova att köra loket precis förbi triggern, och där stanna? Då funkar det garanterat.
Jag är rätt säker på att loket måste passera innan den löser ut.

Såg plötsligt att det inte var så du menade riktigt, men det går att ställa in triggern så att den gäller endast "en gång". Om du kryssar ur den rutan, så kanske det funkar?

ngtutp 2011-01-21 13:22

Citat:

Ursprungligen postat av Hobo (Inlägg 228032)
Kan du inte prova att köra loket precis förbi triggern, och där stanna? Då funkar det garanterat.
Jag är rätt säker på att loket måste passera innan den löser ut.

Såg plötsligt att det inte var så du menade riktigt, men det går att ställa in triggern så att den gäller endast "en gång". Om du kryssar ur den rutan, så kanske det funkar?


Det går inte välja om du lägger in det i körschemat för en förare i "driver setup" :(

svenolov 2011-01-21 14:33

Citat:

Ursprungligen postat av ngtutp (Inlägg 228026)
Hej

Kan en trigger känna av ett tåg även om de står stilla på en trigger?

Försöker få det att funka i driver setup att tåg a skall vänta på att tåg b skall aktivera trigger c.

Problemet är att om tåg b redan står på triggern så fattar inte tåg a det i sitt körschema :(


Tack på förhand :)

1. Jag förmodar att tåg b redan står på triggern när du startar Driver. Rätt?
2. Eller att tåg b redan har stannat på triggern innan du ger instruktionen att tåg a ska vänta. Rätt?

Om något av ovanstående påståenden är rätt så måste triggern sända ett meddelande efter det att tåg a får instruktionen att vänta. Och det gör den inte. Triggern sänder sitt meddelande när lok b stannar, så tåg a måste ligga i "vänteläge" just i det ögonblicket.

Så svaret på din fråga är nej, om man inte ger den instruktionen att göra så (i ett skript). En trigger (som namnet antyder) triggar på dynamiska händelser, den ligger inte och sänder meddelanden hela tiden. Det är tre händelser som en trigger känner av. Meddelandet sänds endast en gång per händelse.

1. Enter. Sänder ett meddelande när ett tåg kommmer innanför triggerns radie.
2. Stopped. Sänder ett meddelande när ett tåg stannar och befinner sig innanför radien. Om tåget rör sig efter denna händelse och stannar igen utan att ha lämnat triggern, så sänds meddelandet på nytt.
3. Leave. Sänder ett meddelande när ett tåg lämnar triggerns radie.

EDIT: En sak till som är bra att känna till när det gäller en trigger. En triggers avkänningsområde är en cirkel (anges med en radie). Det betyder att den känner av ett område, snarare än en sträcka på spåret. Den kan alltså känna av flera spår, om spåren ligger inom samma cirkel (radie).

Om man bara är intresserad av vad som händer på ett visst spår, ska man använda en Trackmark istället. Avkänningsområdet för en Trackmark anges också med en radie, men den känner bara av spåret som den är placerad på. En Trackmark känner också av rikningen i förhållande till ett tåg, medan en Trigger inte är riktningskänslig.

ngtutp 2011-01-21 15:02

Citat:

Ursprungligen postat av svenolov (Inlägg 228041)
1. Jag förmodar att tåg b redan står på triggern när du startar Driver. Rätt?
2. Eller att tåg b redan har stannat på triggern innan du ger instruktionen att tåg a ska vänta. Rätt?

Om något av ovanstående påståenden är rätt så måste triggern sända ett meddelande efter det att tåg a får instruktionen att vänta. Och det gör den inte. Triggern sänder sitt meddelande när lok b stannar, så tåg a måste ligga i "vänteläge" just i det ögonblicket.

Så svaret på din fråga är nej, om man inte ger den instruktionen att göra så (i ett skript). En trigger (som namnet antyder) triggar på dynamiska händelser, den ligger inte och sänder meddelanden hela tiden. Det är tre händelser som en trigger känner av. Meddelandet sänds endast en gång per händelse.

1. Enter. Sänder ett meddelande när ett tåg kommmer inanför triggerns radie.
2. Stopped. Sänder ett meddelande när ett tåg stannar och befinner sig innanför radien. Om tåget rör sig efter denna händelse och stannar igen utan att ha lämnat triggern, så sänds meddelandet på nytt.
3. Leave. Sänder ett meddelande när ett tåg lämnar triggerns radie.

Tack för ditt svar!

Ditt andra påstående är rätt att tåg b redan står på trigger c när instruktionen för tåg a att han skall vänta på att tåg b skall trigga trigger c.

Är det lätt att ändra i scriptet så han ligger å sänder hela tiden då ett tåg befinner sig på en trigger?

Tack på förhand :)

svenolov 2011-01-21 16:20

Citat:

Ursprungligen postat av ngtutp (Inlägg 228042)
Tack för ditt svar!

Ditt andra påstående är rätt att tåg b redan står på trigger c när instruktionen för tåg a att han skall vänta på att tåg b skall trigga trigger c.

Är det lätt att ändra i scriptet så han ligger å sänder hela tiden då ett tåg befinner sig på en trigger?

Tack på förhand :)

Jag tror inte att det är lösningen i ditt fall. Det skulle få oanade konsevenser i andra sammanhang. Nej, det är beteendet på den regel/kommando (rule/driver command), som tåg a använder sig av, som ska modifieras. Nu vet jag inte vilken regel/kommando som du använder, så det är svårt att ge ett generellt svar.

ngtutp 2011-01-21 17:37

Citat:

Ursprungligen postat av svenolov (Inlägg 228046)
Jag tror inte att det är lösningen i ditt fall. Det skulle få oanade konsevenser i andra sammanhang. Nej, det är beteendet på den regel/kommando (rule/driver command), som tåg a använder sig av, som ska modifieras. Nu vet jag inte vilken regel/kommando som du använder, så det är svårt att ge ett generellt svar.


Jag använder mig utav "WaitForTrigger" <KUID2:57344:80001:2>

Ha de så bra :D

svenolov 2011-01-21 19:21

Citat:

Ursprungligen postat av ngtutp (Inlägg 228053)
Jag använder mig utav "WaitForTrigger" <KUID2:57344:80001:2>

Ha de så bra :D

Ok, jag ska titta på den och återkommer med ett bättre svar.

svenolov 2011-01-22 03:18

Citat:

Ursprungligen postat av ngtutp (Inlägg 228053)
Jag använder mig utav "WaitForTrigger" <KUID2:57344:80001:2>

Ha de så bra :D

Nu har jag tittat på koden och gjort ett tillägg som jag har testat. Det fungerar bra.

Komandot testar nu om det redan står ett tåg på triggern. Om det står ett tåg där så händer detta.

1. Om man valt "Any Train" så avslutas kommandot direkt.
2. Om man har angett ett visst lok, och loket överenstämmer med tågets lok, så avslutas kommandot.

Komandot uppför sig alltså precis likadant, som om/när tåget anländer till triggern.

Ingenting av originalkoden är ändrad. Det är bara två tillägg som behöver göras.

1. Klona kommandot först, så att det får din kuid.
2. Redigera filen waitfortriggerschedulecommand.gs enligt nedan.

Efter raden Message msg; och före raden wait() lägger du in följande rad. Markerad med röd text.
Kod:

    Message msg;
 
    train.PostMessage(train, "Train", "CheckTrigger", 2.0); // added by Sven
 
    wait()
    {

Sen måste du lägga till en "event handler" i wait() lopen. Allt mellan dom streckade linjerna ska med. Markerad med röd text. Kopiera och klistra.
Obs! De två första och de två sista raderna i nedanstående kod, är från originalkoden.
Kod:

    wait()
    {
//    Check trigger added 110121 by Sven     
//    =======================================================================================
      on "Train", "CheckTrigger":
      {
        MapObject nextItem = null;
        Vehicle vehicle = null;
 
        GSTrackSearch gst = trig.BeginTrackSearch(true);
        int  distance = gst.GetDistance();
        while (!vehicle and (distance < 5))
        {
          nextItem = gst.SearchNext();
          distance = gst.GetDistance();
          if (nextItem)
            vehicle = cast<Vehicle>nextItem;
        }
 
        if (!vehicle)
        {
          gst = trig.BeginTrackSearch(false);
          distance = gst.GetDistance();
 
          while (!vehicle and (distance < 5))
          {
            nextItem = gst.SearchNext();
            distance = gst.GetDistance();
            if (nextItem)
              vehicle = cast<Vehicle>nextItem;
          }
        }
 
        if (vehicle)
        {
          Train v_train = vehicle.GetMyTrain();
 
          if (v_train and v_train.IsStopped())
          {
            Locomotive loco = v_train.GetFrontmostLocomotive();
 
            if (loco and (loco.GetName() == trainId))
            {
              Interface.Print(loco.GetName()+" has entered trigger ''" +trig.GetName()+"''");
              break;
            }
            else if (trainId == "")
            {
              Interface.Print("A train has entered trigger ''" +trig.GetName()+"''");
              break;
            }
          }
        }       
        train.PostMessage(train, "Train", "CheckTrigger", 2.0);
        continue;
      }
//    Check trigger end.
//    =======================================================================================
      on "Object", "Enter", msg:
      {

-

ngtutp 2011-01-22 14:20

Citat:

Ursprungligen postat av svenolov (Inlägg 228103)
Nu har jag tittat på koden och gjort ett tillägg som jag har testat. Det fungerar bra.

Komandot testar nu om det redan står ett tåg på triggern. Om det står ett tåg där så händer detta.

1. Om man valt "Any Train" så avslutas kommandot direkt.
2. Om man har angett ett visst lok, och loket överenstämmer med tågets lok, så avslutas kommandot.

Komandot uppför sig alltså precis likadant, som om/när tåget anländer till triggern.

Ingenting av originalkoden är ändrad. Det är bara två tillägg som behöver göras.

1. Klona kommandot först, så att det får din kuid.
2. Redigera filen waitfortriggerschedulecommand.gs enligt nedan.

Efter raden Message msg; och före raden wait() lägger du in följande rad. Markerad med röd text.
Kod:

    Message msg;
 
    train.PostMessage(train, "Train", "CheckTrigger", 2.0); // added by Sven
 
    wait()
    {

Sen måste du lägga till en "event handler" i wait() lopen. Allt mellan dom streckade linjerna ska med. Markerad med röd text. Kopiera och klistra.
Obs! De två första och de två sista raderna i nedanstående kod, är från originalkoden.
Kod:

    wait()
    {
//    Check trigger added 110121 by Sven     
//    =======================================================================================
      on "Train", "CheckTrigger":
      {
        MapObject nextItem = null;
        Vehicle vehicle = null;
 
        GSTrackSearch gst = trig.BeginTrackSearch(true);
        int  distance = gst.GetDistance();
        while (!vehicle and (distance < 5))
        {
          nextItem = gst.SearchNext();
          distance = gst.GetDistance();
          if (nextItem)
            vehicle = cast<Vehicle>nextItem;
        }
 
        if (!vehicle)
        {
          gst = trig.BeginTrackSearch(false);
          distance = gst.GetDistance();
 
          while (!vehicle and (distance < 5))
          {
            nextItem = gst.SearchNext();
            distance = gst.GetDistance();
            if (nextItem)
              vehicle = cast<Vehicle>nextItem;
          }
        }
 
        if (vehicle)
        {
          Train v_train = vehicle.GetMyTrain();
 
          if (v_train and v_train.IsStopped())
          {
            Locomotive loco = v_train.GetFrontmostLocomotive();
 
            if (loco and (loco.GetName() == trainId))
            {
              Interface.Print(loco.GetName()+" has entered trigger ''" +trig.GetName()+"''");
              break;
            }
            else if (trainId == "")
            {
              Interface.Print("A train has entered trigger ''" +trig.GetName()+"''");
              break;
            }
          }
        }       
        train.PostMessage(train, "Train", "CheckTrigger", 2.0);
        continue;
      }
//    Check trigger end.
//    =======================================================================================
      on "Object", "Enter", msg:
      {

-




Hej

Det fungerade jättebra :)
Tack så oerhört mycket :applad:

Hälsningar Robin


Alla tider är GMT +2. Klockan är nu 13:53.

Powered by vBulletin® Version 3.7.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
© Svenska 3D-Tåg 2001-2009