Security Camera Monitor (The AV monitoring wears this device)
CODE
camera(vector cam_pos, vector cam_offset)
{
llSetCameraParams([
CAMERA_ACTIVE, 1,
CAMERA_FOCUS, cam_offset,
CAMERA_POSITION, cam_pos + <0,0,0.25>,
CAMERA_POSITION_LOCKED, TRUE,
CAMERA_FOCUS_LOCKED, TRUE
]);
}
default
{
attach(key id)
{
if (id != NULL_KEY)
{
llRequestPermissions(id, PERMISSION_CONTROL_CAMERA);
}
}
run_time_permissions(integer perm)
{
if ((perm & PERMISSION_CONTROL_CAMERA) == PERMISSION_CONTROL_CAMERA)
{
llSetCameraParams([CAMERA_ACTIVE, 0]);
llOwnerSay("Camera permissions have been taken");
llListen(230, "Security Camera", NULL_KEY, "");
}
}
listen(integer channel, string name, key id, string message)
{
list parsed = llParseString2List(message, ["!"], []);
camera((vector)llList2String(parsed, 0), (vector)llList2String(parsed, 1));
}
}
Security Camera (On camera parent prim the Z axis is forward/back, X axis is up/down)
CODE
integer enabled = FALSE;
float range = 10.0; // Sense range in meters
rotation rot_init;
rotation rot_idle;
default
{
sensor(integer num_detected)
{
if (!llGetStatus(STATUS_PHYSICS))
llSetStatus(STATUS_PHYSICS | STATUS_BLOCK_GRAB, TRUE);
llLookAt(llDetectedPos(0), 0.80, 0.25);
llShout(230, (string)llGetPos() + "!" + (string)llDetectedPos(0));
}
no_sensor()
{
if (llGetStatus(STATUS_PHYSICS))
llSetStatus(STATUS_PHYSICS, FALSE);
}
touch_start(integer num_detected)
{
if (llDetectedKey(0) == llGetOwner())
{
if (!enabled)
{
rot_idle = llGetRot();
vector eul = llRot2Left(llGetRot());
eul *= 25;
eul *= DEG_TO_RAD;
rot_init = llEuler2Rot(eul);
llSetRot(llGetRot() * rot_init);
if (!llGetStatus(STATUS_PHYSICS))
llSetStatus(STATUS_PHYSICS | STATUS_BLOCK_GRAB, TRUE);
llMoveToTarget(llGetPos(), 1.0);
llSensorRepeat("", NULL_KEY, AGENT, range, PI, 0.5);
enabled = TRUE;
}
else
{
llSensorRemove();
if (llGetStatus(STATUS_PHYSICS))
llSetStatus(STATUS_PHYSICS, FALSE);
llSetRot(rot_idle);
enabled = FALSE;
}
}
}
}