Simple analog clock with hourly chimes (if desired) that by default shows GMT but can by simply clicking the object be adjusted by hour to show any global timezone.
- The first script is used to build the object. Some manual prim editing is required but very little. This includes the naming of the hands.
- The second script runs the clock.
Clock Maker
- Create a link_set of 6 prims.
- Drop this script on it.
// V2 // default { state_entry() { if(llGetObjectPrimCount(llGetKey()) == 6) { llSetLinkPrimitiveParamsFast(1, [5,1,7,<1.0, 1.0, 0.02>, 8,<0.0, 0.0, 0.0, 1.0>, 9,0,0,<0.0, 1.0, 0.0>,0.0,<0.0, 0.0, 0.0>,<0.95, 0.95, 0.0>,<0.0, 0.0, 0.0>, 17,0,"ecf785e7-4cf6-9f95-6292-40061bdddeed",<0.7, 0.7, 0.0>,<0.0, 0.0, 0.0>,0.0, 17,1,"5748decc-f629-461c-9a36-a35a221fe21f",<1.0, 1.0, 0.0>,<0.0, 0.0, 0.0>,0.0, 17,2,"5748decc-f629-461c-9a36-a35a221fe21f",<1.0, 1.0, 0.0>,<0.0, 0.0, 0.0>,0.0, 17,3,"5748decc-f629-461c-9a36-a35a221fe21f",<1.0, 1.0, 0.0>,<0.0, 0.0, 0.0>,0.0, 17,4,"5748decc-f629-461c-9a36-a35a221fe21f",<1.0, 1.0, 0.0>,<0.0, 0.0, 0.0>,0.0, 17,5,"5748decc-f629-461c-9a36-a35a221fe21f",<1.0, 1.0, 0.0>,<0.0, 0.0, 0.0>,0.0, 18,-1,<0.6745, 0.6745, 0.7255>,1.0, 19,0,3,1, 19,1,3,0, 19,2,3,0, 19,3,3,0, 19,4,3,0, 19,5,3,0, 20,0,1, 20,1,0, 20,2,0, 20,3,0, 20,4,0, 20,5,1, 25,-1,0.012]); llSetLinkPrimitiveParamsFast(2, [6, <0.0,0.0,0.01>, 7,<0.16, 0.91, 0.91>, 8,<0.0, 0.707107, 0.0, 0.707107>, 9,3,0,<0.0, 1.0, 0.0>,0.0,<0.0, 0.0, 0.0>,<0.5, 1.0, 0.0>, 17,-1,"e97cf410-8e61-7005-ec06-629eba4cd1fb",<1.0, 1.0, 0.0>,<0.0, 0.0, 0.0>,0.0, 18,-1,<1.0, 1.0, 1.0>,1.0, 19,-1,2,0]); llSetLinkPrimitiveParamsFast(3, [6, <0.0,0.0,0.02>, 7,<0.04, 0.6, 0.02>, 8,<0.0, 0.0, 0.0, 1.0>, 9,0,0,<0.375, 0.875, 0.0>,0.0,<0.0, 0.0, 0.0>,<1.0, 1.0, 0.0>,<0.0, 0.0, 0.0>, 17,-1,"5748decc-f629-461c-9a36-a35a221fe21f",<1.0, 1.0, 0.0>,<0.0, 0.0, 0.0>,0.0, 18,-1,<0.0, 0.0, 0.0>,1.0, 19,-1,1,0, 25,-1,0.012]); llSetLinkPrimitiveParamsFast(4, [6, <0.0,0.0,0.06>, 7,<0.02, 0.4, 0.02>, 8,<0.0, 0.0, 0.0, 1.0>, 9,0,0,<0.375, 0.875, 0.0>,0.0,<0.0, 0.0, 0.0>,<1.0, 1.0, 0.0>,<0.0, 0.0, 0.0>, 17,-1,"5748decc-f629-461c-9a36-a35a221fe21f",<1.0, 1.0, 0.0>,<0.0, 0.0, 0.0>,0.0, 18,-1,<0.5, 0.0, 0.0>,1.0, 19,-1,1,0, 25,-1,0.012]); llSetLinkPrimitiveParamsFast(5, [6, <0.0,0.0,0.04>, 7,<0.02, 0.8, 0.02>, 8,<0.0, 0.0, 0.0, 1.0>, 9,0,0,<0.375, 0.875, 0.0>,0.0,<0.0, 0.0, 0.0>,<1.0, 1.0, 0.0>,<0.0, 0.0, 0.0>, 17,-1,"5748decc-f629-461c-9a36-a35a221fe21f",<1.0, 1.0, 0.0>,<0.0, 0.0, 0.0>,0.0, 18,-1,<0.0, 0.0, 0.0>,1.0, 19,-1,1,0, 25,-1,0.012]); llSetLinkPrimitiveParamsFast(6, [6, <0.0,0.0,0.01>, 7,<0.12, 0.06, 0.06>, 8,<0.0, 0.707107, 0.0, 0.707107>, 9,3,0,<0.0, 1.0, 0.0>,0.0,<0.0, 0.0, 0.0>,<0.5, 1.0, 0.0>, 17,-1,"5748decc-f629-461c-9a36-a35a221fe21f",<1.0, 1.0, 0.0>,<0.25, 0.0, 0.0>,0.0, 18,-1,<0.675, 0.675, 0.7255>,1.0, 19,0,3,0,19,1,3,0,19,2,3,0, 25,-1,0.012]); llSetLinkPrimitiveParamsFast(1, [8,<0.707107, 0.0, 0.0, 0.707107>]); llRemoveInventory(llGetScriptName()); } else llOwnerSay("Read the instructions"); } }
- https://d1yjxggot69855.cloudfront.net/skins/monobook/bullet.gif); color: rgb(0, 0, 0); font-family: verdana, helvetica, sans-serif; font-size: 13px; background-color: rgb(255, 255, 255); ">
- When it has run, open an edit on the object and check the "Edit Linked Parts" checkbox.
- Select the clear dome covering the face and path cut it to give easier editing access to the hands.
- Select each hand one at a time and set the slice parameter to
B : 0.400 E : 0.600
- As you have the edit open for each, also name each hand as follows -
- https://d1yjxggot69855.cloudfront.net/skins/monobook/bullet.gif); ">
- Hour Hand - is the shorter of the two black hands.
- Minute Hand - is the longer of the two black hands.
- Second Hand - is the shortest.
- https://d1yjxggot69855.cloudfront.net/skins/monobook/bullet.gif); ">
- NAME THE HANDS EXACTLY AS THEY ARE WRITTEN HERE. Mind the capitals and spaces etc.
- When those steps are complete, select the dome prim again and remove the path cutting.
- The object is complete.
Clock Movement
- https://d1yjxggot69855.cloudfront.net/skins/monobook/bullet.gif); color: rgb(0, 0, 0); font-family: verdana, helvetica, sans-serif; font-size: 13px; background-color: rgb(255, 255, 255); ">
- Drop this script onto the clock object.
- As soon as the script runs it will start displaying the time GMT.
- If a UUID has been set for chimes it will chime the hour (even if not zero minutes past) but from then on will only chime on the hour each hour.
- To set the time to another timezone simply touch the clock and the time will increment by one hour.
- Enjoy!
// V1 // key chime = "79cdaa3c-43e9-63e7-d3c3-af6a14239452"; // Chime sound UUID. If empty no chime will sound. float volume = 1.0; // Volume of chime. /////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////IF YOU EDIT BELOW THIS LINE THE SCRIPT WILL EXPLODE///////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////// integer second_hand_link; integer minute_hand_link; integer hour_hand_link; float twelve = 43200.0; integer last = -1; integer offset; integer chimes; integer hour; default { on_rez(integer param) { llResetScript(); } changed(integer change) { if(change & CHANGED_LINK) llResetScript(); } state_entry() { integer nol = (llGetObjectPrimCount(llGetKey()) + 1); string link_name = ""; while(--nol) { if((link_name = llGetLinkName(nol)) == "Second Hand") second_hand_link = nol; else if(link_name == "Minute Hand") minute_hand_link = nol; else if(link_name == "Hour Hand") hour_hand_link = nol; } llSetTimerEvent(1.0); } timer() { float seconds = (llGetGMTclock() + ((float)offset)); rotation root_rot = llGetRootRotation(); llSetLinkPrimitiveParamsFast(second_hand_link, [8, (llEuler2Rot(<0.0,0.0,(seconds * -6.0)> * DEG_TO_RAD) / root_rot)]); llSetLinkPrimitiveParamsFast(minute_hand_link, [8, (llEuler2Rot(<0.0,0.0,(seconds * -0.1)> * DEG_TO_RAD) / root_rot)]); llSetLinkPrimitiveParamsFast(hour_hand_link, [8, (llEuler2Rot(<0.0,0.0,(seconds * -0.008333)> * DEG_TO_RAD) / root_rot)]); if(chime) { if((!chimes)) { if(seconds > twelve) { if((seconds -= twelve) > twelve) seconds -= twelve; } if((hour = llFloor((seconds / 3600.0))) != last) { last = hour; if((!hour)) hour = 12; chimes = hour; } } if(chimes) { llPlaySound(chime, volume); --chimes; } } } touch_start(integer nd) { while(nd) { if(llDetectedKey((--nd)) == llGetOwner()) { llSetTimerEvent(0.0); if((offset += 3600) == ((integer)twelve)) offset = 0; chimes = 0; llSetTimerEvent(1.0); } } } }