// huffware script: hour hand, modified by fred huffhines. // // expanded to support time zones by fred huffhines, december 2009. // // noticed this in arcadia asylum's great hobo cuckoo clock. // this script is licensed by Beezle Warburton: // "I released those 'into the wild' years ago,do what you like, // I just ask that people don't resell the scripts by themselves." // // fred's changes licensed by: // this script is licensed by the GPL v3 which is documented at: http://www.gnu.org/licenses/gpl.html // do not use it in objects without fully realizing you are implicitly accepting that license. // Optional second hand will be a much simpler script that will be // unrelated to real-time. // // note - to reduce load, this script only calculates once a minute, so // this provides a jump style minute hand, rather than a smoothy rotating one. // This (and rounding) makes the clock's accuracy +/- 1 minute. // It's a prim clock anyways, so digital accuracy is just excessive. // // It would probably be more elegant to use link messages rather than each // hand having it's own script, however, this method allows for less caution // when linking/unlinking parts of the clock. // To not mess up timekeeping, please keep chime sounds under 4 seconds long. integer time; integer hours; integer minutes; float anglehours; float angleminutes; integer chime; integer numrings; string chimesound = "CuckooClock"; float chimevolume = 1.0; // this is what might be adjusted. integer LOCAL_TIME_ZONE_OFFSET = -5; //-5 is EST, -8 is PST. // the code used in linked messages for us. integer SECRET_TIME_ZONE_ADJUSTER_ID = -2091823; string TIME_ZONE_ADJUST_COMMAND = "tzadjust"; default { state_entry() { if (llSubStringIndex(llGetObjectName(), "huffotronic") < 0) state real_default; } on_rez(integer parm) { state rerun; } } state rerun { state_entry() { state default; } } state real_default { state_entry() { // we want to calculate once a minute. llSetTimerEvent(60.0); } timer() { llSetTimerEvent(0); time = (integer)llGetGMTclock(); // seconds since midnight // adjust the hours for the time zone. this will work for most time zones that // go through daylight saving time, like the pacific zone where SL is rooted. hours = (time / 3600) + LOCAL_TIME_ZONE_OFFSET; // convert from 24 to 12 hour time if (hours > 11) { hours = hours - 12; } else if (hours < 0) { hours = hours + 12; } minutes = (time % 3600) / 60; numrings = (integer)hours; if (numrings == 0) { numrings = 12; } // the extra addition here makes a smooth hour hand // for example, at 6:30, the hour hand should actually // be halfway between 6 and 7 on the clock dial anglehours = - (((float)hours / 12) + (((float)minutes / 720))) * TWO_PI; //incompatible with opensim: llSetSoundQueueing(TRUE); llRotateTexture(anglehours, ALL_SIDES); if (minutes == 0) { llMessageLinked(-1,numrings,"chime",NULL_KEY); //for (chime = 0; chime < numrings; chime++) { // llPlaySound(chimesound, chimevolume); // llSleep(3.0); //} } llSetTimerEvent(60.0); } link_message(integer sender, integer num, string msg, key id) { if ( (num != SECRET_TIME_ZONE_ADJUSTER_ID) || (msg != TIME_ZONE_ADJUST_COMMAND) ) return; // not for us. // this should be a time zone for us to use. LOCAL_TIME_ZONE_OFFSET = (integer)((string)id); //llSay(0, "got a new time zone of " + (string)LOCAL_TIME_ZONE_OFFSET ); // handle this update as soon as possible. llSetTimerEvent(0.1); } }