[No Limits 2] Tuto sur les scripts

Hahaha !
Je fait la même chose actuellement mais je vais attendre de voir si il met son parc en téléchargement parce qu'a mon avis pour les portiques, ils ne peuvent pas êtres mis n'importe où (je cherche a proposer un objet scripté qu'on peu placer à l'envie).

Puis pour les contrôles, comme pour le jeu, il faut entrer dans une camera avec l'impossibilité de se déplacer.

On va voir ce que nous propose la Xem release ...  :-)
 
Salut !
ALors j'ai plusieurs Questions :
1 > peut on avoir un script qui allume une lampe et l'éteint a l'aide de Trigger ( Deux trigger , On et off)
2 > La même choses mais avec des trigger automatique( en donnant les Before et after the track si vous comprenez ce que je dit xD )
3 > Ensuite j'ai une porte que je voudrais faire ouvrir et fermer , je sait qu'il y a un script mais je sait pas comment l'utiliser , quelqu'un peut m'aider?
4 > Peut on faire des textures " Light " c'est a dire qu'elles ne prennent pas en compte les ombres et la nuit/jour , mais qu'elles paraissent comme allumer?

Voila , merci d'avance !  :mrgreen:
 
Pour les lumières, va voir le site de Yoyo212, tu trouveras un pack de lumières avec scripts!

Pour la porte, qu'est-ce que tu n'arrives pas a faire exactement? Il y a un Doorscript inclu dans NL, il suffit de copier le fichier dans son répertoire! Ne pas oubliez de nommer chaque porte "left" et "right" dans le logiciel de 3D (je dis ça de mémoire, a vérifier  :wink: ) . C'est ces deux éléments qui seront touchés par le script.

Pour les textures, crées un nouveau material et coche Const plutôt que Lighting, et choisi du blanc dans la case a droite. Ça aura pour effet de rester illuminé même la nuit  :-) .

J'écris sur mobile, je détaillerai plus si besoin quand je serai sur mon Pc!
 
Pour les lumières , faut que je regarde , mais de souvenir j'avais pas trouver pour le script avec deux trigger manuel et qu'il y avait pas pour les trigger automatique.

Pour la porte en fait je voudrais faire une volet métallique ( donc déplacement vertiqual )

Pour la matière light , Nickel ! Merci !
 
EN y regardant , si , mais en fait je sait ce qu'il me gênait dans le script , c'est qu'il faut nommer l'objet et attacher le script au coaster ,et du coup , seul une lampe peur fonctionner par script a default de pouvoir nommer deux objets pareils. et ce que j'aimerais , c'est un script ou il faut écrire le nom du coaster dans le script, en fait ce que je cherche a faire , c'est que le script allume une lumière , mais en éteint une autre.
Pour les trigger automatique par contre j'ai pas encore trouvé , j'en ai trouvé un en mode stroboscope dans le parc , j'essayerais de le modifier.
J'ai essayer les portes.
Il me dit qu'il ne trouve pas l'élément Left , alors que dans Sketchup , je l'ai nommer left , et il apparaît quand on va dans lumières en parent élément . Est ce que les élements via Sketchup fonctionnent ?
 
Salut !
Je vient de modifier le door Script pour que la translation soit vertical , j'ai donc supprimer la partie Right de l'objet, il reste plus que le left donc et changer l'axe de translation par l'axe Y au lieu du X:

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

public class DoorScriptVertical extends Script implements TrackTriggerListener
{
  private SceneObject sco;
  private SceneObjectElement leftDoor;

  private static final int STATE_IDLE = 0;
  private static final int STATE_OPENING = 1;
  private static final int STATE_CLOSING = 2;
  
  // Ouverture limitée à 2m de chaque côté
  private static final float TRANSLATION = 2.0f;
  //Temps d'ouverture de 2s
  private static final float DUREE_OUVERTURE = 2.0f;
  //Temps d'accélération et de ralentissement
  private static final float DUREE_ACCELERATION = 0.5f;
  //Variable servant lors de l'ouverture ou la fermeture des portes
  private static float startTime = 0.0f;
  
  private int state;
  private float trans;
  
  private TrackTrigger beforeDoorTrigger;
  private TrackTrigger behindDoorTrigger;
  
  private StaticSound doorSound;
  
  private static final String scriptName = "DoorScript";
  
  // must be constant string expression and marked as final so that the compiler will no complain with a warning when used for
  // StaticSound.loadFromFile
  private final static String doorSoundFile = "doorsound.ogg";
  
  public bool onInit()
  {
    sco = sim.getSceneObjectForEntityId(getParentEntityId());
    if (sco == null)
    {
      System.err.println(scriptName + ": the script is not part of a scene object");
      return false;
    }
    //Récupération du sous objet porte gauche
    leftDoor = sco.getElementForName("left");
    if (leftDoor == null) 
    {
      System.err.println(scriptName + ": element not found: left");
      return false;
    }
 //Initialisation du son d'ouverture de la porte
    doorSound = StaticSound.loadFromFile(doorSoundFile, 0);
    if (doorSound == null)
    {
      System.err.println(scriptName + ": could not load sound '" + doorSoundFile + "'");
      return false;
    }

 //Vecteur représentant la position de l'objet dans l'espace
    Vector3f pos = new Vector3f();
    sco.getTranslation(pos);

 //Déplacement du son au niveau de l'objet
    doorSound.setPosition(pos);

    // Setting to 'Local' will enable environmental (reverb) effects if this sound's position should be e.g. in a tunnel
    doorSound.setEnvironmentMode(StaticSound.E_ENVMODE_LOCAL);

    // These parameters affect the distance attenuation
    doorSound.setDistanceParameters(2.0f, 0.8f);

    final float range = 10;

    // create triggers...
    TrackPos trackPos = sim.findNearestCoasterTrack(pos, range);
    if (trackPos == null)
    {
      System.err.println(scriptName + ": no coaster found within a range of "+ range + " meters");
      return false;
    }
    else
    {
      Coaster coaster = trackPos.getCoaster();
      
      System.out.println(scriptName + ": Coaster found: " + coaster);

      System.out.println("Coaster Style is: " + coaster.getCoasterStyleId());
      
      // create a trigger 1 meters in front of the track pos
      beforeDoorTrigger = TrackTrigger.createTrackTriggerAtOffset(trackPos, -1.0);
      
      // create a trigger 1 meters after the track pos
      behindDoorTrigger = TrackTrigger.createTrackTriggerAtOffset(trackPos, +1.0);
      
      // tell the triggers that they should call our onTrainEntering/onTrainLeaving methods
      // We have to implement the TrackTriggerListener interface
      beforeDoorTrigger.addTrackTriggerListener(this);
      behindDoorTrigger.addTrackTriggerListener(this);
    }
    
    state = STATE_IDLE;
    trans = 0;
    
    return true;
  }
  
  public void onNextFrame(float fTickTime)
  {
    switch (state)
    {
    case STATE_IDLE:
      // do nothing
      break;
    case STATE_OPENING: //Etat gérant l'ouverture de la porte
      {
     //Calcul de la position de la porte
  startTime += fTickTime;
        trans = (float)Tools.switchRampC1(DUREE_OUVERTURE, TRANSLATION, DUREE_ACCELERATION, startTime);
  //Si on atteint l'ouverture maximale autorisée, on bloque la translation
        if (trans >= TRANSLATION)
        {
          trans = TRANSLATION;
          state = STATE_IDLE;
    startTime = 0;
        }
  //Construction de deux vecteurs
  Vector3f leftTrans = new Vector3f(0,trans,0);//La translation se fait sur l'axe Y
  //On applique la translation aux sous objets porte gauche et porte droite
  leftDoor.setTranslation(leftTrans);
      }
      break;    
    case STATE_CLOSING: //Etat gérant la fermeture de la porte
      {
     //Calcul de la position de la porte
  startTime += fTickTime;
        trans = TRANSLATION - (float)Tools.switchRampC1(DUREE_OUVERTURE, TRANSLATION, DUREE_ACCELERATION, startTime);
  //Si on atteint l'ouverture minimale, on bloque la translation
        if (trans <= 0)
        {
          trans = 0;
          state = STATE_IDLE;
    startTime = 0;
        }
  //Construction de deux vecteurs
  Vector3f leftTrans = new Vector3f(0,trans,0);//La translation se fait sur l'axe Y
  //On applique la translation aux sous objets porte gauche et porte droite
  leftDoor.setTranslation(leftTrans);
      }
      break;
    }
  }
  
  /**
   * This method is part of the TrackTriggerListener Interface implementation
   *
   * It will be called if the interface is registered for a trigger using the
   * addTrackTriggerListener method.
   */
  public void onTrainEntering(TrackTrigger trigger, Train train)
  {
    if (trigger == beforeDoorTrigger)
    {
      if (train.getSpeed() > 0)
      {
        state = STATE_OPENING;
        doorSound.play();

        //printTrainPositionAndRotation(train);
      }
    }
    else if (trigger == behindDoorTrigger)
    {
      if (train.getSpeed() < 0)
      {
        state = STATE_OPENING;
        doorSound.play();
      }
    }
  }
  
  /**
   * This method is part of the TrackTriggerListener Interface implementation
   *
   * It will be called if the interface is registered for a trigger using the
   * addTrackTriggerListener method.
   */  
  public void onTrainLeaving(TrackTrigger trigger, Train train)
  {
    if (trigger == beforeDoorTrigger)
    {
      if (train.getSpeed() < 0)
      {
        state = STATE_CLOSING;
        doorSound.play();
      }
    }
    else if (trigger == behindDoorTrigger)
    {
      if (train.getSpeed() > 0)
      {
        state = STATE_CLOSING;
        doorSound.play();
      }
    }
  }

  // This method demonstrates how to get the position and rotation of the first bogey
  private void printTrainPositionAndRotation(Train train)
  {
    if (train.getBogieCount() > 0)
    {
      Vector3f pos = new Vector3f();
      Vector3f front = new Vector3f();
      
      train.getBogieOrientationAndPosition(0, front, null, null, pos);

      System.out.println(scriptName + ": First bogey is at " + pos);

      double azimuthRad = Math.atan2(front.x, -front.z);
      double elevationRad = Math.atan2(front.y, Math.sqrt(front.x* front.x + front.z* front.z));

      System.out.println(scriptName + ": Yaw is " + Math.toDegrees(azimuthRad) + " degrees"); 
      System.out.println(scriptName + ": Pitch is " + Math.toDegrees(elevationRad) + " degrees"); 
    }
  }
}
Enregistrer le fichier sous : DoorScriptVertical.nlvm
Et jouez sur les paramètres :

// Ouverture limitée à 2m de chaque côté
  private static final float TRANSLATION = 2.0f;

  //Temps d'ouverture de 2s
  private static final float DUREE_OUVERTURE = 2.0f;

  //Temps d'accélération et de ralentissement
  private static final float DUREE_ACCELERATION = 0.5f;

  //Variable servant lors de l'ouverture ou la fermeture des portes
  private static float startTime = 0.0f;


Si vous voulez modifier des durée  :mrgreen:



 
Salut, j'aimerais savoir comment déclencher une lumière quand un train passe à un endroit, ainsi que pour l'éteindre en passant à un autre endroit. J'ai un peu regardé sur ce topic, mais j'y comprends vraiment rien.
Si quelqu'un pourrait m’expliquer sa précisément, ce serait cool :mrgreen:. Merci d'avance :-).
 
yoyo212 a dit:
Non, j'avais pas envie  :-)
Il te faut fouiller sur ce topic, on en a assez parlé, et je crois même qu'il y a une vidéo de Maletout qui explique comment utiliser les light avec les triggers.  :mrgreen:

Ok merci, et ton fichier Zip, j'en fait quoi xD ?