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]