User:Daemonika Nightfire/Scripts/Doors

From Second Life Wiki
Jump to navigation Jump to search

Bla Bla Bla

*DS* Smooth rotate door (center)

Bei diesem Tuer-Script handelt es sich um einen Klassiker, bei dem ein Prim mittels Pfadschnitt halbiert wird, oder bei einem Mesh durch "unsichtbares" vergroessern die Mitte "verschoben" wird. Anders als bei den alten Freebie-Scripten, kommt diese Version ohne llTargetOmega aus, stattdessen rotiert die Tuer mittels llSetLinkPrimitieParamsFast.

float degrees = 90; // Ein positiver oder negativer Wert bestimmt die Dreh-Richtung.
integer steps = 20; // Ein kleinerer Wert beschleunigt die Bewegung.

integer st = 0;
Moving()
{
    rotation default_rot = llGetLocalRot();
    vector rot = llRot2Euler(default_rot) * RAD_TO_DEG;
    float section = degrees / steps;
    
    if(!st)
    {
        // FREEBIE Sound "Door open", Klinke wird gesdueckt.
        llTriggerSound("cb340647-9680-dd5e-49c0-86edfa01b3ac", 1.0);
        llSetTimerEvent(30.0);
    }
    
    integer i = 0;
    do
    {
        if(!st)
        {
            rot.z = rot.z+section;
        }
        else if(st)
        {
            rot.z = rot.z-section;
        }
        rotation newLocalRot = llEuler2Rot(rot * DEG_TO_RAD);
        
        llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_ROT_LOCAL, newLocalRot]);
        llSleep(0.06);
    }
    while(++i < steps);
    
    if(st)
    {
        // FREEBIE Sound "Door close", Tuer faellt ins Schloss.
        llTriggerSound("e7ff1054-003d-d134-66be-207573f2b535", 1.0);
    }
    st = !st;
}

default
{
    state_entry()
    {
        llOwnerSay("/me - " + llGetScriptName() + " Memory: " + (string)llGetUsedMemory() + " bytes in use.");
    }
    
    touch_start(integer total_number)
    {
        if(st)
        {
            llSetTimerEvent(0.0);
        }
        Moving();
    }
    
    collision_start(integer total_number)
    {
        if(!st)
        {
            Moving();
        }
    }
    
    timer()
    {
        llSetTimerEvent(0.0);
        Moving();
    }
}

*DS* Smooth rotate door (edge)

Grundsaetzlich rotieren Objekte immer um ihr eigenes Zentrum. Doch mit diesem Script ist es nicht noetig einen Prim zu halbieren, oder ein Mesh kuenstlich zu vergroessern. Natuerlich rotiert ein Objekt mit diesem Script ebenfalls um die eigene Achse, doch hier wird das Objekt quasi im orbit um die eigene aeussere Kante neu positioniert. Das geht so schnell, das es optisch genau so wirkt wie das Objekt mit dem oberen Script.

float degrees = 90; // Ein positiver oder negativer Wert bestimmt die Dreh-Richtung.
integer steps = 20; // Ein kleinerer Wert beschleunigt die Bewegung.

integer st = 0;
Moving()
{
    vector size = llGetScale();
    rotation default_rot = llGetLocalRot();
    vector rot = llRot2Euler(default_rot) * RAD_TO_DEG;
    float section = degrees / steps;
    
    if(!st)
    {
        // FREEBIE Sound "Door open", Klinke wird gesdueckt.
        llTriggerSound("cb340647-9680-dd5e-49c0-86edfa01b3ac", 1.0);
        llSetTimerEvent(30.0);
    }
    
    integer i = 0;
    do
    {
        if(!st)
        {
            rot.z = rot.z+section;
        }
        else if(st)
        {
            rot.z = rot.z-section;
        }
        rotation newLocalRot = llEuler2Rot(rot * DEG_TO_RAD);
        
        // Nutze llRot2Fwd & size.x oder llRot2Left & size.y fuer breite Seite deiner Tuer.
        vector currentPos = llRot2Fwd(llGetLocalRot()) * size.x / 2.0;
        vector newPos = llRot2Fwd(newLocalRot) * size.x / 2.0;
        
        // Vertauschen der Zeichen + und - wechselt die Seite der "Scharniere".
        vector newLocalPos = llGetLocalPos() - currentPos + newPos;
        
        llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_ROT_LOCAL, newLocalRot, PRIM_POS_LOCAL, newLocalPos]);
        llSleep(0.06);
    }
    while(++i < steps);
    
    if(st)
    {
        // FREEBIE Sound "Door close", Tuer faellt ins Schloss.
        llTriggerSound("e7ff1054-003d-d134-66be-207573f2b535", 1.0);
    }
    st = !st;
}

default
{
    state_entry()
    {
        llOwnerSay("/me - " + llGetScriptName() + " Memory: " + (string)llGetUsedMemory() + " bytes in use.");
    }
    
    touch_start(integer num)
    {
        if(st)
        {
            llSetTimerEvent(0.0);
        }
        Moving();
    }
    
    collision_start(integer total_number)
    {
        if(!st)
        {
            Moving();
        }
    }
    
    timer()
    {
        llSetTimerEvent(0.0);
        Moving();
    }
}