import com.nolimitscoaster.*;
import nlvm.math3d.*;
public class ChangeMat extends Script implements TrackTriggerListener
{
private SceneObject sco;
private SceneObjectElement ObjetEcran1;
private SceneObjectElement ObjetEcran2;
private SceneObjectElement ObjetEcran3;
private SceneObjectElement ObjetEcran4;
private SceneObjectElement ObjetEcran5;
private SceneObjectElement ObjetEcran6;
private SceneObjectElement ObjetEcran7;
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 static float startTime = 0.0f;
private int state;
private float rot;
private TrackTrigger beforeDoorTrigger;
private TrackTrigger behindDoorTrigger;
private static final String scriptName = "TriggerMat";
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;
}
ObjetEcran1 = sco.getElementForName("ecran1");
ObjetEcran2 = sco.getElementForName("ecran2");
ObjetEcran3 = sco.getElementForName("ecran3");
ObjetEcran4 = sco.getElementForName("ecran4");
ObjetEcran5 = sco.getElementForName("ecran5");
ObjetEcran6 = sco.getElementForName("ecran6");
ObjetEcran7 = sco.getElementForName("ecran7");
Vector3f pos = new Vector3f();
sco.getTranslation(pos);
final float range = 3;
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
// cree un trigger 5 m avant le projecteur
beforeDoorTrigger = TrackTrigger.createTrackTriggerAtOffset(trackPos, -5.0);
// cree un trigger 5 m apres la porte
behindDoorTrigger = TrackTrigger.createTrackTriggerAtOffset(trackPos, +5.0);
beforeDoorTrigger.addTrackTriggerListener(this);
behindDoorTrigger.addTrackTriggerListener(this);
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
state = STATE_IDLE; // Etat de repos ou pause
ObjetEcran1.setVisible(true);
ObjetEcran2.setVisible(false);
ObjetEcran3.setVisible(false);
ObjetEcran4.setVisible(false);
ObjetEcran5.setVisible(false);
ObjetEcran6.setVisible(false);
ObjetEcran7.setVisible(false);
return true;
}
public void onNextFrame(float fTickTime)
{
switch (state)
{
case STATE_IDLE: // Ne rien faire
break;
case STATE_OPENING:
{
startTime += fTickTime;
float t = System.currentTimeMillis() ;
if (startTime >= 0 && startTime <= 1) {
ObjetEcran1.setVisible(true);
} else {
ObjetEcran1.setVisible(false);
}
if (startTime >= 1 && startTime <= 2) {
ObjetEcran2.setVisible(true);
} else {
ObjetEcran2.setVisible(false);
}
if (startTime >= 2 && startTime <= 3) {
ObjetEcran3.setVisible(true);
} else {
ObjetEcran3.setVisible(false);
}
if (startTime >= 3 && startTime <= 4) {
ObjetEcran4.setVisible(true);
} else {
ObjetEcran4.setVisible(false);
}
if (startTime >= 4 && startTime <= 5) {
ObjetEcran5.setVisible(true);
} else {
ObjetEcran5.setVisible(false);
}
if (startTime >= 5 && startTime <= 6) {
ObjetEcran6.setVisible(true);
} else {
ObjetEcran6.setVisible(false);
}
if (startTime >= 6 && startTime <= 7) {
ObjetEcran7.setVisible(true);
} else {
ObjetEcran7.setVisible(false);
}
if (startTime >= 7 && startTime <= 10) {
ObjetEcran1.setVisible(true);
} else {
}
}
break;
case STATE_CLOSING:
{
startTime += fTickTime;
startTime = 0;
ObjetEcran1.setVisible(true);
ObjetEcran2.setVisible(false);
ObjetEcran3.setVisible(false);
ObjetEcran4.setVisible(false);
ObjetEcran5.setVisible(false);
ObjetEcran6.setVisible(false);
ObjetEcran7.setVisible(false);
}
break;
}
}
//***************************************************************************************
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;
}
}
}
}