Gun Script

From Second Life Wiki
Revision as of 13:01, 18 October 2012 by Kireji Haiku (talk | contribs) (improved readability)
Jump to navigation Jump to search

Uses tons of useful functions and a great example for those starting out. I've had tons of fun with this and all its variants i've made in my time here in Second Life. Obviously only can be used were you can rez and run scripts.

<lsl> float bulletVelocity = 15.0; float pauseBetweenShots = 0.30; string shootingSound = "gun"; string shootingAnimation = "hold_R_bazooka"; string inventoryItemWhichIsBullet = "bullet 1.0"; integer permFlags = PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS | PERMISSION_ATTACH | PERMISSION_TRACK_CAMERA;

default {

   on_rez(integer start_param)
   {
       llOwnerSay("Attach me to your right hand, and enter mouselook to fire!");
       llPreloadSound(gunsound);
       llResetScript();
   }
   attach(key id)
   {
       key owner = llGetOwner();
       if (id == owner)
           llRequestPermissions(owner, permFlags);
       else if (id == NULL_KEY)
       {
           llStopAnimation(shootingAnimation);
           llReleaseControls();
       }
   }
   changed(integer change)
   {
       if (change & (CHANGED_OWNER | CHANGED_INVENTORY))
           llResetScript();
   }
   state_entry()
   {
       key owner = llGetOwner();
       llRequestPermissions(owner, permFlags);
   }
   run_time_permissions(integer perm)
   {
       if (perm & permFlags)
       {
           llAttachToAvatar(ATTACH_RHAND);
           llTakeControls(CONTROL_ML_LBUTTON, TRUE, FALSE);
           llStartAnimation(shootingAnimation);
           llOwnerSay("Gun is ready. Enter mouselook to fire!");
       }
   }
   control(key owner, integer level, integer edge)
   {
       vector cameraPos = llGetCameraPos();
       rotation cameraRot = llGetCameraRot();
       if ((level & CONTROL_ML_LBUTTON) == CONTROL_ML_LBUTTON)
       {
           if ((edge & CONTROL_ML_LBUTTON) == CONTROL_ML_LBUTTON)
           {
           //  play sound at max volume
               llPlaySound(shootingSound, (float)TRUE);
               llRezAtRoot(inventoryItemWhichIsBullet,
                   cameraPos + <1.5, 0.0, 0.0>*cameraRot, bulletVelocity*llRot2Fwd(cameraRot), cameraRot, 10);
               llSleep(pauseBetweenShots);
           }
       }
   }

} </lsl>