Difference between revisions of "Gun Script"
Jump to navigation
Jump to search
Omei Qunhua (talk | contribs) (Re-instated llGetCameraPos() and llGetCameraRot() which I'm advised is the preferred approach. Tested (!!). Sorry about the 8-column tabbing) |
m (Replaced <source> with <syntaxhighlight>, placed it in the correct category etc.) |
||
(2 intermediate revisions by 2 users not shown) | |||
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 | {{LSL Header}} | ||
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 where you can rez and run scripts. Corrected and improved. | |||
< | <syntaxhighlight lang="lsl2"> | ||
float gVelocity = 15.0; | float gVelocity = 15.0; | ||
float gReloadTime = 0.30; | float gReloadTime = 0.30; | ||
Line 11: | Line 12: | ||
default | default | ||
{ | { | ||
state_entry() | |||
{ | |||
// sanity check | |||
if (llGetInventoryType(gBullet) != INVENTORY_OBJECT) { | |||
llOwnerSay("This needs a physical object called " + gBullet + " in it to work"); | |||
return; | |||
} | |||
gPermFlags = PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS | PERMISSION_TRACK_CAMERA; | |||
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) | |||
{ | |||
// ensure ALL required permissions have been granted | |||
if ( (perm & gPermFlags) == gPermFlags) | |||
{ | |||
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 = llGetCameraRot(); | |||
if ( held & change & CONTROL_ML_LBUTTON) | |||
{ | |||
if (llGetInventoryType(gShootSound) == INVENTORY_SOUND) | |||
llPlaySound(gShootSound, 1.0); | |||
llRezAtRoot(gBullet, llGetCameraPos() + <1.5, 0.0, 0.0>*Rot, gVelocity*llRot2Fwd(Rot), Rot, 10); | |||
llSleep(gReloadTime); | |||
} | |||
} | |||
} | } | ||
</ | </syntaxhighlight> | ||
[[Category:LSL Library]] |
Latest revision as of 02:40, 6 December 2023
LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
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 where you can rez and run scripts. Corrected and improved.
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()
{
// sanity check
if (llGetInventoryType(gBullet) != INVENTORY_OBJECT) {
llOwnerSay("This needs a physical object called " + gBullet + " in it to work");
return;
}
gPermFlags = PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS | PERMISSION_TRACK_CAMERA;
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)
{
// ensure ALL required permissions have been granted
if ( (perm & gPermFlags) == gPermFlags)
{
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 = llGetCameraRot();
if ( held & change & CONTROL_ML_LBUTTON)
{
if (llGetInventoryType(gShootSound) == INVENTORY_SOUND)
llPlaySound(gShootSound, 1.0);
llRezAtRoot(gBullet, llGetCameraPos() + <1.5, 0.0, 0.0>*Rot, gVelocity*llRot2Fwd(Rot), Rot, 10);
llSleep(gReloadTime);
}
}
}