Для начала хочу сказать, что главный прим в слинкованном объекте это должен быть именно тот прим, на котором вы будете сидеть. Например, Кресло пилота в нашем варианте. Объект может быть физическим, если в нём не больше 30 примов. Так что попробуйте уложиться в 30 примов. Для того, чтобы ваша машина нормально работала, а вы в ней нормално сидели вставляем анимацию. Вставляем анимацию, называем ее driving. integer loopsnd = 0;
default { state_entry() { llSetSitText("Drive"); llSitTarget(<0.3, 0.0, 0.40>, ZERO_ROTATION); llSetCameraEyeOffset(<-9.0, -0.00, 4.0>); llSetCameraAtOffset(<3.0, 0.0, 2.0>); llSetVehicleFlags(-1); llSetVehicleType(VEHICLE_TYPE_CAR); llSetVehicleFlags(VEHICLE_FLAG_NO_FLY_UP | VEHICLE_FLAG_LIMIT_ROLL_ONLY); llSetVehicleFloatParam(VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY, 0.2); llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, 0.80); llSetVehicleFloatParam(VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 0.10); llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_TIMESCALE, 0.10); llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_TIMESCALE, 0.3); llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, 0.2); llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_TIMESCALE, 0.3); llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, 0.1); llSetVehicleVectorParam(VEHICLE_LINEAR_FRICTION_TIMESCALE, <1000.0, 2.0, 1000.0>); llSetVehicleVectorParam(VEHICLE_ANGULAR_FRICTION_TIMESCALE, <10.0, 10.0, 1000.0>); llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 0.90); llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 0.90); llSetVehicleFloatParam(VEHICLE_BANKING_EFFICIENCY, 0.05); llSetVehicleFloatParam(VEHICLE_BANKING_TIMESCALE, 0.1); llCollisionSound("", 0.0); } changed(integer change) { if (change & CHANGED_LINK) { key agent = llAvatarOnSitTarget(); if (agent) { if (agent != llGetOwner()) { llUnSit(agent); llPushObject(agent, <0,0,100>, ZERO_VECTOR, FALSE); } else { llSetStatus(STATUS_PHYSICS, TRUE); llRequestPermissions(agent, PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS); } } else { llSetStatus(STATUS_PHYSICS, FALSE); llReleaseControls(); llStopAnimation("sit"); } } } run_time_permissions(integer perm) { if (perm) { llStopAnimation("sit"); llStartAnimation("driving"); llTakeControls(CONTROL_FWD | CONTROL_BACK | CONTROL_RIGHT | CONTROL_LEFT | CONTROL_ROT_RIGHT | CONTROL_ROT_LEFT, TRUE, FALSE); } } control(key id, integer level, integer edge) { vector angular_motor;
if (level & edge & CONTROL_FWD) { llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <10,0,0>); } else if ((edge & CONTROL_FWD) && ((level & CONTROL_FWD) == FALSE)) { llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <0,0,0>); loopsnd = 0; } else if (level & CONTROL_FWD) { llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <10,0,0>); } if(level & CONTROL_BACK) { llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <-10,0,0>); } if(level & (CONTROL_RIGHT|CONTROL_ROT_RIGHT)) { angular_motor.x += 100; angular_motor.z -= 100; } if(level & (CONTROL_LEFT|CONTROL_ROT_LEFT)) { angular_motor.x -= 100; angular_motor.z += 100; } if(level & (CONTROL_UP)) { angular_motor.y -= 50; } llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION, angular_motor); } }
Cохраняем. Также есть пример скрипта для летательных аппаратов, ковра самолета, метлы, воздушного шара. 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 == llGetOwner()) && (!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, <xMotor,0,zMotor>);
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."); } } }
Меню скрипта: В общем чате напишите START чтобы начать двигаться, STOP для остановки движения. PgUp / PgDn или E / C = курсор вверх / вниз для управления объектом.Скажите HELP для отображения справки.
|