Summer bikini

We’re not quite to summer yet, but new bikinis are already starting to appear!

This one is a FREE group gift from a new-to-me store, Coclea.  Their group is currently FREE to join.

The top and bottoms are separates with lots of fits: Lara, Lara X, Legacy, Legacy Bombshell, Erika, GenX Classic, GenX Curvy, Kupra, and Reborn, with additional tops for Lara Petite, Lara X Petite, Legacy Perky, and Reborn Waifu.

There’s also a twenty color HUD included to let you color the tops and bottoms separately, so you’re sure to find a color that’ll make you smile 🙂

  • Swimwear: Summer Bikini (Gift 1) by Coclea
  • Body: Lara X Petite by Maitreya
  • Face: Jennifer by GA.EG
  • Hair: Ruda2 by Monso

Susie

This lovely spring dress is a FREE gift for members of the FabFree group.  The group is FREE to join.

There are sizes for LaraX, LaraX Petite, Legacy, Legacy Perky, Reborn, and Waifu.  There are some minor breakthrough issues around the waist which you can easily deal with by using some alphas.


Rita

This wonderful lingerie is a FREE group gift from Sojour.  Their group is FREE to join.

The set comes in four colors: “Chestnut”, “Ocean Blue”, “Plum”, and “Storm”, and in sizes for Lara X, Lara X Petite, Legacy, Legacy Perky, Reborn, and Waifu.

It also includes a HUD that allows you to select from seven different metals for the buckles, and to show or hide the bows and garter straps.

If you have a few lindens to throw around, there are also matching stockings available for L$230 per color, or L$999 for the fatpack.


Valentine’s Shop & Hop 2026

The Shop & Hop is open for Valentine’s Day.  I’m not sure if I’ll have time to run around all 280 creator’s stores (14 regions!), but I did run and pick up this wonderful bodysuit gift for FREE to show you!

I picked it out browsing through the FabFree Shop & Hop Guide.  Thanks as usual to the FabFree crew of Porta and Beachy that put this together for us!

I’m not usually much for pink, it clashes with my hair.  But soft pinks like this, I can get away with (and dark pinks too for that matter), and as the lace is so pretty, I just had to grab it.  If you really like it but do want it in another color, you can pick one up for 25% off at the event.

Update: after reviewing my posts, I go and clean up my inventory, including filing the gift box away in case I ever accidentally delete an item.  Then I go and clean up all the objects rigged for bodies I don’t have, and in doing this, I noticed that the bodysuit comes with a four color HUD that I overlooked not ten minutes ago lol.  The other colors include nude, and two darker shades of pink.

The bodysuit comes in sizes for Lara, Lara Petite, Lara X, Lara X Petite, Freya, Hourglass, Legacy, Legacy Bombshell, Reborn, Waifu, GenX Classic, and GenX Curvy.


By Your Wings

This dress is a dollarbie on the marketplace from a new-to-me store, Your Wings.

The dress is sized for Lara, Lara Petite, Lara X, Lara X Petite, Erike, Kupra, Legacy, Legacy Bombshell, Legacy Perky, Muneca, Prima, Prima Petite, Reborn, Waifu, and Star.

It comes with a HUD with muted blue and purple versions in addition to the green I’m wearing.  All three versions are in this intriguing pattern, which is what caught my eye.


Butterflies Redux

A long time ago, I posted a script system to make butterflies appear when the sun came up in SL, and disappear when it went down.  The system consisted of a script to place in some copy/mod butterflies available on the marketplace, and a script to rez them and delete them at the appropriate times.

In the nine (!) years since I posted those, things have changed.  As a naïve scripter back then, I didn’t think about co-ordination between the script in the rezzer and the script in the butterflies.  The scripts needed to communicate because back then, the only piece of information you could pass to a rezzed object was an integer.  Because the butterflies need a position to move to after being rezzed, they established a communication channel using the integer so that the rezzer could pass the butterflies a position vector, and also pass them a “delete yourself” command.

Usually, this just worked.  But as the computers that run the simulator code have become faster, the potential co-ordination issue became more apparent, and Linden Labs even came out with official advice to scripters as to how to perform proper communication co-ordination.  The link to the official advice seems to have disappeared from the Lab’s blog, but the example scripts have been incorporated in the object_rez documentation if you want to read about how to do co-ordination properly.

As you might have guessed, I wrote the scripts for myself, and posted them on the blog because, well, LSL is one of my passions in SL.  I don’t sell the system, and I neglected to update the scripts in my in-world system (and on this blog) to follow the Lab’s advice.

So, this article updates the scripts, and having just talked about communications co-ordination, eliminates the old way of passing data to a rezzed object by using new functionality introduced by the Lab in the last twelve months.

These changes are new LSL functions, llRezObjectWithParams (), llGetStartString (), and llDerezObject ().  These were mostly introduced to help people making combat systems, but they can completely remove the need for the scripts to do communication via the listen event on rez, thus removing the potential co-ordination issue.

Let’s dive right in to the scripts.  You can ignore the debug.lsl and profile.lsl and associated stuff in the following, or click the links to get the included code.

First, here’s the new script to place in the butterfly object that will be rezzed.

#undef DEBUG
#include "debug.lsl"
#undef PROFILE
#define MEMLIMIT 6000
#include "profile.lsl"

default {

    on_rez (integer s) {
        init_profile ();
        if (s != 0) {
            vector pos = (vector)llGetStartString ();
            llSetRegionPos (pos);
            llRemoveInventory (llGetScriptName ());
        }
        show_profile ("");
    }
}

This got significantly simpler.  Now, if the object is rezzed by the rezzer (s is not equal zero), then the script gets the start string (which you’ll see in the next script), interprets it as a vector, moves to the position specified, and deletes itself (as once the object is moved, the script has nothing else to do).

Here’s the rezzer script:

#undef DEBUG
#include "debug.lsl"

#define MEMLIMIT 16000
#undef PROFILE
#include "profile.lsl"

// To rez and derez immediately the sun comes up or goes down,
// #undef IGNORE_TWILIGHT
#define IGNORE_TWILIGHT

integer g_nc_line;
string g_nc_name = "config";
key g_nc_id;
integer g_pos_count;
list g_positions;
list g_inv_objs;
integer g_obj_count;
list g_rezzed_objs;
integer g_prev_sun = -1;

integer sun_up () {
    // Return true if the sun is up, false otherwise.
    vector sun = llGetSunDirection ();
    integer result;
#ifdef IGNORE_TWILIGHT
    if (llFabs (sun.z) < 0.1) { return FALSE; } else { result = (sun.z > 0);
    }
#else
    result = (sun.z > 0);
#endif
    return (result);
}

default {

    on_rez (integer n) {
        llResetScript ();
    }

    state_entry () {
        init_profile ();
        llSetObjectDesc (VERSION);

        g_inv_objs = [];
        g_positions = [];
        g_pos_count = 0;
        g_obj_count = llGetInventoryNumber (INVENTORY_OBJECT);
        if (g_obj_count == 0) {
            llOwnerSay ("There are no butterflys objects in the inventory!");
            return;
        } else {
            integer i;
            string name;
            for (i = 0; i < g_obj_count; i++) {
                name = llGetInventoryName (INVENTORY_OBJECT, i);
                if (llGetSubString (name, 0, -2) == "butterflys") {
                    g_inv_objs += name;
                }
            }
        }
        g_obj_count = llGetListLength (g_inv_objs);

        g_nc_line = 0;
        if (llGetInventoryType (g_nc_name) == INVENTORY_NOTECARD) {
            g_nc_id = llGetNotecardLine (g_nc_name, g_nc_line);
        } else {
            llOwnerSay ("Notecard " + g_nc_name + " not found - stopping");
            return;
        }
    }

    dataserver (key id, string data) {
        if (id == g_nc_id) {
            if (data != EOF) {
                if (llGetSubString (data, 0, 0) != "#") {
                    g_positions += (vector)data;
                }
                g_nc_id = llGetNotecardLine (g_nc_name, ++g_nc_line);
            } else {
                g_pos_count = llGetListLength (g_positions);
                llSetTimerEvent (0.1);
            }
        }
    }

    timer () {
        llSetTimerEvent (0.0);
        integer sun = sun_up ();
        if (sun != g_prev_sun) {
            if (sun) {
                // Sun is now up, rez
                integer i;
                integer r = (integer)llFrand (g_obj_count);
                string which;
                for (i = 0; i < g_pos_count; i++) {
                    which = llList2String (g_inv_objs, r);
                    llRezObjectWithParams (which,
                                           [REZ_POS, <0.0, 0.0, 0.5>, TRUE, FALSE,
                                            REZ_PARAM, -1,
                                            REZ_PARAM_STRING, llList2String (g_positions, i)]);
                }
            } else {
                // Sun is now down, derez
                integer i;
                integer n = llGetListLength (g_rezzed_objs);
                key id;
                for (i = 0; i < n; i++) {
                    id = llList2Key (g_rezzed_objs, i);
                    debug ("derez " + (string)id);
                    llDerezObject (id, DEREZ_DIE);
                }
                g_rezzed_objs = [];
            }
            g_prev_sun = sun;
        }
        llSetTimerEvent (60.0);
        show_profile ("");
    }

    object_rez (key id) {
        g_rezzed_objs += id;
    }
}

The most important change here is the call to llRezObjectWithParams (). Note the we are passing -1 to REZ_PARAM, which is how the new function passes the integer, and we are passing a vector with the REZ_STRING_PARAM.

I also made a few other changes, including only performing actions when the sun changes (from up to down or down to up).  Additionally, I wanted to offset the time to exclude twilight hours.  If you like the old behavior, you can implement it by undefining IGNORE_TWILIGHT.  Oh, and the config notecard is now mandatory, and you need to specify all the positions, including the one that used to default to directly over the rezzer.

Lastly, here’s a link to the butterflies on marketplace.  They are only L$10 🙂


llDerezObject

Feel free to skip this is you have no interest in scripting 🙂

When we script an object to rez another object, we tend to want to delete the rezzed object afterwards.  There are a couple of ways to do this.

The first involves no script at all; you can rez the object marked as a temporary object, and some time in the next 120 seconds, the simulator code will delete it.  This is great for very short lived things like bullets rezzed from a gun, but if you need the rezzed object to stick around until you decide to delete it, you need something else.

The naïve way to do it is to pre-load the object to be rezzed with a simple script that listens to the rezzer, and when it receives an appropriate message, it called llDie () to delete itself.  This is simple, works, but has the downside of increasing the number of scripts in the object, which can negatively affect land impact.

I wrote a post a while back discussing how to delete an object by loading a script into it via llRemoteLoadScriptPin ().  This avoids pre-loading a script; you load the script into the rezzed object when you want the object to delete itself.  Unfortunately, this also has a downside.  Because llRemoteLoadScriptPin () causes the calling script to sleep three seconds, it can be exceedingly slow to delete a large number of objects.  It’s also far more complex to set up that the naïve way, but it does eliminate the possibility of increasing land impact with pre-loaded scripts.

Having struggled with this problem forever, scripters demanded a better method, and the Lab responded by defining a new function in a simulator release to delete rezzed objects: llDerezObject ().

Yay!  Now instant deletes, no delays, no extra scripts required!

(I wrote this so I can link my old post mentioned above to it.  If people find the old post then they also have the opportunity to discover this new and better method).

 

 

 


Shya

Finally, a freebie worthy of a post!  It seems that all the creators are taking a vacation all at the same time, and this is the first outfit I’ve found in a month that’s been worth photographing.

This dress and pantyhose set is a group gift for members of the teleporthub.com group, which is L$10 to join.

The dress is sized to fit Lara, Lara Petite, Lara X, Lara X Petite, Bombshell, GenX Classic, GenX Curvy, Kupra, Legacy, Legacy Perky, Reborn, Waifu, and Star.  The pantyhose are BoM.

The gold sparkles are animated, which is an impressive look on top of the dress already being materials enabled!  My photos barely do the animation justice, and it’s a must-see in person.  Run and get it 🙂

  • Outfit: Skya Dress by AMUI
  • Body and hands: Lara X Petite by Maitreya
  • Face: Jennifer by GA.EG
  • Hair: Ruda2 by Monso
  • Necklace: Luli’s Necklace – gold by Kibitz