Welcome to the Second Life Forums Archive

These forums are CLOSED. Please visit the new forums HERE

Timer event stops firing.

Senuka Harbinger
A-Life, one bit at a time
Join date: 24 Oct 2005
Posts: 491
06-16-2007 09:30
I have a very simple AI for moving a vehicle to a series of waypoints using a timer to adjust the controls of the vehicle. my problem is that every once in a while (about every 4 hours running time) the timer event just stops. other events fire just fine when I added them in for debugging. the strange thing is, when the vehicle is moved physically in some meaningful way (wether bumped, or "Dragged" the timer resumes.

any ideas why this is?


CODE

vector target=<42,34,378>;




default
{
state_entry()
{
llSetStatus(STATUS_ROTATE_Y,FALSE);
llSetStatus(STATUS_ROTATE_Z,TRUE);
llSetBuoyancy(.1);
llSetVehicleType(VEHICLE_TYPE_AIRPLANE);
llSetVehicleVectorParam(VEHICLE_LINEAR_FRICTION_TIMESCALE, <55.0, 55.0, 500.0>);
llSetVehicleFloatParam(VEHICLE_ANGULAR_FRICTION_TIMESCALE, 600.0);
llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <400.0, 5.0, 5000.0>);
llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_TIMESCALE, 1.0);
llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, 1);
llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION, <PI, PI, PI/25>);
llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_TIMESCALE, .5);
llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, .5);
llSetVehicleFloatParam(VEHICLE_HOVER_TIMESCALE, 310.0) ;
llSetVehicleFloatParam(VEHICLE_HOVER_HEIGHT, 370.0);
llSetVehicleFloatParam(VEHICLE_HOVER_EFFICIENCY, .10);
llSetVehicleFloatParam(VEHICLE_BUOYANCY, 1.5);
llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_TIMESCALE, 0.0);
llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, 0.0);
llSetVehicleFloatParam(VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 0.0);
llSetVehicleFloatParam(VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY, 0.0);
llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 10.0);
llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 0.25);
llSetVehicleFloatParam(VEHICLE_BANKING_EFFICIENCY, 1.0);
llSetVehicleFloatParam(VEHICLE_BANKING_MIX, 1.0) ;
llSetVehicleFloatParam(VEHICLE_BANKING_TIMESCALE, .1);
llSetVehicleRotationParam(VEHICLE_REFERENCE_FRAME, <0.0, 0.0, 0.0, 1.0>);
llRemoveVehicleFlags(VEHICLE_FLAG_NO_DEFLECTION_UP
| VEHICLE_FLAG_HOVER_WATER_ONLY
| VEHICLE_FLAG_HOVER_TERRAIN_ONLY
| VEHICLE_FLAG_LIMIT_MOTOR_UP
|VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT ) ;

llSetTimerEvent(.25);


}

timer()
{
vector linear;
vector angular;
integer direction;
vector mypos=llGetPos();
vector mydir=llRot2Fwd(llGetRot());
vector tardir=llVecNorm(target-mypos);
rotation test=llRotBetween(mydir,tardir);
float dist=llVecDist(target,mypos);
float planardist=llSqrt((target.x-mypos.x)*(target.x-mypos.x)+(target.y - mypos.y)*(target.y - mypos.y));
if (mypos.x <2 || mypos.y <2 || mypos.x >253 ||mypos.y > 253)
{
llSetStatus(STATUS_PHYSICS,FALSE);
llSleep(.2);
if(mypos.x <2)
{
llSetPos(<3,mypos.y,mypos.z>);
}
if(mypos.y <2)
{
llSetPos(<mypos.x,3,mypos.z>);
}
if(mypos.x >253)
{
llSetPos(<252,mypos.y,mypos.z>);
}
if(mypos.y >253)
{
llSetPos(<mypos.x,252,mypos.z>);
}

llSetStatus(STATUS_PHYSICS,TRUE);
}

if(llVecMag(mydir + tardir) <1)
{
//llOwnerSay("waypoint behind us");
direction= -1;
}
else
{
direction = 1;
}
if(test.z>0)
{
angular.z +=PI*(llFabs(test.z));
if (angular.z >PI/4)
{
angular.z=PI/4;
}
linear.y =planardist/4;
if(linear.y > 5)
{
linear.y=5;
}
}
if(test.z<0)
{
angular.z -=PI*(llFabs(test.z));
if(angular.z < -PI/4)
{
angular.z = -PI/4;
}
linear.y = -planardist/4;
if(linear.y < -5)
{
linear.y = -5;
}
}
if(tardir.z>0)
{
linear.z = 25*tardir.z;

}
if(tardir.z<0)
{
linear.z = 25*tardir.z;

}
if(planardist >20)
{
linear.x =20*direction;
}
if (planardist < 20)
{
linear.x =planardist/4*direction;
}

//llOwnerSay((string)linear);
if(dist <1)
{
float time=llGetTime();
if(time >= 4)
{
llResetTime();
if(target==<42.0,34.0,378.0>)
{
llWhisper(0,"waypoint1 reached");
target=<42.0,34.0,400>;
state dumping;
}
else if(target==<42.0,34.0,400>)
{
llWhisper(0,"waypoint2 reached");
target=<43,180,400>;
//llSetStatus(STATUS_ROTATE_Z,TRUE);
}
else if(target==<43,180,400>)
{
llWhisper(0,"waypoint3 reached");
target=<43,180,355>;
//llSetStatus(STATUS_ROTATE_Z,FALSE);
}
else if(target==<43,180,355>)
{
llWhisper(0,"waypoint4 reached");
target=<43,180,420>;
llSetStatus(STATUS_ROTATE_Z|STATUS_PHYSICS,FALSE);
llSleep(15);
llSetStatus(STATUS_ROTATE_Z|STATUS_PHYSICS,TRUE);
}
else if(target==<43,180,420>)
{
llWhisper(0,"waypoint5 reached");
target=<208,134,233>;
//llSetStatus(STATUS_ROTATE_Z,TRUE);
}
else if(target==<208,134,233>)
{
llWhisper(0,"waypoint6 reached");
llSleep(10);
target=<208,134,400>;
}
else if(target==<208,134,400>)
{
llWhisper(0,"waypoint7 reached");
target=<42.0,34.0,378>;
}
}
}
vector vert=target-mypos;
//llSay(0,(string)tardir.z);
//llOwnerSay((string)angular);
llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, linear);
llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION, angular);
llSetText("planar distance: " + (string)planardist + "\n vertical distance: " + (string)vert.z + "\n linear motor: " +(string)linear + "\n angular motor: " +(string)angular + "\n Enegry: " + (string)llGetEnergy(),<1,1,1>,1);
if(linear.z > 50)
{
linear=<linear.x,linear.y,50>;
}
if(linear.z < -50)
{
linear=<linear.x,linear.y,-50>;
}
if(linear.x >40)
{
linear=<40,linear.y,linear.z>;
}
if (linear.x < -40)
{
linear=<-40,linear.y,linear.z>;
}
//llOwnerSay((string)linear);
}

}

state dumping
{
state_entry()
{

llSetStatus(STATUS_PHYSICS,FALSE);
llSleep(.2);
vector myrot=llRot2Euler(llGetRot());
llSetRot(llEuler2Rot(<0,0,myrot.z>));
llSetStatus(STATUS_PHYSICS,TRUE);
llSetStatus(STATUS_ROTATE_Y,FALSE);
llSetStatus(STATUS_ROTATE_Z,TRUE);
llSetBuoyancy(1.0);
llSetVehicleType(VEHICLE_TYPE_AIRPLANE);
llSetVehicleVectorParam(VEHICLE_LINEAR_FRICTION_TIMESCALE, <55.0, 55.0, 500.0>);
llSetVehicleFloatParam(VEHICLE_ANGULAR_FRICTION_TIMESCALE, 600.0);
llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <0.0, 0.0, 0.0>);
llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_TIMESCALE, 100.0);
llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, .1);
llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION, <PI, PI, PI/25>);
llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_TIMESCALE, .5);
llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, .5);
llSetVehicleFloatParam(VEHICLE_HOVER_TIMESCALE, 310.0) ;
llSetVehicleFloatParam(VEHICLE_HOVER_HEIGHT, 370.0);
llSetVehicleFloatParam(VEHICLE_HOVER_EFFICIENCY, .10);
llSetVehicleFloatParam(VEHICLE_BUOYANCY, 1.5);
llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_TIMESCALE, 0.0);
llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, 0.0);
llSetVehicleFloatParam(VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 0.0);
llSetVehicleFloatParam(VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY, 0.0);
llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 10.0);
llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 0.25);
llSetVehicleFloatParam(VEHICLE_BANKING_EFFICIENCY, 1.0);
llSetVehicleFloatParam(VEHICLE_BANKING_MIX, 0.5) ;
llSetVehicleFloatParam(VEHICLE_BANKING_TIMESCALE, 0.50);
llSetVehicleRotationParam(VEHICLE_REFERENCE_FRAME, <0.0, 0.0, 0.0, 1.0>);
llRemoveVehicleFlags(VEHICLE_FLAG_NO_DEFLECTION_UP
| VEHICLE_FLAG_HOVER_WATER_ONLY
| VEHICLE_FLAG_HOVER_TERRAIN_ONLY
| VEHICLE_FLAG_LIMIT_MOTOR_UP
|VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT ) ;
llRotTarget(<-0.00000, -0.00000, 0.70711, 0.70711>,0.1);
}

not_at_rot_target()
{
vector angular;
vector mydir=llRot2Fwd(llGetRot());
rotation test=llRotBetween(mydir,<0,1,0>);
if(test.z>0)
{
angular.z +=PI*(llFabs(test.z));
if (angular.z >PI/8)
{
angular.z=PI/8;
}
}
if(test.z<0)
{
angular.z -=PI*(llFabs(test.z));
if(angular.z < -PI/8)
{
angular.z = -PI/8;
}
}
llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION, angular);
}
at_rot_target(integer num, rotation target, rotation myrot)
{
llSetStatus(STATUS_PHYSICS,FALSE);
llWhisper(0,"dumping waste");
llMessageLinked(LINK_SET,0,"dumping",NULL_KEY);
llSleep(5);
llSay(0,"dump finished");
llSetStatus(STATUS_PHYSICS,TRUE);
state default;
}
}



I thought it might have something to do with having a low energy level, but it doesn't dip below normal operating levels (.0008 to .0001)
_____________________
My SLExchange shop

Typos are forgiven; desecrating the english language with reckless abandon and necrophilic acts is not.


The function is working perfectly fine. It's just not working the way you wanted it to work.
Qie Niangao
Coin-operated
Join date: 24 May 2006
Posts: 7,138
If a timer falls in the forest...
06-17-2007 08:47
Possibly related: I had a couple of objects, originally about poseball-sized, that updated particle effects on a timer, about once a minute, some of the time emitting no particles. The particle effect kept disappearing after a while. Disabling camera constraints, I found that the objects themselves weren't rezzed, and when I moved the avatar close enough to get them to rez in the viewer, the particle effects resumed. I then made the objects huge (and transparent), and since then they seem to update normally. So... could it be that a pending timer event isn't enough to keep objects active in the sim?

Would be interesting to know if, after the timer has apparently stopped, if you "sneak up" on your vehicle with cam constraints disabled, whether it rezzes or has been somehow optimized out of the sim task scheduler.