CODE
// CUBEY TERRA OPEN-SOURCE SUBMARINE SCRIPT
// Do not delete this license text!
// This script is shared under a Creative Commons license, which means that:
// * You can freely share it.
// * You can make derivative works from it.
// Under the following conditions:
// * You must attribute me (Cubey Terra) as original author of the script.
// * If you modify or add to this script in any way, you must apply a compatible license.
// This means that the script remains with FULL PERMISSIONS ALWAYS
// (Modify/Copy/Transfer)
// For the full Creative Commons license, see:
// http://creativecommons.org/licenses/by-sa/3.0/us/
// REVISION HISTORY:
// February 28 2008 - Created and released under CC license by Cubey Terra.
// Dec. 25 08' - Added Hud and tweeked all the speeds By Mrc Homewood
integer sit;
integer listentrack;
key pilot;
vector velocity;
string speed;
integer throttle;
integer THROTTLE_MAX = 10;
integer THROTTLE_MIN = -5;
float MOTOR_SCALE = 0.5;
float xLinearMotor;
float zLinearMotor;
float Z_MOTOR_MAX = 3.0;
float Z_MOTOR_INCR = 0.05;
vector angMotor;
float Z_ANG_MAX = 0.5;
float Z_ANG_INCR = 0.01;
float buoyancy;
float Z_FLOAT_HEIGHT = 0.75; // how high does it ride at water surface
float NEUTRAL_BUOYANCY = 0.977; // neutral buoyancy seems to be less than 1 for some reason
float TIMER_DELAY = 0.1;
speedz()
{
velocity = llGetVel();
speed = (string)llVecMag(velocity);
speed = llGetSubString(speed, 0, llSubStringIndex(speed, ".") + 1);
}
hud()
{
llSetText("Throttle: "+(string)throttle+"\nSpeed: "+(string)speed,<1,1,1>,1);
}
say(string str)
{
if (pilot == llGetOwner())
{
llOwnerSay(str);
}
else
{
llSay(0,str);
}
}
start_listen()
{
if (listentrack)
{
llListenRemove(listentrack);
listentrack = 0;
}
listentrack = llListen(0, "", pilot, "");
}
set_motor()
{
if (sit)
{
xLinearMotor = throttle * MOTOR_SCALE;
llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <xLinearMotor,0,zLinearMotor>);
llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION, angMotor);
}
else
{
xLinearMotor = 0;
zLinearMotor = 0;
angMotor = ZERO_VECTOR;
llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, ZERO_VECTOR);
llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION, ZERO_VECTOR);
}
}
default
{
state_entry()
{
llSetText("",ZERO_VECTOR,1);
pilot = llGetOwner();
llSetSitText("Get In");
llSitTarget(<0.15, 0, -0.6>, ZERO_ROTATION);
llSetCameraEyeOffset(<-8, 0, 0>);
llSetCameraAtOffset(<0, 0, 0.25>);
llMessageLinked(LINK_SET, 0, "throttle", "");
//SET VEHICLE PARAMETERS
llSetVehicleType(VEHICLE_TYPE_AIRPLANE);
//llSetVehicleVectorParam( VEHICLE_LINEAR_FRICTION_TIMESCALE, <200, 20, 20> );
llSetVehicleVectorParam( VEHICLE_LINEAR_FRICTION_TIMESCALE, <10, 10, 1> );
// uniform angular friction
llSetVehicleFloatParam( VEHICLE_ANGULAR_FRICTION_TIMESCALE, 2 );
// linear motor
llSetVehicleVectorParam( VEHICLE_LINEAR_MOTOR_DIRECTION, <0, 0, 0> );
llSetVehicleFloatParam( VEHICLE_LINEAR_MOTOR_TIMESCALE, 2 );
llSetVehicleFloatParam( VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, 120 );
// agular motor
llSetVehicleVectorParam( VEHICLE_ANGULAR_MOTOR_DIRECTION, <0, 0, 0> );
llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_TIMESCALE, 0 );
llSetVehicleFloatParam( VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, .4);
// hover
llSetVehicleFloatParam( VEHICLE_HOVER_HEIGHT, 0 );
llSetVehicleFloatParam( VEHICLE_HOVER_EFFICIENCY, 0 );
llSetVehicleFloatParam( VEHICLE_HOVER_TIMESCALE, 10 );
llSetVehicleFloatParam( VEHICLE_BUOYANCY, .977 );
// no linear deflection
llSetVehicleFloatParam( VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, 0 );
llSetVehicleFloatParam( VEHICLE_LINEAR_DEFLECTION_TIMESCALE, 5 );
// no angular deflection
llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY, 0);
llSetVehicleFloatParam( VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 5);
// no vertical attractor
llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 1 );
llSetVehicleFloatParam( VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, .5 );
// banking
llSetVehicleFloatParam( VEHICLE_BANKING_EFFICIENCY, 1);
llSetVehicleFloatParam( VEHICLE_BANKING_MIX, .2);
llSetVehicleFloatParam( VEHICLE_BANKING_TIMESCALE, 0.01);
// default rotation of local frame
llSetVehicleRotationParam( VEHICLE_REFERENCE_FRAME, <0,0,0,1>);
// remove these flags
llRemoveVehicleFlags( VEHICLE_FLAG_NO_DEFLECTION_UP
| VEHICLE_FLAG_HOVER_WATER_ONLY
| VEHICLE_FLAG_LIMIT_ROLL_ONLY
| VEHICLE_FLAG_HOVER_TERRAIN_ONLY
| VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT
| VEHICLE_FLAG_HOVER_UP_ONLY
| VEHICLE_FLAG_LIMIT_MOTOR_UP );
}
on_rez(integer foo)
{
llResetScript();
}
listen(integer channel, string name, key id, string message)
{
message = llToLower(message);
if (message == "help")
{
llGiveInventory(pilot,llGetInventoryName(INVENTORY_NOTECARD,0)); // assumes help is 1st notecard
}
}
// DETECT AV SITTING/UNSITTING AND GIVE PERMISSIONS
changed(integer change)
{
key agent = llAvatarOnSitTarget();
if(change & CHANGED_LINK)
{
if (agent == NULL_KEY && sit)
{
//
// Pilot gets out of vehicle
//
llSetStatus(STATUS_PHYSICS, FALSE);
llSetTimerEvent(0.0);
sit = FALSE;
llMessageLinked(LINK_SET, 0, "throttle", "");
llMessageLinked(LINK_SET, 0, "unseated", "");
llStopSound();
llReleaseControls();
llSetText("",<1,1,1>,1);
set_motor();
}
else if (agent == llGetOwner() && !sit)
{
//
// Pilot gets into vehicle
//
sit = TRUE;
pilot = agent;
llSetStatus(STATUS_PHYSICS,TRUE);
llRequestPermissions(pilot, PERMISSION_TAKE_CONTROLS);
llSetTimerEvent(TIMER_DELAY);
llMessageLinked(LINK_SET, 0, "seated", "");
}
}
}
//CHECK PERMISSIONS AND TAKE CONTROLS
run_time_permissions(integer perm)
{
if (perm & (PERMISSION_TAKE_CONTROLS))
{
say( "For help, say HELP in chat.");
llTakeControls(CONTROL_UP | CONTROL_DOWN | CONTROL_FWD | CONTROL_BACK | CONTROL_RIGHT | CONTROL_LEFT | CONTROL_ROT_RIGHT | CONTROL_ROT_LEFT, TRUE, FALSE);
}
}
control(key id, integer held, integer change)
{
float water_height = llWater(ZERO_VECTOR);
vector pos = llGetPos();
float float_diff = pos.z - water_height;
if ((change & CONTROL_FWD) || (change & CONTROL_BACK))
{
if (held & CONTROL_FWD)
{
if (throttle < THROTTLE_MAX)
{
throttle++;
}
}
else if (held & CONTROL_BACK)
{
if (throttle > THROTTLE_MIN)
{
throttle--;
}
}
llMessageLinked(LINK_SET,throttle,"throttle",""); // pass throttle setting to child prims
}
if (held & CONTROL_UP && float_diff < Z_FLOAT_HEIGHT)
{
if (zLinearMotor < Z_MOTOR_MAX)
{
zLinearMotor += Z_MOTOR_INCR;
}
}
else if (held & CONTROL_DOWN)
{
if (zLinearMotor > -Z_MOTOR_MAX)
{
zLinearMotor -= Z_MOTOR_INCR;
}
}
else
{
zLinearMotor = 0;
}
if ((held & CONTROL_RIGHT) || (held & CONTROL_ROT_RIGHT))
{
if (angMotor.z > 0)
{
angMotor.z = 0;
}
else if (angMotor.z > -Z_ANG_MAX)
{
angMotor.z -= Z_ANG_INCR;
}
}
else if ((held & CONTROL_LEFT) || (held & CONTROL_ROT_LEFT))
{
if (angMotor.z < 0)
{
angMotor.z = 0;
}
else if (angMotor.z < Z_ANG_MAX)
{
angMotor.z += Z_ANG_INCR;
}
}
else
{
angMotor = ZERO_VECTOR;
}
set_motor();
}
timer()
{
vector pos = llGetPos();
float water_height = llWater(<0,0,0>);
float float_diff = (pos.z - water_height);
if (float_diff > Z_FLOAT_HEIGHT)
{
if (float_diff < 0) buoyancy = NEUTRAL_BUOYANCY + float_diff/10;
else buoyancy = 0.7; // arbitrary fast falling buoyancy
}
else buoyancy = NEUTRAL_BUOYANCY; // otherwise, neutral buoyancy
llSetVehicleFloatParam(VEHICLE_BUOYANCY, buoyancy); // set buoyancy
hud();
set_motor();
speedz();
}
}