Good for reminding you about sandbox returns etc. Ideally worn as a single prim HUD attachment.

 

// V3 //
 
string alarm = "5e1d5f52-e7ae-0194-a412-93a96f39ff6f"; // Name of the sound in the object inventory.
                                                       // Or the UUID of any sound.
 
float volume = 0.5;
 
vector passive = <0.0,0.0,1.0>; // Color for prim when timer is off.
 
vector active = <0.0,1.0,0.0>; // Color for prim when timer is running.
 
vector alarmed = <1.0,0.0,0.0>; // Color for prim when alarm is sounding.
 
float time; // Used to store the timer length.
 
integer on; // Used to store if the timer is running.
 
default
{
    on_rez(integer param)
    {
        llResetScript();
    }
    state_entry()
    {
        llStopSound();
        llSetColor(passive, ALL_SIDES);
        llSetObjectName("Alarm");
    }
    touch_end(integer nd)
    {
        if(on)
        llResetScript();
        else
        {
            if((time = (((float)llGetObjectDesc()) * 60)) < 1.0) // Time established from the prim description.
            {
                llOwnerSay("The time is not set.\nPlease write the time into the object description and try again");
                return;
            }
            llSetColor(active, ALL_SIDES);
            llOwnerSay("/me is set to sound in " + ((string)llRound((time / 60))) + " minutes.");
            llSetTimerEvent(time);
            on = TRUE;
            llPreloadSound(alarm);
        }
    }
    timer()
    {
        llSetTimerEvent(0.0);
        llLoopSound(alarm, volume);
        llSetColor(alarmed, ALL_SIDES);
    }
}