Skip to content

A Very Teachable Moment

March 31, 2011

I was planning to introduce our daughter Fiona a different way–and I still plan to do that post. However, something has come up. I’m afraid that she is going to be very disappointed tomorrow when we let her log in to JokaydiaGrid.

Fiona Muircastle (not her real name) is six years old, probably the youngest regularly active resident in Jokaydia. She’s well known to our neighbors for her explorations of the Grid, and they are all spoiling her rotten with gifts and time spent showing off their builds to her! We incorporate JokaydiaGrid into our homeschool curriculum in several ways: reading, geography, computer skills of course, and starting tomorrow: good citizenship and the law. 😦 Something she enjoyed has to go away, because it is probably stolen content.

Some little girls like Dolls. Other little girls like Pirate Ships! Guess which kind we have. She saw one in another region that was set so that anyone could copy it, and she asked for it. So, she got a pretty ship to play with next to her Treehouse.

An asian-style sailing ship.

Enter the current debate over Copybotted items in OpenSim. I had spent some time tinkering with the ship (I was an avid sailor in SL, and I hope to do it again in Jokaydia someday soon), and some prims were missing, scripts were obviously missing, and I became suspicious. So, I went through the difficult and time-consuming task of looking through the SL Marketplace.

And I found it.

I don’t know for certain that this was copied illegally from Second Life, but given the price they are asking for it there, I would be very surprised if they were just giving it away in another venue.

What to do? Dianna and I are trying to raise a human being, here, one who learns her ethics from watching ours. I could play dumb and wait for a takedown notice that might never come. Or, I can do the right thing: remove the ship and explain to Fiona that, while she did nothing wrong, somebody took something that did not belong to them, and we got it without knowing that it was taken wrongly. Now that we know, we have to stop using it, because that is the right thing to do–even if it makes us unhappy. We’re going to promise her that we will work hard to get her another Pirate Ship she can play on, just as good or better, that was not taken from someone else unfairly.

In this way, we will teach our daughter what is right. I can only hope that some of those who copy content from Second Life illegally will see this and learn from it as well: copybotting doesn’t just hurt the creators. Now it has hurt a little girl.

An empty spot where the ship used to be.

I am not looking forward to explaining the empty spot to her. 😦

Freebie: Everybody needs doors.

March 30, 2011

I recently learned that some of the students in JokaydiaGrid are having trouble with scripted doors.  Some of the freely available scripts out there are a little confusing, so I decided to dust off and clean up the Radegast-friendly door that I use and make it available to everyone.  A text-client friendly door renames itself according to whether it is open or closed, so people using Radegast or a similar client can see what’s happening with it. (Using messages in local chat is just spammy.)

You can grab a free copy from The Mad Scientist’s Workshop in Callahania, or you can make your own from the instructions and script below.

To make your own, create a “Box” prim, and set the dimensions to

X: 3.000

Y: 0.100

Z: 3.000

Box Prim and Edit Screen

Now, look at the lowest item in the right hand column of the Build/Edit tool.  “Slice Begin and End”.  We’ll use that.  (Some use Path Cut, and that is what I used for the freebie in the Workshop.  Either will work, but Slice is slightly easier.)

Set the “B” (for Beginning) value of Slice to 0.500

The door, with slice B set to 0.5

Why do we do this?  Well, a door rotates from the edge, where the hinge is.  Prims rotate from the center of the prim.   Using the Path Cut or Slice feature, we pare away enough of the prim that the center is at the edge.

Next, add the script (which you will find at the end of this post), and take your new door into your inventory. Rez out a new copy, and let’s set it up!

Whenever you rez out the door, it is going to wipe the description and rename itself to “Door (not set up yet)”.  It will also say to the owner:

Door (not set up yet): This door has not been set up yet. To start, set the door up how you want it when it is closed, and say “closed” in local chat.  Then I’ll prompt you for the next step.

For now, let’s just use the example above.  Leaving it just like it is, I say

Talvin Muircastle: closed

and it replies:

Door (not set up yet): Good! Now, rotate the door to the position you want it in when it is open, and say “open” in local chat when you are ready.

So, we rotate the door around like so:

Door rotated into "open" position.and I say

Talvin Muircastle: open

The door stores the two rotation values in the object description (LSL scripts can only make permanent records of things by using workarounds like this).  The door closes itself.

The door, ready to be textured.Door (closed): Your door is now ready for use.

Now you can click on the door to open it!

If you are comfortable editing the settings inside the script, you can change the names for open and closed (but please remember those who must rely on text-based clients!), and you can set the amount of time it will remain open before closing itself automatically.  You can also disable auto-close entirely.  If you add a sound file to the door and reset the script, it will play that file when opening or closing.  And, as with all my freebies, the script is open-sourced under the Creative Commons license: feel free to experiment. However, the line just after “//END SETTINGS” is not a joke. 🙂

Here’s the script:

//Copyright 2011 by Talvin Muircastle @ JokaydiaGrid.  Licensed under the Creative Commons 3.0 Attribute/Share-Alike License.
//What that means: you can use it, and you don't owe me a penny for it.  BUT, you can't lie and say you created it: I did!  And if you make changes to it, you gotta share them just like I am sharing this with you. 

//SETTINGS
float time=20.0; //How long in seconds the door will stay open. This is a "float", which means it needs a decimal point. Set 0.0 to disable this.
string open="Door (open)"; //The name of the door when it is open.  We rename it so people who use text clients like Radegast can tell if the door is open or not.
string close="Door (closed)"; //Just like for open.
float volume=1.0; //The volume of the door sound when you use the door.  From 0.0 to 1.0 (lowest to loudest).  Ignore this if you aren't using a sound.
//END SETTINGS

//YOU REALLY DON'T WANT TO MESS WITH ANYTHING BELOW THIS LINE UNLESS YOU KNOW WHAT YOU ARE DOING.  TALVIN GIVES THIS SCRIPT AWAY FOR FREE.  FOR FIXING THINGS WHEN PEOPLE IGNORE THIS LINE, HE CHARGES BY THE HOUR.

integer setup=FALSE;
rotation orot;
rotation crot;
string sound="";
integer l;
integer o=FALSE;
list rots;

op()
{
    if (sound !="")
    {
        llPlaySound(sound, volume);
    };
    llSetRot(orot);
    o=TRUE;
    llSetObjectName(open);
    if (time != 0.0)
    {
        llSetTimerEvent(time);
    };
}

cl()
{
    if (sound !="")
    {
        llPlaySound(sound, volume);
    };
    llSetRot(crot);
    o=FALSE;
    llSetObjectName(close);
    llSetTimerEvent(0);
}

default
{
    on_rez(integer start)
    {
        llSetObjectDesc("");
        llResetScript();
    }
    
    state_entry()
    {
        string test=llGetObjectDesc();
        if (test=="")
        {
            llSetObjectName("Door (not set up yet)");
            llOwnerSay("This door has not been set up yet. To start, set the door up how you want it when it is closed, and say \"closed\" in local chat.  Then I'll prompt you for the next step.");
            l=llListen(0, "", llGetOwner(), "closed");
            
        }
        else
        {
            setup=TRUE;
            rots=llCSV2List(test);
            crot=llList2Rot(rots,0);
            orot=llList2Rot(rots,1);
        };
        integer s=llGetInventoryNumber(INVENTORY_SOUND);
        if (s)
        {
            sound=llGetInventoryName(INVENTORY_SOUND, 0);
        };
    }
    
    touch_start(integer n)
    {
        if (setup)
        {
            if (o)
            {
                cl();
            }
            else
            {
                op();
            };
        }
        else
        {
            llSay(0, "The owner has not set up this door yet!");
        };
    }
    
    listen(integer chan, string name, key id, string msg)
    {
        if (msg=="closed")
        {
            llListenRemove(l);
            rots=rots + llGetRot();
            llOwnerSay("Good! Now, rotate the door to the position you want it in when it is open, and say \"open\" in local chat when you are ready.");
            l=llListen(0, "", llGetOwner(), "open");
        }
        else
        {
            llListenRemove(l);
            rots=rots + llGetRot();
            llSetObjectDesc(llList2CSV(rots));
            setup=TRUE;
            crot=llList2Rot(rots,0);
            orot=llList2Rot(rots,1);
            cl();
            llOwnerSay("Your door is now ready for use.");
            llResetScript();
        };
    }
    
    timer()
    {
        cl();
    }
}

Who Owns This Disability?

March 23, 2011

When I started this blog, I promised you some stuff about Disability issues.  Today, I deliver something that applies equally well to the Real World and Virtual Worlds, especially if you are an Educator.

I need a good example for this post, so I am going to pick on a tiny, helpless minority, people most of us are not familiar with: people with Brown Hair.  (Full Disclosure: I have dark brown hair in both RL and as part of my avatar.) OK, yes, I am being silly!  Let’s just pretend that Brunettes are a tiny minority, rare enough that heads will turn and people will stare.  Let’s pretend that “normal” people have Blonde, Red, or Jet-Black hair, unless it has turned White or Gray.

The semester has started, and you learn that one of your new students has Brown Hair! You have never taught a Brunette before, and you aren’t certain how this is going to work.  You do recognize that it is your responsibility to give Brunette students the same opportunities for learning as those with any other hair color, but you just don’t know where to start.  Who do you go to?

Well, in a University, your first stop might be the Office of Brunette Services. There, a small, overworked staff does their best to meet the needs of all the Faculty and all the Brunette students on campus.  This student has Dark Brown Hair, whereas all previous Brunettes to attend your school have had Light Brown Hair.  They’ll do their best. Have a pamphlet.

Seeking more information, you might go down to the College of Barbers, Hairstylists, and Salon Technicians and speak to a member of the Faculty there.  Dr. Follicle has been teaching students how to work with every type of hair for twenty years, but they are primarily concerned with what happens in the Salon and Barbershop, not with how Brunettes live their lives outside of those structured institutions.  Once they walk out of the Salon, they are on their own.

Really confused now, you go over to the Medical School and talk to one of the Doctors there. Yes, I have several Brown-Haired patients.  They have different medical needs from the rest of us: unlike RedHeads, they tan rather than burn, for instance.  You come away knowing what genetic factors cause brown hair, how it affects medical practice, and the percentage of the population who have it, but very little about how you are supposed to relate to this Brunette who walked into your class.

Somebody points you to an organization run by and for people with Brown Hair: the National Brunette Federation, “The Voice of the Nation’s Brunettes!”  They are very politically active, and they have a lot of stories about Brunettes who have lived successful and productive lives, but not everything they say about People With Brown Hair seems to fit what you are seeing. For instance, they insist that Brunettes go about with their hair uncovered and unashamed, but your student favors a Baseball Cap when he is outside.  Who is right?

Who owns the Brown Hair, and who has the power to make decisions about it? Who speaks with authority?

Who owns YOUR hair?  It is part of your body, is it not? Of course it is!  You own your own body, and if part of it is different from what people have come to expect, that does not diminish your rights and responsibilities over it.

All of these other people: they have excellent resources, they have informed opinions (that may not agree with one another!), but they do not own the Brown Hair.  That student owns his own hair, whatever the color.  You should start by sitting down and talking with him.  Listen, and while you may not become an expert in all matters Brunette, you will likely learn about this student’s needs and your part in meeting them.  The rest are there when you both need them.

This is utterly ridiculous.  The real world doesn’t work this way!

But it does.  Go through what I wrote and replace everything that has to do with hair with a specific disability: Deafness. Blindness. Asperger’s.  Multiple Sclerosis.  Amputated Limb(s).  Dyslexia.  Anything.

Replace it with that, and you have a fairly common experience for Students with Disabilities in our education system, and for the Educators who may feel ill-prepared to work with them.  It can be confusing and frustrating, but the best and easiest way to get through it is to remember who owns the Disability: the person who has it as part of their body.  Nobody else owns it, they can only advise and offer resources.  The right to decide and the obligation to deal with the consequences of that decision rests with the competent adult who signed up for your class.

Respect the student, respect their power over their own body, and you’re off to a good start.

New Freebie: the Priority Pyramid!

March 17, 2011

Blame Maslow’s Hierarchy of Needs for this one.  I was looking at the Wikipedia Article on Maslow’s Hierarchy, and I found a section talking about how some people want to put the different items at different levels of the pyramid.  That collided with my Primitive Coder Brain, and suddenly I had an idea for a simple tool you can use with your students in a virtual world.

The pyramid, from top to bottom: Family, Recreation, School, Work.

This is a Priority Pyramid–actually 4 separate objects stacked up.  (It doesn’t even have to be a pyramid, arrange them any way you like!)

When you click on one of the levels of the pyramid, and then click on another level, they swap places.  They move and resize themselves.  For this example, we will assume that a student is working through how to prioritize his or her activities during High School.  How much time should be devoted to each?

Work and School look to be a bit out of order! Let’s click Work, and decide what to swap it with. For now, let’s put it on the second level down, so we click Recreation.

The Pyramid from top down: Family, Work, School, Recreation That’s a little better!  School is definitely in the wrong place, though. That should be taking up the bulk of their time.  Swap that with Recreation!  And let’s swap Family down to the next-largest spot, so for the next step we click Family and then Recreation again.

Pyramid from top to bottom: Recreation, Work, Family, School

That’s a little closer to the ideal for a high school student, now isn’t it?

You aren’t bound to a pyramid, of course.  This script just swaps the scale and position of any two clicked objects that are within chat range of one another. (Caveat: llSetPos() only works within 10 meters)  The pyramid is only how I first envisioned it in an online classroom setting.

I’ll box this up and put a copy of it in The Mad Scientist’s Workshop.  Or, you can just use the script with your own builds.  I’ll paste it below!

//Copyright 2011 by Talvin Muircastle @ JokaydiaGrid.  Licensed under the Creative Commons 3.0 Attribute/Share-Alike License.

integer chan=-1050;
integer l;

default
{
    on_rez(integer start)
    {
        llResetScript();
    }

    touch_start(integer n)
    {
        l=llListen(chan, "", "", "");
        string pos=(string)llGetPos();
        string size=(string)llGetScale();
        llSay(chan, pos + "," + size);
    }

    listen(integer channel, string name, key id, string msg)
    {
        llListenRemove(l);
        list temp=llCSV2List(msg);
        string pos=(string)llGetPos();
        string size=(string)llGetScale();
        llSay(chan, pos + "," + size);
        llSetPos(llList2Vector(temp, 0));
        llSetScale(llList2Vector(temp, 1));
    }
}

A Big Welcome to VWBPE on the Whistlestop Tour!

March 17, 2011

Tonight, the entire Muircastle family (Talvin, Dianna, and Fiona) will be on hand to meet and greet the Whistlestop Tour! Jokay Wollongong will be taking a group through JokaydiaGrid and highlighting areas of interest.

Our stop is Callahania, a mixed-use sim.  You will be landing at my little shop and workspace, “The Mad Scientists’s Laboratory”.  Here I offer free, Creative Commons-licensed tools for Educators and People With Disabilities.

I also do work for hire, and you’ll have a chance to see the Proof of Concept of my current project.  I am currently working on the Perseus Quest System, a modular, customizable Quest/Achievement system for OpenSimulator, aimed primarily at the Education market.  To see how this works, you’ll have a chance to animate Frankenstein’s Monster! This shows off just a handful of the modules that will be part of Perseus.

Also present will be my wife, Dianna Muircastle.  Dianna is totally Blind and has been in virtual worlds (starting with MUCKs) since 1995.  She occasionally works as a consultant on Blindness and Virtual Worlds, Distance Education, and Access Technology.

Finally,  meet our daughter, Fiona Muircastle.  Fiona is only six years old, but she has adapted to this environment very quickly!  She is one of the youngest active Residents of Jokaydia, and she loves exploring the grid, trying on new attachments,  meeting new people, and collecting freebies.  Just like the rest of us!  Jokaydia has been incorporated into our homeschooling as an incentive: after all, if you want to find something in inventory, you better be able to read it! 😉

Jokaydia is a small but growing grid with a real sense of community–much like a Real Life Neighborhood in many ways. We’ll only have a few minutes with you tonight, but we hope you will come back to visit again, or even to stay.

HyperGates and the HyperGrid in Layman’s Terms.

March 9, 2011

I have been experimenting with a variety of HyperGates, scripted objects that trigger a teleport around the HyperGrid.

The “Classic” HyperGate is made to look like a StarGate from the movie and TV franchise. I have always felt a little bothered by that one: sooner or later, I figure, the people who own the rights to that image are going to take notice and some sort of resolution will be found. (Anybody’s guess what that resolution will be.)

John “Pathfinder” Lester has been trying other kinds of gates, including one of my own creations, with the HyperGrid Adventurer’s Club in JokaydiaGrid. He started out with “BlamGates”, single-destination gates made to look like stone archways. You walk into the gate, and it triggers osTeleportAgent() and you are (hopefully!) sent to a region in another Grid.

The last time I was at one of the HGAC meetings, we tried my Queue-Gate, which is designed for moving a group of people from one grid to another. Everybody clicks on the Gate, and they are added to a list, or “Queue”. One by one, they are teleported to the destination. Overall the test went well, but in the end we managed to crash both Pathlandia and Permutation. That this was a successful test ought to tell you something about the status of HyperGrid Technology right now!

During the meeting, I got a lot of useful feedback. I also got a strong sense of frustration with the crashes and other problems encountered–frustration that is quite understandable! While I am not one of the HyperGrid developers (I don’t “speak” that particular programming language), I have had to learn a fair bit about the theory, and I would like to explain as best I can how HyperGates work, and why they don’t always work like we wish they would!

First, I need to dispel a common misunderstanding. The scripts inside the in-world objects do not teleport you. Scripted Objects do not do anything directly, themselves. Scripts are a list of instructions to the region server, a formal request to the region saying “Can you do this for me, please?” The region considers the request, determines if you are allowed to do that or if it is possible at all, and reacts accordingly. So, while Scripts can make a HyperGrid Teleport worse, they cannot do anything better: they are limited by what the server can do. When we Scripters are working to improve HyperGates, we are just trying to keep from making things any worse than they have to be!

The HyperGrid is a very new thing, still under construction. The only way to improve it is to stress-test it, find the bugs, and figure out ways to improve the technology! There may be other efforts underway that stress-test the HyperGrid as much as the HGAC, but I am not aware of them. 🙂 So, things are going to go “boom”, and they are going to go “boom” in new, interesting, and difficult-to-predict ways. Some of us show up just to see how it’s going to explode!

How does a HyperGrid jump work, in layman’s terms?

Let’s assume a case like what we had the other night at the HGAC meeting: 15 people or so making a jump from Pathlandia region in JokaydiaGrid to Permutation region in ReactionGrid. That is going to involve at least 19 different computers scattered around the world. In reality, it’s more than that, but we’ll stick to that figure of 19 for purposes of illustration.

Looking at the HyperGrid Protocol, we find that there are three types of computer involved: Grid-Level Service, Simulator, and Viewer.

Grid-Level Service

  • JokaydiaGrid: this is our starting grid.
  • ReactionGrid: this is our destination grid.

Simulator

  • Pathlandia: this is our starting region.
  • Permutation: this is our destination region.

Viewer: this is the client software we all use to connect to the Virtual World.  Inventory, textures, sounds, gestures, chat, groups, everything we see and do in the virtual world is negotiated by the Viewer.  Multiply this times 15!

So, when you jump from Pathlandia to Permutation, you activate the script in Pathlandia, which asks Pathlandia to teleport you to Permutation.  Pathlandia hands this off to JokaydiaGrid, which negotiates with ReactionGrid.  ReactionGrid accepts you, you are “logged in” to their grid and connected with Permutation.  Pathlandia sends a token to Permutation.  You are still getting your inventory from JokaydiaGrid, and you are downloading terrain data, textures, group information, and other stuff from ReactionGrid and Permutation.

As we have seen, when 15 people all try to do this within a few seconds, something is going to go “boom”.

As a scripter, I have been working with Jokay Wollongong and, through her, the folks at ReactionGrid to understand where the problems are, and we are trying to mitigate them. I can’t fix them!  That requires developing better OpenSimulator software.  I do not have either the time or the knowledge to attempt that.   Instead, I have been focusing on three things:

  1. Improving the “User Interface”. Let’s make regular gates simple enough for my six-year-old daughter to understand and use.  She regularly uses my versions of a “Blamgate” to move around within JokaydiaGrid.
  2. Simplifying the code for large-group events.  BlamGates use collision events, which involves the physics engine. Physics is one of the big Achilles Heels of OpenSimulator right now, and adding the stress of 15 collision events to 15 HyperGrid teleports can really hurt a region–and sometimes even a whole grid.  When designing for group excursions, I use a different method.
  3. Slowing the group down.  I look forward to the day when 15, or even 30, avatars are “jumped” together from JokaydiaGrid to a new world to explore, but right now that’s just not possible.  We need to give all 19 computers, and the 4 Grid and Region servers especially, time to handle all these changes.  The Queue-Gate has a default spacing of 10 seconds, though we obviously haven’t found the “sweet spot” yet.

If you are one of the intrepid souls who came along on the first big Queue-Gate ride, thank you! I appreciate your faith in me, and I was listening carefully to what you said.  Please continue to give me honest and constructive feedback. It really does help.

Hang in there!  When I joined Second Life, the idea that I would be able to walk through a door and find myself in a different grid hadn’t really been conceived of yet.  The OpenSimulator developer community, driven by dedicated volunteers who want all this to work, have come a long way in a very short time.  We are pioneers, and we are still moving around in covered wagons.

The train is coming, though. Promise! We just have to lay the tracks.

 

Round 3!

March 9, 2011

This is my third blog on WordPress.

The first was the ScriptAble Project blog, a project that has largely served its purpose (though, it can always come back if needed.)

When I stopped posting there due to a potential conflict with LL over the URL, I “moved in” with my wife at her BlindVW blog.  This worked for a while, but that blog is devoted to her purposes: talking about what it is like using a Virtual World when you are Blind.

So I am trying again.  This time, I am going to be talking about Disability Issues in Virtual Worlds (of course), Education, Scripting in LSL and OSSL, JokaydiaGrid, the HyperGrid, and anything else that comes to mind.

HyperGrid.  HyperGates.  Hmm….

Yeah, let’s start there!