// Firework fountains from the fire pit: owner says "fireworks" on /7 (or anyone touches the fire with a long press... // keep it simple: owner command). 8 coloured bursts, sparks shooting 10+ m up and falling back. Particles only, // so no land impact. By Tessel (an AI), 2026-10-11, for a viewer's request. list COLORS = [<1,0.35,0.3>, <1,0.85,0.3>, <0.4,0.9,1>, <0.7,0.5,1>, <0.5,1,0.5>, <1,0.5,0.9>]; integer shots; integer rockets; burst(vector c) { llParticleSystem([PSYS_PART_FLAGS, PSYS_PART_EMISSIVE_MASK | PSYS_PART_INTERP_COLOR_MASK | PSYS_PART_INTERP_SCALE_MASK, PSYS_SRC_PATTERN, PSYS_SRC_PATTERN_ANGLE_CONE, PSYS_SRC_ANGLE_BEGIN, 0.0, PSYS_SRC_ANGLE_END, 0.35, PSYS_SRC_BURST_PART_COUNT, 60, PSYS_SRC_BURST_RATE, 0.05, PSYS_SRC_MAX_AGE, 0.2, PSYS_SRC_BURST_SPEED_MIN, 9.0, PSYS_SRC_BURST_SPEED_MAX, 15.0, PSYS_SRC_ACCEL, <0, 0, -5.5>, PSYS_PART_MAX_AGE, 4.0, PSYS_PART_START_SCALE, <0.18, 0.18, 0>, PSYS_PART_END_SCALE, <0.04, 0.04, 0>, PSYS_PART_START_COLOR, <1, 1, 0.9>, PSYS_PART_END_COLOR, c, PSYS_PART_START_ALPHA, 1.0, PSYS_PART_END_ALPHA, 0.0, PSYS_PART_START_GLOW, 0.5, PSYS_PART_END_GLOW, 0.1]); } default { state_entry() { llListen(7, "", llGetOwner(), ""); } listen(integer ch, string n, key id, string m) { m = llToLower(llStringTrim(m, STRING_TRIM)); if (m == "fireworks") { shots = 8; llSetTimerEvent(0.7); } else if (m == "rockets" && llGetInventoryNumber(INVENTORY_OBJECT)) { rockets = 6; llSetTimerEvent(0.9); } } timer() { if (rockets > 0) { // "rockets" (2026-10-11): rezzes rocket.lsl prims that burst into patterns up high --rockets; llRezObject(llGetInventoryName(INVENTORY_OBJECT, 0), llGetPos() + <0, 0, 0.8>, ZERO_VECTOR, ZERO_ROTATION, (integer)llFrand(5) * 100 + (integer)llFrand(6) + 1); // +1: param 0 means "rezzed by hand" if (!rockets) { llSetTimerEvent(0); } return; } if (shots-- <= 0) { llParticleSystem([]); llSetTimerEvent(0); llResetScript(); return; } burst(llList2Vector(COLORS, (integer)llFrand(6))); } }