First off the fish portion of the aquarium is a trick with an emitter. Emitters are well they *emit* or give something out. In this case the will be giving out little fishy textures. :D but! It could be leaves or ghosts or bats orrrrrrr butterflies orrrr your favorite picture! What ever your hearts desire ohhh hearts :D.
The deal with them is you have to have a script that will *push out* the image you want. There for you have to have that texture to *push out* or emit. Both of those items go into the Contents Tab of our prim we are about to make. In my travels on Second Life I found some fish textures and have mentioned numerous times about Harbingers Haven texture vendor. I snagged a copy of a fish and that’s what I am using here. You can also search the web for the texture you want and upload them and use those.
To make our emitter; I used the copy with arrows trick on disk 1 (the base) of the aquarium.
You know, select the base prim and Shift and Click on the blue arrow and move your mouse up to make a duplicate of the prim, to keep it all lined up with the tank and then sized it like this:
Size (meters)
X
Y
Z


// SECTION ONE: APPEARANCE -- These settings affect how each particle LOOKS.
integer glow = TRUE; // TRUE or FALSE(*)
vector startColor = <1,1,1>; // RGB color, black<0,0,0> to white<1,1,1>(*)
vector endColor = <1,1,1>; //
float startAlpha = 1.0; // 0.0 to 1.0(*), lower = more transparent
float endAlpha = 1.0; //
vector startSize = <0.2,0.2,0>; // <0.04,0.04,0>(min) to <10,10,0>(max>, <1,1,0>(*)
vector endSize = <0.1,0.1,0>; // (Z part of vector is discarded)
string texture = "Fish Emitter 8"; // Texture used for particles. Texture must be in prim's inventory.
// SECTION TWO: FLOW -- These settings affect how Many, how Quickly, and for how Long particles are created.
// Note,
integer count = 2; // Number of particles created per burst, 1(*) to 4096
float rate = 0.5; // Delay between bursts of new particles, 0.0 to 60, 0.1(*)
float age = 5; // How long each particle lives, 0.1 to 60, 10.0(*)
float life = 0.0; // When to stop creating new particles. never stops if 0.0(*)
// SECTION THREE: PLACEMENT -- Where are new particles created, and what direction are they facing?
float radius = .30; // 0.0(default) to 64? Distance from Emitter where new particles are created.
float innerAngle = PI; // "spread", for all ANGLE patterns, 0(default) to PI
float outerAngle = 0.0; // "tilt", for ANGLE patterns, 0(default) to TWO_PI, can use PI_BY_TWO or PI as well.
integer pattern = PSYS_SRC_PATTERN_EXPLODE; // Choose one of the following:
// PSYS_SRC_PATTERN_EXPLODE (sends particles in all directions)
// PSYS_SRC_PATTERN_DROP (ignores minSpeed and maxSpeed. Don't bother with count>1 )
// PSYS_SRC_PATTERN_ANGLE_CONE (set innerangle/outerange to make rings/cones of particles)
// PSYS_SRC_PATTERN_ANGLE (set innerangle/outerangle to make flat fanshapes of particles)
vector omega = <0,0,0>; // How much to rotate the emitter around the
// Warning, there's no way to RESET the emitter direction once you use Omega!!
// You must attach the script to a new prim to clear the effect of omega.
// SECTION FOUR: MOVEMENT -- How do the particles move once they're created?
integer followSource = FALSE; // TRUE or FALSE(*), Particles move as the emitter moves, (TRUE disables radius!)
integer followVel = FALSE; // TRUE or FALSE(*), Particles rotate towards their direction
integer wind = FALSE; // TRUE or FALSE(*), Particles get blown away by wind in the sim
integer bounce = FALSE; // TRUE or FALSE(*), Make particles bounce on Z altitude of emitter
float minSpeed = 0.1; // 0.01 to ? Min speed each particle is spit out at, 1.0(*)
float maxSpeed = 0.1; // 0.01 to ? Max speed each particle is spit out at, 1.0(*)
vector push = <0,0,-0.1>; // Continuous force pushed on particles, use small settings for long lived particles
key target = "self"; // Select a target for particles to arrive at when they die
// can be "self" (emitter), "owner" (you), "" or any prim/persons KEY.
// SECTION FIVE: Ama's "Create Short Particle Settings List"
integer enableoutput = TRUE; // If this is TRUE, clicking on your emitter prim will cause it to speak
// very terse "shorthand" version of your particle settings. You can cut'n'paste
// this abbreviated version into a call to llParticleSystem([ ]); in another script.
// Pros: Takes up far less scripting space, letting you focus on the rest of your code.
// Cons: makes tune your settings afterwards rather awkward
// === Don't muck about below this line unless you're comfortable with the LSL scripting language ====
// Script variables
integer pre = 2; //Adjust the precision of the generated list.
integer flags;
list sys;
integer type;
vector tempVector;
rotation tempRot;
string tempString;
integer i;
string float2String(float in)
{
return llGetSubString((string)in,0,pre - 7);
}
updateParticles()
{
flags = 0;
if (target == "owner") target = llGetOwner();
if (target == "self") target = llGetKey();
if (glow) flags = flags PSYS_PART_EMISSIVE_MASK;
if (bounce) flags = flags PSYS_PART_BOUNCE_MASK;
if (startColor != endColor) flags = flags PSYS_PART_INTERP_COLOR_MASK;
if (startSize != endSize) flags = flags PSYS_PART_INTERP_SCALE_MASK;
if (wind) flags = flags PSYS_PART_WIND_MASK;
if (followSource) flags = flags PSYS_PART_FOLLOW_SRC_MASK;
if (followVel) flags = flags PSYS_PART_FOLLOW_VELOCITY_MASK;
if (target != "") flags = flags PSYS_PART_TARGET_POS_MASK;
sys = [ PSYS_PART_MAX_AGE,age,
PSYS_PART_FLAGS,flags,
PSYS_PART_START_COLOR, startColor,
PSYS_PART_END_COLOR, endColor,
PSYS_PART_START_SCALE,startSize,
PSYS_PART_END_SCALE,endSize,
PSYS_SRC_PATTERN, pattern,
PSYS_SRC_BURST_RATE,rate,
PSYS_SRC_ACCEL, push,
PSYS_SRC_BURST_PART_COUNT,count,
PSYS_SRC_BURST_RADIUS,radius,
PSYS_SRC_BURST_SPEED_MIN,minSpeed,
PSYS_SRC_BURST_SPEED_MAX,maxSpeed,
PSYS_SRC_TARGET_KEY,target,
PSYS_SRC_INNERANGLE,innerAngle,
PSYS_SRC_OUTERANGLE,outerAngle,
PSYS_SRC_OMEGA, omega,
PSYS_SRC_MAX_AGE, life,
PSYS_SRC_TEXTURE, texture,
PSYS_PART_START_ALPHA, startAlpha,
PSYS_PART_END_ALPHA, endAlpha
];
float newrate = rate;
if (newrate == 0.0) newrate=.01;
if ( (age/rate)*count < onoff="0;" enableoutput ="=" i="1;i<42;i+=" type =" llGetListEntryType(sys,i);" type ="=" tempstring =" float2String(llList2Float(sys,i));" sys =" llDeleteSubList(sys,i,i);" sys =" llListInsertList(sys,[tempString],i);" type ="=" tempvector =" llList2Vector(sys,i);" tempstring = "<">";
sys = llDeleteSubList(sys,i,i);
sys = llListInsertList(sys,[tempString],i);
}
else if (type == TYPE_ROTATION)
{
tempRot = llList2Rot(sys,i);
tempString = "<" + float2String(tempRot.x) + "," + float2String(tempRot.y) + "," + float2String(tempRot.z) + "," + float2String(tempRot.s) + ">";
sys = llDeleteSubList(sys,i,i);
sys = llListInsertList(sys,[tempString],i);
}
else if (type == TYPE_STRING type == TYPE_KEY)
{
tempString = "\"" + llList2String(sys,i) + "\"";
sys = llDeleteSubList(sys,i,i);
sys = llListInsertList(sys,[tempString],i);
}
}
i = llListFindList(sys,[20,""]);
if (i != -1) sys = llDeleteSubList(sys,i,i+1);
llWhisper(0,"[" + llList2CSV(llList2List(sys,0,22)) + ",");
llWhisper(0,llList2CSV(llList2List(sys,23,-1)) + "]");
}
}
If you noticed I have one portion of the text in bold. That has to be the name of the texture you are using be it Hearts or Flowers and in this case Fish. :D
Save the script and let it compile, you should see what ever texture you have being pushed out.