Difference between revisions of "Hello Avatar"

From Second Life Wiki
Jump to navigation Jump to search
Line 35: Line 35:


To create your own script, you may use the default script, “Hello, Avatar”.
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.
You can change the part of the script and leave the rest the way it was.


default state is mandatory in LSL script.
default state is mandatory in LSL script.
Every time an object is generated,
Every time an object is generated,
It executes commands in state_entry in default state.
It executes commands in state_entry in default state.
When touched, it executes commands in touch_start.
When touched, it executes commands in touch_start.


For example, if you want your object to change color when it’s touched,
For example, if you want your object to change color when it’s touched,
Line 55: Line 61:
     touch_start(integer total_number)
     touch_start(integer total_number)
     {
     {
         llSet
         llSetColor( <1.0, 0.0, 0.0>, ALL_SIDES);
    }
}
}
</lsl>
</lsl>

Revision as of 00:42, 6 February 2008

Hello Avatar Script

Create a new object and go to edit window.

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 {

   state_entry()
   {
       llSay(0, "Hello, Avatar!");
   }
   touch_start(integer total_number)
   {
       llSay(0, "Touched.");
   }

} </lsl>

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 state is mandatory in LSL script.

Every time an object is generated,

It executes commands in state_entry in default state.

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>

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> llRemoveInventory(llGetScriptName()); </lsl>

Enjoy!