
//BroomMain, primary broom script for CovenBall
key Rider; //Key of the riding avatar
integer LinearControls;
integer AngularControls;
integer LastAngle;
vector LinearMotor;
default
{
state_entry()
{
llSetTimerEvent(.1);
llSetSitText("Ride"

llSitTarget(<0, 0, 0.1>, ZERO_ROTATION); //Must be set to trigger changed on sit
llSetVehicleType(VEHICLE_TYPE_BALLOON);
llSetCameraEyeOffset(<-5.5, 0.0, 3.5> );
llSetCameraAtOffset(<1.75, 0.0, 0.75> );
llSetVehicleFloatParam(VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY, 0.1);
llSetVehicleFloatParam(VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 1.0);
llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, 1.0);
llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_TIMESCALE, 0.5);
llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_TIMESCALE, 0.1);
llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, 120);
llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_TIMESCALE, 0.25);
llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, .3);
llSetVehicleVectorParam(VEHICLE_LINEAR_FRICTION_TIMESCALE, <0.1, 0.1, 0.1> ); //***NOT WORKING!!!
llSetVehicleVectorParam(VEHICLE_ANGULAR_FRICTION_TIMESCALE, <0.5, 0.5, 0.5> );
llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 0.25);
llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 1.5);
llSetVehicleFloatParam(VEHICLE_BANKING_EFFICIENCY, 0.4);
llSetVehicleFloatParam(VEHICLE_BANKING_TIMESCALE, 0.1);
llSetVehicleFloatParam(VEHICLE_BANKING_MIX, 0.95);
llSetVehicleFloatParam(VEHICLE_HOVER_HEIGHT, 1.0);
llSetVehicleFloatParam(VEHICLE_HOVER_EFFICIENCY, 0.5);
llSetVehicleFloatParam(VEHICLE_HOVER_TIMESCALE, 2.0);
llSetVehicleFlags(VEHICLE_FLAG_HOVER_UP_ONLY);
llSetVehicleFloatParam(VEHICLE_BUOYANCY, 0.2);
LinearControls = CONTROL_FWD | CONTROL_BACK;
AngularControls = CONTROL_ROT_RIGHT | CONTROL_ROT_LEFT | CONTROL_DOWN | CONTROL_UP;
}
run_time_permissions(integer perm)
{
if ((perm & PERMISSION_TRIGGER_ANIMATION) == PERMISSION_TRIGGER_ANIMATION)
{
llStopAnimation("sit"

llStartAnimation("BroomSit"

}
if ((perm & PERMISSION_TAKE_CONTROLS) == PERMISSION_TAKE_CONTROLS)
{
llTakeControls(CONTROL_FWD | CONTROL_BACK | CONTROL_LEFT | CONTROL_RIGHT | CONTROL_UP | CONTROL_DOWN,TRUE, FALSE);
}
}
changed(integer change)
{
if(change == CHANGED_LINK)
{
Rider = llAvatarOnSitTarget();
if ( (Rider != llGetOwner()) && (Rider != NULL_KEY) )//Not owner, so kick off
{
llSay(0, "You are not my owner! Bug off..."

llSleep(0.75); //Unsit works more reliable with short delay
llUnSit(Rider);
llPushObject(Rider, <0,0,5>, ZERO_VECTOR, FALSE);
}
else if(Rider == llGetOwner()) //Got on broom, so get animation and controls permision
{
llRequestPermissions(Rider,PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS);
llSetStatus(STATUS_PHYSICS, TRUE);
}
else //Got off broom, so stop animation and release controls
{
llSetStatus(STATUS_PHYSICS, FALSE);
if ((llGetPermissions() & PERMISSION_TRIGGER_ANIMATION) == PERMISSION_TRIGGER_ANIMATION)
{
llStopAnimation("BroomSit"

}
if ((llGetPermissions() & PERMISSION_TAKE_CONTROLS) == PERMISSION_TAKE_CONTROLS)
{
llReleaseControls();
}
}
}
}
control(key id, integer held, integer change)
{
if (held & LinearControls)
{
if ( held & CONTROL_FWD ) //Forward held down
{
LinearMotor.x += 0.3;
}
if ( held & CONTROL_BACK ) //Back held down
{
LinearMotor.x += -0.2;
}
if (LinearMotor.x > 6) { LinearMotor.x = 6; }
if (LinearMotor.x < -6) { LinearMotor.x = -6; }
llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, LinearMotor);
}
}
timer()
{
//if ( llVecMag(llGetVel()) < 0.1 )
//{
// LinearMotor = <0,0,0>;
//}
//else
//{
// LinearMotor.x = LinearMotor.x * 0.95;
//}
// llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, LinearMotor);
}
}