User:Daemonika Nightfire/Scripts/xytText Example

From Second Life Wiki
< User:Daemonika Nightfire
Revision as of 01:37, 2 August 2022 by Daemonika Nightfire (talk | contribs) (missing @ added)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

*DS* xyzText Example

Dieses Beispiel ist fuer Mesh mit 1 - 8 Faces geeignet, damit lassen sich verschiedene kleine Displays mit Kurz-Infos anzeigen. Auf Grund des minimalistischem Codes kann die Funktion auch in groessere Projekte mit sehr geringem Memory-Verbrauch integriert werden. Die passenden Objekte fuer dieses Script findest du Fullperm hier in meinem Store https://marketplace.secondlife.com/p/DS-xyz-Text-Mesh-discount/3800657

/*
    *DS* xyzText Example
    Dieses Script ist ein ganz einfaches Beispiel um '1' Buchstaben pro Face anzuzeigen.
    Auf uebermaessigen Brimborium habe ich bewusst verzichtet, um das Beispiel moeglichst klein zu halten.
    Der Listener fuer den Channel 0 im Beispiel wird nur zum testen verwendet.
*/

// Textur *DS* xyzTextur Arial 1024px
key texture = "e1266e07-a276-9f95-4d81-c787654b6f05";

// String mit allen Zeichen auf der Textur in der selben Reihenfolge.
string characters = " abcdefghijklmnopqrstuvwxyz<|>ABCDEFGHIJKLMNOPQRSTUVWXYZ+-*/0123456789!§$%&()[]?{}#€_,.;:°^~©'´`\"@\\=";

// Aufteilung der Buchstaben (Kacheln) auf der Textur.
integer X = 10; // Spalten
integer Y = 10; // Zeilen

xyzText(string msg)
{
    integer i = 0;
    do
    {
        string letter = llGetSubString(msg, i, i);
        if(~llListFindList(["ö","ä","ü","Ö","Ä","Ü","ß"], [letter])) // Diese Zeichen fehlen auf der Textur.
        {
            letter = "#"; // Fehlende Buchstaben werden mit # ersetzt.
        }
        
        integer index = llSubStringIndex(characters, letter);
        float H = (index % X); // Horizontal
        float V = (index-H)/Y; // Vertical
        
        // Das Script liegt in einem 8 Faces Mesh [0][1][2][3][4][5][6][7], darum die Angabe LINK_THIS im folgenden Befehl.
        llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_TEXTURE, i, texture, <1.0000/X, 1.0000/Y, 0.0000>, <(H-4.5)/X, (4.5-V)/Y, 0.0000>, 0.0]);
    }
    while(++i <= 7); // 0 - 7 = max. 8 Faces
}

default
{
    state_entry()
    {
        llListen(0, "", "", "");
        xyzText("abcdefgh");
    }
    
    listen(integer channel, string name, key id, string message)
    {
        xyzText(message);
    }
    
    on_rez(integer Dae)
    {
        llResetScript();
    }
}

PB xyzText Helper

Folgendes Tool dient zum erstellen grosser xyzText Anzeigetafeln. Lege dieses Script zusammen mit einem 8 Faces Mesh fuer xyzText in einen Wuerfel. Nehme im Script die gewuenschten Einstellungen vor und klicke anschliessend den Wuerfel an. Jetzt heisst es etwas warten, bis der Wuerfel alle Links gerezzt, verlinkt & umbenannt hat. Anschliessend kann im fertigen Object das Script *DS* xyzText Example (extended) verwendet werden.

peaceman.braveheart hat mir dieses Script zur Verfuegung gestellt, um es hier mit in diese Seite einzupflegen.
// PB xyzText Helper by peaceman.braveheart
// This tool is made to generate large text panels with many links.
// You don't have to select and rename each link individually, the script does this for you.
// Put this script together with one 8 faces mesh into the content of a prim.
// You will find usable mesh here: https://marketplace.secondlife.com/p/DS-xyz-Text-Mesh-discount/3800657

key owner;

// Enter here how many lines & cols you want to rez.
integer Line = 3;   // row-0-0,row-0-1...
integer col = 3;    // row-1-0,row-1-1...

// Enter here the dimensions of your single parts.
vector size = <0.80000, 0.10000, 0.10000>;

// Prevents multiple rezzing due to frequent clicking.
integer Ready;

string RezzName = "";
integer R_Count = 0;
integer X_col = 0;
integer Y_Line = 0;

default
{
    state_entry()
    {
        owner = llGetOwner();
        llSetObjectName(llGetScriptName());
        
        if(llGetInventoryNumber(INVENTORY_OBJECT) > 0)
        {
            RezzName = llGetInventoryName(INVENTORY_OBJECT, 0);
        }
        llSetText("RezzName = " + (string)RezzName + "\nR_Count = " + (string)R_Count, <1,1,0>, 1);
        
        llRequestPermissions(owner, PERMISSION_CHANGE_LINKS);
    }
    
    touch_start(integer total_number)
    {
        key agent = llDetectedKey(0);
        
        if(agent == owner)
        {
            if(RezzName != "")
            {
                if(Ready == 0)
                {
                    Ready = 1;
                    integer P_count = Line * col;
                    llRegionSayTo(owner, 0, "Object generated now " + (string)P_count + " Prims!");
                    
                    integer end = P_count;
                    integer i; 
                    for(i=0; i<end; i++)
                    {
                        llRezObject(RezzName, llGetPos() + <0,0,1>, ZERO_VECTOR, llGetRot(), 0);
                    }
                }
            }
            else
            {
                llRegionSayTo(owner, 0, "Nothing available to rez.");
            }
        }
    }
    
    timer()
    {
        integer end = llGetNumberOfPrims() + 1;
        integer i; 
        for(i=2; i<end; i++)
        {  
            if(X_col >= col)
            {
                X_col = 0;
                Y_Line++;
            }
            
            X_col++;
            if(Y_Line >= Line)
            {
                Y_Line = 0;
            }
            
            vector ObjScale = llGetScale();
            float x = ((size.x)*X_col);
            float y = ((size.y)*Y_Line)* -1;
            vector RezzPosRel = <x,y,1>;
            string TempName = "row-" + (string)Y_Line + "-" + (string)X_col;
            vector TempPos = RezzPosRel; 
            
            llSetLinkPrimitiveParamsFast(i, [PRIM_NAME, TempName, PRIM_SIZE, size, PRIM_POS_LOCAL, TempPos]);
        }  
        llSetTimerEvent(0);
        llBreakLink(1);
    }
    
    object_rez(key id)
    {
        llCreateLink(id, TRUE);
        R_Count++;
        
        llSetText("R_Count = " + (string)R_Count, <1,1,0>, 1);
        llSetTimerEvent(0.5);
    }
    
    run_time_permissions(integer perm)
    {
        if(perm & PERMISSION_CHANGE_LINKS)
        {
            llRegionSayTo(owner, 0, "Yes we can link.");
        }
        else
        {
            llRegionSayTo(owner, 0, "Sorry, we can't link.");
            llResetScript();
        }
    }
    
    changed(integer ch)
    {
        if(ch & CHANGED_INVENTORY)
        {
            llResetScript();
        }
    }
    
    on_rez(integer Dae_was_here)
    {
        llResetScript();
    }
}

*DS* xyzText Example (extended)

Das hier ist die erweiterte Version des *DS* xyzText scripts, wofuer das PB xyzText Helper zum vorbereiten einer Tafel verwendet werden kann.

/*
    *DS* xyzText Example (extended)
    Dieses Script schreibt texte in ganze Zeilen und kann mehrere Zeilen verwalten.
    Der Listener wird lediglich zum testen verwendet, die eigentliche Funktion kann beliebig aufgerufen werden.
*/

// Textur *DS* xyzTextur Arial 1024px
key texture = "e1266e07-a276-9f95-4d81-c787654b6f05";

// String mit allen Zeichen auf der Textur in der selben Reihenfolge.
string characters = " abcdefghijklmnopqrstuvwxyz<|>ABCDEFGHIJKLMNOPQRSTUVWXYZ+-*/0123456789!§$%&()[]?{}#€_,.;:°^~©'´`\"@\\=";

// In den folgenden Listen trage alle LinkNamen pro Zeile ein.
// Fuer jede Zeile beginne eine neue Liste.
list line_1 = ["row-0-1","row-0-2","row-0-3"];
list line_2 = ["row-1-1","row-1-2","row-1-3"];

// Aufteilung der Buchstaben (Kacheln) auf der Textur.
integer X = 10; // Spalten
integer Y = 10; // Zeilen

xyzText(string msg, list line)
{
    integer line_length = llGetListLength(line);
    integer index = 0;
    do
    {
        integer split = index*8;
        integer current_link = link_on_demand(llList2String(line, index));
        integer i = 0;
        do
        {
            string letter = llGetSubString(msg, i+split, i+split);
            if(~llListFindList(["ö","ä","ü","Ö","Ä","Ü","ß"], [letter])) // Diese Zeichen fehlen auf der Textur.
            {
                letter = "#"; // Fehlende Buchstaben werden mit # ersetzt.
            }
            
            integer index = llSubStringIndex(characters, letter);
            float H = (index % X); // Horizontal
            float V = (index-H)/Y; // Vertical
            
            llSetLinkPrimitiveParamsFast(current_link, [PRIM_TEXTURE, i, texture, <1.0000/X, 1.0000/Y, 0.0000>, <(H-4.5)/X, (4.5-V)/Y, 0.0000>, 0.0]);
        }
        while(++i <= 7); // 0 - 7 = max. 8 Faces
    }
    while(++index < line_length);
}

integer link_set;
integer link_on_demand(string name) // Special thanks to 'peaceman.braveheart' for this idea.
{
    integer i = 0;
    while(++i <= link_set)
    {
        if(llGetLinkName(i) == name)
        {
            return i;
        }
    }
    return 0;
}

default
{
    state_entry()
    {
        link_set = llGetNumberOfPrims();
        
        llListen(0, "", "", "");
        xyzText(" ", line_1);
        xyzText(" ", line_2);
    }
    
    listen(integer channel, string name, key id, string message)
    {
        list temp = llParseString2List(message, ["="], []);
        string cmd = llList2String(temp, 0);
        string text = llList2String(temp, 1);
        
        if(cmd == "line1")
        {
            xyzText(text, line_1);
        }
        else if(cmd == "line2")
        {
            xyzText(text, line_2);
        }
    }
    
    on_rez(integer Dae)
    {
        llResetScript();
    }
}