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.
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.
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.
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.
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.
Flame, my KittyCat, is 4000 days old today 🙂 She’s spent all of those days rezzed, sometime wandering around the house, often getting stuck in the bottom of the old house’s pool before I wrote a safety net for her lol
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.
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).
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 🙂
My plan is to wait until Monday SLT, when the crowds might thin out a little as people are back at work in the US and EU. But I couldn’t resist showing you at least one giftie today 🙂
This superbly detailed lingerie is a gift from deviousMind. There are fits for Lara and Reborn. The stockings are BoM, and all the other pieces are rigged mesh (which is good because everything moves with you, but bad because you can’t adjust how tight the pasties are hehe).
This is the lace version, but there is also a satin version in the pack.
As I mentioned, the detailing is superb; I had to take a closeup of the lilies and feathers.
This daring strappy number is the most recent group gift from Asteria Style. Their group is currently L$100 to join (they do have a number of past gifts of similar quality available, which may make the modest join fee attractive).
The skirt, harness top, panties, and bracers (the creator calls them “bracelets”) are separates. The skirt, panties, and bracers are sized for Lara, Kegacy, Reborn, Isis, Freya, Hourglass, and Kupra, and the top comes in the same sizes, with the addition of Lara Petite, Legacy Perky, and Kupra Kups.
This is a fatpack, and a HUD is included for each of the four pieces. They each have eleven colors to choose from, and there are four metal colors where appropriate.