Difference between revisions of "Gun Script"

From Second Life Wiki
Jump to navigation Jump to search
(Rewrote attach and on_rez events and removed llResetScript(). Assignment of computed perm mask to permFlags can't be done in global definitions. Pointless asking if it's attached to owner!)
(Cleaned up. Tightened perms checking. Removed erroneous camera references. Added sanity checks. (With assistance from Innula Zenovka))
Line 1: Line 1:
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.    Someone simplified this without saying so  and it doesn't work  i'm  looking for why.
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.    Corrected and improved.


<lsl>
<lsl>
float bulletVelocity = 15.0;
float   gVelocity  = 15.0;
float pauseBetweenShots = 0.30;
float   gReloadTime = 0.30;
string shootingSound = "gun";
string gShootSound = "gun";
string shootingAnimation = "hold_R_bazooka";
string gShootAnimation = "hold_R_bazooka";
string inventoryItemWhichIsBullet = "bullet 1.0";
string gBullet = "bullet 1.0";
integer permFlags;
integer gPermFlags;


default
default
{
{
    on_rez(integer start_param)
state_entry()
    {
{
        if (!llGetAttached() )       llOwnerSay("Attach me to your right hand and enter mouselook to fire!");        
if (llGetInventoryType(gBullet) != INVENTORY_OBJECT) {    // sanity check
        else                        llPreloadSound(gunsound);
llOwnerSay("This needs a physical object called " + gBullet + " in it to work");
    }
return;
}
gPermFlags = PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS;


    attach(key id)
if ( llGetAttached() )
    {
llRequestPermissions(llGetOwner(), gPermFlags);
        if (id == NULL_KEY)
}
        {
            llStopAnimation(shootingAnimation);
            llReleaseControls();
        }
        else    llRequestPermissions(llGetOwner(), (permFlags = PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS | PERMISSION_ATTACH | PERMISSION_TRACK_CAMERA) );
    }


    changed(integer change)
attach(key id)
    {
{
        if (change & (CHANGED_OWNER | CHANGED_INVENTORY))           llResetScript();
if (id)
    }
llRequestPermissions(id, gPermFlags);
else
{
llStopAnimation(gShootAnimation);
llReleaseControls();
}
}


    run_time_permissions(integer perm)
changed(integer change)
    {
{
        if (perm & permFlags)
if (change & (CHANGED_OWNER | CHANGED_INVENTORY) )
        {
llResetScript();
            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)
run_time_permissions(integer perm)
    {
{
        vector cameraPos = llGetCameraPos();
if ( (perm & gPermFlags) == gPermFlags)  // ensure ALL required permissions have been granted
        rotation cameraRot = llGetCameraRot();
{
llTakeControls(CONTROL_ML_LBUTTON, TRUE, FALSE);
llStartAnimation(gShootAnimation);
llOwnerSay("Gun is ready. Enter mouselook and use left click to fire!");
}
}


        if ((level & CONTROL_ML_LBUTTON) == CONTROL_ML_LBUTTON)
control(key id, integer held, integer change)
        {
{
            if ((edge & CONTROL_ML_LBUTTON) == CONTROL_ML_LBUTTON)
rotation Rot = llGetRot();
            {
if ( held & change & CONTROL_ML_LBUTTON)
            //  play sound at max volume
{
                llPlaySound(shootingSound, 1.0);
if (llGetInventoryType(gShootSound) == INVENTORY_SOUND)
llPlaySound(gShootSound, 1.0);


                llRezAtRoot(inventoryItemWhichIsBullet,
llRezAtRoot(gBullet, llGetPos() + <1.5, 0.0, 0.0>*Rot, gVelocity*llRot2Fwd(Rot), Rot, 10);
                    cameraPos + <1.5, 0.0, 0.0>*cameraRot, bulletVelocity*llRot2Fwd(cameraRot), cameraRot, 10);
llSleep(gReloadTime);
 
}
                llSleep(pauseBetweenShots);
}
            }
        }
    }
}
}
</lsl>
</lsl>

Revision as of 06:08, 8 December 2012

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. Corrected and improved.

<lsl> float gVelocity = 15.0; float gReloadTime = 0.30; string gShootSound = "gun"; string gShootAnimation = "hold_R_bazooka"; string gBullet = "bullet 1.0"; integer gPermFlags;

default { state_entry() { if (llGetInventoryType(gBullet) != INVENTORY_OBJECT) { // sanity check llOwnerSay("This needs a physical object called " + gBullet + " in it to work"); return; } gPermFlags = PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS;

if ( llGetAttached() ) llRequestPermissions(llGetOwner(), gPermFlags); }

attach(key id) { if (id) llRequestPermissions(id, gPermFlags); else { llStopAnimation(gShootAnimation); llReleaseControls(); } }

changed(integer change) { if (change & (CHANGED_OWNER | CHANGED_INVENTORY) ) llResetScript(); }

run_time_permissions(integer perm) { if ( (perm & gPermFlags) == gPermFlags) // ensure ALL required permissions have been granted { llTakeControls(CONTROL_ML_LBUTTON, TRUE, FALSE); llStartAnimation(gShootAnimation); llOwnerSay("Gun is ready. Enter mouselook and use left click to fire!"); } }

control(key id, integer held, integer change) { rotation Rot = llGetRot(); if ( held & change & CONTROL_ML_LBUTTON) { if (llGetInventoryType(gShootSound) == INVENTORY_SOUND) llPlaySound(gShootSound, 1.0);

llRezAtRoot(gBullet, llGetPos() + <1.5, 0.0, 0.0>*Rot, gVelocity*llRot2Fwd(Rot), Rot, 10); llSleep(gReloadTime); } } } </lsl>