Just to have some code cred, here's some (non-RO) script I wrote for a companion NPC in another engine.
// Play a sound whenever the owner is walking
integer gWasWalking; // TRUE when wearer is already walking
string gSound = "7f213adc-4a14-9b4e-a5ef-a1edee652402"; // name of soundfile in inventory
integer playbackchannel = 1; // The default llMessageLinked number
rotation calcChildRot(rotation rdeltaRot){
if (llGetAttached())
return rdeltaRot/llGetLocalRot();
else
return rdeltaRot/llGetRootRotation();
}
default
{
state_entry()
{
// Start a timer to continuously check if the owner is walking
llSetTimerEvent(0.25);
llSetLinkPrimitiveParamsFast(4, [PRIM_ROTATION,calcChildRot(<0.00000, -0.00000, -0.70711, 0.70711>)]);
llSetLinkPrimitiveParamsFast(5, [PRIM_ROTATION,calcChildRot(<0.00000, 0.00000, 1.00000, 0.00000>)]);
llSetLinkPrimitiveParamsFast(6, [PRIM_ROTATION,calcChildRot(<0.00000, 0.00000, 0.70744, 0.70677>)]);
llSetLinkPrimitiveParamsFast(7, [PRIM_ROTATION,calcChildRot(<0.00000, 0.00000, 0.00000, 1.00000>)]);
//pos
llSetLinkPrimitiveParamsFast(5, [PRIM_POSITION, <0.175401, 0.176509, -0.213100>]);
llSetLinkPrimitiveParamsFast(4, [PRIM_POSITION, <-0.175605, 0.174294, -0.215500>]);
llSetLinkPrimitiveParamsFast(6, [PRIM_POSITION, <0.174503, -0.175005, -0.215498>]);
llSetLinkPrimitiveParamsFast(7, [PRIM_POSITION, <-0.171001, -0.172900, -0.213102>]);
//shell
llSetLinkPrimitiveParamsFast(3, [PRIM_POSITION, <0.000500, -0.002500, -0.065900>]);
llSetLinkPrimitiveParamsFast(3, [PRIM_ROTATION,calcChildRot(<0.00003, 0.70710, -0.00005, 0.70711>)]);
//Joint
llSetLinkPrimitiveParamsFast(8, [PRIM_POSITION, <0.000400, -0.000400, -0.256800>]);
llSetLinkPrimitiveParamsFast(8, [PRIM_ROTATION,calcChildRot(<0.00000, 0.00000, 0.70711, 0.70711>)]);
}
timer()
{
integer NowWalking = llGetAgentInfo(llGetOwner()) & AGENT_WALKING;
if (NowWalking != gWasWalking) // walking has stopped or started
{
//Not Walking
llStopSound();
llSetLinkPrimitiveParamsFast(4, [PRIM_ROTATION,calcChildRot(<0.00000, -0.00000, -0.70711, 0.70711>)]);
llSetLinkPrimitiveParamsFast(5, [PRIM_ROTATION,calcChildRot(<0.00000, 0.00000, 1.00000, 0.00000>)]);
llSetLinkPrimitiveParamsFast(6, [PRIM_ROTATION,calcChildRot(<0.00000, 0.00000, 0.70744, 0.70677>)]);
llSetLinkPrimitiveParamsFast(7, [PRIM_ROTATION,calcChildRot(<0.00000, 0.00000, 0.00000, 1.00000>)]);
//pos
llSetLinkPrimitiveParamsFast(5, [PRIM_POSITION, <0.175401, 0.176509, -0.213100>]);
llSetLinkPrimitiveParamsFast(4, [PRIM_POSITION, <-0.175605, 0.174294, -0.215500>]);
llSetLinkPrimitiveParamsFast(6, [PRIM_POSITION, <0.174503, -0.175005, -0.215498>]);
llSetLinkPrimitiveParamsFast(7, [PRIM_POSITION, <-0.171001, -0.172900, -0.213102>]);
if (NowWalking)
//Walking
llLoopSound(gSound, 1.0);
}
gWasWalking = NowWalking;
}
}