Move a Prim by Pose

Move a Prim by Pose

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/******************************************************************
* This example will set custom position/rotation of prims with certain poses.
* Only for use in a child prim. Please read comments for information and settings.
******************************************************************/

// DEBUG: if set TRUE then touching the prim will read the prims local position/rotation to chat.
// DEBUG mode allows you to get the data for the DEFAULT and CUSTOM lists below.
// DEBUG should be set to TRUE while you're building and then set to FALSE when you're finished.
integer DEBUG = TRUE;

// SITTER: the SITTER# the script responds to.
integer SITTER = 0;

// Default Position and Rotation of the prim
list DEFAULT = [<0.00000, 0.00000, 1.36389>,<-179.96040, 0.00000, 0.00000>];

// CUSTOM is a list of poses and the custom Position and Rotation for each pose.
// The CUSTOM list is in the format of <pose name>,<prim_position>,<prim_rotation>
// If a pose is not in this list then the position will revert to the DEFAULT.
list CUSTOM = [
    "Pose1",<0.00000, 0.00000, 2.34100>,<-90.00001, 0.00000, 0.00000>,
    "Pose2",<-0.03568, 0.00000, 1.50464>,<-90.00000, 0.00000, 0.00000>,
    "Pose3",<0.14161, 0.88953, 1.97498>,<-151.00680, -4.00000, 0.00000>,
    "Pose4",<0.04294, -0.00032, 2.58356>,<0.00000, 89.98022, -179.98020>
];

// list of poses to ignore SITTER setting and move anyway (e.g. for SYNC poses)
list SYNCS = [];

// DESCRIPTION: if given, then script reacts only to link messages from prim with matching description
string DESCRIPTION = "";

/******************************************************************
 * DON'T EDIT BELOW THIS UNLESS YOU KNOW WHAT YOU'RE DOING!
******************************************************************/

key AVATAR;

default_position(){
    AVATAR=NULL_KEY;
    if(llGetLinkNumber()>1){// only move the prim if the script is in a child prim.
        llSetPrimitiveParams([PRIM_POS_LOCAL,llList2Vector(DEFAULT,0),PRIM_ROT_LOCAL,llEuler2Rot(llList2Vector(DEFAULT,1)*DEG_TO_RAD)]);
    }
}

default{
    state_entry(){
        //default_position();
    }
    link_message(integer sender, integer num, string msg, key id){
        if(DESCRIPTION=="" || llList2String(llGetObjectDetails(llGetLinkKey(sender),[OBJECT_DESC]),0)==DESCRIPTION){//check the sender prim's description
            if(llGetLinkNumber()>1){// only move the prim if the script is in a child prim.
                if (num==90045){ // a pose is played!
                    list data = llParseStringKeepNulls(msg,["|"],[]);
                    integer SITTER_NUMBER = (integer)llList2String(data,0);
                    string POSE_NAME = llList2String(data,1);
                    if(SITTER_NUMBER==SITTER || llListFindList(SYNCS,[POSE_NAME])!=-1){ // correct SITTER or in SYNC list
                        integer index = llListFindList(CUSTOM,[POSE_NAME]);
                        if(index!=-1){ // move prim to a custom position
                            AVATAR = id;
                            llSetPrimitiveParams([PRIM_POS_LOCAL,llList2Vector(CUSTOM,index+1),PRIM_ROT_LOCAL,llEuler2Rot(llList2Vector(CUSTOM,index+2)*DEG_TO_RAD)]);
                        }
                        else{ // move prim to default position
                            default_position();
                        }
                        // llMessageLinked(LINK_THIS,90000,POSE_NAME,(key)((string)SITTER_NUMBER)); // uncomment this line if you are moving the prim that contains the sit script!
                    }
                    else if(id==AVATAR){ // our avatar has swapped sitters.
                        default_position();
                    }
                }
                else if(num==90065 && (integer)msg==SITTER){ // avatar stands up!
                    default_position();
                }
            }
        }
    }
    touch_start(integer touched){
        if(llDetectedKey(0)==llGetOwner() && DEBUG==TRUE){
            if(llGetLinkNumber()>1){
                llOwnerSay((string)llList2Vector(llGetPrimitiveParams([PRIM_POS_LOCAL]),0)+","+(string)(llRot2Euler(llList2Rot(llGetPrimitiveParams([PRIM_ROT_LOCAL]),0))*RAD_TO_DEG));
            }
            else{
                llOwnerSay("This script should only be used in a child prim.");
            }
        }
    }
    changed(integer change){
        if(change & CHANGED_LINK){
            if(llGetAgentSize(llGetLinkKey(llGetNumberOfPrims()))==ZERO_VECTOR){// if no avatars are sitting.
                default_position();
            }
        }
    }
}

Trending Tags