Free Textures In Second Life

Posted: April 13, 2011 in Scripting

Amazingly enough people are charging for textures in Second Life. By all means I dont blame them. They paid the 10L to upload these textures, or at least someone did. But what amazes me even more is the fact that so many people are jumping on copybot clients to rip textures for their own builds. WHY? Because you dont want to pay for a texture? Get smarter. Learn something today.

 

Linden Lab stores texture information in the form of a cache. A folder on your hard drive. This folder contains multiple folders of which contain files whose names are the UUID’s of textures in Second Life.

But how is that useful to you?

Linden Lab also added the ability to set textures to prims via UUID in LSL.

So what do you do? Have a peek below for the code.

llSetTexture(m,ALL_SIDES); <—— sets the texture of all sides of a prim to UUID m.

so here are a few files to help you get started obtaining free textures.

First you need a file in the format of .bat a BATCH file. (SORRY IM ONLY FAMILIAR WITH WINDOWS AT THE MOMENT)

name this file anything you like. just make sure the format is .bat and not .txt.

paste this into it.

REM Second Life Section as Second Life is the default client
REM change david to the username of your computer.
REM change SecondLife to whatever client you are using. various clients use various strings here.
REM save the edits and double click the file. please make sure it is named something.bat
REM look in c:\ for .txt files named CUT-KEYS-x.txt these files will have your texture keys in them.
dir  /b C:\Users\david\AppData\Local\SecondLife\textures\* > c:\CUT-KEYS-0.txt
dir  /b C:\Users\david\AppData\Local\SecondLife\textures\1\* >> c:\CUT-KEYS-1.txt
dir  /b C:\Users\david\AppData\Local\SecondLife\textures\2\* >> c:\CUT-KEYS-2.txt
dir  /b C:\Users\david\AppData\Local\SecondLife\textures\3\* >> c:\CUT-KEYS-3.txt
dir  /b C:\Users\david\AppData\Local\SecondLife\textures\4\* >> c:\CUT-KEYS-4.txt
dir  /b C:\Users\david\AppData\Local\SecondLife\textures\5\* >> c:\CUT-KEYS-5.txt
dir  /b C:\Users\david\AppData\Local\SecondLife\textures\6\* >> c:\CUT-KEYS-6.txt
dir  /b C:\Users\david\AppData\Local\SecondLife\textures\7\* >> c:\CUT-KEYS-7.txt
dir  /b C:\Users\david\AppData\Local\SecondLife\textures\8\* >> c:\CUT-KEYS-8.txt
dir  /b C:\Users\david\AppData\Local\SecondLife\textures\9\* >> c:\CUT-KEYS-9.txt
dir  /b C:\Users\david\AppData\Local\SecondLife\textures\a\* >> c:\CUT-KEYS-a.txt
dir  /b C:\Users\david\AppData\Local\SecondLife\textures\b\* >> c:\CUT-KEYS-b.txt
dir  /b C:\Users\david\AppData\Local\SecondLife\textures\c\* >> c:\CUT-KEYS-c.txt
dir  /b C:\Users\david\AppData\Local\SecondLife\textures\d\* >> c:\CUT-KEYS-d.txt
dir  /b C:\Users\david\AppData\Local\SecondLife\textures\e\* >> c:\CUT-KEYS-e.txt
dir  /b C:\Users\david\AppData\Local\SecondLife\textures\f\* >> c:\CUT-KEYS-f.txt

 

 

Next you will need to build a vendorish prim . Mine has a main display, two arrow buttons, two round buttons, one for the menu and one to reset the main display script, and another prim for preloading textures to make this load a tiny bit faster.

you will need 2 scripts and 16 note cards.

My notecards are named keys-x where x is 0-9 a-f.

you will see from the scripts what to name your prims in the linkset.

here is the main script.

string note = “keys-0″;
integer lis;
integer chan;
list order_buttons(list buttons)
{ // Code that will sort our -list ShortMenuForButtons- in the best “human” readable order
return llList2List(buttons, -3, -1) + llList2List(buttons, -6, -4)
+ llList2List(buttons, -9, -7) + llList2List(buttons, -12, -10);
}
list ShortMenuForButtons = [];
string ListOfItemNamesInStringForm = “”;
integer i = 0;
list buttonNAME = []; //List with names that will suit to each generated button
list paramA = [];     //List with parsed part from notecard line
integer NumberOfCurrentDialogMenu = 0;  // this is the “Serial” number of current Dialog menu
integer NumberOfItemsInTheContent = 0;  // variable to store llGetInventoryNumber
integer MaximumNumberOfMenus = 0;
showMenu()
{ // Code that will create the menu
// Reset the starting variables to create a new menu
ShortMenuForButtons = [];
ListOfItemNamesInStringForm = “”;

i=0;
do {
// This part is IMPORTANT! Here we ask if “i” NAME for “i” notecard line exists, and if it
// exists make button for that line, and put name in the -string ListOfItemNamesInStringForm-
if (llList2String(buttonNAME, NumberOfCurrentDialogMenu*9+i) != “”) {
//here we put the “b#” so that later we can easier parse
ShortMenuForButtons += llList2String(buttonNAME, NumberOfCurrentDialogMenu*9+i);//”b#” + (string)(NumberOfCurrentDialogMenu*9+i);
//here we add name of the “i” item in the Text that will appear in the Dialog menu
ListOfItemNamesInStringForm += “\n” + (string)(NumberOfCurrentDialogMenu*9+i) + “) ” +
llList2String(buttonNAME, NumberOfCurrentDialogMenu*9+i);
}
} while (i++ < 8); //we want 9 buttons, but because we also count Zero we have to decrease for 1 (9-1 = 8)
ShortMenuForButtons += “<—“; //We add arrow for left in our menu
ShortMenuForButtons += “[]”; // We put Realod button so that we can easier reload lines if we edit notecard
ShortMenuForButtons += “—>”; //We add arrow for right in our menu

// Here we generate first the menu. We added +1 on counters for current menu and maximum number of menus
// to have better written results (i.e. Good -> Menu No.1/1  Bad -> Menu No.0/0)
llDialog(llGetOwner(),
“\nPlease select item  Menu No.” + (string)( NumberOfCurrentDialogMenu+1) + “/” +
(string)(MaximumNumberOfMenus+1) + “\n”+ListOfItemNamesInStringForm,
order_buttons(ShortMenuForButtons),
chan);
}
relis()
{
llListenRemove(lis);
chan = llFloor(llFrand(-9999999));
lis = llListen(chan,””,””,””);
}
list menu = ["keys-0","keys-1","keys-2","keys-3","keys-4","keys-5","keys-6","keys-7","keys-8","keys-9","keys-a","keys-b","keys-c","keys-d","keys-e","keys-f"];
re_read(integer line)
{
//llOwnerSay((string)line);
r = llGetNotecardLine(note,line);
}
key r;
integer cur = 0;
integer lines;
key lineget;
default
{
state_entry()
{
llSetTexture(“357a8e70-b936-ed25-ff3a-3c4695a5727b”,ALL_SIDES);
lineget = llGetNumberOfNotecardLines(note);
llSetTimerEvent(60.0);
}
dataserver(key id,string data)
{
if(id == r)
{
if(data != EOF)
{
if(data != “” && data != ” ” && data != “120”)
{
if(llSubStringIndex(data,”.texture”)!=-1)
{
data = llDeleteSubString(data,llSubStringIndex(data,”.”),-1);
}
llSetTexture(data,ALL_SIDES);
}else
{
llSetTexture(“357a8e70-b936-ed25-ff3a-3c4695a5727b”,ALL_SIDES);
}
}else
{
llWhisper(0,”sorry but there seems to be a format error with the key cards.”);
llSetTexture(“357a8e70-b936-ed25-ff3a-3c4695a5727b”,ALL_SIDES);
}
}else if(id == lineget)
{
lines = (integer) data;
//llOwnerSay((string)lines);
cur = 0;
re_read(cur);
}
}
changed(integer c)
{
if(c & CHANGED_INVENTORY)
{
llResetScript();
}
}
timer()
{
++cur;
if(cur > lines)
{
cur = 0;
}
re_read(cur);
}
touch_start(integer total_number)
{
llSetTimerEvent(60.0);
if(llGetLinkName(llDetectedLinkNumber(0))==”back”)
{
–cur;
if(cur < 0)
{
cur = lines-1;
}
//llOwnerSay((string)cur);
re_read(cur);
}else if(llGetLinkName(llDetectedLinkNumber(0))==”forward”)
{
++cur;
if(cur > lines)
{
cur = 0;
}
re_read(cur);
}else if(llGetLinkName(llDetectedLinkNumber(0))==”reset”)
{
llResetScript();
}else if(llGetLinkName(llDetectedLinkNumber(0))==”menu”)
{
buttonNAME = llList2List(menu,0,-1);
NumberOfItemsInTheContent = llGetListLength(buttonNAME);
MaximumNumberOfMenus = llFloor(NumberOfItemsInTheContent/9);
if ((((float)NumberOfItemsInTheContent/9) – llFloor((float)NumberOfItemsInTheContent/9))==0)  MaximumNumberOfMenus–;
NumberOfCurrentDialogMenu = 0;
relis();
showMenu();
}else if(llGetLinkName(llDetectedLinkNumber(0))==llGetObjectName())
{
llSay(0,”That textures Key is : “+llList2String(llGetPrimitiveParams([PRIM_TEXTURE,ALL_SIDES]),0));
llRezObject(“_Object_”,llGetPos()+<0,0,3>,ZERO_VECTOR,ZERO_ROTATION,155);
}
}
listen(integer c,string n,key id,string m)
{
if(llGetOwnerKey(id)!=llGetOwner())return;
if (m == “[]”)
{
}else if(m==”—>”)
{
if (NumberOfCurrentDialogMenu<MaximumNumberOfMenus)
{
NumberOfCurrentDialogMenu++;
}else
{
NumberOfCurrentDialogMenu = 0;
}
showMenu();
}else if(m==”<—“)
{
if (NumberOfCurrentDialogMenu>0)
{
–NumberOfCurrentDialogMenu;
}else
{
NumberOfCurrentDialogMenu =  MaximumNumberOfMenus;
}
showMenu();
}else
{
note = m;
lineget = llGetNumberOfNotecardLines(note);
}
}
object_rez(key id)
{
llSay(155,llList2String(llGetPrimitiveParams([PRIM_TEXTURE,ALL_SIDES]),0));
}
}

 

 

and here is the preloader script

list notes = ["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"];
string preset = “keys-“;
key r;
integer l;
integer note;
integer loaderprim;
default
{
state_entry()
{
//find our preloader link
integer i = 0;
do
{
if(llGetLinkName(i)==”preloader”)
{
loaderprim = i;
}
i++;
}while(i < llGetNumberOfPrims());
l=0;
r = llGetNotecardLine(preset+llList2String(notes,note),l);
}
dataserver(key id,string data)
{
if(data != EOF)
{
if(data != “” && data != ” ” && data != “120”)
{
if(llSubStringIndex(data,”.texture”)!=-1)
{
data = llDeleteSubString(data,llSubStringIndex(data,”.”),-1);
}
}
llSetLinkTexture(loaderprim,data,ALL_SIDES);
r = llGetNotecardLine(preset+llList2String(notes,note),++l);
}else
{
note++;
if(note < llGetListLength(notes))
{
l = 0;
r = llGetNotecardLine(preset+llList2String(notes,note),l);
}else
{
note = 0;
l = 0;
r = llGetNotecardLine(preset+llList2String(notes,note),l);
}
}
}
}

 

and here is how it all works.

you run the .bat file which creates a few .txt files in c:\

open each of these and copy paste its contents into the corresponding notecards in the linkset you built.

the system will auto start loading textures. you can then click the main display to get the UUID of the texture being shown and if you have the _Object_ prim inside it will rez and add the texture to the object. allowing you to use that object in a build.

 

the script for the object is

default
{
on_rez(integer sp)
{
llListen(sp,””,””,””);
}
listen(integer c,string n,key id,string m)
{
if(llGetOwnerKey(id)!=llGetOwner())return;
llSetTexture(m,ALL_SIDES);
llSetPrimitiveParams([PRIM_TEMP_ON_REZ,TRUE]);
llRemoveInventory(llGetScriptName());
}
}

And that my friends is how to get free textures without using a copybot.

 

Is this system legal?

Of course it is legal. This system uses no exploits, no permission by passing. It simply uses the keys of textures. Which Linden Lab placed on your computer.

Will I get banned for doing this?

NO. You never asked Linden Lab to store textures on your computer. And you never asked them to allow you to set textures to prims via UUID.

Will Linden Lab fix this so it doesnt work?

I highly doubt it. The idea of storing the keys as cache makes things in Second Life rez faster. So by fixing the cache side everything will rez like you were using a 64mb apple GPU from 1995. And if they fix the LSL side of this, they will break hundreds of thousands of products gridwide. The only possible fix is for them to encrypt the cache instead of storing individual files named by key. But that will take tons of work and add to rez time because of the encryption/decryption process to complete it.

Is this system morally honest?

NO. I dont advise you to actually use this system. Someone took the time to create those textures. Paid to upload them, and may even make a living in RL by selling those textures. So it is morally dishonest to steal their intellectual property.

About these ads
Comments
  1. Sisk says:

    I don’t even remember what I was looking for when I stumbled across this, but I have to ask….You say,
    “Is this system morally honest?

    NO. I dont advise you to actually use this system. Someone took the time to create those textures. Paid to upload them, and may even make a living in RL by selling those textures. So it is morally dishonest to steal their intellectual property.”

    That being the case, why even post it? I don’t make a living off of my products (in fact I consider selling L$20 worth of stuff to be a good week), but it still bothers me that this is out here, apparently posted by someone who knows the damage it could do. I spend hours, even days on some of my textures. Granted I do so because I enjoy it, but I still don’t want to see them being used by someone else without my permission.

    As a SL merchant, albeit an unsuccessful one, I’m asking you to take this post down. I won’t try to force the issue (and wouldn’t even if I thought it would do any good). I am, however, appealing to your conscience. A script like this exists only to rip people like me off, and you apparently know this. This will be the last time you hear from me about this. Please do the right thing.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s