//Multipose Stand -- Rolig Loon -- 7/09/09 -- Updated March 2011 // Place this script and your animations in a prim pose stand. // Touch pose stand to select the next animation in inventory or // type chat commands in channel 47. // Type /47 HELP to see a list of chat commands. integer ThisAnim = 0; integer NumAnims = 0; string CurrAnim = "turn_180"; string HoldName; key agent; default { on_rez(integer start_param) { llResetScript(); } state_entry() { HoldName = llGetObjectName(); llSetAlpha(1.0,ALL_SIDES); llSetObjectDesc("Chat commands on channel 47"); NumAnims = llGetInventoryNumber(INVENTORY_ANIMATION); llListen(47,"","",""); llSetSitText( "Stand" ); llSitTarget( <0.00, 0.00, 0.80>, ZERO_ROTATION ); } listen(integer channel, string thing, key id, string message) { if(id == agent) { if (llToUpper(message) == "ON") // Make the stand visible { llSetAlpha(1.0,ALL_SIDES); } else if (llToUpper(message) == "OFF") // Make ths stand invisible { llSetAlpha(0.0,ALL_SIDES); } else if (llToUpper(message) == "LIST") // LIST all available animations by number { integer j; for (j=0;j<= NumAnims-1;j=j+5) { llInstantMessage(id,"/me " + (string)(j+1) + " = " + llGetInventoryName(INVENTORY_ANIMATION,j) +" \n" + (string)(j+2) + " = " + llGetInventoryName(INVENTORY_ANIMATION,j+1) +" \n" + (string)(j+3) + " = " + llGetInventoryName(INVENTORY_ANIMATION,j+2) +" \n" + (string)(j+4) + " = " + llGetInventoryName(INVENTORY_ANIMATION,j+3) +" \n" + (string)(j+5) + " = " + llGetInventoryName(INVENTORY_ANIMATION,j+4)); } } else if (llToUpper(message) == "SHOW") //SHOW the currently active animation in chat { llInstantMessage(id,"/me Current Animation " + (string)ThisAnim + " = " + CurrAnim); } else if (llToUpper(message) == "NOTE") { llGiveInventory(id,"MultiPose Instructions"); // Give instruction notecard } else if (llToUpper(message) == "HELP") { llInstantMessage(id,"/me Left click the pose stand to advance poses or use chat commands on channel 47:"); llInstantMessage(id,"/me LIST produces a list of available poses with key numbers.\n" + " Typing a key number advances immediately to that pose in the LIST.\n" + " SHOW displays the key number and name of the current animation.\n" + " ON makes the pose stand visible.\n" + " OFF makes the pose stand invisible.\n" + " NOTE offers instructions on a notecard. \n" + " HELP produces this message."); } else { ThisAnim = (integer)message -1; //Listen for an optional direct command to apply animation #message if ((integer)message > NumAnims | (integer)message <= 0) { llInstantMessage(id,"/me Please type a number between 1 and " + (string)(NumAnims)); ThisAnim = 0; } else { llStopAnimation(CurrAnim); CurrAnim = llGetInventoryName(INVENTORY_ANIMATION, ThisAnim%NumAnims); llStartAnimation(CurrAnim); llInstantMessage(id,"/me " +(string)(ThisAnim+1) + " = " + CurrAnim); ++ThisAnim; ThisAnim = ThisAnim%NumAnims; } } } } touch_start(integer num_detected) { if (llDetectedKey(0) == agent) { llStopAnimation(CurrAnim); if(NumAnims != 0) { CurrAnim = llGetInventoryName(INVENTORY_ANIMATION, ThisAnim%NumAnims); llStartAnimation(CurrAnim); llInstantMessage(llDetectedKey(0),"/me " + (string)(ThisAnim+1) + " = " + CurrAnim); ++ThisAnim; ThisAnim = ThisAnim%NumAnims; } else { llStartAnimation("turn_180"); // The default if there are no stored animations is the SL Appearance stance } } } changed(integer change) { if (change & CHANGED_LINK) { agent = llAvatarOnSitTarget(); if (agent) { llInstantMessage(agent,"Click the pad to start and advance animations. Type \"/47 help\" for chat commands."); llRequestPermissions(agent,PERMISSION_TRIGGER_ANIMATION); } else { if ( llGetPermissions() == PERMISSION_TRIGGER_ANIMATION) { llStopAnimation(CurrAnim); llSetObjectName(HoldName); } llResetScript(); } } else if (change & CHANGED_INVENTORY) { llResetScript(); } } run_time_permissions(integer parm) { if(parm == PERMISSION_TRIGGER_ANIMATION) { llStopAnimation("sit"); llSetAlpha(0.0,ALL_SIDES); //Make the pose stand invisible llSetObjectName(""); llStartAnimation(CurrAnim); } } }