UW Scripts for 4/29

Chapter 4 lecture… Read on!

Step 1:

// UW Week 4.1 - canon 1

float SPEED = 18.0; // m/sec

fire() {
    vector dir = <0,0,1.0>; // Up

    vector vel = dir * SPEED; // fire it SPEED in the right direction
    vector pos = llGetPos() + <0,0,0.6>; // shell will appear a little beyond the end

    integer delay = 5 + (integer)llFrand(5.0);  // how many tenths of seconds it should fly upward

    // get the name of the first object in inventory
    string bullet = llGetInventoryName(INVENTORY_OBJECT, 0);

    llRezObject(bullet, pos, vel, ZERO_ROTATION, delay);
}

default
{
    touch(integer p) {
        fire();
    }
}

Step 2: Get the demo shell from me if you aren’t ready to do your own!
If you do this yourself, you’ll need to set your shell to physical before you take it into canon inventory.

// Simple firework shell
// Vex Streeter for Scripting Your World

explode() {
    vector color = ; // pick a random color

    llParticleSystem([
         PSYS_SRC_PATTERN, PSYS_SRC_PATTERN_EXPLODE,
        
        // particles live for 10 seconds, but the shell only bursts for 1 second
        PSYS_SRC_MAX_AGE, 1.0,
         PSYS_PART_MAX_AGE, 10.0, 
        
        // every 5 seconds 
        PSYS_SRC_BURST_RATE, 5.0,
        // 500 particles
         PSYS_SRC_BURST_PART_COUNT, 500,
        
        // burst from near the shell
        PSYS_SRC_BURST_RADIUS, 0.1,
        
        // particles burst out at 2m/sec
         PSYS_SRC_BURST_SPEED_MIN, 2.0,
         PSYS_SRC_BURST_SPEED_MAX, 2.0,
         
         PSYS_SRC_ACCEL, <0.0,0.0,-0.8>,

        // constant color for the particles
        PSYS_PART_START_COLOR, color,
         PSYS_PART_END_COLOR, color,
 
         // start nearly opaque then become transparent
         PSYS_PART_START_ALPHA, 0.9,
         PSYS_PART_END_ALPHA, 0.0,

        // start 
         PSYS_PART_START_SCALE, <0.25,0.25,0>,
         PSYS_PART_END_SCALE, <0.01,0.01,0>,

        // particles glow, change size, and blow in the wind
         PSYS_PART_FLAGS, PSYS_PART_EMISSIVE_MASK |
                          PSYS_PART_INTERP_SCALE_MASK |
                         PSYS_PART_WIND_MASK
        ]);
    llSleep(.5); // wait for 2sec
    llParticleSystem([]); // then stop the system
}

default
{
    on_rez(integer param) {
        if (param!=0) {
    
            // kill the shell if it hits the edge of the sim
            llSetStatus(STATUS_DIE_AT_EDGE, TRUE);
            // make it temporary
            llSetPrimitiveParams([PRIM_TEMP_ON_REZ, TRUE]);
            // after this many tenths of seconds, we'll explode
            llSetTimerEvent(param * 0.1);
        }
    }
    
    state_entry() {
    }
    
    touch_end(integer p) {
        explode();
    }
    
    // explode when the timer goes off
    timer() {
        explode();
        llDie();
    }
}

Second version!

// UW Week 4.3 - canon 2

float SPEED = 18.0; // m/sec

fire() {
    rotation rot = llGetRot();
    vector dir = <0,0,1.0> * rot; // same direction we're pointed

    vector vel = dir * SPEED; // fire it SPEED in the right direction

    vector scale = llGetScale(); // how big is the canon?
    float startz = ( scale.z / 2.0 ) + 0.1; // half the hight plus a little
    vector pos = llGetPos() + <0,0,startz> * rot; // shell will appear a little beyond the end

    integer delay = 5 + (integer)llFrand(5.0);  // how many tenths of seconds it should fly upward

    // get the name of the first object in inventory
    string bullet = llGetInventoryName(INVENTORY_OBJECT, 0);

    llRezObject(bullet, pos, vel, ZERO_ROTATION, delay);
}

default
{
    touch(integer p) {
        fire();
    }
}