unpacked files
This commit is contained in:
413
Dance Engine/Dance Engine v1.0.lsl
Normal file
413
Dance Engine/Dance Engine v1.0.lsl
Normal file
@@ -0,0 +1,413 @@
|
||||
// Default Program FrameWork
|
||||
/*
|
||||
|
||||
Replace this Section with Program Specific Information
|
||||
|
||||
*/
|
||||
|
||||
// Created by Tech Guy of IO
|
||||
|
||||
// Configuration Directives
|
||||
/* This Section Contains Configuration Variables that will contain data set by reading the notecard specified by ConfigFile Variable */
|
||||
|
||||
// Communication Channels
|
||||
integer MenuComChannel; // Menu Communications Channel for All User Dialog Communications
|
||||
integer ComChannel; // General Communication Channel for Inter-Device Communication
|
||||
|
||||
// System Variables
|
||||
/* This Section contains variables that will be used throughout the program. */
|
||||
// Admin ACL
|
||||
list Admins; // List of Administrator Keys Read in from ConfigFile
|
||||
// Dance Animation Names
|
||||
list Dances;
|
||||
// Num Dances Per Category
|
||||
list NumDances;
|
||||
// Num of Categories
|
||||
integer NumCats;
|
||||
// List of Category Names (Index Associated with {NumCats}
|
||||
list CatNames;
|
||||
// Couples Dances
|
||||
list CDances;
|
||||
// Dancers Keys
|
||||
list Dancers;
|
||||
// Maximum Dancers Supported
|
||||
integer MaxDancers = 20;
|
||||
// Number of Active Dancers (Not to Exceed Max Dancers)
|
||||
integer NumDancers;
|
||||
// Default Dance for someone who requests start
|
||||
string DefaultDance;
|
||||
|
||||
// Communication Handles
|
||||
integer MenuComHandle; // Menu Communications Handle
|
||||
integer ComHandle; // General Communications Handle
|
||||
// Config Card Reading Variables
|
||||
integer cLine; // Holds Configuration Line Index for Loading Config Loop
|
||||
key cQueryID; // Holds Current Configuration File Line during Loading Loop
|
||||
integer DCounter;
|
||||
string DanceCat;
|
||||
|
||||
|
||||
// System Constants
|
||||
/* This Section contains constants used throughout the program */
|
||||
string BootMessage = "Booting..."; // Default/Initial Boot Message
|
||||
string ConfigFile = ".config"; // Name of Configuration File
|
||||
string EMPTY = "";
|
||||
|
||||
// Menu Constants
|
||||
string MainMenuMessage = "Wholearth Dance Machine v1.0";
|
||||
list MainMenuButtons = [ "<<", "Stop", ">>", "Dances", "Start", "Invite", "Sync", "Random" ];
|
||||
list NavButtons = [ "Prev Menu", "Exit Menu" ];
|
||||
list AdminButton = [ "Admin" ];
|
||||
list AdminMenuButtons = [ "Dance", "Random", "Reset", "Sync" ];
|
||||
string AdminMenuMessage = "Admin Menu\n\tDance -> Sets Default Dance for start request\n\tRandom -> Should dances auto cycle.\n\tReset -> Reset Scripts\n\tSync -> Sync's Current Default Dance";
|
||||
string DefaultDancesMenuMessage = "Change the Default Dance...";
|
||||
|
||||
// Color Vectors
|
||||
list colorsVectors = [<0.000, 0.455, 0.851>, <0.498, 0.859, 1.000>, <0.224, 0.800, 0.800>, <0.239, 0.600, 0.439>, <0.180, 0.800, 0.251>, <0.004, 1.000, 0.439>, <1.000, 0.522, 0.106>, <1.000, 0.255, 0.212>, <0.522, 0.078, 0.294>, <0.941, 0.071, 0.745>, <0.694, 0.051, 0.788>, <1.000, 1.000, 1.000>];
|
||||
|
||||
// List of Names for Colors
|
||||
list colors = ["BLUE", "AQUA", "TEAL", "OLIVE", "GREEN", "LIME", "ORANGE", "RED", "MAROON", "FUCHSIA", "PURPLE", "WHITE"];
|
||||
|
||||
// System Switches
|
||||
/* This Section contains variables representing switches (integer(binary) yes/no) or modes (string "modename" */
|
||||
// Debug Mode Swtich
|
||||
integer DebugMode = FALSE; // Is Debug Mode Enabled before Reading Obtaining Configuation Information
|
||||
string AdminOpFlag;
|
||||
|
||||
// Imported Functions
|
||||
/* This section contains any functions that were not written by Tech Guy */
|
||||
|
||||
// Home-Brew Functions
|
||||
/* This section contains any functions that were written by Tech Guy */
|
||||
|
||||
// Debug Message Function
|
||||
DebugMessage(string msg){
|
||||
if(DebugMode){
|
||||
llOwnerSay(msg);
|
||||
}
|
||||
}
|
||||
|
||||
// Send Any User a Message
|
||||
SendMessage(string msg, key userid){
|
||||
if(userid=="NULL_KEY" || userid==""){
|
||||
//llSay(0, msg);
|
||||
llRegionSay(0, msg);
|
||||
}else if(msg!="" && userid!=NULL_KEY){
|
||||
//llInstantMessage(userid, msg);
|
||||
llRegionSayTo(userid, 0, msg);
|
||||
}else{
|
||||
DebugMessage("Error Sending User Message: "+msg);
|
||||
}
|
||||
}
|
||||
|
||||
// Main Initialization Logic, Executed Once Upon Script Start
|
||||
Initialize(){
|
||||
SendMessage(BootMessage, llGetOwner()); // State Booting Message
|
||||
MenuComChannel = (integer)(llFrand(-1000000000.0) - 1000000000.0); // Randomize Dialog Com Channel
|
||||
MenuComHandle = llListen(MenuComChannel, EMPTY, EMPTY, EMPTY);
|
||||
SendMessage("Configuring...", llGetOwner()); // Message Owner that we are starting the Configure Loop
|
||||
cQueryID = llGetNotecardLine(ConfigFile, cLine); // Start the Read from Config Notecard
|
||||
}
|
||||
|
||||
// System has started Function (Runs After Configuration is Loaded, as a result of EOF)
|
||||
SystemStart(){
|
||||
// Clean Up Config Variables
|
||||
NumDances = NumDances + [DCounter];
|
||||
//llOwnerSay((string)llGetListLength(Dances)+llDumpList2String(Dances, "||"));
|
||||
//llOwnerSay((string)llGetListLength(CatNames)+llDumpList2String(CatNames, "||"));
|
||||
//llOwnerSay((string)llGetListLength(NumDances)+llDumpList2String(NumDances, "||"));
|
||||
DCounter = 0;
|
||||
DanceCat = EMPTY;
|
||||
SendMessage("System Started!", llGetOwner());
|
||||
}
|
||||
|
||||
// Add Admin (Add provided Legacy Name to Admins List after extrapolating userKey)
|
||||
AddAdmin(string LegacyName){
|
||||
string FName = llList2String(llParseString2List(LegacyName, [" "], []), 0);
|
||||
string LName = llList2String(llParseString2List(LegacyName, [" "], []), 1);
|
||||
DebugMessage("First Name: "+FName+" Last Name: "+LName);
|
||||
key UserKey = osAvatarName2Key(FName, LName);
|
||||
if(UserKey!=NULL_KEY){
|
||||
Admins = Admins + UserKey;
|
||||
DebugMessage("Added Admin: "+LegacyName);
|
||||
}else{
|
||||
DebugMessage("Unable to Resolve: "+LegacyName);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Configuration Directives Processor (Called Each Time a Line is Found in the config File)
|
||||
LoadConfig(string data){
|
||||
if(data!=""){ // If Line is not Empty
|
||||
// if the line does not begin with a comment
|
||||
if(llSubStringIndex(data, "#") != 0)
|
||||
{
|
||||
// find first equal sign
|
||||
integer i = llSubStringIndex(data, "=");
|
||||
|
||||
// if line contains equal sign
|
||||
if(i != -1){
|
||||
// get name of name/value pair
|
||||
string name = llGetSubString(data, 0, i - 1);
|
||||
// get value of name/value pair
|
||||
string value = llGetSubString(data, i + 1, -1);
|
||||
// trim name
|
||||
list temp = llParseString2List(name, [" "], []);
|
||||
name = llDumpList2String(temp, " ");
|
||||
// make name lowercase
|
||||
name = llToLower(name);
|
||||
// trim value
|
||||
temp = llParseString2List(value, [" "], []);
|
||||
value = llDumpList2String(temp, " ");
|
||||
// Check Key/Value Pairs and Set Switches and Lists
|
||||
if(name=="debugmode"){ // Check DeBug Mode
|
||||
if(value=="TRUE" || value=="true"){
|
||||
DebugMode = TRUE;
|
||||
llOwnerSay("Debug Mode: Enabled!");
|
||||
}else if(value=="FALSE" || value=="false"){
|
||||
DebugMode = FALSE;
|
||||
llOwnerSay("Debug Mode: Disabled!");
|
||||
}
|
||||
}else if(name=="menu"){
|
||||
DanceCat = value;
|
||||
CatNames = CatNames + [value];
|
||||
NumCats++;
|
||||
Dances = Dances + [value];
|
||||
DebugMessage("Dance Category Found: "+llList2String(Dances, -1)+"\nTotal Categories: "+(string)NumCats);
|
||||
if(DCounter>0){
|
||||
NumDances = NumDances + [DCounter];
|
||||
}
|
||||
DCounter = 0;
|
||||
}else if(name=="dance"){
|
||||
Dances = Dances + [value];
|
||||
DebugMessage("Dance "+value+" found! Placing into Category "+DanceCat);
|
||||
DCounter++;
|
||||
if(NumCats==1 && DCounter==1){
|
||||
DefaultDance = value;
|
||||
DebugMessage("Default Dance Set to: "+DefaultDance);
|
||||
}
|
||||
DebugMessage((string)DCounter+" Total Dances for "+DanceCat+".");
|
||||
}else if(name=="admin"){
|
||||
AddAdmin(value);
|
||||
}
|
||||
}else{ // line does not contain equal sign
|
||||
SendMessage("Configuration could not be read on line " + (string)cLine, NULL_KEY);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Check Security
|
||||
integer CheckSecurity(key id){
|
||||
if(llListFindList(Admins, [id])!=-1){
|
||||
return TRUE;
|
||||
}else{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
// Test of Requesting Users Key is found in Dancers List, Returns True or False
|
||||
integer IsDancing(key id){
|
||||
if(llListFindList(Dancers, [id])!=-1){
|
||||
return TRUE;
|
||||
}else{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
// Manipulate Dancer (Start, Stop, Next/Prev Dance,
|
||||
Dancer(string CMD, key id, string Dance){
|
||||
if(CMD=="Start"){
|
||||
if(!IsDancing(id)){ // If the User is not in the dance list and is request to start.
|
||||
Dancers = Dancers + [id];
|
||||
DebugMessage("Added: "+llKey2Name(id)+" to the Dancers List!");
|
||||
Relay("Assign", id, Dance); // Assign Requesting User the next available relay
|
||||
}else{
|
||||
DebugMessage("Requesting Relay Re-Init...");
|
||||
Relay("Reload", id, Dance);
|
||||
}
|
||||
}else if(CMD=="Stop"){
|
||||
if(IsDancing(id)){
|
||||
Dancers = llDeleteSubList(Dancers, llListFindList(Dancers, [id]), llListFindList(Dancers, [id]));
|
||||
if(llListFindList(Dancers, [id])==-1){
|
||||
DebugMessage("Dancer Removed from List!");
|
||||
}else{
|
||||
DebugMessage("Failed to Remove Dancer from List!");
|
||||
}
|
||||
Relay("Stop", id, DefaultDance);
|
||||
}
|
||||
}else if(CMD==">>"){
|
||||
if(IsDancing(id)){
|
||||
DebugMessage("Advancing Dance for User: "+llKey2Name(id)+".");
|
||||
Relay(CMD, id, Dance);
|
||||
}
|
||||
}else if(CMD=="<<"){
|
||||
if(IsDancing(id)){
|
||||
DebugMessage("Retrogressing Dance for User: "+llKey2Name(id)+".");
|
||||
Relay(CMD, id, Dance);
|
||||
}
|
||||
}else if(CMD=="Sync"){
|
||||
|
||||
}else if(CMD=="Change"){ // Change to Selected Dance
|
||||
if(IsDancing(id)){
|
||||
DebugMessage("Changing Dance for User: "+llKey2Name(id)+" to dance: "+Dance);
|
||||
Relay("Change", id, Dance);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Relay Control
|
||||
Relay(string CMD, key id, string Dance){
|
||||
string RelayName = "Relay ";
|
||||
if(CMD=="Assign"){
|
||||
integer i;
|
||||
for(i=1;i<=MaxDancers;i++){
|
||||
integer ISON = llGetScriptState(RelayName+(string)i);
|
||||
if(!ISON){ // Script is Already in Use
|
||||
RelayName = RelayName + (string)i;
|
||||
DebugMessage("Script Relay: "+RelayName);
|
||||
llSetScriptState(RelayName, TRUE);
|
||||
llResetOtherScript(RelayName);
|
||||
DebugMessage("Sending Start Message to Relay: "+RelayName);
|
||||
llMessageLinked(LINK_THIS, 0, "START||"+DefaultDance, id);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}else if(CMD=="Reload"){
|
||||
|
||||
}else if(CMD=="Stop"){
|
||||
DebugMessage("Sending Stop Message to Relay...");
|
||||
llMessageLinked(LINK_THIS, 0, "STOP||", id);
|
||||
}else if(CMD=="Change"){
|
||||
DebugMessage("Sending Change Message to Relay...");
|
||||
llMessageLinked(LINK_THIS, 0, "CHANGE||"+Dance, id);
|
||||
}else if(CMD==">>" || CMD=="<<"){
|
||||
DebugMessage("Sending Slot Adjustment Command...");
|
||||
llMessageLinked(LINK_THIS, 0, CMD+"||"+Dance, id);
|
||||
}
|
||||
}
|
||||
|
||||
// Show Menu
|
||||
ShowMenu(string Menu, key id){
|
||||
string CurMenuMessage;
|
||||
list CurMenuButtons;
|
||||
if(Menu=="MainMenu"){
|
||||
CurMenuMessage = MainMenuMessage;
|
||||
CurMenuButtons = MainMenuButtons;
|
||||
if(CheckSecurity(id)){
|
||||
CurMenuButtons =CurMenuButtons + AdminButton;
|
||||
}
|
||||
}else if(Menu=="Dances"){
|
||||
list Categories;
|
||||
integer i;
|
||||
integer CatIndex;
|
||||
for(i=0;i<NumCats;i++){
|
||||
Categories = Categories + [llList2String(Dances, CatIndex)];
|
||||
CatIndex = (CatIndex + (llList2Integer(NumDances, i)+1));
|
||||
}
|
||||
if(AdminOpFlag=="ChangeDefaultDance"){
|
||||
CurMenuMessage = DefaultDancesMenuMessage;
|
||||
}else{
|
||||
CurMenuMessage = MainMenuMessage;
|
||||
}
|
||||
CurMenuButtons = Categories;
|
||||
}else if(Menu=="Admin"){
|
||||
CurMenuMessage = AdminMenuMessage;
|
||||
CurMenuButtons = AdminMenuButtons;
|
||||
}else if(llListFindList(Dances, [Menu])!=-1){
|
||||
integer CIndex = llListFindList(CatNames, [Menu]);
|
||||
llOwnerSay("CIndex: "+(string)CIndex+" Num of Dances: "+llList2String(NumDances, CIndex));
|
||||
integer i;
|
||||
integer StartPoint = (llListFindList(Dances, [Menu])+1);
|
||||
llOwnerSay("Start Point: "+(string)StartPoint);
|
||||
for(i=0;i<llList2Integer(NumDances, CIndex);i++){
|
||||
CurMenuButtons = CurMenuButtons + llList2String(Dances, StartPoint);
|
||||
llOwnerSay(llList2String(CurMenuButtons, -1));
|
||||
StartPoint++;
|
||||
}
|
||||
CurMenuMessage = DefaultDancesMenuMessage;
|
||||
}
|
||||
// Send Constructed Dialog to User
|
||||
llDialog(id, CurMenuMessage, CurMenuButtons, MenuComChannel);
|
||||
}
|
||||
|
||||
|
||||
//Main Program Logic
|
||||
/* This section contains the main program logic. (ie: Default State, and all event triggers) */
|
||||
|
||||
default{
|
||||
on_rez(integer params){
|
||||
llResetScript();
|
||||
}
|
||||
|
||||
state_entry(){
|
||||
Initialize();
|
||||
}
|
||||
|
||||
// DataServer Event Called for Each Line of Config NC. This Loop It was Calls LoadConfig()
|
||||
dataserver(key query_id, string data){ // Config Notecard Read Function Needs to be Finished
|
||||
if (query_id == cQueryID){
|
||||
if (data != EOF){
|
||||
LoadConfig(data); // Process Current Line
|
||||
++cLine; // Increment Line Index
|
||||
cQueryID = llGetNotecardLine(ConfigFile, cLine); // Attempt to Read Next Config Line (Re-Calls DataServer Event)
|
||||
}else{ // IF EOF (End of Config loop, and on Blank File)
|
||||
SystemStart();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
listen(integer chan, string sender, key id, string msg){
|
||||
DebugMessage("Listen Event Fired: "+msg);
|
||||
if(msg=="Dances"){
|
||||
ShowMenu("Dances", id);
|
||||
}else if(msg=="Admin"){
|
||||
if(CheckSecurity(id)){ // Verify their Id against Admins List again to avoid message spoofing from unauthed users
|
||||
ShowMenu(msg, id); // Show Admin Menu
|
||||
}else{
|
||||
llRegionSayTo(id, 0, "Your not Smart Enough!");
|
||||
}
|
||||
}else if(msg=="Dance"){
|
||||
AdminOpFlag = "ChangeDefaultDance";
|
||||
if(CheckSecurity(id)){ // Verify their Id against Admins List again to avoid message spoofing from unauthed users
|
||||
ShowMenu("Dances", id); // Show Admin Menu
|
||||
}else{
|
||||
llRegionSayTo(id, 0, "Your not Smart Enough!");
|
||||
}
|
||||
}else if(llListFindList(Dances, [msg])!=-1){ // If the Message is either a Dance or a Category
|
||||
if(llGetInventoryKey(msg)==NULL_KEY){ // It was not a Dance, Must be a Category
|
||||
ShowMenu(msg, id); // Show Menu comprised of Dances in Category specified by {msg}
|
||||
}else{ // It was a Dance.
|
||||
if(AdminOpFlag=="ChangeDefaultDance"){
|
||||
DefaultDance = msg;
|
||||
SendMessage("Default Dance is now: "+msg, id);
|
||||
}else{
|
||||
Dancer("Change", id, msg); // Change slected dance for calling user
|
||||
}
|
||||
|
||||
}
|
||||
}else if(msg=="Start" || msg=="Stop" || msg==">>" || msg=="<<" || msg=="Sync"){
|
||||
DebugMessage(msg+" Message Received!");
|
||||
Dancer(msg, id, DefaultDance);
|
||||
}
|
||||
}
|
||||
|
||||
touch_start(integer num){
|
||||
if(num>1){
|
||||
return;
|
||||
}
|
||||
|
||||
key UserKey = llDetectedKey(0);
|
||||
if(NumDancers<MaxDancers){
|
||||
ShowMenu("MainMenu", UserKey);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
changed(integer change){
|
||||
if(change & CHANGED_INVENTORY){
|
||||
BootMessage = "Inventory Changed Detected, Re-Initializing...";
|
||||
llResetScript();
|
||||
}
|
||||
}
|
||||
}
|
||||
112
Dance Engine/Relay 1.lsl
Normal file
112
Dance Engine/Relay 1.lsl
Normal file
@@ -0,0 +1,112 @@
|
||||
key ActiveDancer = NULL_KEY;
|
||||
string ActiveDance;
|
||||
string PrevDance;
|
||||
integer Random = FALSE; // Do we Dance Cycle?
|
||||
string TimerMode;
|
||||
string EMPTY = "";
|
||||
list Dances;
|
||||
|
||||
Dancer(string CMD){
|
||||
if(CMD=="Start"){
|
||||
osAvatarStopAnimation(ActiveDancer, "stand");
|
||||
osAvatarPlayAnimation(ActiveDancer, ActiveDance);
|
||||
}else if(CMD=="Stop"){
|
||||
osAvatarStopAnimation(ActiveDancer, ActiveDance);
|
||||
osAvatarPlayAnimation(ActiveDancer, "stand");
|
||||
ActiveDancer = NULL_KEY;
|
||||
llSetScriptState(llGetScriptName(), FALSE);
|
||||
}else if(CMD=="Change"){
|
||||
osAvatarStopAnimation(ActiveDancer, PrevDance);
|
||||
osAvatarPlayAnimation(ActiveDancer, ActiveDance);
|
||||
}
|
||||
}
|
||||
|
||||
integer GetDances(){
|
||||
integer i;
|
||||
for(i=0;i<llGetInventoryNumber(INVENTORY_ANIMATION);i++){
|
||||
Dances = Dances + [llGetInventoryName(INVENTORY_ANIMATION, i)];
|
||||
}
|
||||
integer DanceListLength = llGetListLength(Dances);
|
||||
return DanceListLength;
|
||||
}
|
||||
|
||||
|
||||
default{
|
||||
state_entry(){
|
||||
llResetScript();
|
||||
GetDances();
|
||||
}
|
||||
|
||||
link_message(integer sendinglink, integer I, string msg, key id){
|
||||
list InputData = llParseString2List(msg, ["||"], []);
|
||||
string CMD = llList2String(InputData, 0);
|
||||
key UserKey = id;
|
||||
string PARAM = llList2String(InputData, 1);
|
||||
if(ActiveDancer==NULL_KEY){
|
||||
if(CMD=="START"){
|
||||
ActiveDance = PARAM;
|
||||
ActiveDancer = UserKey;
|
||||
llRegionSayTo(id, 0, "Please Accept Animate Permissions...");
|
||||
llRequestPermissions(UserKey, PERMISSION_TRIGGER_ANIMATION);
|
||||
TimerMode = "Perms";
|
||||
llSetTimerEvent(30);
|
||||
}
|
||||
}else if(ActiveDancer==UserKey){
|
||||
if(CMD=="STOP"){
|
||||
Random = FALSE;
|
||||
llSetTimerEvent(0);
|
||||
Dancer("Stop");
|
||||
}else if(CMD=="CHANGE"){
|
||||
Random = FALSE;
|
||||
llSetTimerEvent(0);
|
||||
PrevDance = ActiveDance;
|
||||
ActiveDance = PARAM;
|
||||
Dancer("Change");
|
||||
}else if(CMD=="<<"){
|
||||
if(llGetListLength(Dances)==0){
|
||||
if(GetDances()>=2){
|
||||
integer DanceIndex = llListFindList(Dances, [ActiveDance]);
|
||||
PrevDance = ActiveDance;
|
||||
if(DanceIndex==0){
|
||||
ActiveDance = llList2String(Dances, -1);
|
||||
}else{
|
||||
ActiveDance = llList2String(Dances, (DanceIndex - 1));
|
||||
}
|
||||
Dancer("Change");
|
||||
}
|
||||
}
|
||||
}else if(CMD==">>"){
|
||||
if(llGetListLength(Dances)==0){
|
||||
if(GetDances()>=2){
|
||||
integer DanceIndex = llListFindList(Dances, [ActiveDance]);
|
||||
PrevDance = ActiveDance;
|
||||
if(DanceIndex==(llGetListLength(Dances) - 1)){
|
||||
ActiveDance = llList2String(Dances, 0);
|
||||
}else{
|
||||
ActiveDance = llList2String(Dances, (DanceIndex + 1));
|
||||
}
|
||||
Dancer("Change");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
run_time_permissions(integer perms){
|
||||
if(perms & PERMISSION_TRIGGER_ANIMATION){
|
||||
llSetTimerEvent(0);
|
||||
TimerMode = EMPTY;
|
||||
Dancer("Start");
|
||||
}else{
|
||||
llRequestPermissions(ActiveDancer, PERMISSION_TRIGGER_ANIMATION);
|
||||
}
|
||||
}
|
||||
|
||||
timer(){
|
||||
if(TimerMode=="Perms"){
|
||||
llMessageLinked(LINK_THIS, 0, "FAIL||"+llGetScriptName(), ActiveDancer);
|
||||
llSleep(0.1);
|
||||
llSetScriptState(llGetScriptName(), FALSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user