07-16-2007 06:38
I have been working on this script for a week or so now and am having trouble getting my radio controlled duck to stay within a certain area.

I figured I could canabalise something from Apotheus Silverman's swarm script

/54/0c/9803/1.html

Using his spawn location coding.

I call the request permissions and camera position from a controller which the duck responds to.

The vehicle section works fine but the script doesn't limit how far the duck can move from the spawn_location

I realise I may have done something stupid but the script compiles ok.

Can anyone help me fix the problem?

This is what i produced

[PHP]
float forward_power = 5; //Power used to go forward (1 to 30)
float reverse_power = -1; //Power ued to go reverse (-1 to -30)
float turning_ratio = 1.0; //How sharply the vehicle turns. Less is more sharply. (.1 to 10)

// How much force to apply when repulsed by another like me
float repulse_force_modifier = 0.86;

// How far away to scan for others like me
float sensor_distance = 30.0;



// Timer length
float timer_length = 0.5;

vector spawn_location;

float mass;

// Maximum distance from spawn point
float max_distance = 5.0;



// Collision function
collide(vector loc) {
vector mypos = llGetPos();
// Apply repulse force
vector impulse = llVecNorm(mypos - loc);
llApplyImpulse(impulse * repulse_force_modifier * mass, FALSE);
//llSay(0, "collide() - impulse " + (string)impulse + " applied.";);

}

sensor_any() {

vector mypos = llGetPos();


// Stay near spawn location
if (llVecDist(mypos, spawn_location) > max_distance) {
// Compensate for being near sim border
if (spawn_location.x - mypos.x > 100) {
mypos.x += 255;
}
//llSay(0, "collide() called due to too much distance from my spawn point. mypos=" + (string)mypos + ", spawn_location = " + (string)spawn_location);
collide(mypos - llVecNorm(spawn_location - mypos));
}
}

default
{
state_entry()
{

llResetTime();

//Listens for command from controller
llListen(6757,"",NULL_KEY,"";);//
spawn_location = llGetPos();



//duck vehicle parameters
llSetVehicleType(VEHICLE_TYPE_CAR);
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, 1.0);
llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, 0.2);
llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_TIMESCALE, 0.1);
llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, 0.5);
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, 1.0);
llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 0.10);
llSetVehicleFloatParam(VEHICLE_HOVER_HEIGHT, 2.0);
llSetVehicleFloatParam(VEHICLE_HOVER_EFFICIENCY, 0.5);
llSetVehicleFloatParam(VEHICLE_HOVER_TIMESCALE, 0.1);
llSetVehicleFloatParam(VEHICLE_BUOYANCY, 1.0);


// Initialize sensor
llSensorRepeat(llGetObjectName(), NULL_KEY, ACTIVE|SCRIPTED, sensor_distance, PI, timer_length);


}

collision_start(integer total_number) {
//llSay(0, "collide() called due to physical object collision.";);
collide(llDetectedPos(0));
}

no_sensor() {
sensor_any();
}

sensor(integer total_number) {
sensor_any();

}

listen(integer channel, string name, key id, string message)
// releases controls and stops anim when you stand up
{if (message=="standing";)
{llReleaseControls();
llSetStatus(STATUS_PHYSICS, FALSE);
llSay(0, "released";);

}

else

{

llResetTime();

llSetStatus(STATUS_PHYSICS, TRUE);

//Changes recieved string to a list
list my_list = llParseString2List(message,[" "],["."]);

//Gets key for permission request
key driver = llList2Key(my_list, 0);
llRequestPermissions(driver, PERMISSION_TAKE_CONTROLS);
}
}

//requests permissions and controls duck
run_time_permissions(integer perm)
{
if (perm)
{
llTakeControls(CONTROL_FWD | CONTROL_BACK | CONTROL_DOWN | CONTROL_UP | CONTROL_RIGHT |
CONTROL_LEFT | CONTROL_ROT_RIGHT | CONTROL_ROT_LEFT, TRUE, FALSE);
}
}

control(key id, integer level, integer edge)
{
integer reverse=1;
vector angular_motor;

//get current speed
vector vel = llGetVel();
float speed = llVecMag(vel);

//car controls
if(level & CONTROL_FWD)
{

llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <forward_power,0,0>;);
reverse=1;
}
if(level & CONTROL_BACK)
{

llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <reverse_power,0,0>;);
reverse = -1;
}

if(level & (CONTROL_RIGHT|CONTROL_ROT_RIGHT))
{

angular_motor.z -= speed / turning_ratio * reverse;
}

if(level & (CONTROL_LEFT|CONTROL_ROT_LEFT))
{

angular_motor.z += speed / turning_ratio * reverse;
}

llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION, angular_motor);

} //end control
}
[/PHP]