O Script que permitiu isto:
Particle Controller
integer seated = FALSE;
integer particles_on = FALSE;
vector pos;
default
{
on_rez(integer num)
{
llSetTimerEvent(0);
}
timer()
{
// Speed
integer speed = (integer)(llVecMag(llGetVel()) * 1.94384449 + 0.5);
if(speed > 5)
{
if(!particles_on)
{
llMessageLinked(LINK_SET, 0, "particles on", "");
particles_on = TRUE;
}
}
else
{
if(particles_on)
{
llMessageLinked(LINK_SET, 0, "particles off", "");
particles_on = FALSE;
}
}
}
link_message(integer sender_number, integer number, string message, key id)
{
if (message == "seated")
{
seated = TRUE;
llSetTimerEvent(0.5);
}
else if (message == "unseated")
{
seated = FALSE;
llSetTimerEvent(0.0);
llMessageLinked(LINK_SET, 0, "particles off", "");
particles_on = FALSE;
}
}
}
Terra Magic Carpet
// Cubey Terra Helicopter Style Flight script
// Do not delete these script credits! If you modify this script, *add* your name and date and make your work available in Public Domain.
// * Portions based on a public-domain flight script from Jack Digeridoo.
// * Portions based on hoverboard script by Linden Lab.
// * Nov 30, 2003 - Significant modifications and additions by Cubey Terra... (apologies for the crappy indenting). -CT
// * Jan 11, 2004 - Fixed listen bug. Thanks to Trimming Hedges for the solution. -TH
// * March 27, 2004 - Adapted to work as helicopter-style vehicle -CT
// * April 8, 2004 - Adapted to work as U-Fly Taxi -CT
// * April 15, 2004 - Adapted to work as DIY helicopter script -CT
// * ???, 2004 - Adapted to work as magic carpet. -CT
// * April 10, 2006 - Released to public. Tidied some code. Added beacon. Allowed anyone to pilot, no longer keyed to owner. -CT
integer sit = FALSE;
integer listenTrack;
integer brake = TRUE;
integer BEACON_INT = 1440; //# of mins between beacon messages
integer beaconMins; // current # of minutes elapsed since last beacon message
float X_THRUST = 20;
float Z_THRUST = 15;
float xMotor;
float zMotor;
key agent;
key pilot;
vector SIT_POS = <0.25, 0.0, 0.65>;
vector CAM_OFFSET = <-10.0, 0.0, 2.0>;
vector CAM_ANG = <0.0, 0.0, 2.0>;
listenState(integer on) // start/stop listen
{
if (listenTrack)
{
llListenRemove(listenTrack);
listenTrack = 0;
}
if (on) listenTrack = llListen(0, "", pilot, "");
}
help()
{
llWhisper(0,"O Master of the Carpet, you may use these commands to fly me...");
llWhisper(0," Say START to begin moving.");
llWhisper(0," Say STOP to stop moving.");
llWhisper(0," PgUp/PgDn or E/C = hover up/down");
llWhisper(0," Arrow keys or WASD = forward, back, left, right");
llWhisper(0," Say HELP to display help.");
}
default {
state_entry()
{
llSetSitText("Fly");
llSitTarget(SIT_POS, ZERO_ROTATION);
llSetCameraEyeOffset(CAM_OFFSET);
llSetCameraAtOffset(CAM_ANG);
llCollisionSound("",0.0);
//SET VEHICLE PARAMETERS
llSetVehicleType(VEHICLE_TYPE_AIRPLANE);
llSetVehicleVectorParam( VEHICLE_LINEAR_FRICTION_TIMESCALE, <200, 20, 20> );
// 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, 2 );
llSetVehicleFloatParam( VEHICLE_HOVER_EFFICIENCY, 0 );
llSetVehicleFloatParam( VEHICLE_HOVER_TIMESCALE, 10000 );
llSetVehicleFloatParam( VEHICLE_BUOYANCY, 0.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, 1 );
// banking
llSetVehicleFloatParam( VEHICLE_BANKING_EFFICIENCY, 1);
llSetVehicleFloatParam( VEHICLE_BANKING_MIX, .5);
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 num)
{
llSetStatus(STATUS_PHYSICS, FALSE);
pilot = llGetOwner();
llSetTimerEvent(60); // beacon timer for 1 min intervals
}
listen(integer channel, string name, key id, string message)
{
message == llToLower(message);
if (message == "help")
{
help();
}
if (message == "stop")
{
brake = TRUE;
llWhisper(0,"We are stopped, O Master of the Carpet. You may say START to resume flight.");
llSetStatus(STATUS_PHYSICS, FALSE);
}
else if (message == "start")
{
brake = FALSE;
llWhisper(0,"I hear and obey, O Master of the Carpet. We now begin flight.");
llSetStatus(STATUS_PHYSICS, TRUE);
}
}
// DETECT AV SITTING/UNSITTING AND GIVE PERMISSIONS
changed(integer change)
{
agent = llAvatarOnSitTarget();
if(change & CHANGED_LINK)
{
if((agent == NULL_KEY) && (sit))
{
//
// Avatar gets off vehicle
//
llSetStatus(STATUS_PHYSICS, FALSE);
llStopAnimation("sit_ground");
llMessageLinked(LINK_SET, 0, "unseated", "");
llStopSound();
llReleaseControls();
sit = FALSE;
listenState(FALSE);
}
else if ((agent != NULL_KEY) && (!sit))
{
//
// Avatar gets on vehicle
//
pilot = llAvatarOnSitTarget();
sit = TRUE;
llRequestPermissions(pilot, PERMISSION_TAKE_CONTROLS | PERMISSION_TRIGGER_ANIMATION);
listenState(TRUE);
llWhisper(0,"O Master of the Carpet, "+llKey2Name(pilot)+", command me as you will. Should you need assistance, please speak the word HELP.");
llMessageLinked(LINK_SET, 0, "seated", "");
}
}
}
//CHECK PERMISSIONS AND TAKE CONTROLS
run_time_permissions(integer perm)
{
if (perm & (PERMISSION_TAKE_CONTROLS))
{
llTakeControls(CONTROL_UP | CONTROL_DOWN | CONTROL_FWD | CONTROL_BACK | CONTROL_RIGHT | CONTROL_LEFT | CONTROL_ROT_RIGHT | CONTROL_ROT_LEFT, TRUE, FALSE);
}
if (perm & PERMISSION_TRIGGER_ANIMATION)
{
// Admittedly, animations are bugged. I'll let you figure it out. :) -CT
llStartAnimation("sit_ground");
llStopAnimation("sit");
}
}
//FLIGHT CONTROLS
control(key id, integer level, integer edge)
{
vector angular_motor;
integer motor_changed;
if ((level & CONTROL_FWD) || (level & CONTROL_BACK))
{
if (edge & CONTROL_FWD) xMotor = X_THRUST;
if (edge & CONTROL_BACK) xMotor = -X_THRUST;
}
else
{
xMotor = 0;
}
if ((level & CONTROL_UP) || (level & CONTROL_DOWN))
{
if (level & CONTROL_UP)
{
zMotor = Z_THRUST;
}
if (level & CONTROL_DOWN)
{
zMotor = -Z_THRUST;
}
}
else
{
zMotor = 0;
}
llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION,
if (level & CONTROL_RIGHT) {
angular_motor.x = TWO_PI;
angular_motor.y /= 8;
}
if (level & CONTROL_LEFT) {
angular_motor.x = -TWO_PI;
angular_motor.y /= 8;
}
if (level & CONTROL_ROT_RIGHT) {
angular_motor.x = TWO_PI;
angular_motor.y /= 8;
}
if (level & CONTROL_ROT_LEFT) {
angular_motor.x = -TWO_PI;
angular_motor.y /= 8;
}
llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION, angular_motor);
}
timer()
{
//This is a beacon. Vehicles that are not keyed to owner will often get stolen.
// To avoid leaving vehicle litter all over the world, this beacon notifies the owner of it's location.
if (beaconMins < BEACON_INT)
{
beaconMins += 1;
}
else
{
beaconMins = 0;
vector pos = llGetPos();
llInstantMessage(llGetOwner(), "O Master of the Carpet, I have been left unattended in "+llGetRegionName()+" "+(string)((integer)pos.x)+", "+(string)((integer)pos.y)+", at an altitude of "+(string)((integer)pos.z)+" meters.");
}
}
}

Nenhum comentário:
Postar um comentário