Advertisement
worstbull

Sit Target Helper

Jan 22nd, 2015
333
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. integer iMODE_ADJUST_POS = 1; //Mode: adjust position.
  2. integer iMODE_ADJUST_ROT = 2; //Mode: adjust rotation.
  3. integer iMODE_ADJUST_NONE = 0; //Mode: exited all adjust-modes.
  4. integer iMODE_ADJUST = iMODE_ADJUST_NONE; //Global storage of adjust-mode.
  5. key kAVATAR = NULL_KEY; //Global storage of avatar-key.
  6. string sDialogText = "Please choose an option (use page-up/page-down and up/down-keys to adjust the position):";
  7. string sButton_Adjustpos = "Adjust pos"; //Dialog-text.
  8. string sButton_Adjustrot = "Adjust rot";
  9. string sButton_Exit = "Exit edit";
  10. integer iChannel = -240897; //Dialog-channel.
  11.  
  12. vector vROTATION = ZERO_VECTOR; //Global pos/rot. !!Initial sittarget-values here!
  13. vector vPOS = ZERO_VECTOR;
  14.  
  15. float fOffsetPos = 0.1; //Offset for adjustment (1 single step). Meters.
  16. float fOffsetRot = 5; //Offset for adjustment (1 single step). Degrees.
  17.  
  18.  
  19. UpdateSitTarget(vector pos, rotation rot)
  20. {//Using this while the object is moving may give unpredictable results.
  21.     llSitTarget(pos, rot);//Set the sit target
  22.     //We need to make the position and rotation local to the current prim
  23.     rotation localrot = ZERO_ROTATION;
  24.     vector localpos = ZERO_VECTOR;
  25.     if(llGetLinkNumber() > 1)//only need the local rot if it's not the root.
  26.     {
  27.         localrot = llGetLocalRot();
  28.         localpos = llGetLocalPos();
  29.     }
  30.     vector size = llGetAgentSize(llAvatarOnSitTarget());
  31.     //<0.008906, -0.049831, 0.088967> are the coefficients for a parabolic curve that best fits real avatars. It is not a perfect fit.
  32.     float fAdjust = ((((0.008906 * size.z) + -0.049831) * size.z) + 0.088967) * size.z;
  33.     llSetLinkPrimitiveParamsFast(llGetNumberOfPrims(),
  34.         [PRIM_POS_LOCAL, (pos + <0.0, 0.0, 0.4> - (llRot2Up(rot) * fAdjust)) * localrot + localpos,
  35.          PRIM_ROT_LOCAL, rot * localrot]);
  36. }
  37.  
  38. makeDialog()
  39. { //Display a dialog with adjust/exit-options.
  40.     list lBUTTONS;
  41.     if (iMODE_ADJUST != iMODE_ADJUST_NONE)
  42.     { //Currently adjusting, add 'exit'-button.
  43.         lBUTTONS = [sButton_Exit];
  44.     }
  45.     lBUTTONS += [sButton_Adjustrot, sButton_Adjustpos];
  46.     llDialog(kAVATAR, sDialogText, lBUTTONS, iChannel);
  47. }
  48. adjust(integer imode)
  49. { //Adjust pos/rot.
  50.     vector vr = vROTATION;
  51.     vector vp = vPOS;
  52.     if (iMODE_ADJUST == iMODE_ADJUST_NONE)
  53.     { //Not adjusting. Return.
  54.         return;
  55.     }
  56.     if (imode == CONTROL_FWD)
  57.     {
  58.         vr = vr + <0.0, fOffsetRot, 0.0>;
  59.         vp = vp + <fOffsetPos, 0.0, 0.0>;
  60.     }
  61.     if (imode == CONTROL_BACK)
  62.     {
  63.         vr = vr + <0.0, -fOffsetRot, 0.0>;
  64.         vp = vp + <-fOffsetPos, 0.0, 0.0>;
  65.     }
  66.     if (imode == CONTROL_ROT_LEFT)
  67.     {
  68.         vr = vr + <-fOffsetRot, 0.0, 0.0>;
  69.         vp = vp + <0.0, fOffsetPos, 0.0>;
  70.     }
  71.     if (imode == CONTROL_ROT_RIGHT)
  72.     {
  73.         vr = vr + <fOffsetRot, 0.0, 0.0>;
  74.         vp = vp + <0.0, -fOffsetPos, 0.0>;
  75.     }
  76.     if (imode == CONTROL_UP)
  77.     {
  78.         vp = vp + <0.0, 0.0, fOffsetPos>;
  79.     }
  80.     if (imode == CONTROL_DOWN)
  81.     {
  82.         vp = vp + <0.0, 0.0, -fOffsetPos>;
  83.     }
  84.     if (iMODE_ADJUST == iMODE_ADJUST_POS)
  85.     { //Change onnly pos.
  86.         vr = vROTATION; //Reset local value.
  87.         vPOS = vp; //Update global.
  88.     }
  89.     else
  90.     { //Change only rot.
  91.         vp = vPOS; //Reset local value.
  92.         vROTATION = vr; //Update global.
  93.     }
  94.     UpdateSitTarget(vp, llEuler2Rot(vr*DEG_TO_RAD)); //Update
  95. }
  96. default
  97. {
  98.     state_entry()
  99.     {
  100.         UpdateSitTarget(vPOS, llEuler2Rot(vROTATION * DEG_TO_RAD)); //Set initial sittarget-values.
  101.         llListen(iChannel, "", "", "");
  102.     }
  103.     listen(integer channel, string name, key id, string message)
  104.     {
  105.         if (id == kAVATAR)
  106.         {
  107.             if (message == sButton_Adjustpos)
  108.             {
  109.                 iMODE_ADJUST = iMODE_ADJUST_POS;
  110.             }
  111.             else if (message == sButton_Adjustrot)
  112.             {
  113.                 iMODE_ADJUST = iMODE_ADJUST_ROT;
  114.             }
  115.             else if (message == sButton_Exit)
  116.             {
  117.                 iMODE_ADJUST = iMODE_ADJUST_NONE;
  118.             }
  119.         }
  120.     }
  121.     touch_start(integer num_detected)
  122.     {
  123.         if (llDetectedKey(0) == kAVATAR)
  124.         {
  125.             makeDialog(); //Show dialog.
  126.         }
  127.     }
  128.     changed(integer change)
  129.     {
  130.         if (change & CHANGED_LINK)
  131.         {
  132.             if(llGetObjectPrimCount(llGetKey()) < llGetNumberOfPrims())
  133.             { //Avatar sitting.
  134.                 kAVATAR = llGetLinkKey(llGetNumberOfPrims()); //Store key.
  135.                 UpdateSitTarget(vPOS, llEuler2Rot(vROTATION * DEG_TO_RAD)); //Set initial sittarget-values.
  136.                 llRequestPermissions(kAVATAR, PERMISSION_TAKE_CONTROLS);
  137.             }
  138.             else
  139.             { //Avatar unsat.
  140.                 llReleaseControls();
  141.                 iMODE_ADJUST = iMODE_ADJUST_NONE; //Reset mode.
  142.                 kAVATAR = NULL_KEY;
  143.             }
  144.         }
  145.     }
  146.     control(key id, integer level, integer edge)
  147.     {
  148.         if (level & edge)
  149.         { //Key press
  150.             if ((level & CONTROL_FWD) || (edge & CONTROL_FWD))
  151.             {
  152.                 adjust(CONTROL_FWD);
  153.             }
  154.             if ((level & CONTROL_BACK) || (edge & CONTROL_BACK))
  155.             {
  156.                 adjust(CONTROL_BACK);
  157.             }
  158.             if ((level & CONTROL_ROT_LEFT) || (edge & CONTROL_ROT_LEFT))
  159.             {
  160.                 adjust(CONTROL_ROT_LEFT);
  161.             }
  162.             if ((level & CONTROL_ROT_RIGHT) || (edge & CONTROL_ROT_RIGHT))
  163.             {
  164.                 adjust(CONTROL_ROT_RIGHT);
  165.             }
  166.             if ((level & CONTROL_UP) || (edge & CONTROL_UP))
  167.             {
  168.                 adjust(CONTROL_UP);
  169.             }
  170.             if ((level & CONTROL_DOWN) || (edge & CONTROL_DOWN))
  171.             {
  172.                 adjust(CONTROL_DOWN);
  173.             }
  174.         }
  175.     }
  176.     run_time_permissions(integer perm)
  177.     {
  178.         if (perm & PERMISSION_TAKE_CONTROLS)
  179.         {
  180.             llTakeControls(CONTROL_FWD | CONTROL_BACK | CONTROL_ROT_LEFT | CONTROL_ROT_RIGHT | CONTROL_UP | CONTROL_DOWN, TRUE, FALSE);
  181.         }
  182.     }
  183. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement