[No Limits 2] Tuto sur les scripts

Twan

Membre
27 Septembre 2008
5 641
60
34
Lille
Bon, je vais résumer ici tous les tutos sur les scripts. Je suis en train de créer celui sur les switch track tels que Expedition Everest. En attendant voici celui de la musique on ride qui démarre et s'arrête quand vous voulez !

Musique On Ride :

1- On enregistre le code suivant :
import com.nolimitscoaster.*;

public class OnboardMusic extends Script implements TrackTriggerListener
{
  private static final String musicFile = "music.ogg";
  private static final String startMusicTriggerName = "startmusic";
  private static final String stopMusicTriggerName = "stopmusic";

  private TrackTrigger startMusicTrig;
  private TrackTrigger stopMusicTrig;
 
  public bool onInit()
  {
    Coaster coaster = sim.getCoasterForEntityId(getParentEntityId());
    if (coaster == null)
    {
      System.err.println("This script must be attached to a coaster");
      return false;
    }

    startMusicTrig = coaster.getTrackTrigger(startMusicTriggerName);
    if (startMusicTrig == null)
    {
      System.err.println("TrackTrigger not found: '" + startMusicTriggerName + "'");
      return false;
    }

    startMusicTrig.addTrackTriggerListener(this);
   
    stopMusicTrig = coaster.getTrackTrigger(stopMusicTriggerName);
    if (stopMusicTrig == null)
    {
      System.err.println("TrackTrigger not found: '" + stopMusicTriggerName + "'");
      return false;
    }
   
    stopMusicTrig.addTrackTriggerListener(this);
   
    for (int i=0; i<coaster.getTrainCount(); ++i)
    {
      StreamedSound music = StreamedSound.loadFromFile(musicFile);
      if (music == null)
      {
        System.err.println("Music file cannot be found or opened: '" + musicFile + "'");
        return false;
      }
     
      Train train = coaster.getTrainAt(i);
     
      train.setOnboardStreamedSound(music);
    }
   
    return true;
  }



  public void onTrainEntering(TrackTrigger trigger, Train train)
  {
    StreamedSound music = train.getOnboardStreamedSound();
    if (music != null)
    {
      if (trigger == startMusicTrig)
      {
        music.stop();
        music.play();
      }
      else if (trigger == stopMusicTrig)
      {
        music.stopFaded(5.0f);
      }
    }
  }

  public void onTrainLeaving(TrackTrigger trigger, Train train)
  {

  }

}
ans un fichier nommé OnboardMusic.nlvm (à créer avec bloc note ou notepad ++ ou Dreamweaver..).

2- Ce fichier "OnboardMusic.nlvm" il faut l'enregister dans le dossier de votre parc en modifiant au préalable la ligne  5 : 'private static final String musicFile = "music.ogg"; -> Remplacer music.ogg par, par votre nom de musique en .ogg (ici pour benjie ce serait space.ogg) /!\ mettre ce fihier musique dans le même répertoire que votre parc et votre script.

3- Sur votre track, il faut ajouter deux "triggers" un nommé "startmusic" quand vous voulez commencer la musique et l'autre nommé "stopmusic" quand vous voulez qu'elle s'arrête.

4- Il ne reste plus qu'à importer votre script dans "coasters properties -> Script -> add"

Et hop, vous voilà avec une musique on ride qui démarre et qui s'arrête quand vous voulez  :wink:
 
D'ailleurs a propo de ce script , une personne sur un groupe anglais NL a developper un programme /
1794712_647737021942383_1399805091_n.jpg



Je vous tiendrais au courant de sa disponibilité ;)
 
Aah ! Merci à vous deux pour ces news et tutos.
Voilà un petit truc intelligent... Nickel ce générateur de script  :mrgreen:
 
Merci pour les explications, ça fonctionne enfin 8-) ! Ca va sûrement servir à beaucoup de gens.

Sinon super idée le programme pour scripter, je me demande jusqu'où il va pouvoir pousser les possibilités, à suivre attentivement.
 
Salut à tous !

Je viens vers vous pour une petite question concernant ce fameux script... Donc il fonctionne bien, pas de soucis à ce niveau la. J'ai juste essayé de pousser un petit plus les choses, en créant 2 scripts avec 2 bandes sons différentes qui fonctionneraient par blocs. Donc je m'explique : Quand un train quitte la gare > Lancement de la bande son "pre-launch" jusqu'au lancement du train, ou la bande son "ride" prendra le relais. Les scripts fonctionnent individuellement, mais lorsqu'il sont à deux, je ne retrouve que la bande son ride. Elle se lance d'ailleurs à la place de celle "Pré-Launch" et reloop donc quand elle est censée vraiment se lancer...

Cela est assez ennuyant quand meme... Quelqu'un aurait-il une idée du problème ? Je peux vous passer mon fichier parc, avec les scripts et les audios si quelqu'un souhaite chipoter.

Merci d'avance !
 
Salut!

Je me suis posé la même question mais pas encore testé! Je pensais que ça marcherait en mettant deux triggers sur une zone (un start et un stop) puis de nouveau deux triggers sur la zone suivante :| ! J'essaye quand même on verra bien.
 
Le noms des scripts doivent être différents et le fichier aussi :)
Script 1 : OnboardMusic :

import com.nolimitscoaster.*;

public class OnboardMusic extends Script implements TrackTriggerListener
{
  private static final String musicFile = "music.ogg";
  private static final String startMusicTriggerName = "startmusic";
  private static final String stopMusicTriggerName = "stopmusic";

  private TrackTrigger startMusicTrig;
  private TrackTrigger stopMusicTrig;
 
  public bool onInit()
  {
    Coaster coaster = sim.getCoasterForEntityId(getParentEntityId());
    if (coaster == null)
    {
      System.err.println("This script must be attached to a coaster");
      return false;
    }

    startMusicTrig = coaster.getTrackTrigger(startMusicTriggerName);
    if (startMusicTrig == null)
    {
      System.err.println("TrackTrigger not found: '" + startMusicTriggerName + "'");
      return false;
    }

    startMusicTrig.addTrackTriggerListener(this);
   
    stopMusicTrig = coaster.getTrackTrigger(stopMusicTriggerName);
    if (stopMusicTrig == null)
    {
      System.err.println("TrackTrigger not found: '" + stopMusicTriggerName + "'");
      return false;
    }
   
    stopMusicTrig.addTrackTriggerListener(this);
   
    for (int i=0; i<coaster.getTrainCount(); ++i)
    {
      StreamedSound music = StreamedSound.loadFromFile(musicFile);
      if (music == null)
      {
        System.err.println("Music file cannot be found or opened: '" + musicFile + "'");
        return false;
      }
     
      Train train = coaster.getTrainAt(i);
     
      train.setOnboardStreamedSound(music);
    }
   
    return true;
  }



  public void onTrainEntering(TrackTrigger trigger, Train train)
  {
    StreamedSound music = train.getOnboardStreamedSound();
    if (music != null)
    {
      if (trigger == startMusicTrig)
      {
        music.stop();
        music.play();
      }
      else if (trigger == stopMusicTrig)
      {
        music.stopFaded(5.0f);
      }
    }
  }

  public void onTrainLeaving(TrackTrigger trigger, Train train)
  {

  }

}

Script 1 : OnboardMusic2 :

import com.nolimitscoaster.*;

public class OnboardMusic2 extends Script implements TrackTriggerListener
{
  private static final String musicFile = "music2.ogg";
  private static final String startMusicTriggerName = "startmusic2";
  private static final String stopMusicTriggerName = "stopmusic2";

  private TrackTrigger startMusicTrig;
  private TrackTrigger stopMusicTrig;
 
  public bool onInit()
  {
    Coaster coaster = sim.getCoasterForEntityId(getParentEntityId());
    if (coaster == null)
    {
      System.err.println("This script must be attached to a coaster");
      return false;
    }

    startMusicTrig = coaster.getTrackTrigger(startMusicTriggerName);
    if (startMusicTrig == null)
    {
      System.err.println("TrackTrigger not found: '" + startMusicTriggerName + "'");
      return false;
    }

    startMusicTrig.addTrackTriggerListener(this);
   
    stopMusicTrig = coaster.getTrackTrigger(stopMusicTriggerName);
    if (stopMusicTrig == null)
    {
      System.err.println("TrackTrigger not found: '" + stopMusicTriggerName + "'");
      return false;
    }
   
    stopMusicTrig.addTrackTriggerListener(this);
   
    for (int i=0; i<coaster.getTrainCount(); ++i)
    {
      StreamedSound music = StreamedSound.loadFromFile(musicFile);
      if (music == null)
      {
        System.err.println("Music file cannot be found or opened: '" + musicFile + "'");
        return false;
      }
     
      Train train = coaster.getTrainAt(i);
     
      train.setOnboardStreamedSound(music);
    }
   
    return true;
  }



  public void onTrainEntering(TrackTrigger trigger, Train train)
  {
    StreamedSound music = train.getOnboardStreamedSound();
    if (music != null)
    {
      if (trigger == startMusicTrig)
      {
        music.stop();
        music.play();
      }
      else if (trigger == stopMusicTrig)
      {
        music.stopFaded(5.0f);
      }
    }
  }

  public void onTrainLeaving(TrackTrigger trigger, Train train)
  {

  }

}

N'oubliez pas de modifier les noms des fichiers et ce qui est en gras dans le fichier 2  :wink:
 
Merci pour vos réponses !

Benije : Oui c'est ce que j'ai fait, j'ai donc les triggers "StartPreLaunch" et "StopPreLaunch" et "StartRideMusic" et "StopRideMusic". Le hic, comme je le disais, c'est que quelque soit le trigger, c'est la music du script 2 qui se lance...

Antoine, oui c'est bien exactement ce que j'ai fait  :-) Le nom est changé, Les triggers on bien des noms différents et correspondent de façon logique, mais j'ai toujours ce soucis.. C'est donc la musique "Ride.ogg" qui se lance 2 fois, au lieu de "PreLaunchWait.ogg" pour "OnboardMusic" et "Ride.ogg" pour "OnboardMusic2"...

Je vous laisse l’intégralité de mon fichier parc, avec les scripts, les audios sources, etc... Si jamais quelqu'un pourrait m'aider, ça serait top !

https://mega.co.nz/#!CsoBEbyK!52WlScFN9rJ7QtR2kgAfDnYISMIMTqmdQBVYDLbuVGo

Merci d'avance :)


Edit : En ré-essayant c'est vraiment aléatoire en fait... Je n'ai jamais les 2 musiques, mais c'est soit celle du PreLaunch qui se reloop au lancement, et donc reste durant le ride, soit c'est celle du Ride qui se lance dès le départ de la station et se reloop au lancement...
 
alex-woc a dit:
Merci pour vos réponses !

Benije : Oui c'est ce que j'ai fait, j'ai donc les triggers "StartPreLaunch" et "StopPreLaunch" et "StartRideMusic" et "StopRideMusic". Le hic, comme je le disais, c'est que quelque soit le trigger, c'est la music du script 2 qui se lance...

Antoine, oui c'est bien exactement ce que j'ai fait  :-) Le nom est changé, Les triggers on bien des noms différents et correspondent de façon logique, mais j'ai toujours ce soucis.. C'est donc la musique "Ride.ogg" qui se lance 2 fois, au lieu de "PreLaunchWait.ogg" pour "OnboardMusic" et "Ride.ogg" pour "OnboardMusic2"...

Je vous laisse l’intégralité de mon fichier parc, avec les scripts, les audios sources, etc... Si jamais quelqu'un pourrait m'aider, ça serait top !

https://mega.co.nz/#!CsoBEbyK!52WlScFN9rJ7QtR2kgAfDnYISMIMTqmdQBVYDLbuVGo

Merci d'avance :)


Edit : En ré-essayant c'est vraiment aléatoire en fait... Je n'ai jamais les 2 musiques, mais c'est soit celle du PreLaunch qui se reloop au lancement, et donc reste durant le ride, soit c'est celle du Ride qui se lance dès le départ de la station et se reloop au lancement...

Je télécharge ton track et je te tiens au courant Alex ;)
 
Hello.

Voila un script que j'ai modifier pour pouvoir allumer ou eteindre un spot au moment du passage du train.

Je vous conseil de regarder aussi cette video !

Nolimits 2 Création de Trigger avec les scripts Rotation d'une porte Partie 16



import com.nolimitscoaster.*;
import nlvm.math3d.*;

/* Modification du script "DoorScript" appliquer au déclenchement d'un spot  avec le spot On Off et change la couleur.
  Jmeletou@hotmail.com
*/

public class TriggerLightOnOff extends Script implements TrackTriggerListener
{
  private SceneObject sco;
  private SceneObjectElement ObjetLight;
  private SceneObjectLight spotLight;

  private static final int STATE_IDLE = 0;
  private static final int STATE_OPENING = 1;
  private static final int STATE_OPENING_REVERSED = 2;
  private static final int STATE_CLOSING = 3;
 
  private float angle;
  private static final float speedFactor = 1.5f;

 
  // rotation  90 degrees

  private static final float MAX_ANGLE = (float)(Math.PI / 2.0);
  private static final float SPEED = 1.6f;
 
  // rotation axe Y-Axis

  private static final Vector3f AXIS = new Vector3f(0,1,0);
 
  private int state;
  private float rot;
 
  private TrackTrigger beforeDoorTrigger;
  private TrackTrigger behindDoorTrigger;

  private static final String scriptName = "TriggerLight";
 

  public bool onInit()
  {
 
  // le script ne fait pas partie d'un objet de la scène

    sco = sim.getSceneObjectForEntityId(getParentEntityId());
    if (sco == null)
    {
      System.err.println(scriptName + ": the script is not part of a scene object");
      return false;
    }
  // le nom du projecteur dans le modele 3ds

    ObjetLight = sco.getElementForName("lamp");
    if (ObjetLight == null)
    {
      System.err.println(scriptName + ": element not found: lamp");    // l'element lamp n'est pas trouve
      return false;
    }   
   
    spotLight = sco.getLightForName("lamp");                        // on cherche le nom du spot pour pouvoir modifier ces caractéristique.
if (spotLight == null)
{
System.err.println("No light named 'lamp' was found.");
return false;
}

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    Vector3f pos = new Vector3f();

    sco.getTranslation(pos);      // cherche la position du projecteur x,y,z

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    final float range = 20;    // distance de declanchement du trigger zone d'action

    // on cree un trigger

    TrackPos trackPos = sim.findNearestCoasterTrack(pos, range);
    if (trackPos == null)
    {
      System.err.println(scriptName + ": no coaster found within a range of "+ range + " meters");  // le trigger est trop loin du rail
      return false;
    }
    else
    {
   
    //******************************************************************************************

      Coaster coaster = trackPos.getCoaster();        // cherche une montagne russe
     
      System.out.println(scriptName + ": Coaster found: " + coaster);

      System.out.println("Coaster Style is: " + coaster.getCoasterStyleId());  // Retourne le coaster-style's type ID.  Chaque style à un numero different
     
          // cree un trigger 5 m avant le projecteur

      beforeDoorTrigger = TrackTrigger.createTrackTriggerAtOffset(trackPos, -25.0);

      // cree un trigger 5 m apres la porte

      behindDoorTrigger = TrackTrigger.createTrackTriggerAtOffset(trackPos, +25.0);
     

      // les elements declancheurs doivent appeler les methodes  onTrainEntering/onTrainLeaving
      // Nous devons mettre en oeuvre l'interface TrackTriggerListener


      beforeDoorTrigger.addTrackTriggerListener(this);
      behindDoorTrigger.addTrackTriggerListener(this);
    }
   
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      spotLight.setEnabled(false);  // on eteint le projecteur
    state = STATE_IDLE;        // Etat de repos ou pause
    rot = 0;                    // rotation = 0 degree
    angle = 0;
    return true;
  }

//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+----------------------+++++++++++++++++++++++++

  public void onNextFrame(float fTickTime)
  {

    //.......................... en fonction de l'etat on fait tourner le projecteur ........................

    switch (state)
    {
    case STATE_IDLE:        // Ne rien faire

      break;
    case STATE_OPENING:    // Etat ouvert  le train va vers l'avant
      {
            spotLight.setEnabled(true);                  // on allume le projecteur
                spotLight.setColor(new Vector3f(1,0,0));      // on initialise la couleur

          angle += speedFactor * sim.getCurSimulationTickSec();
          ObjetLight.setRotation(angle, 0, 0, 0.5f);
         
          // Swing the light.
          angle += 0.1;
          ObjetLight.setRotation((float)(Math.sin(angle)*Math.PI/4.0), 0, 1, 0);
/*

        rot += fTickTime * SPEED;
        if (rot >= MAX_ANGLE)
        {
          rot = MAX_ANGLE;
          state = STATE_IDLE;
        }
        ObjetLight.setRotation(rot, AXIS);
*/
      }
      break;
    case STATE_OPENING_REVERSED:      // Etat ouvert le train marche en arriere
      {
        rot -= fTickTime * SPEED;
        if (rot <= -MAX_ANGLE)
        {
          rot = -MAX_ANGLE;
          state = STATE_IDLE;
        }
        ObjetLight.setRotation(rot, AXIS);

      }
      break;     
    case STATE_CLOSING:                // Etat fermer
      {
                if (rot > 0)
        {
          rot -= fTickTime * SPEED;
          if (rot <= 0)
          {
            rot = 0;
            state = STATE_IDLE;
          }
        }
        else if (rot < 0)
        {
          rot += fTickTime * SPEED;
          if (rot >= 0)
          {
            rot = 0;
            state = STATE_IDLE;
          }
        }
//        spotLight.setColor(new Vector3f(0,0,0));
        ObjetLight.setRotation(rot, AXIS);
          spotLight.setEnabled(false);            // on eteint le spot
      }
      break;
    }
  }
//+-+-+-+-+-+-+-+-+-+-+-+----------------------------++++++++++++++++++++++++++++++++++

  /**
    *  Cette méthode fait partie de la mise en œuvre d'interface TrackTriggerListener
    *
    * elle sera appelé si l'interface est inscrit pour un déclenchement à l'aide du
    * Méthode de addTrackTriggerListener
    * lorsque le train entre dans le trigger
  */
//***************************************************************************************

  public void onTrainEntering(TrackTrigger trigger, Train train)
  {
    if (trigger == beforeDoorTrigger)
    {
      if (train.getSpeed() > 0)
      {
        state = STATE_OPENING;
      }
    }
    else if (trigger == behindDoorTrigger)
    {
      if (train.getSpeed() < 0)
      {
        state = STATE_OPENING_REVERSED;

      }
    }
  }
//******************************************************************************************
  /**
    *
    * elle sera appelé si l'interface est inscrit pour un déclenchement à l'aide du
    * Méthode de addTrackTriggerListener
    * Lorsque le train quitte le trigger
  */

  public void onTrainLeaving(TrackTrigger trigger, Train train)
  {
    if (trigger == beforeDoorTrigger)
    {
      if (train.getSpeed() < 0)
      {
        state = STATE_CLOSING;

      }
    }
    else if (trigger == behindDoorTrigger)
    {
      if (train.getSpeed() > 0)
      {
        state = STATE_CLOSING;

      }
    }
  }


}

Meletou

 
Meletou1 a dit:
Ceci est une béta version, apres avoir passé un mois à realisé une 20 de tutoriaux video
Ha ben si j'aurais compris la phrase plus vite, pis faut dire que je suis pas fute fute ... :-)

Tes tutos sont nickel, avec la petite musique et une diction irréprochable, bravo ! et merci :-)
 
yoyo212 a dit:
Est ce qu'il serait possible de faire le contraire ?
c-a-d embraquer la lampe dans le train et la faire on/off au passage d'un point fixe ?

Utiliser le script d'attache d'un objet scripté sur le train maybe..
 
Hello.

Voila une autre façon de créer un script que l'on peut piloter avec les triggers, pour allumer ou éteindre une lampe.
Ce script peut être utiliser pour piloter autre chose.

Je vous conseil de regarder cette nouvelle vidéo pour la mise en œuvre...

NoLimits 2 Un script pour déclencher ON/OFF un projecteur avec les triggers Partie 21.

import com.nolimitscoaster.*;

// My Script Triggerlight  Jmeletou@hotmail.com  www.passion3d.com

public class OnboardTriggerLight extends Script implements TrackTriggerListener
{
private static final String startTriggerName  = "StartTriggerLight";
private static final String stopTriggerName  = "StopTriggerLight";

        private TrackTrigger startTrig;
        private TrackTrigger stopTrig;
       
        private SceneObject sco;
        private SceneObjectElement ObjetLight;
        private SceneObjectLight spotLight;

        private static final String scriptName = "OnboardTriggerLight";

public bool onInit()
{
Coaster coaster = sim.getCoasterForEntityId(getParentEntityId());
if (coaster == null){
System.err.println("This script must be attached to a coaster");
return false;
}
      startTrig = coaster.getTrackTrigger(startTriggerName);
if (startTrig == null){
System.err.println("TrackTrigger not found: '" + startTriggerName + "'");
return false;
}
startTrig.addTrackTriggerListener(this);

      stopTrig = coaster.getTrackTrigger(stopTriggerName);
if (stopTrig == null){
System.err.println("TrackTrigger not found: '" + stopTriggerName + "'");
return false;
}
stopTrig.addTrackTriggerListener(this);

                /**
                            On cherche le nom de l'objet dans la scene..
                                                Class Simulator
                                                getSceneObject
                                  public final SceneObject getSceneObject(String name)

                            Gets a handle to a scene object instance by a name
                            Returns null if there is no scene object instance with that name

                */
              sco = sim.getSceneObject("LightTest");
                              if (sco == null)
                              {
                                System.err.println(scriptName + ": the script is not part of a scene object");        // on trouve pas le nom
                                return false;
                              }
                  /**
                            On cherche le nom de l'objet 3ds dans la scéne qui correspond à la lampe.
                                                              Class SceneObject
                                                            getLightForName
                                            public final SceneObjectLight getLightForName(String name)
                                            Find a light for a given name as part of this object

                  */

                spotLight = sco.getLightForName("lamp");
if (spotLight == null)
{
System.err.println("No light named 'lamp' was found.");    // on trouve pas l'objet 3ds
return false;
}
              spotLight.setEnabled(false);

      return true;

      }
//

      public void onNextFrame(float fTickTime)
          {


          }

         

public void onTrainEntering(TrackTrigger trigger, Train train)
{
    if (trigger == startTrig)
                    {
                        // action start
                          spotLight.setEnabled(true);  // on allume le projecteur

                    }
          else if (trigger == stopTrig)
                          {

                            // action stop
                            spotLight.setEnabled(false);  // on eteint le projecteur

                          }

        }
  public void onTrainLeaving(TrackTrigger trigger, Train train)
{
                  //  startTrig.removeTrackTriggerListener(this) ;
                  //    stopTrig.removeTrackTriggerListener(this) ;


}
}



[Fichier joint supprimé]