// This script was originally made by Cypher Ragu
// Mod it, resell it, do whatever you want with it just as long as you leave this header intact
//
// Originally made for use in the "Viper" RC vehicle by Aurora Aeronautics

integer granted=FALSE;

requestperms(key id)
{
llDialog(id,"Please grant me permission to act on your controls - I need this to work correctly.",["Okay"],-1);
llRequestPermissions(id,PERMISSION_TAKE_CONTROLS);
//llRequestPermissions(id,PERMISSION_CONTROL_CAMERA);
}

default
{


state_entry() { // as soon as the state starts

llListen(1,"",(llGetOwner()), ""); // tells the script to listen to the chat on channel 1
llStopSound();
if(!granted)
requestperms(llGetOwner());
else
granted=FALSE;
llSetStatus(STATUS_PHYSICS, FALSE); // Makes sure physics are turned off so the vehicle doesn't float off to somewhere
}

on_rez(integer start_param) { // when it rezzes

llResetScript(); // resets the script, forcing the script to check the owner again
}


touch_start(integer t)
{
if(llDetectedKey(0)==llGetOwner())
{
if(granted)
{
llDialog(llDetectedKey(0),"Remote control activated. Touch me to de-activate it.",["Okay"],-1);
state remote;
}else
{
requestperms(llGetOwner());
}
}
}

run_time_permissions(integer perm)
{
if(perm&PERMISSION_TAKE_CONTROLS)
{

granted=TRUE;
llDialog(llGetOwner(),"Touch me to activate the remote control.",["Okay"],-1);
}
}

}
state remote
{

on_rez(integer t)
{
llResetScript();
}

state_entry() {

//now begins the vehicle parameters
llMessageLinked(LINK_THIS,0,"sound on","");
if(granted)
llTakeControls(CONTROL_ML_LBUTTON | CONTROL_LBUTTON |CONTROL_FWD | CONTROL_BACK | CONTROL_RIGHT | CONTROL_LEFT | CONTROL_ROT_RIGHT | CONTROL_ROT_LEFT | CONTROL_UP | CONTROL_DOWN, TRUE, FALSE);
else
state default;

llSetVehicleType(VEHICLE_TYPE_AIRPLANE);

llSetVehicleFloatParam(VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY, .01);
llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, 1.0);
llSetVehicleFloatParam(VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 1);
llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_TIMESCALE, .2);

llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_TIMESCALE, 0.5);
llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, .05);
llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_TIMESCALE, 0.25);
llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, 0.05);

llSetVehicleVectorParam(VEHICLE_LINEAR_FRICTION_TIMESCALE, <1,2,1>);
llSetVehicleVectorParam(VEHICLE_ANGULAR_FRICTION_TIMESCALE, <.5,0,.5>);

llSetVehicleFloatParam(VEHICLE_BUOYANCY, 1.0);

llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 0.5);
llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 1.0);

llSetVehicleFloatParam(VEHICLE_BANKING_EFFICIENCY, 0.75);
llSetVehicleFloatParam(VEHICLE_BANKING_MIX, 0.75);
llSetVehicleFloatParam(VEHICLE_BANKING_TIMESCALE, 0.3);

llRemoveVehicleFlags(VEHICLE_FLAG_LIMIT_ROLL_ONLY);


llSetSitText("Ride");
llSetCameraAtOffset(<0, 0, 1>);

llSetStatus(STATUS_PHYSICS,TRUE);

}


touch_start(integer t)
{
if(llDetectedKey(0)==llGetOwner())
{
llReleaseControls();
llDialog(llGetOwner(),"Remote switched off.",["Okay"],-1);
state default;
}
}

control(key id,integer level, integer edge){
float fwd = 2; //this is how fast the vehicle goes when moving foreward or backwards. Higher number means higher top speed.
float rev = (fwd*-1)/2; // no need to mess with this, it just automatically determines the reverse speed.
float bank = 0; // how steeply the vehicle banks on the turns
float revbank = bank*-1; //converts the previous number into a negative, no need to change this

if(level & CONTROL_FWD)
{
llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <fwd,0,0>);
}
if(level & CONTROL_BACK)
{
llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <rev,0,0>);
}
if(level & (CONTROL_LEFT|CONTROL_ROT_LEFT))
{
llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION, <revbank,0,1>);
}
if(level & (CONTROL_RIGHT|CONTROL_ROT_RIGHT))
{
llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION, <bank,0,-1>);

}
if(level & CONTROL_UP)
{
llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <0,0,2>);
}
if(level & CONTROL_DOWN)
{
llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <0,0,-2>);
}

}
}