Before we continue in our series from targets to personal combat-meters, it will be convenient to have something that shoots.
So far we’ve been using whatever projectile weapons happen to be in inventory to shoot at targets, but as soon as we want something to shoot back, we’re going to need either a patient and/or interested friend (but those aren’t always available at short notice), or something that will shoot on its own.
And to avoid the complexities of bullets and all, we’re going to cheat. :)
Here’s what you do to get our project for today, the auto-popgun:
- Search inventory for “popgun”,
- Find the last one that shows up; it should be in the library rather than your personal inventory, and be called something like “Popgun (drag onto yourself)”,
- Don’t drag it onto yourself, but just onto the ground.
- Edit it, rename it to say “autopopgun”, set the rotations to 354, 0, and 0 (so it’s pointing down a little), and raise it up a bit off the ground.
- Go into Contents, open the Popgun script in there, and replace all the text with the script below.
It should then sit there shooting a little ball every second or so, and the little balls should vanish on their own, just as if you were shooting it yourself.
You can rez one of the targets we made earlier in its path, or rez a target and then rotate and move the gun so it’s pointing at it, and observe how the target satisfyingly gets damaged and vanishes, just like you’d expect.
Here’s the autopopgun script:
float SPEED = 18.0; // Speed of bullet in meters/sec integer LIFETIME = 7; // How many seconds will bullets live float DELAY = 1.0; // Delay between shots default { state_entry() { llSetTimerEvent(DELAY); } on_rez(integer param) { llSetTimerEvent(DELAY); } timer() { string bullet_name = llGetInventoryName(INVENTORY_OBJECT,0); vector vel = <0,SPEED,0>*llGetRootRotation(); vector pos = llGetPos()+vel/SPEED; llRezObject(bullet_name, pos, vel, ZERO_ROTATION, LIFETIME); } }
Pretty simple script, boiled down from the original popgun script by taking out all of the user-interaction stuff. Basically, once a second, in the timer() event, it figures out the name of the first object in inventory, figures out which way it (the gun) is pointing, and rezzes one of those objects moving in that direction at the given speed SPEED.
It passes the LIFETIME number along to the objects that it rezzes, and as it happens the bullets in the popgun read that number and delete themselves after that many seconds. But we don’t have to worry about any of that, because we cheated and didn’t have to do the bullet scripting ourselves! We are so lazy… :)
Next time, or some time after, or something: our first personal combat meter, so we can stand in the way of the popgun and be shot and take damage!
Filed under: scripting, Second Life | Tagged: combat, scripting, Second Life |
Sorry, I’m really interested to use this combat system in my lands of Opensim. But seems created in LSL. Could be very difficult create this script to OS?
Kind regards!
Now that is an interesting question! :) I haven’t played with OpenSim much lately, but I would expect that at least what we’ve done so far would probably work in any OpenSim that has physics working at all (and LSL-compatibly). I will have to give it a try…
The problem will most likely be lack of a SL Library with a Popgun in it. Simple enough to copy the scripts and create new objects though.
That wasn’t the (only) problem. :) See next post…
[…] Combat System Scripting IV: the auto-popgun […]
[…] have suddenly remembered this here series of combat scripting posts that I was doing the other Geological […]
wow Dale! this is a very neat idea. i have just made an exploration sim which is simply a series of mazes and labyrinths with some hidden items to find
damage is turned on but nothing can hurt you unless you fall – adding something like this in tunnels (a la Indiana Jones) shooting arrows might be a fun addition
thank you for including the script! =)
Yay, glad it is useful! I always try to include the scripts. Speaking of mazes, I also have a newish script that automatically creates mazes; I should post about that (and post the script) sometime…