//---PERMISSION VARIABLES--------------------------------------------- integer gDrivePermit = 1; // 0=EVERYONE 1=OWNERONLY string gSitMessage = "Ride"; string gUrNotAllowedMessage = "Vehicle is Locked"; vector gSitTarget_Pos = <0.0,0.5,0.02>; vector gSitTarget_Rot = <0.0,0.0,90.0>; key gOldAgent; key gAgent; integer gRun; //ENGINE RUNNING integer gMoving; //VEHICLE MOVING integer gGearMax = 3; //integer gIdle; //---END PREMISSION---------------------------------------------------- //---ANIMATION VARIABLES----------------------------------------------- string gDrivingAnim = "driverLH-64-64"; //--------------------------------------------------------------------- //---CAMERA VARIABLES-------------------------------------------------- //***CONSTANT********************************************************** integer gCamFixed=0; // INITVAL=0 0=FOLLOW CAM 1=FIXED CAM //integer gCamAct; // INITVAL=1 0=INACTIVE 1=ACTIVE //integer gCamFocLocked; // INITVAL=FALSE (TRUE or FALSE) //integer gCamPoslocked; // INITVAL=FALSE (TRUE or FALSE) //***SLIDERS*********************************************************** //float gCamBAng; // INITVAL=2.0 (0 to 180) DEGREES //float gCamBLag; // INITVAL=0.1 (0 to 3) SECONDS //float gCamDist; // INITVAL=8.0 (0.5 to 10) METERS //float gCamFocLag; // INITVAL=0.1 (0 to 3) SECONDS //float gCamFocThresh; // INITVAL=0.5 (0 to 4) METERS //float gCamPitch; // INITVAL=20.0 (-45 to 80) DEGREES //float gCamPoslag; // INITVAL=0.1 (0 to 3) SECONDS //float gCamPosthresh; // INITVAL=0.5 (0 to 4) METERS //vector gCamFocOff; // INITVAL=<0.10,0,0> <-10,-10,-10> to <10,10,10> METERS //vector gCamFocOff; // INITVAL=<0,0.10,0> <-10,-10,-10> to <10,10,10> METERS //----END CAMERA------------------------------------------------------- //---SOUND VARIABLES--------------------------------------------------- string gSoundFlight = "s_flight"; string gSoundHorn = "s_horn"; string gSoundStartup = "BLACKHAWK-HELI-START"; string gSoundIdle = "BLACKHAWK-HELI-IDLE"; string gSoundSlow = "BLACKHAWK-HELI-RUN"; string gSoundAggressive = "BLACKHAWK-HELI-RUNFAST"; string gSoundGearUp = "s_gearup"; string gSoundGearDown = "s_geardown"; string gSoundRev = "s_rev"; string gSoundAlarm = "s_alarm"; string gSoundStop = "s_rev"; //NEED KEYWORD SOUND PROCESSOR integer gOldSound=3; //variable for sound function integer gNewSound=3; //--------------------------------------------------------------------- //---iTEC - STOCK ENGINE GLOBAL VARIABLES------------------------------ list gTSvarList; float gVLMT=0.90; //INITVAL=0.90 float gVLMDT=0.10; //INITVAL=0.10 //vector gVLFT=<8.0, 3000.0, 8.0>; //INITVAL=<8.0, 3000.0, 8.0> vector gVLFT=<3000.0, 8.0, 8.0>; //INITVAL=<8.0, 3000.0, 8.0> vector gVAFT=<0.10, 0.10, 0.10>; //INITVAL=<0.10, 0.10, 0.10> float gVADE=0.20; //INITVAL=0.20 float gVADT=0.50; //INITVAL=0.10 float gVAMT=1.0; //INITVAL=0.10 float gVAMDT=0.10; //INITVAL=0.10 float gVLDE=1.0; //INITVAL=1.0 float gVLDT=0.10; //INITVAL=0.10 float gVVAE=0.50; //INITVAL=0.50 float gVVAT=5.0; //INITVAL=5.0 float gVHE=0.0; //INITVAL=0.0 float gVHT=0.0; //INITVAL=0.0 float gVHH=0.0; //INITVAL=0.0 float gVB=0.9; //INITVAL=0.0 float gVBE=1.0; //INITVAL=1.0 float gVBM=0.5; //INITVAL=0.5 float gVBT=0.5; //INITVAL=0.5 float gVerticalThrust=7.0; //--------------------------------------------------------------------- //---iTEC POWERTRAIN + (e3s) GLOBAL VARIABLES ------------------------- integer gGear; integer gNewGear; float gGearPower; float gReversePower = -5; list gGearPowerList = [ 5, // HOVER 15, // 15-KNOTS 30, // 30-KNOTS 40, // 40-KNOTS 50, // 50-KNOTS 60, // 60-KNOTS 70, // 70-KNOTS 100, // 100-KNOTS 150, // 150-KNOTS 200, // 200-KNOTS 225, // 225-KNOTS 250 // 250-KNOTS ]; //integer gGearCount; string gPhysEngDesc; integer gPhysEng=1; // 0=ODE| 1=Bullet float gTurnMulti=1.012345; float gTurnRatio; list gTurnRatioList; string gGearName; list gGearNameList =[ "HOVER", "15-KNOTS", "20-KNOTS", "40-KNOTS", "50-KNOTS", "60-KNOTS", "70-KNOTS", "100-KNOTS", "150-KNOTS", "200-KNOTS", "225-KNOTS", "250-KNOTS" ]; float gSpeed=0; //--------------------------------------------------------------------- //--------------------------------------------------------------------- //NEED A KEYWORD PRIM ANIMATION PROCESSOR //integer gTurnCount; //string gTurnAngle = "NoTurn"; // LeftTurn or RightTurn or NoTurn //string gNewTurnAngle = "NoTurn"; //string gTireSpin = "ForwardSpin"; // ForwardSpin or BackwardSpin or NoSpin //string gNewTireSpin = "ForwardSpin"; //string gRotorSpin = "NoRotate"; // NoRotate or SlowRotate or FastRotate //integer gTcountL; //for cornerFX //integer gTcountR; //--------------------------------------------------------------------- //---MENU HANDLER------------------------------------------------------ list MENU_MAIN = ["Align", "Hello"]; // up to 12 items in list integer menu_handler; integer menu_channel; //--------------------------------------------------------------------- //======================================================================= //==== E N D G L O B A L V A R I A B L E D E C L A R A T I O N ==== //======================================================================= init_TSvar(integer i) { if (i==0){ gTSvarList = [ 3.0, // how fast to reach max speed 0.10, // how fast to reach min speed or zero <3000.0,7.0,100.0>, // XYZ linear friction <7.0,3000.0,100.0> <0.10,0.10,0.20>, // XYZ angular friction 0.90, // how fast turning force is applied 0.50, // how fast turning force is released 1.0, // adjusted on 0.7.6 0.10, 0.20, 0.10, 0.50, 5.0, 0.0, 0.0, 0.0, 0.9, 1.0, 0.5, 0.5 ]; }else{ gTSvarList = [ 0.50, // how fast to reach max speed 10, // how fast to reach min speed or zero <1.0,1.0,1.0>, // XYZ linear friction <1000.0,1.0,1000.0>, // XYZ angular friction <1.0,1000.0,1000.0> 0.20, // how fast turning force is applied 0.1, // how fast turning force is released 0.1, // adjusted on 0.7.6 10.0, 0.10, 10.0, 1.0, 2.0, 0.0, 0.0, 0.0, 0.99, 1.0, 0.5, 0.5 ]; } gVLMT=llList2Float(gTSvarList,0); gVLMDT=llList2Float(gTSvarList,1); gVLFT=llList2Vector(gTSvarList,2); gVAFT=llList2Vector(gTSvarList,3); gVAMT=llList2Float(gTSvarList,4); gVAMDT=llList2Float(gTSvarList,5); gVLDE=llList2Float(gTSvarList,6); gVLDT=llList2Float(gTSvarList,7); gVADE=llList2Float(gTSvarList,8); gVADT=llList2Float(gTSvarList,9); gVVAE=llList2Float(gTSvarList,10); gVVAT=llList2Float(gTSvarList,11); gVHE=llList2Float(gTSvarList,12); gVHT=llList2Float(gTSvarList,13); gVHH=llList2Float(gTSvarList,14); gVB=llList2Float(gTSvarList,15); gVBE=llList2Float(gTSvarList,16); gVBM=llList2Float(gTSvarList,17); gVBT=llList2Float(gTSvarList,18); } init_PhysEng() { string msg; if(gPhysEng==0){ msg =":: is tuned for OpenDynamicsEngine"; }else if(gPhysEng==1){ msg =":: is tuned for BulletSim"; } if(gPhysEng==0){ gTurnMulti=gTurnMulti; init_TSvar(0); gTurnRatioList = [ 2.4, // HOVER 2.4, // 15-KNOTS 2.4, // 30-KNOTS 2.5, // 40-KNOTS 4.5, // 50-KNOTS 5.0, // 60-KNOTS 5.5, // 70-KNOTS 6.5, // 100-KNOTS 7.5, // 150-KNOTS 10.0, // 200-KNOTS 10.0, // 225-KNOTS 10.0 // 250-KNOTS ]; gGearPowerList = [ 5, // HOVER 15, // 15-KNOTS 30, // 30-KNOTS 40, // 40-KNOTS 50, // 50-KNOTS 60, // 60-KNOTS 70, // 70-KNOTS 100, // 100-KNOTS 150, // 150-KNOTS 200, // 200-KNOTS 225, // 225-KNOTS 250 // 250-KNOTS ]; }else{ gTurnMulti=1.12345; init_TSvar(1); gTurnRatioList = [ 1.3, // HOVER 1.5, // 15-KNOTS 2.0, // 30-KNOTS 2.5, // 40-KNOTS 2.9, // 50-KNOTS 3.3, // 60-KNOTS 5.0, // 70-KNOTS 6.0, // 100-KNOTS 7.0, // 150-KNOTS 8.0, // 200-KNOTS 9.0, // 225-KNOTS 10.0 // 250-KNOTS ]; gGearPowerList = [ 5, // HOVER 15, // 15-KNOTS 30, // 30-KNOTS 40, // 40-KNOTS 50, // 50-KNOTS 60, // 60-KNOTS 70, // 70-KNOTS 100, // 100-KNOTS 150, // 150-KNOTS 200, // 200-KNOTS 225, // 225-KNOTS 250 // 250-KNOTS ]; } llSay(0,msg); } preload_sounds() { llPreloadSound(gSoundFlight); llPreloadSound(gSoundHorn); llPreloadSound(gSoundStartup); llPreloadSound(gSoundIdle); llPreloadSound(gSoundSlow); llPreloadSound(gSoundAggressive); llPreloadSound(gSoundGearUp); llPreloadSound(gSoundGearDown); llPreloadSound(gSoundRev); llPreloadSound(gSoundAlarm); } init_engine() { gRun = 0; llSetSitText(gSitMessage); llCollisionSound("", 0.0); //gSitTarget_Rot = llRot2Euler( llGetRootRotation() ); // SIT TARGET IS BASED ON VEHICLE'S ROTATION. llSitTarget(gSitTarget_Pos, llEuler2Rot(DEG_TO_RAD * gSitTarget_Rot)); gOldSound=3; gNewSound=3; llSetLinkPrimitiveParamsFast(LINK_ALL_CHILDREN, [PRIM_PHYSICS_SHAPE_TYPE, PRIM_PHYSICS_SHAPE_NONE]); } init_followCam() { powershift(0); llSetCameraParams([ CAMERA_ACTIVE, 1, // 0=INACTIVE 1=ACTIVE CAMERA_BEHINDNESS_ANGLE, 15.0, // (0 to 180) DEGREES CAMERA_BEHINDNESS_LAG, 1.0, // (0 to 3) SECONDS CAMERA_DISTANCE, 3.0, // ( 0.5 to 10) METERS CAMERA_PITCH, 6.0, // (-45 to 80) DEGREES CAMERA_POSITION_LOCKED, FALSE, // (TRUE or FALSE) CAMERA_POSITION_LAG, 0.01, // (0 to 3) SECONDS CAMERA_POSITION_THRESHOLD, 3.0, // (0 to 4) METERS CAMERA_FOCUS_LOCKED, FALSE, // (TRUE or FALSE) CAMERA_FOCUS_LAG, 0.01 , // (0 to 3) SECONDS CAMERA_FOCUS_THRESHOLD, 0.01, // (0 to 4) METERS CAMERA_FOCUS_OFFSET, <0.0,0.0,0.0> // <-10,-10,-10> to <10,10,10> METERS ]); } init_fixedCam(float degrees) { rotation sitRot = llAxisAngle2Rot(<0, 0, 1>, degrees * PI); //llSetCameraEyeOffset(<-20.0, 0, 8> * sitRot); //llSetCameraAtOffset(<4, 0, 0> * sitRot); llSetCameraEyeOffset(<0, -20.0, 8> * sitRot); llSetCameraAtOffset(<0, 4, 0> * sitRot); llForceMouselook(FALSE); } set_engine() { integer vfW = VEHICLE_FLAG_HOVER_WATER_ONLY | VEHICLE_FLAG_HOVER_TERRAIN_ONLY | VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT; integer vfG = VEHICLE_FLAG_NO_DEFLECTION_UP | VEHICLE_FLAG_LIMIT_ROLL_ONLY | VEHICLE_FLAG_HOVER_UP_ONLY | VEHICLE_FLAG_LIMIT_MOTOR_UP; integer vfA = VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT; llSetVehicleType(VEHICLE_TYPE_AIRPLANE); llSetVehicleRotationParam(VEHICLE_REFERENCE_FRAME, <0.00000, 0.00000, 0.00000, 0.00000>); llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_TIMESCALE, gVLMT); llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, gVLMDT); llSetVehicleVectorParam(VEHICLE_LINEAR_FRICTION_TIMESCALE, gVLFT ); llSetVehicleVectorParam(VEHICLE_ANGULAR_FRICTION_TIMESCALE, gVAFT ); llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_TIMESCALE, gVAMT); llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, gVAMDT); llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, gVLDE); llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_TIMESCALE, gVLDT); llSetVehicleFloatParam(VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY, gVADE); llSetVehicleFloatParam(VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, gVADT); llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, gVVAE); llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, gVVAT); llSetVehicleFloatParam(VEHICLE_HOVER_EFFICIENCY, gVHE ); llSetVehicleFloatParam(VEHICLE_HOVER_TIMESCALE, gVHT ); llSetVehicleFloatParam(VEHICLE_HOVER_HEIGHT, gVHH ); llSetVehicleFloatParam(VEHICLE_BUOYANCY, gVB ); llSetVehicleFloatParam( VEHICLE_BANKING_EFFICIENCY, gVBE ); llSetVehicleFloatParam( VEHICLE_BANKING_MIX, gVBM ); llSetVehicleFloatParam( VEHICLE_BANKING_TIMESCALE, gVBT ); } powershift(integer g) { if(gRun & ~gMoving){ if(gCamFixed==0){ llSetCameraParams([CAMERA_DISTANCE,20.0]); } } else { vector vel = llGetVel(); float speed = llVecMag(vel); if (speed <=20){ if(gCamFixed==0){ llSetCameraParams([CAMERA_DISTANCE,20.0]); } } else if ((speed >=21) || (speed <=50)){ if(gCamFixed==0){ llSetCameraParams([CAMERA_DISTANCE,20.0]); } } else if (speed >=51) { if(gCamFixed==0){ llSetCameraParams([CAMERA_DISTANCE,10.0]); } } } gGearPower = llList2Integer(gGearPowerList, g); } gearshift(integer g) { gGearName = llList2String(gGearNameList, g); enginesound(); llSay(0,gGearName); } nearestpi() { // ALIGNS THE VEHICLE EAST WEST SOUTH NORTH BASED ON CURRENT ROTATION (PRESTAGE AND STAGE DURING DRAG MODE) vector Rad = llRot2Euler( llGetRootRotation() ); llSetRot( llEuler2Rot( ) ); } menu(key user,string title,list buttons) { llListenRemove(menu_handler); menu_channel = (integer)(llFrand(99999.0) * -1); menu_handler = llListen(menu_channel,"","",""); llDialog(user,title,buttons,menu_channel); llSetTimerEvent(30.0); } showdata(string s) { llSetText(s+"\n.\n.\n.\n.",<1,1,.6>,1.0); //llSetText("",<0,0,0>,1.0); } enginesound() { vector vel = llGetVel(); float speed = llVecMag(vel); if (speed <=15){ gNewSound = 0; } else if (speed >=50){ gNewSound = 2; } else { gNewSound = 1; } if (gOldSound != gNewSound){ if (speed <=15){ llLoopSound(gSoundIdle,1.0); } else if (speed >=50){ llLoopSound(gSoundAggressive,1.0); } else { llLoopSound(gSoundSlow,1.0); } gOldSound = gNewSound; } } default { state_entry() { init_engine(); state Air; } } state Air { state_entry(){ } on_rez(integer param) { llResetScript(); preload_sounds(); init_PhysEng(); } changed(integer change){ if ((change & CHANGED_LINK) == CHANGED_LINK){ gAgent = llAvatarOnSitTarget(); if (gAgent != NULL_KEY){ if( (gAgent != llGetOwner()) && (gDrivePermit == 1)){ llSay(0, gUrNotAllowedMessage); llUnSit(gAgent); llPlaySound(gSoundAlarm,1.0); //llPushObject(gAgent, <0,3,20>, ZERO_VECTOR, FALSE); llPushObject(gAgent, <3,0,20>, ZERO_VECTOR, FALSE); } else { llSetStatus(STATUS_PHYSICS, TRUE); llSetStatus(STATUS_ROTATE_Y,TRUE); gOldAgent = gAgent; init_PhysEng(); set_engine(); llRequestPermissions(gAgent, PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS | PERMISSION_CONTROL_CAMERA | PERMISSION_TRACK_CAMERA); gRun = 1; } } else { llSetStatus(STATUS_PHYSICS, FALSE); gRun = 0; init_engine(); llTriggerSound(gSoundStop,1); llStopAnimation(gDrivingAnim); //llPushObject(gAgent, <0,3,20>, ZERO_VECTOR, FALSE); llPushObject(gAgent, <3,0,20>, ZERO_VECTOR, FALSE); llSetTimerEvent(0.0); llStopSound(); llReleaseControls(); llClearCameraParams(); llSetCameraParams([CAMERA_ACTIVE, 0]); llSetText("",<0,0,0>,1.0); } } } run_time_permissions(integer perm){ if (perm) { gGear = 1; // LIST INDEX STARTS @ 0 llTakeControls(CONTROL_FWD | CONTROL_BACK | CONTROL_DOWN | CONTROL_UP | CONTROL_RIGHT | CONTROL_LEFT | CONTROL_ROT_RIGHT | CONTROL_ROT_LEFT, TRUE, FALSE); if (gCamFixed == 1) { init_fixedCam(0); }else{ init_followCam(); } llStartAnimation(gDrivingAnim); llTriggerSound(gSoundStartup,1.0); llSleep(1.5); enginesound(); } } control(key id, integer held, integer change){ if(gRun == 0){ return; } integer reverse=1; vector vel = llGetVel(); vector speedvec = llGetVel() / llGetRot(); gSpeed = llVecMag(vel); gTurnRatio = llList2Float(gTurnRatioList,gGear); // Gear Up if ((held & change & CONTROL_RIGHT)){ //llSay(0, "CONTROL_RIGHT"); gGear=gGear+1; if (gGear < 0) gGear = 0; if (gGear > gGearMax) gGear = gGearMax; gearshift(gGear); } // Gear Down if ((held & change & CONTROL_LEFT)){ //llSay(0, "CONTROL_LEFT"); gGear=gGear-1; if (gGear < 0) gGear = 0; if (gGear > gGearMax) gGear = gGearMax; //if (gGear > 11) gGear = 11; gearshift(gGear); } if (held & CONTROL_FWD){ powershift(gGear); //llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, ); llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <0,gGearPower,0>); gMoving=1; reverse=1; } if (held & CONTROL_BACK){ //llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, ); llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <0,gReversePower,0>); llSetCameraParams([CAMERA_BEHINDNESS_ANGLE,-45.0]); llSetCameraParams([CAMERA_DISTANCE,20.0]); gTurnRatio = -2.0; reverse = -1; } //showdata("Speed Vector:" + (string)speedvec + " Speed:" + (string)(gSpeed*2.23692912) + " mph"); enginesound(); vector AngularMotor = <0.0, 0.0, 0.0>; vector LocalX = llRot2Fwd(llGetLocalRot( )); if (held & (CONTROL_ROT_RIGHT)){ if (LocalX.z>-0.6) { AngularMotor.x = gTurnMulti*gGear/2.0; AngularMotor.y = gTurnMulti*gGear/3.0; } AngularMotor.z = -1.5*gTurnMulti; } else if (held & (CONTROL_ROT_LEFT)){ if (LocalX.z<0.6) { AngularMotor.x = gTurnMulti*gGear/2.0; AngularMotor.y = -gTurnMulti*gGear/3.0; } AngularMotor.z = 1.5*gTurnMulti; } else { AngularMotor.y = 5.0*LocalX.z; } // going up or stop going up if(held & CONTROL_UP) { if(gGear!=0){ //llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, ); llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <0,gGearPower,gVerticalThrust*gGear>); }else{ llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <0,0,gVerticalThrust>); } } else if (change & CONTROL_UP) { if(gGear!=0){ //llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, ); llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <0,gGearPower,0>); }else{ llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <0,0,0>); } } // going down or stop going down if(held & CONTROL_DOWN) { if(gGear!=0){ //llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, ); llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <0,gGearPower,-gVerticalThrust*gGear>); }else{ llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <0,0,-gVerticalThrust>); } } else if (change & CONTROL_DOWN) { if(gGear!=0){ //llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, ); llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <0,gGearPower,0>); }else{ llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <0,0,0>); } } llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION, AngularMotor); } touch_start(integer total_number){ if (gAgent != NULL_KEY){ menu(llDetectedKey(0), "\nDriver's Menu.", MENU_MAIN); } } listen(integer channel,string name,key id,string message){ if (channel == menu_channel){ llListenRemove(menu_handler); llSetTimerEvent(0); if (message == "Align"){ llSay(0, "Lined up..."); nearestpi(); } else if (message == "Hello"){ llSay(0, "Hello yourself"); } // else if (message == "Button"){ // do something //} } } timer(){ llListenRemove(menu_handler); if(gRun == 1){ }else{ llSetTimerEvent(0.0); } } }