User:Daemonika Nightfire/Scripts/Doors

From Second Life Wiki
Jump to navigation Jump to search

Optisch bewegen sich Tueren mit beiden Scripten identisch. Sie funktionieren sowohl mit touch als auch mit collision und verwenden einen timer um die Tuer wieder zu schliessen. Zudem verwenden sie llSetLinkPrimitiveParamsFast(... mit einem llSleep(0.06), weil der delay vom llSetLinkPrimitiveParams(... einfach zu lange dauert. Mit beiden Versionen ist es moeglich die Tuer mit dem Gebaeude zu verlinken, es muessen sich lediglich die Scripte im Inhalt der Tueren befinden, damit nicht das ganze Gebaeude klickbar ist.

*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 llSetLinkPrimitiveParamsFast.

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 total_number)
    {
        if(st)
        {
            llSetTimerEvent(0.0);
        }
        Moving();
    }
    
    collision_start(integer total_number)
    {
        if(!st)
        {
            Moving();
        }
    }
    
    timer()
    {
        llSetTimerEvent(0.0);
        Moving();
    }
}