[Opensim-users] Combat HUD help :P
InuYasha Meiji
inuyasha.meiji at gmail.com
Wed Feb 16 12:03:03 UTC 2011
On 2/16/2011 6:09 AM, Jawa Lunk wrote:
> Thanks for the script, it only works when the object is placed on the ground
> though.
>
> Here is something strange though...I turned land damage "on", and shot my
> gun at another avatar, and the gun DID DAMAGE...but to me! LOL
>
> Every time I shoot it does damage to me...now if I can just figure out "how"
> I may be able to get guns to work in OpenSim.
>
> here is the script I am using;
>
> // Gun script
> // John Linden
>
> // where the gun attaches itself if you click on it
> // switch this to ATTACH_LHAND if you are left-handed
> integer gAttachPart = ATTACH_RHAND;
>
> string INSTR_HELD_1 = "Enter Mouselook (press 'M') to shoot me.";
> string INSTR_HELD_2 = "Right-click and choose 'Detach' to take me off.";
>
> string INSTR_NOT_HELD_1 = "To wear and use me, right click and choose";
> string INSTR_NOT_HELD_2 = "Acquire -> Attach -> Right Hand.";
>
> string INSTR_NOT_OWNER_1 = "To use this gun, take it (right-click and
> choose 'Take'.)";
> string INSTR_NOT_OWNER_2 = "Then, drag it from your inventory onto
> yourself.";
>
> // this is a permission combination we check for many times
> // I define it here so we don't have to keep typing it
> // guns need to take controls, attach themselves, and possibly
> // trigger animations
> // NOTE: since I can't initialize to an expression (even if it is
> // all constants), this moved to default { state_entry() }
> integer gDesiredPerm;
> // Indicates whether wearer has yet given permission
> integer gHavePermissions;
>
> // Bullet travel speed
> float gBulletSpeed = 45.0;
>
> // when we last fired a shot
> float gLastFireTime = 0;
> // how long it takes to reload when tapping
> float gTapReloadTime = 0.05;
> // how long it takes to reload when holding
> float gHoldReloadTime = 1.0;
> // how long it takes when we're out of ammo
> float gOutOfAmmoReloadTime = 1.4;
> // how many shots before reload is necessary
> integer gAmmoClipSize = 6;
> // how much ammo we have right now
> integer gAmmo;
>
> // HACK: how far away the eye is from the avatar's center (approximately)
> vector gEyeOffset =<0.0, 0.0, 0.84>;
>
>
> say(string msg)
> {
> llSay(0, msg);
> }
> debug(string msg)
> {
> // llSay(0, msg);
> }
> func_debug(string msg)
> {
> // llSay(0, msg);
> }
>
>
> // the gun has only one state
>
> default
> {
> on_rez(integer start_param)
> {
> func_debug("on_rez");
> // HACK: try to compensate for height of avatar
> // by changing firing position appropriately
> vector size = llGetAgentSize(llGetOwner());
> gEyeOffset.z = gEyeOffset.z * (size.z / 2.0);
>
> llWhisper(0,"Press 'M' to enter mouslook and the mouse button to
> fire");
>
> // NOTE: can't do this if we want to attach by dragging from
> // inventory onto the av, because the llResetScript(); clears
> // all the callbacks, including attach()
> // llResetScript();
>
> // NOTE 2: This can be uncommented in 1.1 because you won't have
> // to ask for permissions, you can just take them. But for now
> // it pops up two dialog boxes if you drag onto the av, so I'll
> // leave it out.
> // Try to attach to the rezzer
> // if ( !gHavePermissions )
> // {
> // llRequestPermissions(llGetOwner(), gDesiredPerm);
> // }
> }
>
> state_entry()
> {
> func_debug("default state_entry");
> gHavePermissions = FALSE;
> // this should be initialized directly with the variable
> // but I can't do that due to a bug
> gDesiredPerm = (PERMISSION_TAKE_CONTROLS
> | PERMISSION_TRIGGER_ANIMATION);
> // Start with a full clip
> gAmmo = gAmmoClipSize;
> llResetTime();
> }
>
> // the player has touched us (left-clicked)
> // give directions
> touch_start(integer tnum)
> {
> func_debug("touch_start");
>
> // Guns only work for their owner
> if ( llDetectedKey(0) == llGetOwner() )
> {
> if ( gHavePermissions )
> {
> llWhisper(0, INSTR_HELD_1);
> llWhisper(0, INSTR_HELD_2);
> } else
> {
> llWhisper(0, INSTR_NOT_HELD_1);
> llWhisper(0, INSTR_NOT_HELD_2);
> }
> } else
> {
> // Not the owner
> llWhisper(0, INSTR_NOT_OWNER_1);
> llWhisper(0, INSTR_NOT_OWNER_2);
> }
> }
>
> // Player attaches us, either by dragging onto self or from pie menu
> attach(key av_key)
> {
> func_debug("attach");
>
> if (av_key != NULL_KEY)
> {
> // Can't attach if we don't own it
> if ( av_key != llGetOwner() )
> {
> llWhisper(0, INSTR_NOT_OWNER_1);
> llWhisper(0, INSTR_NOT_OWNER_2);
> return;
> }
>
> //
> // Always request permissions on attach, as we may be
> re-rezzing on login
> llRequestPermissions(av_key, gDesiredPerm);
>
> // run_time_permissions() is executed after this call
> } else
> {
> func_debug(" detach");
>
> if ( gHavePermissions )
> {
> // we are being detached
> llStopAnimation("hold_r_handgun");
> llStopAnimation("hold_r_handgun");
> llStopAnimation("aim_r_handgun");
> llReleaseControls();
> //llSetRot(<0.0, 0.0, 0.0, 1.0>);
> gHavePermissions = FALSE;
> }
> }
> }
>
> // this is called whenever llRequestPermissions() returns
> // i.e. the user has responded or dismissed the dialog
> // perm is the permissions we now have
> run_time_permissions(integer perm)
> {
> func_debug("run_time_permissions");
>
> // see if we now have the permissions we need
> if ( (perm& gDesiredPerm) == gDesiredPerm )
> {
> func_debug(" got perms");
>
> // we got the permissions we asked for
> gHavePermissions = TRUE;
> llTakeControls(CONTROL_ML_LBUTTON, TRUE, FALSE);
> llStartAnimation("aim_r_handgun");
> } else
> {
> func_debug(" didn't get perms");
>
> // we didn't get them, kill ourselves
> llDie();
> }
> }
>
>
> // the player has used the controls, process them
> control(key owner, integer level, integer edge)
> {
> func_debug("control");
>
> // has our gun reloaded?
> float time = llGetTime();
>
> // see if av has fired
> // (edge& level) == down edges, (edge& !level) == up edges
> // repeat rate is faster for tapping than holding
> if ( ( ((edge& level)& CONTROL_ML_LBUTTON)
> && (time> gTapReloadTime) )
> || ( (time> gHoldReloadTime)
> && (level& CONTROL_ML_LBUTTON) ) )
> {
> // if player is out of ammo, must wait for reload
> if ( (gAmmo>= 1) || (time> gOutOfAmmoReloadTime) )
> {
> // bang!
> llTriggerSound("45shoot", 2.0);
>
> llParticleSystem([ PSYS_PART_MAX_AGE,1.9,
> PSYS_PART_FLAGS,1,
> PSYS_PART_START_COLOR,<1,1,1>,
> PSYS_PART_END_COLOR,<1,1,1>,
> PSYS_PART_START_SCALE,<0.6,0.6,0.6>,
> PSYS_PART_END_SCALE,<1.5,1.5,1.5>,
> PSYS_SRC_PATTERN, PSYS_SRC_PATTERN_EXPLODE,
> PSYS_SRC_BURST_RATE,0.1,
> PSYS_SRC_ACCEL, 0.8 * llRot2Fwd(llGetRot()),
> PSYS_SRC_BURST_PART_COUNT,10,
> PSYS_SRC_BURST_RADIUS,0.02,
> PSYS_SRC_BURST_SPEED_MIN,0.0,
> PSYS_SRC_BURST_SPEED_MAX,0.9,
> PSYS_SRC_TARGET_KEY,llGetOwner(),
> PSYS_SRC_ANGLE_BEGIN,0.0,
> PSYS_SRC_ANGLE_END,0.0,
> PSYS_SRC_OMEGA,<0.5,0.5,0.5>,
> PSYS_SRC_MAX_AGE, 0.6,
> // PSYS_SRC_TEXTURE, "8146459e-47a2-47ce-93d6-bac9359afa84",
> PSYS_SRC_TEXTURE, "poof",
> PSYS_PART_START_ALPHA, 0.3,
> PSYS_PART_END_ALPHA, 0.0
> ]);
>
>
>
> llResetTime(); // we fired, set timer back to 0
>
> // HACK: gun shoots from gun pos, mouselook looks
> // from player's eye, so we try to move the gun
> // up to the eye. but we really don't
> // know where it is, so we guess (see gEyeOffset)
> vector my_pos = llGetPos() + gEyeOffset;
> rotation my_rot = llGetRot();
> vector my_fwd = llRot2Fwd(my_rot);
>
> // Rez a bullet!
> llRezObject("Bullet",
> my_pos,
> my_fwd * gBulletSpeed,
> my_rot,
> 1);
>
> // decrease ammo count
> --gAmmo;
> if ( gAmmo> 0 )
> {
> // still bullets left
> }
> else if ( gAmmo == 0 )
> {
> // we just ran out of shots
> // play reload sound here after a delay
> llTriggerSound("45reload", 2.0);
> }
> else // gAmmo< 0
> {
> // we've just fired first round of new clip
> gAmmo = gAmmoClipSize - 1;
> }
> } else
> {
> debug("Can't shoot, reloading...");
> }
> }
>
> } // control
>
> } // default state
>
>
> I modified it to have smoke when I shoot, so I wonder why it does damage to
> me when I shoot and how I can make it damage the other avatar instead?
>
> any suggestions?
Tryt to make sure the bullet is rezzed just beyond the barrel tip of the
gun. I don't know for sure, but I once made a cannon in SL, with
exploding shells. I made that mistake once, and the shot was rezzing
within the lenght of the barrel and blowing up right on the tip. So you
own bullet might be making contact with the gun and score a hit on you.
Just an idea.
Hope that helped,..
InuYasha
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://opensimulator.org/pipermail/opensim-users/attachments/20110216/d12bfa69/attachment.html>
More information about the Opensim-users
mailing list