De DigiWiki.
default
{
on_rez(integer flag) { do { llSay(0, "Resetting..."); llResetScript(); } while (TRUE); }
state_entry()
{
llSetClickAction(CLICK_ACTION_SIT);
llSitTarget(<-0.25, 0.0, 0.75>, <0.0, 0.0, 0.0, 0.0>);
llSetCameraEyeOffset(<-5, 0, 2> * <0.0, 0.0, 0.0, 0.0>);
llSetCameraAtOffset(<3, 0, 1> * <0.0, 0.0, 0.0, 0.0>);
}
changed(integer change)
{
if ( change & (CHANGED_REGION_RESTART | CHANGED_REGION_START))
do { llOwnerSay("Resetting..."); llResetScript(); } while (TRUE);
if (change & CHANGED_LINK)
{
key avatar = llAvatarOnSitTarget();
if ( avatar != NULL_KEY ) llRequestPermissions(avatar,PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS);
else if (llGetPermissionsKey() != NULL_KEY)
{
llStopAnimation("surf");
llReleaseControls();
vector pos = llGetPos();
float ground = llGround(ZERO_VECTOR);
rotation rot = llGetRot();
vector euler = llRot2Euler(rot) * RAD_TO_DEG;
rot = <rot.x, rot.y, rot.z, -rot.s> * rot * llEuler2Rot(<0.0, 0.0, euler.z> * DEG_TO_RAD);
if ((pos.z - ground) < 10.0) llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_POSITION, <pos.x, pos.y, ground + 0.0125>]);
llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_ROTATION, rot]);
llSay(0,"I have released control");
}
}
}
run_time_permissions(integer perm)
{
if (perm & ( PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS ))
{
llStopAnimation("sit");
llSleep(0.1);
llStartAnimation("surf");
llTakeControls(CONTROL_FWD | CONTROL_BACK |
CONTROL_ROT_LEFT | CONTROL_ROT_RIGHT |
CONTROL_UP | CONTROL_DOWN,
TRUE, FALSE);
llSay(0,"I have control");
}
}
control(key id, integer held, integer change)
{
vector pos = llGetPos();
vector sim = ZERO_VECTOR;
rotation rot = llGetRot();
// Check sim boundry and Move
if (held & CONTROL_FWD)
{
sim = pos + (llRot2Fwd(rot) * 1);
if ((sim.x > 5.0) && (sim.x < 250.0) && (sim.y > 5.0) && (sim.y < 250.0)) { pos = sim; }
}
if (held & CONTROL_BACK)
{
sim = pos - (llRot2Fwd(rot) * 1);
if ((sim.x > 5.0) && (sim.x < 250.0) && (sim.y > 5.0) && (sim.y < 250.0)) { pos = sim; }
}
// adjust rotation z axis
if (held & CONTROL_ROT_LEFT) { rot = rot * llEuler2Rot(<0.0, 0.0, 15.0> * DEG_TO_RAD); }
if (held & CONTROL_ROT_RIGHT) { rot = rot * llEuler2Rot(<0.0, 0.0, -15.0> * DEG_TO_RAD); }
// add banking
if (held & change & CONTROL_ROT_LEFT) { rot = llEuler2Rot(<-10.0, 0.0, 0.0> * DEG_TO_RAD) * rot; }
if (held & change & CONTROL_ROT_RIGHT) { rot = llEuler2Rot(< 10.0, 0.0, 0.0> * DEG_TO_RAD) * rot; }
// remove banking
if (~held & change & CONTROL_ROT_LEFT) { rot = llEuler2Rot(< 10.0, 0.0, 0.0> * DEG_TO_RAD) * rot; }
if (~held & change & CONTROL_ROT_RIGHT) { rot = llEuler2Rot(<-10.0, 0.0, 0.0> * DEG_TO_RAD) * rot; }
// Adjust rotation local y axis
if (held & CONTROL_UP) { rot = llEuler2Rot(<0.0, 1.0, 0.0> * DEG_TO_RAD) * rot; }
if (held & CONTROL_DOWN) { rot = llEuler2Rot(<0.0, -1.0, 0.0> * DEG_TO_RAD) * rot; }
// if (held & CONTROL_UP) { pos = pos + (llRot2Up(rot) * 1); }
// if (held & CONTROL_DOWN) { pos = pos - (llRot2Up(rot) * 1); }
// fall have to change this.
float ground = llGround(llGetPos() - pos);
if (pos.z > ground) pos.z = pos.z - 0.25;
if (pos.z < 1.0) pos.z = 1.0;
llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_POSITION, pos, PRIM_ROTATION, rot]);
}
}