Difference between revisions of "Hello Avatar"

From Second Life Wiki
Jump to navigation Jump to search
m (<lsl> tag to <source>)
 
(9 intermediate revisions by 7 users not shown)
Line 1: Line 1:
{{LSL Header}}
{{LSL Header|ml=*}}


== Hello Avatar Script ==
The following script contains the default code that is placed in every new script. It says "''Hello, Avatar''" when it is saved or reset and says "''Touched.''" when it is touched. That makes it the LSL representation of the famous [http://en.wikipedia.org/wiki/Hello_world_program Hello world program].


Create a new object and go to '''edit''' window.
<source lang="lsl2">
 
Select contents tab and click on '''“New Script”''' button to create a new script.
 
Double-click on “New Script” you just created.
 
Script editing window opens and there is already a script written in it.
 
<lsl>
default
default
{
{
Line 24: Line 16:
     }
     }
}
}
</lsl>
</source>
 
To activate this script, click on '''“Reset”''' button.
 
Then the message; “Hello, Avatar!” will appear in your chat window.
 
If you touch the object, it will say “Touched”.
 
== Create Your Own Script ==
 
To create your own script, you may use the default script, “Hello, Avatar”.
 
You can change the part of the script and leave the rest the way it was.
 
 
'''default''' is a mandatory state in LSL script.
 
Every time a script is executed, it starts from default state.
 
After entering the default state, '''state_entry''' is the first to be called.
 
When touched, it executes commands in '''touch_start'''.
 
 
For example, if you want your object to change color when it’s touched, your script would be
 
<lsl>
default
{
    state_entry()
    {
        llSay(0, "Hello, Avatar! Touch to change color");
    }
 
    touch_start(integer total_number)
    {
        llSetColor(<1.0, 0.0, 0.0>, ALL_SIDES);
    }
}
</lsl>
 
== Create A Chair ==
Let’s make a use out of your script for a change.
 
Create a chair and put a script in it.
 
You may think that you can sit on your chair without putting any script in it.
 
Well, you can but doesn’t your avatar sit in odd position or weird angle on you chair?
 
 
The following line of code is for your avatar to '''sit at the right position''' on you chair.
 
<lsl>
llSitTarget(<X, Y, Z>, <X, Y, Z, S>);
</lsl>
 
The first <X, Y, Z> is a '''vector''' value and it’s for the sitting position or offset.
 
The second <X, Y, Z, S> is a '''rotation''' value and it’s for the angle of the sitting posture.
 
 
For the position, you will give values of meter for all 3 directions.
 
<left to right, forward to back, high to low>
 
Ex. <0.0, -0.5, 0.6>
 
An avatar will sit on the object in the centre, back towards 50 cm, 60 cm high.
 
 
For the angle, you have to describe a state of rotation to the object using X, Y, Z, S.
 
But this 4-value rotation concept is extremely difficult to understand.
 
So you may want to describe rotation using only 3 values; X, Y and Z.
 
 
<lsl>
llEuler2Rot(<X, Y, Z> * DEG_TO_RAD)
</lsl>
 
[[llEuler2Rot]] lets you use '''radian''' instead of rotation value.
 
Don’t know radian? Don’t worry.
 
[[DEG_TO_RAD]] can change '''degree''' values to radian.
 
<lsl>
default
{
    state_entry()
    {
        llSitTarget(<0.0, -0.5, 0.6>, llEuler2Rot(<0.0, 0.0, 270.0> * DEG_TO_RAD);
    }
}
</lsl>
 
Now reset the script and sit on the object again.
 
Of course the values have to be changed depending on the shape of your chair.
 
== Your First New Lines of Code ==
 
Exploring new commands in this way can run you thru a long series of demoes that teach you about how scripts work, such as the following.
 
* Twiddle the red, green, and blue intensity, also the "alpha" opacity/ transparency:
<lsl>
        llSetColor(<0.3, 0.3, 0.3>, ALL_SIDES); // darken
        llSetColor(<1.0, 1.0, 1.0>, ALL_SIDES); // lighten
        llSetAlpha(0.7, ALL_SIDES); // make translucent
</lsl>
 
* Twiddle the label of the object running the script:
<lsl>
        llSetText("look at me green", <0.0, 1.0, 0.0>, 1.0); // label
        llSetText("look at me black", <0.0, 0.0, 0.0>, 1.0); // label differently
        llSetText("", <0.0, 0.0, 0.0>, 1.0); // do not label
</lsl>
 
* Move and rotate while not physical, then kick and spin while physical and bouncy.
<lsl>
        llSetStatus(STATUS_PHYSICS, FALSE); llSleep(0.1);
        llSetPos(llGetPos() + <0.0, 0.0, 2.1>); // teleport up the Z axis
        llSetPos(llGetPos() + <0.0, 0.0, -2.1>); // teleport back down the Z axis
        llSetLocalRot(llRotBetween(<1, 0, 0>, llGetSunDirection())); // turn the East face to the Sun
        llSetLocalRot(llEuler2Rot(ZERO_VECTOR)); // turn the East face to the East
        llSetStatus(STATUS_PHYSICS, TRUE); llSleep(0.1);
        llSetBuoyancy(0.9); // bounce well, without floating
        llApplyImpulse(<0.0, 0.0, 1.0>, TRUE); // advance along the Z axis
        llApplyRotationalImpulse(<0.0, 0.0, 3.0>, TRUE); // yaw about the Z axis
        llSetStatus(STATUS_PHYSICS, FALSE); llSetStatus(STATUS_PHYSICS, TRUE); // zero rot inertia
</lsl>
 
* Poke around inside the object running the script:
<lsl>
        llOwnerSay( (string) llGetAgentSize(llGetLinkKey(llGetNumberOfPrims())) ); // often not ZERO_VECTOR while avatar sits
        llOwnerSay( (string) llKey2Name(llGetLinkKey(llGetNumberOfPrims())) ); // often the name of the sitting avatar
        llOwnerSay(llList2CSV( [ZERO_VECTOR, FALSE, TRUE, STATUS_PHYSICS, PI] )); // some named code values
</lsl>
 
* Chat a question for you the object's owner to answer:
<lsl>
        llDialog(llGetOwner(), "A clarifying demo?", ["No", "Yes"], 7); // chat some Q & A
        llDialog(llGetOwner(), "Choose an arc:", ["PI_BY_TWO", "PI", "TWO_PI"], 7); // chat some Q & A
</lsl>
 
These [[llDialog]] examples start you into a new lesson that could be your next lesson: the work of learning how scripts and avatars communicate with one another. In particular, you could also learn to make sense of such examples as:
 
<lsl>
        llRequestAgentData(llGetOwner(), DATA_BORN); // the data-of-birth of the owning avatar
</lsl>
 
The parameter 7 shown in the llDialog examples chooses a chat channel on to which the llDialog call will copy the answer you give to the question, as if you had chatted it yourself. You can see this happen if you learn to code a receiver for [[listen]] events. Similarly, if you learn to code a receiver for [[dataserver]] events, then you can [[llOwnerSay]] the results of the [[llRequestAgentData]] example.
 
Likely you want to make time to learn how to have one script call another before you run out of space in the one script you know how to write. To ask how much memory exists (in the task of the script of the object) that you never have yet filled with allocations of byte code, stack, or heap, try running code like:
 
<lsl>
        llOwnerSay( (string) llGetFreeMemory() );
</lsl>
 
== Drag To Run Memorable Snippets of Code ==
 
Instead of always editing scripts inside an object that you might lose, you may prefer to choose New Script and edit and Save in the Inventory > Scripts folder and drag the script on to an object to run a new copy when you please. If you're dragging to run the script, you'll see the object ends up holding confusingly many copies. So you'll quickly want to learn how to tell a script to delete itself after being dragged in place to run, thus:


<lsl>
Notes:
llRemoveInventory(llGetScriptName());
* Scripters should learn to call the simpler [[llOwnerSay]] rather than llSay, in order to avoid making objects that spam the neighborhood via [[PUBLIC_CHANNEL]] zero.
</lsl>


Enjoy!
* Scripters should learn to call [[llInstantMessage]] rather than llSay, in order to stop losing chat while far away or logged off.


{{#vardefine:sort|Hello Avatar}}{{LSLC|Library}}{{LSLC|Examples}}
{{#vardefine:sort|Hello Avatar}}{{LSLC|Library}}{{LSLC|Examples}}
{{LSLC|Tutorials}}
{{LSLC|Tutorials}}

Latest revision as of 13:26, 24 January 2015

The following script contains the default code that is placed in every new script. It says "Hello, Avatar" when it is saved or reset and says "Touched." when it is touched. That makes it the LSL representation of the famous Hello world program.

default
{
    state_entry()
    {
        llSay(0, "Hello, Avatar!");
    }

    touch_start(integer total_number)
    {
        llSay(0, "Touched.");
    }
}

Notes:

  • Scripters should learn to call the simpler llOwnerSay rather than llSay, in order to avoid making objects that spam the neighborhood via PUBLIC_CHANNEL zero.
  • Scripters should learn to call llInstantMessage rather than llSay, in order to stop losing chat while far away or logged off.