A complete 100% FREE version of this with all norecards and textures is available in my store in Wingo (64,73) - right click it and take a copy.
Anyways, this is configurable from a notecard;
CODE
# Edit the configuation items below. Some are optional, some are not.
# Once done, save the config file and then left click the Rent-All!
# From the menu, chose "Re-Config" which will re-read the configuration
# file and set the values. You can re-configure your Rent-All! at any
# time, even when rented. The new settings will take effect immediately.
# (OPTIONAL) Owner Email (If you want emails instead of IM notifications of rentals due)
owner_email=myname@mydoman.com
# (OPTIONAL) Mall Manager (This name is the person to contact with questions about the Mall and/or Rules.)
# If you don't have a Mall manager, put the Owner's name here.
mall_manager=Joe Dodger
# (OPTIONAL) Mall Manager's Key (This is so that the Mall Manager is IM'd with notices as well as the Rent-All! owner.)
# If you don't have a Mall manager, you can leave this blank or commented out.
manager_key=999a9aa9-a999-999a-99a9-a9999a9999aa
# (OPTIONAL) Mall Manager's Cut (This is the percent of the rent that will be taken off the top and paid
# to the Mall Manager for Managing your Mall. It is taken BEFORE any splits between other owners.)
# IMPORTANT: This must be entered as a percent by using a "." (0.######) where ###### may
# be up to 6 digits. Entering a .5 equals 50% while entering a .05 equals 5 percent, etc.
manager_cut=.10
# (REQUIRED) Rules notecard name (This is the name of the notecard given to people when they
# touch the Rent-All! and request the rules.)
rules_card=Rental Stall Rules
# (REQUIRED) Rent Help (This is the name of the notecard given to people when they request
# help about how to rent the space.)
rent_help=How to Rent this Stall
# (REQUIRED) Rent Sign (This is the name of the texture being used for the UN-RENTED Rent-All!)
# Note that you can have one for "Reserved Space" and one for regular "Rent me now!".
# rent_texture=Reserved
rent_texture=ForRent
# (REQUIRED) Info Sign (This is the texture for the RENTED Rent-All! - Typically an "i" sign.)
info_texture=Info
# (REQUIRED) Mall Name (This is the name of your Mall.)
mall_name=My SL Mall!
# (REQUIRED) Max Prims (The maximum number of prims allowed for the space you are renting.)
prims=10
# (REQUIRED) Weekly Rental Price (The weekly price you are charging for this space.)
rent_price=75
# (REQUIRED) Minimum weeks the Rent-All! space can be rented for.
min_weeks=2
# (REQUIRED) Maximum weeks the Rent-All! space can be rented for.
max_weeks=13
# (REQUIRED) Offset of info box (after rented) (Must be in vector format -> <1.25,0,2.25> )
offset=<0,0,.5>
and the code;
CODE
// Rent-All!
//
// This code was based on a piece of code found (I think by Phoenix Behemoth) and modified heavily by Rizado DaSilva.
//
// Rent-All comes with ABSOLUTELY NO WARRANTY or SUPPORT OF ANY KIND. This is free software, and you are welcome
// to use the code, change the code and redistribute it under certain conditions;
//
// 1: You may NEVER SELL this code, in part or whole, or any parts (textures, notecards, etc.) distributed in the object.
// (You may charge a 1L distrubution fee for a freebie item.)
//
// 2: If you make changes to this code, you MUST send a copy of the new code to Rizado DaSilva.
//
// 3: You MUST leave both Phoenix Behemoth and Rizado DaSilva's names in the CODE header as contributing authors as well as
// the GNU GENERAL PUBLIC LICENSE identifier.
//
// 4: You MUST leave the code properties MODIFY/COPY/TRANSFER.
//
// Rent-All! - Rental Cube for renting vender spaces in malls, stores or renting land.
//
// This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
//
// A copy of the GNU General Public License is NOT included with this program, HOWEVER, it is available at;
// http://www.gnu.org/copyleft/gpl.html
// OR
// Write to the Free Software Foundation, Inc.,
// 51 Franklin Street, Fifth Floor
// Boston, MA 02110-1301, USA.
string owner_email = "";
string mall_mgr = "";
key mall_mgr_key = NULL_KEY;
float mall_mgr_cut = 0;
string rulecard = "";
string renthelp = "";
string r_sign = "ForRent";
string i_sign = "Info";
string mall_name = "My Mall";
integer maxPrims = 20;
integer price = 100;
integer minWeeks = 2;
integer maxWeeks = 13;
vector offset = <0, 0, 3>;
list split_with;
list split_name;
string owner_name;
integer no_reg = TRUE;
vector orig_loc;
vector orig_scale;
integer weeks;
string renter;
string renter_key;
integer rented = FALSE;
string rent_period;
integer num_Listen;
integer rand_chan;
integer edit_mode = 0;
string rent_date;
integer rent_weeks = 0;
integer timerevent;
integer sev_day = FALSE;
integer thr_day = FALSE;
integer one_day = FALSE;
integer one_hour = FALSE;
integer done = FALSE;
integer line;
string notecard = "_config_";
get_perms() {
llOwnerSay("Asking for permission to handle your money. " +
"This allows the script to collect money for you and refund incorrect amounts.");
llRequestPermissions(llGetOwner(), PERMISSION_DEBIT);
}
read_config() {
llOwnerSay("Reading configuration...");
done = FALSE;
line = 0;
llGetNotecardLine(notecard, line);
}
default {
state_entry() {
edit_mode = 0;
rented = FALSE;
rand_chan = (integer)llFrand(10000000);
llOwnerSay("Activating...");
orig_loc = llGetPos();
orig_scale = llGetScale();
owner_name = llKey2Name(llGetOwner());
llListenRemove(num_Listen);
num_Listen = llListen(9,"","","");
llListen(rand_chan,"","","");
timerevent = 0;
read_config();
}
on_rez(integer change) {
llOwnerSay("For help, left click the Rent-All! then select help from menu.");
llSetTexture(r_sign, ALL_SIDES);
llListen(9,"","","");
rand_chan = (integer)llFrand(10000000);
llListen(rand_chan,"","","");
timerevent = 0;
read_config();
}
run_time_permissions(integer type) {
if (type == PERMISSION_DEBIT) {
owner_name = llKey2Name(llGetOwner());
llOwnerSay("This space is now available for rent.");
no_reg = FALSE;
}
}
touch_start(integer total_number) {
if (llDetectedKey(0) == llGetOwner()) {
string edit;
if (edit_mode == 0) {
edit = "off";
}
if (edit_mode == 1) {
edit = "on";
}
llDialog(llGetOwner(),mall_name + "\n" +
"Edit mode is set to: " + edit,
["Rules","Memory","Vacate","Edit Mode","Rent Info",
"Owner Help","Re-Config","Manager"],rand_chan);
} else if ((rented == TRUE) && (llDetectedKey(0) == renter_key)) {
llDialog(llDetectedKey(0),mall_name + "\n" +
"Price for this space is L$" + (string)price + " per week.\n" +
"Max Prims is: " + (string)maxPrims + "\n" +
"Please choose from the following menu:",
["Rules","Rent Help","Vacate","Rent Info","Manager"],rand_chan);
} else if ((rented == TRUE) && (llDetectedKey(0) == mall_mgr_key)) {
llDialog(llDetectedKey(0),mall_name + "\n" +
"Max Prims is: " + (string)maxPrims + "\n" +
"Please choose from the following menu:",
["Rules","Rent Help","Vacate","Rent Info"],rand_chan);
} else if (rented == FALSE) {
integer temp = price * minWeeks;
llDialog(llDetectedKey(0),mall_name + "\n" +
"Price for this space is L$" + (string)price + " per week.\n" +
"Minimum rental period is " +
(string)minWeeks + "weeks " + "(L$" + (string)temp + ").\n" +
"Max Prims is: " + (string)maxPrims + "\n" +
"Please choose from the following menu:",
["Rules","Rent Help","Manager"], rand_chan);
}
}
listen(integer channel, string name, key id, string message) {
integer halt = 0;
if (id == llGetOwner() && edit_mode == 1) {
if (llGetSubString(llToLower(message),0,10) == "set renter ") {
if (timerevent == 0) {
return;
} else {
renter = llGetSubString(message,48,llStringLength(message));
renter_key = (key)llGetSubString(message,11,46);
llOwnerSay("renter set to " + renter);
}
} else if (llGetSubString(llToLower(message),0,9) == "addsplit ") {
split_name += llGetSubString(message,48,llStringLength(message));
split_with += (key)llGetSubString(message,11,46);
llOwnerSay(llKey2Name(llGetSubString(message,48,llStringLength(message))) + " added to split with list");
} else if (llGetSubString(llToLower(message),0,12) == "split remove ") {
name = llGetSubString(message,13,llStringLength(message));
integer finddata = llListFindList(split_name,(list)name);
if(finddata == -1) {
llOwnerSay("sorry " + name + " not found");
} else {
llDeleteSubList(split_with,finddata,finddata);
llDeleteSubList(split_name,finddata,finddata);
llOwnerSay(name +" removed from shared list");
}
} else if (llGetSubString(llToLower(message),0,7) == "addtime " && rented == TRUE) {
integer days = (integer)llGetSubString(message,8,llStringLength(message));
integer total = (days * 24 * 60 * 60);
timerevent = timerevent + total;
llWhisper(0,"Added " + (string)days + " days.");
} else if (llGetSubString(llToLower(message),0,3) == "done") {
halt = 0;
edit_mode = 0;
llOwnerSay("Edit Mode Off");
}
} else if (id == llGetOwner()) {
if (message == "Re-Config") {
read_config();
} else if (message == "Owner Help") {
llGiveInventory(id,"Vendor Help");
} else if (message == "Memory") {
llOwnerSay("Free memory: " + (string)llGetFreeMemory());
} else if (message == "Edit Mode" && edit_mode == 0 && halt == 0) {
if (!halt) {
halt = 1;
edit_mode = 1;
llOwnerSay("Edit Mode: On");
}
}
}
if (message == "Rent Help") {
llGiveInventory(id,renthelp);
} else if (message == "Manager") {
llWhisper(0,"The current Manager of " + mall_name + " is " + mall_mgr + ".");
} else if (message == "Rules") {
llGiveInventory(id,rulecard);
} else if (message == "Rent Info" && rented == TRUE) {
if (id == llGetOwner() || id == renter_key || id == mall_mgr_key) {
integer weeks2;
weeks2 = timerevent / 7 / 24 / 60 / 60;
integer days;
days = timerevent / 24 / 60 / 60 - (weeks2 * 7);
integer hours;
hours = timerevent / 60 / 60 - (weeks2 * 7 * 24) - (days * 24);
integer mins;
mins = timerevent / 60 - (weeks2 * 7 * 24 * 60) - (days * 24 * 60) - (hours * 60);
integer seconds;
seconds = timerevent - (weeks2 * 7 * 24 * 60 * 60) - (days * 24 * 60 * 60) - (hours * 60 * 60) - (mins * 60);
llWhisper(0,"Renter name: " + renter);
llWhisper(0,"Rented Date: " + rent_date);
llWhisper(0,"Rent time left: " +
(string)weeks2 + " weeks, " +
(string)days + " days, " +
(string)hours + " hours, " +
(string)mins + " minutes, " +
(string)seconds + " seconds.");
} else {
llWhisper(0,"Sorry, you don't rent here.");
}
} else if (message == "Vacate" && rented == TRUE) {
if (id == renter_key || id == llGetOwner() || id == mall_mgr_key) {
llSetTexture(r_sign, ALL_SIDES);
llSetPos(orig_loc);
llSetScale(orig_scale);
llListenRemove(num_Listen);
num_Listen = llListen(9, "", "", "" );
rent_period = "";
renter = "";
renter_key = NULL_KEY;
rented = FALSE;
rent_date = "";
rent_weeks = 0;
timerevent = 0;
llSetTimerEvent(0);
llWhisper(0,"This unit is now vacant.");
}else {
llWhisper(0,"Sorry, you don't rent here.");
}
}
}
timer() {
timerevent--;
if(renter_key != NULL_KEY) {
if ((timerevent <= 604800) && (timerevent >= 259201) && (sev_day == FALSE)) {
sev_day = TRUE;
llInstantMessage(renter_key,"Your rental booth at " + mall_name + " (" +
llGetRegionName() + ") has less than 7 days left before it expires.");
if (owner_email) {
llEmail(owner_email,"Rental Due for " + renter,
"Less than 7 days left for " + renter +
"'s area at " + mall_name + " (" + llGetRegionName() + ").");
} else {
llInstantMessage(llDetectedOwner(0),"Less than 7 days left for " + renter +
"'s area at " + mall_name + " (" + llGetRegionName() + ").");
}
if(mall_mgr_key != NULL_KEY) {
llInstantMessage(mall_mgr_key,"Less than 7 days left for " + renter +
"'s area at " + mall_name + " (" + llGetRegionName() + ").");
}
} else if ((timerevent <= 259200) && (timerevent >= 86401) && (thr_day == FALSE)) {
thr_day = TRUE;
llInstantMessage(renter_key,"Your rental at " + mall_name + " (" + llGetRegionName() +
") has less than 3 days left before it expires.");
if (owner_email) {
llEmail(owner_email,"Rental Due for " + renter,
"Less than 3 days left for " + renter +
"'s area at " + mall_name + " (" + llGetRegionName() + ").");
} else {
llInstantMessage(llDetectedOwner(0),"Less than 3 days left for " + renter +
"'s area at " + mall_name + " (" + llGetRegionName() + ").");
}
if(mall_mgr_key != NULL_KEY) {
llInstantMessage(mall_mgr_key,"Less than 3 days left for " + renter +
"'s area at " + mall_name + " (" + llGetRegionName() + ").");
}
} else if ((timerevent <= 86400) && (timerevent >= 3601) && (one_day == FALSE)) {
one_day = TRUE;
llInstantMessage(renter_key,"Your rental at " + mall_name + " (" + llGetRegionName() +
") has less than 1 day left before it expires.");
if (owner_email) {
llEmail(owner_email,"Rental Due for " + renter,
"Less than 1 day left for " + renter +
"'s area at " + mall_name + " (" + llGetRegionName() + ").");
} else {
llInstantMessage(llDetectedOwner(0),"Less than 1 day left for " + renter +
"'s area at " + mall_name + " (" + llGetRegionName() + ").");
}
if(mall_mgr_key != NULL_KEY) {
llInstantMessage(mall_mgr_key,"Less than 1 day left for " + renter +
"'s area at " + mall_name + " (" + llGetRegionName() + ").");
}
} else if ((timerevent <= 3600) && (timerevent >= 1) && (one_hour == FALSE)) {
one_hour = TRUE;
llInstantMessage(renter_key,"Your rental at " + mall_name + " (" + llGetRegionName() +
") has less than 1 hour left before it expires.");
if (owner_email) {
llEmail(owner_email,"Rental Due for " + renter,
"Less than 1 hour left for " + renter +
"'s area at " + mall_name + " (" + llGetRegionName() + ").");
} else {
llInstantMessage(llDetectedOwner(0),"Less than 1 hour left for " + renter +
"'s area at " + mall_name + " (" + llGetRegionName() + ").");
}
if(mall_mgr_key != NULL_KEY) {
llInstantMessage(mall_mgr_key,"Less than 1 hour left for " + renter +
"'s area at " + mall_name + " (" + llGetRegionName() + ").");
}
} else if (timerevent <= 0) {
llInstantMessage(renter_key,"Your rental at " + mall_name + " (" + llGetRegionName() +
") has now expired, all items will be returned to you shortly.");
if (owner_email) {
llEmail(owner_email,"Rental Expired for " + renter,
"Rental has expired for " + renter +
"'s area at " + mall_name + " (" + llGetRegionName() + ")." +
"Renter has neen notified. Clean-up may be required.");
} else {
llInstantMessage(llDetectedOwner(0),"Rental Expired for " + renter +
"'s area at " + mall_name + " (" + llGetRegionName() + ")." +
"Renter has neen notified. Clean-up may be required.");
}
if(mall_mgr_key != NULL_KEY) {
llInstantMessage(mall_mgr_key,"Rental Expired for " + renter +
"'s area at " + mall_name + " (" + llGetRegionName() + ")." +
"Renter has neen notified. Clean-up may be required.");
}
string objectname;
objectname = llGetObjectName();
llSetTexture(r_sign, ALL_SIDES);
llSetPos(orig_loc);
llSetScale(orig_scale);
num_Listen = llListen(0, "", "", "" );
rent_period = "";
renter = "";
renter_key = NULL_KEY;
rent_date = "";
rent_weeks = 0;
rented = FALSE;
timerevent = 0;
llSetTimerEvent(0);
}
}
}
money(key giver, integer amount) {
integer amount2 = amount % price;
if ((rented == FALSE) && (amount < price * minWeeks)) {
llWhisper(0,"Minimum rental period is " + (string)minWeeks + " weeks, for $" + (string)(price * minWeeks) +
". If you have any questions, please feel free to IM " + mall_mgr + ".");
llWhisper(0,"Giving back L$" + (string)amount + ".");
llGiveMoney(giver, amount);
} else if ((rented == FALSE) && (amount >= price * minWeeks)) {
amount = amount - amount2;
weeks = amount / price;
integer maxTempB = maxWeeks * 604800;
integer maxTempR = weeks * 604800;
if (maxTempR > maxTempB) {
llWhisper(0,"Sorry, that exceeds the maximum rental period (" + (string)maxWeeks +
" weeks) set by the owner of this Rent-All! Returning money.");
llGiveMoney(giver, amount);
} else if (amount2 > 0) {
llWhisper(0,"Too much money, giving back " + (string)amount2 + ".");
llGiveMoney(giver, amount2);
amount2 = 0;
}
timerevent = 604800 * weeks;
rent_weeks = amount / price;
string date = llGetTimestamp();
rent_date = llGetSubString(date,8,9) +
"/" + llGetSubString(date,5,6) +
"/" + llGetSubString(date,0,3) +
" / Time " + llGetSubString(date,11,15);
orig_scale = llGetScale();
orig_loc = llGetPos();
llWhisper(0, "Correct amount");
renter = llKey2Name(giver);
rented = TRUE;
rent_period = (string)weeks;
llWhisper(0, "Prim limit is " + (string)maxPrims + " prims.");
llWhisper(0, "Keep prim limits or risk termination of agreement.");
llWhisper(0,"Rent may be non-refundable. IM " + mall_mgr + " with questions.");
llWhisper(0, "Thank you for renting from " + mall_name + ". Please contact " + mall_mgr + " with any questions.");
llGiveInventory(llDetectedKey(0),rulecard);
llSetTexture("Info", ALL_SIDES);
llSetPos(orig_loc + offset);
llSetScale(<0.230,0.230,0.230>);
renter_key = giver;
llSetTimerEvent(1);
if (mall_mgr_key != NULL_KEY) {
float manage_cut = (integer)amount * (float)mall_mgr_cut;
amount = amount - llCeil(manage_cut);
llGiveMoney(mall_mgr_key,llCeil(manage_cut));
llInstantMessage(mall_mgr_key,renter + " just rented " + llGetObjectName() + " at " + mall_name + ".");
llInstantMessage(mall_mgr_key,"L$" + (string)llCeil(manage_cut) + " bonus paid to you.");
}
if(split_with != []) {
integer divide = llGetListLength(split_with) + 1;
integer total_to_give = amount/divide;
integer no;
while(no < llGetListLength(split_with)) {
key dest = llList2Key(split_with,no);
llGiveMoney(dest,total_to_give);
llInstantMessage(dest,"you have been payed L$"+ (string)total_to_give +" by " + llGetObjectName());
no ++;
}
}
if (owner_email) {
llEmail(owner_email,"New Rental - " + renter + " - " + mall_name,renter + " just rented " + llGetObjectName() + " at " + mall_name + ".\n" +
"Renter Key: " + renter_key + "\nAmount Paid: " + (string)amount);
} else {
llInstantMessage(llDetectedOwner(0),renter + " just rented " + llGetObjectName() + " at " + mall_name + ".\n" +
"Renter Key: " + renter_key + "\nAmount Paid: " + (string)amount);
}
} else if (rented == TRUE) {
if (llKey2Name(giver) == renter && amount >= price) {
amount = amount - amount2;
weeks = amount / price;
integer maxTempB = maxWeeks * 604800;
integer maxTempR = weeks * 604800;
integer timerevent2 = timerevent + maxTempR;
if (timerevent2 > maxTempB) {
llWhisper(0,"Sorry, that exceeds the maximum rental period (" + (string)maxWeeks +
" weeks) set by the owner of this Rent-All! Returning money.");
llGiveMoney(giver, amount);
} else if (amount2 > 0) {
amount = amount - amount2;
llWhisper(0,"Too much money, giving back " + (string)amount2 + ".");
llGiveMoney(giver, amount2);
amount2 = 0;
}
timerevent += (604800*weeks);
sev_day = FALSE;
thr_day = FALSE;
one_day = FALSE;
one_hour = FALSE;
llWhisper(0, "you have incresed your rental by " + (string)weeks + " weeks");
rent_weeks += weeks;
if (mall_mgr_key != NULL_KEY) {
float manage_cut = (integer)amount * (float)mall_mgr_cut;
amount = amount - llCeil(manage_cut);
llGiveMoney(mall_mgr_key,llCeil(manage_cut));
llInstantMessage(mall_mgr_key,renter + " just rented " + llGetObjectName() + " at " + mall_name + ".");
llInstantMessage(mall_mgr_key,"L$" + (string)llCeil(manage_cut) + " bonus paid to you.");
}
if(split_with != []) {
integer divide = llGetListLength(split_with) + 1;
integer total_to_give = amount/divide;
integer no;
while(no < llGetListLength(split_with)) {
key dest = llList2Key(split_with,no);
llGiveMoney(dest,total_to_give);
llInstantMessage(dest,"you have been payed L$"+ (string)total_to_give +" by " + llGetObjectName());
no ++;
}
}
if (owner_email) {
llEmail(owner_email,"New Rental - " + renter + " - " + mall_name,renter +
" just renewed " + llGetObjectName() + " at " + mall_name + ".\n" +
"Amount Paid: " + (string)amount);
} else {
llInstantMessage(llDetectedOwner(0),renter + " just renewed " + llGetObjectName() + " at " + mall_name + ".\n" +
"Amount Paid: " + (string)amount);
}
} else {
if (llKey2Name(giver) != renter) {
llWhisper(0,"Sorry, you aren't the renter of this stall.");
llGiveMoney(giver, amount);
} else if (amount < price) {
llWhisper(0,"Wrong amount of money, please make sure it is equal to or more than " +
(string)price + " multiplied by the number of weeks you wish to add to your rent.");
llGiveMoney(giver, amount);
}
}
}
}
dataserver(key query, string data) {
string config_item;
string config_data;
if (data == EOF) {
if (done == FALSE) {
llOwnerSay("Finished reading notecard.");
done = TRUE;
config_item = "";
config_data = "";
data = "";
if (no_reg == TRUE) {
get_perms();
}
if ((mall_mgr == "") && (mall_mgr_key == NULL_KEY)) {
mall_mgr = owner_name;
} else if ((mall_mgr == "") && (mall_mgr_key != NULL_KEY)) {
mall_mgr = llKey2Name(mall_mgr_key);
}
return;
}
} else {
integer i = llSubStringIndex(data, "=");
config_item = llGetSubString(data, 0, i - 1);
config_data = llGetSubString(data, i + 1, llStringLength(data) - 1);
if (config_item == "owner_email") {
owner_email = config_data;
} else if (config_item == "mall_manager") {
mall_mgr = config_data;
} else if (config_item == "manager_key") {
mall_mgr_key = (key)config_data;
} else if (config_item == "manager_cut") {
mall_mgr_cut = (float)config_data;
} else if (config_item == "rules_card") {
rulecard = config_data;
} else if (config_item == "rent_help") {
renthelp = config_data;
} else if (config_item == "rent_texture") {
r_sign = config_data;
if (renter == "") {
llSetTexture(r_sign,ALL_SIDES);
}
} else if (config_item == "info_texture") {
i_sign = config_data;
if (renter != "") {
llSetTexture(i_sign,ALL_SIDES);
}
} else if (config_item == "mall_name") {
mall_name = config_data;
} else if (config_item == "prims") {
maxPrims = (integer)config_data;
} else if (config_item == "rent_price") {
price = (integer)config_data;
} else if (config_item == "min_weeks") {
minWeeks = (integer)config_data;
} else if (config_item == "max_weeks") {
maxWeeks = (integer)config_data;
} else if (config_item == "offset") {
offset = (vector)config_data;
}
line = line + 1;
llGetNotecardLine("_config_", line);
}
}
}
Hope it's useful to someone.
=Riz